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('—'); 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> <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('—'); 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.