1(function ($) { 2 window.adobeDataLayer = window.adobeDataLayer || []; 3 window.utag_data = window.utag_data || []; 4 5 // helpers 6 function pushLinkClickEvent(params) { 7 adobeDataLayer.push({ 8 event: 'linkClick', 9 event_name: 'linkClick', 10 linkComponent : params.component || '', 11 linkId : params.id || '', 12 linkText : (params.text || '') + '', 13 linkType : params.type || 'other', 14 linkUrl : params.url || '', 15 linkModuleName: params.moduleName || '', 16 linkRegion: params.region || '', 17 linkPosition: params.position || 0 18 }); 19 } 20 21 function refreshBasketData(calloutFunction) { 22 $.ajax({ 23 type : 'GET', 24 url : app.urls.analyticsRefreshBasketData, 25 success : function(responseData) { 26 if (responseData && responseData.error) { 27 console.warn('analytics:refreshBasketData - ajax request issue'); 28 } else { 29 deepAssign(window.utag_data, responseData); 30 if (typeof calloutFunction === 'function') { 31 calloutFunction(); 32 } 33 } 34 }, 35 error : function (_xhr, textStatus, errorThrown) { 36 console.warn('analytics:refreshBasketData - ajax request failed:', textStatus, errorThrown); 37 } 38 }); 39 } 40 41 function trackCheckout(e) { 42 adobeDataLayer.push({ 43 event: 'checkout', 44 event_name: 'checkout', 45 cartId: window.utag_data.basket_id, 46 checkoutPosition: window.utag_data.interaction_name, 47 checkoutProcessType: e.data.regularCh ? e.data.processType : (((window.utag_data.page_name).indexOf('billing') > -1 ? 'standard - ' : 'express - ') + e.data.processType), 48 deviceApplePayEligible: Boolean(window.ApplePaySession) + '', 49 products: getArrayOfAdobeProducts(window.utag_data.basket_products || []) 50 }) 51 } 52 53 function getElemIndex(parentSelector, itemSelector, $el) { 54 return ($el.closest(parentSelector)).children(itemSelector).index($el); 55 } 56 57 function getComplexElemIndex(parentSelector, itemSelector, $el) { 58 return ($el.closest(parentSelector)).find(itemSelector).index($el); 59 } 60 61 function getFormMeta($form) { 62 const fallbackId = $form.data('generated-form-id'); 63 64 return { 65 formId: $form.attr('id') || fallbackId || '', 66 formName: $form.data('form-name') || $form.attr('name') || $form.attr('id') || fallbackId || '', 67 formType: $form.data('form-type') || 'default' 68 }; 69 } 70 71 function ensureGeneratedId($form) { 72 if (!$form.attr('id') && !$form.data('generated-form-id')) { 73 $form.data('generated-form-id', 'form-' + Date.now() + '-' + Math.floor(Math.random() * 100000)); 74 } 75 } 76 77 function ensureFormState(formEl) { 78 if (!window.analytics.formState.has(formEl)) { 79 window.analytics.formState.set(formEl, { started: false }); 80 } 81 82 return window.analytics.formState.get(formEl); 83 } 84 85 function pushFormEvent(eventName, meta) { 86 window.adobeDataLayer.push({ 87 event: eventName, 88 event_name: eventName, 89 formId: meta.formId, 90 formName: meta.formName, 91 formType: meta.formType 92 }); 93 } 94 95 function getSearchResultsProductData(pageType) { 96 let result = []; 97 98 $('#search-result-items .product-tile').each(function(_index, elem) { 99 let analyticsData = $(elem).data('analytics'); 100 if (analyticsData) { 101 result.push({ 102 id: analyticsData.baseItemID, 103 productSource: pageType === 'Category' ? 'plp' : 'srp', 104 SKU: analyticsData.variantID || $(elem).attr('data-variantid'), // Clarify 105 swatchName: analyticsData.colorName 106 }); 107 } 108 }); 109 110 return result; 111 } 112 113 function getRefinementsData() { 114 let result = []; 115 116 if (window.analytics.ajaxRequestData && window.analytics.ajaxRequestData.searchRefinements && (Object.keys(window.analytics.ajaxRequestData.searchRefinements).length > 0)) { 117 Object.keys(window.analytics.ajaxRequestData.searchRefinements).forEac
117h(function (key) { 118 result.push({ 119 name: key, 120 value: window.analytics.ajaxRequestData.searchRefinements[key].join('|') 121 }) 122 }) 123 } 124 125 return result; 126 } 127 128 function getViewport(innerWidth) { 129 let result = { 130 affiliation: 'mobile', 131 viewport: 'small' 132 }; 133 134 if (innerWidth) { 135 switch (true) { 136 case innerWidth < 767: 137 result = { 138 affiliation: 'mobile', 139 viewport: 'small' 140 }; 141 break; 142 case innerWidth < 1024: 143 result = { 144 affiliation: 'tablet', 145 viewport: 'medium' 146 }; 147 break; 148 case innerWidth > 1439: 149 result = { 150 affiliation: 'desktop', 151 viewport: 'x-large' 152 }; 153 break; 154 case innerWidth > 1023: 155 result = { 156 affiliation: 'desktop', 157 viewport: 'large' 158 }; 159 break; 160 default: 161 break; 162 } 163 } 164 return result; 165 } 166 167 function buildMarketingFromUrl(url) { 168 var params = new URL(url || window.location.href).searchParams, 169 marketing = { 170 trackingCode: params.get('cid') || '', 171 utmSource: params.get('utm_source') || '', 172 utmMedium: params.get('utm_medium') || '', 173 utmName: params.get('utm_campaign') || '', 174 utmTerm: params.get('utm_term') || '', 175 utmContent: params.get('utm_content') || '', 176 utmAudience: params.get('utm_audience') || '', 177 utmTactic: params.get('utm_tactic') || '', 178 utmConcept: params.get('utm_concept') || '', 179 utmSourcePlatform: params.get('utm_sourcePlatform') || '', 180 utmStrategy: params.get('utm_strategy') || '', 181 utmChannel: params.get('utm_channel') || '', 182 }; 183 return marketing; 184 } 185 186 function buildCategoryObj(value) { 187 var result = null; 188 if (typeof value === 'string' && value.length > 0) { 189 var array = value.split(' / '); 190 result = { 191 primary: array.shift(), 192 } 193 array.forEach(function(elem, index) { 194 result['sub' + (index + 1)] = elem; 195 }); 196 } 197 return result; 198 } 199 200 function isDeviceTouchEnabled() { 201 let hasTouchPoints = (typeof navigator !== 'undefined' && (navigator.maxTouchPoints || 0) > 0) || (typeof navigator !== 'undefined' && (navigator.msMaxTouchPoints || 0) > 0), 202 hasTouchEvent = typeof window !== 'undefined' && ('ontouchstart' in window || 'ontouchstart' in document.documentElement), 203 hasCoarsePointer = typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia('(pointer: coarse)').matches; 204 205 return Boolean(hasTouchPoints || hasTouchEvent || hasCoarsePointer); 206 } 207 208 function getUniqueUUID() { 209 if (window.crypto && window.crypto.randomUUID) { 210 return window.crypto.randomUUID() 211 } else { 212 window.crypto = window.crypto || {}; 213 window.crypto.randomUUID = function () { 214 const getRandomValues = window.crypto && window.crypto.getRandomValues ? window.crypto.getRandomValues.bind(window.crypto) : function (arr) { 215 for (let i = 0; i < arr.length; i++) { 216 arr[i] = Math.floor(Math.random() * 256) 217 } 218 return arr 219 }, 220 bytes = new Uint8Array(16), 221 byteToHex = []; 222 223 getRandomValues(bytes); 224 225 bytes[6] = (bytes[6] & 0x0f) | 0x40; 226 bytes[8] = (bytes[8] & 0x3f) | 0x80; 227 228 for (let i = 0; i < 256; ++i) { 229 byteToHex.push((i + 0x100).toString(16).substr(1)) 230 } 231 232 return ( 233 byteToHex[bytes[0]] + byteToHex[bytes[1]] + byteToHex[bytes[2]] + byteToHex[bytes[3]] + '-' + 234 byteToHex[bytes[4]] + byteToHex[bytes[5]] + '-' + 235 byteToHex[bytes[6]] + byteToHex[bytes[7]] + '-' + 236 byteToHex[bytes[8]] + byteToHex[bytes[9]] + '-' + 237 byteToHex[bytes[10]] + byteToHex[bytes[11]] + byteToHex[bytes[12]] + 238 byteToHex[bytes[13]] + byteToHex[bytes[14]] + byteToHex[bytes[15]] 239 ) 240 }; 241 return window.crypto.randomUUID() 242 } 243 } 244 245 function getArrayOfAdobeProducts(arr) { 246 let result = []; 247 if (arr && typeof arr === "object" && arr.length > 0) { 248 for (let i = 0; arr.length > i; i++) { 249 result.push(convertAnalyticsDataToAdobeProduct(arr[i])); 250 } 251 } 252 return result; 253 } 254 255 function convertAnalyticsDataToAdobeProduct(elem) { 256 if (!elem) return {}; 257 258 return { 259 id: elem.baseItemID, 260 name: (elem.name || '').toLowerCase(), 261 link: elem.link, 262 listPrice: elem.listPrice, 263 listPriceRange: elem.priceRange, 264 sellingPrice: elem.sellingPrice, 265 sellingPriceRange: elem.priceRange, 266 priceAfterDiscount: elem.finalPrice, 267 totalListPrice: elem.totalListPrice, 268 totalSellingPrice: elem.totalSellingPrice, 269 totalPriceAfterDiscount: elem.totalFinalPrice, 270 adjustmentCode: elem.couponCodes, 271 inventoryStatus: (elem.availabilityStatus || '').toLowerCase(), 272 averageRating: 0, 273 review: 0, 274 SKU: elem.variantID, 275 quantity: elem.quantity, 276 position: elem.position, 277 couponId: elem.couponCodes, 278 imgSource: elem.imageAddress, 279 categoryId: elem.mainCategoryID, 280 departmentId: elem.customDepartmentNumber, 281 flags: { 282 isCollection: elem.isCollectionFlag, 283 isMaxQuantityReached: false, 284 isUrgencyMessageShown: false, 285 isCancellationEligible: false, 286 }, 287 size: elem.sizeName, 288 color: elem.colorName, 289 vendorName: elem.brand, 290 marketingLabel: elem.badgeText, 291 cartAddLocation: elem.cartAddLocation, 292 itemType: elem.customStyle, 293 type: elem.customStyle, 294 categoryName: elem.mainCategoryName, 295 badge: elem.badgeText, 296 swatchName: elem.colorName, 297 feature: elem.features, 298 brand: elem.brand, 299 pricingCadence: elem.typeOfPrice, 300 productSource: '', 301 sellerName: 'marketplace seller', 302 sellerType: '3P', 303 fulfillmentType: 'ship', 304 shippingMethod: elem.shippingMethod 305 } 306 } 307 308 function deepAssign(target, source) { 309 if (!source || typeof source !== 'object') { 310 return target; 311 } 312 313 Object.keys(source).forEach(function (key) { 314 let sourceValue = source[key], 315 targetValue = target[key]; 316 317 if (sourceValue && (typeof sourceValue === 'object') && !Array.isArray(sourceValue)) { 318 if (!targetValue || typeof targetValue !== 'object' || Array.isArray(targetValue)) { 319 target[key] = {}; 320 } 321 322 deepAssign(target[key], sourceValue); 323 } else { 324 target[key] = sourceValue; 325 } 326 }) 327 328 return target; 329 } 330 331 function isUserActivated() { 332 return !!(navigator.userActivation && navigator.userActivation.isActive); 333 } 334 335 function isVideoElement(element) { 336 return element && element.tagName && element.tagName.toLowerCase() === 'video'; 337 } 338 339 function getVideoNameFromSrc(src) { 340 let fileName = ''; 341 342 if (!src) return ''; 343 344 src = src.split('?')[0].split('#')[0]; 345 346 fileName = src.substring(src.lastIndexOf('/') + 1); 347 348 try { 349 fileName = decodeURIComponent(fileName); 350 } catch (e) {} 351 352 return fileName.replace(/\.[^/.]+$/, ''); 353 } 354 // helpers end 355 356 function pushPageViewEvent(params) { 357 let categoryObj = buildCategoryObj(window.utag_data.category), 358 viewportObj = getViewport(window.innerWidth); 359 360 let pageViewEvent = { 361 event: 'pageView', 362 event_name: 'pageView', 363 marketing: buildMarketingFromUrl(), 364 interactionName: window.utag_data.interaction_name, 365 page: { 366 affiliation: viewportObj.affiliation, 367 brand: 'Nautica', 368 breadcrumbs: window.utag_data.breadcrumbs, 369 category: categoryObj || {}, 370 cleanUrl: (window.location.origin + window.location.pathname) + '', 371 flags: { 372 isErrorPage: window.utag_data.page_type === 'error', 373 isDeviceTouchEnabled: isDeviceTouchEnabled(), 374 isFitPredictorAvailable: window.utag_data.isFitPredictorAvailable, 375 isShopTheLookModule: window.utag_data.isShopTheLookModule, 376 isChatAvailable: true 377 }, 378 host: window.location.host, 379 language: 'en-US', 380 name: window.utag_data.page_name, 381 siteSection: window.utag_data.site_section, 382 tech: { 383 clusterInstance: window.utag_data.instance_type, 384 releaseVersion: window.utag_data.release_version, 385 version: window.utag_data.version, 386 }, 387 type: window.utag_data.page_type, 388 viewport: viewportObj.viewport, 389 vendorEventId: getUniqueUUID() + '' 390 }, 391 user: { 392 address: '', 393 country: '', 394 state: '', 395 zip: '', 396 email: '', 397 firstName: '', 398 lastName: '', 399 phoneNumber: '', 400 isAssociateFlag: window.utag_data.groupMemberships.toLowerCase().indexOf('emp') > -1, 401 userState: window.utag_data.aep_logged_in_status, 402 itemsInSaveForLater: window.utag_data.items_in_save_for_later || 0, 403 userId: window.utag_data.customer_number, 404 userType: window.utag_data.groupMemberships.length > 0 ? window.utag_data.groupMemberships.split(', ') : [], 405 qmid: '', 406 sessionId: window.utag_data.session_id, 407 storeId: window.utag_data.store_id + '', 408 isUserActiveCouponAdded: window.utag_data.basket_is_coupon_added || window.utag_data.order_is_coupon_added || false, 409 visitorId: window.utag_data.customer_number 410 } 411 } 412 413 if (window.utag_data.aep_logged_in_status === 'logged-in') { 414 Object.assign(pageViewEvent.user, { 415 address: window.utag_data.customer_address_obj.address, 416 country: window.utag_data.customer_address_obj.country, 417 state: window.utag_data.customer_address_obj.state, 418 zip: window.utag_data.customer_address_obj.zip, 419 email: window.utag_data.customer_email, 420 firstName: window.utag_data.customer_first, 421 lastName: window.utag_data.customer_last, 422 phoneNumber: window.utag_data.customer_phone 423 }); 424 } 425 426 if (params && params.pseudoPageViewEvent) { 427 if (params.pageNameOverwrite) { 428 pageViewEvent.page.name = params.pageNameOverwrite; 429 } 430 431 if (params.additionalFieldsToInclude) { 432 deepAssign(pageViewEvent, params.additionalFieldsToInclude); 433 } 434 435 if (params.includeProductInfo) { 436 let analyticsData = params.externalAnalyticsData || $('.js-analytics-data-pdp').data('analytics'); 437 438 analyticsData.productSource = 'pdp'; 439 440 pageViewEvent.products = getArrayOfAdobeProducts([analyticsData || {}]); 441 pageViewEvent.page.name+= (analyticsData.baseItemID + ':' + analyticsData.name).toLowerCase(); 442 } 443 } else { 444 switch (window.utag_data.page_type) { 445 case 'pdp': 446 let analyticsData = $(".js-analytics-data-pdp").data('analytics'); 447 analyticsData.productSource = 'pdp'; 448 449 Object.assign(pageViewEvent, { 450 products: getArrayOfAdobeProducts([analyticsData || {}]), 451 }); 452 break; 453 case 'Category': 454 case 'Search': 455 Object.assign(pageViewEvent, { 456 searchTerm: window.utag_data.search_keyword || '', 457 defaultSearchTerm: window.utag_data.search_keyword || '', 458 searchType: window.utag_data.search_type || '', 459 searchCount: window.utag_data.search_result, 460 resultsPageNumber: window.utag_data.page_number, 461 resultsPerPage: window.utag_data.page_size, 462 sortByType: window.utag_data.sortbytype || '', 463 searchDepartmentName: (window.utag_data.breadcrumbs.split(' / ')).shift(), 464 sortSearchStrategy: window.utag_data.sortbytype || '', 465 searchFilter: getRefinementsData(), 466 products: getSearchResultsProductData(window.utag_data.page_type), 467 viewType: viewportObj.affiliation === 'desktop' ? '4-column grid' : '2-column grid' 468 }); 469 break; 470 case 'Cart': 471 case 'Checkout': 472 let processType = 'standard - checkout'; 473 if (window.utag_data.basket_payment_type && window.utag_data.basket_payment_type.length > 0) { 474 switch (window.utag_data.basket_payment_type[0]) { 475 case 'CREDIT_CARD': 476 break; 477 case 'PayPal': 478 processType = 'paypal'; 479 break; 480 case 'Klarna': 481 processType = 'klarna'; 482 break; 483 case 'DW_APPLE_PAY': 484 processType = 'applepay'; 485 break; 486 default: 487 break; 488 } 489 } 490 Object.assign(pageViewEvent, { 491 cartId: window.utag_data.basket_id, 492 checkoutPosition: window.utag_data.page_name, 493 checkoutProcessType: processType, 494 deviceApplePayEligible: Boolean(window.ApplePaySession) + '', 495 products: getArrayOfAdobeProducts(window.utag_data.basket_products), 496 couponId: window.utag_data.basket_coupon_code_promo_type === 'PRODUCT' ? '' : window.utag_data.basket_coupon_code, 497 couponAmount: window.utag_data.basket_order_level_coupon_amount
498 }); 499 break; 500 case 'OrderHistory': 501 case 'Confirmation': 502 if (window.utag_data.order_id) { 503 deepAssign(pageViewEvent, { 504 orderId: window.utag_data.order_id || '', 505 location: { 506 city: window.utag_data.order_shipping_city.join('|'), 507 state: window.utag_data.order_shipping_state.join('|'), 508 postalCode: window.utag_data.order_shipping_zip.join('|'), 509 country: window.utag_data.order_shipping_country.join('|'), 510 }, 511 orderFlags: { 512 isOrderApproved: true, 513 isPromoFinancing: true, 514 isTestOrder: window.utag_data.instance_type !== 'production' 515 }, 516 shippingMethod: window.utag_data.order_shipping_methods_names.join('|'), 517 amounts: { 518 merchandiseTotal: window.utag_data.order_total, 519 subTotal: window.utag_data.order_aep_subtotal, 520 tax: window.utag_data.order_tax, 521 giftCardAmount: window.utag_data.order_gift_card_amount, 522 shippingCost: window.utag_data.order_shipping_amount_total, 523 }, 524 tender: window.utag_data.order_aep_payment_info, 525 terminalAgentId: 'wep', 526 pricingAccuracyFlag: 'yes', 527 products: getArrayOfAdobeProducts(window.utag_data.order_products || []), 528 discountId: window.utag_data.order_discounts && Array.isArray(window.utag_data.order_discounts.discountId) ? window.utag_data.order_discounts.discountId.join('|') : '', 529 discountType: window.utag_data.order_discounts && Array.isArray(window.utag_data.order_discounts.discountType) ? window.utag_data.order_discounts.discountType.join('|') : '', 530 discountAmount: window.utag_data.order_discounts && window.utag_data.order_discounts.totalDiscountAmount ? window.utag_data.order_discounts.totalDiscountAmount : 0, 531 currencyCode: 'USD' 532 }); 533 } 534 break; 535 default: 536 break; 537 } 538 } 539 540 adobeDataLayer.push(pageViewEvent); 541 } 542 543 function bindAdobeClientSideEvents(_e) { 544 window.dataLayer = window.dataLayer || []; 545 546 /*-----------------pageView--------------------*/ 547 pushPageViewEvent(); 548 549 $(document).on('analytics:shippingLogin', function() { 550 pushPageViewEvent({ 551 pseudoPageViewEvent: true, 552 pageNameOverwrite: 'checkout:checkout login', 553 additionalFieldsToInclude: { 554 interactionName: 'checkout' 555 } 556 }); 557 }); 558 559 $(document).on('analytics:submitOrderClick', function(_e) { 560 pushPageViewEvent({ 561 pseudoPageViewEvent: true, 562 pageNameOverwrite: 'checkout:checkout pending order confirmation', 563 additionalFieldsToInclude: { 564 interactionName: 'checkout' 565 } 566 }) 567 }); 568 569 $(document).on('analytics:quickview', function() { 570 pushPageViewEvent({ 571 pseudoPageViewEvent: true, 572 pageNameOverwrite: 'mini pdp:', 573 includeProductInfo: true, 574 additionalFieldsToInclude: { 575 interactionName: 'product_view' 576 } 577 }) 578 }); 579 /*-----------------pageView--------------------*/ 580 581 /*-----------------search_results_click--------------------*/ 582 $(document).on('click', '.search-suggestions a', function(e) { 583 let $elem = $(this), 584 $parentElem = $elem.closest('.product-suggestion'), 585 index = $parentElem.closest('.product-suggestions').children('.product-suggestion').index($parentElem); 586 587 adobeDataLayer.push({ 588 event: 'search_results_click', 589 event_name: 'search_results_click', 590 searchTerm: $('[data-header-component="search-input"]').val(), 591 searchType: 'product suggestion', 592 searchLinkText: $elem.find('.product-name').text(), 593 searchLinkHref: $elem.attr('href'), 594 searchClickPosition: index + 1, 595 searchLinkId: $elem.find('.bfx-sku').text() 596 }); 597 }); 598 599 $(document).on('analytics:submitSearchForm', function(_e, searchTerm, url) { 600 adobeDataLayer.push({ 601 event: 'search_results_click', 602 event_name: 'search_results_click', 603 searchTerm: searchTerm, 604 searchType: 'regular', 605 searchLinkText: 'search icon click', 606 searchLinkHref: url, 607 searchClickPosition: 1, 608 searchLinkId: 'submit' 609 }); 610 }); 611 612 /*----------------/search_results_click--------------------*/ 613 614 /*-----------------video_start--------------------*/ 615 document.addEventListener('play', function (e) { 616 if (!(isVideoElement(e.target) && isUserActivated())) return; 617 618 let video = e.target, 619 $video = $(video), 620 videoName = ''; 621 622 if (!$video.data('played')) { 623 videoName = getVideoNameFromSrc(video.currentSrc); 624 $video.data('played', true).data('analyticsVideoStartedByUser', true).data('analyticsVideoName', videoName); 625 626 adobeDataLayer.push({ 627 event: 'video_start', 628 event_name: 'video_start', 629 videoId: $video.attr('id') || videoName, 630 videoName: $video.attr('title') || videoName 631 }); 632 } 633 }, true); 634 /*----------------/video_start--------------------*/ 635 636 /*-----------------video_view_25--------------------*/ 637 /*-----------------video_view_50--------------------*/ 638 /*-----------------video_view_75--------------------*/ 639 document.addEventListener('timeupdate', function (e) { 640 if (!isVideoElement(e.target)) return; 641 642 let video = e.target, 643 $video = $(video), 644 videoName, 645 percent, 646 checkpoints = [25, 50, 75]; 647 648 if (!($video.data('analyticsVideoStartedByUser') && video.duration)) return; 649 650 videoName = $video.data('analyticsVideoName') || getVideoNameFromSrc(video.currentSrc), 651 percent = (video.currentTime / video.duration) * 100; 652
653 checkpoints.forEach(function (point) { 654 let key = 'video_view_' + point; 655 656 if (percent >= point && !$video.data(key)) { 657 $video.data(key, true); 658 659 adobeDataLayer.push({ 660 event: key, 661 event_name: key, 662 videoId: $video.attr('id') || videoName, 663 videoName: $video.attr('title') || videoName, 664 viewedSeconds: Math.floor(video.currentTime) 665 }); 666 } 667 }); 668 669 /*-----------------video_complete--------------------*/ 670 if (percent >= 96 && !$video.data('video_complete')) { 671 $video.data('video_complete', true); 672 673 adobeDataLayer.push({ 674 event: 'video_complete', 675 event_name: 'video_complete', 676 videoId: $video.attr('id') || videoName, 677 videoName: $video.attr('title') || videoName, 678 viewedSeconds: Math.floor(video.currentTime) 679 }); 680 } 681 /*----------------/video_complete--------------------*/ 682 }, true); 683 684 /*----------------/video_view_25--------------------*/ 685 /*----------------/video_view_50--------------------*/ 686 /*----------------/video_view_75--------------------*/ 687 688 /*-----------------form--------------------*/ 689 // global variable 690 window.analytics.formState = new WeakMap(); 691 692 $(document).on('focusin.adobeFormTracking', 'form input, form textarea, form select', function (e) { 693 let $field = $(this), 694 $form = $field.closest('form'), 695 state = null; 696 697 if (!$form.length || !$form.data('form-type') || !$form.data('form-name')) return; 698 699 if (e && e.isTrigger && !e.originalEvent) return; 700 701 ensureGeneratedId($form); 702 703 state = ensureFormState($form[0]); 704 705 if (state.started) return; 706 707 state.started = true; 708 pushFormEvent('form_start', getFormMeta($form)); 709 }); 710 711 $(document).on('submit.adobeFormTracking', 'form', function () { 712 let $form = $(this), 713 state = null; 714 715 if (!$form.length || !$form.data('form-type') || !$form.data('form-name')) return; 716 717 ensureGeneratedId($form); 718 719 pushFormEvent('form_submit', getFormMeta($form)); 720 721 state = ensureFormState($form[0]); 722 state.started = false; 723 }); 724 725 $(document).on('analytics:addressFormSubmit', function () { 726 let $form = $('form#edit-address-form'); 727 728 if (!$form.length || !$form.data('form-type') || !$form.data('form-name')) return; 729 730 ensureGeneratedId($form); 731 732 pushFormEvent('form_submit', getFormMeta($form)); 733 }); 734 735 $(document).on('analytics:billingFormSubmit', function () { 736 let $form = $('form#dwfrm_billing'); 737 738 if (!$form.length || !$form.data('form-type') || !$form.data('form-name')) return; 739 740 ensureGeneratedId($form); 741 742 pushFormEvent('form_submit', getFormMeta($form)); 743 }); 744 745 $(document).on('mousedown.adobeFormTracking touchstart.adobeFormTracking', function (e) { 746 $('form').each(function () { 747 let formEl = this, 748 state = null; 749 750 if (!formEl.contains(e.target)) { 751 state = ensureFormState(formEl); 752 state.started = false; 753 } 754 }); 755 }); 756 757 $(document).on('gaTrackNewsletterSignup', function(){ 758 window.adobeDataLayer.push({ 759 "event": "form_submit", 760 "event_name": "form_submit", 761 "formId": "email-sign-up-footer", 762 "formName": "email sign up", 763 "formType": "account" 764 }); 765 }); 766 767 $(document).on('gaTrackSmsSignup', function(){ 768 window.adobeDataLayer.push({ 769 "event": "form_submit", 770 "event_name": "form_submit", 771 "formId": "sms-sign-up-footer", 772 "formName": "sms sign up", 773 "formType": "account" 774 }); 775 }); 776 /*-----------------/form--------------------*/ 777 778 /*-----------------account_registration_complete--------------------*/ 779 if (window.utag_data.registrationPing) { 780 adobeDataLayer.push({ 781 event: 'account_registration_complete', 782 event_name: 'account_registration_complete', 783 user: { 784 userId: window.utag_data.customer_number 785 } 786 }) 787 } 788 /*-----------------/account_registration_complete--------------------*/ 789 790 /*-----------------account_signup_incheckout--------------------*/ 791 792 if (window.utag_data.checkoutSignUpPing) { 793 adobeDataLayer.push({ 794 event: 'account_signup_incheckout', 795 event_name: 'account_signup_incheckout', 796 user:{ 797 userId: window.utag_data.customer_number 798 } 799 }); 800 } 801 802 /*----------------/account_signup_incheckout--------------------*/ 803 804 /*-----------------account_login--------------------*/ 805 if (window.utag_data.loginPing) { 806 adobeDataLayer.push({ 807 event: 'account_login', 808 event_name: 'account_login', 809 user: { 810 userId: window.utag_data.customer_number 811 } 812 }) 813 } 814 /*-----------------/account_login--------------------*/ 815 816 /*-----------------account_password_resets--------------------*/ 817 if (window.utag_data.changePasswordPing) { 818 adobeDataLayer.push({ 819 event: 'account_password_resets', 820 event_name: 'account_password_resets', 821 user: { 822 userId: window.utag_data.customer_number 823 } 824 }) 825 } 826 827 if (window.utag_data.analyticsResetUserID) { 828 adobeDataLayer.push({ 829 event: 'account_password_resets', 830 event_name: 'account_password_resets', 831 user: { 832 userId: window.utag_data.analyticsResetUserID 833 } 834 }); 835 } 836 837 /*-----------------/account_password_resets--------------------*/ 838 839 /*-----------------coupon_applied--------------------*/ 840 $(document).on('analytics:couponAdd', function(_e, data) { 841 let location; 842 843 switch (window.utag_data.page_type) { 844 case 'Checkout': 845 if (window.utag_data.page_name.indexOf('shipping') > -1) { 846 location = 'shipping page'; 847 } else { 848 location = 'billing page'; 849 } 850 break; 851 case 'Cart': 852 default: 853 location = 'cart page'; 854 break; 855 } 856 857 adobeDataLayer.push({ 858 event: 'coupon_applied', 859 event_name: 'coupon_applied', 860 couponApplyMethod: location, 861 couponCode: data.discount_code, 862 couponDiscount: data.amount, 863 couponAmount: data.amount, 864 couponType: data.types && Array.isArray(data.types) ? data.types.join('|') : '', 865 couponEligible: (!data.error) + '' 866 }) 867 }); 868 /*----------------/coupon_applied--------------------*/ 869 870 /*-----------------coupon_removed--------------------*/ 871 $(document).on('analytics:couponDelete', function() { 872 let location; 873 874 switch (window.utag_data.page_type) { 875 case 'Checkout': 876 if (window.utag_data.page_name.indexOf('shipping') > -1) { 877 location = 'shipping page'; 878 } else { 879 location = 'billing page'; 880 } 881 break; 882 case 'Cart': 883 default: 884 location = 'cart page'; 885 break; 886 } 887 888 adobeDataLayer.push({ 889 event: 'coupon_removed', 890 event_name: 'coupon_removed', 891 couponApplyMethod: location, 892 couponCode: window.utag_data.basket_coupon_code, 893 couponAmount: window.utag_data.basket_coupon_amount, 894 couponType: window.utag_data.basket_coupon_code_promo_type 895 }) 896 }); 897 /*----------------/coupon_removed--------------------*/ 898 899 /*-----------------linkClick--------------------*/ 900 // pdpToolClick s2 desktop
901 $(document).on('click', '.product-gallery-thumbnails.hidden-mobile .image', function(_e) { 902 let $elem = $(this), 903 productData = $('.js-analytics-data-pdp').data('analytics'); 904 905 pushLinkClickEvent({ 906 component: 'pdp alt image', 907 id: 'pdp-tool', 908 text: productData ? productData.name : '', 909 url: productData ? productData.link : window.location.href, 910 moduleName: 'pdpToolClick:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 911 region: 'product details', 912 position: parseInt($elem.data('thumbnail-index') || 0), 913 }); 914 }); 915 916 // pdpToolClick s2 mobile 917 $(document).on('click', '.product-primary-image .slick-slide .image', function(_e) { 918 let $elem = $(this), 919 productData = $('.js-analytics-data-pdp').data('analytics'); 920 921 pushLinkClickEvent({ 922 component: 'pdp alt image', 923 id: 'pdp-tool', 924 text: productData ? productData.name : '', 925 url: productData ? productData.link : window.location.href, 926 moduleName: 'pdpToolClick:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 927 region: 'product details', 928 position: parseInt($elem.data('thumbnail-index') || 0), 929 }); 930 }); 931 932 // pdpToolClick s3: Zoom image 933 $(document).on('analytics:pdpZoomClick', function(_e) { 934 let productData = $('.js-analytics-data-pdp').data('analytics'); 935 pushLinkClickEvent({ 936 component: 'zoom image', 937 id: 'pdp-tool', 938 text: 'zoom image', 939 url: window.location.href, 940 moduleName: 'pdpToolClick:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 941 region: 'product details', 942 position: 0 943 }); 944 }); 945 946 // pdpToolClick s4: size chart 947 $(document).on('click', '.size-chart-link', function(_e) { 948 let $elem = $(this), 949 productData = $('.js-analytics-data-pdp').data('analytics'); 950 951 pushLinkClickEvent({ 952 component: 'pdp tools', 953 id: 'pdp-tool', 954 text: $elem.text().trim(), 955 url: $elem.attr('href') || '', 956 moduleName: 'openModal:Size Chart:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 957 region: 'product details', 958 position: 0 959 }); 960 }); 961 962 // shopTheLook s1: pdp1 963 $(document).on('click', '.styliticsJumplink', function(_e) { 964 let productData = $('.js-analytics-data-pdp').data('analytics'); 965 966 pushLinkClickEvent({ 967 component: 'how to style it', 968 id: 'how-to-style-it', 969 text: 'how to style it', 970 url: window.location.href, 971 moduleName: 'pdpToolClick:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 972 region: 'shop the look', 973 position: 0 974 }); 975 }); 976 977 // shopTheLook s2: stylitics widget 978 $(document).on('analytics:styliticsBundleClick', function(_e, data) { 979 pushLinkClickEvent({ 980 component: 'shop the look', 981 id: 'shop-the-look', 982 text: 'Shop the Look', 983 url: window.location.href, 984 moduleName: 'pdpToolClick:' + (data.bundle.primary_stylitics_item_id || data.bundle.id), 985 region: 'shop the look', 986 position: (data.bundle.position || 0) 987 }); 988 }); 989 990 // shopTheLook s3: stylitics widget item 991 $(document).on('analytics:styliticsItemClick', function(_e, data) { 992 pushLinkClickEvent({ 993 component: 'shop this look', 994 id: 'shop-the-look-product', 995 text: ((data.item && data.item.item_id) || '') + '', 996 url: (data.item && data.item.affiliate_link) || '', 997 moduleName: 'pdpToolClick:' + ((data.item && data.item.item_id) || ''), 998 region: 'shop the look', 999 position: (data.item.index || 0) 1000 }); 1001 }); 1002 1003 // openModal s1: Write a Review 1004 $(document).on('analytics:pwrWriteReview', function(_e, url) { 1005 let productData = $('.js-analytics-data-pdp').data('analytics'); 1006 1007 pushLinkClickEvent({ 1008 component: 'modal trigger',
1009 id: 'modal-open', 1010 text: 'Write a Review', 1011 url: url ? url.href : '', 1012 moduleName: 'openModal:Write a Review:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 1013 region: 'product details', 1014 position: 0 1015 }); 1016 }); 1017 1018 // pdpKAClick s1: color and size 1019 $(document).on('analytics:selectoptionspdp', function(_e, externalE, analyticsData) { 1020 if ((!externalE) || (externalE && (externalE.isTrigger || !externalE.originalEvent))) { 1021 return; 1022 } 1023 1024 if (analyticsData) { 1025 try { 1026 adobeDataLayer.push({ 1027 event: 'selectoptionspdp', 1028 event_name: 'selectoptionspdp', 1029 interactionName: window.utag_data.interaction_name, 1030 products: getArrayOfAdobeProducts([analyticsData]) 1031 }); 1032 } catch (error) { 1033 console.warn('aep_events.js: selectoptionspdp error: json issue'); 1034 } 1035 } 1036 }); 1037 1038 // productOOS 1039 if ($('.full-sold-out-flag').length > 0) { 1040 let productData = $('.js-analytics-data-pdp').data('analytics'); 1041 1042 pushLinkClickEvent({ 1043 component: 'product availability', 1044 id: 'product-oos', 1045 text: 'out of stock', 1046 url: window.location.href, 1047 moduleName: 'productOOS:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 1048 region: 'product details', 1049 position: 0 1050 }); 1051 } 1052 1053 // productOOS 1054 $(document).on('analytics:oosProductLoaded', function() { 1055 let productData = $('.js-analytics-data-pdp').data('analytics'); 1056 1057 pushLinkClickEvent({ 1058 component: 'product availability', 1059 id: 'product-oos', 1060 text: 'out of stock', 1061 url: window.location.href, 1062 moduleName: 'productOOS:' + (productData.variantID.length > 0 ? productData.variantID : productData.baseItemID), 1063 region: 'product details', 1064 position: 0 1065 }); 1066 }); 1067 1068 // productclick 1069 $(document).on('click', '.product-tile', function(e) { 1070 let $elem = $(this), 1071 analyticsData = $elem.data('analytics') || {}, 1072 newAnalyticsObj = Object.assign({}, analyticsData, { 1073 position: getComplexElemIndex('.search-result-items, .product-recommendations', '.product-tile', $elem) 1074 }); 1075 1076 if ($elem.find('.quickadd-container.show').length > 0) { 1077 pushPageViewEvent({ 1078 pseudoPageViewEvent: true, 1079 pageNameOverwrite: 'mini pdp:', 1080 includeProductInfo: true, 1081 externalAnalyticsData: newAnalyticsObj, 1082 additionalFieldsToInclude: { 1083 interactionName: 'product_view' 1084 } 1085 }) 1086 } else { 1087 let pageType = 'reco:unknown'; 1088 switch (window.utag_data.page_type) { 1089 case 'Category': 1090 pageType = 'plp'; 1091 break; 1092 case 'Search': 1093 pageType = 'srp'; 1094 break; 1095 case 'pdp': 1096 pageType = 'reco:pdp'; 1097 break; 1098 case 'Cart': 1099 pageType = 'reco:cart'; 1100 break; 1101 case 'welcome': 1102 pageType = 'reco:welcome'; 1103 break; 1104 case 'error': 1105 pageType = 'reco:error'; 1106 break; 1107 default: 1108 break; 1109 } 1110 adobeDataLayer.push({ 1111 event: 'linkClick', 1112 event_name: 'linkClick', 1113 linkComponent : 'product grid', 1114 linkId : 'product-tile', 1115 linkType : 'other', 1116 linkRegion: 'product grid', 1117 linkModuleName: pageType + ':productclick', 1118 linkText : (newAnalyticsObj.name || '') + '', 1119 linkUrl : (newAnalyticsObj.link || '') + '', 1120 linkPosition: newAnalyticsObj.position, 1121 products: getArrayOfAdobeProducts([newAnalyticsObj]) 1122 }) 1123 } 1124 }); 1125 1126 // dynamicVisNav level-1 1127 $(document).on('click', '#navigation-menu .level-1 .level1', function(_e) { 1128 let $elem = $(this); 1129 1130 pushLinkClickEvent({ 1131 component: 'visual navigation', 1132 id: 'visual-nav', 1133 text: $elem.text().trim(), 1134 url: $elem.attr('href'), 1135 moduleName: 'dynamicVisNav', 1136 region: 'visual navigation', 1137 position: getElemIndex('#navigation-menu', '.level-1', $elem.closest('.level-1')) 1138 }); 1139 }); 1140 1141 // dynamicVisNav level-2 and others 1142 $(document).on('click', '#navigation-menu .hoverMenu a', function(_e) { 1143 let $elem = $(this); 1144 1145 pushLinkClickEvent({ 1146 component: 'visual navigation', 1147 id: 'visual-nav', 1148 text: $elem.text().trim(), 1149 url: $elem.attr('href'), 1150 moduleName: 'dynamicVisNav', 1151 region: 'visual navigation', 1152 position: getComplexElemIndex('.menuColumn', 'a', $elem) 1153 }); 1154 }); 1155 1156 // dynamicVisNav mobile level-1 1157 $(document).on('click', '.slideMenu__nav .category-level-1', function(_e) { 1158 let $elem = $(this); 1159 1160 pushLinkClickEvent({ 1161 component: 'visual navigation', 1162 id: 'visual-nav', 1163 text: $elem.text().trim(), 1164 url: window.location.href, 1165 moduleName: 'dynamicVisNav', 1166 region: 'visual navigation', 1167 position: getComplexElemIndex('.slideMenu__nav', '.category-level-1', $elem) 1168 }); 1169 }); 1170 1171 // dynamicVisNav mobile level-2 1172 $(document).on('analytics:level2CategoryClick', function(_e, externalE) { 1173 if (!externalE) { 1174 return; 1175 } 1176 1177 let $elem = $(externalE.target); 1178 1179 pushLinkClickEvent({ 1180 component: 'visual navigation', 1181 id: 'visual-nav', 1182 text: $elem.text().trim(), 1183 url: window.location.href, 1184 moduleName: 'dynamicVisNav', 1185 region: 'visual navigation', 1186 position: getComplexElemIndex('.category-level-2', 'ul', $elem.closest('ul')) 1187 }); 1188 }); 1189 1190 // dynamicVisNav mobile level-3 1191 $(document).on('click', '.slideMenu__nav .category-level-2.active-category ul.active-category .link-bar-item a.level2', function(_e) { 1192 let $elem = $(this); 1193 1194 pushLinkClickEvent({ 1195 component: 'visual navigation', 1196 id: 'visual-nav', 1197 text: $elem.text().trim(), 1198 url: $elem.attr('href') || window.location.href, 1199 moduleName: 'dynamicVisNav', 1200 region: 'visual navigation', 1201 position: getComplexElemIndex('.category-level-2 ul', '.link-bar-item', $elem.closest('.link-bar-item')) 1202 }); 1203 }); 1204 1205 // updateNotificationOptins s1 1206 $(document).on('gaTrackNewsletterSignupSuccess', function() { 1207 pushLinkClickEvent({ 1208 component: 'notification opt-ins', 1209 id: 'footer-email-sign-up', 1210 text: 'sign up', 1211 url: window.location.href, 1212 moduleName: 'updateNotificationOptins:success', 1213 region: 'email sign up', 1214 position: 0 1215 }); 1216 }); 1217 1218 // updateNotificationOptins s2 1219 $(document).on('gaTrackSmsSignupSuccess', function() { 1220 pushLinkClickEvent({ 1221 component: 'notification opt-ins',
1222 id: 'footer-sms-sign-up', 1223 text: 'sign up', 1224 url: window.location.href, 1225 moduleName: 'updateNotificationOptins:success', 1226 region: 'sms sign up', 1227 position: 0 1228 }); 1229 }); 1230 1231 // loginAttempted 1232 $(document).on('click', 'button[name="dwfrm_login_login"]', function(_e) { 1233 if ($(this).closest('#signUpArea').length > 0) { 1234 pushLinkClickEvent({ 1235 component: 'account sign in', 1236 id: 'sign-in-submit', 1237 text: 'sign in', 1238 url: window.location.href, 1239 moduleName: 'login:attempted', 1240 region: 'sign in modal', 1241 position: 0 1242 }); 1243 } else if (window.utag_data.page_type === 'Account') { 1244 pushLinkClickEvent({ 1245 component: 'account sign in', 1246 id: 'sign-in-submit', 1247 text: 'sign in', 1248 url: window.location.href, 1249 moduleName: 'login:attempted', 1250 region: 'sign in form', 1251 position: 0 1252 }); 1253 } else { 1254 pushLinkClickEvent({ 1255 component: 'checkout sign in', 1256 id: 'sign-in-submit', 1257 text: 'sign in', 1258 url: window.location.href, 1259 moduleName: 'login:attempted', 1260 region: 'sign in modal', 1261 position: 0 1262 }); 1263 } 1264 }); 1265 1266 // loginFailed 1267 if (window.utag_data.failedLoginPing) { 1268 pushLinkClickEvent({ 1269 component: 'account sign in', 1270 id: 'sign-in-submit-failed', 1271 text: 'sign in', 1272 url: window.location.href, 1273 moduleName: 'login:failed', 1274 region: 'sign in modal', 1275 position: 0 1276 }); 1277 } 1278 /*-----------------/linkClick--------------------*/ 1279 1280 /*-----------------save_product--------------------*/ 1281 $(document).on('analytics:saveProduct', function(e, analyticsData) { 1282 adobeDataLayer.push({ 1283 event: 'remove_from_cart', 1284 event_name: 'remove_from_cart', 1285 cartRemoveType: (window.utag_data.page_type === 'Cart' ? 'cart' : 'mini cart') + ' page sfl click', 1286 cartRemoveLocation: (window.utag_data.page_type === 'Cart' ? 'cart' : 'mini_cart') + '_sfl', 1287 cartId: window.utag_data.basket_id, 1288 products: getArrayOfAdobeProducts([analyticsData || {}]) 1289 }); 1290 adobeDataLayer.push({ 1291 event: 'save_product', 1292 event_name: 'save_product', 1293 products: getArrayOfAdobeProducts([analyticsData || {}]) 1294 }); 1295 refreshBasketData(); 1296 }); 1297 /*-----------------/save_product--------------------*/ 1298 1299 /*-----------------add_to_cart--------------------*/ 1300 1301 $(document).on('analytics:addtocart', function (_e, exAnalyticsData, quantityValue, _fbc) { 1302 let analyticsData = exAnalyticsData || $(".js-analytics-data-pdp").data('analytics'), 1303 pliCartAddType = analyticsData.cartAddLocation || 'pdp', 1304 cartAddType = '', 1305 cartAddLocation = ''; 1306 1307 analyticsData.quantity = quantityValue ? +quantityValue : analyticsData.quantity; 1308 1309 switch (pliCartAddType) { 1310 case 'plp': 1311 cartAddType = 'plp tile atc click'; 1312 cartAddLocation = 'plp'; 1313 break; 1314 case 'rec': 1315 cartAddType = 'recommender tile atc click'; 1316 cartAddLocation = 'rec'; 1317 break; 1318 case 'stylitics': 1319 cartAddType = 'stylitics quickview atc click'; 1320 cartAddLocation = 'stylitics'; 1321 break; 1322 case 'cart_modal_update': 1323 cartAddType = 'cart page modal atc click'; 1324 cartAddLocation = 'cart_modal_update'; 1325 break; 1326 case 'cart_sfl': 1327 cartAddType = 'cart page sfl atc click'; 1328 cartAddLocation = 'cart_sfl'; 1329 break; 1330 case 'cart_qnt_selector': 1331 cartAddType = 'cart page quantity selector change'; 1332 cartAddLocation = 'cart_qnt_selector'; 1333 break; 1334 case 'mini_cart_qnt_selector': 1335 cartAddType = 'mini cart quantity selector change'; 1336 cartAddLocation = 'mini_cart_qnt_selector'; 1337 break; 1338 case 'pdp': 1339 default: 1340 cartAddType = 'pdp atc click'; 1341 cartAddLocation = 'pdp'; 1342 break; 1343 } 1344 1345 refreshBasketData(function calloutFunction() { 1346 adobeDataLayer.push({ 1347 event: 'add_to_cart', 1348 event_name: 'add_to_cart', 1349 cartAddType: cartAddType, 1350 cartAddLocation: cartAddLocation, 1351 cartId: window.utag_data.basket_id, 1352 products: getArrayOfAdobeProducts([analyticsData || {}]) 1353 }); 1354 }); 1355 }); 1356 /*-----------------/add_to_cart--------------------*/ 1357 1358 /*-----------------remove_from_cart--------------------*/ 1359 $(document).on('analytics:removefromcart2', function (_e, exAnalyticsData, quantityValue) { 1360 if (exAnalyticsData) {
1361 exAnalyticsData.quantity = quantityValue ? +quantityValue : exAnalyticsData.quantity; 1362 1363 refreshBasketData(function calloutFunction() { 1364 adobeDataLayer.push({ 1365 event: 'remove_from_cart', 1366 event_name: 'remove_from_cart', 1367 cartRemoveType: (window.utag_data.page_type === 'Cart' ? 'cart' : 'mini cart') + ' page quantity selector change', 1368 cartRemoveLocation: (window.utag_data.page_type === 'Cart' ? 'cart' : 'mini_cart') + '_qnt_selector', 1369 cartId: window.utag_data.basket_id, 1370 products: getArrayOfAdobeProducts([exAnalyticsData || {}]) 1371 }); 1372 }); 1373 } 1374 }); 1375 1376 $(document).on("analytics:removefromcart", function(_event, primaryEl, diff){ 1377 let analyticsData = $(primaryEl).data("analytics-delete"), 1378 quantity = diff ? diff : ($(primaryEl).closest(".cart-row").find(".item-quantity .select2-choice span").text().trim() || $(primaryEl).closest(".cart-row").find(".item-quantity select").data('originalvalue')); 1379 1380 if (analyticsData) { 1381 analyticsData.quantity = +quantity; 1382 1383 refreshBasketData(function calloutFunction() { 1384 adobeDataLayer.push({ 1385 event: 'remove_from_cart', 1386 event_name: 'remove_from_cart', 1387 cartRemoveType: (window.utag_data.page_type === 'Cart' ? 'cart' : 'mini cart') + ' remove item modal', 1388 cartRemoveLocation: window.utag_data.page_type === 'Cart' ? 'cart' : 'mini_cart', 1389 cartId: window.utag_data.basket_id, 1390 products: getArrayOfAdobeProducts([analyticsData || {}]) 1391 }); 1392 }); 1393 } 1394 }); 1395 /*-----------------/remove_from_cart--------------------*/ 1396 1397 /*-----------------checkout--------------------*/ 1398 $(document).on('click', '.js-trigger-cart-action-checkout, .navigation-mini-cart .actions a, #opt-modal-atb a.oatb--checkout', {processType: 'standard - checkout', regularCh: true}, trackCheckout); 1399 $(document).on('click', '.dw-apple-pay-button', {processType: 'applepay'}, trackCheckout); 1400 1401 $(document).on('analytics:expressCheckout', function(_e) { 1402 var paymentMethod = $("input[name='dwfrm_billing_paymentMethods_selectedPaymentMethodID']:checked").val(), 1403 processType = ''; 1404 1405 switch (paymentMethod) { 1406 case 'CREDIT_CARD': 1407 return; 1408 case 'PayPal': 1409 processType = 'paypal'; 1410 break; 1411 case 'Klarna': 1412 processType = 'klarna'; 1413 break; 1414 case 'DW_APPLE_PAY': 1415 processType = 'applepay'; 1416 break; 1417 default: 1418 break; 1419 } 1420 1421 trackCheckout({data: {processType: processType}}) 1422 }); 1423 1424 $(document).on('analytics:expressPaymentClick', function(_e, data) { 1425 let processType = ''; 1426 switch (data.method) { 1427 case 'paypal': 1428 processType = 'paypal'; 1429 break; 1430 case 'klarna': 1431 processType = 'klarna'; 1432 break; 1433 case 'applepay': 1434 processType = 'applepay'; 1435 break; 1436 default: 1437 break; 1438 } 1439 1440 trackCheckout({data: {processType: processType}}) 1441 }); 1442 1443 $(document).on('click', '.trackEvent.submit-billing', function(){ 1444 var paymentMethod = $("input[name='dwfrm_billing_paymentMethods_selectedPaymentMethodID']:checked").val(), 1445 processType = ''; 1446 1447 switch (paymentMethod) { 1448 case 'CREDIT_CARD': 1449 return; 1450 case 'PayPal': 1451 processType = 'paypal'; 1452 break; 1453 case 'Klarna': 1454 processType = 'klarna'; 1455 break; 1456 case 'DW_APPLE_PAY': 1457 processType = 'applepay'; 1458 break; 1459 default: 1460 break; 1461 } 1462 1463 trackCheckout({data: {processType: processType}}) 1464 }); 1465 /*-----------------/checkout--------------------*/ 1466 1467 /*-----------------productFiltersApplied--------------------*/ 1468 $(document).on('analytics:productfiltersapplied', function(_e, url, externalThis) { 1469 let $elem = $(externalThis ? externalThis : null),
1470 linkId, 1471 linkText, 1472 linkPosition = 1, 1473 filters = []; 1474 1475 if (externalThis) { 1476 linkId = $elem.data('refid'); 1477 linkText = $elem.data('val') || $elem.data('refval'); 1478 1479 if ($elem.hasClass('breadcrumb-relax')) { 1480 linkPosition = getComplexElemIndex('.refinement-breadcrumbs-inner', '.breadcrumb-refinement-value', $elem.closest('.breadcrumb-refinement-value')); 1481 } else { 1482 linkPosition = getElemIndex('.refinement__list', 'li', $elem.closest('li')); 1483 } 1484 } 1485 1486 linkId = linkId ? linkId : 'submit'; 1487 linkText = linkText ? linkText : 'submit'; 1488 1489 $('.refinement-breadcrumbs-inner').first().find(' > .breadcrumb-refinement').each(function(refinement) { 1490 let $refinement = $(this), 1491 type = $refinement.find('.breadcrumb-relax').first().data('refid'), 1492 name = $refinement.find('.breadcrumb-refinement-name').text().trim(); 1493 1494 $refinement.find('.breadcrumb-refinement-value-text').each(function(refinementEl) { 1495 filters.push({ 1496 type: type, 1497 name: name, 1498 value: $(this).text().trim() 1499 }) 1500 }) 1501 }); 1502 1503 window.utag_data.search_result = +($('[data-search-component="item-count"]').first().data('results-count')); 1504 1505 adobeDataLayer.push({ 1506 event: 'productfiltersapplied', 1507 event_name: 'productfiltersapplied', 1508 linkComponent: 'productfilters', 1509 linkId: linkId, 1510 linkText: linkText + '', 1511 linkType: 'other', 1512 linkUrl: url || '', 1513 linkModuleName: 'pagetype:productfilters', 1514 linkRegion: 'product grid', 1515 linkPosition: linkPosition, 1516 searchTerm: window.utag_data.page_name === 'search:results' ? window.utag_data.search_keyword : '', 1517 searchType: 'product suggestion', 1518 searchCount: window.utag_data.search_result, 1519 resultsPageNumber: window.utag_data.page_number, 1520 resultsPerPage: window.utag_data.page_size, 1521 sortByType: window.utag_data.sortbytype, 1522 searchDepartmentName: (window.utag_data.breadcrumbs.split(' / ')).shift(), 1523 sortSearchStrategy: window.utag_data.sortbytype, 1524 searchFilter: filters 1525 }); 1526 }); 1527 /*-----------------/productFiltersApplied--------------------*/ 1528 1529 /*-----------------error--------------------*/ 1530 $(document).on('analytics:fieldValidationError', function(e, data) { 1531 if (data.formEl && ($(data.formEl).data('form-name') === 'login')) { 1532 adobeDataLayer.push({ 1533 event: 'error', 1534 event_name: 'error', 1535 error: [{ 1536 type: 'login form validation error', 1537 SKU: '', 1538 id: data.fieldName === 'dwfrm_login_password' ? '2' : '1', 1539 message: (data.message && data.message.length > 0 ? data.message + ' : ' : '') + data.fieldId + ' : ' + data.rule, 1540 }] 1541 }); 1542 } 1543 1544 }); 1545 1546 $(document).on('analytics:checkForInventoryIssuesInCart', function(e, data) { 1547 adobeDataLayer.push({ 1548 event: 'error', 1549 event_name: 'error', 1550 error: [{ 1551 type: 'cart item inventory issue', 1552 SKU: data.productID, 1553 id: data.id, 1554 message: data.message, 1555 }] 1556 }); 1557 }); 1558 1559 // 404 page 1560 if (window.utag_data.page_type === 'error') { 1561 adobeDataLayer.push({ 1562 event: 'error', 1563 event_name: 'error', 1564 error: [{ 1565 type: '404 page', 1566 SKU: '', 1567 id: '3', 1568 message: '404 page', 1569 }] 1570 }); 1571 } 1572 1573 // check coupon errors 1574 if (($('#add-coupon-form .redemption.coupon').length > 0) && ($('#add-coupon-form .redemption.coupon').text().trim().length > 0) && ($('#add-coupon-form .redemption.coupon .valid-promo-message').length === 0)) { 1575 adobeDataLayer.push({ 1576 event: 'error', 1577 event_name: 'error', 1578 error: [{ 1579 type: 'promo code issue', 1580 SKU: '', 1581 id: '6', 1582 message: $('#add-coupon-form .redemption.coupon').text().trim(), 1583 }] 1584 }); 1585 } 1586 1587 if ((window.utag_data.page_name === 'checkout:checkout review') && $('[analytics-payment-issue="true"]').length > 0) { 1588 adobeDataLayer.push({ 1589 event: 'error', 1590 event_name: 'error', 1591 error: [{ 1592 type: 'payment issue', 1593 SKU: '', 1594 id: '7', 1595 message: $('[analytics-payment-issue="true"]').first().text().trim(), 1596 }] 1597 }); 1598 } 1599 1600 if ((window.utag_data.page_name === 'checkout') && $('.error.backend-error').length > 0) { 1601 adobeDataLayer.push({ 1602 event: 'error', 1603 event_name: 'error', 1604 error: [{ 1605 type: 'credit card error', 1606 SKU: '', 1607 id: '8', 1608 message: $('.error.backend-error').first().text().trim(), 1609 }] 1610 }); 1611 } 1612 1613 /*-----------------/error--------------------*/ 1614 } 1615 1616 if (window.analytics.globalSwitch === true) { 1617 if (window.analytics.initialized === true) { 1618 bindAdobeClientSideEvents() 1619 } else { 1620 document.addEventListener('analytics:init', bindAdobeClientSideEvents, { once: true }); 1621 } 1622 } 1623}(window.jQuery));
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.