HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/medvalue.komma.pro/wwwroot/js/site/app.js
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/* ==========================================================================
   Browser Handler
 ========================================================================== */

var BrowserHandler = {

    userAgent: '',
    browserInfo: '',

    init: function init() {
        BrowserHandler.userAgent = window.navigator.userAgent;
        BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
        BrowserHandler.handleIE();
        BrowserHandler.handleSafari();
    },

    handleIE: function handleIE() {

        // Detect versions below ie11
        var msie = BrowserHandler.userAgent.indexOf('MSIE ');
        var ielt11 = msie > 0;

        // Detect ie11
        var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./);

        // If Internet Explorer
        if (ielt11 || ie11) {
            // Default version
            var version = '11';

            // Way to detect version < 11
            if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie)));

            // Append classes to HTML (we have to do this separately because else ie will fail)
            document.body.classList.add('ie');
            document.body.classList.add('v' + version);
        }
    },

    // Fallback for older safari version
    handleSafari: function handleSafari() {

        if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
            document.body.classList.add('ie');
        }
    },

    getBrowserInfo: function getBrowserInfo() {
        var ua = navigator.userAgent,
            tem = void 0,
            M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
        if (/trident/i.test(M[1])) {
            tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
            return { name: 'IE ', version: tem[1] || '' };
        }
        if (M[1] === 'Chrome') {
            tem = ua.match(/\bOPR\/(\d+)/);
            if (tem != null) {
                return { name: 'Opera', version: tem[1] };
            }
        }
        M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
        if ((tem = ua.match(/version\/(\d+)/i)) != null) {
            M.splice(1, 1, tem[1]);
        }
        return {
            name: M[0],
            version: M[1]
        };
    }
};

BrowserHandler.init();
/* ==========================================================================
   Cookie handler
   - Primary usage for toggling the cookie message and/or switch
 ========================================================================== */

var CookieHandler = {

    cookieMessage: null,
    cookieSwitch: null,
    cookieFadeOutAnimationDuration: 400,
    acceptTracking: false,

    // Initialize cookie handler
    init: function init() {
        // Bind cookie message without tracking to Handler
        CookieHandler.cookieMessage = document.getElementById('cookie-message');

        // If isset init the functions for cookie message without tracking
        if (isset(CookieHandler.cookieMessage)) {
            CookieHandler.initCookieMessageWithoutTracking();
        } else {
            // Else try to connect cookie message with tracking to Handler
            CookieHandler.cookieMessage = document.getElementById('cookie-message-overlay');

            // If isset init the functions for cookie message with tracking
            if (isset(CookieHandler.cookieMessage)) {
                CookieHandler.initCookieMessageWithTracking();
            }
        }

        // If either type of cookie has been found check if settings are defined
        if (isset(CookieHandler.cookieMessage)) {
            CookieHandler.checkForCookieSettings();
        }

        // Bind cookie switch to Handler
        CookieHandler.cookieSwitch = document.getElementById('cookie-switch');
        // If isset init the functions for cookie switch
        if (isset(CookieHandler.cookieSwitch)) {
            CookieHandler.initCookieSwitch();
        }
    },

    // Init the cookie message actions without tracking
    initCookieMessageWithoutTracking: function initCookieMessageWithoutTracking() {
        var closeButton = CookieHandler.cookieMessage.querySelector('.close-button');
        if (isset(closeButton)) {
            closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
        }
    },

    // Init the cookie message actions with tracking
    initCookieMessageWithTracking: function initCookieMessageWithTracking() {

        // Open the cookie settings event
        var openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.open-menu');
        if (isset(openCookieSettingsButton)) {
            openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);
        }

        // Toggle of the tracking input
        var toggleTrackingInputWrapper = CookieHandler.cookieMessage.querySelector('#cookie-settings-menu #trackingCookie');
        if (isset(toggleTrackingInputWrapper)) {
            var toggleTrackingInput = toggleTrackingInputWrapper.querySelector('input');
            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);

            if (toggleTrackingInput.checked === true) {
                CookieHandler.acceptTracking = true;
            }
        }

        // Accept / Save cookies button event
        var acceptButton = CookieHandler.cookieMessage.querySelector('.accept-cookie-button');
        if (isset(acceptButton)) {
            acceptButton.addEventListener('click', CookieHandler.setCookieSettings);
        }
    },

    // Init the cookie switch actions
    initCookieSwitch: function initCookieSwitch() {

        // Toggle of the tracking input
        var toggleTrackingInputWrapper = CookieHandler.cookieSwitch.querySelector('#trackingCookie');
        if (isset(toggleTrackingInputWrapper)) {
            var toggleTrackingInput = toggleTrackingInputWrapper.querySelector('input');
            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);

            // Force the state of the cookie switch input because the pop-up is forced on checked
            // while the switch checks by php if the cookie really exist or not
            if (toggleTrackingInput.checked === true) {
                CookieHandler.acceptTracking = true;
            } else {
                CookieHandler.acceptTracking = false;
            }
        }

        // Save cookies button event
        var saveButton = CookieHandler.cookieSwitch.querySelector('#save-cookie-settings');
        if (isset(saveButton)) {
            saveButton.addEventListener('click', function () {
                CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)
                CookieHandler.setCookieSettings();
            });
        }
    },

    checkForCookieSettings: function checkForCookieSettings() {
        if (Cookie.get('cookieMessage')) {
            CookieHandler.cookieMessage.classList.add('accepted');
        } else {
            CookieHandler.cookieMessage.classList.remove('accepted');
        }
    },

    closeCookieMessage: function closeCookieMessage() {
        Cookie.set('cookieMessage', true, 90);
        CookieHandler.cookieMessage.classList.add('transition-out');
    },

    openCookieSettings: function openCookieSettings() {
        CookieHandler.cookieMessage.querySelector('#cookie-settings-menu').classList.add('edit');
        CookieHandler.cookieMessage.querySelector('#message-description').classList.add('hide');
    },

    toggleTrackingSetting: function toggleTrackingSetting() {
        if (CookieHandler.acceptTracking) {
            CookieHandler.acceptTracking = false;
        } else {
            CookieHandler.acceptTracking = true;
        }
    },

    setCookieSettings: function setCookieSettings() {
        // Set tracking cookie or delete it if isset according to the desired settings
        if (CookieHandler.acceptTracking) {
            Cookie.set('trackingCookieAccepted', 'true', 90);
        } else {
            if (Cookie.get('trackingCookieAccepted')) {
                Cookie.erase('trackingCookieAccepted');
            }
        }

        CookieHandler.closeCookieMessage();

        // Reload after animation to automatically trigger the tracking after accepting it
        setTimeout(function () {
            location.reload();
        }, CookieHandler.cookieFadeOutAnimationDuration);
    }

};

CookieHandler.init();
/* ==========================================================================
    Google Maps handler
    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map
 ========================================================================== */

var MapsHandler = {

    map: '',
    key: 'AIzaSyCVGPUmRmQRxXvzzWu3Xyu77XebQxQ-f4Y',
    location: { lat: 51.2618222, lng: 5.5965538 },
    styling: '',

    init: function init() {
        // Get map by id
        MapsHandler.map = document.getElementById('map');

        // Check if a map is defined
        if (isset(MapsHandler.map)) {

            if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
            if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));

            MapsHandler.setCustomStyling();

            // See if google variable exists
            if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
                // Load external script
                getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
            } else {
                MapsHandler.drawMap();
            }
        }
    },

    drawMap: function drawMap() {
        // Create a map
        var map = new google.maps.Map(MapsHandler.map, {
            zoom: 11,
            center: MapsHandler.location,
            disableDefaultUI: true,
            styles: MapsHandler.styling
        });
        // Add a marker
        var marker = new google.maps.Marker({
            position: MapsHandler.location,
            map: map,
            icon: '/img/googleMapsMarker.png'
        });
    },

    setCustomStyling: function setCustomStyling() {

        MapsHandler.styling = [{
            "featureType": "poi",
            "elementType": "labels.text.fill",
            "stylers": [{
                "color": "#747474"
            }, {
                "lightness": "23"
            }]
        }, {
            "featureType": "poi.attraction",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#f38eb0"
            }]
        }, {
            "featureType": "poi.government",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#ced7db"
            }]
        }, {
            "featureType": "poi.medical",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#ffa5a8"
            }]
        }, {
            "featureType": "poi.park",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#c7e5c8"
            }]
        }, {
            "featureType": "poi.place_of_worship",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#d6cbc7"
            }]
        }, {
            "featureType": "poi.school",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#c4c9e8"
            }]
        }, {
            "featureType": "poi.sports_complex",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#b1eaf1"
            }]
        }, {
            "featureType": "road",
            "elementType": "geometry",
            "stylers": [{
                "lightness": "100"
            }]
        }, {
            "featureType": "road",
            "elementType": "labels",
            "stylers": [{
                "visibility": "off"
            }, {
                "lightness": "100"
            }]
        }, {
            "featureType": "road.highway",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#ffd4a5"
            }]
        }, {
            "featureType": "road.arterial",
            "elementType": "geometry.fill",
            "stylers": [{
                "color": "#ffe9d2"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "all",
            "stylers": [{
                "visibility": "simplified"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "geometry.fill",
            "stylers": [{
                "weight": "3.00"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "geometry.stroke",
            "stylers": [{
                "weight": "0.30"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "labels.text",
            "stylers": [{
                "visibility": "on"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "labels.text.fill",
            "stylers": [{
                "color": "#747474"
            }, {
                "lightness": "36"
            }]
        }, {
            "featureType": "road.local",
            "elementType": "labels.text.stroke",
            "stylers": [{
                "color": "#e9e5dc"
            }, {
                "lightness": "30"
            }]
        }, {
            "featureType": "transit.line",
            "elementType": "geometry",
            "stylers": [{
                "visibility": "on"
            }, {
                "lightness": "100"
            }]
        }, {
            "featureType": "water",
            "elementType": "all",
            "stylers": [{
                "color": "#d2e7f7"
            }]
        }];
    }
};

MapsHandler.init();
/* ==========================================================================
   NavigationHandler handler
   - Primary usage for mobile NavigationHandler
   - Secondary if site used a pop-up/slide-in menu
 ========================================================================== */

var NavigationHandler = {

    navElement: '',
    scrolled: 0,
    isActive: false,

    // Initialize click event
    init: function init() {
        // Bind Navigation to Handler
        NavigationHandler.navElement = document.getElementById('mobile-navigation');

        // Bind clicks to menu button
        var mobileMenuButton = document.getElementById('mobile-menu-trigger');
        if (isset(mobileMenuButton)) {
            mobileMenuButton.addEventListener('click', function () {
                NavigationHandler.open();
            });
        }

        // Bind clicks to sticky menu button
        var stickyMenuButton = document.getElementById('sticky-menu-trigger');
        if (isset(stickyMenuButton)) {
            stickyMenuButton.addEventListener('click', function () {
                NavigationHandler.open();
            });
        }

        var mobileShade = document.getElementById('mobile-shader');
        if (isset(mobileShade)) {
            mobileShade.addEventListener('click', function () {
                NavigationHandler.close();
            });
        }

        var mobileClose = document.getElementById('mobile-close');
        if (isset(mobileClose)) {
            mobileClose.addEventListener('click', function () {
                NavigationHandler.close();
            });
        }

        if (isset(NavigationHandler.navElement)) {
            setTimeout(function () {
                NavigationHandler.navElement.classList.add('allow-animation');
            }, 500);
        }
    },

    // Toggle navigation
    toggle: function toggle() {
        if (!NavigationHandler.isActive) NavigationHandler.open();else NavigationHandler.close();
    },

    // Open Navigation
    open: function open() {
        NavigationHandler.scrolled = window.pageYOffset;
        NavigationHandler.navElement.classList.add('active');
        NavigationHandler.navElement.classList.add('shader-active');
        NavigationHandler.isActive = true;

        setTimeout(function () {
            document.body.classList.add('preventScroll');
        }, 400);
    },

    // Close Navigation
    close: function close() {

        NavigationHandler.navElement.classList.remove('active');
        NavigationHandler.navElement.classList.remove('shader-active');
        NavigationHandler.isActive = false;

        document.body.classList.remove('preventScroll');
        window.scrollTo(0, NavigationHandler.scrolled);
    }
};

NavigationHandler.init();
/* ==========================================================================
   Resize handler
   - Handler the objects which are or need to be recalculated on resize
 ========================================================================== */

var ResizeHandler = {

    time: Date.now(),
    timeout: null,
    waitThrottle: 1000,
    waitDebounce: 500,

    //Initialisation
    init: function init() {

        // Trigger start up resize
        ResizeHandler.triggerOnInit();

        // Throttle Resize
        window.addEventListener('resize', function () {
            if (ResizeHandler.time + ResizeHandler.waitThrottle - Date.now() < 0) {
                ResizeHandler.triggerThrottle();
                ResizeHandler.time = Date.now();
            }
        });

        // Smooth Resize
        window.addEventListener('resize', function () {
            ResizeHandler.triggerSmooth();
        });

        // Debounce Resize
        window.addEventListener('resize', function () {
            if (isset(ResizeHandler.timeout)) clearTimeout(ResizeHandler.timeout);
            ResizeHandler.timeout = setTimeout(ResizeHandler.triggerDebounce, ResizeHandler.waitDebounce);
        });
    },

    // Trigger on start up
    // All function should be in here
    triggerOnInit: function triggerOnInit() {
        // ResizeHandler.resizeWhatDoesItCostAdvantageFigure();
        // console.log('Initial Resize');
        ResizeHandler.resizeStepsSliders();
    },

    // Trigger resize functions with throttle (preferred)
    triggerThrottle: function triggerThrottle() {
        // console.log('Throttled Resize');
    },

    // Trigger resize on debounce
    triggerDebounce: function triggerDebounce() {
        // console.log('Debounce Resize');
        // ResizeHandler.resizeWhatDoesItCostAdvantageFigure();
        ResizeHandler.resizeStepsSliders();
    },

    // Trigger resize on the flight
    triggerSmooth: function triggerSmooth() {
        // console.log('Smooth Resize');
    },

    // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------

    // Example function
    // resizeWhatDoesItCostAdvantageFigure: function () {
    //     var el = document.querySelector('.advantages-own-guiding-row figure');
    //     if(isset(el)){
    //         el.style.maxHeight = 'none';
    //         el.style.maxHeight = el.offsetHeight + 'px';
    //     }
    // },

    resizeStepsSliders: function resizeStepsSliders() {
        var stepsSliders = document.querySelectorAll('.steps-slider');

        // Loop through all slider for when there are more then one
        if (isset(stepsSliders)) {
            var stepsSlidersLength = stepsSliders.length;
            for (var i = 0; i < stepsSlidersLength; i++) {
                var stepsSlider = stepsSliders[i];

                // Define the slider height
                var stepsSliderHeight = 0;
                var stepSliderSlides = stepsSlider.querySelectorAll('.slides .slide');
                var stepsSliderSlidesLength = stepSliderSlides.length;

                // Get the highest slide
                for (var _i = 0; _i < stepsSliderSlidesLength; _i++) {
                    var stepSliderSlide = stepSliderSlides[_i];
                    var stepSliderSlideHeight = stepSliderSlide.offsetHeight;

                    if (stepSliderSlideHeight > stepsSliderHeight) stepsSliderHeight = stepSliderSlideHeight;
                }

                // Add extra height for the navigation buttons
                stepsSliderHeight += 40;

                stepsSlider.querySelector('.slides').style.height = stepsSliderHeight + 'px';
            }
        }
    }

};

ResizeHandler.init();
/* ==========================================================================
   Scroll handler
   - Handler the objects which are bind on scroll events or visible in viewport
 ========================================================================== */

var ScrollHandler = {

    // Variables for debounce and throttle effects
    time: Date.now(),
    timeout: null,
    waitThrottle: 1000,
    waitDebounce: 300,

    // Variables for scroll direction
    lastScrollTopPosition: 0,
    scrollDirectionDown: true,
    scrollDirectionUp: false,

    //Initialisation
    init: function init() {

        // Trigger start on start up
        ScrollHandler.triggerOnInit();

        // Throttle scroll
        window.addEventListener('scroll', function () {
            if (ScrollHandler.time + ScrollHandler.waitThrottle - Date.now() < 0) {
                ScrollHandler.triggerThrottle();
                ScrollHandler.time = Date.now();
            }
        });

        // Smooth scroll
        window.addEventListener('scroll', function () {
            ScrollHandler.triggerSmooth();
        });

        // Debounce scroll
        window.addEventListener('scroll', function () {
            if (isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);
            ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);
        });
    },

    // Trigger on start up
    triggerOnInit: function triggerOnInit() {
        ScrollHandler.triggerElementInViewportAnimation();
    },

    // Trigger scroll functions with throttle (preferred)
    triggerThrottle: function triggerThrottle() {
        // console.log('Throttled scroll');
        ScrollHandler.triggerElementInViewportAnimation();
    },

    // Trigger scroll on debounce
    triggerDebounce: function triggerDebounce() {
        // console.log('Debounce scroll');
    },

    // Trigger scroll on the flight
    triggerSmooth: function triggerSmooth() {
        // console.log('Smooth scroll');
        ScrollHandler.detectScrollDirection();
        ScrollHandler.toggleStickyNavigation();
    },

    // Detect if part of a given element is visible in the viewport
    // El must be a node element
    detectIfElementIsPartlyInViewport: function detectIfElementIsPartlyInViewport(el) {
        if (isset(el)) {

            var rect = el.getBoundingClientRect();
            // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }
            var windowHeight = window.innerHeight || document.documentElement.clientHeight;
            var windowWidth = window.innerWidth || document.documentElement.clientWidth;

            var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
            var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= 0;

            return verticalInView && horizontalInView;
        }
    },

    // Detect if a given element is fully visible in the viewport
    // El must be a node element
    detectIfElementIsFullyInViewport: function detectIfElementIsFullyInViewport(el) {
        if (isset(el)) {
            var rect = el.getBoundingClientRect();

            return rect.top >= 0 && rect.bottom <= window.innerHeight;
        }
    },

    detectScrollDirection: function detectScrollDirection() {
        var scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"
        if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition) {
            ScrollHandler.scrollDirectionDown = true;
            ScrollHandler.scrollDirectionUp = false;
        } else {
            ScrollHandler.scrollDirectionDown = false;
            ScrollHandler.scrollDirectionUp = true;
        }
        ScrollHandler.lastScrollTopPosition = scrollTopPosition;
    },

    // Trigger animation on elements that have 'element-in-viewport' and that are in the viewport
    // These animation can only be triggered once, if you want more then that you should write an specific function for this
    triggerElementInViewportAnimation: function triggerElementInViewportAnimation() {
        var elements = document.querySelectorAll('.element-in-viewport');
        var elementsLength = elements.length;

        for (var e = 0; e < elementsLength; e++) {

            var element = elements[e];
            if (ScrollHandler.detectIfElementIsPartlyInViewport(element)) {
                element.classList.remove('element-in-viewport');
            }
        }
    },

    // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------

    // Hide or show sticky navigation when header isn't visible
    toggleStickyNavigation: function toggleStickyNavigation() {

        var mobileNavigation = document.getElementById('mobile-navigation');
        if (isset(mobileNavigation)) {

            // Hide mobile navigation when scrolling down
            if (ScrollHandler.scrollDirectionDown && ScrollHandler.lastScrollTopPosition >= 100) {
                mobileNavigation.classList.add('hide-bar');
            } else {
                mobileNavigation.classList.remove('hide-bar');
            }
        }
    }

};

ScrollHandler.init();
/* ==========================================================================
    Scroll To Click handler
 ========================================================================== */

var ScrollToHandler = {

    // Animation settings
    offset: 60, //pixel
    duration: 1400, //ms

    // Animation variables
    body: null,
    start: 0,
    change: 0,
    currentTime: 0,
    allowAnimation: false,
    scrollToAnimation: null,

    // Watch the EasingFunction helper for the available methods
    easing: 'easeInOutQuad',

    init: function init() {

        var anchorLinks = document.querySelectorAll('.scroll-to-target');
        var anchorLinksAmount = anchorLinks.length;

        for (var i = 0; i < anchorLinksAmount; i++) {

            var anchorLink = anchorLinks[i];

            anchorLink.addEventListener('click', function (event) {
                ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
                event.preventDefault();
            });
        }
    },

    /**
     * Prepare the Handler for the animation
     */
    prepareScrollTo: function prepareScrollTo(elementId) {

        // Get the scroll to element
        elementId = elementId.substr(elementId.indexOf('#') + 1);
        var scrollToElement = document.getElementById(elementId);
        var scrollToElementPosition = scrollToElement.getBoundingClientRect();

        // Reset or define the Handler variables
        ScrollToHandler.body = document.documentElement;
        ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop
        ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
        ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
        ScrollToHandler.allowAnimation = true;

        // Trigger animation
        scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);

        // Stop on scroll
        window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
        window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
        window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
        window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
        window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
        window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
    },

    /*
     * Animate the scroll position
     */
    animateScroll: function animateScroll(timestamp) {

        // Calculate progress from 0 - 1
        var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
        if (progress < 0) progress = 0;

        // Convert progress with easing function
        progress = EasingFunctions[ScrollToHandler.easing](progress);

        var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;

        ScrollToHandler.body.scrollTop = newScrollTop;
        if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop

        if (progress < 1 && ScrollToHandler.allowAnimation) {
            scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
        }
    },

    /*
     * Abort the scroll animation
     */
    abortScrollAnimation: function abortScrollAnimation(event) {
        ScrollToHandler.allowAnimation = false;
        cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
    }

};

ScrollToHandler.init();

var searchHandler = function () {
    function searchHandler(searchUrl) {
        _classCallCheck(this, searchHandler);

        console.debug('searchHandler initialized with searchUrl: ' + searchUrl);
        this.searchUrl = searchUrl;
    }

    _createClass(searchHandler, [{
        key: 'search',
        value: function search(term) {
            var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
            var amount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;

            if (term === "") return;

            self = this;

            $.ajax({
                type: "GET",
                url: this.searchUrl,
                data: {
                    page: page,
                    amount: amount,
                    term: term
                },
                success: function success(response) {
                    self.processSearchResponse(response);
                },
                error: function error() {
                    console.log("An error occured while searching");
                },
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                dataType: 'json'
            });
        }
    }, {
        key: 'processSearchResponse',
        value: function processSearchResponse(response) {
            if (!searchHandler.validateSearchResponse(response)) return;
            console.log(response);
        }
    }], [{
        key: 'validateSearchResponse',
        value: function validateSearchResponse(response) {
            if (response.hasOwnProperty('data') && response.hasOwnProperty('meta')) return true;

            console.error('Search response was not valid');
            console.log(response);
            return false;
        }
    }]);

    return searchHandler;
}();
/**
 * Created by Pascal on 06/12/17.
 */

/* Example

const headerImageSliderSetting = new SliderSetting({
    sliderId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    captions: '#header-image-slider .slider-navigation-labels .caption p',
    autoSlider: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new Slider(headerImageSliderSetting).init();

 */

var imageSliders = [];

var imageSliderContainers = document.querySelectorAll('.image-slider');
var imageSliderContainersLength = imageSliderContainers.length;

for (var i = 0; i < imageSliderContainersLength; i++) {

    var imageSlider = imageSliderContainers[i];
    var imageSliderId = imageSlider.getAttribute('id');

    if (imageSliderId !== null) {

        var imageSliderSetting = new SliderSetting({
            sliderId: imageSliderId,
            slideQuery: '#' + imageSliderId + ' .placeholder figure',
            navigationButtons: '#' + imageSliderId + ' .placeholder .controllers .nav-item',
            autoSlider: true,
            sliderInterval: 4000
        });

        imageSliders.push(new Slider(imageSliderSetting.prepareParameters()).init());
    } else console.log('An image slider has no id...');
}

function SliderSetting(settingsObject) {

    var self = this;

    this.sliderId = '';
    this.definedPreviousNext = true;
    this.autoSlider = false;
    this.sliderInterval = 4000;
    this.navigationButtons = '';
    this.dots = '';
    this.captions = '';
    this.slideQuery = '';

    this.setSliderId = function (string) {
        this.sliderId = string;
        return this;
    };
    this.setDefinedPreviousNext = function (boolean) {
        this.definedPreviousNext = boolean;
        return this;
    };
    this.setAutoSlider = function (boolean) {
        this.autoSlider = boolean;
        return this;
    };
    this.setSliderInterval = function (integer) {
        this.sliderInterval = integer;
        return this;
    };
    this.setSlideQuery = function (string) {
        this.slideQuery = string;
        return this;
    };
    this.setNavigationButtons = function (string) {
        this.navigationButtons = string;
        return this;
    };
    this.setDots = function (string) {
        this.dots = string;
        return this;
    };
    this.setCaptions = function (string) {
        this.captions = string;
        return this;
    };
    this.getSliderId = function () {
        return this.sliderId;
    };
    this.getDefinedPreviousNext = function () {
        return this.definedPreviousNext;
    };
    this.getAutoSlider = function () {
        return this.autoSlider;
    };
    this.getSliderInterval = function () {
        return this.sliderInterval;
    };
    this.getSlideQuery = function () {
        return this.slideQuery;
    };
    this.getNavigationButtons = function () {
        return this.navigationButtons;
    };
    this.getDots = function () {
        return this.dots;
    };
    this.getCaptions = function () {
        return this.captions;
    };

    // Invert setters to getters
    this.prepareParameters = function () {

        return {
            sliderId: self.getSliderId(),
            definedPreviousNext: self.getDefinedPreviousNext(),
            autoSlider: self.getAutoSlider(),
            sliderInterval: self.getSliderInterval(),
            navigationButtons: self.getNavigationButtons(),
            dots: self.getDots(),
            captions: self.getCaptions(),
            slideQuery: self.getSlideQuery()
        };
    };

    // Mass assign settings
    this.fill = function () {
        // Object.keys(settingsObject).forEach(function (key) {
        //     self[key] = settingsObject[key];
        // });

        var settingsObjectKeys = Object.keys(settingsObject);
        var settingsObjectLength = settingsObjectKeys.length;

        for (var _i2 = 0; _i2 < settingsObjectLength; _i2++) {
            var key = settingsObjectKeys[_i2];
            self[key] = settingsObject[key];
        }
    };

    this.fill();

    return {
        sliderId: self.setSliderId,
        definedPreviousNext: self.setDefinedPreviousNext,
        autoSlider: self.setAutoSlider,
        sliderInterval: self.setSliderInterval,
        navigationButtons: self.setNavigationButtons,
        dots: self.setDots,
        captions: self.setCaptions,
        slideQuery: self.setSlideQuery,
        prepareParameters: self.prepareParameters
    };
}

function Slider(settings) {

    //Define Slider object
    var self = this;
    this.sliderObject = '';

    //SlideParameters
    this.activeSlideId = 0;
    this.previousSlideId = 0;
    this.nextSlideId = 0;
    this.availableSlides = 1;
    this.slides = [];
    this.autoSliderInterval = null;

    this.settings = {};

    this.init = function () {

        //Append settings to self
        this.settings = settings;

        //Assign needed elements and calculations
        this.sliderObject = document.getElementById(this.settings.sliderId);
        this.slides = document.querySelectorAll(this.settings.slideQuery);
        this.availableSlides = this.slides.length;
        this.activeSlideId = 0;

        //Define previous and next if we want to use those
        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();

        // Set active slide (and possible previous and next classes)
        this.setSlide();

        // Swipe interaction
        var swipeGestures = new Hammer(this.sliderObject);
        swipeGestures.on('swipeleft', function () {
            self.resetAutoSlider();
            self.nextSlide();
            self.setSlide();
        });
        swipeGestures.on('swiperight', function () {
            self.resetAutoSlider();
            self.previousSlide();
            self.setSlide();
        });

        if (this.settings.navigationButtons !== '') {

            // Click interaction
            var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
            var navigationButtonsLength = navigationButtons.length;
            for (var _i3 = 0; _i3 < navigationButtonsLength; _i3++) {
                var navigationButton = navigationButtons[_i3];
                navigationButton.addEventListener('click', function () {
                    self.clickNavigationButton(this);
                });
            }
        }

        if (this.settings.dots !== '') {
            // Click interaction
            var dots = document.querySelectorAll(this.settings.dots);
            var dotsLength = dots.length;
            // console.log(this.settings.dots);
            // console.log(dots);
            for (var _i4 = 0; _i4 < dotsLength; _i4++) {
                var dot = dots[_i4];
                // console.log('hier');
                dot.addEventListener('click', function () {
                    self.clickDot(this);
                });
            }
        }

        self.autoSlider();
    };

    this.autoSlider = function () {

        if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);

        if (this.settings.autoSlider && Number.isInteger(this.settings.sliderInterval)) {

            this.autoSliderInterval = setInterval(function () {
                self.nextSlide();
                self.setSlide();
            }, this.settings.sliderInterval);
        }
    };

    this.resetAutoSlider = self.autoSlider;

    this.nextSlide = function () {
        this.activeSlideId++;
        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;

        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
    };

    this.previousSlide = function () {
        this.activeSlideId--;
        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;

        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
    };

    this.setPreviousAndNextSlide = function () {
        this.nextSlideId = this.activeSlideId + 1;
        if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;

        this.previousSlideId = this.activeSlideId - 1;
        if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
    };

    this.setSlide = function () {

        // Loop through the form elements
        var slidesLength = self.slides.length;
        for (var _i5 = 0; _i5 < slidesLength; _i5++) {
            var slide = self.slides[_i5];

            // Convert data set attribute to desired type
            var slideOrder = parseInt(slide.getAttribute('data-order'));

            // Remove and set active for all slides
            if (slideOrder !== self.activeSlideId) slide.classList.remove('active');else slide.classList.add('active');

            // If we use the previous and next, also set those classes
            if (self.settings.definedPreviousNext) {

                if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');

                if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
            }
        }

        if (self.settings.dots !== '') {
            self.setActiveDot();
        }
        if (self.settings.captions !== '') {
            self.setActiveCaption();
        }
    };

    this.clickNavigationButton = function (navButton) {
        self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
        if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();
        self.setSlide();

        var next = document.querySelector(self.settings.navigationButtons + '.next');
        var previous = document.querySelector(self.settings.navigationButtons + '.previous');

        next.setAttribute('data-order', self.nextSlideId);
        previous.setAttribute('data-order', self.previousSlideId);

        self.resetAutoSlider();

        // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;
        // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;
    };

    this.clickDot = function (clickedDot) {
        self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
        self.setSlide();
        self.resetAutoSlider();
    };

    this.setActiveDot = function () {

        var dots = document.querySelectorAll(this.settings.dots);
        var dotsLength = dots.length;
        for (var _i6 = 0; _i6 < dotsLength; _i6++) {
            var dot = dots[_i6];
            dotOrder = parseInt(dot.getAttribute('data-order'));

            if (dotOrder !== self.activeSlideId) dot.classList.remove('active');else dot.classList.add('active');
        }
    };

    this.setActiveCaption = function () {

        var captions = document.querySelectorAll(this.settings.captions);
        var captionsLength = captions.length;
        for (var _i7 = 0; _i7 < captionsLength; _i7++) {
            var caption = captions[_i7];
            captionOrder = parseInt(caption.getAttribute('data-order'));

            if (captionOrder !== self.activeSlideId) caption.classList.remove('active');else caption.classList.add('active');
        }
    };
}
/* ==========================================================================
    Steps Sliders Handler
 ========================================================================== */

var stepsSliders = [];

var stepsSliderContainers = document.querySelectorAll('.steps-slider');
var stepsSliderContainersLength = stepsSliderContainers.length;

for (var _i8 = 0; _i8 < stepsSliderContainersLength; _i8++) {

    var stepsSlider = stepsSliderContainers[_i8];
    var stepsSliderId = stepsSlider.getAttribute('id');

    if (stepsSliderId !== null) {

        var stepsSliderSetting = {
            sliderId: stepsSliderId,
            navItemsQuery: '#' + stepsSliderId + ' .slider-nav .slide-nav-item',
            slidesQuery: '#' + stepsSliderId + ' .slides .slide',
            previousButton: '#' + stepsSliderId + ' .slides .navigation-buttons .previous',
            nextButton: '#' + stepsSliderId + ' .slides .navigation-buttons .next'
        };

        stepsSliders.push(new StepsSlider(stepsSliderSetting).init());
    } else console.log('A steps slider has no id...');
}

function StepsSlider(settings) {

    var self = this;
    this.slider = null;
    this.navItems = [];
    this.activeSlideId = 0;
    this.slides = [];
    this.autoSliderInterval = null;
    this.autoSliderIntervalDuration = 4000;

    this.nextButton = null;
    this.previousButton = null;

    this.init = function () {

        //Assign needed elements and calculations
        this.slider = document.querySelectorAll(settings.sliderId);
        this.slides = document.querySelectorAll(settings.slidesQuery);
        this.nextButton = document.querySelector(settings.nextButton);
        this.previousButton = document.querySelector(settings.previousButton);
        this.navItems = document.querySelectorAll(settings.navItemsQuery);
        this.activeSlideId = 0;

        // Set active slide (and possible previous and next classes)
        this.setSlide();

        var navItemsLength = self.navItems.length;
        for (var _i9 = 0; _i9 < navItemsLength; _i9++) {
            var navItem = self.navItems[_i9];
            navItem.addEventListener('click', function () {
                self.clickNavigationButton(this);
            });
        }

        if (isset(self.nextButton)) {
            self.nextButton.addEventListener('click', function () {
                self.nextSlide();
                if (self.autoSliderInterval !== null) clearInterval(self.autoSliderInterval);
            });
        }
        if (isset(self.previousButton)) {
            self.previousButton.addEventListener('click', function () {
                self.previousSlide();
                if (self.autoSliderInterval !== null) clearInterval(self.autoSliderInterval);
            });
        }

        this.autoSlider();
    };

    this.setSlide = function () {

        // Loop through the form elements
        var slidesLength = self.slides.length;

        for (var _i10 = 0; _i10 < slidesLength; _i10++) {
            var slide = self.slides[_i10];

            // Convert dataset attribute to desired type
            var slideOrder = parseInt(slide.dataset.order);

            // Remove and set active for all slides
            if (slideOrder !== self.activeSlideId) slide.classList.remove('active');else slide.classList.add('active');
        }

        // Loop through the form elements
        var navItemsLength = self.navItems.length;
        for (var _i11 = 0; _i11 < navItemsLength; _i11++) {
            var navItem = self.navItems[_i11];

            // Convert dataset attribute to desired type
            var navItemOrder = parseInt(navItem.dataset.order);

            // Remove and set active for all slides
            if (navItemOrder !== self.activeSlideId) navItem.classList.remove('active');else navItem.classList.add('active');
        }
    };

    this.autoSlider = function () {

        if (self.autoSliderInterval !== null) clearInterval(self.autoSliderInterval);

        self.autoSliderInterval = setInterval(function () {
            self.nextSlide();
            self.setSlide();
        }, self.autoSliderIntervalDuration);
    };

    this.resetAutoSlider = self.autoSlider;

    this.clickNavigationButton = function (navItem) {
        self.activeSlideId = parseInt(navItem.dataset.order);
        if (self.autoSliderInterval !== null) clearInterval(self.autoSliderInterval);
        self.setSlide();
    };

    this.nextSlide = function () {
        self.activeSlideId++;
        if (self.activeSlideId >= self.slides.length) self.activeSlideId = 0;

        self.setSlide();
    };

    this.previousSlide = function () {
        self.activeSlideId--;
        if (self.activeSlideId < 0) self.activeSlideId = self.slides.length - 1;

        self.setSlide();
    };
}
/* ==========================================================================
    Youtube handler
 ========================================================================== */

var YoutubeHandler = {

    youtubeClass: '.youtube-player',
    players: [],

    init: function init() {
        // Get the youtube players containers
        var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
        var youtubePlayersAmount = youtubePlayers.length;

        for (var _i12 = 0; _i12 < youtubePlayersAmount; _i12++) {

            var youtubePlayer = youtubePlayers[_i12];

            var youtubePlayerId = youtubePlayer.getAttribute('id');
            if (youtubePlayerId !== null) {
                // Strip the necessary data from the html and create objects from it
                var youtubeElement = {
                    id: youtubePlayer.getAttribute('id'),
                    link: youtubePlayer.getAttribute('data-youtube-link'),
                    autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
                };

                YoutubeHandler.players.push(youtubeElement);
            } else {
                console.log("Element not include because there isn't a id on the player");
                console.log(youtubePlayer);
            }
        }

        if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
    },

    /**
     * Check if external script is loaded
     * 
     */
    initYoutube: function initYoutube() {
        // See if YT variable exists
        if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
            // Setup API ready function
            window.onYouTubePlayerAPIReady = function () {
                YoutubeHandler.loadPlayers();
            };
            // Load external script
            getScript('https://www.youtube.com/iframe_api');
            // If YT already exists load player
        } else {
            YoutubeHandler.loadPlayers();
        }
    },

    /**
     * Create the Youtube player(s) with parameters
     * And rewrite the players to key them by the element id
     *
     */
    loadPlayers: function loadPlayers() {

        var players = [];

        var youtubePlayersAmount = YoutubeHandler.players.length;
        for (var _i13 = 0; _i13 < youtubePlayersAmount; _i13++) {

            var youtubePlayer = YoutubeHandler.players[_i13];

            // Load player
            youtubePlayer.player = new YT.Player(youtubePlayer.id, {
                height: 200,
                width: 200,
                videoId: youtubePlayer.link,
                host: 'https://www.youtube-nocookie.com',
                playerVars: {
                    modestbranding: 0,
                    showinfo: 0,
                    rel: 0,
                    disablekb: 1,
                    autoplay: youtubePlayer.autoPlay
                },
                events: {
                    // 'onReady': YoutubeHandler.onReady,
                    'onStateChange': YoutubeHandler.onStateChange
                }
            });

            players[youtubePlayer.id] = youtubePlayer;
        }

        YoutubeHandler.players = players;
    },

    /**
     * When player is ready to play
     */
    onReady: function onReady(event) {

        var playerContainerId = event.target.getIframe().getAttribute('id');
        var player = YoutubeHandler.players[playerContainerId].player;

        // Show video
        // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);

        // If not on tablet or mobile, play on high quality
        // player.mute();
        // player.playVideo();
        // player.setPlaybackQuality('hd1080');
    },

    /**
     * Listener for Youtube state change
     */
    onStateChange: function onStateChange(event) {

        var playerContainerId = event.target.getIframe().getAttribute('id');
        var player = YoutubeHandler.players[playerContainerId].player;

        var videoState = event.data;

        // Loop video
        if (event.data === YT.PlayerState.ENDED) {
            player.playVideo();
        }
    }
};

YoutubeHandler.init();