{"version":3,"sources":["Project/Camfil/code/ui/scripts/Camfil/Utilities.js"],"names":["breakpoint","context","func","wait","immediate","args","later","this","arguments","callNow","timeout","clearTimeout","setTimeout","apply","$","refreshValue","getComputedStyle","value","window","document","querySelector","getPropertyValue","replace","updateBreakpointValueOnDebouncedResize","debounce","jQuery","Utilities","constants","$limitHeightBtn","limitHeight","truncateClass","length","$this","each","height","data","$textWrapper","prev","removeClass","css","addClass","on","hasClass","text","getBoundingClientRect","top","scrollTop","Math","abs","offset","smoothScroll","calculateOffset","productInPageNav","headerHeight","mainNav","outerHeight","getElementY","query","doScrolling","duration","startingY","body","scrollHeight","diff","start","elementY","element","t","innerHeight","requestAnimationFrame","time","timestamp","step","easing","percent","min","scrollTo","bindClickEvents","e","target","attr","navigateToBookmark","preventDefault","splitUrl","navHeight","location","hash","startsWith","animate","href","target2","a","Object","keys","indexOf","substr","name","init"],"mappings":"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","file":"../../../scripts/Camfil/Utilities-c5f431dadb.js","sourcesContent":["// Set current device width as a javascript variable. Availible alternatives: xs, sm, md, lg, xl.\r\n// See _breakpoints.scss for more info.\r\n// Use like this: console.log(breakpoint.value)\r\n\r\nvar breakpoint = {};\r\n(function ($) {\r\n\r\n breakpoint.refreshValue = function () {\r\n this.value = window.getComputedStyle(document.querySelector('body'), ':before').getPropertyValue('content').replace(/\\\"/g, '');\r\n };\r\n\r\n var updateBreakpointValueOnDebouncedResize = debounce(function () { // Throttles window resize events.\r\n breakpoint.refreshValue();\r\n }, 250);\r\n\r\n window.addEventListener('resize', updateBreakpointValueOnDebouncedResize);\r\n\r\n breakpoint.refreshValue();\r\n})(jQuery);\r\n\r\n\r\nfunction debounce(func, wait, immediate) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n};\r\n\r\nvar Utilities = {\r\n\r\n constants: {\r\n $limitHeightBtn: $(\".u-limitHeightBtn\")\r\n },\r\n\r\n limitHeight: function () {\r\n var $limitHeightBtn = Utilities.constants.$limitHeightBtn,\r\n truncateClass = \"is-truncated\";\r\n\r\n if ($limitHeightBtn.length > 0) {\r\n $limitHeightBtn.each(function () {\r\n var $this = $(this),\r\n height = $this.data(\"height\"),\r\n $textWrapper = $this.prev();\r\n\r\n if ($textWrapper.height() > height) {\r\n $textWrapper.css(\"height\", height - 20).addClass(truncateClass);\r\n $this.removeClass(\"d-none\");\r\n\r\n $this.on(\"click\", function () {\r\n if ($textWrapper.hasClass(truncateClass)) {\r\n $textWrapper.removeClass(truncateClass).css(\"height\", \"auto\");\r\n $this.text($this.data(\"less\"));\r\n }\r\n else {\r\n // Prevent \"Show all\" button being rendered if the container is just a couple of pixels to high.\r\n // This way the expanded content will at least be 21 px higher than the truncated area. //SAMI\r\n $textWrapper.addClass(truncateClass).css(\"height\", (height - 20));\r\n $this.text($this.data(\"more\"));\r\n\r\n var rect = $textWrapper[0].getBoundingClientRect();\r\n if (rect.top < 0) {\r\n $('html, body').scrollTop(Math.abs($textWrapper.offset().top - 100)); //Compensate for sticky header\r\n }\r\n }\r\n })\r\n }\r\n });\r\n }\r\n },\r\n\r\n smoothScroll: {\r\n calculateOffset: function () { // Because sticky header\r\n var headerHeight = 0,\r\n mainNav = $(\".MainNavigation\"),\r\n productInPageNav = $(\".ProductInPageNav\");\r\n\r\n if (mainNav.length) {\r\n headerHeight += mainNav.outerHeight();\r\n }\r\n if (productInPageNav.length) {\r\n headerHeight += productInPageNav.outerHeight();\r\n }\r\n\r\n return headerHeight;\r\n },\r\n\r\n getElementY: function (query) {\r\n var offset = Utilities.smoothScroll.calculateOffset();\r\n return window.pageYOffset + document.querySelector(query).getBoundingClientRect().top - offset;\r\n },\r\n\r\n doScrolling: function (element, duration) {\r\n var startingY = window.pageYOffset;\r\n var elementY = Utilities.smoothScroll.getElementY(element);\r\n // If element is close to page's bottom then window will scroll only to some position above the element.\r\n var targetY = document.body.scrollHeight - elementY < window.innerHeight ? document.body.scrollHeight - window.innerHeight : elementY;\r\n var diff = targetY - startingY\r\n // Easing function: easeInOutCubic\r\n // From: https://gist.github.com/gre/1650294\r\n var easing = function (t) { return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1 };\r\n var start;\r\n\r\n if (!diff) return;\r\n\r\n // Bootstrap our animation - it will get called right before next frame shall be rendered.\r\n window.requestAnimationFrame(function step(timestamp) {\r\n if (!start) start = timestamp;\r\n // Elapsed miliseconds since start of scrolling.\r\n var time = timestamp - start;\r\n // Get percent of completion in range [0, 1].\r\n var percent = Math.min(time / duration, 1);\r\n // Apply the easing.\r\n // It can cause bad-looking slow frames in browser performance tool, so be careful.\r\n percent = easing(percent);\r\n\r\n window.scrollTo(0, startingY + diff * percent);\r\n\r\n // Proceed with animation as long as we wanted it to.\r\n if (time < duration) {\r\n window.requestAnimationFrame(step);\r\n }\r\n })\r\n },\r\n\r\n bindClickEvents: function () {\r\n $(\"[data-smooth-scroll]\").on(\"click\", function (e) {\r\n var target = $(this).attr(\"href\");\r\n Utilities.smoothScroll.doScrolling(target, 500);\r\n e.preventDefault();\r\n });\r\n }\r\n },\r\n\r\n // Scrolling to bookmarks smoothly\r\n navigateToBookmark: function () {\r\n navHeight = $(\".MainNavigation\").outerHeight();\r\n\r\n var h = window.location.hash;\r\n var splitUrl = h.split('=')[0];\r\n\r\n if (splitUrl.length) {\r\n if (!splitUrl.startsWith(\"#/\")) {\r\n var target = $(splitUrl);\r\n\r\n if (target.length) {\r\n $('html,body').animate({ scrollTop: target.offset().top - navHeight }, 400);\r\n }\r\n }\r\n }\r\n\r\n $(document).on('click', 'a', function (e) {\r\n var a = $(this),\r\n href = a.attr('href');\r\n\r\n if (Object.keys(a.data()).length === 0) {\r\n if (href && ~href.indexOf('#') && href.indexOf('#')===0) {\r\n var name = href.substr(href.indexOf('#') + 1), target = $('a[name=' + name + ']'), target2 = $('#' + name);\r\n target = target.length ? target : target2;\r\n\r\n if (target.length) {\r\n e.preventDefault();\r\n\r\n // When sticky menu is not enabled\r\n if (breakpoint.value === \"xs\" || breakpoint.value === \"sm\" || breakpoint.value === \"md\" || breakpoint.value === \"lg\") {\r\n $('html,body').animate({\r\n scrollTop: target.offset().top\r\n }, 400);\r\n }\r\n\r\n // In desktop mode it is\r\n else {\r\n $('html,body').animate({\r\n scrollTop: target.offset().top - navHeight\r\n }, 400);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n init: function () {\r\n Utilities.limitHeight();\r\n //Utilities.smoothScroll.bindClickEvents();\r\n Utilities.navigateToBookmark();\r\n }\r\n\r\n}\r\n\r\n$(function () {\r\n Utilities.init();\r\n});\r\n"]}