PageSourceSearch

https://www.fisherpaykelhomesolutions.com/on/demandware.static/Sit…/-/en_AU/v1790628076679/js/content.js

js fisherpaykelhomesolutions.com collected 2026-09-29 03:48:49 UTC 45,485 bytes, 1,376 lines download raw bytes

1fpaAnimation = (function () {
2    "use strict";
3
4    //variables
5    let m = {},
6        windowWidth = $(window).width(),
7        controller = new ScrollMagic.Controller();
8
9    m.init = function() {
10
11      //brand intro
12      if($('.fp-brand-intro').length){
13        m.brandIntro();
14      }
15      //homepage wayfinding
16      if($('.fp-home-page-wayfinding').length){
17        m.homepageWayfinding();
18      }
19      //Extended CLP Wayfinding
20      if($('.fp-extended-category-wayfinding').length){
21        m.extendedClpWayfinding();
22      }
23      //CLP Education
24      if($('.fp-clp-education-1').length){
25        m.clpEducation1();
26      }
27      if($('.fp-clp-education-2').length){
28        m.clpEducation2();
29      }
30      //unique selling points
31      if($('.fp-unique-selling-points').length){
32        m.uniqueSellingPoints();
33      }
34      //flagship products
35      if($('.fp-flagship-products').length){
36        m.flagshipProducts();
37      }
38      //flagship products minimal
39      if($('.fp-flagship-products-minimal').length){
40        m.flagshipProductsMinimal();
41      }
42      //brand pillars
43      if($('.fp-brand-pillars').length){
44        m.brandPillars();
45      }
46      // inspiration module
47      if($('.fp-inspiration-module').length){
48        m.inspirationModule();
49      }
50      // 2 up module
51      if($('.fp-two-up').length){
52        m.genericModuleAnimation('.fp-two-up');
53      }
54      // 3 up module
55      if($('.fp-three-up').length){
56        m.genericModuleAnimation('.fp-three-up');
57      }
58      // 4 up module
59      if($('.fp-4-up').length){
60        m.genericModuleAnimation('.fp-4-up');
61      }
62      // ecwf-carousel module
63      // Feature module
64      if($('.fp-feature').length){
65        m.genericModuleAnimation('.fp-feature');
66      }
67      // Quote Module
68      if($('.fp-quote').length){
69        m.quoteGenerator();
70      }
71    };
72
73    m.brandIntro = function() {
74      let brandIntroHeading = $('.fp-brand-intro h2, .fp-brand-intro-small h1'),
75          brandIntroParagraph = $('.fp-brand-intro p'),
76          brandIntroBtn = $('.fp-brand-intro .btn'),
77          brandIntroTimeline = new TimelineLite(),
78          brandIntroScene = new ScrollMagic.Scene();
79
80      brandIntroTimeline.from(brandIntroHeading, 1, { autoAlpha: 0, top: 20 })
81                        .from(brandIntroParagraph, 1, { autoAlpha: 0, top: 20}, "-=0.5")
82                        .from(brandIntroBtn, 1, { autoAlpha: 0, top: 20 }, "-=0.5");
83
84      brandIntroScene.setTween(brandIntroTimeline)
85                     .triggerElement('.fp-brand-intro')
86                     .triggerHook(0.5)
87                     .reverse(false)
88                     .addTo(controller);
89
90       //if element has video load create video tween
91       if($('.fp-brand-intro video').length && windowWidth > 1023){
92         //m.setScrollingVideo('.fp-brand-intro');
93       }
94    };
95
96    m.homepageWayfinding = function() {
97      let homepageWayfindingItems = $('.fp-home-page-wayfinding .hpwf-carousel .item');
98
99      let homepageWayfindingTimeline = new TimelineLite();
100          homepageWayfindingTimeline.staggerFrom(homepageWayfindingItems, 0.75, { autoAlpha: 0, bottom: -20 }, 0.25, 0);
101
102      let homepageWayfindingScene = new ScrollMagic.Scene();
103          homepageWayfindingScene.setTween(homepageWayfindingTimeline)
104                                 .triggerElement('.fp-home-page-wayfinding')
105                                 .triggerHook("onEnter")
106                                 .addTo(controller);
107    };
108
109    m.clpWayfinding = function() {
110      let clpWayfindingItems = $('.fp-clp-wayfinding .clpwf-carousel .item');
111
112      let clpWayfindingTimeline = new TimelineLite();
113          clpWayfindingTimeline.staggerFrom(clpWayfindingItems, 0.75, { autoAlpha: 0, bottom: -20 }, 0.25, 0);
114
115      let clpWayfindingScene = new ScrollMagic.Scene();
116          clpWayfindingScene.setTween(clpWayfindingTimeline)
117                                 .triggerElement('.fp-clp-wayfinding')
118                                 .triggerHook("onEnter")
119                                 .addTo(controller);
120    };
121
122    m.extendedClpWayfinding = function() {
123      let extendedClpWayfindingItems = $('.fp-extended-category-wayfinding .ecwf-carousel .owl-item:not(.cloned) .item'); // Target items
124
125      let extendedClpWayfindingTimeline = new TimelineLite();
126          // Match fp-4-up animation (fade from top, 0.25s stagger)
127          extendedClpWayfindingTimeline.staggerFrom(extendedClpWayfindingItems, 0.75, { autoAlpha: 0, top: 20 }, 0.25); 
128
129      let extendedClpWayfindingScene = new ScrollMagic.Scene();
130          extendedClpWayfindingScene.setTween(extendedClpWayfindingTimeline)
131                                 .triggerElement('.fp-extended-category-wayfinding')
132                                 .triggerHook("onEnter")
133                                 .reverse(false) // Ensure it only plays once on enter
134                                 .addTo(controller);
135    };
136
137    m.clpEducation1 = function() {
138      let clpEducation1Heading = $('.fp-clp-education-1 h3'),
139          clpEducation1Paragraph = $('.fp-clp-education-1 .head p'),
140          clpEducation1Highlights = $('.fp-clp-education-1 .highlights'),
141          clpEducation1Timeline = new TimelineLite(),
142          clpEducation1Scene = new ScrollMagic.Scene();
143
144      clpEducation1Timeline.from(clpEducation1Heading, 1, { autoAlpha: 0, top: -20 })
145                           .from(clpEducation1Paragraph, 1, { autoAlpha: 0, top: -20 }, "-=0.5")
146                           .from(clpEducation1Highlights, 1, { autoAlpha: 0, top: -20 }, "-=0.5"); 
147
148      clpEducation1Scene.setTween(clpEducation1Timeline)
149                        .triggerElement('.fp-clp-education-1')
150                        .triggerHook("onEnter")
151                        .reverse(false)
152                        .addTo(controller);
153    };
154
155    m.clpEducation2 = function() {
156      let clpEducation2Head = $('.fp-clp-education-2 .head'),
157          clpEducation2Highlights = $('.fp-clp-education-2 .highlights'),
158          clpEducation2Timeline = new TimelineLite(),
159          clpEducation2Scene = new ScrollMagic.Scene();
160
161      clpEducation2Timeline.from(clpEducation2Head, 1, { autoAlpha: 0, top: -20 })
162                           .from(clpEducation2Highlights, 1, { autoAlpha: 0, top: -20 }, "-=0.5");
163
164      clpEducation2Scene.setTween(clpEducation2Timeline)
165                        .triggerElement('.fp-clp-education-2')
166                        .triggerHook("onEnter")
167                        .reverse(false)
168                        .addTo(controller);
169    };
170
171    m.uniqueSellingPoints = function() {
172      let uspHeading1 = $('.fp-unique-selling-points .one h3'),
173      	uspParagraph1 = $('.fp-unique-selling-points .one p'),
174      	uspHeading2 = $('.fp-unique-selling-points .two h3'),
175      	uspParagraph2 = $('.fp-unique-selling-points .two p'),
176      	uspHeading3 = $('.fp-unique-selling-points .three h3'),
177      	uspParagraph3 = $('.fp-unique-selling-points .three p');
178
179      let uspTimeline = new TimelineLite();
180      	  uspTimeline.from(uspHeading1, 1, { autoAlpha: 0, top: -20 })
181                     .from(uspParagraph1, 1, { autoAlpha: 0, bottom: -20 }, "-=1.0")
182                     .from(uspHeading2, 1, { autoAlpha: 0, top: -20 }, "-=0.5")
183                     .from(uspParagraph2, 1, { autoAlpha: 0, top: 20 }, "-=1.0")
184                     .from(uspHeading3, 1, { autoAlpha: 0, top: -20 }, "-=0.5")
185                     .from(uspParagraph3, 1, { autoAlpha: 0, top: 20 }, "-=1.0");
186
187        let uspScene = new ScrollMagic.Scene();
188      		  uspScene.setTween(uspTimeline)
189      				      .triggerElement('.fp-unique-selling-points')
190      				      .triggerHook("onEnter")
191      				      .reverse(false)
192      			        .addTo(controller);
193    };
194
195    m.flagshipProducts = function() {
196      let flagshipHeading = $('.fp-flagship-products h2'),
197          flagshipParagraph = $('.fp-flagship-products .align p'),
198          flagshipTabs = $('.fp-flagship-products .nav-tabs'),
199          flagshipTabContent = $('.fp-flagship-products .tab-content'),
200          flagshipTimeline = new TimelineLite(),
201          flagshipScene = new ScrollMagic.Scene();
202
203      flagshipTimeline.from(flagshipHeading, 1, { autoAlpha: 0, top: 20 })
204                      .from(flagshipParagraph, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
205                      .from(flagshipTabs, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
206                      .from(flagshipTabContent, 1, { autoAlpha: 0, top: 20 }, "-=1");
207
208      flagshipScene.setTween(flagshipTimeline)
209                   .triggerElement('.fp-flagship-products')
210                   .triggerHook(0.5)
211                   .reverse(false)
212                   .addTo(controller);
213    };
214
215    m.flagshipProductsMinimal = function() {
216      let flagshipHeading = $('.fp-flagship-products-minimal h2'),
217          flagshipParagraph = $('.fp-flagship-products-minimal .content > p'),
218          flagshipBtn = $('.fp-flagship-products-minimal .content > .btn'),
219          flagshipTimeline = new TimelineLite(),
220          flagshipScene = new ScrollMagic.Scene();
221
222      flagshipTimeline.from(flagshipHeading, 1, { autoAlpha: 0, top: 20 })
223                      .from(flagshipParagraph, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
224                      .from(flagshipBtn, 1, { autoAlpha: 0, top: 20 }, "-=0.5");
225
226      flagshipScene.setTween(flagshipTimeline)
227                   .triggerElement('.fp-flagship-products-minimal')
228                   .triggerHook(0.5)
229                   .reverse(false)
230                   .addTo(controller);
231    };
232
233    m.brandPillars = function() {
234
235      //pillar intro tween
236      let pillarIntroHeading = $('.pillar-intro h2'),
237          pillarIntroCopy = $('.pillar-intro .copy'),
238          pillarIntroLine = $('.pillar-intro .pillar-line'),
239          pillar1 = $('#pillar-1 .intro'),
240          pillarIntroTimeline = new TimelineLite(),
241          pillarIntroScene = new ScrollMagic.Scene();
242
243      pillarIntroTimeline.from(pillarIntroHeading, 1, { autoAlpha: 0, top: 20 })
244                    .from(pillarIntroCopy, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
245                    .from(pillarIntroLine, 2, { height:0 })
246                    .from(pillar1, 1, { autoAlpha: 0});
247
248      pillarIntroScene.setTween(pillarIntroTimeline)
249                   .triggerElement('.fp-brand-pillars')
250                   .triggerHook("onEnter")
251                   .reverse(false)
252                   .addTo(controller);
253
254      //create tween for each .pillar element
255      $('.fp-brand-pillars .pillar').each(function(){
256        let curId = $(this).attr("id");
257        setPillarTween('#' + curId);
258        //if element has video load create video tween
259        if($('#' + curId + ' video').length && windowWidth > 1023){
260          //m.setScrollingVideo('#' + curId);
261        }
262      });
263
264      function setPillarTween(elementId){
265        let pillarHeading = $(elementId + ' h3'),
266            pillarParagraph = $(elementId + ' .copy'),
267            pillarBtn = $(elementId + ' a'),
268            pillarTimeline = new TimelineLite(),
269            pillarScene = new ScrollMagic.Scene();
270
271        pillarTimeline.from(pillarHeading, 1, { autoAlpha: 0, top: 20 })
272                      .from(pillarParagraph, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
273                      .from(pillarBtn, 1, { autoAlpha: 0, top: 20 }, "-=0.5");
274
275        pillarScene.setTween(pillarTimeline)
276                     .triggerElement(elementId)
277                     .triggerHook(0.5)
278                     .reverse(false)
279                     .addTo(controller);
280      }
281
282    };
283
284    m.quoteGenerator = function() {
285      let randomQuoteParagraph = $('.fp-quote p'),
286          randomQuoteCite = $('.fp-quote cite'),
287          randomQuoteTimeline = new TimelineLite(),
288          randomQuoteScene = new ScrollMagic.Scene();
289
290          randomQuoteTimeline.from(randomQuoteParagraph, 1, { autoAlpha: 0, top: 20 }, "+=0.25")
291                        .from(randomQuoteCite, 1, { autoAlpha: 0, top: 20}, "-=0.25"); 
292
293          randomQuoteScene.setTween(randomQuoteTimeline)
294                     .triggerElement('.fp-quote')
295                     .triggerHook(0.9)
296                     .reverse(false)
297                     .addTo(controller);
298       
299    };
300
301    m.inspirationModule = function() {
302
303
304      // inspiration title setTween
305      let inspirationTitle = $('.fp-inspiration-module h2'),
306          inspirationTitleTimeline = new TimelineLite(),
307          inspirationTitleScene = new ScrollMagic.Scene();
308
309      inspirationTitleTimeline.from(inspirationTitle, 1, { autoAlpha: 0, top: 20 });
310
311      inspirationTitleScene.setTween(inspirationTitleTimeline)
312                   .triggerElement('.fp-inspiration-module')
313                   .triggerHook(0.5)
314                   .reverse(false)
315                   .addTo(controller);
316
317       // inspiration button setTween
318       //let inspirationButton = $('.inspiration-show-more .btn'),
319           //inspirationButtonTimeline = new TimelineLite(),
320           //inspirationButtonScene = new ScrollMagic.Scene();
321
322       //inspirationButtonTimeline.from(inspirationButton, 1, { autoAlpha: 0, top: -20 });
323
324       //inspirationButtonScene.setTween(inspirationButtonTimeline)
325                    //.triggerElement('.inspiration-show-more')
326                    //.triggerHook(0.9)
327                    //.reverse(false)
328                    //.addTo(controller);
329
330       //create tween for each .case-study element
331       $('.fp-inspiration-module .case-study').each(function(){
332         let curId = $(this).attr("id");
333
334         if(windowWidth < 1024 || (windowWidth > 1023 && curId==='case-study-2')){
335           setSmallScreenInspirationModuleTween('#' + curId);
336         } else {
337           setLargeScreenInspirationModuleTween('#' + curId);
338         }
339         if(windowWidth > 1023){
340           //if element has video load create video tween
341           if($('#' + curId + ' video').length){
342             //m.setScrollingVideo('#' + curId);
343           }
344         }
345        });
346
347        function setSmallScreenInspirationModuleTween(elementId){
348          // change animation element of metadata
349          let metaDataAnimationTarget = null;
350          if(windowWidth < 1024){
351            metaDataAnimationTarget = ' .case-study-meta dl';
352          }else{
353            metaDataAnimationTarget = ' .case-study-meta dl > *';
354          }
355          let   inspirationMetadata = $(elementId + metaDataAnimationTarget),
356                inspirationHeading = $(elementId + ' h3'),
357                inspirationParagraph = $(elementId + ' .content p'),
358                inspirationLink = $(elementId + ' .content a'),
359                inspirationTimeline = new TimelineLite(),
360                inspirationScene = new ScrollMagic.Scene();
361
362                inspirationTimeline.staggerFrom(inspirationMetadata, 0.75, { autoAlpha: 0, left: 20 }, 0.25)
363                                   .from(inspirationHeading, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
364                                   .from(inspirationParagraph, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
365                                   .from(inspirationLink, 1, { autoAlpha: 0, top: 20 }, "-=0.5");
366
367                inspirationScene.setTween(inspirationTimeline)
368                             .triggerElement(elementId)
369                             .triggerHook(0.5)
370                             .reverse(false)
371                             .addTo(controller);
372        }
373
374        function setLargeScreenInspirationModuleTween(elementId){
375          let   inspirationMetadata = $(elementId + ' .case-study-meta dl > *'),
376                inspirationHeading = $(elementId + ' .content h3'),
377                inspirationParagraph = $(elementId + ' .content p'),
378                inspirationLink = $(elementId + ' .content a'),
379                inspirationTimeline = new TimelineLite(),
380                inspirationScene = new ScrollMagic.Scene();
381
382                inspirationTimeline.staggerFrom(inspirationMetadata, 0.75, { autoAlpha: 0, right: -20 }, 0.25)
383                                   .from(inspirationHeading, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
384                                   .from(inspirationParagraph, 1, { autoAlpha: 0, top: 20 }, "-=0.5")
385                                   .from(inspirationLink, 1, { autoAlpha: 0, top: 20 }, "-=0.5");
386
387
388                inspirationScene.setTween(inspirationTimeline)
389                             .triggerElement(elementId)
390                             .triggerHook(0.5)
391                             .reverse(false)
392                             .addTo(controller);
393        }
394    };
395
396    m.genericModuleAnimation = function(container) {
397
398      //create tween for each container .row > div element
399      $(container).each(function(){
400        let genericModuleCol = $(this).find('.row > div'),
401        genericModuleTimeline = new TimelineLite(),
402        genericModuleScene = new ScrollMagic.Scene();
403
404        genericModuleTimeline.staggerFrom(genericModuleCol, 0.75, { autoAlpha: 0, top: 20 }, 0.25);
405
406        genericModuleScene.setTween(genericModuleTimeline)
407                     .triggerElement(this)
408                     .triggerHook('onEnter')
409                     //.addIndicators()
410                     .reverse(false)
411                     .addTo(controller);
412      });
413
414    };
415
416    return m;
417
418})();
419
420//INIT
421fpaAnimation.init();
422/* eslint-disable linebreak-style */
423var brandIntro = (function () {
424    'use strict';
425
426    // variables
427    var m = {},
428    vh = window.innerHeight * 0.01,
429    vhPixel;
430
431
432    m.init = function () {
433      // show scroll arrow
434      setTimeout(m.showArrow, 5000);
435      m.setHeight();
436
437      if ($('.fp-brand-intro-small').length) {
438        m.setContentHeight();
439      }
440
441      $( window ).resize(function() { 
442        m.setContentHeight();
443        m.setHeight();
444      });
445    };
446    
447    m.showArrow = function () {
448      $('.fp-brand-intro .scroll-indicator').fadeIn('slow'); 
449    };
450
451    m.setHeight = function() {
452      vh = window.innerHeight * 0.01;
453      vhPixel = vh + 'px';
454      document.documentElement.style.setProperty('--vh', vhPixel);
455    };
456
457    m.setContentHeight = function () {
458      var headerHeight = $('header').height(); 
459      var moduleHeight = $('.fp-brand-intro-small').height();
460      var tabsHeight = 0;
461      if($('.fp-hero-tabs').length){
462        tabsHeight = $('.fp-hero-tabs').height();
463      }
464
465      $('.fp-brand-intro-small .content').css('height', moduleHeight - headerHeight - tabsHeight);
466      $('.fp-brand-intro-small .content').css('bottom', tabsHeight);
467
468    };
469
470    return m;
471})();
472
473// INIT
474if ($('.fp-brand-intro').length) {
475  brandIntro.init();
476}
477var brandPillars = (function () {
478  "use strict";
479
480  //variables
481  var m = {},
482      toggleLink = '.toggle-expand',
483      closeLink = '.close-panel';
484
485
486  m.init = function() {
487    //add click events
488    m.addClickEvents();
489  };
490
491  // Add click events
492  m.addClickEvents = function() {
493    //Scroll to content then expand more content
494    $(toggleLink).click(function(e){
495        e.preventDefault();
496
497        var target = e.target.hash,
498            source = target.replace('-content', ''),
499            buttonClosePanelText = e.target.getAttribute('data-panel-closed-text'),
500            buttonOpenPanelText = e.target.getAttribute('data-panel-open-text');
501
502        if ($(target).is(':visible')) {
503          source = e.target.hash.replace('-content', '');
504          e.target.textContent = buttonOpenPanelText;
505        } else {
506          source = target;
507          e.target.textContent = buttonClosePanelText;
508        }
509
510        $(target).slideToggle();
511        $('html, body').animate({
512          scrollTop: $(source).offset().top}, 250);
513        });
514
515    $(closeLink).click(function(e){
516      e.preventDefault();
517      var target = e.target.hash,
518          source = target + '-content',
519          buttonOpenPanelText = $(toggleLink).attr('data-panel-open-text');
520
521          $(target + ' a').text(buttonOpenPanelText);
522
523        $('html, body').animate({
524          scrollTop: $(target).offset().top}, 500, function() {
525            setTimeout(function() {
526              $(source).slideUp('slow');
527            }, 250);
528
529          });
530    });
531  };
532
533  return m;
534
535})();
536
537//INIT
538if($('.fp-brand-pillars').length){
539  brandPillars.init();
540}// Article navigation
541document.addEventListener("DOMContentLoaded", function() {
542    
543	if( $('.fp-article-page-nav').length) {
544		// Only run if article page nav exists
545		
546		// define variables for later use
547		var articleNavigation = $('.fp-article-page-nav'),
548			articleLinks = articleNavigation.find("a"),
549			articleNavigationOffsetTop = articleNavigation.offset().top,
550			lastId = null,
551			totalNavHeight = articleNavigation.outerHeight(),
552			scrollItems = articleLinks.map(function() {
553				var item = $($(this).attr("href"));
554				if (item.length) {
555					return item;
556				}
557			});
558	
559		// user clicks on menu, scroll to section
560		articleLinks.click(function(e) {
561			e.preventDefault();
562			var additionalHeight = null;
563			if (!$(articleNavigation).hasClass('fixed')) {
564				additionalHeight = 78;
565			}
566	
567			var href = $(this).attr("href"),
568			offsetTop = $(href).offset().top - totalNavHeight - additionalHeight;
569			
570			$('html, body').stop().animate({scrollTop: offsetTop + 1,}, 500, "linear", function(){});
571			
572			setPageNavigation(href);
573		});
574	
575		// highlight the correct link as the user scrolls down the page
576		$(window).on('scroll', function() {
577			// stick/unstick nav to top of page when scrolling past
578			if ($(this).scrollTop() > articleNavigationOffsetTop) {
579				articleNavigation.addClass('fixed');
580			} else {
581				articleNavigation.removeClass('fixed');
582			}
583	
584			// change active link on scroll
585			var fromTop = $(this).scrollTop() + totalNavHeight;
586			var cur = scrollItems.map(function() {
587				if ($(this).offset().top < fromTop){
588					return this;
589				}
590			});
591	
592			cur = cur[cur.length - 1];
593			var id = cur && cur.length ? cur[0].id : "";
594	
595			if (lastId !== id) {
596				lastId = id;
597				id = "#" + id;
598		
599				setPageNavigation(id);
600			}
601		});
602		
603	}
604	
605	function setPageNavigation(newId) {
606		articleLinks.removeClass("active");
607		articleLinks.filter('[href="' + newId + '"]').addClass("active");
608
609		var newlink = $("ul").find('[href="${newId}"]');
610		var linkOffset = newlink.offset().left + 20;
611
612		if(linkOffset < 20){
613			//scroll right
614			$(articleNavigation).stop().animate({
615				scrollLeft: 0,
616				}, 1000, "linear",function(){}
617			);
618		}else if(linkOffset > 300){
619			//scroll left
620			$(articleNavigation).stop().animate({
621				scrollLeft: 500,
622				},
623				1000,
624				"linear",
625				function(){}
626			);
627		}
628	}
629});/* eslint-disable strict */
630
631var extendedWayfinding = (function () {
632    'use strict';
633
634    // variables
635    var m = {};
636    var scrollbarWidth =
637        window.innerWidth - document.documentElement.clientWidth;
638    var numItems = document.querySelectorAll('#ecwf-carousel .item').length;
639    var extendedCategoryWayfinding = $('.fp-extended-category-wayfinding');
640    var curBreakpoint = 1024;
641
642    var clpCarouselEx = $('#ecwf-carousel');
643    var owlOptions = {
644        stagePadding: 0,
645        dots: false,
646        nav: false,
647        loop: true,
648        center: true,
649        autoWidth: true
650    };
651
652    switch (numItems) {
653        case 3:
654            curBreakpoint = 375;
655            break;
656        case 4:
657            curBreakpoint = 768;
658            break;
659        case 7:
660        case 8:
661        case 9:
662            curBreakpoint = 1330;
663            break;
664        default:
665    }
666
667    m.init = function () {
668        // Show Carousel based on number of items in the "#ecwf-carousel div container
669        if ($('.fp-extended-category-wayfinding').length) {
670            $(extendedCategoryWayfinding).on('load', function () {
671                if (numItems > 2) {
672                    m.showCarousel();
673                }
674            });
675            $(window).on('resize', function () {
676                if (numItems > 2) {
677                    m.showCarousel();
678                }
679            });
680        }
681    };
682
683    m.activateCarousel = function () {
684        clpCarouselEx.owlCarousel(owlOptions);
685        clpCarouselEx.removeClass('off');
686    };
687
688    m.deActivateCarousel = function () {
689        clpCarouselEx.addClass('off').trigger('destroy.owl.carousel');
690        clpCarouselEx.find('.owl-stage-outer').children(':eq(0)').unwrap();
691    };
692
693    m.showCarousel = function () {
694        if ($(window).width() + scrollbarWidth < curBreakpoint) {
695            m.activateCarousel();
696        } else {
697            m.deActivateCarousel();
698        }
699    };
700
701    return m;
702})();
703
704// INIT
705extendedWayfinding.init();
706flagshipProducts = (function () {
707    "use strict";
708
709    //variables
710    var m = {},
711        tabLinks = '.nav-tabs a',
712        imageContainer = '.image-wrap .image',
713        replaceImageClass = 'image image-';
714
715
716    m.init = function() {
717        m.addClickEvents();
718    };
719
720    // Add click events
721    m.addClickEvents = function() {
722      //extent bootstrap tab to swap out image as well
723      $(tabLinks).click(function(e){
724          e.preventDefault();
725          $(this).tab('show');
726          var idx = $(this).index(tabLinks) + 1;
727          //$(imageContainer).removeClass().addClass(replaceImageClass + idx);
728          $(this).closest('.fp-flagship-products').find(imageContainer).removeClass().addClass(replaceImageClass + idx);  
729
730      });
731    };
732
733    return m;
734
735})();
736
737//INIT
738if($('.fp-flagship-products').length){
739  flagshipProducts.init();
740}
741document.addEventListener("DOMContentLoaded", function () {
742    $('.select').on('click', function () {
743      $(this).toggleClass('opened');
744    });
745    $('.select').on('focusout', function () {
746      if ($(this).hasClass('opened')) {
747        $(this).toggleClass('opened');
748      }
749    });
750    $('#country-select').on('change', function () {
751      var url = $(this).val();
752      if (url) {
753        window.location = window.location.protocol + "//" + window.location.hostname + url; //redirect specific to each site
754      }
755      return false;
756    });
757  });
758/* eslint-disable linebreak-style */
759/* eslint-disable one-var */
760var heroTabs = (function () {
761    'use strict';
762
763    // variables
764    var m = {};
765    var scrollableElement = $('.fp-hero-tabs ul');
766    var selectedItem = $('.fp-hero-tabs .selected');
767    var offset = selectedItem.offset();
768
769
770    m.init = function () {
771      // if selected item is not in viewport
772      // trigger function to move it into view
773      if (!m.isElementInViewport()) {
774        m.scrollSelectedItem();
775      }
776    };
777
778    m.scrollSelectedItem = function () {
779      $(scrollableElement).scrollLeft(offset.left - 16);
780    };
781
782    m.isElementInViewport = function () {
783      // special bonus for those using jQuery
784      if (typeof jQuery === 'function' && selectedItem instanceof jQuery) {
785        selectedItem = selectedItem[0];
786      }
787      var selectedBox = selectedItem.getBoundingClientRect();
788      return (
789        selectedBox.top >= 0 &&
790        selectedBox.left >= 0 &&
791        selectedBox.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */
792        selectedBox.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */
793      );
794    };
795    return m;
796})();
797
798// INIT
799if ($('.fp-hero-tabs').length) {
800  heroTabs.init();
801}
802var npiLandingPage = (function () {
803  // "use strict";
804
805  //variables
806  var m = {},
807    controller = new ScrollMagic.Controller();
808  $('.bg-box').height($(document).height());
809
810  m.init = function () {
811    // Quote Module
812    if ($('.container-hero').length) {
813      m.videoFrame1();
814    }
815
816    if ($('.container-series').length) {
817      m.videoFrame2();
818    }
819
820    if ($('.container-cohesion').length) {
821      m.videoFrame3();
822    }
823
824    if ($('.container-products').length) {
825      m.videoFrame4();
826    }
827
828  };
829
830  const html = document.documentElement;
831  // const textContent = document.querySelector('.text-content');
832  // const textContent2 = document.querySelector('.text-content2');
833  // const textContentHeight = textContent.offsetHeight;
834
835  m.scroll = window.requestAnimationFrame ||
836    function (callback) {
837      window.setTimeout(callback, 1000 / 60);
838    };
839
840  // const elementsToShow = document.querySelectorAll('.show-on-scroll');
841
842  // let log = console.log;
843
844  m.isElementInViewport = function (element) {
845    let rect = element.getBoundingClientRect();
846    return (
847      (rect.top <= 0 && rect.bottom >= 0) || (rect.bottom >= (window.innerHeight || document.documentElement.clientHeight) &&
848        rect.top <= (window.innerHeight || document.documentElement.clientHeight)) || (rect.top >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight))
849    );
850  };
851
852  /**
853   * By Ken Fyrstenberg Nilsen
854   *
855   * drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]])
856   *
857   * If image and context are only arguments rectangle will equal canvas
858  */
859  m.drawImageProp = function (ctx, img, x, y, w, h, offsetX, offsetY) {
860
861    if (arguments.length === 2) {
862      x = y = 0;
863      w = ctx.canvas.width;
864      h = ctx.canvas.height;
865    }
866
867    // default offset is center
868    offsetX = typeof offsetX === "number" ? offsetX : 0.5;
869    offsetY = typeof offsetY === "number" ? offsetY : 0.5;
870
871    // keep bounds [0.0, 1.0]
872    if (offsetX < 0) { offsetX = 0; }
873    if (offsetY < 0) { offsetY = 0; }
874    if (offsetX > 1) { offsetX = 1; }
875    if (offsetY > 1) { offsetY = 1; }
876
877    var iw = img.width,
878      ih = img.height,
879      r = Math.min(w / iw, h / ih),
880      nw = iw * r,   // new prop. width
881      nh = ih * r,   // new prop. height
882      cx, cy, cw, ch, ar = 1;
883
884    // decide which gap to fill    
885    if (nw < w) { ar = w / nw; }
886    if (Math.abs(ar - 1) < 1e-14 && nh < h) { ar = h / nh; }  // updated
887    nw *= ar;
888    nh *= ar;
889
890    // calc source rectangle
891    cw = iw / (nw / w);
892    ch = ih / (nh / h);
893
894    cx = (iw - cw) * offsetX;
895    cy = (ih - ch) * offsetY;
896
897    // make sure source rectangle is valid
898    if (cx < 0) { cx = 0; }
899    if (cy < 0) { cy = 0; }
900    if (cw > iw) { cw = iw; }
901    if (ch > ih) { ch = ih; }
902
903    // fill image in dest. rectangle
904    ctx.drawImage(img, cx, cy, cw, ch, x, y, w, h);
905  };
906
907  m.loadFrames = function (media, frameCount, canvasEl, triggerEl) {
908
909    const currentFrame = index => (
910      `${media}${index.toString().padStart(4, '0')}.jpg`
911    );
912
913    const canvas = document.querySelector('#' + canvasEl);
914    const triggerElement = document.querySelector(triggerEl);
915    const context = canvas.getContext('2d');
916    context.canvas.width = window.innerWidth;
917    context.canvas.height = window.Height;
918
919    // const frameCount = 359;
920    canvas.height = window.innerWidth;
921    canvas.height = window.innerHeight;
922    const img = new Image();
923    img.src = currentFrame(1);
924    img.onload = function () {
925      // context.drawImage(img, 0, 0);
926      m.drawImageProp(context, img, 0, 0, canvas.width, canvas.height);
927    };
928
929    const updateImage = index => {
930
931      img.src = currentFrame(index);
932      // context.drawImage(img, 0, 0);
933      m.drawImageProp(context, img, 0, 0, canvas.width, canvas.height);
934    };
935
936    // Preload images
937    // for (let i = 1; 1 < frameCount; i++) {
938    //   const img = new Image();
939    //   img.src = currentFrame(i);
940    //   log('From Preload Images: ', img.src);
941    // }
942
943    // const maxScrollTop = triggerElement.getBoundingClientRect().bottom - window.innerHeight;
944    // const topOfTriggerElement = triggerElement.getBoundingClientRect().top;
945    document.addEventListener('scroll', () => {
946
947      // $(this).addClass('isActive');
948      if (m.isElementInViewport(triggerElement)) {
949      // const scrollTop = html.scrollTop - triggerElement.getBoundingClientRect().top;
950        const scrollTop = html.scrollTop;
951        console.log(scrollTop);
952        // const maxScrollTop = html.scrollHeight - window.innerHeight;
953        const maxScrollTop = html.scrollHeight - triggerElement.innerHeight;
954        // const maxScrollTop = html.scrollHeight - (triggerElement.getBoundingClientRect().height - window.innerHeight);
955        // const maxScrollTop = triggerElement.getBoundingClientRect().height - window.innerHeight;
956        const scrollFraction = scrollTop / maxScrollTop;
957        const frameIndex = Math.min(frameCount - 1, Math.floor(scrollFraction * frameCount));
958
959        //  Text Content Scrolling
960        requestAnimationFrame(() => updateImage(frameIndex + 1));
961
962      }
963    });
964
965  };
966
967
968  m.animateBlock = function (element) {
969
970    $(element).each(function () {
971
972      // Loop through all elements with a class fade-el
973      var animateBlock = new TimelineLite();
974      
975      // Create a new Timeline for the tween
976      animateBlock.from($(this), 1.5, {autoAlpha: 0, y: '+=100, ease:Linear.easeNone'});
977      animateBlock.to($(this), 1.5, {delay: 5, autoAlpha: 0, y: '-=50, ease:Linear.easeNone' });
978      
979      //  Create a scene
980      var blockAnimScene = new ScrollMagic.Scene();
981      
982      // Set the Scene
983      blockAnimScene.setTween(animateBlock)
984      .triggerElement(this)
985      .duration(750)
986        .setPin(this, {
987          pushFollowers: false
988        })
989      .addTo(controller);
990    });
991  };
992
993  m.setHeight = function(dataAttr) {
994    let textContainer = document.querySelectorAll(`[${dataAttr}]`);
995
996    textContainer.forEach((container) => {
997      let setHeight = container.dataset.containerHeight.toString();
998      container.style.height = setHeight;
999    });
1000  };
1001
1002  m.setHeight('data-container-height');
1003
1004  m.setBackground = function() {
1005    let panels = document.querySelectorAll('.panel');
1006    window.addEventListener('scroll', () => {
1007      panels.forEach((panel) => {
1008
1009        var contentPanel = String(panel.dataset.content);
1010        if(m.isElementInViewport(document.querySelector(contentPanel))) {
1011          panels.forEach(el => el.classList.remove('isActive'));
1012          
1013          panel.classList.add('isActive');
1014        }
1015      });
1016    });
1017  };
1018
1019  m.setBackground();
1020
1021
1022  m.videoFrame1 = function () {
1023    m.animateBlock('.textAnimate');
1024
1025    var containerIntroTimeline = new TimelineLite(),
1026      containerIntroScene = new ScrollMagic.Scene();
1027
1028    containerIntroScene.setTween(containerIntroTimeline)
1029      .triggerElement('.container-intro')
1030      .on('start', function () {
1031        const element = document.querySelector('.panel-2');
1032        const media = element.dataset.media;
1033        const canvasEl = element.dataset.videoid;
1034        const content = element.dataset.content;
1035        const frames = parseInt(element.dataset.frames);
1036        m.loadFrames(media, frames, canvasEl, content);
1037      })
1038      .triggerHook(0)
1039      .reverse(true)
1040      // .addIndicators() // add indicators (requires plugin)
1041      .addTo(controller);
1042
1043  };
1044
1045  m.videoFrame2 = function () {
1046    var containerSeriesTimeline = new TimelineLite(),
1047      containerSeriesScene = new ScrollMagic.Scene();
1048
1049    containerSeriesScene.setTween(containerSeriesTimeline)
1050      .triggerElement('.container-series')
1051      .on('start', function () {
1052        const element = document.querySelector('.panel-3');
1053        const media = element.dataset.media;
1054        const canvasEl = element.dataset.videoid;
1055        const content = element.dataset.content;
1056        const frames = parseInt(element.dataset.frames);
1057        m.loadFrames(media, frames, canvasEl, content);
1058      })
1059      // .setClassToggle('.panel-1', 'isActive')
1060      // .on('start', function () {
1061      //   $('.panel-1').removeClass('isActive');
1062      //   $('.panel-2').addClass('isActive');
1063      // })
1064      .triggerHook(0)
1065      .reverse(true)
1066      // .addIndicators() // add indicators (requires plugin)
1067      .addTo(controller);
1068  
1069
1070  };
1071
1072
1073
1074  m.videoFrame3 = function () {
1075    m.animateBlock('.container-cohesion div.animate');
1076
1077    var containerCohesionTimeline = new TimelineLite(),
1078      containerCohesionScene = new ScrollMagic.Scene();
1079
1080    containerCohesionScene.setTween(containerCohesionTimeline)
1081      .triggerElement('.container-cohesion')
1082      // .setClassToggle('.canvas-wrapper-22', 'isActive')
1083      .on('start', function () {
1084        // $('.panel div:first-child').removeClass('isActive');
1085        // $('.canvas-wrapper-22').addClass('isActive');
1086      })
1087      .triggerHook(0)
1088      .reverse(true)
1089      .addTo(controller);
1090
1091  };
1092
1093  m.videoFrame3 = function () {
1094    // const frameCount = 359;
1095    // const media = 'https://res.cloudinary.com/dxgcygglu/image/upload/v1612221229/poc/blackglass4/';
1096    // const canvasEl = 'scrollable-video-3';
1097    // const wrapperClass = '.canvas-wrapper-3';
1098    // const triggerEl = '.container-products';
1099
1100    // m.animateBlock('.container-series');
1101    // m.loadFrames(media, frameCount, canvasEl, wrapperClass, triggerEl);
1102
1103  };
1104
1105  return m;
1106
1107})();
1108
1109npiLandingPage.init();let randomQuote = (function() {
1110    "use strict";
1111
1112    // variables
1113    let m = {};
1114    let quotes = document.querySelectorAll(".fp-quote blockquote"),
1115        randomNum = Math.floor(Math.random() * quotes.length);
1116
1117    m.init = function() {
1118        // Use randomNum to select an element and add display block inline style
1119        quotes[randomNum].style.display = "block";
1120    };
1121
1122    return m;
1123})();
1124
1125// INIT
1126if (document.querySelector(".fp-quote")) {
1127    randomQuote.init();
1128}
1129fpaVideo = (function () {
1130    "use strict";
1131
1132    //variables
1133    var m = {},
1134        windowWidth = window.innerWidth,
1135        fullViewportPlayer = '.full-width-video',
1136        curLoop = null;
1137
1138
1139    m.init = function() {
1140      if($(fullViewportPlayer) && $(fullViewportPlayer).length){
1141        $(fullViewportPlayer).on("loadedmetadata", m.scaleVideo);
1142        $(window).on("resize", m.scaleVideo);
1143      }
1144      m.addClickEvents();
1145      m.addHoverEvents();
1146    };
1147
1148    m.addClickEvents = function() {
1149      //play video
1150      $( ".play-video" ).click(function() {
1151        //get closest video player ID
1152        var playerId = '#' + $(this).parent().find('video').attr('id');
1153        var curSrc = $(this).parent().find('video').attr('src');
1154        //test if src has been set
1155        if(typeof curSrc !== typeof undefined && curSrc !== false){
1156          $(playerId)[0].play();
1157          $(this).fadeOut("slow");
1158        }else{
1159          m.loadVideo(playerId);
1160          $(playerId)[0].play();
1161          $(this).fadeOut("slow");
1162        }
1163        $(this).parent().find('.video-controls').fadeIn("slow");
1164
1165        $(playerId).on('ended',function(){
1166          $(this).parent().find('.play-video').fadeIn("slow");
1167          $(this).parent().find('.video-controls').fadeOut("slow");
1168          $(playerId)[0].currentTime = 0;
1169        });
1170      });
1171
1172      //enter full screenSize
1173      $( ".fullscreen-video" ).click(function() {
1174        //get closest video player ID
1175        var playerId = '#' + $(this).parent().parent().find('video').attr('id');
1176        if($(playerId)[0].requestFullScreen){
1177      		$(playerId)[0].requestFullScreen();
1178      	} else if($(playerId)[0].webkitRequestFullScreen){
1179      		$(playerId)[0].webkitRequestFullScreen();
1180      	} else if($(playerId)[0].mozRequestFullScreen){
1181      		$(playerId)[0].mozRequestFullScreen();
1182      	} else if($(playerId)[0].msRequestFullscreen){
1183      		$(playerId)[0].msRequestFullscreen();
1184      	}else if($(playerId)[0].webkitEnterFullscreen){
1185          $(playerId)[0].webkitEnterFullscreen();
1186        }else if($(playerId)[0].enterFullscreen){
1187          $(playerId)[0].enterFullscreen();
1188        }
1189      });
1190
1191      // toggle captions
1192      $( ".toggle-captions" ).click(function() {
1193        //get closest video player ID
1194        var videoId = '#' + $(this).parent().parent().find('video').attr('id');
1195        const tracks = $(videoId)[0].textTracks; // All <track> elements
1196
1197          if (!tracks || tracks.length === 0) { 
1198            return;
1199          }
1200
1201          const track = tracks[0]; // Use the first track (or loop for multiple languages)
1202
1203          // Toggle between showing and hiding
1204          if (track.mode === 'showing') {
1205            track.mode = 'hidden';   // Hide captions (but keep track loaded)
1206            $(this).addClass('off');
1207            $(this).text('Show Captions');
1208          } else {
1209            track.mode = 'showing';  // Show captions
1210            $(this).removeClass('off');
1211            $(this).text('Hide Captions');
1212          }
1213      });
1214
1215      //pause video
1216      $( ".pause-video" ).click(function() {
1217        //get closest video player ID
1218        var playerId = '#' + $(this).parent().parent().find('video').attr('id');
1219        //test if src has been set
1220        $(playerId)[0].pause();
1221        $(this).parent().parent().find('.play-video').fadeIn("slow");
1222        $(this).parent().fadeOut("slow");
1223      });
1224
1225      //toggle mute
1226      $( ".toggle-mute, .toggle-unmute" ).click(function() {
1227        //get closest video player ID
1228        var playerId = '#' + $(this).parent().parent().find('video').attr('id');
1229        //test if video has been muted
1230        $(playerId).prop("muted", !$(playerId).prop("muted")); 
1231
1232        if($(this ).hasClass('toggle-mute')){
1233          $(this).removeClass('toggle-mute').addClass('toggle-unmute');
1234        }else{
1235          $(this).removeClass('toggle-unmute').addClass('toggle-mute'); 
1236        }
1237        
1238      });
1239    };
1240
1241    m.addHoverEvents = function() {
1242      //SHOW HIDE CONTROLS
1243      //handle mouse enter
1244      $('.asset-wrapper, .image-wrap').on('mouseenter', function () {
1245        if($(this).find('.play-video').is(':hidden')){
1246          $(this).find('.video-controls').fadeIn("slow");
1247        }
1248      });
1249      //handle touch
1250      $('.asset-wrapper, .image-wrap').on('touchstart', function () {
1251        if($(this).find('.play-video').is(':hidden')){
1252          $(this).find('.video-controls').fadeIn("slow");
1253        }else{
1254          $(this).find('.video-controls').fadeOut("slow");
1255        }
1256      });
1257      //handle blur mouseleave
1258      $('.asset-wrapper, .image-wrap').on('blur, mouseleave', function () {
1259        if($(this).find('.play-video').is(':hidden')){
1260          $(this).find('.video-controls').fadeOut("slow");
1261        }
1262      });
1263    };
1264
1265
1266
1267    m.scaleVideo = function() {
1268      //get current window width and height
1269      var curWindowWidth = window.innerWidth,
1270          curWindowHeight = window.innerHeight;
1271
1272      //remove any existing styles
1273      $(fullViewportPlayer).removeAttr('style');
1274
1275      //get video height and width
1276      var videoNativeWidth = $(fullViewportPlayer).width();
1277      var videoNativeHeight = $(fullViewportPlayer).height();
1278
1279      //calculate whether we need to adjust the height or width
1280      var heightDifference = curWindowHeight - videoNativeHeight;
1281      var widthDifference = curWindowWidth - videoNativeWidth;
1282
1283      //only adjust the dimensions of the player if
1284      //the difference is not a negative number
1285      if(heightDifference >= 0 || widthDifference >= 0){
1286        if(heightDifference > widthDifference){
1287          $(fullViewportPlayer).height(curWindowHeight);
1288        }else{
1289          $(fullViewportPlayer).width(curWindowWidth);
1290        }
1291      }
1292      
1293      
1294    };
1295
1296    //load video for 1024 or higher
1297    m.loadVideo = function(playerId) {
1298
1299      //get video player
1300      //var playerId = '#' + $(vidPlayerId).attr('id');
1301      var lowResVersion = $(playerId).attr('data-src-low');
1302      var highResVersion = $(playerId).attr('data-src-hi');
1303      var screenSize = $(playerId).attr('data-screen-size');
1304      var loop = $(playerId).attr('data-loop');
1305      var triggerOnScroll = $(playerId).attr('data-trigger-on-scroll');
1306
1307      curLoop = loop;
1308
1309      //if screenSize = large only, load video on  devices greater than 1023
1310      if(screenSize === "large"){
1311        if(windowWidth > 1023 && windowWidth < 1400){
1312          if(lowResVersion && lowResVersion.length){
1313            $(playerId).attr("src",lowResVersion);
1314          }
1315        }else if(windowWidth > 1400){
1316          if(highResVersion && highResVersion.length){
1317            $(playerId).attr("src",highResVersion);
1318          }
1319        }
1320      }else{
1321        //load low res on all screen sizes < 1400
1322        if(windowWidth < 1400){
1323          if(lowResVersion && lowResVersion.length){
1324            $(playerId).attr("src",lowResVersion);
1325          }
1326        }else{
1327          if(highResVersion && highResVersion.length){
1328            $(playerId).attr("src",highResVersion);
1329          }
1330        }
1331      }
1332      //set loop
1333      if(loop === 'true'){
1334        $(playerId).attr('loop','loop');
1335      }
1336
1337      //set scroll triggers
1338      if(triggerOnScroll === 'true'){
1339        m.setVideoScrollTriggers(playerId);
1340      }
1341
1342      return;
1343    };
1344
1345    m.setVideoScrollTriggers = function(scrollPlayerId){
1346      var curVideoEnded = false;
1347
1348      //set variable if looping is set to false
1349      if(curLoop === 'false'){
1350        $(scrollPlayerId).on('ended',function(){
1351          curVideoEnded = true;
1352        });
1353      }
1354
1355      $(window).scroll(function() {
1356        var top_of_element = $(scrollPlayerId).offset().top + 300;
1357        var bottom_of_element = $(scrollPlayerId).offset().top + $(scrollPlayerId).outerHeight() - 300;
1358        var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
1359        var top_of_screen = $(window).scrollTop() ;
1360
1361        if(!curVideoEnded){
1362          if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
1363            $(scrollPlayerId)[0].play();
1364          } else {
1365            $(scrollPlayerId)[0].pause();
1366          }
1367        }
1368      });
1369    };
1370
1371    return m;
1372
1373})();
1374
1375//INIT
1376fpaVideo.init();

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.