PageSourceSearch

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

js thepapcorps.org collected 2026-10-02 20:03:17 UTC 116,285 bytes, 3,260 lines download raw bytes

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

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.