PageSourceSearch

https://tangentwines.com/wp-content/themes/affinity-custom-webpack/public/js/vin65remotetools.1.2.js?ver=1.10

js tangentwines.com collected 2026-09-26 15:13:28 UTC 15,739 bytes, 346 lines download raw bytes

1// JavaScript Document
2var vin65remote = {
3	loadingGraphic : '<img src="https://assetss3.vin65.com/images/loading.gif">',
4	product : {
5		addToCartForm : function(website) {
6			$("[v65remotejs=addToCartForm]").each(function(index) {
7				var productSKU="", currentForm="";
8				productSKU=$(this).attr('productSKU');
9				currentForm=$(this);
10
11				var individualWine = $(this).attr('individualWine') ? true : false;
12				var wineColor = $(this).attr('wineColor');
13				// if(individualWine == 'true'){
14				// 	$('.wine-hero-price').html('');
15				// 	$('.wine-vineyard-source .spacer').removeClass('inline-block');
16				// }
17				
18				$.ajax({ 
19					url: website + '/index.cfm?method=remote.addToCartForm&productSKU=' + productSKU + '&?callback=?', 
20					timeout: 10000,
21					dataType: 'json', 
22					success: function(response) {
23						if(response.includes('Product not available for sale.')){
24							// currentForm.html('<button class="cta cta-light transitioned force-opacity borderless">'+ response +'</button>');
25							currentForm.html('<button class="site-cta accent-color sold-out">Sold Out<div class="border-wrap"><div class="border top"></div><div class="border bot"></div><div class="corner top"><span></span><span></span></div><div class="corner bot"><span></span><span></span></div></div></button>');
26							$('.product-price').css('display', 'none');
27							$('.wine-list--item--price.product-' + productSKU).html('&mdash;');
28						} else {
29							var data = $(response);
30							// Getting the price.
31							var price = data.find('.v65-widgetProduct-addToCart-price')[0].innerText;
32							$('.product-price').css('display', 'flex');
33
34						  let prices = [];
35
36							if (price) {
37								prices = price.split(' ');
38							}
39
40							// Individual Wine Page:
41							if(individualWine){
42								if (prices && prices.length > 1) {
43									$('.product-price-number').html(`<span class="price" style="text-decoration: line-through; opacity: 0.6;">${prices[0]}</span>&nbsp;<span class="price">${prices[1]}</span>`);
44								} else {
45									$('.product-price-number').html('<span class="symbol">$</span><div class="price">' + price.substring(1, price.length) + '</div>');
46								}
47								// $('.wine-vineyard-source .spacer').addClass('inline-block');
48								// Creating quantity stepper
49								// data.find('.v65-widgetProduct-addToCart-quantity').addClass('wine-hero-counter');
50								data.find('.v65-widgetProduct-addToCart-quantity').prepend('<div class="v65-widgetProduct-addToCart-controls"></div>');
51								data.find('.v65-widgetProduct-addToCart-quantity').append('<div class="v65-widgetProduct-addToCart-controls-right"></div>');
52								data.find('.v65-widgetProduct-addToCart-controls').prepend('<button type="button" class="less-step"></button>');
53								// data.find('.v65-widgetProduct-addToCart-quantity input').removeAttr('style').addClass('wine-hero-count');
54								data.find('.v65-widgetProduct-addToCart-controls').append('<button type="button" class="more-step"></button>');
55								data.find('.v65-widgetProduct-addToCart-controls-right').append('<button type="button" class="more-step"></button>');
56								data.find('.v65-widgetProduct-addToCart-quantity button.less-step').bind('click', function(){
57									var currentValue = parseInt(data.find('.v65-widgetProduct-addToCart-quantity input').val());
58									data.find('.v65-widgetProduct-addToCart-quantity input').val(currentValue > 1 ? (currentValue - 1) : 1);
59								});
60								data.find('.v65-widgetProduct-addToCart-quantity button.more-step').bind('click', function(){
61									var currentValue = parseInt(data.find('.v65-widgetProduct-addToCart-quantity input').val());
62									data.find('.v65-widgetProduct-addToCart-quantity input').val(currentValue + 1);
63								});
64
65								// data.find('button[type=submit]').css('border-bottom', `2px solid ${wineColor}`);
66								// Adding the price to the button.
67								// data.find('button[type=submit]').prepend('<span class="price">' + price + ' / </span>');
68								// Adding button style classes.
69								data.find('button[type=submit]').addClass('site-cta accent-color');
70								// data.find('button[type=submit]').addClass('add-to-cart-btn');
71								data.find('button[type=submit]').append('<div class="border-wrap"><div class="border top"></div><div class="border bot"></div><div class="corner top"><span></span><span></span></div><div class="corner bot"><span></span><span></span></div></div>');
72								// data.find('button[type=submit]').css('border-bottom', `2px solid ${wineColor}`);
73							} else {
74								if (prices && prices.length > 1) {
75									$('.wine-list--item--price.product-' + productSKU).html(`<span style="text-decoration: line-through; opacity: 0.5;">${prices[0]}</span> <span>${prices[1]}</span>`);
76								} else {
77									$('.wine-list--item--price.product-' + productSKU).html(price);
78								}
79								data.find('button[type=submit]').addClass('site-cta accent-color');
80								data.find('button[type=submit]').append('<div class="border-wrap"><div class="border top"></div><div class="border bot"></div><div class="corner top"><span></span><span></span></div><div class="corner bot"><span></span><span></span></div></div>');
81								data.find('.v65-widgetProduct-addToCart-price').replaceWith(`<h5 class=".v65-widgetProduct-addToCart-price">${price}</h5>`);
82								$(`.f-${productSKU}`).attr('data-price', price.substring(1, price.length));
83							}
84							currentForm.html(data);
85						}
86					},
87					error: function (jqXHR, status, errorTrown){
88						$('.wine-list--item--price.product-' + productSKU).html('&mdash;');
89						currentForm.html('<button class="site-cta accent-color sold-out"><div class="border-wrap"><div class="border top"></div><div class="border bot"></div><div class="corner top"><span></span><span></span></div><div class="corner bot"><span></span><span></span></div></div>Sold Out</button>');
90						$('.product-price').css('display', 'none');
91					}
92				});
93			});
94		}
95	},
96	usertools : {
97		loginWidget : function(website,relocateTo) {
98			$.getJSON(website + '/index.cfm?method=remote.loginWidget&relocateTo= ' + relocateTo + '&?callback=?', function(response) {
99				var responseWrapper = $('<div class="wrapper"></div>');
100				var transformedResponse = $(response);
101				responseWrapper.append(transformedResponse);
102				var yourAccountUri = responseWrapper.find('div.v65-widgetLogin-yourAccount a').attr('href')
103				$('#my-account-wd').attr("href", yourAccountUri);
104				// $("[v65remotejs=loginWidget]").html(response);
105			});
106		}
107	},
108	form : {
109		form : function(website,formName) {
110			$.getJSON(website + '/index.cfm?method=remote.form&formName=' + formName + '&?callback=?', function(response) {
111				$("[v65remotejs=form]").html(response);
112			});
113			$(document).ready(function(){
114				$(document).on("submit","[v65remotejs=form] form", function(event){
115					event.preventDefault();
116					vin65remote.form.processSubmitForm(this,website);
117				});
118			});
119		},
120		processSubmitForm: function(form,website) {
121			d = new Date();
122			formLabelsAndValues=$(form).serialize();
123			formDiv=$(form).find("[name=FormDivID]").val();
124			$("#" + formDiv).html(vin65remote.loadingGraphic);
125			$.getJSON(website + '/index.cfm?method=remote.processForm&' + formLabelsAndValues + '&timeStamp=' + d.getTime() + '&?callback=?', function(response) {
126				$("#" + formDiv).hide();
127				$("#" + formDiv).replaceWith(response).hide().slideDown("slow");
128			});
129		}
130	},
131	cart : {
132		init: function(website,dontShowIfZero){
133			var cookieListener = vin65remote.cart._setupCookieCheckListener(website,dontShowIfZero);
134			window.addEventListener("message", cookieListener, false);
135			vin65remote.cart._loadExternalScripts();
136			vin65remote.cart._cookieListenerTimeout(website,dontShowIfZero);
137		},
138		_setupCookieCheckListener: function(website,dontShowIfZero){
139			thirdPartyCookiesSupported = '';
140			return function (event) {
141				if(event.origin == 'https://assetss3.vin65.com'){
142					if (event.data === 'WD:3PCunsupported') {
143						thirdPartyCookiesSupported = false;
144					} else if (event.data === 'WD:3PCsupported') {
145						thirdPartyCookiesSupported = true;
146					}
147					vin65remote.cart.modalCart(website,dontShowIfZero);
148					vin65remote.cart.addToCart(website);
149				}
150			};
151		},
152		_cookieListenerTimeout: function(website,dontShowIfZero){
153			setTimeout(function() {
154				if(thirdPartyCookiesSupported === '') {
155					// Cookie check hasn't been received yet, default to false and init the cart
156					thirdPartyCookiesSupported = false;
157					vin65remote.cart.modalCart(website,dontShowIfZero);
158					vin65remote.cart.addToCart(website);
159				}
160			}, 5000);
161		},
162		_loadExternalScripts: function(){
163			$.ajax({
164				url: "https://assetss3.vin65.com/js/js.cookie.min.js",
165				cache : true,
166				dataType: "script"
167			})
168			.done(function() {
169				$('body').append('<iframe src="https://assetss3.vin65.com/thirdPartyCookieCheck/start.html" class="test" style="display: none"></iframe>');
170			});
171		},
172		modalCart: function(website,dontShowIfZero) {
173			var orderID = vin65remote.cart._getOrderID();
174			var url = website + '/index.cfm?method=remote.modalCart&dontShowIfZero=' + dontShowIfZero;
175			if(thirdPartyCookiesSupported === false){
176				url += '&remoteOrderID=' + orderID + '&thirdPartyCookiesSupported=' + thirdPartyCookiesSupported;
177			}
178			$.getJSON(url + '&?callback=?', function(response) {
179				vin65remote.cart._handleResponse(response);
180			});
181		},
182		_getOrderID: function(){
183			if(Cookies.get('ORDERID')){
184				return Cookies.get('ORDERID');
185			} else if(vin65remote.utilities._getQueryStringValue("remoteOrderID")) {
186				return vin65remote.utilities._getQueryStringValue("remoteOrderID");
187			};
188			return '';
189		},
190		_setOrderID: function(orderID){
191			Cookies.set('ORDERID', orderID, { expires: 7 });
192		},
193		_addOrderIDToLinks: function(orderID) {
194			if(thirdPartyCookiesSupported === false){
195				$('a').each(function() {
196					if( location.hostname !== this.hostname && this.hostname.length ) {
197						$(this).attr('href', function(i, linkURL) {
198							if(linkURL.indexOf('remoteOrderID') === -1){
199								return linkURL + (linkURL.indexOf('?') != -1 ? "&remoteOrderID=" + orderID : "?remoteOrderID=" + orderID);
200							}
201						});
202					}
203				});
204			}
205		},
206		toggleCart: function() {
207			var cartVisible = $(".v65-widgetModalCart-dropdown").is(':visible');
208			if(cartVisible == true) {
209				vin65remote.cart.hideCart();
210			} else {
211				vin65remote.cart.showCart();
212			}
213		},
214		showCart: function()  {
215			$(".v65-widgetModalCart-dropdown").slideDown("slow");
216			$("[v65remotejs=modalCart]").addClass('.v65-widgetModalCart-selected');
217		},
218		hideCart: function() {
219			$(".v65-widgetModalCart-dropdown").slideUp("slow");
220			$("[v65remotejs=modalCart]").removeClass('.v65-widgetModalCart-selected');
221		},
222		addToCart: function(website) {
223			$(document).ready(function(){
224				$(document).on("submit","[v65remotejs=addToCart]", function(event){
225					event.preventDefault();
226					vin65remote.cart.processAddToCart(this,website);
227				});
228			});
229		},
230		processAddToCart: function(form,website) {
231			try {vin65.quickView.closeQuickView();} catch(err) { /*Fail Silently*/}
232			formLabelsAndValues=$(form).serialize();
233			vin65remote.analytics.recordAddToCart(formLabelsAndValues);
234			target=$("body").offset().top;
235			$(".v65-widgetModalCart-dropdown").hide();
236			$('html,body').animate({scrollTop: target},400,function() {
237				//Stuff placed in here will execute twice//
238			});
239			d = new Date();
240			$(".v65-widgetModalCart-dropdown").show().html(vin65remote.loadingGraphic);
241			var action = $(form).context.action.split('?method=')[1];
242			var orderID = vin65remote.cart._getOrderID();
243			var url = website + '/index.cfm?method=' + action + '&modalLayout=1&' + formLabelsAndValues + '&timeStamp=' + d.getTime();
244			if(thirdPartyCookiesSupported === false){
245				url += '&remoteOrderID=' + orderID + '&thirdPartyCookiesSupported=' + thirdPartyCookiesSupported;
246			}
247			$.getJSON(url + '&?callback=?', function(response) {
248				vin65remote.cart._handleResponse(response);
249				$(".v65-widgetModalCart-dropdown").slideDown();
250				$(".v65-widgetModalCart-itemMessage").fadeIn().slideDown().delay(3000);
251				$(".v65-widgetModalCart-itemMessage").slideUp().fadeOut();
252			});
253			return false;
254		},
255		_handleResponse: function(response){
256			if(thirdPartyCookiesSupported === false & vin65remote.utilities._isJSON(response)){
257				var parsedResponse = JSON.parse(response);
258				var transformedResponse = $(parsedResponse.content);
259				// Removing close button
260				transformedResponse.find('.v65-widgetModalCart-closeButton').remove();
261
262				var itemCount = transformedResponse.find('.v65-widgetModalCart-itemCount').html();
263				
264				var modalHeader = $(`<div class="v65-widgetModalCart-header">Your Cart (${itemCount}) <button class="v65-widgetModalCart-closeButton" onClick="javascript:vin65remote.cart.hideCart();" aria-label="Close Cart"></button></div>`);
265
266				var modalCartWrapper = $('<div v65remotejs="modalCart"></div>');
267				modalCartWrapper.append(transformedResponse);
268
269				
270				modalCartWrapper.find('.v65-widgetModalCart-dropdown').prepend(modalHeader);
271
272				$("[v65remotejs=modalCart]").replaceWith(modalCartWrapper).hide();
273				
274				vin65remote.cart._setOrderID(parsedResponse.orderID);
275				vin65remote.cart._addOrderIDToLinks(parsedResponse.orderID);
276			}else{
277				// console.log(response);
278				var transformedResponse = $(response);
279
280				// Removing close button
281				transformedResponse.find('.v65-widgetModalCart-closeButton').remove();
282
283				var itemCount = transformedResponse.find('.v65-widgetModalCart-itemCount').html();
284				
285				var modalHeader = $(`<div class="v65-widgetModalCart-header">Your Cart (${itemCount}) <button class="v65-widgetModalCart-closeButton" onClick="javascript:vin65remote.cart.hideCart();" aria-label="Close Cart"></button></div>`);
286				
287				var modalCartWrapper = $('<div v65remotejs="modalCart"></div>');
288				modalCartWrapper.append(transformedResponse);
289
290				modalCartWrapper.find('.v65-widgetModalCart-dropdown').prepend(modalHeader);
291				
292				$("[v65remotejs=modalCart]").replaceWith(modalCartWrapper).hide();
293			}
294		}
295	},
296	analytics : {
297		recordAddToCart: function(formLabelsAndValues){
298			try{
299				if(hasGTM){
300					var eventCallback = function() {};
301					$.getJSON('/index.cfm?method=cart.recordAddToCart' + '&timeStamp=' + d.getTime(),formLabelsAndValues, function(response) {
302						if(typeof response.itemDetails !== "undefined" && typeof response.itemDetails.id !== "undefined"){
303							vin65remote.analytics.updateForCart(response, eventCallback);
304						}
305					});
306				}
307			} catch(err) {
308				console.log(err);
309			}
310		},
311		updateForCart: function(response, eventCallback){
312			if(typeof(dataLayer) === 'undefined') return;
313
314			var analyticsEvent = (response.action === 'add') ? 'addToCart' : 'removeFromCart';
315
316			var payload = { 'event': analyticsEvent, 'ecommerce': {}, 'eventCallback': eventCallback };
317
318			payload.ecommerce['currencyCode'] = request.currency;
319			payload.ecommerce[response.action] = {
320				'products': [{
321					'name': response.itemDetails.name,
322					'id': response.itemDetails.id,
323					'price': response.itemDetails.price,
324					'brand': response.itemDetails.brand,
325					'category': response.itemDetails.category,
326					'variant': response.itemDetails.variant,
327					'quantity': response.itemDetails.quantity
328				}]
329			};
330			dataLayer.push(payload);
331		}
332	},
333	utilities : {
334		_isJSON: function(string) {
335			try {
336				JSON.parse(string);
337			} catch (e) {
338				return false;
339			}
340			return true;
341		},
342		_getQueryStringValue: function(key) {
343			return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
344		}
345	}
346};

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.