/////////////////////
// Utilities
/////////////////////

function getDeepHeight ($el) {
	var height = $el.height();
	if (height > 0) {
		return height;
	} else if ($el.children().length == 0) {
		return 0;
	} else {
		height = $el.children().toArray().map(function (el) {
			return el.offsetHeight;
		}).reduce(function (acc, cur) {
			return acc+cur;
		});

		if (height > 0) {
			return height;
		} else {
			for (var i = 0; i < $el.children().length; i++) {
				height = getDeepHeight($el.children().eq(i));
				if (height > 0) {
					break;
				}
			}
		}
		return height;
	}
}

// will return false if display: none or visibility: hidden
// opacity: 0 will return true
let isVisible = function (el) {
	return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
}

let getHeightSum = function (elements) {
	let sum = 0;
	elements.forEach((el) => {
			const rect = el.getBoundingClientRect();
			sum += rect.height;
	})
	return sum;
}

function getLargestDistanceFromTopOfWindow(elements) {
	let distance = 0;
	elements.forEach((el) => {
		distance = Math.max(distance, el.getBoundingClientRect().bottom);
	});
	return distance;
}

let isImportantStickElement = function (el, top_threshold, exclude_elements) {
	const position = getComputedStyle(el, null).getPropertyValue("position");
	return (
		(position === "fixed" || position === "sticky")
		&& (isVisible(el))
		&& (el.getBoundingClientRect().top < top_threshold)
		&& (!exclude_elements.includes(el))
	);
}

let setFadeChildrenTransistionDelay = function (el) {
	const children = [...el.children];
	let delay = 150;
	if (el.classList.contains('delay')) {
		delay = 300;
	} else if (el.classList.contains('delay-xl')) {
		delay = 600;
	}
	children.forEach((child, index) => {
		child.style.transitionDelay = (delay * index) + 'ms';
	});
}

let initializeScrollMotion = function () {
	const scrollMotionElements = [...document.querySelectorAll('.logosbase .scroll-motion')];
	scrollMotionElements.forEach((el) => {
		new ScrollMotion(el);
	});
}

class ScrollMotion {
	constructor(el) {
		this.el = el;
		this.scrollHandler = () => {
			this.position = this.el.getBoundingClientRect().top - (window.innerHeight * 0.9);
			if (isVisible(this.el) && this.position <= 0) {
				if (this.el.classList.contains('fade-children')) {
					setFadeChildrenTransistionDelay(this.el);
				}
				this.el.classList.add('active');
				this.destroy();
			}
		}
		this.scrollHandler();
		document.addEventListener('scroll', this.scrollHandler);
	}

	destroy() {
		document.removeEventListener('scroll',this.scrollHandler);
	}
}

let initializeLoadMotion = function () {
	const loadMotionElements = [...document.querySelectorAll('.logosbase .load-motion')];
	loadMotionElements.forEach((el) => {
		if (el.classList.contains('fade-children')) {
			setFadeChildrenTransistionDelay(el);
		}
		el.classList.add('active');
	});
}

/////////////////////
// HTML
/////////////////////

var ExpandCollapse = function (expandTxt, collapseTxt, groupId, className) {
	if (!className) {
		className = 'btn btn--secondary-outline';
	}
	var html = '';
	html+='<div class="expand-collapse" style="text-align: center; overflow: hidden; width: 100%; margin-bottom: 48px; padding: 0 15px;">';
		html+='<a href="#" class="expand-collapse__btn js-expand-collapse '+className+'" data-expand-text="'+expandTxt+'" data-collapse-text="'+collapseTxt+'" data-expand-collapse-group="'+groupId+'">'+expandTxt+'</a>';
	html+='</div>';
	return html;
};

var CurrentNavItem = function (name) {
	return '<div class="secondary-nav__current">'+name+'</div>';
}

var DropDownToggle = function () {
	return '<a href="#" class="secondary-nav__dropdown-toggle"><svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Artboard" stroke="#005EC3"><polyline id="Path-2" transform="translate(8.000000, 8.500000) scale(1, -1) translate(-8.000000, -8.500000) " points="3 11 8.00702192 6 13 10.9859758"></polyline></g></g></svg></a>';
};

var Popover = function (imageUrl) {
	var html = '';
	html+='<div class="logosbase">';
		html+='<div class="popover-image">';
			html+='<div class="container">';
				html+='<div class="popover-image__image">';
					html+='<a href="#" class="popover-image__close icon-btn icon-btn--close icon-btn--solid js-close-popover"></a>';
					html+='<img src="'+imageUrl+'">';
				html+='</div>';
			html+='</div>';
		html+='</div>';
	html+='</div>';
	return html;
};

/////////////////////
// Plugins
/////////////////////

var logosbase = {

	// Expand Collapse

	expandCollapse: {

		init: function (displayCount, expandTxt, collapseTxt, className, renderedGroups, selectedGroupIds) {
			this.$items = $('.js-can-expand-collapse');
			this.displayCount = (displayCount !== undefined) ? displayCount : 6;
			this.expandTxt = (expandTxt !== undefined) ? expandTxt : 'Show more';
			this.collapseTxt = (collapseTxt !== undefined) ? collapseTxt : 'Show less';
			this.renderedGroups = (renderedGroups !== undefined) ? renderedGroups : new Array();
			this.className = className;

			if (this.$items) {
				var groupIds = (selectedGroupIds !== undefined) ? selectedGroupIds : this.getGroupIds();
				for (var i=0; i < groupIds.length; i++) {
					var $groupItems = this.getGroup( groupIds[i] );
					this.renderGroup(groupIds[i], $groupItems);
				}
			}
		},

		renderGroup: function (groupId, $groupItems) {
			if ($groupItems.length > this.displayCount && this.renderedGroups.indexOf(groupId) === -1) {
				this.collapseGroup( groupId );
				$groupItems.last().after( ExpandCollapse(this.expandTxt, this.collapseTxt, groupId, this.className) );
				var $groupBtn = this.getGroupBtn( groupId );

				$groupBtn.data('isCollapsed', true);

				(function (groupId) {
					$groupBtn.on('click',( function (e) {
						e.preventDefault();
						if ($groupBtn.data('isCollapsed')) {
							this.expandGroup(groupId);
						} else {
							this.collapseGroup(groupId);
						}
					}.bind(this)));
				}.bind(this)(groupId));

				this.renderedGroups.push(groupId);
			}
		},

		getGroupIds: function () {
			var groupIds = [];
			this.$items.each(function (i) {
				var group = $(this).data('expand-collapse-group');
				if (groupIds.indexOf(group) === -1) {
					groupIds[group-1] = group;
				}
			});
			return groupIds;
		},
		getGroup: function (groupId) {
			return $('.js-can-expand-collapse[data-expand-collapse-group="'+groupId+'"]');
		},
		getCollapsedItems: function (groupId) {
			var $groupItems = this.getGroup( groupId );
			return $groupItems.eq(this.displayCount - 1).nextAll('.js-can-expand-collapse')
		},
		getGroupBtn: function (groupId) {
			return $('.js-expand-collapse[data-expand-collapse-group="'+groupId+'"]');
		},

		expandGroup: function (groupId) {
			var $groupItems = this.getGroup( groupId ),
				$groupBtn = this.getGroupBtn( groupId );
			this.collapseAllGroups();
			$groupItems.show();
			$groupBtn.text( $groupBtn.data('collapse-text') );
			$groupBtn.data('isCollapsed', false);
		},
		collapseGroup: function (groupId) {
			var $collapsedItems = this.getCollapsedItems( groupId ),
				$groupBtn = this.getGroupBtn( groupId );
			$collapsedItems.hide();
			$groupBtn.text( $groupBtn.data('expand-text') );
			$groupBtn.data('isCollapsed', true);
		},
		collapseAllGroups: function () {
			var groupIds = this.renderedGroups;
			for (var i=0; i < groupIds.length; i++) {
				this.collapseGroup(groupIds[i]);
			}
		}

	},

	// Popover

	popover: {
		init: function () {
			this.openHandlers();
			this.closeHandlers();
		},
		openHandlers: function () {
			$('.js-popover').on('click',(function (e) {
				e.preventDefault();
				$('body')
					.css('overflowY', 'hidden')
						.append( Popover( $(this).data('popover-image') ) );
			}));
		},
		closeHandlers: function () {
			$('.js-close-popover').on('click', function (e) {
				e.preventDefault();
				$('.popover-image').remove();
				$('body').css('overflowY', 'auto');
			});
			$(document).mouseup(function (e) {
			    var $popoverImage = $('.popover__image');
			    if ( !$popoverImage.is(e.target) && $popoverImage.has(e.target).length === 0 ) {
			        $('.popover-image').remove();
			        $('body').css('overflowY', 'auto');
			    }
			});
			$(document).on('keyup',(function (e) {
			     if (e.keyCode == 27) {
			        $('.popover-image').remove();
			        $('body').css('overflowY', 'auto');
			    }
			}));
		}
	},

	// Secondary Nav

	secondaryNav: {
		init: function ($menu) {
			if (typeof $menu != 'undefined') {
				this.$menu = $menu;
			} else {
				this.$menu = $('.secondary-nav').first();
			}
			this.$window = $(window);
			this.$body = $('body');
			this.$menuLinks = this.$menu.find('.secondary-nav__link[href^="#"]').not('.more-btn');
			this.$menuLinksInPage = this.$menuLinks.filter(function (i, $link) {
				if ($link.getAttribute('href') != "#") {
					return $($link.getAttribute('href'))[0];	
				}
			});
			this.$menuToggle = this.$menu.find('.secondary-nav__toggle');
			this.breakpoint = 600;
			this.isMobile = (this.$window.width() < this.breakpoint);
			this.isMobileNavInit = (this.isMobile);
			this.isDropdownInit = ((this.isMobile || Modernizr.touch) && ($('.secondary-nav__dropdown').length > 0));
			this.menuOffset = 0;
			this.sectionOffsets = new Array();
			this.menuHeight = this.isMobile ? 42 : this.$menu.height();
			this.winWidth = this.$window.width();
			this.initialMenuPosition = this.$menu.offset().top;
			this.isStickyOffsetSet = false;
			this.sheet = document.createElement('style');
			document.body.appendChild(this.sheet);

			if (logosbase.secondaryNav.$menu.hasClass("secondary-nav--unlimited")) {
				logosbase.secondaryNav.initSecondaryNavUnlimited();
			}
			this.initMenuOffset(function () {
				this.initSectionOffsets(function () {
					this.$window.bind('scroll', this.onScroll);
					this.$window.bind('resize', this.onResize);
					this.$menuLinks.bind('click', this.onLinkClick);

					if (this.isMobileNavInit) {
						this.initMobileNav();
					}

					if (this.isDropdownInit) {
						this.initDropdowns();
					}

					this.$window[0].scrollBy(0, -10);
				}.bind(this));
			}.bind(this));
			
		},
		reset: function (reinit = true) {
			if (typeof this.$menu != 'undefined') {
				this.$window.unbind('scroll');
				this.$window.unbind('resize');
				this.$menuLinks.unbind('click');
				if (this.isDropdownInit) {
					this.removeDropdowns();
				}
				if (this.isMobile) {
					this.removeMobileNav();
				}
				this.unstick();
				this.sectionOffsets = new Array();
				if (reinit) {
					this.init(this.$menu);
				}
			}
		},
		initMenuOffset: function (callback) {
			if (this.menuOffset == 0) {
				this.menuOffset = this.$menu.offset().top - logosbase.secondaryNav.getStickyOffset();
				setTimeout(function () {
					this.initMenuOffset(callback);
				}.bind(this), 200);
			} else {
				callback();
			}
		},
		initSectionOffsets: function (callback) {
			var offsets = this.sectionOffsets;
			var len = offsets.length;
			if (offsets.length >= 3 &&
				(JSON.stringify(offsets[len-1]) == JSON.stringify(offsets[len-2])) &&
				(JSON.stringify(offsets[len-1]) == JSON.stringify(offsets[len-3])) ) {
				this.sectionOffsets = offsets[len-1];
				callback();
			} else {
				offsets.push( $.map(this.$menuLinksInPage, function ($link) {
					if ($link.getAttribute('href') != '#') {
						return window.pageYOffset + $($link.getAttribute('href'))[0].getBoundingClientRect().top;
					}
				}) );
				setTimeout(function () {
					this.initSectionOffsets(callback);
				}.bind(this), 200);
			}
		},
		initDropdowns: function () {
			$('.secondary-nav__dropdown').each(function () {
				var $dropdownToggle = $(DropDownToggle());
				$(this).before($dropdownToggle);
				$dropdownToggle.bind('click', logosbase.secondaryNav.onDropdownToggleClick);
			})
		},
		removeDropdowns: function () {
			$('.secondary-nav__dropdown-toggle').each(function () {
				$('.secondary-nav__dropdown').attr('style', '');
				$(this).unbind('click');
				$(this).remove();
			})
		},
		initMobileNav: function () {
			$('.secondary-nav__toggle').bind('click', this.onNavToggleClick);
			if (logosbase.secondaryNav.$menuLinks.length > 0) {
				this.setCurrentItem(this.$menuLinks[0].textContent);
			}
		},
		removeMobileNav: function () {
			if (this.$menu.hasClass('secondary-nav--open')) {
				this.toggleNav();
			}
			$('.secondary-nav__toggle').unbind('click');
			$('.secondary-nav__current').remove();
		},
		onScroll: function () {
			var isMobile = logosbase.secondaryNav.isMobile;
			var $window = logosbase.secondaryNav.$window;
			var menuHeight = logosbase.secondaryNav.menuHeight;
			var ws = $window.scrollTop();

			if (isMobile && logosbase.secondaryNav.$menuLinks.length > 0) {
				const currentItem = logosbase.secondaryNav.getCurrentItem(ws);
				logosbase.secondaryNav.setCurrentItem(currentItem);
			}

			// Stick once when window is scrolled past initial position of the secondary nav
			if (ws > logosbase.secondaryNav.initialMenuPosition){
				logosbase.secondaryNav.setStickyOffset();
				logosbase.secondaryNav.stick();
			} else {
				logosbase.secondaryNav.unstick();
			}
		},
		onResize: function () {
			var $window = logosbase.secondaryNav.$window;
			var isMobile = logosbase.secondaryNav.isMobile;
			var breakpoint = logosbase.secondaryNav.breakpoint;
			if ($window.width() != logosbase.secondaryNav.winWidth) {
				clearTimeout(this.resizeTimer);
				this.resizeTimer = setTimeout(function() {
					var newIsMobile = (logosbase.secondaryNav.winWidth < breakpoint);

					if (newIsMobile != isMobile) {
						logosbase.secondaryNav.isMobile = newIsMobile;
					}
					logosbase.secondaryNav.reset();
					logosbase.secondaryNav.winWidth = $(window).width();
				}, 250);
			}

			if (logosbase.secondaryNav.$menu.hasClass("secondary-nav--unlimited")) {
				logosbase.secondaryNav.autoNavMore();
			}
		},
		onOrientationChange: function () {
			var $window = logosbase.secondaryNav.$window;
			var isMobile = logosbase.secondaryNav.isMobile;
			var breakpoint = logosbase.secondaryNav.breakpoint;
			var newIsMobile = ($window.width() < breakpoint);

			if (newIsMobile != isMobile) {
				logosbase.secondaryNav.isMobile = newIsMobile;
			}
			logosbase.secondaryNav.reset();
		},
		onNavToggleClick: function (e) {
			e.preventDefault();
			logosbase.secondaryNav.toggleNav();
		},
		onLinkClick: function (e) {
			if ($(e.target.hash)[0]) {
				var isMobileNavInit = logosbase.secondaryNav.isMobileNavInit;
				var isDropdownInit = logosbase.secondaryNav.isDropdownInit;
				e.preventDefault();
				e.target.blur();
				if (isMobileNavInit) {
					logosbase.secondaryNav.toggleNav(function () {
						logosbase.secondaryNav.scrollTo(e.target.hash, e.target.textContent);
					});
				} else {
					logosbase.secondaryNav.scrollTo(e.target.hash, e.target.textContent);
				}
				if (!isMobileNavInit && isDropdownInit) {
					var $dropdownToggle = $(e.target).closest('.secondary-nav__dropdown').siblings('.secondary-nav__dropdown-toggle');
					logosbase.secondaryNav.toggleDropdown($dropdownToggle);
				}
			} else if (e.target.getAttribute('href') === "#") {
				var isMobileNavInit = logosbase.secondaryNav.isMobileNavInit;
				var isDropdownInit = logosbase.secondaryNav.isDropdownInit;
				e.preventDefault();
				e.target.blur();
				if (isMobileNavInit) {
					logosbase.secondaryNav.toggleNav(function () {
						logosbase.secondaryNav.scrollTo("#", e.target.textContent);
					});
				} else {
					logosbase.secondaryNav.scrollTo("#", e.target.textContent);
				}
				if (!isMobileNavInit && isDropdownInit) {
					var $dropdownToggle = $(e.target).closest('.secondary-nav__dropdown').siblings('.secondary-nav__dropdown-toggle');
					logosbase.secondaryNav.toggleDropdown($dropdownToggle);
				}
			}
		},
		onDropdownToggleClick: function (e) {
			//If link is internal prevent default
			let anchorLink = e.target.getAttribute('href');

			//Added this condition to also catch the svg's and polylines used on the mobile version
			if (e.target.tagName === 'svg' || e.target.tagName === 'polyline') {
				e.preventDefault();
			} else if (anchorLink.startsWith('#')) {
				e.preventDefault();
			}

			logosbase.secondaryNav.toggleDropdown($(e.target));
		},
		stick: function () {
			this.$menu.addClass('secondary-nav--fixed');
			this.$body.css('marginTop', this.menuHeight+'px');

			if (this.$menu.hasClass('secondary-nav--open')) {
				this.$body[0].style.overflow = 'hidden';
			}
		},
		unstick: function () {
			this.$menu.removeClass('secondary-nav--fixed');
			this.$body.css('marginTop', 0);
		},
		toggleNav: function (callback) {
			var shouldOpen = !this.$menu.hasClass('secondary-nav--open');
			var isStuck = this.$menu.hasClass('secondary-nav--fixed');

			this.$menuToggle.toggleClass('secondary-nav__toggle--active');
			this.$menu.toggleClass('secondary-nav--open');

			if (isStuck) {
				if (shouldOpen) {
					this.$body[0].style.overflow = 'hidden';
				} else {
					this.$body[0].style.overflow = 'auto';
				}
			}

			setTimeout(callback, 400);
		},
		toggleDropdown: function ($dropdownToggle, callback) {
			if (!$dropdownToggle.hasClass('secondary-nav__dropdown-toggle')) {
				$dropdownToggle = $dropdownToggle.parents('.secondary-nav__dropdown-toggle');
			}
			var $dropdown = $dropdownToggle.closest('.secondary-nav__item').find('.secondary-nav__dropdown');
			$dropdown.slideToggle(400, function() {
			    if ($(this).is(':visible')) {
			    	$(this).css('display','block');
			    }
			});
			$dropdownToggle.toggleClass('secondary-nav__dropdown-toggle--flipped');
			setTimeout(callback, 400);
		},
		scrollTo: function (targetSelector, targetName) {
			var menuHeight = this.menuHeight;
			var stickyOffset = logosbase.secondaryNav.getStickyOffset();
			if (targetSelector === "#") {
				var $target = $('body');
			} else {
				var $target = $(targetSelector);
			}
			var targetOffset = $target.offset().top;

			$('html, body').animate({
				scrollTop: targetOffset - stickyOffset - menuHeight
			}, 1000, function () {
				if (this.isMobile) {
					setTimeout(function () {
						this.setCurrentItem(targetName);
					}.bind(this), 100);
				}
			}.bind(this));
		},
		setCurrentItem: function (name) {
			var $list = $('.secondary-nav__list');
			if ($('.secondary-nav__current').length) {
				$('.secondary-nav__current').text(name);
			} else {
				$list.before( $(CurrentNavItem(name)) );
			}
		},
		getCurrentItem: function (ws) {
			var $menuLinks = logosbase.secondaryNav.$menuLinks;
			var sectionOffsets = logosbase.secondaryNav.sectionOffsets;
			var sectionOffsets = logosbase.secondaryNav.sectionOffsets;
			var $menuLinks = logosbase.secondaryNav.$menuLinks;
			var currentItem = $menuLinks[0].textContent;
			for (var i = 0; i < sectionOffsets.length; i++) {
				if (ws > sectionOffsets[i] - this.menuHeight) {
					currentItem = $menuLinks[i].textContent;
				}
			}
			return(currentItem);
		},
		getStickyOffset: function () {
			let logosbase_elements = [...document.querySelectorAll(".logosbase *")];
			let fixed_elements = [...document.querySelectorAll("*")].filter(function (el) {
				return isImportantStickElement(el, 150, logosbase_elements);
			});
			return getLargestDistanceFromTopOfWindow(fixed_elements);
		},
		setStickyOffset: function () {
			this.sheet.innerHTML = `.logosbase .secondary-nav.secondary-nav--fixed, .logosbase_l8 .secondary-nav.secondary-nav--fixed, .logosbase_l9 .secondary-nav.secondary-nav--fixed { top: ${logosbase.secondaryNav.getStickyOffset()}px; }`;
			logosbase.secondaryNav.isStickyOffsetSet = true;
		},
		initSecondaryNavUnlimited: function () {
			this.$mainMenu = $("#mainMenu");
	        this.$autoNav = $("#autoNav");
	        this.$autoNavMore = $("#autoNavMore");
	        this.$autoNavMoreList = $("#autoNavMoreList");
	        this.$autoNavMore.bind('click', logosbase.secondaryNav.onDropdownToggleClick);
	        this.autoNavMore();
		},
		autoNavMore: function () {
        //calculate width of items in nav bar
	        if ($(window).width() <= 600) {
	            // move all items out of more dropdown
	            let $children = logosbase.secondaryNav.$mainMenu.find('.auto-nav-more .secondary-nav__item')
	            $children.insertBefore(logosbase.secondaryNav.$autoNavMore);
	            logosbase.secondaryNav.$autoNavMore.hide();
	        } else {
	            // if items in nav bar > window width, move  items to to more dropdown
	            const $menuWidth = logosbase.secondaryNav.$mainMenu.width();
	            let $autoNavWidth = logosbase.secondaryNav.$autoNav.width();
	            if ( $autoNavWidth > $menuWidth) {
	                while ($autoNavWidth > $menuWidth) {
	                    //move 1 item into more dropdown
	                    let $item_to_move = logosbase.secondaryNav.$mainMenu.find('.main-nav > .secondary-nav__item:not(.auto-nav-more)').last();
	                    $item_to_move.prependTo(logosbase.secondaryNav.$autoNavMoreList);
	                    logosbase.secondaryNav.$autoNavMore.show();
	                    $autoNavWidth = logosbase.secondaryNav.$autoNav.width();
	                }
	            } else {
	                let $last_more_item = logosbase.secondaryNav.$autoNavMoreList.find('.secondary-nav__item').first();
	                while ($last_more_item.width() + $autoNavWidth < $menuWidth) {
	                    // move as many children out of dropwdown as possible
	                    $last_more_item.insertBefore(logosbase.secondaryNav.$autoNavMore);
	                    $last_more_item = logosbase.secondaryNav.$autoNavMoreList.find('.secondary-nav__item').first();
	                    $autoNavWidth = logosbase.secondaryNav.$autoNav.width();
	                    // hide more if empty
	                    if (logosbase.secondaryNav.$autoNavMoreList.children().length == 0) {
	                        logosbase.secondaryNav.$autoNavMore.hide();
	                    }
	                }
	            }
	        }
    	}
	},
	// Set Equal Height

	setEqualHeight: {
		init: function ($elements, minWidth) {
			var minHeight = 0;
			if (minWidth !== undefined) {
				if ($(window).width() < minWidth) {
					return;
				}
			}
			$elements.each(function () {
				var outerHeight = $(this).outerHeight();
				minHeight = (outerHeight > minHeight) ? outerHeight : minHeight;
			});

			if (minHeight == 0) {
				setTimeout(function () {
					logosbase.setEqualHeight.init($elements, minWidth);
				}, 200);
			} else {
				$elements.each(function () {
					$(this).css('min-height', minHeight);
				});
			}
		}
	},

	// Video Background

	videoBg: {
		init: function ($els) {
			var ua = window.navigator.userAgent;
			var iOS = /iPad|iPhone|iPod/.test(ua);
			var Android = /Android/.test(ua);
			var isMinWidth = $(window).width() >= 769;

			if (!iOS && !Android && isMinWidth) {
				$els.each(function () {
					var $this = $(this);
					var $videoBg = $('<div class="video-bg"></div>');
					var bg = $this.attr('data-bg');
					var $video = $('<video loop="true" autoplay="true" muted="true"></video>');
					var sources = '';
					var mp4 = $this.attr('data-mp4');
					var ogg = $this.attr('data-ogg');
					var webm = $this.attr('data-webm');
					var mp4Html = mp4 ? '<source src="'+mp4+'" type="video/mp4">' : '';
					var oggHtml = ogg ? '<source src="'+ogg+'" type="video/ogg">' : '';
					var webmHtml = webm ? '<source src="'+webm+'" type="video/webm">' : '';

					if (mp4 || ogg || webm) {
						sources = mp4Html + oggHtml + webmHtml;
						$video.html(sources);
						$videoBg.html($video);
						$this.prepend($videoBg);
					}
				});
			}
		}
	}

};

function incrementQuantity(event) {
	const parentElement = event.target.parentElement;
	const quantityInput = parentElement.querySelector('input');
	const inputValue = parseInt(quantityInput.value);
	quantityInput.value = inputValue + 1;
	validateInputField(event, inputValue + 1);
}

function decrementQuantity(event) {
	const parentElement = event.target.parentElement;
	const quantityInput = parentElement.querySelector('input');
	const inputValue = parseInt(quantityInput.value);
	if(inputValue > 2 || inputValue < 2500) {
		quantityInput.value = inputValue - 1;
		validateInputField(event, inputValue - 1);
	}
}

function handleResourceButtonClick(event) {
	const sku = event.target.dataset['sku'];
	const quantity = event.target.parentElement.querySelector('.quantity-controller input').value;
	const newUrl = `/buy/${sku}?quantity=${quantity}`;
	updateModalButtonURL(newUrl);
	openModal(newUrl);
}

function validateInputField(event, quantity = null) {
	if (!quantity) {
		quantity = parseInt(event.target.parentElement.querySelector('.quantity-controller input').value);
	}
	const resourceButton = event.target.parentElement.parentElement.querySelector('button.btn');
	if (Number.isInteger(quantity) && quantity >= 2 && quantity <=2500) {
		resourceButton.disabled = false;
	} else {
		resourceButton.disabled = true;
	}
}

function initQuantityControllerButtons() {
	incrementButtons = document.querySelectorAll('.quantity-controller__plus');
	decrementButtons = document.querySelectorAll('.quantity-controller__minus');
	resourceButtons = document.querySelectorAll('.resource .quantity-controller__btn');
	inputFields = document.querySelectorAll('.quantity-controller input');
	
	incrementButtons.forEach(button => button.addEventListener('click', incrementQuantity));
	decrementButtons.forEach(button => button.addEventListener('click', decrementQuantity));
	resourceButtons.forEach(button => button.addEventListener('click', handleResourceButtonClick));
	inputFields.forEach(input => input.addEventListener('input', validateInputField));
}

function initGroupLicenseHoverEvents() {
	const tooltips = [...document.querySelectorAll('.logosbase_l9 .quantity-controller__tooltipBox')];
	tooltips.forEach((tooltip) => {
		tooltip.addEventListener('mouseenter', () => {
			tooltip.querySelector('.quantity-controller__tooltip').setAttribute('aria-hidden',false);
		});
		tooltip.addEventListener('mouseleave', () => {
			tooltip.querySelector('.quantity-controller__tooltip').setAttribute('aria-hidden',true);
		});
	});
}

function initCountdownTimers() {
	const timers = [...document.querySelectorAll('.logosbase .countdown-timer')];
	timers.forEach((timer) => {
		new CountdownTimer(timer);
	});
}
class CountdownTimer {
	constructor(timer_element) {
		this.timer_element = timer_element;
		this.deadline = this.timer_element.getAttribute('data-countdown-timer-deadline');
		this.display_day = this.timer_element.querySelector('.countdown-timer__days');
		this.display_hour = this.timer_element.querySelector('.countdown-timer__hours');
		this.display_minute = this.timer_element.querySelector('.countdown-timer__minutes');
		this.display_second = this.timer_element.querySelector('.countdown-timer__seconds');

		this.intervalFunc = () => {
			this.updateCountdownTimer();
		};

		this.intervalFunc();
		this.time_interval = setInterval(this.intervalFunc,1000);
	}
	
	getCountdownTimeRemaining() {
		const total = Date.parse(this.deadline) - Date.parse(new Date());
		const seconds = Math.floor( (total/1000) % 60 );
		const minutes = Math.floor( (total/1000/60) % 60 );
		const hours = Math.floor( (total/(1000*60*60)) % 24 );
		const days = Math.floor( total/(1000*60*60*24) );
	
		return {
			'total': total,
			'days': days,
			'hours': hours,
			'minutes': minutes,
			'seconds': seconds
		};
	}

	updateCountdownTimer() {
		const time_remaining = this.getCountdownTimeRemaining();
		if (
			time_remaining.total <= 0
			&& typeof this.time_interval != 'undefined'
		) {
			clearInterval(this.time_interval);
		}
		if (this.display_day !== null) {
			this.display_day.innerHTML = ('' + Math.max(0, time_remaining.days)).padStart(2,'0');
		}
		if (this.display_hour !== null) {
			this.display_hour.innerHTML = ('0' + Math.max(0, time_remaining.hours)).slice(-2);
		}
		if (this.display_minute !== null) {
			this.display_minute.innerHTML = ('0' + Math.max(0, time_remaining.minutes)).slice(-2);
		}
		if (this.display_second !== null) {
			this.display_second.innerHTML = ('0' + Math.max(0, time_remaining.seconds)).slice(-2);
		}
	}
};

document.addEventListener('DOMContentLoaded', () => {
	initializeLoadMotion();
	initializeScrollMotion();
	initQuantityControllerButtons();
	initGroupLicenseHoverEvents();
	initCountdownTimers();
});
