PageSourceSearch

https://www.nautica.com/on/demandware.static/Sites-nau-Site/-/default/v1790935427402/lib/aep_events.js

js nautica.com collected 2026-10-02 16:38:08 UTC 65,963 bytes, 1,623 lines download raw bytes

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.