govuk_publishing_components 24.13.2 → 24.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/analytics/analytics.js +3 -1
  3. data/app/assets/javascripts/govuk_publishing_components/analytics/custom-dimensions.js +2 -0
  4. data/app/assets/javascripts/govuk_publishing_components/components/accordion.js +6 -5
  5. data/app/assets/javascripts/govuk_publishing_components/components/checkboxes.js +9 -7
  6. data/app/assets/javascripts/govuk_publishing_components/components/contextual-guidance.js +6 -7
  7. data/app/assets/javascripts/govuk_publishing_components/components/cookie-banner.js +7 -7
  8. data/app/assets/javascripts/govuk_publishing_components/components/copy-to-clipboard.js +13 -12
  9. data/app/assets/javascripts/govuk_publishing_components/components/details.js +12 -18
  10. data/app/assets/javascripts/govuk_publishing_components/components/feedback.js +213 -215
  11. data/app/assets/javascripts/govuk_publishing_components/components/govspeak.js +4 -4
  12. data/app/assets/javascripts/govuk_publishing_components/components/modal-dialogue.js +6 -4
  13. data/app/assets/javascripts/govuk_publishing_components/components/print-link.js +4 -3
  14. data/app/assets/javascripts/govuk_publishing_components/components/reorderable-list.js +13 -13
  15. data/app/assets/javascripts/govuk_publishing_components/components/show-password.js +5 -4
  16. data/app/assets/javascripts/govuk_publishing_components/components/step-by-step-nav.js +4 -4
  17. data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/magna-charta.js +3 -3
  18. data/app/assets/javascripts/govuk_publishing_components/lib/header-navigation.js +6 -0
  19. data/app/assets/javascripts/govuk_publishing_components/lib/trigger-event.js +5 -3
  20. data/app/assets/javascripts/govuk_publishing_components/rum-loader.js.erb +36 -0
  21. data/app/assets/javascripts/govuk_publishing_components/vendor/lux/lux-polyfill.js +159 -0
  22. data/app/assets/javascripts/govuk_publishing_components/vendor/lux/lux.js +844 -0
  23. data/app/views/govuk_publishing_components/components/_government_navigation.html.erb +50 -8
  24. data/app/views/govuk_publishing_components/components/_layout_for_public.html.erb +4 -0
  25. data/app/views/govuk_publishing_components/components/_layout_header.html.erb +11 -2
  26. data/app/views/govuk_publishing_components/components/_search.html.erb +5 -2
  27. data/app/views/govuk_publishing_components/components/layout_header/_header_logo.html.erb +3 -3
  28. data/config/initializers/assets.rb +3 -0
  29. data/lib/govuk_publishing_components/presenters/content_breadcrumbs_based_on_priority.rb +32 -3
  30. data/lib/govuk_publishing_components/presenters/contextual_navigation.rb +1 -0
  31. data/lib/govuk_publishing_components/version.rb +1 -1
  32. metadata +5 -2
@@ -2,11 +2,11 @@ window.GOVUK = window.GOVUK || {}
2
2
  window.GOVUK.Modules = window.GOVUK.Modules || {};
3
3
 
4
4
  (function (Modules) {
5
- function Govspeak () { }
6
-
7
- Govspeak.prototype.start = function ($module) {
8
- this.$module = $module[0]
5
+ function Govspeak ($module) {
6
+ this.$module = $module
7
+ }
9
8
 
9
+ Govspeak.prototype.init = function () {
10
10
  if (this.$module.className.indexOf('disable-youtube') === -1) {
11
11
  this.embedYoutube()
12
12
  }
@@ -2,14 +2,16 @@ window.GOVUK = window.GOVUK || {}
2
2
  window.GOVUK.Modules = window.GOVUK.Modules || {};
3
3
 
4
4
  (function (Modules) {
5
- function ModalDialogue () { }
6
-
7
- ModalDialogue.prototype.start = function ($module) {
8
- this.$module = $module[0]
5
+ function ModalDialogue ($module) {
6
+ this.$module = $module
9
7
  this.$dialogBox = this.$module.querySelector('.gem-c-modal-dialogue__box')
10
8
  this.$closeButton = this.$module.querySelector('.gem-c-modal-dialogue__close-button')
11
9
  this.$html = document.querySelector('html')
12
10
  this.$body = document.querySelector('body')
11
+ }
12
+
13
+ ModalDialogue.prototype.init = function () {
14
+ if (!this.$dialogBox || !this.$closeButton) return
13
15
 
14
16
  this.$module.resize = this.handleResize.bind(this)
15
17
  this.$module.open = this.handleOpen.bind(this)
@@ -2,10 +2,11 @@ window.GOVUK = window.GOVUK || {}
2
2
  window.GOVUK.Modules = window.GOVUK.Modules || {};
3
3
 
4
4
  (function (Modules) {
5
- function PrintLink () { }
5
+ function PrintLink ($module) {
6
+ this.$module = $module
7
+ }
6
8
 
7
- PrintLink.prototype.start = function ($module) {
8
- this.$module = $module[0]
9
+ PrintLink.prototype.init = function () {
9
10
  this.$module.addEventListener('click', function () {
10
11
  window.print()
11
12
  })
@@ -3,13 +3,13 @@ window.GOVUK = window.GOVUK || {}
3
3
  window.GOVUK.Modules = window.GOVUK.Modules || {};
4
4
 
5
5
  (function (Modules) {
6
- function ReorderableList () { }
7
-
8
- ReorderableList.prototype.start = function ($module) {
9
- this.$module = $module[0]
6
+ function ReorderableList ($module) {
7
+ this.$module = $module
10
8
  this.$upButtons = this.$module.querySelectorAll('.js-reorderable-list-up')
11
9
  this.$downButtons = this.$module.querySelectorAll('.js-reorderable-list-down')
10
+ }
12
11
 
12
+ ReorderableList.prototype.init = function () {
13
13
  this.sortable = window.Sortable.create(this.$module, { // eslint-disable-line new-cap
14
14
  chosenClass: 'gem-c-reorderable-list__item--chosen',
15
15
  dragClass: 'gem-c-reorderable-list__item--drag',
@@ -26,14 +26,14 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
26
26
  }
27
27
 
28
28
  var boundOnClickUpButton = this.onClickUpButton.bind(this)
29
- this.$upButtons.forEach(function (button) {
30
- button.addEventListener('click', boundOnClickUpButton)
31
- })
29
+ for (var u = 0; u < this.$upButtons.length; u++) {
30
+ this.$upButtons[u].addEventListener('click', boundOnClickUpButton)
31
+ }
32
32
 
33
33
  var boundOnClickDownButton = this.onClickDownButton.bind(this)
34
- this.$downButtons.forEach(function (button) {
35
- button.addEventListener('click', boundOnClickDownButton)
36
- })
34
+ for (var d = 0; d < this.$downButtons.length; d++) {
35
+ this.$downButtons[d].addEventListener('click', boundOnClickDownButton)
36
+ }
37
37
  }
38
38
 
39
39
  ReorderableList.prototype.setupResponsiveChecks = function () {
@@ -85,9 +85,9 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
85
85
 
86
86
  ReorderableList.prototype.updateOrderIndexes = function () {
87
87
  var $orderInputs = this.$module.querySelectorAll('.gem-c-reorderable-list__actions input')
88
- $orderInputs.forEach(function (input, index) {
89
- input.setAttribute('value', index + 1)
90
- })
88
+ for (var i = 0; i < $orderInputs.length; i++) {
89
+ $orderInputs[i].setAttribute('value', i + 1)
90
+ }
91
91
  }
92
92
 
93
93
  ReorderableList.prototype.triggerEvent = function (element, eventName) {
@@ -2,11 +2,12 @@ window.GOVUK = window.GOVUK || {}
2
2
  window.GOVUK.Modules = window.GOVUK.Modules || {};
3
3
 
4
4
  (function (Modules) {
5
- function ShowPassword () { }
6
-
7
- ShowPassword.prototype.start = function ($module) {
8
- this.$module = $module[0]
5
+ function ShowPassword ($module) {
6
+ this.$module = $module
9
7
  this.input = this.$module.querySelector('.gem-c-input')
8
+ }
9
+
10
+ ShowPassword.prototype.init = function () {
10
11
  this.$module.togglePassword = this.togglePassword.bind(this)
11
12
  this.$module.revertToPasswordOnFormSubmit = this.revertToPasswordOnFormSubmit.bind(this)
12
13
  this.input.classList.add('gem-c-input--with-password')
@@ -6,10 +6,8 @@ window.GOVUK = window.GOVUK || {}
6
6
  window.GOVUK.Modules = window.GOVUK.Modules || {};
7
7
 
8
8
  (function (Modules) {
9
- function Gemstepnav () { }
10
-
11
- Gemstepnav.prototype.start = function ($module) {
12
- this.$module = $module[0]
9
+ function Gemstepnav ($module) {
10
+ this.$module = $module
13
11
  this.$module.actions = {} // stores text for JS appended elements 'show' and 'hide' on steps, and 'show/hide all' button
14
12
  this.$module.rememberShownStep = false
15
13
  this.$module.stepNavSize = false
@@ -18,7 +16,9 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
18
16
  this.$module.activeStepClass = 'gem-c-step-nav__step--active'
19
17
  this.$module.activeLinkHref = '#content'
20
18
  this.$module.uniqueId = false
19
+ }
21
20
 
21
+ Gemstepnav.prototype.init = function () {
22
22
  // Indicate that js has worked
23
23
  this.$module.classList.add('gem-c-step-nav--active')
24
24
 
@@ -462,11 +462,11 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
462
462
  var allCharts = document.querySelectorAll('table.js-barchart-table')
463
463
  var id = null
464
464
 
465
- allCharts.forEach(function (chart, i) {
466
- if (chart === module) {
465
+ for (var i = 0; i < allCharts.length; i++) {
466
+ if (allCharts[i] === module) {
467
467
  id = i
468
468
  }
469
- })
469
+ }
470
470
 
471
471
  return id
472
472
  }
@@ -21,8 +21,14 @@
21
21
 
22
22
  if (targetClass.indexOf('js-visible') !== -1) {
23
23
  target.setAttribute('class', targetClass.replace(/(^|\s)js-visible(\s|$)/, ''))
24
+ if (window.GOVUK.analytics && window.GOVUK.analytics.trackEvent) {
25
+ window.GOVUK.analytics.trackEvent('headerClicked', 'menuClosed', { label: 'none' })
26
+ }
24
27
  } else {
25
28
  target.setAttribute('class', targetClass + ' js-visible')
29
+ if (window.GOVUK.analytics && window.GOVUK.analytics.trackEvent) {
30
+ window.GOVUK.analytics.trackEvent('headerClicked', 'menuOpened', { label: 'none' })
31
+ }
26
32
  }
27
33
  if (sourceClass.indexOf('js-visible') !== -1) {
28
34
  this.setAttribute('class', sourceClass.replace(/(^|\s)js-visible(\s|$)/, ''))
@@ -2,15 +2,17 @@
2
2
  'use strict'
3
3
  window.GOVUK = window.GOVUK || {}
4
4
 
5
- window.GOVUK.triggerEvent = function (element, eventName) {
6
- var params = { bubbles: true, cancelable: true }
5
+ window.GOVUK.triggerEvent = function (element, eventName, parameters) {
6
+ var params = parameters || {}
7
+ params.bubbles = true
8
+ params.cancelable = true
7
9
  var event
8
10
 
9
11
  if (typeof window.CustomEvent === 'function') {
10
12
  event = new window.CustomEvent(eventName, params)
11
13
  } else {
12
14
  event = document.createEvent('CustomEvent')
13
- event.initCustomEvent(eventName, params.bubbles, params.cancelable, null)
15
+ event.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail)
14
16
  }
15
17
 
16
18
  element.dispatchEvent(event)
@@ -0,0 +1,36 @@
1
+ (function() {
2
+ var marker = document.getElementsByTagName('script')[0]
3
+ var scripts = [
4
+ '<%= path_to_javascript("govuk_publishing_components/vendor/lux/lux-polyfill") %>',
5
+ '<%= path_to_javascript("govuk_publishing_components/vendor/lux/lux") %>'
6
+ ]
7
+ var parsedCookie = (function() {
8
+ try {
9
+ var cookies = document.cookie.split(';')
10
+
11
+ for (var i = 0; i < cookies.length; i++) {
12
+ var cookie = cookies[i].replace(/\s/g, '') // Remove all whitespace.
13
+ var cookieName = 'cookies_policy='
14
+
15
+ if (cookie.indexOf(cookieName) === 0) {
16
+ return JSON.parse(cookie.substring(cookieName.length))
17
+ }
18
+ }
19
+ } catch (error) {
20
+ console.error(error)
21
+ }
22
+
23
+ return {}
24
+ })()
25
+
26
+ if (parsedCookie.usage === true) {
27
+ for (var i = 0; i < scripts.length; i++) {
28
+ var script = document.createElement('script')
29
+ script.src = scripts[i]
30
+ script.async = true
31
+ script.defer = true
32
+
33
+ marker.parentNode.insertBefore(script, marker)
34
+ }
35
+ }
36
+ })()
@@ -0,0 +1,159 @@
1
+ /* eslint-disable */
2
+
3
+ /*
4
+ * Part of Speedcurve's LUX script, which allows us to run real user metrics on
5
+ * pages using the public layout template.
6
+ *
7
+ * See docs/real-user-metrics.md for more information.
8
+ */
9
+
10
+ LUX = (function () {
11
+ var a =
12
+ "undefined" !== typeof LUX && "undefined" !== typeof LUX.gaMarks
13
+ ? LUX.gaMarks
14
+ : [];
15
+ var d =
16
+ "undefined" !== typeof LUX && "undefined" !== typeof LUX.gaMeasures
17
+ ? LUX.gaMeasures
18
+ : [];
19
+ var j = "LUX_start";
20
+ var k = window.performance;
21
+ var l =
22
+ "undefined" !== typeof LUX && LUX.ns
23
+ ? LUX.ns
24
+ : Date.now
25
+ ? Date.now()
26
+ : +new Date();
27
+ if (k && k.timing && k.timing.navigationStart) {
28
+ l = k.timing.navigationStart;
29
+ }
30
+ function f() {
31
+ if (k && k.now) {
32
+ return k.now();
33
+ }
34
+ var o = Date.now ? Date.now() : +new Date();
35
+ return o - l;
36
+ }
37
+ function b(n) {
38
+ if (k) {
39
+ if (k.mark) {
40
+ return k.mark(n);
41
+ } else {
42
+ if (k.webkitMark) {
43
+ return k.webkitMark(n);
44
+ }
45
+ }
46
+ }
47
+ a.push({ name: n, entryType: "mark", startTime: f(), duration: 0 });
48
+ return;
49
+ }
50
+ function m(p, t, n) {
51
+ if ("undefined" === typeof t && h(j)) {
52
+ t = j;
53
+ }
54
+ if (k) {
55
+ if (k.measure) {
56
+ if (t) {
57
+ if (n) {
58
+ return k.measure(p, t, n);
59
+ } else {
60
+ return k.measure(p, t);
61
+ }
62
+ } else {
63
+ return k.measure(p);
64
+ }
65
+ } else {
66
+ if (k.webkitMeasure) {
67
+ return k.webkitMeasure(p, t, n);
68
+ }
69
+ }
70
+ }
71
+ var r = 0,
72
+ o = f();
73
+ if (t) {
74
+ var s = h(t);
75
+ if (s) {
76
+ r = s.startTime;
77
+ } else {
78
+ if (k && k.timing && k.timing[t]) {
79
+ r = k.timing[t] - k.timing.navigationStart;
80
+ } else {
81
+ return;
82
+ }
83
+ }
84
+ }
85
+ if (n) {
86
+ var q = h(n);
87
+ if (q) {
88
+ o = q.startTime;
89
+ } else {
90
+ if (k && k.timing && k.timing[n]) {
91
+ o = k.timing[n] - k.timing.navigationStart;
92
+ } else {
93
+ return;
94
+ }
95
+ }
96
+ }
97
+ d.push({ name: p, entryType: "measure", startTime: r, duration: o - r });
98
+ return;
99
+ }
100
+ function h(n) {
101
+ return c(n, g());
102
+ }
103
+ function c(p, o) {
104
+ for (i = o.length - 1; i >= 0; i--) {
105
+ var n = o[i];
106
+ if (p === n.name) {
107
+ return n;
108
+ }
109
+ }
110
+ return undefined;
111
+ }
112
+ function g() {
113
+ if (k) {
114
+ if (k.getEntriesByType) {
115
+ return k.getEntriesByType("mark");
116
+ } else {
117
+ if (k.webkitGetEntriesByType) {
118
+ return k.webkitGetEntriesByType("mark");
119
+ }
120
+ }
121
+ }
122
+ return a;
123
+ }
124
+ return { mark: b, measure: m, gaMarks: a, gaMeasures: d };
125
+ })();
126
+ LUX.ns = Date.now ? Date.now() : +new Date();
127
+ LUX.ac = [];
128
+ LUX.cmd = function (a) {
129
+ LUX.ac.push(a);
130
+ };
131
+ LUX.init = function () {
132
+ LUX.cmd(["init"]);
133
+ };
134
+ LUX.send = function () {
135
+ LUX.cmd(["send"]);
136
+ };
137
+ LUX.addData = function (a, b) {
138
+ LUX.cmd(["addData", a, b]);
139
+ };
140
+ LUX_ae = [];
141
+ window.addEventListener("error", function (a) {
142
+ LUX_ae.push(a);
143
+ });
144
+ LUX_al = [];
145
+ if (
146
+ "function" === typeof PerformanceObserver &&
147
+ "function" === typeof PerformanceLongTaskTiming
148
+ ) {
149
+ var LongTaskObserver = new PerformanceObserver(function (c) {
150
+ var b = c.getEntries();
151
+ for (var a = 0; a < b.length; a++) {
152
+ var d = b[a];
153
+ LUX_al.push(d);
154
+ }
155
+ });
156
+ try {
157
+ LongTaskObserver.observe({ type: ["longtask"] });
158
+ } catch (e) {}
159
+ }
@@ -0,0 +1,844 @@
1
+ /* eslint-disable */
2
+
3
+ /*
4
+ * Part of Speedcurve's LUX script, which allows us to run real user metrics on
5
+ * pages using the public layout template.
6
+ *
7
+ * See docs/real-user-metrics.md for more information.
8
+ */
9
+
10
+
11
+ /* ! Remember to keep the settings at the end of this file when updating LUX.
12
+ *
13
+ * The settings are:
14
+ * * `LUX.customerid = 47044334` to let LUX know who this is
15
+ * * `LUX.beaconMode = "simple"` to fire the beacon as an image, which is now
16
+ * allowed by the content security policy.
17
+ * * `LUX.debug = false` turns debugging on and off. Left set to false - and
18
+ * kept in the file so it's easier to remember that this can be turned on.
19
+ */
20
+
21
+ var LUX_t_start = Date.now(),
22
+ LUX = window.LUX || {};
23
+ LUX = function() {
24
+ var gaLog = [];
25
+ dlog("lux.js evaluation start.");
26
+ var version = "214",
27
+ _errorUrl = "https://lux.speedcurve.com/error/",
28
+ nErrors = 0,
29
+ maxErrors = 5;
30
+
31
+ function errorHandler(e) {
32
+ nErrors++, e && void 0 !== e.filename && void 0 !== e.message && (-1 !== e.filename.indexOf("/lux.js?") || -1 !== e.message.indexOf("LUX") || nErrors <= maxErrors && "function" == typeof _sample && _sample()) && ((new Image).src = _errorUrl + "?v=" + version + "&id=" + getCustomerId() + "&fn=" + encodeURIComponent(e.filename) + "&ln=" + e.lineno + "&cn=" + e.colno + "&msg=" + encodeURIComponent(e.message) + "&l=" + encodeURIComponent(_getPageLabel()) + (connectionType() ? "&ct=" + connectionType() : ""))
33
+ }
34
+ window.addEventListener("error", errorHandler);
35
+ var gaPerfEntries = "object" == typeof window.LUX_al ? window.LUX_al.slice() : [];
36
+ if ("function" == typeof PerformanceObserver) {
37
+ var perfObserver = new PerformanceObserver((function(e) {
38
+ e.getEntries().forEach((function(e) {
39
+ gaPerfEntries.push(e)
40
+ }))
41
+ }));
42
+ try {
43
+ "function" == typeof PerformanceLongTaskTiming && perfObserver.observe({
44
+ type: "longtask"
45
+ }), "function" == typeof LargestContentfulPaint && perfObserver.observe({
46
+ type: "largest-contentful-paint",
47
+ buffered: !0
48
+ }), "function" == typeof PerformanceElementTiming && perfObserver.observe({
49
+ type: "element",
50
+ buffered: !0
51
+ }), "function" == typeof PerformancePaintTiming && perfObserver.observe({
52
+ type: "paint",
53
+ buffered: !0
54
+ }), "function" == typeof LayoutShift && perfObserver.observe({
55
+ type: "layout-shift",
56
+ buffered: !0
57
+ })
58
+ } catch (e) {
59
+ dlog("Long Tasks error.")
60
+ }
61
+ } else dlog("Long Tasks not supported.");
62
+ var gFlags = 0,
63
+ gFlag_InitCalled = 1,
64
+ gFlag_NoNavTiming = 2,
65
+ gFlag_NoUserTiming = 4,
66
+ gFlag_NotVisible = 8,
67
+ gaMarks = void 0 !== LUX.gaMarks ? LUX.gaMarks : [],
68
+ gaMeasures = void 0 !== LUX.gaMeasures ? LUX.gaMeasures : [],
69
+ ghIx = {},
70
+ ghData = {},
71
+ gbLuxSent = 0,
72
+ gbNavSent = 0,
73
+ gbIxSent = 0,
74
+ gbUpdated = 0,
75
+ gbFirstPV = 1,
76
+ gStartMark = "LUX_start",
77
+ gEndMark = "LUX_end",
78
+ gSessionTimeout = 1800,
79
+ gSyncId = createSyncId(),
80
+ gUid = refreshUniqueId(gSyncId),
81
+ gCustomerDataTimeout, perf = window.performance,
82
+ gMaxQuerystring = 2e3,
83
+ _beaconUrl = void 0 !== LUX.beaconUrl ? LUX.beaconUrl : "https://lux.speedcurve.com/lux/",
84
+ _samplerate = void 0 !== LUX.samplerate ? LUX.samplerate : 100;
85
+ dlog("Sample rate = " + _samplerate + "%. " + (_sample() ? "This session IS being sampled." : "This session is NOT being sampled. The data will NOT show up in your LUX dashboards. Call LUX.forceSample() and try again."));
86
+ var _auto = void 0 === LUX.auto || LUX.auto,
87
+ _navigationStart = LUX.ns ? LUX.ns : Date.now ? Date.now() : +new Date,
88
+ gLuxSnippetStart = 0,
89
+ gFirstInputDelay;
90
+ perf && perf.timing && perf.timing.navigationStart ? (_navigationStart = perf.timing.navigationStart, gLuxSnippetStart = LUX.ns ? LUX.ns - _navigationStart : 0) : (dlog("Nav Timing is not supported."), gFlags |= gFlag_NoNavTiming);
91
+ var gaEventTypes = ["click", "mousedown", "keydown", "touchstart", "pointerdown"],
92
+ ghListenerOptions = {
93
+ passive: !0,
94
+ capture: !0
95
+ };
96
+
97
+ function recordDelay(e) {
98
+ gFirstInputDelay || (gFirstInputDelay = Math.round(e), gaEventTypes.forEach((function(e) {
99
+ removeEventListener(e, onInput, ghListenerOptions)
100
+ })))
101
+ }
102
+
103
+ function onPointerDown(e, t) {
104
+ function n() {
105
+ recordDelay(e, t), a()
106
+ }
107
+
108
+ function r() {
109
+ a()
110
+ }
111
+
112
+ function a() {
113
+ window.removeEventListener("pointerup", n, ghListenerOptions), window.removeEventListener("pointercancel", r, ghListenerOptions)
114
+ }
115
+ window.addEventListener("pointerup", n, ghListenerOptions), window.addEventListener("pointercancel", r, ghListenerOptions)
116
+ }
117
+
118
+ function onInput(e) {
119
+ var t = !1;
120
+ try {
121
+ t = e.cancelable
122
+ } catch (e) {
123
+ return void dlog("Permission error accessing input event.")
124
+ }
125
+ if (t) {
126
+ var n = _now(!0),
127
+ r = e.timeStamp;
128
+ if (r > 152e7 && (n = Number(new Date)), r > n) return;
129
+ var a = n - r;
130
+ "pointerdown" == e.type ? onPointerDown(a, e) : recordDelay(a, e)
131
+ }
132
+ }
133
+
134
+ function _now(e) {
135
+ var t = (Date.now ? Date.now() : +new Date) - _navigationStart,
136
+ n = _getMark(gStartMark);
137
+ return n && !e ? t - n.startTime : perf && perf.now ? perf.now() : t
138
+ }
139
+
140
+ function _mark(e) {
141
+ if (dlog("Enter LUX.mark(), name = " + e), perf) {
142
+ if (perf.mark) return perf.mark(e);
143
+ if (perf.webkitMark) return perf.webkitMark(e)
144
+ }
145
+ gFlags |= gFlag_NoUserTiming, gaMarks.push({
146
+ name: e,
147
+ entryType: "mark",
148
+ startTime: _now(),
149
+ duration: 0
150
+ })
151
+ }
152
+
153
+ function _measure(e, t, n) {
154
+ if (dlog("Enter LUX.measure(), name = " + e), void 0 === t && _getMark(gStartMark) && (t = gStartMark), perf) {
155
+ if (perf.measure) return t ? n ? perf.measure(e, t, n) : perf.measure(e, t) : perf.measure(e);
156
+ if (perf.webkitMeasure) return perf.webkitMeasure(e, t, n)
157
+ }
158
+ var r = 0,
159
+ a = _now();
160
+ if (t) {
161
+ var i = _getMark(t);
162
+ if (i) r = i.startTime;
163
+ else {
164
+ if (!(perf && perf.timing && perf.timing[t])) return;
165
+ r = perf.timing[t] - perf.timing.navigationStart
166
+ }
167
+ }
168
+ if (n) {
169
+ var o = _getMark(n);
170
+ if (o) a = o.startTime;
171
+ else {
172
+ if (!(perf && perf.timing && perf.timing[n])) return;
173
+ a = perf.timing[n] - perf.timing.navigationStart
174
+ }
175
+ }
176
+ gaMeasures.push({
177
+ name: e,
178
+ entryType: "measure",
179
+ startTime: r,
180
+ duration: a - r
181
+ })
182
+ }
183
+
184
+ function _getMark(e) {
185
+ return _getM(e, _getMarks())
186
+ }
187
+
188
+ function _getM(e, t) {
189
+ if (t)
190
+ for (var n = t.length - 1; n >= 0; n--) {
191
+ var r = t[n];
192
+ if (e === r.name) return r
193
+ }
194
+ }
195
+
196
+ function _getMarks() {
197
+ if (perf) {
198
+ if (perf.getEntriesByType) return perf.getEntriesByType("mark");
199
+ if (perf.webkitGetEntriesByType) return perf.webkitGetEntriesByType("mark")
200
+ }
201
+ return gaMarks
202
+ }
203
+
204
+ function _getMeasures() {
205
+ if (perf) {
206
+ if (perf.getEntriesByType) return perf.getEntriesByType("measure");
207
+ if (perf.webkitGetEntriesByType) return perf.webkitGetEntriesByType("measure")
208
+ }
209
+ return gaMeasures
210
+ }
211
+
212
+ function userTimingValues() {
213
+ var e = {},
214
+ t = _getMark(gStartMark),
215
+ n = _getMarks();
216
+ n && n.forEach((function(n) {
217
+ var r = n.name,
218
+ a = r !== gStartMark && t ? t.startTime : 0,
219
+ i = Math.round(n.startTime - a);
220
+ i < 0 || (void 0 === e[r] ? e[r] = i : e[r] = Math.max(i, e[r]))
221
+ }));
222
+ var r = _getMeasures();
223
+ r && r.forEach((function(n) {
224
+ if (!(t && n.startTime < t.startTime)) {
225
+ var r = n.name,
226
+ a = Math.round(n.duration);
227
+ void 0 === e[r] ? e[r] = a : e[r] = Math.max(a, e[r])
228
+ }
229
+ }));
230
+ var a = [];
231
+ return Object.keys(e).forEach((function(t) {
232
+ a.push(t + "|" + e[t])
233
+ })), a.join(",")
234
+ }
235
+
236
+ function elementTimingValues() {
237
+ var e = [];
238
+ if (gaPerfEntries.length)
239
+ for (var t = 0; t < gaPerfEntries.length; t++) {
240
+ var n = gaPerfEntries[t];
241
+ "element" === n.entryType && n.identifier && n.startTime && e.push(n.identifier + "|" + Math.round(n.startTime))
242
+ }
243
+ return e.join(",")
244
+ }
245
+
246
+ function cpuTimes() {
247
+ if ("function" != typeof PerformanceLongTaskTiming) return "";
248
+ var e = "",
249
+ t = {},
250
+ n = {};
251
+ if (gaPerfEntries.length)
252
+ for (var r = _getMark(gStartMark), a = r ? r.startTime : 0, i = r ? _getMark(gEndMark).startTime : perf.timing.loadEventEnd - perf.timing.navigationStart, o = 0; o < gaPerfEntries.length; o++) {
253
+ var s = gaPerfEntries[o];
254
+ if ("longtask" === s.entryType) {
255
+ var d = Math.round(s.duration);
256
+ if (s.startTime < a) d -= a - s.startTime;
257
+ else if (s.startTime >= i) continue;
258
+ var g = s.attribution[0].name;
259
+ t[g] || (t[g] = 0, n[g] = ""), t[g] += d, n[g] += "," + Math.round(s.startTime) + "|" + d
260
+ }
261
+ }
262
+ var u = void 0 !== t.script ? "script" : "unknown";
263
+ void 0 === t[u] && (t[u] = 0, n[u] = "");
264
+ var c = cpuStats(n[u]),
265
+ l = ",n|" + c.count + ",d|" + c.median + ",x|" + c.max + (0 === c.fci ? "" : ",i|" + c.fci);
266
+ return e += "s|" + t[u] + l + n[u]
267
+ }
268
+
269
+ function cpuStats(e) {
270
+ for (var t = 0, n = getFcp(), r = 0 === n, a = [], i = e.split(","), o = 0; o < i.length; o++) {
271
+ var s = i[o].split("|");
272
+ if (2 === s.length) {
273
+ var d = parseInt(s[0]),
274
+ g = parseInt(s[1]);
275
+ a.push(g), t = g > t ? g : t, !r && d > n && (d - n > 5e3 ? r = !0 : n = d + g)
276
+ }
277
+ }
278
+ return {
279
+ count: a.length,
280
+ median: arrayMedian(a),
281
+ max: t,
282
+ fci: n
283
+ }
284
+ }
285
+
286
+ function calculateDCLS() {
287
+ if ("function" != typeof LayoutShift) return !1;
288
+ for (var e = 0, t = 0; t < gaPerfEntries.length; t++) {
289
+ var n = gaPerfEntries[t];
290
+ "layout-shift" !== n.entryType || n.hadRecentInput || (e += n.value)
291
+ }
292
+ return e.toFixed(6)
293
+ }
294
+
295
+ function arrayMedian(e) {
296
+ if (0 === e.length) return 0;
297
+ var t = Math.floor(e.length / 2);
298
+ return e.sort((function(e, t) {
299
+ return e - t
300
+ })), e.length % 2 ? e[t] : Math.round((e[t - 1] + e[t]) / 2)
301
+ }
302
+
303
+ function selfLoading() {
304
+ var e = "";
305
+ if (perf && perf.getEntriesByName) {
306
+ var t = getScriptElement("/js/lux.js");
307
+ if (t) {
308
+ var n = perf.getEntriesByName(t.src);
309
+ if (n && n.length) {
310
+ var r = n[0],
311
+ a = Math.round(r.domainLookupEnd - r.domainLookupStart),
312
+ i = Math.round(r.connectEnd - r.connectStart),
313
+ o = Math.round(r.responseStart - r.requestStart),
314
+ s = Math.round(r.responseEnd - r.responseStart),
315
+ d = a + i + o + s,
316
+ g = LUX_t_end - LUX_t_start,
317
+ u = r.encodedBodySize ? r.encodedBodySize : 0;
318
+ e = "d" + a + "t" + i + "f" + o + "c" + s + "n" + d + "e" + g + "r" + _samplerate + (u ? "x" + u : "") + (gLuxSnippetStart ? "l" + gLuxSnippetStart : "") + "s" + (LUX_t_start - _navigationStart)
319
+ }
320
+ }
321
+ }
322
+ return e
323
+ }
324
+
325
+ function _clearIx() {
326
+ ghIx = {}
327
+ }
328
+
329
+ function ixValues() {
330
+ var e = [];
331
+ for (var t in ghIx) e.push(t + "|" + ghIx[t]);
332
+ return e.join(",")
333
+ }
334
+
335
+ function _addData(e, t) {
336
+ dlog("Enter LUX.addData(), name = " + e + ", value = " + t);
337
+ var n = typeof t;
338
+ "string" !== typeof e || "string" !== n && "number" !== n && "boolean" !== n || (ghData[e] = t), gbLuxSent && (gCustomerDataTimeout && clearTimeout(gCustomerDataTimeout), gCustomerDataTimeout = setTimeout(_sendCustomerData, 100))
339
+ }
340
+
341
+ function _sample() {
342
+ if (void 0 === gUid || void 0 === _samplerate) return !1;
343
+ var e = ("" + gUid).substr(-2);
344
+ return parseInt(e) < _samplerate
345
+ }
346
+
347
+ function customerDataValues() {
348
+ var e = [];
349
+ for (var t in ghData) {
350
+ var n = "" + ghData[t];
351
+ t = t.replace(/,/g, "").replace(/\|/g, ""), n = n.replace(/,/g, "").replace(/\|/g, ""), e.push(t + "|" + n)
352
+ }
353
+ return encodeURIComponent(e.join(","))
354
+ }
355
+
356
+ function _init() {
357
+ dlog("Enter LUX.init()."), _clearIx(), _removeIxHandlers(), _addIxHandlers(), gbNavSent = 0, gbLuxSent = 0, gbIxSent = 0, gbFirstPV = 0, gSyncId = createSyncId(), gUid = refreshUniqueId(gSyncId), gaPerfEntries.splice(0), gFlags = 0, gFlags |= gFlag_InitCalled, _mark(gStartMark)
358
+ }
359
+
360
+ function blockingScripts() {
361
+ var e = lastViewportElement();
362
+ if (!e) return syncScripts();
363
+ for (var t = document.getElementsByTagName("script"), n = 0, r = 0, a = t.length; r < a; r++) {
364
+ var i = t[r];
365
+ !i.src || i.async || i.defer || 0 == (4 & i.compareDocumentPosition(e)) || n++
366
+ }
367
+ return n
368
+ }
369
+
370
+ function blockingStylesheets() {
371
+ for (var e = 0, t = document.getElementsByTagName("link"), n = 0, r = t.length; n < r; n++) {
372
+ var a = t[n];
373
+ a.href && "stylesheet" === a.rel && 0 !== a.href.indexOf("data:") && (a.onloadcssdefined || "print" === a.media || "style" === a.as || "function" == typeof a.onload && "all" === a.media || e++)
374
+ }
375
+ return e
376
+ }
377
+
378
+ function syncScripts() {
379
+ for (var e = document.getElementsByTagName("script"), t = 0, n = 0, r = e.length; n < r; n++) {
380
+ var a = e[n];
381
+ !a.src || a.async || a.defer || t++
382
+ }
383
+ return t
384
+ }
385
+
386
+ function numScripts() {
387
+ for (var e = document.getElementsByTagName("script"), t = 0, n = 0, r = e.length; n < r; n++) {
388
+ e[n].src && t++
389
+ }
390
+ return t
391
+ }
392
+
393
+ function numStylesheets() {
394
+ for (var e = document.getElementsByTagName("link"), t = 0, n = 0, r = e.length; n < r; n++) {
395
+ var a = e[n];
396
+ a.href && "stylesheet" == a.rel && t++
397
+ }
398
+ return t
399
+ }
400
+
401
+ function inlineTagSize(e) {
402
+ for (var t = document.getElementsByTagName(e), n = 0, r = 0, a = t.length; r < a; r++) {
403
+ var i = t[r];
404
+ try {
405
+ n += i.innerHTML.length
406
+ } catch (i) {
407
+ return dlog("Error accessing inline element innerHTML."), -1
408
+ }
409
+ }
410
+ return n
411
+ }
412
+
413
+ function getNavTiming() {
414
+ var e = "",
415
+ t = _navigationStart;
416
+ if (_getMark(gStartMark) && _getMark(gEndMark)) {
417
+ var n = Math.round(_getMark(gStartMark).startTime);
418
+ e = (t += n) + "fs0ls" + (s = Math.round(_getMark(gEndMark).startTime) - n) + "le" + s
419
+ } else if (perf && perf.timing) {
420
+ var r = perf.timing,
421
+ a = getStartRender(),
422
+ i = getFcp(),
423
+ o = getLcp();
424
+ e = t + (r.redirectStart ? "rs" + (r.redirectStart - t) : "") + (r.redirectEnd ? "re" + (r.redirectEnd - t) : "") + (r.fetchStart ? "fs" + (r.fetchStart - t) : "") + (r.domainLookupStart ? "ds" + (r.domainLookupStart - t) : "") + (r.domainLookupEnd ? "de" + (r.domainLookupEnd - t) : "") + (r.connectStart ? "cs" + (r.connectStart - t) : "") + (r.secureConnectionStart ? "sc" + (r.secureConnectionStart - t) : "") + (r.connectEnd ? "ce" + (r.connectEnd - t) : "") + (r.requestStart ? "qs" + (r.requestStart - t) : "") + (r.responseStart ? "bs" + (r.responseStart - t) : "") + (r.responseEnd ? "be" + (r.responseEnd - t) : "") + (r.domLoading ? "ol" + (r.domLoading - t) : "") + (r.domInteractive ? "oi" + (r.domInteractive - t) : "") + (r.domContentLoadedEventStart ? "os" + (r.domContentLoadedEventStart - t) : "") + (r.domContentLoadedEventEnd ? "oe" + (r.domContentLoadedEventEnd - t) : "") + (r.domComplete ? "oc" + (r.domComplete - t) : "") + (r.loadEventStart ? "ls" + (r.loadEventStart - t) : "") + (r.loadEventEnd ? "le" + (r.loadEventEnd - t) : "") + (a ? "sr" + a : "") + (i ? "fc" + i : "") + (o ? "lc" + o : "")
425
+ } else if (_getMark(gEndMark)) {
426
+ var s;
427
+ e = t + "fs0ls" + (s = Math.round(_getMark(gEndMark).startTime)) + "le" + s
428
+ }
429
+ return e
430
+ }
431
+
432
+ function getFcp() {
433
+ if (perf && perf.getEntriesByType && perf.getEntriesByType("paint"))
434
+ for (var e = perf.getEntriesByType("paint"), t = 0; t < e.length; t++) {
435
+ var n = e[t];
436
+ if ("first-contentful-paint" === n.name) return Math.round(n.startTime)
437
+ }
438
+ return 0
439
+ }
440
+
441
+ function getLcp() {
442
+ if (gaPerfEntries.length)
443
+ for (var e = gaPerfEntries.length - 1; e >= 0; e--) {
444
+ var t = gaPerfEntries[e];
445
+ if ("largest-contentful-paint" === t.entryType) return Math.round(t.startTime)
446
+ }
447
+ return 0
448
+ }
449
+
450
+ function getStartRender() {
451
+ if (perf && perf.timing) {
452
+ var e, t = perf.timing,
453
+ n = t.navigationStart;
454
+ if (n) {
455
+ if (perf && perf.getEntriesByType && perf.getEntriesByType("paint") && perf.getEntriesByType("paint").length)
456
+ for (var r = perf.getEntriesByType("paint"), a = 0; a < r.length; a++) {
457
+ var i = r[a];
458
+ if ("first-paint" === i.name) {
459
+ e = Math.round(i.startTime);
460
+ break
461
+ }
462
+ } else if (window.chrome && "function" == typeof window.chrome.loadTimes) {
463
+ var o = window.chrome.loadTimes();
464
+ o && (e = Math.round(1e3 * o.firstPaintTime - n))
465
+ } else t.msFirstPaint && (e = Math.round(t.msFirstPaint - n));
466
+ if (e > 0) return e
467
+ }
468
+ }
469
+ return dlog("Paint Timing not supported."), null
470
+ }
471
+
472
+ function getCustomerId() {
473
+ if (void 0 !== LUX.customerid) return LUX.customerid;
474
+ var e = getScriptElement("/js/lux.js");
475
+ return e ? (LUX.customerid = getQuerystringParam(e.src, "id"), LUX.customerid) : ""
476
+ }
477
+
478
+ function getScriptElement(e) {
479
+ for (var t = document.getElementsByTagName("script"), n = 0, r = t.length; n < r; n++) {
480
+ var a = t[n];
481
+ if (a.src && -1 !== a.src.indexOf(e)) return a
482
+ }
483
+ return null
484
+ }
485
+
486
+ function getQuerystringParam(e, t) {
487
+ for (var n = e.split("?")[1].split("&"), r = 0, a = n.length; r < a; r++) {
488
+ var i = n[r].split("=");
489
+ if (t === i[0]) return i[1]
490
+ }
491
+ }
492
+
493
+ function avgDomDepth() {
494
+ for (var e = document.getElementsByTagName("*"), t = e.length, n = 0; t--;) n += numParents(e[t]);
495
+ return Math.round(n / e.length)
496
+ }
497
+
498
+ function numParents(e) {
499
+ var t = 0;
500
+ if (e.parentNode)
501
+ for (; e = e.parentNode;) t++;
502
+ return t
503
+ }
504
+
505
+ function docHeight(e) {
506
+ var t = e.body,
507
+ n = e.documentElement;
508
+ return Math.max(t ? t.scrollHeight : 0, t ? t.offsetHeight : 0, n ? n.clientHeight : 0, n ? n.scrollHeight : 0, n ? n.offsetHeight : 0)
509
+ }
510
+
511
+ function docWidth(e) {
512
+ var t = e.body,
513
+ n = e.documentElement;
514
+ return Math.max(t ? t.scrollWidth : 0, t ? t.offsetWidth : 0, n ? n.clientWidth : 0, n ? n.scrollWidth : 0, n ? n.offsetWidth : 0)
515
+ }
516
+
517
+ function docSize() {
518
+ if (perf && perf.getEntriesByType) {
519
+ var e = performance.getEntriesByType("navigation");
520
+ if (e && e.length > 0 && e[0].encodedBodySize) return e[0].encodedBodySize
521
+ }
522
+ return 0
523
+ }
524
+
525
+ function navigationType() {
526
+ return perf && perf.navigation && void 0 !== perf.navigation.type ? perf.navigation.type : ""
527
+ }
528
+
529
+ function connectionType() {
530
+ var e = navigator.connection,
531
+ t = "";
532
+ return e && e.effectiveType && (t = "slow-2g" === (t = e.effectiveType) ? "Slow 2G" : "2g" === t || "3g" === t || "4g" === t || "5g" === t ? t.toUpperCase() : t.charAt(0).toUpperCase() + t.slice(1)), t
533
+ }
534
+
535
+ function imagesATF() {
536
+ var e = document.getElementsByTagName("img"),
537
+ t = [];
538
+ if (e)
539
+ for (var n = 0, r = e.length; n < r; n++) {
540
+ var a = e[n];
541
+ inViewport(a) && t.push(a)
542
+ }
543
+ return t
544
+ }
545
+
546
+ function lastViewportElement(e) {
547
+ var t;
548
+ if (e || (e = document.body), e) {
549
+ var n = e.children;
550
+ if (n)
551
+ for (var r = 0, a = n.length; r < a; r++) {
552
+ var i = n[r];
553
+ inViewport(i) && (t = i)
554
+ }
555
+ }
556
+ return t ? lastViewportElement(t) : e
557
+ }
558
+
559
+ function inViewport(e) {
560
+ var t = document.documentElement.clientHeight,
561
+ n = document.documentElement.clientWidth,
562
+ r = findPos(e);
563
+ return r[0] >= 0 && r[1] >= 0 && r[0] < n && r[1] < t && e.offsetWidth > 0 && e.offsetHeight > 0
564
+ }
565
+
566
+ function findPos(e) {
567
+ for (var t = 0, n = 0; e;) t += e.offsetLeft, n += e.offsetTop, e = e.offsetParent;
568
+ return [t, n]
569
+ }
570
+
571
+ function _sendLux() {
572
+ dlog("Enter LUX.send().");
573
+ var e = getCustomerId();
574
+ if (e && gSyncId && validDomain() && _sample() && !gbLuxSent) {
575
+ _mark(gEndMark);
576
+ var t = userTimingValues(),
577
+ n = elementTimingValues(),
578
+ r = customerDataValues(),
579
+ a = "";
580
+ gbIxSent || (a = ixValues());
581
+ var i = cpuTimes(),
582
+ o = calculateDCLS(),
583
+ s = selfLoading();
584
+ document.visibilityState && "visible" !== document.visibilityState && (gFlags |= gFlag_NotVisible);
585
+ var d = _beaconUrl + "?v=" + version + "&id=" + e + "&sid=" + gSyncId + "&uid=" + gUid + (r ? "&CD=" + r : "") + "&l=" + encodeURIComponent(_getPageLabel()),
586
+ g = inlineTagSize("script"),
587
+ u = inlineTagSize("style"),
588
+ c = (gbNavSent ? "" : "&NT=" + getNavTiming()) + (gbFirstPV ? "&LJS=" + s : "") + "&PS=ns" + numScripts() + "bs" + blockingScripts() + (g > -1 ? "is" + g : "") + "ss" + numStylesheets() + "bc" + blockingStylesheets() + (u > -1 ? "ic" + u : "") + "ia" + imagesATF().length + "it" + document.getElementsByTagName("img").length + "dd" + avgDomDepth() + "nd" + document.getElementsByTagName("*").length + "vh" + document.documentElement.clientHeight + "vw" + document.documentElement.clientWidth + "dh" + docHeight(document) + "dw" + docWidth(document) + (docSize() ? "ds" + docSize() : "") + (connectionType() ? "ct" + connectionType() + "_" : "") + "er" + nErrors + "nt" + navigationType() + (navigator.deviceMemory ? "dm" + Math.round(navigator.deviceMemory) : "") + (a ? "&IX=" + a : "") + (gFirstInputDelay ? "&FID=" + gFirstInputDelay : "") + (i ? "&CPU=" + i : "") + (gFlags ? "&fl=" + gFlags : "") + (n ? "&ET=" + n : "") + "&HN=" + encodeURIComponent(document.location.hostname) + (!1 !== o ? "&CLS=" + o : ""),
589
+ l = "";
590
+ if (t) {
591
+ var f = d.length + c.length;
592
+ if (f + t.length <= gMaxQuerystring) c += "&UT=" + t;
593
+ else {
594
+ var m = gMaxQuerystring - f,
595
+ p = t.lastIndexOf(",", m);
596
+ c += "&UT=" + t.substring(0, p), l = t.substring(p + 1)
597
+ }
598
+ }
599
+ var v = d + c;
600
+ dlog("Sending main LUX beacon: " + v), _sendBeacon(v), gbLuxSent = 1, gbNavSent = 1, gbIxSent = a ? 1 : 0;
601
+ for (var h = gMaxQuerystring - d.length; l;) {
602
+ var y = "";
603
+ if (l.length <= h) y = l, l = "";
604
+ else {
605
+ var _ = l.lastIndexOf(",", h); - 1 === _ && (_ = l.indexOf(",")), -1 === _ ? (y = l, l = "") : (y = l.substring(0, _), l = l.substring(_ + 1))
606
+ }
607
+ var L = d + "&UT=" + y;
608
+ dlog("Sending extra User Timing beacon: " + L), _sendBeacon(L)
609
+ }
610
+ }
611
+ }
612
+
613
+ function _sendIx() {
614
+ var e = getCustomerId();
615
+ if (e && gSyncId && validDomain() && _sample() && !gbIxSent && gbLuxSent) {
616
+ var t = ixValues();
617
+ if (t) {
618
+ var n = customerDataValues(),
619
+ r = "?v=" + version + "&id=" + e + "&sid=" + gSyncId + "&uid=" + gUid + (n ? "&CD=" + n : "") + "&l=" + encodeURIComponent(_getPageLabel()) + "&IX=" + t + (gFirstInputDelay ? "&FID=" + gFirstInputDelay : "") + "&HN=" + encodeURIComponent(document.location.hostname),
620
+ a = _beaconUrl + r;
621
+ dlog("Sending Interaction Metrics beacon: " + a), _sendBeacon(a), gbIxSent = 1
622
+ }
623
+ }
624
+ }
625
+
626
+ function _sendCustomerData() {
627
+ var e = getCustomerId();
628
+ if (e && gSyncId && validDomain() && _sample() && gbLuxSent) {
629
+ var t = customerDataValues();
630
+ if (t) {
631
+ var n = "?v=" + version + "&id=" + e + "&sid=" + gSyncId + "&uid=" + gUid + "&CD=" + t + "&l=" + encodeURIComponent(_getPageLabel()) + "&HN=" + encodeURIComponent(document.location.hostname),
632
+ r = _beaconUrl + n;
633
+ dlog("Sending late Customer Data beacon: " + r), _sendBeacon(r)
634
+ }
635
+ }
636
+ }
637
+
638
+ function _sendBeacon(e) {
639
+ if ("simple" !== LUX.beaconMode) return _sendBeaconAutoUpdate(e);
640
+ (new Image).src = e
641
+ }
642
+
643
+ function _sendBeaconAutoUpdate(e) {
644
+ var t = document.createElement("script");
645
+ t.async = !0, t.src = e;
646
+ var n = document.getElementsByTagName("script");
647
+ n.length ? n[0].parentNode.insertBefore(t, n[0]) : ((n = document.getElementsByTagName("head")).length || (n = document.getElementsByTagName("body")).length) && n[0].appendChild(t)
648
+ }
649
+
650
+ function interactionAttributionForElement(e) {
651
+ if (e.id) return e.id;
652
+ for (var t, n = e; n.parentNode && n.parentNode.tagName;) {
653
+ if ((n = n.parentNode).hasAttribute("data-sctrack")) return n.getAttribute("data-sctrack");
654
+ n.id && !t && (t = n.id)
655
+ }
656
+ var r = "INPUT" === e.tagName && "submit" === e.type,
657
+ a = "BUTTON" === e.tagName,
658
+ i = "A" === e.tagName;
659
+ return r && e.value ? e.value : (a || i) && e.innerText ? e.innerText : t || ""
660
+ }
661
+
662
+ function _scrollHandler() {
663
+ void 0 === ghIx.s && (ghIx.s = Math.round(_now()))
664
+ }
665
+
666
+ function _keyHandler(e) {
667
+ if (_removeIxHandlers(), void 0 === ghIx.k) {
668
+ if (ghIx.k = Math.round(_now()), e && e.target) {
669
+ var t = interactionAttributionForElement(e.target);
670
+ t && (ghIx.ki = t)
671
+ }
672
+ _sendIx()
673
+ }
674
+ }
675
+
676
+ function _clickHandler(e) {
677
+ if (_removeIxHandlers(), void 0 === ghIx.c) {
678
+ ghIx.c = Math.round(_now());
679
+ var t = null;
680
+ try {
681
+ e && e.target && (t = e.target)
682
+ } catch (e) {
683
+ dlog("Error accessing event target."), t = null
684
+ }
685
+ if (t) {
686
+ e.clientX && (ghIx.cx = e.clientX, ghIx.cy = e.clientY);
687
+ var n = interactionAttributionForElement(e.target);
688
+ n && (ghIx.ci = n)
689
+ }
690
+ _sendIx()
691
+ }
692
+ }
693
+
694
+ function _doUpdate(e, t) {
695
+ if (e && version < e && document.body && !gbUpdated) {
696
+ dlog("Updating cached version of lux.js from " + version + " to " + e + "."), gbUpdated = 1;
697
+ var n = getScriptElement("/js/lux.js");
698
+ if (n)
699
+ if ("function" == typeof fetch) fetch(n.src, {
700
+ cache: "reload"
701
+ });
702
+ else {
703
+ var r = document.createElement("iframe");
704
+ r.style.display = "none", r.id = "LUX_update_iframe", r.src = "//cdn.speedcurve.com/luxupdate.php?src=" + encodeURIComponent(n.src) + (t ? "&tw=" + t : ""), document.body.appendChild(r)
705
+ }
706
+ }
707
+ }
708
+
709
+ function addListener(e, t) {
710
+ window.addEventListener ? window.addEventListener(e, t, !1) : window.attachEvent && window.attachEvent("on" + e, t)
711
+ }
712
+
713
+ function removeListener(e, t) {
714
+ window.removeEventListener ? window.removeEventListener(e, t, !1) : window.detachEvent && window.detachEvent("on" + e, t)
715
+ }
716
+
717
+ function _addIxHandlers() {
718
+ addListener("scroll", _scrollHandler), addListener("keypress", _keyHandler), addListener("mousedown", _clickHandler)
719
+ }
720
+
721
+ function _removeIxHandlers() {
722
+ removeListener("scroll", _scrollHandler), removeListener("keypress", _keyHandler), removeListener("mousedown", _clickHandler)
723
+ }
724
+
725
+ function createSyncId(e) {
726
+ return e ? Number(new Date) + "00000" : Number(new Date) + "" + _padLeft(parseInt(1e5 * Math.random()), "00000")
727
+ }
728
+
729
+ function refreshUniqueId(e) {
730
+ var t = _getCookie("lux_uid");
731
+ if (!t || t.length < 11) t = e;
732
+ else {
733
+ var n = parseInt(t.substring(0, 10));
734
+ Number(new Date) / 1e3 - n > 86400 && (t = e)
735
+ }
736
+ return setUniqueId(t), t
737
+ }
738
+
739
+ function setUniqueId(e) {
740
+ return _setCookie("lux_uid", e, gSessionTimeout), e
741
+ }
742
+
743
+ function _getUniqueId() {
744
+ return gUid
745
+ }
746
+
747
+ function _getPageLabel() {
748
+ if (void 0 !== LUX.label) return LUX.label;
749
+ if (void 0 !== LUX.jspagelabel) {
750
+ try {
751
+ var label = eval(LUX.jspagelabel)
752
+ } catch (e) {
753
+ console.log("Error evaluating customer settings LUX page label:", e)
754
+ }
755
+ if (label) return label
756
+ }
757
+ return document.title
758
+ }
759
+
760
+ function validDomain() {
761
+ return !0
762
+ }
763
+
764
+ function _getCookie(e) {
765
+ try {
766
+ for (var t = document.cookie.split(";"), n = 0; n < t.length; n++) {
767
+ var r = t[n].split("=");
768
+ if (e === r[0].trim()) return unescape(r[1])
769
+ }
770
+ } catch (e) {
771
+ dlog("Error accessing document.cookie.")
772
+ }
773
+ }
774
+
775
+ function _setCookie(e, t, n) {
776
+ try {
777
+ document.cookie = e + "=" + escape(t) + (n ? "; max-age=" + n : "") + "; path=/; SameSite=Lax"
778
+ } catch (e) {
779
+ dlog("Error setting document.cookie.")
780
+ }
781
+ }
782
+
783
+ function _padLeft(e, t) {
784
+ return (t + e).slice(-t.length)
785
+ }
786
+
787
+ function dlog(e) {
788
+ gaLog.push(e), LUX.debug && console.log("LUX: " + e)
789
+ }
790
+ gaEventTypes.forEach((function(e) {
791
+ window.addEventListener(e, onInput, ghListenerOptions)
792
+ })), _auto && ("complete" == document.readyState ? _sendLux() : addListener("load", (function() {
793
+ setTimeout(_sendLux, 200)
794
+ })), addListener("beforeunload", _sendLux), addListener("unload", _sendLux), addListener("beforeunload", _sendIx), addListener("unload", _sendIx)), _addIxHandlers();
795
+ var _LUX = {
796
+ mark: _mark,
797
+ measure: _measure,
798
+ init: _init,
799
+ send: _sendLux,
800
+ addData: _addData,
801
+ getSessionId: _getUniqueId,
802
+ getDebug: function() {
803
+ return gaLog
804
+ },
805
+ forceSample: function() {
806
+ setUniqueId(createSyncId(!0)), console.log("Sampling has been turned on for this session.")
807
+ },
808
+ doUpdate: _doUpdate,
809
+ cmd: function(e) {
810
+ var t = e.shift();
811
+ "function" == typeof _LUX[t] && _LUX[t].apply(_LUX, e)
812
+ },
813
+ beaconUrl: _beaconUrl,
814
+ samplerate: _samplerate,
815
+ auto: _auto,
816
+ label: void 0 !== LUX.label ? LUX.label : void 0,
817
+ jspagelabel: void 0 !== LUX.jspagelabel ? LUX.jspagelabel : void 0,
818
+ version: version,
819
+ ae: [],
820
+ al: [],
821
+ debug: !!LUX.debug
822
+ };
823
+ return LUX.ac && LUX.ac.length && LUX.ac.forEach((function(e) {
824
+ var t = e.shift();
825
+ "function" == typeof _LUX[t] && _LUX[t].apply(_LUX, e)
826
+ })), void 0 !== window.LUX_ae && window.LUX_ae.forEach((function(e) {
827
+ errorHandler(e)
828
+ })), dlog("lux.js evaluation end."), _LUX
829
+ }();
830
+ var LUX_t_end = Date.now();
831
+
832
+ // This ID usually appended to the end of the lux.js as a query string when
833
+ // using the SpeedCurve hosted version - but we have to include it here as this
834
+ // is self hosted.
835
+ LUX.customerid = 47044334;
836
+
837
+ // Turn on the image-based beacon, rather than have a remote JavaScript file
838
+ // fetched and executed.
839
+ LUX.beaconMode = "simple";
840
+
841
+ // Setting debug to `true` shows what happening as it happens. Running
842
+ // `LUX.getDebug()` in the browser's console will show the history of what's
843
+ // happened.
844
+ LUX.debug = false;