(function (window){
"use strict";
var Render={};
Render.setLoading=function (container){
container.innerHTML="";
};
Render.setError=function (container, message){
container.innerHTML='<div class="zoop-error">' + (message||"Something went wrong.") + "</div>";
};
function getProductRootFromNode(node){
var el=node;
while (el&&el!==document.body){
if((el.classList&&el.classList.contains("product")) ||
(el.classList&&el.classList.contains("type-product")) ||
(el.matches&&el.matches(".woocommerce div.product"))
) return el;
el=el.parentElement;
}
return document.body;
}
function ensureSuccessOverlay(root){
var overlay=root.querySelector(".zoop-success-overlay");
if(overlay) return overlay;
overlay=document.createElement("div");
overlay.className="zoop-success-overlay";
overlay.setAttribute("aria-hidden", "true");
overlay.innerHTML =
'<div class="zoop-success-overlay__content" role="status" aria-live="polite">' +
'<span class="zoop-success-overlay__tick" aria-hidden="true">✓</span>' +
'<span class="zoop-success-overlay__text">Prekė sėkmingai pridėta į krepšelį</span>' +
"</div>";
var hide=function (){
overlay.classList.remove("is-visible");
overlay.setAttribute("aria-hidden", "true");
document.removeEventListener("click", onDocClick, true);
document.removeEventListener("touchstart", onDocClick, true);
document.removeEventListener("keydown", onKeyDown, true);
};
var onDocClick=function (){ hide(); };
var onKeyDown=function (e){
if(e.key==="Escape"||e.key==="Enter"||e.key===" ") hide();
};
overlay.addEventListener("click", function (e){
e.preventDefault();
hide();
});
overlay.__show=function (){
overlay.classList.add("is-visible");
overlay.setAttribute("aria-hidden", "false");
setTimeout(function (){
document.addEventListener("click", onDocClick, true);
document.addEventListener("touchstart", onDocClick, true);
document.addEventListener("keydown", onKeyDown, true);
}, 0);
};
root.appendChild(overlay);
return overlay;
}
function showSuccessOverlay(form){
var root=getProductRootFromNode(form);
var overlay=ensureSuccessOverlay(root);
overlay.__show();
}
function resetQuantityInputs(form){
var inputs=form.querySelectorAll(".zoop-qty-input[data-variation_id]");
for (var i=0; i < inputs.length; i++){
inputs[i].value="0";
inputs[i].dispatchEvent(new Event("change", { bubbles: true }));
}}
function applyCartFragments(cartData){
if(!cartData||!cartData.fragments) return;
var fragments=cartData.fragments;
Object.keys(fragments).forEach(function (selector){
var html=fragments[selector];
if(!selector||typeof html!=="string") return;
var targets=document.querySelectorAll(selector);
for (var i=0; i < targets.length; i++){
var wrapper=document.createElement("div");
wrapper.innerHTML=html;
var replacement=wrapper.firstElementChild;
if(replacement) targets[i].replaceWith(replacement);
else targets[i].innerHTML=html;
}});
}
Render.bindBulkAdd=function (form){
if(!form||form.dataset.zoopBound==="1") return;
form.dataset.zoopBound="1";
var btn=form.querySelector(".zoop-add-selected");
if(!btn) return;
btn.addEventListener("click", function (e){
e.preventDefault();
var qtyMap=window.ZoopBulkCore.buildQtyMap(form);
if(!Object.keys(qtyMap).length){
alert(ZoopBulkAjax.i18n_empty||"Įveskite bent vieną kiekį.");
return;
}
btn.disabled=true;
btn.classList.add("is-loading");
btn.setAttribute("aria-busy", "true");
var productId=parseInt((form.querySelector('input[name="product_id"]')||{}).value||"0", 10);
window.ZoopBulkCore.postFormEncoded({
action: ZoopBulkAjax.action_add,
nonce: ZoopBulkAjax.nonce,
product_id: String(productId),
qty_map: JSON.stringify(qtyMap)
})
.then(function (json){
if(!json||!json.success){
var msg=(json&&json.data&&json.data.message)
? json.data.message
: (ZoopBulkAjax.i18n_error||"Nepavyko įdėti į krepšelį.");
throw new Error(msg);
}
var cartData=json.data&&json.data.cart ? json.data.cart:{};
applyCartFragments(cartData);
if(window.jQuery){
window.jQuery(document.body).trigger("added_to_cart", [cartData.fragments||{}, cartData.cart_hash||"", window.jQuery(btn)]);
}
btn.disabled=false;
btn.classList.remove("is-loading");
btn.removeAttribute("aria-busy");
resetQuantityInputs(form);
showSuccessOverlay(form);
})
.catch(function (err){
alert(err&&err.message ? err.message:(ZoopBulkAjax.i18n_error||"Nepavyko įdėti į krepšelį."));
btn.disabled=false;
btn.classList.remove("is-loading");
btn.removeAttribute("aria-busy");
});
}, true);
};
Render.reorderSizesClientSide=function (container){
if(!container) return;
var rankMap={
"XXXS": 10, "3XS": 10, "XXS": 20, "2XS": 20, "XS": 30, "S": 40, "M": 50,
"L": 60, "XL": 70, "XXL": 80, "2XL": 80, "XXXL": 90, "3XL": 90, "4XL": 100,
"5XL": 110, "6XL": 120
};
function normalize(v){
return String(v||"").toUpperCase().replace(/\s+/g, "").replace(/[-_.]/g, "");
}
function getRank(raw){
var n=normalize(raw);
if(rankMap[n]!=null) return rankMap[n];
var m=n.match(/^([2-9])XS$/);
if(m) return parseInt(m[1], 10)===2 ? 20:(parseInt(m[1], 10)===3 ? 10:1000);
m=n.match(/^([2-9])XL$/);
if(m) return 60 + (parseInt(m[1], 10) * 10);
return 1000;
}
var table=container.querySelector(".zoop-bulk-table");
if(!table) return;
var headRow=table.querySelector("thead tr");
var bodyRow=table.querySelector("tbody tr");
if(!headRow||!bodyRow) return;
var ths=Array.prototype.slice.call(headRow.children||[]);
var tds=Array.prototype.slice.call(bodyRow.children||[]);
var cols=[];
for (var i=1; i < ths.length; i++){
cols.push({ th: ths[i], td: tds[i], rank: getRank(ths[i].textContent), idx: i });
}
cols.sort(function (a, b){
if(a.rank===b.rank) return a.idx - b.idx;
return a.rank - b.rank;
});
for (var j=0; j < cols.length; j++){
headRow.appendChild(cols[j].th);
bodyRow.appendChild(cols[j].td);
}};
Render.enhanceMobileQtyControls=function (scope){
if(!scope) return;
var qtyWraps=scope.querySelectorAll(".zoop-mobile-qty");
for (var i=0; i < qtyWraps.length; i++){
var wrap=qtyWraps[i];
if(wrap.dataset.qtyEnhanced==="1") continue;
var input=wrap.querySelector('input.zoop-qty-input[type="number"]');
if(!input||input.disabled) continue;
var minus=document.createElement("button");
minus.type="button";
minus.className="zoop-qty-btn zoop-qty-minus";
minus.setAttribute("aria-label", "Minus");
minus.textContent="−";
var plus=document.createElement("button");
plus.type="button";
plus.className="zoop-qty-btn zoop-qty-plus";
plus.setAttribute("aria-label", "Plus");
plus.textContent="+";
wrap.insertBefore(minus, input);
wrap.appendChild(plus);
minus.addEventListener("click", function (e){
e.preventDefault(); e.stopPropagation();
var inp=this.parentNode.querySelector('input.zoop-qty-input[type="number"]');
if(!inp) return;
var step=parseInt(inp.getAttribute("step")||"1", 10)||1;
var min=parseInt(inp.getAttribute("min")||"0", 10);
var v=parseInt(inp.value||"0", 10);
inp.value=String(Math.max(min, v - step));
inp.dispatchEvent(new Event("change", { bubbles: true }));
});
plus.addEventListener("click", function (e){
e.preventDefault(); e.stopPropagation();
var inp=this.parentNode.querySelector('input.zoop-qty-input[type="number"]');
if(!inp) return;
var step=parseInt(inp.getAttribute("step")||"1", 10)||1;
var maxAttr=inp.getAttribute("max");
var max=maxAttr ? parseInt(maxAttr, 10):null;
var v=parseInt(inp.value||"0", 10);
var next=v + step;
if(max!==null&&!isNaN(max)) next=Math.min(max, next);
inp.value=String(next);
inp.dispatchEvent(new Event("change", { bubbles: true }));
});
wrap.dataset.qtyEnhanced="1";
}};
Render.renderSingleColorHtml=function (ctx, html, colorSlug){
var container=ctx.container;
container.innerHTML=html;
Render.reorderSizesClientSide(container);
Render.bindBulkAdd(container.querySelector("form.zoop-bulk-form"));
Render.enhanceMobileQtyControls(container);
container.style.opacity="0";
container.style.transition="opacity .22s ease";
requestAnimationFrame(function (){ container.style.opacity="1"; });
if(ctx.syncWooVariationSelection) ctx.syncWooVariationSelection(colorSlug, container);
if(ctx.syncMainProductImageFromRow) ctx.syncMainProductImageFromRow(colorSlug);
};
Render.renderSingleFromStructure=function (ctx, structData, colorSlug){
var c=structData&&structData.color ? structData.color:null;
if(!c||!Array.isArray(c.sizes)||!c.sizes.length) throw new Error("No sizes found for selected color.");
var imageHtml="";
if(c.image_url){
imageHtml='<div class="zoop-preview-image-wrap"><img class="zoop-selected-variation-image" loading="lazy" src="' +
String(c.image_url).replace(/"/g, "&quot;") + '" alt="' + String(c.color_name||"").replace(/"/g, "&quot;") + '"></div>';
}
var head='', body='', mobile='';
for (var i=0; i < c.sizes.length; i++){
var s=c.sizes[i];
var label=s.label||s.size_slug||"";
var disabled = !!s.disabled;
head +="<th>" + label + "</th>";
body +='<td class="zoop-size-cell ' + (disabled ? 'is-disabled':'') + '" data-size-label="' + label + '">' +
'<input type="number" min="0" step="1" value="0" class="zoop-qty-input" data-variation_id="' + s.variation_id + '" data-size-slug="' + (s.size_slug||"") + '"' + (disabled ? ' disabled="disabled"':'') + '>' +
'<div class="zoop-price">…</div><div class="' + (disabled ? 'zoop-out':'zoop-stock') + '">…</div></td>';
mobile +='<div class="zoop-mobile-card ' + (disabled ? 'is-out':'is-instock') + '">' +
'<div class="zoop-mobile-size">' + label + '</div>' +
'<div class="zoop-mobile-qty"><input type="number" min="0" step="1" value="0" class="zoop-qty-input" data-variation_id="' + s.variation_id + '" data-size-slug="' + (s.size_slug||"") + '"' + (disabled ? ' disabled="disabled"':'') + '></div>' +
'<div class="zoop-mobile-price">…</div><div class="zoop-mobile-stock">…</div></div>';
}
var html='' +
'<form class="zoop-bulk-form" method="post" action="">' +
'<input type="hidden" name="product_id" value="' + (structData.product_id||"") + '">' +
'<input type="hidden" name="color_taxonomy" value="' + (structData.color_tax||"") + '">' +
'<input type="hidden" name="size_taxonomy" value="' + (structData.size_tax||"") + '">' +
'<input type="hidden" name="color_slug" value="' + colorSlug + '">' +
'<div class="zoop-desktop-table-wrap"><table class="zoop-bulk-table"><thead><tr><th class="zoop-col-preview"></th>' + head + '</tr></thead><tbody><tr>' +
'<td class="zoop-preview-cell">' + imageHtml + '<div class="zoop-preview-color">' + (c.color_name||colorSlug) + '</div></td>' + body + '</tr></tbody></table></div>' +
'<div class="zoop-mobile-cards-wrap" aria-label="Variations"><div class="zoop-mobile-cards-head"><span>Dydis</span><span>Kiekis</span><span>Kaina</span><span>Likutis</span></div>' + mobile + '</div>' +
'<button type="button" class="button alt zoop-add-selected"><span class="zoop-btn-text">Į krepšelį</span><span class="zoop-btn-spinner" aria-hidden="true"></span></button>' +
'</form>';
Render.renderSingleColorHtml(ctx, html, colorSlug);
var ids=c.sizes.map(function (x){ return parseInt(x.variation_id||"0", 10); }).filter(Boolean);
if(!ids.length) return;
window.ZoopBulkCore.postFormEncoded({
action: ZoopBulkAjax.action_live_stock,
nonce: ZoopBulkAjax.nonce,
variation_ids: JSON.stringify(ids)
}).then(function (json){
if(!json||!json.success||!json.data||!json.data.items) return;
var items=json.data.items;
var inputs=ctx.container.querySelectorAll(".zoop-qty-input[data-variation_id]");
for (var j=0; j < inputs.length; j++){
var inp=inputs[j];
var vid=parseInt(inp.getAttribute("data-variation_id")||"0", 10);
var item=items[vid];
if(!item) continue;
var disabled = !!item.disabled;
if(!disabled&&item.max_qty&&item.max_qty > 0) inp.setAttribute("max", String(item.max_qty));
else inp.removeAttribute("max");
inp.disabled=disabled;
if(disabled) inp.value="0";
var cell=inp.closest(".zoop-size-cell, .zoop-mobile-card");
if(!cell) continue;
if(cell.classList){
cell.classList.toggle("is-disabled", disabled);
cell.classList.toggle("is-out", disabled);
cell.classList.toggle("is-instock", !disabled);
}
var priceEl=cell.querySelector(".zoop-price, .zoop-mobile-price");
if(priceEl) priceEl.innerHTML=item.price_html||"&mdash;";
var stockEl=cell.querySelector(".zoop-stock, .zoop-mobile-stock, .zoop-out");
if(stockEl){
if(!disabled){
stockEl.classList.remove("zoop-out");
stockEl.classList.add("zoop-stock");
stockEl.textContent=(item.stock_qty!==null&&item.stock_qty!==undefined) ? ("Likutis: " + item.stock_qty):"Likutis";
}else{
stockEl.classList.remove("zoop-stock");
stockEl.classList.add("zoop-out");
stockEl.textContent="Neturime";
}}
}
Render.enhanceMobileQtyControls(ctx.container);
}).catch(function (){});
};
window.ZoopBulkRender=Render;
})(window);