// === GLOBAL VAR var counterShop = 10, setIntShop; var counterManufacturing = 900, setIntManufacturing, $counterManufacturing; var startCounterManufacturing = 1744322151; var elapsedTime; var currentCounterManufacturing = Date.now(); // === DOCUMENT READY (= DOM READY) $(document).ready(function() { // === PAGE TITLE & CART === // ========================= $(".pageTitle").attr("pageTitle", " | Order"); cartRedraw(); refreshPromo(); $(".orderSummary .inputPromo").on("input", typePromo); $(".addPromo").on("click", addPromo); $("input").on("input", resetEvaluation); $(".orderSummary input.address[type='text']").on("input", checkPlacement); $(".placement .buy").on("click", proceedPlacement); $counterShop = $(".counterShop").length >0; if ($counterShop) { setIntShop = setInterval(updateCounterShop, 1000); } $counterManufacturing = $(".counterManufacturing").length >0; if ($counterManufacturing) { setIntManufacturing = setInterval(updateCounterManufacturing, 1000); } }); // === COUNTER === // =============== function setManufacturingCounter(pToBeDeffered) { if ((typeof pToBeDeffered === "boolean") && (pToBeDeffered)) { var deferredObj = $.Deferred(); } var params = startCounterManufacturing +" "; params = params.trim(); $.ajax({ type: "POST", url: "_checkout.php", data: "p=" + B64.encode("setManufacturingTime/§/"+ params +"/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Manufacturing queue", "Server did not reply correctly.", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } if (obj.error != 0) { notifyMsg("danger", "Manufacturing queue ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(obj); } else { return false; } } else { if (deferredObj) { deferredObj.resolve(true); } else { return true; } } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } }); if (deferredObj) { return deferredObj.promise(); } } function updateCounterShop() { counterShop--; var text = "(automatic in "+ counterShop +" second"+ ( (counterShop > 1)? "s":"" ) +")"; $(".counterShop small").html(text); if (counterShop <= 0) { clearInterval(setIntShop); $(".counterShop")[0].click(); } } function updateCounterManufacturing() { elapsedTime = Math.floor((Date.now() - startCounterManufacturing) / 1000); var currentCounter = counterManufacturing - elapsedTime; var mn = Math.floor(currentCounter / 60); var ss = currentCounter % 60; if (mn <= 10) { $(".tooltip-content").not(".warning").addClass("warning"); } else { $(".tooltip-content").removeClass("warning"); } if (mn < 10) mn = "0" + mn; if (ss < 10) ss = "0" + ss; $(".counterManufacturing").html(mn +":"+ ss); if (currentCounter <= 0) { clearInterval(setIntManufacturing); $(".counterManufacturing").html("--:--"); $(".tooltip-content .text").html("Position in queue is lost. We calculate your new position."); setIntManufacturing = setInterval(renewCounterManufacturing, 10000); } } function renewCounterManufacturing() { clearInterval(setIntManufacturing); $(".tooltip-content").removeClass("warning"); $(".tooltip-content").removeClass("warning"); $(".counterManufacturing").html("--:--"); $(".tooltip-content .text").html("Remaining time your queue position is locked before we recalculate it."); startCounterManufacturing = Date.now(); setIntManufacturing = setInterval(updateCounterManufacturing, 1000); } // === DISCOUNT === // ================ function typePromo(event) { var $this = $(this); var $btn = $this.closest(".input-group").find(".addPromo"); $btn.removeClass("btn-danger") if ($this.val().length > 0) { $btn.addClass("btn-success").removeClass("btn-outline-secondary"); $btn.prop("disabled", false); } else { $btn.addClass("btn-outline-secondary").removeClass("btn-success"); $btn.prop("disabled", true); } } function promoRemove(event) { var $this = $(this); var $promo = $(this).closest(".promo"); swal({ title: "Are you sure?", text: "Click YES if you want to remove this promotion code from your cart.", type: "warning", showCancelButton: true, confirmButtonClass: "btn-danger", confirmButtonText: "Yes, delete it", cancelButtonClass: "btn-success", cancelButtonText: "No, keep it", closeOnConfirm: true, closeOnCancel: true, closeOnClickOutside: false, closeOnEsc: false }, function(isConfirm) { if (isConfirm) { // Delete $.ajax({ type: "POST", url: "_checkout.php", data: "p=" + B64.encode("removePromo/§/"+ $promo.attr("code") +"/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Discount", "Server did not reply correctly.", "bi bi-journal-x"); return false; } if (obj.error != 0) { notifyMsg("danger", "Discount ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); } else { refreshPromo(false); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); } }); } }); } function refreshPromo(pNotify) { pNotify = (typeof pNotify !== 'undefined')? pNotify : true; $.ajax({ type: "POST", url: "_checkout.php", data: "p=" + B64.encode("getPromo/§/-/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Discount", "Server did not reply correctly.", "bi bi-journal-x"); return false; } var cartProducts, htmlData = ""; if (obj.error < 0) { notifyMsg("danger", "Discount ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); } else { var html = ""; for (var promo in obj.promos) { var lPromo = obj.promos[promo]; var lUnit = ""; switch (lPromo.unit) { case "e" : lUnit = ' €'; break; case "p" : lUnit = ' %'; break; } html += '
'; html += '
'; html += '

'+ lPromo.code +'

'; html += '

- '+ lPromo.value +' '+ lUnit; html += '

'; html += '
'; html += '
'+ lPromo.text +'
'; html += '
'; } var discount = 0; if (obj.discount) { discount = obj.discount.e + obj.discount.p; } discount = "- "+ discount.toFixed(2).toString().replace(/\B(?0)) { $(".orderSummary .promoCodes").show(); $(".orderSummary .discountTotal").show().css("display", "flex"); } else { $(".orderSummary .promoCodes").hide(); $(".orderSummary .discountTotal").hide(); } var lTotal, lDiscount; if (obj.total) { if (obj.total < 0) { lTotal = "0.00"; lDiscount = obj.subtotal.toFixed(2).toString().replace(/\B(?"+ lDiscount +" €"+ ((obj.promos)? " with applied discount code"+ ( (obj.promos.length > 1)? "s":"") +"." : "."), "bi bi-journal-check"); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); } }); checkPlacement(); } function addPromo(event) { var $this = $(this); var $input = $this.closest(".input-group").find(".inputPromo"); var code = $input.val(); $input.removeClass("is-invalid"); $(".input-group.promoToAdd").removeClass("is-invalid"); $.ajax({ type: "POST", url: "_checkout.php", data: "p=" + B64.encode("checkPromo/§/"+ code +"/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Discount", "Server did not reply correctly.", "bi bi-journal-x"); return false; } var cartProducts, htmlData = ""; if (obj.error < 0) { notifyMsg("danger", "Discount ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); } else if (obj.error >0) { switch (obj.error) { case 3 : notifyMsg("danger", "Discount", "Discount can't be applied to an empty cart.", "bi bi-journal-x"); break; case 4 : notifyMsg("danger", "Discount", "Discount code ' "+ code +" ' is not available.", "bi bi-journal-x"); break; case 5 : notifyMsg("danger", "Discount", "Discount code ' "+ code +" ' is already applied.", "bi bi-journal-x"); break; default : notifyMsg("danger", "Discount ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); } $input.addClass("is-invalid"); $(".input-group.promoToAdd").addClass("is-invalid"); $(".addPromo").addClass("btn-danger").removeClass("btn-succes btn-outline-secondary"); } else { refreshPromo(); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); } }); } // === TO CHECKOUT #2 === // ====================== function checkPlacement() { var productQuantity = $(".orderSummary [productQuantity]").attr("productQuantity"); productQuantity = (isNaN(Number(productQuantity)))? 0 : Number(productQuantity); var $shipping = $(".orderSummary .shippingAddress"); var name = $shipping.find(".inputName").val().trim(); var address1 = $shipping.find(".inputAddress1").val().trim(); var city = $shipping.find(".inputCity").val().trim(); var postalCode = $shipping.find(".inputPostalCode").val().trim(); var mail = $shipping.find(".inputMail").val().trim(); var check = (productQuantity >0) && (name.length >0) && (address1.length > 0) && (city.length > 0) && (postalCode.length > 0) && (validateEmail(mail)); if (check) { checkAddress(true).done(function (obj) { $shipping.find(".inputState").val(obj.state); $shipping.find(".inputCountry").val(obj.country); $shipping.find(".inputCountryCode").val(obj.country_code); $(".btn.buy").addClass("btn-primary ready").removeClass("btn-info notAllowed"); }).fail(function () { console.log("Executed after checkAddress fail"); $(".btn.buy").addClass("btn-info notAllowed").removeClass("btn-primary ready"); }); } else { $(".btn.buy").addClass("btn-info notAllowed").removeClass("btn-primary ready"); } } function proceedPlacement(event) { var $this = $(this); if ($this.hasClass("notAllowed")) { evaluateAddressInfo([ "name", "company", "address1", "address2", "city", "state", "postalcode", "country", "mail" ]); notifyMsg("danger", "Order step #2 not allowed yet", "Please verify all mandatory information are defined before proceeding.", "bi bi-journal-x"); event.preventDefault(); event.stopPropagation(); event.stopImmediatePropagation(); return false; } else { setAddress(true).done(function () { setManufacturingCounter(true).done(function () { $(".toStep2")[0].click(); }).fail(function () { $(".toStep2")[0].click(); }); }).fail(function () { // console.log("Executed after setAdress fail"); }); } } // === ADDRESS === // =============== function resetEvaluation(param) { var $this = $(this); $this.removeClass("is-invalid is-valid"); $this.closest(".input-group").removeClass("is-invalid is-valid"); } function evaluateAddressInfo(params) { params = (typeof params === 'undefined')? [ ] : params; var $shipping = $(".orderSummary"); // .shippingAddress $shipping.find(".name").removeClass("is-invalid is-valid"); $shipping.find(".company").removeClass("is-invalid is-valid"); $shipping.find(".address1").removeClass("is-invalid is-valid"); $shipping.find(".address2").removeClass("is-invalid is-valid"); $shipping.find(".city").removeClass("is-invalid is-valid"); $shipping.find(".stateRegion").removeClass("is-invalid is-valid"); $shipping.find(".postalCode").removeClass("is-invalid is-valid"); $shipping.find(".country").removeClass("is-invalid is-valid"); $shipping.find(".mail").removeClass("is-invalid is-valid"); $shipping.find(".phone").removeClass("is-invalid is-valid"); params.forEach(checkAddressItem); } function checkAddressItem(value, index) { var $shipping = $(".orderSummary .shippingAddress"); var name = $shipping.find(".inputName").val().trim(); var company = $shipping.find(".inputCompany").val().trim(); var address1 = $shipping.find(".inputAddress1").val().trim(); var address2 = $shipping.find(".inputAddress2").val().trim(); var city = $shipping.find(".inputCity").val().trim(); var state = $shipping.find(".inputState").val().trim(); var postalCode = $shipping.find(".inputPostalCode").val().trim(); var country = $shipping.find(".inputCountry").val().trim(); var phone = $shipping.find(".inputPhone").val().trim(); var mail = $shipping.find(".inputMail").val().trim(); switch (value) { case "name" : if (name.length <= 0) { $shipping.find(".name").addClass("is-invalid").removeClass("is-valid"); } else { $shipping.find(".name").addClass("is-valid").removeClass("is-invalid"); } break; case "company" : if (company.length > 0) { $shipping.find(".company").addClass("is-valid"); } else { $shipping.find(".company").val("").removeClass("is-invalid is-valid"); } break; case "address1" : if (address1.length <= 0) { $shipping.find(".address1").addClass("is-invalid").removeClass("is-valid"); } else { $shipping.find(".address1").addClass("is-valid").removeClass("is-invalid"); } break; case "address2" : if (address2.length > 0) { $shipping.find(".address2").addClass("is-valid"); } else { $shipping.find(".address2").val("").removeClass("is-invalid is-valid"); } break; case "city" : if (city.length <= 0) { $shipping.find(".city").addClass("is-invalid").removeClass("is-valid"); } else { $shipping.find(".city").addClass("is-valid").removeClass("is-invalid"); } break; case "state" : if (state.length > 0) { $shipping.find(".state").addClass("is-valid"); } else { $shipping.find(".state").val("").removeClass("is-invalid is-valid"); } break; case "postalcode" : if (postalCode.length <= 0) { $shipping.find(".postalCode").addClass("is-invalid").removeClass("is-valid"); } else { $shipping.find(".postalCode").addClass("is-valid").removeClass("is-invalid"); } break; case "country" : if (country.length > 0) { $shipping.find(".country").addClass("is-valid"); } else { $shipping.find(".country").val("").removeClass("is-invalid is-valid"); } break; case "mail" : if (!validateEmail(mail)) { $shipping.find(".mail").addClass("is-invalid").removeClass("is-valid"); } else { $shipping.find(".mail").addClass("is-valid").removeClass("is-invalid"); } break; case "phone" : if (country.length > 0) { $shipping.find(".phone").addClass("is-valid"); } else { $shipping.find(".phone").val("").removeClass("is-invalid is-valid"); } break; } } function checkAddress(pToBeDeffered) { if ((typeof pToBeDeffered === "boolean") && (pToBeDeffered)) { var deferredObj = $.Deferred(); } var $shipping = $(".orderSummary .shippingAddress"); var name = $shipping.find(".inputName").val().trim(); var company = $shipping.find(".inputCompany").val().trim(); var address1 = $shipping.find(".inputAddress1").val().trim(); var address2 = $shipping.find(".inputAddress2").val().trim(); var city = $shipping.find(".inputCity").val().trim(); var state = $shipping.find(".inputState").val().trim(); var postalCode = $shipping.find(".inputPostalCode").val().trim(); var country = $shipping.find(".inputCountry").val().trim(); var fullAddress = { "name" : name, "company" : company, "address1" : address1, "address2" : address2, "city" : city, "state" : state, "postal_code" : postalCode, "country" : country }; $.ajax({ type: "POST", url: "_shipping.php", data: "p=" + B64.encode("checkAddress/§/"+ JSON.stringify(fullAddress) +"/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Delivery address", "Server did not reply correctly.", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } if (obj.error != 0) { notifyMsg("danger", "Delivery address ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } else { if (deferredObj) { deferredObj.resolve(obj.address); } else { return obj.address; } } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } }); if (deferredObj) { return deferredObj.promise(); } } function setAddress(pToBeDeffered) { if ((typeof pToBeDeffered === "boolean") && (pToBeDeffered)) { var deferredObj = $.Deferred(); } var $shipping = $(".orderSummary .shippingAddress"); var name = $shipping.find(".inputName").val().trim(); var company = $shipping.find(".inputCompany").val().trim(); var address1 = $shipping.find(".inputAddress1").val().trim(); var address2 = $shipping.find(".inputAddress2").val().trim(); var city = $shipping.find(".inputCity").val().trim(); var state = $shipping.find(".inputState").val().trim(); var postalCode = $shipping.find(".inputPostalCode").val().trim(); var country = $shipping.find(".inputCountry").val().trim(); var countryCode = $shipping.find(".inputCountryCode").val().trim(); var phone = $shipping.find(".inputPhone").val().trim(); var mail = $shipping.find(".inputMail").val().trim(); var fullAddress = { "name" : name, "company" : company, "address1" : address1, "address2" : address2, "city" : city, "state" : state, "postal_code" : postalCode, "country" : country, "country_code": countryCode, "mail" : mail, "phone" : phone }; $.ajax({ type: "POST", url: "_shipping.php", data: "p=" + B64.encode("setAddress/§/"+ JSON.stringify(fullAddress) +"/§/"+ Math.floor(Date.now() / 1000)), cache: false, success: function(data) { try { var obj = JSON.parse(data); } catch(err) { notifyMsg("danger", "Delivery address", "Server did not reply correctly.", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } if (obj.error != 0) { notifyMsg("danger", "Delivery address ("+ obj.error +")", ""+ obj.shMsg +"
"+ obj.lngMsg +"", "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } else { if (deferredObj) { deferredObj.resolve(true); } else { return true; } } }, error: function(XMLHttpRequest, textStatus, errorThrown) { notifyMsg("danger", "Internet (AJAX : "+ XMLHttpRequest.status +")", errorThrown, "bi bi-journal-x"); if (deferredObj) { deferredObj.reject(false); } else { return false; } } }); if (deferredObj) { return deferredObj.promise(); } }