1document.addEventListener("DOMContentLoaded", function () { 2 const cartItems = document.querySelector("#cart-items"); 3 const cartTotalElement = document.querySelector("#cart-total"); 4 const cartCountElement = document.querySelector(".cart-count"); 5 const inputEmailCustomer = document.getElementById("email-customer"); 6 const emailDescription = document.querySelector(".email-description"); 7 const emailModal = document.querySelector(".email-modal"); 8 const modalCloseButton = emailModal.querySelector(".btn-secondary-md"); 9 let cartItemsData = []; 10 11 // Add event listener to close the modal when the button is clicked 12 if (modalCloseButton) { 13 modalCloseButton.addEventListener("click", function() { 14 emailModal.style.display = "none"; 15 }); 16 } 17 18 /** 19 * The above functions show and hide a loader using Lottie animation in JavaScript. 20 */ 21 // Lottie loader 22 function showLoader() { 23 var loaderContainer = document.getElementById("checkout-loader"); 24 loaderContainer.style.display = "block"; // ÐоказаÑи loader 25 26 var loader = lottie.loadAnimation({ 27 container: document.getElementById("lottie-loader-cart"), // конÑÐµÐ¹Ð½ÐµÑ Ð´Ð»Ñ loader 28 renderer: 'svg', 29 loop: true, 30 autoplay: true, 31 path: '/wp-content/themes/coreicon/assets/js/lota.json' // ÑлÑÑ Ð´Ð¾ ваÑого Lottie JSON ÑÐ°Ð¹Ð»Ñ 32 }); 33 } 34 35 function hideLoader() { 36 var loaderContainer = document.getElementById("checkout-loader"); 37 loaderContainer.style.display = "none"; // ÐÑÐ¸Ñ Ð¾Ð²Ð°Ñи loader 38 } 39 40 // ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð»ÑÑилÑника пÑÑÐ»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÑÑÑ ÑоваÑÑв 41 function updateCartItemCount() { 42 const totalCount = cartItemsData.reduce( 43 (total, item) => total + item.quantity, 44 0 45 ); 46 cartCountElement.textContent = totalCount ? totalCount : "0"; 47 } 48 49 // ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ "Add to Cart" пÑÑÐ»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑоваÑÑ Ð· коÑика 50 function updateAddToCartButtons() { 51 const addedProductIds = new Set( 52 cartItemsData.map((item) => item.productId) 53 ); 54 const addToCartButtons = document.querySelectorAll(".add-to-cart"); 55 addToCartButtons.forEach((button) => { 56 const productId = parseInt(button.dataset.id); 57 if (addedProductIds.has(productId)) { 58 button.textContent = "Added in Cart"; 59 const icon = document.createElement("img"); 60 icon.src = 61 "/wp-content/themes/coreicon/assets/img/svg/check circle.svg"; 62 icon.alt = "Checkmark Icon"; 63 if (!button.querySelector("img")) { 64 button.prepend(icon); 65 } 66 } else { 67 button.textContent = "Add to Cart"; 68 const icon = button.querySelector("img"); 69 if (icon) { 70 icon.remove(); 71 } 72 } 73 }); 74 } 75 76 // ФÑнкÑÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑоваÑÑ Ð· коÑика 77 function removeCartItem(index) { 78 cartItemsData.splice(index, 1); 79 localStorage.setItem("cartItems", JSON.stringify(cartItemsData)); 80 updateCartDisplay(); 81 updateCartItemCount(); 82 updateAddToCartButtons(); 83 } 84 85 function updateCartDisplay() { 86 if (cartItems !== null) { 87 cartItems.innerHTML = ""; 88 } 89 let total = 0; 90 let totalCount = 0; 91 92 if (cartItemsData.length > 0) { 93 cartItemsData.forEach(function (item, index) { 94 const row = document.createElement("tr"); 95 row.classList.add("cart-form-item"); 96 row.innerHTML = ` 97 <td class="product-remove"> 98 <span class="remove-icon" data-index="${index}"> 99 à 100 </span> 101 </td> 102 <td class="product-cover"> 103 <a href="${item.productLink}" target="_parent"> 104 <div class="card-stack-xs br-6" alt="${ 105 item.productName 106 } cover pack" loading="lazy"> 107 <img class="card-cover-xs" src="${item.productImage}" alt="${ 108 item.productName 109 } cover pack" loading="lazy" type="image/webp"> 110 </div> 111 </a> 112 </td> 113 <td class="product-name"> 114 <a href="${item.productLink}" target="_parent"> 115 <div class="2in1"> 116 <p class="body-text_reg-l" style="font-weight:500">${
117 item.productName 118 }</p> 119 <p class="body-text_reg-m mt-2" style="color:#566176; max-width:256px">${ 120 item.productDescription 121 }</p> 122 </div> 123 </a> 124 </td> 125 <td class="product-price"><p class="body-text_reg-l">$${ 126 item.productPrice 127 }</p></td> 128 <td class="product-quantity"><p class="body-text_reg-l">${ 129 item.quantity 130 }</p></td> 131 <td class="product-subtotal"><p class="body-text_reg-l">$${ 132 item.productPrice * item.quantity 133 }</p></td> 134 `; 135 136 if (cartItems !== null) { 137 cartItems.appendChild(row); 138 } 139 140 total += item.productPrice * item.quantity; 141 totalCount += item.quantity; 142 }); 143 144 const totalRow = document.createElement("tr"); 145 totalRow.classList.add("order-total"); 146 totalRow.innerHTML = ` 147 <th><h4>Total:</h4></th> 148 <td id="cart-total"><h4>$${total.toFixed(2)}</h4></td> 149 `; 150 151 const actionsRow = document.createElement("tr"); 152 actionsRow.innerHTML = ` 153 <td id="actions" colspan="6"> 154 <button class="clear-cart btn-primary-md br-12" type="submit" data-update-total> 155 Clear all 156 </button> 157 <button class="cart-checkout btn-primary-md br-12" type="submit" data-update-total> 158 Checkout 159 </button> 160 </td> 161 `; 162 163 if (cartItems !== null) { 164 cartItems.appendChild(totalRow); 165 cartItems.appendChild(actionsRow); 166 } 167 168 // ÐÑÑимаÑи загалÑÐ½Ñ ÑÑÐ¼Ñ Ð· елеменÑÑ Ð· ÑденÑиÑÑкаÑоÑом 'cart-total' 169 const totalElement = document.getElementById("cart-total"); 170 let amount; 171 if (totalElement !== null) { 172 amount = parseFloat(totalElement.innerText.replace("$", "")); 173 } 174 175 // ÐикоÑиÑÑовÑйÑе знаÑÐµÐ½Ð½Ñ 'amount' Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑÑÐ¾Ñ Ð¾Ð±Ñобки 176 console.log("ÐагалÑна ÑÑма:", amount); 177 178 // ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð»ÑÑилÑника пÑÑÐ»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñика 179 updateCartItemCount(); 180 } else { 181 const emptyRow = document.createElement("tr"); 182 emptyRow.innerHTML = ` 183 <td class="empty-cart" style="width:100%; place-content:center; align-content:center; align-self:center; text-align:center"><p class="subtitle mt-24 mb-4">It seems that your cart is empty ð¤·ââï¸</p></td> 184 `; 185 if (cartItems !== null) { 186 cartItems.appendChild(emptyRow); 187 } 188 189 // Hide inputEmailCustomer and emailDescription when the cart is empty 190 inputEmailCustomer.style.display = "none"; 191 emailDescription.style.display = "none"; 192 } 193 194 if (cartTotalElement !== null) { 195 cartTotalElement.textContent = "$" + total.toFixed(2); 196 } 197 if (cartCountElement !== null) { 198 cartCountElement.textContent = totalCount ? totalCount : "0"; 199 } 200 201 // Show inputEmailCustomer and emailDescription when the cart has items 202 if (cartItemsData.length > 0) { 203 inputEmailCustomer.style.display = "block"; 204 emailDescription.style.display = "block"; 205 } 206 } 207 208 function addToCart(item) { 209 cartItemsData.push(item); 210 localStorage.setItem("cartItems", JSON.stringify(cartItemsData)); 211 updateCartDisplay(); 212 } 213 214 // ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ñика з localStorage пÑи заванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки 215 const savedCartItems = localStorage.getItem("cartItems"); 216 cartItemsData = savedCartItems ? JSON.parse(savedCartItems) : []; 217 218 updateCartDisplay(); 219 updateCartItemCount(); 220 updateAddToCartButtons(); 221 222 // ÐодайÑе подÑÑ click Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ знаÑка Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ 223 if (cartItems !== null) { 224 cartItems.addEventListener("click", function (event) { 225 if (event.target.classList.contains("remove-icon")) { 226 const removeButton = event.target; 227 const index = removeButton.dataset.index; 228 229 removeCartItem(index); 230 } 231 }); 232 } 233 234 function clearCart() { 235 localStorage.removeItem("cartItems"); 236 cartItemsData.length = 0; 237 updateCartDisplay(); 238 239 // ÐновиÑи загалÑÐ½Ñ Ð²Ð°ÑÑÑÑÑÑ Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ 240 cartTotalElement.textContent = "$0.00"; 241 242 // ÐновиÑи кÑлÑкÑÑÑÑ ÑоваÑÑв 243 cartCountElement.textContent = "0"; 244 245 // ÐновиÑи кнопки "Clear all" Ñ "Checkout" 246 updateCartButtons(); 247 248 // ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð»ÑÑилÑника пÑÑÐ»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÑÑÑ ÑоваÑÑв 249 updateCartItemCount(); 250 } 251 252 // Ðиклик ÑÑнкÑÑÑ Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº "Clear all" Ñ "Checkout" пÑÑÐ»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки 253 updateCartButtons(); 254 255 // Ðиклик ÑÑнкÑÑÑ Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº "Add to Cart" пÑÑÐ»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки коÑика 256 updateAddToCartButtons(); 257 258 function updateCartButtons() { 259 const clearCartButtons = document.querySelectorAll(".clear-cart"); 260 clearCartButtons.forEach(function (button) { 261 button.removeEventListener("click", clearCart); 262 button.addEventListener("click", clearCart); 263 }); 264 265 const checkoutButtons = document.querySelectorAll(".cart-checkout"); 266 checkoutButtons.forEach(function (button) { 267 button.removeEventListener("click", handleCheckout); 268 button.addEventListener("click", handleCheckout); 269 }); 270 } 271 272 // Ðнопка "Clear all" 273 const clearCartButtons = document.querySelectorAll(".clear-cart"); 274 clearCartButtons.forEach(function (button) { 275 button.addEventListener("click", function (event) { 276 event.preventDefault(); 277 clearCart(); 278 }); 279 }); 280 281 // Ðнопка "Checkout" 282 var checkoutButtons = document.querySelectorAll(".cart-checkout"); 283 checkoutButtons.forEach(function (button) { 284 button.addEventListener("click", handleCheckout); 285 }); 286 287 function getCheckout(data) { 288 return fetch(coreiconIncart.checkoutEndpoint, { 289 method: "POST", 290 headers: { 291 "Content-Type": "application/json", 292 "X-WP-Nonce": coreiconIncart.nonce, 293 }, 294 body: JSON.stringify(data), 295 }) 296 .then((response) => response.json()) 297 .catch((error) => { 298 console.error("Ðомилка пÑи оÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ checkout url:", error); 299 }); 300 } 301 302 //ФÑнкÑÑÑ, Ñка пеÑевÑÑÑÑ, Ñи введено елекÑÑÐ¾Ð½Ð½Ñ Ð°Ð´ÑеÑÑ ÐºÐ¾ÑиÑÑÑваÑа 303 function validateEmail(email) { 304 const re = /\S+@\S+\.\S+/; 305 return re.test(email); 306 } 307 308 // Rederict to Payment page 309 function handleCheckout(e) { 310 e.preventDefault(); 311 312 // ÐÑдобÑазиÑи loader 313 showLoader(); 314 315 var emailInput = document.getElementById("email"); 316 var userEmail = emailInput.value.trim(); 317 318 if (!validateEmail(userEmail)) { 319 hideLoader(); // ÐÑÐ¸Ñ Ð¾Ð²Ð°Ñи loader Ñ ÑÐ°Ð·Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸
320 // Show the modal if email is not valid 321 emailModal.style.display = 'block'; 322 return; 323 } 324 325 // ÐÑÑимаÑи загалÑÐ½Ñ ÑÑÐ¼Ñ Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ 326 var totalElement = document.getElementById("cart-total"); 327 var totalAmount = parseFloat(totalElement.innerText.replace("$", "")); 328 329 var cartItems = JSON.parse(localStorage.getItem("cartItems")); 330 var products = cartItems.map(function (item) { 331 return { 332 name: item.productName, 333 description: item.productDescription, 334 price: item.productPrice, 335 quantity: item.quantity, 336 icon: item.productImage, 337 }; 338 }); 339 340 var requestData = { 341 currency: "USD", 342 amount: totalAmount, 343 products: products, 344 email: userEmail, 345 }; 346 347 getCheckout(requestData).then(function (response) { 348 if (response.url) { 349 setTimeout(function () { 350 window.location.href = response.url; // ÐеÑенапÑавиÑи на ÑÑоÑÑÐ½ÐºÑ Ð¾Ð¿Ð»Ð°Ñи 351 clearCart(); // ÐÑиÑÐµÐ½Ð½Ñ ÐºÐ¾Ñика 352 }, 2000); // ÐаÑÑимка 2 ÑекÑнди 353 } else { 354 hideLoader(); // ÐÑÐ¸Ñ Ð¾Ð²Ð°Ñи loader Ñ ÑÐ°Ð·Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ 355 } 356 }).catch(function () { 357 hideLoader(); // ÐÑÐ¸Ñ Ð¾Ð²Ð°Ñи loader Ñ ÑÐ°Ð·Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ 358 }); 359 } 360 361 const checkoutButton = document.querySelector('.cart-checkout'); 362 const emailInput = document.querySelector('#email'); 363 364 checkoutButton.addEventListener('click', handleCheckout); 365 366 // Function to hide inputEmailCustomer if it is empty 367 function checkEmailCustomerInput() { 368 if (inputEmailCustomer.value.trim() === "") { 369 inputEmailCustomer.style.display = "none"; 370 } else { 371 inputEmailCustomer.style.display = "block"; 372 } 373 } 374 375 // Add event listener to inputEmailCustomer to check its value on input 376 inputEmailCustomer.addEventListener("input", checkEmailCustomerInput); 377 378 // Initial check to hide inputEmailCustomer if it is empty on page load 379 checkEmailCustomerInput(); 380 381});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.