PageSourceSearch

https://www.fritid-samfund.dk/js/functions.js

js fritid-samfund.dk collected 2026-10-08 08:34:10 UTC 76,545 bytes, 2,282 lines download raw bytes

1/*! jRespond.js v 0.10 | Author: Jeremy Fields [[email protected]], 2013 | License: MIT */
2!function(a,b,c){"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=c:(a[b]=c,"function"==typeof define&&define.amd&&define(b,[],function(){return c}))}(this,"jRespond",function(a,b,c){"use strict";return function(a){var b=[],d=[],e=a,f="",g="",i=0,j=100,k=500,l=k,m=function(){var a=0;return a="number"!=typeof window.innerWidth?0!==document.documentElement.clientWidth?document.documentElement.clientWidth:document.body.clientWidth:window.innerWidth},n=function(a){if(a.length===c)o(a);else for(var b=0;b<a.length;b++)o(a[b])},o=function(a){var e=a.breakpoint,h=a.enter||c;b.push(a),d.push(!1),r(e)&&(h!==c&&h.call(null,{entering:f,exiting:g}),d[b.length-1]=!0)},p=function(){for(var a=[],e=[],h=0;h<b.length;h++){var i=b[h].breakpoint,j=b[h].enter||c,k=b[h].exit||c;"*"===i?(j!==c&&a.push(j),k!==c&&e.push(k)):r(i)?(j===c||d[h]||a.push(j),d[h]=!0):(k!==c&&d[h]&&e.push(k),d[h]=!1)}for(var l={entering:f,exiting:g},m=0;m<e.length;m++)e[m].call(null,l);for(var n=0;n<a.length;n++)a[n].call(null,l)},q=function(a){for(var b=!1,c=0;c<e.length;c++)if(a>=e[c].enter&&a<=e[c].exit){b=!0;break}b&&f!==e[c].label?(g=f,f=e[c].label,p()):b||""===f||(f="",p())},r=function(a){if("object"==typeof a){if(a.join().indexOf(f)>=0)return!0}else{if("*"===a)return!0;if("string"==typeof a&&f===a)return!0}},s=function(){var a=m();a!==i?(l=j,q(a)):l=k,i=a,setTimeout(s,l)};return s(),{addFunc:function(a){n(a)},getBreakpoint:function(){return f}}}}(this,this.document));
3
4var $ = jQuery.noConflict();
5
6// Scrolled
7$.fn.scrollEnd = function(callback, timeout) {
8	$(this).scroll(function(){
9		let container = $(this);
10		if (container.data('scrollTimeout')) {
11			clearTimeout(container.data('scrollTimeout'));
12		}
13		container.data('scrollTimeout', setTimeout(callback,timeout));
14	});
15};
16
17(function() {
18	let lastTime = 0;
19	let vendors = ['ms', 'moz', 'webkit', 'o'];
20	for(let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
21		window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
22		window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
23									|| window[vendors[x]+'CancelRequestAnimationFrame'];
24	}
25
26	if (!window.requestAnimationFrame)
27		window.requestAnimationFrame = function(callback, element) {
28			let currTime = new Date().getTime();
29			let timeToCall = Math.max(0, 16 - (currTime - lastTime));
30			let id = window.setTimeout(function() { callback(currTime + timeToCall); },
31			  timeToCall);
32			lastTime = currTime + timeToCall;
33			return id;
34		};
35
36	if (!window.cancelAnimationFrame)
37		window.cancelAnimationFrame = function(id) {
38			clearTimeout(id);
39		};
40}());
41
42
43
44function debounce(func, wait, immediate) {
45	let timeout, args, context, timestamp, result;
46	return function() {
47		context = this;
48		args = arguments;
49		timestamp = new Date();
50		let later = function() {
51			let last = (new Date()) - timestamp;
52			if (last < wait) {
53				timeout = setTimeout(later, wait - last);
54			} else {
55				timeout = null;
56				if (!immediate) result = func.apply(context, args);
57			}
58		};
59		let callNow = immediate && !timeout;
60		if (!timeout) {
61			timeout = setTimeout(later, wait);
62		}
63		if (callNow) result = func.apply(context, args);
64		return result;
65	};
66}
67
68
69function onScrollSliderParallax() {
70	SEMICOLON.slider.sliderParallax();
71	SEMICOLON.slider.sliderElementsFade();
72}
73
74
75var SEMICOLON = SEMICOLON || {};
76window.scwEvents = window.scwEvents || {};
77
78(function($){
79
80	// USE STRICT
81	"use strict";
82
83	SEMICOLON.initialize = {
84
85		init: function(){
86
87			SEMICOLON.initialize.defaults();
88			SEMICOLON.initialize.pageTransition();
89			SEMICOLON.initialize.goToTop();
90			SEMICOLON.initialize.lazyLoad();
91			SEMICOLON.initialize.lightbox();
92			SEMICOLON.initialize.resizeVideos();
93			SEMICOLON.initialize.dataResponsiveClasses();
94			SEMICOLON.initialize.dataResponsiveHeights();
95			SEMICOLON.initialize.stickFooterOnSmall();
96
97		},
98
99		execFunc: function( functionName, context ) {
100			let args = Array.prototype.slice.call( arguments, 2 ),
101				namespaces = functionName.split("."),
102				func = namespaces.pop();
103
104			for( let i = 0; i < namespaces.length; i++ ) {
105				context = context[namespaces[i]];
106			}
107
108			if( typeof context[func] !== 'undefined' ) {
109				return context[func].apply( context, args );
110			} else {
111				console.log( functionName + ' Function does not exist' );
112			}
113		},
114
115		execPlugin: function( element, settings, available ) {
116			let pluginActive = false,
117				pluginLinkingInterval;
118
119			if( available ) {
120
121				if( settings.trigger && !scwEvents[settings.trigger] ) {
122					$window.trigger( settings.trigger );
123					scwEvents[settings.trigger] = true;
124				}
125
126				if( settings.execfn ) {
127					SEMICOLON.initialize.execFunc( settings.execfn, window, element );
128				}
129
130				if( settings.class ) {
131					$body.addClass( settings.class );
132				}
133
134			} else {
135				if( settings.trigger && !scwEvents[settings.trigger] ) {
136					pluginLinkingInterval = setInterval( function plugFn(){
137						let pluginFnExec = settings.pluginfn();
138						if( pluginFnExec ) {
139							$window.trigger( settings.trigger );
140							scwEvents[settings.trigger] = true;
141							clearInterval( pluginLinkingInterval );
142						}
143						return plugFn;
144					}(), 1000);
145				} else {
146					pluginActive = true;
147				}
148
149				if( settings.execfn ) {
150					if( settings.trigger && !pluginActive ) {
151						$window.on( settings.trigger, function(){
152							SEMICOLON.initialize.execFunc( settings.execfn, window, element );
153						});
154					} else {
155						SEMICOLON.initialize.execFunc( settings.execfn, window, element );
156					}
157				}
158
159				if( settings.class ) {
160					$body.addClass( settings.class );
161				}
162			}
163		},
164
165		jsLinking: function( element, settings ) {
166			if( element.length < 1 ){
167				return false;
168			}
169
170			if( settings.hiddendisable && ( element.filter(':hidden').length == element.length ) ) {
171				return false;
172			}
173
174			let pluginFnExec = settings.pluginfn(),
175				jsPath = 'js/', file,
176				disableAJAX = false;
177
178			if( typeof scwJsPath !== 'undefined' ) {
179				jsPath = scwJsPath + '/';
180			}
181
182			if( typeof scwDisableJsAJAX !== 'undefined' && scwDisableJsAJAX === true ) {
183				disableAJAX = true;
184			}
185
186			if( /^(f|ht)tps?:\/\//i.test( window.decodeURIComponent( settings.file ) ) ) {
187				file = settings.file;
188			} else {
189				file = jsPath + settings.file;
190			}
191
192			if( pluginFnExec ) {
193				SEMICOLON.initialize.execPlugin( element, settings, true );
194			} else {
195				if( !disableAJAX ) {
196					$.ajax({
197						url: file,
198						dataType: "script",
199						cache: true,
200						crossDomain: true,
201						timeout: 5000,
202					}).done(function() {
203						SEMICOLON.initialize.execPlugin( element, settings, false );
204					}).fail(function() {
205						console.log( settings.error );
206					});
207				} else {
208					console.log( settings.error );
209				}
210			}
211		},
212
213		functions: function( settings ){
214			let element, parent, item;
215
216			if( typeof settings.element === 'object' && settings.element !== null ) {
217				if( settings.element.parent !== 'undefined' ) {
218					parent = settings.element.parent;
219				}
220				if( settings.element.el !== 'undefined' ) {
221					settings.element = settings.element.el;
222				}
223			}
224
225			if( settings.element ) {
226				item = settings.element;
227			} else {
228				item = settings.default;
229			}
230
231			if( typeof parent === 'object' ) {
232				element = parent.find( item );
233			} else {
234				element = $( item );
235			}
236
237			this.jsLinking( element, settings );
238		},
239
240		defaults: function(){
241			let easingJs = {
242				default: 'body',
243				file: 'plugins.easing.js',
244				error: 'plugins.easing.js: Plugin could not be loaded',
245				pluginfn: () => typeof jQuery.easing["easeOutQuad"] !== "undefined",
246				trigger: 'pluginEasingReady',
247				class: 'has-plugin-easing'
248			};
249
250			let bootstrapJs = {
251				default: 'body',
252				file: 'plugins.bootstrap.js',
253				error: 'plugins.bootstrap.js: Plugin could not be loaded',
254				pluginfn: () => typeof bootstrap !== "undefined",
255				trigger: 'pluginBootstrapReady',
256				class: 'has-plugin-bootstrap'
257			};
258
259			let jRes = jRespond([
260				{
261					label: 'smallest',
262					enter: 0,
263					exit: 575
264				},{
265					label: 'handheld',
266					enter: 576,
267					exit: 767
268				},{
269					label: 'tablet',
270					enter: 768,
271					exit: 991
272				},{
273					label: 'laptop',
274					enter: 992,
275					exit: 1199
276				},{
277					label: 'desktop',
278					enter: 1200,
279					exit: 10000
280				}
281			]);
282
283			jRes.addFunc([
284				{
285					breakpoint: 'desktop',
286					enter: function() { $body.addClass('device-xl'); },
287					exit: function() { $body.removeClass('device-xl'); }
288				},{
289					breakpoint: 'laptop',
290					enter: function() { $body.addClass('device-lg'); },
291					exit: function() { $body.removeClass('device-lg'); }
292				},{
293					breakpoint: 'tablet',
294					enter: function() { $body.addClass('device-md'); },
295					exit: function() { $body.removeClass('device-md'); }
296				},{
297					breakpoint: 'handheld',
298					enter: function() { $body.addClass('device-sm'); },
299					exit: function() { $body.removeClass('device-sm'); }
300				},{
301					breakpoint: 'smallest',
302					enter: function() { $body.addClass('device-xs'); },
303					exit: function() { $body.removeClass('device-xs'); }
304				}
305			]);
306
307			SEMICOLON.initialize.functions( easingJs );
308			SEMICOLON.initialize.functions( bootstrapJs );
309
310			if( ! 'IntersectionObserver' in window ){
311				let intersectObserve = {
312					default: 'body',
313					file: 'intersection-observer.js',
314					error: 'intersection-observer.js: Plugin could not be loaded',
315					pluginfn: () => typeof window.IntersectionObserver !== "undefined",
316					trigger: 'intersectObservePolyfill',
317					class: 'has-polyfill-intersection-observer'
318				};
319
320				SEMICOLON.initialize.functions( intersectObserve );
321			}
322		},
323
324		goToTop: function(){
325			let elementScrollSpeed = $goToTopEl.attr('data-speed'),
326				elementScrollEasing = $goToTopEl.attr('data-easing');
327
328			if( !elementScrollSpeed ) { elementScrollSpeed = 700; }
329			if( !elementScrollEasing ) { elementScrollEasing = 'easeOutQuad'; }
330
331			$goToTopEl.off( 'click' ).on( 'click', function() {
332				$('body,html').stop(true).animate({
333					'scrollTop': 0
334				}, Number( elementScrollSpeed ), elementScrollEasing );
335				return false;
336			});
337		},
338
339		goToTopScroll: function(){
340			let elementMobile = $goToTopEl.attr('data-mobile'),
341				elementOffset = $goToTopEl.attr('data-offset');
342
343			if( !elementOffset ) { elementOffset = 450; }
344
345			if( elementMobile != 'true' && ( $body.hasClass('device-sm') || $body.hasClass('device-xs') ) ) { return true; }
346
347			if( $window.scrollTop() > Number(elementOffset) ) {
348				$goToTopEl.fadeIn();
349				$body.addClass('gototop-active');
350			} else {
351				$goToTopEl.fadeOut();
352				$body.removeClass('gototop-active');
353			}
354		},
355
356		lightbox: function( element ){
357			let settings = {
358				element: element,
359				default: '[data-lightbox]',
360				file: 'plugins.lightbox.js',
361				error: 'plugins.lightbox.js: Plugin could not be loaded',
362				execfn: 'SEMICOLON_lightboxInit',
363				pluginfn: () => $().magnificPopup,
364				trigger: 'pluginLightboxReady',
365				class: 'has-plugin-lightbox'
366			};
367
368			SEMICOLON.initialize.functions( settings );
369		},
370
371		modal: function( element ){
372			let settings = {
373				element: element,
374				default: '.modal-on-load',
375				file: 'plugins.lightbox.js',
376				error: 'plugins.lightbox.js: Plugin could not be loaded',
377				execfn: 'SEMICOLON_modalInit',
378				pluginfn: () => $().magnificPopup,
379				trigger: 'pluginLightboxReady',
380				class: 'has-plugin-lightbox'
381			};
382
383			SEMICOLON.initialize.functions( settings );
384		},
385
386		resizeVideos: function(){
387			let settings = {
388				default: 'iframe[src*="youtube"],iframe[src*="vimeo"],iframe[src*="dailymotion"],iframe[src*="maps.google.com"],iframe[src*="google.com/maps"]',
389				file: 'plugins.fitvids.js',
390				error: 'plugins.fitvids.js: Plugin could not be loaded',
391				execfn: 'SEMICOLON_resizeVideosInit',
392				pluginfn: () => $().fitVids,
393				trigger: 'pluginfitVidsReady',
394				class: 'has-plugin-fitvids'
395			};
396
397			SEMICOLON.initialize.functions( settings );
398		},
399
400		pageTransition: function(){
401			let settings = {
402				default: '.page-transition',
403				file: 'plugins.pagetransition.js',
404				error: 'plugins.pagetransition.js: Plugin could not be loaded',
405				execfn: 'SEMICOLON_pageTransitionInit',
406				pluginfn: () => $().animsition,
407				trigger: 'pluginPageTransitionReady',
408				class: 'has-plugin-animsition'
409			};
410
411			SEMICOLON.initialize.functions( settings );
412		},
413
414		lazyLoad: function( element ) {
415			let settings = {
416				element: element,
417				default: '.lazy',
418				file: 'plugins.lazyload.js',
419				error: 'plugins.lazyload.js: Plugin could not be loaded',
420				execfn: 'SEMICOLON_lazyLoadInit',
421				pluginfn: () => typeof LazyLoad !== "undefined",
422				trigger: 'pluginlazyLoadReady',
423				class: 'has-plugin-lazyload'
424			};
425
426			SEMICOLON.initialize.functions( settings );
427		},
428
429		topScrollOffset: function() {
430			let topOffsetScroll = 0;
431
432			if( ( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) && !SEMICOLON.isMobile.any() ) {
433				if( $header.hasClass('sticky-header') ) {
434					if( $pagemenu.hasClass('dots-menu') ) { topOffsetScroll = 100; } else { topOffsetScroll = 144; }
435				} else {
436					if( $pagemenu.hasClass('dots-menu') ) { topOffsetScroll = 140; } else { topOffsetScroll = 184; }
437				}
438
439				if( !$pagemenu.length ) {
440					if( $header.hasClass('sticky-header') ) { topOffsetScroll = 100; } else { topOffsetScroll = 140; }
441				}
442			} else {
443				topOffsetScroll = 40;
444			}
445
446			return topOffsetScroll;
447		},
448
449		dataResponsiveClasses: function(){
450			let settings = {
451				default: '[data-class-xl],[data-class-lg],[data-class-md],[data-class-sm],[data-class-xs]',
452				file: 'plugins.dataclasses.js',
453				error: 'plugins.dataclasses.js: Plugin could not be loaded',
454				execfn: 'SEMICOLON_dataClassesInit',
455				pluginfn: () => typeof scwDataClassesPlugin !== "undefined",
456				trigger: 'pluginDataClassesReady',
457				class: 'has-plugin-dataclasses'
458			};
459
460			SEMICOLON.initialize.functions( settings );
461		},
462
463		dataResponsiveHeights: function(){
464			let settings = {
465				default: '[data-height-xl],[data-height-lg],[data-height-md],[data-height-sm],[data-height-xs]',
466				file: 'plugins.dataheights.js',
467				error: 'plugins.dataheights.js: Plugin could not be loaded',
468				execfn: 'SEMICOLON_dataHeightsInit',
469				pluginfn: () => typeof scwDataHeightsPlugin !== "undefined",
470				trigger: 'pluginDataHeightsReady',
471				class: 'has-plugin-dataheights'
472			};
473
474			SEMICOLON.initialize.functions( settings );
475		},
476
477		stickFooterOnSmall: function(){
478			$footer.css({ 'margin-top': '' });
479			let windowH = $window.height(),
480				wrapperH = $wrapper.height();
481
482			if( !$body.hasClass('sticky-footer') && $footer.length > 0 && $wrapper.has('#footer') ) {
483				if( windowH > wrapperH ) {
484					$footer.css({ 'margin-top': ( windowH - wrapperH ) });
485				}
486			}
487		}
488
489	};
490
491	SEMICOLON.header = {
492
493		init: function(){
494
495			SEMICOLON.header.initialize();
496			SEMICOLON.header.menufunctions();
497			SEMICOLON.header.fullWidthMenu();
498			SEMICOLON.header.stickyMenu();
499			SEMICOLON.header.stickyPageMenu();
500			SEMICOLON.header.sideHeader();
501			SEMICOLON.header.sidePanel();
502			SEMICOLON.header.onePageScroll();
503			SEMICOLON.header.logo();
504			SEMICOLON.header.topsearch();
505			SEMICOLON.header.topcart();
506			SEMICOLON.header.miscFunctions();
507
508		},
509
510		initialize: function() {
511
512			initHeaderHeight = $headerWrap.outerHeight();
513
514			if( $headerWrap.length > 0 ) {
515				if( $('.header-wrap-clone').length < 1 ) {
516					$headerWrap.after('<div class="header-wrap-clone"></div>');
517				}
518				$headerWrapClone = $('.header-wrap-clone');
519			}
520
521			if( $pagemenu.length > 0 ) {
522				$pagemenu.find('#page-menu-wrap').after('<div class="page-menu-wrap-clone"></div>');
523				$pageMenuClone = $('.page-menu-wrap-clone');
524			}
525
526			let menuItemSubs = $( '.menu-item:has(.sub-menu-container)' );
527
528			menuItemSubs.addClass('sub-menu'); // , .primary-menu.with-arrows > .menu-container > .menu-item:has(.sub-menu-container) > .menu-link > div:not(:has(.icon-angle-down))
529			$( '.top-links-item:has(.top-links-sub-menu,.top-links-section) > a:not(:has(.icon-angle-down)), .menu-item:not(.mega-menu-title):has(.sub-menu-container) > .menu-link > div:not(:has(.icon-angle-down)), .page-menu-item:has(.page-menu-sub-menu) > a > div:not(:has(.icon-angle-down))' ).append( '<i class="icon-angle-down"></i>' );
530			$( '.menu-item:not(.mega-menu-title):has(.sub-menu-container):not(:has(.sub-menu-trigger))' ).append( '<button class="sub-menu-trigger icon-chevron-right"></button>' );
531
532			SEMICOLON.header.menuInvert();
533
534		},
535
536		menuInvert: function( subMenuEl ) {
537			let submenus = subMenuEl || $( '.mega-menu-content, .sub-menu-container, .top-links-section' );
538
539			submenus.children().css({ 'display': 'block' });
540			submenus.css({ 'display': 'block' });
541			submenus.each( function( index, element ){
542				let viewportOffset = element.getBoundingClientRect();
543
544				if( $body.hasClass('rtl') ) {
545					if( viewportOffset.left < 0 ) {
546						element.classList.add('menu-pos-invert');
547					}
548				}
549
550				if((viewportOffset.left + viewportOffset.width) - windowWidth > 0) {
551					element.classList.add('menu-pos-invert');
552				}
553			});
554			submenus.children().css({ 'display': '' });
555			submenus.css({ 'display': '' });
556		},
557
558		includeOffset: function(){
559			if( $headerInc.length < 1 ) {
560				return true;
561			}
562
563			let headerInc = $header.outerHeight();
564			if( $header.hasClass('floating-header') || $headerInc.hasClass('include-topbar') ) {
565				headerInc = headerInc + $header.offset().top;
566			}
567			$headerInc.css({ 'margin-top': -headerInc });
568			SEMICOLON.slider.sliderParallax();
569		},
570
571		menufunctions: function(){
572
573			let menuItemSubs		= $( '.menu-item:has(.sub-menu-container)' ),
574				menuItemSubsLinks	= menuItemSubs.children( '.menu-link' ),
575				submenusT			= '.mega-menu-content, .sub-menu-container',
576				submenus			= $( submenusT ),
577				menuItemT			= '.menu-item',
578				subMenuT			= '.sub-menu',
579				menuSpeed			= primaryMenu.attr( 'data-trigger-speed' ) || 200,
580				subMenuTriggerT		= '.sub-menu-trigger',
581				menuItemTrigger;
582
583			menuSpeed = Number( menuSpeed );
584
585			menuItemTrigger	= menuItemSubs.children( subMenuTriggerT );
586
587			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
588				setTimeout( function(){
589					if( $headerWrapClone.length > 0 ) {
590						$headerWrapClone.css({ 'height': initHeaderHeight });
591					}
592					SEMICOLON.header.includeOffset();
593				}, 1000);
594				primaryMenu.find( submenus ).css({ 'display': '' });
595			} else {
596				$headerInc.css({ 'margin-top': '' });
597			}
598
599			if( ( $body.hasClass('overlay-menu') && primaryMenu.hasClass('on-click') ) && ( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) ) {
600				menuItemSubsLinks.off( 'click' ).on( 'click', function(e){
601					let triggerEl = $(this);
602					triggerEl.parents( subMenuT ).siblings().find( submenus ).stop( true, true ).slideUp( menuSpeed );
603					triggerEl.parent( menuItemT ).children( submenusT ).stop( true, true ).slideToggle( menuSpeed );
604					e.preventDefault();
605				});
606			} else if( ( $body.hasClass('side-header') && primaryMenu.hasClass('on-click') ) || ( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) ) {
607				menuItemTrigger.removeClass('icon-rotate-90');
608				$( menuItemT ).find( submenus ).filter(':not(:animated)').stop( true, true ).slideUp( menuSpeed , function(){
609					$body.toggleClass("primary-menu-open", false);
610				});
611
612				menuItemTrigger = menuItemTrigger.add( menuItemSubsLinks.filter('[href^="#"]') );
613
614				menuItemTrigger.off( 'click' ).on( 'click', function(e){
615					let triggerEl = $(this);
616					triggerEl.parents( subMenuT ).siblings().find( subMenuTriggerT ).removeClass('icon-rotate-90');
617					triggerEl.parents( subMenuT ).siblings().find( submenus ).filter(':not(:animated)').stop( true, true ).slideUp( menuSpeed );
618					triggerEl.parent( menuItemT ).children( submenusT ).filter(':not(:animated)').stop( true, true ).slideToggle( menuSpeed );
619
620					let subMenuTriggerEl = triggerEl.parent( menuItemT ).children( subMenuTriggerT );
621
622					if( !subMenuTriggerEl.hasClass( 'icon-rotate-90' ) ) {
623						subMenuTriggerEl.addClass('icon-rotate-90');
624					} else {
625						subMenuTriggerEl.removeClass('icon-rotate-90');
626					}
627
628					e.preventDefault();
629				});
630			} else if( ( $body.hasClass('overlay-menu') || $body.hasClass('side-header') ) && ( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) ) {
631				primaryMenu.find( submenus ).stop( true, true ).slideUp( menuSpeed );
632				$( menuItemT ).hover( function(e){
633					$(this).children( submenusT ).stop( true, true ).slideDown( menuSpeed );
634				}, function(){
635					$(this).children( submenusT ).stop( true, true ).slideUp( menuSpeed );
636				});
637			} else {
638				if( primaryMenu.hasClass('on-click') ) {
639					menuItemSubsLinks.off( 'click' ).on( 'click', function(e){
640						let triggerEl = $(this);
641						triggerEl.parents( subMenuT ).siblings().find( submenus ).removeClass('d-block');
642						triggerEl.parent( menuItemT ).children( submenusT ).toggleClass('d-block');
643						triggerEl.parent( menuItemT ).siblings().removeClass('current');
644						triggerEl.parent( menuItemT ).toggleClass('current');
645						e.preventDefault();
646					});
647				}
648			}
649
650			if( $('.top-links').hasClass('on-click') || ( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) ) {
651				$('.top-links-item:has(.top-links-sub-menu,.top-links-section) > a').on( 'click', function(e){
652					$(this).parents('li').siblings().find('.top-links-sub-menu,.top-links-section').removeClass('d-block');
653					$(this).parent('li').children('.top-links-sub-menu,.top-links-section').toggleClass('d-block');
654					e.preventDefault();
655				});
656			}
657
658			SEMICOLON.header.menuInvert( $('.top-links-section') );
659
660			$('#primary-menu-trigger').off( 'click' ).on( 'click', function() {
661				if( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) {
662					if( primaryMenu.find('.mobile-primary-menu').length > 0 ) {
663						$( '.primary-menu:not(.mobile-menu-off-canvas) .mobile-primary-menu' ).stop( true, true ).slideToggle( menuSpeed );
664						$( '.primary-menu.mobile-menu-off-canvas .mobile-primary-menu' ).toggleClass('d-block');
665					} else {
666						$( '.primary-menu:not(.mobile-menu-off-canvas) .menu-container' ).stop( true, true ).slideToggle( menuSpeed );
667						$( '.primary-menu.mobile-menu-off-canvas .menu-container' ).toggleClass('d-block');
668					}
669				}
670				$body.toggleClass("primary-menu-open");
671				return false;
672			});
673
674			$( '.menu-container:not(.mobile-primary-menu)' ).css({ 'display': '' });
675			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
676				primaryMenu.find('.mobile-primary-menu').removeClass('d-block');
677			}
678
679		},
680
681		fullWidthMenu: function(){
682
683			if( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) {
684				$('.mega-menu-content, .top-search-form').css({ 'width': '' });
685				return true;
686			}
687
688			let headerWidth = $('.mega-menu:not(.mega-menu-full):not(.mega-menu-small) .mega-menu-content').parents('.header-row').width();
689
690			if( $header.find('.container-fullwidth').length > 0 ) {
691				$('.mega-menu:not(.mega-menu-full):not(.mega-menu-small) .mega-menu-content').css({ 'width': headerWidth });
692			}
693
694			if( $body.hasClass('stretched') ) {
695				if( $header.hasClass('floating-header') ) {
696					$('.mega-menu:not(.mega-menu-full):not(.mega-menu-small) .mega-menu-content, .top-search-form').css({ 'width': headerWidth + 80 });
697				} else {
698					$('.mega-menu:not(.mega-menu-full):not(.mega-menu-small) .mega-menu-content, .top-search-form').css({ 'width': headerWidth });
699				}
700			} else {
701				if( $header.hasClass('full-header') ) {
702					$('.mega-menu:not(.mega-menu-full):not(.mega-menu-small) .mega-menu-content').css({ 'width': headerWidth - 80 });
703				}
704			}
705
706			if( $header.find('.header-row').length > 1 ) {
707				let megaMenuContent	= $('.menu-container > .mega-menu:not(.mega-menu-small) .mega-menu-content').eq(0),
708					offset			= $headerWrap.outerHeight() - megaMenuContent.parents('.header-row').outerHeight(),
709					css				= '.menu-container > .mega-menu:not(.mega-menu-small) .mega-menu-content { top: calc( 100% - '+ offset +'px ); }',
710					head			= document.head || document.getElementsByTagName('head')[0],
711					style			= document.createElement('style');
712
713				head.appendChild(style);
714
715				style.type = 'text/css';
716				style.appendChild(document.createTextNode(css));
717			}
718		},
719
720		stickyMenu: function( headerOffset ){
721
722			windowScrT	= $window.scrollTop();
723
724			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
725				if( windowScrT > headerOffset ) {
726
727					if( !$body.hasClass('side-header') ) {
728						$header.filter(':not(.no-sticky)').addClass('sticky-header');
729						// if( !$headerWrap.hasClass('force-not-dark') ) { $headerWrap.removeClass('not-dark'); }
730						SEMICOLON.header.stickyMenuClass();
731
732						if( stickyShrink == 'true' && !$header.hasClass('no-sticky') ) {
733							if( ( windowScrT - headerOffset ) > Number( stickyShrinkOffset ) ) {
734								$header.addClass('sticky-header-shrink');
735								if( headerSizeCustom ){
736									logo.find('img').css({ 'height': Number( stickyLogoH ) });
737									SEMICOLON.header.menuItemsSpacing( stickyMenuP );
738								}
739							} else {
740								$header.removeClass('sticky-header-shrink');
741								if( headerSizeCustom ){
742									//logo.find('img').css({ 'height': Number( defLogoH ) });
743									SEMICOLON.header.menuItemsSpacing( defMenuP );
744								}
745							}
746						}
747					}
748
749				} else {
750					SEMICOLON.header.removeStickyness();
751					if( headerSizeCustom ){
752						//logo.find('img').css({ 'height': Number( defLogoH ) });
753						SEMICOLON.header.menuItemsSpacing( defMenuP );
754					}
755				}
756			}
757
758			if( $body.hasClass('device-xs') || $body.hasClass('device-sm') || $body.hasClass('device-md') ) {
759				if( mobileSticky == 'true' ) {
760					if( windowScrT > headerOffset ) {
761						$header.filter(':not(.no-sticky)').addClass('sticky-header');
762						SEMICOLON.header.stickyMenuClass();
763					} else {
764						SEMICOLON.header.removeStickyness();
765						SEMICOLON.header.responsiveMenuClass();
766					}
767				} else {
768					SEMICOLON.header.removeStickyness();
769				}
770				if( headerSizeCustom ){
771					//logo.find('img').css({ 'height': Number( mobileLogoH ) });
772					SEMICOLON.header.menuItemsSpacing( '' );
773				}
774			}
775		},
776
777		menuItemsSpacing: function( spacing ) {
778
779			let item	= primaryMenuMainItems;
780
781			if( !$body.hasClass('side-header') && !$body.hasClass('overlay-menu') ) {
782				if( primaryMenu.hasClass('menu-spacing-margin') ) {
783					if( spacing == '' ) {
784						item.css({ 'margin-top': '', 'margin-bottom': '' });
785					} else {
786						item.css({ 'margin-top': Number( spacing ), 'margin-bottom': Number( spacing ) });
787					}
788				} else {
789					if( spacing == '' ) {
790						item.css({ 'padding-top': '', 'padding-bottom': '' });
791					} else {
792						item.css({ 'padding-top': Number( spacing ), 'padding-bottom': Number( spacing ) });
793					}
794				}
795			}
796
797		},
798
799		stickyPageMenu: function( pageMenuOffset ){
800			if( $window.scrollTop() > pageMenuOffset ) {
801				if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
802					$pagemenu.filter(':not(.dots-menu,.no-sticky)').addClass('sticky-page-menu');
803					let headerHeight = $headerWrap.outerHeight();
804					if( $header.length > 0 && !$header.hasClass('no-sticky') ) {
805						$pagemenu.filter('.sticky-page-menu:not(.dots-menu,.no-sticky)').find( $pageMenuWrap ).css({ 'top': headerHeight +'px' });
806					}
807				} else if( $body.hasClass('device-sm') || $body.hasClass('device-xs') || $body.hasClass('device-md') ) {
808					if( $pagemenu.attr('data-mobile-sticky') == 'true' ) {
809						$pagemenu.filter(':not(.dots-menu,.no-sticky)').addClass('sticky-page-menu');
810					}
811				}
812			} else {
813				$pagemenu.removeClass('sticky-page-menu');
814				$pagemenu.find( $pageMenuWrap ).css({ 'top': '' });
815			}
816		},
817
818		removeStickyness: function(){
819			if( $header.hasClass('sticky-header') ){
820				$header.removeClass('sticky-header');
821				$header.removeClass().addClass(oldHeaderClasses);
822				$headerWrap.removeClass().addClass(oldHeaderWrapClasses);
823				if( !$headerWrap.hasClass('force-not-dark') ) { $headerWrap.removeClass('not-dark'); }
824				SEMICOLON.slider.swiperSliderMenu();
825				SEMICOLON.slider.revolutionSliderMenu();
826			}
827			if( ( $body.hasClass('device-sm') || $body.hasClass('device-xs') || $body.hasClass('device-md') ) && ( typeof responsiveMenuClasses === 'undefined' ) ) {
828				$header.removeClass().addClass(oldHeaderClasses);
829				$headerWrap.removeClass().addClass(oldHeaderWrapClasses);
830				if( !$headerWrap.hasClass('force-not-dark') ) { $headerWrap.removeClass('not-dark'); }
831			}
832		},
833
834		sideHeader: function(){
835			$("#header-trigger").off( 'click' ).on( 'click', function(){
836				$('body.open-header').toggleClass("side-header-open");
837				return false;
838			});
839		},
840
841		sidePanel: function(){
842			$(".side-panel-trigger").off( 'click' ).on( 'click', function(){
843				$body.toggleClass("side-panel-open");
844				if( $body.hasClass('device-touch') && $body.hasClass('side-push-panel') ) {
845					$body.toggleClass("ohidden");
846				}
847				return false;
848			});
849		},
850
851		onePageScroll: function( element ){
852			let settings = {
853				element: element,
854				default: '.one-page-menu',
855				file: 'plugins.onepage.js',
856				error: 'plugins.onepage.js: Plugin could not be loaded',
857				execfn: 'SEMICOLON_onePageModule',
858				pluginfn: () => typeof scwOnePageModulePlugin !== "undefined",
859				trigger: 'pluginOnePageModuleReady',
860				class: 'has-plugin-onepagemodule'
861			};
862
863			SEMICOLON.initialize.functions( settings );
864		},
865
866		logo: function(){
867			let sLogo = defaultLogo.find('img'),
868				rLogo = retinaLogo.find('img');
869			if( ( $header.hasClass('dark') || $body.hasClass('dark') ) && !$headerWrap.hasClass('not-dark') ) {
870				if( defaultDarkLogo && ( sLogo.attr('src') != defaultDarkLogo ) ){
871					sLogo.attr('src', defaultDarkLogo);
872				}
873
874				if( retinaDarkLogo && ( rLogo.attr('src') != retinaDarkLogo ) ){
875					rLogo.attr('src', retinaDarkLogo);
876				}
877			} else {
878				if( defaultLogoImg && ( sLogo.attr('src') != defaultLogoImg ) ){
879					sLogo.attr('src', defaultLogoImg);
880				}
881
882				if( retinaLogoImg && ( rLogo.attr('src') != retinaLogoImg ) ){
883					rLogo.attr('src', retinaLogoImg);
884				}
885			}
886
887			if( $header.hasClass('sticky-header') ) {
888				if( defaultStickyLogo && ( sLogo.attr('src') != defaultStickyLogo ) ){
889					sLogo.attr('src', defaultStickyLogo);
890				}
891
892				if( retinaStickyLogo && ( rLogo.attr('src') != retinaStickyLogo ) ){
893					rLogo.attr('src', retinaStickyLogo);
894				}
895			}
896
897			if( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) {
898				if( defaultMobileLogo && ( sLogo.attr('src') != defaultMobileLogo ) ){
899					sLogo.attr('src', defaultMobileLogo);
900				}
901
902				if( retinaMobileLogo && ( rLogo.attr('src') != retinaMobileLogo ) ){
903					rLogo.attr('src', retinaMobileLogo);
904				}
905			}
906		},
907
908		stickyMenuClass: function(){
909			let newClassesArray = '';
910
911			if( stickyMenuClasses ) {
912				newClassesArray = stickyMenuClasses.split(/ +/);
913			}
914
915			let noOfNewClasses = newClassesArray.length;
916
917			if( noOfNewClasses > 0 ) {
918				let i = 0;
919				for( i=0; i<noOfNewClasses; i++ ) {
920					if( newClassesArray[i] == 'not-dark' ) {
921						$header.removeClass('dark');
922						$headerWrap.filter(':not(.not-dark)').addClass('not-dark');
923					} else if( newClassesArray[i] == 'dark' ) {
924						$headerWrap.removeClass('not-dark force-not-dark');
925						if( !$header.hasClass( newClassesArray[i] ) ) {
926							$header.addClass( newClassesArray[i] );
927						}
928					} else if( !$header.hasClass( newClassesArray[i] ) ) {
929						$header.addClass( newClassesArray[i] );
930					}
931				}
932			}
933		},
934
935		responsiveMenuClass: function(){
936			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ){
937				return true;
938			}
939
940			let newClassesArray = '';
941
942			if( responsiveMenuClasses ) {
943				newClassesArray = responsiveMenuClasses.split(/ +/);
944			}
945
946			let noOfNewClasses = newClassesArray.length;
947
948			if( noOfNewClasses > 0 ) {
949				let i = 0;
950				for( i=0; i<noOfNewClasses; i++ ) {
951					if( newClassesArray[i] == 'not-dark' ) {
952						$header.removeClass('dark');
953						$headerWrap.addClass('not-dark');
954					} else if( newClassesArray[i] == 'dark' ) {
955						$headerWrap.removeClass('not-dark force-not-dark');
956						if( !$header.hasClass( newClassesArray[i] ) ) {
957							$header.addClass( newClassesArray[i] );
958						}
959					} else if( !$header.hasClass( newClassesArray[i] ) ) {
960						$header.addClass( newClassesArray[i] );
961					}
962				}
963			}
964
965			SEMICOLON.header.logo();
966		},
967
968		topsearch: function(){
969			$topSearch.parents('.header-row').addClass( 'top-search-parent' );
970			let topSearchParent = $header.find('.top-search-parent');
971
972			$("#top-search-trigger").off( 'click' ).on( 'click', function(e){
973				clearTimeout( topSearchTimeOut );
974				$body.toggleClass('top-search-open');
975				$topCart.toggleClass('top-cart-open', false);
976				if( $body.hasClass('device-md') || $body.hasClass('device-sm') || $body.hasClass('device-xs') ) {
977					primaryMenu.filter( ':not(.mobile-menu-off-canvas)' ).find('.menu-container').slideUp(200);
978					primaryMenu.filter( '.mobile-menu-off-canvas' ).find('.menu-container').toggleClass('d-block', false);
979				}
980				if( $body.hasClass('top-search-open') ) {
981					topSearchParent.toggleClass('position-relative', true);
982				} else {
983					topSearchTimeOut = setTimeout( function(){
984						topSearchParent.toggleClass('position-relative', false);
985					}, 750);
986				}
987				$body.toggleClass("primary-menu-open", false);
988				$pagemenu.toggleClass('page-menu-open', false);
989				if ($body.hasClass('top-search-open')){
990					$topSearch.find('input').focus();
991				}
992				e.stopPropagation();
993				e.preventDefault();
994			});
995		},
996
997		topcart: function(){
998			if( $topCart.length < 1 ) {
999				return true;
1000			}
1001
1002			$("#top-cart-trigger").off( 'click' ).on( 'click', function(e){
1003				$pagemenu.toggleClass('page-menu-open', false);
1004				$topCart.toggleClass('top-cart-open');
1005				e.stopPropagation();
1006				e.preventDefault();
1007			});
1008		},
1009
1010		miscFunctions: function(){
1011			let topSearchParent = $header.find('.top-search-parent');
1012			$(document).on('click', function(event) {
1013				if (!$(event.target).closest('.top-search-form').length) {
1014					$body.toggleClass('top-search-open', false);
1015					topSearchTimeOut = setTimeout( function(){
1016						topSearchParent.toggleClass('position-relative', false);
1017					}, 750);
1018				}
1019				if (!$(event.target).closest('#top-cart').length) {
1020					$topCart.toggleClass('top-cart-open', false);
1021				}
1022				if (!$(event.target).closest('#page-menu').length) { $pagemenu.toggleClass('page-menu-open', false); }
1023				if (!$(event.target).closest('#side-panel').length) { $body.toggleClass('side-panel-open', false); }
1024				if (!$(event.target).closest('.primary-menu.on-click').length) {
1025					primaryMenu.filter('.on-click').find('.menu-container').find('.d-block').removeClass('d-block');
1026					primaryMenu.filter('.on-click').find('.menu-item').removeClass('current');
1027				}
1028				if( primaryMenu.hasClass('mobile-menu-off-canvas') ) {
1029					if (!$(event.target).closest('.primary-menu.mobile-menu-off-canvas .menu-container').length) {
1030						primaryMenu.filter('.mobile-menu-off-canvas').find('.menu-container').toggleClass('d-block', false);
1031						$body.toggleClass("primary-menu-open", false);
1032					}
1033				}
1034				if (!$(event.target).closest('.top-links.on-click').length) {
1035					$('.top-links.on-click').find('.top-links-sub-menu,.top-links-section').removeClass('d-block');
1036				}
1037			});
1038		}
1039
1040	};
1041
1042	SEMICOLON.slider = {
1043
1044		init: function() {
1045
1046			SEMICOLON.slider.sliderDimensions();
1047			SEMICOLON.slider.sliderRun();
1048			SEMICOLON.slider.sliderParallax();
1049			SEMICOLON.slider.sliderElementsFade();
1050
1051		},
1052
1053		sliderDimensions: function(){
1054
1055			let parallaxElHeight	= $sliderParallaxEl.outerHeight(),
1056				parallaxElWidth		= $sliderParallaxEl.outerWidth(),
1057				slInner				= $sliderParallaxEl.find('.slider-inner'),
1058				slSwiperW			= $slider.find('.swiper-wrapper'),
1059				slSwiperS			= $slider.find('.swiper-slide').first(),
1060				slFlexHeight		= $slider.hasClass('h-auto') || $slider.hasClass('min-vh-0');
1061
1062			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
1063				setTimeout( function(){
1064					slInner.height( parallaxElHeight );
1065					if( slFlexHeight ) {
1066						parallaxElHeight = $sliderParallaxEl.find('.slider-inner').children().first().outerHeight();
1067						$sliderParallaxEl.height( parallaxElHeight );
1068						slInner.height( parallaxElHeight );
1069					}
1070				}, 500 );
1071
1072				if( slFlexHeight ) {
1073					let slSwiperFC = slSwiperS.children().first();
1074					if( slSwiperFC.hasClass('container') || slSwiperFC.hasClass('container-fluid') ) {
1075						slSwiperFC = slSwiperFC.children().first();
1076					}
1077					if( slSwiperFC.outerHeight() > slSwiperW.outerHeight() ) {
1078						slSwiperW.css({ 'height': 'auto' });
1079					}
1080				}
1081
1082				if( $body.hasClass('side-header') ) {
1083					slInner.width( parallaxElWidth );
1084				}
1085
1086				if( !$body.hasClass('stretched') ) {
1087					parallaxElWidth = $wrapper.outerWidth();
1088					slInner.width( parallaxElWidth );
1089				}
1090			} else {
1091				slSwiperW.css({ 'height': '' });
1092				$sliderParallaxEl.css({ 'height': '' });
1093				slInner.css({ 'width': '', 'height': '' });
1094			}
1095		},
1096
1097		sliderRun: function( element ){
1098			let settings = {
1099				element: element,
1100				default: '.swiper_wrapper',
1101				file: 'plugins.swiper.js',
1102				error: 'plugins.swiper.js: Plugin could not be loaded',
1103				execfn: 'SEMICOLON_swiperInit',
1104				pluginfn: () => typeof Swiper !== "undefined",
1105				trigger: 'pluginSwiperReady',
1106				class: 'has-plugin-swiper'
1107			};
1108
1109			SEMICOLON.initialize.functions( settings );
1110		},
1111
1112		sliderParallaxOffset: function(){
1113			let sliderParallaxOffsetTop = 0,
1114				headerHeight = $header.outerHeight();
1115			if( $body.hasClass('side-header') || $header.next('.include-header').length > 0 ) { headerHeight = 0; }
1116			if( $pageTitle.length > 0 ) {
1117				sliderParallaxOffsetTop = $pageTitle.outerHeight() + headerHeight;
1118			} else {
1119				sliderParallaxOffsetTop = headerHeight;
1120			}
1121
1122			if( $slider.next('#header').length > 0 ) { sliderParallaxOffsetTop = 0; }
1123
1124			return sliderParallaxOffsetTop;
1125		},
1126
1127		sliderParallaxSet: function( xPos, yPos, el ){
1128			if( el ) {
1129				el.style.transform = "translate3d(" + xPos + ", " + yPos + "px, 0)";
1130			}
1131		},
1132
1133		sliderParallax: function(){
1134			if( $sliderParallaxEl.length < 1 ) {
1135				return true;
1136			}
1137
1138			let parallaxOffsetTop = SEMICOLON.slider.sliderParallaxOffset(),
1139				parallaxElHeight = $sliderParallaxEl.outerHeight(),
1140				transform, transform2;
1141
1142			xScrollPosition = window.pageXOffset;
1143			yScrollPosition = window.pageYOffset;
1144
1145			if( ( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) && !SEMICOLON.isMobile.any() ) {
1146				if( ( parallaxElHeight + parallaxOffsetTop + 50 ) > yScrollPosition ){
1147					$sliderParallaxEl.addClass('slider-parallax-visible').removeClass('slider-parallax-invisible');
1148					if ( yScrollPosition > parallaxOffsetTop ) {
1149						if( $sliderParallaxEl.find('.slider-inner').length > 0 ) {
1150
1151							transform = ((yScrollPosition-parallaxOffsetTop) * -.4 );
1152							transform2 = ((yScrollPosition-parallaxOffsetTop) * -.15 );
1153
1154							SEMICOLON.slider.sliderParallaxSet( 0, transform, sliderParallaxElInner );
1155							SEMICOLON.slider.sliderParallaxSet( 0, transform2, sliderParallaxElCaption );
1156						} else {
1157							transform = ((yScrollPosition-parallaxOffsetTop) / 1.5 );
1158							transform2 = ((yScrollPosition-parallaxOffsetTop) / 7 );
1159
1160							SEMICOLON.slider.sliderParallaxSet( 0, transform, sliderParallaxEl );
1161							SEMICOLON.slider.sliderParallaxSet( 0, transform2, sliderParallaxElCaption );
1162						}
1163					} else {
1164						if( $sliderParallaxEl.find('.slider-inner').length > 0 ) {
1165							SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElInner );
1166							SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElCaption );
1167						} else {
1168							SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxEl );
1169							SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElCaption );
1170						}
1171					}
1172				} else {
1173					$sliderParallaxEl.addClass('slider-parallax-invisible').removeClass('slider-parallax-visible');
1174				}
1175
1176				requestAnimationFrame(function(){
1177					SEMICOLON.slider.sliderParallax();
1178					SEMICOLON.slider.sliderElementsFade();
1179				});
1180			} else {
1181				if( $sliderParallaxEl.find('.slider-inner').length > 0 ) {
1182					SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElInner );
1183					SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElCaption );
1184				} else {
1185					SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxEl );
1186					SEMICOLON.slider.sliderParallaxSet( 0, 0, sliderParallaxElCaption );
1187				}
1188				$sliderParallaxEl.addClass('slider-parallax-visible').removeClass('slider-parallax-invisible');
1189			}
1190		},
1191
1192		sliderElementsFade: function(){
1193			if( $sliderParallaxEl.length < 1 ) {
1194				return true;
1195			}
1196
1197			if( ( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) && !SEMICOLON.isMobile.any() ) {
1198				let parallaxOffsetTop = SEMICOLON.slider.sliderParallaxOffset(),
1199					parallaxElHeight = $sliderParallaxEl.outerHeight(),
1200					tHeaderOffset;
1201
1202				if( $header.hasClass('transparent-header') || $body.hasClass('side-header') ) {
1203					tHeaderOffset = 100;
1204				} else {
1205					tHeaderOffset = 0;
1206				}
1207				$sliderParallaxEl.filter('.slider-parallax-visible').find('.slider-arrow-left,.slider-arrow-right,.slider-caption,.slider-element-fade').css({'opacity': 1 - ( ( ( yScrollPosition - tHeaderOffset ) * 1.85 ) / parallaxElHeight ) });
1208			} else {
1209				$sliderParallaxEl.find('.slider-arrow-left,.slider-arrow-right,.slider-caption,.slider-element-fade').css({'opacity': 1});
1210			}
1211		},
1212
1213		swiperSliderMenu: function( onWinLoad ){
1214			onWinLoad = typeof onWinLoad !== 'undefined' ? onWinLoad : false;
1215			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') || ( $header.hasClass('transparent-header-responsive') && !$body.hasClass('primary-menu-open') ) ) {
1216				let activeSlide = $slider.find('.swiper-slide.swiper-slide-active');
1217				SEMICOLON.slider.headerSchemeChanger(activeSlide, onWinLoad);
1218			}
1219		},
1220
1221		revolutionSliderMenu: function( onWinLoad ){
1222			onWinLoad = typeof onWinLoad !== 'undefined' ? onWinLoad : false;
1223			if( $body.hasClass('device-xl') || $body.hasClass('device-lg') || ( $header.hasClass('transparent-header-responsive') && !$body.hasClass('primary-menu-open') ) ) {
1224				let activeSlide = $slider.find('.active-revslide');
1225				SEMICOLON.slider.headerSchemeChanger(activeSlide, onWinLoad);
1226			}
1227		},
1228
1229		headerSchemeChanger: function( activeSlide, onWinLoad ){
1230			if( activeSlide.length > 0 ) {
1231				let darkExists = false,
1232					oldClassesArray, noOfOldClasses;
1233				if( activeSlide.hasClass('dark') ){
1234					if( oldHeaderClasses ) {
1235						oldClassesArray = oldHeaderClasses.split(/ +/);
1236					} else {
1237						oldClassesArray = '';
1238					}
1239
1240					noOfOldClasses = oldClassesArray.length;
1241
1242					if( noOfOldClasses > 0 ) {
1243						let i = 0;
1244						for( i=0; i<noOfOldClasses; i++ ) {
1245							if( oldClassesArray[i] == 'dark' && onWinLoad == true ) {
1246								darkExists = true;
1247								break;
1248							}
1249						}
1250					}
1251					$('#header.transparent-header:not(.sticky-header,.semi-transparent,.floating-header)').addClass('dark');
1252					if( !darkExists ) {
1253						$('#header.transparent-header.sticky-header,#header.transparent-header.semi-transparent.sticky-header,#header.transparent-header.floating-header.sticky-header').removeClass('dark');
1254					}
1255					$headerWrap.removeClass('not-dark');
1256				} else {
1257					if( $body.hasClass('dark') ) {
1258						activeSlide.addClass('not-dark');
1259						$('#header.transparent-header:not(.semi-transparent,.floating-header)').removeClass('dark');
1260						$('#header.transparent-header:not(.sticky-header,.semi-transparent,.floating-header)').find('#header-wrap').addClass('not-dark');
1261					} else {
1262						$('#header.transparent-header:not(.semi-transparent,.floating-header)').removeClass('dark');
1263						$headerWrap.removeClass('not-dark');
1264					}
1265				}
1266				if( $header.hasClass('sticky-header') ) {
1267					SEMICOLON.header.stickyMenuClass();
1268				}
1269				SEMICOLON.header.logo();
1270			}
1271		}
1272
1273	};
1274
1275	SEMICOLON.portfolio = {
1276
1277		init: function(){
1278
1279			SEMICOLON.portfolio.revealDesc();
1280			SEMICOLON.portfolio.ajaxload();
1281
1282		},
1283
1284		revealDesc: function(){
1285			let $portfolioReveal = $('.portfolio-reveal');
1286
1287			if( $portfolioReveal < 1 ) {
1288				return true;
1289			}
1290
1291			$portfolioReveal.each( function(){
1292				let element			= $(this),
1293					elementItems	= element.find('.portfolio-item');
1294				elementItems.each( function(){
1295					let element			= $(this).find('.portfolio-desc'),
1296						elementHeight	= element.outerHeight();
1297					element.css({ 'margin-top': '-'+elementHeight+'px' });
1298				});
1299			});
1300		},
1301
1302		ajaxload: function(){
1303			let settings = {
1304				default: '.portfolio-ajax',
1305				file: 'plugins.ajaxportfolio.js',
1306				error: 'plugins.ajaxportfolio.js: Plugin could not be loaded',
1307				execfn: 'SEMICOLON_portfolioAjaxloadInit',
1308				pluginfn: () => typeof scwAjaxPortfolioPlugin !== "undefined",
1309				trigger: 'pluginAjaxPortfolioReady',
1310				class: 'has-plugin-ajaxportfolio'
1311			};
1312
1313			SEMICOLON.initialize.functions( settings );
1314		}
1315
1316	};
1317
1318	SEMICOLON.widget = {
1319
1320		init: function(){
1321
1322			SEMICOLON.widget.animations();
1323			SEMICOLON.widget.hoverAnimation();
1324			SEMICOLON.widget.youtubeBgVideo();
1325			SEMICOLON.widget.tabs();
1326			SEMICOLON.widget.toggles();
1327			SEMICOLON.widget.accordions();
1328			SEMICOLON.widget.counter();
1329			SEMICOLON.widget.countdown();
1330			SEMICOLON.widget.gmap();
1331			SEMICOLON.widget.roundedSkill();
1332			SEMICOLON.widget.progress();
1333			SEMICOLON.widget.twitterFeed();
1334			SEMICOLON.widget.flickrFeed();
1335			SEMICOLON.widget.instagramPhotos();
1336			SEMICOLON.widget.dribbbleShots();
1337			SEMICOLON.widget.navTree();
1338			SEMICOLON.widget.textRotator();
1339			SEMICOLON.widget.carousel();
1340			SEMICOLON.widget.linkScroll();
1341			SEMICOLON.widget.ajaxForm();
1342			SEMICOLON.widget.subscription();
1343			SEMICOLON.widget.shapeDivider();
1344			SEMICOLON.widget.stickySidebar();
1345			SEMICOLON.widget.cookieNotify();
1346			SEMICOLON.widget.cartQuantity();
1347			SEMICOLON.widget.readmore();
1348			SEMICOLON.widget.pricingSwitcher();
1349			SEMICOLON.widget.extras();
1350
1351		},
1352
1353		parallax: function( element ){
1354			let settings = {
1355				element: element,
1356				default: '.parallax,.page-title-parallax,.portfolio-parallax .portfolio-image',
1357				file: 'plugins.parallax.js',
1358				error: 'plugins.parallax.js: Plugin could not be loaded',
1359				execfn: 'SEMICOLON_parallaxInit',
1360				pluginfn: () => typeof skrollr !== "undefined",
1361				trigger: 'pluginParallaxReady',
1362				class: 'has-plugin-parallax'
1363			};
1364
1365			SEMICOLON.initialize.functions( settings );
1366		},
1367
1368		animations: function( element ){
1369			let settings = {
1370				element: element,
1371				default: '[data-animate]',
1372				file: 'plugins.animations.js',
1373				error: 'plugins.animations.js: Plugin could not be loaded',
1374				execfn: 'SEMICOLON_animationsInit',
1375				pluginfn: () => typeof scwAnimationsPlugin !== "undefined",
1376				trigger: 'pluginAnimationsReady',
1377				class: 'has-plugin-animations'
1378			};
1379
1380			SEMICOLON.initialize.functions( settings );
1381		},
1382
1383		hoverAnimation: function( element ){
1384			let settings = {
1385				element: element,
1386				default: '[data-hover-animate]',
1387				file: 'plugins.hoveranimation.js',
1388				error: 'plugins.hoveranimation.js: Plugin could not be loaded',
1389				execfn: 'SEMICOLON_hoverAnimationInit',
1390				pluginfn: () => typeof scwHoverAnimationPlugin !== "undefined",
1391				trigger: 'pluginHoverAnimationReady',
1392				class: 'has-plugin-hoveranimation'
1393			};
1394
1395			SEMICOLON.initialize.functions( settings );
1396		},
1397
1398		gridInit: function( element ){
1399			let settings = {
1400				element: element,
1401				default: '.grid-container',
1402				file: 'plugins.isotope.js',
1403				error: 'plugins.isotope.js: Plugin could not be loaded',
1404				execfn: 'SEMICOLON_gridContainerInit',
1405				pluginfn: () => $().isotope,
1406				trigger: 'pluginIsotopeReady',
1407				class: 'has-plugin-isotope'
1408			};
1409
1410			SEMICOLON.initialize.functions( settings );
1411		},
1412
1413		filterInit: function( element ){
1414			let settings = {
1415				element: element,
1416				default: '.grid-filter,.custom-filter',
1417				file: 'plugins.gridfilter.js',
1418				error: 'plugins.gridfilter.js: Plugin could not be loaded',
1419				execfn: 'SEMICOLON_gridFilterInit',
1420				pluginfn: () => $().isotope && typeof scwGridFilterPlugin !== "undefined",
1421				trigger: 'pluginGridFilterReady',
1422				class: 'has-plugin-isotope-filter'
1423			};
1424
1425			SEMICOLON.initialize.functions( settings );
1426		},
1427
1428		loadFlexSlider: function( element ){
1429			let settings = {
1430				element: element,
1431				default: '.fslider',
1432				file: 'plugins.flexslider.js',
1433				error: 'plugins.flexslider.js: Plugin could not be loaded',
1434				execfn: 'SEMICOLON_flexSliderInit',
1435				pluginfn: () => $().flexslider,
1436				trigger: 'pluginFlexSliderReady',
1437				class: 'has-plugin-flexslider'
1438			};
1439
1440			SEMICOLON.initialize.functions( settings );
1441		},
1442
1443		html5Video: function( element ){
1444			let settings = {
1445				element: element,
1446				default: '.video-wrap:has(video)',
1447				file: 'plugins.html5video.js',
1448				error: 'plugins.html5video.js: Plugin could not be loaded',
1449				execfn: 'SEMICOLON_html5VideoInit',
1450				pluginfn: () => typeof scwHtml5VideoPlugin !== "undefined",
1451				trigger: 'pluginHtml5VideoReady',
1452				class: 'has-plugin-html5video'
1453			};
1454
1455			SEMICOLON.initialize.functions( settings );
1456		},
1457
1458		youtubeBgVideo: function( element ){
1459			let settings = {
1460				element: element,
1461				default: '.yt-bg-player',
1462				file: 'plugins.youtube.js',
1463				error: 'plugins.youtube.js: Plugin could not be loaded',
1464				execfn: 'SEMICOLON_youtubeBgVideoInit',
1465				pluginfn: () => $().YTPlayer,
1466				trigger: 'pluginYoutubeBgVideoReady',
1467				class: 'has-plugin-youtubebg'
1468			};
1469
1470			SEMICOLON.initialize.functions( settings );
1471		},
1472
1473		tabs: function( element ){
1474			let settings = {
1475				element: element,
1476				default: '.tabs,[data-plugin="tabs"]',
1477				file: 'plugins.tabs.js',
1478				error: 'plugins.tabs.js: Plugin could not be loaded',
1479				execfn: 'SEMICOLON_tabsInit',
1480				pluginfn: () => $().tabs,
1481				trigger: 'pluginTabsReady',
1482				class: 'has-plugin-tabs'
1483			};
1484
1485			SEMICOLON.initialize.functions( settings );
1486		},
1487
1488		toggles: function( element ){
1489			let settings = {
1490				element: element,
1491				default: '.toggle',
1492				file: 'plugins.toggles.js',
1493				error: 'plugins.toggles.js: Plugin could not be loaded',
1494				execfn: 'SEMICOLON_togglesInit',
1495				pluginfn: () => typeof scwTogglesPlugin !== "undefined",
1496				trigger: 'pluginTogglesReady',
1497				class: 'has-plugin-toggles'
1498			};
1499
1500			SEMICOLON.initialize.functions( settings );
1501		},
1502
1503		accordions: function( element ){
1504			let settings = {
1505				element: element,
1506				default: '.accordion',
1507				file: 'plugins.accordions.js',
1508				error: 'plugins.accordions.js: Plugin could not be loaded',
1509				execfn: 'SEMICOLON_accordionsInit',
1510				pluginfn: () => typeof scwAccordionsPlugin !== "undefined",
1511				trigger: 'pluginAccordionsReady',
1512				class: 'has-plugin-accordions'
1513			};
1514
1515			SEMICOLON.initialize.functions( settings );
1516		},
1517
1518		counter: function( element ){
1519			let settings = {
1520				element: element,
1521				default: '.counter',
1522				file: 'plugins.counter.js',
1523				error: 'plugins.counter.js: Plugin could not be loaded',
1524				execfn: 'SEMICOLON_counterInit',
1525				pluginfn: () => $().countTo,
1526				trigger: 'pluginCounterReady',
1527				class: 'has-plugin-counter'
1528			};
1529
1530			SEMICOLON.initialize.functions( settings );
1531		},
1532
1533		countdown: function( element ){
1534			let momentSettings = {
1535				element: element,
1536				default: '.countdown',
1537				file: 'components/moment.js',
1538				error: 'components/moment.js: Plugin could not be loaded',
1539				execfn: false,
1540				pluginfn: () => typeof moment !== "undefined",
1541				trigger: 'pluginMomentReady',
1542				class: 'has-plugin-moment'
1543			};
1544
1545			let settings = {
1546				element: element,
1547				default: '.countdown',
1548				file: 'plugins.countdown.js',
1549				error: 'plugins.countdown.js: Plugin could not be loaded',
1550				execfn: 'SEMICOLON_countdownInit',
1551				pluginfn: () => $().countdown,
1552				trigger: 'pluginCountdownReady',
1553				class: 'has-plugin-countdown'
1554			};
1555
1556			SEMICOLON.initialize.functions( momentSettings );
1557			SEMICOLON.initialize.functions( settings );
1558		},
1559
1560		gmap: function( element ){
1561			let googleSettings = {
1562				element: element,
1563				default: '.gmap',
1564				file: 'https://maps.google.com/maps/api/js?key=' + googleMapsAPI,
1565				error: 'Google Maps API could not be loaded',
1566				execfn: false,
1567				pluginfn: () => typeof google !== "undefined",
1568				hiddendisable: true,
1569				class: 'has-plugin-gmapapi'
1570			};
1571
1572			let settings = {
1573				element: element,
1574				default: '.gmap',
1575				file: 'plugins.gmap.js',
1576				error: 'plugins.gmap.js: Plugin could not be loaded',
1577				execfn: 'SEMICOLON_gmapInit',
1578				pluginfn: () => typeof google !== "undefined" && $().gMap,
1579				hiddendisable: true,
1580				trigger: 'pluginGmapReady',
1581				class: 'has-plugin-gmap'
1582			};
1583
1584			SEMICOLON.initialize.functions( googleSettings );
1585			SEMICOLON.initialize.functions( settings );
1586		},
1587
1588		roundedSkill: function( element ){
1589			let settings = {
1590				element: element,
1591				default: '.rounded-skill',
1592				file: 'plugins.piechart.js',
1593				error: 'plugins.piechart.js: Plugin could not be loaded',
1594				execfn: 'SEMICOLON_roundedSkillInit',
1595				pluginfn: () => $().easyPieChart,
1596				trigger: 'pluginRoundedSkillReady',
1597				class: 'has-plugin-piechart'
1598			};
1599
1600			SEMICOLON.initialize.functions( settings );
1601		},
1602
1603		progress: function( element ){
1604			let settings = {
1605				element: element,
1606				default: '.progress',
1607				file: 'plugins.progress.js',
1608				error: 'plugins.progress.js: Plugin could not be loaded',
1609				execfn: 'SEMICOLON_progressInit',
1610				pluginfn: () => typeof scwProgressPlugin !== "undefined",
1611				trigger: 'pluginProgressReady',
1612				class: 'has-plugin-progress'
1613			};
1614
1615			SEMICOLON.initialize.functions( settings );
1616		},
1617
1618		twitterFeed: function( element ){
1619			let settings = {
1620				element: element,
1621				default: '.twitter-feed',
1622				file: 'plugins.twitter.js',
1623				error: 'plugins.twitter.js: Plugin could not be loaded',
1624				execfn: 'SEMICOLON_twitterFeedInit',
1625				pluginfn: () => typeof sm_format_twitter !== "undefined" && typeof sm_format_twitter3 !== "undefined",
1626				trigger: 'pluginTwitterFeedReady',
1627				class: 'has-plugin-twitter'
1628			};
1629
1630			SEMICOLON.initialize.functions( settings );
1631		},
1632
1633		flickrFeed: function( element ){
1634			let settings = {
1635				element: element,
1636				default: '.flickr-feed',
1637				file: 'plugins.flickrfeed.js',
1638				error: 'plugins.flickrfeed.js: Plugin could not be loaded',
1639				execfn: 'SEMICOLON_flickrFeedInit',
1640				pluginfn: () => $().jflickrfeed,
1641				trigger: 'pluginFlickrFeedReady',
1642				class: 'has-plugin-flickr'
1643			};
1644
1645			SEMICOLON.initialize.functions( settings );
1646		},
1647
1648		instagramPhotos: function( element ){
1649			let settings = {
1650				element: element,
1651				default: '.instagram-photos',
1652				file: 'plugins.instagram.js',
1653				error: 'plugins.instagram.js: Plugin could not be loaded',
1654				execfn: 'SEMICOLON_instagramPhotosInit',
1655				pluginfn: () => typeof scwInstagramPlugin !== "undefined",
1656				trigger: 'pluginInstagramReady',
1657				class: 'has-plugin-instagram'
1658			};
1659
1660			SEMICOLON.initialize.functions( settings );
1661		},
1662
1663		dribbbleShots: function( element ){
1664			let settings = {
1665				element: element,
1666				default: '.dribbble-shots',
1667				file: 'plugins.dribbble.js',
1668				error: 'plugins.dribbble.js: Plugin could not be loaded',
1669				execfn: 'SEMICOLON_dribbbleShotsInit',
1670				pluginfn: () => $.jribbble,
1671				trigger: 'pluginDribbbleReady',
1672				class: 'has-plugin-dribbble'
1673			};
1674
1675			let imagesLoadedSettings = {
1676				element: element,
1677				default: '.dribbble-shots',
1678				file: 'plugins.imagesloaded.js',
1679				error: 'plugins.imagesloaded.js: Plugin could not be loaded',
1680				pluginfn: () => $().imagesLoaded,
1681				trigger: 'pluginImagesLoadedReady',
1682				class: 'has-plugin-imagesloaded'
1683			};
1684
1685			SEMICOLON.initialize.functions( settings );
1686			SEMICOLON.initialize.functions( imagesLoadedSettings );
1687		},
1688
1689		navTree: function( element ){
1690			let settings = {
1691				element: element,
1692				default: '.nav-tree',
1693				file: 'plugins.navtree.js',
1694				error: 'plugins.navtree.js: Plugin could not be loaded',
1695				execfn: 'SEMICOLON_navtreeInit',
1696				pluginfn: () => typeof scwNavTreePlugin !== "undefined",
1697				trigger: 'pluginNavTreeReady',
1698				class: 'has-plugin-navtree'
1699			};
1700
1701			SEMICOLON.initialize.functions( settings );
1702		},
1703
1704		carousel: function( element ){
1705			let settings = {
1706				element: element,
1707				default: '.carousel-widget',
1708				file: 'plugins.carousel.js',
1709				error: 'plugins.carousel.js: Plugin could not be loaded',
1710				execfn: 'SEMICOLON_carouselInit',
1711				pluginfn: () => $().owlCarousel,
1712				trigger: 'pluginCarouselReady',
1713				class: 'has-plugin-carousel'
1714			};
1715
1716			SEMICOLON.initialize.functions( settings );
1717		},
1718
1719		masonryThumbs: function( element ){
1720			let settings = {
1721				element: element,
1722				default: '.masonry-thumbs',
1723				file: 'plugins.masonrythumbs.js',
1724				error: 'plugins.masonrythumbs.js: Plugin could not be loaded',
1725				execfn: 'SEMICOLON_masonryThumbsInit',
1726				pluginfn: () => $().isotope && typeof scwMasonryThumbsPlugin !== "undefined",
1727				trigger: 'pluginMasonryThumbsReady',
1728				class: 'has-plugin-masonrythumbs'
1729			};
1730
1731			SEMICOLON.initialize.functions( settings );
1732		},
1733
1734		notifications: function( element ){
1735			let settings = {
1736				element: element,
1737				default: false,
1738				file: 'plugins.notify.js',
1739				error: 'plugins.notify.js: Plugin could not be loaded',
1740				execfn: 'SEMICOLON_notificationInit',
1741				pluginfn: () => typeof scwNotificationPlugin !== "undefined",
1742				trigger: 'pluginNotifyReady',
1743				class: 'has-plugin-toast'
1744			};
1745
1746			SEMICOLON.initialize.functions( settings );
1747		},
1748
1749		textRotator: function( element ){
1750			let settings = {
1751				element: element,
1752				default: '.text-rotater',
1753				file: 'plugins.textrotator.js',
1754				error: 'plugins.textrotator.js: Plugin could not be loaded',
1755				execfn: 'SEMICOLON_textRotatorInit',
1756				pluginfn: () => $().Morphext,
1757				trigger: 'pluginTextRotatorReady',
1758				class: 'has-plugin-textrotator'
1759			};
1760
1761			SEMICOLON.initialize.functions( settings );
1762		},
1763
1764		linkScroll: function( element ){
1765			let settings = {
1766				element: element,
1767				default: 'a[data-scrollto]',
1768				file: 'plugins.linkscroll.js',
1769				error: 'plugins.linkscroll.js: Plugin could not be loaded',
1770				execfn: 'SEMICOLON_linkScrollInit',
1771				pluginfn: () => typeof scwLinkScrollPlugin !== "undefined",
1772				trigger: 'pluginLinkScrollReady',
1773				class: 'has-plugin-linkscroll'
1774			};
1775
1776			SEMICOLON.initialize.functions( settings );
1777		},
1778
1779		ajaxForm: function( element ){
1780			let formSettings = {
1781				element: element,
1782				default: '.form-widget',
1783				file: 'plugins.form.js',
1784				error: 'plugins.form.js: Plugin could not be loaded',
1785				execfn: false,
1786				pluginfn: () => $().validate && $().ajaxSubmit,
1787				class: 'has-plugin-form'
1788			};
1789
1790			let settings = {
1791				element: element,
1792				default: '.form-widget',
1793				file: 'plugins.ajaxform.js',
1794				error: 'plugins.ajaxform.js: Plugin could not be loaded',
1795				execfn: 'SEMICOLON_ajaxFormInit',
1796				pluginfn: () => typeof scwAjaxFormPlugin !== "undefined",
1797				trigger: 'pluginAjaxFormReady',
1798				class: 'has-plugin-ajaxform'
1799			};
1800
1801			SEMICOLON.initialize.functions( formSettings );
1802			SEMICOLON.initialize.functions( settings );
1803		},
1804
1805		subscription: function( element ){
1806			let formSettings = {
1807				element: element,
1808				default: '.subscribe-widget',
1809				file: 'plugins.form.js',
1810				error: 'plugins.form.js: Plugin could not be loaded',
1811				execfn: false,
1812				pluginfn: () => $().validate && $().ajaxSubmit,
1813				class: 'has-plugin-form'
1814			};
1815
1816			let settings = {
1817				element: element,
1818				default: '.subscribe-widget',
1819				file: 'plugins.subscribe.js',
1820				error: 'plugins.subscribe.js: Plugin could not be loaded',
1821				execfn: 'SEMICOLON_subscribeFormInit',
1822				pluginfn: () => typeof scwSubscribeFormPlugin !== "undefined",
1823				trigger: 'pluginSubscribeFormReady',
1824				class: 'has-plugin-subscribeform'
1825			};
1826
1827			SEMICOLON.initialize.functions( formSettings );
1828			SEMICOLON.initialize.functions( settings );
1829		},
1830
1831		shapeDivider: function( element ){
1832			let settings = {
1833				element: element,
1834				default: '.shape-divider',
1835				file: 'plugins.shapedivider.js',
1836				error: 'plugins.shapedivider.js: Plugin could not be loaded',
1837				execfn: 'SEMICOLON_shapeDividerInit',
1838				pluginfn: () => typeof scwShapeDividerPlugin !== "undefined",
1839				trigger: 'pluginShapeDividerReady',
1840				class: 'has-plugin-shapedivider'
1841			};
1842
1843			SEMICOLON.initialize.functions( settings );
1844		},
1845
1846		ticker: function( element ){
1847			let settings = {
1848				element: element,
1849				default: '.scw-ticker',
1850				file: 'plugins.ticker.js',
1851				error: 'plugins.ticker.js: Plugin could not be loaded',
1852				execfn: 'SEMICOLON_tickerInit',
1853				pluginfn: () => typeof scwTickerPlugin !== "undefined",
1854				trigger: 'pluginTickerReady',
1855				class: 'has-plugin-ticker'
1856			};
1857
1858			SEMICOLON.initialize.functions( settings );
1859		},
1860
1861		stickySidebar: function( element ){
1862			let settings = {
1863				element: element,
1864				default: '.sticky-sidebar-wrap',
1865				file: 'plugins.stickysidebar.js',
1866				error: 'plugins.stickysidebar.js: Plugin could not be loaded',
1867				execfn: 'SEMICOLON_stickySidebarInit',
1868				pluginfn: () => $().scwStickySidebar,
1869				trigger: 'pluginStickySidebarReady',
1870				class: 'has-plugin-stickysidebar'
1871			};
1872
1873			SEMICOLON.initialize.functions( settings );
1874		},
1875
1876		cookieNotify: function( element ){
1877			let settings = {
1878				element: element,
1879				default: '.gdpr-settings,[data-cookies]',
1880				file: 'plugins.cookie.js',
1881				error: 'plugins.cookie.js: Plugin could not be loaded',
1882				execfn: 'SEMICOLON_cookieInit',
1883				pluginfn: () => typeof Cookies !== "undefined",
1884				trigger: 'pluginCookieReady',
1885				class: 'has-plugin-cookie'
1886			};
1887
1888			SEMICOLON.initialize.functions( settings );
1889		},
1890
1891		cartQuantity: function(){
1892			let settings = {
1893				default: '.qty',
1894				file: 'plugins.quantity.js',
1895				error: 'plugins.quantity.js: Plugin could not be loaded',
1896				execfn: 'SEMICOLON_quantityInit',
1897				pluginfn: () => typeof scwQuantityPlugin !== "undefined",
1898				trigger: 'pluginQuantityReady',
1899				class: 'has-plugin-quantity'
1900			};
1901
1902			SEMICOLON.initialize.functions( settings );
1903		},
1904
1905		readmore: function(){
1906			let settings = {
1907				default: '[data-readmore]',
1908				file: 'plugins.readmore.js',
1909				error: 'plugins.readmore.js: Plugin could not be loaded',
1910				execfn: 'SEMICOLON_readmoreInit',
1911				pluginfn: () => typeof scwReadMorePlugin !== "undefined",
1912				trigger: 'pluginReadMoreReady',
1913				class: 'has-plugin-readmore'
1914			};
1915
1916			SEMICOLON.initialize.functions( settings );
1917		},
1918
1919		pricingSwitcher: function(){
1920			let settings = {
1921				default: '.pts-switcher',
1922				file: 'plugins.pricingswitcher.js',
1923				error: 'plugins.pricingswitcher.js: Plugin could not be loaded',
1924				execfn: 'SEMICOLON_pricingSwitcherInit',
1925				pluginfn: () => typeof scwPricingSwitcherPlugin !== "undefined",
1926				trigger: 'pluginPricingSwitcherReady',
1927				class: 'has-plugin-pricing-switcher'
1928			};
1929
1930			SEMICOLON.initialize.functions( settings );
1931		},
1932
1933		extras: function(){
1934			let btsCheckIntevral = setInterval( function(){
1935				if( 'pluginBootstrapReady' in scwEvents ) {
1936					if( $().tooltip ) {
1937						$('[data-bs-toggle="tooltip"]').tooltip({container: 'body'});
1938					} else {
1939						console.log('extras: Bootstrap Tooltip not defined.');
1940					}
1941
1942					if( $().popover ) {
1943						$('[data-bs-toggle="popover"]').popover({container: 'body'});
1944					} else {
1945						console.log('extras: Bootstrap Popover not defined.');
1946					}
1947
1948					clearInterval( btsCheckIntevral );
1949				}
1950			}, 1000 );
1951
1952			$('.style-msg').on( 'click', '.close', function(e){
1953				$( this ).parents( '.style-msg' ).slideUp();
1954				e.preventDefault();
1955			});
1956
1957			$('#page-menu-trigger').off( 'click' ).on( 'click', function() {
1958				$body.toggleClass('top-search-open', false);
1959				$pagemenu.toggleClass("page-menu-open");
1960				return false;
1961			});
1962
1963			$pagemenu.find('nav').off( 'click' ).on( 'click', function(e){
1964				$body.toggleClass('top-search-open', false);
1965				$topCart.toggleClass('top-cart-open', false);
1966			});
1967
1968			if( SEMICOLON.isMobile.any() ){
1969				$body.addClass('device-touch');
1970			}
1971
1972			if( $body.hasClass( 'adaptive-color-scheme' ) ) {
1973
1974				let adaptiveEl 		= $('[data-adaptive-light-class], [data-adaptive-dark-class]'),
1975					adaptLightClass	= adaptiveEl.attr( 'data-adaptive-light-class' ),
1976					adaptDarkClass	= adaptiveEl.attr( 'data-adaptive-dark-class' );
1977
1978				let adaptClasses = function( dark ) {
1979					if( dark ) {
1980						$body.toggleClass( 'dark', true );
1981						adaptiveEl.removeClass( adaptLightClass ).addClass( adaptDarkClass );
1982					} else {
1983						$body.toggleClass( 'dark', false );
1984						adaptiveEl.removeClass( adaptDarkClass ).addClass( adaptLightClass );
1985					}
1986					SEMICOLON.header.logo();
1987				};
1988
1989				if( window.matchMedia ) {
1990					adaptClasses( window.matchMedia('(prefers-color-scheme: dark)').matches );
1991
1992					window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
1993						adaptClasses( e.matches );
1994					});
1995				}
1996			}
1997
1998			$body.off( 'click' ).on( 'click', 'a[href*="#"]', function() {
1999				$window.on('beforeunload', function() {
2000					$window.scrollTop(0);
2001				});
2002			});
2003
2004			let linkElement = location.hash;
2005			if( $(linkElement).length > 0 && $('.one-page-menu').find('[data-href="'+linkElement+'"]').length > 0 ) {
2006				$window.scrollTop(0);
2007			}
2008		}
2009
2010	};
2011
2012	SEMICOLON.isMobile = {
2013		Android: function() {
2014			return navigator.userAgent.match(/Android/i);
2015		},
2016		BlackBerry: function() {
2017			return navigator.userAgent.match(/BlackBerry/i);
2018		},
2019		iOS: function() {
2020			return navigator.userAgent.match(/iPhone|iPad|iPod/i);
2021		},
2022		Opera: function() {
2023			return navigator.userAgent.match(/Opera Mini/i);
2024		},
2025		Windows: function() {
2026			return navigator.userAgent.match(/IEMobile/i);
2027		},
2028		any: function() {
2029			return (SEMICOLON.isMobile.Android() || SEMICOLON.isMobile.BlackBerry() || SEMICOLON.isMobile.iOS() || SEMICOLON.isMobile.Opera() || SEMICOLON.isMobile.Windows());
2030		}
2031	};
2032
2033	// Add your Custom JS Codes here
2034	SEMICOLON.customization = {
2035
2036		onReady: function(){
2037
2038			// Add JS Codes here to Run on Document Ready
2039
2040		},
2041
2042		onLoad: function(){
2043
2044			// Add JS Codes here to Run on Window Load
2045
2046		},
2047
2048		onResize: function(){
2049
2050			// Add JS Codes here to Run on Window Resize
2051
2052		}
2053
2054	}
2055
2056	SEMICOLON.documentOnResize = {
2057
2058		init: function(){
2059
2060			SEMICOLON.header.menufunctions();
2061			SEMICOLON.header.fullWidthMenu();
2062			SEMICOLON.header.stickyMenu();
2063			SEMICOLON.header.logo();
2064			SEMICOLON.initialize.dataResponsiveHeights();
2065			SEMICOLON.initialize.stickFooterOnSmall();
2066			SEMICOLON.slider.sliderDimensions();
2067			SEMICOLON.slider.sliderParallax();
2068			SEMICOLON.widget.html5Video();
2069			SEMICOLON.widget.masonryThumbs();
2070			SEMICOLON.initialize.dataResponsiveClasses();
2071			SEMICOLON.customization.onResize();
2072
2073			windowWidth = $window.width();
2074
2075			$(window).trigger( 'scwWindowResize' );
2076
2077		}
2078
2079	};
2080
2081	SEMICOLON.documentOnReady = {
2082
2083		init: function(){
2084			SEMICOLON.initialize.init();
2085			SEMICOLON.header.init();
2086			if( $slider.length > 0 || $sliderElement.length > 0 ) { SEMICOLON.slider.init(); }
2087			if( $portfolio.length > 0 ) { SEMICOLON.portfolio.init(); }
2088			SEMICOLON.widget.init();
2089			SEMICOLON.documentOnReady.windowscroll();
2090			SEMICOLON.customization.onReady();
2091		},
2092
2093		windowscroll: function(){
2094
2095			if( $header.length > 0 ) {
2096				headerOffset = $header.offset().top;
2097				$headerWrap.addClass('position-absolute');
2098				headerWrapOffset = $headerWrap.offset().top;
2099				$headerWrap.removeClass('position-absolute');
2100			}
2101
2102			let headerDefinedOffset = $header.attr('data-sticky-offset');
2103			if( typeof headerDefinedOffset !== 'undefined' ) {
2104				if( headerDefinedOffset == 'full' ) {
2105					headerWrapOffset = $window.height();
2106					let headerOffsetNegative = $header.attr('data-sticky-offset-negative');
2107					if( typeof headerOffsetNegative !== 'undefined' ) {
2108						headerWrapOffset = headerWrapOffset - headerOffsetNegative - 1;
2109					}
2110				} else {
2111					headerWrapOffset = Number(headerDefinedOffset);
2112				}
2113			} else {
2114				if( headerWrapOffset === 'undefined' ) {
2115					headerWrapOffset = headerOffset;
2116				}
2117			}
2118
2119			let pageMenuWrap	= $pagemenu.find('#page-menu-wrap'),
2120				offset			= $headerWrap.outerHeight(),
2121				head			= document.head || document.getElementsByTagName('head')[0],
2122				style			= document.createElement('style'),
2123				css;
2124
2125			if( $pagemenu.length > 0 ) {
2126				$pageMenuClone.css({ 'height': $pagemenu.find('#page-menu-wrap').outerHeight() });
2127				setTimeout( function(){
2128					if( $header.length > 0 && !$header.hasClass('no-sticky') ) {
2129						if( $body.hasClass('device-xl') || $body.hasClass('device-lg') || mobileSticky == 'true' ) {
2130							pageMenuOffset = $pagemenu.offset().top - $headerWrap.outerHeight();
2131							head.appendChild(style);
2132							css = '#page-menu.sticky-page-menu:not(.dots-menu) #page-menu-wrap { top: '+ offset +'px; }';
2133
2134							style.type = 'text/css';
2135							style.appendChild(document.createTextNode(css));
2136						} else {
2137							pageMenuOffset = $pagemenu.offset().top;
2138						}
2139					} else {
2140						pageMenuOffset = $pagemenu.offset().top;
2141					}
2142				}, 1000);
2143			}
2144
2145			SEMICOLON.header.stickyMenu( headerWrapOffset );
2146			SEMICOLON.header.stickyPageMenu( pageMenuOffset );
2147
2148			window.addEventListener( 'scroll', function(){
2149
2150				SEMICOLON.initialize.goToTopScroll();
2151				$('body.open-header.close-header-on-scroll').removeClass("side-header-open");
2152				SEMICOLON.header.stickyMenu( headerWrapOffset );
2153				SEMICOLON.header.stickyPageMenu( pageMenuOffset );
2154				SEMICOLON.header.logo();
2155
2156			}, { passive: true });
2157
2158			window.addEventListener( 'DOMContentLoaded', onScrollSliderParallax, false );
2159
2160			$window.scrollEnd( function(){
2161				let headerHeight = $headerWrap.outerHeight();
2162				if( $pagemenu.length > 0 && $header.length > 0 && !$header.hasClass('no-sticky') ) {
2163					if( $body.hasClass('device-xl') || $body.hasClass('device-lg') ) {
2164						$pagemenu.filter('.sticky-page-menu:not(.dots-menu,.no-sticky)').find( $pageMenuWrap ).css({ 'top': headerHeight +'px' });
2165					}
2166				}
2167			}, 500 );
2168
2169		}
2170
2171	};
2172
2173	SEMICOLON.documentOnLoad = {
2174
2175		init: function(){
2176			SEMICOLON.slider.swiperSliderMenu(true);
2177			SEMICOLON.slider.revolutionSliderMenu(true);
2178			SEMICOLON.initialize.stickFooterOnSmall();
2179			SEMICOLON.widget.gridInit();
2180			let isoCheckInt = setInterval( function(){
2181				if( 'pluginIsotopeReady' in scwEvents ) {
2182					SEMICOLON.widget.filterInit();
2183					SEMICOLON.widget.masonryThumbs();
2184					clearInterval( isoCheckInt );
2185				}
2186			}, 1000 );
2187			SEMICOLON.widget.parallax();
2188			SEMICOLON.widget.loadFlexSlider();
2189			SEMICOLON.widget.html5Video();
2190			SEMICOLON.widget.ticker();
2191			SEMICOLON.header.responsiveMenuClass();
2192			SEMICOLON.initialize.modal();
2193			SEMICOLON.customization.onLoad();
2194
2195		}
2196
2197	};
2198
2199	let $window = $(window),
2200		windowScrT,
2201		$body = $('body'),
2202		$wrapper = $('#wrapper'),
2203		$header = $('#header'),
2204		$headerWrap = $('#header-wrap'),
2205		$headerInc = $('.include-header'),
2206		defLogoH	= $header.attr('data-logo-height') || 140,
2207		stickyLogoH = $header.attr('data-sticky-logo-height') || 60,
2208		mobileSticky = $header.attr('data-mobile-sticky') || 'false',
2209		mobileLogoH = $header.attr('data-mobile-logo-height') || Number( defLogoH ),
2210		mobileStickyLogoH = $header.attr('data-mobile-sticky-logo-height') || Number( stickyLogoH ),
2211		defMenuP	= $header.attr('data-menu-padding') || 39,
2212		stickyMenuP = $header.attr('data-sticky-menu-padding') || 19,
2213		headerSizeCustom = !$header.hasClass('header-size-lg') && !$header.hasClass('header-size-md') && !$header.hasClass('header-size-sm') && !$header.hasClass('header-size-custom'),
2214		stickyShrink = $header.attr('data-sticky-shrink') || 'true',
2215		stickyShrinkOffset = $header.attr('data-sticky-shrink-offset') || 300,
2216		primaryMenu = $('.primary-menu'),
2217		primaryMenuMainItems = primaryMenu.find('.menu-container:not(mobile-primary-menu):not(.custom-spacing)').children('.menu-item').children('.menu-link'),
2218		$headerWrapClone = '',
2219		initialHeaderWrapHeight = $headerWrap.outerHeight(),
2220		$headerRow = $headerWrap.find('.header-row:eq(0)'),
2221		$content = $('#content'),
2222		$footer = $('#footer'),
2223		windowWidth = $window.width(),
2224		oldHeaderClasses = $header.attr('class'),
2225		oldHeaderWrapClasses = $headerWrap.attr('class'),
2226		stickyMenuClasses = $header.attr('data-sticky-class'),
2227		responsiveMenuClasses = $header.attr('data-responsive-class'),
2228		logo = $('#logo'),
2229		defaultLogo = logo.find('.standard-logo'),
2230		defaultLogoWidth = defaultLogo.find('img').outerWidth(),
2231		retinaLogo = logo.find('.retina-logo'),
2232		defaultLogoImg = defaultLogo.find('img').attr('src'),
2233		retinaLogoImg = retinaLogo.find('img').attr('src'),
2234		defaultDarkLogo = defaultLogo.attr('data-dark-logo'),
2235		retinaDarkLogo = retinaLogo.attr('data-dark-logo'),
2236		defaultStickyLogo = defaultLogo.attr('data-sticky-logo'),
2237		retinaStickyLogo = retinaLogo.attr('data-sticky-logo'),
2238		defaultMobileLogo = defaultLogo.attr('data-mobile-logo'),
2239		retinaMobileLogo = retinaLogo.attr('data-mobile-logo'),
2240		topSearchTimeOut,
2241		$pagemenu = $('#page-menu'),
2242		$pageMenuClone = '',
2243		$pageMenuWrap = $pagemenu.find('#page-menu-wrap'),
2244		$onePageMenuEl = $('.one-page-menu'),
2245		$portfolio = $('.portfolio'),
2246		$shop = $('.shop'),
2247		$slider = $('#slider'),
2248		$sliderParallaxEl = $('.slider-parallax'),
2249		$sliderElement = $('.slider-element'),
2250		swiperSlider = '',
2251		$pageTitle = $('#page-title'),
2252		$topSearch = $('.top-search-form'),
2253		$topCart = $('#top-cart'),
2254		$topSocialEl = $('#top-social').find('li'),
2255		$goToTopEl = $('#gotoTop'),
2256		googleMapsAPI = 'YOUR-API-KEY',
2257		xScrollPosition,
2258		yScrollPosition,
2259		sliderParallaxEl = document.querySelector('.slider-parallax'),
2260		sliderParallaxElCaption = document.querySelector('.slider-parallax .slider-caption'),
2261		sliderParallaxElInner = document.querySelector('.slider-inner'),
2262		initHeaderHeight,
2263		headerOffset = 0,
2264		headerWrapOffset = 0,
2265		pageMenuOffset = 0,
2266		resizeTimer;
2267
2268	$(document).ready( SEMICOLON.documentOnReady.init );
2269
2270	$window.on( 'load', SEMICOLON.documentOnLoad.init );
2271
2272	$window.on( 'resize', function() {
2273		let thisWindow = $(this);
2274		clearTimeout(resizeTimer);
2275		resizeTimer = setTimeout(function() {
2276			if ( thisWindow.width() !== windowWidth ) {
2277				SEMICOLON.documentOnResize.init();
2278			}
2279		}, 250);
2280	});
2281
2282})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.