var date = new Date(); let day = date.getDate(); let month = date.getMonth() + 1; let year = date.getFullYear(); let date1 = `${month}/${day}/${year}`; var date2 = '08/30/2026'; var date3 = new Date(date1); var date4 = new Date(date2); const tarihGecElement = document.getElementById("tarihgec"); if (tarihGecElement) { if (date3 > date4) { tarihGecElement.innerHTML = "الأسعار ليست حالية"; } else { tarihGecElement.innerHTML = "الأسعار الحالية"; } } else { console.warn("Sistem Uyarısı: HTML sayfasında 'tarihgec' ID'li element bulunamadı."); } // localStorage.clear(); // tek sayfa kullanılıyorsa temizler //! variables const cartBtn = document.querySelector(".cart-btn"); const clearCartBtn = document.querySelector(".btn-clear"); const checkoutCartBtn = document.querySelector(".btn-checkout"); const cartItems = document.querySelector(".cart-items"); const cartTotal = document.querySelector(".total-value"); const cartContent = document.querySelector(".cart-list"); const productsDOM = document.querySelector("#products-dom"); var kurlar = "USD"; //databaseden var aktifDil = "ar"; // tr, en... let cart = []; let buttonsDOM = []; class Products { async getProducts() { try { // let result = await fetch("https://67a784d6203008941f67d30d.mockapi.io/products"); // let data = await result.json(); let data = [{"id":"1","title":"title","image":"https://fsmefeler.com.tr/resim","image2":"https://fsmefeler.com.tr/resim2","price":100}]; //databaseden let products = data; return products; } catch (error) { console.log(error); } } } class UI { displayProducts(products) { let result = ""; products.forEach(item => { // item.price = parseFloat(item.price.toFixed(2)); item.price = item.price.toFixed(2); result += ` `}); productsDOM.innerHTML = result; } getBagButtons() { const buttons = [...document.querySelectorAll(".btn-add-to-cart")]; buttonsDOM = buttons; buttons.forEach(button => { let id = button.dataset.id; let inCart = cart.find(item => item.id === id); if (inCart) { button.setAttribute("disabled", "disabled"); button.style.opacity = ".3"; } else { button.addEventListener("click", event => { event.target.disabled = true; event.target.style.opacity = ".3"; //* get product from products let cartItem = { ...Storage.getProduct(id), amount: 1 }; //* add procuct to the cart cart = [...cart, cartItem]; //* save cart in local storage Storage.saveCart(cart); //* save cart values this.saveCartValues(cart); //* display cart item this.addCartItem(cartItem) //* show the cart this.showCart(); }) } }) } saveCartValues(cart) { let tempTotal = 0; let itemsTotal = 0; cart.map(item => { tempTotal += item.price * item.amount; itemsTotal += item.amount; }); cartTotal.innerText = tempTotal.toFixed(2) + " " + kurlar; cartItems.innerText = itemsTotal; } addCartItem(item) { const li = document.createElement("li"); li.classList.add("cart-list-item"); li.innerHTML = `
${item.title} ${item.price} ${kurlar}
  ${item.amount}  
  
`; cartContent.appendChild(li); } // YENİ VE UYUMLU KOD showCart() { const sepetElementi = document.getElementById("offcanvasRight"); if (sepetElementi) { // Eğer sepet zaten açıksa veya açılış animasyonundaysa çift tetiklemeyi önle if (sepetElementi.classList.contains('show') || sepetElementi.classList.contains('showing')) { return; } // Bootstrap 5.0.2 için en kararlı, doğrudan yerel örneği tetikleme yöntemi const bsOffcanvas = new bootstrap.Offcanvas(sepetElementi); bsOffcanvas.show(); } } setupAPP() { cart = Storage.getCart(); this.saveCartValues(cart); this.populateCart(cart); } populateCart(cart) { cart.forEach(item => this.addCartItem(item)); } cartLogic() { clearCartBtn.addEventListener("click", () => { this.clearCart(); }); checkoutCartBtn.addEventListener("click", () => { this.checkoutCart(); }); cartContent.addEventListener("click", event => { // A) SİLME (ÇÖP KUTUSU) BUTONU let removeBtn = event.target.closest(".cart-remove-btn"); if (removeBtn) { let id = removeBtn.dataset.id; // 🚨 KRİTİK DÜZELTME: Parent saymak yerine doğrudan en üstteki 'li' satırını bulup siliyoruz. // Bu sayede DOM yapısı asla bozulmaz ve sonraki işlemlerde tutarsızlık yaşanmaz. let cartItemRow = removeBtn.closest("li"); if (cartItemRow) { cartItemRow.remove(); } this.removeItem(id); return; } // B) ADET AZALTMA (EKSİ) BUTONU let minusBtn = event.target.closest(".quantity-minus"); if (minusBtn) { let id = minusBtn.dataset.id; let tempItem = cart.find(item => item.id === id); if (tempItem) { tempItem.amount = tempItem.amount - 1; if (tempItem.amount > 0) { Storage.saveCart(cart); this.saveCartValues(cart); minusBtn.nextElementSibling.innerText = tempItem.amount; } else { // 🚨 KRİTİK DÜZELTME: Eksiye basılarak ürün sıfırlandığında da 'li' etiketini güvenle siliyoruz. let cartItemRow = minusBtn.closest("li"); if (cartItemRow) { cartItemRow.remove(); } this.removeItem(id); } } return; } // C) ADET ARTTIRMA (ARTI) BUTONU let plusBtn = event.target.closest(".quantity-plus"); if (plusBtn) { let id = plusBtn.dataset.id; let tempItem = cart.find(item => item.id === id); if (tempItem) { tempItem.amount = tempItem.amount + 1; Storage.saveCart(cart); this.saveCartValues(cart); plusBtn.previousElementSibling.innerText = tempItem.amount; } return; } }); } clearCart() { let cartItems = cart.map(item => item.id); cartItems.forEach(id => this.removeItem(id)); while (cartContent.children.length > 0) { cartContent.removeChild(cartContent.children[0]); } } checkoutCart() { var yazilacak = "" ; var ttprice = 0 ; var tprice = 0 ; var ttprice6 = 0 ; var yazilacak6 = "" ; var ttprice9 = 0 ; var ttprice9k = 0 ; var yazilacak9 = "" ; var yazilacak0 = "" ; var tpricey = 0 ; var ttpricey = 0 ; var ttprice6y = 0 ; var ttprice9y = 0 ; var ttprice9ky = 0 ; const myJSON = JSON.parse(localStorage.getItem("cart_" + aktifDil)); var myObj = myJSON; for ( var baslangic = 0 ; baslangic < myObj.length ; baslangic ++ ) { tprice = myObj[baslangic].amount * myObj[baslangic].price ; tprice = parseFloat(tprice.toFixed(2)); ttprice = ttprice + tprice ; ttprice = parseFloat(ttprice.toFixed(2)); yazilacak0 = ""; ttprice6 = ttprice; ttprice6 = parseFloat(ttprice6.toFixed(2)); ttprice6y = ttprice6.toFixed(2); yazilacak6 = ""; ttprice9 = ttprice6; ttprice9 = parseFloat(ttprice9.toFixed(2)); ttprice9y = ttprice9.toFixed(2); yazilacak9 = ""; tpricey = tprice.toFixed(2); yazilacak += "
[ " + myObj[baslangic].id + " ] " + myObj[baslangic].title + "
" + myObj[baslangic].amount + " كمية x " + " ( " + myObj[baslangic].price + " " + kurlar + " ) = " + tpricey +" "+ kurlar +"
"; } yazilacak += yazilacak0; yazilacak += yazilacak6; yazilacak += yazilacak9; yazilacak += "

المبلغ الإجمالي: " + ttprice9y +" "+ kurlar + "
( لغرض المعلومات فقط! )"; yazilacak += "

السعر تاريخ الصلاحية: 31/07/2026 - 30/08/2026
"; if ( date3 > date4 ){ yazilacak += "الأسعار ليست حالية

مع الأسعار الحالية"; } yazilacak += "
هل يمكنني الحصول على تأكيد لهذا الطلب؟ "; yazilacak += "

الاسم واللقب : " + document.getElementById("basket-name").value; yazilacak += "
رقم الهاتف : " + document.getElementById("basket-phone").value; if ( baslangic > 0 ){ let wsparis = yazilacak.replace(/
/gi, "%0a"); var url = "minify/whatsar.html?" + "https://wa.me/+905352974482?text=" +"FSM Efeler سلة التسوق"+"%0a" +"-------------------------------"+"%0a" +wsparis+"%0a"+"%0a" +"-------------------------------"+"%0a"; let text = document.getElementById("demo").innerHTML = yazilacak + ` `; } else { let text = document.getElementById("demo").innerHTML = ""; } } removeItem(id) { // Canlı sepet dizisinden ürünü filtreleyip siliyoruz cart = cart.filter(item => item.id !== id); // Yeni değerleri hesaplayıp dile özel hafızaya (Storage) kaydediyoruz this.saveCartValues(cart); Storage.saveCart(cart); // Sizin en beğendiğiniz kararlı kilit sökme adımları (Aynen geri getirildi) let button = this.getSingleButton(id); if (button) { button.removeAttribute("disabled"); button.removeAttribute("data-sepette"); button.style.opacity = "1"; button.style.pointerEvents = "auto"; button.style.cursor = "pointer"; button.innerHTML = ``; } } getSingleButton(id) { return document.querySelector(`.btn-add-to-cart[data-id="${id}"]`); } } // UI Sınıfı Bitişi class Storage { static saveProducts(products) { localStorage.setItem("products", JSON.stringify(products)); } static getProduct(id) { let products = JSON.parse(localStorage.getItem("products")); return products.find(product => product.id === id); } // SEPETİ DİLE GÖRE KAYDEDER (Örn: cart_tr veya cart_en) static saveCart(cart) { localStorage.setItem("cart_" + aktifDil, JSON.stringify(cart)); } // SEPETİ DİLE GÖRE ÇEKER (Eğer o dilde sepet yoksa boş dizi döner) static getCart() { return localStorage.getItem("cart_" + aktifDil) ? JSON.parse(localStorage.getItem("cart_" + aktifDil)) : []; } } document.addEventListener("DOMContentLoaded", () => { const ui = new UI(); const products = new Products(); ui.setupAPP(); products.getProducts().then(products => { ui.displayProducts(products); Storage.saveProducts(products); }).then(() => { ui.getBagButtons(); ui.cartLogic(); // ========================================================================== // 🎯 %100 NAFİR HATALARI ÖNLEYEN SLICK SLIDER GLOBAL TIKLAMA MOTORU // ========================================================================== // Slick Slider'ın ürettiği tüm kopya (klon) butonlarda bile sepete eklemenin // eksiksiz çalışmasını garanti altına alan dinamik dinleyici: document.body.addEventListener("click", event => { // Tıklanan elemanın kendisi veya herhangi bir üst katmanı sepet butonu mu? const button = event.target.closest(".btn-add-to-cart"); // Eğer sepet butonuysa ve halihazırda kilitli (sepette) değilse: if (button && !button.hasAttribute("disabled") && button.getAttribute("data-sepette") !== "true") { // Eğer bu buton projenin ui.getBagButtons() tarafından henüz yakalanmamış bir klonsa: let id = button.dataset.id; // Butonu anında mühürle ve dondur button.setAttribute("disabled", "disabled"); button.setAttribute("data-sepette", "true"); button.style.opacity = ".3"; button.style.pointerEvents = "none"; button.innerHTML = ``; // Canlı sepet array'ini hafızadan en güncel haliyle çek cart = Storage.getCart(); // Eğer ürün sepette gerçekten yoksa ekle (Çift ekleme koruması) let zatenVarMi = cart.find(item => item.id === id); if (!zatenVarMi) { let cartItem = { ...Storage.getProduct(id), amount: 1 }; cart = [...cart, cartItem]; Storage.saveCart(cart); ui.saveCartValues(cart); ui.addCartItem(cartItem); } // Sepet offcanvas panelini sağdan pürüzsüzce aç ui.showCart(); } }); // --- EN KARARLI SEPET KAPANIŞ DİNLEYİCİSİ --- const sepetElementi = document.getElementById("offcanvasRight"); if (sepetElementi) { sepetElementi.addEventListener('hidden.bs.offcanvas', function () { // Bootstrap gövde kilitlerini temizle document.body.removeAttribute("style"); document.body.classList.remove("offcanvas-open", "modal-open"); // Slick Slider boyutlarını sarsmadan pürüzsüzce yenile if (typeof jQuery !== 'undefined' && jQuery('.product-image-slick-slider').length > 0) { jQuery('.product-image-slick-slider').slick('setPosition'); } // Dile özel sepet verisini çekip tüm butonları (klonlar dahil) tazeleyerek senkronu mühürlüyoruz const guncelSepet = JSON.parse(localStorage.getItem("cart_" + aktifDil)) || []; const tumSepetButonlari = document.querySelectorAll('.btn-add-to-cart'); tumSepetButonlari.forEach(button => { const buttonId = button.getAttribute('data-id'); const urunSepetteMi = guncelSepet.some(item => String(item.id) === String(buttonId)); if (urunSepetteMi) { button.setAttribute("data-sepette", "true"); button.setAttribute("disabled", "disabled"); button.style.opacity = ".3"; button.style.pointerEvents = "none"; button.innerHTML = ``; } else { button.removeAttribute("data-sepette"); button.removeAttribute("disabled"); button.style.opacity = "1"; button.style.pointerEvents = "auto"; button.style.cursor = "pointer"; button.innerHTML = ``; } }); }); } }); }); function removeElement() { document.getElementById("demo").style.display = "none"; } function changeVisibility() { document.getElementById("demo").style.display = "block"; document.getElementById("demo").style.visibility = "visible"; }