PageSourceSearch

https://www.acad-ciencias.pt/wp-content/plugins/modern-events-calendar/assets/js/events.js?ver=7.34.2

js acad-ciencias.pt collected 2026-09-25 08:55:19 UTC 56,107 bytes, 1,626 lines download raw bytes

1// Set datepicker default value.
2var datepicker_format = 'yy-mm-dd';
3
4function mecEnhanceDatepickerAccessibility($inputs)
5{
6    if(!$inputs || !$inputs.length) return;
7
8    $inputs.attr('aria-haspopup', 'dialog');
9    $inputs.off('focus.mecDatepickerA11y').on('focus.mecDatepickerA11y', function()
10    {
11        window.setTimeout(function()
12        {
13            var $datepicker = jQuery('#ui-datepicker-div');
14            if(!$datepicker.length) return;
15
16            $datepicker.attr({
17                role: 'dialog',
18                'aria-live': 'polite',
19                'aria-label': (typeof mecdata !== 'undefined' && mecdata.a11y_calendar_dialog) ? mecdata.a11y_calendar_dialog : 'Calendar date picker'
20            });
21        }, 0);
22    });
23}
24
25jQuery(document).ready(function($)
26{
27    // Image picker on terms menu
28    $('.mec_upload_image_button').click(function(event)
29    {
30        event.preventDefault();
31
32        var real_ajax_url = wp.ajax.settings.url;
33        wp.ajax.settings.url = real_ajax_url + '?mec_fes=1';
34
35        var post_id = $(this).data('post-id');
36        if(post_id && post_id !== -1) wp.media.model.settings.post.id = post_id;
37        if(post_id === -1) wp.media.model.settings.post.id = null;
38
39        var preview_id = 'mec_thumbnail_img';
40        var input_id = 'mec_thumbnail';
41
42        if($(this).data('preview-id')) preview_id = $(this).data('preview-id');
43        if($(this).data('input-id')) input_id = $(this).data('input-id');
44
45        var frame;
46        if(frame)
47        {
48            frame.open();
49            return;
50        }
51
52        frame = wp.media();
53        frame.on('select', function()
54        {
55            // Grab the selected attachment.
56            var attachment = frame.state().get('selection').first();
57
58            $('#'+preview_id).html('<img src="'+attachment.attributes.url+'" alt="Featured image preview" style="max-width: 100%;" />');
59            $('#'+input_id).val(attachment.attributes.url);
60
61            $('.mec_remove_image_button').toggleClass('mec-util-hidden');
62
63            frame.close();
64        });
65
66        frame.open();
67    });
68
69    // Image remover on terms menu
70    $('.mec_remove_image_button').click(function(event)
71    {
72        event.preventDefault();
73
74        var preview_id = 'mec_thumbnail_img';
75        var input_id = 'mec_thumbnail';
76
77        if($(this).data('preview-id')) preview_id = $(this).data('preview-id');
78        if($(this).data('input-id')) input_id = $(this).data('input-id');
79
80        $('#'+preview_id).html('');
81        $('#'+input_id).val('');
82
83        $('.mec_remove_image_button').toggleClass('mec-util-hidden');
84    });
85
86    // Image picker on add event menu for location
87    $('.mec_location_upload_image_button').click(function(event)
88    {
89        event.preventDefault();
90
91        var frame;
92        if(frame)
93        {
94            frame.open();
95            return;
96        }
97
98        frame = wp.media();
99        frame.on('select', function()
100        {
101            // Grab the selected attachment.
102            var attachment = frame.state().get('selection').first();
103
104            $('#mec_location_thumbnail_img').html('<img src="'+attachment.attributes.url+'" />');
105            $('#mec_location_thumbnail').val(attachment.attributes.url);
106
107            $('.mec_location_remove_image_button').toggleClass('mec-util-hidden');
108
109            frame.close();
110        });
111
112        frame.open();
113    });
114
115    // Image remover on add event menu for location
116    $('.mec_location_remove_image_button').click(function(event)
117    {
118        event.preventDefault();
119
120        $('#mec_location_thumbnail_img').html('');
121        $('#mec_location_thumbnail').val('');
122
123        $('.mec_location_remove_image_button').toggleClass('mec-util-hidden');
124    });
125
126    // Image picker on add event menu for organizer
127    $('.mec_organizer_upload_image_button').click(function(event)
128    {
129        event.preventDefault();
130
131        var frame;
132        if(frame)
133        {
134            frame.open();
135            return;
136        }
137
138        frame = wp.media();
139        frame.on('select', function()
140        {
141            // Grab the selected attachment.
142            var attachment = frame.state().get('selection').first();
143
144            $('#mec_organizer_thumbnail_img').html('<img src="'+attachment.attributes.url+'" />');
145            $('#mec_organizer_thumbnail').val(attachment.attributes.url);
146
147            $('.mec_organizer_remove_image_button').toggleClass('mec-util-hidden');
148
149            frame.close();
150        });
151
152        frame.open();
153    });
154
155    // Image remover on add event menu for organizer
156    $('.mec_organizer_remove_image_button').click(function(event)
157    {
158        event.preventDefault();
159
160        $('#mec_organizer_thumbnail_img').html('');
161        $('#mec_organizer_thumbnail').val('');
162
163        $('.mec_organizer_remove_image_button').toggleClass('mec-util-hidden');
164    });
165
166    // Image remover on frontend event submission menu
167    $('#mec_fes_remove_image_button').click(function(event)
168    {
169        event.preventDefault();
170
171        $('#mec_fes_thumbnail_img').html('');
172        $('#mec_fes_thumbnail').val('');
173        $('#mec_featured_image_file').val('');
174
175        $('#mec_fes_remove_image_button').addClass('mec-util-hidden');
176    });
177
178    // Location Image remover on frontend event submission menu
179    $('#mec_fes_location_remove_image_button').click(function(event)
180    {
181        event.preventDefault();
182
183        $('#mec_fes_location_thumbnail_img').html('');
184        $('#mec_fes_location_thumbnail').val('');
185        $('#mec_fes_location_thumbnail_file').val('');
186
187        $('#mec_fes_location_remove_image_button').addClass('mec-util-hidden');
188    });
189
190    // Organizer Image remover on frontend event submission menu
191    $('#mec_fes_organizer_remove_image_button').click(function(event)
192    {
193        event.preventDefault();
194
195        $('#mec_fes_organizer_thumbnail_img').html('');
196        $('#mec_fes_organizer_thumbnail').val('');
197        $('#mec_fes_organizer_thumbnail_file').val('');
198
199        $('#mec_fes_organizer_remove_image_button').addClass('mec-util-hidden');
200    });
201
202    // Sponsor Image remover on frontend event submission menu
203    $('#mec_fes_sponsor_remove_image_button').click(function(event)
204    {
205        event.preventDefault();
206
207        $('#mec_fes_sponsor_thumbnail_img').html('');
208        $('#mec_fes_sponsor_thumbnail').val('');
209        $('#mec_fes_sponsor_thumbnail_file').val('');
210
211        $('#mec_fes_sponsor_remove_image_button').addClass('mec-util-hidden');
212    });
213
214    // Speaker Image remover on frontend event submission menu
215    $('#mec_fes_speaker_remove_image_button').click(function(event)
216    {
217        event.preventDefault();
218
219        $('#mec_fes_speaker_thumbnail_img').html('');
220        $('#mec_fes_speaker_thumbnail').val('');
221        $('#mec_fes_speaker_thumbnail_file').val('');
222
223        $('#mec_fes_speaker_remove_image_button').addClass('mec-util-hidden');
224    });
225
226    var date_splite;
227    if(typeof mec_admin_localize !== 'undefined')
228    {
229        date_splite = mec_admin_localize.datepicker_format.split('&');
230        if(date_splite[0] !== undefined && date_splite.length == 2) datepicker_format = date_splite[0];
231    }
232    else if(typeof mecdata !== 'undefined')
233    {
234        date_splite = mecdata.datepicker_format.split( '&' );
235        if(date_splite[0] !== undefined && date_splite.length == 2) datepicker_format = date_splite[0];
236    }
237
238    $('[id^="mec-book-form-btn-step"]').on('click',function()
239    {
240        setTimeout(function()
241        {
242            if($.fn.datepicker)
243            {
244                if('date' !== $('.mec-date-picker').prop('type'))
245                {
246                    $('.mec-date-picker').datepicker(
247                    {
248                        changeYear: true,
249                        changeMonth: true,
250                        dateFormat: datepicker_format,
251                        gotoCurrent: true,
252                        yearRange: 'c-3:c+5',
253                    });
254                }
255
256            }
257        }, 1000);
258    });
259
260    if($.fn.datepicker)
261    {
262        mecEnhanceDatepickerAccessibility($('.mec-date-picker, .mec_date_picker_dynamic_format, .mec_date_picker, .mec_date_picker_dynamic_format_start, .mec_date_picker_dynamic_format_end, #mec_start_date, #mec_end_date, #mec_date_repeat_end_at_date'));
263
264        $('.mec-date-picker').datepicker(
265        {
266            changeYear: true,
267            changeMonth: true,
268            dateFormat: datepicker_format,
269            gotoCurrent: true,
270            yearRange: 'c-3:c+5',
271        });
272
273        $('#mec_start_date').datepicker(
274        {
275            changeYear: true,
276            changeMonth: true,
277            dateFormat: datepicker_format,
278            gotoCurrent: true,
279            yearRange: 'c-3:c+5',
280            onSelect: function(value, i)
281            {
282                const end = $("#mec_end_date");
283                if(value !== i.lastVal)
284                {
285                    end.datepicker("option", "minDate", value);
286                }
287
288                if(end.val() === '')
289                {
290                    end.val(value);
291                }
292            }
293        });
294
295        $('#mec_end_date').datepicker(
296        {
297            changeYear: true,
298            changeMonth: true,
299            dateFormat: datepicker_format,
300            gotoCurrent: true,
301            yearRange: 'c-3:c+5',
302            onSelect: function(value, i)
303            {
304                const start = $("#mec_start_date");
305                if(value !== i.lastVal)
306                {
307                    start.datepicker("option", "maxDate", value);
308                }
309
310                if(start.val() === '')
311                {
312                    start.val(value);
313                }
314            }
315        });
316
317        $('#mec_date_repeat_end_at_date').datepicker(
318        {
319            changeYear: true,
320            changeMonth: true,
321            dateFormat: datepicker_format,
322            gotoCurrent: true,
323            yearRange: 'c-3:c+5',
324        });
325
326        $('.mec_date_picker_dynamic_format').datepicker(
327        {
328            changeYear: true,
329            changeMonth: true,
330            dateFormat: datepicker_format,
331            gotoCurrent: true,
332            yearRange: 'c-3:c+5',
333        });
334
335        $('.mec_date_picker').datepicker(
336        {
337            changeYear: true,
338            changeMonth: true,
339            dateFormat: 'yy-mm-dd',
340            gotoCurrent: true,
341            yearRange: 'c-3:c+5',
342        });
343
344        $('.mec_date_picker_dynamic_format_start').datepicker(
345        {
346            changeYear: true,
347            changeMonth: true,
348            dateFormat: datepicker_format,
349            gotoCurrent: true,
350            yearRange: 'c-1:c+5',
351            onSelect: function(date)
352            {
353                var selectedDate;
354
355                try
356                {
357                    selectedDate = $.datepicker.parseDate(datepicker_format, date);
358                }
359                catch(e)
360                {
361                    selectedDate = new Date(date);
362                }
363
364                if(!(selectedDate instanceof Date) || isNaN(selectedDate.getTime())) return;
365
366                var endDate = new Date(selectedDate.getTime());
367
368                var $end_picker = $(this).next();
369                $end_picker.datepicker("option", "minDate", endDate);
370                $end_picker.datepicker("option", "maxDate", '+5y');
371
372                $(this).trigger('change');
373            }
374        });
375
376        $('.mec_date_picker_dynamic_format_end').datepicker(
377        {
378            changeYear: true,
379            changeMonth: true,
380            dateFormat: datepicker_format,
381            gotoCurrent: true,
382            yearRange: 'c-1:c+5',
383        });
384
385        trigger_period_picker();
386    }
387
388    // Initialize WP Color Picker
389    if($.fn.wpColorPicker) jQuery('.mec-color-picker').wpColorPicker();
390
391    $('#mec_location_id').on('change', function()
392    {
393        mec_location_toggle();
394    });
395
396    $('#mec_organizer_id').on('change', function()
397    {
398        mec_organizer_toggle();
399        var mec_organizer_val = parseInt($(this).val());
400        var mec_additional_organizer = $(this).parent().parent().find('#mec-additional-organizer-wrap');
401
402        if(mec_organizer_val != 1) mec_additional_organizer.show();
403        else mec_additional_organizer.hide();
404    });
405
406    mec_location_toggle();
407    mec_organizer_toggle();
408
409    $('#mec_repeat').on('change', function()
410    {
411        mec_repeat_toggle();
412    });
413
414    mec_repeat_toggle();
415
416    $('#mec_repeat_type').on('change', function()
417    {
418        mec_repeat_type_toggle();
419    });
420
421    mec_repeat_type_toggle();
422
423    $('#mec_bookings_limit_unlimited').on('change', function()
424    {
425        mec_bookings_unlimited_toggle();
426    });
427
428    $('#mec_add_in_days').on('click', function()
429    {
430        var allday = $(this).data('allday');
431
432        var start = $('#mec_exceptions_in_days_start_date').val();
433        if(start === '') return false;
434
435        var end = $('#mec_exceptions_in_days_end_date').val();
436        if(end === '') return false;
437
438        var start_hour = $('#mec_exceptions_in_days_start_hour').val();
439        if(start_hour.length === 1) start_hour = '0'+start_hour;
440
441        var start_minutes = $('#mec_exceptions_in_days_start_minutes').val();
442        if(start_minutes.length === 1) start_minutes = '0'+start_minutes;
443
444        var start_ampm = $('#mec_exceptions_in_days_start_ampm').val();
445        if(typeof start_ampm === 'undefined') start_ampm = '';
446
447        var end_hour = $('#mec_exceptions_in_days_end_hour').val();
448        if(end_hour.length === 1) end_hour = '0'+end_hour;
449
450        var end_minutes = $('#mec_exceptions_in_days_end_minutes').val();
451        if(end_minutes.length === 1) end_minutes = '0'+end_minutes;
452
453        var end_ampm = $('#mec_exceptions_in_days_end_ampm').val();
454        if(typeof end_ampm === 'undefined') end_ampm = '';
455
456        var value = start + ':' + end + ':' + start_hour + '-' + start_minutes + '-' + start_ampm + ':' + end_hour + '-' + end_minutes + '-' + end_ampm;
457        var label = start + ' <span class="mec-time-picker-label '+(allday ? 'mec-util-hidden' : '')+'">' + start_hour + ':' + start_minutes + ' ' + start_ampm + '</span> - ' + end + ' <span class="mec-time-picker-label '+(allday ? 'mec-util-hidden' : '')+'">' + end_hour + ':' + end_minutes + ' ' + end_ampm + '</span>';
458
459        // Don't add exactly same occurrences
460        if($('#mec_in_days input[value="'+value+'"]').length > 0) return false;
461
462        var $key = $('#mec_new_in_days_key');
463
464        var key = $key.val();
465        var html = $('#mec_new_in_days_raw').html().replace(/:i:/g, key).replace(/:val:
465/g, value).replace(/:label:/g, label);
466
467        $('#mec_in_days').append(html);
468        $key.val(parseInt(key)+1);
469    });
470
471    $('#mec_edit_in_days').on('click', function()
472    {
473        // Form
474        const $form = $('#mec-in-days-form');
475
476        const modify_id = $form.data('modify');
477        const $row = $('#mec_in_days_row'+modify_id);
478
479        var allday = $(this).data('allday');
480
481        var start = $('#mec_exceptions_in_days_start_date').val();
482        if(start === '') return false;
483
484        var end = $('#mec_exceptions_in_days_end_date').val();
485        if(end === '') return false;
486
487        var start_hour = $('#mec_exceptions_in_days_start_hour').val();
488        if(start_hour.length === 1) start_hour = '0'+start_hour;
489
490        var start_minutes = $('#mec_exceptions_in_days_start_minutes').val();
491        if(start_minutes.length === 1) start_minutes = '0'+start_minutes;
492
493        var start_ampm = $('#mec_exceptions_in_days_start_ampm').val();
494        if(typeof start_ampm === 'undefined') start_ampm = '';
495
496        var end_hour = $('#mec_exceptions_in_days_end_hour').val();
497        if(end_hour.length === 1) end_hour = '0'+end_hour;
498
499        var end_minutes = $('#mec_exceptions_in_days_end_minutes').val();
500        if(end_minutes.length === 1) end_minutes = '0'+end_minutes;
501
502        var end_ampm = $('#mec_exceptions_in_days_end_ampm').val();
503        if(typeof end_ampm === 'undefined') end_ampm = '';
504
505        var value = start + ':' + end + ':' + start_hour + '-' + start_minutes + '-' + start_ampm + ':' + end_hour + '-' + end_minutes + '-' + end_ampm;
506        var label = start + ' <span class="mec-time-picker-label '+(allday ? 'mec-util-hidden' : '')+'">' + start_hour + ':' + start_minutes + ' ' + start_ampm + '</span> - ' + end + ' <span class="mec-time-picker-label '+(allday ? 'mec-util-hidden' : '')+'">' + end_hour + ':' + end_minutes + ' ' + end_ampm + '</span>';
507
508        $row.find($('input[type=hidden]')).val(value);
509        $row.find($('.mec-in-days-day')).html(label);
510
511        // Reset Dates
512        $form.parent().find($('input[type=text]')).val('');
513
514        // Modification Mode
515        $form.removeClass('mec-in-days-edit-mode').addClass('mec-in-days-add-mode').removeData('modify');
516    });
517
518    $('#mec_cancel_in_days').on('click', function()
519    {
520        // Form
521        let $form = $('#mec-in-days-form');
522
523        // Reset Dates
524        $form.parent().find($('input[type=text]')).val('');
525
526        // Modification Mode
527        $form.removeClass('mec-in-days-edit-mode').addClass('mec-in-days-add-mode').removeData('modify');
528    });
529
530    $('#mec_add_not_in_days').on('click', function()
531    {
532        let date = $('#mec_exceptions_not_in_days_date').val();
533        if(date === '') return false;
534
535        let d = date.replaceAll('-', '');
536        d = d.replaceAll('/', '');
537        d = d.replaceAll('.', '');
538
539
540        let $wrapper = $('#mec_not_in_days');
541        let $key = $('#mec_new_not_in_days_key');
542
543        let c = 'mec-date-'+d;
544        if($wrapper.find($('.'+c)).length) return;
545
546        let key = $key.val();
547        let html = $('#mec_new_not_in_days_raw').html().replace(/:i:/g, key).replace(/:d:/g, d).replace(/:val:/g, date);
548
549        $wrapper.append(html);
550        $key.val(parseInt(key)+1);
551    });
552
553    $('#mec_add_ticket_button').on('click', function()
554    {
555        let $key = $('#mec_new_ticket_key');
556        let key = $key.val();
557        let html = $('#mec_new_ticket_raw').html().replace(/:i:/g, key);
558
559        $('#mec_tickets').append(html);
560        $key.val(parseInt(key)+1);
561
562        mec_init_sortable_sections();
563
564        $('.mec_add_price_date_button').off('click').on('click', function()
565        {
566            mec_handle_add_price_date_button(this);
567        });
568
569        $.each($(".mec-select2"), function(i,v)
570        {
571            if($(v).attr('name').search(":i:") > 0)
572            {
573                return;
574            }
575
576            if(typeof $(v).data('select2-id') == 'undefined')
577            {
578                $(v).select2();
579            }
580        });
581
582        trigger_period_picker();
583    });
584
585    $('.mec_add_price_date_button').off('click').on('click', function()
586    {
587        mec_handle_add_price_date_button(this);
588    });
589
590    mec_hourly_schedule_add_day_listener();
591    mec_init_sortable_sections();
592
593    $('#mec_add_fee_button').on('click', function()
594    {
595        var key = $('#mec_new_fee_key').val();
596        var html = $('#mec_new_fee_raw').html().replace(/:i:/g, key);
597
598        $('#mec_fees_list').append(html);
599        $('#mec_new_fee_key').val(parseInt(key)+1);
600
601        mec_init_sortable_sections();
602    });
603
604    $('#mec_add_ticket_variation_button').on('click', function()
605    {
606        var key = $('#mec_new_ticket_variation_key').val();
607        var html = $('#mec_new_ticket_variation_raw').html().replace(/:i:/g, key);
608
609        $('#mec_ticket_variations_list').append(html);
610        $('#mec_new_ticket_variation_key').val(parseInt(key)+1);
611
612        mec_init_sortable_sections();
613    });
614
615    $('.mec-form-row.mec-available-color-row span').on('click', function()
616    {
617        $('.mec-form-row.mec-available-color-row span').removeClass('color-selected');
618        $(this).addClass('color-selected');
619    });
620
621    $('#mec_reg_form_field_types button').on('click', function()
622    {
623        var type = $(this).data('type');
624
625        if (type == 'mec_email') {
626            if ($('#mec_reg_form_fields').find('input[value="mec_email"][type="hidden"]').length) {
627                return false;
628            }
629        }
630
631        if (type == 'name') {
632            if ($('#mec_reg_form_fields').find('input[value="name"][type="hidden"]').length) {
633                return false;
634            }
635        }
636
637        var key  = $('#mec_new_reg_field_key').val();
638        var html = $('#mec_reg_field_'+type).html().replace(/:i:/g, key);
639
640        $('#mec_reg_form_fields').append(html);
641        $('#mec_new_reg_field_key').val(parseInt(key)+1);
642
643        // Set onclick listener for add option fields
644        mec_reg_fields_option_listeners();
645        mec_refresh_booking_condition_editors('reg');
646    });
647
648    // Set onclick listener for add option fields
649    mec_reg_fields_option_listeners();
650    mec_refresh_booking_condition_editors('reg');
651
652    // Advanced Repeating
653    $('#mec-advanced-wraper ul > ul > li').click(function()
654    {
655        if($(this).attr('class') == '') $(this).attr('class', 'mec-active');
656        else $(this).attr('class', '');
657
658        $('#mec_date_repeat_advanced').val($('#mec-advanced-wraper div:first-child > ul').find('.mec-active').find('span').text().slice(0, -1));
659    });
660
661    $('#mec_event_form_field_types button').on('click', function()
662    {
663        var type = $(this).data('type');
664
665        var key  = $('#mec_new_event_field_key').val();
666        var html = $('#mec_event_field_'+type).html().replace(/:i:/g, key);
667
668        $('#mec_event_form_fields').append(html);
669        $('#mec_new_event_field_key').val(parseInt(key)+1);
670
671        // Set onclick listener for add option fields
672        mec_event_fields_option_listeners();
673    });
674
675    // Set onclick listener for add option fields
676    mec_event_fields_option_listeners();
677
678    $('#mec_bfixed_form_field_types button').on('click', function()
679    {
680        var type = $(this).data('type');
681
682        var key  = $('#mec_new_bfixed_field_key').val();
683        var html = $('#mec_bfixed_field_'+type).html().replace(/:i:/g, key);
684
685        $('#mec_bfixed_form_fields').append(html);
686        $('#mec_new_bfixed_field_key').val(parseInt(key)+1);
687
688        // Set onclick listener for add option fields
689        mec_bfixed_fields_option_listeners();
690        mec_refresh_booking_condition_editors('bfixed');
691    });
692
693    // Set onclick listener for add option fields
694    mec_bfixed_fields_option_listeners();
695    mec_refresh_booking_condition_editors('bfixed');
696
697    jQuery(document).on('change', '.mec-booking-condition-enabled, .mec-booking-condition-source, .mec-booking-condition-option', function()
698    {
699        const $trigger = jQuery(this);
700        const $conditionBox = jQuery(this).closest('.mec-booking-condition-box');
701        const prefix = String($conditionBox.data('conditionPrefix') || '');
702
703        if($trigger.hasClass('mec-booking-condition-source'))
704        {
705            $conditionBox.data('currentSourceFieldId', String($trigger.val() || ''));
706            $conditionBox.data('currentOptionKey', '');
707            $conditionBox.find('.mec-booking-condition-option').val('');
708        }
709        else if($trigger.hasClass('mec-booking-condition-option'))
710        {
711            $conditionBox.data('currentOptionKey', String($trigger.val() || ''));
712        }
713
714        mec_refresh_booking_condition_editor($conditionBox);
715        if(prefix) mec_refresh_booking_condition_editors(prefix);
716    });
717
718    jQuery(document).on('input change', '#mec_reg_form_fields input[name*="[label]"], #mec_bfixed_form_fields input[name*="[label]"]', function()
719    {
720        const $field = jQuery(this).closest('li[id^="mec_reg_fields_"], li[id^="mec_bfixed_fields_"]');
721        if($field.attr('id') && $field.attr('id').indexOf('mec_reg_fields_') === 0) mec_refresh_booking_condition_editors('reg');
722        if($field.attr('id') && $field.attr('id').indexOf('mec_bfixed_fields_') === 0) mec_refresh_booking_condition_editors('bfixed');
723    });
724
725    // Additional Organizers
726    mec_additional_organizers_listeners();
727
728    // Show / Hide Password
729    $('.mec-show-hide-password').on('click', function()
730    {
731        var $input = $(this).siblings("input");
732        var current = $input.attr('type');
733
734        if(current === 'password') $input.attr('type', 'text');
735        else $input.attr('type', 'password');
736    });
737
738    // FAQ
739    $('#mec_add_faq_button').on('click', function()
740    {
741        const $key = $('#mec_new_faq_key');
742        const key = $key.val();
743        const html = $('#mec_new_faq_raw').html().replace(/:i:/g, key);
744
745        $('#mec_faq_list').append(html);
746        $key.val(parseInt(key)+1);
747
748        mec_init_sortable_sections();
749    });
750
751    // Appointments
752    // Move the selector to the metabox header
753    var $header = $('#mec_metabox_details .hndle');
754    // If .hndle is not found, try .postbox-header (newer WP versions)
755    if ($header.length === 0) {
756        $header = $('#mec_metabox_details .postbox-header');
757    }
758    $('.mec-event-appointment-type-wrap').appendTo($header).removeClass('mec-util-hidden').on('click', function(e) {
759        e.stopPropagation();
760    });
761
762    $('#mec_entity_type_select').on('change', function()
763    {
764        const entity_type = $(this).val();
765        const $fes_form = $('#mec_fes_form');
766        const $metabox_details = $('#mec_metabox_details');
767        const $appointment_form_wrapper = $('.mec-appointment-form-wrap');
768
769        if (entity_type === 'appointment')
770        {
771            $fes_form.removeClass('mec-entity-type-event').addClass('mec-entity-type-appointment');
772            $metabox_details.removeClass('mec-entity-type-event').addClass('mec-entity-type-appointment');
773
774            $appointment_form_wrapper.removeClass('mec-util-hidden');
775        }
776        else
777        {
778            $fes_form.removeClass('mec-entity-type-appointment').addClass('mec-entity-type-event');
779            $metabox_details.removeClass('mec-entity-type-appointment').addClass('mec-entity-type-event');
780
781            $appointment_form_wrapper.addClass('mec-util-hidden');
782        }
783    });
784
785    $('#mec_entity_type_select').trigger('change');
786
787    const $repeatType = $('#mec_appointments_availability_repeat_type');
788    if($.fn.datepicker)
789    {
790        $('#mec_appointments_start_date').datepicker({
791            changeYear: true,
792            changeMonth: true,
793            dateFormat: datepicker_format,
794            gotoCurrent: true,
795            yearRange: 'c-3:c+5',
796        });
797    }
798    function mec_toggle_repeat_type()
799    {
800        const val = $repeatType.val();
801        if (val === 'no_repeat')
802        {
803            $('.lsd-apt-days-wrapper').addClass('mec-util-hidden');
804            $('.lsd-apt-adjusted-title').addClass('mec-util-hidden');
805            $('.lsd-apt-start-date-wrapper').addClass('mec-util-hidden');
806        }
807        else
808        {
809            $('.lsd-apt-days-wrapper').removeClass('mec-util-hidden');
810            $('.lsd-apt-adjusted-title').removeClass('mec-util-hidden');
811            $('.lsd-apt-start-date-wrapper').removeClass('mec-util-hidden');
812        }
813    }
814    $repeatType.on('change', mec_toggle_repeat_type);
815    mec_toggle_repeat_type();
816
817    $(document).on('click', '.lsd-apt-day-icon-remove', function()
818    {
819        const $button = $(this);
820        const $timeslot = $button.parent();
821        const $timeslots = $button.parents('.lsd-apt-day-timeslots');
822
823        $timeslot.remove();
824        if ($timeslots.find('.lsd-apt-day-timeslot-wrapper').length === 0)
825        {
826            $timeslots.find('.lsd-apt-day-timeslots-unavailable').removeClass('mec-util-hidden');
827        }
828    });
829
830    $(document).on('click', '.lsd-apt-day-icon-plus', function()
831    {
832        const $button = $(this);
833        let key = $button.data('key');
834
835        const $day = $button.parents('.lsd-apt-day-wrapper');
836        const day = $day.data('key');
837
838        const $timeslots = $day.find('.lsd-apt-day-timeslots-wrapper');
839        const $template = $('#lsd-apt-day-templates-'+day+'-timeslot');
840
841        key = key + 1;
842        const html = $template.html().replace(/:t:/g, key);
843        $timeslots.append(html);
844
845        $button.data('key', key);
846        $day.find('.lsd-apt-day-timeslots-unavailable').addClass('mec-util-hidden');
847    });
848
849    $(document).on('click', '.lsd-apt-day-icon-copy', function ()
850    {
851        const $button = $(this);
852        const $sourceDay = $button.closest('.lsd-apt-day-wrapper');
853        const sourceDayKey = $sourceDay.data('key');
854
855        const $weekWrapper = $sourceDay.parent();
856        const $sourceTimeslots = $sourceDay.find('.lsd-apt-day-timeslots-wrapper .lsd-apt-day-timeslot-wrapper');
857
858        $weekWrapper.find('.lsd-apt-day-wrapper').each(function ()
859        {
860            const $targetDay = $(this);
861
862            const targetDayKey = $targetDay.data('key');
863            if (targetDayKey === sourceDayKey) return;
864
865            const isActive = $targetDay.find('.lsd-apt-day-timeslots-wrapper .lsd-apt-day-timeslot-wrapper').length > 0;
866            if (!isActive) return;
867
868            const $targetWrapper = $targetDay.find('.lsd-apt-day-timeslots-wrapper');
869            $targetWrapper.empty();
870
871            $sourceTimeslots.each(function ()
872            {
873                const $sourceSlot = $(this);
874                const $clone = $sourceSlot.clone(true);
875
876                $sourceSlot.find('select').each(function (i) {
877                    const value = $(this).val();
878                    $clone.find('select').eq(i).val(value);
879                });
880
881                $sourceSlot.find('input').each(function (i) {
882                    const value = $(this).val();
883                    $clone.find('input').eq(i).val(value);
884                });
885
886                $clone.find('[name], [id], [for]').each(function ()
887                {
888                    $.each(this.attributes, function () {
889                        if (this.name === 'name' || this.name === 'id' || this.name === 'for') {
890                            this.value = this.value
891                            .replace(`[availability][${sourceDayKey}]`, `[availability][${targetDayKey}]`)
892                            .replace(`availability_${sourceDayKey}_`, `availability_${targetDayKey}_`);
893                        }
894                    });
895                });
896
897                $targetWrapper.append($clone);
898            });
899        });
900    });
901
902    $(document).on('click', '.lsd-apt-adjusted-day-add', function()
903    {
904        const $wrapper = $('.lsd-apt-adjusted-days-wrapper');
905        let key = $wrapper.data('key') || 0;
906
907        key = key + 1;
908        let html = $('#lsd-apt-adjusted-template-day').html();
909        html = html.replace(/:i:/g, key);
910
911        $wrapper.append(html);
912        $wrapper.data('key', key);
913
914        if($.fn.datepicker)
915        {
916            $wrapper.find('.mec-apt-date-picker').last().datepicker({
917                changeYear: true,
918                changeMonth: true,
919                dateFormat: datepicker_format,
920                gotoCurrent: true,
921                yearRange: 'c-3:c+5',
922            });
923        }
924    });
925
926    $(document).on('click', '.lsd-apt-adjusted-day-remove', function()
927    {
928        $(this).closest('.lsd-apt-day-wrapper').remove();
929    });
930
931    $(document).on('click', '.lsd-apt-adj-day-icon-plus', function()
932    {
933        const $button = $(this);
934        let key = $button.data('key');
935        const $day = $button.closest('.lsd-apt-day-wrapper');
936        const day = $day.data('day');
937        const $timeslots = $day.find('.lsd-apt-day-timeslots-wrapper');
938
939        key = key + 1;
940        let html = $('#lsd-apt-adjusted-template-timeslot').html();
941
942        html = html.replace(/:i:/g, day).replace(/:t:/g, key);
943        $timeslots.append(html);
944
945        $button.data('key', key);
946        $day.find('.lsd-apt-day-timeslots-unavailable').addClass('mec-util-hidden');
947    });
948});
949
950function trigger_period_picker()
951{
952    jQuery('.mec-date-picker-start').datepicker(
953    {
954        changeYear: true,
955        changeMonth: true,
956        dateFormat: 'yy-mm-dd',
957        gotoCurrent: true,
958        yearRange: 'c-1:c+5',
959        onSelect: function(date)
960        {
961            const selectedDate = new Date(date);
962            const endDate = new Date(selectedDate.getTime());
963
964            const $end_picker = jQuery(this).next();
965            $end_picker.datepicker("option", "minDate", endDate);
966            $end_picker.datepicker("option", "maxDate", '+5y');
967            jQuery(this).trigger('change');
968        }
969    });
970
971    jQuery('.mec-date-picker-end').datepicker(
972    {
973        changeYear: true,
974        changeMonth: true,
975        dateFormat: 'yy-mm-dd',
976        gotoCurrent: true,
977        yearRange: 'c-1:c+5',
978    });
979}
980
981function mec_location_toggle()
982{
983    if(jQuery('#mec_location_id').val() != '0') jQuery('#mec_location_new_container').hide();
984    else jQuery('#mec_location_new_container').show();
985}
986
987function mec_organizer_toggle()
988{
989    if(jQuery('#mec_organizer_id').val() != '0') jQuery('#mec_organizer_new_container').hide();
990    else jQuery('#mec_organizer_new_container').show();
991}
992
993function mec_repeat_toggle()
994{
995    if(jQuery('#mec_repeat').is(':checked')) jQuery('.mec-form-repeating-event-row').show();
996    else jQuery('.mec-form-repeating-event-row').hide();
997}
998
999function mec_repeat_type_toggle()
1000{
1001    var repeat_type = jQuery('#mec_repeat_type').val();
1002
1003    if(repeat_type == 'certain_weekdays')
1004    {
1005        jQuery('#mec_repeat_interval_container').hide();
1006        jQuery('#mec_repeat_certain_weekdays_container').show();
1007        jQuery('#mec_exceptions_in_days_container').hide();
1008        jQuery('#mec_end_wrapper').show();
1009        jQuery('#mec-advanced-wraper').hide();
1010    }
1011    else if(repeat_type == 'custom_days')
1012    {
1013        jQuery('#mec_repeat_interval_container').hide();
1014        jQuery('#mec_repeat_certain_weekdays_container').hide();
1015        jQuery('#mec_exceptions_in_days_container').show();
1016        jQuery('#mec_end_wrapper').hide();
1017        jQuery('#mec-advanced-wraper').hide();
1018    }
1019    else if(repeat_type == 'advanced')
1020    {
1021        jQuery('#mec_repeat_interval_container').hide();
1022        jQuery('#mec_repeat_certain_weekdays_container').hide();
1023        jQuery('#mec_exceptions_in_days_container').hide();
1024        jQuery('#mec_end_wrapper').show();
1025        jQuery('#mec-advanced-wraper').show();
1026    }
1027    else if(repeat_type != 'daily' && repeat_type != 'weekly' && repeat_type != 'monthly')
1028    {
1029        jQuery('#mec_repeat_interval_container').hide();
1030        jQuery('#mec_repeat_certain_weekdays_container').hide();
1031        jQuery('#mec_exceptions_in_days_container').hide();
1032        jQuery('#mec_end_wrapper').show();
1033        jQuery('#mec-advanced-wraper').hide();
1034    }
1035    else
1036    {
1037        jQuery('#mec_repeat_interval_container').show();
1038        jQuery('#mec_repeat_certain_weekdays_container').hide();
1039        jQuery('#mec_exceptions_in_days_container').hide();
1040        jQuery('#mec_end_wrapper').show();
1041        jQuery('#mec-advanced-wraper').hide();
1042    }
1043}
1044
1045function mec_in_days_remove(i)
1046{
1047    jQuery('#mec_in_days_row'+i).remove();
1048}
1049
1050function mec_in_days_edit(i)
1051{
1052    // Date
1053    let $row = jQuery('#mec_in_days_row'+i);
1054    let value = $row.find(jQuery('input[type=hidden]')).val();
1055
1056    const values = value.split(':');
1057    const start_times = values[2].split('-')
1058    const end_times = values[3].split('-')
1059
1060    // Form
1061    let $form = jQuery('#mec-in-days-form');
1062
1063    // Set Dates
1064    jQuery('#mec_exceptions_in_days_start_date').val(values[0]);
1065    jQuery('#mec_exceptions_in_days_end_date').val(values[1]);
1066
1067    // Set Times
1068    jQuery('#mec_exceptions_in_days_start_hour').val(parseInt(start_times[0]));
1069    jQuery('#mec_exceptions_in_days_start_minutes').val(parseInt(start_times[1]));
1070    jQuery('#mec_exceptions_in_days_start_ampm').val(start_times[2]);
1071
1072    jQuery('#mec_exceptions_in_days_end_hour').val(parseInt(end_times[0]));
1073    jQuery('#mec_exceptions_in_days_end_minutes').val(parseInt(end_times[1]));
1074    jQuery('#mec_exceptions_in_days_end_ampm').val(end_times[2]);
1075
1076    // Modification Mode
1077    $form.removeClass('mec-in-days-add-mode').addClass('mec-in-days-edit-mode').data('modify', i);
1078}
1079
1080function mec_not_in_days_remove(i)
1081{
1082    jQuery('#mec_not_in_days_row'+i).remove();
1083}
1084
1085function mec_bookings_unlimited_toggle()
1086{
1087    jQuery('#mec_bookings_limit').toggleClass('mec-util-hidden');
1088}
1089
1090function mec_hourly_schedule_add_day_listener()
1091{
1092    jQuery('.mec-add-hourly-schedule-day-button').each(function()
1093    {
1094        jQuery(this).off('click').on('click', function()
1095        {
1096            var k = jQuery(this).data('key');
1097            var raw = jQuery(this).data('raw');
1098            var append = jQuery(this).data('append');
1099
1100            var key = jQuery(k).val();
1101            var html = jQuery(raw).html().replace(/:d:/g, key).replace(/:dd:/g, parseInt(key)+1);
1102
1103            jQuery(append).append(html);
1104            jQuery(k).val(parseInt(key)+1);
1105
1106            mec_hourly_schedule_listeners();
1107        });
1108
1109        mec_hourly_schedule_listeners();
1110    });
1111}
1112
1113function mec_bookings_after_occurrence_cancel_listener()
1114{
1115    jQuery('.mec-occurrences-bookings-after-occurrences-cancel').off('change').on('change', function()
1116    {
1117        const $dropdown = jQuery(this);
1118        const value = $dropdown.val();
1119        const $moveWrapper = $dropdown.next();
1120
1121        if(value === 'move' || value === 'move_notify')
1122        {
1123            $moveWrapper.removeClass('w-hidden');
1124        }
1125        else
1126        {
1127            $moveWrapper.addClass('w-hidden');
1128        }
1129    });
1130}
1131
1132function mec_hourly_schedule_listeners()
1133{
1134    jQuery('.mec-add-hourly-schedule-button').off('click').on('click', function()
1135    {
1136        var prefix = jQuery(this).data('prefix');
1137        var day = jQuery(this).data('day');
1138        var $key = jQuery('#'+prefix+'mec_new_hourly_schedule_key'+day);
1139
1140        var key = $key.val();
1141        var html = jQuery('#'+prefix+'mec_new_hourly_schedule_raw'+day).html().replace(/:i:/g, key).replace(/:d:/g, day).replace();
1142        var g_field_id = prefix+"-hourly_schedules-"+day+"-schedules-:i:-description";
1143        var field_id = prefix+"-hourly_schedules-"+day+"-schedules-"+key+"-description";
1144        html = html.replace(g_field_id,field_id);
1145        html = html.replace(':k:',key);
1146        jQuery('#'+prefix+'mec_hourly_schedules'+day).append(html);
1147        $key.val(parseInt(key)+1);
1148
1149        wp.editor.initialize("mec"+field_id,{
1150            tinymce: {
1151                wpautop: true,
1152                plugins : 'charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview',
1153                toolbar1: 'bold italic underline strikethrough | bullist numlist | blockquote hr wp_more | alignleft aligncenter alignright | link unlink | fullscreen | wp_adv',
1154                toolbar2: 'formatselect alignjustify forecolor | pastetext removeformat charmap | outdent indent | undo redo | wp_help'
1155            },
1156            quicktags: true,
1157            mediaButtons: false,
1158        });
1159    });
1160
1161    jQuery(".mec-hourly-schedule-schedules").sortable({
1162        handle: '.mec_field_sort'
1163    });
1164}
1165
1166function mec_hourly_schedule_remove(day, i, prefix)
1167{
1168    jQuery("#"+prefix+"mec_hourly_schedule_row"+day+'_'+i).remove();
1169}
1170
1171function mec_hourly_schedule_day_remove(day, prefix)
1172{
1173    jQuery("#"+prefix+"mec_meta_box_hourly_schedule_day_"+day).remove();
1174}
1175
1176function mec_ticket_remove(i)
1177{
1178    jQuery("#mec_ticket_row"+i).remove();
1179}
1180
1181function mec_set_event_color(color)
1182{
1183    try
1184    {
1185        jQuery("#mec_event_color").wpColorPicker('color', '#'+color);
1186    }
1187    catch(e)
1188    {
1189        jQuery("#mec_event_color").val(color);
1190    }
1191}
1192
1193function mec_remove_fee(key)
1194{
1195    jQuery("#mec_fee_row"+key).remove();
1196}
1197
1198function mec_remove_ticket_variation(key, id_prefix)
1199{
1200    jQuery("#mec_"+id_prefix+"_row"+key).remove();
1201}
1202
1203function add_variation_per_ticket(ticket_id)
1204{
1205    var $input = jQuery('#mec_new_variation_per_ticket_key');
1206
1207    var key = $input.val();
1208    var html = jQuery('#mec_new_variation_per_ticket_raw'+ticket_id).html().replace(/:v:/g, key);
1209
1210    jQuery('#mec_ticket_variations_list'+ticket_id).append(html);
1211    $input.val(parseInt(key)+1);
1212
1213    mec_init_sortable_sections();
1214}
1215
1216function mec_init_sortable_instance(selector, options)
1217{
1218    jQuery(selector).each(function()
1219    {
1220        var $element = jQuery(this);
1221
1222        if(!$element.length) return;
1223
1224        if(typeof $element.data('ui-sortable') === 'undefined')
1225        {
1226            $element.sortable(options);
1227        }
1228        else
1229        {
1230            $element.sortable('refresh');
1231        }
1232    });
1233}
1234
1235function mec_init_sortable_sections()
1236{
1237    if(typeof jQuery.fn.sortable === 'undefined') return;
1238
1239    mec_init_sortable_instance('#mec_tickets', { handle: '.mec_field_sort', items: '> .mec_ticket_row' });
1240    mec_init_sortable_instance('#mec_fees_list', { handle: '.mec_field_sort', items: '> .mec-box' });
1241    mec_init_sortable_instance('[id^="mec_ticket_variations_list"]', { handle: '.mec_field_sort', items: '> .mec_ticket_variation_row' });
1242    mec_init_sortable_instance('#mec_faq_list', { handle: '.mec_field_sort', items: '> .mec_faq_row' });
1243}
1244
1245function mec_get_booking_condition_form_fields(prefix)
1246{
1247    return jQuery('#mec_' + prefix + '_form_fields > li');
1248}
1249
1250function mec_get_booking_condition_field_id($field, prefix)
1251{
1252    return String(($field.attr('id') || '').replace('mec_' + prefix + '_fields_', ''));
1253}
1254
1255function mec_get_booking_condition_field_type($field, prefix)
1256{
1257    const fieldId = mec_get_booking_condition_field_id($field, prefix);
1258    return String($field.find('input[name="mec[' + prefix + '_fields][' + fieldId + '][type]"]').val() || '');
1259}
1260
1261function mec_get_booking_condition_field_label($field, prefix)
1262{
1263    const fieldId = mec_get_booking_condition_field_id($field, prefix);
1264    const $labelInput = $field.find('input[name="mec[' + prefix + '_fields][' + fieldId + '][label]"]').first();
1265    const fallback = jQuery.trim($field.find('.mec_' + prefix + '_field_type').first().text() || '');
1266
1267    return jQuery.trim(($labelInput.val() || fallback || ''));
1268}
1269
1270function mec_get_booking_condition_field_option_list($field, prefix)
1271{
1272    const fieldId = mec_get_booking_condition_field_id($field, prefix);
1273    const options = [];
1274
1275    $field.find('input[name^="mec[' + prefix + '_fields][' + fieldId + '][options]"][name$="[label]"]').each(function()
1276    {
1277        const name = jQuery(this).attr('name') || '';
1278        const match = name.match(/\[options\]\[(.*?)\]\[label\]$/);
1279        if(!match) return;
1280
1281        options.push({
1282            key: String(match[1]),
1283            label: jQuery.trim(jQuery(this).val() || '')
1284        });
1285    });
1286
1287    return options;
1288}
1289
1290function mec_booking_condition_field_has_duplicate_options($field, prefix)
1291{
1292    const seen = {};
1293    const options = mec_get_booking_condition_field_option_list($field, prefix);
1294
1295    for(let i = 0; i < options.length; i++)
1296    {
1297        const label = options[i].label;
1298        if(!label) continue;
1299        if(seen[label]) return true;
1300
1301        seen[label] = true;
1302    }
1303
1304    return false;
1305}
1306
1307function mec_refresh_booking_condition_editor($conditionBox)
1308{
1309    if(!$conditionBox || !$conditionBox.length) return;
1310
1311    const prefix = String($conditionBox.data('conditionPrefix') || '');
1312    const currentFieldId = String($conditionBox.data('conditionFieldId') || '');
1313    const $enabled = $conditionBox.find('.mec-booking-condition-enabled');
1314    const $controls = $conditionBox.find('.mec-booking-condition-controls');
1315    const $source = $conditionBox.find('.mec-booking-condition-source');
1316    const $option = $conditionBox.find('.mec-booking-condition-option');
1317    const $matchType = $conditionBox.find('.mec-booking-condition-match-type');
1318    const $message = $conditionBox.find('.mec-booking-condition-message');
1319    const enabled = $enabled.is(':checked');
1320    const strings = (typeof mec_admin_localize !== 'undefined' && mec_admin_localize.booking_conditions) ? mec_admin_localize.booking_conditions : {};
1321
1322    $controls.toggleClass('mec-util-hidden', !enabled);
1323    if(!enabled)
1324    {
1325        $message.text('');
1326        return;
1327    }
1328
1329    const currentSourceId = String($source.val() || $conditionBox.data('currentSourceFieldId') || '');
1330    const currentOptionKey = String($option.val() || $conditionBox.data('currentOptionKey') || '');
1331    const sourceFields = [];
1332    const sourceMap = {};
1333
1334    mec_get_booking_condition_form_fields(prefix).each(function()
1335    {
1336        const $field = jQuery(this);
1337        const fieldId = mec_get_booking_condition_field_id($field, prefix);
1338        const fieldType = mec_get_booking_condition_field_type($field, prefix);
1339
1340        if(!fieldId) return;
1341        if(fieldId === currentFieldId) return false;
1342        if(jQuery.inArray(fieldType, ['checkbox', 'radio', 'select', 'agreement']) === -1) return;
1343        if(jQuery.inArray(fieldType, ['checkbox', 'radio', 'select']) !== -1 && mec_booking_condition_field_has_duplicate_options($field, prefix)) return;
1344
1345        const sourceField = {
1346            id: fieldId,
1347            type: fieldType,
1348            label: mec_get_booking_condition_field_label($field, prefix)
1349        };
1350
1351        sourceFields.push(sourceField);
1352        sourceMap[fieldId] = sourceField;
1353    });
1354
1355    $source.empty().append('<option value="">' + (strings.select_field || 'Select a field') + '</option>');
1356    jQuery.each(sourceFields, function(index, sourceField)
1357    {
1358        $source.append('<option value="' + sourceField.id + '">' + sourceField.label + '</option>');
1359    });
1360
1361    if(currentSourceId && sourceMap[currentSourceId]) $source.val(currentSourceId);
1362
1363    const selectedSourceId = String($source.val() || '');
1364    const selectedSource = sourceMap[selectedSourceId] || null;
1365
1366    $option.empty();
1367
1368    if(!selectedSource)
1369    {
1370        $matchType.val('');
1371        $option.prop('disabled', true).append('<option value="">' + (strings.select_option || 'Select an option') + '</option>');
1372        $message.text(sourceFields.length ? (strings.select_controller || 'Choose a controller field.') : (strings.no_sources || 'No eligible controller fields are available.'));
1373        $conditionBox.data('currentSourceFieldId', '');
1374        $conditionBox.data('currentOptionKey', '');
1375        return;
1376    }
1377
1378    if(selectedSource.type === 'agreement')
1379    {
1380        $matchType.val('checked');
1381        $option.prop('disabled', true).append('<option value="">' + (strings.checked_state || 'Checked') + '</option>');
1382        $message.text((strings.checked_message || 'This field will show when "%s" is checked.').replace('%s', selectedSource.label));
1383        $conditionBox.data('currentSourceFieldId', selectedSourceId);
1384        $conditionBox.data('currentOptionKey', '');
1385        return;
1386    }
1387
1388    const $sourceField = jQuery('#mec_' + prefix + '_fields_' + selectedSource.id);
1389    const options = mec_get_booking_condition_field_option_list($sourceField, prefix);
1390    const matchType = selectedSource.type === 'checkbox' ? 'contains_option' : 'equals_option';
1391
1392    $matchType.val(matchType);
1393    $option.prop('disabled', false).append('<option value="">' + (strings.select_option || 'Select an option') + '</option>');
1394
1395    jQuery.each(options, function(index, option)
1396    {
1397        $option.append('<option value="' + option.key + '">' + option.label + '</option>');
1398    });
1399
1400    if(currentOptionKey) $option.val(currentOptionKey);
1401
1402    if(!$option.val())
1403    {
1404        $message.text((strings.select_value || 'Choose the value that should reveal this field.').replace('%s', selectedSource.label));
1405    }
1406    else
1407    {
1408        $message.text('');
1409    }
1410
1411    $conditionBox.data('currentSourceFieldId', selectedSourceId);
1412    $conditionBox.data('currentOptionKey', String($option.val() || ''));
1413}
1414
1415function mec_refresh_booking_condition_editors(prefix)
1416{
1417    jQuery('.mec-booking-condition-box[data-condition-prefix="' + prefix + '"]').each(function()
1418    {
1419        mec_refresh_booking_condition_editor(jQuery(this));
1420    });
1421}
1422
1423function mec_reg_fields_option_listeners()
1424{
1425    jQuery('button.mec-reg-field-add-option').off('click').on('click', function()
1426    {
1427        var field_id = jQuery(this).data('field-id');
1428        var key = jQuery('#mec_new_reg_field_option_key_'+field_id).val();
1429        var html = jQuery('#mec_reg_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id);
1430
1431        jQuery('#mec_reg_fields_'+field_id+'_options_container').append(html);
1432        jQuery('#mec_new_reg_field_option_key_'+field_id).val(parseInt(key)+1);
1433        mec_refresh_booking_condition_editors('reg');
1434    });
1435
1436    if(typeof jQuery.fn.sortable !== 'undefined')
1437    {
1438        jQuery("#mec_reg_form_fields").sortable(
1439        {
1440            handle: '.mec_reg_field_sort',
1441            stop: function()
1442            {
1443                mec_refresh_booking_condition_editors('reg');
1444            }
1445        });
1446
1447        jQuery(".mec_reg_fields_options_container").sortable(
1448        {
1449            handle: '.mec_reg_field_option_sort'
1450        });
1451
1452        jQuery(".mec-hourly-schedule-days").sortable(
1453        {
1454            handle: 'h4'
1455        });
1456
1457        jQuery(".mec-hourly-schedule-schedules").sortable({
1458            handle: '.mec_field_sort'
1459        });
1460    }
1461}
1462
1463function mec_reg_fields_option_remove(field_key, key)
1464{
1465    jQuery("#mec_reg_fields_option_"+field_key+"_"+key).remove();
1466    mec_refresh_booking_condition_editors('reg');
1467}
1468
1469function mec_reg_fields_remove(key)
1470{
1471    jQuery("#mec_reg_fields_"+key).remove();
1472    mec_refresh_booking_condition_editors('reg');
1473}
1474
1475function mec_handle_add_price_date_button(e)
1476{
1477    var key = jQuery(e).data('key');
1478    var p = jQuery('#mec_new_ticket_price_key_'+key).val();
1479    var html = jQuery('#mec_new_ticket_price_raw_'+key).html().replace(/:i:/g, key).replace(/:j:/g, p);
1480
1481    jQuery('#mec-ticket-price-dates-'+key).append(html);
1482    jQuery('#mec_new_ticket_price_key_'+key).val(parseInt(p)+1);
1483    jQuery('#mec-ticket-price-dates-'+key+' .new_added').datepicker(
1484    {
1485        changeYear: true,
1486        changeMonth: true,
1487        dateFormat: datepicker_format,
1488        gotoCurrent: true,
1489        yearRange: 'c-3:c+5',
1490    });
1491}
1492
1493function mec_ticket_price_remove(ticket_key, price_key)
1494{
1495    jQuery("#mec_ticket_price_raw_"+ticket_key+"_"+price_key).remove();
1496}
1497
1498function mec_event_fields_option_listeners()
1499{
1500    jQuery('button.mec-event-field-add-option').off('click').on('click', function()
1501    {
1502        var field_id = jQuery(this).data('field-id');
1503        var key = jQuery('#mec_new_event_field_option_key_'+field_id).val();
1504        var html = jQuery('#mec_event_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id);
1505
1506        jQuery('#mec_event_fields_'+field_id+'_options_container').append(html);
1507        jQuery('#mec_new_event_field_option_key_'+field_id).val(parseInt(key)+1);
1508    });
1509
1510    if(typeof jQuery.fn.sortable !== 'undefined')
1511    {
1512        jQuery("#mec_event_form_fields").sortable(
1513        {
1514            handle: '.mec_event_field_sort'
1515        });
1516
1517        jQuery(".mec_event_fields_options_container").sortable(
1518        {
1519            handle: '.mec_event_field_option_sort'
1520        });
1521    }
1522}
1523
1524function mec_event_fields_option_remove(field_key, key)
1525{
1526    jQuery("#mec_event_fields_option_"+field_key+"_"+key).remove();
1527}
1528
1529function mec_event_fields_remove(key)
1530{
1531    jQuery("#mec_event_fields_"+key).remove();
1532}
1533
1534function mec_bfixed_fields_option_listeners()
1535{
1536    jQuery('button.mec-bfixed-field-add-option').off('click').on('click', function()
1537    {
1538        var field_id = jQuery(this).data('field-id');
1539        var key = jQuery('#mec_new_bfixed_field_option_key_'+field_id).val();
1540        var html = jQuery('#mec_bfixed_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id);
1541
1542        jQuery('#mec_bfixed_fields_'+field_id+'_options_container').append(html);
1543        jQuery('#mec_new_bfixed_field_option_key_'+field_id).val(parseInt(key)+1);
1544        mec_refresh_booking_condition_editors('bfixed');
1545    });
1546
1547    if(typeof jQuery.fn.sortable !== 'undefined')
1548    {
1549        jQuery("#mec_bfixed_form_fields").sortable(
1550        {
1551            handle: '.mec_bfixed_field_sort',
1552            stop: function()
1553            {
1554                mec_refresh_booking_condition_editors('bfixed');
1555            }
1556        });
1557
1558        jQuery(".mec_bfixed_fields_options_container").sortable(
1559        {
1560            handle: '.mec_bfixed_field_option_sort'
1561        });
1562    }
1563}
1564
1565function mec_bfixed_fields_option_remove(field_key, key)
1566{
1567    jQuery("#mec_bfixed_fields_option_"+field_key+"_"+key).remove();
1568    mec_refresh_booking_condition_editors('bfixed');
1569}
1570
1571function mec_bfixed_fields_remove(key)
1572{
1573    jQuery("#mec_bfixed_fields_"+key).remove();
1574    mec_refresh_booking_condition_editors('bfixed');
1575}
1576
1577function mec_additional_organizers_listeners()
1578{
1579    jQuery('#mec_additional_organizers_add').off('click').on('click', function()
1580    {
1581        var value = jQuery('.mec-additional-organizers select').val();
1582        console.log(value);
1583        if (!value) return;
1584
1585        var text = jQuery('.mec-additional-organizers select option:selected').text();
1586
1587        var sortLabel = jQuery(this).data('sort-label');
1588        var removeLabel = jQuery(this).data('remove-label');
1589
1590        jQuery('.mec-additional-organizers-list').append('<li><span class="mec-additional-organizer-sort">'+sortLabel+'</span> <span onclick="mec_additional_organizers_remove(this);" class="mec-additional-organizer-remove">'+removeLabel+'</span><input type="hidden" name="mec[additional_organizer_ids][]" value="'+value+'"><span class="mec_orgz_item_name">'+text+'</span></li>');
1591
1592        mec_additional_organizers_listeners();
1593    });
1594
1595    if(typeof jQuery.fn.sortable !== 'undefined')
1596    {
1597        jQuery(".mec-additional-organizers-list").sortable(
1598        {
1599            handle: '.mec-additional-organizer-sort'
1600        });
1601    }
1602}
1603
1604function mec_additional_organizers_remove(element)
1605{
1606    jQuery(element).parent().remove();
1607}
1608
1609function mec_faq_remove(key)
1610{
1611    jQuery("#mec_faq_row"+key).remove();
1612}
1613
1614jQuery(document).on('focus', '.mec_date_picker', function ()
1615{
1616    if (!jQuery(this).hasClass('hasDatepicker'))
1617    {
1618        jQuery(this).datepicker({
1619            changeYear: true,
1620            changeMonth: true,
1621            dateFormat: 'yy-mm-dd',
1622            gotoCurrent: true,
1623            yearRange: 'c-3:c+5',
1624        });
1625    }
1626});

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.