PageSourceSearch

https://mesi40-summit.com/wp-content/plugins/grandconference-elementor/assets/js/grandconference-elementor.js

js mesi40-summit.com collected 2026-10-05 08:12:58 UTC 245,738 bytes, 7,519 lines download raw bytes

1function isTouchDevice() {
2  return 'ontouchstart' in window // works on most browsers 
3      || 'onmsgesturechange' in window; // works on ie10
4}
5
6function isMobileDevice() {
7    return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
8};
9
10jQuery.fn.isInViewport = function() {
11	var elementTop = jQuery(this).offset().top;
12	var elementBottom = elementTop + jQuery(this).outerHeight();
13
14	var viewportTop = jQuery(window).scrollTop();
15	var viewportBottom = viewportTop + jQuery(window).height();
16
17	return elementBottom > viewportTop && elementTop < viewportBottom;
18};
19
20( function( $ ) {
21	// Make sure you run this code under Elementor..
22	$( window ).on( 'elementor/frontend/init', function() {
23		
24		//Add link to mini cart
25		jQuery('.grandconference-cart-mini-cart-link').on( 'click', function(){
26			if(jQuery('#woocommerce-mini-cart-wrapper').length) {
27				setTimeout(function () { jQuery('#woocommerce-mini-cart-wrapper').addClass('visible'); }, 10);
28			}
29			
30			return false;
31		});
32		
33		//Touch devices hack for firing first event
34	    var isTouch = ('ontouchstart' in document.documentElement);
35	    if ( isTouch ) {
36		    jQuery('#footer-wrapper').css('overflow-x', 'hidden');
37		}
38		
39		jQuery("img.lazy").each(function() {
40			var currentImg = jQuery(this);
41			
42			jQuery(this).Lazy({
43				onFinishedAll: function() {
44					currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
45					currentImg.parent('.grandconference_gallery_lightbox').parent("div.gallery-grid-item").removeClass("lazy");
46		        }
47			});
48		});
49		
50		//Apply all entrance animation
51		jQuery('#page-content-wrapper .elementor-widget-image.animation').each(function() {
52			jQuery(this).smoove({
53				offset : '30%'
54			});
55		});
56		
57		var bodyBGColor = jQuery('body').css('background-color');
58		if(bodyBGColor != '')
59		{
60			jQuery('#wrapper').css('background-color', bodyBGColor);
61		}
62		
63		//Calculated min height section dynamically for mobile
64		if(parseInt(jQuery(window).width()) < 501)
65		{
66			jQuery("section.elementor-section-height-min-height .elementor-container").each(function() {
67				jQuery(this).height('auto');
68			});
69		}
70		
71		jQuery(window).resize(function() {
72			jQuery("section.elementor-section-height-min-height .elementor-container").each(function() {
73				var currentSection = jQuery(this);
74				
75				if(parseInt(jQuery(window).width()) < 501)
76				{
77					currentSection.height('auto');
78				}
79				else
80				{
81					currentSection.height('');
82				}
83			});
84		});
85		
86		elementorFrontend.hooks.addAction('frontend/element_ready/global', function( $scope ) {
87			
88			if(elementorFrontend.isEditMode())
89			{
90				var elementSettings = {};
91				var modelCID 		= $scope.data( 'model-cid' );
92					
93				var settings 		= elementorFrontend.config.elements.data[ modelCID ];
94				if(typeof settings != 'undefined')
95				{
96					var type 			= settings.attributes.widgetType || settings.attributes.elType,
97						settingsKeys 	= elementorFrontend.config.elements.keys[ type ];
98			
99					if ( ! settingsKeys ) {
100						settingsKeys = elementorFrontend.config.elements.keys[type] = [];
101			
102						jQuery.each( settings.controls, function ( name, control ) {
103							if ( control.frontend_available ) {
104								settingsKeys.push( name );
105							}
106						});
107					}
108			
109					jQuery.each( settings.getActiveControls(), function( controlKey ) {
110						if ( -1 !== settingsKeys.indexOf( controlKey ) ) {
111							elementSettings[ controlKey ] = settings.attributes[ controlKey ];
112						}
113					} );
114		
115					var widgetExt = elementSettings;
116				}
117			}
118			else
119			{
120				//Get widget settings data
121				var widgetExtObj = $scope.attr('data-settings');
122				
123				if(typeof widgetExtObj != 'undefined')
124				{
125					var widgetExt = JSON.parse(widgetExtObj);
126				}
127			}
128			
129			if(typeof widgetExt != 'undefined')
130			{
131				//Begin background image parallax scrolling
132				if(typeof widgetExt.grandconference_ext_is_background_parallax != 'undefined' && widgetExt.grandconference_ext_is_background_parallax == 'true')
133				{
134					if(typeof widgetExt.background_background != 'undefined' && widgetExt.background_background == 'classic')
135					{
136						//If not edit in Elementor for better performance
137						if(!elementorFrontend.isEditMode())
138						{
139							var widgetBg = 	$scope.css('background-image');
140							widgetBg = widgetBg.replace('url(','').replace(')','').replace(/\"/gi, "");
141							
142							//parallaxator
143							/*$scope.addClass('parallaxator');
144							$scope.append('<img class="parallax_child" src="'+widgetBg+'" data-parallaxator-reverse="true"/>');*/
145							
146							if(widgetBg != '')
147							{
148								var jarallaxScrollSpeed = 0.5;
149								if(typeof widgetExt.grandconference_ext_is_background_parallax_speed.size != 'undefined')
150								{
151									jarallaxScrollSpeed = parseFloat(widgetExt.grandconference_ext_is_background_parallax_speed.size);
152								}
153								
154								//Jarallax
155								$scope.addClass('jarallax');
156								$scope.append('<img class="jarallax-img" src="'+widgetBg+'"/>');
157								
158								$scope.jarallax({
159								    speed: jarallaxScrollSpeed
160								});
161								
162								if(!isMobileDevice())
163								{
164									$scope.css('background-image', 'none');
165								}
166								
167								jQuery(window).resize(function() {
168									if(!isMobileDevice())
169									{
170										$scope.css('background-image', 'none');
171									}
172									else
173									{
174										$scope.css('background-image', 'url('+widgetBg+')');
175									}
176								});
177							}
178						}
179					}
180				}
181				
182				if(typeof widgetExt.grandconference_ext_is_fadeout_animation != 'undefined' && widgetExt.grandconference_ext_is_fadeout_animation == 'true')
183				{
184					var scrollVelocity = parseFloat(widgetExt.grandconference_ext_is_fadeout_animation_velocity.size);
185					var scrollDirection = widgetExt.grandconference_ext_is_fadeout_animation_direction; 
186
187					jQuery(window).scroll(function(i){
188						var scrollVar = jQuery(window).scrollTop();
189						var scrollPx = -(scrollVelocity*scrollVar);
190						
191						if(scrollDirection == 'up')
192						{
193						 scrollPx = -(scrollVelocity*scrollVar);
194						}
195						else if(scrollDirection == 'down')
196						{
197						 scrollPx = scrollVelocity*scrollVar;
198						}
199						else
200						{
201						    scrollPx = 0;
202						}
203						
204						//console.log(scrollVelocity);
205						$scope.find('.elementor-widget-container').css({'transform': "translateY("+scrollPx+"px)" });
206						$scope.find('.elementor-widget-container').css({'opacity':( 100-(scrollVar/4) )/100});
207					})
208				}
209					
210				
211				//Begin scroll animation extensions
212				if(typeof widgetExt.grandconference_ext_is_scrollme != 'undefined' && widgetExt.grandconference_ext_is_scrollme == 'true')
213				{	
214					var scrollArgs = {};
215					
216					if(typeof widgetExt.grandconference_ext_scrollme_scalex.size != 'undefined' && widgetExt.grandconference_ext_scrollme_scalex.size != 1)
217					{
218						scrollArgs['scaleX'] = widgetExt.grandconference_ext_scrollme_scalex.size;
219					}
220					
221					if(typeof widgetExt.grandconference_ext_scrollme_scaley.size != 'undefined' && widgetExt.grandconference_ext_scrollme_scaley.size != 1)
222					{
223						scrollArgs['scaleY'] = widgetExt.grandconference_ext_scrollme_scaley.size;
224					}
225					
226					if(typeof widgetExt.grandconference_ext_scrollme_scalez.size != 'undefined' && widgetExt.grandconference_ext_scrollme_scalez.size != 1)
227					{
228						scrollArgs['scaleZ'] = widgetExt.grandconference_ext_scrollme_scalez.size;
229					}
230					
231					if(typeof widgetExt.grandconference_ext_scrollme_rotatex.size != 'undefined' && widgetExt.grandconference_ext_scrollme_rotatex.size != 0)
232					{
233						scrollArgs['rotateX'] = widgetExt.grandconference_ext_scrollme_rotatex.size;
234					}
235					
236					if(typeof widgetExt.grandconference_ext_scrollme_rotatey.size != 'undefined' && widgetExt.grandconference_ext_scrollme_rotatey.size != 0)
237					{
238						scrollArgs['rotateY'] = widgetExt.grandconference_ext_scrollme_rotatey.size;
239					}
240					
241					if(typeof widgetExt.grandconference_ext_scrollme_rotatez.size != 'undefined' && widgetExt.grandconference_ext_scrollme_rotatez.size != 0)
242					{
243						scrollArgs['rotateY'] = widgetExt.grandconference_ext_scrollme_rotatez.size;
244					}
245					
246					if(typeof widgetExt.grandconference_ext_scrollme_translatex.size != 'undefined' && widgetExt.grandconference_ext_scrollme_translatex.size != 0)
247					{
248						scrollArgs['x'] = widgetExt.grandconference_ext_scrollme_translatex.size;
249					}
250					
251					if(typeof widgetExt.grandconference_ext_scrollme_translatey.size != 'undefined' && widgetExt.grandconference_ext_scrollme_translatey.size != 0)
252					{
253						scrollArgs['y'] = widgetExt.grandconference_ext_scrollme_translatey.size;
254					}
255					
256					if(typeof widgetExt.grandconference_ext_scrollme_translatez.size != 'undefined' && widgetExt.grandconference_ext_scrollme_translatez.size != 0)
257					{
258						scrollArgs['z'] = widgetExt.grandconference_ext_scrollme_translatez.size;
259					}
260					
261					if(typeof widgetExt.grandconference_ext_scrollme_smoothness.size != 'undefined')
262					{
263						scrollArgs['smoothness'] = widgetExt.grandconference_ext_scrollme_smoothness.size;
264					}
265					
266					//scrollArgs['duration'] =  150;
267					
268					$scope.attr('data-parallax', JSON.stringify(scrollArgs));
269					
270					if(typeof widgetExt.grandconference_ext_scrollme_disable != 'undefined')
271					{
272						if(widgetExt.grandconference_ext_scrollme_disable == 'mobile')
273						{
274							if(parseInt(jQuery(window).width()) < 501)
275							{
276								$scope.addClass('noanimation');
277							}
278						}
279						
280						if(widgetExt.grandconference_ext_scrollme_disable == 'tablet')
281						{
282							if(parseInt(jQuery(window).width()) < 769)
283							{
284								$scope.addClass('noanimation');
285							}
286						}
287						
288						jQuery(window).resize(function() {
289							if(widgetExt.grandconference_ext_scrollme_disable == 'mobile')
290							{
291								if(isMobileDevice() || parseInt(jQuery(window).width()) < 501)
292								{
293									$scope.addClass('noanimation');
294								}
295								else
296								{
297									$scope.removeClass('noanimation');
298								}
299							}
300							
301							if(widgetExt.grandconference_ext_scrollme_disable == 'tablet')
302							{
303								if(parseInt(jQuery(window).width()) < 769)
304								{
305									$scope.addClass('noanimation');
306								}
307								else
308								{
309									$scope.removeClass('noanimation');
310								}
311							}
312						});
313					}
314				}
315				//End scroll animation extensions
316				
317				//Begin entrance animation extensions
318				if(typeof widgetExt.grandconference_ext_is_smoove != 'undefined' && widgetExt.grandconference_ext_is_smoove == 'true')
319				{				
320					$scope.addClass('init-smoove');
321					
322					$scope.smoove({
323						min_width : parseInt(widgetExt.grandconference_ext_smoove_disable),
324						
325						scaleX   : widgetExt.grandconference_ext_smoove_scalex.size,
326					    scaleY   : widgetExt.grandconference_ext_smoove_scaley.size,
327					    
328					    rotateX   : parseInt(widgetExt.grandconference_ext_smoove_rotatex.size)+'deg',
329					    rotateY   : parseInt(widgetExt.grandconference_ext_smoove_rotatey.size)+'deg',
330					    rotateZ   : parseInt(widgetExt.grandconference_ext_smoove_rotatez.size)+'deg',
331					    
332					    moveX   : parseInt(widgetExt.grandconference_ext_smoove_translatex.size)+'px',
333					    moveY   : parseInt(widgetExt.grandconference_ext_smoove_translatey.size)+'px',
334					    moveZ   : parseInt(widgetExt.grandconference_ext_smoove_translatez.size)+'px',
335					    
336					    skewX   : parseInt(widgetExt.grandconference_ext_smoove_skewx.size)+'deg',
337					    skewY   : parseInt(widgetExt.grandconference_ext_smoove_skewy.size)+'deg',
338					    
339					    perspective :  parseInt(widgetExt.grandconference_ext_smoove_perspective.size),
340						transformOrigin :  parseInt(widgetExt.grandconference_ext_smoove_transform_originy.size)+'% '+parseInt(widgetExt.grandconference_ext_smoove_transform_originx.size)+'%',
341					    
342					    offset : '-5%',
343					});
344		
345					if(typeof widgetExt.grandconference_ext_smoove_duration != 'undefined')
346					{
347						$scope.css('transition-duration', parseInt(widgetExt.grandconference_ext_smoove_duration)+'ms');
348					}
349					
350					var width = jQuery(window).width();
351					if (widgetExt.grandconference_ext_smoove_disable >= width) {
352					   if(!$scope.hasClass('smooved'))
353					   {
354					       $scope.addClass('no-smooved');
355					   }
356				       
357				       return false;
358				   }
359				   
360				   setTimeout(function(){ 
361					   window.scrollTo(window.scrollX, window.scrollY + 1);
362					   
363					   if(!jQuery('body').hasClass('elementor-editor-active')) {
364					   		window.scrollTo(window.scrollX, 0);
365					   }
366				   }, 1000);
367				   
368				}
369				//End entrance animation extensions
370				
371				
372				//Begin mouse parallax extensions
373				if(typeof widgetExt.grandconference_ext_is_parallax_mouse != 'undefined' && widgetExt.grandconference_ext_is_parallax_mouse == 'true')
374				{	
375					var elementID = $scope.attr('data-id');
376					$scope.find('.elementor-widget-container').attr('data-depth', parseFloat(widgetExt.grandconference_ext_is_parallax_mouse_depth.size));
377					$scope.attr('ID', 'parallax-'+elementID);
378		
379					var parentElement = document.getElementById('parallax-'+elementID);
380					var parallax = new Parallax(parentElement, {
381						relativeInput: true
382					});
383					
384					if(elementorFrontend.isEditMode())
385					{
386						if($scope.width() == 0)
387						{
388							$scope.css('width', '100%');
389						}
390						
391						if($scope.height() == 0)
392						{
393							$scope.css('height', '100%');
394						}
395					}
396				}
397				//End mouse parallax extensions
398				
399				
400				//Begin infinite animation extensions
401				if(typeof widgetExt.grandconference_ext_is_infinite != 'undefined' && widgetExt.grandconference_ext_is_infinite == 'true')
402				{
403					var animationClass = '';
404					var keyframeName = '';
405					var animationCSS = '';
406					
407					if(typeof widgetExt.grandconference_ext_infinite_animation != 'undefined')
408					{
409						animationClass = widgetExt.grandconference_ext_infinite_animation;
410						
411						switch(animationClass) {
412						  	case 'if_swing1':
413						    	keyframeName = 'swing';
414						    break;
415						    
416						    case 'if_swing2':
417						    	keyframeName = 'swing2';
418						    break;
419						    
420						    case 'if_wave':
421						    	keyframeName = 'wave';
422						    break;
423						    
424						    case 'if_tilt':
425						    	keyframeName = 'tilt';
426						    break;
427						    
428						    case 'if_bounce':
429						    	keyframeName = 'bounce';
430						    break;
431						    
432						    case 'if_scale':
433						    	keyframeName = 'scale';
434						    break;
435						    
436						    case 'if_spin':
437						    	keyframeName = 'spin';
438						    break;
439						}
440						
441						animationCSS+= keyframeName+' ';
442					}
443					//alert(widgetExt.grandconference_ext_infinite_duration);
444					if(typeof widgetExt.grandconference_ext_infinite_duration != 'undefined')
445					{
446						animationCSS+= widgetExt.grandconference_ext_infinite_duration+'s ';
447					}
448					
449					animationCSS+= 'infinite alternate ';
450					
451					if(typeof widgetExt.grandconference_ext_infinite_easing != 'undefined')
452					{
453						animationCSS+= 'cubic-bezier('+widgetExt.grandconference_ext_infinite_easing+')';
454					}
455					//alert(animationCSS);
456					$scope.css({
457						'animation' : animationCSS,
458					});
459					$scope.addClass(animationClass);
460				}
461				//End infinite animation extensions
462				
463				//Begin link to side menu extensions
464				if(typeof widgetExt.grandconference_ext_link_sidemenu != 'undefined' && widgetExt.grandconference_ext_link_sidemenu == 'true')
465				{
466					var overlayEffect = jQuery('#tg_sidemenu_overlay_effect').val();
467					
468					$scope.on( 'click', function(e) {
469						//console.log('side menu clicked');
470						e.preventDefault();
471						
472						jQuery('body').toggleClass('js_nav');
473						jQuery('body').toggleClass(overlayEffect);
474						jQuery('#close_mobile_menu').addClass('open');
475						
476						if(is_touch_device())
477						{
478							jQuery('body.js_nav').css('overflow', 'auto');
479						}
480					});
481				}
482				
483				//Begin link to fullscreen menu extensions
484				if(typeof widgetExt.grandconference_ext_link_fullmenu != 'undefined' && widgetExt.grandconference_ext_link_fullmenu == 'true')
485				{
486					var canvas = document.createElement("canvas");
487		  
488					// Width and height of canvas can
489					// be varied depending on the
490					// size of icon
491					canvas.width = 30;
492					canvas.height = 28;
493		  
494					// Set interval for allowing the
495					// font awesome icon to load
496					setInterval(() => {
497						var ctx = canvas.getContext("2d");
498		  
499						// Setting the color of the icon
500						ctx.fillStyle = "#ffffff";
501		  
502						// Set size of cursor
503						ctx.font = '900 28px "Font Awesome 5 Free"';
504		  
505						// '\uf0f9' is the unicode of
506						// the font awesome icon
507						ctx.fillText("\uf00d", 0, 20);
508		  
509						// Converting the canvas to image
510						var dataURL = canvas.toDataURL("image/png");
511		  
512						// Setting the cursor property
513						// to the image created
514						jQuery(".fullmenu-wrapper").css(
515							"cursor", "url(" + dataURL + "), auto");
516					}, 1000);
517					
518					$scope.addClass('fullmenu-button');
519					
520					$scope.on( 'click', function(e) {
521						e.preventDefault();
522						
523						//jQuery('body,html').animate({scrollTop:0},100);
524						jQuery('body').toggleClass('fullmenu-active').trigger('classChange');
525						jQuery('.fullmenu-wrapper').toggleClass('fullmenu-wrapper-active');
526					});
527					
528					jQuery('.fullmenu-wrapper').on( 'click', function(e) {
529						jQuery('body').removeClass('fullmenu-active').trigger('classChange');
530						jQuery('.fullmenu-wrapper').removeClass('fullmenu-wrapper-active');
531					});
532				}
533				
534				//Begin sticky element extensions
535				if(typeof widgetExt.grandconference_ext_is_sticky != 'undefined' && widgetExt.grandconference_ext_is_sticky == 'true')
536				{
537					var stickyElement = $scope.children('.elementor-widget-wrap');
538					var topSpacing = 100;
539					if(typeof widgetExt.grandconference_ext_sticky_top_spacing != 'undefined')
540					{
541						topSpacing = parseInt(widgetExt.grandconference_ext_sticky_top_spacing.size);
542					}
543					
544					stickyElement.stickySidebar({ 
545						topSpacing: topSpacing
546					});
547					
548					if(jQuery(window).width() < 768 || is_touch_device())
549					{
550						stickyElement.destroy();
551					}
552				}
553				
554				//Begin background on change extensions
555				if(typeof widgetExt.grandconference_ext_is_background_on_scroll != 'undefined' && widgetExt.grandconference_ext_is_background_on_scroll == 'true')
556				{	
557					var bodyBackground = jQuery('body').css('background-color');
558					var position = jQuery(window).scrollTop();
559					
560					jQuery(window).on("scroll touchmove", function() {
561						clearTimeout($.data(this, 'scrollTimer'));
562						$.data(this, 'scrollTimer', setTimeout(function() {
563							jQuery('body').attr('data-scrollend', jQuery(window).scrollTop());
564						}, 250));
565						
566						var scroll = jQuery(window).scrollTop();
567						var position = jQuery('body').attr('data-scrollend');
568						var windowHeight = jQuery(window).height();
569						var windowHeightOffset = parseInt(windowHeight/2);
570						var elementTop = $scope.position().top - windowHeightOffset;
571						var elementBottom = elementTop + $scope.outerHeight(true);
572						
573						/*console.log('document scroll top: '+jQuery(document).scrollTop());
574						console.log('element top: '+elementTop);
575						console.log('element bottom: '+elementBottom);*/
576						
577						if (scroll > position) { 
578							//console.log('scroll down');
579							
580							//Scroll down
581							if (jQuery(document).scrollTop() >= elementTop && jQuery(document).scrollTop() <= elementBottom) {
582								//jQuery('body').css('background-color', widgetExt.grandconference_ext_background_on_scroll_color);
583								jQuery('#wrapper').css('background-color', widgetExt.grandconference_ext_background_on_scroll_color);
584							}
585							
586							if (jQuery(document).scrollTop() > elementBottom) {
587								//jQuery('body').css('background-color', bodyBackground);
588								jQuery('#wrapper').css('background-color', bodyBackgroun
588d);
589							}
590						
591						} else {
592							/*console.log('scroll up');
593							console.log('document scroll top: '+jQuery(document).scrollTop());
594							console.log('element top: '+$scope.position().top);
595							console.log('element bottom: '+elementBottom);*/
596							
597							//Scroll up	
598							if (jQuery(document).scrollTop() <= elementBottom && jQuery(document).scrollTop() >= elementTop) {
599								clearTimeout($.data(this, 'scrollTimer2'));
600								$.data(this, 'scrollTimer2', setTimeout(function() {
601									jQuery('#wrapper').css('background-color', widgetExt.grandconference_ext_background_on_scroll_color).stop();
602								}, 250));
603								
604								/*setTimeout(function(){
605									//jQuery('body').css('background-color', widgetExt.grandconference_ext_background_on_scroll_color).stop();
606									jQuery('#wrapper').css('background-color', widgetExt.grandconference_ext_background_on_scroll_color).stop();
607								}, 100);*/
608							}
609							
610							if (jQuery(document).scrollTop() < $scope.position().top) {
611								//jQuery('body').css('background-color', bodyBackground);
612								jQuery('#wrapper').css('background-color', bodyBackground);
613							}
614						}
615					});
616				}
617				//End background on change extensions
618			}
619		});
620		
621		//Start execute javascript for blog posts
622		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-blog-posts.default', function( $scope ) {
623			jQuery(function( $ ) {
624				jQuery("img.lazy").each(function() {
625					var currentImg = jQuery(this);
626					
627					jQuery(this).Lazy({
628						onFinishedAll: function() {
629							currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
630				        },
631					});
632				});
633				
634				jQuery(".layout-masonry").each(function() {
635					var grid = jQuery(this);
636					
637					grid.imagesLoaded(function() {
638						grid.masonry({
639							itemSelector: ".blog-posts-masonry",
640							columnWidth: ".blog-posts-masonry",
641							gutter : 45
642						});
643						
644						jQuery(".layout-masonry .blog-posts-masonry").each(function(index) {
645						    setTimeout(function() {
646						      	jQuery(".layout-masonry .blog-posts-masonry").eq(index).addClass("is-showing");
647						    }, 250 * index);
648						 });
649					});
650					
651					jQuery(".layout-masonry img.lazy_masonry").each(function() {
652						var currentImg = jQuery(this);
653						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
654						
655						jQuery(this).Lazy({
656							onFinishedAll: function() {
657								grid.masonry({
658									itemSelector: ".blog-posts-masonry",
659									columnWidth: ".blog-posts-masonry",
660									gutter : 45
661								});
662					        },
663						});
664					});
665				});
666				
667				jQuery(".layout-metro_masonry").each(function() {
668					var grid = jQuery(this);
669					
670					grid.imagesLoaded(function() {
671						grid.masonry({
672							itemSelector: ".blog-posts-metro",
673							columnWidth: ".blog-posts-metro",
674							gutter : 40
675						});
676						
677						jQuery(".layout-metro_masonry .blog-posts-metro").each(function(index) {
678						    setTimeout(function() {
679						      	jQuery(".layout-metro_masonry .blog-posts-metro").eq(index).addClass("is-showing");
680						    }, 100 * index);
681						});
682					});
683					
684					jQuery(".post-metro-left-wrapper img.lazy_masonry, .layout-metro_masonry img.lazy_masonry").each(function() {
685						var currentImg = jQuery(this);
686						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
687						
688						jQuery(this).Lazy({
689							onFinishedAll: function() {
690								grid.masonry({
691									itemSelector: ".blog-posts-metro",
692									columnWidth: ".blog-posts-metro",
693									gutter : 40
694								});
695					        },
696						});
697					});
698				});
699				
700				var menuLayout = jQuery('#pp_menu_layout').val();
701				if(menuLayout != 'leftmenu')
702				{
703					var metroSticky = jQuery(".post-metro-left-wrapper").stickySidebar({ topSpacing: 120 });
704				}
705				else
706				{
707					var metroSticky = jQuery(".post-metro-left-wrapper").stickySidebar({ topSpacing: 40 });
708				}
709	
710				if(jQuery(window).width() <= 768 || isTouchDevice())
711				{
712					
713				}
714			});
715		} );
716		//End execute javascript for blog posts
717		
718		//Start execute javascript for gallery grid
719		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-grid.default', function( $scope ) {
720			jQuery("img.lazy").each(function() {
721				var currentImg = jQuery(this);
722				
723				jQuery(this).Lazy({
724					onFinishedAll: function() {
725						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
726						currentImg.parent('.grandconference_gallery_lightbox').parent("div.gallery-grid-item").removeClass("lazy");
727						currentImg.parent("div.gallery-grid-item").removeClass("lazy");
728			        }
729				});
730			});
731		} );
732		//End execute javascript for gallery grid
733		
734		//Start execute javascript for gallery masonry
735		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-masonry.default', function( $scope ) {
736			jQuery(function( $ ) {
737				jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry:not(.proofing-gallery)").each(function() {
738					var grid = jQuery(this);
739					var cols = grid.attr('data-cols');
740					
741					if(!grid.hasClass('has-no-space'))
742					{
743						var gutter = 30;
744						if(cols > 4)
745						{
746							gutter = 20;
747						}
748					}
749					else
750					{
751						gutter = 0;
752					}
753					
754					grid.imagesLoaded(function() {
755						grid.masonry({
756							itemSelector: ".gallery-grid-item",
757							columnWidth: ".gallery-grid-item",
758							gutter : gutter
759						});
760						
761						jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry .gallery-grid-item").each(function(index) {
762						    setTimeout(function() {
763						      	jQuery(".do-masonry .gallery-grid-item").eq(index).addClass("is-showing");
764						    }, 100 * index);
765						 });
766					});
767					
768					jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry img.lazy_masonry").each(function() {
769						var currentImg = jQuery(this);
770						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
771						
772						var cols = grid.attr('data-cols');
773						
774						if(!grid.hasClass('has-no-space'))
775						{
776							var gutter = 40;
777							if(cols > 4)
778							{
779								gutter = 30;
780							}
781						}
782						else
783						{
784							gutter = 0;
785						}
786						
787						jQuery(this).Lazy({
788							onFinishedAll: function() {
789								grid.masonry({
790									itemSelector: ".gallery-grid-item",
791									columnWidth: ".gallery-grid-item",
792									gutter : gutter
793								});
794					        },
795						});
796					});
797				});
798			});
799		} );
800		//End execute javascript for gallery masonry
801		
802		//Start execute javascript for gallery masonry
803		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-proofing.default', function( $scope ) {
804			jQuery(function( $ ) {
805				jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry.proofing-gallery").each(function() {
806					var grid = jQuery(this);
807					var cols = grid.attr('data-cols');
808					
809					if(!grid.hasClass('has-no-space'))
810					{
811						var gutter = 30;
812						if(cols > 4)
813						{
814							gutter = 20;
815						}
816					}
817					else
818					{
819						gutter = 0;
820					}
821					
822					grid.imagesLoaded(function() {
823						grid.masonry({
824							itemSelector: ".gallery-grid-item",
825							columnWidth: ".gallery-grid-item",
826							gutter : gutter
827						});
828						
829						jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry .gallery-grid-item").each(function(index) {
830							setTimeout(function() {
831								  jQuery(".do-masonry .gallery-grid-item").eq(index).addClass("is-showing");
832							}, 100 * index);
833						 });
834					});
835					
836					jQuery(".grandconference-gallery-grid-content-wrapper.do-masonry img.lazy_masonry").each(function() {
837						var currentImg = jQuery(this);
838						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
839						
840						var cols = grid.attr('data-cols');
841						
842						if(!grid.hasClass('has-no-space'))
843						{
844							var gutter = 40;
845							if(cols > 4)
846							{
847								gutter = 30;
848							}
849						}
850						else
851						{
852							gutter = 0;
853						}
854						
855						jQuery(this).Lazy({
856							onFinishedAll: function() {
857								grid.masonry({
858									itemSelector: ".gallery-grid-item",
859									columnWidth: ".gallery-grid-item",
860									gutter : gutter
861								});
862							},
863						});
864					});
865					
866					jQuery(document).ajaxStart(function() {
867						  jQuery('#gallery_proofing_status').val(1);
868					});
869					
870					jQuery(document).ajaxStop(function() {
871						  jQuery('#gallery_proofing_status').val(0);
872					});
873					
874					var galleryID = grid.attr('data-gallery-id');
875					var WPonce = jQuery('#themegoods_security_'+galleryID).val();
876					
877					var containderDiv = jQuery('#gallery-proofing-container-'+galleryID);
878					var selectedClass = "";
879					
880					containderDiv.find(".filter-tag-btn").on('click', function(){
881						containderDiv.find(".filter-tag-btn").removeClass("active");
882						jQuery(this).addClass("active");
883						selectedClass = jQuery(this).attr("data-rel"); 
884						
885						grid.fadeTo(100, 0);
886						grid.find(".gallery-grid-item").css({
887							opacity: 0,
888							display: 'none',
889							transform: 'scale(0.0)'
890						});
891						grid.find(".gallery-grid-item").not("."+selectedClass).fadeOut().removeClass('scale-anm');
892
893						setTimeout(function() {
894						  jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
895						  
896						  jQuery("."+selectedClass).css({
897							opacity: 1,
898							display: 'block',
899							transform: 'scale(1,1)'
900						  });
901						  
902						  grid.masonry('destroy');
903						  var $grid = grid.masonry({
904								itemSelector: ".gallery-grid-item.scale-anm",
905								columnWidth: ".gallery-grid-item.scale-anm",
906								gutter : gutter
907						  });
908						  
909						  $grid.masonry('reloadItems');
910						  
911						  setTimeout(function() {
912							  grid.fadeTo(300, 1);
913						  }, 500);
914	
915						}, 300);
916					});
917					
918					grid.find('.gallery-grid-approve').on('click', function(){
919						var imgID = jQuery(this).attr('data-image-id');
920						var mark = jQuery(this);
921						var markParent = mark.parent('.gallery-grid-actions').parent('.gallery-grid-item');
922						//console.log(markParent);
923						mark.addClass('disabled');
924						
925						if(jQuery('#gallery_proofing_status').val() == 0)
926						{
927							jQuery.ajax({
928								url: tgAjax.ajaxurl,
929								type:'POST',
930								data: 'action=grandconference_image_proofing&method=approve&gallery_id='+galleryID+'&image_id='+imgID+'&themegoods_security='+WPonce, 
931								error: function (xhr, ajaxOptions, thrownError) {
932									console.log(thrownError);
933								},
934								success:function(results) {
935									mark.addClass('hidden');
936									mark.removeClass('disabled');
937									markParent.addClass('approve');
938									markParent.removeClass('unapprove');
939									jQuery('#unapprove_'+imgID).removeClass('hidden');
940									
941									//console.log(results);
942								}
943							});
944						}
945					});
946					
947					grid.find('.gallery-grid-unapprove').on('click', function(){
948						var imgID = jQuery(this).attr('data-image-id');
949						var mark = jQuery(this);
950						var markParent = mark.parent('.gallery-grid-actions').parent('.gallery-grid-item');
951						//console.log(markParent);
952						mark.addClass('disabled');
953						
954						if(jQuery('#gallery_proofing_status').val() == 0)
955						{
956							jQuery.ajax({
957								url: tgAjax.ajaxurl,
958								type:'POST',
959								data: 'action=grandconference_image_proofing&method=unapprove&gallery_id='+galleryID+'&image_id='+imgID+'&themegoods_security='+WPonce, 
960								error: function (xhr, ajaxOptions, thrownError) {
961									console.log(thrownError);
962								},
963								success:function(results) {
964									mark.addClass('hidden');
965									mark.removeClass('disabled');
966									markParent.addClass('unapprove');
967									markParent.removeClass('approve');
968									jQuery('#approve_'+imgID).removeClass('hidden');
969									
970									//console.log(results);
971								}
972							});
973						}
974					});
975				});
976			});
977		} );
978		//End execute javascript for gallery proofing
979		
980		//Start execute javascript for gallery justified
981		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-justified.default', function( $scope ) {
982			jQuery(function( $ ) {
983				jQuery("img.lazy").each(function() {
984					var currentImg = jQuery(this);
985					
986					jQuery(this).Lazy({
987						onFinishedAll: function() {
988							currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
989				        }
990					});
991				});
992				
993				jQuery(".grandconference-gallery-grid-content-wrapper.do-justified").each(function() {
994					var grid = jQuery(this);
995					var rowHeight = grid.attr('data-row_height');
996					var margin = grid.attr('data-margin');
997					var justifyLastRow = grid.attr('data-justify_last_row');
998					var justifyLastRowStr = 'nojustify';
999					if(justifyLastRow == 'yes')
1000					{
1001						justifyLastRowStr = 'justify';
1002					}
1003					
1004					grid.imagesLoaded(function() {
1005						grid.justifiedGallery({
1006							rowHeight:  rowHeight,
1007							margins: margin,
1008							lastRow: justifyLastRowStr
1009						});
1010					});
1011				});
1012			});
1013		} );
1014		//End execute javascript for gallery justified
1015		
1016		//Start execute javascript for gallery fullscreen
1017		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-fullscreen.default', function( $scope ) {
1018			jQuery(function( $ ) {
1019				var slideshow = jQuery('.fullscreen-gallery');
1020				var autoPlay = slideshow.attr('data-autoplay');
1021				var autoPlayArr = false;
1022				if (typeof autoPlay != "undefined"){
1023					autoPlayArr = {
1024						delay: autoPlay
1025					};
1026				}
1027				
1028				var effect = slideshow.attr('data-effect');
1029				if (typeof effect == "undefined"){
1030					effect = 'slide';
1031				}
1032				
1033				var speed = slideshow.attr('data-speed');
1034				if (typeof speed == "undefined"){
1035					speed = 400;
1036				}
1037
1038				var galleryTop = new Swiper('.fullscreen-gallery', {
1039				   navigation: {
1040				      nextEl: '.swiper-button-next',
1041				      prevEl: '.swiper-button-prev',
1042				    },
1043				   spaceBetween: 0,
1044				   keyboardControl: true,
1045				   speed: parseInt(speed),
1046				   loop: true,
1047				   effect: effect,
1048				   grabCursor: true,
1049				   preloadImages: false,
1050				   lazy: {
1051				    loadPrevNext: true,
1052				  },
1053				  autoplay: autoPlayArr
1054				});
1055			});
1056		} );
1057		//End execute javascript for gallery fullscreen
1058		
1059		//Start execute javascript for vertical parallax
1060		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-vertical-parallax.default', function( $scope ) {
1061			jQuery(function( $ ) {
1062				jQuery('body').addClass('elementor-fullscreen');
1063				
1064				var ticking = false;
1065				var isFirefox = /Firefox/i.test(navigator.userAgent);
1066				var isIe = /MSIE/i.test(navigator.userAgent) || /Trident.*rv\:11\./i.test(navigator.userAgent);
1067				var scrollSensitivitySetting = 30;
1068				var slideDurationSetting =800;
1069				var currentSlideNumber = 0;
1070				var totalSlideNumber = jQuery('.parallax-slide-background').length;
1071				function parallaxScroll(evt) {
1072				    if (isFirefox) {
1073				        delta = evt.detail * -120;
1074				    } else if (isIe) {
1075				        delta = -evt.deltaY;
1076				    } else {
1077				        delta = evt.wheelDelta;
1078				    }
1079				    if (ticking != true) {
1080				        if (delta <= -scrollSensitivitySetting) {
1081				            ticking = true;
1082				            if (currentSlideNumber !== totalSlideNumber - 1) {
1083				                currentSlideNumber++;
1084				                nextItem();
1085				            }
1086				            slideDurationTimeout(slideDurationSetting);
1087				        }
1088				        if (delta >= scrollSensitivitySetting) {
1089				            ticking = true;
1090				            if (currentSlideNumber !== 0) {
1091				                currentSlideNumber--;
1092				            }
1093				            previousItem();
1094				            slideDurationTimeout(slideDurationSetting);
1095				        }
1096				    }
1097				}
1098				function slideDurationTimeout(slideDuration) {
1099				    setTimeout(function () {
1100				        ticking = false;
1101				    }, slideDuration);
1102				}
1103
1104				var mousewheelEvent = isFirefox ? 'DOMMouseScroll' : 'wheel';
1105				window.addEventListener(mousewheelEvent, parallaxScroll, false);
1106				function nextItem() {
1107				    var $previousSlide = jQuery('.parallax-slide-background').eq(currentSlideNumber - 1);
1108				    $previousSlide.css('transform', 'translate3d(0,-130vh,0)').find('.parallax-slide-content-wrapper').css('transform', 'translateY(40vh)');
1109				    currentSlideTransition();
1110				}
1111				function previousItem() {
1112				    var $previousSlide = jQuery('.parallax-slide-background').eq(currentSlideNumber + 1);
1113				    $previousSlide.css('transform', 'translate3d(0,30vh,0)').find('.parallax-slide-content-wrapper').css('transform', 'translateY(30vh)');
1114				    currentSlideTransition();
1115				}
1116				function currentSlideTransition() {
1117				    var $currentSlide = jQuery('.parallax-slide-background').eq(currentSlideNumber);
1118				    $currentSlide.css('transform', 'translate3d(0,-15vh,0)').find('.parallax-slide-content-wrapper').css('transform', 'translateY(15vh)');
1119				    ;
1120				}
1121				
1122				jQuery('body').on('touchmove', function(e){
1123				  e.preventDefault();
1124				  e.stopPropagation();
1125				  
1126				  return false;
1127				});
1128				
1129				var ts;
1130				jQuery(document).bind('touchstart', function (e){
1131				   ts = e.originalEvent.touches[0].clientY;
1132				});
1133				
1134				jQuery(document).bind('touchend', function (e){
1135				   var te = e.originalEvent.changedTouches[0].clientY;
1136				   if(ts > te+5){
1137				      if (currentSlideNumber !== totalSlideNumber - 1) {
1138				          currentSlideNumber++;
1139				          nextItem();
1140				      }
1141				      slideDurationTimeout(slideDurationSetting);
1142				   }else if(ts < te-5){
1143				      if (currentSlideNumber !== 0) {
1144				          currentSlideNumber--;
1145				      }
1146				      previousItem();
1147				      slideDurationTimeout(slideDurationSetting);
1148				   }
1149				});
1150			});
1151		} );
1152		//End execute javascript for gallery vertical parallax
1153		
1154		//Start execute javascript for gallery horizontal
1155		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-horizontal.default', function( $scope ) {
1156			jQuery('body').addClass('gallery-horizontal');
1157			
1158			jQuery(".horizontal-gallery-wrapper").each(function() {
1159				var $carousel = jQuery(this);
1160				var timer = $carousel.attr('data-autoplay');
1161				if(timer == 0)
1162				{
1163					timer = false;
1164				}
1165				
1166				var loop = $carousel.attr('data-loop');
1167				var navigation = $carousel.attr('data-navigation');
1168				if(navigation == 0)
1169				{
1170					navigation = false;
1171				}
1172				
1173				var pagination = $carousel.attr('data-pagination');
1174				if(pagination == 0)
1175				{
1176					pagination = false;
1177				}
1178				
1179				$carousel.flickity({
1180					cellSelector: '.horizontal-gallery-cell',
1181					percentPosition: false,
1182					imagesLoaded: true,
1183					selectedAttraction: 0.01,
1184					friction: 0.2,
1185					lazyLoad: 5,
1186					pauseAutoPlayOnHover: true,
1187					autoPlay: parseInt(timer),
1188					contain: true,
1189					prevNextButtons: navigation,
1190					pageDots: pagination
1191				});
1192				
1193				var parallax = $carousel.attr('data-parallax');
1194				if(parallax == 1)
1195				{
1196					var $imgs = $carousel.find('.horizontal-gallery-cell img');
1197	
1198					var docStyle = document.documentElement.style;
1199					var transformProp = typeof docStyle.transform == 'string' ?
1200					  'transform' : 'WebkitTransform';
1201	
1202					var flkty = $carousel.data('flickity');
1203					
1204					$carousel.on( 'scroll.flickity', function() {
1205					  flkty.slides.forEach( function( slide, i ) {
1206					    var img = $imgs[i];
1207					    var x = ( slide.target + flkty.x ) * -1/3;
1208					    img.style[ transformProp ] = 'translateX(' + x  + 'px)';
1209					  });
1210					});
1211				}
1212				
1213				var fullscreen = $carousel.attr('data-fullscreen');
1214				if(fullscreen != 0)
1215				{
1216					jQuery('body').addClass('elementor-fullscreen');
1217					
1218					//Get menu element height
1219					var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
1220					var documentHeight = jQuery(window).innerHeight();
1221					var sliderHeight = parseInt(documentHeight - menuHeight);
1222					
1223					$carousel.find('.horizontal-gallery-cell').css('height', sliderHeight+'px');
1224					$carousel.find('.horizontal-gallery-cell-img').css('height', sliderHeight+'px');
1225					$carousel.flickity('resize');
1226					
1227					jQuery( window ).resize(function() {
1228						var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
1229						var documentHeight = jQuery(window).innerHeight();
1230						var sliderHeight = parseInt(documentHeight - menuHeight);
1231						
1232						$carousel.find('.horizontal-gallery-cell').css('height', sliderHeight+'px');
1233						$carousel.find('.horizontal-gallery-cell-img').css('height', sliderHeight+'px');
1234						$carousel.flickity('resize');
1235					});
1236				}
1237			});
1238		} );
1239		//End execute javascript for gallery horizontal
1240		
1241		//Start execute javascript for slider horizontal
1242		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-horizontal.default', function( $scope ) {
1243			jQuery(".horizontal-slider-wrapper").each(function() {
1244				var $carousel = jQuery(this);
1245				var timer = $carousel.attr('data-autoplay');
1246				if(timer == 0)
1247				{
1248					timer = false;
1249				}
1250				
1251				var loop = $carousel.attr('data-loop');
1252				var navigation = $carousel.attr('data-navigation');
1253				if(navigation == 0)
1254				{
1255					navigation = false;
1256				}
1257				
1258				var pagination = $carousel.attr('data-pagination');
1259				if(pagination == 0)
1260				{
1261					pagination = false;
1262				}
1263				
1264				var horizonSlider = $carousel.flickity({
1265					percentPosition: false,
1266					imagesLoaded: true,
1267					pauseAutoPlayOnHover: true,
1268					autoPlay: parseInt(timer),
1269					contain: true,
1270					prevNextButtons: navigation,
1271					pageDots: pagination
1272				});
1273				
1274				var fullscreen = $carousel.attr('data-fullscreen');
1275				if(fullscreen != 0)
1276				{
1277					jQuery('body').addClass('elementor-fullscreen');
1278					
1279					//Get menu element height
1280					var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
1281					var documentHeight = jQuery(window).innerHeight();
1282					var sliderHeight = parseInt(documentHeight - menuHeight);
1283					
1284					$carousel.find('.horizontal-slider-cell').css('height', sliderHeight+'px');
1285					$carousel.flickity('resize');
1286					
1287					jQuery( window ).resize(function() {
1288						var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
1289						var documentHeight = jQuery(window).innerHeight();
1290						var sliderHeight = parseInt(documentHeight - menuHeight);
1291						
1292						$carousel.find('.horizontal-slider-cell').css('height', sliderHeight+'px');
1293						$carousel.flickity('resize');
1294					});
1295				}
1296			});
1297		} );
1298		//End execute javascript for slider horizontal
1299		
1300		//Start execute javascript for slider animated frame
1301		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-animated-frame.default', function( $scope ) {
1302			function debounce(func, wait, immediate) {
1303				var timeout;
1304				return function() {
1305					var context = this, args = arguments;
1306					var later = function() {
1307						timeout = null;
1308						if (!immediate) func.apply(context, args);
1309					};
1310					var callNow = immediate && !timeout;
1311					clearTimeout(timeout);
1312					timeout = setTimeout(later, wait);
1313					if (callNow) func.apply(context, args);
1314				};
1315		    };
1316		    
1317		    class Slideshow {
1318		        constructor(el) {
1319		            this.DOM = {};
1320		            this.DOM.el = el;
1321		            this.settings = {
1322		                animation: {
1323		                    slides: {
1324		                        duration: 600,
1325		                        easing: 'easeOutQuint'
1326		                    },
1327		                    shape: {
1328		                        duration: 300,
1329		                        easing: {in: 'easeOutQuint', out: 'easeOutQuad'}
1330		                    }
1331		                },
1332		                frameFill: slideshowFrameColor
1333		            }
1334		            this.init();
1335		        }
1336		        init() {
1337			        if(this.DOM.el)
1338			        {
1339		            	this.DOM.slides = Array.from(this.DOM.el.querySelectorAll('.slides > .slide'));
1340		            	this.slidesTotal = this.DOM.slides.length;
1341		            	this.DOM.nav = this.DOM.el.querySelector('.slidenav');
1342			            this.DOM.nextCtrl = this.DOM.nav.querySelector('.slidenav-item--next');
1343			            this.DOM.prevCtrl = this.DOM.nav.querySelector('.slidenav-item--prev');
1344			            this.current = 0;
1345			            this.createFrame(); 
1346			            this.initEvents();
1347		            }
1348		        }
1349		        createFrame() {
1350		            this.rect = this.DOM.el.getBoundingClientRect();
1351		            this.frameSize = this.rect.width/12;
1352		            this.paths = {
1353		                initial: this.calculatePath('initial'),
1354		                final: this.calculatePath('final')
1355		            };
1356		            this.DOM.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
1357		            this.DOM.svg.setAttribute('class', 'shape');
1358		            this.DOM.svg.setAttribute('width','100%');
1359		            this.DOM.svg.setAttribute('height','100%');
1360		            this.DOM.svg.setAttribute('viewbox',`0 0 ${this.rect.width} ${this.rect.height}`);
1361		            this.DOM.svg.innerHTML = `<path fill="${this.settings.frameFill}" d="${this.paths.initial}"/>`;
1362		            this.DOM.el.insertBefore(this.DOM.svg, this.DOM.nav);
1363		            this.DOM.shape = this.DOM.svg.querySelector('path');
1364		        }
1365		        updateFrame() {
1366		            this.paths.initial = this.calculatePath('initial');
1367		            this.paths.final = this.calculatePath('final');
1368		            this.DOM.svg.setAttribute('viewbox',`0 0 ${this.rect.width} ${this.rect.height}`);
1369		            this.DOM.shape.setAttribute('d', this.isAnimating ? this.paths.final : this.paths.initial);
1370		        }
1371		        calculatePath(path = 'initial') {
1372		            return path === 'initial' ?
1373		                    `M 0,0 0,${this.rect.height} ${this.rect.width},${this.rect.height} ${this.rect.width},0 0,0 Z M 0,0 ${this.rect.width},0 ${this.rect.width},${this.rect.height} 0,${this.rect.height} Z` :
1374		                    `M 0,0 0,${this.rect.height} ${this.rect.width},${this.rect.height} ${this.rect.width},0 0,0 Z M ${this.frameSize},${this.frameSize} ${this.rect.width-this.frameSize},${this.frameSize} ${this.rect.width-this.frameSize},${this.rect.height-this.frameSize} ${this.frameSize},${this.rect.height-this.frameSize} Z`;
1375		        }
1376		        initEvents() {
1377		            this.DOM.nextCtrl.addEventListener('click', () => this.navigate('next'));
1378		            this.DOM.prevCtrl.addEventListener('click', () => this.navigate('prev'));
1379		            
1380		            window.addEventListener('resize', debounce(() => {
1381		                this.rect = this.DOM.el.getBoundingClientRect();
1382		                this.updateFrame();
1383		            }, 20));
1384		            
1385		            document.addEventListener('keydown', (ev) => {
1386		                const keyCode = ev.keyCode || ev.which;
1387		                if ( keyCode === 37 ) {
1388		                    this.navigate('prev');
1389		                }
1390		                else if ( keyCode === 39 ) {
1391		                    this.navigate('next');
1392		                }
1393		            });
1394		        }
1395		        navigate(dir = 'next') {
1396		            if ( this.isAnimating ) return false;
1397		            this.isAnimating = true;
1398		
1399		            const animateShapeIn = anime({
1400		                targets: this.DOM.shape,
1401		                duration: this.settings.animation.shape.duration,
1402		                easing: this.settings.animation.shape.easing.in,
1403		                d: this.paths.final
1404		            });
1405		
1406		            const animateSlides = () => {
1407		                return new Promise((resolve, reject) => {
1408		                    const currentSlide = this.DOM.slides[this.current];
1409		                    anime({
1410		                        targets: currentSlide,
1411		                        duration: this.settings.animation.slides.duration,
1412		                        easing: this.settings.animation.slides.easing,
1413		                        translateX: dir === 'next' ? -1*this.rect.width : this.rect.width,
1414		                        complete: () => {
1415		                            currentSlide.classList.remove('slide-current');
1416		                            resolve();
1417		                        }
1418		                    });
1419		        
1420		                    this.current = dir === 'next' ? 
1421		                        this.current < this.slidesTotal-1 ? this.current + 1 : 0 :
1422		                        this.current > 0 ? this.current - 1 : this.slidesTotal-1; 
1423		                    
1424		                    const newSlide = this.DOM.slides[this.current];
1425		                    newSlide.classList.add('slide-current');
1426		                    anime({
1427		                        targets: newSlide,
1428		                        duration: this.settings.animation.slides.duration,
1429		                        easing: this.settings.animation.slides.easing,
1430		                        translateX: [dir === 'next' ? this.rect.width : -1*this.rect.width,0]
1431		                    });
1432		        
1433		                    const newSlideImg = newSlide.querySelector('.slide-img');
1434		                    anime.remove(newSlideImg);
1435		                    anime({
1436		                        targets: newSlideImg,
1437		                        duration: this.settings.animation.slides.duration*4,
1438		                        easing: this.settings.animation.slides.easing,
1439		                        translateX: [dir === 'next' ? 200 : -200, 0]
1440		                    });
1441		        
1442		                    anime({
1443		                        targets: [newSlide.querySelector('.slide-title'), newSlide.querySelector('.slide-desc'), newSlide.querySelector('.slide-link')],
1444		                        duration: this.settings.animation.slides.duration*2,
1445		                        easing: this.settings.animation.slides.easing,
1446		                        delay: (t,i) => i*100+100,
1447		                        translateX: [dir === 'next' ? 300 : -300,0],
1448		                        opacity: [0,1]
1449		                    });
1450		                });
1451		            };
1452		
1453		            const animateShapeOut = () => {
1454		                anime({
1455		                    targets: this.DOM.shape,
1456		                    duration: this.settings.animation.shape.duration,
1457		                    delay: 150,
1458		                    easing: this.settings.animation.shape.easing.out,
1459		                    d: this.paths.initial,
1460		                    complete: () => this.isAnimating = false
1461		                });
1462		            }
1463		
1464		            animateShapeIn.finished.then(animateSlides).then(animateShapeOut);
1465		        }
1466		    };
1467		
1468			var slideshow = document.querySelector('.slideshow');
1469			if(slideshow)
1470			{
1471				var slideshowFrameColor = slideshow.getAttribute('data-background');
1472			    new Slideshow(slideshow);
1473			    imagesLoaded('.slide-img', { background: true });
1474			}
1475		} );
1476		//End execute javascript for slider animated frame
1477		
1478		//Start execute javascript for slider 3d room
1479		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-room.default', function( $scope ) {
1480			jQuery('body').addClass('elementor-fullscreen');
1481			jQuery('body').addClass('room');
1482			
1483			function debounce(func, wait, immediate) {
1484				var timeout;
1485				return function() {
1486					var context = this, args = arguments;
1487					var later = function() {
1488						timeout = null;
1489						if (!immediate) func.apply(context, args);
1490					};
1491					var callNow = immediate && !timeout;
1492					clearTimeout(timeout);
1493					timeout = setTimeout(later, wait);
1494					if (callNow) func.apply(context, args);
1495				};
1496			};
1497		
1498			function getMousePos(e) {
1499				var posx = 0;
1500				var posy = 0;
1501				if (!e) var e = window.event;
1502				if (e.pageX || e.pageY) 	{
1503					posx = e.pageX;
1504					posy = e.pageY;
1505				}
1506				else if (e.clientX || e.clientY) 	{
1507					posx = e.clientX + document.body.scrollLeft
1508						+ document.documentElement.scrollLeft;
1509					posy = e.clientY + document.body.scrollTop
1510						+ document.documentElement.scrollTop;
1511				}
1512				return {
1513					x : posx,
1514					y : posy
1515				}
1516			}
1517		
1518			var DOM = {};
1519			// The loader.
1520			DOM.loader = document.querySelector('.room-slider-wrapper .overlay--loader');
1521			// The room wrapper. This will be the element to be transformed in order to move around.
1522			DOM.scroller = document.querySelector('.room-slider-wrapper .container > .scroller');
1523			// The rooms.
1524			if (DOM.scroller)
1525			{
1526				DOM.rooms = [].slice.call(DOM.scroller.querySelectorAll('.room'));
1527			}
1528			else
1529			{
1530				DOM.rooms = {};
1531			}
1532		
1533			// The content wrapper.
1534			DOM.content = document.querySelector('.room-slider-wrapper .content');
1535			if (DOM.content)
1536			{
1537				// Rooms navigation controls.
1538				DOM.nav = {
1539					leftCtrl : DOM.content.querySelector('.room-slider-wrapper nav > .btn--nav-left'),
1540					rightCtrl : DOM.content.querySelector('.room-slider-wrapper nav > .btn--nav-right')
1541				};
1542				// Content slides.
1543				DOM.slides = [].slice.call(DOM.content.querySelectorAll('.slides > .slide'));
1544			}
1545		
1546			var	currentRoom = 0,
1547				// Total number of rooms.
1548				totalRooms = DOM.rooms.length,
1549				// Initial transform.
1550				initTransform = { translateX : 0, translateY : 0, translateZ : '500px', rotateX : 0, rotateY : 0, rotateZ : 0 },
1551				// Reset transform.
1552				resetTransform = { translateX : 0, translateY : 0, translateZ : 0, rotateX : 0, rotateY : 0, rotateZ : 0 },
1553				// View from top.
1554				menuTransform = { translateX : 0, translateY : '150%', translateZ : 0, rotateX : '15deg', rotateY : 0, rotateZ : 0 },
1555				menuTransform = { translateX : 0, translateY : '50%', translateZ : 0, rotateX : '-10deg', rotateY : 0, rotateZ : 0 },
1556				// Info view transform.
1557				infoTransform = { translateX : 0, translateY : 0, translateZ : '200px', rotateX : '2deg', rotateY : 0, rotateZ : '4deg' },
1558				// Room initial moving transition.
1559				initTransition = { speed: '0.9s', easing: 'ease' },
1560				// Room moving transition.
1561				roomTransition = { speed: '0.4s', easing: 'ease' },
1562				// View from top transition.
1563				menuTransition = { speed: '1.5s', easing: 'cubic-bezier(0.2,1,0.3,1)' },
1564				// Info transition.
1565				infoTransition = { speed: '15s', easing: 'cubic-bezier(0.3,1,0.3,1)' },
1566				// Tilt transition
1567				tiltTransition = { speed: '0.2s', easing: 'ease-out' },
1568				tilt = false,
1569				// How much to rotate when the mouse moves.
1570				tiltRotation = {
1571					rotateX : 1, // a relative rotation of -1deg to 1deg on the x-axis
1572					rotateY : -3  // a relative rotation of -3deg to 3deg on the y-axis
1573				},
1574				// Transition end event handler.
1575				onEndTransition = function(el, callback) {
1576					var onEndCallbackFn = function(ev) {
1577						this.removeEventListener('transitionend', onEndCallbackFn);
1578						if( callback && typeof callback === 'function' ) { callback.call(); }
1579					};
1580					el.addEventListener('transitionend', onEndCallbackFn);
1581				},
1582				// Window sizes.
1583				win = {width: window.innerWidth, height: window.innerHeight},
1584				// Check if moving inside the room and check if navigating.
1585				isMoving, isNavigating;
1586		
1587			function init() {
1588				// Move into the current room.
1589				move({transition: initTransition, transform: initTransform}).then(function() {
1590					initTilt();
1591				});
1592				// Animate the current slide in.
1593				showSlide(100);
1594				// Init/Bind events.
1595				initEvents();
1596			}
1597		
1598			function initTilt() {
1599				applyRoomTransition(tiltTransition);
1600				tilt = true;
1601			}
1602		
1603			function removeTilt() {
1604				tilt = false;
1605			}
1606			
1607			function move(opts) {
1608				return new Promise(function(resolve, reject) {
1609					if( isMoving && !opts.stopTransition ) {
1610						return false;
1611					}
1612					isMoving = true;
1613		
1614					if( opts.transition ) {
1615						applyRoomTransition(opts.transition);
1616					}
1617		
1618					if( opts.transform ) {
1619						applyRoomTransform(opts.transform);
1620						var onEndFn = function() {
1621							isMoving = false;
1622							resolve();
1623						};
1624						onEndTransition(DOM.scroller, onEndFn);
1625					}
1626					else {
1627						resolve();
1628					}
1629					
1630				});
1631			}
1632		
1633			function initEvents() {
1634				// Mousemove event / Tilt functionality.
1635				var onMouseMoveFn = function(ev) {
1636						requestAnimationFrame(function() {
1637							if( !tilt ) return false;
1638		
1639		
1640							var mousepos = getMousePos(ev),
1641								// transform values
1642								rotX = tiltRotation.rotateX ? initTransform.rotateX -  (2 * tiltRotation.rotateX / win.height * mousepos.y - tiltRotation.rotateX) : 0,
1643								rotY = tiltRotation.rotateY ? initTransform.rotateY -  (2 * tiltRotation.rotateY / win.width * mousepos.x - tiltRotation.rotateY) : 0;
1644					
1645							// apply transform
1646							applyRoomTransform({
1647								'translateX' : initTransform.translateX, 
1648								'translateY' : initTransform.translateY, 
1649								'translateZ' : initTransform.translateZ, 
1650								'rotateX' : rotX + 'deg', 
1651								'rotateY' : rotY + 'deg',
1652								'rotateZ' : initTransform.rotateZ
1653							});
1654						});
1655					},
1656					// Window resize.
1657					debounceResizeFn = debounce(function() {
1658						win = {width: window.innerWidth, height: window.innerHeight};
1659					}, 10);
1660				
1661				document.addEventListener('mousemove', onMouseMoveFn);
1662				window.addEventListener('resize', debounceResizeFn);
1663		
1664				// Room navigation.
1665				var onNavigatePrevFn = function() { navigate('prev'); },
1666					onNavigateNextFn = function() { navigate('next'); };
1667		
1668				if(DOM.nav.leftCtrl && DOM.nav.rightCtrl)
1669				{
1670					DOM.nav.leftCtrl.addEventListener('click', onNavigatePrevFn);
1671					DOM.nav.rightCtrl.addEventListener('click', onNavigateNextFn);
1672				}
1673			}
1674		
1675			function applyRoomTransform(transform) {
1676				DOM.scroller.style.transform = 'translate3d(' + transform.translateX + ', ' + transform.translateY + ', ' + transform.translateZ + ') ' +
1677											   'rotate3d(1,0,0,' + transform.rotateX + ') rotate3d(0,1,0,' + transform.rotateY + ') rotate3d(0,0,1,' + transform.rotateZ + ')';
1678			}
1679		
1680			function applyRoomTransition(transition) {
1681				DOM.scroller.style.transition = transition === 'none' ? transition : 'transform ' + transition.speed + ' ' + transition.easing;
1682			}
1683		
1684			function toggleSlide(dir, delay) {
1685				var slide = DOM.slides[currentRoom],
1686					// Slide's name.
1687					name = slide.querySelector('.slide-name'),
1688					// Slide's title and date elements.
1689					title = slide.querySelector('.slide-title'),
1690					date = slide.querySelector('.slide-date');
1691		
1692				delay = delay !== undefined ? delay : 0;
1693		
1694				anime.remove([name, title, date]);
1695				var animeOpts = {
1696					targets: [name, title, date],
1697					duration: dir === 'in' ? 400 : 400,
1698					//delay: 0,//dir === 'in' ? 150 : 0,
1699					delay: function(t, i, c) {
1700						return delay + 75+i*75;
1701					},
1702					easing: [0.25,0.1,0.25,1],
1703					opacity: {
1704						value: dir === 'in' ? [0,1] : [1,0],
1705						duration: dir === 'in' ? 550 : 250
1706					},
1707					translateY: function(t, i) {
1708						return dir === 'in' ? [150,0] : [0,-150];
1709					}	
1710				};
1711				if( dir === 'in' ) {
1712					animeOpts.begin = function() {
1713						slide.classList.add('slide-current');
1714					};
1715				}
1716				else {
1717					animeOpts.complete = function() {
1718						slide.classList.remove('slide-current');
1719					};
1720				}
1721				anime(animeOpts);
1722			}
1723		
1724			function showSlide(delay) {
1725				toggleSlide('in', delay);
1726			}
1727		
1728			function hideSlide(delay) {
1729				toggleSlide('out', delay);
1730			}
1731		
1732			function navigate(dir) {
1733				if( isMoving || isNavigating ) {
1734					return false;
1735				}
1736				isNavigating = true;
1737				
1738				var room = DOM.rooms[currentRoom];
1739				
1740				// Remove tilt.
1741				removeTilt();
1742				// Animate the current slide out - animate the name, title and date elements.
1743				hideSlide();
1744		
1745				// Update currentRoom.
1746				if( dir === 'next' ) {
1747					currentRoom = currentRoom < totalRooms - 1 ? currentRoom + 1 : 0;
1748				}
1749				else {
1750					currentRoom = currentRoom > 0 ? currentRoom - 1 : totalRooms - 1;
1751				}
1752		
1753				// Position the next room.
1754				var nextRoom = DOM.rooms[currentRoom];
1755				nextRoom.style.transform = 'translate3d(' + (dir === 'next' ? 100 : -100) + '%,0,0) translate3d(' + (dir === 'next' ? 1 : -1) + 'px,0,0)' ;
1756				nextRoom.style.opacity = 1;
1757				
1758				// Move back.
1759				move({transition: roomTransition, transform: resetTransform})
1760				.then(function() {
1761					// Move left or right.
1762					return move({transform: { translateX : (dir === 'next' ? -100 : 100) + '%', translateY : 0, translateZ : 0, rotateX : 0, rotateY : 0, rotateZ : 0 }});
1763				})
1764				.then(function() {
1765					// Update current room class.
1766					nextRoom.classList.add('room--current');
1767					room.classList.remove('room--current');
1768					room.style.opacity = 0;
1769		
1770					// Show the next slide.
1771					showSlide();
1772		
1773					// Move into room.
1774					// Update final transform state:
1775					return move({transform: { translateX : (dir === 'next' ? -100 : 100) + '%', translateY : 0, translateZ : '500px', rotateX : 0, rotateY : 0, rotateZ : 0 }});
1776				})
1777				.then(function() {
1778					// Reset positions.
1779					applyRoomTransition('none');
1780					nextRoom.style.transform = 'translate3d(0,0,0)';
1781					applyRoomTransform(initTransform);
1782					
1783					setTimeout(function() {
1784						initTilt();
1785					}, 60);
1786					isNavigating = false;
1787				});
1788			}
1789		
1790			function addAdjacentRooms() {
1791				// Current room.
1792				var room = DOM.rooms[currentRoom],
1793					// Adjacent rooms.
1794					nextRoom = DOM.rooms[currentRoom < totalRooms - 1 ? currentRoom + 1 : 0],
1795					prevRoom = DOM.rooms[currentRoom > 0 ? currentRoom - 1 : totalRooms - 1];
1796		
1797				// Position the adjacent rooms.
1798				nextRoom.style.transform = 'translate3d(100%,0,0) translate3d(3px,0,0)';
1799				nextRoom.style.opacity = 1;
1800				prevRoom.style.transform = 'translate3d(-100%,0,0) translate3d(-3px,0,0)';
1801				prevRoom.style.opacity = 1;
1802			}
1803		
1804			function removeAdjacentRooms() {
1805				// Current room.
1806				var room = DOM.rooms[currentRoom],
1807					// Adjacent rooms.
1808					nextRoom = DOM.rooms[currentRoom < totalRooms - 1 ? currentRoom + 1 : 0],
1809					prevRoom = DOM.rooms[currentRoom > 0 ? currentRoom - 1 : totalRooms - 1];
1810		
1811				// Position the adjacent rooms.
1812				nextRoom.style.transform = 'none';
1813				nextRoom.style.opacity = 0;
1814				prevRoom.style.transform = 'none';
1815				prevRoom.style.opacity = 0;
1816			}
1817		
1818			// Preload all the images.
1819			if(DOM.scroller)
1820			{
1821				imagesLoaded(DOM.scroller, function() {
1822					var extradelay = 1000;
1823					// Slide out loader.
1824					anime({
1825						targets: DOM.loader,
1826						duration: 600,
1827						easing: 'easeInOutCubic',
1828						delay: extradelay,
1829						translateY: '-100%',
1830						begin: function() {
1831							init();
1832						},
1833						complete: function() {
1834							DOM.loader.classList.remove('overlay--active');
1835						}
1836					});
1837				});
1838			}
1839		} );
1840		//End execute javascript for slider 3d room
1841		
1842		
1843		//Start execute javascript for slider multi layouts
1844		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-multi-layouts.default', function( $scope ) {
1845			document.documentElement.className = 'js';
1846			
1847			var slideshow = new MLSlideshow(document.querySelector('.slideshow'));
1848			
1849			if(document.querySelector('#next-slide'))
1850			{
1851				document.querySelector('#next-slide').addEventListener('click', function() {
1852					slideshow.next();
1853				});
1854			}
1855	
1856			if(document.querySelector('#prev-slide'))
1857			{
1858				document.querySelector('#prev-slide').addEventListener('click', function() {
1859					slideshow.prev();
1860				});
1861			}
1862		} );
1863		//End execute javascript for slider multi layouts
1864		
1865		//Start execute javascript for slider velo
1866		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-velo.default', function( $scope ) {
1867			jQuery('body').addClass('elementor-fullscreen');
1868			
1869			/**
1870			 * Velocity Effects
1871			 *
1872			 * First, A few Registered effects for velocity's ui kit.
1873			 * Actual slider stuff below
1874			 */
1875			
1876			var scaleDownAmnt = 0.7;
1877			var boxShadowAmnt = '40px';
1878			
1879			$.Velocity.RegisterEffect("translateUp", {
1880			  defaultDuration: 1,
1881			  calls: [
1882			    [{
1883			      translateY: '-100%'
1884			    }, 1]
1885			  ]
1886			});
1887			$.Velocity.RegisterEffect("translateDown", {
1888			  defaultDuration: 1,
1889			  calls: [
1890			    [{
1891			      translateY: '100%'
1892			    }, 1]
1893			  ]
1894			});
1895			$.Velocity.RegisterEffect("translateNone", {
1896			  defaultDuration: 1,
1897			  calls: [
1898			    [{
1899			      translateY: '0',
1900			      opacity: '1',
1901			      scale: '1',
1902			 
1903			    }, 1]
1904			  ]
1905			});
1906			//scale down
1907			$.Velocity.RegisterEffect("scaleDown", {
1908			  defaultDuration: 1,
1909			  calls: [
1910			    [{
1911			      opacity: '0',
1912			      scale: '0.7',
1913			 
1914			    }, 1]
1915			  ]
1916			});
1917			
1918			//gallery
1919			$.Velocity.RegisterEffect("scaleDown.moveUp", {
1920			  defaultDuration: 1,
1921			  calls: [
1922			    [{
1923			      translateY: '0%',
1924			      scale: scaleDownAmnt,
1925			 
1926			    }, 0.20],
1927			    [{
1928			      translateY: '-100%'
1929			    }, 0.60],
1930			    [{
1931			      translateY: '-100%',
1932			      scale: '1',
1933			      // boxShadowBlur: '0'
1934			    }, 0.20]
1935			  ]
1936			});
1937			$.Velocity.RegisterEffect("scaleDown.moveUp.scroll", {
1938			  defaultDuration: 1,
1939			  calls: [
1940			    [{
1941			      translateY: '-100%',
1942			      scale: scaleDownAmnt,
1943			 
1944			    }, 0.60],
1945			    [{
1946			      translateY: '-100%',
1947			      scale: '1',
1948			      // boxShadowBlur: '0'
1949			    }, 0.40]
1950			  ]
1951			});
1952			$.Velocity.RegisterEffect("scaleUp.moveUp", {
1953			  defaultDuration: 1,
1954			  calls: [
1955			    [{
1956			      translateY: '90%',
1957			      scale: scaleDownAmnt,
1958			      // boxShadowBlur: boxShadowAmnt     
1959			    }, 0.20],
1960			    [{
1961			      translateY: '0%'
1962			    }, 0.60],
1963			    [{
1964			      translateY: '0%',
1965			      scale: '1',
1966			      // boxShadowBlur: '0'
1967			    }, 0.20]
1968			  ]
1969			});
1970			$.Velocity.RegisterEffect("scaleUp.moveUp.scroll", {
1971			  defaultDuration: 1,
1972			  calls: [
1973			    [{
1974			      translateY: '0%',
1975			      scale: scaleDownAmnt,
1976			      // boxShadowBlur: boxShadowAmnt
1977			    }, 0.60],
1978			    [{
1979			      translateY: '0%',
1980			      scale: '1',
1981			      // boxShadowBlur: '0'
1982			    }, 0.40]
1983			  ]
1984			});
1985			$.Velocity.RegisterEffect("scaleDown.moveDown", {
1986			  defaultDuration: 1,
1987			  calls: [
1988			    [{
1989			      translateY: '0%',
1990			      scale: scaleDownAmnt,
1991			      // boxShadowBlur: boxShadowAmnt
1992			    }, 0.20],
1993			    [{
1994			      translateY: '100%'
1995			    }, 0.60],
1996			    [{
1997			      translateY: '100%',
1998			      scale: '1',
1999			      // boxShadowBlur: '0'
2000			    }, 0.20]
2001			  ]
2002			});
2003			$.Velocity.RegisterEffect("scaleDown.moveDown.scroll", {
2004			  defaultDuration: 1,
2005			  calls: [
2006			    [{
2007			
2008			    }, 0.60],
2009			    [{
2010			      translateY: '100%',
2011			      scale: '1',
2012			      // boxShadowBlur: '0'
2013			    }, 0.40]
2014			  ]
2015			});
2016			$.Velocity.RegisterEffect("scaleUp.moveDown", {
2017			  defaultDuration: 1,
2018			  calls: [
2019			    [{
2020			      translateY: '-90%',
2021			      scale: scaleDownAmnt,
2022			      // boxShadowBlur: boxShadowAmnt
2023			    }, 0.20],
2024			    [{
2025			      translateY: '0%'
2026			    }, 0.60],
2027			    [{
2028			      translateY: '0%',
2029			      scale: '1',
2030			      // boxShadowBlur: '0'
2031			    }, 0.20]
2032			  ]
2033			});
2034			
2035			
2036			
2037			/**
2038			 * Velo Slider
2039			 * A Custom Slider using Velocity and Velocity UI effects
2040			 */
2041			
2042			var VeloSlider = (function() {
2043			
2044			  /**
2045			   * Global Settings 
2046			   */
2047			  var settings = {
2048			    veloInit: $('.velo-slides').data('velo-slider'),
2049			    $veloSlide: $('.velo-slide'),
2050			    veloSlideBg: '.velo-slide-bg',
2051			    navPrev:  $('.velo-slides-nav').find('a.js-velo-slides-prev'),
2052			    navNext:  $('.velo-slides-nav').find('a.js-velo-slides-next'),
2053			    veloBtn:   $('.velo-slide-btn'),
2054			    delta: 0,
2055			    scrollThreshold: 7,
2056			    currentSlide: 1,
2057			    animating: false,
2058			    animationDuration: 2000
2059			  };
2060			
2061			
2062			  // Flags
2063			  var delta = 0,
2064			      animating = false;
2065			
2066			  return {
2067			   
2068			      /**
2069			       * Init 
2070			       */
2071			      init: function() {
2072			        this.bind();
2073			      },
2074			    
2075			    /**
2076			     * Bind our click, scroll, key events
2077			     */
2078			    bind: function(){
2079			 
2080			      //  Add active to first slide to set it off
2081			      settings.$veloSlide.first().addClass('is-active');
2082			
2083			      //  Init with a data attribute, 
2084			      //  Binding the animation to scroll, arrows, keys
2085			      if (settings.veloInit == 'on') {
2086			        VeloSlider.initScrollJack();
2087			        $(window).on('DOMMouseScroll mousewheel', VeloSlider.scrollJacking);
2088			      }
2089			
2090			      // Arrow / Click Nav
2091			      settings.navPrev.on('click', VeloSlider.prevSlide);
2092			      settings.navNext.on('click', VeloSlider.nextSlide);
2093			    
2094			      // Key Nav
2095			      $(document).on('keydown', function(e) {
2096			        var keyNext = (e.which == 39 || e.which == 40),
2097			            keyPrev = (e.which == 37 || e.which == 38);
2098			
2099			        if (keyNext && !settings.navNext.hasClass('inactive')) {
2100			          e.preventDefault();
2101			          VeloSlider.nextSlide();
2102			
2103			        } else if (keyPrev && (!settings.navPrev.hasClass('inactive'))) {
2104			          e.preventDefault();
2105			          VeloSlider.prevSlide();
2106			        }
2107			      });
2108			      
2109			      jQuery('body').on('touchmove', function(e){
2110					  e.preventDefault();
2111					  e.stopPropagation();
2112					  
2113					  return false;
2114					});
2115				    
2116				    var ts;
2117					jQuery(document).bind('touchstart', function (e){
2118					   ts = e.originalEvent.touches[0].clientY;
2119					});
2120					
2121					jQuery(document).bind('touchend', function (e){
2122					   var te = e.originalEvent.changedTouches[0].clientY;
2123					   if(ts > te+5){
2124					      VeloSlider.nextSlide();
2125					   }else if(ts < te-5){
2126					      VeloSlider.prevSlide();
2127					   }
2128					});
2129			    
2130			      //set navigation arrows visibility
2131			      VeloSlider.checkNavigation();
2132			
2133			      // Call Button Hover animation
2134			      VeloSlider.hoverAnimation();
2135			     
2136			    },
2137			
2138			    /**
2139			     * Hover Animation
2140			     * Adds 'is-hovering' class to the current slide
2141			     * when hovering over the button.
2142			     */
2143			    hoverAnimation: function(){
2144			      settings.veloBtn.hover(function (){
2145			        $(this).closest(settings.$veloSlide).toggleClass('is-hovering');
2146			      });
2147			    },
2148			
2149			    /** 
2150			     * Set Animation
2151			     * Defines the animation sequence, calling our registered velocity effects
2152			     * @see js/components/_velocity-effects.js
2153			     */
2154			    setAnimation: function(midStep, direction) {
2155			      
2156			      // Vars for our velocity effects
2157			      var animationVisible = 'translateNone',
2158			          animationTop = 'translateUp',
2159			          animationBottom = 'translateDown',
2160			          easing = 'ease',
2161			          animDuration = settings.animationDuration;
2162			
2163			      // Middle Step
2164			      if (midStep) {
2165			        animationVisible = 'scaleUp.moveUp.scroll';
2166			        animationTop = 'scaleDown.moveUp.scroll';
2167			        animationBottom = 'scaleDown.moveDown.scroll';
2168			      
2169			      } else {
2170			        animationVisible = (direction == 'next') ? 'scaleUp.moveUp' : 'scaleUp.moveDown';
2171			        animationTop = 'scaleDown.moveUp';
2172			        animationBottom = 'scaleDown.moveDown';
2173			      }
2174			
2175			      return [animationVisible, animationTop, animationBottom, animDuration, easing];
2176			    },
2177			
2178			    /** 
2179			     * Init Scroll Jaclk
2180			     */
2181			    initScrollJack: function() {
2182			
2183			      var visibleSlide = settings.$veloSlide.filter('.is-active'),
2184			          topSection = visibleSlide.prevAll(settings.$veloSlide),
2185			          bottomSection = visibleSlide.nextAll(settings.$veloSlide),
2186			          animationParams = VeloSlider.setAnimation(false),
2187			          animationVisible = animationParams[0],
2188			          animationTop = animationParams[1],
2189			          animationBottom = animationParams[2];
2190			
2191			      visibleSlide.children('div').velocity(animationVisible, 1, function() {
2192			        visibleSlide.css('opacity', 1);
2193			        topSection.css('opacity', 1);
2194			        bottomSection.css('opacity', 1);
2195			      });
2196			
2197			      topSection.children('div').velocity(animationTop, 0);
2198			      bottomSection.children('div').velocity(animationBottom, 0);
2199			    },
2200			
2201			    /**
2202			     * Scroll Jack
2203			     * On Mouse Scroll
2204			     */
2205			    scrollJacking: function(e) {
2206				    if(!jQuery('body').hasClass('js_nav'))
2207				    {
2208				      if (e.originalEvent.detail < 0 || e.originalEvent.wheelDelta > 0) {
2209				        delta--;
2210				        (Math.abs(delta) >= settings.scrollThreshold) && VeloSlider.prevSlide();
2211				      } else {
2212				        delta++;
2213				        (delta >= settings.scrollThreshold) && VeloSlider.nextSlide();
2214				      }
2215				      return false;
2216					}
2217			    },
2218			
2219			    /**
2220			     * Previous Slide
2221			     */
2222			    prevSlide: function(e) {
2223			      //go to previous section
2224			      typeof e !== 'undefined' && e.preventDefault();
2225			      
2226			      var visibleSlide = settings.$veloSlide.filter('.is-active'),
2227			          animationParams = VeloSlider.setAnimation(midStep, 'prev'),
2228			          midStep = false;
2229			      
2230			      visibleSlide = midStep ? visibleSlide.next(settings.$veloSlide) : visibleSlide;
2231			
2232			      if (!animating && !visibleSlide.is(":first-child")) {
2233			        animating = true;
2234			        
2235			        visibleSlide
2236			          .removeClass('is-active')
2237			          .children(settings.veloSlideBg)
2238			          .velocity(animationParams[2], animationParams[3], animationParams[4])
2239			          .end()
2240			          .prev(settings.$veloSlide)
2241			          .addClass('is-active')
2242			          .children(settings.veloSlideBg)
2243			          .velocity(animationParams[0], animationParams[3], animationParams[4], function() {
2244			            animating = false;
2245			          });
2246			        currentSlide = settings.currentSlide - 1;
2247			      }
2248			      VeloSlider.resetScroll();
2249			    },
2250			
2251			
2252			    /** 
2253			     * Next Slide
2254			     */
2255			    nextSlide: function(e) {
2256			      
2257			      //go to next section
2258			      typeof e !== 'undefined' && e.preventDefault();
2259			      
2260			      var visibleSlide = settings.$veloSlide.filter('.is-active'),
2261			          animationParams = VeloSlider.setAnimation(midStep, 'next'),
2262			          midStep = false;
2263			
2264			      if (!animating && !visibleSlide.is(":last-of-type")) {
2265			        animating = true;
2266			
2267			        visibleSlide.removeClass('is-active')
2268			          .children(settings.veloSlideBg)
2269			          .velocity(animationParams[1], animationParams[3])
2270			          .end()
2271			          .next(settings.$veloSlide)
2272			          .addClass('is-active')
2273			          .children(settings.veloSlideBg)
2274			          .velocity(animationParams[0], animationParams[3], function() {
2275			            animating = false;
2276			        });
2277			        currentSlide = settings.currentSlide + 1;
2278			      }
2279			      VeloSlider.resetScroll();
2280			    },
2281			
2282			    /**
2283			     * Reset SCroll
2284			     */
2285			    resetScroll: function() {
2286			      delta = 0;
2287			      VeloSlider.checkNavigation();
2288			    },
2289			
2290			    /**
2291			     * Check Nav
2292			     * Adds / hides nav based on first/last slide
2293			     * @todo - loop slides, without cloning if possible
2294			     */
2295			    checkNavigation: function() {
2296			      //update navigation arrows visibility
2297			      (settings.$veloSlide.filter('.is-active').is(':first-of-type')) ? settings.navPrev.addClass('inactive'): settings.navPrev.removeClass('inactive');
2298			      (settings.$veloSlide.filter('.is-active').is(':last-of-type')) ? settings.navNext.addClass('inactive'): settings.navNext.removeClass('inactive');
2299			
2300			    },
2301			  };
2302			})();
2303			
2304			// INIT
2305			VeloSlider.init();
2306		} );
2307		//End execute javascript for slider velo
2308		
2309		//Start execute javascript for slider popout
2310		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-popout.default', function( $scope ) {
2311			jQuery('body').addClass('elementor-fullscreen');
2312			
2313			function goToSlide(number){
2314			  $('.slider-slide').removeClass('slider-slide--active');
2315			  $('.slider-slide[data-slide='+number+']').addClass('slider-slide--active');
2316			}
2317			
2318			$('.slider__next, .go-to-next').on('click', function(){
2319			  var currentSlide = Number($('.slider-slide--active').data('slide'));
2320			  var totalSlides = $('.slider-slide').length;
2321			  currentSlide++
2322			  if (currentSlide > totalSlides){
2323			    currentSlide = 1;
2324			  }
2325			  goToSlide(currentSlide);
2326			});
2327			
2328			for (var i=1; i <= $('.slider-slide').length; i++){
2329			    $('.slider__indicators').append('<div class="slider__indicator" data-slide="'+i+'"></div>')
2330			  }
2331			  setTimeout(function(){
2332			    $('.slider-wrap').addClass('slider-wrap--hacked');
2333			  }, 1000);
2334		} );
2335		//End execute javascript for slider popout
2336		
2337		
2338		//Start execute javascript for slider clip path
2339		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-clip-path.default', function( $scope ) {
2340			jQuery('body').addClass('elementor-fullscreen');
2341			
2342			(function() {
2343			  var $slides = document.querySelectorAll('.clip-path-slide-container .slide');
2344			  
2345			  var $controls = document.querySelectorAll('.slider-control');
2346			  var numOfSlides = $slides.length;
2347			  var slidingAT = 1300; // sync this with scss variable
2348			  var slidingBlocked = false;
2349			
2350			  [].slice.call($slides).forEach(function($el, index) {
2351			    var i = index + 1;
2352			    $el.classList.add('slide-' + i);
2353			    $el.dataset.slide = i;
2354			  });
2355			
2356			  [].slice.call($controls).forEach(function($el) {
2357			    $el.addEventListener('click', controlClickHandler);
2358			  });
2359			
2360			  function controlClickHandler() {
2361			    if (slidingBlocked) return;
2362			    slidingBlocked = true;
2363			
2364			    var $control = this;
2365			    var isRight = $control.classList.contains('m--right');
2366			    var $curActive = document.querySelector('.slide.s--active');
2367			    var index = +$curActive.dataset.slide;
2368			    (isRight) ? index++ : index--;
2369			    if (index < 1) index = numOfSlides;
2370			    if (index > numOfSlides) index = 1;
2371			    var $newActive = document.querySelector('.slide-' + index);
2372			
2373			    $control.classList.add('a--rotation');
2374			    $curActive.classList.remove('s--active', 's--active-prev');
2375			    document.querySelector('.slide.s--prev').classList.remove('s--prev');
2376			    
2377			    $newActive.classList.add('s--active');
2378			    if (!isRight) $newActive.classList.add('s--active-prev');
2379			    
2380			
2381			    var prevIndex = index - 1;
2382			    if (prevIndex < 1) prevIndex = numOfSlides;
2383			
2384			    document.querySelector('.slide-' + prevIndex).classList.add('s--prev');
2385			
2386			    setTimeout(function() {
2387			      $control.classList.remove('a--rotation');
2388			      slidingBlocked = false;
2389			    }, slidingAT*0.75);
2390			  };
2391			}());
2392		} );
2393		//End execute javascript for slider clip path
2394		
2395		//Start execute javascript for gallery preview
2396		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-preview.default', function( $scope ) {
2397			jQuery('body').addClass('grandconference-gallery-preview');
2398			
2399			var $slider = $('.slider');
2400			var $slickTrack = $('.slick-track');
2401			var $slickCurrent = $('.slick-current');
2402			
2403			var slideDuration = 900;
2404			
2405			//RESET ANIMATIONS
2406			// On init slide change
2407			$slider.on('init', function(slick){
2408			  TweenMax.to($('.slick-track'), 0.9, {
2409			    marginLeft: 0
2410			  });
2411			  TweenMax.to($('.slick-active'), 0.9, {
2412			    x: 0,
2413			    zIndex: 2
2414			  });
2415			});
2416			// On before slide change
2417			$slider.on('beforeChange', function(event, slick, currentSlide, nextSlide){
2418			  TweenMax.to($('.slick-track'), 0.9, {
2419			    marginLeft: 0
2420			  });
2421			  TweenMax.to($('.slick-active'), 0.9, {
2422			    x: 0
2423			  });
2424			});
2425			
2426			// On after slide change
2427			$slider.on('afterChange', function(event, slick, currentSlide){
2428			  TweenMax.to($('.slick-track'), 0.9, {
2429			    marginLeft: 0
2430			  });
2431			  $('.slick-slide').css('z-index','1');
2432			  TweenMax.to($('.slick-active'), 0.9, {
2433			    x: 0,
2434			    zIndex: 2
2435			  });
2436			});
2437			
2438			var $sliderPagination = $('.slider').attr('data-pagination');
2439			var dotsVar = false;
2440			if($sliderPagination == 'yes')
2441			{
2442				dotsVar = true;
2443			}
2444			
2445			var $sliderNavigation = $('.slider').attr('data-navigation');
2446			var arrowsVar = false;
2447			if($sliderNavigation == 'yes')
2448			{
2449				arrowsVar = true;
2450			}
2451			
2452			var $sliderAutoPlay = $('.slider').attr('data-autoplay');
2453			var autoPlayVar = false;
2454			var autoPlayTimeVar = 0;
2455			if (typeof $sliderAutoPlay != "undefined"){
2456				autoPlayVar = true;
2457				autoPlayTimeVar = $sliderAutoPlay;
2458			}
2459			
2460			//SLICK INIT
2461			$slider.slick({
2462			  speed: slideDuration,
2463			  touchMove: true,
2464			  dots: dotsVar,
2465			  arrows: arrowsVar,
2466			  waitForAnimate: true,
2467			  useTransform: true,
2468			  autoplay: autoPlayVar,
2469			  autoplaySpeed: autoPlayTimeVar,
2470			  cssEase: 'cubic-bezier(0.455, 0.030, 0.130, 1.000)'
2471			})
2472			
2473			//PREV
2474			$('.slick-prev').on('mouseenter', function(){
2475			                TweenMax.to($('.slick-track'), 0.6, {
2476			                  marginLeft: "180px",
2477			                  ease: Quad.easeOut
2478			                });
2479			                TweenMax.to($('.slick-current'), 0.6, {
2480			                  x: -100,
2481			                  ease: Quad.easeOut
2482			                });
2483			            });
2484			
2485			$('.slick-prev').on('mouseleave', function(){
2486			                TweenMax.to($('.slick-track'), 0.4, {
2487			                  marginLeft: 0,
2488			                  ease: Sine.easeInOut
2489			                });
2490			                TweenMax.to($('.slick-current'), 0.4, {
2491			                  x: 0,
2492			                  ease: Sine.easeInOut
2493			                });
2494			            });
2495			
2496			//NEXT
2497			$('.slick-next').on('mouseenter', function(){
2498			  
2499			                TweenMax.to($('.slick-track'), 0.6, {
2500			                  marginLeft: "-180px",
2501			                  ease: Quad.easeOut
2502			                });
2503			                TweenMax.to($('.slick-current'), 0.6, {
2504			                  x: 100,
2505			                  ease: Quad.easeOut
2506			                });
2507			            });
2508			
2509			$('.slick-next').on('mouseleave', function(){
2510			                TweenMax.to($('.slick-track'), 0.4, {
2511			                  marginLeft: 0,
2512			                  ease: Quad.easeInOut
2513			                });
2514			                TweenMax.to($('.slick-current'), 0.4, {
2515			                  x: 0,
2516			                  ease: Quad.easeInOut
2517			                });
2518			            });
2519		} );
2520		//End execute javascript for gallery preview
2521		
2522		//Start execute javascript for slider split slick
2523		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-split-slick.default', function( $scope ) {
2524			jQuery('body').addClass('elementor-fullscreen');
2525			
2526			var $slider = $('.slideshow .slider'),
2527			  maxItems = $('.item', $slider).length,
2528			  dragging = false,
2529			  tracking,
2530			  rightTracking;
2531			
2532			$sliderRight = $('.slideshow').clone().addClass('slideshow-right').appendTo($('.split-slideshow'));
2533			
2534			rightItems = $('.item', $sliderRight).toArray();
2535			reverseItems = rightItems.reverse();
2536			$('.slider', $sliderRight).html('');
2537			for (i = 0; i < maxItems; i++) {
2538			  $(reverseItems[i]).appendTo($('.slider', $sliderRight));
2539			}
2540			
2541			$slider.addClass('slideshow-left');
2542			$('.slideshow-left').slick({
2543			  vertical: true,
2544			  verticalSwiping: true,
2545			  arrows: false,
2546			  infinite: true,
2547			  dots: true,
2548			  speed: 1000,
2549			  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)'
2550			}).on('beforeChange', function(event, slick, currentSlide, nextSlide) {
2551			
2552			  if (currentSlide > nextSlide && nextSlide == 0 && currentSlide == maxItems - 1) {
2553			    $('.slideshow-right .slider').slick('slickGoTo', -1);
2554			    $('.slideshow-text').slick('slickGoTo', maxItems);
2555			  } else if (currentSlide < nextSlide && currentSlide == 0 && nextSlide == maxItems - 1) {
2556			    $('.slideshow-right .slider').slick('slickGoTo', maxItems);
2557			    $('.slideshow-text').slick('slickGoTo', -1);
2558			  } else {
2559			    $('.slideshow-right .slider').slick('slickGoTo', maxItems - 1 - nextSlide);
2560			    $('.slideshow-text').slick('slickGoTo', nextSlide);
2561			  }
2562			}).on("mousewheel", function(event) {
2563			  event.preventDefault();
2564			  if (event.deltaX > 0 || event.deltaY < 0) {
2565			    $(this).slick('slickNext');
2566			  } else if (event.deltaX < 0 || event.deltaY > 0) {
2567			    $(this).slick('slickPrev');
2568			  };
2569			}).on('mousedown touchstart', function(){
2570			  dragging = true;
2571			  tracking = $('.slick-track', $slider).css('transform');
2572			  tracking = parseInt(tracking.split(',')[5]);
2573			  rightTracking = $('.slideshow-right .slick-track').css('transform');
2574			  rightTracking = parseInt(rightTracking.split(',')[5]);
2575			}).on('mousemove touchmove', function(){
2576			  if (dragging) {
2577			    newTracking = $('.slideshow-left .slick-track').css('transform');
2578			    newTracking = parseInt(newTracking.split(',')[5]);
2579			    diffTracking = newTracking - tracking;
2580			    $('.slideshow-right .slick-track').css({'transform': 'matrix(1, 0, 0, 1, 0, ' + (rightTracking - diffTracking) + ')'});
2581			  }
2582			}).on('mouseleave touchend mouseup', function(){
2583			  dragging = false;
2584			});
2585			
2586			$('.slideshow-right .slider').slick({
2587			  swipe: false,
2588			  vertical: true,
2589			  arrows: false,
2590			  infinite: true,
2591			  speed: 950,
2592			  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)',
2593			  initialSlide: maxItems - 1
2594			});
2595			$('.slideshow-text').slick({
2596			  swipe: false,
2597			  vertical: true,
2598			  arrows: false,
2599			  infinite: true,
2600			  speed: 900,
2601			  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)'
2602			});
2603		} );
2604		//End execute javascript for slider split slick
2605		
2606		//Start execute javascript for slider transitions
2607		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-transitions.default', function( $scope ) {
2608			jQuery('body').addClass('elementor-fullscreen');
2609			
2610			var mySwiper = new Swiper(".swiper-container", {
2611			  direction: "vertical",
2612			  loop: true,
2613			  pagination: {
2614				  el: '.swiper-pagination',
2615				  type: 'bullets',
2616				  clickable: true
2617			  },
2618			  keyboard: {
2619			    enabled: true,
2620			    onlyInViewport: false,
2621			  },
2622			  grabCursor: true,
2623			  speed: 1000,
2624			  paginationClickable: true,
2625			  parallax: true,
2626			  autoplay: false,
2627			  effect: "slide",
2628			  mousewheel: {
2629			    invert: false,
2630			  },
2631			});
2632		} );
2633		//End execute javascript for slider transitions
2634		
2635		
2636		//Start execute javascript for slider property clip
2637		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-property-clip.default', function( $scope ) {
2638			jQuery(".slider-property-clip-wrapper").each(function() {
2639				var slider = jQuery(this).find(".slider"),
2640					slides = slider.find('li'),
2641					nav = slider.find('nav');
2642			
2643				slides.eq(0).addClass('current');
2644			
2645				nav.children('a').eq(0).addClass('current-dot');
2646			
2647				nav.on('click', 'a', function(event) {
2648					event.preventDefault();
2649					$(this).addClass('current-dot').siblings().removeClass('current-dot');
2650					slides.eq($(this).index()).addClass('current').removeClass('prev').siblings().removeClass('current');
2651					slides.eq($(this).index()).prevAll().addClass('prev');
2652					slides.eq($(this).index()).nextAll().removeClass('prev');
2653				});
2654			});
2655		} );
2656		//End execute javascript for slider property clip
2657		
2658		//Start execute javascript for slider slice
2659		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-slice.default', function( $scope ) {
2660			jQuery(".slice-slide-container").each(function() {
2661				var slide = jQuery(this).children('.slide');
2662				var navPrev = jQuery('.js-prev');
2663				var navNext = jQuery('.js-next');
2664				
2665				var SliceSlider = {
2666    
2667			    /**
2668			     * Settings Object
2669			     */
2670			    settings: {
2671			      delta:              0,
2672			      currentSlideIndex:  0,
2673			      scrollThreshold:    40,
2674			      slides:             slide,
2675			      numSlides:          slide.length,
2676			      navPrev:            navPrev,
2677			      navNext:            navNext,
2678			    },
2679			    
2680			    /**
2681			     * Init
2682			     */
2683			    init: function() {
2684			      s = this.settings;
2685			      this.bindEvents();
2686			    },
2687			    
2688			    /**
2689			     * Bind our click, scroll, key events
2690			     */
2691			    bindEvents: function(){
2692			      
2693			      // Scrollwheel & trackpad
2694			      /*s.slides.on({
2695			        'DOMMouseScroll mousewheel' : SliceSlider.handleScroll
2696			      });*/
2697			      // On click prev
2698			      s.navPrev.on({
2699			        'click' : SliceSlider.prevSlide
2700			      });
2701			      // On click next
2702			      s.navNext.on({
2703			        'click' : SliceSlider.nextSlide
2704			      });
2705			      // On Arrow keys
2706			      $(document).keyup(function(e) {
2707			        // Left or back arrows
2708			        if ((e.which === 37) ||  (e.which === 38)){
2709			          SliceSlider.prevSlide();
2710			        }
2711			        // Down or right
2712			        if ((e.which === 39) ||  (e.which === 40)) {
2713			          SliceSlider.nextSlide();
2714			        }
2715			      });
2716			    },
2717			    
2718			    /** 
2719			     * Interept scroll direction
2720			     */
2721			    handleScroll: function(e){
2722			
2723			      // Scrolling up
2724			      if (e.originalEvent.detail < 0 || e.originalEvent.wheelDelta > 0) { 
2725			
2726			        s.delta--;
2727			     
2728			        if ( Math.abs(s.delta) >= s.scrollThreshold) {
2729			          SliceSlider.prevSlide();
2730			        }
2731			      }
2732			 
2733			      // Scrolling Down
2734			      else {
2735			 
2736			        s.delta++;
2737			 
2738			        if (s.delta >= s.scrollThreshold) {
2739			          SliceSlider.nextSlide();
2740			        }
2741			      }
2742			 
2743			      // Prevent page from scrolling
2744			      return false;
2745			    },
2746			
2747			    /**
2748			     * Show Slide
2749			     */
2750			    showSlide: function(){ 
2751			      // reset
2752			      s.delta = 0;
2753			      // Bail if we're already sliding
2754			      if ($('body').hasClass('is-sliding')){
2755			        return;
2756			      }
2757			      // Loop through our slides
2758			      s.slides.each(function(i, slide) {
2759			
2760			        // Toggle the is-active class to show slide
2761			        $(slide).toggleClass('is-active', (i === s.currentSlideIndex)); 
2762			        $(slide).toggleClass('is-prev', (i === s.currentSlideIndex - 1)); 
2763			        $(slide).toggleClass('is-next', (i === s.currentSlideIndex + 1)); 
2764			        
2765			        // Add and remove is-sliding class
2766			        $('body').addClass('is-sliding');
2767			
2768			        setTimeout(function(){
2769			            $('body').removeClass('is-sliding');
2770			        }, 1000);
2771			      });
2772			    },
2773			
2774			    /**
2775			     * Previous Slide
2776			     */
2777			    prevSlide: function(){
2778			      
2779			      // If on first slide, loop to last
2780			      if (s.currentSlideIndex <= 0) {
2781			        s.currentSlideIndex = s.numSlides;
2782			      }
2783			      s.currentSlideIndex--;
2784			      
2785			      SliceSlider.showSlide();
2786			    },
2787			
2788			    /**
2789			     * Next Slide
2790			     */
2791			    nextSlide: function(){
2792			      
2793			      s.currentSlideIndex++;
2794			   
2795			      // If on last slide, loop to first
2796			      if (s.currentSlideIndex >= s.numSlides) { 
2797			        s.currentSlideIndex = 0;
2798			      }
2799			 
2800			      SliceSlider.showSlide();
2801			    },
2802			  };
2803			  SliceSlider.init();
2804			});
2805		} );
2806		//End execute javascript for slider slice
2807		
2808		//Start execute javascript for slider flip
2809		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-flip.default', function( $scope ) {
2810			//jQuery('body').addClass('elementor-fullscreen');
2811			//jQuery('body').addClass('elementor-overflow');
2812			
2813			var Gallery = (function() {
2814			    var scrollTimeId;
2815			    var posLeft = 0;
2816			
2817			    function Gallery(config) {
2818			        this.list = $(config.list);
2819			        this.items = this.list.find('li');
2820			        this.itemWidth = this.items.outerWidth();
2821			    };
2822			
2823			    Gallery.prototype = {
2824			        constructor: Gallery,
2825			
2826			        init: function() {
2827			            this.setGalleryWidth();
2828			            this.eventManager();
2829			
2830			            return this;
2831			        },
2832			
2833			        eventManager: function() {
2834			            var _this = this;
2835			
2836			            $("html, body").on('mousewheel', function(event) {
2837			                clearTimeout(scrollTimeId);
2838			                scrollTimeId = setTimeout(onScrollEventHandler.bind(this, event, _this.itemWidth), 0);
2839			            });
2840			        },
2841			
2842			        setGalleryWidth: function() {
2843			            this.list.css('width', this.getGalleryWidth());
2844			            this.list.css('overflow', 'scroll');
2845			        },
2846			
2847			        getGalleryWidth: function() {
2848			            var width = 0;
2849			
2850			            this.items.each(function(index, item) {
2851			                width += $(this).outerWidth();
2852			            });
2853			
2854			            return width;
2855			        }
2856			    };
2857			
2858			    function onScrollEventHandler(event, width) {
2859			      if (event.deltaY > 0) {
2860			        this.scrollLeft -= width / 20;
2861			      } else {
2862			        this.scrollLeft += width / 20;
2863			      }
2864			
2865			      event.preventDefault();
2866			    };
2867			
2868			    return Gallery;
2869			})();
2870			
2871			
2872			$(document).ready(function() {
2873			    var gallery = new Gallery({
2874			        list: '.flip-slide-container .container .gallery'
2875			    }).init();
2876			    
2877			    jQuery('.flip-slide-container').css('overflow', 'scroll');
2878			    jQuery('body').css('overflow-x', 'scroll');
2879			});
2880		} );
2881		//End execute javascript for slider flip
2882		
2883		//Start execute javascript for slider split carousel
2884		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-split-carousel.default', function( $scope ) {
2885			jQuery(".split-carousel-slider-wrapper").each(function() {
2886				var $carousel = jQuery(this);
2887			
2888				var fullscreen = $carousel.attr('data-fullscreen');
2889				if(fullscreen != 0)
2890				{
2891					jQuery('body').addClass('elementor-fullscreen');
2892					
2893					//Get menu element height
2894					var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
2895					var documentHeight = jQuery(window).innerHeight();
2896					var sliderHeight = parseInt(documentHeight - menuHeight);
2897					
2898					$carousel.css('height', sliderHeight+'px');
2899					
2900					jQuery( window ).resize(function() {
2901						var menuHeight = parseInt(jQuery('#wrapper').css('paddingTop'));
2902						var documentHeight = jQuery(window).innerHeight();
2903						var sliderHeight = parseInt(documentHeight - menuHeight);
2904						
2905						$carousel.css('height', sliderHeight+'px');
2906					});
2907				}
2908				
2909				var activeIndex = 0;
2910				var limit = 0;
2911				var disabled = false;
2912				var $stage = void 0;
2913				var $controls = void 0;
2914				var canvas = false;
2915				
2916				var SPIN_FORWARD_CLASS = 'js-spin-fwd';
2917				var SPIN_BACKWARD_CLASS = 'js-spin-bwd';
2918				var DISABLE_TRANSITIONS_CLASS = 'js-transitions-disabled';
2919				var SPIN_DUR = 1000;
2920				
2921				var appendControls = function appendControls() {
2922				    for (var i = 0; i < limit; i++) {
2923				        $('.carousel-control').append('<a href="#" data-index="' + i + '"></a>');
2924				    }
2925				    var height = $('.carousel-control').children().last().outerHeight();
2926				
2927				    $('.carousel-control').css('height', 30 + limit * height);
2928				    $controls = $('.carousel-control').children();
2929				    $controls.eq(activeIndex).addClass('active');
2930				};
2931				
2932				var setIndexes = function setIndexes() {
2933				    $('.spinner').children().each(function (i, el) {
2934				        $(el).attr('data-index', i);
2935				        limit++;
2936				    });
2937				};
2938				
2939				var duplicateSpinner = function duplicateSpinner() {
2940				    var $el = $('.spinner').parent();
2941				    var html = $('.spinner').parent().html();
2942				    $el.append(html);
2943				    $('.spinner').last().addClass('spinner--right');
2944				    $('.spinner--right').removeClass('spinner--left');
2945				};
2946				
2947				var paintFaces = function paintFaces() {
2948				    $('.spinner-face').each(function (i, el) {
2949				        var $el = $(el);
2950				        var color = $(el).attr('data-bg');
2951				        $el.children().css('backgroundImage', 'url(' + getBase64PixelByColor(color) + ')');
2952				    });
2953				};
2954				
2955				var getBase64PixelByColor = function getBase64PixelByColor(hex) {
2956				    if (!canvas) {
2957				        canvas = document.createElement('canvas');
2958				        canvas.height = 1;
2959				        canvas.width = 1;
2960				    }
2961				    if (canvas.getContext) {
2962				        var ctx = canvas.getContext('2d');
2963				        ctx.fillStyle = hex;
2964				        ctx.fillRect(0, 0, 1, 1);
2965				        return canvas.toDataURL();
2966				    }
2967				    return false;
2968				};
2969				
2970				var prepareDom = function prepareDom() {
2971				    setIndexes();
2972				    paintFaces();
2973				    duplicateSpinner();
2974				    appendControls();
2975				};
2976				
2977				var spin = function spin() {
2978				    var inc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
2979				
2980				    if (disabled) return;
2981				    if (!inc) return;
2982				    activeIndex += inc;
2983				    disabled = true;
2984				
2985				    if (activeIndex >= limit) {
2986				        activeIndex = 0;
2987				    }
2988				
2989				    if (activeIndex < 0) {
2990				        activeIndex = limit - 1;
2991				    }
2992				
2993				    var $activeEls = $('.spinner-face.js-active');
2994				    var $nextEls = $('.spinner-face[data-index=' + activeIndex + ']');
2995				    $nextEls.addClass('js-next');
2996				
2997				    if (inc > 0) {
2998				        $stage.addClass(SPIN_FORWARD_CLASS);
2999				    } else {
3000				        $stage.addClass(SPIN_BACKWARD_CLASS);
3001				    }
3002				
3003				    $controls.removeClass('active');
3004				    $controls.eq(activeIndex).addClass('active');
3005				
3006				    setTimeout(function () {
3007				        spinCallback(inc);
3008				    }, SPIN_DUR, inc);
3009				};
3010				
3011				var spinCallback = function spinCallback(inc) {
3012				
3013				    $('.js-active').removeClass('js-active');
3014				    $('.js-next').removeClass('js-next').addClass('js-active');
3015				    $stage.addClass(DISABLE_TRANSITIONS_CLASS).removeClass(SPIN_FORWARD_CLASS).removeClass(SPIN_BACKWARD_CLASS);
3016				
3017				    $('.js-active').each(function (i, el) {
3018				        var $el = $(el);
3019				        $el.prependTo($el.parent());
3020				    });
3021				    setTimeout(function () {
3022				        $stage.removeClass(DISABLE_TRANSITIONS_CLASS);
3023				        disabled = false;
3024				    }, 100);
3025				};
3026				
3027				var attachListeners = function attachListeners() {
3028				
3029				    document.onkeyup = function (e) {
3030				        switch (e.keyCode) {
3031				            case 38:
3032				                spin(-1);
3033				                break;
3034				            case 40:
3035				                spin(1);
3036				                break;
3037				        }
3038				    };
3039				    
3040				    $carousel.bind('DOMMouseScroll', function(e){
3041					     if(e.originalEvent.detail > 0) {
3042					         //scroll down
3043					         spin(1);
3044					     }else {
3045					         //scroll up
3046					         spin(-1);
3047					     }
3048					
3049					     //prevent page fom scrolling
3050					     return false;
3051					 });
3052					
3053					 //IE, Opera, Safari
3054					 $carousel.bind('mousewheel', function(e){
3055					     if(e.originalEvent.wheelDelta < 0) {
3056					         //scroll down
3057					         spin(1);
3058					     }else {
3059					         //scroll up
3060					         spin(-1);
3061					     }
3062					
3063					     //prevent page fom scrolling
3064					     return false;
3065					 });
3066				    
3067				    jQuery('body').on('touchmove', function(e){
3068					  e.preventDefault();
3069					  e.stopPropagation();
3070					  
3071					  return false;
3072					});
3073				    
3074				    var ts;
3075					$carousel.bind('touchstart', function (e){
3076					   ts = e.originalEvent.touches[0].clientY;
3077					});
3078					
3079					$carousel.bind('touchend', function (e){
3080					   var te = e.originalEvent.changedTouches[0].clientY;
3081					   if(ts > te+5){
3082					      spin(1);
3083					   }else if(ts < te-5){
3084					      spin(-1);
3085					   }
3086					});
3087				
3088				    $controls.on('click', function (e) {
3089				        e.preventDefault();
3090				        if (disabled) return;
3091				        var $el = $(e.target);
3092				        var toIndex = parseInt($el.attr('data-index'), 10);
3093				        spin(toIndex - activeIndex);
3094				    });
3095				};
3096				
3097				var assignEls = function assignEls() {
3098				    $stage = $('.carousel-stage');
3099				};
3100				
3101				var init = function init() {
3102				    assignEls();
3103				    prepareDom();
3104				    attachListeners();
3105				};
3106				
3107				$(function () {
3108				    init();
3109				});
3110			});
3111		} );
3112		//End execute javascript for slider split carousel
3113		
3114		//Start execute javascript for horizontal timeline
3115		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-horizontal-timeline.default', function( $scope ) {
3116			var timelines = jQuery('.cd-horizontal-timeline');
3117			var eventsMinDistance = timelines.attr('data-spacing');
3118			
3119			if(eventsMinDistance == '')
3120			{
3121				eventsMinDistance = 60;
3122			}
3123	
3124		(timelines.length > 0) && initTimeline(timelines);
3125	
3126		function initTimeline(timelines) {
3127			timelines.each(function(){
3128				var timeline = jQuery(this),
3129					timelineComponents = {};
3130				//cache timeline components 
3131				timelineComponents['timelineWrapper'] = timeline.find('.events-wrapper');
3132				timelineComponents['eventsWrapper'] = timelineComponents['timelineWrapper'].children('.events');
3133				timelineComponents['fillingLine'] = timelineComponents['eventsWrapper'].children('.filling-line');
3134				timelineComponents['timelineEvents'] = timelineComponents['eventsWrapper'].find('a');
3135				timelineComponents['timelineDates'] = parseDate(timelineComponents['timelineEvents']);
3136				timelineComponents['eventsMinLapse'] = minLapse(timelineComponents['timelineDates']);
3137				timelineComponents['timelineNavigation'] = timeline.find('.cd-timeline-navigation');
3138				timelineComponents['eventsContent'] = timeline.children('.events-content');
3139	
3140				//assign a left postion to the single events along the timeline
3141				setDatePosition(timelineComponents, eventsMinDistance);
3142				//assign a width to the timeline
3143				var timelineTotWidth = setTimelineWidth(timelineComponents, eventsMinDistance);
3144				//the timeline has been initialize - show it
3145				timeline.addClass('loaded');
3146	
3147				//detect click on the next arrow
3148				timelineComponents['timelineNavigation'].on('click', '.next', function(event){
3149					event.preventDefault();
3150					updateSlide(timelineComponents, timelineTotWidth, 'next');
3151				});
3152				//detect click on the prev arrow
3153				timelineComponents['timelineNavigation'].on('click', '.prev', function(event){
3154					event.preventDefault();
3155					updateSlide(timelineComponents, timelineTotWidth, 'prev');
3156				});
3157				//detect click on the a single event - show new event content
3158				timelineComponents['eventsWrapper'].on('click', 'a', function(event){
3159					event.preventDefault();
3160					timelineComponents['timelineEvents'].removeClass('selected');
3161					jQuery(this).addClass('selected');
3162					updateOlderEvents(jQuery(this));
3163					updateFilling(jQuery(this), timelineComponents['fillingLine'], timelineTotWidth);
3164					updateVisibleContent(jQuery(this), timelineComponents['eventsContent']);
3165				});
3166	
3167				//on swipe, show next/prev event content
3168				timelineComponents['eventsContent'].on('swipeleft', function(){
3169					var mq = checkMQ();
3170					( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'next');
3171				});
3172				timelineComponents['eventsContent'].on('swiperight', function(){
3173					var mq = checkMQ();
3174					( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'prev');
3175				});
3176	
3177				//keyboard navigation
3178				jQuery(document).keyup(function(event){
3179					if(event.which=='37' && elementInViewport(timeline.get(0)) ) {
3180						showNewContent(timelineComponents, timelineTotWidth, 'prev');
3181					} else if( event.which=='39' && elementInViewport(timeline.get(0))) {
3182						showNewContent(timelineComponents, timelineTotWidth, 'next');
3183					}
3184				});
3185			});
3186		}
3187	
3188		function updateSlide(timelineComponents, timelineTotWidth, string) {
3189			//retrieve translateX value of timelineComponents['eventsWrapper']
3190			var translateValue = getTranslateValue(timelineComponents['eventsWrapper']),
3191				wrapperWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', ''));
3192			//translate the timeline to the left('next')/right('prev') 
3193			(string == 'next') 
3194				? translateTimeline(timelineComponents, translateValue - wrapperWidth + eventsMinDistance, wrapperWidth - timelineTotWidth)
3195				: translateTimeline(timelineComponents, translateValue + wrapperWidth - eventsMinDistance);
3196		}
3197	
3198		function showNewContent(timelineComponents, timelineTotWidth, string) {
3199			//go from one event to the next/previous one
3200			var visibleContent =  timelineComponents['eventsContent'].find('.selected'),
3201				newContent = ( string == 'next' ) ? visibleContent.next() : visibleContent.prev();
3202	
3203			if ( newContent.length > 0 ) { //if there's a next/prev event - show it
3204				var selectedDate = timelineComponents['eventsWrapper'].find('.selected'),
3205					newEvent = ( string == 'next' ) ? selectedDate.parent('li').next('li').children('a') : selectedDate.parent('li').prev('li').children('a');
3206				
3207				updateFilling(newEvent, timelineComponents['fillingLine'], timelineTotWidth);
3208				updateVisibleContent(newEvent, timelineComponents['eventsContent']);
3209				newEvent.addClass('selected');
3210				selectedDate.removeClass('selected');
3211				updateOlderEvents(newEvent);
3212				updateTimelinePosition(string, newEvent, timelineComponents, timelineTotWidth);
3213			}
3214		}
3215	
3216		function updateTimelinePosition(string, event, timelineComponents, timelineTotWidth) {
3217			//translate timeline to the left/right according to the position of the selected event
3218			var eventStyle = window.getComputedStyle(event.get(0), null),
3219				eventLeft = Number(eventStyle.getPropertyValue("left").replace('px', '')),
3220				timelineWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')),
3221				timelineTotWidth = Number(timelineComponents['eventsWrapper'].css('width').replace('px', ''));
3222			var timelineTranslate = getTranslateValue(timelineComponents['eventsWrapper']);
3223	
3224	        if( (string == 'next' && eventLeft > timelineWidth - timelineTranslate) || (string == 'prev' && eventLeft < - timelineTranslate) ) {
3225	        	translateTimeline(timelineComponents, - eventLeft + timelineWidth/2, timelineWidth - timelineTotWidth);
3226	        }
3227		}
3228	
3229		function translateTimeline(timelineComponents, value, totWidth) {
3230			var eventsWrapper = timelineComponents['eventsWrapper'].get(0);
3231			value = (value > 0) ? 0 : value; //only negative translate value
3232			value = ( !(typeof totWidth === 'undefined') &&  value < totWidth ) ? totWidth : value; //do not translate more than timeline width
3233			setTransformValue(eventsWrapper, 'translateX', value+'px');
3234			//update navigation arrows visibility
3235			(value == 0 ) ? timelineComponents['timelineNavigation'].find('.prev').addClass('inactive') : timelineComponents['timelineNavigation'].find('.prev').removeClass('inactive');
3236			(value == totWidth ) ? timelineComponents['timelineNavigation'].find('.next').addClass('inactive') : timelineComponents['timelineNavigation'].find('.next').removeClass('inactive');
3237		}
3238	
3239		function updateFilling(selectedEvent, filling, totWidth) {
3240			//change .filling-line length according to the selected event
3241			var eventStyle = window.getComputedStyle(selectedEvent.get(0), null),
3242				eventLeft = eventStyle.getPropertyValue("left"),
3243				eventWidth = eventStyle.getPropertyValue("width");
3244			eventLeft = Number(eventLeft.replace('px', '')) + Number(eventWidth.replace('px', ''))/2;
3245			var scaleValue = eventLeft/totWidth;
3246			setTransformValue(filling.get(0), 'scaleX', scaleValue);
3247		}
3248	
3249		function setDatePosition(timelineComponents, min) {
3250			for (i = 0; i < timelineComponents['timelineDates'].length; i++) { 
3251			    var distance = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][i]),
3252			    	distanceNorm = Math.round(distance/timelineComponents['eventsMinLapse']) + 2;
3253			    timelineComponents['timelineEvents'].eq(i).css('left', distanceNorm*min+'px');
3254			}
3255		}
3256	
3257		function setTimelineWidth(timelineComponents, width) {
3258			var timeSpan = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][timelineComponents['timelineDates'].length-1]),
3259				timeSpanNorm = timeSpan/timelineComponents['eventsMinLapse'],
3260				timeSpanNorm = Math.round(timeSpanNorm) + 4,
3261				totalWidth = timeSpanNorm*width;
3262			timelineComponents['eventsWrapper'].css('width', totalWidth+'px');
3263			updateFilling(timelineComponents['timelineEvents'].eq(0), timelineComponents['fillingLine'], totalWidth);
3264		
3265			return totalWidth;
3266		}
3267	
3268		function updateVisibleContent(event, eventsContent) {
3269			var eventDate = event.data('date'),
3270				visibleContent = eventsContent.find('.selected'),
3271				selectedContent = eventsContent.find('[data-date="'+ eventDate +'"]'),
3272				selectedContentHeight = selectedContent.height();
3273	
3274			if (selectedContent.index() > visibleContent.index()) {
3275				var classEnetering = 'selected enter-right',
3276					classLeaving = 'leave-left';
3277			} else {
3278				var classEnetering = 'selected enter-left',
3279					classLeaving = 'leave-right';
3280			}
3281	
3282			selectedContent.attr('class', classEnetering);
3283			visibleContent.attr('class', classLeaving).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(){
3284				visibleContent.removeClass('leave-right leave-left');
3285				selectedContent.removeClass('enter-left enter-right');
3286			});
3287			eventsContent.css('height', selectedContentHeight+'px');
3288		}
3289	
3290		function updateOlderEvents(event) {
3291			event.parent('li').prevAll('li').children('a').addClass('older-event').end().end().nextAll('li').children('a').removeClass('older-event');
3292		}
3293	
3294		function getTranslateValue(timeline) {
3295			var timelineStyle = window.getComputedStyle(timeline.get(0), null),
3296				timelineTranslate = timelineStyle.getPropertyValue("-webkit-transform") ||
3297	         		timelineStyle.getPropertyValue("-moz-transform") ||
3298	         		timelineStyle.getPropertyValue("-ms-transform") ||
3299	         		timelineStyle.getPropertyValue("-o-transform") ||
3300	         		timelineStyle.getPropertyValue("transform");
3301	
3302	        if( timelineTranslate.indexOf('(') >=0 ) {
3303	        	var timelineTranslate = timelineTranslate.split('(')[1];
3304	    		timelineTranslate = timelineTranslate.split(')')[0];
3305	    		timelineTranslate = timelineTranslate.split(',');
3306	    		var translateValue = timelineTranslate[4];
3307	        } else {
3308	        	var translateValue = 0;
3309	        }
3310	
3311	        return Number(translateValue);
3312		}
3313	
3314		function setTransformValue(element, property, value) {
3315			element.style["-webkit-transform"] = property+"("+value+")";
3316			element.style["-moz-transform"] = property+"("+value+")";
3317			element.style["-ms-transform"] = property+"("+value+")";
3318			element.style["-o-transform"] = property+"("+value+")";
3319			element.style["transform"] = property+"("+value+")";
3320		}
3321	
3322		//based on http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript
3323		function parseDate(events) {
3324			var dateArrays = [];
3325			events.each(function(){
3326				var dateComp = jQuery(this).data('date').split('/'),
3327					newDate = new Date(dateComp[2], dateComp[1]-1, dateComp[0]);
3328				dateArrays.push(newDate);
3329			});
3330		    return dateArrays;
3331		}
3332	
3333		function parseDate2(events) {
3334			var dateArrays = [];
3335			events.each(function(){
3336				var singleDate = jQuery(this),
3337					dateComp = singleDate.data('date').split('T');
3338				if( dateComp.length > 1 ) { //both DD/MM/YEAR and time are provided
3339					var dayComp = dateComp[0].split('/'),
3340						timeComp = dateComp[1].split(':');
3341				} else if( dateComp[0].indexOf(':') >=0 ) { //only time is provide
3342					var dayComp = ["2000", "0", "0"],
3343						timeComp = dateComp[0].split(':');
3344				} else { //only DD/MM/YEAR
3345					var dayComp = dateComp[0].split('/'),
3346						timeComp = ["0", "0"];
3347				}
3348				var	newDate = new Date(dayComp[2], dayComp[1]-1, dayComp[0], timeComp[0], timeComp[1]);
3349				dateArrays.push(newDate);
3350			});
3351		    return dateArrays;
3352		}
3353	
3354		function daydiff(first, second) {
3355		    return Math.round((second-first));
3356		}
3357	
3358		function minLapse(dates) {
3359			//determine the minimum distance among events
3360			var dateDistances = [];
3361			for (i = 1; i < dates.length; i++) { 
3362			    var distance = daydiff(dates[i-1], dates[i]);
3363			    dateDistances.push(distance);
3364			}
3365			return Math.min.apply(null, dateDistances);
3366		}
3367	
3368		/*
3369			How to tell if a DOM element is visible in the current viewport?
3370			http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
3371		*/
3372		function elementInViewport(el) {
3373			var top = el.offsetTop;
3374			var left = el.offsetLeft;
3375			var width = el.offsetWidth;
3376			var height = el.offsetHeight;
3377	
3378			while(el.offsetParent) {
3379			    el = el.offsetParent;
3380			    top += el.offsetTop;
3381			    left += el.offsetLeft;
3382			}
3383	
3384			return (
3385			    top < (window.pageYOffset + window.innerHeight) &&
3386			    left < (window.pageXOffset + window.innerWidth) &&
3387			    (top + height) > window.pageYOffset &&
3388			    (left + width) > window.pageXOffset
3389			);
3390		}
3391	
3392		function checkMQ() {
3393			//check if mobile or desktop device
3394			return window.getComputedStyle(document.querySelector('.cd-horizontal-timeline'), '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, "");
3395		}
3396		} );
3397		//End execute javascript for horizontal timeline
3398		
3399		
3400		//Start execute javascript for background list
3401		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-background-list.default', function( $scope ) {
3402			jQuery(".background-list-wrapper").each(function() {
3403				var parentDiv = jQuery(this);
3404				
3405				parentDiv.children('.background-list-column').hover(function () {
3406					parentDiv.find('.background-list-img').removeClass('hover');
3407				    jQuery(this).next('.background-list-img').addClass('hover');
3408				});
3409			});
3410		} );
3411		//End execute javascript for background list
3412		
3413		
3414		//Start execute javascript for portfolio masonry
3415		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-masonry.default', function( $scope ) {
3416			jQuery(function( $ ) {
3417				
3418				jQuery(".portfolio-masonry-content-wrapper.do-masonry").each(function() {
3419					var grid = jQuery(this);
3420					var cols = grid.attr('data-cols');
3421					cols = parseInt(cols);
3422					
3423					var gutter = 50;
3424					switch(cols)
3425					{
3426						case 2:
3427					        gutter = 50;
3428					        break;
3429					    case 3:
3430					        gutter = 40;
3431					        break;
3432					    case 4:
3433					        gutter = 30;
3434					        break;
3435					    case 5:
3436					        gutter = 20;
3437					        break;
3438					}
3439					
3440					grid.imagesLoaded(function() {
3441						grid.masonry({
3442							itemSelector: ".gallery-grid-item",
3443							columnWidth: ".gallery-grid-item",
3444							gutter : gutter
3445						});
3446					});
3447					
3448					jQuery(".portfolio-masonry-content-wrapper.do-masonry img.lazy_masonry").each(function() {
3449						var currentImg = jQuery(this);
3450						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
3451						
3452						var cols = grid.attr('data-cols');
3453						
3454						var gutter = 50;
3455						switch(cols)
3456						{
3457							case 2:
3458						        gutter = 50;
3459						        break;
3460						    case 3:
3461						        gutter = 40;
3462						        break;
3463						    case 4:
3464						        gutter = 30;
3465						        break;
3466						    case 5:
3467						        gutter = 20;
3468						        break;
3469						}
3470						
3471						jQuery(this).Lazy({
3472							onFinishedAll: function() {
3473								grid.masonry({
3474									itemSelector: ".portfolio-masonry-grid-wrapper.scale-anm",
3475									columnWidth: ".portfolio-masonry-grid-wrapper.scale-anm",
3476									gutter : gutter
3477								});
3478					        },
3479						});
3480					});
3481					
3482					jQuery(".portfolio-masonry-container").each(function() {
3483						var containderDiv = jQuery(this);
3484						var selectedClass = "";
3485						
3486						containderDiv.find(".filter-tag-btn").on('click', function(){
3487							containderDiv.find(".filter-tag-btn").removeClass("active");
3488							jQuery(this).addClass("active");
3489							selectedClass = jQuery(this).attr("data-rel"); 
3490							
3491							var gridDiv = containderDiv.find(".portfolio-masonry-content-wrapper.do-masonry");
3492							gridDiv.fadeTo(100, 0);
3493							gridDiv.find(".portfolio-masonry-grid-wrapper").css({
3494								opacity: 0,
3495								display: 'none',
3496								transform: 'scale(0.0)'
3497							});
3498							gridDiv.find(".portfolio-masonry-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
3499
3500						    setTimeout(function() {
3501						      jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
3502						      
3503						      jQuery("."+selectedClass).css({
3504								opacity: 1,
3505								display: 'block',
3506								transform: 'scale(1,1)'
3507							  });
3508						      
3509						      gridDiv.masonry('destroy');
3510						      var $grid = gridDiv.masonry({
3511									itemSelector: ".portfolio-masonry-grid-wrapper.scale-anm",
3512									columnWidth: ".portfolio-masonry-grid-wrapper.scale-anm",
3513									gutter : gutter
3514							  });
3515							  
3516							  $grid.masonry('reloadItems');
3517							  
3518							  setTimeout(function() {
3519							  	gridDiv.fadeTo(300, 1);
3520							  }, 300);
3521		
3522						    }, 300);
3523					    });
3524					});
3525				});
3526			});
3527		} );
3528		//End execute javascript for portfolio masonry
3529		
3530			
3531		//Start execute javascript for portfolio masonry grid
3532		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-masonry-grid.default', function( $scope ) {
3533			jQuery(function( $ ) {
3534				
3535				jQuery(".portfolio-masonry-content-wrapper.do-masonry").each(function() {
3536					var grid = jQuery(this);
3537					var cols = grid.attr('data-cols');
3538					cols = parseInt(cols);
3539					
3540					var gutter = 50;
3541					switch(cols)
3542					{
3543						case 2:
3544					        gutter = 50;
3545					        break;
3546					    case 3:
3547					        gutter = 40;
3548					        break;
3549					    case 4:
3550					        gutter = 30;
3551					        break;
3552					    case 5:
3553					        gutter = 20;
3554					        break;
3555					}
3556					
3557					grid.imagesLoaded(function() {
3558						grid.masonry({
3559							itemSelector: ".portfolio-masonry-grid-wrapper.scale-anm",
3560							columnWidth: ".portfolio-masonry-grid-wrapper.scale-anm",
3561							gutter : gutter
3562						});
3563					});
3564					
3565					jQuery(".portfolio-masonry-content-wrapper.do-masonry img.lazy_masonry").each(function() {
3566						var currentImg = jQuery(this);
3567						currentImg.parent("div.post-featured-image-hover").removeClass("lazy");
3568						
3569						var cols = grid.attr('data-cols');
3570						
3571						var gutter = 50;
3572						switch(cols)
3573						{
3574							case 2:
3575						        gutter = 50;
3576						        break;
3577						    case 3:
3578						        gutter = 40;
3579						        break;
3580						    case 4:
3581						        gutter = 30;
3582						        break;
3583						    case 5:
3584						        gutter = 20;
3585						        break;
3586						}
3587						
3588						jQuery(this).Lazy({
3589							onFinishedAll: function() {
3590								grid.masonry({
3591									itemSelector: ".gallery-grid-item",
3592									columnWidth: ".gallery-grid-item",
3593									gutter : gutter
3594								});
3595					        },
3596						});
3597					});
3598					
3599					jQuery(".portfolio-masonry-container").each(function() {
3600						var containderDiv = jQuery(this);
3601						var selectedClass = "";
3602						
3603						containderDiv.find(".filter-tag-btn").on('click', function(){
3604							containderDiv.find(".filter-tag-btn").removeClass("active");
3605							jQuery(this).addClass("active");
3606							selectedClass = jQuery(this).attr("data-rel"); 
3607							
3608							var gridDiv = containderDiv.find(".portfolio-masonry-content-wrapper.do-masonry");
3609							gridDiv.fadeTo(100, 0);
3610							gridDiv.find(".portfolio-masonry-grid-wrapper").css({
3611								opacity: 0,
3612								display: 'none',
3613								transform: 'scale(0.0)'
3614							});
3615							gridDiv.find(".portfolio-masonry-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
3616							
3617						    setTimeout(function() {
3618						      jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
3619						      
3620						      jQuery("."+selectedClass).css({
3621								opacity: 1,
3622								display: 'block',
3623								transform: 'scale(1,1)'
3624							  });
3625						      
3626						      gridDiv.masonry('destroy');
3627						      var $grid = gridDiv.masonry({
3628									itemSelector: ".portfolio-masonry-grid-wrapper.scale-anm",
3629									columnWidth: ".portfolio-masonry-grid-wrapper.scale-anm",
3630									gutter : gutter
3631							  });
3632							  
3633							  $grid.masonry('reloadItems');
3634							  
3635							  setTimeout(function() {
3636							  	gridDiv.fadeTo(300, 1);
3637							  }, 300);
3638		
3639						    }, 300);
3640					    });
3641					});
3642				});
3643			});
3644		} );
3645		//End execute javascript for portfolio masonry grid
3646		
3647		
3648		//Start execute javascript for portfolio timeline
3649		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-timeline.default', function( $scope ) {
3650			var timelines = jQuery('.cd-horizontal-timeline');
3651			var eventsMinDistance = timelines.attr('data-spacing');
3652			
3653			if(eventsMinDistance == '')
3654			{
3655				eventsMinDistance = 60;
3656			}
3657	
3658		(timelines.length > 0) && initTimeline(timelines);
3659	
3660		function initTimeline(timelines) {
3661			timelines.each(function(){
3662				var timeline = jQuery(this),
3663					timelineComponents = {};
3664				//cache timeline components 
3665				timelineComponents['timelineWrapper'] = timeline.find('.events-wrapper');
3666				timelineComponents['eventsWrapper'] = timelineComponents['timelineWrapper'].children('.events');
3667				timelineComponents['fillingLine'] = timelineComponents['eventsWrapper'].children('.filling-line');
3668				timelineComponents['timelineEvents'] = timelineComponents['eventsWrapper'].find('a');
3669				timelineComponents['timelineDates'] = parseDate(timelineComponents['timelineEvents']);
3670				timelineComponents['eventsMinLapse'] = minLapse(timelineComponents['timelineDates']);
3671				timelineComponents['timelineNavigation'] = timeline.find('.cd-timeline-navigation');
3672				timelineComponents['eventsContent'] = timeline.children('.events-content');
3673	
3674				//assign a left postion to the single events along the timeline
3675				setDatePosition(timelineComponents, eventsMinDistance);
3676				//assign a width to the timeline
3677				var timelineTotWidth = setTimelineWidth(timelineComponents, eventsMinDistance);
3678				//the timeline has been initialize - show it
3679				timeline.addClass('loaded');
3680	
3681				//detect click on the next arrow
3682				timelineComponents['timelineNavigation'].on('click', '.next', function(event){
3683					event.preventDefault();
3684					updateSlide(timelineComponents, timelineTotWidth, 'next');
3685				});
3686				//detect click on the prev arrow
3687				timelineComponents['timelineNavigation'].on('click', '.prev', function(event){
3688					event.preventDefault();
3689					updateSlide(timelineComponents, timelineTotWidth, 'prev');
3690				});
3691				//detect click on the a single event - show new event content
3692				timelineComponents['eventsWrapper'].on('click', 'a', function(event){
3693					event.preventDefault();
3694					timelineComponents['timelineEvents'].removeClass('selected');
3695					jQuery(this).addClass('selected');
3696					updateOlderEvents(jQuery(this));
3697					updateFilling(jQuery(this), timelineComponents['fillingLine'], timelineTotWidth);
3698					updateVisibleContent(jQuery(this), timelineComponents['eventsContent']);
3699				});
3700	
3701				//on swipe, show next/prev event content
3702				timelineComponents['eventsContent'].on('swipeleft', function(){
3703					var mq = checkMQ();
3704					( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'next');
3705				});
3706				timelineComponents['eventsContent'].on('swiperight', function(){
3707					var mq = checkMQ();
3708					( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'prev');
3709				});
3710	
3711				//keyboard navigation
3712				jQuery(document).keyup(function(event){
3713					if(event.which=='37' && elementInViewport(timeline.get(0)) ) {
3714						showNewContent(timelineComponents, timelineTotWidth, 'prev');
3715					} else if( event.which=='39' && elementInViewport(timeline.get(0))) {
3716						showNewContent(timelineComponents, timelineTotWidth, 'next');
3717					}
3718				});
3719			});
3720		}
3721	
3722		function updateSlide(timelineComponents, timelineTotWidth, string) {
3723			//retrieve translateX value of timelineComponents['eventsWrapper']
3724			var translateValue = getTranslateValue(timelineComponents['eventsWrapper']),
3725				wrapperWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', ''));
3726			//translate the timeline to the left('next')/right('prev') 
3727			(string == 'next') 
3728				? translateTimeline(timelineComponents, translateValue - wrapperWidth + eventsMinDistance, wrapperWidth - timelineTotWidth)
3729				: translateTimeline(timelineComponents, translateValue + wrapperWidth - eventsMinDistance);
3730		}
3731	
3732		function showNewContent(timelineComponents, timelineTotWidth, string) {
3733			//go from one event to the next/previous one
3734			var visibleContent =  timelineComponents['eventsContent'].find('.selected'),
3735				newContent = ( string == 'next' ) ? visibleContent.next() : visibleContent.prev();
3736	
3737			if ( newContent.length > 0 ) { //if there's a next/prev event - show it
3738				var selectedDate = timelineComponents['eventsWrapper'].find('.selected'),
3739					newEvent = ( string == 'next' ) ? selectedDate.parent('li').next('li').children('a') : selectedDate.parent('li').prev('li').children('a');
3740				
3741				updateFilling(newEvent, timelineComponents['fillingLine'], timelineTotWidth);
3742				updateVisibleContent(newEvent, timelineComponents['eventsContent']);
3743				newEvent.addClass('selected');
3744				selectedDate.removeClass('selected');
3745				updateOlderEvents(newEvent);
3746				updateTimelinePosition(string, newEvent, timelineComponents, timelineTotWidth);
3747			}
3748		}
3749	
3750		function updateTimelinePosition(string, event, timelineComponents, timelineTotWidth) {
3751			//translate timeline to the left/right according to the position of the selected event
3752			var eventStyle = window.getComputedStyle(event.get(0), null),
3753				eventLeft = Number(eventStyle.getPropertyValue("left").replace('px', '')),
3754				timelineWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')),
3755				timelineTotWidth = Number(timelineComponents['eventsWrapper'].css('width').replace('px', ''));
3756			var timelineTranslate = getTranslateValue(timelineComponents['eventsWrapper']);
3757	
3758	        if( (string == 'next' && eventLeft > timelineWidth - timelineTranslate) || (string == 'prev' && eventLeft < - timelineTranslate) ) {
3759	        	translateTimeline(timelineComponents, - eventLeft + timelineWidth/2, timelineWidth - timelineTotWidth);
3760	        }
3761		}
3762	
3763		function translateTimeline(timelineComponents, value, totWidth) {
3764			var eventsWrapper = timelineComponents['eventsWrapper'].get(0);
3765			value = (value > 0) ? 0 : value; //only negative translate value
3766			value = ( !(typeof totWidth === 'undefined') &&  value < totWidth ) ? totWidth : value; //do not translate more than timeline width
3767			setTransformValue(eventsWrapper, 'translateX', value+'px');
3768			//update navigation arrows visibility
3769			(value == 0 ) ? timelineComponents['timelineNavigation'].find('.prev').addClass('inactive') : timelineComponents['timelineNavigation'].find('.prev').removeClass('inactive');
3770			(value == totWidth ) ? timelineComponents['timelineNavigation'].find('.next').addClass('inactive') : timelineComponents['timelineNavigation'].find('.next').removeClass('inactive');
3771		}
3772	
3773		function updateFilling(selectedEvent, filling, totWidth) {
3774			//change .filling-line length according to the selected event
3775			var eventStyle = window.getComputedStyle(selectedEvent.get(0), null),
3776				eventLeft = eventStyle.getPropertyValue("left"),
3777				eventWidth = eventStyle.getPropertyValue("width");
3778			eventLeft = Number(eventLeft.replace('px', '')) + Number(eventWidth.replace('px', ''))/2;
3779			var scaleValue = eventLeft/totWidth;
3780			setTransformValue(filling.get(0), 'scaleX', scaleValue);
3781		}
3782	
3783		function setDatePosition(timelineComponents, min) {
3784			for (i = 0; i < timelineComponents['timelineDates'].length; i++) { 
3785			    var distance = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][i]),
3786			    	distanceNorm = Math.round(distance/timelineComponents['eventsMinLapse']) + 2;
3787			    timelineComponents['timelineEvents'].eq(i).css('left', distanceNorm*min+'px');
3788			}
3789		}
3790	
3791		function setTimelineWidth(timelineComponents, width) {
3792			var timeSpan = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][timelineComponents['timelineDates'].length-1]),
3793				timeSpanNorm = timeSpan/timelineComponents['eventsMinLapse'],
3794				timeSpanNorm = Math.round(timeSpanNorm) + 4,
3795				totalWidth = timeSpanNorm*width;
3796			timelineComponents['eventsWrapper'].css('width', totalWidth+'px');
3797			updateFilling(timelineComponents['timelineEvents'].eq(0), timelineComponents['fillingLine'], totalWidth);
3798		
3799			return totalWidth;
3800		}
3801	
3802		function updateVisibleContent(event, eventsContent) {
3803			var eventDate = event.data('date'),
3804				visibleContent = eventsContent.find('.selected'),
3805				selectedContent = eventsContent.find('[data-date="'+ eventDate +'"]'),
3806				selectedContentHeight = selectedContent.height();
3807	
3808			if (selectedContent.index() > visibleContent.index()) {
3809				var classEnetering = 'selected enter-right',
3810					classLeaving = 'leave-left';
3811			} else {
3812				var classEnetering = 'selected enter-left',
3813					classLeaving = 'leave-right';
3814			}
3815	
3816			selectedContent.attr('class', classEnetering);
3817			visibleContent.attr('class', classLeaving).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(){
3818				visibleContent.removeClass('leave-right leave-left');
3819				selectedContent.removeClass('enter-left enter-right');
3820			});
3821			eventsContent.css('height', selectedContentHeight+'px');
3822		}
3823	
3824		function updateOlderEvents(event) {
3825			event.parent('li').prevAll('li').children('a').addClass('older-event').end().end().nextAll('li').children('a').removeClass('older-event');
3826		}
3827	
3828		function getTranslateValue(timeline) {
3829			var timelineStyle = window.getComputedStyle(timeline.get(0), null),
3830				timelineTranslate = timelineStyle.getPropertyValue("-webkit-transform") ||
3831	         		timelineStyle.getPropertyValue("-moz-transform") ||
3832	         		timelineStyle.getPropertyValue("-ms-transform") ||
3833	         		timelineStyle.getPropertyValue("-o-transform") ||
3834	         		timelineStyle.getPropertyValue("transform");
3835	
3836	        if( timelineTranslate.indexOf('(') >=0 ) {
3837	        	var timelineTranslate = timelineTranslate.split('(')[1];
3838	    		timelineTranslate = timelineTranslate.split(')')[0];
3839	    		timelineTranslate = timelineTranslate.split(',');
3840	    		var translateValue = timelineTranslate[4];
3841	        } else {
3842	        	var translateValue = 0;
3843	        }
3844	
3845	        return Number(translateValue);
3846		}
3847	
3848		function setTransformValue(element, property, value) {
3849			element.style["-webkit-transform"] = property+"("+value+")";
3850			element.style["-moz-transform"] = property+"("+value+")";
3851			element.style["-ms-transform"] = property+"("+value+")";
3852			element.style["-o-transform"] = property+"("+value+")";
3853			element.style["transform"] = property+"("+value+")";
3854		}
3855	
3856		//based on http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript
3857		function parseDate(events) {
3858			var dateArrays = [];
3859			events.each(function(){
3860				var dateComp = jQuery(this).data('date').split('/'),
3861					newDate = new Date(dateComp[2], dateComp[1]-1, dateComp[0]);
3862				dateArrays.push(newDate);
3863			});
3864		    return dateArrays;
3865		}
3866	
3867		function parseDate2(events) {
3868			var dateArrays = [];
3869			events.each(function(){
3870				var singleDate = jQuery(this),
3871					dateComp = singleDate.data('date').split('T');
3872				if( dateComp.length > 1 ) { //both DD/MM/YEAR and time are provided
3873					var dayComp = dateComp[0].split('/'),
3874						timeComp = dateComp[1].split(':');
3875				} else if( dateComp[0].indexOf(':') >=0 ) { //only time is provide
3876					var dayComp = ["2000", "0", "0"],
3877						timeComp = dateComp[0].split(':');
3878				} else { //only DD/MM/YEAR
3879					var dayComp = dateComp[0].split('/'),
3880						timeComp = ["0", "0"];
3881				}
3882				var	newDate = new Date(dayComp[2], dayComp[1]-1, dayComp[0], timeComp[0], timeComp[1]);
3883				dateArrays.push(newDate);
3884			});
3885		    return dateArrays;
3886		}
3887	
3888		function daydiff(first, second) {
3889		    return Math.round((second-first));
3890		}
3891	
3892		function minLapse(dates) {
3893			//determine the minimum distance among events
3894			var dateDistances = [];
3895			for (i = 1; i < dates.length; i++) { 
3896			    var distance = daydiff(dates[i-1], dates[i]);
3897			    dateDistances.push(distance);
3898			}
3899			return Math.min.apply(null, dateDistances);
3900		}
3901	
3902		/*
3903			How to tell if a DOM element is visible in the current viewport?
3904			http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
3905		*/
3906		function elementInViewport(el) {
3907			var top = el.offsetTop;
3908			var left = el.offsetLeft;
3909			var width = el.offsetWidth;
3910			var height = el.offsetHeight;
3911	
3912			while(el.offsetParent) {
3913			    el = el.offsetParent;
3914			    top += el.offsetTop;
3915			    left += el.offsetLeft;
3916			}
3917	
3918			return (
3919			    top < (window.pageYOffset + window.innerHeight) &&
3920			    left < (window.pageXOffset + window.innerWidth) &&
3921			    (top + height) > window.pageYOffset &&
3922			    (left + width) > window.pageXOffset
3923			);
3924		}
3925	
3926		function checkMQ() {
3927			//check if mobile or desktop device
3928			return window.getComputedStyle(document.querySelector('.cd-horizontal-timeline'), '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, "");
3929		}
3930		} );
3931		//End execute javascript for portfolio timeline vertical
3932		
3933		
3934		//Start execute javascript for background list
3935		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-timeline-vertical.default', function( $scope ) {
3936			jQuery(".portfolio-timeline-vertical-content-wrapper").each(function() {
3937				var slideshow = jQuery(this);
3938				var autoPlay = slideshow.attr('data-autoplay');
3939				var autoPlayArr = false;
3940				if (typeof autoPlay != "undefined"){
3941					autoPlayArr = {
3942						delay: autoPlay
3943					};
3944				}
3945				
3946				var speed = slideshow.attr('data-speed');
3947				if (typeof speed == "undefined"){
3948					speed = 1600;
3949				}
3950				
3951				var timelineSwiper = new Swiper ('.portfolio-timeline-vertical-content-wrapper .timeline .swiper-container', {
3952				  direction: 'vertical',
3953				  loop: false,
3954				  speed: parseInt(speed),
3955				  autoplay: autoPlayArr,
3956				  pagination: {
3957				    el: '.swiper-pagination',
3958				    type: 'bullets',
3959				    renderBullet: function (index, className) {
3960					    var year = document.querySelectorAll('.swiper-slide')[index].getAttribute('data-year');
3961						return '<span class="' + className + '">' + year + '</span>';;
3962					},
3963					clickable: true
3964				  },
3965				  navigation: {
3966				    nextEl: '.swiper-button-next',
3967				    prevEl: '.swiper-button-prev',
3968				  },
3969				  breakpoints: {
3970				    768: {
3971				      direction: 'horizontal',
3972				    }
3973				  },
3974				  on: {
3975				    init: function () {
3976				      slideshow.delay(100).queue(function (next) { 
3977						jQuery(this).addClass('active');
3978					  });
3979				    },
3980				  }
3981				});
3982			});
3983		} );
3984		//End execute javascript for portfolio timeline vertical
3985		
3986		//Start execute javascript for slider parallax
3987		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-parallax.default', function( $scope ) {
3988			jQuery(".slider-parallax-wrapper").each(function() {
3989				var slideshow=jQuery(this);
3990				var timer = slideshow.attr('data-autoplay');
3991				var autoplay = true;
3992				
3993				if(timer == 0)
3994				{
3995					timer = false;
3996					autoplay = false;
3997				}
3998				
3999				var pagination = slideshow.attr('data-pagination');
4000				if(pagination == 0)
4001				{
4002					var pagination = false;
4003				}
4004				else
4005				{
4006					var pagination = true;
4007				}
4008				
4009				var navigation = slideshow.attr('data-navigation');
4010				if(navigation == 0)
4011				{
4012					var navigation = false;
4013				}
4014				else
4015				{
4016					var navigation = true;
4017				}
4018				
4019				var slideshowDuration = timer;
4020				
4021				function slideshowSwitch(slideshow,index,auto){
4022				  if(slideshow.data('wait')) return;
4023				
4024				  var slides = slideshow.find('.slide');
4025				  var pages = slideshow.find('.pagination');
4026				  var activeSlide = slides.filter('.is-active');
4027				  var activeSlideImage = activeSlide.find('.image-container');
4028				  var newSlide = slides.eq(index);
4029				  var newSlideImage = newSlide.find('.image-container');
4030				  var newSlideContent = newSlide.find('.slide-content');
4031				  var newSlideElements=newSlide.find('.caption > *');
4032				  if(newSlide.is(activeSlide))return;
4033				
4034				  newSlide.addClass('is-new');
4035				  var timeout=slideshow.data('timeout');
4036				  clearTimeout(timeout);
4037				  slideshow.data('wait',true);
4038				  var transition=slideshow.attr('data-transition');
4039				  if(transition=='fade'){
4040				    newSlide.css({
4041				      display:'block',
4042				      zIndex:2
4043				    });
4044				    newSlideImage.css({
4045				      opacity:0
4046				    });
4047				
4048				    TweenMax.to(newSlideImage,1,{
4049				      alpha:1,
4050				      onComplete:function(){
4051				        newSlide.addClass('is-active').removeClass('is-new');
4052				        activeSlide.removeClass('is-active');
4053				        newSlide.css({display:'',zIndex:''});
4054				        newSlideImage.css({opacity:''});
4055				        slideshow.find('.pagination').trigger('check');
4056				        slideshow.data('wait',false);
4057				        if(auto){
4058				          timeout=setTimeout(function(){
4059				            slideshowNext(slideshow,false,true);
4060				          },slideshowDuration);
4061				          slideshow.data('timeout',timeout);}}});
4062				  } else {
4063				    if(newSlide.index()>activeSlide.index()){
4064				      var newSlideRight=0;
4065				      var newSlideLeft='auto';
4066				      var newSlideImageRight=-slideshow.width()/8;
4067				      var newSlideImageLeft='auto';
4068				      var newSlideImageToRight=0;
4069				      var newSlideImageToLeft='auto';
4070				      var newSlideContentLeft='auto';
4071				      var newSlideContentRight=0;
4072				      var activeSlideImageLeft=-slideshow.width()/4;
4073				    } else {
4074				      var newSlideRight='';
4075				      var newSlideLeft=0;
4076				      var newSlideImageRight='auto';
4077				      var newSlideImageLeft=-slideshow.width()/8;
4078				      var newSlideImageToRight='';
4079				      var newSlideImageToLeft=0;
4080				      var newSlideContentLeft=0;
4081				      var newSlideContentRight='auto';
4082				      var activeSlideImageLeft=slideshow.width()/4;
4083				    }
4084				
4085				    newSlide.css({
4086				      display:'block',
4087				      width:0,
4088				      right:newSlideRight,
4089				      left:newSlideLeft
4090				      ,zIndex:2
4091				    });
4092				
4093				    newSlideImage.css({
4094				      width:slideshow.width(),
4095				      right:newSlideImageRight,
4096				      left:newSlideImageLeft
4097				    });
4098				
4099				    newSlideContent.css({
4100				      width:slideshow.width(),
4101				      left:newSlideContentLeft,
4102				      right:newSlideContentRight
4103				    });
4104				
4105				    activeSlideImage.css({
4106				      left:0
4107				    });
4108				
4109				    TweenMax.set(newSlideElements,{y:20,force3D:true});
4110				    TweenMax.to(activeSlideImage,1,{
4111				      left:activeSlideImageLeft,
4112				      ease:Power3.easeInOut
4113				    });
4114				
4115				    TweenMax.to(newSlide,1,{
4116				      width:slideshow.width(),
4117				      ease:Power3.easeInOut
4118				    });
4119				
4120				    TweenMax.to(newSlideImage,1,{
4121				      right:newSlideImageToRight,
4122				      left:newSlideImageToLeft,
4123				      ease:Power3.easeInOut
4124				    });
4125				
4126				    TweenMax.staggerFromTo(newSlideElements,0.8,{alpha:0,y:60},{alpha:1,y:0,ease:Power3.easeOut,force3D:true,delay:0.6},0.1,function(){
4127				      newSlide.addClass('is-active').removeClass('is-new');
4128				      activeSlide.removeClass('is-active');
4129				      newSlide.css({
4130				        display:'',
4131				        width:'',
4132				        left:'',
4133				        zIndex:''
4134				      });
4135				
4136				      newSlideImage.css({
4137				        width:'',
4138				        right:'',
4139				        left:''
4140				      });
4141				
4142				      newSlideContent.css({
4143				        width:'',
4144				        left:''
4145				      });
4146				
4147				      newSlideElements.css({
4148				        opacity:'',
4149				        transform:''
4150				      });
4151				
4152				      activeSlideImage.css({
4153				        left:''
4154				      });
4155				
4156				      slideshow.find('.pagination').trigger('check');
4157				      slideshow.data('wait',false);
4158				      if(auto){
4159				        timeout=setTimeout(function(){
4160				          slideshowNext(slideshow,false,true);
4161				        },slideshowDuration);
4162				        slideshow.data('timeout',timeout);
4163				      }
4164				    });
4165				  }
4166				}
4167				
4168				function slideshowNext(slideshow,previous,auto){
4169				  var slides=slideshow.find('.slide');
4170				  var activeSlide=slides.filter('.is-active');
4171				  var newSlide=null;
4172				  if(previous){
4173				    newSlide=activeSlide.prev('.slide');
4174				    if(newSlide.length === 0) {
4175				      newSlide=slides.last();
4176				    }
4177				  } else {
4178				    newSlide=activeSlide.next('.slide');
4179				    if(newSlide.length==0)
4180				      newSlide=slides.filter('.slide').first();
4181				  }
4182				
4183				  slideshowSwitch(slideshow,newSlide.index(),auto);
4184				}
4185				
4186				function homeSlideshowParallax(){
4187				  var scrollTop=jQuery(window).scrollTop();
4188				  if(scrollTop>windowHeight) return;
4189				  var inner=slideshow.find('.slideshow-inner');
4190				  var newHeight=windowHeight-(scrollTop/2);
4191				  var newTop=scrollTop*0.8;
4192				
4193				  inner.css({
4194				    transform:'translateY('+newTop+'px)',height:newHeight
4195				  });
4196				}
4197				
4198				jQuery(document).ready(function() {
4199				 jQuery('.slider-parallax-wrapper .slide').addClass('is-loaded');
4200				
4201				 jQuery('.slider-parallax-wrapper .arrows .arrow').on('click',function(){
4202				  slideshowNext(jQuery(this).closest('.slider-parallax-wrapper'),jQuery(this).hasClass('prev'));
4203				});
4204				
4205				 jQuery('.slider-parallax-wrapper .pagination .item').on('click',function(){
4206				  slideshowSwitch(jQuery(this).closest('.slider-parallax-wrapper'),jQuery(this).index());
4207				});
4208				
4209				 jQuery('.slider-parallax-wrapper .pagination').on('check',function(){
4210				  var slideshow=jQuery(this).closest('.slider-parallax-wrapper');
4211				  var pages=jQuery(this).find('.item');
4212				  var index=slideshow.find('.slider_parallax_slides .is-active').index();
4213				  pages.removeClass('is-active');
4214				  pages.eq(index).addClass('is-active');
4215				});
4216				
4217				if(autoplay)
4218				{
4219					var timeout=setTimeout(function(){
4220					  slideshowNext(slideshow,false,true);
4221					},slideshowDuration);
4222					
4223					slideshow.data('timeout',timeout);
4224				}
4225				});
4226			});
4227		} );
4228		//End execute javascript for slider parallax
4229		
4230		
4231		//Start execute javascript for distortion grid
4232		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-distortion-grid.default', function( $scope ) {
4233			Array.from(document.querySelectorAll('.distortion-grid-item-img')).forEac
4233h((el) => {
4234				const imgs = Array.from(el.querySelectorAll('img'));
4235				new hoverEffect({
4236					parent: el,
4237					intensity: el.dataset.intensity || undefined,
4238					speedIn: el.dataset.speedin || undefined,
4239					speedOut: el.dataset.speedout || undefined,
4240					easing: el.dataset.easing || undefined,
4241					hover: el.dataset.hover || undefined,
4242					image1: imgs[0].getAttribute('src'),
4243					image2: imgs[1].getAttribute('src'),
4244					displacementImage: el.dataset.displacement
4245				});
4246			});
4247		} );
4248		//End execute javascript for distortion grid
4249		
4250		
4251		//Start execute javascript for slider animated
4252		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-animated.default', function( $scope ) {
4253			var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4254
4255			function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4256			
4257			var $window = jQuery(window);
4258			var $body = jQuery('body');
4259			
4260			var Slideshow = function () {
4261			    function Slideshow() {
4262			        var _this = this;
4263			
4264			        var userOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4265			
4266			        _classCallCheck(this, Slideshow);
4267			
4268			        var defaultOptions = {
4269			            $el: jQuery('.animated-slider-wrapper'),
4270			            showArrows: false,
4271			            showPagination: true,
4272			            duration: 10000,
4273			            autoplay: true
4274			        };
4275			
4276			        var options = Object.assign({}, defaultOptions, userOptions);
4277			
4278			        this.$el = options.$el;
4279			        this.maxSlide = this.$el.find(jQuery('.js-slider-home-slide')).length;
4280			        this.showArrows = this.maxSlide > 1 ? options.showArrows : false;
4281			        this.showPagination = options.showPagination;
4282			        this.currentSlide = 1;
4283			        this.isAnimating = false;
4284			        this.animationDuration = 1200;
4285			        this.autoplaySpeed = options.duration;
4286			        this.interval;
4287			        this.$controls = this.$el.find('.js-slider-home-button');
4288			        this.autoplay = this.maxSlide > 1 ? options.autoplay : false;
4289			        this.autoplay = false;
4290			
4291			        this.$el.on('click', '.js-slider-home-next', function (event) {
4292			            return _this.nextSlide();
4293			        });
4294			        this.$el.on('click', '.js-slider-home-prev', function (event) {
4295			            return _this.prevSlide();
4296			        });
4297			        this.$el.on('click', '.js-pagination-item', function (event) {
4298			            if (!_this.isAnimating) {
4299			                _this.preventClick();
4300			                _this.goToSlide(event.target.dataset.slide);
4301			            }
4302			        });
4303			
4304			        this.init();
4305			    }
4306			
4307			    _createClass(Slideshow, [{
4308			        key: 'init',
4309			        value: function init() {
4310			            this.goToSlide(1);
4311			
4312			            if (this.autoplay) {
4313			                this.startAutoplay();
4314			            }
4315			
4316			            if (this.showPagination) {
4317			                var paginationNumber = this.maxSlide;
4318			                var pagination = '<div class="pagination"><div class="container">';
4319			
4320			                for (var i = 0; i < this.maxSlide; i++) {
4321			                    var item = '<span class="pagination-item js-pagination-item ' + (i === 0 ? 'is-current' : '') + '" data-slide=' + (i + 1) + '>' + (i + 1) + '</span>';
4322			                    pagination = pagination + item;
4323			                }
4324			
4325			                pagination = pagination + '</div></div>';
4326			
4327			                this.$el.append(pagination);
4328			            }
4329			        }
4330			    }, {
4331			        key: 'preventClick',
4332			        value: function preventClick() {
4333			            var _this2 = this;
4334			
4335			            this.isAnimating = true;
4336			            this.$controls.prop('disabled', true);
4337			            clearInterval(this.interval);
4338			
4339			            setTimeout(function () {
4340			                _this2.isAnimating = false;
4341			                _this2.$controls.prop('disabled', false);
4342			                if (_this2.autoplay) {
4343			                    _this2.startAutoplay();
4344			                }
4345			            }, this.animationDuration);
4346			        }
4347			    }, {
4348			        key: 'goToSlide',
4349			        value: function goToSlide(index) {
4350			            this.currentSlide = parseInt(index);
4351			
4352			            if (this.currentSlide > this.maxSlide) {
4353			                this.currentSlide = 1;
4354			            }
4355			
4356			            if (this.currentSlide === 0) {
4357			                this.currentSlide = this.maxSlide;
4358			            }
4359			
4360			            var newCurrent = this.$el.find('.js-slider-home-slide[data-slide="' + this.currentSlide + '"]');
4361			            var newPrev = this.currentSlide === 1 ? this.$el.find('.js-slider-home-slide').last() : newCurrent.prev('.js-slider-home-slide');
4362			            var newNext = this.currentSlide === this.maxSlide ? this.$el.find('.js-slider-home-slide').first() : newCurrent.next('.js-slider-home-slide');
4363			
4364			            this.$el.find('.js-slider-home-slide').removeClass('is-prev is-next is-current');
4365			            this.$el.find('.js-pagination-item').removeClass('is-current');
4366			
4367			            if (this.maxSlide > 1) {
4368			                newPrev.addClass('is-prev');
4369			                newNext.addClass('is-next');
4370			            }
4371			
4372			            newCurrent.addClass('is-current');
4373			            this.$el.find('.js-pagination-item[data-slide="' + this.currentSlide + '"]').addClass('is-current');
4374			        }
4375			    }, {
4376			        key: 'nextSlide',
4377			        value: function nextSlide() {
4378			            this.preventClick();
4379			            this.goToSlide(this.currentSlide + 1);
4380			        }
4381			    }, {
4382			        key: 'prevSlide',
4383			        value: function prevSlide() {
4384			            this.preventClick();
4385			            this.goToSlide(this.currentSlide - 1);
4386			        }
4387			    }, {
4388			        key: 'startAutoplay',
4389			        value: function startAutoplay() {
4390			            var _this3 = this;
4391			
4392			            this.interval = setInterval(function () {
4393			                if (!_this3.isAnimating) {
4394			                    _this3.nextSlide();
4395			                }
4396			            }, this.autoplaySpeed);
4397			        }
4398			    }, {
4399			        key: 'destroy',
4400			        value: function destroy() {
4401			            this.$el.off();
4402			        }
4403			    }]);
4404			
4405			    return Slideshow;
4406			}();
4407			
4408			(function () {
4409			    var loaded = false;
4410			    var maxLoad = 3000;
4411			
4412			    function load() {
4413			        var options = {
4414			            showPagination: true
4415			        };
4416			
4417			        var slideShow = new Slideshow(options);
4418			    }
4419			
4420			    function addLoadClass() {
4421			        $body.addClass('is-loaded');
4422			
4423			        setTimeout(function () {
4424			            $body.addClass('is-animated');
4425			        }, 600);
4426			    }
4427			
4428			    $window.on('load', function () {
4429			        if (!loaded) {
4430			            loaded = true;
4431			            load();
4432			        }
4433			    });
4434			
4435			    setTimeout(function () {
4436			        if (!loaded) {
4437			            loaded = true;
4438			            load();
4439			        }
4440			    }, maxLoad);
4441			
4442			    addLoadClass();
4443			})();
4444		} );
4445		//End execute javascript for slider animated
4446	
4447	
4448		//Start execute javascript for fade up slider
4449		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-fadeup.default', function( $scope ) {
4450			function init(item) {
4451				var items = item.querySelectorAll('li'),
4452		        current = 0,
4453		        autoUpdate = true;
4454		        
4455				//create nav
4456				var nav = document.createElement('nav');
4457				nav.className = 'nav_arrows';
4458		
4459				//create button prev
4460				var prevbtn = document.createElement('button');
4461				prevbtn.className = 'prev';
4462				prevbtn.setAttribute('aria-label', 'Prev');
4463		
4464				//create button next
4465				var nextbtn = document.createElement('button');
4466				nextbtn.className = 'next';
4467				nextbtn.setAttribute('aria-label', 'Next');
4468		
4469				//create counter
4470				var counter = document.createElement('div');
4471				counter.className = 'counter';
4472				counter.innerHTML = "<span>1</span><span>"+items.length+"</span>";
4473		
4474				if (items.length > 1) {
4475					nav.appendChild(prevbtn);
4476					nav.appendChild(counter);
4477					nav.appendChild(nextbtn);
4478					item.appendChild(nav);
4479				}
4480		
4481				items[current].className = "current";
4482				if (items.length > 1) items[items.length-1].className = "prev-slide";
4483		
4484				var navigate = function(dir) {
4485					items[current].className = "";
4486		
4487					if (dir === 'right') {
4488						current = current < items.length-1 ? current + 1 : 0;
4489					} else {
4490						current = current > 0 ? current - 1 : items.length-1;
4491					}
4492		
4493					var	nextCurrent = current < items.length-1 ? current + 1 : 0,
4494						prevCurrent = current > 0 ? current - 1 : items.length-1;
4495		
4496					items[current].className = "current";
4497					items[prevCurrent].className = "prev-slide";
4498					items[nextCurrent].className = "";
4499		
4500					//update counter
4501					counter.firstChild.textContent = current + 1;
4502				}
4503		    
4504		    item.addEventListener('mouseenter', function() {
4505					autoUpdate = false;
4506				});
4507		
4508				item.addEventListener('mouseleave', function() {
4509					autoUpdate = true;
4510				});
4511		    
4512				prevbtn.addEventListener('click', function() {
4513					navigate('left');
4514				});
4515		
4516				nextbtn.addEventListener('click', function() {
4517					navigate('right');
4518				});
4519		
4520				//keyboard navigation
4521				document.addEventListener('keydown', function(ev) {
4522					var keyCode = ev.keyCode || ev.which;
4523					switch (keyCode) {
4524						case 37:
4525							navigate('left');
4526							break;
4527						case 39:
4528							navigate('right');
4529							break;
4530					}
4531				});
4532		
4533				// swipe navigation
4534				// from http://stackoverflow.com/a/23230280
4535				item.addEventListener('touchstart', handleTouchStart, false);        
4536				item.addEventListener('touchmove', handleTouchMove, false);
4537				var xDown = null;
4538				var yDown = null;
4539				function handleTouchStart(evt) {
4540					xDown = evt.touches[0].clientX;
4541					yDown = evt.touches[0].clientY;
4542				};
4543				function handleTouchMove(evt) {
4544					if ( ! xDown || ! yDown ) {
4545						return;
4546					}
4547		
4548					var xUp = evt.touches[0].clientX;
4549					var yUp = evt.touches[0].clientY;
4550		
4551					var xDiff = xDown - xUp;
4552					var yDiff = yDown - yUp;
4553		
4554					if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {/*most significant*/
4555						if ( xDiff > 0 ) {
4556							/* left swipe */
4557							navigate('right');
4558						} else {
4559							navigate('left');
4560						}
4561					} 
4562					/* reset values */
4563					xDown = null;
4564					yDown = null;
4565				};
4566		
4567		
4568			}
4569		
4570			[].slice.call(document.querySelectorAll('.fadeup-slider-wrapper')).forEac
4570h( function(item) {
4571				init(item);
4572			});
4573		} );
4574		//End execute javascript for fade up slider
4575		
4576		
4577		//Start execute javascript for motion reveal slider
4578		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-motion-reveal.default', function( $scope ) {
4579			// The Slide class.
4580		    class Slide {
4581		        constructor(el) {
4582					this.DOM = {el: el};
4583					// The image conteiner.
4584					this.DOM.imgWrap = this.DOM.el.querySelector('.slide-img-wrap');
4585					// The revealer element (the element with the same color of the body that covers the image).
4586					this.DOM.revealer = this.DOM.imgWrap.querySelector('.slide-img-reveal');
4587					// The title element.
4588					this.DOM.title = this.DOM.el.querySelector('.slide-title');
4589					// The slide´s number element
4590					this.DOM.number = this.DOM.el.querySelector('.slide-number');
4591					// The large preview elements (also an image and revealer for the cover/uncover effect)
4592					this.DOM.preview = {
4593						imgWrap: this.DOM.el.querySelector('.preview-img-wrap'),
4594						revealer: this.DOM.el.querySelector('.preview-img-wrap > .preview-img-reveal'),
4595						title: this.DOM.el.querySelector('.preview-title'),
4596						content: this.DOM.el.querySelector('.preview-content')
4597					};
4598		
4599					// Some config values.
4600		            this.config = {
4601		                animation: {
4602		                    duration: 0.6,
4603		                    ease: Expo.easeOut
4604						}
4605		            };
4606				}
4607				// Sets the current class.
4608				setCurrent(isCurrent = true) {
4609					this.DOM.el.classList[isCurrent ? 'add' : 'remove']('slide-current');
4610				}
4611		        // Hide the slide.
4612		        hide(direction) {
4613					return this.toggle('hide', direction);
4614		        }
4615		        // Show the slide.
4616		        show(direction) {
4617		            return this.toggle('show', direction);
4618		        }
4619		        // Show/Hide the slide.
4620		        toggle(action, direction) {
4621					// Hide/Show revealer on top of the image and move the image, title and number.
4622		            return new Promise((resolve, reject) => {
4623						let revealerOpts = {
4624							delay: action === 'hide' ? 0 : this.config.animation.duration/2,
4625							ease: this.config.animation.ease,
4626							onComplete: resolve
4627						};
4628		
4629						const commonOpts = {
4630							delay: action === 'hide' ? 0 : this.config.animation.duration/2,
4631							ease: this.config.animation.ease,
4632							opacity: action === 'hide' ? 0 : 1
4633						};
4634						let imgOpts = Object.assign({},commonOpts);
4635						let numberOpts = Object.assign({},commonOpts);
4636						let titleOpts = Object.assign({},commonOpts);
4637		
4638						if ( direction === 'left' || direction === 'right' ) {
4639							revealerOpts.startAt = action === 'hide' ? {x: direction === 'left' ? '-100%' : '100%', y:'0%'} : {x: '0%', y:'0%'};
4640							revealerOpts.x = action === 'hide' ? '0%' : direction === 'left' ? '100%' : '-100%';
4641							imgOpts.startAt = action === 'show' ? {opacity: 0, x: direction === 'left' ? '-20%' : '20%'} : {};
4642							imgOpts.x = action === 'hide' ? direction === 'left' ? '20%' : '-20%' : '0%';
4643							titleOpts.startAt = action === 'show' ? {opacity: 1, scale: 0.2, x: direction === 'left' ? '-200%' : '200%'} : {};
4644							titleOpts.x = action === 'hide' ? direction === 'left' ? '200%' : '-200%' : '0%';
4645							titleOpts.scale = action === 'hide' ? 0.2 : 1;
4646							numberOpts.startAt = action === 'show' ? {opacity: 1, x: direction === 'left' ? '-50%' : '50%'} : {};
4647							numberOpts.x = action === 'hide' ? direction === 'left' ? '50%' : '-50%' : '0%';
4648						}
4649						else {
4650							revealerOpts.startAt = action === 'hide' ? {x:'0%', y: direction === 'down' ? '-100%' : '100%'} : {x:'0%', y: '0%'};
4651							revealerOpts.y = action === 'hide' ? '0%' : direction === 'down' ? '100%' : '-100%';
4652							imgOpts.startAt = action === 'show' ? {opacity: 1, y: direction === 'down' ? '-10%' : '10%'} : {};
4653							imgOpts.y = action === 'hide' ? direction === 'down' ? '10%' : '-10%' : '0%';
4654							titleOpts.ease = this.config.animation.ease,
4655							titleOpts.startAt = action === 'show' ? {opacity: 1, y: direction === 'down' ? '-100%' : '100%'} : {};
4656							titleOpts.y = action === 'hide' ? direction === 'down' ? '100%' : '-100%' : '0%';
4657						}
4658		
4659						// Toggling the revealer.
4660						TweenMax.to(this.DOM.revealer, this.config.animation.duration, revealerOpts);
4661						// Moving & fading the image (wrappper).
4662						TweenMax.to(this.DOM.imgWrap, this.config.animation.duration, imgOpts);
4663						// Moving & fading the title and number.
4664						TweenMax.to(this.DOM.title, this.config.animation.duration*1.5, titleOpts);
4665						TweenMax.to(this.DOM.number, this.config.animation.duration, numberOpts);
4666		            });
4667				}
4668				// Hide the preview element.
4669				hidePreview(delay) {
4670					return this.togglePreview('hide');
4671				}
4672				// Show the preview element.
4673				showPreview(delay) {
4674					return this.togglePreview('show');
4675				}
4676				// Show/Hide the preview.
4677				togglePreview(action) {
4678					return new Promise((resolve, reject) => {
4679						// Hide/Show revealer.
4680						TweenMax.to(this.DOM.preview.revealer, this.config.animation.duration, {
4681							delay: action === 'hide' ? 0 : this.config.animation.duration/2,
4682							ease: this.config.animation.ease,
4683							startAt: action === 'hide' ? {x:'0%', y:'-100%'} : {x:'0%', y:'0%'},
4684							y: action === 'hide' ? '0%' : '-100%',
4685							onComplete: resolve
4686						});
4687						// Move and fade the image wrapper.
4688						TweenMax.to(this.DOM.preview.imgWrap, this.config.animation.duration, {
4689							delay: action === 'hide' ? 0 : this.config.animation.duration/2,
4690							ease: this.config.animation.ease,
4691							startAt: action === 'hide' ? {} : {opacity: 0, y: '20%'},
4692							y: action === 'hide' ? '20%' : '0%',
4693							opacity: action === 'hide' ? 0 : 1
4694						});
4695						// Move and fade the title and content.
4696						TweenMax.to([this.DOM.preview.title,this.DOM.preview.content], this.config.animation.duration, {
4697							delay: action === 'hide' ? 0 : this.config.animation.duration/2,
4698							ease: this.config.animation.ease,
4699							startAt: action === 'hide' ? {} : {opacity: 0, y: '200%'},
4700							y: action === 'hide' ? '200%' : '0%',
4701							opacity: action === 'hide' ? 0 : 1
4702						});
4703					});
4704				}
4705		    }
4706		
4707		    // The Slideshow class.
4708		    class Slideshow {
4709		        constructor(el) {
4710					this.DOM = {el: el};
4711					// Navigation controls (prev, next and preview ctrls)
4712					this.DOM.prevCtrl = this.DOM.el.querySelector('.slidenav-item--prev');
4713					this.DOM.nextCtrl = this.DOM.el.querySelector('.slidenav-item--next');
4714					this.DOM.previewCtrl = this.DOM.el.querySelector('.slidenav-preview');
4715					// The slides.
4716		            this.slides = [];
4717		            Array.from(this.DOM.el.querySelectorAll('.slide')).forEac
4717h(slideEl => this.slides.push(new Slide(slideEl)));
4718		            // The total number of slides.
4719		            this.slidesTotal = this.slides.length;
4720		            // Current slide position.
4721		            this.current = 0;
4722					// initialize the slideshow.
4723					this.init();
4724				}
4725				// init: set the current slide and initialize some events..
4726		        init() {
4727					this.slides[this.current].setCurrent();
4728					this.initEvents();
4729				}
4730				initEvents() {
4731					this.DOM.prevCtrl.addEventListener('click', () => this.prev());
4732					this.DOM.nextCtrl.addEventListener('click', () => this.next());
4733					this.DOM.previewCtrl.addEventListener('click', (ev) => {
4734						if ( this.isAnimating ) return;
4735						if ( ev.target.classList.contains('slidenav-preview--open') ) {
4736							ev.target.classList.remove('slidenav-preview--open');
4737							this.exitPreview();
4738						}
4739						else {
4740							ev.target.classList.add('slidenav-preview--open')
4741							this.enterPreview();
4742						}
4743					});
4744				}
4745				prev() {
4746					this.navigate('left');
4747				}
4748				next() {
4749					this.navigate('right');
4750				}
4751				enterPreview() {
4752					this.togglePreview('enter');
4753				}
4754				exitPreview() {
4755					this.togglePreview('exit');
4756				}
4757				togglePreview(action) {
4758					// If animating return.
4759		            if ( this.isAnimating ) return;
4760					this.isAnimating = true;
4761					
4762					const processing = action === 'enter' ? 
4763							[this.slides[this.current].hide('up'), this.slides[this.current].showPreview()] :
4764							[this.slides[this.current].show('down'), this.slides[this.current].hidePreview()];
4765		
4766					// Hide the next/prev controls.
4767					this.toggleNavCtrls(action);
4768		
4769					Promise.all(processing).then(() => this.isAnimating = false);
4770				}
4771				toggleNavCtrls(action) {
4772					TweenMax.to([this.DOM.prevCtrl, this.DOM.nextCtrl], 0.5, {
4773						ease: 'Expo.easeOut',
4774						opacity: action === 'enter' ? 0 : 1,
4775						onStart: () => this.DOM.prevCtrl.style.pointerEvents = this.DOM.nextCtrl.style.pointerEvents = action === 'enter' ? 'none' : 'auto'
4776					});
4777				}
4778				// Navigate the slideshow.
4779		        navigate(direction) {
4780		            // If animating return.
4781		            if ( this.isAnimating ) return;
4782		            this.isAnimating = true;
4783		
4784		            const nextSlidePos = direction === 'right' ? 
4785		                    this.current < this.slidesTotal-1 ? this.current+1 : 0 :
4786		                    this.current > 0 ? this.current-1 : this.slidesTotal-1;
4787					
4788					Promise.all([this.slides[this.current].hide(direction), this.slides[nextSlidePos].show(direction)])
4789						   .then(() => {
4790								// Update current.
4791								this.slides[this.current].setCurrent(false);
4792								this.current = nextSlidePos;
4793								this.isAnimating = false;
4794								this.slides[this.current].setCurrent();
4795						   });
4796				}
4797		    }
4798		
4799			const slideshow = new Slideshow(document.querySelector('.motion-reveal-slider-wrapper.slideshow'));
4800		} );
4801		//End execute javascript for motion reveal slider
4802		
4803		
4804		//Start execute javascript for testimonials card
4805		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-testimonial-card.default', function( $scope ) {
4806			jQuery(".testimonials-card-wrapper .owl-carousel").each(function() {
4807				var autoPlay = jQuery(this).attr('data-autoplay');
4808				if (typeof autoPlay == "undefined"){
4809					autoPlay = false;
4810				}
4811				if(autoPlay == 1)
4812				{
4813					autoPlay = true;
4814				}
4815				else
4816				{
4817					autoPlay = false;
4818				}
4819				
4820				var timer = jQuery(this).attr('data-timer');
4821				if (typeof timer == "undefined"){
4822					timer = 8000;
4823				}
4824				
4825				var pagination = jQuery(this).attr('data-pagination');
4826				if (typeof pagination == "undefined"){
4827					pagination = true;
4828				}
4829				if(pagination == 1)
4830				{
4831					pagination = true;
4832				}
4833				else
4834				{
4835					pagination = false;
4836				}
4837				
4838				jQuery(this).owlCarousel({
4839		            loop: true,
4840		            center: true,
4841		            items: 3,
4842		            margin: 0,
4843		            autoplay: autoPlay,
4844		            dots:pagination,
4845		            autoplayTimeout: timer,
4846		            smartSpeed: 450,
4847		            responsive: {
4848		              0: {
4849		                items: 1
4850		              },
4851		              768: {
4852		                items: 2
4853		              },
4854		              1170: {
4855		                items: 3
4856		              }
4857		            }
4858		        });
4859			});
4860		});
4861		//End execute javascript for testimonials card
4862		
4863		
4864		//Start execute javascript for testimonials slider
4865		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-testimonial-slider.default', function( $scope ) {
4866			jQuery(".testimonials-slider-wrapper .owl-carousel").each(function() {
4867				var autoPlay = jQuery(this).attr('data-autoplay');
4868				if (typeof autoPlay == "undefined"){
4869					autoPlay = false;
4870				}
4871				if(autoPlay == 1)
4872				{
4873					autoPlay = true;
4874				}
4875				else
4876				{
4877					autoPlay = false;
4878				}
4879				
4880				var timer = jQuery(this).attr('data-timer');
4881				if (typeof timer == "undefined"){
4882					timer = 8000;
4883				}
4884				
4885				jQuery(this).owlCarousel({
4886					loop: true,
4887					center: true,
4888					margin: 0,
4889					nav:true,
4890					autoplay: autoPlay,
4891					autoplayTimeout: timer,
4892					smartSpeed: 300,
4893					navText: [ '<span class="arrow-left"></span>', '<span class="arrow-right"></span>' ],
4894					responsive:{
4895						0:{
4896							items:1
4897						},
4898						600:{
4899							items:1
4900						},
4901						800:{
4902							items:1
4903						},
4904						1024:{
4905							items:1
4906						}
4907					}
4908				});
4909			});
4910		});
4911		//End execute javascript for testimonials slider
4912		
4913		
4914		//Start execute javascript for slider image carousel
4915		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-image-carousel.default', function( $scope ) {
4916			jQuery(".image-carousel-slider-wrapper").each(function() {
4917				  jQuery(this).find('.carousel-item').eq(0).addClass('active');
4918				  var total = jQuery(this).find('.carousel-item').length;
4919				  var current = 0;
4920				  var slideObj = jQuery(this);
4921
4922				  jQuery(this).find('#moveRight').on('click', function(){
4923				    var next=current;
4924				    current= current+1;
4925				    setSlide(next, current, slideObj);
4926				  });
4927				  jQuery(this).find('#moveLeft').on('click', function(){ 
4928				    var prev=current;
4929				    current = current- 1;
4930				    setSlide(prev, current, slideObj);
4931				  });
4932				  function setSlide(prev, next, slideObj){
4933				    var slide= current;
4934				    if(next>total-1){
4935				     slide=0;
4936				      current=0;
4937				    }
4938				    if(next<0){
4939				      slide=total - 1;
4940				      current=total - 1;
4941				    }
4942
4943				           slideObj.find('.carousel-item').eq(prev).removeClass('active');
4944				           slideObj.find('.carousel-item').eq(slide).addClass('active');
4945						   setTimeout(function(){
4946				
4947				      },800);
4948				  }
4949			});
4950		} );
4951		//End execute javascript for slider image carousel
4952		
4953		
4954		//Start execute javascript for portfolio grid
4955		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-grid.default', function( $scope ) {
4956			jQuery(".portfolio_grid_container").each(function() {
4957				var containderDiv = jQuery(this);
4958				var selectedClass = "";
4959				
4960				containderDiv.find(".filter-tag-btn").on('click', function(){
4961					containderDiv.find(".filter-tag-btn").removeClass("active");
4962					jQuery(this).addClass("active");
4963					selectedClass = jQuery(this).attr("data-rel"); 
4964					column = jQuery(this).attr("data-cols");
4965					
4966					var gridDiv = containderDiv.find(".portfolio-grid-content-wrapper");
4967					
4968					gridDiv.fadeTo(100, 0);
4969					gridDiv.find(".portfolio-grid-wrapper").css({
4970						opacity: 0,
4971						display: 'none',
4972						transform: 'scale(0.0)'
4973					});
4974					gridDiv.find(".portfolio-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
4975					
4976				    setTimeout(function() {
4977				      jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
4978				      
4979				      jQuery("."+selectedClass).css({
4980						opacity: 1,
4981						display: 'block',
4982						transform: 'scale(1,1)'
4983					  });
4984				      
4985				      gridDiv.find(".portfolio-grid-wrapper.last").removeClass('last');
4986				      var count = gridDiv.find(".portfolio-grid-wrapper.scale-anm").length;
4987				      
4988				      gridDiv.find(".portfolio-grid-wrapper.scale-anm").each(function(index){
4989					      var lastIndex = parseInt(index+1);
4990
4991						  if(lastIndex%column == 0)
4992						  {
4993							  jQuery(this).addClass('last');
4994						  }
4995						  
4996						  if(lastIndex == count)
4997						  {
4998							  setTimeout(function() {
4999							  	gridDiv.fadeTo(300, 1);
5000							  }, 300);
5001						  }
5002					  });
5003
5004				    }, 300);
5005			    });
5006			});
5007		} );
5008		//End execute javascript for portfolio grid
5009		
5010		
5011		
5012		//Start execute javascript for portfolio grid overlay
5013		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-grid-overlay.default', function( $scope ) {
5014			jQuery(".portfolio-grid-overlay-container").each(function() {
5015				var containderDiv = jQuery(this);
5016				var selectedClass = "";
5017				
5018				containderDiv.find(".portfolio-grid-wrapper-overlay").imagesLoaded().always( function() {
5019					var currentWrapper = containderDiv.find(".portfolio-grid-wrapper-overlay");
5020					var currentImg = containderDiv.find(".portfolio-grid-wrapper-overlay img");
5021					
5022					currentWrapper.css('height', currentImg.height()+'px');
5023				});
5024				
5025				jQuery(window).resize(function() {
5026					containderDiv.find(".portfolio-grid-wrapper-overlay").each(function() {
5027						var currentImg = jQuery(this).find("img");
5028					
5029						jQuery(this).css('height', currentImg.height()+'px');
5030					});
5031				});
5032				
5033				containderDiv.find(".filter-tag-btn").on('click', function(){
5034					containderDiv.find(".filter-tag-btn").removeClass("active");
5035					jQuery(this).addClass("active");
5036					selectedClass = jQuery(this).attr("data-rel"); 
5037					column = jQuery(this).attr("data-cols");
5038					
5039					var gridDiv = containderDiv.find(".portfolio-grid-content-wrapper");
5040					
5041					gridDiv.fadeTo(100, 0);
5042					gridDiv.find(".portfolio-grid-wrapper-overlay").css({
5043						opacity: 0,
5044						display: 'none',
5045						transform: 'scale(0.0)'
5046					});
5047					gridDiv.find(".portfolio-grid-wrapper-overlay").not("."+selectedClass).fadeOut().removeClass('scale-anm');
5048					
5049				    setTimeout(function() {
5050				      jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
5051				      
5052				      jQuery("."+selectedClass).css({
5053						opacity: 1,
5054						display: 'block',
5055						transform: 'scale(1,1)'
5056					  });
5057				      
5058				      gridDiv.find(".portfolio-grid-wrapper-overlay.last").removeClass('last');
5059				      var count = gridDiv.find(".portfolio-grid-wrapper-overlay.scale-anm").length;
5060				      
5061				      gridDiv.find(".portfolio-grid-wrapper-overlay.scale-anm").each(function(index){
5062					      var lastIndex = parseInt(index+1);
5063						  if(lastIndex%column == 0)
5064						  {
5065							  jQuery(this).addClass('last');
5066						  }
5067						  
5068						  if(lastIndex == count)
5069						  {
5070							  setTimeout(function() {
5071							  	gridDiv.fadeTo(300, 1);
5072							  }, 300);
5073						  }
5074					  });
5075
5076				    }, 300);
5077			    });
5078			});
5079		} );
5080		//End execute javascript for portfolio grid overlay
5081		
5082		
5083		//Start execute javascript for portfolio grid overlay 3d
5084		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-3d-overlay.default', function( $scope ) {
5085			jQuery(".portfolio-grid-overlay-container").each(function() {
5086				var containderDiv = jQuery(this);
5087				var selectedClass = "";
5088				
5089				containderDiv.find(".portfolio-grid-wrapper-overlay").imagesLoaded().always( function() {
5090					var currentWrapper = containderDiv.find(".portfolio-grid-wrapper-overlay");
5091					var currentImg = containderDiv.find(".portfolio-grid-wrapper-overlay img");
5092					
5093					currentWrapper.css('height', currentImg.height()+'px');
5094				});
5095				
5096				jQuery(window).resize(function() {
5097					containderDiv.find(".portfolio-grid-wrapper-overlay").each(function() {
5098						var currentImg = jQuery(this).find("img");
5099					
5100						jQuery(this).css('height', currentImg.height()+'px');
5101					});
5102				});
5103				
5104				if(!is_touch_device())
5105				{
5106					var scaleTilt = 1.1;
5107					if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
5108						scaleTilt = 1;
5109					}
5110					
5111					containderDiv.find(".grid_tilt").tilt({
5112					    scale: scaleTilt,
5113					    perspective: 2000,
5114					    glare: true,
5115						maxGlare: .5
5116					});
5117				}
5118				if(!elementorFrontend.isEditMode())
5119				{
5120					containderDiv.find(".portfolio-grid-wrapper-overlay").on('click', function(){
5121						window.location = jQuery(this).find("a").first().attr("href");
5122					});
5123				}
5124				
5125				containderDiv.find(".filter-tag-btn").on('click', function(){
5126					containderDiv.find(".filter-tag-btn").removeClass("active");
5127					jQuery(this).addClass("active");
5128					selectedClass = jQuery(this).attr("data-rel"); 
5129					column = jQuery(this).attr("data-cols");
5130					
5131					var gridDiv = containderDiv.find(".portfolio-grid-content-wrapper");
5132					
5133					gridDiv.fadeTo(100, 0);
5134					gridDiv.find(".portfolio-grid-wrapper-overlay").css({
5135						opacity: 0,
5136						display: 'none',
5137						transform: 'scale(0.0)'
5138					});
5139					gridDiv.find(".portfolio-grid-wrapper-overlay").not("."+selectedClass).fadeOut().removeClass('scale-anm');
5140					
5141				    setTimeout(function() {
5142				      jQuery("."+selectedClass).fadeIn().addClass('scale-anm');
5143				      
5144				      jQuery("."+selectedClass).css({
5145						opacity: 1,
5146						display: 'block',
5147						transform: 'scale(1,1)'
5148					  });
5149				      
5150				      gridDiv.find(".portfolio-grid-wrapper-overlay.last").removeClass('last');
5151				      var count = gridDiv.find(".portfolio-grid-wrapper-overlay.scale-anm").length;
5152				      
5153				      gridDiv.find(".portfolio-grid-wrapper-overlay.scale-anm").each(function(index){
5154					      var lastIndex = parseInt(index+1);
5155						  if(lastIndex%column == 0)
5156						  {
5157							  jQuery(this).addClass('last');
5158						  }
5159						  
5160						  if(lastIndex == count)
5161						  {
5162							  setTimeout(function() {
5163							  	gridDiv.fadeTo(300, 1);
5164							  }, 300);
5165						  }
5166					  });
5167
5168				    }, 300);
5169			    });
5170			});
5171		} );
5172		//End execute javascript for portfolio grid overlay 3d
5173		
5174		
5175		//Start execute javascript for portfolio classic
5176		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-classic.default', function( $scope ) {
5177			jQuery(".portfolio-classic-container").each(function() {
5178				var containderDiv = jQuery(this);
5179				var selectedClass = "";
5180				
5181				containderDiv.find(".filter-tag-btn").on('click', function(){
5182					containderDiv.find(".filter-tag-btn").removeClass("active");
5183					jQuery(this).addClass("active");
5184					selectedClass = jQuery(this).attr("data-rel"); 
5185					column = jQuery(this).attr("data-cols");
5186					
5187					var gridDiv = containderDiv.find(".portfolio-classic-content-wrapper");
5188					
5189					gridDiv.fadeTo(100, 0);
5190					gridDiv.find(".portfolio-classic-grid-wrapper").css({
5191						opacity: 0,
5192						display: 'none',
5193						transform: 'scale(0.0)'
5194					});
5195					gridDiv.find(".portfolio-classic-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
5196					
5197				    setTimeout(function() {
5198				      jQuery("."+selectedClass).addClass('scale-anm');
5199				      
5200				      jQuery("."+selectedClass).css({
5201						opacity: 1,
5202						display: 'block',
5203						transform: 'scale(1,1)'
5204					  });
5205				      
5206				      gridDiv.find(".portfolio-classic-grid-wrapper.last").removeClass('last');
5207				      var count = gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").length;
5208				      
5209				      gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").each(function(index){
5210					      var lastIndex = parseInt(index+1);
5211						  if(lastIndex%column == 0)
5212						  {
5213							  jQuery(this).addClass('last');
5214						  }
5215						  
5216						  if(lastIndex == count)
5217						  {
5218							 setTimeout(function() {
5219							  	gridDiv.fadeTo(300, 1);
5220							  }, 300);
5221						  }
5222					  });
5223
5224				    }, 300);
5225			    });
5226			});
5227		} );
5228		//End execute javascript for portfolio classic
5229		
5230		
5231		//Start execute javascript for portfolio contain
5232		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-contain.default', function( $scope ) {
5233			jQuery(".portfolio-classic-container.contain").each(function() {
5234				var containderDiv = jQuery(this);
5235				var selectedClass = "";
5236				
5237				containderDiv.find(".filter-tag-btn").on('click', function(){
5238					containderDiv.find(".filter-tag-btn").removeClass("active");
5239					jQuery(this).addClass("active");
5240					selectedClass = jQuery(this).attr("data-rel"); 
5241					column = jQuery(this).attr("data-cols");
5242					
5243					var gridDiv = containderDiv.find(".portfolio-classic-content-wrapper");
5244					
5245					gridDiv.fadeTo(100, 0);
5246					gridDiv.find(".portfolio-classic-grid-wrapper").css({
5247						opacity: 0,
5248						display: 'none',
5249						transform: 'scale(0.0)'
5250					});
5251					gridDiv.find(".portfolio-classic-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
5252					
5253				    setTimeout(function() {
5254				      jQuery("."+selectedClass).addClass('scale-anm');
5255				      
5256				      jQuery("."+selectedClass).css({
5257						opacity: 1,
5258						display: 'block',
5259						transform: 'scale(1,1)'
5260					  });
5261				      
5262				      gridDiv.find(".portfolio-classic-grid-wrapper.last").removeClass('last');
5263				      var count = gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").length;
5264				      
5265				      gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").each(function(index){
5266					      var lastIndex = parseInt(index+1);
5267						  if(lastIndex%column == 0)
5268						  {
5269							  jQuery(this).addClass('last');
5270						  }
5271						  
5272						  if(lastIndex == count)
5273						  {
5274							 setTimeout(function() {
5275							  	gridDiv.fadeTo(300, 1);
5276							  }, 300);
5277						  }
5278					  });
5279
5280				    }, 300);
5281			    });
5282			});
5283		} );
5284		//End execute javascript for portfolio contain
5285		
5286		
5287		//Start execute javascript for navigation menu
5288		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-navigation-menu.default', function( $scope ) {
5289			jQuery('.themegoods-navigation-wrapper .nav li.menu-item').hover(function()
5290			{
5291				jQuery('.themegoods-navigation-wrapper .nav li.menu-item ul').removeClass('visible');
5292				jQuery('.themegoods-navigation-wrapper .nav li.menu-item ul').removeClass('hover');
5293				jQuery('.themegoods-navigation-wrapper .nav li.menu-item .elementor-megamenu-wrapper').removeClass('visible');
5294				jQuery('.themegoods-navigation-wrapper .nav li.menu-item .elementor-megamenu-wrapper').removeClass('hover');
5295				
5296				jQuery(this).children('ul:first').addClass('visible');
5297				jQuery(this).children('ul:first').addClass('hover');
5298				
5299				jQuery(this).children('.elementor-megamenu-wrapper:first').addClass('visible');
5300				jQuery(this).children('.elementor-megamenu-wrapper:first').addClass('hover');
5301			},
5302			function()
5303			{	
5304				jQuery(this).children('ul:first').stop().removeClass('visible');
5305				jQuery(this).children('ul:first').stop().removeClass('hover');
5306					
5307				jQuery(this).children('.elementor-megamenu-wrapper:first').stop().removeClass('visible');
5308				jQuery(this).children('.elementor-megamenu-wrapper:first').stop().removeClass('hover');
5309			});
5310			
5311			jQuery('.themegoods-navigation-wrapper .nav li.menu-item').children('ul:first.hover').hover(function()
5312			{
5313				jQuery(this).stop().addClass('visible');
5314			},
5315			function()
5316			{	
5317				jQuery(this).stop().removeClass('visible');
5318			});
5319			
5320			jQuery('.themegoods-navigation-wrapper .nav li.menu-item').children('.elementor-megamenu-wrapper.hover').hover(function()
5321			{
5322				jQuery(this).stop().addClass('visible');
5323			},
5324			function()
5325			{	
5326				jQuery(this).stop().removeClass('visible');
5327			});
5328		} );
5329		//End execute javascript for navigation menu
5330		
5331		
5332		//Start execute javascript for video grid
5333		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-video-grid.default', function( $scope ) {
5334			jQuery(".portfolio-classic-container.video-grid").each(function() {
5335				var containerDiv = jQuery(this);
5336				var selectedClass = "";
5337				
5338				containerDiv.find(".filter-tag-btn").on('click', function(){
5339					containerDiv.find(".filter-tag-btn").removeClass("active");
5340					jQuery(this).addClass("active");
5341					selectedClass = jQuery(this).attr("data-rel"); 
5342					column = jQuery(this).attr("data-cols");
5343					
5344					var gridDiv = containerDiv.find(".portfolio-classic-content-wrapper");
5345					
5346					gridDiv.fadeTo(100, 0);
5347					gridDiv.find(".portfolio-classic-grid-wrapper").css({
5348						opacity: 0,
5349						display: 'none',
5350						transform: 'scale(0.0)'
5351					});
5352					gridDiv.find(".portfolio-classic-grid-wrapper").not("."+selectedClass).fadeOut().removeClass('scale-anm');
5353					
5354				    setTimeout(function() {
5355				      jQuery("."+selectedClass).addClass('scale-anm');
5356				      
5357				      jQuery("."+selectedClass).css({
5358						opacity: 1,
5359						display: 'block',
5360						transform: 'scale(1,1)'
5361					  });
5362					  
5363				      gridDiv.find(".portfolio-classic-grid-wrapper.last").removeClass('last');
5364				      var count = gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").length;
5365				      
5366				      gridDiv.find(".portfolio-classic-grid-wrapper.scale-anm").each(function(index){
5367					      var lastIndex = parseInt(index+1);
5368						  if(lastIndex%column == 0)
5369						  {
5370							  jQuery(this).addClass('last');
5371						  }
5372						  
5373						  if(lastIndex == count)
5374						  {
5375							  setTimeout(function() {
5376							  	gridDiv.fadeTo(300, 1);
5377							  }, 300);
5378						  }
5379					  });
5380
5381				    }, 300);
5382			    });
5383			});
5384			
5385			
5386			jQuery(".portfolio-classic-content-wrapper.video-grid .video-grid-wrapper").each(function() {
5387				var video = this.getElementsByClassName("video-card")[0];
5388				var id = jQuery(video).data('video-id');
5389				
5390				var play = document.createElement("div");
5391				var outline = document.createElement("div");
5392				var ring = document.createElement("div");
5393				var fill = document.createElement("div");
5394				var mask = document.createElement("div");
5395				var wipe = document.createElement("div");
5396				var wrap = document.createElement("div");
5397				var iframe = '<iframe width="100%" height="100%" src="https://www.youtube.com/embed/'+id+'" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>';
5398				
5399				TweenMax.set(play, {
5400					css:{
5401						width: 0,
5402						height: 0,
5403						"border-top": "10px solid transparent",
5404						"border-bottom": "10px solid transparent",
5405						"border-left": "14px solid white",
5406						"z-index": 50,
5407						position: 'absolute',
5408						top: "50%",
5409						left: "50%",
5410						marginLeft: "-4px",
5411						marginTop: "-9px"
5412					}
5413				});
5414				TweenMax.set(outline, {
5415					css:{
5416						width: 65,
5417						height: 65,
5418						border: "3px solid white",
5419						"border-radius": "999px",
5420						"z-index": 50,
5421						position: 'absolute',
5422						top: "50%",
5423						left: "50%",
5424						y: "-50%",
5425						x: "-50%"
5426					}
5427				});
5428				TweenMax.set(ring, {
5429					css:{
5430						width: 65,
5431						height: 65,
5432						border: "1px solid white",
5433						"border-radius": "999px",
5434						"z-index": 50,
5435						position: 'absolute',
5436						top: "50%",
5437						left: "50%",
5438						y: "-50%",
5439						x: "-50%"
5440					}
5441				});
5442				TweenMax.set(fill, {
5443					css:{
5444						width: 65,
5445						opacity: 0,
5446						height: 65,
5447						"background-color": "white",
5448						"border-radius": "999px",
5449						"z-index": 50,
5450						position: 'absolute',
5451						top: "50%",
5452						left: "50%",
5453						y: "-50%",
5454						x: "-50%"
5455					}
5456				});
5457				TweenMax.set(mask, {
5458					css:{
5459						width: 600,
5460						height: 600,
5461						scale: 1,
5462						opacity: 0,
5463						backgroundColor: "#fff",
5464						"border-radius": "300px",
5465						"z-index": 51,
5466						position: 'absolute',
5467						top: "50%",
5468						left: "50%",
5469						y: "-50%",
5470						x: "-50%"
5471					}
5472				});
5473				TweenMax.set(wipe, {
5474					css:{
5475						width: "100%",
5476						height: "100%",
5477						opacity: 0,
5478						backgroundColor: "#fff",
5479						"z-index": 53,
5480						position: 'absolute',
5481						top: "0",
5482						right: "0"
5483					}
5484				});
5485				TweenMax.set(wrap, {
5486					css:{
5487						width: "100%",
5488						height: "100%",
5489						autoAlpha: 0,
5490						"z-index": 52,
5491						position: 'absolute',
5492						top: "0",
5493						left: "0"
5494					}
5495				});
5496				
5497				video.appendChild(play);
5498				video.appendChild(outline);
5499				video.appendChild(ring);
5500				video.appendChild(fill);
5501				video.appendChild(mask);
5502				video.appendChild(wipe);
5503				jQuery(wrap).html(iframe);
5504				video.appendChild(wrap);
5505				
5506				
5507				
5508				jQuery(video).on("mouseenter", function(event) {
5509					TweenLite.killTweensOf([fill, outline, ring]);
5510					TweenLite.to(fill, 0.4, {opacity: 0.2, ease:"cubic-bezier(0.39, 0.575, 0.565, 1)"});	
5511					TweenLite.to(outline, 0.4, {scale: 0.9, ease:"cubic-bezier(0.39, 0.575, 0.565, 1)"});
5512					TweenLite.fromTo(ring, 0.7, {
5513						scale: 1, 
5514						opacity: 0.5
5515					},
5516					{
5517						scale: 2, 
5518						opacity: 0, 
5519						ease:"cubic-bezier(0.165, 0.84, 0.44, 1)"
5520					});
5521					TweenLite.to(play, 0.2, { 
5522						x: 8, 
5523						opacity: 0, 
5524						ease: "cubic-bezier(0.550, 0.055, 0.675, 0.190)",
5525						onComplete: function() {
5526							TweenLite.set(play,{
5527								x:-12, 
5528								onComplete: function() {
5529									TweenLite.to(play, 0.4, {
5530										x: 0,
5531										opacity: 1,
5532										ease: "cubic-bezier(0.215, 0.610, 0.355, 1.000)",
5533									});
5534								}
5535							});
5536						}
5537					});
5538				});
5539				
5540				jQuery(video).on("mouseleave", function(event) {
5541					TweenLite.killTweensOf([fill, outline]);
5542					TweenLite.to(fill, 0.4, {opacity: 0, ease:"cubic-bezier(0.39, 0.575, 0.565, 1)"});
5543					TweenLite.to(outline, 0.4, {scale: 1, ease:"cubic-bezier(0.39, 0.575, 0.565, 1)"});
5544				
5545				});
5546				
5547				jQuery(video).on("click", function(event) {
5548					event.preventDefault();
5549					
5550					TweenLite.fromTo(mask, 0.35, {
5551						opacity: 1,
5552						scale: 0
5553					},
5554					{
5555						scale: 1,
5556						ease: "cubic-bezier(0.550, 0.055, 0.675, 0.190)",
5557						onComplete: function() {
5558							TweenLite.set(mask, {
5559								opacity: 0,
5560								scale: 0,
5561								delay: 0.5,
5562								onComplete: function() {
5563									TweenLite.fromTo(wipe, 0.4, {
5564										width: "100%",
5565									},{
5566										width: 0,
5567										ease: "cubic-bezier(.42,0,.58,1)"			 
5568									});
5569								}
5570							});
5571						
5572							TweenLite.set(wipe, {
5573								opacity: 1,
5574							});
5575							
5576							TweenLite.set(wrap, {
5577								autoAlpha: 1,
5578							});
5579				
5580						}
5581					});
5582					
5583					
5584				});
5585			});
5586		} );
5587		//End execute javascript for video grid
5588		
5589		//Start execute javascript for portfolio coverflow
5590		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-coverflow.default', function( $scope ) {
5591			
5592			jQuery(".portfolio-coverflow").each(function() {
5593				var initialSlide = 0;
5594				initialSlide = parseInt(jQuery(this).attr('data-initial') - 1);
5595				
5596				var coverflowSwiper = new Swiper(jQuery(this), {
5597			      grabCursor: true,
5598			      centeredSlides: true,
5599			      slidesPerView: 'auto',
5600			      spaceBetween: 50,
5601			      keyboard: {
5602				    enabled: true,
5603				    onlyInViewport: false,
5604				  },
5605			      pagination: {
5606			        el: '.swiper-pagination',
5607			      },
5608			      initialSlide: initialSlide
5609			    });
5610			});
5611			
5612		} );
5613		//End execute javascript for portfolio coverflow
5614		
5615		//Start execute javascript for glitch slideshow
5616		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-glitch-slideshow.default', function( $scope ) {
5617			class Slide {
5618		        constructor(el) {
5619		            this.DOM = {el: el};
5620		            this.DOM.slideImg = this.DOM.el.querySelector('.slide-img');
5621		            this.bgImage = this.DOM.slideImg.style.backgroundImage;
5622		            this.layout();
5623		        }
5624		        layout() {
5625		            this.DOM.slideImg.innerHTML = `<div class='glitch-img' style='background-image: ${this.DOM.slideImg.style.backgroundImage};'></div>`.repeat(5);
5626		            this.DOM.glitchImgs = Array.from(this.DOM.slideImg.querySelectorAll('.glitch-img'));
5627		        }
5628		        changeBGImage(bgimage, pos = 0, delay = 0) {
5629		            setTimeout(() => this.DOM.glitchImgs[pos].style.backgroundImage = bgimage, delay);
5630		        }
5631		    }
5632		
5633		    class GlitchSlideshow {
5634		        constructor(el) {
5635		            this.DOM = {el: el};
5636		            this.DOM.slides = Array.from(this.DOM.el.querySelectorAll('.slide'));
5637		            this.slidesTotal = this.DOM.slides.length;
5638		            this.slides = [];
5639		            this.DOM.slides.forEach(slide => this.slides.push(new Slide(slide)));
5640		            this.current = 0;
5641		            this.glitchTime = 1800;
5642		            this.totalGlitchSlices = 5;
5643		        }
5644		        glitch(slideFrom, slideTo) {
5645		            return new Promise((resolve, reject) => {
5646		                slideFrom.DOM.slideImg.classList.add('glitch--animate');
5647		                
5648		                const slideFromBGImage = slideFrom.bgImage;
5649		                const slideToBGImage = slideTo.bgImage;
5650		
5651		                for (let i = this.totalGlitchSlices-1; i >= 0; --i) {
5652		                    slideFrom.changeBGImage(slideToBGImage, i, this.glitchTime/(this.totalGlitchSlices+1)*(this.totalGlitchSlices-i-1) + this.glitchTime/(this.totalGlitchSlices+1));
5653		                }
5654		                
5655		                setTimeout(() => {
5656		                    slideFrom.DOM.slideImg.classList.remove('glitch--animate');
5657		
5658		                    // reset bgimages.
5659		                    for (let i = this.totalGlitchSlices-1; i >= 0; --i) {
5660		                        slideFrom.changeBGImage(slideFromBGImage, i, 0);    
5661		                    }
5662		
5663		                    resolve();
5664		                }, this.glitchTime);
5665		            });
5666		        }
5667		        navigate(dir) {
5668		            if ( this.isAnimating ) return;
5669		            this.isAnimating = true;
5670		
5671		            const newCurrent =  dir === 'next' ?
5672		                this.current < this.slidesTotal-1 ? this.current+1 : 0 :
5673		                this.current > 0 ? this.current-1 : this.slidesTotal-1;
5674		            
5675		            this.glitch(this.slides[this.current], this.slides[newCurrent]).then(() => {
5676		                this.DOM.slides[this.current].classList.remove('slide-current');
5677		                this.current = newCurrent;
5678		                this.DOM.slides[this.current].classList.add('slide-current');
5679		                this.isAnimating = false;
5680		            });
5681		        }
5682		    }
5683		
5684		    // Preload all the images in the page..
5685			imagesLoaded(document.querySelectorAll('.slide-img'), {background: true}, () => {
5686		        document.body.classList.remove('loading');
5687		        const slideshow = new GlitchSlideshow(document.querySelector('.slides'));
5688		        const nav = Array.from(document.querySelectorAll('.slide-nav-button'));
5689		        nav[0].addEventListener('click', () => slideshow.navigate('prev'));
5690		        nav[1].addEventListener('click', () => slideshow.navigate('next'));
5691		    });
5692		});
5693		//End execute javascript for glitch slideshow
5694		
5695		
5696		//Start execute javascript for music player
5697		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-music-player.default', function( $scope ) {
5698			jQuery(".grandconference-music-player").each(function() {
5699				var containerDiv = jQuery(this);
5700				
5701				var songIndex = 0;
5702				var audio = new Audio();
5703				var $audio = jQuery(audio);
5704				var handleDrag = false;
5705				var timeIn = 0; // only used on mouseup event
5706				
5707				var songListID = containerDiv.attr('data-songlist');
5708				var playlist = JSON.parse(jQuery('#'+songListID).val());
5709				
5710				const $player     = containerDiv.find('.player'),
5711				      $poster     = containerDiv.find('.player-img'),
5712				      $background = containerDiv.find('.player-background'),
5713				      $title      = containerDiv.find('.player-title'),
5714				      $artist     = containerDiv.find('.player-artist'),
5715				      $prev       = containerDiv.find('.player-controls__prev'),
5716				      $next       = containerDiv.find('.player-controls__next'),
5717				      $play       = containerDiv.find('.player-controls__play'),
5718				      $scrubber   = containerDiv.find('.player-scrubber'),
5719				      $handle     = containerDiv.find('.player-scrubber-handle'),
5720				      $fill       = containerDiv.find('.player-scrubber__fill'),
5721				      $time       = containerDiv.find('.player-time__played'),
5722				      $dur       = containerDiv.find('.player-time__duration');
5723				
5724				function time(seconds) {
5725				    seconds = Math.floor(seconds);
5726				    const mins = Math.floor(seconds / 60);
5727				    const secs = seconds % 60;
5728				    return mins + ":" + (secs < 10 ? "0": "") + secs;
5729				}
5730				
5731				function changeSong(offset, play) {
5732				  songIndex += offset;
5733				  if(songIndex > playlist.length - 1) songIndex = 0;
5734				  if(songIndex < 0) songIndex = playlist.length - 1;
5735				     
5736				  $audio.attr('src', playlist[songIndex].mp3 );
5737				  
5738				  const src = playlist[songIndex].poster;
5739				  
5740				  $title.text(playlist[songIndex].title);
5741				  $artist.text(playlist[songIndex].artist);
5742				  
5743				  $dur.text("-:--");// Until it loads
5744				  $audio.on('loadedmetadata', function() {
5745				    $dur.text(time(audio.duration));
5746				    setHandle(0, audio.duration);
5747				  });
5748				  $audio.on('ended', () => changeSong(+1, true) );
5749				  
5750				  var img = new Image();
5751				
5752				  jQuery(img).attr("src", src)
5753				  .on("load", function(){
5754				    
5755				    $poster.attr('src', src);
5756				    $background.css('background-image', 'url("' + src + '")');
5757				    
5758				  })
5759				  .on("error", function(){
5760				    
5761				    console.log("Cannot find image");
5762				    
5763				  });
5764				  
5765				  if( play ) 
5766				  {
5767					  audio.play();
5768					  $play.find('i').removeClass('fa-play').addClass('fa-pause');
5769				  }
5770				  else
5771				  {
5772					  $play.find('i').removeClass('fa-pause').addClass('fa-play');
5773				  }
5774				  
5775				}
5776				function setHandle(seconds, duration) {
5777				  const percent = seconds/duration*100;
5778				  
5779				  $time.text(time(seconds));
5780				  
5781				  $handle.css('left', percent + "%");
5782				  $fill.css('width', percent + "%");
5783				}
5784				
5785				$play.click(function(){
5786				  if(audio.currentTime > 0 && !audio.paused) {
5787				    audio.pause();
5788				    $play.find('i').removeClass('fa-pause').addClass('fa-play');
5789				  } else {
5790				    audio.play();
5791				    $play.find('i').removeClass('fa-play').addClass('fa-pause');
5792				  }
5793				  
5794				});
5795				$prev.click(() => changeSong(-1, true) );
5796				$next.click(() => changeSong(+1, true) );
5797				
5798				
5799				$audio.on("timeupdate", () => {
5800				    setHandle(audio.currentTime, audio.duration);
5801				});
5802				
5803				$handle.on('mousedown', function() {
5804				  handleDrag = true;
5805				  audio.pause();
5806				});
5807				
5808				$player.on('mousemove', function(e) {
5809				  
5810				  if(handleDrag) {
5811				
5812				    //get percent
5813				    const width = $scrubber.width();
5814				    var diff    = $scrubber.offset().left - e.clientX;
5815				    var percent = -diff / width * 100;
5816				    // Limit percent to between 0 and 100
5817				    percent = (percent < 0 ? 0 : (percent > 100 ? 100 : percent));
5818				    //convert percent into seconds
5819				    var seconds = percent / 100 * audio.duration;
5820				    setHandle(seconds, audio.duration);
5821				    timeIn = seconds;
5822				
5823				  }
5824				  
5825				  
5826				})
5827				.on('mouseup mouseleave', function(){
5828				  if(handleDrag) {
5829				    handleDrag = false;
5830				    audio.currentTime = timeIn;
5831				    $play.find('i').removeClass('fa-pause').addClass('fa-play');
5832				  }
5833				});
5834				
5835				
5836				// Initialize
5837				changeSong(0, false);
5838			});
5839		});
5840		//End execute javascript for music player
5841		
5842		//Start execute javascript for mouse driven vertical carousel
5843		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-mouse-driven-vertical-carousel.default', function( $scope ) {
5844			
5845			class VerticalMouseDrivenCarousel {
5846				constructor(options = {}) {
5847					const _defaults = {
5848						carousel: ".mouse-driven-vertical-carousel-wrapper .js-carousel",
5849						bgImg: ".js-carousel-bg-img",
5850						list: ".js-carousel-list",
5851						listItem: ".js-carousel-list-item"
5852					};
5853			
5854					this.posY = 0;
5855			
5856					this.defaults = Object.assign({}, _defaults, options);
5857			
5858					this.initCursor();
5859					this.init();
5860					this.bgImgController();
5861				}
5862			
5863				//region getters
5864				getBgImgs() {
5865					return document.querySelectorAll(this.defaults.bgImg);
5866				}
5867			
5868				getListItems() {
5869					return document.querySelectorAll(this.defaults.listItem);
5870				}
5871			
5872				getList() {
5873					return document.querySelector(this.defaults.list);
5874				}
5875			
5876				getCarousel() {
5877					return document.querySelector(this.defaults.carousel);
5878				}
5879			
5880				init() {
5881					TweenMax.set(this.getBgImgs(), {
5882						autoAlpha: 0,
5883						scale: 1.05
5884					});
5885			
5886					TweenMax.set(this.getBgImgs()[0], {
5887						autoAlpha: 1,
5888						scale: 1
5889					});
5890			
5891					this.listItems = this.getListItems().length - 1;
5892					
5893					this.listOpacityController(0);
5894				}
5895			
5896				initCursor() {
5897					//Init only on desktop device
5898					if(jQuery(window).width()>1024)
5899					{
5900						const listHeight = this.getList().clientHeight;
5901						const carouselHeight = this.getCarousel().clientHeight;
5902						const carouselPos = this.getCarousel().getBoundingClientRect();
5903						const carouselPosY = parseInt(carouselPos.top);
5904						
5905						this.getCarousel().addEventListener(
5906							"mousemove",
5907							event => {
5908								this.posY = parseInt(event.pageY - carouselPosY) - this.getCarousel().offsetTop;
5909								let offset = -this.posY / carouselHeight * listHeight;
5910				
5911								TweenMax.to(this.getList(), 0.3, {
5912									y: offset,
5913									ease: Power4.easeOut
5914								});
5915							},
5916							false
5917						);
5918					}
5919				}
5920			
5921				bgImgController() {
5922					for (const link of this.getListItems()) {
5923						link.addEventListener("mouseenter", ev => {
5924							let currentId = ev.currentTarget.dataset.itemId;
5925			
5926							this.listOpacityController(currentId);
5927			
5928							TweenMax.to(ev.currentTarget, 0.3, {
5929								autoAlpha: 1
5930							});
5931			
5932							TweenMax.to(".is-visible", 0.2, {
5933								autoAlpha: 0,
5934								scale: 1.05
5935							});
5936			
5937							if (!this.getBgImgs()[currentId].classList.contains("is-visible")) {
5938								this.getBgImgs()[currentId].classList.add("is-visible");
5939							}
5940			
5941							TweenMax.to(this.getBgImgs()[currentId], 0.6, {
5942								autoAlpha: 1,
5943								scale: 1
5944							});
5945						});
5946					}
5947				}
5948			
5949				listOpacityController(id) {
5950					id = parseInt(id);
5951					let aboveCurrent = this.listItems - id;
5952					let belowCurrent = parseInt(id);
5953			
5954					if (aboveCurrent > 0) {
5955						for (let i = 1; i <= aboveCurrent; i++) {
5956							let opacity = 0.5 / i;
5957							let offset = 5 * i;
5958							TweenMax.to(this.getListItems()[id + i], 0.5, {
5959								autoAlpha: opacity,
5960								x: offset,
5961								ease: Power3.easeOut
5962							});
5963						}
5964					}
5965			
5966					if (belowCurrent > 0) {
5967						for (let i = 0; i <= belowCurrent; i++) {
5968							let opacity = 0.5 / i;
5969							let offset = 5 * i;
5970							TweenMax.to(this.getListItems()[id - i], 0.5, {
5971								autoAlpha: opacity,
5972								x: offset,
5973								ease: Power3.easeOut
5974							});
5975						}
5976					}
5977				}
5978			}
5979			
5980			new VerticalMouseDrivenCarousel();
5981			
5982		} );
5983		//End execute javascript for mouse driven vertical carousel
5984		
5985		//Start execute javascript for synchronized carousel slider
5986		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-synchronized-carousel.default', function( $scope ) {
5987			
5988			jQuery(".synchronized-carousel-slider-wrapper").each(function() {
5989				var sliderID = jQuery(this).attr('id');
5990				var slidersContainer = document.querySelector("#"+sliderID);
5991				var countSlide = jQuery(this).attr('data-countslide');
5992				
5993				// Initializing the numbers slider
5994			    var msNumbers = new MomentumSlider({
5995			        el: slidersContainer,
5996			        cssClass: "ms--numbers",
5997			        range: [1, countSlide],
5998			        rangeContent: function (i) {
5999			            return "0" + i;
6000			        },
6001			        style: {
6002			            transform: [{scale: [0.4, 1]}],
6003			            opacity: [0, 1]
6004			        },
6005			        interactive: false
6006			    });
6007			    
6008			    var titles = JSON.parse(jQuery(this).attr('data-slidetitles'));
6009			    
6010			    var msTitles = new MomentumSlider({
6011			        el: slidersContainer,
6012			        cssClass: "ms--titles",
6013			        range: [0, parseInt(countSlide-1)],
6014			        rangeContent: function (i) {
6015			            return "<h3>"+ titles[i] +"</h3>";
6016			        },
6017			        vertical: true,
6018			        reverse: true,
6019			        style: {
6020			            opacity: [0, 1]
6021			        },
6022			        interactive: false
6023			    });
6024			    
6025			    var buttonTitles = JSON.parse(jQuery(this).attr('data-slidebuttontitles'));
6026			    var buttonUrls = JSON.parse(jQuery(this).attr('data-slidebuttonurls'));
6027			    
6028			    // Initializing the links slider
6029			    var msLinks = new MomentumSlider({
6030			        el: slidersContainer,
6031			        cssClass: "ms--links",
6032			        range: [0, parseInt(countSlide-1)],
6033			        rangeContent: function (i) {
6034			            return "<a href=\""+buttonUrls[i]+"\" class=\"ms-slide-link\">"+buttonTitles[i]+"</a>";
6035			        },
6036			        vertical: true,
6037			        interactive: false
6038			    });
6039			    
6040			    // Get pagination items
6041			    var paginationID = jQuery(this).attr('data-pagination');
6042			    var pagination = document.querySelector("#"+paginationID);
6043			    var paginationItems = [].slice.call(pagination.children);
6044			    
6045			    var images = JSON.parse(jQuery(this).attr('data-slideimages'));
6046			    
6047			    // Initializing the images slider
6048			    var msImages = new MomentumSlider({
6049			        // Element to append the slider
6050			        el: slidersContainer,
6051			        // CSS class to reference the slider
6052			        cssClass: "ms--images",
6053			        // Generate the 4 slides required
6054			        range: [0, parseInt(countSlide-1)],
6055			        rangeContent: function (i) {
6056			            return "<div class=\"ms-slide-image-container\"><div class=\"ms-slide-image\" style=\"background-image: url('"+images[i]+"')\"></div></div>";
6057			        },
6058			        // Syncronize the other sliders
6059			        sync: [msNumbers, msTitles, msLinks],
6060			        // Styles to interpolate as we move the slider
6061			        style: {
6062			            ".ms-slide-image": {
6063			                transform: [{scale: [1.5, 1]}]
6064			            }
6065			        },
6066			        // Update pagination if slider change
6067			        change: function(newIndex, oldIndex) {
6068			            if (typeof oldIndex !== "undefined") {
6069			                paginationItems[oldIndex].classList.remove("pagination-item--active");
6070			            }
6071			            paginationItems[newIndex].classList.add("pagination-item--active");
6072			        }
6073			    });
6074			    
6075			    pagination.addEventListener("click", function(e) {
6076			        if (e.target.matches(".pagination-button")) {
6077			            var index = paginationItems.indexOf(e.target.parentNode);
6078			            msImages.select(index);
6079			        }
6080			    });
6081			});
6082			
6083		} );
6084		//End execute javascript for synchronized carousel slider
6085		
6086		//Start execute javascript for flip box
6087		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-flip-box.default', function( $scope ) {
6088			
6089			var countSquare = jQuery('.square').length;
6090		
6091			//For each Square found add BG image
6092			for (i = 0; i < countSquare; i++) {
6093			    var firstImage = jQuery('.square').eq([i]);
6094			    var secondImage = jQuery('.square2').eq([i]);
6095			
6096			    var getImage = firstImage.attr('data-image');
6097			    var getImage2 = secondImage.attr('data-image');
6098			
6099			    firstImage.css('background-image', 'url(' + getImage + ')');
6100			    secondImage.css('background-image', 'url(' + getImage2 + ')');
6101			}
6102			
6103			jQuery('.flip-box-wrapper').on('click', function() {
6104				 jQuery(this).trigger("mouseover");
6105			});
6106			
6107		} );
6108		//End execute javascript for flip box
6109		
6110		//Start execute javascript for slider zoom
6111		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-slider-zoom.default', function( $scope ) {
6112			var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
6113
6114			function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6115			
6116			var $window = $(window);
6117			var $body = $('body');
6118			
6119			var Slideshow = function () {
6120			  function Slideshow() {
6121			    var _this = this;
6122			
6123			    var userOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
6124			
6125			    _classCallCheck(this, Slideshow);
6126			
6127				var timer = $('.slider-zoom-wrapper').attr('data-autoplay');
6128				var autoplay = true;
6129				
6130				if(timer == 0)
6131				{
6132					timer = false;
6133					autoplay = false;
6134				}
6135				
6136				var pagination = $('.slider-zoom-wrapper').attr('data-pagination');
6137				if(pagination == 0)
6138				{
6139					var pagination = false;
6140				}
6141				else
6142				{
6143					var pagination = true;
6144				}
6145			
6146			    var defaultOptions = {
6147			      $el: $('.slider-zoom-wrapper'),
6148			      showArrows: false,
6149			      showPagination: false,
6150			      duration: timer,
6151			      autoplay: autoplay
6152			    };
6153			
6154			    var options = Object.assign({}, defaultOptions, userOptions);
6155			
6156			    this.$el = options.$el;
6157			    this.maxSlide = this.$el.find($('.js-slider-home-slide')).length;
6158			    this.showArrows = this.maxSlide > 1 ? options.showArrows : false;
6159			    this.showPagination = pagination;
6160			    this.currentSlide = 1;
6161			    this.isAnimating = false;
6162			    this.animationDuration = 1200;
6163			    this.autoplaySpeed = options.duration;
6164			    this.interval;
6165			    this.$controls = this.$el.find('.js-slider-home-button');
6166			    this.autoplay = this.maxSlide > 1 ? options.autoplay : false;
6167			
6168			    this.$el.on('click', '.js-slider-home-next', function (event) {
6169			      return _this.nextSlide();
6170			    });
6171			    this.$el.on('click', '.js-slider-home-prev', function (event) {
6172			      return _this.prevSlide();
6173			    });
6174			    this.$el.on('click', '.js-pagination-item', function (event) {
6175			      if (!_this.isAnimating) {
6176			        _this.preventClick();
6177			        _this.goToSlide(event.target.dataset.slide);
6178			      }
6179			    });
6180			
6181			    this.init();
6182			  }
6183			
6184			  _createClass(Slideshow, [{
6185			    key: 'init',
6186			    value: function init() {
6187			      this.goToSlide(1);
6188			
6189			      if (this.autoplay) {
6190			        this.startAutoplay();
6191			      }
6192			
6193			      if (this.showPagination) {
6194			        var paginationNumber = this.maxSlide;
6195			        var pagination = '<div class="pagination"><div class="container">';
6196			
6197			        for (var i = 0; i < this.maxSlide; i++) {
6198			          var item = '<span class="pagination-item js-pagination-item ' + (i === 0 ? 'is-current' : '') + '" data-slide=' + (i + 1) + '>' + (i + 1) + '</span>';
6199			          pagination = pagination + item;
6200			        }
6201			
6202			        pagination = pagination + '</div></div>';
6203			
6204			        this.$el.append(pagination);
6205			      }
6206			    }
6207			  }, {
6208			    key: 'preventClick',
6209			    value: function preventClick() {
6210			      var _this2 = this;
6211			
6212			      this.isAnimating = true;
6213			      this.$controls.prop('disabled', true);
6214			      clearInterval(this.interval);
6215			
6216			      setTimeout(function () {
6217			        _this2.isAnimating = false;
6218			        _this2.$controls.prop('disabled', false);
6219			        if (_this2.autoplay) {
6220			          _this2.startAutoplay();
6221			        }
6222			      }, this.animationDuration);
6223			    }
6224			  }, {
6225			    key: 'goToSlide',
6226			    value: function goToSlide(index) {
6227			      this.currentSlide = parseInt(index);
6228			
6229			      if (this.currentSlide > this.maxSlide) {
6230			        this.currentSlide = 1;
6231			      }
6232			
6233			      if (this.currentSlide === 0) {
6234			        this.currentSlide = this.maxSlide;
6235			      }
6236			
6237			      var newCurrent = this.$el.find('.js-slider-home-slide[data-slide="' + this.currentSlide + '"]');
6238			      var newPrev = this.currentSlide === 1 ? this.$el.find('.js-slider-home-slide').last() : newCurrent.prev('.js-slider-home-slide');
6239			      var newNext = this.currentSlide === this.maxSlide ? this.$el.find('.js-slider-home-slide').first() : newCurrent.next('.js-slider-home-slide');
6240			
6241			      this.$el.find('.js-slider-home-slide').removeClass('is-prev is-next is-current');
6242			      this.$el.find('.js-pagination-item').removeClass('is-current');
6243			
6244			      if (this.maxSlide > 1) {
6245			        newPrev.addClass('is-prev');
6246			        newNext.addClass('is-next');
6247			      }
6248			
6249			      newCurrent.addClass('is-current');
6250			      this.$el.find('.js-pagination-item[data-slide="' + this.currentSlide + '"]').addClass('is-current');
6251			    }
6252			  }, {
6253			    key: 'nextSlide',
6254			    value: function nextSlide() {
6255			      this.preventClick();
6256			      this.goToSlide(this.currentSlide + 1);
6257			    }
6258			  }, {
6259			    key: 'prevSlide',
6260			    value: function prevSlide() {
6261			      this.preventClick();
6262			      this.goToSlide(this.currentSlide - 1);
6263			    }
6264			  }, {
6265			    key: 'startAutoplay',
6266			    value: function startAutoplay() {
6267			      var _this3 = this;
6268			
6269			      this.interval = setInterval(function () {
6270			        if (!_this3.isAnimating) {
6271			          _this3.nextSlide();
6272			        }
6273			      }, this.autoplaySpeed);
6274			    }
6275			  }, {
6276			    key: 'destroy',
6277			    value: function destroy() {
6278			      this.$el.off();
6279			    }
6280			  }]);
6281			
6282			  return Slideshow;
6283			}();
6284			
6285			(function () {
6286			  var loaded = false;
6287			  var maxLoad = 3000;
6288			
6289			  function load() {
6290			    var options = {
6291			      showPagination: true
6292			    };
6293			
6294			    var slideShow = new Slideshow(options);
6295			  }
6296			
6297			  function addLoadClass() {
6298			    $body.addClass('is-loaded');
6299			
6300			    setTimeout(function () {
6301			      $body.addClass('is-animated');
6302			    }, 600);
6303			  }
6304			
6305			  $window.on('load', function () {
6306			    if (!loaded) {
6307			      loaded = true;
6308			      load();
6309			    }
6310			  });
6311			
6312			  setTimeout(function () {
6313			    if (!loaded) {
6314			      loaded = true;
6315			      load();
6316			    }
6317			  }, maxLoad);
6318			
6319			  addLoadClass();
6320			})();
6321		} );
6322		//End execute javascript for slider zoom
6323		
6324		
6325		//Start execute javascript for course grid
6326		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-course-grid.default', function( $scope ) {
6327			
6328			jQuery('.course_tooltip').tooltipster({
6329			    position: 'right',
6330			    multiple: true,
6331			    contentCloning: true,
6332			    theme: 'tooltipster-shadow',
6333			    minWidth: 300,
6334			    maxWidth: 300,
6335			    delay: 50,
6336			    interactive: true,
6337			});
6338			
6339		} );
6340		//End execute javascript for course grid
6341		
6342		
6343		//Start execute javascript for search
6344		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-search.default', function( $scope ) {
6345			
6346			jQuery(".grandconference-search-icon").each(function() {
6347				var iconInput = jQuery(this).find('a');
6348				
6349				iconInput.bind('click', function () {
6350				    var openDiv = jQuery(this).attr('data-open');
6351				    jQuery('#'+openDiv).addClass('active');
6352				    
6353				    var isTouch = ('ontouchstart' in document.documentElement);
6354					if ( isTouch ) {
6355				    	jQuery('#'+openDiv).find('.grandconference-search-inner').addClass('touch');
6356				    }
6357				    
6358				    jQuery('body').addClass('elementor-no-overflow');
6359				    jQuery('body').addClass('elementor-search-activate');
6360				    
6361				    setTimeout(function(){ 
6362					    jQuery('#'+openDiv).find('.tg_search_form.autocomplete_form').find('input#s').trigger('focus');
6363					}, 300);
6364				});
6365			});
6366			
6367			jQuery(".tg_search_form.autocomplete_form").each(function() {
6368				var wrapper = jQuery(this).attr('data-open');
6369				var formInput = jQuery(this).find('input[name="s"]');
6370				var resultDiv = jQuery(this).attr('data-result');
6371				var isTouch = ('ontouchstart' in document.documentElement);
6372
6373				if ( !isTouch ) {
6374					formInput.on('input', function() {
6375						if(jQuery(this).val().length > 1)
6376						{
6377							jQuery.ajax({
6378								url: tgAjax.ajaxurl,
6379								type:'POST',
6380								data:'action=grandconference_ajax_search_result&'+jQuery(this).serialize(),
6381								success:function(results) {
6382									jQuery("#"+resultDiv).html(results);
6383									
6384									if(results != '')
6385									{
6386										jQuery("#"+resultDiv).addClass('visible');
6387										jQuery("#"+resultDiv).show();
6388										jQuery("#"+resultDiv).css('z-index', 99);
6389										
6390										jQuery("#"+resultDiv+ " ul li a").mousedown(function() {
6391											jQuery("#"+resultDiv).addClass('visible');
6392											jQuery("#"+resultDiv).attr('data-mousedown', 'true');
6393											
6394											location.href = jQuery(this).attr('href');
6395										});
6396									}
6397									else
6398									{
6399										jQuery("#"+resultDiv).hide();
6400									}
6401								}
6402							});
6403						}
6404						else
6405						{
6406							jQuery("#"+resultDiv).html('');
6407						}
6408					});
6409				}
6410				
6411				formInput.bind('click', function () {
6412				    jQuery("#"+resultDiv).addClass('visible');
6413				    jQuery("#"+resultDiv).attr('data-mousedown', 'true');
6414				    
6415				    /*var isTouch = ('ontouchstart' in document.documentElement);
6416					if ( isTouch ) {*/
6417						//jQuery('#'+wrapper).addClass('touch');
6418					//}
6419				});
6420				
6421				formInput.bind('focus', function () {
6422				    jQuery("#"+resultDiv).addClass('visible');
6423				    formInput.addClass('visible');
6424				});
6425				
6426				formInput.bind('blur', function () {
6427				    jQuery("#"+resultDiv).removeClass('visible');
6428				    formInput.removeClass('visible');
6429				});
6430				
6431				jQuery("#"+wrapper).bind('click', function () {
6432					if(!formInput.hasClass('visible'))
6433					{
6434						if(jQuery("#"+resultDiv).attr('data-mousedown') != 'true')
6435					    {
6436					    	jQuery("#"+resultDiv).removeClass('visible');
6437					    }
6438					    jQuery('#'+wrapper).removeClass('active');
6439					    jQuery('body').removeClass('elementor-no-overflow');
6440					    jQuery('body').removeClass('elementor-search-activate');
6441					}
6442				});
6443			});
6444			
6445		} );
6446		//End execute javascript for search
6447		
6448		
6449		//Start execute javascript for Elementor image
6450		elementorFrontend.hooks.addAction( 'frontend/element_ready/image.default', function( $scope ) {
6451			
6452			if(elementorFrontend.isEditMode())
6453			{
6454				var elementSettings = {};
6455				var modelCID 		= $scope.data( 'model-cid' );
6456					
6457				var settings 		= elementorFrontend.config.elements.data[ modelCID ];
6458				if(typeof settings != 'undefined')
6459				{
6460					var type 			= settings.attributes.widgetType || settings.attributes.elType,
6461						settingsKeys 	= elementorFrontend.config.elements.keys[ type ];
6462			
6463					if ( ! settingsKeys ) {
6464						settingsKeys = elementorFrontend.config.elements.keys[type] = [];
6465			
6466						jQuery.each( settings.controls, function ( name, control ) {
6467							if ( control.frontend_available ) {
6468								settingsKeys.push( name );
6469							}
6470						});
6471					}
6472			
6473					jQuery.each( settings.getActiveControls(), function( controlKey ) {
6474						if ( -1 !== settingsKeys.indexOf( controlKey ) ) {
6475							elementSettings[ controlKey ] = settings.attributes[ controlKey ];
6476						}
6477					} );
6478		
6479					var widgetExt = elementSettings;
6480				}
6481			}
6482			else
6483			{
6484				//Get widget settings data
6485				var widgetExtObj = $scope.attr('data-settings');
6486				
6487				if(typeof widgetExtObj != 'undefined')
6488				{
6489					var widgetExt = JSON.parse(widgetExtObj);
6490				}
6491			}
6492			
6493			if(typeof widgetExt != 'undefined')
6494			{
6495				//Begin background image parallax scrolling
6496				if(widgetExt.grandconference_image_is_animation == 'true')
6497				{
6498					$scope.addClass('themegoods-image-animation-'+widgetExt.grandconference_image_animation_effect);
6499					$scope.addClass('themegoods-image-animation');
6500					
6501					$scope.smoove({
6502						offset : '30%'
6503					});
6504				}
6505			}
6506		} );
6507		//End execute javascript for Elementor image
6508		
6509		
6510		//Start execute javascript for portfolio carousel
6511		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-portfolio-carousel.default', function( $scope ) {
6512			jQuery(".portfolio-carousel-wrapper .owl-carousel").each(function() {
6513				var autoPlay = jQuery(this).attr('data-autoplay');
6514				if (typeof autoPlay == "undefined"){
6515					autoPlay = false;
6516				}
6517				if(autoPlay == 1)
6518				{
6519					autoPlay = true;
6520				}
6521				else
6522				{
6523					autoPlay = false;
6524				}
6525				
6526				var timer = parseInt(jQuery(this).attr('data-timer'));
6527				if (typeof timer == "undefined"){
6528					timer = 8000;
6529				}
6530				
6531				var slidePadding = parseInt(jQuery(this).attr('data-stage-padding'));
6532				if (typeof slidePadding == "undefined"){
6533					slidePadding = 70;
6534				}
6535				
6536				var slideMargin = parseInt(jQuery(this).attr('data-margin'));
6537				if (typeof slideMargin == "undefined"){
6538					slideMargin = 40;
6539				}
6540				
6541				var items = parseInt(jQuery(this).attr('data-items'));
6542				if (typeof items == "undefined"){
6543					items = 4;
6544				}
6545				
6546				var pagination = jQuery(this).attr('data-pagination');
6547				if (typeof pagination == "undefined"){
6548					pagination = true;
6549				}
6550				if(pagination == 1)
6551				{
6552					pagination = true;
6553				}
6554				else
6555				{
6556					pagination = false;
6557				}
6558				//console.log(pagination);
6559				var portfolioCarousel = jQuery(this).owlCarousel({
6560					stagePadding: parseInt(slidePadding),
6561					loop: false,
6562					center: false,
6563					items: parseInt(items),
6564					margin: parseInt(slideMargin),
6565					autoHeight : true,
6566					autoplay: autoPlay,
6567					dots: pagination,
6568					autoplayTimeout: timer,
6569					smartSpeed: 450,
6570					responsive: {
6571					  0: {
6572						items: 1
6573					  },
6574					  768: {
6575						items: 2
6576					  },
6577					  1170: {
6578						items: parseInt(items)
6579					  },
6580					  1600: {
6581						items: parseInt(items+1)
6582					  },
6583					  2000: {
6584						items: parseInt(items+2)
6585					  },
6586					  2400: {
6587						items: parseInt(items+3)
6588					  },
6589					}
6590				});
6591				
6592				setTimeout(function(){
6593					portfolioCarousel.trigger('refresh.owl.carousel');
6594				}, 1000);
6595			});
6596		});
6597		//End execute javascript for portfolio carousel
6598		
6599		
6600		//Start execute javascript for service grid
6601		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-service-grid.default', function( $scope ) {
6602			
6603			jQuery(".service-grid-wrapper").mouseover(function() {
6604				
6605				var dataHoverY = jQuery(this).attr('data-hoverY');
6606			    jQuery(this).find('.header-wrap').css('transform', 'translateY(-'+dataHoverY+'px)');
6607			    
6608			}).mouseleave(function() {
6609				
6610			    jQuery(this).find('.header-wrap').css('transform', 'translateY(0px)');
6611			});
6612			
6613			jQuery(".service-grid-wrapper").each(function() {
6614			    var hoverContent = jQuery(this).find('.hover-content');
6615			    var hoverMoveY = parseInt(hoverContent.height()+10);
6616			    jQuery(this).attr('data-hoverY', hoverMoveY);
6617			});
6618			
6619			jQuery(window).resize(function() {
6620				jQuery(".service-grid-wrapper").each(function() {
6621				    var hoverContent = jQuery(this).find('.hover-content');
6622				    var hoverMoveY = parseInt(hoverContent.height()+10);
6623				    jQuery(this).attr('data-hoverY', hoverMoveY);
6624				});
6625			});
6626			
6627		} );
6628		//End execute javascript for service grid
6629		
6630		//Start execute javascript for service carousel
6631		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-service-carousel.default', function( $scope ) {
6632			jQuery(".service-carousel-wrapper .owl-carousel").each(function() {
6633				var autoPlay = jQuery(this).attr('data-autoplay');
6634				if (typeof autoPlay == "undefined"){
6635					autoPlay = false;
6636				}
6637				if(autoPlay == 1)
6638				{
6639					autoPlay = true;
6640				}
6641				else
6642				{
6643					autoPlay = false;
6644				}
6645				
6646				var timer = parseInt(jQuery(this).attr('data-timer'));
6647				if (typeof timer == "undefined"){
6648					timer = 8000;
6649				}
6650				
6651				var slidePadding = parseInt(jQuery(this).attr('data-stage-padding'));
6652				if (typeof slidePadding == "undefined"){
6653					slidePadding = 70;
6654				}
6655				
6656				var slideMargin = parseInt(jQuery(this).attr('data-margin'));
6657				if (typeof slideMargin == "undefined"){
6658					slideMargin = 40;
6659				}
6660				
6661				var items = parseInt(jQuery(this).attr('data-items'));
6662				if (typeof items == "undefined"){
6663					items = 4;
6664				}
6665				
6666				var pagination = jQuery(this).attr('data-pagination');
6667				if (typeof pagination == "undefined"){
6668					pagination = true;
6669				}
6670				if(pagination == 1)
6671				{
6672					pagination = true;
6673				}
6674				else
6675				{
6676					pagination = false;
6677				}
6678				//console.log(pagination);
6679				var serviceCarousel = jQuery(this).owlCarousel({
6680					stagePadding: parseInt(slidePadding),
6681					loop: false,
6682					center: false,
6683					items: parseInt(items),
6684					margin: parseInt(slideMargin),
6685					autoHeight : true,
6686					autoplay: autoPlay,
6687					dots: pagination,
6688					autoplayTimeout: timer,
6689					smartSpeed: 450,
6690					responsive: {
6691					  0: {
6692						items: 1
6693					  },
6694					  768: {
6695						items: 2
6696					  },
6697					  1170: {
6698						items: parseInt(items)
6699					  },
6700					  1600: {
6701						items: parseInt(items+1)
6702					  },
6703					  2000: {
6704						items: parseInt(items+2)
6705					  },
6706					  2400: {
6707						items: parseInt(items+3)
6708					  },
6709					}
6710				});
6711				
6712				setTimeout(function(){
6713					serviceCarousel.trigger('refresh.owl.carousel');
6714				}, 1000);
6715			});
6716		});
6717		//End execute javascript for service carousel
6718		
6719		//Start execute javascript for blog carousel
6720		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-blog-carousel.default', function( $scope ) {
6721			jQuery(".blog-carousel-wrapper .owl-carousel").each(function() {
6722				var autoPlay = jQuery(this).attr('data-autoplay');
6723				if (typeof autoPlay == "undefined"){
6724					autoPlay = false;
6725				}
6726				if(autoPlay == 1)
6727				{
6728					autoPlay = true;
6729				}
6730				else
6731				{
6732					autoPlay = false;
6733				}
6734				
6735				var timer = parseInt(jQuery(this).attr('data-timer'));
6736				if (typeof timer == "undefined"){
6737					timer = 8000;
6738				}
6739				
6740				var slidePadding = parseInt(jQuery(this).attr('data-stage-padding'));
6741				if (typeof slidePadding == "undefined"){
6742					slidePadding = 70;
6743				}
6744				
6745				var slideMargin = parseInt(jQuery(this).attr('data-margin'));
6746				if (typeof slideMargin == "undefined"){
6747					slideMargin = 40;
6748				}
6749				
6750				var items = parseInt(jQuery(this).attr('data-items'));
6751				if (typeof items == "undefined"){
6752					items = 4;
6753				}
6754				
6755				var pagination = jQuery(this).attr('data-pagination');
6756				if (typeof pagination == "undefined"){
6757					pagination = true;
6758				}
6759				if(pagination == 1)
6760				{
6761					pagination = true;
6762				}
6763				else
6764				{
6765					pagination = false;
6766				}
6767				//console.log(pagination);
6768				var blogCarousel = jQuery(this).owlCarousel({
6769					stagePadding: parseInt(slidePadding),
6770					loop: false,
6771					center: false,
6772					items: parseInt(items),
6773					margin: parseInt(slideMargin),
6774					autoHeight : true,
6775					autoplay: autoPlay,
6776					dots: pagination,
6777					autoplayTimeout: timer,
6778					smartSpeed: 450,
6779					responsive: {
6780					  0: {
6781						items: 1
6782					  },
6783					  768: {
6784						items: 2
6785					  },
6786					  1170: {
6787						items: parseInt(items)
6788					  },
6789					  1600: {
6790						items: parseInt(items+1)
6791					  },
6792					  2000: {
6793						items: parseInt(items+2)
6794					  },
6795					  2400: {
6796						items: parseInt(items+3)
6797					  },
6798					}
6799				});
6800				
6801				setTimeout(function(){
6802					blogCarousel.trigger('refresh.owl.carousel');
6803				}, 1000);
6804			});
6805		});
6806		//End execute javascript for blog carousel
6807		
6808		//Start execute javascript for pricing table
6809		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-pricing-table.default', function( $scope ) {
6810			
6811			var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));
6812			
6813			elems.forEach(function(elem) {
6814				var switchery = new Switchery(elem, { disabled: true, disabledOpacity: 1, color: elem.getAttribute('data-switch-bg'), secondaryColor: elem.getAttribute('data-switch-bg'), jackColor: elem.getAttribute('data-switch-button'), jackSecondaryColor: elem.getAttribute('data-switch-button') });
6815			});
6816			
6817			var changeCheckbox = document.querySelector('.js-switch');
6818			
6819			if (!!changeCheckbox) {
6820				changeCheckbox.onchange = function() {
6821					jQuery(".pricing-plan-price").each(function() {
6822					    //If select yearly
6823						if(changeCheckbox.checked)
6824						{
6825							var pricingPlan = jQuery(this).attr('data-price-year');
6826							jQuery(this).html(pricingPlan);
6827							jQuery('.pricing-plan-unit-month').addClass('hide');
6828							jQuery('.pricing-plan-unit-year').removeClass('hide');
6829						}
6830						//If select monthly
6831						else
6832						{
6833							var pricingPlan = jQuery(this).attr('data-price-month');
6834							jQuery(this).html(pricingPlan);
6835							jQuery('.pricing-plan-unit-year').addClass('hide');
6836							jQuery('.pricing-plan-unit-month').removeClass('hide');
6837						}
6838					});
6839				};
6840			}
6841		} );
6842		//End execute javascript for pricing table
6843		
6844		//Start execute javascript for food menu
6845		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-food-menu.default', function( $scope ) {
6846			
6847			jQuery('.food-tooltip').tooltipster({
6848			    position: 'right',
6849			    multiple: true,
6850			    contentCloning: true,
6851			    theme: 'tooltipster-shadow',
6852			    minWidth: 300,
6853			    maxWidth: 300,
6854			    delay: 50,
6855			    interactive: true,
6856			});
6857			
6858		} );
6859		//End execute javascript for food menu
6860		
6861		
6862		//Start execute javascript for search form
6863		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-search-form.default', function( $scope ) {
6864			
6865			jQuery(".tg-search-form.autocomplete-form").each(function() {
6866				var formInput = jQuery(this).find('input[name="s"]');
6867				var resultDiv = jQuery(this).attr('data-result');
6868				
6869				formInput.on('input', function() {
6870					if(jQuery(this).val().length > 1)
6871					{
6872						jQuery.ajax({
6873							url: tgAjax.ajaxurl,
6874							type:'POST',
6875							data:'action=grandconference_ajax_search_result&'+jQuery(this).serialize(),
6876							success:function(results) {
6877								jQuery("#"+resultDiv).html(results);
6878								
6879								if(results != '')
6880								{
6881									jQuery("#"+resultDiv).addClass('visible');
6882									jQuery("#"+resultDiv).show();
6883									jQuery("#"+resultDiv).css('z-index', 99);
6884									
6885									jQuery("#"+resultDiv+ " ul li a").mousedown(function() {
6886										jQuery("#"+resultDiv).attr('data-mousedown', true);
6887									});
6888								}
6889								else
6890								{
6891									jQuery("#"+resultDiv).hide();
6892								}
6893							}
6894						});
6895					}
6896				});
6897				
6898				formInput.bind('focus', function () {
6899				    jQuery("#"+resultDiv).addClass('visible');
6900				});
6901				
6902				formInput.bind('blur', function () {
6903					if(jQuery("#"+resultDiv).attr('data-mousedown') != 'true')
6904				    {
6905				    	jQuery("#"+resultDiv).removeClass('visible');
6906				    }
6907				});
6908			});
6909			
6910		} );
6911		//End execute javascript for search form
6912
6913		//Start execute javascript for animated headline
6914		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-animated-headline.default', function( $scope ) {
6915			
6916			jQuery(".themegoods-animated-headline").each(function() {
6917				var animationType = jQuery(this).attr('data-animation');
6918
6919				jQuery(this).animatedHeadline({
6920					animationType: animationType
6921				});
6922			});
6923			
6924		} );
6925		//End execute javascript for animated headline
6926		
6927		//Start execute javascript for animated text
6928		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-animated-text.default', function( $scope ) {
6929			
6930			jQuery(".themegoods-animated-text").each(function() {
6931				var textContent = jQuery(this).first();
6932				var delimiterTypeOri = jQuery(this).attr('data-delimiter');
6933				var delimiterType = jQuery(this).attr('data-delimiter');
6934				var transitionSpeed = parseInt(jQuery(this).attr('data-transition'));
6935				var transitionDelay = parseInt(jQuery(this).attr('data-transition-delay'));
6936				var transitionDuration = parseInt(jQuery(this).attr('data-transition-duration'));
6937				
6938				if(delimiterType == 'sentence') {
6939					delimiterType = 'word'
6940				}
6941				
6942				var animatedText = textContent.blast({
6943					delimiter: delimiterType,
6944					aria: false,
6945				});
6946				
6947				//If overflow hidden
6948				if(jQuery(this).hasClass('overflow-hidden')){
6949					animatedText.each(function(i) {
6950						var textEachSpan = jQuery(this);
6951						var initialText = textEachSpan.text();
6952						//console.log(textEachSpan.html());
6953						//textEachSpan.html('<span>'+initialText+'</span>');
6954						
6955						//console.log(initialText);
6956					});
6957				}
6958				
6959				if(textContent.isInViewport() && jQuery(this).closest('.fullmenu-wrapper').length != 1) {
6960					animatedText.each(function(i) {
6961						var delaySpeed = parseInt(transitionDelay + (i * transitionSpeed));
6962						//console.log(delimiterType);
6963						if(delimiterTypeOri == 'sentence') {
6964							delaySpeed = parseInt(transitionDelay + transitionSpeed);
6965						}
6966						
6967						  jQuery(this).queue(function (next) { 
6968							jQuery(this).css({'transition-delay': delaySpeed+'ms', 'transition-duration': transitionDuration+'ms', 'transform': 'translateX(0px) translateY(0px) translateZ(0px)', 'opacity': 1});  
6969						})
6970					});
6971				}
6972				
6973				jQuery(window).on('resize scroll', function() {
6974					if(textContent.isInViewport()) {
6975						animatedText.each(function(i) {
6976							var delaySpeed = parseInt(transitionDelay + (i * transitionSpeed));
6977							if(delimiterTypeOri == 'sentence') {
6978								delaySpeed = parseInt(transitionDelay + transitionSpeed);
6979							}
6980							
6981							  jQuery(this).queue(function (next) { 
6982								jQuery(this).css({'transition-delay': delaySpeed+'ms', 'transition-duration': transitionDuration+'ms', 'transform': 'translateX(0px) translateY(0px) translateZ(0px)', 'opacity': 1});  
6983							})
6984						});
6985					}
6986				});
6987				
6988				jQuery('body').on('classChange', function() {
6989					if(jQuery(this).hasClass('fullmenu-active')) {
6990						animatedText.each(function(i) {
6991							var delaySpeed = parseInt(transitionDelay + (i * transitionSpeed));
6992							if(delimiterTypeOri == 'sentence') {
6993								delaySpeed = parseInt(transitionDelay + transitionSpeed);
6994							}
6995							
6996							  jQuery(this).queue(function (next) { 
6997								jQuery(this).css({'transition-delay': delaySpeed+'ms', 'transition-duration': transitionDuration+'ms', 'transform': 'translateX(0px) translateY(0px) translateZ(0px)', 'opacity': 1});  
6998							})
6999						});
7000					}
7001				});
7002			});
7003			
7004		} );
7005		//End execute javascript for animated text
7006		
7007		//Start execute javascript for animated gallery
7008		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-gallery-animated.default', function( $scope ) {
7009			jQuery(".grandconference-gallery-animated-content-wrapper").each(function() {
7010				var columns = jQuery(this).attr('data-columns');
7011				if (typeof columns == "undefined"){
7012					columns = 7;
7013				}
7014				
7015				var rows = jQuery(this).attr('data-rows');
7016				if (typeof rows == "undefined"){
7017					rows = 1;
7018				}
7019				
7020				var animationType = jQuery(this).attr('data-animation');
7021				if (typeof animationType == "undefined"){
7022					animationType = 'random';
7023				}
7024				
7025				var animationSpeed = jQuery(this).attr('data-animation-speed');
7026				if (typeof animationSpeed == "undefined"){
7027					animationSpeed = 800;
7028				}
7029				
7030				var intervalTime = jQuery(this).attr('data-interval');
7031				if (typeof intervalTime == "undefined"){
7032					intervalTime = 3000;
7033				}
7034				
7035				jQuery(this).gridrotator( {
7036					rows : parseInt(rows),
7037					maxStep : 2,
7038					columns : parseInt(columns),
7039					preventClick : true,
7040					animType		: animationType,
7041					animEasingOut	: 'ease',
7042					animEasingIn	: 'ease',
7043					animSpeed		: parseInt(animationSpeed),
7044					interval : parseInt(intervalTime),
7045					w1024 : {
7046						rows : parseInt(rows),
7047						columns : parseInt(columns)
7048					},
7049					w768 : {
7050						rows : parseInt(rows),
7051						columns : parseInt(columns)
7052					},
7053					w480 : {
7054						rows : parseInt(rows),
7055						columns : parseInt(columns)
7056					},
7057					w320 : {
7058						rows : 1,
7059						columns : 3
7060					},
7061					w240 : {
7062						rows : 1,
7063						columns : 3
7064					},
7065				} );
7066			});
7067			
7068		} );
7069		//End execute javascript for animated gallery
7070		
7071		
7072		//Start execute javascript for team carousel
7073		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-team-carousel.default', function( $scope ) {
7074			jQuery(".team-carousel-wrapper .owl-carousel").each(function() {
7075				var autoPlay = jQuery(this).attr('data-autoplay');
7076				if (typeof autoPlay == "undefined"){
7077					autoPlay = false;
7078				}
7079				if(autoPlay == 1)
7080				{
7081					autoPlay = true;
7082				}
7083				else
7084				{
7085					autoPlay = false;
7086				}
7087				
7088				var timer = parseInt(jQuery(this).attr('data-timer'));
7089				if (typeof timer == "undefined"){
7090					timer = 8000;
7091				}
7092				
7093				var slidePadding = parseInt(jQuery(this).attr('data-stage-padding'));
7094				if (typeof slidePadding == "undefined"){
7095					slidePadding = 70;
7096				}
7097				
7098				var slideMargin = parseInt(jQuery(this).attr('data-margin'));
7099				if (typeof slideMargin == "undefined"){
7100					slideMargin = 40;
7101				}
7102				
7103				var items = parseInt(jQuery(this).attr('data-items'));
7104				if (typeof items == "undefined"){
7105					items = 4;
7106				}
7107				
7108				var pagination = jQuery(this).attr('data-pagination');
7109				if (typeof pagination == "undefined"){
7110					pagination = true;
7111				}
7112				if(pagination == 1)
7113				{
7114					pagination = true;
7115				}
7116				else
7117				{
7118					pagination = false;
7119				}
7120				//console.log(pagination);
7121				var teamCarousel = jQuery(this).owlCarousel({
7122					stagePadding: parseInt(slidePadding),
7123					loop: false,
7124					center: false,
7125					items: parseInt(items),
7126					margin: parseInt(slideMargin),
7127					autoHeight : true,
7128					autoplay: autoPlay,
7129					dots: pagination,
7130					autoplayTimeout: timer,
7131					smartSpeed: 450,
7132					responsive: {
7133					  0: {
7134						items: 1
7135					  },
7136					  768: {
7137						items: 2
7138					  },
7139					  1170: {
7140						items: parseInt(items)
7141					  },
7142					  1600: {
7143						items: parseInt(items)
7144					  },
7145					  2000: {
7146						items: parseInt(items)
7147					  },
7148					  2400: {
7149						items: parseInt(items)
7150					  },
7151					}
7152				});
7153				
7154				setTimeout(function(){
7155					teamCarousel.trigger('refresh.owl.carousel');
7156				}, 1000);
7157			});
7158		});
7159		//End execute javascript for team carousel
7160		
7161		//Start execute javascript for session fullwidth
7162		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-classic-session-fullwidth.default', function( $scope ) {
7163			jQuery(".session-fullwidth-wrapper").each(function() {
7164				var widgetID = jQuery(this).attr('data-widget-id');
7165				
7166				var grid = jQuery('#'+widgetID).masonry({
7167				  itemSelector: '.scheduleday_wrapper',
7168				  columnWidth: ".scheduleday_wrapper",
7169				  gutter: 40
7170				});
7171				
7172				jQuery('#'+widgetID+' li .session_content_wrapper.expandable').on( 'click', function(e) {
7173					var targetID = jQuery(this).attr('data-expandid');
7174					
7175					jQuery(this).parent('li').find('#'+targetID).toggleClass('hide');
7176					jQuery(this).toggleClass('active');
7177					grid.masonry();
7178				});
7179				jQuery('#session_filter_'+widgetID+' li a').on( 'click', function(e) {
7180					var targetFilter = jQuery(this).attr('data-filter');
7181					
7182					jQuery('#session_filter_'+widgetID+' li a').removeClass('active');
7183					jQuery(this).addClass('active');
7184					
7185					if(targetFilter != '')
7186					{
7187						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7188						
7189						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').each(function(){
7190							if(!jQuery(this).hasClass(targetFilter) && !jQuery(this).hasClass('scheduleday_title'))
7191							{
7192								jQuery(this).addClass('hide');
7193							}
7194						});
7195					}
7196					else
7197					{
7198						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7199					}
7200					
7201					grid.masonry();
7202				});
7203				
7204				jQuery('#session_expand_'+widgetID).on( 'click', function(e) {
7205					jQuery('#'+widgetID+' ul.scheduleday_wrapper li .session_content_wrapper.expandable').trigger('click');
7206					
7207					var expandTitle = jQuery(this).attr('data-expand-title');
7208					var collapseTitle = jQuery(this).attr('data-collapse-title');
7209					
7210					if(jQuery(this).hasClass('do_expand'))
7211					{
7212						jQuery(this).removeClass('do_expand');
7213						jQuery(this).addClass('do_collapse');
7214						
7215						jQuery(this).html(collapseTitle+' -');
7216					}
7217					else
7218					{
7219						jQuery(this).addClass('do_expand');
7220						jQuery(this).removeClass('do_collapse');
7221						
7222						jQuery(this).html(expandTitle+' +');
7223					}
7224					
7225					grid.masonry();
7226				});
7227			});
7228		});
7229		
7230		//Start execute javascript for session fullwidth
7231		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-classic-session-sidebar.default', function( $scope ) {
7232			jQuery(".session-sidebar-wrapper").each(function() {
7233				var widgetID = jQuery(this).attr('data-widget-id');
7234				
7235				var grid = jQuery('#'+widgetID).masonry({
7236				  itemSelector: '.scheduleday_wrapper',
7237				  columnWidth: ".scheduleday_wrapper",
7238				  gutter: 40
7239				});
7240				
7241				jQuery('#'+widgetID+' li .session_content_wrapper.expandable').on( 'click', function(e) {
7242					var targetID = jQuery(this).attr('data-expandid');
7243					
7244					jQuery(this).parent('li').find('#'+targetID).toggleClass('hide');
7245					jQuery(this).toggleClass('active');
7246					grid.masonry();
7247				});
7248				jQuery('#session_filter_'+widgetID+' li a').on( 'click', function(e) {
7249					var targetFilter = jQuery(this).attr('data-filter');
7250					
7251					jQuery('#session_filter_'+widgetID+' li a').removeClass('active');
7252					jQuery(this).addClass('active');
7253					
7254					if(targetFilter != '')
7255					{
7256						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7257						
7258						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').each(function(){
7259							if(!jQuery(this).hasClass(targetFilter) && !jQuery(this).hasClass('scheduleday_title'))
7260							{
7261								jQuery(this).addClass('hide');
7262							}
7263						});
7264					}
7265					else
7266					{
7267						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7268					}
7269					
7270					grid.masonry();
7271				});
7272				
7273				jQuery('#session_expand_'+widgetID).on( 'click', function(e) {
7274					jQuery('#'+widgetID+' ul.scheduleday_wrapper li .session_content_wrapper.expandable').trigger('click');
7275					
7276					var expandTitle = jQuery(this).attr('data-expand-title');
7277					var collapseTitle = jQuery(this).attr('data-collapse-title');
7278					
7279					if(jQuery(this).hasClass('do_expand'))
7280					{
7281						jQuery(this).removeClass('do_expand');
7282						jQuery(this).addClass('do_collapse');
7283						
7284						jQuery(this).html(collapseTitle+' -');
7285					}
7286					else
7287					{
7288						jQuery(this).addClass('do_expand');
7289						jQuery(this).removeClass('do_collapse');
7290						
7291						jQuery(this).html(expandTitle+' +');
7292					}
7293					
7294					grid.masonry();
7295				});
7296			});
7297		});
7298		
7299		//Start execute javascript for session tab
7300		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-classic-session-tab.default', function( $scope ) {
7301			jQuery(".session-tab-wrapper").each(function() {
7302				var widgetID = jQuery(this).attr('data-widget-id');
7303				
7304				jQuery('#'+widgetID+' li .session_content_wrapper.expandable').on( 'click', function(e) {
7305					var targetID = jQuery(this).attr('data-expandid');
7306					
7307					jQuery(this).parent('li').find('#'+targetID).toggleClass('hide');
7308					jQuery(this).toggleClass('active');
7309				});
7310			
7311				jQuery('#'+widgetID+' ul.scheduleday_wrapper li.scheduleday_title').on( 'click', function(e) {
7312					jQuery('#'+widgetID+' ul.scheduleday_wrapper li.scheduleday_title').removeClass('active');
7313					jQuery(this).addClass('active');
7314					
7315					var targetTab = jQuery(this).attr('data-tab');
7316					jQuery('#'+widgetID+' ul.scheduleday_wrapper.tab_content').addClass('hide');
7317					jQuery('#'+widgetID+' ul#'+targetTab).removeClass('hide');
7318				});
7319				
7320				jQuery('#session_filter_'+widgetID+' li a').on( 'click', function(e) {
7321					var targetFilter = jQuery(this).attr('data-filter');
7322					
7323					jQuery('#session_filter_'+widgetID+' li a').removeClass('active');
7324					jQuery(this).addClass('active');
7325					
7326					if(targetFilter != '')
7327					{
7328						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7329						
7330						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').each(function(){
7331							if(!jQuery(this).hasClass(targetFilter) && !jQuery(this).hasClass('scheduleday_title'))
7332							{
7333								jQuery(this).addClass('hide');
7334							}
7335						});
7336					}
7337					else
7338					{
7339						jQuery('#'+widgetID+' ul.scheduleday_wrapper li').removeClass('hide');
7340					}
7341				});
7342				
7343				jQuery('#session_expand_'+widgetID).on( 'click', function(e) {
7344					jQuery('#'+widgetID+' ul.scheduleday_wrapper li .session_content_wrapper.expandable').trigger('click');
7345					
7346					var expandTitle = jQuery(this).attr('data-expand-title');
7347					var collapseTitle = jQuery(this).attr('data-collapse-title');
7348					
7349					if(jQuery(this).hasClass('do_expand'))
7350					{
7351						jQuery(this).removeClass('do_expand');
7352						jQuery(this).addClass('do_collapse');
7353						
7354						jQuery(this).html(collapseTitle+' -');
7355					}
7356					else
7357					{
7358						jQuery(this).addClass('do_expand');
7359						jQuery(this).removeClass('do_collapse');
7360						
7361						jQuery(this).html(expandTitle+' +');
7362					}
7363				});
7364			});
7365		});
7366		
7367		//Start execute javascript for testimonials slider
7368		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-classic-testimonials-slider.default', function( $scope ) {
7369			jQuery(".testimonials-slider-wrapper").find('.testimonial_slider_wrapper').each(function() {
7370				var timer = jQuery(this).attr('data-timer');
7371				var autoplay = jQuery(this).attr('data-autoplay');
7372				
7373				if(timer == 0)
7374				{
7375					timer = false;
7376					autoplay = false;
7377				}
7378				
7379				var pagination = jQuery(this).attr('data-pagination');
7380				if(pagination == 0)
7381				{
7382					var pagination = false;
7383				}
7384				else
7385				{
7386					var pagination = true;
7387				}
7388				
7389				jQuery(this).flexslider({
7390					  animation: "fade",
7391					  animationLoop: true,
7392					  itemMargin: 0,
7393					  minItems: 1,
7394					  maxItems: 1,
7395					  slideshow: autoplay,
7396					  controlNav: pagination,
7397					  smoothHeight: false,
7398					  pauseOnHover: true,
7399					  directionNav: false,
7400					  slideshowSpeed: timer,
7401					  animationSpeed: 400,
7402					  move: 1
7403				});
7404			});
7405		});
7406		
7407		//Start execute javascript for countdown timer
7408		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-countdown.default', function( $scope ) {
7409			jQuery(".countdown-wrapper").find('.countdown-clock').each(function() {
7410				var dataDate = jQuery(this).attr('data-date');
7411				var labelWeek = jQuery(this).attr('data-weeks');
7412				var labelDay = jQuery(this).attr('data-days');
7413				var labelhour = jQuery(this).attr('data-hours');
7414				var labelMinute = jQuery(this).attr('data-minutes');
7415				var labelSecond = jQuery(this).attr('data-seconds');
7416				
7417				jQuery(this).countdown(dataDate, function(event) {
7418				  var clock = jQuery(this).html(event.strftime(''
7419					+ '<div class="countdown-clock-col"><div class="countdown-clock-counter">%w</div><div class="countdown-clock-label">'+labelWeek+'</div></div>'
7420					+ '<div class="countdown-clock-col"><div class="countdown-clock-counter">%d</div><div class="countdown-clock-label">'+labelDay+'</div></div>'
7421					+ '<div class="countdown-clock-col"><div class="countdown-clock-counter">%H</div><div class="countdown-clock-label">'+labelhour+'</div></div>'
7422					+ '<div class="countdown-clock-col"><div class="countdown-clock-counter">%M</div><div class="countdown-clock-label">'+labelMinute+'</div></div>'
7423					+ '<div class="countdown-clock-col"><div class="countdown-clock-counter">%S</div><div class="countdown-clock-label">'+labelSecond+'</div></div>'));
7424				});
7425			});
7426		});
7427		
7428		//Start execute javascript for speaker carousel
7429		elementorFrontend.hooks.addAction( 'frontend/element_ready/grandconference-speaker-carousel.default', function( $scope ) {
7430			jQuery(".speaker-carousel-wrapper .owl-carousel").each(function() {
7431				var autoPlay = jQuery(this).attr('data-autoplay');
7432				if (typeof autoPlay == "undefined"){
7433					autoPlay = false;
7434				}
7435				if(autoPlay == 1)
7436				{
7437					autoPlay = true;
7438				}
7439				else
7440				{
7441					autoPlay = false;
7442				}
7443				
7444				var timer = parseInt(jQuery(this).attr('data-timer'));
7445				if (typeof timer == "undefined"){
7446					timer = 8000;
7447				}
7448				
7449				var slidePadding = parseInt(jQuery(this).attr('data-stage-padding'));
7450				if (typeof slidePadding == "undefined"){
7451					slidePadding = 70;
7452				}
7453				
7454				var slideMargin = parseInt(jQuery(this).attr('data-margin'));
7455				if (typeof slideMargin == "undefined"){
7456					slideMargin = 40;
7457				}
7458				
7459				var items = parseInt(jQuery(this).attr('data-items'));
7460				if (typeof items == "undefined"){
7461					items = 4;
7462				}
7463				
7464				var pagination = jQuery(this).attr('data-pagination');
7465				if (typeof pagination == "undefined"){
7466					pagination = true;
7467				}
7468				if(pagination == 1)
7469				{
7470					pagination = true;
7471				}
7472				else
7473				{
7474					pagination = false;
7475				}
7476				//console.log(pagination);
7477				var speakerCarousel = jQuery(this).owlCarousel({
7478					stagePadding: parseInt(slidePadding),
7479					loop: false,
7480					center: false,
7481					items: parseInt(items),
7482					margin: parseInt(slideMargin),
7483					autoHeight : true,
7484					autoplay: autoPlay,
7485					dots: pagination,
7486					autoplayTimeout: timer,
7487					smartSpeed: 450,
7488					responsive: {
7489					  0: {
7490						items: 1
7491					  },
7492					  768: {
7493						items: 2
7494					  },
7495					  1170: {
7496						items: parseInt(items)
7497					  },
7498					  1600: {
7499						items: parseInt(items)
7500					  },
7501					  2000: {
7502						items: parseInt(items)
7503					  },
7504					  2400: {
7505						items: parseInt(items)
7506					  },
7507					}
7508				});
7509				
7510				setTimeout(function(){
7511					speakerCarousel.trigger('refresh.owl.carousel');
7512				}, 1000);
7513			});
7514		});
7515		//End execute javascript for speaker carousel
7516		
7517	} );
7518	
7519} )( 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.