{"version":3,"file":"/assets/js/app.js","mappings":"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","sources":["webpack://On2netWebsiteFramework/./src/js/bootstrap/collapse.js","webpack://On2netWebsiteFramework/./src/js/classes/classWatcher.js","webpack://On2netWebsiteFramework/./src/js/bootstrap/modals.js","webpack://On2netWebsiteFramework/./src/js/bootstrap/popovers.js","webpack://On2netWebsiteFramework/./src/js/bootstrap/tooltips.js","webpack://On2netWebsiteFramework/./src/js/components/mainNavigation.js","webpack://On2netWebsiteFramework/./src/js/components/ellipsis.js","webpack://On2netWebsiteFramework/./src/js/components/scrollbars.js","webpack://On2netWebsiteFramework/./src/js/components/carousels.js","webpack://On2netWebsiteFramework/./src/js/components/forms.js","webpack://On2netWebsiteFramework/./src/js/components/search.js","webpack://On2netWebsiteFramework/./src/js/components/animateOnScroll.js","webpack://On2netWebsiteFramework/./src/js/components/shop/productFilters.js","webpack://On2netWebsiteFramework/./src/js/components/shop/productGallery.js","webpack://On2netWebsiteFramework/./src/js/components/shop/quickQuoteModal.js","webpack://On2netWebsiteFramework/./src/js/pages/downloads.js","webpack://On2netWebsiteFramework/./src/js/pages/career.js","webpack://On2netWebsiteFramework/./src/js/app.js","webpack://On2netWebsiteFramework/./src/js/bootstrap/offcanvas.js","webpack://On2netWebsiteFramework/./src/js/components/cookiePopup.js","webpack://On2netWebsiteFramework/./src/js/components/dropdownOnHover.js","webpack://On2netWebsiteFramework/./src/js/components/fixedHeader.js","webpack://On2netWebsiteFramework/./src/js/components/heroParallaxBlur.js","webpack://On2netWebsiteFramework/./src/js/components/tableRowLinks.js","webpack://On2netWebsiteFramework/./src/js/pages/about.js","webpack://On2netWebsiteFramework/./src/js/pages/homepage.js"],"sourcesContent":["// | ------------------------------------------------------------------------\r\n// | Bootstrap - Collapse\r\n// | ------------------------------------------------------------------------ \r\n\r\nimport { Collapse } from \"bootstrap\";\r\n\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n// Collapse that starts closed on Mobiles but automatically changes to open on Desktops\r\n\r\nvar showCollapses = function(){ \r\n\r\n var mobileCollapses = document.querySelectorAll('.mobile-collapse');\r\n\r\n mobileCollapses.forEach(function(e){ \r\n var mobileCollapse = Collapse.getOrCreateInstance(e, {toggle: false});\r\n mobileCollapse.show();\r\n });\r\n\r\n}\r\n\r\nvar hideCollapses = function(){ \r\n\r\n var mobileCollapses = document.querySelectorAll('.mobile-collapse');\r\n\r\n mobileCollapses.forEach(function(e){ \r\n var mobileCollapse = Collapse.getOrCreateInstance(e, {toggle: false});\r\n mobileCollapse.hide();\r\n });\r\n\r\n}\r\n\r\n\r\n// Create a condition that targets viewports at least 768px wide\r\nconst mediaQuery = window.matchMedia('(min-width: 768px)');\r\n\r\nfunction checkMobileCollapse(e) {\r\n if (e.matches) {\r\n showCollapses();\r\n }else{\r\n hideCollapses();\r\n }\r\n}\r\n\r\n// Register event listener\r\nmediaQuery.addEventListener(\"change\", () => {\r\n checkMobileCollapse(mediaQuery);\r\n});\r\n\r\n// Initial check\r\ncheckMobileCollapse(mediaQuery);\r\n\r\n\r\n","// | ------------------------------------------------------------------------\r\n// | ClassWatcher\r\n// | ------------------------------------------------------------------------\r\n// | Watch an element to see if a class is added or removed \r\n// | e.g. let classWatcher = new ClassWatcher(element, 'className', functionWhenAdded, functionWhenRemoved);\r\n// | ------------------------------------------------------------------------ \r\n\r\nexport default class ClassWatcher {\r\n\r\n constructor(targetNode, classToWatch, classAddedCallback, classRemovedCallback) {\r\n this.targetNode = targetNode\r\n this.classToWatch = classToWatch\r\n this.classAddedCallback = classAddedCallback\r\n this.classRemovedCallback = classRemovedCallback\r\n this.observer = null\r\n this.lastClassState = targetNode.classList.contains(this.classToWatch)\r\n\r\n this.init()\r\n }\r\n\r\n init() {\r\n this.observer = new MutationObserver(this.mutationCallback)\r\n this.observe()\r\n }\r\n\r\n observe() {\r\n this.observer.observe(this.targetNode, { attributes: true })\r\n }\r\n\r\n disconnect() {\r\n this.observer.disconnect()\r\n }\r\n\r\n mutationCallback = mutationsList => {\r\n for(let mutation of mutationsList) {\r\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\r\n let currentClassState = mutation.target.classList.contains(this.classToWatch)\r\n if(this.lastClassState !== currentClassState) {\r\n this.lastClassState = currentClassState\r\n if(currentClassState) {\r\n this.classAddedCallback()\r\n }\r\n else {\r\n this.classRemovedCallback()\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","// | ------------------------------------------------------------------------\r\n// | Bootstrap - Modals\r\n// | ------------------------------------------------------------------------ \r\n\r\nimport { Modal } from \"bootstrap\";\r\nimport ClassWatcher from '../classes/classWatcher';\r\n\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n// If mobile navigation is open then close all modals\r\n\r\nfunction hideModals(){\r\n\r\n if(document.querySelectorAll('.modal.show').length > 0){\r\n var modals = document.querySelectorAll('.modal.show');\r\n modals.forEach(function(e){\r\n var modal = Modal.getInstance(e) \r\n modal.hide();\r\n }); \r\n } \r\n\r\n}\r\n\r\nlet modalWatcher = new ClassWatcher(document.body, 'mobile-nav-open', hideModals, () => null);\r\n","// | ------------------------------------------------------------------------\r\n// | Bootstrap - Popovers\r\n// | ------------------------------------------------------------------------ \r\n\r\nimport '@popperjs/core'\r\nimport { Popover } from \"bootstrap\";\r\nimport ClassWatcher from '../classes/classWatcher';\r\n\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n// Enable popovers\r\n\r\ndocument.addEventListener( 'DOMContentLoaded', function() {\r\n\r\n if(document.querySelectorAll('[data-bs-toggle=\"popover\"]').length > 0){ \r\n var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\r\n var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {\r\n return new Popover(popoverTriggerEl)\r\n })\r\n } \r\n\r\n});\r\n\r\n\r\n// If mobile navigation is open then close all popovers\r\n\r\nfunction hidePopovers(){\r\n\r\n if(document.querySelectorAll('[data-bs-toggle=\"popover\"]').length > 0){\r\n var popovers = document.querySelectorAll('[data-bs-toggle=\"popover\"]');\r\n popovers.forEach(function(e){\r\n var popover = Popover.getInstance(e)\r\n popover.hide();\r\n }); \r\n }\r\n\r\n}\r\n\r\nlet popoverWatcher = new ClassWatcher(document.body, 'mobile-nav-open', hidePopovers, () => null);\r\n","// | ------------------------------------------------------------------------\r\n// | Bootstrap - Tooltips\r\n// | ------------------------------------------------------------------------ \r\n\r\nimport '@popperjs/core'\r\nimport { Tooltip } from \"bootstrap\";\r\n\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n// Enable tooltips\r\n\r\ndocument.addEventListener( 'DOMContentLoaded', function() {\r\n\r\n if(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]').length > 0){\r\n var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\r\n var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\r\n return new Tooltip(tooltipTriggerEl)\r\n })\r\n } \r\n\r\n});","// | ------------------------------------------------------------------------\r\n// | Main Navigation\r\n// | ------------------------------------------------------------------------\r\n\r\nimport { Tab } from \"bootstrap\";\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\nwindow.addEventListener(\"load\", (event) => {\r\n // Set variables\r\n var body = document.querySelector(\"body\");\r\n var nav = document.querySelector(\".main-nav\");\r\n var button = document.querySelector(\"#mobile-nav-btn\");\r\n var windowWidth = document.body.clientWidth;\r\n\r\n // Toggle menu function\r\n var toggleDrawer = function () {\r\n body.classList.toggle(\"mobile-nav-open\");\r\n button.classList.toggle(\"toggled\");\r\n document.documentElement.classList.toggle(\"no-scroll\");\r\n };\r\n\r\n if (nav) {\r\n // Open/close drawer using menu button\r\n button.addEventListener(\r\n \"click\",\r\n function (event) {\r\n event.stopPropagation();\r\n toggleDrawer();\r\n },\r\n false\r\n );\r\n\r\n // Prevent menu closing when clicked\r\n nav.addEventListener(\r\n \"click\",\r\n function (event) {\r\n event.stopPropagation();\r\n },\r\n false\r\n );\r\n\r\n // Close drawer when clicking off menu\r\n body.addEventListener(\r\n \"click\",\r\n function () {\r\n if (body.classList.contains(\"mobile-nav-open\")) {\r\n toggleDrawer();\r\n }\r\n },\r\n false\r\n );\r\n\r\n // Close drawer if window is resized\r\n window.addEventListener(\"resize\", function () {\r\n if (document.body.clientWidth !== windowWidth) {\r\n if (body.classList.contains(\"mobile-nav-open\")) {\r\n toggleDrawer();\r\n }\r\n }\r\n windowWidth = document.body.clientWidth;\r\n });\r\n }\r\n});\r\n\r\n// Get tabs in dropdowns to work on hover\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n function closeTabs() {\r\n // Close all tab panes\r\n var tabPanes = document.querySelectorAll(\".nav-prod-pane\");\r\n tabPanes.forEach(function (tab) {\r\n tab.classList.remove(\"active\");\r\n });\r\n }\r\n\r\n document.querySelectorAll(\".nav-prod-tabs a\").forEach(function (navItem) {\r\n // Open relevant tab when mouse enters\r\n navItem.addEventListener(\"mouseenter\", function () {\r\n var tabTrigger = new Tab(navItem);\r\n tabTrigger.show();\r\n });\r\n\r\n // Close tab when mouse leaves\r\n navItem.addEventListener(\"mouseleave\", function () {\r\n closeTabs();\r\n\r\n // Remove stuff from tab link\r\n navItem.classList.remove(\"active\");\r\n navItem.setAttribute(\"aria-selected\", \"false\");\r\n });\r\n\r\n // Click takes you to the relevant page\r\n navItem.addEventListener(\"click\", function () {\r\n var navUrl = navItem.getAttribute(\"href\");\r\n console.log(navUrl);\r\n window.location.href = navUrl;\r\n });\r\n });\r\n\r\n document.querySelectorAll(\".nav-prod-pane\").forEach(function (tabPane) {\r\n // Keep tab open when mouse enters\r\n tabPane.addEventListener(\"mouseenter\", function () {\r\n var tabId = tabPane.getAttribute(\"id\");\r\n var tabLink = document.getElementById(tabId + \"-tab\");\r\n\r\n var tabTrigger = new Tab(tabLink);\r\n tabTrigger.show();\r\n });\r\n\r\n // Close tab when mouse leaves\r\n tabPane.addEventListener(\"mouseleave\", function () {\r\n closeTabs();\r\n\r\n var tabId = tabPane.getAttribute(\"id\");\r\n var tabLink = document.getElementById(tabId + \"-tab\");\r\n\r\n // Remove stuff from tab link\r\n tabLink.classList.remove(\"active\");\r\n tabLink.setAttribute(\"aria-selected\", \"false\");\r\n });\r\n });\r\n});\r\n\r\n// Allow root page links on desktops\r\n\r\nwindow.addEventListener(\"load\", (event) => {\r\n // Check if .main-nav is on the page first\r\n var mainNav = document.querySelector(\".main-nav\");\r\n\r\n if (mainNav) {\r\n // If so find the dropdown links\r\n var dropdownLinks = document.querySelectorAll(\r\n \".main-nav .nav-link.dropdown-toggle\"\r\n );\r\n\r\n var tabLinks = document.querySelectorAll(\".dd-tab-link\")\r\n\r\n // Change link attributes depending on screen size\r\n function changeDropdownLinks(mediaQuery) {\r\n if (mediaQuery.matches) {\r\n for (const dropDownLink of dropdownLinks) {\r\n dropDownLink.removeAttribute(\"data-bs-toggle\");\r\n dropDownLink.setAttribute(\"data-bs-hover\", \"\");\r\n } \r\n for (const tabLink of tabLinks) {\r\n\r\n if(tabLink.hasAttribute(\"data-bs-toggle\")){\r\n\r\n }else{\r\n var toggleAtt = tabLink.getAttribute(\"disabled-data-bs-toggle\");\r\n var targetAtt = tabLink.getAttribute(\"disabled-data-bs-target\");\r\n tabLink.setAttribute(\"data-bs-toggle\", toggleAtt);\r\n tabLink.setAttribute(\"data-bs-target\", targetAtt); \r\n tabLink.removeAttribute(\"disabled-data-bs-toggle\");\r\n tabLink.removeAttribute(\"disabled-data-bs-target\"); \r\n }\r\n } \r\n } else {\r\n for (const dropDownLink of dropdownLinks) {\r\n dropDownLink.removeAttribute(\"data-bs-hover\");\r\n dropDownLink.setAttribute(\"data-bs-toggle\", \"dropdown\");\r\n }\r\n for (const tabLink of tabLinks) {\r\n var toggleAtt = tabLink.getAttribute(\"data-bs-toggle\");\r\n var targetAtt = tabLink.getAttribute(\"data-bs-target\");\r\n tabLink.setAttribute(\"disabled-data-bs-toggle\", toggleAtt);\r\n tabLink.setAttribute(\"disabled-data-bs-target\", targetAtt);\r\n tabLink.removeAttribute(\"data-bs-toggle\");\r\n tabLink.removeAttribute(\"data-bs-target\");\r\n } \r\n }\r\n }\r\n\r\n // Create a MediaQueryList object\r\n var mediaQuery = window.matchMedia(\"(min-width: 768px)\");\r\n\r\n // Call listener function at run time\r\n changeDropdownLinks(mediaQuery);\r\n\r\n // Attach listener function on state changes\r\n mediaQuery.addEventListener(\"change\", function () {\r\n changeDropdownLinks(mediaQuery);\r\n });\r\n }\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Ellipsis\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n//? https://github.com/yowainwright/shav\r\nimport shave from 'shave'; \r\n\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\n\r\ndocument.addEventListener( 'DOMContentLoaded', function() {\r\n\r\n // argument structure - shave(\"selector\", maxheight, { options });\r\n shave(\".ellipsis\", 84, { character: \"...\" }); \r\n\r\n});","// | ------------------------------------------------------------------------\r\n// | Scrollbars\r\n// | ------------------------------------------------------------------------\r\n\r\n//? https://kingsora.github.io/OverlayScrollbars/\r\nimport { OverlayScrollbars } from \"overlayscrollbars\"; // Used in /components/shop/productFilters\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n var homeProdItems = document.querySelectorAll(\".home-prod-item .nav\");\r\n\r\n homeProdItems.forEach((homeProdItem) => {\r\n OverlayScrollbars(homeProdItem, {\r\n overflow: {\r\n x: \"hidden\",\r\n },\r\n });\r\n });\r\n\r\n var dropdownGrids = document.querySelectorAll(\".dropdown-grid\");\r\n\r\n dropdownGrids.forEach((dropdownGrid) => {\r\n OverlayScrollbars(dropdownGrid, {\r\n overflow: {\r\n x: \"hidden\",\r\n },\r\n });\r\n });\r\n\r\n var dropdownTabPanes = document.querySelectorAll(\".nav-prod-pane .nav\");\r\n\r\n dropdownTabPanes.forEach((dropdownTabPane) => {\r\n OverlayScrollbars(dropdownTabPane, {\r\n overflow: {\r\n x: \"hidden\",\r\n },\r\n });\r\n });\r\n\r\n var downloadPanes = document.querySelectorAll(\".download-list\");\r\n\r\n downloadPanes.forEach((downloadPane) => {\r\n OverlayScrollbars(downloadPane, {\r\n overflow: {\r\n x: \"hidden\",\r\n },\r\n });\r\n });\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Carousels\r\n// | ------------------------------------------------------------------------\r\n\r\n//? https://splidejs.com/\r\nimport Splide from \"@splidejs/splide\";\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n /*\r\n\r\n var hero = document.querySelector(\".hero-image-carousel\");\r\n var btnNext = document.querySelector(\".hero-btn-next\");\r\n var btnPrev = document.querySelector(\".hero-btn-prev\");\r\n\r\n if (hero) {\r\n var heroText = new Splide(\".hero-text-carousel\", {\r\n type: \"loop\",\r\n perPage: 1,\r\n perMove: 1,\r\n isNavigation: false,\r\n arrows: false,\r\n pagination: false,\r\n autoplay: true,\r\n pauseOnHover: true,\r\n }).mount();\r\n\r\n var heroImages = new Splide(\".hero-image-carousel\", {\r\n type: \"fade\",\r\n pagination: false,\r\n arrows: false,\r\n cover: true,\r\n });\r\n\r\n var heroProds = new Splide(\".hero-product-carousel\", {\r\n type: \"fade\",\r\n pagination: false,\r\n arrows: false,\r\n cover: true,\r\n });\r\n\r\n heroImages.sync(heroText);\r\n heroImages.sync(heroProds);\r\n heroImages.mount();\r\n heroProds.mount();\r\n\r\n btnNext.addEventListener(\"click\", (e) => {\r\n heroText.go(\"+1\");\r\n });\r\n\r\n btnPrev.addEventListener(\"click\", (e) => {\r\n heroText.go(\"-1\");\r\n });\r\n }\r\n\r\n */\r\n\r\n var homeNews = document.querySelector(\".home-news-carousel\");\r\n\r\n if (homeNews) {\r\n var homeNewsCarousel = new Splide(\".home-news-carousel\", {\r\n type: \"loop\",\r\n pagination: true,\r\n arrows: true,\r\n });\r\n\r\n homeNewsCarousel.mount();\r\n }\r\n\r\n var logoCarousel = document.querySelector(\".logo-carousel\");\r\n\r\n if (logoCarousel) {\r\n var logos = new Splide(\".logo-carousel\", {\r\n type: \"loop\",\r\n perPage: 4,\r\n pagination: false,\r\n gap: \"var(--global-spacing)\",\r\n arrows: true,\r\n breakpoints: {\r\n 576: {\r\n perPage: 1,\r\n arrows: true,\r\n },\r\n 768: {\r\n perPage: 2,\r\n arrows: true,\r\n },\r\n 992: {\r\n perPage: 3,\r\n },\r\n },\r\n });\r\n\r\n logos.mount();\r\n }\r\n\r\n var surveillanceCarousel = document.querySelector(\".surveillance-carousel\");\r\n\r\n if (surveillanceCarousel) {\r\n var surveillance = new Splide(\".surveillance-carousel\", {\r\n type: \"loop\",\r\n perPage: 3,\r\n pagination: false,\r\n gap: \"var(--global-spacing)\",\r\n arrows: true,\r\n breakpoints: {\r\n 576: {\r\n perPage: 1,\r\n arrows: true,\r\n },\r\n 768: {\r\n perPage: 2,\r\n arrows: true,\r\n },\r\n 992: {\r\n perPage: 3,\r\n },\r\n },\r\n });\r\n\r\n surveillance.mount();\r\n }\r\n\r\n var successCarousel = document.querySelector(\".success-carousel\");\r\n\r\n if (successCarousel) {\r\n var success = new Splide(\".success-carousel\", {\r\n type: \"loop\",\r\n perPage: 3,\r\n pagination: false,\r\n arrows: false,\r\n breakpoints: {\r\n 1400: {\r\n perPage: 2,\r\n arrows: true,\r\n },\r\n 768: {\r\n perPage: 1,\r\n arrows: true,\r\n },\r\n },\r\n });\r\n\r\n success.mount();\r\n }\r\n\r\n var featuredCarousel = document.querySelector(\".featured-carousel\");\r\n\r\n if (featuredCarousel) {\r\n var featured = new Splide(\".featured-carousel\", {\r\n type: \"loop\",\r\n perPage: 2,\r\n pagination: false,\r\n arrows: true,\r\n gap: \"var(--global-spacing)\",\r\n breakpoints: {\r\n 768: {\r\n perPage: 1,\r\n },\r\n },\r\n });\r\n\r\n featured.mount();\r\n }\r\n});\r\n","import \"ladda/css/ladda.scss\"\r\n\r\nimport * as Ladda from \"ladda\"\r\n\r\nimport { Offcanvas } from \"bootstrap\"\r\nimport bootbox from \"bootbox\"\r\nimport mixItUp from \"mixitup\"\r\nimport validate from \"jquery-validation\"\r\nimport { load } from \"recaptcha-v3\"\r\n\r\nvar is_mobile = false;\r\n\r\n//Custom validation options\r\nvar validationOptions = {\r\n errorClass: \"help-block\",\r\n errorElement: \"span\",\r\n ignore: [], //Ignore nothing - -Not even hidden fields\r\n //ignore: \"#jobProductTemplate *\",\r\n //debug: true,\r\n highlight: function (element, errorClass, validClass) {\r\n var matchingNumberBox = $(element).attr(\"type\") == \"number\";\r\n var matchingInputGroup = $(element).parent().hasClass(\"input-group\");\r\n\r\n if (matchingNumberBox == true) { //Is a number box \r\n if (matchingInputGroup == true) { //We're in an input group\r\n $(element).parents('.input-group').removeClass('has-success');\r\n $(element).parents('.input-group').addClass('has-error');\r\n } else { //Likely in a table cell\r\n $(element).parents('td').removeClass('has-success');\r\n $(element).parents('td').addClass('has-error');\r\n }\r\n } else {\r\n $(element).parents('.form-group').removeClass('has-success');\r\n $(element).parents('.form-group').addClass('has-error');\r\n }\r\n\r\n //Open tab with errors on:\r\n $(\".tab-content\").find(\"div.tab-pane:hidden:has(div.has-error)\").each(function () {\r\n var id = $(this).attr(\"id\");\r\n $('a[href=\"#' + id + '\"]').tab('show');\r\n });\r\n\r\n },\r\n unhighlight: function (element, errorClass, validClass) {\r\n var matchingNumberBox = $(element).attr(\"type\") == \"number\";\r\n var matchingInputGroup = $(element).parent().hasClass(\"input-group\");\r\n\r\n if (matchingNumberBox == true) { //Is a number box \r\n if (matchingInputGroup == true) { //We're in an input group\r\n $(element).parents('.input-group').removeClass('has-error');\r\n $(element).parents('.input-group').addClass('has-success');\r\n } else { //Likely in a table cell\r\n $(element).parents('td').removeClass('has-error');\r\n $(element).parents('td').addClass('has-success');\r\n }\r\n } else {\r\n $(element).parents('.form-group').removeClass('has-error');\r\n $(element).parents('.form-group').addClass('has-success');\r\n }\r\n },\r\n errorPlacement: function (error, element) {\r\n var matchingInputGroup = element.parent().hasClass(\"input-group\");\r\n var matchingDropdown = element.next().hasClass(\"bootstrap-select\");\r\n var matchingCheckbox = element.attr(\"type\") == \"checkbox\";\r\n var matchingNumberBox = element.attr(\"type\") == \"number\";\r\n var matchingCKEditor = $(element).hasClass(\"ckeditor\");\r\n\r\n if (matchingNumberBox == true) { //Is a number box \r\n //Do nothing -- do not place an error message\r\n\r\n } else if (matchingCKEditor == true) { //CKEditor box\r\n error.insertAfter(element.next());\r\n\r\n } else if (matchingInputGroup == true) { //uses bootstrap input grouping\r\n error.insertAfter(element.parent());\r\n\r\n } else if (matchingDropdown == true) { //Fancy dropdown box\r\n error.insertAfter(element.next());\r\n\r\n } else if (matchingCheckbox) { //Checkboxes\r\n error.insertBefore(element.parent(\"label\").parent(\"div\"));\r\n\r\n } else { //Standard text box\r\n error.insertAfter(element);\r\n };\r\n },\r\n\r\n invalidHandler: function (event, validator) {\r\n event.preventDefault();\r\n if (typeof Ladda !== \"undefined\") Ladda.stopAll()\r\n return false\r\n }\r\n}\r\n\r\n//Init Ladda buttons\r\nconst initLaddaButtons = () => {\r\n Array.from(document.getElementsByClassName(\"ladda-button\")).forEach(button => {\r\n button.CDATA_SECTION_NODE.style = \"zoom-in\"\r\n })\r\n window.Ladda = Ladda\r\n Ladda.bind(\".ladda-button\")\r\n}\r\ninitLaddaButtons();\r\n\r\n//options: form, action, success, error\r\nconst handleAjaxForm = (options) => {\r\n\r\n let { form, action, success, error } = options\r\n if (!action) action = form.action\r\n\r\n const submitBtn = form.querySelector(\"button[type=submit]\")\r\n submitBtn.dataset.style = \"zoom-in\"\r\n Ladda.bind(submitBtn)\r\n\r\n form.addEventListener(\"submit\", function (e) {\r\n e.preventDefault();\r\n\r\n if (!$(form).valid()) return false;\r\n\r\n fetch(action, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\"\r\n },\r\n body: new URLSearchParams(serialiseForm(form))\r\n\r\n }).then(resp => {\r\n if (resp.ok) return resp.json();\r\n showAjaxFormError()\r\n\r\n }).then(data => {\r\n if (typeof Ladda !== \"undefined\") Ladda.stopAll()\r\n if (success) success(data);\r\n\r\n }).catch(err => {\r\n if (error) error(err)\r\n })\r\n\r\n }, true)\r\n}\r\n\r\n//Converts a form into serialised key pair items in JSON format\r\nexport const serialiseForm = function (form) {\r\n var obj = {}\r\n const formData = new FormData(form)\r\n for (var key of formData.keys()) {\r\n obj[key] = formData.get(key)\r\n }\r\n return obj\r\n}\r\n\r\nfunction prepareFormValidation(form) {\r\n $(form).validate(validationOptions);\r\n}\r\n\r\n\r\n$(document).ready(function () {\r\n\r\n //This must be re-run when a new form is created via JS.\r\n $(\".validateForm\").each(function () {\r\n prepareFormValidation($(this))\r\n });\r\n\r\n //Detect mobile devices\r\n if ($('#mobile-detect').css('display') == 'none') {\r\n is_mobile = true;\r\n }\r\n\r\n //FAQ accordians\r\n const faqSelect = document.getElementById(\"faqSelect\");\r\n if (faqSelect) {\r\n const supportAccordion = document.getElementById(\"supportAccordion\");\r\n const mixer = mixItUp(supportAccordion, {\r\n selectors: {\r\n target: \".accordion-item\"\r\n },\r\n animation: {\r\n duration: 300\r\n }\r\n });\r\n faqSelect.addEventListener(\"change\", (e) => {\r\n mixer.filter(e.target.value)\r\n })\r\n }\r\n\r\n //Product category sorting\r\n const orderbySelect = document.getElementById(\"orderby\");\r\n if (orderbySelect) {\r\n orderbySelect.addEventListener(\"change\", (e) => {\r\n const form = orderbySelect.closest(\"form\")\r\n if (form) form.submit()\r\n });\r\n }\r\n\r\n //Region selector (auto submit)\r\n $(\"#region-select\").on(\"change\", function () {\r\n $(this).parents(\"form\").submit();\r\n });\r\n\r\n\r\n //Init quick content form\r\n const offCanvas = document.getElementById(\"feedbackOffCanvas\")\r\n const offCanvasContent = document.getElementById(\"offcanvasContent\")\r\n let quickContactLoaded = false\r\n\r\n offCanvas.addEventListener(\"shown.bs.offcanvas\", () => {\r\n if (!quickContactLoaded) {\r\n fetch(\"/ajax/quickContact\")\r\n .then(resp => resp.text())\r\n .then(data => {\r\n offCanvasContent.innerHTML = data\r\n quickContactLoaded = true\r\n setTimeout(() => {\r\n $(offCanvasContent.querySelector(\"form\")).validate(validationOptions);\r\n handleAjaxForm({\r\n form: offCanvasContent.querySelector(\"form\"),\r\n success: (data) => {\r\n Ladda.stopAll()\r\n Offcanvas.getInstance(document.getElementById(\"feedbackOffCanvas\")).hide()\r\n document.getElementById(\"feedback-btn\").style.display = \"none\"\r\n bootbox.alert(\"Thank you for contacting us. We'll get back to you soon.\");\r\n },\r\n error: (err) => {\r\n Ladda.stopAll()\r\n bootbox.alert({\r\n message: \"There was an error processing your request. Please try again.\",\r\n className: \"bg-danger\"\r\n });\r\n }\r\n })\r\n }, 0)\r\n })\r\n }\r\n })\r\n\r\n\r\n\r\n\r\n //Captcha forms\r\n if ($(\".captcha-form\").length > 0) {\r\n\r\n //Public site key from Google must be injected here:\r\n const captchaSystem = load(\"6LcnlgErAAAAAAcz66zZ1LP8lkYKIq_b1S_7kOXE\")\r\n\r\n $(\".captcha-form\").on(\"submit\", function (e) {\r\n e.preventDefault()\r\n const $form = $(this)\r\n\r\n //Standard form validation\r\n prepareFormValidation($form)\r\n if (!$form.valid()) return\r\n\r\n const action = $form.data(\"captcha-action\")\r\n //const l = Ladda.create($form.find(\"button[type='submit']\")[0])\r\n _blockForm($form)\r\n\r\n\r\n captchaSystem.then((recaptcha) => {\r\n recaptcha.execute(action).then(token => {\r\n $form.find(\"input[name='captcha_response']\")[0].value = token\r\n e.target.submit()\r\n })\r\n })\r\n })\r\n\r\n const _blockForm = function ($form) {\r\n //btn.start()\r\n $form.find(\"input,textarea,submit,button,a\").attr(\"readonly\", true)\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n\r\n});\r\n","// import mobileDetect from \"mobile-detect\"\r\n\r\n// //Init search bar if user is NOT on mobile device\r\n// var md = new mobileDetect(window.navigator.userAgent);\r\n// if (!md.mobile()) {\r\n// initSearchBar()\r\n// }\r\n\r\n// function initSearchBar() {\r\n// alert(\"desk\");\r\n// }\r\n\r\nimport { autocomplete } from \"@algolia/autocomplete-js\";\r\n\r\nfunction debouncePromise(fn, delay) {\r\n let timerId;\r\n\r\n return (...args) => {\r\n // Clear any existing timer\r\n if (timerId) {\r\n clearTimeout(timerId);\r\n }\r\n\r\n // Return a new promise, resolving after the debounce delay\r\n return new Promise((resolve, reject) => {\r\n timerId = setTimeout(() => {\r\n try {\r\n resolve(fn(...args));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n }, delay);\r\n });\r\n };\r\n}\r\nconst debouncedFetch = debouncePromise(fetch, 300)\r\n\r\nautocomplete({\r\n container: \"#autocomplete\",\r\n placeholder: \"Search for products\",\r\n detachedMediaQuery: \"(max-width: 767px)\",\r\n getSources({ query }) {\r\n return debouncedFetch(`/ajax/search?q=${query}`)\r\n .then(res => res.json())\r\n .then(data => {\r\n return [\r\n {\r\n sourceId: \"products\",\r\n getItems() {\r\n return data\r\n },\r\n getItemUrl({ item }) {\r\n return `/product/${item.slug}/${item.id}`\r\n },\r\n templates: {\r\n item({ item, html }) {\r\n return html`\r\n
\r\n
\r\n \r\n
\r\n
\r\n ${item.name} \r\n
\r\n
\r\n
`\r\n },\r\n noResults() {\r\n return `No results found`\r\n }\r\n }\r\n }\r\n ]\r\n })\r\n },\r\n onSubmit({ state }) {\r\n const query = state.query;\r\n if (query.trim()) {\r\n window.location.href = `/search?q=${query}`\r\n }\r\n }\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Animate on Scroll\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n//? https://github.com/michalsnik/aos\r\nimport AOS from 'aos'; \r\n\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\n\r\nwindow.addEventListener('load', (event) => {\r\n AOS.init(); \r\n});","// | ------------------------------------------------------------------------\r\n// | Product Filters\r\n// | ------------------------------------------------------------------------\r\n\r\nimport { OverlayScrollbars } from \"overlayscrollbars\";\r\n\r\nconst filters = document.querySelector(\".product-filters\");\r\nif (filters) {\r\n // Set Custom Properties needed to calculate the height of the filters\r\n const calcFilterHeight = () => {\r\n const filterHeader = document.querySelector(\".product-filters-header\");\r\n const filterFooter = document.querySelector(\".product-filters-footer\");\r\n\r\n const setFilterHeight = (element, cssVar) => {\r\n const height = element ? element.offsetHeight : 0;\r\n document.documentElement.style.setProperty(cssVar, `${height}px`);\r\n };\r\n\r\n setFilterHeight(filterHeader, \"--filter-header-height\");\r\n setFilterHeight(filterFooter, \"--filter-footer-height\");\r\n };\r\n\r\n // Run on scroll/load/resize\r\n // Run on scroll/load/resize\r\n [\"scroll\", \"load\", \"resize\"].forEach((event) =>\r\n window.addEventListener(event, calcFilterHeight, false)\r\n );\r\n\r\n // Resize sticky filter button when it becomes sticky\r\n window.onscroll = () => {\r\n const el = document.querySelector(\".product-filters-column\");\r\n const observer = new IntersectionObserver(\r\n ([e]) => e.target.classList.toggle(\"is-pinned\", e.intersectionRatio < 1),\r\n { threshold: [1] }\r\n );\r\n observer.observe(el);\r\n };\r\n\r\n // Add custom scroll bar to the filters when needed\r\n OverlayScrollbars(document.querySelector(\".product-filters-body\"), {\r\n overflow: {\r\n x: \"hidden\",\r\n },\r\n scrollbars: {\r\n visibility: \"auto\",\r\n autoHide: \"leave\",\r\n },\r\n });\r\n\r\n // Open and close filters on mobile devices\r\n window.addEventListener(\"load\", (event) => {\r\n // Set variables\r\n const body = document.querySelector(\"body\");\r\n const filters = document.querySelector(\".product-filters\");\r\n const button = document.querySelector(\".product-filters-button\");\r\n const closeButton = document.querySelector(\".close-filters-button\");\r\n let windowWidth = document.body.clientWidth;\r\n\r\n // Toggle menu function\r\n var toggleDrawer = function () {\r\n body.classList.toggle(\"filters-open\");\r\n button.classList.toggle(\"toggled\");\r\n document.documentElement.classList.toggle(\"no-scroll\");\r\n };\r\n\r\n if (button) {\r\n // Open/close filters using button\r\n button.addEventListener(\"click\", (event) => {\r\n event.stopPropagation();\r\n toggleDrawer();\r\n });\r\n\r\n // Prevent filters from closing when clicked\r\n filters.addEventListener(\"click\", (event) => event.stopPropagation());\r\n\r\n // Close filters when clicking off them\r\n body.addEventListener(\"click\", () => {\r\n if (body.classList.contains(\"filters-open\")) toggleDrawer()\r\n });\r\n\r\n // Close filters when clicking close button\r\n closeButton.addEventListener(\"click\", () => {\r\n if (body.classList.contains(\"filters-open\")) toggleDrawer()\r\n });\r\n\r\n // Close filters if window is resized\r\n window.addEventListener(\"resize\", () => {\r\n if (document.body.clientWidth !== windowWidth) {\r\n if (body.classList.contains(\"filters-open\")) toggleDrawer();\r\n }\r\n windowWidth = document.body.clientWidth;\r\n });\r\n }\r\n });\r\n}\r\n\r\n\r\n\r\n// ─── New Sub-category Filters ────────────────────────────────────────────────\r\n\r\n/**\r\n * .nav\r\n * .nav-item\r\n * .nav-link.nav-item subcat-toggle (active) (open) - data-menu=\"#subcat-{id}\"\r\n * \r\n * .subcat-menu-grid\r\n * .subcat-menu (active) - id=\r\n * \r\n */\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n\r\n const TOPINDEX = 100\r\n\r\n const navLinks = document.querySelectorAll(\".subcat-toggle\")\r\n let activeMenu = null // Tracks the currently active menu\r\n let hideMenuTimeout = null // Timer for hiding menus\r\n\r\n // Find the default open nav-link on page load\r\n const defaultLink = document.querySelector(\".subcat-toggle.open\")\r\n const defaultMenu = defaultLink ? document.querySelector(defaultLink.getAttribute(\"data-menu\")) : null\r\n\r\n // Function to activate a menu\r\n const showMenu = (link, submenu) => {\r\n clearTimeout(hideMenuTimeout); // Cancel any hiding timers\r\n if (activeMenu) {\r\n activeMenu.link.classList.remove(\"open\")\r\n activeMenu.submenu.classList.remove(\"active\")\r\n activeMenu.submenu.style.zIndex = 1\r\n }\r\n link.classList.add(\"open\")\r\n submenu.classList.add(\"active\")\r\n submenu.style.zIndex = TOPINDEX\r\n activeMenu = { link, submenu }\r\n };\r\n\r\n // Function to deactivate all menus and show the default\r\n const showDefaultMenu = () => {\r\n clearTimeout(hideMenuTimeout) // Cancel hiding timers\r\n if (activeMenu) {\r\n activeMenu.link.classList.remove(\"open\")\r\n activeMenu.submenu.classList.remove(\"active\")\r\n activeMenu.submenu.style.zIndex = 1\r\n }\r\n if (defaultLink && defaultMenu) {\r\n defaultLink.classList.add(\"open\")\r\n defaultMenu.classList.add(\"active\")\r\n defaultMenu.style.zIndex = TOPINDEX\r\n activeMenu = { link: defaultLink, submenu: defaultMenu }\r\n } else {\r\n activeMenu = null\r\n }\r\n };\r\n\r\n // Function to hide the current menu\r\n const hideMenu = () => {\r\n hideMenuTimeout = setTimeout(showDefaultMenu, 100) // Small delay to prevent flickering\r\n };\r\n\r\n navLinks.forEach((link) => {\r\n const menuSelector = link.getAttribute(\"data-menu\")\r\n const submenu = document.querySelector(menuSelector)\r\n\r\n if (menuSelector && !submenu) {\r\n link.addEventListener(\"mouseenter\", () => {\r\n clearTimeout(hideMenuTimeout) // Cancel hiding timers\r\n if (activeMenu) {\r\n activeMenu.link.classList.remove(\"open\")\r\n activeMenu.submenu.classList.remove(\"active\")\r\n activeMenu.submenu.style.zIndex = 1\r\n }\r\n })\r\n link.addEventListener(\"mouseleave\", (event) => hideMenu());\r\n }\r\n\r\n if (!submenu) return\r\n\r\n\r\n // Hover events for the nav-link\r\n link.addEventListener(\"mouseenter\", () => showMenu(link, submenu))\r\n link.addEventListener(\"mouseleave\", (event) => {\r\n if (submenu && !submenu.contains(event.relatedTarget)) {\r\n hideMenu()\r\n }\r\n });\r\n\r\n // Hover events for the submenu\r\n submenu.addEventListener(\"mouseenter\", () => {\r\n clearTimeout(hideMenuTimeout) // Cancel hiding if hovering over the submenu\r\n });\r\n submenu.addEventListener(\"mouseleave\", (event) => {\r\n if (!link.contains(event.relatedTarget)) {\r\n hideMenu()\r\n }\r\n });\r\n });\r\n\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Components - Shop - Product Gallery\r\n// | ------------------------------------------------------------------------\r\n\r\nimport Splide from \"@splidejs/splide\"; //? https://splidejs.com/\r\n//import GLightbox from 'glightbox/dist/js/glightbox.js'; //? https://github.com/biati-digital/glightbox\r\n\r\nimport fsLightbox from \"fslightbox\";\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n var prodGallery = document.querySelector(\".prod-main-carousel\");\r\n var prodSingleGallery = document.querySelector(\".prod-single-carousel\");\r\n\r\n if (prodGallery) {\r\n var prodThumbs = new Splide(\".prod-thumbnails\", {\r\n type: \"loop\",\r\n gap: 10,\r\n perPage: 4,\r\n perMove: 1,\r\n cover: true,\r\n isNavigation: true,\r\n pagination: false,\r\n }).mount();\r\n\r\n var prodMainCarousel = new Splide(\".prod-main-carousel\", {\r\n type: \"fade\",\r\n pagination: false,\r\n arrows: false,\r\n cover: true,\r\n });\r\n\r\n prodMainCarousel.sync(prodThumbs).mount();\r\n\r\n // Light box\r\n //var lightbox = GLightbox({\r\n //\ttouchNavigation: true,\r\n //\tloop: true,\r\n //});\r\n }\r\n\r\n if (prodSingleGallery) {\r\n var prodSingleCarousel = new Splide(\".prod-single-carousel\", {\r\n type: \"fade\",\r\n pagination: false,\r\n arrows: false,\r\n cover: true,\r\n });\r\n\r\n prodSingleCarousel.mount();\r\n }\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Components - Shop - Quick Quote Modal\r\n// | ------------------------------------------------------------------------\r\n\r\nimport { Modal } from \"bootstrap\";\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n var productsPage = document.querySelector(\"#quickQuote\");\r\n\r\n if (productsPage) {\r\n // Set up modal\r\n const quoteModal = new Modal(document.getElementById(\"quickQuote\"), {\r\n backdrop: false,\r\n });\r\n\r\n // Get modal element\r\n const quoteModalElement = document.getElementById(\"quickQuote\");\r\n // Get button element\r\n const quoteBtn = document.getElementById(\"quickQuoteBtn\");\r\n\r\n // Avoid jumping around with scrollbars when the modal opens\r\n quoteModalElement.addEventListener(\"shown.bs.modal\", (event) => {\r\n document.body.style.overflow = \"\";\r\n document.body.style.paddingRight = \"0\";\r\n document.body.classList.remove(\"modal-open\");\r\n });\r\n\r\n // Add button when modal closes\r\n if (quoteBtn) {\r\n quoteModalElement.addEventListener(\"hide.bs.modal\", (event) => {\r\n quoteBtn.classList.remove(\"d-none\");\r\n });\r\n }\r\n\r\n // Hide the modal\r\n function hideQuickQuote() {\r\n quoteModal.hide();\r\n }\r\n\r\n // Check if viewing on a desktop\r\n const isDesktop = window.matchMedia(\"(min-width: 768px)\");\r\n\r\n if (isDesktop.matches) {\r\n // If so show the modal with timeout\r\n //FUCK OFF: quoteModal.show();\r\n\r\n // Remove any styles on the body we don't need\r\n document.body.classList.remove(\"modal-open\");\r\n document.body.style.overflow = \"\";\r\n document.body.style.paddingRight = \"\";\r\n if (quoteBtn) {\r\n quoteBtn.classList.add(\"d-none\");\r\n }\r\n setTimeout(hideQuickQuote, 30000);\r\n } else {\r\n // Else show the button to be able to open the modal\r\n }\r\n }\r\n});\r\n","import Mustache from \"mustache\";\r\n\r\nvar showingSearchResults = false;\r\n\r\n$(function () {\r\n if ($(\"#support-download-holder\").length > 0) {\r\n initDownloadViewer();\r\n }\r\n});\r\n\r\nfunction initDownloadViewer() {\r\n $(\"#dl_filter\").on(\"click\", \"li a\", function (e) {\r\n console.log(\"CLICKED\");\r\n e.preventDefault();\r\n\r\n var d = new Date();\r\n var n = d.getTime();\r\n\r\n var column = $(this).parents(\".dl-col\").attr(\"id\");\r\n var param = \"timestamp=\" + n;\r\n var dest = \"\";\r\n\r\n $(\"#\" + column)\r\n .find(\"li a\")\r\n .removeClass(\"on\");\r\n $(this).addClass(\"on\");\r\n\r\n switch (column) {\r\n case \"dl_cats\":\r\n param = param + \"&type=dl_cats&id=\" + $(this).attr(\"id\");\r\n $(\"#dl_holder\").fadeOut();\r\n $(\"#dl_types\").html(\"\");\r\n $(\"#dl_products\").html(\"\");\r\n $(\"#dl_filetypes\").html(\"\");\r\n\r\n dest = \"dl_types\";\r\n break;\r\n\r\n case \"dl_types\":\r\n param = param + \"&type=dl_types&id=\" + $(this).attr(\"id\");\r\n $(\"#dl_holder\").fadeOut();\r\n $(\"#dl_products\").html(\"\");\r\n $(\"#dl_filetypes\").html(\"\");\r\n dest = \"dl_products\";\r\n break;\r\n\r\n case \"dl_products\":\r\n param = param + \"&type=dl_products&id=\" + $(this).attr(\"id\");\r\n $(\"#dl_holder\").fadeOut();\r\n $(\"#dl_filetypes\").html(\"\");\r\n dest = \"dl_filetypes\";\r\n break;\r\n\r\n case \"dl_filetypes\":\r\n param =\r\n param +\r\n \"&type=dl_filetypes&id=\" +\r\n $(this).attr(\"id\") +\r\n \"&owner_id=\" +\r\n $(\"#dl_products ul li a.on\").attr(\"id\");\r\n break;\r\n\r\n default:\r\n console.log(\"Unknown column: \" + column);\r\n }\r\n\r\n setLoader(dest);\r\n getList(param, dest);\r\n });\r\n\r\n //On load, return all available categories\r\n getList(\"\", \"dl_cats\");\r\n\r\n $(\"#fileSearch\").keyup(function (e) {\r\n if (e.which === 13) {\r\n submitSearch();\r\n }\r\n if ($(this).val().length > 0) {\r\n $(\"#btn-fileSearch\").removeAttr(\"disabled\");\r\n } else {\r\n $(\"#btn-fileSearch\").attr(\"disabled\", \"disabled\");\r\n }\r\n });\r\n\r\n $(\"#btn-fileSearch\").click(function (e) {\r\n submitSearch();\r\n });\r\n\r\n $(\"#btn-fileClear\").click(function (e) {\r\n showingSearchResults = false;\r\n setLoader(\"dl_cats\");\r\n getList(\"\", \"dl_cats\");\r\n $(\"#filterPane\").slideDown();\r\n $(\"#dl_holder\").fadeOut();\r\n $(\"#btn-fileClear\").attr(\"disabled\", \"disabled\");\r\n });\r\n}\r\n\r\nfunction setLoader(dest) {\r\n if (dest !== \"\") {\r\n $(\"#\" + dest).html(\r\n '
\"Loading\"
'\r\n );\r\n }\r\n}\r\n\r\nfunction hideLoader() {\r\n $(\"img[name='loader']\").fadeOut(\"fast\", function () {\r\n $(this).remove();\r\n });\r\n}\r\n\r\nfunction submitSearch() {\r\n showingSearchResults = true;\r\n $(\"#filterPane\").slideUp();\r\n $(\"#btn-fileClear\").removeAttr(\"disabled\");\r\n\r\n var d = new Date();\r\n var n = d.getTime();\r\n var param =\r\n \"timestamp=\" + n + \"&type=dl_filetypes&search=\" + $(\"#fileSearch\").val();\r\n getList(param, \"\");\r\n}\r\n\r\n//param = data to send to ajax script\r\n//dest = destination column to populate\r\nfunction getList(param, dest) {\r\n param = param || \"\";\r\n $.ajax({\r\n url: \"/ajax/downloads\",\r\n type: \"get\",\r\n data: param,\r\n success: function (data) {\r\n //console.log(data);\r\n if (dest !== \"\") {\r\n var output = Mustache.render(\r\n '',\r\n data\r\n );\r\n $(\"#\" + dest).html(output);\r\n } else {\r\n var output;\r\n if (data.length === 0) {\r\n output =\r\n '
No downloads were found for your search term.
';\r\n } else {\r\n output = Mustache.render(\r\n `\r\n {{#.}}\r\n {{type}}\r\n {{title}}\r\n {{filesize}}\r\n {{created_on}}\r\n \r\n Download \r\n \r\n {{/.}}\r\n `,\r\n data\r\n );\r\n }\r\n $(\"#dl_holder .dl-items\").html(output);\r\n $(\"#dl_holder\").fadeIn();\r\n }\r\n },\r\n });\r\n}\r\n","import plupload from \"plupload\"\r\n\r\nconst urlParams = new URLSearchParams(window.location.search);\r\nconst debug = urlParams.get('debug');\r\n\r\n$(function () {\r\n if ($(\"#career-app-form\").length > 0) {\r\n initCareerForm()\r\n }\r\n})\r\n\r\nfunction initCareerForm() {\r\n\r\n var currentUpload = \"\";\r\n\r\n var uploader = new plupload.Uploader({\r\n runtimes: \"html5\",\r\n browse_button: \"pickfiles\", //Doesn't matter - Not used, but required in config\r\n container: document.getElementById('career-app-form'),\r\n url: \"/ajax/uploadFile.php\",\r\n filters: {\r\n max_file_size: '10mb',\r\n mime_types: [\r\n { title: \"PDF files\", extensions: \"pdf\" },\r\n { title: \"Word files\", extensions: \"doc,docx,rtf,txt\" }\r\n ]\r\n },\r\n init: {\r\n PostInit: function () {\r\n //Nothing to do here\r\n },\r\n\r\n FilesAdded: function (up, files) {\r\n //Nothing to do here\r\n },\r\n\r\n UploadProgress: function (up, file) {\r\n $(\"#upload-progress .progress-bar\").css(\"width\", file.percent + \"%\");\r\n },\r\n\r\n UploadComplete: function (up, file) {\r\n enableUploadsForm();\r\n },\r\n\r\n Error: function (up, err) {\r\n $(\"#\" + currentUpload).val(\"\");\r\n alert(\"An error occured while uploading: \" + err.message);\r\n enableUploadsForm();\r\n }\r\n }\r\n })\r\n uploader.init();\r\n\r\n $(\".file-select\").change(function (e) {\r\n currentUpload = $(this).attr(\"id\");\r\n var field = document.getElementById(currentUpload);\r\n\r\n disableUploadsForm();\t\t\t\t\t\t//Disable form uploads and submit button\r\n uploader.splice(0, uploader.files.length);\t//Remove any current files\r\n uploader.addFile(field);\t\t\t\t\t//Add new file to queue\r\n\r\n createUploadProgress().insertAfter($(this));//Create progress bar\r\n uploader.start();\t\t\t\t\t\t\t//Upload files\r\n })\r\n}\r\n\r\nfunction enableUploadsForm() {\r\n $(\".file-select\").removeAttr(\"disabled\");\r\n $(\"#send-btn\").removeAttr(\"disabled\");\r\n if (debug !== \"true\") {\r\n $(\"#upload-progress\").remove();\r\n }\r\n}\r\n\r\nfunction disableUploadsForm() {\r\n $(\".file-select\").attr(\"disabled\", \"disabled\");\r\n $(\"#send-btn\").attr(\"disabled\", \"disabled\");\r\n}\r\n\r\nfunction createUploadProgress() {\r\n return $(\"
\", {\r\n \"id\": \"upload-progress\",\r\n \"class\": \"progress\"\r\n }).append(\r\n $(\"
\", {\r\n \"class\": \"progress-bar\",\r\n \"style\": \"width: 0%\"\r\n })\r\n );\r\n}","// | ------------------------------------------------------------------------\r\n// | Imports\r\n// | ------------------------------------------------------------------------\r\n\r\n// Bootstrap ----------------------------------------------------------------\r\n\r\nimport \"@popperjs/core\"; // Popper is required for dropdowns, popovers and tooltips.\r\nimport {\r\n Alert,\r\n Button,\r\n //Carousel,\r\n Collapse,\r\n Dropdown,\r\n Modal,\r\n OffCanvas,\r\n Popover,\r\n //ScrollSpy,\r\n Tab,\r\n //Toast,\r\n Tooltip,\r\n} from \"bootstrap\";\r\n\r\n// Bootstrap overrides, calls and template integration\r\nimport \"./bootstrap/collapse\";\r\nimport \"./bootstrap/modals\";\r\nimport \"./bootstrap/offcanvas\";\r\nimport \"./bootstrap/popovers\";\r\nimport \"./bootstrap/tooltips\";\r\n\r\n// Imports used in shop components ------------------------------------------\r\n\r\n//? https://kingsora.github.io/OverlayScrollbars/\r\nimport { OverlayScrollbars } from \"overlayscrollbars\"; // Used in /components/shop/productFilters\r\n\r\n//? https://splidejs.com/\r\nimport Splide from \"@splidejs/splide\"; // Used in /components/shop/productGallery\r\n\r\nimport fsLightbox from \"fslightbox\"; // Used in /components/shop/productGallery\r\n\r\n// Other imports ------------------------------------------------------------\r\n\r\n//? https://github.com/michalsnik/aos\r\nimport AOS from \"aos\"; // Used in /components/animateOnScroll\r\n\r\n//? https://simpleparallax.com/\r\n//import simpleParallax from \"simple-parallax-js\"; // Used in /components/parallaxSections\r\n\r\n//? https://github.com/yowainwright/shav\r\nimport shave from \"shave\"; // Used in /components/ellipsis\r\n\r\n// | ------------------------------------------------------------------------\r\n// | Components\r\n// | ------------------------------------------------------------------------\r\n\r\n// Cookie popup\r\nimport \"./components/cookiePopup\";\r\n\r\n// | Layout -----------------------------------------------------------------\r\n\r\nimport \"./components/fixedHeader\";\r\n\r\n// | Navigation -------------------------------------------------------------\r\n\r\nimport \"./components/mainNavigation\";\r\nimport \"./components/dropdownOnHover\";\r\nimport \"./components/tableRowLinks\";\r\n\r\n// | Content ----------------------------------------------------------------\r\n\r\n//import \"./components/modernizr-webp\"; // Allow background images to fallback to jpegs\r\nimport \"./components/ellipsis\"; // Allows us to restrict text content using ellipsis\r\nimport \"./components/scrollbars\"; // Add custom scrollbars to certain elements\r\nimport \"./components/carousels\";\r\nimport \"./components/forms\";\r\nimport \"./components/search\";\r\n\r\n// | Animations -------------------------------------------------------------\r\n\r\nimport \"./components/animateOnScroll\"; // Animate elements on page scroll\r\nimport \"./components/heroParallaxBlur\"; // Parallax, blur and fade hero background image on scroll\r\n//import \"./components/parallaxSections\"; // Parallax backgrounds for page sections\r\n\r\n// | Shop specific ----------------------------------------------------------\r\n\r\nimport \"./components/shop/productFilters\";\r\nimport \"./components/shop/productGallery\";\r\n//import \"./components/shop/productGrid\";\r\n//import \"./components/shop/quantityInputs\";\r\nimport \"./components/shop/quickQuoteModal\";\r\n\r\n// | ------------------------------------------------------------------------\r\n// | Page Specific\r\n// | ------------------------------------------------------------------------\r\n\r\nimport \"./pages/homepage\";\r\nimport \"./pages/about\";\r\nimport \"./pages/downloads\";\r\nimport \"./pages/career\";\r\n\r\n// | ------------------------------------------------------------------------\r\n// | Code\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {});\r\n\r\n// | ------------------------------------------------------------------------\r\n","// | ------------------------------------------------------------------------\r\n// | Bootstrap - OffCanvas\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\n\r\n// | ------------------------------------------------------------------------ \r\n\r\ndocument.addEventListener( 'DOMContentLoaded', function() {\r\n\r\n // Prevents site header and cookie popup from jumping around when offcanvas is opened\r\n\r\n const offCanvases = document.querySelectorAll('.offcanvas')\r\n\r\n offCanvases.forEach(e => {\r\n e.addEventListener('show.bs.offcanvas', event => {\r\n document.querySelector(\"body\").classList.toggle('offcanvas-open');\r\n }) \r\n e.addEventListener('hidden.bs.offcanvas', event => {\r\n document.querySelector(\"body\").classList.toggle('offcanvas-open');\r\n }) \r\n\r\n }); \r\n\r\n});","// | ------------------------------------------------------------------------\r\n// | Cookie Popup\r\n// | ------------------------------------------------------------------------\r\n\r\n// | Options ----------------------------------------------------------------\r\n\r\n// Set the type of cookies we want consent for ('essential' will always be used by default)\r\nconst targetingCookies = true;\r\nconst personalCookies = true;\r\nconst analyticsCookies = true;\r\n\r\n// Set the Tag Manager and/or gtag Ids\r\nlet tagManagerIds = [\"GTM-K5LMG8P\"]; // Ids usually start with GTM-\r\nlet gtagIds = [\"G-NJ9YSFTFQ2\", \"G-4B8PMM8VB5\", \"AW-872335304\"]; // Ids usually start with G- or AW-\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\n// | Set up the dataLayer ---------------------------------------------------\r\n\r\n// Define dataLayer and the gtag function\r\nwindow.dataLayer = window.dataLayer || [];\r\nfunction gtag() {\r\n dataLayer.push(arguments);\r\n}\r\n\r\n// Set default consent to 'denied' as a placeholder\r\ngtag(\"consent\", \"default\", {\r\n ad_user_data: \"denied\",\r\n ad_personalization: \"denied\",\r\n ad_storage: \"denied\",\r\n analytics_storage: \"denied\",\r\n personalization_storage: \"denied\",\r\n wait_for_update: 500,\r\n});\r\n\r\n// Check if we have anything in gtagIds\r\nif (gtagIds.length == 0) {\r\n // Array is empty so nothing to push\r\n} else {\r\n gtag(\"js\", new Date());\r\n\r\n // Loop through gTagIds\r\n for (const gtagId of gtagIds) {\r\n gtag(\"config\", gtagId);\r\n }\r\n}\r\n\r\n// Check if we have anything in tagManagerIds\r\nif (tagManagerIds.length == 0) {\r\n // Array is empty so nothing to push\r\n} else {\r\n // Loop through tagManagerIds and push to the dataLayer\r\n for (const tagManagerId of tagManagerIds) {\r\n gtag(\"config\", tagManagerId);\r\n }\r\n dataLayer.push({ \"gtm.start\": new Date().getTime(), event: \"gtm.js\" });\r\n}\r\n\r\n// Create the cookie popup\r\nfunction createCookiePopup() {\r\n var cookieContainerElement = document.querySelector(\".cookie-container\");\r\n\r\n if (cookieContainerElement) {\r\n // If the cookie container is already open then do nothing\r\n } else {\r\n // Remove the cookie button\r\n const cookieLink = document.querySelector(\"#cookieLink\");\r\n if (cookieLink) {\r\n cookieLink.remove();\r\n }\r\n\r\n // Create Cookie Container\r\n let cookieContainer = document.createElement(\"div\");\r\n cookieContainer.classList.add(\"cookie-container\");\r\n\r\n // Create intro text\r\n let cookieIntro = document.createElement(\"p\");\r\n cookieIntro.innerHTML =\r\n \"We use cookies to improve user experience. Choose what cookies you allow us to use below. You can find out more in our Cookie Policy\";\r\n\r\n // Append intro to container\r\n cookieContainer.appendChild(cookieIntro);\r\n\r\n // Create cookie options holder\r\n let cookieOptionsHolder = document.createElement(\"div\");\r\n cookieOptionsHolder.classList.add(\"cookie-options\");\r\n\r\n // Add cookie options\r\n addCookieOptions(cookieOptionsHolder);\r\n\r\n // Append options holder to container\r\n cookieContainer.appendChild(cookieOptionsHolder);\r\n\r\n // Create save button\r\n let saveButton = document.createElement(\"button\");\r\n saveButton.type = \"button\";\r\n saveButton.classList.add(\"btn\", \"btn-save\");\r\n saveButton.id = \"cookieSaveBtn\";\r\n saveButton.innerHTML = \"Save Preferences\";\r\n\r\n // Append save button\r\n cookieContainer.appendChild(saveButton);\r\n\r\n // Create accept all button\r\n let consentButton = document.createElement(\"button\");\r\n\r\n consentButton.type = \"button\";\r\n consentButton.classList.add(\"btn\", \"btn-consent\");\r\n consentButton.id = \"cookieConsentBtn\";\r\n consentButton.innerHTML = \"Accept All\";\r\n\r\n // Append accept all button\r\n cookieContainer.appendChild(consentButton);\r\n\r\n // Append cookie container to the body\r\n document.body.appendChild(cookieContainer);\r\n\r\n // Handle button clicks\r\n var consentBtn = document.querySelector(\"#cookieConsentBtn\");\r\n\r\n // If the 'Accept All' button is clicked then load gtag with everything granted\r\n consentBtn.addEventListener(\"click\", function () {\r\n // Set all cookies to true\r\n if (targetingCookies === true) {\r\n localStorage.setItem(\"targeting\", \"true\");\r\n } else {\r\n localStorage.setItem(\"targeting\", \"false\");\r\n }\r\n\r\n if (personalCookies === true) {\r\n localStorage.setItem(\"personal\", \"true\");\r\n } else {\r\n localStorage.setItem(\"personal\", \"false\");\r\n }\r\n\r\n if (analyticsCookies === true) {\r\n localStorage.setItem(\"analytics\", \"true\");\r\n } else {\r\n localStorage.setItem(\"analytics\", \"false\");\r\n }\r\n\r\n // update consent\r\n updateConsent();\r\n\r\n // Add cookie so we know that something has been accepted\r\n localStorage.setItem(\"consentGranted\", \"true\");\r\n\r\n // Close the cookie popup\r\n closeCookiePopup();\r\n\r\n cookieHeight();\r\n });\r\n\r\n // If the save button is clicked load gtag script depending on what's checked\r\n var saveBtn = document.querySelector(\"#cookieSaveBtn\");\r\n\r\n saveBtn.addEventListener(\"click\", function () {\r\n let cookieOptions = document.querySelectorAll(\".cookie-option input\");\r\n\r\n // Loop through each option and add cookie\r\n cookieOptions.forEach(function (cookieOption) {\r\n if (cookieOption.checked) {\r\n localStorage.setItem(cookieOption.value, \"true\");\r\n } else {\r\n localStorage.setItem(cookieOption.value, \"false\");\r\n }\r\n });\r\n\r\n // update consent\r\n updateConsent();\r\n\r\n // Add cookie so we know that something has been accepted\r\n localStorage.setItem(\"consentGranted\", \"true\");\r\n\r\n // Close the cookie popup\r\n closeCookiePopup();\r\n\r\n cookieHeight();\r\n });\r\n\r\n cookieHeight();\r\n }\r\n}\r\n\r\n// Add selected options to the cookie popup\r\nfunction addCookieOptions(cookieOptionsHolder) {\r\n // Create options array\r\n let cookieOptions = [\"essential\"];\r\n\r\n // Add items to array if selected as true\r\n if (targetingCookies === true) {\r\n cookieOptions.push(\"targeting\");\r\n }\r\n\r\n if (personalCookies === true) {\r\n cookieOptions.push(\"personal\");\r\n }\r\n\r\n if (analyticsCookies === true) {\r\n cookieOptions.push(\"analytics\");\r\n }\r\n\r\n cookieOptions.forEach(function (cookieOption) {\r\n // Create holder\r\n let optionHolder = document.createElement(\"div\");\r\n optionHolder.classList.add(\"cookie-option\");\r\n\r\n // Create Input\r\n let optionInput = document.createElement(\"input\");\r\n\r\n optionInput.type = \"checkbox\";\r\n optionInput.id = cookieOption;\r\n optionInput.name = cookieOption;\r\n optionInput.value = cookieOption;\r\n\r\n if (localStorage.getItem(cookieOption) === \"false\") {\r\n optionInput.removeAttribute(\"checked\");\r\n } else {\r\n optionInput.checked = \"true\";\r\n }\r\n\r\n if (cookieOption === \"essential\") {\r\n optionInput.disabled = \"true\";\r\n }\r\n\r\n // Create label and description\r\n let optionLabel = document.createElement(\"label\");\r\n let labelText = \"\";\r\n\r\n let optionDesc = document.createElement(\"p\");\r\n let optionDescText = \"\";\r\n\r\n if (cookieOption === \"targeting\") {\r\n labelText = \"Advertising\";\r\n optionDescText =\r\n \"We use these to deliver advertising that is more relevant to you.\";\r\n } else if (cookieOption === \"essential\") {\r\n labelText = \"Essential\";\r\n optionDescText =\r\n \"Required to enable basic website functionality. You may not disable these.\";\r\n } else if (cookieOption === \"personal\") {\r\n labelText = \"Personalisation\";\r\n optionDescText =\r\n \"Allows us to remember choices you make and provide enhanced, more personal features.\";\r\n } else if (cookieOption === \"analytics\") {\r\n labelText = \"Analytics\";\r\n optionDescText =\r\n \"Helps us to understand how the website performs, and how you interact with it.\";\r\n }\r\n\r\n optionDesc.innerHTML = optionDescText;\r\n\r\n optionLabel.htmlFor = cookieOption;\r\n optionLabel.innerHTML = labelText;\r\n optionLabel.classList.add(\"h5\", \"mb-0\");\r\n\r\n optionHolder.appendChild(optionInput);\r\n optionHolder.appendChild(optionLabel);\r\n optionHolder.appendChild(optionDesc);\r\n\r\n cookieOptionsHolder.appendChild(optionHolder);\r\n });\r\n}\r\n\r\n// Close the cookie popup\r\nfunction closeCookiePopup() {\r\n // Remove the cookie popup\r\n var cookieContainer = document.querySelector(\".cookie-container\");\r\n cookieContainer.remove();\r\n\r\n // Create the cookie button\r\n createCookieButton();\r\n}\r\n\r\n// Create the floating cookie icon button\r\nfunction createCookieButton() {\r\n let cookieButton = document.createElement(\"button\");\r\n\r\n cookieButton.type = \"button\";\r\n cookieButton.classList.add(\"btn\", \"btn-cookie\");\r\n cookieButton.id = \"cookieLink\";\r\n cookieButton.setAttribute(\"aria-label\", \"Cookie Preferences\");\r\n cookieButton.innerHTML =\r\n '';\r\n\r\n document.body.appendChild(cookieButton);\r\n\r\n const cookieLink = document.querySelector(\"#cookieLink\");\r\n\r\n cookieLink.addEventListener(\"click\", function () {\r\n createCookiePopup();\r\n });\r\n}\r\n\r\n// Check if consent has been given and updates the data layer\r\nfunction updateConsent() {\r\n if (localStorage.getItem(\"targeting\") === \"true\") {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n\r\n gtag(\"consent\", \"update\", {\r\n ad_user_data: \"granted\",\r\n ad_personalization: \"granted\",\r\n ad_storage: \"granted\",\r\n });\r\n } else {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n gtag(\"consent\", \"update\", {\r\n ad_user_data: \"denied\",\r\n ad_personalization: \"denied\",\r\n ad_storage: \"denied\",\r\n });\r\n }\r\n\r\n if (localStorage.getItem(\"analytics\") === \"true\") {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n\r\n gtag(\"consent\", \"update\", {\r\n analytics_storage: \"granted\",\r\n });\r\n } else {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n gtag(\"consent\", \"update\", {\r\n analytics_storage: \"denied\",\r\n });\r\n }\r\n\r\n if (localStorage.getItem(\"personal\") === \"true\") {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n\r\n gtag(\"consent\", \"update\", {\r\n personalization_storage: \"granted\",\r\n });\r\n } else {\r\n function gtag() {\r\n dataLayer.push(arguments);\r\n }\r\n gtag(\"consent\", \"update\", {\r\n personalization_storage: \"denied\",\r\n });\r\n }\r\n}\r\n\r\n// Calculates the amount of space needed to accommodate the cookie popup when open\r\nfunction cookieHeight() {\r\n var cookiePopUp = document.querySelector(\".cookie-container\");\r\n\r\n if (cookiePopUp) {\r\n var popUpHeight = cookiePopUp.offsetHeight;\r\n document.documentElement.style.setProperty(\r\n \"--cookie-height\",\r\n popUpHeight + \"px\"\r\n );\r\n } else {\r\n document.documentElement.style.setProperty(\"--cookie-height\", 0 + \"px\");\r\n }\r\n}\r\n\r\n// Once page has loaded check if cookies have been accepted and create the cookie button\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n // Run cookieHeight() on load and resize\r\n cookieHeight();\r\n\r\n window.addEventListener(\"resize\", function (event) {\r\n cookieHeight();\r\n });\r\n\r\n if (localStorage.getItem(\"consentGranted\") === \"true\") {\r\n // If consent has been provided previously then update consent\r\n updateConsent();\r\n\r\n // Check if we have anything in gtagIds, if so add the script tags\r\n if (gtagIds.length == 0) {\r\n // Array is empty so nothing to create\r\n } else {\r\n // Loop through gTagIds\r\n for (const gtagId of gtagIds) {\r\n var gtagScript = document.createElement(\"script\");\r\n gtagScript.async = true;\r\n gtagScript.src =\r\n \"https://www.googletagmanager.com/gtag/js?id=\" + gtagId;\r\n var firstScript = document.getElementsByTagName(\"script\")[0];\r\n document.head.appendChild(gtagScript, firstScript);\r\n }\r\n }\r\n\r\n // Check if we have anything in tagManagerIds, if so add the script tags\r\n if (tagManagerIds.length == 0) {\r\n // Array is empty so nothing to create\r\n } else {\r\n // Loop through tagManagerIds\r\n for (const tagManagerId of tagManagerIds) {\r\n // Create and insert script tag(s)\r\n var gtmScript = document.createElement(\"script\");\r\n gtmScript.async = true;\r\n gtmScript.src =\r\n \"https://www.googletagmanager.com/gtm.js?id=\" + tagManagerId;\r\n var firstScript = document.getElementsByTagName(\"script\")[0];\r\n document.head.appendChild(gtmScript, firstScript);\r\n\r\n // Create noscript and iframe elements, and add them straight after opening body tag\r\n var noScript = document.createElement(\"noscript\");\r\n var iframe = document.createElement(\"iframe\");\r\n iframe.src =\r\n \"https://www.googletagmanager.com/ns.html?id=\" + tagManagerId;\r\n iframe.height = \"0\";\r\n iframe.width = \"0\";\r\n iframe.style.display = \"none\";\r\n iframe.style.visibility = \"hidden\";\r\n\r\n var firstChild = document.body.firstChild;\r\n\r\n noScript.prepend(iframe);\r\n firstChild.parentNode.insertBefore(noScript, firstChild);\r\n }\r\n }\r\n\r\n // Create cookie Button so that cookie preferences can be edited\r\n createCookieButton();\r\n } else {\r\n // If consent has not previously been given then create the cookie popup\r\n createCookiePopup();\r\n }\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Dropdown On Hover\r\n// | ------------------------------------------------------------------------\r\n\r\nvar dropdownMenu = function () {\r\n var windowWidth = document.body.clientWidth;\r\n var header = document.querySelector(\".site-header\");\r\n\r\n if (windowWidth > 767) {\r\n var navItem = document.querySelectorAll(\".site-header .dropdown\");\r\n var catItem = document.querySelectorAll(\".tag-links .dropdown\");\r\n\r\n for (var i = 0; i < navItem.length; i++) {\r\n navItem[i].onmouseenter = function () {\r\n this.classList.add(\"show\");\r\n this.querySelector(\".dropdown-toggle\").setAttribute(\r\n \"aria-expanded\",\r\n \"true\"\r\n );\r\n this.querySelector(\".dropdown-menu\").classList.add(\"show\");\r\n header.classList.add(\"menu-open\");\r\n };\r\n navItem[i].onmouseleave = function () {\r\n this.classList.remove(\"show\");\r\n this.querySelector(\".dropdown-toggle\").setAttribute(\r\n \"aria-expanded\",\r\n \"false\"\r\n );\r\n this.querySelector(\".dropdown-menu\").classList.remove(\"show\");\r\n header.classList.remove(\"menu-open\");\r\n };\r\n }\r\n }\r\n};\r\n\r\n// Run on scroll/load/resize\r\nwindow.addEventListener(\"scroll\", dropdownMenu, false);\r\nwindow.addEventListener(\"load\", dropdownMenu, false);\r\nwindow.addEventListener(\"resize\", dropdownMenu, false);\r\n","// | ------------------------------------------------------------------------\r\n// | Components - Fixed Header\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\nvar header = document.querySelector(\".site-header\");\r\n\r\nif(header){\r\n\r\n var fixHeader = function(){\r\n\r\n // Find out height of header element\r\n var headerHeight = header.offsetHeight;\r\n\r\n // Set --header-height custom property\r\n document.documentElement.style.setProperty(\"--header-height\", headerHeight + \"px\");\r\n\r\n // Add class when scrolling on windows >= 768px\r\n var windowWidth = document.body.clientWidth;\r\n\r\n if(windowWidth > 767){\r\n\r\n // Get scroll position\r\n let scroll = window.scrollY;\r\n\r\n // Toggle class\r\n if (scroll > 50) {\r\n header.classList.add(\"scrolling\");\r\n } else {\r\n header.classList.remove(\"scrolling\");\r\n } \r\n }\r\n\r\n };\r\n\r\n // Run on scroll/load/resize\r\n window.addEventListener(\"scroll\", fixHeader, false);\r\n window.addEventListener(\"load\", fixHeader, false);\r\n window.addEventListener(\"resize\", fixHeader, false);\r\n}","// | ------------------------------------------------------------------------\r\n// | Hero Parallax Blur\r\n// | ------------------------------------------------------------------------ \r\n\r\n\r\nfunction parallaxBlur() {\r\n\r\n var parallaxElement = document.querySelector('.parallax-bg');\r\n \r\n if(parallaxElement){\r\n \r\n var elementHeight = parallaxElement.offsetHeight;\r\n \r\n var scrollPos = window.pageYOffset;\r\n var transformValue = scrollPos/40;\r\n var opacityValue = 1 - ( scrollPos / 1000);\r\n var blurValue = Math.min(scrollPos / 100, 3);\r\n \r\n if ( scrollPos < elementHeight ) {\r\n Object.assign(parallaxElement.style, {transform: \"translate3d(0,\" + transformValue + \"%, 0)\", opacity: \"\" + opacityValue + \"\", filter: \"blur(\" + blurValue + \"px)\"})\r\n }\r\n \r\n }\r\n \r\n}\r\n \r\nwindow.addEventListener(\"scroll\", parallaxBlur, false);\r\n","// | ------------------------------------------------------------------------\r\n// | Table Row Links\r\n// | ------------------------------------------------------------------------\r\n\r\nwindow.addEventListener(\"load\", (event) => {\r\n var rowLinks = document.querySelectorAll(\".table-row-link\");\r\n\r\n rowLinks.forEach(function (x) {\r\n var dataHref = x.getAttribute(\"data-href\");\r\n\r\n x.addEventListener(\"click\", () => {\r\n window.location.href = dataHref;\r\n });\r\n });\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Pages - About\r\n// | ------------------------------------------------------------------------\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\nfunction numberWithCommas(x) {\r\n return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n}\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n let numberObserverOptions = {\r\n rootMargin: \"0px\",\r\n threshold: 0.5,\r\n };\r\n\r\n var numberObserver = new IntersectionObserver(\r\n numberObserverCallback,\r\n numberObserverOptions\r\n );\r\n\r\n function numberObserverCallback(entries, observer) {\r\n entries.forEach((entry) => {\r\n const numberAnimate = () => {\r\n const speed = 100;\r\n const value = +entry.target.getAttribute(\"data-val\");\r\n const data = +entry.target.innerText;\r\n const time = value / speed;\r\n\r\n if (data < value) {\r\n entry.target.innerText = Math.ceil(data + time);\r\n setTimeout(numberAnimate, 1);\r\n } else {\r\n var finalValue = numberWithCommas(value);\r\n entry.target.innerText = finalValue;\r\n }\r\n };\r\n\r\n if (entry.isIntersecting) {\r\n numberAnimate();\r\n } else {\r\n entry.target.innerText = 0;\r\n }\r\n });\r\n }\r\n\r\n let target = \".num\";\r\n document.querySelectorAll(target).forEach((i) => {\r\n if (i) {\r\n numberObserver.observe(i);\r\n }\r\n });\r\n});\r\n","// | ------------------------------------------------------------------------\r\n// | Pages - Homepage\r\n// | ------------------------------------------------------------------------\r\n\r\n// | ------------------------------------------------------------------------\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n // Resets the quick contact form\r\n const resetButton = document.getElementById(\"resetButton\");\r\n\r\n // Forms\r\n if (resetButton) {\r\n resetButton.addEventListener(\"click\", () => {\r\n document.getElementById(\"quickEnquiryForm\").reset();\r\n });\r\n }\r\n\r\n // Resets the quick contact form in the offcanvas\r\n const resetButtonOffcanvas = document.getElementById(\"resetButtonOffcanvas\");\r\n\r\n // Forms\r\n if (resetButtonOffcanvas) {\r\n resetButtonOffcanvas.addEventListener(\"click\", () => {\r\n document.getElementById(\"quickEnquiryFormOffcanvas\").reset();\r\n });\r\n }\r\n});\r\n"],"names":["mediaQuery","window","matchMedia","checkMobileCollapse","e","matches","document","querySelectorAll","forEach","Collapse","getOrCreateInstance","toggle","show","hide","addEventListener","ClassWatcher","constructor","targetNode","classToWatch","classAddedCallback","classRemovedCallback","this","observer","lastClassState","classList","contains","init","MutationObserver","mutationCallback","observe","attributes","disconnect","mutationsList","mutation","type","attributeName","currentClassState","target","body","length","Modal","getInstance","slice","call","map","popoverTriggerEl","Popover","tooltipTriggerEl","Tooltip","event","querySelector","nav","button","windowWidth","clientWidth","toggleDrawer","documentElement","stopPropagation","closeTabs","tab","remove","navItem","Tab","setAttribute","navUrl","getAttribute","console","log","location","href","tabPane","tabId","tabLink","getElementById","dropdownLinks","tabLinks","changeDropdownLinks","dropDownLink","removeAttribute","hasAttribute","toggleAtt","targetAtt","shave","character","homeProdItem","OverlayScrollbars","overflow","x","dropdownGrid","dropdownTabPane","downloadPane","Splide","pagination","arrows","mount","perPage","gap","breakpoints","validationOptions","errorClass","errorElement","ignore","highlight","element","validClass","matchingNumberBox","$","attr","matchingInputGroup","parent","hasClass","parents","removeClass","addClass","find","each","id","unhighlight","errorPlacement","error","matchingDropdown","next","matchingCheckbox","matchingCKEditor","insertAfter","insertBefore","invalidHandler","validator","preventDefault","Ladda","Array","from","getElementsByClassName","CDATA_SECTION_NODE","style","serialiseForm","form","obj","formData","FormData","key","keys","get","prepareFormValidation","validate","ready","css","faqSelect","supportAccordion","mixer","mixItUp","selectors","animation","duration","filter","value","orderbySelect","closest","submit","on","offCanvas","offCanvasContent","quickContactLoaded","fetch","then","resp","text","data","innerHTML","setTimeout","options","action","success","submitBtn","dataset","valid","method","headers","URLSearchParams","ok","json","showAjaxFormError","catch","err","handleAjaxForm","Offcanvas","display","bootbox","message","className","captchaSystem","load","$form","_blockForm","recaptcha","execute","token","debouncedFetch","fn","delay","timerId","_len","arguments","args","_key","clearTimeout","Promise","resolve","reject","debouncePromise","autocomplete","container","placeholder","detachedMediaQuery","getSources","_ref","query","res","sourceId","getItems","getItemUrl","_ref2","item","slug","templates","_ref3","html","img","name","noResults","onSubmit","_ref4","state","trim","AOS","calcFilterHeight","filterHeader","filterFooter","setFilterHeight","cssVar","height","offsetHeight","setProperty","onscroll","el","IntersectionObserver","intersectionRatio","threshold","scrollbars","visibility","autoHide","filters","closeButton","navLinks","activeMenu","hideMenuTimeout","defaultLink","defaultMenu","showDefaultMenu","link","submenu","zIndex","add","hideMenu","menuSelector","showMenu","relatedTarget","prodGallery","prodSingleGallery","prodThumbs","perMove","cover","isNavigation","sync","quoteModal","backdrop","quoteModalElement","quoteBtn","hideQuickQuote","paddingRight","setLoader","dest","submitSearch","slideUp","removeAttr","getList","Date","getTime","val","param","ajax","url","output","Mustache","render","fadeIn","n","column","fadeOut","keyup","which","click","slideDown","debug","search","enableUploadsForm","currentUpload","uploader","plupload","runtimes","browse_button","max_file_size","mime_types","title","extensions","PostInit","FilesAdded","up","files","UploadProgress","file","percent","UploadComplete","Error","alert","change","field","splice","addFile","append","start","targetingCookies","personalCookies","analyticsCookies","tagManagerIds","gtagIds","gtag","dataLayer","push","ad_user_data","ad_personalization","ad_storage","analytics_storage","personalization_storage","wait_for_update","gtagId","tagManagerId","createCookiePopup","cookieLink","cookieContainer","createElement","cookieIntro","appendChild","cookieOptionsHolder","cookieOptions","cookieOption","optionHolder","optionInput","localStorage","getItem","checked","disabled","optionLabel","labelText","optionDesc","optionDescText","htmlFor","addCookieOptions","saveButton","consentButton","setItem","updateConsent","closeCookiePopup","cookieHeight","createCookieButton","cookieButton","cookiePopUp","popUpHeight","gtagScript","async","src","firstScript","getElementsByTagName","head","gtmScript","noScript","iframe","width","firstChild","prepend","parentNode","dropdownMenu","header","i","onmouseenter","onmouseleave","fixHeader","headerHeight","scrollY","parallaxElement","elementHeight","scrollPos","pageYOffset","transformValue","opacityValue","blurValue","Math","min","Object","assign","transform","opacity","dataHref","numberObserver","entries","entry","numberAnimate","innerText","time","ceil","finalValue","toString","replace","isIntersecting","rootMargin","resetButton","reset","resetButtonOffcanvas"],"sourceRoot":""}