// source --> https://familienzentrum-sonnenschein.at/wp-content/plugins/wp-event-manager-calendar/assets/js/event-calendar-ajax-filters.min.js?ver=1.4.14 
var EventCalendarAjaxFilter = function () {
    var xmlHttpCalendarRequest = [];
    /// <summary>Constructor function of the event EventCalendarAjaxFilters class.</summary>
    /// <returns type="Home" />  
    return {
 
       ///<summary>
       ///Initializes the event calendar ajax filters.  
       ///</summary>     
       ///<returns type="initialization filters" />   
       /// <since>1.0.0</since> 
       init: function () {
         localStorage.removeItem('selected_view');
         if (jQuery('.check-event-page').length > 0) {
            localStorage.removeItem('event_location');
         }
 
         EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);

         if (typeof event_manager_calendar_event_calendar_ajax_filters !== 'undefined') {
            const defaultView = event_manager_calendar_event_calendar_ajax_filters.defaultView;

            if (defaultView === "calendar") {
                  localStorage.setItem("layout", "calendar-layout");
            } else if (defaultView === "list") {
                  localStorage.setItem("layout", "list-layout");
            } else if (defaultView === "box") {
                  localStorage.setItem("layout", "box-layout");
            }
         }
         if ( jQuery('.event_listings_upcoming').length ) {
            localStorage.setItem("layout", "box-layout");
         }

         //check if default layout is set to calendar
         if (localStorage.getItem("layout") === "calendar-layout") {
            jQuery('#calendar_default_view').hide();
            jQuery('#load_more_events_loader').css("display", "none");
            jQuery('.event_listings_main').after().append("<div id='calendar-layout-view-container'>");
            setTimeout(function () {
               EventCalendarAjaxFilter.actions.calendarLayoutIconClick(document.createEvent('Event'));
            }, 1000);
         } else {
            jQuery('#calendar_default_view').hide();
            jQuery('#load_more_events_loader').show();
            jQuery("#calendar-layout-view-container").hide();
         }
         // check for default layout as calendar
         if (jQuery("#event-listing-view").data("id") == 'calendar') {
            EventCalendarAjaxFilter.actions.calendarLayoutIconClick(document.createEvent('Event'));
         }

         jQuery('.wpem-event-box-layout, .wpem-event-list-layout').on('click', function() {
            jQuery('.no_event_listings_found').show();
         });

         jQuery(document).delegate('#next_day', 'click', EventCalendarAjaxFilter.actions.getCalendarLayoutData);

         if (jQuery('#search_datetimes').length > 0) {
            jQuery(document).delegate('#search_datetimes', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }
         if (jQuery('#search_location').length > 0) {
            jQuery(document).delegate('#search_location', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }
         if (jQuery('#search_keywords').length > 0) {
            jQuery(document).delegate('#search_keywords', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }
         if (jQuery('#search_categories').length > 0) {
            jQuery(document).delegate('#search_categories', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }
         if (jQuery('#search_event_types').length > 0) {
            jQuery(document).delegate('#search_event_types', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }
         if (jQuery('#search_ticket_prices').length > 0) {
            jQuery(document).delegate('#search_ticket_prices', 'change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         }

         //events calendar layout actions
         jQuery(document).delegate('#wpem-event-calendar-layout', 'click', EventCalendarAjaxFilter.actions.calendarLayoutIconClick);
         jQuery(document).delegate('#wpem-event-list-layout', 'click', EventCalendarAjaxFilter.actions.calendarLayoutHide);
         jQuery(document).delegate('#wpem-event-box-layout', 'click', EventCalendarAjaxFilter.actions.calendarLayoutHide);
         jQuery('#event_filters').on('change', EventCalendarAjaxFilter.actions.filtersValueChanged);
         jQuery('.event_filters').on('click', '.reset', EventCalendarAjaxFilter.actions.filtersValueChanged);
         jQuery('.filter_by_tag_cloud').on('click', EventCalendarAjaxFilter.actions.filtersValueChanged);
         //events calendar shortcode actions
         jQuery('body').on('click', '#event_calendar_filters_button', EventCalendarAjaxFilter.actions.getFilteredCalendarData);
         jQuery('body').on('click', '#calendar_navigation_previous', EventCalendarAjaxFilter.actions.getFilteredCalendarData);
         jQuery('body').on('click', '#calendar_navigation_next', EventCalendarAjaxFilter.actions.getFilteredCalendarData);

         //events calendar widget actions
         jQuery('body').on('click', '#event_calendar_widget_filters_button', EventCalendarAjaxFilter.actions.getFilteredWidgetCalendarData);
         jQuery('body').on('click', '#calendar_widget_navigation_previous', EventCalendarAjaxFilter.actions.getFilteredWidgetCalendarData);
         jQuery('body').on('click', '#calendar_widget_navigation_next', EventCalendarAjaxFilter.actions.getFilteredWidgetCalendarData);

         //events calendar shortcode day view
         jQuery('body').on('click', '#next_day_sc', EventCalendarAjaxFilter.actions.getDayViewCalendarData);
         jQuery('body').on('click', '#prev_day_sc', EventCalendarAjaxFilter.actions.getDayViewCalendarData);
         jQuery('body').on('click', '#today_sc', EventCalendarAjaxFilter.actions.getDayViewCalendarData);
         jQuery('body').on('click', '#prev_year', EventCalendarAjaxFilter.actions.getPrevYear);
 
         jQuery('body').on('click', '#next_year', EventCalendarAjaxFilter.actions.getNextYear);
         jQuery('body').on('click', '#next_week', EventCalendarAjaxFilter.actions.getNextweek);

         jQuery('body').on('change', '#date_pick', EventCalendarAjaxFilter.actions.getDayViewCalendarData);
         jQuery('body').on('click', '#prev_week', EventCalendarAjaxFilter.actions.getPrevweek);
         jQuery('body').on('change', '#date_pick_main', EventCalendarAjaxFilter.actions.selectDateFromPicker);
         jQuery('body').on('change', '#hidden_date_picker', EventCalendarAjaxFilter.actions.loadListEventsDatepicker);
         jQuery('body').on('change', '#hidden_date_picker_summary', EventCalendarAjaxFilter.actions.loadSummaryEventsDatepicker);
         jQuery('body').on('change', '#current_year', EventCalendarAjaxFilter.actions.getYearbySelect);
         jQuery('body').on('click', '#today_year', EventCalendarAjaxFilter.actions.getYearbyTodaySelect);
         jQuery('body').on('click', '#today', EventCalendarAjaxFilter.actions.navigateTodayDay);
         jQuery('body').on('change', '#hidden_date_picker_week', EventCalendarAjaxFilter.actions.currentWeek);

         jQuery('body').on('click', '#day_view_prev_list', function () {
            let currentDisplay = jQuery('#custom_date_range_display').text().trim();
            let startDateText = currentDisplay.split('-')[0].trim();
            let currentStartDate = new Date(startDateText + ' ' + new Date().getFullYear());
            currentStartDate.setMonth(currentStartDate.getMonth() - 1);
            EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
         });

         jQuery('body').on('click', '#day_view_next_list', function () {
            let currentDisplay = jQuery('#custom_date_range_display').text().trim();
            let startDateText = currentDisplay.split('-')[0].trim();
            let currentStartDate = new Date(startDateText + ' ' + new Date().getFullYear());
            currentStartDate.setMonth(currentStartDate.getMonth() + 1);
            EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
         });

         jQuery('body').on('click', '#day_view_prev_summary', function () {
            let currentDisplay = jQuery('#custom_date_range_display_summary').text().trim();
            let startDateText = currentDisplay.split('-')[0].trim();
            let currentStartDate = new Date(startDateText + ' ' + new Date().getFullYear());
            currentStartDate.setMonth(currentStartDate.getMonth() - 1);
            EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
         });

         jQuery('body').on('click', '#day_view_next_summary', function () {
            let currentDisplay = jQuery('#custom_date_range_display_summary').text().trim();
            let startDateText = currentDisplay.split('-')[0].trim();
            let currentStartDate = new Date(startDateText + ' ' + new Date().getFullYear());
            currentStartDate.setMonth(currentStartDate.getMonth() + 1);
            EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
         });

         jQuery('body').on('click', '#today_list', function () {
            currentStartDate = new Date();
            EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
         });

         jQuery('body').on('click', '#today_summary', function () {
            currentStartDate = new Date();
            EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
         });
 
         setTimeout(function () {
            EventCalendarAjaxFilter.actions.eventDetailsPopup();
         }, 1000);

         EventCalendarAjaxFilter.actions.showWidgetEventsDetails();
         EventCalendarAjaxFilter.actions.resetSelectedItem();
 
         // Bind the new actions to events using an anonymous function
         jQuery(document).on('change', '.wpem-event-layout-dropdown', function (event) {
            EventCalendarAjaxFilter.actions.calendarLayoutChanged(event);
         });
         jQuery(document).on('click', '.wpem-event-calendar-filter-v2_navigation-prev-btn', function (event) {
            EventCalendarAjaxFilter.actions.navigatePreviousDay(event);
         });
         jQuery(document).on('click', '.wpem-event-calendar-filter-v2_navigation-next-btn', function (event) {
            EventCalendarAjaxFilter.actions.navigateNextDay(event);
         });

         var selected_calendar_layout = localStorage.getItem('selected_view');

         if (selected_calendar_layout == null) {
            jQuery('.wpem-event-layout-dropdown').val(jQuery('#calendar_default_view').val());
         } else {
            jQuery('.wpem-event-layout-dropdown').val(selected_calendar_layout);
         }
         // show hide default layout dropdown 
         jQuery('body').on('click', '.wpem-event-list-layout', EventCalendarAjaxFilter.actions.toggleDefaultLayoutList);
         jQuery('body').on('click', '.wpem-event-box-layout', EventCalendarAjaxFilter.actions.toggleDefaultLayoutList);
         jQuery('body').on('click', '.calendar-day-container', EventCalendarAjaxFilter.actions.mobileViewPopup);
         jQuery('body').on('click', '#load_more_list_events', EventCalendarAjaxFilter.actions.loadMoreListViewEvents);
         jQuery('.event-dashboard-action-delete').on('click', EventCalendarAjaxFilter.actions.deleteEventCalendar);
         jQuery('.wpem-calendar-manual-sync').on('click', EventCalendarAjaxFilter.actions.syncEventCalendar);
         jQuery('body').on('click', '#today_week', EventCalendarAjaxFilter.actions.getTodayWeek);
        
         // Initial check on page load
         EventCalendarAjaxFilter.actions.toggleGoogleMapId();
   
         // Dynamically watch for changes in .map-view using MutationObserver
         const observer = new MutationObserver(EventCalendarAjaxFilter.actions.toggleGoogleMapId);
         observer.observe(document.body, { childList: true, subtree: true });
       
       },
       actions: {
         ///<summary>
         ///When page refresh or window load and calendar layout is active then show data according to filters value               
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         windowLoad: function (event) {
            if (jQuery('.wpem-event-listing-calendar-view').length > 0) {
               EventCalendarAjaxFilter.actions.filtersValueChanged(event);
            }
         },

         ///<summary>
         /// toggle google map id
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         toggleGoogleMapId: function (event) {
            // Select all elements with id="googleMap" but NOT inside .google-map-left-container
            var mapDivs = jQuery('#googleMap').not('.google-map-left-container #googleMap');
      
            if (jQuery('.map-view').length > 0) {
               // Remove the id from the selected elements when .map-view exists
               mapDivs.removeAttr('id');
            } else {
               // Add the id back to these elements if .map-view does not exist
               mapDivs.each(function () {
                  if (!jQuery(this).attr('id')) {
                     jQuery(this).attr('id', 'googleMap');
                  }
               });
            }
         },

         ///<summary>
         ///When filter value changed then refresh data for the calendar layout     
         ///When page refresh or window load and calendar layout is active then show data according to filters value        
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         filtersValueChanged: function (event) {
            if (localStorage.getItem("layout") == "calendar-layout") {
               //Only for year not show calendar on time, when select filter this year or next year.
               var search_datetimes = jQuery('#search_datetimes').val();

               //wait untill completely loaded box and line layout data.
               setTimeout(function () {
                  EventCalendarAjaxFilter.actions.calendarLayoutIconClick(event);
               }, 1000);
            }
         },
 
         ///<summary>
         ///When click on line or box layout then hide calendar layout and data                
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         calendarLayoutHide: function (event) {
            if (localStorage.getItem("layout") != "calendar-layout") {
               jQuery("#wpem-event-calendar-layout").removeClass("wpem-active-layout");
               jQuery(".wpem-event-listings").removeClass("wpem-event-listing-calendar-view");
               jQuery("#calendar-layout-view-container").hide();
               jQuery('#load_more_events_loader').show();
               jQuery('.event-manager-pagination').show();
               event.preventDefault();
            }
         },
 
         ///<summary>
         ///When click on calendar layout icon near to box and line icon
         ///Show calendar data
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         calendarLayoutIconClick: function (event) {

            EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);
            jQuery('#calendar_default_view').show();
            jQuery('.no_event_listings_found').hide();
            jQuery('.wpem-event-layout-action').find('.wpem-active-layout').removeClass('wpem-active-layout');
            jQuery('#wpem-event-calendar-layout').addClass("wpem-active-layout");

            jQuery(".wpem-event-box-col").hide();
            jQuery("#calendar-layout-view-container").show();

            jQuery(".wpem-event-listings").removeClass("wpem-event-listing-list-view");
            jQuery(".wpem-event-listings").removeClass("wpem-event-listing-box-view");
            if (!jQuery(".wpem-event-listings").hasClass('wpem-row'))
               jQuery(".wpem-event-listings").addClass('wpem-row');

            jQuery(".wpem-event-listings").addClass("wpem-event-listing-calendar-view");
            jQuery('#load_more_events_loader').hide();
            jQuery('.event-manager-pagination').hide();
            localStorage.setItem("layout", "calendar-layout");
            jQuery("#calendar-layout-view-container").show();
            event.preventDefault();
         },
 
         ///<summary>
         ///Show event details popup when user wll mouser over event link in calendar day box.
         ///Show Event detail tooltip whene hover on event title
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         eventDetailsPopup: function () {},

         ///<summary>
         ///Show widget events details when hover on day box of the widget calendar               
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         showWidgetEventsDetails: function () {
            jQuery('.current_date').on('click', EventCalendarAjaxFilter.actions.ajaxCalanderwidgetCurrentEvent);
         },

         ///<summary>
         ///Get filtered calendar data
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         getFilteredCalendarData: function (event) {
            $this = jQuery(this).closest('form.calendar-filters-form');

            var month = jQuery($this).find('#calendar_month').val();
            var year = jQuery($this).find('#calendar_year').val();
            var calendar_navigation_month = jQuery($this).find('#calendar_navigation_month').val();
            var categories = jQuery($this).find('#calendar_categories').val();
            var data_cat = jQuery('.event_listings').data("categories");
            if (categories.length === 0) {
               categories = data_cat;
            }
            var event_types = jQuery($this).find('#calendar_event_types').val();
            var data_type = jQuery('.event_listings').data("event_types");
            if (event_types.length === 0) {
               event_types = data_type;
            }
            var event_keywords = jQuery($this).find('#calendar_event_keywords').val();
            var event_location = jQuery($this).find('#calendar_event_location').val();
            var events_calendar_nonce = jQuery($this).find('#events_calendar_nonce').val();
            var search_ticket_prices = jQuery('#event_filters').find(':input[name^="search_ticket_prices"]').val();
            var data = {
               calendar_month: month,
               calendar_year: year,
               calendar_navigation_month: calendar_navigation_month,
               calendar_navigation: event.target.id,
               categories: categories,
               event_types: event_types,
               event_keywords: event_keywords,
               event_location: event_location,
               search_ticket_prices: search_ticket_prices,
               events_calendar_nonce: events_calendar_nonce
            }
            jQuery.ajax({
               type: 'POST',
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "events_calendar"),
               data: data,
               beforeSend: function () {
                  jQuery($this).parents('#calendar-container').addClass('wpem-loading');
                  jQuery($this).find("#wpem-event-list-layout").prop('disabled', true);
                  jQuery($this).find("#wpem-event-box-layout").prop('disabled', true);
               },
               success: function (data) {
                  var parent = jQuery($this).parents('#calendar-container').parent();
                  jQuery($this).parents('#calendar-container').remove();
                  jQuery(parent).html(data);
                  jQuery($this).parents('#calendar-container').removeClass('wpem-loading');
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  jQuery($this).parents('#calendar-container').removeClass('wpem-loading');
               },
               complete: function (jqXHR, textStatus) {
                  EventCalendarAjaxFilter.actions.eventDetailsPopup();
                  jQuery($this).parents('#calendar-container').removeClass('wpem-loading');
               }
            });
            jQuery($this).find("#wpem-event-list-layout").prop('disabled', false);
            jQuery($this).find("#wpem-event-box-layout").prop('disabled', false);
            event.preventDefault();
         },

         ///<summary>
         ///Get day view on shortcode
         getDayViewCalendarData: function (event) {
            var next_day_sc = jQuery('#next_day_sc').data("next-sc");
            var prev_day_sc = jQuery('#prev_day_sc').data("prev-sc");
            var today_sc = jQuery('#today_sc').data("today-sc");
            var date_event = jQuery('#date_pick').val();
            var data = {
               next_day_sc: next_day_sc,
               prev_day_sc: prev_day_sc,
               navigation: event.target.className,
               today_sc: today_sc,
               date_event: date_event
            }
            jQuery.ajax({
               type: 'POST',
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "events_calendar_day"),
               data: data,
               success: function (data) {
                  jQuery('#calendar-container').html(data);
                  var noEvents = jQuery('.wpem-day-view-event_time').html();
                  if (noEvents == undefined) {
                     jQuery('.wpem-day-view-event').html('There are no events matching your search.');
                  }
               },
               error: function (jqXHR, textStatus, errorThrown) {},
            });
            event.preventDefault();
         },

         ///<summary>
         ///Get filtered widget calendar data
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         getFilteredWidgetCalendarData: function (event) {
            $this = jQuery(this).closest('form').parents('.calendar-filters-container');
            var categories = jQuery('#widget_categories').val();
            var event_types = jQuery('#widget_event_types').val();
            var month = jQuery($this).find('.calendar-filters-form #calendar_month').val();
            var year = jQuery($this).find('.calendar-filters-form #calendar_year').val();
            var calendar_navigation_month = jQuery($this).find('#calendar_navigation_month').val();
            var events_calendar_widget_nonce = jQuery($this).find('#events_calendar_widget_nonce').val();
            var data = {
               calendar_month: month,
               calendar_year: year,
               category: categories,
               event_type: event_types,
               calendar_navigation_month: calendar_navigation_month,
               calendar_navigation: event.target.id,
               events_calendar_widget_nonce: events_calendar_widget_nonce
            }
            jQuery.ajax({
               type: 'POST',
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "events_calendar_widget"),
               data: data,
               beforeSend: function () {
                  jQuery($this).parents('.wpem-calendar-widget-wrapper').addClass('wpem-loading');
               },
               success: function (data) {
                  var parent = jQuery($this).parents('.wpem-calendar-widget-wrapper').parent();
                  var indexOfCalendarWidget = jQuery($this).find('.wpem-calendar-widget-wrapper').index();
                  jQuery($this).parents('.wpem-calendar-widget-wrapper').remove();
                  //used extend jquery method for insert at, defined below in this file.
                  jQuery(parent).insertAt(indexOfCalendarWidget, data);
                  jQuery($this).parents('.wpem-calendar-widget-wrapper').removeClass('wpem-loading');
               },
               error: function (jqXHR, textStatus, errorThrown) {},
               complete: function (jqXHR, textStatus) {
                  EventCalendarAjaxFilter.actions.eventDetailsPopup();
                  EventCalendarAjaxFilter.actions.showWidgetEventsDetails();
                  jQuery($this).find('.wpem-calendar-widget-wrapper').removeClass('wpem-loading');
               }
            });
            event.preventDefault();
         },

         ///<summary>
         ///Get filtered calendar data
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         getCalendarLayoutData: function (event) {
         var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }

            var search_keywords = jQuery('#search_keywords').val();
            var search_location = jQuery('#search_location').val();
            var search_datetimes = jQuery('#search_datetimes').val();
            var data_cat = jQuery('.event_listings').data("categories");
            var selected_view = localStorage.getItem('selected_view');
            if (search_categories == null) {
               var search_categories = data_cat;
            }
            var data_type = jQuery('.event_listings').data("event_types");
            if (search_event_types == null) {
               var search_event_types = data_type;
            }
            var search_ticket_prices = jQuery('#event_filters').find(':input[name^="search_ticket_prices"]').val();
            var $select = jQuery('#current_year');
            var selected_year = parseInt($select.val());

            if (jQuery("input[name='event_tag[]']").length) {
               var search_tags = jQuery("input[name='event_tag[]']")
                  .map(function () {
                     return jQuery(this).val();
                  }).get();
            } else {
               var search_tags = '';
            }
            var data = {
               search_keywords: search_keywords,
               search_location: search_location,
               search_datetimes: search_datetimes,
               search_categories: search_categories,
               search_event_types: search_event_types,
               search_ticket_prices: search_ticket_prices,
               search_tags: search_tags,
               selected_view: selected_view,
               selected_year: selected_year
            }
            
            jQuery('.calendar-template-container').empty();
         jQuery('.calendar-template-container').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');
            jQuery.ajax({
               type: 'POST',
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "events_calendar_layout"),
               data: data,
               beforeSend: function () {
                  jQuery("#wpem-event-box-layout").prop('disabled', true);
                  jQuery("#wpem-event-list-layout").prop('disabled', true);
                  jQuery('#calendar-content').addClass('wpem-loading');
               },
               success: function (data) {
                  jQuery('.event_listings_main').show();
            if (selected_view == 'map' && jQuery('#wpem-event-calendar-layout').hasClass('wpem-active-layout')) {
               jQuery('.wpem-event-listing-calendar-view').addClass('map-view');
                  }else{
               jQuery('.wpem-event-listing-calendar-view').removeClass('map-view');
            }
                  jQuery('.event_listings_main').after().append("<div id='calendar-layout-view-container'>");
                  jQuery('#calendar-layout-view-container').html(data);
                  var noEvents = jQuery('.wpem-day-view-event_time').html();
                  if (noEvents == undefined) {
                     jQuery('.wpem-day-view-event').html('There are no events matching your search.');
                  }
                  jQuery("#wpem-event-box-layout").prop('disabled', false);
                  jQuery("#wpem-event-list-layout").prop('disabled', false);
               },
               error: function (jqXHR, textStatus, errorThrown) {},
               complete: function (jqXHR, textStatus) {
               jQuery('#date_pick_main').datepicker();
                  if(selected_view = 'list'){
                  let currentStartDate = new Date();
                     jQuery('#hidden_date_picker').datepicker({
                           dateFormat: 'yy-mm-dd',
                           beforeShow: function(input, inst) {
                           var offset = jQuery('#custom_date_range_display').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#custom_date_range_display').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                     },
                     });
                     EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
                  jQuery('#custom_date_range_display').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker').focus();
                  });
                  }else if(selected_view = 'summary'){
                     let currentStartDate = new Date();
                     jQuery('#hidden_date_picker_summary').datepicker({
                     dateFormat: 'yy-mm-dd',
                     beforeShow: function(input, inst) {
                           var offset = jQuery('#custom_date_range_display_summary').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#custom_date_range_display_summary').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
            });
            EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
            jQuery('#custom_date_range_display_summary').on('click', function(e) {
            e.preventDefault();
            jQuery('#hidden_date_picker_summary').focus();
            });
                  }else if(selected_view ==='week'){
                     jQuery('#hidden_date_picker_week').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#current_week').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#current_week').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
                     });
                  jQuery('#current_week').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker_week').focus();
                  });
               }
                  EventCalendarAjaxFilter.actions.eventDetailsPopup();
               }
            });
         },
 
         ///<summary>
         ///load  the event calendar current date.  
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         ajaxCalanderwidgetCurrentEvent: function (event) {
            if (jQuery(this).children('.current_date_event').val().length > 0) {
               var event_id = jQuery(this).children('.current_date_event').val();
            } else {
               var event_id = '';
            }
            jQuery.ajax({
               type: 'POST',
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url,
               data: {
                  'action': 'widget_current_event_detail',
                  'event_id': event_id,
               },
               beforeSend: function (jqXHR, settings) {},
               success: function (data) {
                  jQuery('#current_event_container').html(data);
               },
               error: function (jqXHR, textStatus, errorThrown) {},
               complete: function (jqXHR, textStatus) {}
            });
            event.preventDefault();
         },
         
         ///<summary>
         ///Handles the change of calendar layout based on the dropdown selection.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         calendarLayoutChanged: function (event) {
         var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }
         var search_keywords = jQuery('#search_keywords').val();
         var search_location = jQuery('#search_location').val();
         var $eventInput = jQuery('#calendar_event_location');
         if ($eventInput.length > 0) {
            var event_location = $eventInput.val().trim();

            if (event_location && localStorage.getItem('event_location') !== event_location) {
               if (jQuery('.check-event-page').length === 0) {
                  localStorage.setItem('event_location', event_location);
               }
            }
         }
            var search_datetimes = jQuery('#search_datetimes').val();
            var data_cat = jQuery('.event_listings').data("categories");
            if (search_categories == null) {
               var search_categories = data_cat;
            }
            var selected_view = jQuery(event.target).val();
            localStorage.setItem('selected_view', selected_view);
            if (!search_location) {
            search_location = localStorage.getItem('event_location');;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
         
         jQuery('.calendar-template-container').empty();
         jQuery('.calendar-template-container').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');
            // Loading for map view
         jQuery('#calendar-layout-view-container').empty();
         jQuery('#calendar-layout-view-container').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');
            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "events_calendar_layout"),
               type: 'POST',
               data: {
               selected_view: selected_view,
               search_keywords: search_keywords,
               search_location: search_location,
               search_datetimes: search_datetimes,
               search_categories: search_categories,
               search_event_types: search_event_types
               },
               success: function (response) {
               
               if (selected_view == 'map' && jQuery('#wpem-event-calendar-layout').hasClass('wpem-active-layout')) {
                  jQuery('.wpem-event-listing-calendar-view #wpem_openstreet_map').attr('id', 'wpem_openstreet_map_none');
                  jQuery('.wpem-event-listing-calendar-view').addClass('map-view');
               }else{
                  jQuery('.wpem-event-listing-calendar-view #wpem_openstreet_map_none').attr('id', 'wpem_openstreet_map');
                  jQuery('.wpem-event-listing-calendar-view').removeClass('map-view');
               }
            
               jQuery('.event_listings_main').after().append("<div id='calendar-layout-view-container'>");
               jQuery('#calendar-layout-view-container').html(response);
               jQuery('.calendar-template-container').html(response);
               },
               error: function () {
                  jQuery('.calendar-template-container').html('<div class="wpem-error-message">Failed to load. Please try again.</div>');
               },
               complete: function () {
               jQuery('.calendar-template-container').each(function() {
                  jQuery(this).find('.event-calendar-style-view').remove();
               });
               jQuery('#date_pick_main').datepicker();
               if(selected_view === 'list'){
                  let currentStartDate = new Date();
                     jQuery('#hidden_date_picker').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#custom_date_range_display').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#custom_date_range_display').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
                     });
                     EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
                  jQuery('#custom_date_range_display').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker').focus();
                  });
                  }else if(selected_view === 'summary'){
                     let currentStartDate = new Date();
                     jQuery('#hidden_date_picker_summary').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#custom_date_range_display_summary').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#custom_date_range_display_summary').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                     },
               });
                  EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
                  jQuery('#custom_date_range_display_summary').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker_summary').focus();
                  });
               }else if(selected_view ==='week'){
                     jQuery('#hidden_date_picker_week').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#current_week').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#current_week').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
                     });
                  jQuery('#current_week').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker_week').focus();
                  });
               }
               jQuery('.wpem-loading-spinner').remove();
               }
            });
         },

         ///<summary>
         ///Handles the selection of a date from the date picker and loads events for that selected date.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         selectDateFromPicker: function (event) {
            var date = jQuery('#date_pick_main').val();
            var currentDate = new Date(date);

            var options = {
               year: 'numeric',
               month: '2-digit',
               day: '2-digit'
            };
            var formattedDate = currentDate.toLocaleDateString('en-CA', options);
            event_location = localStorage.getItem('event_location');

            // Update the input value with the selected date
            jQuery('#date_pick_main').val(formattedDate);
            jQuery('#date_pick_main').attr('data-date', formattedDate);

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_date"),
               type: 'POST',
               data: {
                  action: 'load_events_by_date',
                  date: formattedDate,
                  search_location: event_location,
               },
               success: function (response) {
                  if (response.success && response.data) {
                     // Load events for the selected date
                     jQuery('.wpem-day-view-event').html(response.data);
                  } else {
                     console.error("No events found or response data is empty.");
                  }
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               }
            });
         },
 
         ///<summary>
         ///Reste the local storage
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         resetSelectedItem: function (event) {
            var selectedView = localStorage.getItem('selected_view');
            if (jQuery('#calendar_default_view').length && selectedView) {
               var optionExists = false;
               jQuery('#calendar_default_view option').each(function() {
                  if (jQuery(this).val() === selectedView) {
                        optionExists = true;
                        return false;
                  }
               });
               if (!optionExists) {
                  localStorage.removeItem('selected_view');
               }
            }
         },

         ///<summary>
         ///Delete Calendar Event
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         deleteEventCalendar: function (event) {
         event.preventDefault();
            const href = jQuery(this).attr('href');
            const urlParams = new URLSearchParams(href.split('?')[1]);
            const postId = urlParams.get('event_id');
            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "delete_google_calendar_event"),
               type: 'POST',
               data: {
                  action: 'delete_google_calendar_event',
                  post_id: postId,
               },
               success: function (response) {
                  if (response.success) {
                     window.location.href = href;
                  } else {
                  window.location.href = href;
                  }
            },
            error: function () {
                  console.log('AJAX request failed.');
            }
            });
         },

         ///<summary>
         ///Manual Sync
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         syncEventCalendar: function (event) {
         event.preventDefault();
            const event_id = jQuery(this).attr('id');
            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "sync_google_calendar_event"),
               type: 'POST',
               data: {
                  action: 'sync_google_calendar_event',
                  post_id: event_id,
               },
               success: function (response) {
                  if (response.success) {
                     alert('Event is synced with Calendar');
                  } else {
                  alert('Event is not synced with Calendar');
                  }
            },
            error: function () {
               console.log('AJAX request failed.');
            }
            });
         },
 
         ///<summary>
         ///Handles the navigation to the previous day in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since> 
         navigatePreviousDay: function (event) {
            var date = jQuery('#date_pick_main').val();
            var currentDate = new Date(date);
            currentDate.setDate(currentDate.getDate() - 1);

            var options = {
               year: 'numeric',
               month: '2-digit',
               day: '2-digit'
            };
            var formattedDate = currentDate.toLocaleDateString('en-CA', options);
            event_location = localStorage.getItem('event_location');
            var search_keywords = jQuery('#search_keywords').val();
         var search_location = jQuery('#search_location').val();
         var search_datetimes = jQuery('#search_datetimes').val();
         var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();
         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }
         var data_cat = jQuery('.event_listings').data("categories");
         if (search_categories == null) {
            var search_categories = data_cat;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
         if (!event_location) {
            event_location = search_location;
         }

            jQuery('#date_pick_main').val(formattedDate);
            jQuery('#date_pick_main').attr('data-date', formattedDate);

            jQuery('.wpem-day-view-event').empty();
            jQuery('.wpem-day-view-event').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_date"),
               type: 'POST',
               data: {
               action: 'load_events_by_date',
               date: formattedDate,
               search_location: event_location,
               search_keywords: search_keywords,
               search_datetimes: search_datetimes,
               search_categories: search_categories,
               search_event_types: search_event_types
               },
               success: function (response) {
                  if (response.success && response.data) {
                     jQuery('.wpem-day-view-event').html(response.data);
                  } else {
                     console.error("No events found or response data is empty.");
                  }
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               }
            });
         },

         ///<summary>
         ///Handles the navigation to the next day in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         navigateNextDay: function (event) {
            var date = jQuery('#date_pick_main').val();
            var currentDate = new Date(date);

            // Increment the date by one day
            currentDate.setDate(currentDate.getDate() + 1);

            var options = {
               year: 'numeric',
               month: '2-digit',
               day: '2-digit'
            };
            var newNextDayValue = currentDate.toLocaleDateString('en-CA', options);
            event_location = localStorage.getItem('event_location');
            var search_keywords = jQuery('#search_keywords').val();
         var search_location = jQuery('#search_location').val();
         var search_datetimes = jQuery('#search_datetimes').val();
         var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }
         var data_cat = jQuery('.event_listings').data("categories");
         if (search_categories == null) {
            var search_categories = data_cat;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
         if (!event_location) {
            event_location = search_location;
         }

            jQuery('#date_pick_main').val(newNextDayValue);
            jQuery('#date_pick_main').attr('data-date', newNextDayValue);

            jQuery('.wpem-day-view-event').empty();
            jQuery('.wpem-day-view-event').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_date"),
               type: 'POST',
               data: {
               action: 'load_events_by_date',
               date: newNextDayValue,
               search_location: event_location,
               search_keywords: search_keywords,
               search_datetimes: search_datetimes,
               search_categories: search_categories,
               search_event_types: search_event_types
               },
               success: function (response) {
                  if (response.success) {
                     jQuery('.wpem-day-view-event').html(response.data);
                  } else {
                     jQuery('.wpem-day-view-event').html('<p>' + response.data + '</p>');
                  }
                  event.preventDefault();
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               }
            });
         },

         ///<summary>
         ///Handles the navigation to the same date.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         navigateTodayDay: function (event) {
            var date = new Date();
            var currentDate = new Date(date);
            currentDate.setDate(currentDate.getDate());

            var options = {
               year: 'numeric',
               month: '2-digit',
               day: '2-digit'
            };
            var newNextDayValue = currentDate.toLocaleDateString('en-CA', options);
            event_location = localStorage.getItem('event_location');

            jQuery('#date_pick_main').val(newNextDayValue);
            jQuery('#date_pick_main').attr('data-date', newNextDayValue);

            jQuery('.wpem-day-view-event').empty();
            jQuery('.wpem-day-view-event').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_date"),
               type: 'POST',
               data: {
                  action: 'load_events_by_date',
                  date: newNextDayValue,
                  search_location: event_location,
               },
               success: function (response) {
                  if (response.success) {
                     jQuery('.wpem-day-view-event').html(response.data);
                  } else {
                     jQuery('.wpem-day-view-event').html('<p>' + response.data + '</p>');
                  }
                  event.preventDefault();
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               }
            });
         },
 
         ///<summary>
         ///Handles the navigation to the previous year in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getPrevYear: function (e) {
            e.preventDefault();
         var $select = jQuery('#current_year');
         var currentYear = parseInt($select.val());
         if (!isNaN(currentYear)) {
               var newYear = currentYear - 1;
               if ($select.find('option[value="' + newYear + '"]').length > 0) {
                  $select.val(newYear).trigger('change');
               }
         }
            EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);
         },
         
         ///<summary>
         ///Handles the navigation to the next year in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getNextYear: function (e) {
            e.preventDefault();
         var $select = jQuery('#current_year');
         var currentYear = parseInt($select.val());
         if (!isNaN(currentYear)) {
               var newYear = currentYear + 1;
               if ($select.find('option[value="' + newYear + '"]').length > 0) {
                  $select.val(newYear).trigger('change');
               }
         }
            EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);
         },

         ///<summary>
         ///Handles the navigation to the next year in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getYearbySelect: function (e) {
         EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);
         },

         ///<summary>
         ///Handles the navigation to the next year in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getYearbyTodaySelect: function (e) {
         var currentYear = new Date().getFullYear();
         var $select = jQuery('#current_year');
         if ($select.find('option[value="' + currentYear + '"]').length > 0) {
            $select.val(currentYear).trigger('change');
         }
         EventCalendarAjaxFilter.actions.getCalendarLayoutData(event);
         },

         ///<summary>
         ///Handles the navigation to the next week in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getNextweek: function () {
            var currentWeek = jQuery('#current_week').attr('value');
            var nextWeek = parseInt(currentWeek) + (7 * 24 * 60 * 60);
            jQuery('#current_week').attr('value', nextWeek);
            var nextWeekStartDate = new Date(nextWeek * 1000);
            var nextWeekEndDate = new Date((nextWeek + (6 * 24 * 60 * 60)) * 1000);
            var startDateFormatted = nextWeekStartDate.getDate() + ' ' + nextWeekStartDate.toLocaleString('default', {
               month: 'short'
            });
            var endDateFormatted = nextWeekEndDate.getDate() + ' ' + nextWeekEndDate.toLocaleString('default', {
               month: 'short'
            });

            jQuery('#current_week').text(startDateFormatted + ' - ' + endDateFormatted);
            jQuery('#calendar-content').empty();
            jQuery('#calendar-content').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');
            var search_keywords = jQuery('#search_keywords').val();
            var search_location = jQuery('#search_location').val();
            var search_datetimes = jQuery('#search_datetimes').val();
            var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }
            var data_cat = jQuery('.event_listings').data("categories");
            event_location = localStorage.getItem('event_location');
            if (search_categories == null) {
            var search_categories = data_cat;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
         if (!event_location) {
            event_location = search_location;
         }

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_week"),
               type: 'POST',
               data: {
                  action: 'load_events_by_week',
                  week: nextWeek,
                  search_location: event_location,
                  search_keywords: search_keywords,
                  search_datetimes: search_datetimes,
                  search_categories: search_categories,
                  search_event_types: search_event_types
               },
               success: function (response) {
                  jQuery('#calendar-content').html(response);
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               },
               complete: function () {
               jQuery('#hidden_date_picker_week').datepicker({
                     dateFormat: 'yy-mm-dd',
                     beforeShow: function(input, inst) {
                        var offset = jQuery('#current_week').offset();
                        setTimeout(function() {
                           inst.dpDiv.css({
                              top: offset.top + jQuery('#current_week').outerHeight(),
                              left: offset.left
                           });
                        }, 0);
                     },
               });
                  jQuery('#current_week').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker_week').focus();
                  });
                  jQuery('.wpem-loading-spinner').remove();
               }
            });
         },

         ///<summary>
         /// Handles displaying the current week in the calendar.
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         getTodayWeek: function () {
            var todayTimestamp = Math.floor(Date.now() / 1000);
            jQuery('#current_week').attr('value', todayTimestamp);
            var todayDate = new Date(todayTimestamp * 1000);
            var endDate = new Date((todayTimestamp + (6 * 24 * 60 * 60)) * 1000);
            var startDateFormatted = todayDate.getDate() + ' ' + todayDate.toLocaleString('default', {
               month: 'short'
            });
            var endDateFormatted = endDate.getDate() + ' ' + endDate.toLocaleString('default', {
               month: 'short'
            });
            jQuery('#current_week').text(startDateFormatted + ' - ' + endDateFormatted);
            jQuery('#calendar-content').empty();
            jQuery('#calendar-content').append(
               '<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>'
            );
            event_location = localStorage.getItem('event_location');

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_week"),
               type: 'POST',
               data: {
                  action: 'load_events_by_week',
                  week: todayTimestamp,
                  search_location: event_location,
               },
               success: function (response) {
                  jQuery('#calendar-content').html(response);
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               },
               complete: function () {
                  jQuery('#hidden_date_picker_week').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#current_week').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#current_week').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
                  });
                     jQuery('#current_week').on('click', function(e) {
                     e.preventDefault();
                     jQuery('#hidden_date_picker_week').focus();
                     });
                  jQuery('.wpem-loading-spinner').remove();
               }
            });
         },

         ///<summary>
         /// Handles displaying the datepicker week in the calendar.
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         currentWeek: function () {
            var dateString = jQuery('#hidden_date_picker_week').val();
            var selectedDate = new Date(dateString);
            var todayTimestamp = Math.floor(selectedDate.getTime() / 1000);
            jQuery('#current_week').attr('value', todayTimestamp);
            var todayDate = new Date(todayTimestamp * 1000);
            var endDate = new Date((todayTimestamp + (6 * 24 * 60 * 60)) * 1000);
            var startDateFormatted = todayDate.getDate() + ' ' + todayDate.toLocaleString('default', {
               month: 'short'
            });
            var endDateFormatted = endDate.getDate() + ' ' + endDate.toLocaleString('default', {
               month: 'short'
            });
            jQuery('#current_week').text(startDateFormatted + ' - ' + endDateFormatted);
            jQuery('#calendar-content').empty();
            jQuery('#calendar-content').append(
               '<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>'
            );
            event_location = localStorage.getItem('event_location');

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_week"),
               type: 'POST',
               data: {
                  action: 'load_events_by_week',
                  week: todayTimestamp,
                  search_location: event_location,
               },
               success: function (response) {
                  jQuery('#calendar-content').html(response);
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               },
               complete: function () {
                  jQuery('#hidden_date_picker_week').datepicker({
                        dateFormat: 'yy-mm-dd',
                        beforeShow: function(input, inst) {
                           var offset = jQuery('#current_week').offset();
                           setTimeout(function() {
                              inst.dpDiv.css({
                                 top: offset.top + jQuery('#current_week').outerHeight(),
                                 left: offset.left
                              });
                           }, 0);
                        },
                  });
                     jQuery('#current_week').on('click', function(e) {
                     e.preventDefault();
                     jQuery('#hidden_date_picker_week').focus();
                     });
                  jQuery('.wpem-loading-spinner').remove();
               }
            });
         },

         ///<summary>
         ///Handles the navigation to the previous week in the calendar.
         ///</summary>
         ///<returns type="void" />   
         ///<since>1.0.0</since>
         getPrevweek: function () {
            var currentWeek = jQuery('#current_week').attr('value');
            var prevWeek = parseInt(currentWeek) - (7 * 24 * 60 * 60);
            jQuery('#current_week').attr('value', prevWeek);
            var prevWeekStartDate = new Date(prevWeek * 1000);
            var prevWeekEndDate = new Date((prevWeek + (6 * 24 * 60 * 60)) * 1000);
            var startDateFormatted = prevWeekStartDate.getDate() + ' ' + prevWeekStartDate.toLocaleString('default', {
               month: 'short'
            });
            var endDateFormatted = prevWeekEndDate.getDate() + ' ' + prevWeekEndDate.toLocaleString('default', {
               month: 'short'
            });
            jQuery('#current_week').text(startDateFormatted + ' - ' + endDateFormatted);
            jQuery('#calendar-content').empty();
            jQuery('#calendar-content').append('<div class="wpem-loading-spinner" style="text-align: center; font-size: 18px !important; color: #0096ff !important;">Loading...</div>');
            var search_keywords = jQuery('#search_keywords').val();
            var search_location = jQuery('#search_location').val();
            var search_datetimes = jQuery('#search_datetimes').val();
            var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }
            var data_cat = jQuery('.event_listings').data("categories");
            if (search_categories == null) {
            var search_categories = data_cat;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
            event_location = localStorage.getItem('event_location');
            if (!event_location) {
            event_location = search_location;
         }
            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_week"),
               type: 'POST',
               data: {
               action: 'load_events_by_week',
               week: prevWeek,
               search_location: event_location,
               search_keywords: search_keywords,
               search_datetimes: search_datetimes,
               search_categories: search_categories,
               search_event_types: search_event_types
               },
               success: function (response) {
                  jQuery('#calendar-content').html(response);
               },
               error: function (jqXHR, textStatus, errorThrown) {
                  console.error("AJAX Error: ", textStatus, errorThrown);
               },
               complete: function () {
               jQuery('#hidden_date_picker_week').datepicker({
                     dateFormat: 'yy-mm-dd',
                     beforeShow: function(input, inst) {
                        var offset = jQuery('#current_week').offset();
                        setTimeout(function() {
                           inst.dpDiv.css({
                              top: offset.top + jQuery('#current_week').outerHeight(),
                              left: offset.left
                           });
                        }, 0);
                     },
               });
                  jQuery('#current_week').on('click', function(e) {
                  e.preventDefault();
                  jQuery('#hidden_date_picker_week').focus();
                  });
                  jQuery('.wpem-loading-spinner').remove();
               }
            });
         },
         ///<summary>
         ///Show - hide default layout dropdown 
         ///</summary>
         toggleDefaultLayoutList: function () {
            jQuery('#calendar_default_view').hide();
            jQuery('.wpem-event-listing-calendar-view').removeClass('map-view');
            jQuery('.google-map-loadmore').css('margin-bottom','20px');
         },
 
         /**
          * Handles the mobile view popup for events.
          * @return void
         */
         mobileViewPopup: function(){
            var day = jQuery(this).find('.day-number').text().trim();
            var eventLinks = jQuery(this).find('.calendar-event-details-link');
            var popupContent = '<h3>Events on ' + day + '</h3>';
   
            if (eventLinks.length > 0) {
               popupContent += '<ol>';
               eventLinks.each(function(index) {
                  var $link = jQuery(this);
   
                  // Exclude tooltip content
                  var tooltip = $link.find('.calendar-tooltip-box').remove();
                  var title = $link.clone().children().remove().end().text().trim();
   
                  var link = $link.attr('href');
   
                  if (title) {
                        popupContent += '<li><a href="' + link + '" target="_blank">' + title + '</a></li>';
                  }
   
                  // Restore tooltip to DOM if needed
                  if (tooltip.length) {
                        $link.append(tooltip);
                  }
               });
               popupContent += '</ol>';
            } else {
               popupContent += '<p>No events for this day.</p>';
            }
         
            jQuery('#calendar-day-popup-body').html(popupContent);
            if (window.innerWidth <= 768) {
               jQuery('#calendar-day-popup').fadeIn();
            }
         
            jQuery('.close-popup, .calendar-day-popup-overlay').on('click', function () {
               jQuery('#calendar-day-popup').fadeOut();
            });
         },
 
         ///<summary>
         /// Load more list view events.
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         loadMoreListViewEvents: function(e) {
            e.preventDefault();
            let button = jQuery('#load_more_list_events');
            let page = parseInt(button.data('page'));

            jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_more_list_events"),
               type: 'POST',
               data: {
                  action: 'load_more_list_events',
                  page: page
               },
               beforeSend: function() {
                  jQuery('#load_more_loader').addClass('wpem-loading');
               },
               success: function(response) {
                  if (response.success && response.data.html) {
                        jQuery('.wpem-calendar-list-container').append(response.data.html);
                        const maxPages = parseInt(response.data.max_num_pages);
                        page++;
                        button.data('page', page);
                        if (page > maxPages || response.data.html.includes('no-events-wrapper')) {
                           button.hide();
                        }
                  } else {
                        button.hide();
                  }
                  jQuery('#load_more_loader').removeClass('wpem-loading');
               }
            });
         },

         ///<summary>
         ///List Filter
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         listViewNavigation: function() {
         var value = jQuery('#custom_date_range_display').text();
         var search_keywords = jQuery('#search_keywords').val();
         var search_location = jQuery('#search_location').val();
         var search_datetimes = jQuery('#search_datetimes').val();
         var pre_search_categories = jQuery('input[name^="search_categories"]').val();
         var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
         var search_categories = jQuery('#search_categories').val();
         var search_event_types = jQuery('#search_event_types').val();

         if (!search_categories || search_categories === '') {
            search_categories = pre_search_categories;
         }

         if (!search_event_types || search_event_types === '') {
            search_event_types = pre_search_event_types;
         }

         var data_cat = jQuery('.event_listings').data("categories");
         var selected_view = localStorage.getItem('selected_view');
         if (search_categories == null) {
            var search_categories = data_cat;
         }
         var data_type = jQuery('.event_listings').data("event_types");
         if (search_event_types == null) {
            var search_event_types = data_type;
         }
         var search_ticket_prices = jQuery('#event_filters').find(':input[name^="search_ticket_prices"]').val();
         event_location = localStorage.getItem('event_location');
         if (!event_location) {
            event_location = search_location;
         }
         var dates = value.split(' - ');
         var startText = dates[0].trim();
         var endText = dates[1].trim();
         var startDate = new Date(startText + ', ' + new Date().getFullYear());
         var endDate = new Date(endText + ', ' + new Date().getFullYear());
         function formatDate(date) {
         return date.getFullYear() + '-' + 
                  String(date.getMonth() + 1).padStart(2, '0') + '-' + 
                  String(date.getDate()).padStart(2, '0');
         }

         var $startdate = formatDate(startDate);
         var $enddate = formatDate(endDate);

         jQuery.ajax({
               url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_list"),
               type: 'POST',
               data: {
                  action: 'load_events_by_list',
                  startdate: $startdate,
                  enddate: $enddate,
                  search_location: event_location,
                  search_keywords: search_keywords,
                  search_datetimes: search_datetimes,
                  search_categories: search_categories,
                  search_event_types: search_event_types
               },
               success: function (response) {
                  jQuery('.wpem-calendar-view-container').html(response);
               }
         });

         },

         ///<summary>
         ///Summary Filter
         ///</summary>     
         ///<returns type="initialization filters" />   
         /// <since>1.0.0</since> 
         SummaryViewNavigation: function() {
            var value = jQuery('#custom_date_range_display_summary').text();
            var search_keywords = jQuery('#search_keywords').val();
            var search_location = jQuery('#search_location').val();
            var search_datetimes = jQuery('#search_datetimes').val();
            var pre_search_categories = jQuery('input[name^="search_categories"]').val();
            var pre_search_event_types = jQuery('input[name^="search_event_types"]').val();
            var search_categories = jQuery('#search_categories').val();
            var search_event_types = jQuery('#search_event_types').val();

            if (!search_categories || search_categories === '') {
               search_categories = pre_search_categories;
            }

            if (!search_event_types || search_event_types === '') {
               search_event_types = pre_search_event_types;
            }
            var data_cat = jQuery('.event_listings').data("categories");
            var selected_view = localStorage.getItem('selected_view');
            if (search_categories == null) {
               var search_categories = data_cat;
            }
            var data_type = jQuery('.event_listings').data("event_types");
            if (search_event_types == null) {
               var search_event_types = data_type;
            }
            var search_ticket_prices = jQuery('#event_filters').find(':input[name^="search_ticket_prices"]').val();
            var dates = value.split(' - ');
            var startText = dates[0].trim();
            var endText = dates[1].trim();
            var startDate = new Date(startText + ', ' + new Date().getFullYear());
            var endDate = new Date(endText + ', ' + new Date().getFullYear());
            function formatDate(date) {
            return date.getFullYear() + '-' + 
                    String(date.getMonth() + 1).padStart(2, '0') + '-' + 
                    String(date.getDate()).padStart(2, '0');
            }

            var $startdate = formatDate(startDate);
            var $enddate = formatDate(endDate);
            event_location = localStorage.getItem('event_location');
            if (!event_location) {
               event_location = search_location;
            }
            jQuery.ajax({
                url: event_manager_calendar_event_calendar_ajax_filters.ajax_url.toString().replace("%%endpoint%%", "load_events_by_summary"),
                type: 'POST',
                data: {
                    action: 'load_events_by_summary',
                    startdate: $startdate,
                    enddate: $enddate,
                    search_location: event_location,
                    search_keywords: search_keywords,
                    search_datetimes: search_datetimes,
                    search_categories: search_categories,
                    search_event_types: search_event_types
                },
                success: function (response) {
                    jQuery('.wpem-calendar-view-container').html(response);
                }
            });

         },

         //<summary>
         /// update range.
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         updateDateRangeDisplay: function(startDate) {
            const endDate = new Date(startDate);
            endDate.setMonth(endDate.getMonth() + 1);
            function formatDateDatepicker(date) {
            const options = { month: 'long', day: 'numeric' };
            return date.toLocaleDateString(undefined, options);
            }
            jQuery('#custom_date_range_display').text(`${formatDateDatepicker(startDate)} - ${formatDateDatepicker(endDate)}`);
            EventCalendarAjaxFilter.actions.listViewNavigation();
         },

         ///<summary>
         /// Load datepicker.
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         loadListEventsDatepicker: function(e) {
            e.preventDefault();
            let currentStartDate = jQuery('#hidden_date_picker').val();
            let dateParts = currentStartDate.split('-');
            let finalDate = new Date(
            parseInt(dateParts[0]),
            parseInt(dateParts[1]) - 1,
            parseInt(dateParts[2])
            );

            let now = new Date();
            finalDate.setHours(now.getHours(), now.getMinutes(), now.getSeconds());
            currentStartDate = finalDate;
            EventCalendarAjaxFilter.actions.updateDateRangeDisplay(currentStartDate);
         },

         //<summary>
         /// update range
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         updateDateRangeDisplaySummary: function(startDate) {
            const endDate = new Date(startDate);
            endDate.setMonth(endDate.getMonth() + 1);
            function formatDateDatepickerSummary(date) {
            const options = { month: 'long', day: 'numeric' };
            return date.toLocaleDateString(undefined, options);
            }
            jQuery('#custom_date_range_display_summary').text(`${formatDateDatepickerSummary(startDate)} - ${formatDateDatepickerSummary(endDate)}`);
            EventCalendarAjaxFilter.actions.SummaryViewNavigation();
         },

         ///<summary>
         /// Load summary datepicker events
         ///</summary>
         ///<returns type="void" />
         ///<since>1.0.0</since>
         loadSummaryEventsDatepicker: function(e) {
            e.preventDefault();
            let currentStartDate = jQuery('#hidden_date_picker_summary').val();
            let dateParts = currentStartDate.split('-');
            let finalDate = new Date(
            parseInt(dateParts[0]),
            parseInt(dateParts[1]) - 1,
            parseInt(dateParts[2])
            );

            let now = new Date();
            finalDate.setHours(now.getHours(), now.getMinutes(), now.getSeconds());
            currentStartDate = finalDate;
            EventCalendarAjaxFilter.actions.updateDateRangeDisplaySummary(currentStartDate);
         }
       },
    }
 };
 EventCalendarAjaxFilter = EventCalendarAjaxFilter();
 
 jQuery(document).ready(function (jQuery) {
    EventCalendarAjaxFilter.init();
 });
 
 jQuery.fn.insertAt = function (index, element) {
   var lastIndex = this.children().size()
   if (index < 0) {
      index = Math.max(0, lastIndex + 1 + index)
   }
   this.append(element)
   if (index < lastIndex) {
      this.children().eq(index).before(this.children().last())
   }
   return this;
};
// source --> https://familienzentrum-sonnenschein.at/wp-content/plugins/wp-event-manager-export/assets/js/jquery.validate.min.js?ver=1 
/*! jQuery Validation Plugin - v1.11.1 - 3/22/2013\n* https://github.com/jzaefferer/jquery-validation
* Copyright (c) 2013 JÃ¶rn Zaefferer; Licensed MIT */(function(t){t.extend(t.fn,{validate:function(e){if(!this.length)return e&&e.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."),void 0;var i=t.data(this[0],"validator");return i?i:(this.attr("novalidate","novalidate"),i=new t.validator(e,this[0]),t.data(this[0],"validator",i),i.settings.onsubmit&&(this.validateDelegate(":submit","click",function(e){i.settings.submitHandler&&(i.submitButton=e.target),t(e.target).hasClass("cancel")&&(i.cancelSubmit=!0),void 0!==t(e.target).attr("formnovalidate")&&(i.cancelSubmit=!0)}),this.submit(function(e){function s(){var s;return i.settings.submitHandler?(i.submitButton&&(s=t("<input type='hidden'/>").attr("name",i.submitButton.name).val(t(i.submitButton).val()).appendTo(i.currentForm)),i.settings.submitHandler.call(i,i.currentForm,e),i.submitButton&&s.remove(),!1):!0}return i.settings.debug&&e.preventDefault(),i.cancelSubmit?(i.cancelSubmit=!1,s()):i.form()?i.pendingRequest?(i.formSubmitted=!0,!1):s():(i.focusInvalid(),!1)})),i)},valid:function(){if(t(this[0]).is("form"))return this.validate().form();var e=!0,i=t(this[0].form).validate();return this.each(function(){e=e&&i.element(this)}),e},removeAttrs:function(e){var i={},s=this;return t.each(e.split(/\s/),function(t,e){i[e]=s.attr(e),s.removeAttr(e)}),i},rules:function(e,i){var s=this[0];if(e){var r=t.data(s.form,"validator").settings,n=r.rules,a=t.validator.staticRules(s);switch(e){case"add":t.extend(a,t.validator.normalizeRule(i)),delete a.messages,n[s.name]=a,i.messages&&(r.messages[s.name]=t.extend(r.messages[s.name],i.messages));break;case"remove":if(!i)return delete n[s.name],a;var u={};return t.each(i.split(/\s/),function(t,e){u[e]=a[e],delete a[e]}),u}}var o=t.validator.normalizeRules(t.extend({},t.validator.classRules(s),t.validator.attributeRules(s),t.validator.dataRules(s),t.validator.staticRules(s)),s);if(o.required){var l=o.required;delete o.required,o=t.extend({required:l},o)}return o}}),t.extend(t.expr[":"],{blank:function(e){return!t.trim(""+t(e).val())},filled:function(e){return!!t.trim(""+t(e).val())},unchecked:function(e){return!t(e).prop("checked")}}),t.validator=function(e,i){this.settings=t.extend(!0,{},t.validator.defaults,e),this.currentForm=i,this.init()},t.validator.format=function(e,i){return 1===arguments.length?function(){var i=t.makeArray(arguments);return i.unshift(e),t.validator.format.apply(this,i)}:(arguments.length>2&&i.constructor!==Array&&(i=t.makeArray(arguments).slice(1)),i.constructor!==Array&&(i=[i]),t.each(i,function(t,i){e=e.replace(RegExp("\\{"+t+"\\}","g"),function(){return i})}),e)},t.extend(t.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:t([]),errorLabelContainer:t([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(t){this.lastActive=t,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,t,this.settings.errorClass,this.settings.validClass),this.addWrapper(this.errorsFor(t)).hide())},onfocusout:function(t){this.checkable(t)||!(t.name in this.submitted)&&this.optional(t)||this.element(t)},onkeyup:function(t,e){(9!==e.which||""!==this.elementValue(t))&&(t.name in this.submitted||t===this.lastElement)&&this.element(t)},onclick:function(t){t.name in this.submitted?this.element(t):t.parentNode.name in this.submitted&&this.element(t.parentNode)},highlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).addClass(i).removeClass(s):t(e).addClass(i).removeClass(s)},unhighlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).removeClass(i).addClass(s):t(e).removeClass(i).addClass(s)}},setDefaults:function(e){t.extend(t.validator.defaults,e)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:t.validator.format("Please enter no more than {0} characters."),minlength:t.validator.format("Please enter at least {0} characters."),rangelength:t.validator.format("Please enter a value between {0} and {1} characters long."),range:t.validator.format("Please enter a value between {0} and {1}."),max:t.validator.format("Please enter a value less than or equal to {0}."),min:t.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function e(e){var i=t.data(this[0].form,"validator"),s="on"+e.type.replace(/^validate/,"");i.settings[s]&&i.settings[s].call(i,this[0],e)}this.labelContainer=t(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||t(this.currentForm),this.containers=t(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var i=this.groups={};t.each(this.settings.groups,function(e,s){"string"==typeof s&&(s=s.split(/\s/)),t.each(s,function(t,s){i[s]=e})});var s=this.settings.rules;t.each(s,function(e,i){s[e]=t.validator.normalizeRule(i)}),t(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",e).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",e),this.settings.invalidHandler&&t(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),t.extend(this.submitted,this.errorMap),this.invalid=t.extend({},this.errorMap),this.valid()||t(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var t=0,e=this.currentElements=this.elements();e[t];t++)this.check(e[t]);return this.valid()},element:function(e){e=this.validationTargetFor(this.clean(e)),this.lastElement=e,this.prepareElement(e),this.currentElements=t(e);var i=this.check(e)!==!1;return i?delete this.invalid[e.name]:this.invalid[e.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),i},showErrors:function(e){if(e){t.extend(this.errorMap,e),this.errorList=[];for(var i in e)this.errorList.push({message:e[i],element:this.findByName(i)[0]});this.successList=t.grep(this.successList,function(t){return!(t.name in e)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){t.fn.resetForm&&t(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(t){var e=0;for(var i in t)e++;return e},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{t(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(e){}},findLastActive:function(){var e=this.lastActive;return e&&1===t.grep(this.errorList,function(t){return t.element.name===e.name}).length&&e},elements:function(){var e=this,i={};return t(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&e.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in i||!e.objectLength(t(this).rules())?!1:(i[this.name]=!0,!0)})},clean:function(e){return t(e)[0]},errors:function(){var e=this.settings.errorClass.replace(" ",".");return t(this.settings.errorElement+"."+e,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=t([]),this.toHide=t([]),this.currentElements=t([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(t){this.reset(),this.toHide=this.errorsFor(t)},elementValue:function(e){var i=t(e).attr("type"),s=t(e).val();return"radio"===i||"checkbox"===i?t("input[name='"+t(e).attr("name")+"']:checked").val():"string"==typeof s?s.replace(/\r/g,""):s},check:function(e){e=this.validationTargetFor(this.clean(e));var i,s=t(e).rules(),r=!1,n=this.elementValue(e);for(var a in s){var u={method:a,parameters:s[a]};try{if(i=t.validator.methods[a].call(this,n,e,u.parameters),"dependency-mismatch"===i){r=!0;continue}if(r=!1,"pending"===i)return this.toHide=this.toHide.not(this.errorsFor(e)),void 0;if(!i)return this.formatAndAdd(e,u),!1}catch(o){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+e.id+", check the '"+u.method+"' method.",o),o}}return r?void 0:(this.objectLength(s)&&this.successList.push(e),!0)},customDataMessage:function(e,i){return t(e).data("msg-"+i.toLowerCase())||e.attributes&&t(e).attr("data-msg-"+i.toLowerCase())},customMessage:function(t,e){var i=this.settings.messages[t];return i&&(i.constructor===String?i:i[e])},findDefined:function(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t];return void 0},defaultMessage:function(e,i){return this.findDefined(this.customMessage(e.name,i),this.customDataMessage(e,i),!this.settings.ignoreTitle&&e.title||void 0,t.validator.messages[i],"<strong>Warning: No message defined for "+e.name+"</strong>")},formatAndAdd:function(e,i){var s=this.defaultMessage(e,i.method),r=/\$?\{(\d+)\}/g;"function"==typeof s?s=s.call(this,i.parameters,e):r.test(s)&&(s=t.validator.format(s.replace(r,"{$1}"),i.parameters)),this.errorList.push({message:s,element:e}),this.errorMap[e.name]=s,this.submitted[e.name]=s},addWrapper:function(t){return this.settings.wrapper&&(t=t.add(t.parent(this.settings.wrapper))),t},defaultShowErrors:function(){var t,e;for(t=0;this.errorList[t];t++){var i=this.errorList[t];this.settings.highlight&&this.settings.highlight.call(this,i.element,this.settings.errorClass,this.settings.validClass),this.showLabel(i.element,i.message)}if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(t=0;this.successList[t];t++)this.showLabel(this.successList[t]);if(this.settings.unhighlight)for(t=0,e=this.validElements();e[t];t++)this.settings.unhighlight.call(this,e[t],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return t(this.errorList).map(function(){return this.element})},showLabel:function(e,i){var s=this.errorsFor(e);s.length?(s.removeClass(this.settings.validClass).addClass(this.settings.errorClass),s.html(i)):(s=t("<"+this.settings.errorElement+">").attr("for",this.idOrName(e)).addClass(this.settings.errorClass).html(i||""),this.settings.wrapper&&(s=s.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.append(s).length||(this.settings.errorPlacement?this.settings.errorPlacement(s,t(e)):s.insertAfter(e))),!i&&this.settings.success&&(s.text(""),"string"==typeof this.settings.success?s.addClass(this.settings.success):this.settings.success(s,e)),this.toShow=this.toShow.add(s)},errorsFor:function(e){var i=this.idOrName(e);return this.errors().filter(function(){return t(this).attr("for")===i})},idOrName:function(t){return this.groups[t.name]||(this.checkable(t)?t.name:t.id||t.name)},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name).not(this.settings.ignore)[0]),t},checkable:function(t){return/radio|checkbox/i.test(t.type)},findByName:function(e){return t(this.currentForm).find("[name='"+e+"']")},getLength:function(e,i){switch(i.nodeName.toLowerCase()){case"select":return t("option:selected",i).length;case"input":if(this.checkable(i))return this.findByName(i.name).filter(":checked").length}return e.length},depend:function(t,e){return this.dependTypes[typeof t]?this.dependTypes[typeof t](t,e):!0},dependTypes:{"boolean":function(t){return t},string:function(e,i){return!!t(e,i.form).length},"function":function(t,e){return t(e)}},optional:function(e){var i=this.elementValue(e);return!t.validator.methods.required.call(this,i,e)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest++,this.pending[t.name]=!0)},stopRequest:function(e,i){this.pendingRequest--,0>this.pendingRequest&&(this.pendingRequest=0),delete this.pending[e.name],i&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(t(this.currentForm).submit(),this.formSubmitted=!1):!i&&0===this.pendingRequest&&this.formSubmitted&&(t(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(e){return t.data(e,"previousValue")||t.data(e,"previousValue",{old:null,valid:!0,message:this.defaultMessage(e,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(e,i){e.constructor===String?this.classRuleSettings[e]=i:t.extend(this.classRuleSettings,e)},classRules:function(e){var i={},s=t(e).attr("class");return s&&t.each(s.split(" "),function(){this in t.validator.classRuleSettings&&t.extend(i,t.validator.classRuleSettings[this])}),i},attributeRules:function(e){var i={},s=t(e),r=s[0].getAttribute("type");for(var n in t.validator.methods){var a;"required"===n?(a=s.get(0).getAttribute(n),""===a&&(a=!0),a=!!a):a=s.attr(n),/min|max/.test(n)&&(null===r||/number|range|text/.test(r))&&(a=Number(a)),a?i[n]=a:r===n&&"range"!==r&&(i[n]=!0)}return i.maxlength&&/-1|2147483647|524288/.test(i.maxlength)&&delete i.maxlength,i},dataRules:function(e){var i,s,r={},n=t(e);for(i in t.validator.methods)s=n.data("rule-"+i.toLowerCase()),void 0!==s&&(r[i]=s);return r},staticRules:function(e){var i={},s=t.data(e.form,"validator");return s.settings.rules&&(i=t.validator.normalizeRule(s.settings.rules[e.name])||{}),i},normalizeRules:function(e,i){return t.each(e,function(s,r){if(r===!1)return delete e[s],void 0;if(r.param||r.depends){var n=!0;switch(typeof r.depends){case"string":n=!!t(r.depends,i.form).length;break;case"function":n=r.depends.call(i,i)}n?e[s]=void 0!==r.param?r.param:!0:delete e[s]}}),t.each(e,function(s,r){e[s]=t.isFunction(r)?r(i):r}),t.each(["minlength","maxlength"],function(){e[this]&&(e[this]=Number(e[this]))}),t.each(["rangelength","range"],function(){var i;e[this]&&(t.isArray(e[this])?e[this]=[Number(e[this][0]),Number(e[this][1])]:"string"==typeof e[this]&&(i=e[this].split(/[\s,]+/),e[this]=[Number(i[0]),Number(i[1])]))}),t.validator.autoCreateRanges&&(e.min&&e.max&&(e.range=[e.min,e.max],delete e.min,delete e.max),e.minlength&&e.maxlength&&(e.rangelength=[e.minlength,e.maxlength],delete e.minlength,delete e.maxlength)),e},normalizeRule:function(e){if("string"==typeof e){var i={};t.each(e.split(/\s/),function(){i[this]=!0}),e=i}return e},addMethod:function(e,i,s){t.validator.methods[e]=i,t.validator.messages[e]=void 0!==s?s:t.validator.messages[e],3>i.length&&t.validator.addClassRules(e,t.validator.normalizeRule(e))},methods:{required:function(e,i,s){if(!this.depend(s,i))return"dependency-mismatch";if("select"===i.nodeName.toLowerCase()){var r=t(i).val();return r&&r.length>0}return this.checkable(i)?this.getLength(e,i)>0:t.trim(e).length>0},email:function(t,e){return this.optional(e)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(t)},url:function(t,e){return this.optional(e)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(t)},date:function(t,e){return this.optional(e)||!/Invalid|NaN/.test(""+new Date(t))},dateISO:function(t,e){return this.optional(e)||/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(t)},number:function(t,e){return this.optional(e)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t)},digits:function(t,e){return this.optional(e)||/^\d+$/.test(t)},creditcard:function(t,e){if(this.optional(e))return"dependency-mismatch";if(/[^0-9 \-]+/.test(t))return!1;var i=0,s=0,r=!1;t=t.replace(/\D/g,"");for(var n=t.length-1;n>=0;n--){var a=t.charAt(n);s=parseInt(a,10),r&&(s*=2)>9&&(s-=9),i+=s,r=!r}return 0===i%10},minlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s},maxlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||s>=r},rangelength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s[0]&&s[1]>=r},min:function(t,e,i){return this.optional(e)||t>=i},max:function(t,e,i){return this.optional(e)||i>=t},range:function(t,e,i){return this.optional(e)||t>=i[0]&&i[1]>=t},equalTo:function(e,i,s){var r=t(s);return this.settings.onfocusout&&r.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){t(i).valid()}),e===r.val()},remote:function(e,i,s){if(this.optional(i))return"dependency-mismatch";var r=this.previousValue(i);if(this.settings.messages[i.name]||(this.settings.messages[i.name]={}),r.originalMessage=this.settings.messages[i.name].remote,this.settings.messages[i.name].remote=r.message,s="string"==typeof s&&{url:s}||s,r.old===e)return r.valid;r.old=e;var n=this;this.startRequest(i);var a={};return a[i.name]=e,t.ajax(t.extend(!0,{url:s,mode:"abort",port:"validate"+i.name,dataType:"json",data:a,success:function(s){n.settings.messages[i.name].remote=r.originalMessage;var a=s===!0||"true"===s;if(a){var u=n.formSubmitted;n.prepareElement(i),n.formSubmitted=u,n.successList.push(i),delete n.invalid[i.name],n.showErrors()}else{var o={},l=s||n.defaultMessage(i,"remote");o[i.name]=r.message=t.isFunction(l)?l(e):l,n.invalid[i.name]=!0,n.showErrors(o)}r.valid=a,n.stopRequest(i,a)}},s)),"pending"}}}),t.format=t.validator.format})(jQuery),function(t){var e={};if(t.ajaxPrefilter)t.ajaxPrefilter(function(t,i,s){var r=t.port;"abort"===t.mode&&(e[r]&&e[r].abort(),e[r]=s)});else{var i=t.ajax;t.ajax=function(s){var r=("mode"in s?s:t.ajaxSettings).mode,n=("port"in s?s:t.ajaxSettings).port;return"abort"===r?(e[n]&&e[n].abort(),e[n]=i.apply(this,arguments),e[n]):i.apply(this,arguments)}}}(jQuery),function(t){t.extend(t.fn,{validateDelegate:function(e,i,s){return this.bind(i,function(i){var r=t(i.target);return r.is(e)?s.apply(r,arguments):void 0})}})}(jQuery);