"use strict"; function getPosition (options) { return new Promise(function (resolve, reject) { navigator.geolocation.getCurrentPosition(resolve, reject, options); }); } class Ecocart { constructor(ecocartUrl, updateTitleUrl, json_url) { console.log("ecocart"); this.product_id = "259" this.shop_name = "zapcables.com"; this.ecocartUrl = ecocartUrl; this.updateTitleUrl = updateTitleUrl; this.cssId = "ecocartCss"; this.latitude = null; this.longitude = null; this.ecocart_product_title = "Carbon Neutral Order"; this.ecocart_product = false; this.cart_id = null; //this.beforeSelector = '.btn.btn--secondary.cart__update'; this.beforeSelector = false; this.afterSelector = false; this.fixedSelector = false; this.prependSelector = false; this.appendSelector = false; this.json_url = json_url + this.shop_name; this.json_data = false; this.ecocartCheckbox = '#ecocart-green-shipping-button'; } async getData() { // 1 console.log('ready in getData (ecocart.js)...'); try { console.log("this.json_url is ::",this.json_url) let response = await fetch(this.json_url, { }); this.json_data = await response.json(); } catch (error) { console.error("Error in getData (ecocart.js) :: ",error); } } async getCart() { // 2 try { let response = await fetch("/api/storefront/cart"); this.cart = await response.json(); } catch (errot) { console.error(error); } } parseCart() { // 3 this.total_price = this.cart.cartAmount; this.cart[0].lineItems.digitalItems.forEach((item) => { if(item.name === this.ecocart_product_title) { this.ecocart_product = item; } }); } async getEcocart() { if(this.total_price == 0) { return; } if(this.ecocart_product) { console.log('skip getEcocart'); return; } console.log('load ecocart...') try { let f = new FormData(); f.append('shop_name', this.shop_name); if (this.latitude && this.longitude) { f.append('latitude', this.latitude); f.append('longitude', this.longitude); } if(window.location.hostname == 'www.saffronpawtique.co.uk'){ var dataCurrentCurrency = $('span.money').last().attr('data-currency') // console.log('dataCurrentCurrency ::',dataCurrentCurrency) if(dataCurrentCurrency != undefined && dataCurrentCurrency != ''){ this.cart['currency'] = dataCurrentCurrency } // console.log('this.cart',this.cart) } this.cart_id = this.cart[0].id console.log(this.cart) f.append('cart', JSON.stringify(this.cart)); let response = await fetch(this.ecocartUrl, { method: 'POST', mode: 'cors', cache: 'no-cache', body: f }); this.ecocartResult = await response.json(); console.log(this.ecocartResult); this.calc = this.ecocartResult.calc; this.fee = this.ecocartResult.fee; this.variant_id = this.ecocartResult.variant_id; this.currency_used = this.ecocartResult.currency_used; this.shop_currency = this.ecocartResult.shop_currency; this.shipping_weight = this.ecocartResult.shipping_weight // if(this.variant_id != undefined && this.variant_id != null){ // // if(this.currency_used.toLowerCase() != this.shop_currency.toLowerCase()){ // this.calc = await this.getUpdatedCurrency(this.variant_id) // // let v = new FormData(); // v.append('shop_name', this.shop_name); // v.append('variant_id', this.variant_id); // v.append('updatedAmount', this.calc); // v.append('currency_used', this.currency_used); // v.append('shipping_weight', this.shipping_weight); // let vResponse = await fetch(this.updateTitleUrl, { // method: 'POST', // mode: 'cors', // cache: 'no-cache', // body: v // }); // } // } } catch (error) { console.log(error); } } async getUpdatedCurrency(variant_id){ let data = { quantity: 1, id: variant_id } try { let response = await fetch("/cart/add.js", { method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); let result = await response.json(); // console.log("result ",result.price) let final_price = result.final_price data['quantity'] = "0" data['id'] = variant_id.toString() await fetch("/cart/change.js", { method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); return final_price/100 } catch (error) { console.log(error); } } async updatedVariantTitle(variant_id){ let data = { quantity: 1, id: variant_id } try { let response = await fetch("/cart/add.js", { method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); let result = await response.json(); // console.log("result ",result.price) let final_price = result.final_price data['quantity'] = "0" data['id'] = variant_id.toString() await fetch("/cart/change.js", { method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); return final_price/100 } catch (error) { console.log(error); } } injectEcocart() { // встроить экокарт блок и данные console.log('inject ecocart ...'); console.log(this.ecocart_product); try { /* if (!this.beforeSelector && !this.afterSelector && !this.prependSelector && !this.appendSelector && !this.fixedSelector) { console.log(Shopify.theme.name); } */ if (this.beforeSelector) { this.div = document.createElement('div'); let before_element = document.querySelector(this.beforeSelector); before_element.parentNode.insertBefore(this.div, before_element); } else if (this.afterSelector) { this.div = document.createElement('div'); let after_element = document.querySelector(this.afterSelector); after_element.parentNode.insertBefore(this.div, after_element.nextSibling); } else if (this.prependSelector) { this.div = document.createElement('div'); let prepend_element = document.querySelector(this.prependSelector); prepend_element.prepend(this.div); } else if (this.appendSelector) { this.div = document.createElement('div'); let append_element = document.querySelector(this.appendSelector); append_element.append(this.div); } else if (this.fixedSelector){ // fixed this.div = document.querySelector(this.fixedSelector); } else { this.div = document.createElement('div'); if(window.location.href.includes("checkout")) { let selector = '.checkout-steps'; let element = document.querySelector(selector); element.parentNode.appendChild(this.div, element); } else { let selector = '.checkout-steps'; var filterstrings = ['check out','checkout','input shipping address', 'proceed to checkout']; var regex = new RegExp( filterstrings.join( "|" ), "i"); var buttons = $('*').filter(function(){ return (regex.test($(this).text()) || regex.test($(this).val())) && ($(this).prop('tagName')=='BUTTON' || $(this).prop('tagName')=='A' || $(this).prop('tagName')=='INPUT');}) let element = buttons[buttons.length-1] element.parentNode.insertBefore(this.div, element); } //.cart__policies } if (this.fee == '3') { this.div.innerHTML = this.json_data.shipment; return; } if(this.ecocart_product) { console.log('ecocart_product exists'); this.div.innerHTML = this.json_data.shipment; } else { this.div.innerHTML = this.json_data.loading; } } catch (error) { console.error(error); } } estimate() { var currency_symbols = { "usd":"$", "mxn":"$", "aud":"$", "cad":"$", "jpy":"¥", "eur":"€", "inr":"₹", "gbp":"£", "aed":"Dhs.", "cny":"¥", "rub":"₽", } if (this.fee == '3') { this.div.innerHTML = this.json_data.company; return; } if(this.ecocart_product) { console.log('ecocart_product exists, return'); return; } let re = /##PRICE##/gi; var cur_symbol = "" if(this.currency_used != undefined && this.currency_used != '' && this.currency_used.toLowerCase() != undefined){ cur_symbol = currency_symbols[this.currency_used.toLowerCase()] } // console.log(this.calc) var calc_amount = (cur_symbol != "" && cur_symbol != undefined) ? cur_symbol+""+this.calc : this.calc+" "+this.currency_used // console.log("calc_amount",calc_amount) this.div.innerHTML = this.json_data.estimate.replace(re, calc_amount); // debug this.div.innerHTML = this.div.innerHTML + ''; } injectCss(cssUrl) { if (document.getElementById(this.cssId)) return; cssUrl = cssUrl + this.shop_name; let head = document.getElementsByTagName("head")[0]; let link = document.createElement("link"); link.id = this.cssId; link.rel = "stylesheet"; link.type = "text/css"; link.href = cssUrl; link.media = "all"; head.appendChild(link); } injectFonts() { if(this.shop_name != 'hamama-inc.myshopify.com') { let url = 'https://fonts.googleapis.com/css?family=Montserrat:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i&display=swap'; let head = document.getElementsByTagName("head")[0]; let link = document.createElement("link"); link.id = 'ecocartFont'; link.rel = "stylesheet"; link.type = "text/css"; link.href = url; link.media = "all"; head.appendChild(link); } } addEventCheckbox() { this.checkbox = document.querySelector(this.ecocartCheckbox); if (this.checkbox) { this.checkbox.addEventListener('change', () => {this.clickCheckbox()}); } } async getPosition() { try { if(this.total_price == 0) return; let result = await getPosition(); this.latitude = result.coords.latitude; this.longitude = result.coords.longitude; } catch(error) { console.log(error); } } async clickCheckbox() { if (this.checkbox.checked) { console.log(this.variant_id); let data = { line_items:[{quantity:1,product_id:this.product_id,variant_id:this.variant_id}] } try { var addURL = "/api/storefront/carts/" + this.cart_id + "/items" let response = await fetch(addURL, { method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); let result = await response.json(); this.ecocartVariant = result; location.reload(); // this.div.innerHTML = ""; // ecocartReady(); } catch (error) { console.log(error); } } else { this.cart_id = this.cart[0].id try { var deleteURL = "/api/storefront/carts/" + this.cart_id + "/items/"+ this.ecocart_product.id let response = await fetch(deleteURL, { method: 'DELETE', cache: 'no-cache', credentials: 'same-origin', headers: {'Content-Type': 'application/json'}, }); let result = await response.json(); location.reload(); } catch(error) { console.log(error); } } } } function ecocartTmpl() { var btns = document.getElementsByClassName("show-btn") var par = document.getElementsByClassName('ecocart') var har = document.getElementsByClassName('descr') var bar = document.getElementsByClassName("ecocart-checker") if (btns.length) { btns[0].onclick = function() { par[0].classList.toggle("checked") har[0].classList.toggle("visible"); } } if (bar.length) { bar[0].onclick = function(){ par[0].classList.add("background") par[0].classList.add("background"); } } } async function ecocartReady() { //if (document.location.pathname !== '/cart') return; if(window.location.href.includes("cart") || window.location.href.includes("checkout")) { console.log("ecocartReady()"); let jsonUrl = 'https://s.ecocartapp.com/ecocart.json?shop_name=' let ecocartUrl = "https://s.ecocartapp.com/ecocart"; let cssUrl = "https://s.ecocartapp.com/ecocart.css?shop_name="; let updateTitleUrl = "https://s.ecocartapp.com/update_title"; var ecocart = new Ecocart(ecocartUrl, updateTitleUrl, jsonUrl); var script = document.createElement('script'); script.src = 'https://code.jquery.com/jquery-3.4.1.min.js'; script.type = 'text/javascript'; document.getElementsByTagName('head')[0].appendChild(script); var timeArray = new Array(); var t0 = performance.now(); ecocart.injectCss(cssUrl); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); ecocart.injectFonts(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); await ecocart.getData(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); await ecocart.getCart(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); ecocart.parseCart(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); ecocart.injectEcocart(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); //await ecocart.getPosition(); await ecocart.getEcocart(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); ecocart.estimate(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); ecocart.addEventCheckbox(); var t1 = performance.now(); timeArray.push(t1 - t0); var t0 = performance.now(); window.ecocart = ecocart; ecocartTmpl(); console.log(timeArray) } } //document.addEventListener("DOMContentLoaded", ecocartReady); window.onload = function() { ecocartReady(); };