"use strict";
function normalizePath(path){
if(!path.startsWith('/')){
return '/' + path;
}
return path;
}
document.addEventListener("DOMContentLoaded", function (){
const containers=document.querySelectorAll(".ean-twister-container");
containers.forEach(container=> {
const innerContainerId=container.id + "-inner";
const innerContainer=document.getElementById(innerContainerId);
if(!innerContainer) return;
const options=window["options_" + container.id];
if(!options){
console.error("Aucune option trouvée pour", containerId);
return;
}
const campaigns=container.getAttribute("data-campaigns")||"";
const items=campaigns.split(",").filter(item=> item.trim()!=="");
const itemCount=Math.min(items.length, 3);
const columnWidth=(100 / itemCount).toFixed(2) + "%";
innerContainer.style.gridTemplateColumns=`repeat(${itemCount}, ${columnWidth})`;
const columnClass=`ean-twister_wrapcolumni-${itemCount}`;
innerContainer.classList.add(columnClass);
const loadingWheelId="ean-twister-loading-wheel-" + Math.random().toString(36).substr(2, 9);
const loadingWheel=document.createElement("div");
loadingWheel.id=loadingWheelId;
loadingWheel.className="ean-twister-loading-wheel";
loadingWheel.innerHTML='<div class="ean-twister-spinner"></div>';
container.prepend(loadingWheel);
loadingWheel.style.display="block";
fetch('/wp-admin/admin-ajax.php?action=mwk_get_apitoken')
.then(response=> response.json())
.then(data=> {
if(data.success){
const apiToken=data.data.apiToken;
fetchEanTwisterData(apiToken, campaigns, innerContainer, loadingWheelId);
}else{
console.error("Erreur lors de la récupération du token.");
}})
.catch(error=> console.error("Erreur lors de la récupération du token MWK :", error));
});
document.addEventListener('click', handleKamesenClick);
document.addEventListener('contextmenu', handleKamesenContextMenu);
});
function fetchEanTwisterData(MWK_MWAKAMOON, campaigns, innerContainer, loadingWheelId){
const endpoint=`/eanTwisterDataAjax.php?campaigns=${encodeURIComponent(campaigns)}&fithy=${encodeURIComponent(MWK_MWAKAMOON)}`;
fetch(endpoint)
.then(resp=> resp.json())
.then(data=> {
buildEanTwister(data, innerContainer, loadingWheelId);
})
.catch(err=> {
});
}
function buildEanTwister(eanTwisterData, innerContainer, loadingWheelId){
eanTwisterData.forEach((campaign, index)=> {
if(!campaign||!campaign.found_items) return;
const col=document.createElement("div");
col.className="ean-twister-column";
if(index % 2===0){
col.classList.add("even-row");
}else{
col.classList.add("odd-row");
}
const container=innerContainer.closest(".ean-twister-container");
const options=window["options_" + container.id];
if(!options){
console.error("Problème d'options pour", container.id);
return;
}
if(options.pics){
let imageUrl=campaign.local_image;
let mainpics_link=null;
let mainpics_encodedlink=null;
let cheapestPrice=Infinity;
if(!imageUrl&&campaign.found_items[0]&&campaign.found_items[0].image){
imageUrl=campaign.found_items[0].image;
}
campaign.found_items.forEach(item=> {
const currentPrice=parseFloat(item.search_price||'0')||0;
const link=item.aw_deeplink||'#';
const encodedLink=item.url_encoded||'#';
const merchant=(item.merchant_name||'').toLowerCase();
if(merchant!=='amazon'&&currentPrice < cheapestPrice){
mainpics_link=link;
mainpics_encodedlink=encodedLink;
cheapestPrice=currentPrice;
}});
if(imageUrl){
const img=document.createElement("img");
img.src=normalizePath(imageUrl);
img.className="ean-twister-illustration";
if(options.ninlink&&mainpics_encodedlink){
const cloakSpan=document.createElement("span");
cloakSpan.className="kamesen";
cloakSpan.setAttribute("datasin", mainpics_encodedlink);
cloakSpan.appendChild(img);
col.appendChild(cloakSpan);
}else if(mainpics_link){
const link=document.createElement("a");
link.href=mainpics_link;
link.target="_blank";
link.rel="nofollow";
link.appendChild(img);
col.appendChild(link);
}else{
col.appendChild(img);
}}
}
if(options.name){
const validTags=['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'span', 'div'];
const tagName=validTags.includes(options.name.toLowerCase()) ? options.name.toLowerCase():'h3';
const title=document.createElement(tagName);
title.className="ean-twister-block-title";
title.textContent=campaign.campaign_name||"Meilleurs Offres";
col.appendChild(title);
}
const merchantList=document.createElement("div");
merchantList.className="ean-twister-merchant-list";
let hasRefurb=false;
const allItems=campaign.found_items;
let finalItems;
if(allItems.length > options.items_max){
const merchantMap={};
allItems.forEach((item, i)=> {
const merchant=(item.merchant_name||"").toLowerCase();
const price=parseFloat(item.search_price||"0")||0;
if(!merchantMap[merchant]){
merchantMap[merchant]={ item, i };}else{
const existingPrice=parseFloat(merchantMap[merchant].item.search_price||"0")||0;
if(price < existingPrice){
merchantMap[merchant]={ item, i };}}
});
finalItems=Object.values(merchantMap)
.sort((a, b)=> a.i - b.i)
.map(obj=> obj.item);
}else{
finalItems=allItems;
}
finalItems.forEach((item, index)=> {
const currentPrice=parseFloat(item.search_price||'0')||0;
const oldPrice=parseFloat(item.product_price_old||'0')||0;
const link=item.aw_deeplink||'#';
const merchant=(item.merchant_name||'').toLowerCase();
const encodedUrl=item.url_encoded||'';
const imageUrl=item.image||'';
const productTitle=item.product_name||item.title||"";
const line=document.createElement("div");
line.className="ean-twister-merchant-line";
if(imageUrl){
const tooltip=document.createElement("div");
tooltip.className="ean-twister-tooltip";
const cloakSpan=document.createElement("span");
cloakSpan.className="kamesen ean-twister-tooltip-link";
cloakSpan.setAttribute("datasin", encodedUrl);
const tooltipTitle=document.createElement("div");
tooltipTitle.className="ean-twister-tooltip-title";
tooltipTitle.textContent=productTitle;
cloakSpan.appendChild(tooltipTitle);
const tooltipImage=document.createElement("img");
tooltipImage.className="ean-twister-tooltip-image";
tooltipImage.src=imageUrl;
tooltipImage.alt=productTitle;
cloakSpan.appendChild(tooltipImage);
tooltip.appendChild(cloakSpan);
line.appendChild(tooltip);
}
if(index % 2===0){
line.classList.add("even-line-merchant");
}else{
line.classList.add("odd-line-merchant");
}
const iconUrl=options.icons[merchant]||options.icons.default;
const icon=document.createElement("img");
icon.src=iconUrl;
icon.width=20;
icon.height=20;
const merchantInfo=document.createElement("span");
merchantInfo.className="ean-twister-merchant-info";
merchantInfo.appendChild(icon);
const merchantNameSpan=document.createElement("span");
merchantNameSpan.className="ean-twister-merchant-name";
merchantNameSpan.textContent=merchant;
merchantInfo.appendChild(merchantNameSpan);
if(merchant==="rakuten"||merchant==="certideal"||merchant==="rebuy"||merchant==="backmarket"||merchant==="ebay"||merchant==="idealo"){
const refurbBadge=document.createElement("span");
refurbBadge.className="ean-twister-refurb";
refurbBadge.textContent="♻️";
merchantInfo.appendChild(refurbBadge);
hasRefurb=true;
line.classList.add("refurbishedlined");
}
if(merchant==='amazon'){
const amzNote=document.createElement("div");
amzNote.className="ean-twister-amz-note";
amzNote.textContent="#Amazon #Rémunéré";
merchantInfo.appendChild(amzNote);
}
const spanPrice=document.createElement("span");
spanPrice.className="ean-twister-merchant-price";
spanPrice.textContent=currentPrice.toFixed(2) + " €";
let discountLabel="";
let spanOldPrice=null;
if(oldPrice > currentPrice){
spanOldPrice=document.createElement("span");
spanOldPrice.className="ean-twister-merchant-price-old";
spanOldPrice.innerHTML=`<del>${oldPrice.toFixed(2)} €</del>`;
const discountPercent=Math.round(((oldPrice - currentPrice) / oldPrice) * 100);
discountLabel=`Réduction:-${discountPercent}%`;
}
let discountBadge=null;
if(discountLabel){
discountBadge=document.createElement("span");
discountBadge.className="ean-twister-merchant-discount";
discountBadge.textContent=discountLabel;
}
const viewButton=document.createElement("span");
viewButton.className="ean-twister-merchant-view-button";
viewButton.textContent="Voir sur le site";
if(options.ninlink){
const cloakSpan=document.createElement("span");
cloakSpan.className="kamesen";
cloakSpan.setAttribute("datasin", encodedUrl);
cloakSpan.appendChild(merchantInfo);
cloakSpan.appendChild(spanPrice);
if(spanOldPrice){
spanPrice.appendChild(spanOldPrice);
}
if(discountBadge){
spanPrice.appendChild(discountBadge);
}
cloakSpan.appendChild(viewButton);
line.appendChild(cloakSpan);
}else{
const a=document.createElement("a");
a.href=link;
a.rel="nofollow";
a.appendChild(merchantInfo);
a.appendChild(spanPrice);
if(spanOldPrice){
spanPrice.appendChild(spanOldPrice);
}
if(discountBadge){
spanPrice.appendChild(discountBadge);
}
a.appendChild(viewButton);
line.appendChild(a);
}
merchantList.appendChild(line);
});
function updateVisibleProducts(merchantList, options, refurbHidden){
const merchantLines=Array.from(merchantList.querySelectorAll(".ean-twister-merchant-line"));
const refurbLines=merchantLines.filter(line=> line.classList.contains("refurbishedlined"));
const nonRefurbLines=merchantLines.filter(line=> !line.classList.contains("refurbishedlined"));
let visibleCount=0;
refurbLines.forEach(line=> {
line.style.display=refurbHidden ? "none":"flex";
});
if(options.items_max&&options.items_max > 0){
merchantLines.forEach(line=> {
line.style.display="none";
line.classList.add("ean-twister-hidden-line");
});
let count=0;
const allValidItems=refurbHidden ? nonRefurbLines:merchantLines;
allValidItems.forEach(line=> {
line.style.display="flex";
line.classList.remove("ean-twister-hidden-line");
});
}else{
merchantLines.forEach(line=> {
line.style.display=refurbHidden&&line.classList.contains("refurbishedlined") ? "none":"flex";
});
}}
if(options.items_max&&options.items_max > 0){
const merchantLines=Array.from(merchantList.querySelectorAll(".ean-twister-merchant-line"));
if(merchantLines.length > options.items_max){
for (let i=options.items_max; i < merchantLines.length; i++){
merchantLines[i].style.display="none";
merchantLines[i].classList.add("ean-twister-hidden-line");
}
const showMoreButton=document.createElement("button");
showMoreButton.className="ean-twister-show-more";
showMoreButton.textContent="Voir +";
showMoreButton.addEventListener("click", function (){
merchantLines.forEach(line=> {
if(line.classList.contains("ean-twister-hidden-line")){
line.style.display="flex";
}});
showMoreButton.remove();
});
merchantList.appendChild(showMoreButton);
}}
if(hasRefurb){
const toggleRefurbButton=document.createElement("button");
toggleRefurbButton.className="ean-twister-toggle-refurb";
toggleRefurbButton.textContent="Masquer les produits reconditionnés";
let refurbHidden=false;
toggleRefurbButton.addEventListener("click", function (){
refurbHidden = !refurbHidden;
updateVisibleProducts(merchantList, options, refurbHidden);
toggleRefurbButton.textContent=refurbHidden ? "Afficher les produits reconditionnés":"Masquer les produits reconditionnés";
});
merchantList.insertBefore(toggleRefurbButton, merchantList.firstChild);
}
col.appendChild(merchantList);
innerContainer.appendChild(col);
});
let lastCheckDate="";
if(eanTwisterData.length > 0&&eanTwisterData[0].date_lastcheck){
lastCheckDate=new Date(eanTwisterData[0].date_lastcheck).toLocaleString("fr-FR", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
});
}
const disclaimer=document.createElement("div");
disclaimer.className="ean-twister-disclaimer";
disclaimer.innerHTML=`ⓘ En cliquant sur l'un des articles ci-dessus, vous serez redirigé vers sa fiche produit sur Αmazοn.fr.
Notre site internet participe au programme Partenaire Αmazοn ainsi qu'à d'autres programmes d'affiliation et réalise ainsi un bénéfice
sur les achats qui remplissent les conditions requises. Relevé de prix actualisé toutes les 24h. Le dernier relevé date du <strong>${lastCheckDate}</strong>.`;
innerContainer.parentNode.appendChild(disclaimer);
const loadingWheel=document.getElementById(loadingWheelId);
if(loadingWheel) loadingWheel.style.display="none";
}
function handleKamesenClick(event){
const target=event.target.closest('.kamesen');
if(!target||!target.hasAttribute("datasin")) return;
const encodedUrl=target.getAttribute("datasin");
const url=decodeURIComponent(window.atob(encodedUrl));
if(event.ctrlKey){
const newWindow=window.open(url, '_blank');
if(newWindow) newWindow.focus();
event.preventDefault();
}else{
document.location.href=url;
}}
function handleKamesenContextMenu(event){
const target=event.target.closest('.kamesen');
if(!target||!target.hasAttribute("datasin")) return;
event.preventDefault();
const encodedUrl=target.getAttribute("datasin");
const url=decodeURIComponent(window.atob(encodedUrl));
window.open(url, '_blank');
}
function handleKamesenMiddleClick(event){
if(event.button===1){
const target=event.target.closest('.kamesen');
if(!target||!target.hasAttribute("datasin")) return;
event.preventDefault();
const encodedUrl=target.getAttribute("datasin");
const url=decodeURIComponent(window.atob(encodedUrl));
const newWindow=window.open(url, '_blank');
if(newWindow) newWindow.focus();
}}
document.addEventListener("DOMContentLoaded", function(){
if(window.disableSameInRocketPromo){
console.log("❌ EANTwister Kamesen désactivé par un autre script.");
return;
}
window.disableSameInRocketPromo=true;
console.log("✅ EANTwister Kamesen activé.");
document.addEventListener("click", handleKamesenClick);
document.addEventListener("contextmenu", handleKamesenContextMenu);
document.addEventListener("mousedown", handleKamesenMiddleClick);
});