{"version":3,"file":"main.min.js","sources":["_source/modules/filter.js","_source/utils/calc.js","_source/utils/queryString.js","_source/modules/charts.js","_source/utils/vh.js","_source/modules/video.js","_source/main.js"],"sourcesContent":["\r\nconst classNames = {\r\n activeBtn: 'filter__tab--active',\r\n hiddenItem: 'hidden',\r\n searchActive: 'filter--search-active'\r\n};\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} container\r\n *\r\n * @constructor\r\n */\r\nexport class Filter {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container - Element containing filter options (Could be .filter__tabs or .filter__select)\r\n */\r\n constructor(container) {\r\n if (container) {\r\n this.dom = {\r\n container,\r\n filters: container.querySelectorAll('[data-filter]'),\r\n targetContainer: document.body.querySelector(container.getAttribute('data-target-container')),\r\n button: container.querySelector('.filter__btn'),\r\n loadmoreBtn: document.getElementById('load-more'),\r\n searchInput: container.querySelector('.filter__search__input')\r\n };\r\n\r\n this.settings = {\r\n filterType: container.getAttribute('data-action'),\r\n date: container.getAttribute('date-filter-date')\r\n };\r\n\r\n const urlParams = new URLSearchParams(window.location.search).get('filterValues');\r\n const urlSearchParam = new URLSearchParams(window.location.search).get('search');\r\n let urlQuery = '';\r\n\r\n if (urlParams) {\r\n urlQuery = urlParams.split(',');\r\n }\r\n\r\n if (urlSearchParam) {\r\n this.dom.searchInput.value = urlSearchParam;\r\n }\r\n\r\n if (this.dom.targetContainer) {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n const filter = this.dom.filters[i];\r\n const itemCountReplace = filter.getAttribute('data-item-count-replace');\r\n\r\n if (filter.tagName === \"BUTTON\") {\r\n filter.addEventListener('click', e => this.filterHandler(e));\r\n } else {\r\n filter.addEventListener('change', e => this.filterHandler(e));\r\n\r\n if (itemCountReplace) {\r\n this.replaceWithNumberOfItems(filter, itemCountReplace);\r\n }\r\n }\r\n\r\n if (urlQuery) {\r\n if (filter.tagName === 'BUTTON' || filter.type === 'radio') {\r\n if (urlQuery.includes(filter.getAttribute('data-filter'))) {\r\n filter.click();\r\n }\r\n } else {\r\n for (let i = 0; i < filter.options.length; i++) {\r\n const option = filter.options[i].value;\r\n\r\n if (urlQuery.includes(option)) {\r\n filter.value = option;\r\n filter.dispatchEvent(new Event('change'));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (urlSearchParam) {\r\n this.handleSearchRequest();\r\n }\r\n\r\n if(this.dom.searchInput) {\r\n this.dom.searchInput.addEventListener('keyup', e => this.handleSearchRequest(e));\r\n this.dom.searchInput.addEventListener('blur', () => this.resetFilter(true,true));\r\n }\r\n } else {\r\n window.console.log(\"Can't find [data-target-container] on filter container: \", container);\r\n }\r\n\r\n if(this.dom.button) {\r\n this.dom.button.addEventListener('click', e => {\r\n if(this.dom.button.classList.contains('active')) {\r\n this.dom.button.classList.remove('active');\r\n } else {\r\n this.dom.button.classList.add('active');\r\n }\r\n });\r\n }\r\n } else {\r\n window.console.log(\"Filter container missing\");\r\n }\r\n }\r\n\r\n /**\r\n * Filter function that compares selected filter values with filter-values on filter-item.\r\n * Added hidden-class to items that hasn't got the selected filter value.\r\n *\r\n * @param {HTMLElement} e - event (click or change event\r\n */\r\n filterHandler(e) {\r\n const filter = e.target;\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n const isButton = filter.tagName === \"BUTTON\";\r\n const filterValue = isButton ? filter.getAttribute('data-filter') : filter.value;\r\n const filterByDate = filter.getAttribute('data-filter-bydate') || null;\r\n const dateNow = this.settings.date ? Date.parse(this.settings.date) : \"\";\r\n\r\n if(this.dom.loadmoreBtn) {\r\n this.dom.loadmoreBtn.classList.add(classNames.hiddenItem);\r\n for (let i = 0; i < filterItems.length; i++) {\r\n filterItems[i].classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n\r\n if(this.dom.searchInput) {\r\n this.dom.searchInput.value = \"\";\r\n }\r\n\r\n if (isButton) {\r\n if (this.settings.filterType === \"filter-switch\") {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n this.dom.targetContainer.classList.add(classNames.transitionItems);\r\n\r\n if (!filter.classList.contains(classNames.activeBtn)) {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n\r\n //updating url with the filter values\r\n const nextURL = `${location.protocol}//${location.host}${location.pathname}?filterValues=${filterValues}`;\r\n const nextTitle = document.title;\r\n const nextState = {\r\n additionalInformation: 'Updated the URL with JS'\r\n };\r\n window.history.replaceState(nextState, nextTitle, nextURL);\r\n }\r\n\r\n /* If the show all button os pressed\r\n * Remove hidden class from loadMoreBtn and only show first batch */\r\n /*if(filterValue === \"*\") {\r\n\r\n if(this.dom.loadmoreBtn) {\r\n this.dom.loadmoreBtn.classList.remove(classNames.hiddenItem);\r\n }\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n let filterItem = filterItems[i];\r\n\r\n filterItem.classList.remove(classNames.hiddenItem);\r\n\r\n if(!filterItem.classList.contains('news-item-batch-1')) {\r\n\r\n filterItem.classList.add(classNames.hiddenItem);\r\n } else {\r\n\r\n }\r\n }\r\n\r\n window.location.hash = '#1';\r\n\r\n return;\r\n }*/\r\n\r\n\r\n if (this.settings.filterType === \"filter-switch\") {\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n const cleanFilterValue = filterValue.trim().toLowerCase();\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if(filterByDate) {\r\n\r\n let itemDateInMs = Date.parse(itemFilterValues);\r\n\r\n if(filterByDate === \"passed\") {\r\n if(dateNow > itemDateInMs) {\r\n item.classList.remove(classNames.hiddenItem);\r\n } else {\r\n item.classList.add(classNames.hiddenItem);\r\n }\r\n }\r\n } else if (filterValue !== '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n } else {\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n let showItem = true;\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n filterValues.forEach(value => {\r\n const cleanValue = value.trim().toLowerCase();\r\n if (itemFilterValues.indexOf(cleanValue) === -1) {\r\n showItem = false;\r\n }\r\n });\r\n\r\n if (!showItem) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Checks filter items for matches in title and filter-values, if value has minimum number of characters\r\n *\r\n * @param {Event} e - Keyboard Event\r\n * @private\r\n */\r\n handleSearchRequest(e) {\r\n const value = this.dom.searchInput.value.trim();\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n if (value.length >= 2) {\r\n // Prevent looping through items if ArrowKeys are pressed:\r\n if (e) {\r\n if (e.which >= 37 && e.which <= 40) { // 37 = ArrowLeft / 38 = ArrowUp / 39 = ArrowRight / 40 = ArrowDown\r\n return;\r\n }\r\n }\r\n\r\n if(!this.dom.container.classList.contains(classNames.searchActive)) {\r\n this.resetFilter(false,true);\r\n }\r\n\r\n const regex = new RegExp(value, 'gi');\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n const itemFilterValues = item.getAttribute('data-filter-value');\r\n const itemTitle = item.querySelector('h2').innerText;\r\n\r\n if (itemFilterValues.match(regex) || itemTitle.match(regex)) {\r\n item.classList.remove('hidden');\r\n } else {\r\n item.classList.add(classNames.hiddenItem);\r\n }\r\n }\r\n } else {\r\n this.resetFilter(true);\r\n for (let i = 0; i < filterItems.length; i++) {\r\n filterItems[i].classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n\r\n resetFilter(activate = false, addSearchQuery = false) {\r\n\r\n if (activate) {\r\n this.dom.container.classList.remove(classNames.searchActive);\r\n } else {\r\n this.dom.container.classList.add(classNames.searchActive);\r\n\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n const filter = this.dom.filters[i];\r\n\r\n if (filter.getAttribute('data-filter') === \"*\") {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n }\r\n\r\n if (addSearchQuery) {\r\n //updating url with the filter values\r\n const nextURL = `${location.protocol}//${location.host}${location.pathname}?search=${this.dom.searchInput.value.trim()}`;\r\n const nextTitle = document.title;\r\n const nextState = {\r\n additionalInformation: 'Updated the URL with JS'\r\n };\r\n window.history.replaceState(nextState, nextTitle, nextURL);\r\n } else {\r\n const nextURL = `${location.protocol}//${location.host}${location.pathname}`;\r\n const nextTitle = document.title;\r\n const nextState = {\r\n additionalInformation: 'Updated the URL with JS'\r\n };\r\n window.history.replaceState(nextState, nextTitle, nextURL);\r\n }\r\n }\r\n\r\n static getSetValues(filters) {\r\n const valArray = [];\r\n\r\n // loop through list of filters\r\n for (let i = 0, len = filters.length; i < len; i++) {\r\n const filter = filters[i];\r\n if (filter.tagName === \"SELECT\") {\r\n if (filter.value !== \"*\" && filter.value !== \"\") {\r\n valArray.push(filter.value);\r\n }\r\n } else if (filter.tagName === \"BUTTON\") {\r\n if (filter.classList.contains(classNames.activeBtn)) {\r\n valArray.push(filter.getAttribute('data-filter'));\r\n }\r\n } else {\r\n if (filter.checked && filter.value !== \"*\") { // radio checked?\r\n valArray.push(filter.value); // if so, add its value to array\r\n }\r\n }\r\n }\r\n return valArray; // return value of checked radio or undefined if none checked\r\n }\r\n\r\n replaceWithNumberOfItems(element, replaceValue) {\r\n const options = element.children;\r\n const items = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n if (options) {\r\n for (let i = 0; i < options.length; i++) {\r\n const option = options[i];\r\n\r\n if (option.value !== \"*\" && option.value !== \"\") {\r\n let count = 0;\r\n const optionStr = option.innerText;\r\n\r\n for (const item of items) {\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n const cleanValue = option.value.trim().toLowerCase();\r\n if (itemFilterValues.indexOf(cleanValue) > -1) {\r\n count++;\r\n }\r\n }\r\n\r\n option.innerText = optionStr.replace(replaceValue, count);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setupFilters(selector = '[data-action*=\"filter\"]') {\r\n const filterContainers = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < filterContainers.length; i++) {\r\n void new Filter(filterContainers[i]);\r\n }\r\n}\r\n","\r\n/**\r\n * Add an array of numbers together.\r\n *\r\n * @example\r\n * import { addition } from \"./utils/calc.js\";\r\n * const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];\r\n * const total = addition(numbers) // 45\r\n *\r\n * @param {Number[]} numbers - Array of numbers to add together\r\n * @returns {Number}\r\n */\r\nexport function addition(numbers) {\r\n return numbers.reduce((a, b) => a + b, 0);\r\n}\r\n\r\n/**\r\n * Get the avrage from an array of numbers.\r\n *\r\n * All the values are added together and divided by the amount of numbers.\r\n *\r\n * @example\r\n * import {getAvarage} from \"./utils/calc.js\";\r\n *\r\n * const numbers = [4, 8, 15, 16, 23, 42];\r\n * const avarage = getAvarage(numbers); // 18\r\n *\r\n * @param {Number[]} numbers - Array of numbers to find the Avarage of\r\n * @returns {Number}\r\n */\r\nexport function getAvarage(numbers) {\r\n return addition(numbers) / numbers.length;\r\n}","export function getParameterByName(name, url) {\r\n if (!url) url = window.location.href;\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n}","import {getAvarage} from \"../utils/calc\";\r\nimport {getParameterByName} from \"../utils/queryString\";\r\nimport 'element-closest';\r\n\r\nlet chart = null;\r\nlet isPrint = false;\r\nconst chartObj = {\r\n amountInput: document.getElementById(\"chart-amount\"),\r\n periodInput: document.getElementById(\"chart-period\"),\r\n percentInput: document.getElementById(\"chart-percent\"),\r\n moneyUnit: \"€\",\r\n yearUnit: \"year\",\r\n bottlePrice: 278.75\r\n}\r\nlet danishNumberFormat = document.documentElement.lang == \"da\";\r\n\r\nexport function createChart(data, customSettings) {\r\n\r\n const settings = {\r\n axisY: {\r\n onlyInteger: true\r\n },\r\n fullWidth: true,\r\n lineSmooth: false,\r\n chartPadding: { right: 40 },\r\n plugins: [\r\n Chartist.plugins.comments()\r\n ]\r\n };\r\n\r\n if (data.hasOwnProperty('low'))\r\n settings.low = data.low;\r\n\r\n if (data.hasOwnProperty('high'))\r\n settings.high = data.high;\r\n\r\n if (RWI.GetScreenDimensions().width < 768) {\r\n settings.axisX = {\r\n labelInterpolationFnc: function skipLabels(value, index) {\r\n return index % 3 === 0 ? value : null;\r\n }\r\n }\r\n }\r\n\r\n new Chartist.Line('#' + data.id, {\r\n labels: data.labels,\r\n series: data.series\r\n }, settings);\r\n\r\n\r\n const graphElm = document.getElementById(data.id);\r\n if (graphElm != null) {\r\n const sectionElm = graphElm.closest('section.graph');\r\n if (sectionElm) {\r\n const legendList = sectionElm.querySelector('.legend-list');\r\n const legends = sectionElm.querySelectorAll('.legend-list .legend[data-series-name]');\r\n\r\n // Remove \"hidden\" class from legend-list\r\n if (legendList != null) {\r\n legendList.classList.remove('hidden');\r\n }\r\n\r\n for (let a = 0; a < legends.length; a++) {\r\n const legend = legends[a];\r\n const legendSeriesName = legend.getAttribute('data-series-name');\r\n\r\n // Add clickevents to legends\r\n legend.addEventListener('click', function () {\r\n const ctSeries = Array.from(graphElm.querySelectorAll('.ct-series'));\r\n const commentElements = Array.from(graphElm.querySelectorAll('.chartist-comment,.chartist-comment-point'));\r\n const currentSeriesElements = ctSeries.concat(commentElements).filter(x => x.getAttribute('ct:series-name') == legendSeriesName);\r\n\r\n if (legend.classList.contains('inactive')) {\r\n legend.classList.remove('inactive');\r\n\r\n for (let b = 0; b < currentSeriesElements.length; b++) {\r\n currentSeriesElements[b].classList.remove('ct-hidden');\r\n }\r\n } else {\r\n legend.classList.add('inactive');\r\n\r\n for (let b = 0; b < currentSeriesElements.length; b++) {\r\n currentSeriesElements[b].classList.add('ct-hidden');\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction pricePrBottle(bottles) {\r\n let bottlePrice;\r\n\r\n if(bottles < 120) {\r\n bottlePrice = 1.25;\r\n } else if(bottles >= 120 && bottles < 240) {\r\n bottlePrice = 1.15;\r\n } else if(bottles >= 240 && bottles < 480) {\r\n bottlePrice = 1.05;\r\n } else if(bottles >= 480 && bottles < 960) {\r\n bottlePrice = 1;\r\n } else if(bottles >= 960 && bottles < 2400) {\r\n bottlePrice = 0.95;\r\n } else {\r\n bottlePrice = 0.9;\r\n }\r\n\r\n return bottlePrice;\r\n}\r\n\r\nfunction adminCostPercent(amount) {\r\n let percent;\r\n\r\n if(amount < 80000) {\r\n percent = 0.004;\r\n } else if(amount >= 80000 && amount < 160000) {\r\n percent = 0.003;\r\n } else {\r\n percent = 0.002;\r\n }\r\n\r\n return percent;\r\n}\r\n\r\nfunction storageCostPercent(amount) {\r\n let storageRate;\r\n\r\n if (amount < 25000) {\r\n storageRate = 0.01\r\n } else if(amount < 50000) {\r\n storageRate = 0.009\r\n } else if(amount < 100000) {\r\n storageRate = 0.008\r\n } else if(amount < 200000) {\r\n storageRate = 0.007\r\n } else if(amount < 400000) {\r\n storageRate = 0.006\r\n } else {\r\n storageRate = 0.005\r\n }\r\n return storageRate;\r\n}\r\n\r\nfunction salesCommission(amount) {\r\n let commissionRate;\r\n\r\n if (amount < 25000) {\r\n commissionRate = 0.1\r\n } else if(amount < 50000) {\r\n commissionRate = 0.09\r\n } else if(amount < 100000) {\r\n commissionRate = 0.08\r\n } else if(amount < 200000) {\r\n commissionRate = 0.07\r\n } else if(amount < 400000) {\r\n commissionRate = 0.06\r\n } else {\r\n commissionRate = 0.05\r\n }\r\n return commissionRate;\r\n}\r\n\r\nfunction numberOfBottles(amount) {\r\n return Math.round(amount / chartObj.bottlePrice);\r\n}\r\n\r\nfunction formatNumber(num, replaceKommas = true) {\r\n var formattetNo = num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,');\r\n\r\n return replaceKommas ? formattetNo.replace(',', '.') : formattetNo;\r\n}\r\n\r\nfunction calculateMonthInterest(amount, percent) {\r\n return amount*(1 + percent/100)**(1/12);\r\n}\r\n\r\n// seekZero seeks the zero point of the function fn(x), accurate to within x \\pm 0.01. fn(x) must be decreasing with x.\r\nfunction seekZero(fn) {\r\n var x = 1;\r\n while (fn(x) > 0) {\r\n x += 1;\r\n }\r\n while (fn(x) < 0) {\r\n x -= 0.01\r\n }\r\n return x + 0.01;\r\n}\r\n\r\n// Internal Rate of Return (IRR)\r\nfunction internalRateReturn(cfs) {\r\n var depth = cfs.depth;\r\n var args = cfs.cashFlow;\r\n var numberOfTries = 1;\r\n\r\n function npv(rate) {\r\n numberOfTries++;\r\n if (numberOfTries > depth) {\r\n throw new Error('internRateReturn function can\\'t find a result');\r\n }\r\n var rrate = (1 + rate/100);\r\n var npv = args[0];\r\n for (var i = 1; i < args.length; i++) {\r\n npv += (args[i] / Math.pow(rrate, i));\r\n }\r\n return npv;\r\n }\r\n\r\n return Math.round(seekZero(npv) * 100) / 100;\r\n };\r\n\r\n\r\n/**\r\n *\r\n * @param {Number[]} costPercentArray\r\n * @param {Number[]} yearlyCosts\r\n */\r\nfunction updateKeyNumbers(costPercentArray, yearlyCosts) {\r\n\r\n // Key Figures\r\n const avaragePercent = Number(getAvarage(costPercentArray) * 100).toFixed(2);\r\n const costAvaragePercent = danishNumberFormat ? `${avaragePercent.replace('.', ',')} %` : `${avaragePercent} %`;\r\n document.getElementById(\"key-figure-1\").textContent = chartObj.moneyUnit + \" \" + formatNumber(chartObj.totalValue);\r\n document.getElementById(\"key-figure-2\").textContent = costAvaragePercent;\r\n // Calculation to avarage cost in valuta: chartObj.moneyUnit + \" \" + formatNumber(Math.round(getAvarage(yearlyCosts)));\r\n\r\n // First Year Costs\r\n document.getElementById(\"first-year-costs\").textContent = chartObj.moneyUnit + \" \" + formatNumber(yearlyCosts[0]);\r\n document.getElementById(\"cost-percent\").textContent = costAvaragePercent;\r\n\r\n // Returns\r\n const totalReturn = chartObj.totalValue - chartObj.amount;\r\n const totalProfit = totalReturn - chartObj.costs;\r\n document.getElementById(\"value-increase\").textContent = chartObj.moneyUnit + \" \" + formatNumber(totalReturn);\r\n document.getElementById(\"sales-commission\").textContent = \"- \" + chartObj.moneyUnit + \" \" + formatNumber(chartObj.commission);\r\n document.getElementById(\"storage-costs\").textContent = \"- \" + chartObj.moneyUnit + \" \" + formatNumber(chartObj.costs - chartObj.commission);\r\n document.getElementById(\"total-profit\").textContent = chartObj.moneyUnit + \" \" + formatNumber(totalProfit);\r\n\r\n // Profits (total and yearly)\r\n document.getElementById(\"period-return-percent\").textContent = Math.round((totalReturn/chartObj.amount) * 100) + \" %\";\r\n\r\n const freeCashFlow = [];\r\n\r\n freeCashFlow.push(chartObj.amount * -1);\r\n\r\n for (let i = 1; i < chartObj.years; i++) {\r\n freeCashFlow.push(0);\r\n }\r\n freeCashFlow.push(chartObj.totalValue);\r\n\r\n const yearlyReturnPercent = internalRateReturn({depth: chartObj.amount, cashFlow: freeCashFlow});\r\n document.getElementById(\"yearly-return-percent\").textContent = danishNumberFormat ? yearlyReturnPercent.toFixed(1).replace('.', ',') + \" %\" : yearlyReturnPercent.toFixed(1) + \" %\";\r\n\r\n document.getElementById(\"period-profit-percent\").textContent = Math.round((totalProfit/chartObj.amount) * 100) + \" %\";\r\n // Reforming the yearlyCost Array to match the format from Excel Cashflow calculations\r\n // This is done to easy the Internal Rate Return (IRR) calculation\r\n let firstCost = yearlyCosts.shift();\r\n let costWithInvest = firstCost + chartObj.amount;\r\n yearlyCosts.unshift(costWithInvest);\r\n // Converts costs to negative value to fit IRR function\r\n yearlyCosts = yearlyCosts.map(value => value * -1);\r\n yearlyCosts.push(chartObj.totalValue - chartObj.commission);\r\n\r\n const yearlyProfitPercent = internalRateReturn({depth: chartObj.amount, cashFlow: yearlyCosts});\r\n document.getElementById(\"yearly-profit-percent\").textContent = danishNumberFormat ? yearlyProfitPercent.toFixed(1).replace('.', ',') + \" %\" : yearlyProfitPercent.toFixed(1) + \" %\";\r\n\r\n // let yearlyProfitPercent = internalRateReturn({depth: chartObj.amount, cashFlow: yearlyCosts});\r\n\r\n // document.getElementById(\"yearly-profit-percent\").textContent = danishNumberFormat ? yearlyProfitPercent.toString().replace('.', ',') + \" %\" : yearlyProfitPercent + \" %\"\r\n\r\n window.chartObj = chartObj;\r\n}\r\n\r\nfunction generateChartData() {\r\n const labels = [];\r\n const amountSeries = [];\r\n const costsPercent = [];\r\n const yearlyCosts = [];\r\n\r\n chartObj.amount = parseInt(chartObj.amountInput.value);\r\n chartObj.years = parseInt(chartObj.periodInput.value);\r\n chartObj.percent = parseInt(chartObj.percentInput.value);\r\n chartObj.costs = 0;\r\n chartObj.totalValue = 0;\r\n\r\n let amount = chartObj.amount;\r\n\r\n //chartObj.bottles = numberOfBottles(amount);\r\n //let storagePrice = chartObj.bottles * pricePrBottle(chartObj.bottles);\r\n //storagePrice = Math.round(storagePrice < 60 ? 60 : storagePrice);\r\n\r\n for (let year = 0; year < chartObj.years; year++) {\r\n labels.push(year);\r\n\r\n /* let adminCost = Math.round(amount * adminCostPercent(amount));\r\n adminCost = adminCost < 100 ? 100 : adminCost; */\r\n //const yearCost = storagePrice + adminCost;\r\n\r\n const storageCost = Math.round(storageCostPercent(amount) * amount);\r\n yearlyCosts.push(storageCost);\r\n chartObj.costs += storageCost;\r\n\r\n costsPercent.push(storageCost / amount);\r\n\r\n for (let month = 1; month <= 12; month++) {\r\n const yearX = year + month/12;\r\n const roundAmount = Math.round(amount * 100) / 100;\r\n const profit = roundAmount - storageCost/12;\r\n amountSeries.push({x: yearX, y: profit});\r\n amount = calculateMonthInterest(amount, chartObj.percent);\r\n\r\n if(month != 12) {\r\n labels.push('');\r\n }\r\n }\r\n }\r\n\r\n\r\n chartObj.commission = Math.round(salesCommission(amount) * amount)\r\n chartObj.costs += chartObj.commission;\r\n\r\n chartObj.totalValue = Math.round(amount);\r\n\r\n updateKeyNumbers(costsPercent, yearlyCosts);\r\n\r\n return {\r\n labels,\r\n series: [amountSeries]\r\n }\r\n}\r\n\r\nfunction updateChart(data) {\r\n const chartData = generateChartData();\r\n const lowestAmount = chartData.series[0][0].y;\r\n const highestAmount = chartData.series[0][chartData.series[0].length -1].y;\r\n\r\n const settings = {\r\n axisY: {\r\n onlyInteger: true,\r\n labelInterpolationFnc: function addUnit(value, index) {\r\n let newValue = formatNumber(value);\r\n return chartObj.moneyUnit + ' ' + newValue;\r\n }\r\n },\r\n axisX: {\r\n offset: 40,\r\n labelOffset: {\r\n x: window.innerWidth < 768 || isPrint ? -10 : -30,\r\n y: 10\r\n },\r\n onlyInteger: true,\r\n type: Chartist.AutoScaleAxis,\r\n labelInterpolationFnc: function addUnit(value, index) {\r\n if(RWI.GetScreenDimensions().width >= 768) {\r\n if(value === 0) {\r\n return ''\r\n } else {\r\n return chartObj.yearUnit + ' ' + value.toString();\r\n }\r\n } else {\r\n return value.toString();\r\n }\r\n }\r\n },\r\n chartPadding: {\r\n right: 20,\r\n left: 10\r\n },\r\n fullWidth: true,\r\n lineSmooth: true,\r\n showGrid: true\r\n };\r\n\r\n if(chartObj.years >= 10) {\r\n settings.low = lowestAmount >= 50000 ? lowestAmount - 25000 : lowestAmount - 5000;\r\n } else {\r\n settings.low = lowestAmount - 5000;\r\n }\r\n\r\n settings.axisY.offset = window.innerWidth < 1280 ? 60 : 100;\r\n\r\n settings.high = Math.round(highestAmount * 50000) / 50000; // round to nearest 50000\r\n\r\n if(!chart) {\r\n chart = new Chartist.Line('#' + data.id, chartData, settings);\r\n } else {\r\n chart.update(chartData, settings);\r\n }\r\n\r\n generatePDFlink()\r\n}\r\n\r\n\r\nexport function createChartCalculator(data) {\r\n\r\n chartObj.moneyUnit = chartObj.amountInput.parentNode.querySelector('span').getAttribute('data-unit');\r\n chartObj.yearUnit = chartObj.periodInput.parentNode.querySelector('span').getAttribute('data-unit');\r\n\r\n chartObj.bottlePrice = data.bottlePrice || chartObj.bottlePrice;\r\n\r\n const amountParam = getParameterByName('amount');\r\n const periodParam = getParameterByName('years');\r\n const percentParam = getParameterByName('percent');\r\n\r\n if (amountParam) {\r\n chartObj.amountInput.value = amountParam;\r\n let restultTables = document.body.querySelector('.chart__results');\r\n if(restultTables) {\r\n restultTables.classList.remove('hidden');\r\n }\r\n }\r\n if (periodParam) {\r\n chartObj.periodInput.value = periodParam;\r\n }\r\n if (percentParam) {\r\n chartObj.percentInput.value = percentParam;\r\n }\r\n\r\n const openModalBtns = document.body.querySelectorAll('[data-action=\"open-modal\"]');\r\n\r\n if(!amountParam && openModalBtns) {\r\n for (let i = 0; i < openModalBtns.length; i++) {\r\n const openModalBtn = openModalBtns[i];\r\n const targetSel = openModalBtn.getAttribute(\"data-target\");\r\n const target = document.getElementById(targetSel);\r\n const closeBtn = target.querySelector('[aria-label=\"close\"]');\r\n\r\n const toggleModal = (e) => {\r\n e.preventDefault();\r\n\r\n const ariaHidden = target.getAttribute(\"aria-hidden\");\r\n if(ariaHidden == \"true\") {\r\n target.setAttribute(\"aria-hidden\", false);\r\n } else {\r\n target.setAttribute(\"aria-hidden\", true);\r\n }\r\n };\r\n\r\n openModalBtn.addEventListener(\"click\", toggleModal);\r\n closeBtn.addEventListener(\"click\", toggleModal);\r\n }\r\n\r\n RWI.DownloadRapport();\r\n }\r\n\r\n setupRangeInput();\r\n\r\n updateChart(data);\r\n}\r\n\r\nfunction setupRangeInput() {\r\n var rangeSliders = [chartObj.amountInput, chartObj.periodInput, chartObj.percentInput];\r\n\r\n function showSliderValue(e) {\r\n let slider = e.target || e;\r\n let thumb = slider.parentNode.querySelector('span')\r\n let fill = slider.parentNode.querySelector('i')\r\n let thumbWidth = 18;\r\n var range = slider.max - slider.min;\r\n var position = ((slider.value - slider.min) / range) * 100;\r\n var positionOffset = Math.round(thumbWidth * position / 100) - (thumbWidth / 2);\r\n\r\n thumb.textContent = formatNumber(slider.value);\r\n thumb.style.left = 'calc(' + position + '% - ' + positionOffset + 'px)';\r\n fill.style.width = 'calc(' + position + '% - ' + positionOffset + 'px)';\r\n }\r\n\r\n for (let i = 0; i < rangeSliders.length; i++) {\r\n const rs = rangeSliders[i];\r\n\r\n showSliderValue(rs);\r\n rs.addEventListener(\"input\", showSliderValue, false);\r\n\r\n rs.addEventListener(\"change\", (e) => {\r\n updateChart()\r\n }, false);\r\n\r\n let rsMinMaxSpans = rs.parentNode.nextElementSibling.querySelectorAll(\"div span\");\r\n if (rsMinMaxSpans) {\r\n for (let s = 0; s < rsMinMaxSpans.length; s++) {\r\n const span = rsMinMaxSpans[s];\r\n span.textContent = formatNumber(span.textContent);\r\n }\r\n }\r\n }\r\n\r\n window.matchMedia('print').addListener(function() {\r\n if(chart) {\r\n isPrint = true;\r\n updateChart();\r\n }\r\n });\r\n\r\n return rangeSliders;\r\n}\r\n\r\nfunction generatePDFlink() {\r\n const path = window.location.pathname;\r\n let url = window.location.origin + (path[path.length - 1] == '/' ? path.substr(0, path.length -1) : path);\r\n url += `?amount=${chartObj.amount}&years=${chartObj.years}&percent=${chartObj.percent}`;\r\n const downloadForm = document.getElementById('download-rapport-form');\r\n const encodedUrl = encodeURIComponent(url);\r\n\r\n downloadForm.setAttribute(\"data-pdflink\", `https://pdf-generator.by.gotcha.dk?url=${encodedUrl}`);\r\n}\r\n","export function setViewportHeightProp() {\r\n // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\r\n const vh = window.innerHeight * 0.01;\r\n // Then we set the value in the --vh custom property to the root of the document\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n}\r\n\r\nexport function initVhUnitOverwrite() {\r\n setViewportHeightProp();\r\n window.addEventListener('resize', setViewportHeightProp);\r\n}\r\n","/**\r\n * Combined lightweight vimeo/youtube embed code.\r\n *\r\n * Ported from https://github.com/paulirish/lite-youtube-embed by Paul Irish\r\n * and https://github.com/luwes/lite-vimeo-embed by Wesley Luyten\r\n *\r\n */\r\nclass Video {\r\n constructor(container) {\r\n this.container = container;\r\n this.id = container.getAttribute('data-id');\r\n this.controls = container.getAttribute('data-controls') || 1,\r\n this.bg = container.getAttribute('data-bg') || 0,\r\n this.byline = container.getAttribute('data-byline') || 0;\r\n this.scrollto = container.getAttribute('data-scroll-to') || 0;\r\n\r\n let videoLink;\r\n\r\n if (!this.id) {\r\n videoLink = container.getAttribute('data-video-link');\r\n if (videoLink) {\r\n this.id = extractVideoIdFromUrl(videoLink);\r\n } else {\r\n console.warn('Video missing video-id / data-video-link');\r\n return;\r\n }\r\n }\r\n\r\n this.isVimeo = container.getAttribute('data-action') === 'video-vimeo' || videoLink && videoLink.indexOf('vimeo') > -1;\r\n this.poster = container.getAttribute('data-poster');\r\n\r\n if (!this.poster) {\r\n if (this.isVimeo) {\r\n\r\n let { width, height } = getRoundedDimensions(container.getBoundingClientRect());\r\n const devicePixelRatio = window.devicePixelRatio || 1;\r\n width *= devicePixelRatio;\r\n height *= devicePixelRatio;\r\n /**\r\n * To get the vimeo poster image, we have to use the Vimeo API.\r\n */\r\n this.poster = `https://lite-vimeo-embed.now.sh/thumb/${this.id}`;\r\n this.poster += `.${canUseWebP() ? 'webp' : 'jpg'}`;\r\n this.poster += `?mw=${width}&mh=${height}&q=${devicePixelRatio > 1 ? 70 : 85}`;\r\n\r\n } else {\r\n /**\r\n * Comment about the thumbnail, by original author: Paul Irish\r\n * Lo, the youtube placeholder image! (aka the thumbnail, poster image, etc)\r\n * There is much internet debate on the reliability of thumbnail URLs. Weak consensus is that you\r\n * cannot rely on anything and have to use the YouTube Data API.\r\n *\r\n * amp-youtube also eschews using the API, so they just try sddefault with a hqdefault fallback:\r\n * https://github.com/ampproject/amphtml/blob/6039a6317325a8589586e72e4f98c047dbcbf7ba/extensions/amp-youtube/0.1/amp-youtube.js#L498-L537\r\n * For now I'm gonna go with this confident (lol) assertion: https://stackoverflow.com/a/20542029, though I'll use `i.ytimg` to optimize for origin reuse.\r\n *\r\n * Worth noting that sddefault is _higher_ resolution than hqdefault. Naming is hard. ;)\r\n * From my own testing, it appears that hqdefault is ALWAYS there sddefault is missing for ~10% of videos*/\r\n\r\n this.poster = `https://i.ytimg.com/vi/${this.id}/sddefault.jpg`;\r\n }\r\n }\r\n\r\n this.container.style.backgroundImage = `url(\"${this.poster}\")`;\r\n\r\n\r\n if (!!this.bg) {\r\n Video.warmConnections();\r\n this.addIframe();\r\n } else {\r\n // On hover (or tap), warm up the TCP connections we're (likely) about to use.\r\n this.container.addEventListener('pointerover', Video.warmConnections, { once: true });\r\n\r\n // Once the user clicks, add the real iframe and drop our play button\r\n // TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time\r\n // We'd want to only do this for in-viewport or near-viewport ones: https://github.com/ampproject/amphtml/pull/5003\r\n this.container.addEventListener('click', () => this.addIframe());\r\n }\r\n }\r\n\r\n /**\r\n * Begin pre-connecting to warm up the iframe load\r\n * Since the embed's network requests load within its iframe,\r\n * preload/prefetch'ing them outside the iframe will only cause double-downloads.\r\n * So, the best we can do is warm up a few connections to origins that are in the critical path.\r\n *\r\n * Maybe `` would work, but it's unsupported: http://crbug.com/593267\r\n * But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.\r\n */\r\n static warmConnections() {\r\n if (Video.preconnected) return;\r\n\r\n if (this.isVimeo) {\r\n // The iframe document and most of its subresources come right off player.vimeo.com\r\n addPrefetch('preconnect', 'https://player.vimeo.com');\r\n // Images\r\n addPrefetch('preconnect', 'https://i.vimeocdn.com');\r\n // Files .js, .css\r\n addPrefetch('preconnect', 'https://f.vimeocdn.com');\r\n // Metrics\r\n addPrefetch('preconnect', 'https://fresnel.vimeocdn.com');\r\n } else {\r\n // The iframe document and most of its subresources come right off youtube.com\r\n addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\r\n // The botguard script is fetched off from google.com\r\n addPrefetch('preconnect', 'https://www.google.com');\r\n // Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.\r\n addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\r\n addPrefetch('preconnect', 'https://static.doubleclick.net');\r\n }\r\n\r\n Video.preconnected = true;\r\n }\r\n\r\n addIframe() {\r\n let videoUrl = this.isVimeo ? `https://player.vimeo.com/video/${this.id}?autoplay=1&rel=0` : `https://www.youtube-nocookie.com/embed/${this.id}?autoplay=1&rel=0`;\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('frameborder', 0);\r\n iframe.setAttribute('allowtransparency', 'true');\r\n iframe.setAttribute('playsinline', 'true');\r\n iframe.setAttribute('tabindex', '-1');\r\n iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; autoplay');\r\n iframe.addEventListener('load', () => {\r\n // Timeout is set to prevent paint-lag when iframe is inserted\r\n setTimeout(() => {\r\n this.container.classList.add('video--loaded');\r\n this.container.classList.remove('loading');\r\n }, 300);\r\n });\r\n\r\n videoUrl += `&controls=${this.controls}&byline=${this.byline}&background=${this.bg}&mute=${this.bg}&color=222851`;\r\n\r\n iframe.src = videoUrl;\r\n\r\n this.container.classList.add('loading');\r\n this.container.appendChild(iframe);\r\n }\r\n}\r\n\r\n\r\nfunction extractVideoIdFromUrl(url) {\r\n const videoIdRegExp = /^.*((youtu.be\\/|vimeo.com\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\r\n const match = url.match(videoIdRegExp);\r\n\r\n if (match && match[7]) {\r\n return match[7];\r\n } else {\r\n console.warn(url, 'Invalid Video URL');\r\n }\r\n}\r\n\r\n/**\r\n * Initialise video embeds with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupVideos(selector = '[data-action^=\"video\"]') {\r\n const videos = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videos.length; i++) {\r\n void new Video(videos[i]);\r\n }\r\n}\r\n\r\nfunction canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n\r\n if (elem.getContext && elem.getContext('2d')) {\r\n // was able or not to get WebP representation\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n\r\n // very old browser like IE 8, canvas not supported\r\n return false;\r\n}\r\n\r\n/**\r\n * Add a to the head\r\n */\r\nfunction addPrefetch(kind, url, as) {\r\n const linkElem = document.createElement('link');\r\n linkElem.rel = kind;\r\n linkElem.href = url;\r\n if (as) {\r\n linkElem.as = as;\r\n }\r\n linkElem.crossorigin = true;\r\n document.head.append(linkElem);\r\n}\r\n\r\n/**\r\n * Get the thumbnail dimensions to use for a given player size.\r\n *\r\n * @param {Object} options\r\n * @param {number} options.width The width of the player\r\n * @param {number} options.height The height of the player\r\n * @return {Object} The width and height\r\n */\r\nfunction getRoundedDimensions({ width, height }) {\r\n let roundedWidth = width;\r\n let roundedHeight = height;\r\n\r\n // If the original width is a multiple of 320 then we should\r\n // not round up. This is to keep the native image dimensions\r\n // so that they match up with the actual frames from the video.\r\n //\r\n // For example 640x360, 960x540, 1280x720, 1920x1080\r\n //\r\n // Round up to nearest 100 px to improve cacheability at the\r\n // CDN. For example, any width between 601 pixels and 699\r\n // pixels will render the thumbnail at 700 pixels width.\r\n if (roundedWidth % 320 !== 0) {\r\n roundedWidth = Math.ceil(width / 100) * 100;\r\n roundedHeight = Math.round((roundedWidth / width) * height);\r\n }\r\n\r\n return {\r\n width: roundedWidth,\r\n height: roundedHeight\r\n };\r\n}\r\n","import {setupFilters} from './modules/filter';\r\nimport {createChart, createChartCalculator} from \"./modules/charts\";\r\nimport { initVhUnitOverwrite } from './utils/vh';\r\nimport { setupVideos } from './modules/video';\r\n\r\n\r\nwindow.RWI = {};\r\n\r\n\r\nRWI.GetScreenDimensions = function () {\r\n var w = window,\r\n d = document,\r\n e = d.documentElement,\r\n g = d.getElementsByTagName('body')[0],\r\n x = w.innerWidth || e.clientWidth || g.clientWidth,\r\n y = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n return { width: x, height: y };\r\n};\r\n\r\nRWI.SimulateClick = function (elem) {\r\n var evt = new MouseEvent('click', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: window\r\n });\r\n var canceled = !elem.dispatchEvent(evt);\r\n};\r\n\r\nRWI.ScrollToElement = function (elm) {\r\n\r\n elm.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start'\r\n });\r\n};\r\n\r\nRWI.ScrollDetect = function () {\r\n\r\n var lastScroll = 0;\r\n var lastDirection = 'down';\r\n\r\n var viewport = RWI.GetScreenDimensions();\r\n var isSmall = viewport.width < 768 || viewport.height < 600;\r\n var thresholdUp = isSmall ? 500 : 300; // how long to scroll up before we react?\r\n var thresholdDown = 100; // how long to scroll down before we react?\r\n //var gutter = viewport.height; // ignore any scrolling below this\r\n\r\n\r\n var scroll = function () {\r\n var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;\r\n var currentDirection = lastDirection;\r\n\r\n if (currentScroll === 0) {\r\n lastScroll = 0;\r\n lastDirection = 'down';\r\n document.body.classList.remove('scrolling-up');\r\n return;\r\n }\r\n /* else if (currentScroll < gutter) {\r\n if (RWI.hasOwnProperty('CurrentVideoHero')) {\r\n if (RWI.CurrentVideoHero.paused === true) {\r\n RWI.CurrentVideoHero.player.play();\r\n RWI.CurrentVideoHero.paused = false;\r\n }\r\n }\r\n return;\r\n }\r\n else if (currentScroll > gutter) {\r\n if (RWI.hasOwnProperty('CurrentVideoHero')) {\r\n if (RWI.CurrentVideoHero.paused === false) {\r\n RWI.CurrentVideoHero.player.pause();\r\n RWI.CurrentVideoHero.paused = true;\r\n }\r\n }\r\n } */\r\n\r\n var difference = currentScroll - lastScroll;\r\n if (difference > 0 && difference >= thresholdDown || difference <= 0 && difference * -1 >= thresholdUp) {\r\n\r\n if (difference < 0) {\r\n currentDirection = 'up';\r\n } else {\r\n currentDirection = 'down';\r\n }\r\n\r\n lastScroll = currentScroll;\r\n if (currentDirection !== lastDirection) {\r\n\r\n if (currentDirection === 'up') {\r\n document.body.classList.add('scrolling-up');\r\n }\r\n else {\r\n document.body.classList.remove('scrolling-up');\r\n }\r\n\r\n lastDirection = currentDirection;\r\n }\r\n }\r\n };\r\n\r\n var init = function () {\r\n window.addEventListener('scroll', scroll);\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.Ajax = {\r\n\r\n Get: function (url, success) {\r\n var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');\r\n xhr.open('GET', url);\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState > 3 && xhr.status === 200) {\r\n success(xhr.responseText);\r\n }\r\n };\r\n xhr.send();\r\n return xhr;\r\n },\r\n\r\n mailChimp: function (url, data, callback) {\r\n var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');\r\n\r\n // Define callback\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState > 3 && xhr.status === 200) {\r\n callback(xhr.responseText);\r\n }\r\n };\r\n\r\n // Set up our request\r\n xhr.open('POST', url, true);\r\n // Add the required HTTP header for form data POST requests\r\n xhr.setRequestHeader(\"Content-type\", \"application/json\");\r\n // Finally, send our data.\r\n xhr.send(data);\r\n return xhr;\r\n },\r\n\r\n Post: function (url, data, callbackHandler) {\r\n var params = typeof data === 'string' ? data : Object.keys(data).map(\r\n function (k) { return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]); }\r\n ).join('&');\r\n\r\n var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n xhr.open('POST', url);\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState > 3 && xhr.status === 200) {\r\n callbackHandler(JSON.parse(xhr.responseText));\r\n }\r\n };\r\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n xhr.send(params);\r\n return xhr;\r\n }\r\n};\r\n\r\nRWI.FormHandler = function (form, submitHandler) {\r\n\r\n var isFormFieldFilled = function (e) {\r\n var fld = this;\r\n fld.classList.toggle('filled', fld.value !== '');\r\n };\r\n\r\n var isFormFieldChecked = function (e) {\r\n var fld = this;\r\n fld.classList.toggle('checked', fld.checked);\r\n };\r\n\r\n var init = function () {\r\n if (!form) {\r\n return;\r\n }\r\n\r\n if (submitHandler) {\r\n form.onsubmit = submitHandler;\r\n }\r\n\r\n var fieldList = form.querySelectorAll('input, textarea');\r\n for (var i = 0; i < fieldList.length; i++) {\r\n var field = fieldList[i];\r\n var tag = field.nodeName.toLowerCase();\r\n if (tag === 'input') {\r\n var type = field.getAttribute('type');\r\n if (type === 'checkbox')\r\n field.addEventListener('click', isFormFieldChecked);\r\n else if (type !== 'hidden')\r\n field.addEventListener('blur', isFormFieldFilled);\r\n } else if (tag === 'textarea') {\r\n field.addEventListener('blur', isFormFieldFilled);\r\n }\r\n }\r\n };\r\n\r\n var reset = function () {\r\n var field, s = [];\r\n if (typeof form === 'object' && form.nodeName === \"FORM\") {\r\n var len = form.elements.length;\r\n for (var i = 0; i < len; i++) {\r\n field = form.elements[i];\r\n if (field.name && field.type !== 'hidden' && field.type !== 'submit' && field.type !== 'button') {\r\n if (field.type == 'checkbox') {\r\n field.removeAttribute('checked');\r\n field.classList.remove('checked');\r\n }\r\n else {\r\n field.value = '';\r\n field.classList.remove('filled');\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n init();\r\n\r\n return {\r\n serialize: function (form) {\r\n var field, s = [];\r\n if (typeof form === 'object' && form.nodeName === \"FORM\") {\r\n var len = form.elements.length;\r\n for (var i = 0; i < len; i++) {\r\n field = form.elements[i];\r\n if (field.name && !field.disabled && field.type !== 'file' && field.type !== 'reset' && field.type !== 'submit' && field.type !== 'button') {\r\n if (field.type === 'select-multiple') {\r\n for (j = form.elements[i].options.length - 1; j >= 0; j--) {\r\n if (field.options[j].selected)\r\n s[s.length] = encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.options[j].value);\r\n }\r\n } else if (field.type !== 'checkbox' && field.type !== 'radio' || field.checked) {\r\n s[s.length] = encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.value);\r\n }\r\n }\r\n }\r\n }\r\n return s.join('&').replace(/%20/g, '+');\r\n },\r\n showConfirmationText: function () {\r\n var section = form.parentElement.parentElement;\r\n section.classList.add('form-submitted');\r\n section.querySelector('.confirmation-text').scrollIntoView();\r\n window.setTimeout(function () {\r\n reset();\r\n section.classList.remove('form-submitted');\r\n }, 4000);\r\n },\r\n showConfirmationPage: function () {\r\n if (form.getAttribute('data-confirmation-page') != '') {\r\n window.location = form.getAttribute('data-confirmation-page');\r\n }\r\n },\r\n resetForm: function () {\r\n reset();\r\n },\r\n form: form\r\n };\r\n};\r\n\r\nRWI.Newsletter = function () {\r\n\r\n var submitHandler = function () {\r\n var termsAccepted = document.querySelector('li.check-box input').checked;\r\n if (!termsAccepted) {\r\n alert('Accepter venligst betingelserne i vores privatlivspolitik');\r\n return false;\r\n }\r\n };\r\n\r\n var init = function () {\r\n var form = document.getElementById('newsletter-subscription-form');\r\n if (form !== null) {\r\n new RWI.FormHandler(form, submitHandler);\r\n }\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.ContactForm = function () {\r\n\r\n var _formHandler = null;\r\n\r\n var submitCallbackHandler = function (json) {\r\n\r\n if (json.status != 'ok') {\r\n alert('Der opstod desværre en fejl under indsendelse af formularen.');\r\n }\r\n else {\r\n //_formHandler.showConfirmationText();\r\n _formHandler.showConfirmationPage();\r\n }\r\n };\r\n\r\n var submitHandler = function () {\r\n var termsAccepted = document.getElementById('cb-terms').checked;\r\n if (!termsAccepted) {\r\n alert('Accepter venligst betingelserne i vores privatlivspolitik');\r\n } else {\r\n var data = _formHandler.serialize(this);\r\n RWI.Ajax.Post('/umbraco/api/mail/sendmultinestedcontent', data, submitCallbackHandler);\r\n }\r\n return false;\r\n };\r\n\r\n var init = function () {\r\n var form = document.getElementById('contact-form');\r\n if (form !== null) {\r\n _formHandler = new RWI.FormHandler(form, submitHandler);\r\n }\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.EventRegistrationForm = function () {\r\n\r\n var _formHandler = null;\r\n\r\n var submitCallbackHandler = function (json) {\r\n\r\n if (json.status != 'ok') {\r\n alert('Der opstod desværre en fejl under indsendelse af formularen.');\r\n console.log('Form error', json.message);\r\n }\r\n else {\r\n var wrap = _formHandler.form.parentElement;\r\n var section = wrap.parentElement;\r\n section.classList.add('form-submitted');\r\n wrap.scrollIntoView();\r\n setTimeout(function () {\r\n section.classList.remove('form-submitted');\r\n _formHandler.resetForm();\r\n }, 6000);\r\n }\r\n };\r\n\r\n var submitHandler = function () {\r\n var termsAccepted = document.getElementById('cb-terms').checked;\r\n if (!termsAccepted) {\r\n alert('Accepter venligst betingelserne i vores privatlivspolitik');\r\n } else {\r\n var data = _formHandler.serialize(this);\r\n RWI.Ajax.Post('/umbraco/api/mail/sendmultinestedcontent', data, submitCallbackHandler);\r\n }\r\n return false;\r\n };\r\n\r\n var init = function () {\r\n var form = document.getElementById('registration-form');\r\n if (form !== null) {\r\n _formHandler = new RWI.FormHandler(form, submitHandler);\r\n }\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.DownloadProspectForm = function () {\r\n\r\n var _formHandler = null;\r\n\r\n var submitCallbackHandler = function (json) {\r\n\r\n if (json.status != 'ok') {\r\n alert('Der opstod desværre en fejl under indsendelse af formularen.');\r\n console.log('Form error', json.message);\r\n }\r\n else {\r\n _formHandler.showConfirmationText();\r\n }\r\n };\r\n\r\n var submitHandler = function () {\r\n var termsAccepted = document.getElementById('cb-terms').checked;\r\n if (!termsAccepted) {\r\n alert('Accepter venligst betingelserne i vores privatlivspolitik');\r\n } else {\r\n var data = _formHandler.serialize(this);\r\n RWI.Ajax.Post('/umbraco/api/mail/sendmultinestedcontent', data, submitCallbackHandler);\r\n }\r\n return false;\r\n };\r\n\r\n var init = function () {\r\n var form = document.getElementById('download-prospect-form');\r\n if (form !== null) {\r\n _formHandler = new RWI.FormHandler(form, submitHandler);\r\n }\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.DownloadRapport = function() {\r\n var _formHandler;\r\n var form = document.getElementById('download-rapport-form');\r\n\r\n var submitCallbackHandler = function (data) {\r\n var response = JSON.parse(data);\r\n\r\n if (response.status != 'ok') {\r\n alert('Der opstod desværre en fejl under indsendelse af formularen.');\r\n console.warn('Form error', data.message);\r\n }\r\n else {\r\n window.location = form.getAttribute(\"data-pdflink\");\r\n form.classList.add('form--submitting');\r\n\r\n var sendMailData = {\r\n firstname: form.querySelector('[name=\"NAME\"]').value,\r\n lastname: form.querySelector('[name=\"LAST_NAME\"]').value,\r\n email: form.querySelector('[name=\"EMAIL\"]').value,\r\n phone: form.querySelector('[name=\"PHONE\"]').value,\r\n terms: document.getElementById(\"gdpr_63\").value,\r\n investment: window.chartObj.amount + window.chartObj.moneyUnit,\r\n period: window.chartObj.years,\r\n percent: window.chartObj.percent,\r\n system_umbracoTemplateNodeId: form.querySelector('[name=\"system_umbracoTemplateNodeId\"]').value,\r\n system_umbracoTemplateNestedContentPropertyAlias: form.querySelector('[name=\"system_umbracoTemplateNestedContentPropertyAlias\"]').value\r\n };\r\n\r\n RWI.Ajax.Post('/umbraco/api/mail/send', sendMailData, () => {\r\n setTimeout(() => {\r\n form.classList.remove('form--submitting');\r\n document.getElementById(\"chart-form\").setAttribute('aria-hidden', true);\r\n _formHandler.resetForm();\r\n }, 2000);\r\n });\r\n }\r\n };\r\n\r\n var submitHandler = function (e) {\r\n var requiredChecks = form.querySelectorAll('input[type=checkbox][required]')\r\n var termsAccepted = requiredChecks[1].checked;\r\n // Stops the forms native submit action\r\n e.preventDefault();\r\n\r\n if (!termsAccepted) {\r\n var requeiredMsg = requiredChecks[1].getAttribute(\"data-required-msg\")\r\n if(requeiredMsg) {\r\n alert(requeiredMsg);\r\n } else {\r\n alert('Accepter venligst betingelserne i vores privatlivspolitik');\r\n }\r\n } else {\r\n var formData = new FormData(this);\r\n var subscriberName = formData.get('NAME') != null ? formData.get('NAME') : '';\r\n var subscriberEmail = formData.get('EMAIL') != null ? formData.get('EMAIL') : '';\r\n var subscriberLastName = formData.get('LAST_NAME') != null ? formData.get('LAST_NAME') : '';\r\n var subscriberPhone = formData.get('PHONE') != null ? formData.get('PHONE') : '';\r\n var aquisition = formData.get('AQUISITION') != null ? formData.get('AQUISITION') : '';\r\n var country = formData.get('COUNTRY') != null ? formData.get('COUNTRY') : '';\r\n var url = \"/umbraco/api/mailchimp/addorupdatelistmember\";\r\n var listId = form.getAttribute('data-mailchimp-id') || '8d24f2ad12';\r\n\r\n var data = JSON.stringify({\r\n 'dataCenter': 'us7',\r\n 'listId': listId,\r\n 'subscriberEmail': subscriberEmail,\r\n 'subscriberName': subscriberName,\r\n 'subscriberLastName': subscriberLastName,\r\n 'subscriberPhone': subscriberPhone,\r\n 'aquisition': aquisition,\r\n 'country': country\r\n });\r\n\r\n RWI.Ajax.mailChimp(url, data, submitCallbackHandler);\r\n }\r\n return false;\r\n };\r\n\r\n var init = function () {\r\n\r\n if (form !== null) {\r\n _formHandler = new RWI.FormHandler(form, submitHandler, true);\r\n }\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.NewsSlider = function () {\r\n\r\n var newsSection = null;\r\n var nextLink = null;\r\n var previousLink = null;\r\n var nextLinkWrap = null;\r\n var previousLinkWrap = null;\r\n\r\n var goto = function (item, setHash) {\r\n if (item !== null) {\r\n var currentItem = newsSection.querySelector('.current-item');\r\n currentItem.classList.remove('current-item');\r\n item.classList.add('current-item');\r\n var nextSibling = item.nextElementSibling;\r\n var previousSibling = item.previousElementSibling;\r\n if (nextSibling !== null) {\r\n nextLinkWrap.style.backgroundImage = nextSibling.style.backgroundImage;\r\n }\r\n if (previousSibling !== null) {\r\n previousLinkWrap.style.backgroundImage = previousSibling.style.backgroundImage;\r\n }\r\n newsSection.classList.toggle('has-next', nextSibling !== null);\r\n newsSection.classList.toggle('has-previous', previousSibling !== null);\r\n\r\n if (setHash === true) {\r\n location.hash = '#newsitem-' + item.getAttribute('data-newsitemid');\r\n }\r\n }\r\n };\r\n\r\n var previous = function (e) {\r\n\r\n var currentItem = newsSection.querySelector('.current-item');\r\n var previousItem = currentItem.previousElementSibling;\r\n goto(previousItem, true);\r\n e.preventDefault();\r\n return false;\r\n };\r\n\r\n var next = function (e) {\r\n var currentItem = newsSection.querySelector('.current-item');\r\n var nextItem = currentItem.nextElementSibling;\r\n goto(nextItem, true);\r\n e.preventDefault();\r\n return false;\r\n };\r\n\r\n var updateSwipePaging = function () {\r\n var currentIndex = window.mySwipe.getPos();\r\n var pagingLinks = newsSection.querySelectorAll('.news-paging a');\r\n for (var i = 0; i < pagingLinks.length; i++) {\r\n var link = pagingLinks[i];\r\n if (i === currentIndex)\r\n link.classList.add('current');\r\n else\r\n link.classList.remove('current');\r\n }\r\n };\r\n\r\n var swipePagingClickHandler = function (e) {\r\n var index = this.getAttribute('data-index');\r\n e.preventDefault();\r\n window.mySwipe.slide(index, 200);\r\n return false;\r\n };\r\n\r\n var init = function () {\r\n newsSection = document.getElementById('news-section');\r\n if (newsSection === null) return;\r\n\r\n if (RWI.GetScreenDimensions().width <= 768) {\r\n var navDivs = document.querySelectorAll('#news-section > div');\r\n for (var i = 0; i < navDivs.length; i++)\r\n navDivs[i].remove();\r\n\r\n window.mySwipe = new Swipe(newsSection, {\r\n startSlide: 0,\r\n speed: 400,\r\n draggable: true,\r\n continuous: true,\r\n disableScroll: false,\r\n stopPropagation: true,\r\n callback: function (index, elem, dir) { },\r\n transitionEnd: function (index, elem) { updateSwipePaging(); }\r\n });\r\n\r\n var newsCount = newsSection.getElementsByTagName('li').length;\r\n var newsHeadlines = newsSection.querySelectorAll('li h2');\r\n var pagingWrap = document.createElement('DIV');\r\n pagingWrap.classList.add('news-paging');\r\n var pagingLinks = [];\r\n for (var n = 0; n < newsCount; n++) {\r\n pagingLinks.push('');\r\n }\r\n pagingWrap.innerHTML = pagingLinks.join('');\r\n\r\n for (n = 0; n < pagingWrap.childNodes.length; n++) {\r\n pagingWrap.childNodes[n].addEventListener('click', swipePagingClickHandler);\r\n }\r\n\r\n newsSection.append(pagingWrap);\r\n updateSwipePaging();\r\n }\r\n else\r\n {\r\n previousLink = newsSection.querySelector('a.previous-link');\r\n previousLinkWrap = previousLink.parentNode;\r\n previousLink.addEventListener('click', previous);\r\n\r\n nextLink = newsSection.querySelector('a.next-link');\r\n nextLinkWrap = nextLink.parentNode;\r\n nextLink.addEventListener('click', next);\r\n\r\n var hash = location.hash;\r\n if (hash && hash !== '' && hash.indexOf('#newsitem-') > -1) {\r\n var itemId = hash.replace('#newsitem-', '');\r\n var item = newsSection.querySelector('li.news-item[data-newsitemid=\"' + itemId + '\"]:not(.current-item)');\r\n if (item !== null) {\r\n goto(item, false);\r\n }\r\n }\r\n }\r\n\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.NewsList = function (settings) {\r\n var currentNewsItemsBatch = 1;\r\n var maxNewItemsBatch = settings.maxBatchCount || 1;\r\n\r\n var tagLinksSelector = 'ul.tag-list a';\r\n var tagLinks = null;\r\n var loadMore = document.getElementById('load-more');\r\n\r\n var loadMoreClick = function (e) {\r\n var parsedHash = parseHash();\r\n var newHash = currentNewsItemsBatch + 1;\r\n if (parsedHash.hasTag) {\r\n newHash += '/' + parsedHash.tag;\r\n }\r\n\r\n this.setAttribute('href', '#' + newHash);\r\n\r\n return false;\r\n };\r\n\r\n if (loadMore !== null) {\r\n loadMore.addEventListener('click', loadMoreClick);\r\n }\r\n\r\n var loadAllCurrentNewsItemBatches = function () {\r\n for (var i = 0; i <= currentNewsItemsBatch; i++) {\r\n loadNewsItemBatch(i);\r\n }\r\n };\r\n\r\n var loadNewsItemBatch = function (batch) {\r\n var coll = document.querySelectorAll('.news-item-batch-' + batch);\r\n for (var i = 0; i < coll.length; i++) {\r\n coll[i].classList.remove('hidden');\r\n }\r\n\r\n if (batch >= maxNewItemsBatch) {\r\n var loadMoreWrap = document.getElementById('load-more-wrap');\r\n if (loadMoreWrap != null)\r\n loadMoreWrap.remove();\r\n }\r\n };\r\n\r\n var tagLinkClick = function (e) {\r\n setActiveLink(this);\r\n var tag = this.getAttribute('href').replace('#', '');\r\n if (tag.indexOf('/') > -1)\r\n tag = tag.substring(tag.indexOf('/') + 1);\r\n\r\n applyTag(tag);\r\n this.setAttribute('href', '#' + currentNewsItemsBatch + '/' + tag);\r\n };\r\n\r\n var setActiveLink = function (lnk) {\r\n var active = document.querySelector(tagLinksSelector + '.active');\r\n active.classList.remove('active');\r\n lnk.classList.add('active');\r\n };\r\n\r\n var applyTag = function (tag) {\r\n var newsSection = document.querySelector('section.news-list-section');\r\n var newsListItems = document.querySelectorAll('ul.news-list > li');\r\n var maxOrder = newsListItems.length + 1;\r\n var order = 1;\r\n var i, item;\r\n for (i = 0; i < newsListItems.length; i++) {\r\n item = newsListItems[i];\r\n item.classList.add('filter-hide');\r\n }\r\n\r\n setTimeout(function () {\r\n for (i = 0; i < newsListItems.length; i++) {\r\n item = newsListItems[i];\r\n item.style.order = 'initial';\r\n\r\n if (tag == 'Alle')\r\n {\r\n item.classList.remove('filter-hide');\r\n }\r\n else\r\n {\r\n var tags = item.getAttribute('data-tags') || '';\r\n if (tags.indexOf(tag + ',') === -1) {\r\n item.style.order = maxOrder;\r\n } else {\r\n item.classList.remove('filter-hide');\r\n item.style.order = order;\r\n order++;\r\n }\r\n }\r\n }\r\n }, 10);\r\n\r\n };\r\n\r\n var parseHash = function () {\r\n var hash = location.hash || '';\r\n hash = hash.replace('#', '');\r\n var hasHash = hash != '';\r\n\r\n var page = 1;\r\n if (hasHash) {\r\n page = parseInt(hash.indexOf('/') > -1 ? hash.substring(0, hash.indexOf('/')) : hash);\r\n }\r\n var tag = hash.indexOf('/') > -1 ? hash.substring(hash.indexOf('/') + 1) : null;\r\n\r\n return {\r\n hasHash: hasHash,\r\n page: page,\r\n tag: tag,\r\n hasTag: hasHash && tag && tag !== ''\r\n };\r\n };\r\n\r\n var hashChange = function ()\r\n {\r\n var parsedHash = parseHash();\r\n var isPageChange = parsedHash.page != currentNewsItemsBatch;\r\n if (isPageChange)\r\n {\r\n var isMultiplePageChange = parsedHash.page > (currentNewsItemsBatch + 1);\r\n currentNewsItemsBatch = parsedHash.page;\r\n\r\n\r\n if (isMultiplePageChange) {\r\n loadAllCurrentNewsItemBatches();\r\n }\r\n else {\r\n loadNewsItemBatch(currentNewsItemsBatch);\r\n }\r\n }\r\n\r\n // if (parsedHash.hasTag)\r\n // {\r\n // var tagLink = document.querySelector(tagLinksSelector + '[href=\"#' + parsedHash.tag + '\"]');\r\n // if (tagLink !== null) {\r\n // RWI.SimulateClick(tagLink);\r\n // }\r\n // }\r\n // else\r\n // {\r\n // var allTagLink = document.querySelector(tagLinksSelector + '[href=\"#Alle\"]');\r\n // setActiveLink(allTagLink);\r\n // }\r\n\r\n\r\n };\r\n\r\n var init = function () {\r\n window.addEventListener('hashchange', hashChange);\r\n\r\n // tagLinks = document.querySelectorAll(tagLinksSelector);\r\n // for (var i = 0; i < tagLinks.length; i++) {\r\n // tagLinks[i].addEventListener('click', tagLinkClick);\r\n // }\r\n\r\n hashChange();\r\n };\r\n\r\n init();\r\n};\r\n\r\nRWI.TableDecorator = function () {\r\n var tables = document.querySelectorAll('.news-item-content.table table');\r\n if (!tables) return;\r\n for (var i = 0; i < tables.length; i++) {\r\n var table = tables[i];\r\n var labels = [];\r\n var headerCells = table.querySelectorAll('thead th');\r\n for (var j = 0; j < headerCells.length; j++) {\r\n labels.push(headerCells[j].innerHTML);\r\n }\r\n var rows = table.querySelectorAll('tbody tr');\r\n for (var k = 0; k < rows.length; k++) {\r\n var row = rows[k];\r\n for (var l = 0; l < row.cells.length; l++) {\r\n row.cells[l].setAttribute('data-label', labels[l]);\r\n }\r\n }\r\n }\r\n};\r\n\r\nRWI.CookieConsent = function (settings) {\r\n\r\n var cookieName = settings.cookieName || 'CookieConsent';\r\n var cookieNoticeSelector = settings.cookieNoticeSelector || '#cookie-notice';\r\n var cookieNotice = document.querySelector(cookieNoticeSelector);\r\n\r\n var setConsentCookie = function () {\r\n docCookies.setItem(cookieName, \"Accepted\", Infinity, '/');\r\n document.body.classList.remove('with-cookie-notice');\r\n };\r\n\r\n if (!docCookies.hasItem(cookieName)) {\r\n if (cookieNotice) {\r\n cookieNotice.querySelector('button').addEventListener('click', setConsentCookie);\r\n setTimeout(function () { document.body.classList.add('with-cookie-notice'); }, 2500);\r\n }\r\n }\r\n};\r\n\r\nRWI.Charts = {};\r\n\r\nRWI.Charts.Create = createChart;\r\nRWI.Charts.createChartCalculator = createChartCalculator;\r\n\r\n/* RWI.VideoHero = function () {\r\n\r\n var video = null;\r\n\r\n var playerScriptAdded = function () {\r\n if (video === null) return;\r\n var player = new Vimeo.Player(video);\r\n if (player !== null) {\r\n player.setVolume(0);\r\n player.play();\r\n RWI.CurrentVideoHero = {\r\n player: player,\r\n paused: false\r\n };\r\n\r\n //// debug\r\n //player.on('play', function () {\r\n // console.log('played video');\r\n //});\r\n //player.on('pause', function () {\r\n // console.log('paused video');\r\n //});\r\n }\r\n };\r\n\r\n var addPlayerScript = function () {\r\n var s = document.createElement('script');\r\n s.setAttribute('src', 'https://player.vimeo.com/api/player.js');\r\n s.onload = playerScriptAdded;\r\n document.body.appendChild(s);\r\n };\r\n\r\n var init = function () {\r\n video = document.querySelector('section.hero iframe.video');\r\n if (video !== null) {\r\n addPlayerScript();\r\n }\r\n };\r\n\r\n init();\r\n}; */\r\n\r\nfunction setupLanguageSelector () {\r\n const languageSelector = document.querySelector('.language-selector');\r\n if (languageSelector) {\r\n const languageSelectorList = languageSelector.querySelector('.language-selector__list');\r\n if (languageSelectorList) {\r\n\r\n languageSelector.addEventListener('click', function () {\r\n if (languageSelector.getAttribute('aria-expanded').toLowerCase() == 'false') {\r\n languageSelectorList.style.height = `${languageSelectorList.scrollHeight}px`;\r\n\r\n languageSelectorList.addEventListener('transitionend', function(e) {\r\n if (e.propertyName === 'height') {\r\n languageSelectorList.style.height = null;\r\n }\r\n });\r\n\r\n languageSelectorList.setAttribute('aria-hidden', false);\r\n languageSelector.setAttribute('aria-expanded', true);\r\n }\r\n else {\r\n languageSelectorList.style.height = `${languageSelectorList.scrollHeight}px`;\r\n\r\n setTimeout(() => {\r\n languageSelectorList.style.height = '0';\r\n }, 0);\r\n\r\n languageSelectorList.setAttribute('aria-hidden', true);\r\n languageSelector.setAttribute('aria-expanded', false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n\r\n void new LazyLoad({\r\n elements_selector: \".lazy\",\r\n threshold: 700\r\n });\r\n\r\n AOS.init({ duration: 900 });\r\n\r\n //new RWI.VideoHero();\r\n new RWI.ScrollDetect();\r\n new RWI.Newsletter();\r\n new RWI.NewsSlider();\r\n\r\n // scroll button click\r\n var scrollButtons = document.getElementsByClassName('scroll-btn');\r\n if (scrollButtons && scrollButtons.length > 0) {\r\n scrollButtons[0].addEventListener('click', function (e) {\r\n var firstSection = document.getElementsByTagName('section')[1];\r\n e.preventDefault();\r\n RWI.ScrollToElement(firstSection);\r\n return false;\r\n });\r\n }\r\n\r\n // nav burger click\r\n document.getElementById('nav-trigger').addEventListener('click', function (e) {\r\n document.body.classList.toggle('with-nav');\r\n e.preventDefault();\r\n setTimeout(function () {\r\n document.body.classList.toggle('blurred');\r\n }, 250);\r\n return false;\r\n });\r\n\r\n initVhUnitOverwrite();\r\n\r\n // rellax\r\n var useRellax = false;\r\n\r\n if ('ontouchstart' in window) {\r\n document.body.classList.add('touch');\r\n if (RWI.GetScreenDimensions().width > 768) {\r\n useRellax = true;\r\n }\r\n } else {\r\n document.body.classList.add('no-touch');\r\n useRellax = true;\r\n }\r\n\r\n if (useRellax && document.querySelectorAll('.rellax').length > 0) {\r\n this.Rellax = new Rellax();\r\n }\r\n\r\n new RWI.DownloadProspectForm();\r\n\r\n MediaBox('.mediabox');\r\n\r\n setupFilters();\r\n\r\n setupVideos();\r\n\r\n setupLanguageSelector();\r\n});\r\n"],"names":["classNames","activeBtn","hiddenItem","searchActive","Filter","container","dom","filters","querySelectorAll","targetContainer","document","body","querySelector","getAttribute","button","loadmoreBtn","getElementById","searchInput","settings","filterType","date","urlParams","URLSearchParams","window","location","search","get","urlSearchParam","urlQuery","split","value","this","i","length","filter","itemCountReplace","tagName","addEventListener","e","_this","filterHandler","replaceWithNumberOfItems","type","includes","click","options","option","dispatchEvent","Event","handleSearchRequest","resetFilter","console","log","classList","contains","remove","add","target","filterItems","isButton","filterValue","filterByDate","dateNow","Date","parse","getSetValues","transitionItems","filterValues","nextURL","protocol","host","pathname","nextTitle","title","history","replaceState","additionalInformation","item","itemFilterValues","cleanFilterValue","trim","toLowerCase","map","itemDateInMs","indexOf","showItem","forEach","cleanValue","which","regex","RegExp","itemTitle","innerText","match","addSearchQuery","element","replaceValue","children","items","count","optionStr","replace","valArray","len","push","checked","getAvarage","numbers","reduce","a","b","addition","getParameterByName","name","url","href","results","exec","decodeURIComponent","chart","isPrint","chartObj","amountInput","periodInput","percentInput","moneyUnit","yearUnit","bottlePrice","danishNumberFormat","documentElement","lang","formatNumber","num","replaceKommas","formattetNo","toString","internalRateReturn","cfs","depth","args","cashFlow","numberOfTries","Math","round","fn","x","seekZero","rate","Error","rrate","npv","pow","generateChartData","labels","amountSeries","costsPercent","yearlyCosts","amount","parseInt","years","percent","costs","totalValue","year","storageCost","month","yearX","profit","y","commission","salesCommission","costPercentArray","avaragePercent","Number","toFixed","costAvaragePercent","textContent","totalReturn","totalProfit","freeCashFlow","yearlyReturnPercent","costWithInvest","shift","unshift","yearlyProfitPercent","updateKeyNumbers","series","updateChart","data","chartData","lowestAmount","highestAmount","axisY","onlyInteger","labelInterpolationFnc","newValue","axisX","offset","labelOffset","innerWidth","Chartist","AutoScaleAxis","RWI","GetScreenDimensions","width","chartPadding","right","left","fullWidth","lineSmooth","showGrid","low","high","update","Line","id","path","origin","substr","downloadForm","encodedUrl","encodeURIComponent","setAttribute","generatePDFlink","setViewportHeightProp","vh","innerHeight","style","setProperty","Video","videoLink","controls","bg","byline","scrollto","warn","extractVideoIdFromUrl","isVimeo","poster","height","roundedWidth","roundedHeight","ceil","getRoundedDimensions","getBoundingClientRect","devicePixelRatio","elem","createElement","getContext","toDataURL","canUseWebP","backgroundImage","warmConnections","addIframe","once","videoUrl","iframe","setTimeout","_this2","src","appendChild","preconnected","addPrefetch","kind","as","linkElem","rel","crossorigin","head","append","w","d","g","getElementsByTagName","clientWidth","clientHeight","SimulateClick","evt","MouseEvent","bubbles","cancelable","view","ScrollToElement","elm","scrollIntoView","behavior","block","ScrollDetect","scroll","currentScroll","scrollTop","currentDirection","lastDirection","lastScroll","difference","thresholdUp","viewport","Ajax","Get","success","xhr","XMLHttpRequest","ActiveXObject","open","onreadystatechange","readyState","status","responseText","send","mailChimp","callback","setRequestHeader","Post","callbackHandler","params","Object","keys","k","join","JSON","FormHandler","form","submitHandler","isFormFieldFilled","toggle","isFormFieldChecked","reset","field","_typeof","nodeName","elements","removeAttribute","onsubmit","fieldList","tag","init","serialize","s","disabled","j","selected","showConfirmationText","section","parentElement","showConfirmationPage","resetForm","Newsletter","alert","ContactForm","submitCallbackHandler","json","_formHandler","EventRegistrationForm","message","wrap","DownloadProspectForm","DownloadRapport","sendMailData","firstname","lastname","email","phone","terms","investment","period","system_umbracoTemplateNodeId","system_umbracoTemplateNestedContentPropertyAlias","requiredChecks","termsAccepted","preventDefault","formData","FormData","subscriberName","subscriberEmail","subscriberLastName","subscriberPhone","aquisition","country","listId","stringify","requeiredMsg","NewsSlider","goto","setHash","newsSection","nextSibling","nextElementSibling","previousSibling","previousElementSibling","nextLinkWrap","previousLinkWrap","hash","previous","previousItem","next","nextItem","updateSwipePaging","currentIndex","mySwipe","getPos","pagingLinks","link","swipePagingClickHandler","index","slide","nextLink","previousLink","navDivs","Swipe","startSlide","speed","draggable","continuous","disableScroll","stopPropagation","transitionEnd","newsCount","newsHeadlines","pagingWrap","n","innerHTML","childNodes","parentNode","itemId","NewsList","currentNewsItemsBatch","maxNewItemsBatch","maxBatchCount","loadMore","parsedHash","parseHash","newHash","hasTag","hashChange","page","isMultiplePageChange","loadNewsItemBatch","loadAllCurrentNewsItemBatches","batch","coll","loadMoreWrap","hasHash","substring","TableDecorator","tables","table","headerCells","rows","row","l","cells","CookieConsent","cookieName","cookieNoticeSelector","cookieNotice","docCookies","hasItem","setItem","Infinity","Charts","Create","customSettings","plugins","comments","hasOwnProperty","graphElm","sectionElm","closest","legendList","legends","legend","legendSeriesName","ctSeries","Array","from","commentElements","currentSeriesElements","concat","createChartCalculator","amountParam","periodParam","percentParam","restultTables","openModalBtns","toggleModal","openModalBtn","targetSel","closeBtn","rangeSliders","showSliderValue","slider","thumb","fill","range","max","min","position","positionOffset","thumbWidth","rs","rsMinMaxSpans","span","matchMedia","addListener","setupRangeInput","LazyLoad","elements_selector","threshold","AOS","duration","scrollButtons","getElementsByClassName","firstSection","useRellax","Rellax","MediaBox","selector","filterContainers","setupFilters","videos","setupVideos","languageSelector","languageSelectorList","scrollHeight","propertyName","setupLanguageSelector"],"mappings":"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"}