/* Add custom Js styles below */
/* ===== Rozana (Rwzana) Size Guide (No Figure) - Based on Berllin v7 ===== */
(function () {
if (window.__berllinSizeGuideLoadedV7__) return;
window.__berllinSizeGuideLoadedV7__ = true;
if (!window.Salla || !Salla.onReady) return;
Salla.onReady(function () {
if (!Salla.product || !Salla.product.event || !Salla.product.event.onSizeGuideFetched) return;
Salla.product.event.onSizeGuideFetched(function (sizes, productId) {
waitForSizeGuideContainer(initSizesUI, { retries: 50, interval: 120 }, sizes, productId);
});
});
function waitForSizeGuideContainer(cb, opts, sizes, productId) {
var selectors = [
'.s-product-size-guide-wrapper salla-tabs',
'.s-product-size-guide-wrapper .s-product-size-guide',
'.s-product-size-guide',
'[data-size-guide-target]',
'.product-size-guide',
'.size-guide'
];
var wrapperSel = '.s-product-size-guide-wrapper';
function find() {
var wrapper = document.querySelector(wrapperSel);
for (var i = 0; i < selectors.length; i++) {
var sel = selectors[i];
var el = wrapper ? wrapper.querySelector(sel) : document.querySelector(sel);
if (el) return el;
}
return null;
}
var tries = 0;
var timer = setInterval(function () {
var host = find();
if (host) {
clearInterval(timer);
cb(host, sizes, productId);
} else if (++tries >= (opts && opts.retries ? opts.retries : 40)) {
clearInterval(timer);
var wrapper = document.querySelector(wrapperSel) || document.body;
var fallback = document.createElement('div');
fallback.className = 's-product-size-guide-fallback';
wrapper.appendChild(fallback);
cb(fallback, sizes, productId);
}
}, (opts && opts.interval) || 100);
}
function initSizesUI(sizesHost) {
if (!sizesHost) return;
sizesHost.style.display = 'block';
sizesHost.style.width = '100%';
sizesHost.innerHTML = `
النتيجة
—
المقاس الموصى به (UK / الحرفي)
الصدر: —
الخصر: —
الأرداف: —
أدخلي القياسات ثم احسبي المقاس.
`;
/* ====================== JS Logic ====================== */
function $s(sel) { return sizesHost.querySelector(sel); }
function parseNum(x) {
if (typeof x === 'string') {
x = x.replace(/[^\d.\-]/g, '').replace(/,/g, '.');
}
var n = parseFloat(x);
return isFinite(n) ? n : NaN;
}
// جدول ثابت – إنش كأساس
var SIZES = [
{ hip: 36, waist: 26, bust: 32, size: 'S', uk: '6' },
{ hip: 38, waist: 28, bust: 34, size: 'M', uk: '8' },
{ hip: 40, waist: 30, bust: 36, size: 'L', uk: '10' },
{ hip: 42, waist: 32, bust: 38, size: 'XL', uk: '12' },
{ hip: 44, waist: 34, bust: 40, size: 'XXL', uk: '14' },
{ hip: 46, waist: 36, bust: 42, size: '3XL', uk: '16' },
{ hip: 48, waist: 38, bust: 44, size: '4XL', uk: '18' },
{ hip: 50, waist: 40, bust: 46, size: '5XL', uk: '20' },
{ hip: 52, waist: 42, bust: 48, size: '6XL', uk: '22' },
{ hip: 54, waist: 44, bust: 50, size: '7XL', uk: '24' }
];
var tbody = $s('#sizeBody');
var uIn = $s('#u-in');
var uCm = $s('#u-cm');
function toCm(v) { return Math.round(v * 2.54); }
function fmt(v, u) {
return u === 'cm' ? (toCm(v) + ' سم') : (v + ' إنش');
}
// ترتيب الأعمدة من اليمين: UK – المقاس – الصدر – الخصر – الأرداف
function renderTable(unit) {
if (!tbody) return;
var html = '';
for (var i = 0; i < SIZES.length; i++) {
var r = SIZES[i];
html += '
'
+ '| ' + r.uk + ' | ' // UK
+ '' + r.size + ' | ' // المقاس
+ '' + fmt(r.bust, unit) + ' | ' // الصدر
+ '' + fmt(r.waist, unit) + ' | ' // الخصر
+ '' + fmt(r.hip, unit) + ' | ' // الأرداف
+ '
';
}
tbody.innerHTML = html;
}
if (uIn) {
uIn.addEventListener('change', function () {
renderTable(this.value);
syncModalUnit();
});
}
if (uCm) {
uCm.addEventListener('change', function () {
renderTable(this.value);
syncModalUnit();
});
}
renderTable('cm');
// Modal handling
var modal = $s('#fitModal');
var openBtn = $s('#openFit');
var closeBtn = $s('#closeFit');
var closeFab = $s('#closeFab');
function syncModalUnit() {
var mIn = $s('#f-in');
var mCm = $s('#f-cm');
if (!mIn || !mCm) return;
if (uCm && uCm.checked) {
mCm.checked = true;
} else {
mIn.checked = true;
}
}
function syncPageUnitFromModal() {
var mCm = $s('#f-cm');
if (mCm && mCm.checked) {
if (uCm) uCm.checked = true;
renderTable('cm');
} else {
if (uIn) uIn.checked = true;
renderTable('in');
}
}
function showModal() {
if (!modal) return;
modal.classList.add('show');
syncModalUnit();
// منع تمرير الصفحة في الخلفية
document.documentElement.style.overflow = 'hidden';
document.body.style.overflow = 'hidden';
}
function hideModal() {
if (!modal) return;
modal.classList.remove('show');
document.documentElement.style.overflow = '';
document.body.style.overflow = '';
}
if (openBtn) {
openBtn.addEventListener('click', showModal);
}
if (closeBtn) {
closeBtn.addEventListener('click', hideModal);
}
if (closeFab) {
closeFab.addEventListener('click', hideModal);
}
if (modal) {
modal.addEventListener('click', function (e) {
if (e.target === modal) hideModal();
});
}
window.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && modal && modal.classList.contains('show')) {
hideModal();
}
});
var mIn = $s('#f-in');
var mCm = $s('#f-cm');
if (mIn) mIn.addEventListener('change', syncPageUnitFromModal);
if (mCm) mCm.addEventListener('change', syncPageUnitFromModal);
// Recommendation logic
var PADS = { regular: 0, relaxed: 1, snug: -0.5 };
function clampPad(x) {
if (x < -1) return -1;
if (x > 2) return 2;
return x;
}
function pick(userIn, pref) {
var pad = clampPad(PADS[pref || 'regular'] || 0);
var need = {
bust: Math.max(0, userIn.bust + pad),
waist: Math.max(0, userIn.waist + pad),
hip: Math.max(0, userIn.hip + pad)
};
for (var i = 0; i < SIZES.length; i++) {
var r = SIZES[i];
if (r.bust >= need.bust && r.waist >= need.waist && r.hip >= need.hip) return r;
}
return SIZES[SIZES.length - 1];
}
var store = {
set: function (k, v) {
try { localStorage.setItem(k, JSON.stringify(v)); } catch (e) {}
},
get: function (k, f) {
try {
var s = localStorage.getItem(k);
return s ? JSON.parse(s) : f;
} catch (e) {
return f;
}
}
};
var form = $s('#fitForm');
var outSize = $s('#recSize');
var oB = $s('#outBust');
var oW = $s('#outWaist');
var oH = $s('#outHip');
var note = $s('#fitNote');
var saveBtn = $s('#saveMySize');
var fillBtn = $s('#fillFromSaved');
var resetBtn = $s('#resetForm');
if (resetBtn) {
resetBtn.addEventListener('click', function () {
if (form) form.reset();
if (outSize) outSize.textContent = '—';
if (oB) oB.textContent = '—';
if (oW) oW.textContent = '—';
if (oH) oH.textContent = '—';
if (note) note.textContent = 'أدخلي القياسات ثم احسبي المقاس.';
});
}
function getUnit() {
var modChecked = $s('[name="fitUnit"]:checked');
if (modChecked) return modChecked.value === 'cm' ? 'cm' : 'in';
if (uCm && uCm.checked) return 'cm';
return 'in';
}
function readForm() {
var unit = getUnit();
var prefSel = $s('#fitPref');
var pref = prefSel ? prefSel.value : 'regular';
var bustInput = $s('#bust');
var waistInput = $s('#waist');
var hipInput = $s('#hip');
var bust = bustInput ? parseNum(bustInput.value) : NaN;
var waist = waistInput ? parseNum(waistInput.value) : NaN;
var hip = hipInput ? parseNum(hipInput.value) : NaN;
if (!(bust > 0) || !(waist > 0) || !(hip > 0)) return null;
var toIn = function (v) { return unit === 'cm' ? v / 2.54 : v; };
return {
unit: unit,
pref: pref,
raw: { bust: bust, waist: waist, hip: hip },
inch: { bust: toIn(bust), waist: toIn(waist), hip: toIn(hip) }
};
}
if (form) {
form.addEventListener('submit', function (e) {
e.preventDefault();
var st = readForm();
if (!st) {
if (note) note.textContent = 'يرجى إدخال جميع القياسات بشكل صحيح.';
return;
}
var rec = pick(st.inch, st.pref);
if (outSize) outSize.textContent = 'UK ' + rec.uk + ' — ' + rec.size;
var outFmt = function (v) {
if (st.unit === 'cm') return Math.round(v) + ' سم';
return (+v.toFixed(1)) + ' إنش';
};
if (oB) oB.textContent = outFmt(st.raw.bust);
if (oW) oW.textContent = outFmt(st.raw.waist);
if (oH) oH.textContent = outFmt(st.raw.hip);
if (note) note.textContent = 'تطابق مباشر مع جدول Rozana (Rwzana)؛ قد يختلف حسب قصة الموديل والقماش.';
store.set('lastMeasures', st);
});
}
if (saveBtn) {
saveBtn.addEventListener('click', function () {
var st = readForm();
if (!st) {
if (note) note.textContent = 'أدخلي القياسات أولًا قبل الحفظ.';
return;
}
store.set('mySize', st);
if (note) note.textContent = 'تم حفظ مقاسك على هذا المتصفح.';
});
}
if (fillBtn) {
fillBtn.addEventListener('click', function () {
var sv = store.get('mySize') || store.get('lastMeasures');
if (!sv) {
if (note) note.textContent = 'لا توجد قياسات محفوظة بعد.';
return;
}
var fitCm = $s('#f-cm');
var fitIn = $s('#f-in');
if (sv.unit === 'cm' && fitCm) fitCm.checked = true;
else if (fitIn) fitIn.checked = true;
var bustInput = $s('#bust');
var waistInput = $s('#waist');
var hipInput = $s('#hip');
var prefSel = $s('#fitPref');
if (bustInput) bustInput.value = (sv.raw && sv.raw.bust) != null ? sv.raw.bust : '';
if (waistInput) waistInput.value = (sv.raw && sv.raw.waist) != null ? sv.raw.waist : '';
if (hipInput) hipInput.value = (sv.raw && sv.raw.hip) != null ? sv.raw.hip : '';
if (prefSel && sv.pref) prefSel.value = sv.pref;
if (note) note.textContent = 'تم استرجاع القياسات — احسبي المقاس الآن.';
syncPageUnitFromModal();
});
}
}
})();