PageSourceSearch

https://www.fkcci.org/wp-content/plugins/eventON/assets/js/eventon_script.js?ver=5.0.2

js fkcci.org collected 2026-10-02 20:53:44 UTC 117,665 bytes, 3,292 lines download raw bytes

1/**
2 * Javascript code that is associated with the front end of the calendar
3 * @version 5.0.2
4 * @license EventON JavaScript Assets 
5 * Copyright (C) 2014-2025 Ashan Jay, AshanJay Designs LLC.
6 * 
7 * PROPRIETARY LICENSE - All Rights Reserved
8 * 
9 * Permission granted solely for personal use with valid EventON license.
10 * YOU MAY NOT: redistribute, resell, sublicense, or publish these Assets.
11 * 
12 * Trademark: "EventON" is a trademark of AshanJay Designs LLC.
13 * Contact: [email protected]
14 * 
15 * PROVIDED "AS IS" WITHOUT WARRANTY. VIOLATION MAY RESULT IN LEGAL ACTION.
16 */
17
18jQuery(document).ready(function($){
19
20	// restrict this only to frontend of the calendar
21	if ( evo_general_params != '' && evo_general_params !== undefined && evo_general_params.is_admin) return; 
22	
23	//return;
24	var BODY = $('body');
25	var BUS = ''; // initial eventon calendar data
26	var ajax_url = evo_general_params.ajaxurl;
27
28
29// EventON calendar main function
30	// Calendar processing 2.8.6 u 4.6
31	$.fn.evo_calendar = function (options) {
32
33		var el = this;
34		var cal = this;
35		var cal = {};
36		var calO = $.extend({
37			'SC': {},
38			'json':{},
39			'type':'init' ,
40			map_delay:0
41		}, options);
42		var SC = el.evo_shortcode_data();
43
44		
45		// load calendar eventcard and eventtop interactions
46		this.find('.eventon_list_event').each(function(){
47			evo_cal_eventcard_interactions( $(this) );
48		});
49
50		var init = function(){
51
52			// change IDs for map section for eventon widgets
53			if( $(el).hasClass('evcal_widget')){
54				$(el).find('.evcal_gmaps').each(function(){
55					var gmap_id = obj.attr('id');
56					var new_gmal_id =gmap_id+'_widget'; 
57					obj.attr({'id':new_gmal_id})
58				});
59			}
60
61			// load maps on calendar
62			_evo_run_eventcard_map_load();
63
64			// initial actions on calendar
65			$(el).evo_cal_filtering();
66
67			// localizing event time
68			$(el).evo_cal_localize_time();
69
70			// load lightbox events on page load
71			$(cal).evo_cal_oneevent_onload(calO.type);
72			
73			el.evo_cal_hide_data();	
74
75			live_now_cal();
76			counters();
77		};
78		
79		// support	
80			var live_now_cal = function(){
81				$(el).find('.evo_img_time').each(function(){
82					if( $(this).closest('a.desc_trig').find('em.evcal_time').length ){
83						_html = $(this).closest('a.desc_trig').find('em.evcal_time')[0].outerHTML;
84						$(this).html( _html );
85					}				
86				});
87			}
88
89			var counters = function(){
90				$(el).find('.evo_countdowner').each(function(){
91					$(this).evo_countdown();
92				});
93			}
94
95		init();	
96	};
97
98      
99// Event Card handling / Bind Event Listeners --- v4.6.1 @updated 5.0
100	var evo_eventcard_listeners = function(){
101
102		const EVO_Card_Listeners = {
103			E: {
104				B: $('body')
105			},
106			init(){
107				const { E } = this;
108				// Event listeners
109	            E.B.on('click.evoCard', '.evo_et_trigger', (e) => this.evo_handle_et_sidePanel(e));
110	            E.B.on('evo_ajax_success_evo_et_trigger.evoCard', (e, OO, data, el) => this.evo_handle_et_sp_content(e, OO, data, el));
111	            E.B.on('click.evoCard', '.tzo_trig', (e) => this.localizeTime(e));
112	            E.B.on('click.evoCard', '.evo_event_more_img', (e) => this.handle_event_more_img(e));
113	            E.B.on('click.evoCard', '.evo_img_triglb', (e) => this.handle_img_triglb(e));
114	            E.B.on('click.evoCard', '.evo_repeat_series_date', (e) => this.handle_repeat_series_date(e));
115	            E.B.on('click.evoCard', '.copy.evo_ss', (e) => this.handle_copy_event_link(e));
116	            E.B.on('click.evoCard', '.evo_locimg_more', (e) => this.handle_locimg_more(e));
117	            E.B.on('click.evoCard', '.evo_gal_icon', (e) => this.handle_gal_icon(e));
118	            E.B.on('click.evoCard', '.evobtn_details_show_more', (e) => this.handle_details_show_more(e));
119	            E.B.on('click.evoCard', '.evcal_close', (e) => this.handle_close_eventcard(e));
120	            E.B.on('click.evoCard', '.evocmd_button', (e) => this.handle_evocmd_button(e));
121	            E.B.on('click.evoCard', '.evo_org_clk_link', (e) => this.handle_org_clk_link(e));
122	            E.B.on('click.evoCard', '.editEventBtnET', (e) => this.handle_edit_event_button(e));
123			},
124
125			// actions
126				// Opens a side panel for event type triggers, adding a class and setting up data
127		        evo_handle_et_sidePanel(e) {
128		            const { E } = this;
129		            const $el = $(e.currentTarget);
130		            e.preventDefault();
131		            $el.addClass('evo_sp_trig_on');
132		            const aData = $el.data('d');
133		            aData.adata.data['nonce'] = evo_general_params.n;
134		            $el.evo_open_sidepanel(aData);
135		        },
136
137		        // Populates the side panel with content from an AJAX response and removes the loading bar
138		        evo_handle_et_sp_content(e, OO, data, el) {
139		            $(el).evo_populate_sidepanel(data.html);
140		            $('#evo_sp').find('.evo_loading_bar_holder').remove();
141		        },
142
143		        // Localizes the time display for elements with the tzo_trig class
144		        localizeTime(e) {
145		            e.preventDefault();
146		            e.stopPropagation();
147		            $(e.target).evo_localize_time();
148		        },
149
150		        // Changes the main event image when a thumbnail is clicked
151		        handle_event_more_img(e) {
152		            const $el = $(e.currentTarget);
153		            const box = $el.closest('.evcal_eventcard');
154		            const gal = $el.closest('.evocard_fti_in');
155
156		            if (box.length === 0) return;
157
158		            $el.siblings('span').removeClass('select');
159		            $el.addClass('select');
160
161		            const mainIMG = box.find('.evocard_main_image');
162		            mainIMG.data({
163		                h: $el.data('h'),
164		                w: $el.data('w'),
165		                f: $el.data('f')
166		            });
167
168		            if (mainIMG.hasClass('def')) {
169		                mainIMG.css('background-image', `url(${$el.data('f')})`);
170		            } else {
171		                mainIMG.html(`<span style="background-image:url(${$el.data('f')})"></span>`);
172		                mainIMG.eventon_process_main_ft_img();
173		            }
174		        },
175
176		        // Opens a lightbox to display a full-size event image when clicked
177		        handle_img_triglb(e) {
178		            const $el = $(e.currentTarget);
179
180		            if ($el.hasClass('inlb')) return;
181
182		            const __ac = parseInt($el.data('w')) >= parseInt($el.data('h')) ? 'iW' : 'iH';
183		            $el.evo_lightbox_open({
184		                uid: 'evocard_ft_img',
185		                lbc: 'evolb_ft_img',
186		                lbac: `within evocard_img ${__ac}`,
187		                content: `<img class='evocard_main_image inlb' src='${$el.data('f')}' data-w='${$el.data('w')}' data-h='${$el.data('h')}' style='max-width:100%; max-height:100%;'/>`,
188		                end: 'client',
189		                lb_padding: '',
190		                d: { event_id: $el.data('event_id'), ri: $el.data('ri') }
191		            });
192		        },
193
194		        // Navigates to a repeat event's date URL based on user interaction type
195		        handle_repeat_series_date(e) {
196		            const $el = $(e.currentTarget);
197		            if (!$el.parent().hasClass('clickable')) return;
198
199		            const ux = $el.data('ux');
200		            const URL = $el.data('l');
201		            if (ux === 'def') window.location = URL;
202		            if (ux === 'defA') window.open(URL, '_blank');
203		        },
204
205		        // Copies an event link to the clipboard and shows a temporary confirmation
206		        handle_copy_event_link(e) {
207		            const $el = $(e.currentTarget);
208		            const ROW = $el.closest('.evcal_evdata_row');
209		            const link = decodeURIComponent($el.data('l'));
210		            navigator.clipboard.writeText(link);
211
212		            const evo_card_socialshare_html = ROW.html();
213		            ROW.html(`<p style='display:flex'><i class='fa fa-check marr10'></i> ${$el.data('t')}</p>`);
214
215		            setTimeout(() => {
216		                ROW.html(evo_card_socialshare_html);
217		            }, 3000);
218		        },
219
220		        // Toggles visibility of additional location images
221		        handle_locimg_more(e) {
222		            e.preventDefault();
223		            e.stopPropagation();
224		            $(e.currentTarget).closest('.evo_metarow_locImg').toggleClass('vis');
225		        },
226
227		        // Updates the gallery main image when a gallery icon is clicked
228		        handle_gal_icon(e) {
229		            e.preventDefault();
230		            e.stopPropagation();
231
232		            const $el = $(e.currentTarget);
233		            if ($el.hasClass('on')) return;
234		            $el.siblings('div').removeClass('on');
235		            $el.addClass('on');
236
237		            $el.closest('.evo_gal_box').find('.evo_gal_main_img')
238		                .css('background-image', `url(${$el.data('u')})`)
239		                .data('f', $el.data('u'))
240		                .data('h', $el.data('h'))
241		                .data('w', $el.data('w'));
242		        },
243
244		        // Toggles the display of additional event details
245		        handle_details_show_more(e) {
246		            e.preventDefault();
247		            this.control_more_less($(e.currentTarget));
248		        },
249
250		        // Closes the event card by sliding it up
251		        handle_close_eventcard(e) {
252		            e.preventDefault();
253		            $(e.currentTarget).closest('.evcal_eventcard').slideUp().removeClass('open');
254		        },
255
256		        // Redirects to a URL when an event command button is clicked
257		        handle_evocmd_button(e) {
258		            e.preventDefault();
259		            e.stopPropagation();
260
261		            const $el = $(e.currentTarget);
262		            const href = $el.data('href');
263		            if ($el.data('target') === 'yes') {
264		                window.open(href, '_blank');
265		            } else {
266		                window.location = href;
267		            }
268		        },
269
270		        // Opens an organizer's link in a new tab
271		        handle_org_clk_link(e) {
272		            window.open($(e.currentTarget).data('link'), '_blank');
273		        },
274
275		        // Redirects to the event edit page
276		        handle_edit_event_button(e) {
277		            e.stopPropagation();
278		            const href = $(e.currentTarget).attr('href');
279		            window.open(href);
280		        },
281
282		        // Controls the more/less toggle for event details display
283		        control_more_less(obj) {
284		            const content = obj.attr('content');
285		            const current_text = obj.find('.ev_more_text').html();
286		            const changeTo_text = obj.find('.ev_more_text').attr('data-txt');
287		            const cell = obj.closest('.evcal_evdata_cell');
288
289		            if (content === 'less') {
290		                cell.removeClass('shorter_desc');
291		                obj.attr('content', 'more');
292		                obj.find('.ev_more_arrow').removeClass('ard');
293		                obj.find('.ev_more_text').attr('data-txt', current_text).html(changeTo_text);
294		            } else {
295		                cell.addClass('shorter_desc');
296		                obj.attr('content', 'less');
297		                obj.find('.ev_more_arrow').addClass('ard');
298		                obj.find('.ev_more_text').attr('data-txt', current_text).html(changeTo_text);
299		            }
300		        }
301		};
302
303		EVO_Card_Listeners.init();		
304
305	}
306	var evo_cal_eventcard_interactions = function( EC , load_maps ){
307
308		// process featured image sizes
309		EC.find(".evocard_main_image").eventon_process_main_ft_img(  );		
310
311		// process content sliders
312		EC.find('.evo_elm_HCS').each(function(){
313			$(this).evoContentSlider();
314		});	
315
316		// countdown
317		EC.find('.evo_countdowner').each(function(){
318			var obj = $(this);
319			obj.removeClass('evo_cd_on');
320			obj.evo_countdown();
321		});
322		
323		$(window).on('resize',function(){
324			BODY.find(".evocard_main_image").each(function(){
325				$(this).eventon_process_main_ft_img();		
326			});
327			//EC.find(".evocard_main_image").eventon_process_main_ft_img();		
328		});
329	}
330	$.fn._evo_cal_eventcard_interactions = function( EC, load_maps){
331		evo_cal_eventcard_interactions( EC , load_maps);
332	}
333
334	// run all map waiting map @4.6.1
335	function _evo_run_eventcard_map_load(){
336		BODY.evo_run_eventcard_map_load();
337	}
338	$.fn.evo_run_eventcard_map_load = function(){
339
340		time = 600;
341
342		BODY.find('.evo_metarow_gmap').each(function(index){	
343			O = $(this);
344			if( !(O.is(":visible")) ) return;
345			O.evo_load_gmap({
346				map_canvas_id: O.attr('id'),
347				trigger_point:'evo_calendar',
348				delay: time
349			});
350			time += 600;
351		});			
352	}
353
354// EventTop Interactions v4.6
355	var evo_cal_eventtop_interactions = function( ET ){	}
356	
357// RUN on Page load
358	EVO_Global_Init();
359
360	function EVO_Global_Init(){
361
362		EVO_Interactions();
363
364		evo_eventcard_listeners();
365
366		// check if calendars are present in the page
367			var run_initload = false;
368
369			if( $('body').find('.ajde_evcal_calendar').length > 0 ) run_initload = true;
370			if( $('body').find('.ajax_loading_cal').length > 0 ) run_initload = true;
371			if( $('body').find('.eventon_single_event').length > 0 ) run_initload = true;
372
373			if(run_initload == false) return false;
374
375			var data_arg = {};	
376
377			BODY.trigger('evo_global_page_run');
378
379			data_arg['global'] = $('#evo_global_data').data('d');
380			data_arg['cals'] ={};	
381			data_arg['nonce'] = evo_general_params.n;				
382
383		// run through all the calendars on page
384			BODY.find('.ajde_evcal_calendar').each(function(){
385				const CAL = $(this);
386				var SC = CAL.evo_shortcode_data();
387
388				CAL.evo_pre_cal();
389
390				if( CAL.hasClass('ajax_loading_cal')){
391					data_arg['cals'][ CAL.attr('id')] = {};
392					data_arg['cals'][ CAL.attr('id')]['sc'] = SC;
393
394					BODY.trigger('evo_global_page_run_after', CAL , SC );// @4.6.1
395				}
396			});
397
398		BODY.evo_admin_get_ajax({
399			adata:{
400				data:data_arg,
401				a:'eventon_init_load',ajax_type:'endpoint',end:'client'
402			},
403			onSuccess:function( OO, data, LB){
404				$('#evo_global_data').data('d', data);
405
406				BUS = data;
407
408				// append html to calendars if present
409				if('cals' in data){
410					var time = 300;
411					$.each(data.cals, function(i,v){
412
413						setTimeout( function(){
414
415							CAL = BODY.find('#'+ i);
416							if(CAL.length === 0) return;
417							
418							if('html' in v){						
419								CAL.find('#evcal_list').html( v.html );
420								CAL.removeClass('ajax_loading_cal');
421								CAL.find('.evo_ajax_load_events').remove();
422							}	
423
424							// load SC and JSON to calendar
425							CAL.evo_cal_functions({action:'update_shortcodes',SC: v.sc});
426							CAL.evo_cal_functions({action:'update_json',json: v.json});
427							
428							$('body').trigger('evo_init_ajax_success_each_cal', [data, i, v, CAL]);
429
430						}, time);
431						time += 300;
432					});
433				}
434
435				$('body').trigger('evo_init_ajax_success', [data]);
436
437				// after timeout based cal loading, process all cals
438				setTimeout( function(){
439					BODY.find('.ajde_evcal_calendar').each(function(){
440						if( $(this).hasClass('.ajax_loading_cal') ) return;					
441						$(this).evo_calendar({'type':'complete'});
442					});
443				}, time );
444			},
445			onComplete:function( OO, data){
446				$('body').trigger('evo_init_ajax_completed', [data]);
447			}
448		});	
449
450		handlebar_additional_arguments();
451		
452		evo_cal_body_listeners();
453
454		// run basic countdown timers
455		BODY.find('.evo_countdowner').each(function(){
456			$(this).evo_countdown();
457		});
458	}
459
460
461
462// ELEMENTS u4.9
463	// tooltips
464		$('body').on('mouseover','.ajdeToolTip, .evotooltip, .evotooltipfree',function(event){
465			event.stopPropagation();
466			
467			const el = $(this);
468			if(el.hasClass('show')) return;
469
470			var free = el.hasClass('free') || el.hasClass('evotooltipfree');
471			var content =  el.data('d') || el.attr('title') || '';
472			if (!content) return;
473
474			var p = el.position();			
475			var cor = getCoords(event.target);
476
477			$('.evo_tooltip_box').removeClass('show').removeClass('L').html( content );
478			var box_height = $('.evo_tooltip_box').height();
479			var box_width = $('.evo_tooltip_box').width();
480			var top = cor.top - 55 - box_height + (free ? 20 : 0);
481
482			$('.evo_tooltip_box').css({'top': top, 'left': ( cor.left + 5 ) })
483				.addClass('show');
484
485			// left align
486			if( $(this).hasClass('L')){
487				$('.evo_tooltip_box').css({'left': (cor.left - box_width - 15) }).addClass('L');			
488			}
489		})
490		.on('mouseout','.ajdeToolTip, .evotooltip, .evotooltipfree',function(e){	
491			event.stopPropagation();
492			var relatedTarget = $(event.relatedTarget);
493			var target = $(this);
494
495			$('.evo_tooltip_box').removeClass('show');
496		});
497
498		function getCoords(elem) { // crossbrowser version
499		    var box = elem.getBoundingClientRect();
500		    //console.log(box);
501
502		    var body = document.body;
503		    var docEl = document.documentElement;
504
505		    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
506		    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
507
508		    var clientTop = docEl.clientTop || body.clientTop || 0;
509		    var clientLeft = docEl.clientLeft || body.clientLeft || 0;
510
511		    var top  = box.top +  scrollTop - clientTop;
512		    var left = box.left + scrollLeft - clientLeft;
513
514		    return { top: Math.round(top), left: Math.round(left) };
515		}
516	// yes no button		
517		$('body').on('click','.ajde_yn_btn ', function(event){
518
519			// stop this code from working on wp-admin
520			if($('body').hasClass('wp-admin')) return false; 
521			
522			var obj = $(this);
523			var afterstatement = obj.attr('afterstatement');
524				afterstatement = (afterstatement === undefined)? obj.attr('data-afterstatement'): afterstatement;	
525			var uid = '';
526
527			// yes
528			if(obj.hasClass('NO')){					
529				obj.removeClass('NO');
530				obj.siblings('input').val('yes');
531
532				// afterstatment
533				if(afterstatement!=''){
534					var type = (obj.attr('as_type')=='class')? '.':'#';
535					if( obj.data('uid') !== undefined) uid = obj.data('uid');
536					$(type+ afterstatement).slideDown('fast');						
537				}
538
539			}else{//no
540				obj.addClass('NO');
541				obj.siblings('input').val('no');
542				
543				if(afterstatement!=''){
544					var type = (obj.attr('as_type')=='class')? '.':'#';
545					$(type+ afterstatement ).slideUp('fast');
546				}
547			}
548		});
549
550	// content slider v4.9.13
551		// jQuery plugin for content slider
552	    $.fn.evoContentSlider = function() {
553	        return this.each(function() {
554	            const $slider = $(this);
555	            const $inner = $slider.find('.evo_elm_HCS_in');
556	            const scrollAmount = 10; // Wheel scroll speed
557	            let scrollTimeout;
558
559	            // Initial button visibility
560	            updateButtonVisibility($slider);
561
562	            $slider.data('evo-slider-initialized', true);
563
564	            // Button click handler
565	            $slider.on('click', '.evo_elmHCS_nav.content_slide_trig', function() {
566	                const $button = $(this);
567	                const scrollDistance = parseInt($slider.width()) / 2;
568	                const currentScroll = $inner.scrollLeft();
569	                let newScroll;
570
571	                if ($button.hasClass('HCSnavR')) {
572	                    newScroll = currentScroll + scrollDistance;
573	                    $slider.find('.HCSnavL')[0].classList.add('vis');
574	                } else {
575	                    newScroll = Math.max(0, currentScroll - scrollDistance);
576	                }
577
578	                $inner.animate({ scrollLeft: newScroll }, 200, () => {
579	                    updateButtonVisibility($slider);
580	                });
581	            });
582
583	            // Wheel scrolling
584	            $inner[0].addEventListener('wheel', function(e) {
585	                e.preventDefault();
586	                const delta = e.deltaY;
587	                const scrollableLength = this.scrollWidth - parseInt($slider.width());
588	                const newScroll = Math.max(0, Math.min($inner.scrollLeft() + (delta > 0 ? scrollAmount : -scrollAmount), scrollableLength));
589	                $inner.scrollLeft(newScroll);
590	                updateButtonVisibility($slider);
591	            }, { passive: false });
592
593	            // Touch scrolling
594	            $inner[0].addEventListener('scroll', function() {
595	                clearTimeout(scrollTimeout);
596	                scrollTimeout = setTimeout(() => {
597	                    updateButtonVisibility($slider);
598	                }, 100);
599	            });
600	        });
601	    };
602
603	    // Add reload method
604	    $('body').on('evo_reload_slider', function(event, $slider){
605	    	updateButtonVisibility($slider);
606	    });
607		
608
609	    // Update button visibility
610	    function updateButtonVisibility($slider) {
611	    	const $inner = $slider.find('.evo_elm_HCS_in');
612	        const scrollableLength = $inner[0].scrollWidth - parseInt($slider.width());
613	        const currentScroll = $inner.scrollLeft();
614	        const leftButton = $slider.find('.HCSnavL')[0];
615	        const rightButton = $slider.find('.HCSnavR')[0];
616
617	        if (scrollableLength <= 0) {
618	            leftButton.classList.remove('vis');
619	            rightButton.classList.remove('vis');
620	            return;
621	        }
622
623	        leftButton.classList.toggle('vis', currentScroll >= 10);
624	        rightButton.classList.toggle('vis', currentScroll < scrollableLength - 5);
625	    }
626
627	    // Debounced resize handler
628	    let resizeTimeout;
629	    $(window).on('resize', function() {
630	        clearTimeout(resizeTimeout);
631	        resizeTimeout = setTimeout(() => {
632	            $('.evo_elm_HCS').each(function() {
633	                updateButtonVisibility($(this), $(this).find('.evo_elm_HCS_in'));
634	            });
635	        }, 100);
636	    });
637
638	    BODY.find('.evo_elm_HCS').each( function(event){
639			$(this).evoContentSlider();
640		});
641
642	// dynamic select @4.8.2
643		BODY.on('click', '.evo_elm_dynamic_select_trig',function(e){
644			e.preventDefault();
645			const btn = $(this);
646		    const row = btn.closest('.evo_elm_dynamic_select');
647		    const list = btn.find('.evoelm_ds_list');
648
649		    row.toggleClass('open');
650		    btn.toggleClass('open');
651
652			if (btn.hasClass('open')) {
653		        const options = btn.siblings('div').data('d');
654		        let html = `<div class="evoelm_ds_list evobr10 evodfx evofx_dr_c evobgcw evofz14 evoff_2 evo_ofh evoposa evoleft0 " role="listbox" aria-labelledby="selected-option">`;
655
656		        $.each(options, (index, value) => {
657		            html += `<span class="evoelm_ds_list_item evopad10 evocurp evoborderb" role="option" tabindex="-1" data-index="${index}">${value}</span>`;
658		        });
659
660		        html += '</div>';
661		        btn.append(html);
662		    } else {
663		        list.remove();
664		    }
665		});
666
667		$(document).click(function(event){
668			if( !$(event.target).closest('.evo_elm_dynamic_select').length){
669				const openBox = BODY.find('.evo_elm_dynamic_select.open');
670		        openBox.removeClass('open').find('button').removeClass('open');
671		        openBox.find('.evoelm_ds_list').remove();
672			}	
673		});
674
675		// item clicked from the list
676		BODY.on('click','.evoelm_ds_list_item',function(event){
677			const item = $(this);
678		    const box = item.closest('.evo_elm_dynamic_select');
679		    const value = item.data('index');
680
681		    // update focus item name
682		    box.find('.evoelm_ds_current').html( item.html() );
683
684		    // set new value to input
685		    box.find('input').val( value );
686
687		    // plug for others
688			BODY.trigger('evoelm_dynamic_select_clicked', [ item, value, box ]);
689
690			box.removeClass('open');
691            box.find('button').removeClass('open');
692            item.parent().remove();
693
694		});
695
696
697	// Image Select @added 4.9 @updated: 4.9.12		
698		var file_frame;	
699		var __img_index;
700		var __img_obj;
701		var __img_box;
702		var __img_type;
703	  
704	    BODY.on('click','.evolm_img_select_trig',function(event) {
705	    	event.preventDefault();
706	    	console.log('ef');
707
708	    	__img_obj = $(this);
709	    	__img_box = __img_obj.closest('.evo_metafield_image');
710	    	__img_type = __img_box.hasClass('multi')? 'multi': 'single';
711
712	    	if( __img_type == 'single' &&  __img_box.hasClass('has_img') ) return;
713	    	if( __img_type == 'multi'){
714	    		__img_index = __img_obj.data('index');
715
716	    		// remove image
717				if( __img_obj.hasClass('on')){
718					__img_obj.css('background-image', '').removeClass('on');
719					__img_obj.find('input').val( '' );
720					return;
721				}
722	    	}
723
724	    	// Reset file_frame to avoid stale state
725	        if (file_frame) {     file_frame.close(); file_frame = null;   }
726
727			// Get user_id (0 for non-logged-in users)
728	        var user_id = __img_obj.data('userid') ? parseInt(__img_obj.data('userid')) : 0;
729	        var library_args = { type: 'image' };
730	        if (user_id > 0) { library_args.author = user_id; }
731
732			// Create the media frame
733			file_frame = wp.media.frames.downloadable_file = wp.media({
734				title: 'Choose an Image', 
735				button: {text: 'Use Image'},	
736				multiple: false,
737				library: library_args,
738			});
739
740
741			// When an image is selected, run a callback.
742			file_frame.on( 'select', function() {
743				var selection = file_frame.state().get('selection');
744        		//console.log('Selection:', selection.toJSON());
745
746        		if (selection.length > 0) {
747	                var attachment = selection.first().toJSON();
748	                //console.log('Selected attachment:', attachment);
749
750	                if (__img_type == 'single') {
751	                    __img_box.addClass('has_img');
752	                    __img_box.find('input.evo_meta_img').val(attachment.id);
753	                    __img_box.find('.evoelm_img_holder').css('background-image', 'url(' + attachment.url + ')');
754	                    //console.log('Single image updated:', __img_box.find('.evoelm_img_holder').css('background-image'));
755	                } else {
756	                    __img_obj.css('background-image', 'url(' + attachment.url + ')').addClass('on');
757	                    __img_obj.find('input').val(attachment.id);
758	                    //console.log('Multi image updated:', __img_obj.css('background-image'));
759	                }
760	            } else {
761	                console.log('No image selected');
762	            }
763
764			});
765
766			// Handle errors
767	        file_frame.on('error', function(error) {
768	            console.error('Media Uploader Error:', error); alert('Error: ' + error.message);
769	        });
770
771			// Finally, open the modal.
772			file_frame.open();
773			
774	    });  
775		// remove image
776		BODY.on('click','.evoel_img_remove_trig',function(){
777
778			const field = $(this).closest('.evo_metafield_image');
779
780			if( !(field.hasClass('has_img') ) ) return;
781			
782			field.removeClass('has_img');
783			field.find('input').val('');
784			field.find('button').addClass('chooseimg');
785			field.find('.evoelm_img_holder').css('background-image', '' );
786		});
787
788	// plus minus changer @updated 4.9
789		$('body').on('click','.evo_plusminus_change', function(event){
790
791			// only run on frontend
792			if( evo_general_params.cal.is_admin ) return;
793
794	        OBJ = $(this);
795
796	        QTY = parseInt(OBJ.siblings('input').val());
797	        MAX = OBJ.siblings('input').data('max');        
798	        if(!MAX) MAX = OBJ.siblings('input').attr('max');           
799
800	        NEWQTY = (OBJ.hasClass('plu'))?  QTY+1: QTY-1;
801
802	        NEWQTY =(NEWQTY <= 0)? 0: NEWQTY;
803
804	        // can not go below 1
805	        if( NEWQTY == 0 && OBJ.hasClass('min') ){    return;    }
806
807	        NEWQTY = (MAX!='' && NEWQTY > MAX)? MAX: NEWQTY;
808	        if( isNaN( NEWQTY ) ) NEWQTY = 0;
809
810	        OBJ.siblings('input').val(NEWQTY).attr('value',NEWQTY);
811
812	        if( QTY != NEWQTY) $('body').trigger('evo_plusminus_changed',[NEWQTY, MAX, OBJ]);
813	       
814	        if(NEWQTY == MAX){
815	            PLU = OBJ.parent().find('b.plu');
816	            if(!PLU.hasClass('reached')) PLU.addClass('reached');   
817
818	            if(QTY == MAX)   $('body').trigger('evo_plusminus_max_reached',[NEWQTY, MAX, OBJ]);                 
819	        }else{            
820	            OBJ.parent().find('b.plu').removeClass('reached');
821	        } 
822	    });
823
824// CAL BODY Listeners
825	function evo_cal_body_listeners(){
826		BODY.evo_cal_lb_listeners();
827
828		const EVO_Listeners = {
829			E: {	
830				B: $('body')	
831			},
832			init(){
833				const { B } = this.E;
834
835				// FAQ toggle
836            	B.on('click.evoCal', '.evo_faq_toggle', (e) => this.handle_faq_toggle(e));
837				
838				// General AJAX trigger
839            	B.on('click.evoCal', '.evo_trig_ajax', (e) => this.handle_general_ajax(e));
840
841	            // Event anywhere lightbox trigger
842	            B.on('click.evoCal', '.eventon_anywhere.evoajax', (e) => this.handle_event_anywhere(e));
843
844	            // No events button click
845	            B.on('click.evoCal', '.evo_no_events_btn', (e) => this.handle_no_events_btn(e));
846
847	            // Month switch arrows
848	            B.on('click.evoCal', '.evcal_arrows', (e) => this.handle_month_switch(e));
849
850	            // Show more events
851	            B.on('click.evoCal', '.evoShow_more_events', (e) => this.handle_show_more_events(e));
852
853	            // Refresh event top (placeholder)
854	            B.on('runajax_refresh_eventtop.evoCal', (e, OBJ, nonce) => this.handle_refresh_eventtop(e, OBJ, nonce));
855
856	            // Event card slide down complete
857	            B.on('evo_slidedown_eventcard_complete.evoCal', (e, event_id, obj, is_slide_down) => this.handle_slidedown_complete(e, event_id, obj, is_slide_down));
858
859	            // Jumper month/year switch
860	            B.on('calendar_month_changed.evoCal', (e, CAL) => this.handle_calendar_month_changed(e, CAL));
861
862	            // Go to today button
863	            B.on('click.evoCal', '.evo-gototoday-btn', (e) => this.handle_gototoday_btn(e));
864
865	            // Refresh now calendar
866	            B.on('runajax_refresh_now_cal.evoCal', (e, OBJ, nonce) => this.handle_refresh_now_cal(e, OBJ, nonce));
867
868	            // Calendar header buttons
869	            this.handle_cal_head_interactions();	            
870	            B.on('show_cal_head_btn.evoCal', (e, obj) => this.handle_show_cal_head_btn(e, obj));
871	            B.on('hide_cal_head_btn.evoCal', (e, obj) => this.handle_hide_cal_head_btn(e, obj));
872
873	            // Tile box style 3 click
874	            B.on('click.evoCal', '.ajde_evcal_calendar.boxstyle3 .eventon_list_event', (e) => this.handle_tile_box_click(e));
875
876	            // Event card opening
877	           	B.on('click.evoCal', '.eventon_list_event .desc_trig', (e) => this.handle_desc_trig(e));
878	           		            
879			},
880			// Toggles FAQ answer visibility and updates icon
881	        handle_faq_toggle(e) {
882	            const toggle = $(e.currentTarget);
883	            const answer = toggle.next('.evo_faq_answer');
884	            const icon = toggle.find('i.fa');
885	            answer.toggle();
886	            icon.toggleClass('fa-plus fa-minus');
887	        },
888	        // Triggers general AJAX request with data from the clicked element
889	        handle_general_ajax(e) {
890	            const obj = $(e.target);
891	            let ajax_data = obj.data();
892	            $(document).data('evo_data', ajax_data);
893	            this.E.B.trigger('evo_before_trig_ajax', [obj]);
894	            const new_ajax_data = $(document).data('evo_data');
895	            new_ajax_data['nn'] = the_ajax_script.postnonce;
896	            $.ajax({
897	                beforeSend: () => {
898	                    this.E.B.trigger('evo_beforesend_trig_ajax', [obj, new_ajax_data]);
899	                },
900	                type: 'POST',
901	                url: get_ajax_url('eventon_gen_trig_ajax'),
902	                data: new_ajax_data,
903	                dataType: 'json',
904	                success: (return_data) => {
905	                    this.E.B.trigger('evo_success_trig_ajax', [obj, new_ajax_data, return_data]);
906	                },
907	                complete: () => {
908	                    this.E.B.trigger('evo_complete_trig_ajax', [obj, new_ajax_data]);
909	                }
910	            });
911	        },
912	        // Triggers lightbox for event anywhere links
913	        handle_event_anywhere(e) {
914	            e.preventDefault();
915	            const obj = $(e.currentTarget);
916	            const data = obj.data('sc');
917	            if (data.ev_uxval == '4') return;
918	            data['evortl'] = 'no';
919	            if ('id' in data) data['event_id'] = data.id;
920	            data['ux_val'] = '3a';
921	            data['ajax_eventtop_show_content'] = false;
922	            obj.evo_cal_lightbox_trigger(data, obj, false);
923	        },
924
925	        // Handles click on no events button
926	        handle_no_events_btn(e) {
927	            this.E.B.trigger('click_on_no_event_btn', [$(e.currentTarget)]);
928	        },
929
930	        // Switches calendar month on arrow click
931	        handle_month_switch(e) {
932	            e.preventDefault();
933	            const CAL = $(e.currentTarget).closest('.ajde_evcal_calendar');
934	            let dir = $(e.currentTarget).hasClass('evcal_btn_prev') ? 'prev' : 'next';
935	            const cal_id = CAL.attr('id');
936	            if (CAL.hasClass('evortl')) {
937	                dir = dir == 'next' ? 'prev' : 'next';
938	            }
939	            if ($(e.currentTarget).closest('.evo_footer_nav').length > 0) {
940	                const BOX = $(e.currentTarget).closest('.evo_footer_nav');
941	                const offset = BOX.offset();
942	                const scrolltop = $(window).scrollTop();
943	                const viewport_top = offset.top - scrolltop;
944	                CAL.addClass('nav_from_foot').data('viewport_top', viewport_top);
945	            }
946	            run_cal_ajax(cal_id, dir, 'switchmonth');
947	        },
948
949	        // Shows more events in the calendar list
950	        handle_show_more_events(e) {
951	            const CAL = $(e.currentTarget).closest('.ajde_evcal_calendar');
952	            const SC = CAL.evo_shortcode_data();
953	            const OBJ = $(e.currentTarget);
954	            if (SC.show_limit_redir !== '') {
955	                window.location = SC.show_limit_redir;
956	                return false;
957	            }
958	            if (SC.show_limit_ajax == 'yes') {
959	                const CURRENT_PAGED = parseInt(SC.show_limit_paged);
960	                CAL.evo_update_cal_sc({ F: 'show_limit_paged', V: CURRENT_PAGED + 1 });
961	                run_cal_ajax(CAL.attr('id'), 'none', 'paged');
962	            } else {
963	                const event_count = parseInt(SC.event_count);
964	                const eventList = OBJ.parent();
965	                const allEvents = eventList.find('.eventon_list_event').length;
966	                const currentShowing = eventList.find('.eventon_list_event:visible').length;
967	                for (let x = 1; x <= event_count; x++) {
968	                    const inde = currentShowing + x - 1;
969	                    eventList.find(`.eventon_list_event:eq(${inde})`).slideDown();
970	                }
971	                if (allEvents >
971= currentShowing && allEvents <= (currentShowing + event_count)) {
972	                    OBJ.fadeOut();
973	                }
974	            }
975	        },
976
977	        // Placeholder for refreshing event top
978	        handle_refresh_eventtop(e, OBJ, nonce) {},
979
980	        // Processes event card interactions after slide down
981	        handle_slidedown_complete(e, event_id, obj, is_slide_down) {
982	            if (!is_slide_down) return;
983	            setTimeout(() => {
984	                const OO = obj.closest('.eventon_list_event');
985	                evo_cal_eventcard_interactions(OO, true);
986	            }, 300);
987	        },
988
989	        // Updates jumper UI when calendar month changes
990	        handle_calendar_month_changed(e, CAL) {
991	            const SC = CAL.evo_shortcode_data();
992	            const B = CAL.find('.evo-gototoday-btn');
993	            const O = CAL.find('.evo_j_container');
994	            O.find('.evo_j_months a').removeClass('set');
995	            O.find(`.evo_j_months a[data-val="${SC.fixed_month}"]`).addClass('set');
996	            O.find('.evo_j_years a').removeClass('set');
997	            O.find(`.evo_j_years a[data-val="${SC.fixed_year}"]`).addClass('set');
998	            if (SC.fixed_month != B.data('mo') || SC.fixed_year != B.data('yr')) {
999	                this.E.B.trigger('show_cal_head_btn', [B]);
1000	            } else {
1001	                this.E.B.trigger('hide_cal_head_btn', [B]);
1002	            }
1003	        },
1004
1005	        // Navigates to today’s date on calendar
1006	        handle_gototoday_btn(e) {
1007	            const obj = $(e.currentTarget);
1008	            const CAL = obj.closest('.ajde_evcal_calendar');
1009	            const calid = CAL.attr('id');
1010	            CAL.evo_update_cal_sc({ F: 'fixed_month', V: obj.data('mo') });
1011	            CAL.evo_update_cal_sc({ F: 'fixed_year', V: obj.data('yr') });
1012	            run_cal_ajax(calid, 'none', 'today');
1013	            this.E.B.trigger('hide_cal_head_btn', [obj]);
1014	        },
1015
1016	        // Refreshes now calendar via AJAX
1017	        handle_refresh_now_cal(e, OBJ, nonce) {
1018	            const section = OBJ.closest('.evo_eventon_live_now_section');
1019	            const CAL = section.find('.ajde_evcal_calendar').eq(0);
1020	            const dataA = {
1021	                nonce: evo_general_params.n,
1022	                other: OBJ.data(),
1023	                SC: CAL.evo_shortcode_data()
1024	            };
1025	            $.ajax({
1026	                beforeSend: () => {
1027	                    section.addClass('evoloading');
1028	                },
1029	                type: 'POST',
1030	                url: get_ajax_url('eventon_refresh_now_cal'),
1031	                data: dataA,
1032	                dataType: 'json',
1033	                success: (data) => {
1034	                    if (data.status == 'good') {
1035	                        section.html(data.html);
1036	                        this.E.B.trigger('evo_refresh_designated_elm', [OBJ, 'evo_vir_data']);
1037	                    }
1038	                },
1039	                complete: () => {
1040	                    section.removeClass('evoloading');
1041	                    this.E.B.find('.evo_countdowner').each(function() {
1042	                        $(this).evo_countdown();
1043	                    });
1044	                }
1045	            });
1046	        },
1047
1048	        // Toggles visibility of calendar header buttons
1049	        handle_cal_head_interactions() {
1050	        	const { B } = this.E;
1051	        	B.on('click.evoCal', '.cal_head_btn', (e) => {
1052	        		const obj = $(e.currentTarget);
1053		            if (obj.hasClass('vis')) {
1054		                this.E.B.trigger('hide_cal_head_btn', [obj]);
1055		            } else {
1056		                this.E.B.trigger('show_cal_head_btn', [obj]);
1057		            }
1058	        	});
1059	        	// when a header button is clicked
1060				B.on('evo_cal_header_btn_clicked',function(event, O, CAL){
1061
1062					var SC = CAL.evo_shortcode_data();	
1063
1064					// if search is open on init > return
1065					if( evo_general_params.cal.search_openoninit ) return;
1066
1067					if( O.hasClass('evo-search')){
1068						if( O.hasClass('vis')){
1069							CAL.find('.evo_search_bar').show(1, function(){
1070								$(this).find('input').focus();
1071							});
1072						}else{
1073							CAL.find('.evo_search_bar').hide();
1074						}
1075					}
1076
1077					// hide the search
1078					if( O.hasClass('evo-sort-btn') || O.hasClass('evo-filter-btn')){
1079						CAL.find('.evo_search_bar').hide();
1080					}
1081				});
1082	            
1083	        },
1084
1085	        // Shows calendar header button
1086	        handle_show_cal_head_btn(e, obj) {
1087	            if (!obj.hasClass('evo-gototoday-btn')) {
1088	                obj.siblings(':not(.evo-gototoday-btn)').removeClass('show vis');
1089	            }
1090	            obj.addClass('show vis');
1091	            const CAL = obj.closest('.ajde_evcal_calendar');
1092	            this.E.B.trigger('evo_cal_header_btn_clicked', [obj, CAL, 'show']);
1093	        },
1094
1095	        // Hides calendar header button
1096	        handle_hide_cal_head_btn(e, obj) {
1097	            const CAL = obj.closest('.ajde_evcal_calendar');
1098	            obj.removeClass('show vis');
1099	            this.E.B.trigger('evo_cal_header_btn_clicked', [obj, CAL, 'hide']);
1100	        },
1101
1102	        // Triggers desc_trig click for tile box style 3
1103	        handle_tile_box_click(e) {
1104	            e.preventDefault();
1105	            e.stopPropagation();
1106	            $(e.currentTarget).find('.desc_trig').trigger('click');
1107	        },
1108
1109	        // Handles event card opening with various user interactions
1110	        handle_desc_trig(e) {
1111	        	e.preventDefault();
1112	            const $this = $(e.currentTarget);
1113	            const $eventBox = $this.closest('.eventon_list_event');
1114	            const $cal = $this.closest('.evo_lightbox').data('cal_id') ?
1115	                $('#' + $this.closest('.evo_lightbox').data('cal_id')) :
1116	                $this.closest('.ajde_evcal_calendar');
1117	            const SC = $cal.evo_shortcode_data();
1118	            const ux_val = $cal.evo_cal_event_get_uxval(SC, $this);
1119	            const event_id = $eventBox.data('event_id');
1120	            const exlk = $this.data('exlk');
1121	            const isSingleEventBox = $this.closest('.eventon_single_event').length > 0 && $cal.find('.evo-data').data('exturl');
1122
1123	            const actions = {
1124	                '3': () => this.open_lightbox($this, $cal, SC, event_id, $eventBox, ux_val),
1125	                '3a': () => this.open_lightbox($this, $cal, SC, event_id, $eventBox, ux_val),
1126	                '4': () => this.open_url($this, $this.attr('href') || $this.parent().siblings('.evo_event_schema').find('a').attr('href'), '_self'),
1127	                '4a': () => this.open_url($this, $this.attr('href') || $this.parent().siblings('.evo_event_schema').find('a').attr('href'), '_blank'),
1128	                '2': () => this.handle_external_link($this, isSingleEventBox),
1129	                'X': () => false,
1130	                'none': () => false,
1131	                'default': () => exlk === '1' ? this.handle_external_link($this, isSingleEventBox) : this.slide_down_event_card($this, $eventBox, $cal, SC, event_id)
1132	            };
1133
1134	            return (actions[ux_val] || actions['default'])();
1135	        },
1136
1137	        // Opens lightbox for event content
1138	        open_lightbox($trigger, $cal, SC, event_id, $eventBox, ux_val) {
1139	            const repeat_interval = parseInt($eventBox.data('ri')) || 0;
1140	            const etttc_class = $cal.attr('class').split(' ').find(cls => cls.startsWith('etttc_')) || '';
1141	            const new_SC_data = {
1142	                ...SC,
1143	                repeat_interval,
1144	                event_id,
1145	                ux_val,
1146	                evortl: $trigger.closest('.eventon_events_list').hasClass('evortl') ? 'yes' : 'no',
1147	                ajax_eventtop_show_content: true,
1148	                additional_class: etttc_class
1149	            };
1150	            $cal.evo_cal_lightbox_trigger(new_SC_data, $trigger, $cal);
1151	            return false;
1152	        },
1153
1154	        // Opens a URL in specified target
1155	        open_url($this, url, target) {
1156	        	target = $this.attr('target') === '_blank' ? '_blank' : target;
1157			    if (url) window.open(url, target);
1158			    return target === '_blank';
1159	        },
1160
1161	        // Handles external link navigation
1162	        handle_external_link($trigger, isSingleEventBox) {
1163	            if (isSingleEventBox) return false;
1164	            const url = $trigger.attr('href');
1165	            if (url) {
1166	                window.open(url, $trigger.attr('target') === '_blank' ? '_blank' : '_self');
1167	            }
1168	            return !!url;
1169	        },
1170
1171	        // Slides down event card and loads map if present
1172	        slide_down_event_card($trigger, $eventBox, $cal, SC, event_id) {
1173	            const $content = $eventBox.find('.event_description');
1174	            const isOpen = $content.hasClass('open');
1175	            if (SC.accord === 'yes') {
1176	                $cal.find('.eventon_list_event').removeClass('open');
1177	                $cal.find('.event_description').slideUp().removeClass('open');
1178	            }
1179	            $eventBox.toggleClass('open', !isOpen);
1180	            $content[isOpen ? 'slideUp' : 'slideDown']().toggleClass('open', !isOpen);
1181	            if ($eventBox.find('.evo_metarow_gmap').length) {
1182	                $eventBox.find('.evo_metarow_gmap').evo_load_gmap({ trigger_point: 'slideDownCard' });
1183	            }
1184	            if ($trigger.data('runjs')) {
1185	                this.E.B.trigger('evo_load_single_event_content', [event_id, $trigger]);
1186	            }
1187	            this.E.B.trigger('evo_slidedown_eventcard_complete', [event_id, $trigger, !isOpen]);
1188	            return false;
1189	        }
1190		}
1191
1192		EVO_Listeners.init();		
1193	}
1194
1195// Global Calendar Listeners and Interactions
1196	function EVO_Interactions(){
1197		const interactions_class = {
1198			E:{ B: $('body')},
1199			run(){
1200				const { B } = this.E;
1201				this.evoLightboxEnd();
1202				this.evocardNavTrig();
1203				this.evoMapExpandTrig();
1204				this.handle_lightbox_processed();
1205				this.handle_calendar_interactions();
1206				this.handle_global_listners();
1207				this.handle_tabs();
1208			},
1209
1210			evoLightboxEnd() {
1211		        this.E.B.on('evolightbox_end', (event, LB, CAL) => {
1212		            setTimeout(() => {
1213		                LB.find('.eventon_list_event').each(function() {
1214		                    evo_cal_eventcard_interactions($(this), true);
1215		                });
1216		                _evo_run_eventcard_map_load();
1217		                LB.evo_cal_localize_time();
1218		            }, 1000);
1219		        });
1220
1221		        // eventcard lightbox event navigation @version 4.9.2
1222		        this.E.B.on('evolightbox_end', (e, LB, CAL, OO) => {
1223		            if (!evo_general_params.cal.lbnav) return;
1224		            if (evo_general_params.cal.lbnav === 'no') return;
1225		            if (OO === undefined || !('other_data' in OO)) return;
1226
1227		            const event = $(OO.other_data.obj).closest('.event');
1228		            const calId = (CAL ? CAL.attr('id') : '');
1229		            const buttons = [
1230		                { dir: 'prev', icon: 'left', sibling: event.prev('.event') },
1231		                { dir: 'next', icon: 'right', sibling: event.next('.event') }
1232		            ].filter(b => b.sibling.length)
1233		             .map(b => `
1234		                <div class='evocard_lb_navs'>
1235		                    <button class='evocard_nav_trig ${b.dir} evoposa evocurp evohoop7 evobr30 evobgcw evodfx evofxjcc evofxaic evo_transit_all evoboxbb' data-id='${b.sibling.attr('id')}' data-cid='${calId}'>
1236		                        <i class='fa fa-chevron-${b.icon}'></i>
1237		                    </button>
1238		                </div>
1239		            `).join('');
1240
1241		            LB.find('.evolb_box').append(buttons);
1242		            setTimeout(() => LB.find('.evocard_nav_trig').addClass('show'), 500);
1243		        });
1244		    },
1245		    evocardNavTrig(){
1246		    	this.E.B.on('click','.evocard_nav_trig',function(e){
1247					e.preventDefault();
1248				    const $el = $(e.currentTarget);
1249				    const CAL = $('#' + $el.data('cid'));
1250				    const SC = CAL.evo_shortcode_data();
1251				    const eventId = $el.data('id').split('_')[1];
1252				    const newEvent = CAL.find(`#${$el.data('id')}`);
1253				    const newEventTrigger = newEvent.find('.desc_trig');
1254				    const LB = $el.closest('.evo_lightbox');
1255
1256				    LB.find('.evocard_nav_trig').fadeOut().addClass('old');
1257				    setTimeout(() => LB.find('.evocard_lb_navs').has('.old').remove(), 500);
1258
1259				    LB.evo_lightbox_show_open_animation({ animation_type: 'saving' });
1260
1261				    const updatedSC = {
1262				        ...SC,
1263				        repeat_interval: parseInt(newEvent.data('ri')),
1264				        ux_val: CAL.evo_cal_event_get_uxval(SC, newEventTrigger),
1265				        event_id: eventId,
1266				        ajax_eventtop_show_content: true,
1267				        evortl: newEvent.find('.eventon_events_list').hasClass('evortl') ? 'yes' : 'no',			
1268				        additional_class: CAL.attr('class').match(/etttc_\w+/)?.[0] || '',
1269				    };
1270
1271				    const newLbClass = "evo_eventcard_"+eventId;
1272				    LB.removeClass(LB.data('lbc')).addClass(newLbClass).data('lbc', newLbClass);
1273
1274				    setTimeout(() => CAL.evo_cal_lightbox_trigger(updatedSC, newEventTrigger, CAL, LB), 1000);
1275				});
1276		    },
1277		    evoMapExpandTrig(){
1278		    	this.E.B.on('click','.evo_map_expand_trig',function(e){
1279					e.preventDefault();
1280
1281					const $gmapDiv = $(this).closest('.evo_map').find('.evo_metarow_gmap');
1282					const mapID = $gmapDiv.attr('id')+'_exp';
1283					const $newDiv = $('<div id="'+ mapID +'" class="evo_lb_map evobr15" style="min-height:calc(100vh - 120px);"></div>');
1284					const locationAdd = $gmapDiv.data('address');
1285					const locationName = $gmapDiv.data('name');
1286
1287					const extra = `<div class='evodfx evofxdrr evofxaic evogap10 evomarr50'>
1288							<input id="user-address-${mapID}" type="text" placeholder="Enter starting address"/>
1289							<button id="get-directions-${mapID}" class='evo_nonbtn'><i class='fa fa-circle-arrow-right'></i></button>
1290							<i class='fa fa-route evofz24i evocurp evoop5 evohoop7'></i>
1291							<button class='evo_nonbtn evoff_2 evocurp evohoop7 evoop5'><i class='fa fa-calendar evomarr10 evofz24i'></i>More Events</button>
1292						</div>`;
1293					const $topDiv = `<div class='evodfx evofxdrr evogap10 evofxjcsb evofxaic evomarb10'>
1294						<div class='evodfx evofxdrr evofxaic evogap10'>
1295							<p class='evoff_1i evomar0i evofz18i'>${locationName}</p>
1296							<p class='evomar0i evofz14i'>${locationAdd}</p>
1297						</div>
1298						</div>`;
1299					const $botDiv = ``;
1300
1301					// Copy only data attributes, not content
1302					$.each($gmapDiv.data(), function(key, value) {
1303					    $newDiv.data(key, value).attr('data-'+key, value);
1304					});
1305					const calID = $(this).closest('.ajde_evcal_calendar').attr('id');
1306					$(this).evo_lightbox_open({
1307						uid: 'evo_map_expand',calid: calID,
1308						lbdata:{ class:'evo_map_expand',content: $topDiv + $newDiv[0].outerHTML + $botDiv }
1309					});
1310				});
1311		    },
1312		    handle_lightbox_processed(){
1313		    	this.E.B.on('evo_lightbox_processed',function(e, OO, LB){
1314					if( OO.uid == 'evo_map_expand'){
1315						//console.log(OO);
1316						setTimeout(function(){
1317							LB.find('.evo_lb_map').evo_load_gmap({	cal: $('body').find('#'+ OO.calid)	});
1318						}, 500);						
1319					}
1320				});
1321		    },
1322
1323		    // Calendar
1324		    handle_calendar_interactions(){
1325		    	const { B } = this.E;
1326		    	B.find('.ajde_evcal_calendar').each( (index, calendar) => {
1327
1328		    		const $calendar = $(calendar);
1329		    		const $SC = $calendar.evo_shortcode_data();
1330
1331			        // Bubble tooltip for events in calendars with 'bub' class
1332			        if ($calendar.hasClass('bub')) {
1333			            $calendar.on('mouseover.evoCal', '.eventon_list_event', (e) => {
1334			                const $event = $(e.currentTarget);
1335			                const $list = $event.closest('.eventon_events_list');
1336			                const title = $event.find('.evoet_dayblock').data('bub');
1337			                const position = $event.position();
1338
1339			                $list.append(`<span class="evo_bub_box">${title}</span>`);
1340			                const $bubble = $list.find('.evo_bub_box');
1341
1342			                let left = position.left;
1343			                let top = position.top - $bubble.height() - 30;
1344
1345			                // Adjust bubble position if it exceeds list width
1346			                const listWidth = $list.width();
1347			                const totalWidth = position.left + $bubble.width() + $event.width();
1348			                if (totalWidth > listWidth) {
1349			                    left = position.left - $bubble.width() + $event.width() - 20;
1350			                }
1351
1352			                $bubble.css({ top, left }).addClass('show');
1353			            }).on('mouseout.evoCal', '.eventon_list_event', (e) => {
1354			                $(e.currentTarget).closest('.eventon_events_list').find('.evo_bub_box').remove();
1355			            });
1356			        }
1357
1358			        // Jumper button toggle
1359			        $calendar.on('click.evoCal', '.evo-jumper-btn', (e) => {
1360			            const $this = $(e.currentTarget);
1361			            $this.closest('.calendar_header').find('.evo_j_container').toggle();
1362			            $this.toggleClass('vis');
1363			        });
1364
1365			        // select a new time from jumper
1366			        $calendar.on('click','.evo_j_dates a',function(){
1367						var val = $(this).attr('data-val'),
1368							type = $(this).parent().parent().attr('data-val'),
1369							CAL = $calendar,
1370							SC = CAL.evo_shortcode_data();
1371
1372						if(type=='m'){ // change month
1373							CAL.evo_update_cal_sc({F:'fixed_month', V: val });
1374						}else{
1375							CAL.evo_update_cal_sc({F:'fixed_year', V: val });
1376						}
1377
1378						run_cal_ajax( CAL.attr('id') ,'none','jumper');
1379						
1380						// hide month jumper if not set to leave expanded
1381						if(SC.expj =='no')	container.delay(2000).slideUp();
1382					});
1383
1384					// view switcher
1385					$calendar.on('click', '.evo_vSW',function(){
1386						const O = elm = $(this);
1387						var DATA = O.data('d');
1388						if(O.hasClass('focusX')) return;
1389						CAL = $calendar;
1390
1391						// remove other additions from other views
1392						CAL.find('.evoADDS').hide().delay(200).queue(function(){
1393							$(this).remove();
1394						});
1395
1396						var SC = $SC;
1397						const cal_tz = CAL.evo_get_global({S1:'cal_def',S2:'cal_tz'});
1398						var reload_cal_data = false;
1399						
1400						// Create date object
1401							_M1 = moment().set({'year': SC.fixed_year, 'month': ( SC.fixed_month -1 ), 'date':SC.fixed_day}).tz( cal_tz );
1402							_M1.set('date',1).startOf('date');
1403							_start = _M1.unix();
1404							_M1.endOf('month').endOf('date'); // move to end of month
1405							_end = _M1.unix();
1406
1407						// DEP
1408							var DD = new Date(SC.fixed_year,SC.fixed_month -1 , SC.fixed_day, 0,0,0 );
1409							DD.setUTCHours(0);
1410							DD.setUTCFullYear( SC.fixed_year );
1411							DD.setUTCMonth( SC.fixed_month -1 );
1412							DD.setUTCDate( SC.fixed_day );
1413
1414						// switch to normal
1415							O.siblings('.evo_vSW').removeClass('focusX select');					
1416							O.addClass('focusX select');
1417							CAL.find('.evo-viewswitcher-btn em').html( O.html() );
1418							O.closest('.evo_cal_view_switcher').removeClass('show');
1419
1420						// ux_val for specific cal
1421							if( DATA && 'ux_val' in DATA)	CAL.evo_update_cal_sc({F:'ux_val', V: DATA.ux_val });
1422
1423						// calendar class toggling
1424							O.siblings('.evo_vSW').each(function(){
1425								var _d = $(this).data('d');
1426								if( _d && 'c' in _d )	CAL.removeClass( _d['c'] ); // remove other cls
1427							});
1428							if( DATA && 'c' in DATA)	CAL.addClass( DATA.c );
1429					
1430
1431						// process date times block
1432							CAL.find('.evoet_dayblock span').hide();
1433							CAL.find('.evoet_dayblock span.evo_start').show();
1434							CAL.find('.evoet_dayblock span.evo_end').show();
1435							CAL.find('.evoet_dayblock span.evo_end.only_time').hide();
1436
1437						// if current date range is not a month load those unix
1438						if( SC.focus_start_date_range != _start && SC.focus_end_date_range != _end ){
1439							reload_cal_data = true;
1440							CAL.evo_update_cal_sc({F:'focus_start_date_range',V: _start });
1441							CAL.evo_update_cal_sc({F:'focus_end_date_range', V: _end });
1442						}
1443
1444						// treating events list based on dif preferences--  vals el_visibility = hide_events, show_events
1445							if( 'el_visibility' in DATA){
1446								el_visibility = DATA.el_visibility;
1447
1448								if( el_visibility =='show_events') CAL.find('.eventon_list_event').show();
1449								if( el_visibility =='hide_events') CAL.find('.eventon_list_event').hide();
1450								if( el_visibility =='hide_list') CAL.find('#evcal_list').addClass('evo_hide').hide();
1451								if( el_visibility =='show_all'){
1452									CAL.find('#evcal_list').removeClass('evo_hide').show();
1453									CAL.find('.eventon_list_event').show();
1454								} 
1455							}				
1456
1457						CAL.evo_update_cal_sc({F:'calendar_type', V: 'default'});
1458						
1459						B.trigger('evo_vSW_clicked_before_ajax', [ O, CAL, DD, reload_cal_data ]);
1460
1461						// run ajax to load new events in the range
1462							if( reload_cal_data ){
1463								B.trigger('evo_run_cal_ajax',[CAL.attr('id'),'none','filering']);
1464							}else{
1465								B.trigger('evo_vSW_clicked_noajax', [ O, CAL ]); // @s4.6
1466							}
1467												
1468						B.trigger('evo_vSW_clicked', [ O, CAL, DD, reload_cal_data]);
1469
1470						// switching to and from tiles view
1471							if( elm.hasClass('evoti')){
1472								CAL.find('.eventon_list_event').each(function(){
1473									color = $(this).data('colr');
1474									$(this).find('a.desc_trig').css({'background-color': color});
1475								});
1476								CAL.addClass('color').removeClass('sev').data('oC', 'sev');
1477							}else{
1478								if( CAL.hasClass('esty_0') || CAL.hasClass('esty_4') ){
1479									CAL.removeClass('color');
1480									CAL.find('.eventon_list_event').each(function(){
1481										$(this).find('a.desc_trig').css({'background-color': ''});
1482									});
1483									if( CAL.data('oC') !== undefined) CAL.addClass( CAL.data('oC'));
1484								}
1485							}
1486
1487					});
1488		    	});
1489		    },		  
1490
1491		    // Global  
1492		    handle_global_listners(){
1493		    	const { B } = this.E;
1494		    	B.on('evo_trigger_cal_reset', function(event, cal){
1495					cal_resets( cal );
1496				});
1497				B.on('click', function(event) {
1498					BODY.trigger('clicked_on_page', [ $(event.target) , event ]);
1499				});
1500				B.find('.evo_location_map').each(function(){			
1501					$(this).evo_load_gmap();
1502				});
1503				// on event card lightbox load -> taxonomy details @since 4.2 u4.6
1504				B.on('evo_ajax_complete_eventon_get_tax_card_content', function(event,  OO){
1505			
1506					LB = B.find('.'+ OO.lightbox_key);
1507
1508					setTimeout(function(){
1509						// run map load
1510						if( LB.find('.evo_trigger_map').length > 0 ){
1511							map_id_elm = LB.find('.evo_trigger_map');			
1512							map_id_elm.evo_load_gmap();
1513							console.log('Loading Event Map');
1514						}
1515						
1516						// run countdown timers
1517						LB.find('.evo_countdowner').each(function(){
1518							$(this).evo_countdown();
1519						});
1520
1521						// run calendar filtering function
1522						CAL = LB.find('.ajde_evcal_calendar');
1523						if (CAL.length) CAL.evo_cal_filtering();
1524					},500);		
1525				});
1526		    },
1527		    // Tab view switcher
1528		    handle_tabs(){
1529		    	const { B } = this.E;
1530		    	B.find('.evo_tab_container').each(function(){
1531					$(this).find('.evo_tab_section').each(function(){
1532						if(!$(this).hasClass('visible')){
1533							$(this).addClass('hidden');
1534						}
1535					});
1536				});
1537				B.on('click','.evo_tab',function(){
1538					tab = $(this).data('tab');
1539					tabsection = $(this).closest('.evo_tab_view').find('.evo_tab_container');
1540					tabsection.find('.evo_tab_section').addClass('hidden').removeClass('visible');
1541					tabsection.find('.'+tab).addClass('visible').removeClass('hidden');
1542
1543					$(this).parent().find('.evo_tab').removeClass('selected');
1544					$(this).addClass('selected');
1545
1546					B.trigger('evo_tabs_newtab_selected',[ $(this)]);
1547				});
1548		    },
1549
1550		};
1551
1552		interactions_class.run();
1553	}
1554
1555// EVO ON
1556	const EVO = {
1557
1558		E:{
1559			B: $('body')
1560		},
1561		init(){
1562			this.Tools.init();
1563			this.Interactions.init();
1564			this.Virtual_Events.init();
1565			this.Search.init();
1566			this.Elements_Interactions.init();
1567			// Global event listeners (e.g., heartbeat, resize)
1568        	this.setupGlobalListeners();
1569        	this.schedule_view();
1570        	this.ajax_triggers();
1571		},
1572
1573		setupGlobalListeners(){
1574			const { B } = this.E;
1575			// Heartbeat hooks
1576	        $(document).on('heartbeat-send', (e, data) => {
1577	            if (this.BODY.find('.evo_refresh_on_heartbeat').length) {
1578	                this.BODY.find('.evo_refresh_on_heartbeat').each((i, el) => {
1579	                    if ($(el).closest('.eventon_list_event').length <= 0) return;
1580	                    if ($(el).data('refresh') !== undefined && !$(el).data('refresh')) return;
1581
1582	                    data['evo_data'] = EVO.Tools.build_elm_refresh_data($(el));
1583	                });
1584	            }
1585	        });
1586
1587	        $(document).on('heartbeat-tick', (e, data) => {
1588	            EVO.Tools.evo_apply_refresh_content(data);
1589	        });
1590
1591			// Other global events
1592	        B.on('evo_refresh_elements', (e, send_data) => {
1593	            if (!send_data || send_data.length <= 0) return;
1594
1595	            send_data['nonce'] = evo_general_params.n;
1596
1597	            $.ajax({
1598	                beforeSend: () => {
1599	                    if ('evo_data' in send_data) {
1600	                        $.each(send_data.evo_data, (ekey, eclasses) => {
1601	                            $.each(eclasses, (classnm, val) => {
1602	                                if (val && 'loader' in val && val.loader && 'loader_class' in val) {
1603	                                    $('#event_' + ekey).find('.' + val.loader_class).addClass('evoloading');
1604	                                }
1605	                            });
1606	                        });
1607	                    }
1608	                },
1609	                type: 'POST',
1610	                url: EVO.Tools.get_ajax_url('eventon_refresh_elm'),
1611	                data: send_data,
1612	                dataType: 'json',
1613	                success: (data) => {
1614	                    if (data.status === 'good') {
1615	                        EVO.Tools.evo_apply_refresh_content(data);
1616	                    }
1617	                },
1618	                complete: () => {
1619	                    if ('evo_data' in send_data) {
1620	                        $.each(send_data.evo_data, (ekey, eclasses) => {
1621	                            $.each(eclasses, (classnm, val) => {
1622	                                if (val && 'loader' in val && val.loader && 'loader_class' in val) {
1623	                                    $('#event_' + ekey).find('.' + val.loader_class).removeClass('evoloading');
1624	                                }
1625	                            });
1626	                        });
1627	                    }
1628	                }
1629	            });
1630	        });
1631	        // refresh the closest hearbeat run parent
1632			B.on('evo_refresh_designated_elm', function(ee, elm, elm_class, extra_data){
1633				//get closest event object
1634				const event = $(elm).closest('.eventon_list_event');
1635	            if (!event || event.find('.' + elm_class).length === 0) return;
1636
1637	            const refresh_elm = event.find('.' + elm_class);
1638	            let send_data = {};	
1639
1640				send_data['evo_data'] = EVO.Tools.build_elm_refresh_data( refresh_elm , extra_data);				
1641				B.trigger('evo_refresh_elements',[ send_data ]);
1642			});
1643
1644		},
1645		schedule_view(){
1646			EVO.E.B.on('evo_init_ajax_success_each_cal',function(event, data, i, v, CAL){
1647				$('body').find('.ajde_evcal_calendar.evoSV').each(function(){
1648					EVO.Tools.evosv_populate( $(this) );
1649				});
1650			})
1651			.on('evo_main_ajax_before_fnc', function(event, CAL,  ajaxtype, data_arg){
1652				SC = data_arg.shortcode;
1653				if( SC.calendar_type == 'schedule'){
1654					CAL.find('#evcal_list').removeClass('evo_hide').show();
1655				}
1656			}).on('evo_main_ajax_success', function(event, CAL,  ajaxtype, data , data_arg){
1657				SC = data_arg.shortcode;
1658				if( SC.calendar_type == 'schedule'){
1659					CAL.find('#evcal_list').addClass('evo_hide').hide();
1660				}
1661			}).on('evo_main_ajax_complete', function(event, CAL,  ajaxtype, data , data_arg){
1662				SC = data_arg.shortcode;
1663				if( SC.calendar_type == 'schedule'){
1664					EVO.Tools.evosv_populate( CAL );
1665				}
1666			})
1667			// view switching
1668			.on('evo_vSW_clicked_before_ajax',function(event, O, CAL, DD, reload_cal_data){
1669				if(!(O.hasClass('evosv'))) return;
1670				var SC = CAL.evo_shortcode_data();
1671
1672				CAL.evo_update_cal_sc({F:'calendar_type', V: 'schedule'});
1673				CAL.evo_update_cal_sc({F:'fixed_day', V: SC.fixed_day });
1674
1675			})
1676			.on('evo_vSW_clicked',function(event, OBJ, CAL, DD, reload_cal_data){
1677				if(!(OBJ.hasClass('evosv'))) return;						
1678				CAL.evo_update_cal_sc({F:'calendar_type', V: 'schedule'});
1679			})
1680			.on('evo_vSW_clicked_noajax',function(event, OBJ, CAL, DD, reload_cal_data){
1681				if(!(OBJ.hasClass('evosv'))) return;						
1682				EVO.Tools.evosv_populate( CAL );		
1683			})
1684			// open events from schedule view
1685			.on('click','.evosv_items',function(event, elm){
1686				O = $(this);
1687				CAL = O.closest('.ajde_evcal_calendar');
1688				var e_cl = 'event_'+O.data('id');
1689				
1690				const clicked_event_uxval = O.data('uxval');
1691
1692				// if event is set to slide down .. switch to lightbox
1693				if( clicked_event_uxval == '1' ){
1694					CAL.find('.'+e_cl).find('.desc_trig').data('ux_val', 3);
1695				}
1696
1697				CAL.find('.'+e_cl).find('.desc_trig').trigger('click');
1698			});
1699		},
1700		Interactions:{
1701			init(){
1702				const { B } = EVO.E;
1703			},
1704
1705		},
1706		Search:{
1707			init(){
1708				const { B } = EVO.E;
1709				B.on('click.evoSearch', '.evo_do_search', (event) => {
1710		            EVO.Tools.do_search_box($(event.target));
1711		        });
1712		        B.on('keypress.evoSearch', '.evo_search_field', (ev) => {
1713	                if ((ev.keyCode || ev.which) === 13) {
1714	                    EVO.Tools.do_search_box($(ev.target).siblings('.evo_do_search'));
1715	                }
1716	            });
1717	            B.on('keypress.evoSearch', '.evo_search_bar_in_field', (ev) => {
1718	                if ((ev.keyCode || ev.which) === 13) {
1719	                    EVO.Tools.search_within_calendar( $(ev.target) );
1720	                }
1721	            });
1722	            B.on('click', '.evosr_search_clear_btn', function(e) {
1723				    e.preventDefault(); EVO.Tools.reset_search($(this).siblings('input'), $(this));
1724				});
1725				B.on('evo_main_ajax_complete', function(e, CAL, ajaxtype, responseJSON, data) {
1726					if (ajaxtype === 'search' && data.shortcode['s']) {
1727				        CAL.find('.evosr_search_clear_btn').addClass('show');
1728				    }
1729				});
1730				// Handle search input interactions
1731				B.on({
1732					'click': function() { EVO.Tools.search_within_calendar($(this).siblings('input')); },
1733				    'keyup': function(e) {
1734				        const $input = $(this), $clearBtn = $input.siblings('.evosr_search_clear_btn');
1735				        if (e.which === 27) { e.preventDefault(); EVO.Tools.reset_search($input, $clearBtn); return; }
1736				        $clearBtn.toggleClass('show', $input.val().trim() !== '');
1737				    }		    
1738				}, '.evo_search_bar_in_field, .evosr_search_btn');
1739			}			
1740		},
1741		Elements_Interactions:{
1742			init(){
1743				const { B } = EVO.E;
1744				// increase and reduce quantity
1745			    B.on('click','.evo_qty_change', function(event){
1746			        var OBJ = $(this);
1747			        var QTY = oQTY = parseInt(OBJ.siblings('em').html());
1748			        var MAX = OBJ.siblings('input').attr('max');
1749			        var BOX = OBJ.closest('.evo_purchase_box');
1750
1751			        var pfd = BOX.find('.evo_purchase_box_data').data('pfd');			        
1752
1753			        (OBJ.hasClass('plu'))?  QTY++: QTY--;
1754
1755			        QTY =(QTY==0)? 1: QTY;
1756			        QTY = (MAX!='' && QTY > MAX)? MAX: QTY;
1757
1758			        // new total price
1759			        var sin_price = OBJ.parent().data('p');
1760			        new_price = sin_price * QTY;
1761
1762			        new_price = EVO.Tools.get_format_price( new_price, pfd);
1763
1764			        BOX.find('.total .value').html( new_price);
1765
1766			        OBJ.siblings('em').html(QTY);
1767			        OBJ.siblings('input').val(QTY);
1768
1769			        B.trigger('evo_qty_changed',[QTY,oQTY, new_price,OBJ ]);
1770			    });
1771			}
1772		},
1773		Virtual_Events:{
1774			init(){
1775				const { B } = EVO.E;
1776				this.jitsi();
1777				// record sign in - virtual plus // @+3.1
1778				B.on('click','.evo_vir_signin_btn',function(){
1779								
1780					let extra_data = {};
1781					extra_data['signin'] = 'y';
1782					extra_data['refresh_main'] = 'y';
1783					extra_data['loader'] = true;
1784					extra_data['loader_class'] = 'evo_vir_main_content';
1785
1786					B.trigger('evo_refresh_designated_elm',[ $(this) , 'evo_vir_data',extra_data]);
1787				});
1788			},
1789			jitsi( mod_refresh){
1790				const { B } = EVO.E;
1791				const domain = 'meet.jit.si';
1792			    let api = [];
1793
1794			    B.find('.evo-jitsi-wrapper').each(function(index, element) {
1795			    	const O = $(this);
1796			    	const eventO = O.closest('.eventon_list_event');
1797
1798			    	if( mod_refresh != '' && mod_refresh == 'mod_refresh_no' && O.hasClass('mod')) return;
1799
1800			        const roomName = $(element).data('n');
1801		            const width = $(element).data('width');
1802		            const height = $(element).data('height');
1803		            const audioMuted = $(element).data('audiomute');
1804		            const videoMuted = $(element).data('videomute');
1805		            const screenSharing = $(element).data('screen');
1806	           
1807			        const myOverwrite =
1808					{
1809					 	'TOOLBAR_BUTTONS': $(element).data('d'),
1810					    "DEFAULT_BACKGROUND": '#494a4e',
1811					    'MOBILE_APP_PROMO': false,
1812					    'SETTINGS_SECTIONS':['devices', 'language', 'profile', 'calendar'],
1813					};
1814			        const options = {
1815			            roomName,
1816			            width,
1817			            height,
1818			            parentNode: element,	            
1819			            configOverwrite: { 
1820			            	startWithAudioMuted: audioMuted,
1821			                startWithVideoMuted: videoMuted,
1822			                startScreenSharing: false,	  
1823			                disableInviteFunctions: false,             
1824			            },
1825			            interfaceConfigOverwrite: myOverwrite,     
1826			        };
1827
1828			       	api = new JitsiMeetExternalAPI(domain, options);      
1829
1830			        api.addEventListener('participantRoleChanged', function(event){
1831
1832			        	// record moderator joined
1833			        	if (event.role === "moderator"){	        		
1834			        		this._record_moderator_join( 'yes', eventO.data('event_id'), eventO.data('ri'));
1835			        	}
1836
1837			        	const pp = jQuery(element).data('p');
1838			        	if (event.role === "moderator" && pp != '__') {
1839			        		ppp = pp.replace('_','');
1840					        api.executeCommand('password', ppp);
1841					    }	        	
1842			        });	
1843
1844			        // moderator leave	        
1845			        api.addEventListener('videoConferenceLeft', function(event){
1846			        	if( eventO.find('.evo_vir_data').data('ismod') =='y'){
1847			        		this._record_moderator_join( 'no', eventO.data('event_id'), eventO.data('ri'));
1848			        		O.siblings('.evo_vir_mod_left').show();
1849			        		O.hide();
1850			        	}
1851			        });
1852			    });
1853			},
1854			// record moderator logins for jitsi
1855			_record_moderator_join(joined, eid, ri){
1856				var data_arg = {
1857					'action': 'eventon_record_mod_joined',
1858					'eid': eid,
1859					'ri': ri,
1860					'joined': joined,
1861					'nonce': evo_general_params.n,				
1862				};
1863
1864				$.ajax({
1865					beforeSend: function(){},
1866					type: 'POST',url: ajax_url,
1867					data: data_arg,dataType:'json',
1868					success:function(data){	}
1869				});
1870			}
1871		},
1872		ajax_triggers(){
1873			const { B } = EVO.E;
1874			B.on('evo_before_trig_ajax',function(event, obj){
1875				if(!obj.hasClass('evo_trig_vir_end')) return;
1876				
1877				var new_ajax_data = $(document).data( 'evo_data');
1878				new_ajax_data['fnct'] = 'mark_event_ended';
1879				$(document).data( 'evo_data', new_ajax_data );
1880				
1881			})
1882			.on('evo_beforesend_trig_ajax',function( event, obj, new_ajax_data){
1883				if(!obj.hasClass('evo_trig_vir_end')) return;
1884
1885				obj.closest('.evo_vir_mod_box').addClass('evoloading');
1886			})
1887			.on('evo_success_trig_ajax',function( event, obj, new_ajax_data, return_data){
1888				if(!obj.hasClass('evo_trig_vir_end')) return;
1889
1890				// if virtual events were marked as ended
1891				if(!('_vir_ended' in return_data)) return;
1892
1893				// refresh the virtual main content
1894				extra_data = {};
1895				extra_data['refresh_main'] = 'yy';
1896				extra_data['loader'] = true;
1897				extra_data['loader_class'] = 'evo_vir_main_content';
1898
1899				//console.log(extra_data);
1900
1901				B.trigger('evo_refresh_designated_elm',[ obj , 'evo_vir_data',extra_data]);
1902			})
1903			.on('evo_complete_trig_ajax',function( event, obj, new_ajax_data){
1904				if(!obj.hasClass('evo_trig_vir_end')) return;
1905				obj.closest('.evo_vir_mod_box').removeClass('evoloading');
1906			});
1907		},
1908		Tools:{
1909			init() {
1910				const { B } = EVO.E;
1911	            // Bind AJAX listeners once
1912	            B.on('evo_ajax_beforesend_evo_get_search_results', (event, OO, el) => {
1913	            	$(el).find('.evo_search_results_count').hide();
1914	                $(el).addClass('searching');
1915	            }).on('evo_ajax_complete_evo_get_search_results', (event, OO, el) => {
1916	                $(el).removeClass('searching');
1917	            }).on('evo_ajax_success_evo_get_search_results', (event, OO, data, el) => {
1918	                $(el).find('.evo_search_results').html(data.content);
1919	                if ($(el).find('.no_events').length === 0) {
1920	                    const Events = $(el).find('.eventon_list_event').length;
1921	                    $(el).find('.evo_search_results_count span').html(Events);
1922	                    $(el).find('.evo_search_results_count').fadeIn();
1923	                }
1924	            });
1925			},
1926			do_search_box( OBJ ){
1927				const { B } = EVO.E;
1928				const SearchVal = OBJ.closest('.evosr_search_box').find('input').val();
1929				const Evosearch = OBJ.closest('.EVOSR_section');
1930				OBJ.closest('.evo_search_entry').find('.evosr_msg').toggle( !SearchVal );
1931
1932				if (!SearchVal) return false;			
1933
1934				var ajax_results = Evosearch.evo_admin_get_ajax({
1935					'ajaxdata': {
1936						//action: 		'eventon_search_evo_events',
1937						search: 		SearchVal,
1938						shortcode:  	Evosearch.find('span.data').data('sc'),
1939						nonce: 			evo_general_params.n				
1940					},
1941					ajax_type:'endpoint',
1942					ajax_action:'eventon_search_evo_events',
1943					uid:'evo_get_search_results',
1944					end: 'client',
1945				});
1946			},
1947			// Search function
1948			search_within_calendar($input) {
1949			    const ev_cal = $input.closest('.ajde_evcal_calendar');
1950			    ev_cal.evo_update_cal_sc({ F: 'show_limit_paged', V: '1' });
1951			    ev_cal.evo_update_cal_sc({ F: 's', V: $input.val() });
1952			    run_cal_ajax(ev_cal.attr('id'), 'none', 'search');
1953			    return false;
1954			},
1955
1956			// Reset search function
1957			reset_search($input, $clearBtn) {
1958			    const ev_cal = $input.closest('.ajde_evcal_calendar');
1959			    ev_cal.evo_update_cal_sc({ F: 's', V: '' });
1960			    run_cal_ajax(ev_cal.attr('id'), 'none', 'search');
1961			    $input.val('');
1962			    $clearBtn.removeClass('show');
1963			},
1964
1965			// Total formating
1966	        get_format_price(price, data){
1967
1968	            // price format data
1969	            PF = data;
1970	           
1971	            totalPrice = price.toFixed(PF.numDec); // number of decimals
1972	            htmlPrice = totalPrice.toString().replace('.', PF.decSep);
1973
1974	            if(PF.thoSep.length > 0) {
1975	                htmlPrice = EVO.Tools._addThousandSep(htmlPrice, PF.thoSep);
1976	            }
1977	            if(PF.curPos == 'right') {
1978	                htmlPrice = htmlPrice + PF.currencySymbol;
1979	            }
1980	            else if(PF.curPos == 'right_space') {
1981	                htmlPrice = htmlPrice + ' ' + PF.currencySymbol;
1982	            }
1983	            else if(PF.curPos == 'left_space') {
1984	                htmlPrice = PF.currencySymbol + ' ' + htmlPrice;
1985	            }
1986	            else {
1987	                htmlPrice = PF.currencySymbol + htmlPrice;
1988	            }
1989	            return htmlPrice;
1990	        },
1991	        _addThousandSep(n, thoSep){
1992	            var rx=  /(\d+)(\d{3})/;
1993	            return String(n).replace(/^\d+/, function(w){
1994	                while(rx.test(w)){
1995	                    w= w.replace(rx, '$1'+thoSep+'$2');
1996	                }
1997	                return w;
1998	            });
1999	        },
2000
2001	        // apply refresh event element content with matching data that is sent
2002			evo_apply_refresh_content(data){
2003				if (!('evo_data' in data)) return;
2004
2005				$.each(data.evo_data, function(eclass, boxes){
2006					// if event exists in the page
2007
2008					var vir_data_vals = false;
2009					if( 'evo_vir_data' in boxes) vir_data_vals = boxes.evo_vir_data.data;
2010
2011					B.find('.'+eclass).each(function(){
2012						const event_elm = $(this);
2013						$.each(boxes, (boxclass, boxdata) => {
2014		                    if (!boxdata.html || event_elm.find('.' + boxclass).length <= 0) return;
2015		                    event_elm.find('.' + boxclass).html(boxdata.html);
2016		                });
2017
2018						// only for virtual event update
2019						if( vir_data_vals ){
2020
2021							// reload jitsi for main content - if main content html is sent it will refresh
2022								if( vir_data_vals && ('vir_type' in vir_data_vals) 
2023									&& vir_data_vals.vir_type == 'jitsi' 
2024									&& ('evo_vir_main_content' in boxes) 
2025									&& ('html' in boxes.evo_vir_main_content)  
2026									&& boxes.evo_vir_main_content.html != ''
2027								){
2028									EVO.Virtual_Events.jitsi('mod_refresh_no');
2029								}
2030
2031							// update data for sent object
2032								$.each(boxes, function(boxclass, boxdata){
2033									if( boxdata.data == '' || boxdata.data === undefined) return;
2034
2035									// for jitsi if mod left --> force refresh main
2036									if( boxdata !== undefined && vir_data_vals.vir_type == 'jitsi' && vir_data_vals.mod_joined =='left'){
2037										
2038										// force refresh main
2039										boxdata.data['refresh_main'] = 'yy';
2040									}	
2041
2042									event_elm.find( '.'+boxclass ).data( boxdata.data );
2043								});
2044						}
2045
2046					});
2047				});
2048			},
2049			// get refresh data for specified elem
2050			build_elm_refresh_data( elm , extra_data){
2051				const dataObj = {};
2052		        const event = $(elm).closest('.eventon_list_event');
2053		        const ekey = event.data('event_id') + '_' + parseInt(event.data('ri'));
2054		        dataObj[ekey] = {};
2055		        const key2 = elm.data('key');
2056		        dataObj[ekey][key2] = elm.data();
2057
2058		        if (elm.data('check_awaitmod')) {
2059		            if ((event.find('.evo_vir_jitsi_waitmod').length > 0)) dataObj[ekey][key2]['refresh_main'] = 'yy';
2060
2061		            if (event.find('.evo-jitsi-wrapper').length > 0 && dataObj[ekey][key2]['mod_joined'] !== 'left') 
2062		                dataObj[ekey][key2]['refresh_main'] = '';
2063		        }
2064
2065		        if (extra_data && extra_data !== undefined) {
2066		            $.each(extra_data, (index, val) => {
2067		                dataObj[ekey][key2][index] = val;
2068		            });
2069		        }
2070
2071		        return dataObj;
2072			},
2073
2074			// populate the schedule view data @4.5.8
2075			evosv_populate(CAL){
2076				//console.log('s');
2077				var SC = CAL.evo_shortcode_data();
2078				OD = CAL.evo_get_OD(); // calendar other data 
2079
2080				var cal_events = CAL.find('.eventon_list_event');
2081				days_in_month = CAL.evo_day_in_month({M: SC.fixed_month, Y: SC.fixed_year});
2082				time_format = CAL.evo_get_global({S1:'cal_def',S2:'wp_time_format'});
2083
2084				// text strings
2085					_txt = CAL.evo_get_txt({V:'no_events'});
2086					_txt2 = CAL.evo_get_txt({V:'until'});
2087					_txt3 = CAL.evo_get_txt({V:'from'});
2088					_txt4 = CAL.evo_get_txt({V:'all_day'});
2089				
2090				CAL.find('#evcal_list').addClass('evo_hide');
2091
2092				var has_events = false;
2093				var html = '';
2094				var template_data = {};
2095				var processed_ids = {};
2096
2097				// Set initial date - date values
2098					var SU = parseInt( SC.focus_start_date_range);	var EU = '';
2099					var M = moment.unix( SU ).tz( OD.cal_tz );
2100
2101				// go through each day in month
2102				for(var x=1; x<= days_in_month; x++){
2103					
2104					var month_name = CAL.evo_get_dms_vals({ V: (M.get('month') +1), type:'m3'});
2105					var day_name = CAL.evo_get_dms_vals({ V: M.day(), type:'d3'});
2106					
2107					// set event unix into moment
2108						SU = M.unix();	M.endOf('day');
2109						EU = M.unix();	M.startOf('day');
2110					
2111					// run through each event and get events in this date
2112						var events = {};
2113
2114						cal_events.each(function(index, elm){
2115							ED = $(elm).evo_cal_get_basic_eventdata();
2116							if( !ED) return;
2117
2118							processed_ids[ED.uID] = ED.uID;
2119							ESU = ED.unix_start; EEU = ED.unix_end;
2120
2121							// check for date range
2122								var inrange = CAL.evo_is_in_range({
2123									'S': SU,	'E': EU,	'start': ESU,	'end':EEU
2124								});
2125								if(!inrange) return; // skip if no in range
2126
2127							has_events = true;
2128
2129							// event time relative to calendar tz
2130							m = moment.unix( ESU ).tz( OD.cal_tz );
2131							me = moment.unix( end ).tz( OD.cal_tz );
2132
2133							var all_day = $(elm).find('a.desc_trig').hasClass('allday') ? true: false;
2134
2135							// get event time correct for all day
2136							if( all_day ){
2137								ED['t'] = _txt4;
2138							}else{
2139								if( ESU <= SU ){
2140									if( EEU >= EU) ED['t'] = _txt4;
2141									if( EEU < EU ) ED['t'] = _txt2+' ' + me.format( time_format);		
2142								}else if(ESU > SU){
2143									if( EEU >= EU)  ED['t'] = _txt3+' '+ m.format( time_format);
2144									if( EEU < EU ) ED['t'] = m.format( time_format) +' - '+ me.format( time_format);
2145								}	
2146							}						
2147
2148							// hide end time
2149							if( ED.hide_et == 'y')		ED['t'] = m.format( time_format);
2150
2151							events[index] = ED;
2152						});			
2153
2154					// if there are events in this date
2155						if( events && Object.keys(events).length > 0){
2156							
2157							template_data[ x ] = {};
2158							template_data[ x ]['date'] = '<b>' + M.get('date')+'</b> '+ month_name+' '+ day_name;
2159							template_data[ x ]['d'] =  M.format('YYYY-M-D');
2160							template_data[ x ]['SU'] = SU;
2161							template_data[ x ]['events'] = {}
2162
2163							$.each(events, function(index, item){		
2164
2165								location_data = organizer_data = event_tags = '';
2166
2167								// location 
2168								if( SC.show_location == 'yes' && 'location' in item){
2169									location_data = "<div class='evosv_subdata evosv_location'><i class='fa fa-location-pin marr5'></i>" +item.location+"</div>";
2170								}
2171
2172								// organizer					
2173								if( SC.show_organizer == 'yes' && 'organizer' in item){
2174									organizer_data = "<div class='evosv_subdata evosv_org'>" +item.organizer+"</div>";
2175								}
2176
2177								// event tags
2178								if( SC.show_tags == 'yes' && 'event_tags' in item){
2179									event_tags = "<div class='evosv_subdata evosv_tags'>";
2180									$.each( item.event_tags, function(index, val){
2181										event_tags += "<span class='evosv_tag " + index +"'>" + val+"</span>";
2182									});
2183									event_tags += "</div>";
2184								}
2185
2186								template_data[ x ]['events'][ item.uID ] = {
2187									'time': item.t,
2188									'ux_val': item.ux_val,
2189									'title': item.event_title,
2190									'color':item.hex_color,
2191									'tag': event_tags,
2192									'loc': location_data,
2193									'org': organizer_data,
2194									'i': item
2195								}
2196
2197							});					
2198						}
2199
2200					// next date
2201					M.add(1, 'd');
2202				}
2203
2204				var html_ = "<div class='evosv_grid evoADDS'>";
2205				
2206				// if no events
2207				if( !has_events){
2208					no_event_content = CAL.evo_get_global({S1: 'html', S2:'no_events'});			
2209					html_ += "<div class='date_row'><div class='row no_events evosv'>"+no_event_content+"</div></div>";
2210				}else{
2211					html_ += CAL.evo_HB_process_template({
2212						TD:template_data, part:'evosv_grid'
2213					});
2214				}
2215
2216				html_ += '</div>';
2217
2218				if( CAL.find('.evosv_grid').length > 0){
2219					CAL.find('.evosv_grid').replaceWith( html_ );
2220				}else{
2221					ELM = CAL.find('#eventon_loadbar_section');
2222					ELM.after( html_ );
2223				}
2224				
2225			},
2226
2227			// call ajax url
2228			get_ajax_url(action){
2229				var ajax_type = 'endpoint';
2230				if('ajax_method' in evo_general_params ) ajax_type = evo_general_params.ajax_method;
2231				return EVO.E.B.evo_get_ajax_url({a:action, type: 	ajax_type });
2232			},
2233		}
2234
2235	};
2236	EVO.init();
2237
2238
2239
2240// Other
2241	// RESET general calendar -- @U 2.8.9		
2242		function cal_resets(calOBJ){
2243			calargs = $(calOBJ).find('.cal_arguments');
2244			calargs.attr('data-show_limit_paged', 1 );
2245			calOBJ.evo_update_cal_sc({
2246				F:'show_limit_paged',V:'1'
2247			});
2248		}
2249	
2250	// layout view changer - legacy
2251		if($('body').find('.evo_layout_changer').length>0){
2252			// menu button focus adjust
2253			$('body').find('.evo_layout_changer').each(function(item){
2254				if($(this).parent().hasClass('boxy')){
2255					$(this).find('.fa-th-large').addClass('on');
2256				}else{
2257					$(this).find('.fa-reorder').addClass('on');
2258				}
2259			});
2260
2261			// interaction
2262			$('.evo_layout_changer').on('click','i',function(){
2263				const CAL = $(this).closest('.ajde_evcal_calendar');
2264				TYPE = $(this).data('type');
2265				$(this).parent().find('i').removeClass('on');
2266				$(this).addClass('on');
2267
2268				//console.log(TYPE);
2269				
2270				if(TYPE=='row'){
2271					CAL.attr('class','ajde_evcal_calendar');
2272					// set tile colors
2273					CAL.find('.eventon_list_event').each(function(){
2274						$(this).find('.desc_trig').css('background-color',  '');
2275						$(this).find('.desc_trig_outter').css('background-color',  '');
2276					});
2277				}else if(TYPE =='bar'){
2278					CAL.attr('class','ajde_evcal_calendar  box_2 sev cev');
2279					
2280					// set tile colors
2281					CAL.find('.eventon_list_event').each(function(){
2282						const color = $(this).data('colr');
2283						$(this).find('.desc_trig').css('background-color',  color);
2284					});
2285				}else{
2286
2287					// set tile colors
2288					CAL.find('.eventon_list_event').each(function(){
2289						const color = $(this).data('colr');
2290						$(this).find('.desc_trig_outter').css('background-color',  color);
2291					});
2292
2293					CAL.attr('class','ajde_evcal_calendar boxy boxstyle0 box_2');
2294				}				
2295			});
2296		}
2297	
2298	// SORTING & FILTERING		
2299		// Sorting	
2300			// update calendar based on the sorting selection
2301				$('body').on('click', '.evo_sort_option',function(){
2302					O = $(this);
2303					var CAL = O.closest('.ajde_evcal_calendar');
2304					var sort_by = O.data('val');
2305					
2306					// update new values everywhere
2307					CAL.evo_update_cal_sc({F:'sort_by',V:sort_by});
2308
2309					O.parent().find('p').removeClass('select');
2310					O.addClass('select');	
2311
2312					run_cal_ajax(CAL.attr('id'),'none','sorting');						
2313				});		
2314
2315		// close filter menus on click outside
2316			BODY.on('clicked_on_page',function( ev, obj, ee){
2317
2318				// hide filter menu when clicked outside 4.6.2
2319				if( !(obj.hasClass('eventon_filter')) && 
2320					!(obj.hasClass('filtering_set_val')) &&
2321					!(obj.hasClass('evo_filter_val')) &&
2322					!(obj.hasClass('evofp_filter_search_i')) &&
2323					obj.parents('.filtering_set_val').length == 0 
2324				){
2325					//console.log(obj);
2326					BODY.find('.evo_filter_menu').html('');
2327					BODY.find('.evo_filter_tax_box.vis').removeClass('vis');
2328				}
2329			});
2330
2331		// Filtering
2332			$.fn.evo_cal_filtering = function(O){
2333				
2334				var opt = $.extend({}, O);
2335
2336				var el = this; // cal
2337				const sortbox = el.find('.eventon_sorting_section'),
2338					filter_container = sortbox.find('.evo_filter_container_in'),
2339					filter_line = sortbox.find('.eventon_filter_line'),
2340					fmenu = sortbox.find('.evo_filter_menu'),
2341					all_cal_filter_data = el.evo_get_filter_data(),
2342					SC = el.evo_shortcode_data();
2343				var tterms = [];
2344
2345
2346				var init = function(){
2347
2348					if( SC == '' || SC === null ) return;
2349					if( el.hasClass('filters_go'))	return;
2350					el.addClass('filters_go');
2351					
2352					draw_filter_bar();
2353					filter_actions();
2354					run_filter_nav_check();
2355
2356				}
2357
2358				// draw the filter bar
2359				var draw_filter_bar = function(){
2360					//console.log(all_cal_filter_data);
2361
2362					BODY.trigger('evo_filter_before_draw', [ el ]);
2363
2364					html = '';
2365					$.each( all_cal_filter_data , function( index, value){
2366
2367						// skip fast filter items
2368						if( SC && 'fast_filter' in SC && SC.fast_filter == 'yes' && SC.ff_tax != '' && SC.ff_tax !== undefined ){
2369							__t = SC.ff_tax.split(',');
2370							if( __t.includes( index ) ) return;
2371						}
2372
2373						html += "<div class='eventon_filter evo_filter_tax_box evo_hideshow_st "+index+"' data-tax='"+ value.__tax +"' data-filter_type='"+ value.__filter_type +"'>";
2374						html += "<div class='eventon_filter_selection'>";
2375							html += "<p class='filtering_set_val'><i class='fa fa-check'></i> "+ value.__name +"<em class='fa fa-caret-down'></em></p>";							
2376						html += "</div>";
2377						html += "</div>";
2378					});
2379
2380					filter_line.html( html );
2381
2382					BODY.trigger('evo_filter_drawn', [ el ]);
2383				}
2384
2385
2386				// filter all actions
2387				var filter_actions = function(){
2388
2389					el.off('click', '.evo-filter-btn');
2390
2391					// show/hide filter bar
2392						el.on('click','.evo-filter-btn',function(){
2393							const CAL = $(this).closest('.ajde_evcal_calendar');
2394							
2395							BODY.trigger('evo_filter_btn_trig', [ CAL , O ]);
2396							if( CAL.hasClass('fp_lb')) return; // PLUG 4.6.4
2397
2398							if( !( $(this).hasClass('vis') ) ){
2399								sortbox.addClass('vis');
2400								run_filter_nav_check();
2401							}else{
2402								sortbox.removeClass('vis');
2403							}
2404
2405						});
2406
2407						// close filter when other sibling buttons clicked 4.6.4
2408						BODY.on('evo_cal_header_btn_clicked',function(event, O){	
2409							if( O.hasClass('evo-sort-btn') || O.hasClass('evo-search')  ){
2410								const CAL = O.closest('.ajde_evcal_calendar');
2411								CAL.find('.eventon_sorting_section').removeClass('vis');								
2412							}
2413						});
2414						
2415						
2416					// show hide menu
2417					el.on('click','.filtering_set_val',function(){
2418
2419						O = $(this);
2420						const filterbox = O.closest('.evo_filter_tax_box'),
2421						filter_tax = filterbox.data('tax');
2422						selected_terms = el.evo_cal_get_filter_sub_data( filter_tax , 'tterms' );
2423
2424						// close sort menu
2425							el.find('.eventon_sort_line').hide();
2426
2427						// hide already opened menus
2428							if( filterbox.hasClass('vis')){
2429								filterbox.removeClass('vis');							
2430								close_filter_menu();
2431								return;
2432							}
2433							if( fmenu.data('tax') == filter_tax ){	
2434								filterbox.removeClass('vis');							
2435								close_filter_menu();
2436								return;
2437							}else{
2438								sortbox.find('.filtering_set_val').removeClass('show');
2439								sortbox.find('.evo_filter_tax_box').removeClass('vis');
2440								filterbox.addClass('vis');	
2441							}
2442
2443						// build the filter menu from data
2444							var filter_item_data = all_cal_filter_data[ filter_tax ].__list;
2445
2446							//console.log(all_cal_filter_data);
2447							//console.log(selected_terms);
2448							
2449							var __menu_html = '<div class="evo_filter_inside evo_filter_menu_in" data-tax="'+filter_tax+'"><div class="eventon_filter_dropdown">';
2450							
2451							// each term
2452							$.each(filter_item_data, function (index, val){
2453
2454								var icon_html = '';
2455								var _class = filter_tax+'_'+ val[0] + ' '+ val[0];
2456								
2457								// parent or child term
2458								if( val[3] !== undefined && val[3] != '' && val[3] == 'n') _class += ' np';
2459
2460								//console.log(selected_terms);
2461								// select or not
2462								if( selected_terms == 'all' )  _class += ' select';
2463								if( selected_terms.includes( val[0] ) )  _class += ' select';
2464
2465								// icon
2466								if( val[2] != '' && val[2] !== undefined ){
2467									_class += ' has_icon'; icon_html = val[2];
2468								} 
2469
2470								// tax term color
2471								var _tax_color = '';
2472								if( val[4] != '' && val[4] !== undefined ){
2473									_tax_color = `style='background-color:#${val[4]};'`;
2474								}
2475
2476								__menu_html += `<p class="evo_filter_val ${_class}" data-id="${val[0]}" ${_tax_color}>${icon_html} ${val[1]}</p>`
2477							});
2478							__menu_html += "</div></div>";
2479
2480							// 4.6.4
2481							BODY.trigger('evo_filter_menu_html_ready', [ el , __menu_html , O , filterbox, filter_tax]);
2482
2483
2484							if( el.hasClass('fp_side')) return; // PLUG
2485							
2486
2487							
2488						// set new menu with correct location
2489							const scrolled_width = filter_container.scrollLeft();
2490							fmenu.html( __menu_html );
2491
2492							// pluggable
2493							BODY.trigger('evo_filter_menu_built', [ el , fmenu , filter_tax ]);
2494							
2495
2496							__left_margin = filterbox.position().left + 10 - scrolled_width;
2497							__menu_width = fmenu.find('.evo_filter_inside').width();
2498
2499							__cal_left_margin = el.position().left;
2500
2501							//console.log(__cal_left_margin + ' '+ __left_margin +' '+ __menu_width + ' '+ $(window).width());
2502
2503							if( __left_margin + __menu_width + __cal_left_margin > $(window).width()  ){
2504								
2505								if(  ( __left_margin + __menu_width ) > el.width() ){
2506									new_left = el.width() - __menu_width - 10;
2507								}else{
2508									new_left = ( el.width() - __menu_width ) / 2;
2509								}								
2510								fmenu.css('left', new_left );
2511							}else{
2512								fmenu.css('left', __left_margin);
2513							}
2514					});
2515
2516					// select a static filter menu item
2517						el.on('click','p.filtering_static_val',function(){
2518
2519							BODY.trigger('evo_filter_static_clicked', [ el , $(this) ]);
2520												
2521						});
2522
2523					// select terms in filter menu
2524						el.on('click','p.evo_filter_val',function (){
2525
2526							var O = $(this);
2527							const filter_menuIN = O.closest('.evo_filter_inside'),
2528								filter_tax = filter_menuIN.data('tax'),
2529								filterbox = sortbox.find('.evo_filter_tax_box.'+ filter_tax),
2530								all_terms_obj = filter_menuIN.find('p'),
2531								new_term_id = O.data('id'),
2532								old_terms = el.evo_cal_get_filter_sub_data( filter_tax , 'terms' )
2533								;
2534							var tterms = el.evo_cal_get_filter_sub_data( filter_tax , 'nterms' );
2535
2536							var new_terms = [];
2537
2538
2539							// select filter type
2540							if( SC.filter_type == 'select' ){
2541
2542								// all value
2543								if( new_term_id == 'all' ){
2544									if( O.hasClass('select') ){
2545										all_terms_obj.removeClass('select');
2546									}else{
2547										all_terms_obj.addClass('select');
2548										new_terms.push('all');
2549									}
2550								}else{
2551									// unselect all value
2552									filter_menuIN.find('p.all').removeClass('select');
2553									O.toggleClass('select');	
2554
2555									var unselect_count = 0;
2556									all_terms_obj.each(function(){
2557										if( $(this).hasClass('select')){
2558											new_terms.push( $(this).data('id') )
2559										}else{
2560											// not select
2561											if(!$(this).hasClass('all')) unselect_count++;
2562										}
2563									});	
2564
2565									// all selected
2566									if(unselect_count == 0){
2567										filter_menuIN.find('p.all').addClass('select');
2568										new_terms.push('all');
2569									}	
2570
2571									// if all field is not visible; nothing selected = all
2572									if( new_terms.length == 0 && O.parent().find('p.all').length == 0) 
2573										new_terms.push('all');
2574								}							
2575
2576							// non select type
2577							}else{ 
2578								// all value
2579								if( new_term_id == 'all' ){
2580									// if all is already selected
2581									if( O.hasClass('select')){
2582										new_terms.push('NOT-all');
2583										all_terms_obj.removeClass('select');
2584									}else{
2585										all_terms_obj.addClass('select');
2586										new_terms.push( new_term_id );
2587									}	
2588								}else{
2589									all_terms_obj.removeClass('select');
2590									O.addClass('select');
2591									new_terms.push( new_term_id );
2592								}
2593
2594								update_filter_data( filter_tax, new_terms );
2595
2596								// process selection @4.6.6
2597									if( tterms == new_terms ){
2598										close_filter_menu();
2599									}else{					
2600										cal_resets( el );
2601												
2602										el.evo_update_sc_from_filters();					
2603
2604										run_cal_ajax( el.attr('id') ,'none','filering');
2605																								
2606										close_filter_menu();
2607										O.removeClass('show');
2608									}
2609
2610								close_filter_menu();
2611								// mark hide of menu
2612								filterbox.removeClass('vis');
2613							}
2614							
2615							// show and hide apply filter button
2616								// if new terms = temp terms
2617									if( compare_terms( new_terms, tterms) ){
2618										filterbox.removeClass('chg');										
2619									}else{
2620										filterbox.addClass('chg');			
2621									}
2622									if( compare_terms( old_terms, new_terms) ){
2623										filterbox.removeClass('set');	
2624									}else{
2625										filterbox.addClass('set');
2626									}								
2627									
2628
2629								// changed filters
2630								var chg_filters = sortbox.find('.evo_filter_tax_box.chg').length;
2631								var set_count = sortbox.find('.evo_filter_tax_box.set').length;
2632								if( SC.filter_type == 'select' ) 
2633									( chg_filters > 0 ) ? show_apply_btns() : hide_apply_btns();
2634
2635
2636							// Filter highlighted indicator 
2637								if( !( el.hasClass('flhi') ) ){
2638
2639									const filter_btn = el.find('.evo-filter-btn');	
2640
2641									if( set_count > 0){
2642										filter_btn.find('em').html( set_count ).addClass('o');	
2643									}else{
2644										filter_btn.find('em').removeClass('o');			
2645									}			
2646								}
2647
2648
2649
2650							update_filter_data( filter_tax, new_terms , 'tterms');
2651
2652							run_filter_nav_check();
2653
2654						});
2655													
2656					// apply filters button
2657						el.on('click','.evo_filter_submit',function(){
2658
2659							el.evo_filters_update_from_temp( filter_line, el );
2660							
2661							cal_resets( el);
2662
2663							close_filter_menu(); // hide filter menu
2664
2665							// update filter item button
2666							sortbox.find('.filtering_set_val').removeClass('show');
2667
2668							el.evo_update_sc_from_filters();	// update shortcode from filters
2669							
2670							run_cal_ajax( el.attr('id'),'none','filering');
2671
2672							run_filter_nav_check();
2673						});
2674
2675					// clear filters
2676						el.on('click','.evo_filter_clear',function(){
2677								
2678							el.find('.evo_filter_tax_box').each(function(){
2679								const O = $(this),
2680									tax = O.data('tax'),
2681									terms = O.data('terms');
2682
2683								O.removeClass('set');
2684								O.find('.filtering_set_val').removeClass('set show');
2685								el.find('.evo-filter-btn em').removeClass('o');
2686
2687								close_filter_menu();
2688							});
2689
2690							// update all filters with default/ onload values @4.6.1
2691							$.each( all_cal_filter_data, function( tax, tdata){
2692								update_filter_data( tax, tdata.terms );
2693							} );
2694
2695
2696							hide_apply_btns(); // hide filter action buttons
2697							
2698							// update shortcode and run new ajax for events
2699							el.evo_update_sc_from_filters();					
2700							run_cal_ajax( el.attr('id'),'none','filering');
2701
2702							run_filter_nav_check();
2703						});
2704
2705					// click on filter navs
2706						el.on('click','.evo_filter_nav',function(){
2707							O = $(this);
2708
2709							_filter_bar = O.closest('.evo_filter_bar');
2710							_filter_container = _filter_bar.find('.evo_filter_container_in');
2711							_filter_line_width = _filter_bar.find('.eventon_filter_line')[0].scrollWidth;
2712							_filter_container_width = parseInt( _filter_container.width() ) + 0;
2713							_leftPos = _filter_container.scrollLeft();
2714							_scrollable_legth = _filter_line_width - _filter_container_width;
2715
2716							const scroll_length = _filter_container_width /2;
2717							
2718							// move right
2719							if( O.hasClass('evo_filter_r') ){
2720																		
2721								_filter_container.animate({scrollLeft:_leftPos + scroll_length},200);
2722								_filter_bar.find('.evo_filter_l').addClass('vis');
2723							// move left
2724							}else{
2725								sleft = (_leftPos - scroll_length < scroll_length) ? 0 :  _leftPos - scroll_length;
2726								_filter_container.animate({scrollLeft: sleft },200);											
2727							}
2728
2729							close_filter_menu();
2730
2731							setTimeout(function(){
2732								var _leftPos = _filter_container.scrollLeft();
2733								//console.log(_leftPos);
2734								if( _leftPos < 10){
2735									_filter_bar.find('.evo_filter_l').removeClass('vis');
2736									_filter_bar.find('.evo_filter_r').addClass('vis');
2737								}
2738
2739								if( _leftPos > ( _scrollable_legth - 5 ) ){
2740									_filter_bar.find('.evo_filter_r').removeClass('vis');
2741								}
2742							},200);
2743												
2744						});
2745
2746					// on window size change
2747					$(window).on('resize',function(){
2748						run_filter_nav_check();
2749					});
2750				}
2751
2752				var compare_terms = function(a, b){
2753					if (a === b) return true;
2754					if (a == null || b == null) return false;
2755					if (a.length !== b.length) return false;
2756
2757					for (var i = 0; i < a.length; ++i) {
2758					   if (a[i] !== b[i]) return false;
2759					}
2760					return true;
2761				}
2762				var close_filter_menu = function(){
2763					fmenu.html('').data('tax','');
2764				}
2765
2766				var show_apply_btns = function(){
2767					sortbox.find('.evo_filter_aply_btns').addClass('vis');	
2768				}
2769				var hide_apply_btns = function(){
2770					sortbox.find('.evo_filter_aply_btns').removeClass('vis');		
2771				}
2772
2773				var update_filter_data = function(tax, new_val, key){
2774
2775					el.evo_cal_update_filter_data( tax , new_val , key );					
2776				}
2777
2778
2779				// adjust and position filter nav buttons
2780				var run_filter_nav_check = function(){
2781
2782					$.each( el.find('.evo_filter_bar') , function(event){
2783						_filter_bar = $(this);
2784						_filter_container = _filter_bar.find('.evo_filter_container_in');
2785						_filter_line_width = _filter_bar.find('.eventon_filter_line')[0].scrollWidth;
2786						_filter_container_width = parseInt( _filter_container.width() ) + 3;
2787						var leftPos = _filter_container.scrollLeft();
2788
2789						//console.log(_filter_line_width +' '+ _filter_container_width +' '+leftPos);
2790
2791						// filter line is not showing full
2792						if( _filter_line_width > _filter_container_width ){
2793
2794							// if some of filter line is hidden on right
2795							if( ( _filter_container_width + leftPos  ) < _filter_line_width )
2796								_filter_bar.find('.evo_filter_r').addClass('vis');
2797
2798							// if filter has been scrolled
2799							if( leftPos > 0 ){
2800								_filter_bar.find('.evo_filter_l').addClass('vis');
2801							}else{
2802								_filter_bar.find('.evo_filter_r').addClass('vis');
2803							}
2804						}else{
2805							_filter_bar.find('.evo_filter_l').removeClass('vis');
2806							_filter_bar.find('.evo_filter_r').removeClass('vis');
2807						}
2808
2809					});
2810
2811					//console.log(filter_line_width +' '+ filter_container_width +' '+leftPos);					
2812				}
2813
2814				init();
2815			}
2816
2817			// for each tax move tterms value to nterms / before sending ajax
2818			$.fn.evo_filters_update_from_temp = function(filter_line, cal){
2819				// move temp term values into new terms
2820					filter_line.find('.evo_filter_tax_box').each(function(){
2821						var taxonomy = $(this).data('tax');
2822						const tterms = cal.evo_cal_get_filter_sub_data( taxonomy , 'tterms');
2823
2824						cal.evo_cal_update_filter_data( taxonomy , tterms, 'nterms');
2825
2826						$(this).removeClass('chg');
2827					});
2828			}
2829				
2830
2831	// PRIMARY hook to get content	 
2832		// MAIN AJAX for calendar events v2.8
2833		function run_cal_ajax( cal_id, direction, ajaxtype){
2834			
2835			// identify the calendar and its elements.
2836			var CAL = ev_cal = $('#'+cal_id); 
2837
2838			// check if ajax post content should run for this calendar or not			
2839			if(CAL.attr('data-runajax')!='0'){
2840
2841				// category filtering for the calendar
2842				var cat = CAL.find('.evcal_sort').attr('cat');
2843
2844				// reset paged values for switching months
2845				if(ajaxtype=='switchmonth'){
2846					CAL.find('.cal_arguments').attr('data-show_limit_paged',1);
2847					CAL.evo_update_cal_sc({F:'show_limit_paged', V: '1'});
2848				}	
2849
2850				SC = CAL.evo_cal_functions({action:'load_shortcodes'});
2851
2852				$('body').trigger('evo_main_ajax_before', [CAL, ajaxtype, direction, SC]);		
2853
2854				var data_arg = {
2855					//action: 		'eventon_get_events',
2856					direction: 		direction,
2857					shortcode: 		SC,
2858					ajaxtype: 		ajaxtype,
2859					nonce: 			evo_general_params.n,
2860					nonceX: 		evo_general_params.nonce
2861				};	
2862
2863				EVENTS_LIST = CAL.find('.eventon_events_list');
2864
2865				$.ajax({
2866					// preload actions
2867					beforeSend: function(xhr){
2868						xhr.setRequestHeader('X-WP-Nonce', evo_general_params.nonce );
2869
2870						CAL.addClass('evo_loading');
2871
2872						// paged -- adding events to end
2873						if(ajaxtype == 'paged'){
2874							txt = EVENTS_LIST.find('.evoShow_more_events').html();
2875							EVENTS_LIST.find('.evoShow_more_events').html('. . .').data('txt',txt);
2876						}else{
2877
2878							html = evo_general_params.html.preload_events;
2879							if( SC.tiles == 'yes') html = evo_general_params.html.preload_event_tiles;
2880
2881							EVENTS_LIST.html( html );
2882							//EVENTS_LIST.slideUp('fast');
2883						}	
2884
2885						// maintain scrolltop location 4.6
2886						if( CAL.hasClass('nav_from_foot')){
2887							
2888							//scrolltop = (CAL.find('.evo_footer_nav').offset().top) - CAL.data('viewport_top');
2889							scrolltop = CAL.offset().top;
2890							$('html, body').animate({	scrollTop: scrolltop	},20);
2891						}	
2892
2893						$('body').trigger('evo_main_ajax_before_fnc',[CAL, ajaxtype, data_arg ]);	//s4.6			
2894					},
2895					type: 'POST', url: get_ajax_url('eventon_get_events'),data: data_arg,dataType:'json',
2896					success:function(data){
2897						if(!data) return false;
2898
2899						// paged calendar
2900						if(ajaxtype == 'paged'){	
2901							EVENTS_LIST.find('.evoShow_more_events').remove();
2902							EVENTS_LIST.find('.clear').remove();
2903
2904
2905							EVENTS_LIST.append( data.html + "<div class='clear'></div>");
2906
2907							// hide show more events if all events loaded
2908							var events_in_list = EVENTS_LIST.find('.eventon_list_event').length;
2909							if( 'total_events' in data && data.total_events == events_in_list){
2910								EVENTS_LIST.find('.evoShow_more_events').hide();
2911							}	
2912
2913							// for month lists duplicate headers // @+2.8.1
2914							var T = {};
2915							EVENTS_LIST.find('.evcal_month_line').each(function(){
2916								d = $(this).data('d');
2917								if( T[d]) 
2918									$(this).remove();
2919								else
2920									T[d] = true;
2921							});
2922
2923							var T = {};
2924							EVENTS_LIST.find('.sep_month_events').each(function(){
2925								d = $(this).data('d');
2926								if( T[d]){
2927									var H = $(this).html();
2928									EVENTS_LIST.find('.sep_month_events[data-d="'+d+'"]').append( H );
2929									$(this).remove();
2930								}else{T[d] = true;}
2931							});
2932							
2933						}else{
2934							EVENTS_LIST.html(data.html);
2935						}
2936
2937						
2938						// update calendar data
2939						CAL.find('.evo_month_title').html( data.cal_month_title );
2940
2941						CAL.evo_cal_functions({action:'update_shortcodes',SC: data.SC});
2942						CAL.evo_cal_functions({action:'update_json',json: data.json});
2943
2944						// run cal process code
2945						CAL.evo_calendar({
2946							SC: data.SC,
2947							json: data.json
2948						});
2949							
2950
2951						$('body').trigger('calendar_month_changed',[CAL, data]);
2952						
2953						$('body').trigger('evo_main_ajax_success', [CAL, ajaxtype, data, data_arg]);
2954															
2955					},complete:function(data){
2956
2957						// show events list events if not set to hide on load
2958						if(! EVENTS_LIST.hasClass('evo_hide')) EVENTS_LIST.delay(300).slideDown('slow');
2959						
2960						// maintain scrolltop location 4.6
2961						if( CAL.hasClass('nav_from_foot')){
2962							
2963							setTimeout(function(){
2964								//scrolltop = (CAL.find('.evo_footer_nav').offset().top) - CAL.data('viewport_top');
2965								scrolltop = CAL.offset().top;
2966								$('html, body').animate({	scrollTop: scrolltop	},20);
2967								CAL.removeClass('nav_from_foot');
2968							},302);														
2969						}					
2970
2971						// pluggable
2972						$('body').trigger('evo_main_ajax_complete', [CAL, ajaxtype, data.responseJSON , data_arg]);
2973						CAL.removeClass('evo_loading');
2974					}
2975				});
2976			}			
2977		}
2978
2979		$('body').on('evo_run_cal_ajax',function(event,cal_id, direction, ajaxtype){
2980			run_cal_ajax( cal_id, direction, ajaxtype);
2981		});
2982
2983		// deprecated bridge function for sortby value 
2984		function ajax_post_content(sortby, cal_id, direction, ajaxtype){
2985			run_cal_ajax( cal_id, direction, ajaxtype);
2986		}
2987	
2988		
2989	// SINGLE EVENTS
2990		// Loading single event json based content
2991			$('body').on('evo_load_single_event_content', function(event, eid, obj){
2992				var ajaxdataa = {};
2993				ajaxdataa['eid'] = eid;
2994				ajaxdataa['nonce'] = the_ajax_script.postnonce;	
2995
2996				// pass on other event values
2997				if(obj.data('j')){
2998					$.each(obj.data('j'), function(index,val){
2999						ajaxdataa[ index] = val;
3000					});
3001				}			
3002				
3003				$.ajax({
3004					beforeSend: function(){ 	},	
3005					url:	get_ajax_url('eventon_load_event_content'),
3006					data: 	ajaxdataa,	dataType:'json', type: 	'POST',
3007					success:function(data){
3008						$('body').trigger('evo_single_event_content_loaded', [data, obj]);
3009					},complete:function(){ 	}
3010				});
3011			});
3012	
3013		if(BODY.evo_is_mobile()){
3014			if($('body').find('.fb.evo_ss').length != 0){
3015				$('body').find('.fb.evo_ss').each(function(){
3016					obj = $(this);
3017					obj.attr({'href':'http://m.facebook.com/sharer.php?u='+obj.attr('data-url')});
3018				});
3019			}
3020		}
3021
3022		// on single event page
3023		if($('body').find('.evo_sin_page').length>0){
3024			$('.evo_sin_page').each(function(){
3025				$('body').trigger('evo_load_single_event_content',[ $(this).data('eid'), $(this)]);
3026				$(this).find('.desc_trig ').attr({'data-ux_val':'none'});
3027			});
3028		}
3029		
3030		// Single events box
3031			// Click on single event box
3032				$('.eventon_single_event').on('click', '.evcal_list_a',function(event){
3033					var obj = $(this);	
3034					const $this = $(this);			
3035					var CAL = obj.closest('.ajde_evcal_calendar');
3036					var SC = CAL.evo_shortcode_data();
3037
3038					var uxVal = SC.ux_val;
3039
3040					event.preventDefault();
3041					
3042					// open in event page
3043					if(uxVal == 4){ 
3044						var url = obj.parent().siblings('.evo_event_schema').find('[itemprop=url]').attr('href');
3045						window.location.href= url;
3046					}else if(uxVal == '2'){ // External Link
3047						var url = SC.exturl;
3048						window.location.href= url;
3049					}else if(uxVal == '1'){ // Slide Down
3050						const $eventBox = $this.closest('.eventon_list_event');
3051						const $content = $eventBox.find('.event_description');
3052			            const isOpen = $content.hasClass('open');
3053			            const B = $('body');
3054			            $eventBox.toggleClass('open', !isOpen);
3055			            $content[isOpen ? 'slideUp' : 'slideDown']().toggleClass('open', !isOpen);
3056			            if ($eventBox.find('.evo_metarow_gmap').length) {
3057			                $eventBox.find('.evo_metarow_gmap').evo_load_gmap({ trigger_point: 'slideDownCard' });
3058			            }
3059			            if ($trigger.data('runjs')) {
3060			                B.trigger('evo_load_single_event_content', [event_id, $trigger]);
3061			            }
3062			            B.trigger('evo_slidedown_eventcard_complete', [event_id, $trigger, !isOpen]);
3063			            return false;
3064
3065
3066
3067					}else if(uxVal == 'X'){ // do not do anything
3068						return false;
3069					}
3070				});
3071			// each single event box
3072				$('body').find('.eventon_single_event').each(function(){
3073					var _this = $(this);
3074
3075					var CAL = _this.closest('.ajde_evcal_calendar');
3076					var SC = CAL.evo_shortcode_data();	
3077					var evObj = CAL.find('.eventon_list_event');									
3078
3079					// show expanded eventCard
3080					if( SC.expanded =='yes'){
3081						_this.find('.evcal_eventcard').show();
3082						var idd = _this.find('.evcal_gmaps');						
3083
3084						// close button
3085						_this.find('.evcal_close').parent().css({'padding-right':0});
3086						_this.find('.evcal_close').hide();
3087
3088						//console.log(idd);
3089						var obj = _this.find('.desc_trig');
3090
3091						// Google Map
3092						_this.find('.evo_metarow_gmap').evo_load_gmap();
3093					
3094						// mark as eventcard open @since 4.4
3095						evObj.find('.event_description').addClass('open');
3096
3097					// open eventBox and lightbox	
3098					}else if(SC.uxval =='3'){
3099
3100						var obj = _this.find('.desc_trig');
3101						// remove other attr - that cause to redirect
3102						obj.removeAttr('data-exlk').attr({'data-ux_val':'3'});
3103					}
3104
3105					// show event excerpt
3106					var ev_excerpt = CAL.find('.event_excerpt').html();
3107					
3108					if(ev_excerpt!='' && ev_excerpt!== undefined && SC.excerpt =='yes' ){
3109						var appendation = '<div class="event_excerpt_in">'+ev_excerpt+'</div>'
3110						evObj.append(appendation);
3111					}
3112
3113					// trigger support @since 4.4
3114					var obj = evObj.find('.desc_trig');
3115					var event_id = evObj.data('event_id');
3116
3117
3118					$('body').trigger('evo_slidedown_eventcard_complete',[ event_id, obj]);	
3119				});
3120
3121// supportive
3122	// ajax url function  @u 4.5.5
3123		function get_ajax_url(action){
3124			var ajax_type = 'endpoint';
3125			if('ajax_method' in evo_general_params ) ajax_type = evo_general_params.ajax_method;
3126			return $('body').evo_get_ajax_url({a:action, type: 	ajax_type });
3127		}
3128	// handlebar additions
3129		function handlebar_additional_arguments(){
3130			Handlebars.registerHelper('ifE',function(v1, options){
3131				return (v1 !== undefined && v1 != '' && v1)
3132                    ? options.fn(this)
3133                    : options.inverse(this);
3134			});
3135
3136			Handlebars.registerHelper('ifEQ',function(v1, v2, options){
3137				return ( v1 == v2)? options.fn(this): options.inverse(this);
3138			});
3139			Handlebars.registerHelper('ifNEQ',function(v1, v2, options){
3140				return ( v1 != v2)? options.fn(this): options.inverse(this);
3141			});
3142			Handlebars.registerHelper('BUStxt',function(V, options){	
3143				if( !( V in BUS.txt) ) return V;
3144				return BUS.txt[V];
3145			});
3146			Handlebars.registerHelper('GetDMnames',function(V, U, options){				
3147				return BUS.dms[U][ V ];
3148			});
3149			// get total of increments
3150			Handlebars.registerHelper('forAdds',function(count, add_val, options){	
3151				O = '';
3152				for(x=1; x<= count; x++){	O += add_val;	}			
3153				return O;
3154			});
3155			Handlebars.registerHelper('GetEvProp',function(EID, PROP, CALID){
3156				EID = EID.split('-');	
3157				EV = $('#'+ CALID).find('.evo_cal_events').data('events');
3158				
3159				var O = '';
3160				$.each(EV, function(i,d){
3161					if( d.ID == EID[0] && d.ri == EID[1]){
3162						if( !(PROP in d.event_pmv)) return;
3163						O = d.event_pmv[PROP][0];
3164					}
3165				});
3166				return O;
3167			});
3168			Handlebars.registerHelper('GetEvV',function(EID, PROP, CALID){
3169				EID = EID.split('-');	
3170				EV = $('#'+ CALID).find('.evo_cal_events').data('events');
3171				
3172				var O = '';
3173				$.each(EV, function(i,d){
3174					if( d.ID == EID[0] && d.ri == EID[1]){
3175						O = d[PROP];
3176					}
3177				});
3178				return O;
3179			});
3180			Handlebars.registerHelper('COUNT',function( V){		
3181				return Object.keys(V).length;
3182			});
3183			Handlebars.registerHelper('CountlimitLess',function( AR, C,options){		
3184				var L= Object.keys(AR).length;
3185				return ( L < C)? options.inverse(this): options.fn(this);
3186			});
3187			Handlebars.registerHelper('ifCOND',function(v1, operator, v2, options){
3188				return checkCondition(v1, operator, v2)
3189	                ? options.fn(this)
3190	                : options.inverse(this);
3191			});
3192			Handlebars.registerHelper('toJSON', function(obj) {
3193			    return new Handlebars.SafeString(JSON.stringify(obj));
3194			});
3195			Handlebars.registerHelper('Cal_def_check',function(V, options){		
3196				if( BUS.cal_def && BUS.cal_def[V] ) return options.fn(this);
3197				return options.inverse(this);
3198			});
3199			Handlebars.registerHelper('TypeCheck',function(V, options){		
3200				if( options.type == V ) return options.fn(this);
3201				return options.inverse(this);
3202			});
3203		}
3204		function checkCondition(v1, operator, v2) {
3205	        switch(operator) {
3206	            case '==':
3207	                return (v1 == v2);
3208	            case '===':
3209	                return (v1 === v2);
3210	            case '!==':
3211	                return (v1 !== v2);
3212	            case '<':
3213	                return (v1 < v2);
3214	            case '<=':
3215	                return (v1 <= v2);
3216	            case '>':
3217	                return (v1 > v2);
3218	            case '>=':
3219	                return (v1 >= v2);
3220	            case '&&':
3221	                return (v1 && v2);
3222	            case '||':
3223	                return (v1 || v2);
3224	            default:
3225	                return false;
3226	        }
3227	    }
3228
3229
3230// DEPRECATING 
3231	// LIGHTBOX		
3232		// since 4.2 moving to functions
3233		// open lightbox @2.9
3234			BODY.on('evo_open_lightbox',function(event, lb_class, content){
3235				const LIGHTBOX = $('.evo_lightbox.'+lb_class).eq(0);
3236
3237				// if already open
3238				if(LIGHTBOX.is("visible")===true) return false;
3239
3240				if( content != ''){
3241					LIGHTBOX.find('.evo_lightbox_body').html( content );
3242				}
3243				BODY.trigger('evolightbox_show', [ lb_class ]);
3244			});
3245
3246		// click outside close LB
3247			BODY.on('clicked_on_page', function(event, obj, ev ){
3248				if( obj.hasClass('evo_content_inin')){
3249					closing_lightbox( obj.closest('.evo_lightbox') );
3250				}
3251			});
3252
3253		// close popup
3254			BODY.on('click','.evolbclose', function(){	
3255				if( $(this).hasClass('evolb_close_btn')) return;
3256				LIGHTBOX = 	$(this).closest('.evo_lightbox');
3257				closing_lightbox( LIGHTBOX );				
3258			});
3259
3260		// close with click outside popup box when pop is shown						
3261			function closing_lightbox( lightboxELM){
3262				
3263				if(! lightboxELM.hasClass('show')) return false;
3264				Close = (lightboxELM.parent().find('.evo_lightbox.show').length == 1)? true: false;
3265				lightboxELM.removeClass('show');
3266
3267				$('body').trigger('lightbox_before_event_closing', [lightboxELM]);
3268
3269				setTimeout( function(){ 
3270					lightboxELM.find('.evo_lightbox_body').html('');
3271					
3272					if(Close){
3273						$('body').removeClass('evo_overflow');
3274						$('html').removeClass('evo_overflow');
3275					}
3276					
3277					// trigger action to hook in at this stage
3278						$('body').trigger('lightbox_event_closing', [lightboxELM]);
3279				}, 100);
3280			}
3281
3282		// when lightbox open triggered
3283			$('body').on('evolightbox_show',function(event, lb_class){
3284				$('.evo_lightboxes').show();
3285				$('body').addClass('evo_overflow');
3286				$('html').addClass('evo_overflow');
3287
3288				$('body').trigger('evolightbox_opened',[ lb_class ]);
3289			});
3290
3291
3292});

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.