// source --> https://www.ioco.tech/wp-content/plugins/ditto-jobs/public/js/ditto-jobs-public.js?ver=1.0.0 
(function ($) {
    'use strict';

    let pb = {};

    let init = function () {
        $(function () {
            onReady();
        });
        $(window).on('resize', function () {
            onResize();
        });
    };

    /**
     * On Document ready (when HTML has loaded)
     */
    let onReady = function () {
        if (!$('#ditto-jobs-feed-container').length) {
            return;
        }

        initFilters();

        if ($(window).width() > 909) {
            $(window).scroll(function () {
                initFilterScroll();
            });
        } else {
            let $parent = $('#ditto-jobs-feed-container'),
                $rightPanel = $('.ditto-jobs-job-feed-right-panel', $parent),
                $leftPanel = $('.ditto-jobs-job-feed-left-panel', $parent),
                $filtersContainer = $('.ditto-jobs-job-search-filter', $leftPanel);

            $rightPanel.addClass("ditto-jobs-mobile");
            $leftPanel.addClass("ditto-jobs-mobile");
            $filtersContainer.addClass("ditto-jobs-mobile");
        }
    };

    let onResize = function () {
        if (!$('#ditto-jobs-feed-container').length) {
            return;
        }

        let $parent = $('#ditto-jobs-feed-container'),
            $rightPanel = $('.ditto-jobs-job-feed-right-panel', $parent),
            $leftPanel = $('.ditto-jobs-job-feed-left-panel', $parent),
            $filtersContainer = $('.ditto-jobs-job-search-filter', $leftPanel);

        if ($(window).width() < 909) {
            $rightPanel.addClass("ditto-jobs-mobile");
            $leftPanel.addClass("ditto-jobs-mobile");
            $filtersContainer.addClass("ditto-jobs-mobile");
            initFilterScroll();
        } else {
            $rightPanel.removeClass("ditto-jobs-mobile");
            $leftPanel.removeClass("ditto-jobs-mobile");
            $filtersContainer.removeClass("ditto-jobs-mobile");
            initFilterScroll();
        }
    };

    let initFilterScroll = function () {
        let $parent = $('#ditto-jobs-feed-container'),
            $filtersContainer = $('.ditto-jobs-job-search-filter', $parent),
            scrollTop = $(window).scrollTop(),
            parentOffset = $parent.offset().top,
            $fixedHeader = $('header').first(),
            fixedHeaderHeight = $fixedHeader.outerHeight(),
            spaceAboveContainer = (parentOffset - scrollTop) - fixedHeaderHeight,
            $filterButton = $('.filter-apply', $filtersContainer),
            filterButtonOffset = $filterButton.offset().top,
            $lastViewButton = $('.apply-button', $parent).last(),
            lastViewButtonOffset = $lastViewButton.offset().top;

        if ($filtersContainer.hasClass('ditto-jobs-mobile') || !$('#ditto-no-results').hasClass('hidden')) {
            return;
        }

        if (spaceAboveContainer <= 50) {
            $filtersContainer.addClass("fixed-scrolling");

            if (filterButtonOffset >= (lastViewButtonOffset - fixedHeaderHeight - 75)) {
                $filtersContainer.addClass('at-footer');
            }

            if (($filtersContainer.offset().top - scrollTop) > (50 + fixedHeaderHeight)) {
                $filtersContainer.removeClass('at-footer');
            }
        } else {
            $filtersContainer.removeClass("fixed-scrolling");
        }
    };

    let initFilters = function () {
        let $parent = $('.ditto-jobs-job-search-filter'),
            $search = $('.primary-search', $parent),
            $searchInput = $('input', $search),
            $filterBody = $('.search-filter-listing-body', $parent),
            $filterCounterWrapper = $('.active-filter-count', $parent),
            $filterCounter = $('.filter-counter', $filterCounterWrapper),
            filterCount = 0;

        let countCheckedFilters = function () {
            let checkboxes = document.getElementsByClassName('ditto-jobs-filter-checkbox');

            filterCount = 0;
            for (let i = 0; i < checkboxes.length; ++i) {
                if (checkboxes[i].checked) {
                    filterCount = filterCount + 1;
                }
            }

            updateFilterCounter();
        };

        let updateFilterCounter = function () {
            if (filterCount > 0) {
                $filterCounterWrapper.removeClass('hidden');
                $filterCounter.html(filterCount);
            } else {
                $filterCounterWrapper.addClass('hidden');
            }
        };

        let resetFilters = function () {
            let checkboxes = document.getElementsByClassName('ditto-jobs-filter-checkbox');

            $('#ditto-no-results').addClass('hidden');

            filterCount = 0;
            for (let i = 0; i < checkboxes.length; ++i) {
                checkboxes[i].checked = false;
            }

            updateFilterCounter();

            $('.filter-category').addClass('closed').removeClass('open');

            $searchInput.val('');
            $('article.ditto-jobs-job-card').show();
        };

        $searchInput.on('input', function () {
            changeResults('search', filterCount);
        });

        /*reset on page load*/
        resetFilters();

        $('.filter-toggle', $parent).click(function () {
            $(this).closest('.filter-category').toggleClass('closed open');
            $filterBody.animate(
                {
                    scrollTop: this.parentNode.offsetTop
                }, 200);
        });

        $('.ditto-jobs-filter-checkbox', $parent).click(function () {
            countCheckedFilters();
        });

        $('.filter-apply', $parent).click(function () {
            changeResults('filters', filterCount);
            // $('.filter-category').addClass('closed').removeClass('open');
        });

        $('.filter-reset', $parent).click(function () {
            resetFilters();
        });
    };

    let changeResults = function (type, filterCount) {
        let $parent = $('.ditto-jobs-job-search-filter'),
            $search = $('.primary-search', $parent),
            $searchInput = $('input', $search),
            $filtersWrapper = $('.search-filter-listing', $parent),
            $resultsWrapper = $('.ditto-jobs-job-cards-container'),
            $noResultsText = $('#ditto-no-results', $resultsWrapper),
            $results = $('article.ditto-jobs-job-card', $resultsWrapper);

        if (type === 'filters' && filterCount === 0) {
            return;
        }

        $results.toggle();
        $noResultsText.addClass('hidden');

        if (type === 'search') {
            let searchTerm = $.trim($searchInput.val().toLowerCase());

            $results.filter(function () {
                let searchableText = $(this).text() + ' ' + $(this).data('description');
                $(this).toggle(searchableText.toLowerCase().indexOf(searchTerm) > -1);
            });
        } else if (type === 'filters') {
            let $filterCategories = $('.filter-category', $filtersWrapper),
                dataSelect = {};

            $filterCategories.each(function () {
                let $this = $(this),
                    categoryName = $this.attr('id'),
                    $filterOptions = $('.filter-options', $this),
                    $checkboxWrappers = $('.checkbox-wrap', $filterOptions);

                if ($('input:checked', $checkboxWrappers).length > 0) {
                    $.extend(dataSelect, {[categoryName]: []});

                    $('input:checked', $checkboxWrappers).each(function () {
                        dataSelect[categoryName].push($(this).attr('id'));
                    });
                }
            });

            $results.each(function () {
                let $result = $(this),
                    mustShow = true;

                for (const [category, values] of Object.entries(dataSelect)) {
                    let hasValInCategory = false;

                    values.forEach(function (item) {
                        if ($result.data(category).indexOf(item) > -1) {
                            hasValInCategory = true;
                        }
                    });

                    if (!hasValInCategory) {
                        mustShow = false;
                    }
                }

                if (mustShow) {
                    $result.show();
                }
            });
        }

        if (!$results.is(':visible')) {
            $noResultsText.removeClass('hidden');
            $parent.removeClass("fixed-scrolling");
        }
    };

    init();

    return pb;

}(jQuery));