PageSourceSearch

https://seaboats.net/public/js/preload.js?v3?31123273

js seaboats.net collected 2026-10-02 11:01:48 UTC 31,688 bytes, 668 lines download raw bytes

1"use strict";
2
3if (!window.console) {
4   window.console = {
5      log: function() {},
6      warn: function() {},
7      error: function() {},
8      time: function() {},
9      timeEnd: function() {}
10   }
11}
12
13var cartBypassAddressChecks = false;
14
15var Kernel = function () { var m, c = {}, q = {}, s = {}, j = {}, a = "main"; function b(u) { if (f(u)) { u = [u] } return u } function f(u) { return Object.prototype.toString.call(u) == "[object String]" } function p(w, v) { var u, x; if (!w) { return } for (u in w) { if (w.hasOwnProperty(u) || v) { if (u === "decorateMethod" || u === "decorateMethods") { return } if (!w._decoratedMethods) { w._decoratedMethods = {} } if (!w._decoratedMethods[u]) { x = w[u]; if (typeof x === "function") { w[u] = m.decorateMethod(w, u, x); w._decoratedMethods[u] = true } } } } } function e(u) { a = u } function k(w) { var v, x, u = {}; if (w.extend) { v = b(w.extend); for (i = 0; i < v.length; i += 1) { x = v[i]; x = q[x]; if (x) { Kernel.extend(u, x, true) } } } return Kernel.extend(u, w, true) } function n(v, u) { q[v] = k(u) } function l(w, u) { var z = { event: 0 }, v = { event: 0 }, y = { event: 0 }, x = u; x._internals = { type: "hub" }; x.id = w; x.broadcast = function (I, E, L, B) { var F, C, G = j.event, N, K, A, J, H = 0, M = [], D; if (x.beforeBroadcast) { D = x.beforeBroadcast(I, E, B); if (D.type) { I = D.type } if (D.data) { E = D.data } } C = j[I]; z[I] = z[I] || 0; z[I] += 1; z.event += 1; v[I] = v[I] || 0; y[I] = y[I] || 0; if (C) { for (F = 0, N = C.length; F < N; F += 1) { A = (new Date()).getTime(); j[I][F].callback(E, B); J = (new Date()).getTime() - A; H += J; y[I] += J; y.event += J; v[I] += 1; v.event += 1; M.push({ id: j[I][F].id, elapseTime: J, callback: j[I][F].callback }) } } if (G) { K = { type: I, data: E, time: new Date(), listeners: M, broadcastCount: z[I], callbackCount: v[I], elapseTime: H, totalElapseTime: y[I], all: { broadcastCount: z.event, callbackCount: v.event, totalElapseTime: y.event } }; for (F = 0, N = G.length; F < N; F += 1) { j.event[F].callback(K) } } if (L) { L() } }; x.authorized = x.authorized || function (A, B) { return true }; x.listen = function (D, F, E) { E = E || "hub-" + x.id; var C, B, A; D = b(D); for (C = 0, B = D.length; C < B; C += 1) { A = D[C]; if (x.authorized(D, E)) { j[A] = j[A] || []; j[A].push({ callback: F, id: E }) } } }; x.getStats = function () { return { broadcastCount: z, callbackCount: v, totalElapseTime: y } }; x.share = function (A) { Kernel.extend(x, A) }; p(x); c[w] = x }
15 function t(v) { try { if (v instanceof RegExp) { return true } if (v instanceof Node) { return true } if (v instanceof jQuery) { return true } } catch (u) { } return false } function o(B, A, v, z, w) { var y, x, u; if (A === null) { return B } if (typeof B !== "object" || !B) { B = (A instanceof Array) ? [] : {} } if (B._internals && (B._internals.type === "module" || B._internals.type === "hub")) { v = true; p(B, true) } if (B instanceof Array && A instanceof Array && (!w)) { B = [] } for (y in A) { if (A.hasOwnProperty(y) || z) { if (B[y] === A[y]) { continue } if (y === "_internals") { continue } if (y === "_parent") { continue } if (y === "_children") { continue } if (B === A[y]) { continue } if (y === "hub" && A[y]._internals && A[y]._internals.type === "hub") { continue } if (t(A[y])) { B[y] = A[y]; continue } if (v && typeof A[y] === "object") { B[y] = Kernel.extend(B[y], A[y], v, z, w) } else { if (B._internals && B._internals.type === "Kernel") { switch (y) { case "extend": case "decorateMethods": case "module": case "register": case "hub": case "start": case "stop": case "version": case "_internals": throw "You can't extend '" + y + "', it's part of Kernel's base functionality."; default: } } else { if (B._internals && B._internals.type === "module") { if (y === "id") { throw "You can't overwrite a module instance id. [" + B.id + "]" } } } if (B instanceof Array && A instanceof Array && w) { for (x = 0, u = B.length; x < u; x += 1) { if (B[x] === A[y]) { continue } } B.push(A[y]) } else { B[y] = A[y] } } } } return B } function g(B, z, y, w, v) { var y = y || a, u; s[B] = { hub: c[y], started: false, Definition: q[z] }; try { u = Kernel.extend(k(s[B].Definition), s[B].Definition, true) } catch (A) { throw "Couldn't register module: [" + B + "] - missing or broken Definition: " + A.message } if (w) { Kernel.extend(u, w, true) } u._internals = { type: "module", moduleType: z }; u.kill = u.kill || function () { }; u.id = B; var x = function () { }; x.prototype = s[B].hub; u.hub = new x; u.hub.broadcast = function (C, D, E) { s[B].hub.broadcast(C, D, E, B) }; u.hub.listen = function (C, D) { s[B].hub.listen(C, D, B) }; u.hub._internals = Kernel.extend(s[B].hub._internals, { moduleId: B, moduleType: z }); p(u, true); s[B].instance = u; if (v.onRegister) { v.onRegister(s[B].instance) } if (s[B].instance.onRegister) { s[B].instance.onRegister() } } function r(v) { var u; v = v || function (w) { return w.toString().replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase() }; for (u in m._internals.modules) { m.register(v(u), u) } } function d(u) { if (s[u].instance.started) { Kernel.stop(u) } delete s[u] } function h(w, v, u) { if (u.module.isStarted(w)) { return } if (v) { o(s[w].instance, v, true) } s[w].started = true; return u.onStart(s[w].instance) } m = { extend: o, decorateMethods: p, module: { define: n, get: function (u) { if (!s[u]) { throw "Couldn't get instance for: " + u + ", is it registered?" } return s[u].instance }, getDefinition: function (u) { return q[u] }, isStarted: function (u) { return s[u].started } }, hub: { define: l, get: function (u) { return c[u] } }, register: function (y, x, w, u) { var v; if (f(y)) { g(y, x, w, u, this) } else { for (v = 0; v < y.length; v += 1) { g(y[v].id, y[v].type, y[v].hub, y[v].config, this) } } }, unregister: d, autoRegisterModules: r, start: function (w, u) { var v; if (f(w)) { return h(w, u, this) } else { for (v = 0; v < w.length; v += 1) { h(w[v].id, w[v].config, this) } } }, startAll: function () { var u; for (u in s) { h(u, null, this) } }, onStart: function (u, v) { u.init(); if (v) { v() } }, decorateMethod: function (u, v, w) { return function () { return w.apply(u, arguments) } }, stop: function (y) { var w, v, u, x; this.onStop(s[y].instance); for (w in j) { for (v = 0, u = j[w].length; v < u; v += 1) { x = j[w][v]; if (x.id === y) { j[w].splice(v, 1) } } } s[y].started = false }, onStop: function (u) { u.kill() }, version: "2.7.5", _internals: { PRIVATE: "FOR DEBUGGING ONLY", type: "Kernel", hubs: c, modules: q, registered: s, listeners: j } }; return m } ();
16Kernel.hub.define("main", {});
17
18(function(factory) {
19   if (typeof define === 'function' && define.amd) {
20      define(factory);
21   } else if (typeof exports === 'object') {
22      module.exports = factory();
23   } else {
24      var _OldCookies = window.Cookies;
25      var api = window.Cookies = factory();
26      api.noConflict = function() {
27         window.Cookies = _OldCookies;
28         return api;
29      };
30   }
31}(function() {
32   function extend() {
33      var i = 0;
34      var result = {};
35      for (; i < arguments.length; i++) {
36         var attributes = arguments[i];
37         for (var key in attributes) {
38            result[key] = attributes[key];
39         }
40      }
41      return result;
42   }
43
44   function init(converter) {
45      function api(key, value, attributes) {
46         var result;
47
48         if (arguments.length > 1) {
49            attributes = extend({
50               path: '/'
51            }, api.defaults, attributes);
52
53            if (typeof attributes.expires === 'number') {
54               var expires = new Date();
55               expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
56               attributes.expires = expires;
57            }
58
59            try {
60               result = JSON.stringify(value);
61               if (/^[\{\[]/.test(result)) {
62                  value = result;
63               }
64            } catch (e) {}
65
66            value = encodeURIComponent(String(value));
67            value = value.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
68
69            key = encodeURIComponent(String(key));
70            key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
71            key = key.replace(/[\(\)]/g, escape);
72
73            return (document.cookie = [
74               key, '=', value,
75               attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
76               attributes.path && '; path=' + attributes.path,
77               attributes.domain && '; domain=' + attributes.domain,
78               attributes.secure ? '; secure' : ''
79            ].join(''));
vendor: 1,219 bytes, lines 80-125
80         }
81
82
83         if (!key) {
84            result = {};
85         }
86
87         var cookies = document.cookie ? document.cookie.split('; ') : [];
88         var rdecode = /(%[0-9A-Z]{2})+/g;
89         var i = 0;
90
91         for (; i < cookies.length; i++) {
92            var parts = cookies[i].split('=');
93            var name = parts[0].replace(rdecode, decodeURIComponent);
94            var cookie = parts.slice(1).join('=');
95
96            if (cookie.charAt(0) === '"') {
97               cookie = cookie.slice(1, -1);
98            }
99
100            try {
101               cookie = converter && converter(cookie, name) || cookie.replace(rdecode, decodeURIComponent);
102
103               if (this.json) {
104                  try {
105                     cookie = JSON.parse(cookie);
106                  } catch (e) {}
107               }
108
109               if (key === name) {
110                  result = cookie;
111                  break;
112               }
113
114               if (!key) {
115                  result[name] = cookie;
116               }
117            } catch (e) {}
118         }
119
120         return result;
121      }
122
123      api.get = api.set = api;
124      api.getJSON = function() {
125         return api.apply({
126            json: true
127         }, [].slice.call(arguments));
128      };
129      api.defaults = {};
130
131      api.remove = function(key, attributes) {
132         api(key, '', extend(attributes, {
133            expires: -1
134         }));
135      };
136
137      api.withConverter = init;
138
139      return api;
140   }
141
142   return init();
143}));
144
145var rates = {
146   "AUD": 1.53,
147   "CAD": 1.40,
148   "EUR": 0.86,
149   "GBP": 0.76,
150   "NZD": 1.75,
151   "USD": 1
152}
153
154var utils = {
155   getRowsForViewport: function(){
156     const w = window.innerWidth;
157     if (w < 640) return 12;   // mobile
158     if (w < 1024) return 24;  // tablet
159     return 48;                // desktop
160   },
161   mobileCheck: function() {
162      var check = false;
163      (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
164      return check;
165   },
166   getParam: function(name) {
167      return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ""])[1].replace(/\+/g, '%20')) || null
168   },
169   numberWithCommas: function(x) {
170      return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
171   },
172   numberWithCommasAndSpans: function(x) {
173      if (x >= 100) {
174         return "<span class=\"price-whole\">" + x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",").split(".").join("</span><span class=\"price-over-hundred price-part\">.<span class=\"price-fraction\">") + "</span></span>";
175      } else {
176         return "<span class=\"price-whole\">" + x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",").split(".").join("</span><span class=\"price-part\">.<span class=\"price-fraction\">") + "</span></span>";
177      }
178   },
179   getCheckboxFilter: function(elClass, type) {
180      var checkedValue = null;
181      var names = [];
182      var inputElements = document.querySelectorAll(elClass + " input");
183      for (var i = 0; inputElements[i]; ++i) {
184         if (inputElements[i].checked) {
185            names.push(inputElements[i].getAttribute("data-" + type).replace(/&amp;/g, '&').replace(/&quot;/g, '"'));
186         }
187      }
188      return names;
189   },
190   setCheckboxFilter: function(elClass, type, clickHandler) {
191      var v = app.state[type].split(",");
192      var inputElements = document.querySelectorAll(elClass + " input");
193      for (var i = 0; i < inputElements.length; i++) {
194         for (var j = 0; j < v.length; j++) {
195            if (v[j].replace(/&/g, '&amp;').replace(/"/g, '&quot;') == inputElements[i].getAttribute("data-" + type)) {
196               inputElements[i].checked = true;
197            }
198         }
199         inputElements[i].addEventListener('click', function(e) {
200            clickHandler(e);
201         });
202      }
203   },
204   isBS5: function() {
205      try {
206         return $.fn.tooltip.Constructor.VERSION.substr(0,1) == "5";
207      }
208      catch (e) {
209         return false;
210      }
211   },
212   navigateTo: function(url) {
213      if (!utils.getParam("cms")) {
214         location.href = url;
215      }
216   }
217}
218var prices = {
219   initPrices: function(dcurr, useShort) {
220      if (dcurr == "37") dcurr = "NZD";
221      if (dcurr == "39") dcurr = "USD";
222      var fld, amt, type, scurr, text, prefix, shortPrefix, percentChange;
223      var pitems = document.querySelectorAll(".price");
224      fld = pitems[0];
225      if (dcurr == "" && fld) {
226         dcurr = fld.getAttribute("data-cur");
227      }
228
229      switch (dcurr) {
230         case "NZD":
231            prefix = '<span class="price-prefix"><small class="prefix-nzd">NZ</small>$</span>';
232            shortPrefix = "$";
233            break;
234         case "USD":
235            prefix = '<span class="price-prefix"><small class="prefix-usd">US</small>$</span>';
236            shortPrefix = "$";
237            break;
238         case "AUD":
239            prefix = '<span class="price-prefix"><small class="prefix-aud">AU</small>$</span>';
240            shortPrefix = "$";
241            break;
242         case "CAD":
243            prefix = '<span class="price-prefix"><small class="prefix-cad">CA</small>$</span>';
244            shortPrefix = "$";
245            break;
246         case "EUR":
247            prefix = '<span class="price-prefix">&euro;</span>';
248            shortPrefix = "&euro;";
249            break;
250         case "GBP":
251            prefix = '<span class="price-prefix">&pound;</span>';
252            shortPrefix = "&pound;";
253            break;
254         default:
255            prefix = '<span class="price-prefix">$</span>';
256            shortPrefix = "$";
257            break;
258      }
259
260      for (var i = 0; i < pitems.length; i++) {
261         fld = pitems[i];
262         amt = Number(fld.getAttribute("data-amt")) / 10000;
263         type = fld.getAttribute("data-type");
264         scurr = fld.getAttribute("data-cur");
265         percentChange = fld.getAttribute("data-percent-change");
266         
267         if (!ed.disableCurrencyConversion && dcurr) {
268            // console.log("Price init:",type,scurr,dcurr,rates);
269            amt = amt / rates[scurr] * rates[dcurr];
270         }
271 
272         if (isNaN(amt)) amt = 0;
273         
274         if (percentChange > 0) {
275            amt = (amt * (percentChange / 100));
276         }
277         
278         text = "";
279         //console.log("Amt:" + amt + ", type:" + type + ",scurr:" + scurr + ",useShort:" + useShort + ", rates[scurr]:" + rates[scurr] + ",rates[dcurr]:" + rates[scurr]);
280         switch (type) {
281            case "adisc":
282               {
283                  if (useShort) {
284                     text = '<span style="white-space:nowrap;">' + shortPrefix + utils.numberWithCommasAndSpans(Number(amt).toFixed(2)) + '</span>';
285                  } else {
286                     text = '<span style="white-space:nowrap;">' + prefix + utils.numberWithCommasAndSpans(Number(amt).toFixed(2)) + '</span>';
287                  }
288                  break;
289               }
290            case "pdisc":
291               {
292                  //text = Number(amt) + "%";
293                  var pc = Number(fld.getAttribute("data-pc")) / 10000;
294                  if (useShort) {
295                     text = '<span style="white-space:nowrap;">' + Number(Math.round(pc)) + '%</span>';
296                  } else {
297                     text = '<span style="white-space:nowrap;">' + Number(Math.round(pc)) + '%</span>';
298                  }
299                  break;
300               }
301            case "range":
302               {
303                  if (useShort) {
304                     text = shortPrefix + utils.numberWithCommas(Math.ceil(amt / 10) * 10);
305                  } else {
306                     text = prefix + utils.numberWithCommas(Math.ceil(amt / 10) * 10);
307                  }
308                  break;
309               }
310            default:
311               {
312                  if (useShort) {
313                     text = shortPrefix + utils.numberWithCommasAndSpans(Number(amt).toFixed(2));
314                  } else {
315                     text = prefix + utils.numberWithCommasAndSpans(Number(amt).toFixed(2));
316                  }
317                  break;
318               }
319         }
320         fld.innerHTML = text;
321      }
322      app.ls.baseCurrency = scurr;
323      app.ls.shortPrefix = shortPrefix;
324      // console.log('initPrices', fld, amt, type, scurr, text, prefix, shortPrefix, percentChange)
325   }
326}
327
328var app = {
329   htmlEncode: function (str) {
330      const div = document.createElement('div');
331      div.textContent = str;
332      return div.innerHTML;
333   },
334
335   isSameOrigin: function (url) {
336      try {
337         const current = new URL(window.location.href);
338         const target = new URL(url, window.location.origin);
339         return target.origin === current.origin;
340      } catch (e) {
341         return false;
342      }
343   },
344
345   safeNavigate: function(url) {
346      var m = this;
347      if (m.isSameOrigin(url)) {
348         window.location.href = url;
349         return true;
350      }
351      return false;
352   },
353   
354   state: {
355      search: (utils.getParam("q") ? utils.getParam("q") : ""),
356      searchAll: false,
357      page: (utils.getParam("page") ? utils.getParam("page") : ""),
358      sort: (utils.getParam("sort") ? utils.getParam("sort") : ""),
359      rows: (utils.getParam("rows") ? utils.getParam("rows") : ""),
360      min: (utils.getParam("min") ? utils.getParam("min") : ""),
361      max: (utils.getParam("max") ? utils.getParam("max") : ""),
362      brand: (utils.getParam("brand") ? utils.getParam("brand") : ""),
363      location: (utils.getParam("location") ? utils.getParam("location") : ""),
364      facets: (utils.getParam("facets") ? utils.getParam("facets") : ""),
365      flags: (utils.getParam("flags") ? utils.getParam("flags") : ""),
366      currency: (utils.getParam("curr") ? utils.getParam("curr") : "")
367   },
368   getLocalState: function(storeName) {
369      if (!storeName) {
370         storeName = "s";
371      }
372      var localState = Cookies.getJSON(storeName);
373
374      if (typeof cmsConfig !== 'undefined') {
375         //console.log("cmsConfig", cmsConfig);
376         if (typeof cmsConfig.userGuid !== 'undefined') {
377            localState.sessionGuid = cmsConfig.userGuid;
378            //console.log(localState.sessionGuid);
379         }
380      }
381      return localState;
382   },
383   setLocalState: function(obj, storeName) {
384      if (!storeName) {
385         storeName = "s";
386      }
387      if (obj) {
388         var stateObj = JSON.parse(JSON.stringify(obj));
389         if (stateObj.profile) {
390            var guid = stateObj.profile.guid;
391            stateObj.profile = {
392               guid: guid
393            };
394         }
395   
396         if (window.ec) {
397            if (window.ec[0]) {
398               if (!stateObj.v) {
399                  stateObj.v = [];
400               }
401               if (stateObj.v.length > 20) {
402                  stateObj.v = stateObj.v.slice(Math.max(stateObj.v.length - 20, 0));
403               }
404               stateObj.v.push(window.ec[0]);
405            }
406         }
407   
408         return Cookies.set(storeName, stateObj);
409      }
410   },
411   updateLocalState: function(name, value) {
412      var m = this;
413      var ls = m.getLocalState();
414      ls[name] = value;
415      m.setLocalState(ls);
416   },
417   getLocalVar: function(name) {
418      var m = this;
419      var ls = m.getLocalState();
420      return ls[name];
421   },
422   changeCurrency: function(dcurr) {
423      var m = this;
424      m.ls.currency = dcurr;
425      prices.initPrices(m.ls.currency);
426      m.setLocalState(m.ls);
427   },
428   changeView: function(clearFilter) {
429      var m = this;
430      var params = [];
431      if (m.state.page > 1) {
432         params.push("page=" + m.state.page);
433      }
434      if (m.state.search != "") {
435         params.push("q=" + encodeURIComponent(m.state.search));
436      }
437      if (!clearFilter) {
438         if (m.state.brand != "") {
439            params.push("brand=" + encodeURIComponent(m.state.brand));
440         }
441         if (m.state.location != "") {
442            params.push("location=" + encodeURIComponent(m.state.location));
443         }
444         if (m.state.flags != "") {
445            params.push("flags=" + encodeURIComponent(m.state.flags));
446         }
447         if (m.state.facets != "") {
448            params.push("facets=" + encodeURIComponent(m.state.facets));
449         }
450         if (m.state.sort != "") {
451            params.push("sort=" + encodeURIComponent(m.state.sort));
452         }
453         if (Number(m.state.rows) < 5) {
454            m.state.rows = 48;
455         }
456         if (m.state.rows != 48) {
457            params.push("rows=" + encodeURIComponent(m.state.rows));
458         }
459         if (m.state.min > 0) {
460            params.push("min=" + m.state.min);
461         }
462         if (m.state.max > 0) {
463            params.push("max=" + m.state.max);
464         }
465         if (m.state.nc > 0) {
466            params.push("nc=" + m.state.nc);
467         }
468      }
469      var p = "";
470      for (var i = 0; i < params.length; i++) {
471         p += params[i] + ((i < (params.length - 1)) ? "&" : "");
472      }
473      // console.log("changeView", JSON.stringify(m.state));
474      if (m.state.url) {
475         if (m.state.url == "") {
476            window.location = window.location.pathname + ((p != "") ? "?" + p : "");
477         } else {
478            window.location = m.state.url + ((p != "") ? "?" + p : "");
479         }
480      } else {
481         window.location = window.location.pathname + ((p != "") ? "?" + p : "");
482      }
483   },
484   g: function(a) {
485      return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, this.g)
486   },
487
488   resetTotals: function() {
489      var m = this;
490      m.ls.total = {
491         amount: 0,
492         tax: 0,
493         shipping: 0,
494         discounts: 0,
495         weight: 0,
496         volume: 0,
497         due: 0,
498         lineCount: 0,
499         itemCount: 0,
500         loyaltyReward: 0,
501         loyaltyCost: 0
502      };
503   },
504   renderTotals: function() {
505      var m = this;
506      var pitems;
507      // console.log("renderTotals", m.ls.total);
508      // find and fill in various total types
509      pitems = document.querySelectorAll(".cart-total");
510      
511      if (!m.ls.total) {
512         m.resetTotals();
513         m.setLocalState(m.ls);
514      }
515      
516      for (var i = 0; i < pitems.length; i++) {
517         var type = pitems[i].getAttribute("data-type");
518         switch (type) {
519            case "amount":
520               pitems[i].innerHTML = '<span class="price" data-amt="' + (+m.ls.total.amount || 0) + '" data-cur="' + m.ls.baseCurrency + '" data-type="total" data-tax="' + (+m.ls.baseTaxRate || 0) + '"></span>';
521               break;
522            case "tax":
523               pitems[i].innerHTML = '<span class="price" data-amt="' + (+m.ls.total.tax || 0) + '" data-cur="' + m.ls.baseCurrency + '" data-type="tax" data-tax="' + (+m.ls.baseTaxRate || 0) + '"></span>';
524               break;
525            case "shipping":
526               pitems[i].innerHTML = '<span class="price" data-amt="' + (+m.ls.total.shipping || 0) + '" data-cur="' + m.ls.baseCurrency + '" data-type="shipping" data-tax="' + (+m.ls.baseTaxRate || 0) + '"></span>';
527               break;
528            case "discounts":
529               pitems[i].innerHTML = '<span class="price" data-amt="' + (+m.ls.total.discounts || 0) + '" data-cur="' + m.ls.baseCurrency + '" data-type="discounts" data-tax="' + (+m.ls.baseTaxRate || 0) + '"></span>';
530               break;
531            case "due":
532               pitems[i].innerHTML = '<span class="price" data-amt="' + (+m.ls.total.due || 0) + '" data-cur="' + m.ls.baseCurrency + '" data-type="due" data-tax="' + (+m.ls.baseTaxRate || 0) + '"></span>';
533               break;
534            case "loyaltyReward":
535               pitems[i].innerHTML = (+m.ls.total.loyaltyReward || 0);
536               break;
537            case "loyaltyCost":
538               pitems[i].innerHTML = (+m.ls.total.loyaltyCost || 0);
539               break;
540            case "itemCount":
541               pitems[i].innerHTML = (+m.ls.total.itemCount || 0);
542               break;
543            case "itemCountLabel":
544               pitems[i].innerHTML = "item" + ((+m.ls.total.itemCount || 0) == 1 ? "" : "s");
545               break;
546            case "lineCount":
547               pitems[i].innerHTML = (+m.ls.total.lineCount || 0);
548               break;
549            case "lineCountLabel":
550               pitems[i].innerHTML = "line" + ((+m.ls.total.lineCount || 0) == 1 ? "" : "s");
551               break;
552            default:
553               pitems[i].innerHTML = "Invalid type " + type;
554               break;
555         }
556      }
557   
558      // hide or statuses based on if there are things in the cart
559      pitems = document.querySelectorAll(".cart-status");
560      for (var i = 0; i < pitems.length; i++) {
561         var type = pitems[i].getAttribute("data-type");
562
563         if (type == "empty") {
564            if (m.ls.total.itemCount > 0) {
565               pitems[i].style.display = "none";
566            } else {
567               if (pitems[i].getAttribute("data-style")) {
568                  pitems[i].style.display = pitems[i].getAttribute("data-style");
569               } else {
570                  pitems[i].style.display = "inline-block";
571               }
572            }
573         } else {
574            if (m.ls.total.itemCount > 0) {
575               if (pitems[i].getAttribute("data-style")) {
576                  pitems[i].style.display = pitems[i].getAttribute("data-style");
577               } else {
578                  pitems[i].style.display = "inline-block";
579               }
580            } else {
581               pitems[i].style.display = "none";
582            }
583         }
584      }
585   },
586   init: function(prefixId) {
587      var m = this;
588      var pitems;
589      m.ls = m.getLocalState();
590
591      if (!m.ls) {
592         m.ls = {};
593         m.ls.currency = ed.currency;
594         m.ls.profile = {};
595         m.ls.sessionGuid = m.g(0);
596         m.ls.saleGuid = m.g(0);
597         m.ls.baseCurrency = ed.currency;
598         m.ls.baseTaxRate = ed.tax;
599         m.ls.geoCountry = "";
600         m.ls.rows = utils.getRowsForViewport();
601         m.resetTotals();
602         m.setLocalState(m.ls);
603      } else {
604         if (m.ls.rows != utils.getRowsForViewport()) {
605            m.ls.rows = utils.getRowsForViewport();
606            m.setLocalState(m.ls);
607         }
608         // if there was an error, redo the setup 
609         // if (typeof m.ls.saleGuid === "undefined") {
610         //    m.ls = {};
611         //    m.ls.currency = ed.currency;
612         //    m.ls.profile = {};
613         //    m.ls.sessionGuid = m.g(0);
614         //    m.ls.saleGuid = m.g(0);
615         //    m.ls.baseCurrency = ed.currency;
616         //    m.ls.baseTaxRate = ed.tax;
617         //    m.ls.geoCountry = "";
618         //    m.resetTotals();
619         //    m.setLocalState(m.ls);
620         // }
621         
622         m.renderTotals();
623         prices.initPrices(m.ls.currency);
624      }
625      
626      if (!prefixId) {
627         prefixId = "#desktop-filter-menu";
628      }
629
630      pitems = document.querySelectorAll(".fnc-currency");
631      for (var i = 0; i < pitems.length; i++) {
632         pitems[i].value = m.ls.currency;
633      }
634
635      utils.setCheckboxFilter(prefixId + " .fnc-brand-filter", "brand", function(e) {
636         e.preventDefault();
637         e.stopPropagation();
638         m.state.page = 1;
639         m.state.brand = utils.getCheckboxFilter(prefixId + " .fnc-brand-filter", "brand");
640         m.changeView();
641      });
642      
643      utils.setCheckboxFilter(prefixId + " .fnc-location-filter", "location", function(e) {
644         e.preventDefault();
645         e.stopPropagation();
646         m.state.page = 1;
647         m.state.location = utils.getCheckboxFilter(prefixId + " .fnc-location-filter", "location");
648         m.changeView();
649      }); 
650      
651      utils.setCheckboxFilter(prefixId + " .fnc-facet-filter", "facets", function(e) {
652         e.preventDefault();
653         e.stopPropagation();
654         m.state.page = 1;
655         m.state.facets = utils.getCheckboxFilter(prefixId + " .fnc-facet-filter", "facets");
656         m.changeView();
657      });
658
659      utils.setCheckboxFilter(prefixId + " .fnc-flags-filter", "flags", function(e) {
660         e.preventDefault();
661         e.stopPropagation();
662         m.state.page = 1;
663         m.state.flags = utils.getCheckboxFilter(prefixId + " .fnc-flags-filter", "flags");
664         m.changeView();
665      });
666   }
667}
668app.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.