/* Cansın Mini – Adres Doğrulama v1.1 (fail-safe). Vikaon/assos. Alanlar: p[address], b[address].
* Hata olursa kutular kaldırılır, orijinal Adres alanı aynen geri gelir; script hatası asla siparişi engellemez. */
(function () {
'use strict';
try {
if (window.__cmAdresDogrulama) return; window.__cmAdresDogrulama = '1.2';
var MIN_LEN = 10, SEL = 'input[name="p[address]"],input[name="b[address]"],textarea[name="p[address]"],textarea[name="b[address]"]';
var GENEL = ['ev','evim','evde','iş','is','işyeri','isyeri','adres','adresim','burası','burasi','yok','bilmiyorum','aynı','ayni','aynı adres','test','asd','asdf','qwe','xxx','ev adresi','iş adresi','mahalle','sokak','cadde','mah','sk','cd'];
var hafiza = {}; // name -> son kutu değerleri (yeniden çizimde korunur)
var TR = function (s) { return (s || '').toLocaleLowerCase('tr-TR').replace(/[.,;:!?\-_/]+/g, ' ').replace(/\s+/g, ' ').trim(); };
var genelMi = function (s) { var t = TR(s); return !t || GENEL.indexOf(t) > -1 || /^(.)\1*$/.test(t.replace(/\s/g, '')); };
var log = function (e) { try { console.warn('[cm-adres] devre dışı:', e && e.message || e); } catch (_) {} };
var css = '.cmad-wrap{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:4px 0 6px}.cmad-f{display:flex;flex-direction:column}.cmad-full{grid-column:1/-1}' +
'.cmad-wrap .cmad-lbl{display:block!important;font-size:12px;color:#555;margin:0 0 3px;font-weight:600}.cmad-lbl b{color:#e6007e}' +
'.cmad-wrap input{height:44px;border:1px solid #e3d6e0;border-radius:10px;padding:0 12px;font-size:16px;width:100%;box-sizing:border-box;background:#fff}' +
'.cmad-wrap input.cmad-err{border-color:#d93025;background:#fff6f6}.cmad-msg{color:#d93025;font-size:12px;margin-top:3px}' +
'.cmad-ipucu{grid-column:1/-1;font-size:12px;color:#777;background:#fff5fa;border-radius:8px;padding:6px 10px}@media(max-width:480px){.cmad-wrap{grid-template-columns:1fr}}';
var st = document.createElement('style'); st.id = 'cmad-css'; st.textContent = css; (document.head || document.documentElement).appendChild(st);
var ALANLAR = [
{ k: 'mah', l: 'Mahalle', ph: 'Örn: Süvari Mahallesi', req: 1, full: 1 },
{ k: 'sok', l: 'Cadde / Sokak', ph: 'Örn: 1682. Cadde veya Gül Sokak', req: 1, full: 1 },
{ k: 'bina', l: 'Bina / Kapı No', ph: 'Örn: 56', req: 1 },
{ k: 'daire', l: 'Daire No', ph: 'Örn: 1 (yoksa boş bırakın)', req: 0 },
{ k: 'tarif', l: 'Site / Apartman adı, adres tarifi', ph: 'İsteğe bağlı', req: 0, full: 1 }];
function ayristir(v) {
var m = /^(.*?\b(?:mahallesi|mah\.?|mh\.?))\s*(.*?)\s*no\s*[:.]?\s*([0-9][0-9a-zA-Z\/\-]*)\s*(?:(?:d|daire)\s*[:.]?\s*([0-9a-zA-Z]+))?\s*(.*)$/i.exec(v || '');
if (!m) return null;
return { mah: m[1].replace(/\s*(mahallesi|mah\.?|mh\.?)\s*$/i, '').trim(), sok: m[2].replace(/[,\s]+$/, ''), bina: m[3], daire: m[4] || '', tarif: (m[5] || '').replace(/^[,\s(]+|[)\s]+$/g, '') };
}
function haricTemizle(s, harc) { if (!harc) return s; for (var i = 0; i < harc.length; i++) { var c = harc[i]; if (c.trim()) s = s.split(c).join(' '); } return s.replace(/\s{2,}/g, ' ').trim(); }
function birlestir(o, harc) {
harc = harc || ''; var iki = harc.indexOf(':') > -1 ? ' ' : ':';
var mah = o.mah.trim(); if (mah && !/(mahallesi|mahalle|mah\.?|mh\.?)$/i.test(mah)) mah += harc.indexOf('.') > -1 ? ' Mahallesi' : ' Mah.';
var s = [mah, o.sok.trim(), 'No' + iki + o.bina.trim()]; if (o.daire.trim()) s.push('D' + iki + o.daire.trim());
var r = s.join(' '); if (o.tarif.trim()) r += (harc.indexOf('(') > -1 ? ' - ' : ' (') + o.tarif.trim() + (harc.indexOf('(') > -1 ? '' : ')');
return haricTemizle(r, harc);
}
function maxLen(inp) { var a = parseInt(inp.getAttribute('max-length') || '0', 10), b = inp.maxLength > 0 ? inp.maxLength : 0; return Math.max(0, a && b ? Math.min(a, b) : (a || b)); }
function geriAl(inp) { // fail-safe: kutuları kaldır, orijinal alanı göster
try { if (inp.__cmadWrap && inp.__cmadWrap.parentNode) inp.__cmadWrap.parentNode.removeChild(inp.__cmadWrap); } catch (_) {}
try { if (inp.__cmadHolder) inp.__cmadHolder.style.display = ''; if (inp.__cmadLbl) inp.__cmadLbl.style.display = ''; } catch (_) {}
inp.__cmadKutular = null; inp.__cmadKapali = 1;
}
function kur(inp) {
if (inp.__cmad || inp.__cmadKapali) return; inp.__cmad = 1;
try {
var holder = inp.closest('.input-icon') || inp; if (!holder.parentNode) throw new Error('beklenmedik DOM');
var wrap = document.createElement('div'); wrap.className = 'cmad-wrap'; var kutular = {};
ALANLAR.forEach(function (a) {
var f = document.createElement('div'); f.className = 'cmad-f' + (a.full ? ' cmad-full' : '');
f.innerHTML = '
' + a.l + (a.req ? ' *' : '') + '
';
wrap.appendChild(f); kutular[a.k] = f.querySelector('input');
});
var ip = document.createElement('div'); ip.className = 'cmad-ipucu'; ip.textContent = 'Kargonuzun sorunsuz ulaşması için mahalle, cadde/sokak ve bina numarasını eksiksiz yazınız.'; wrap.appendChild(ip);
inp.__cmadKutular = kutular; inp.__cmadWrap = wrap; inp.__cmadHolder = holder;
var harc = inp.getAttribute('exclude-chars') || '';
inp.__cmadSenk = function () {
var o = {}; Object.keys(kutular).forEach(function (k) { o[k] = kutular[k].value; }); hafiza[inp.name] = o;
var v = (o.mah.trim() || o.sok.trim() || o.bina.trim()) ? birlestir(o, harc) : '';
if (inp.value !== v) { inp.value = v; inp.__cmadYazilan = v; try { inp.dispatchEvent(new Event('input', { bubbles: true })); inp.dispatchEvent(new Event('change', { bubbles: true })); } catch (_) {} }
inp.__cmadYazilan = v;
};
inp.__cmadDoldur = function (v) { // dışarıdan gelen değeri (kayıtlı adres / düzenleme) kutulara dağıt
Object.keys(kutular).forEach(function (k) { kutular[k].value = ''; });
var p = ayristir(v); if (p) Object.keys(p).forEach(function (k) { kutular[k].value = p[k]; }); else kutular.sok.value = v; inp.__cmadYazilan = v;
};
var mevcut = (inp.value || '').trim();
if (mevcut) inp.__cmadDoldur(mevcut);
else if (hafiza[inp.name]) { var h = hafiza[inp.name]; Object.keys(h).forEach(function (k) { kutular[k].value = h[k]; }); }
holder.parentNode.insertBefore(wrap, holder.nextSibling); holder.style.display = 'none';
var lb = inp.id && holder.parentNode.querySelector('label[for="' + inp.id + '"]'); if (lb) { inp.__cmadLbl = lb; lb.style.display = 'none'; }
Object.keys(kutular).forEach(function (k) { kutular[k].addEventListener('input', function () { try { inp.__cmadSenk(); temizle(kutular[k]); } catch (e) { log(e); geriAl(inp); } }); });
if (mevcut || hafiza[inp.name]) inp.__cmadSenk();
} catch (e) { log(e); geriAl(inp); }
}
function temizle(el) { el.classList.remove('cmad-err'); var m = el.parentNode.querySelector('.cmad-msg'); if (m) m.textContent = ''; }
function hata(el, msg) { el.classList.add('cmad-err'); var m = el.parentNode.querySelector('.cmad-msg'); if (m) m.textContent = msg; }
function dogrula(inp) { // true = geçerli; yalnız gerçek doğrulama hatasında false
var k = inp.__cmadKutular; if (!k) return true; inp.__cmadSenk();
var ok = true, ilk = null, e = function (el, msg) { hata(el, msg); ok = false; ilk = ilk || el; };
Object.keys(k).forEach(function (x) { temizle(k[x]); });
var mah = k.mah.value.trim(), sok = k.sok.value.trim(), bina = k.bina.value.trim();
if (!mah) e(k.mah, 'Lütfen mahalle adını yazınız.'); else if (mah.length < 3 || genelMi(mah)) e(k.mah, 'Geçerli bir mahalle adı yazınız (örn: Süvari).');
if (!sok) e(k.sok, 'Lütfen cadde veya sokak adını yazınız.'); else if (sok.length < 2 || genelMi(sok)) e(k.sok, 'Geçerli bir cadde/sokak adı yazınız (örn: Gül Sokak).');
if (!bina) e(k.bina, 'Lütfen bina/kapı numarasını yazınız.'); else if (!/[0-9]/.test(bina)) e(k.bina, 'Bina numarası rakam içermelidir.');
if (ok && inp.value.replace(/\s+/g, '').length < MIN_LEN) e(k.sok, 'Adresiniz çok kısa, lütfen açık adres yazınız.');
var ml = maxLen(inp); if (ok && ml && inp.value.length > ml) e(k.tarif.value.trim() ? k.tarif : k.sok, 'Adres en fazla ' + ml + ' karakter olabilir, lütfen kısaltınız.');
if (!ok && ilk) { try { ilk.scrollIntoView({ block: 'center' }); ilk.focus(); } catch (_) {} }
return ok;
}
function gorunur(inp) { var w = inp.__cmadWrap; return !!(w && w.isConnected && (w.offsetParent !== null || w.getClientRects().length)); }
function formGecerli(root) { // istisna olursa true döner (asla script hatasıyla engelleme)
try {
var ok = true;
(root || document).querySelectorAll(SEL).forEach(function (inp) {
try { if (!inp.__cmadKutular) return; inp.__cmadSenk(); if (!gorunur(inp)) return; if (!dogrula(inp)) ok = false; } catch (e) { log(e); geriAl(inp); }
});
return ok;
} catch (e) { log(e); return true; }
}
function senkHepsi() { try { document.querySelectorAll(SEL).forEach(function (i) { if (i.__cmadKutular) i.__cmadSenk(); }); } catch (e) { log(e); } }
// Capture aşaması: platform işleyicilerinden ÖNCE değer yazılır; yalnız doğrulama hatasında durdurulur
document.addEventListener('submit', function (ev) {
try { var f = ev.target; if (!f || !f.querySelector || !f.querySelector(SEL)) return; if (!formGecerli(f)) { ev.preventDefault(); ev.stopImmediatePropagation(); } } catch (e) { log(e); }
}, true);
['pointerdown', 'mousedown', 'touchstart', 'focusin'].forEach(function (t) { document.addEventListener(t, senkHepsi, true); });
document.addEventListener('click', function (ev) {
try {
var b = ev.target && ev.target.closest && ev.target.closest('button,input[type=submit],a.btn,[onclick],[ng-click]'); if (!b) return;
var f = b.closest('form'); senkHepsi(); if (!f || !f.querySelector(SEL)) return;
var t = (b.innerText || b.value || '').toLocaleLowerCase('tr-TR');
if (b.type === 'submit' || /devam|kaydet|tamamla|onayla|güncelle|ekle/.test(t)) { if (!formGecerli(f)) { ev.preventDefault(); ev.stopImmediatePropagation(); } }
} catch (e) { log(e); }
}, true);
document.addEventListener('keydown', function (ev) {
try { if (ev.key !== 'Enter') return; var f = ev.target && ev.target.closest && ev.target.closest('form'); senkHepsi();
if (f && f.querySelector(SEL) && !formGecerli(f)) { ev.preventDefault(); ev.stopImmediatePropagation(); } } catch (e) { log(e); }
}, true);
// AJAX kaydetme yolları: save fonksiyonlarını sar (sarmalayıcı hata verirse orijinal çağrılır)
function sar(ad) {
try { var o = window[ad]; if (!o || typeof o.save !== 'function' || o.save.__cmad) return; var orj = o.save;
o.save = function () { var gec = true; try { var f = document.getElementById('saveInlineAddressForm') || document; gec = formGecerli(f); } catch (e) { log(e); gec = true; } if (!gec) return false; return orj.apply(this, arguments); };
o.save.__cmad = 1; } catch (e) { log(e); }
}
function tara() {
try {
document.querySelectorAll('.cmad-wrap').forEach(function (w) { var prev = w.previousElementSibling; if (!prev || !w.isConnected || !prev.querySelector || !(prev.matches(SEL) || prev.querySelector(SEL))) w.remove(); });
document.querySelectorAll(SEL).forEach(function (inp) {
kur(inp);
if (inp.__cmadKutular && inp.value !== inp.__cmadYazilan) { if ((inp.value || '').trim()) inp.__cmadDoldur(inp.value.trim()); else inp.__cmadSenk(); }
});
['vkCheckoutFAddress', '_addressForm'].forEach(sar);
} catch (e) { log(e); }
}
tara();
new MutationObserver(function () { clearTimeout(tara.t); tara.t = setTimeout(tara, 50); }).observe(document.documentElement, { childList: true, subtree: true });
setInterval(tara, 700); // dışarıdan değer değişimi (kayıtlı adres seçimi vb.)
window.cmAdresDogrula = { surum: '1.2', formGecerli: formGecerli, birlestir: birlestir, ayristir: ayristir, genelMi: genelMi };
} catch (e) { try { console.warn('[cm-adres] başlatılamadı', e); document.querySelectorAll('.cmad-wrap').forEach(function (w) { w.remove(); }); document.querySelectorAll('[name$="[address]"]').forEach(function (i) { var h = i.closest('.input-icon') || i; h.style.display = ''; }); } catch (_) {} }
})();