HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux WebLive 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //proc/thread-self/root/var/www/html/wpprotonperinggit/wp-content/themes/voiture/js/listing.js
(function($) {
    "use strict";
    
    var $clonedSelectTax = {};

    $.extend($.apusThemeCore, {
        /**
         *  Initialize scripts
         */
        listing_init: function() {
            var self = this;

            self.select2Init();

            self.searchAjaxInit();
            
            self.submitListing();

            self.listingDetail();

            self.filterListingFnc();

            self.listingBtnFilter();

            self.changePaddingTopContent();

            self.mortgageCalculator();
            
            self.dashboardChartInit();
            
            $(window).resize(function(){
                setTimeout(function(){
                    self.changePaddingTopContent();
                }, 50);
            });

            self.listingCompare();
            
            if ( $('.listings-listing-wrapper.main-items-wrapper').length ) {
                $(document).on('change', 'form.filter-listing-form input, form.filter-listing-form select', function (e) {
                    var form = $(this).closest('form.filter-listing-form');
                    setTimeout(function(){
                        form.trigger('submit');
                    }, 200);
                });

                $(document).on('submit', 'form.filter-listing-form', function (e) {
                    e.preventDefault();
                    var url = $(this).attr('action');

                    var formData = $(this).find(":input").filter(function(index, element) {
                            return $(element).val() != '';
                        }).serialize();

                    if( url.indexOf('?') != -1 ) {
                        url = url + '&' + formData;
                    } else{
                        url = url + '?' + formData;
                    }
                    
                    self.listingsGetPage( url );
                    return false;
                });

                // Sort Action
                $(document).on('change', 'form.listings-ordering select.orderby', function(e) {
                    e.preventDefault();
                    $('form.listings-ordering').trigger('submit');
                });
                
                $(document).on('submit', 'form.listings-ordering', function (e) {
                    var url = $(this).attr('action');

                    var formData = $(this).find(":input").filter(function(index, element) {
                            return $(element).val() != '';
                        }).serialize();
                    
                    if( url.indexOf('?') != -1 ) {
                        url = url + '&' + formData;
                    } else{
                        url = url + '?' + formData;
                    }
                    self.listingsGetPage( url );
                    return false;
                });

                // display mode
                $(document).on('change', 'form.listings-display-mode input', function(e) {
                    e.preventDefault();
                    $('form.listings-display-mode').trigger('submit');
                });

                $(document).on('submit', 'form.listings-display-mode', function (e) {
                    var url = $(this).attr('action');

                    if( url.indexOf('?') != -1 ) {
                        url = url + '&' + $(this).serialize();
                    } else{
                        url = url + '?' + $(this).serialize();
                    }
                    self.listingsGetPage( url );
                    return false;
                });
            }

            // ajax pagination
            if ( $('.ajax-pagination').length ) {
                self.ajaxPaginationLoad();
            }

            if ( $('.page-template-page-dashboard .sidebar-wrapper:not(.offcanvas-filter-sidebar) > .sidebar-right, .page-template-page-dashboard .sidebar-wrapper:not(.offcanvas-filter-sidebar) > .sidebar-left').length ) {
                var ps = new PerfectScrollbar('.page-template-page-dashboard .sidebar-wrapper:not(.offcanvas-filter-sidebar) > .sidebar-right, .page-template-page-dashboard .sidebar-wrapper:not(.offcanvas-filter-sidebar) > .sidebar-left', {
                    wheelPropagation: true
                });
            }

            $(document).on('click', '.advance-search-btn', function(e) {
                e.preventDefault();
                $(this).closest('.search-form-inner').find('.advance-search-wrapper-fields').slideToggle('fast');
            });

            // filter fixed
            if ( $('.listings-filter-sidebar-wrapper').length ) {
                var ps = new PerfectScrollbar('.listings-filter-sidebar-wrapper', {
                    wheelPropagation: true
                });
            }

            self.galleryPropery();

            $('.view-user-cars-btn').on('click', function(){
                $('html, body').animate({
                    scrollTop: $("#user-listings-wrapper").offset().top
                }, 2000);
            });
        },
        select2Init: function() {
            // select2
            if ( $.isFunction( $.fn.select2 ) && typeof wp_cardealer_select2_opts !== 'undefined' ) {
                var select2_args = wp_cardealer_select2_opts;
                select2_args['allowClear']              = true;
                select2_args['minimumResultsForSearch'] = 10;
                
                if ( typeof wp_cardealer_select2_opts.language_result !== 'undefined' ) {
                    select2_args['language'] = {
                        noResults: function(){
                            return wp_cardealer_select2_opts.language_result;
                        }
                    };
                }
                var filter_select2_args = select2_args;
                
                select2_args['allowClear'] = false;
                select2_args['theme'] = 'default';

                var register_select2_args = select2_args;
                // register_select2_args['minimumResultsForSearch'] = -1;
                // filter
                
                $.fn.filterSelect2Tax = function( class_a = ''){
                    if( $(this).is('select') ){
                        var allowclear = true;
                        var width = $(this).data('width') ? $(this).data('width') : '100%';
                        if ( $(this).hasClass('select2-hidden-accessible') ) {
                            $(this).select2('destroy');
                        }
                        $(this).empty();
                        $(this).append( $('option.condition--all', $clonedSelectTax[$(this).attr('name')]).clone() );
                        $(this).append( $('option.' + class_a, $clonedSelectTax[$(this).attr('name')]).clone() );
                        $(this).select2({
                            allowClear: allowclear,
                            width: width,
                            minimumResultsForSearch: 10
                        });
                    }
                    return $(this);
                }
                
                $('select[name=email_frequency]').select2( select2_args );
                $('.register-form select').select2( register_select2_args );
                
                filter_select2_args['allowClear'] = true;

                $('.filter-tax-select[data-condition^="listing_"]').each(function () {
                    $clonedSelectTax[$(this).attr('name')] = $(this).clone();
                });

                $('.filter-tax-select[name="filter-category"]').on('change', function(){
                    var value = $(this).val();
                    if ( value ) {
                        $('.filter-tax-select[data-condition="listing_category"]').each(function () {
                            $(this).filterSelect2Tax('condition-' + value); //will create a select2 with only the car class options.
                        });
                    }
                });

                if ( $('.filter-tax-select[name="filter-category"]').length ) {
                    var value = $('.filter-tax-select[name="filter-category"]').val();
                    if ( value ) {
                        $('.filter-tax-select[data-condition="listing_category"]').each(function () {
                            $(this).filterSelect2Tax('condition-' + value); //will create a select2 with only the car class options.
                        });
                    }
                }
                $('.filter-tax-select[name="filter-make"]').on('change', function(){
                    var value = $(this).val();
                    if ( value ) {
                        $('.filter-tax-select[data-condition="listing_make"]').each(function () {
                            $(this).filterSelect2Tax('condition-' + value); //will create a select2 with only the car class options.
                        });
                    }
                });
                
                if ( $('.filter-tax-select[name="filter-make"]').length ) {
                    var value = $('.filter-tax-select[name="filter-make"]').val();
                    if ( value ) {
                        $('.filter-tax-select[data-condition="listing_make"]').each(function () {
                            $(this).filterSelect2Tax('condition-' + value); //will create a select2 with only the car class options.
                        });
                    }
                }

                $('.filter-listing-form select').select2( filter_select2_args );


                
            }
        },
        searchAjaxInit: function() {
            if ( $.isFunction( $.fn.typeahead ) ) {
                $('.apus-autocompleate-input').each(function(){
                    var $this = $(this);
                    $this.typeahead({
                            'hint': true,
                            'highlight': true,
                            'minLength': 2,
                            'limit': 10
                        }, {
                            name: 'search',
                            source: function (query, processSync, processAsync) {
                                processSync([voiture_listing_opts.empty_msg]);
                                $this.closest('.twitter-typeahead').addClass('loading');

                                var values = {};
                                $.each($this.closest('form').serializeArray(), function (i, field) {
                                    values[field.name] = field.value;
                                });

                                var ajaxurl = voiture_listing_opts.ajaxurl;
                                if ( typeof wp_cardealer_opts.ajaxurl_endpoint !== 'undefined' ) {
                                    var ajaxurl =  wp_cardealer_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'voiture_autocomplete_search_listings' );
                                }

                                return $.ajax({
                                    url: ajaxurl,
                                    type: 'GET',
                                    data: {
                                        'search': query,
                                        'data': values
                                    },
                                    dataType: 'json',
                                    success: function (json) {
                                        $this.closest('.twitter-typeahead').removeClass('loading');
                                        $this.closest('.has-suggestion').removeClass('active');
                                        return processAsync(json);
                                    }
                                });
                            },
                            templates: {
                                empty : [
                                    '<div class="empty-message">',
                                    voiture_listing_opts.empty_msg,
                                    '</div>'
                                ].join('\n'),
                                suggestion: Handlebars.compile( voiture_listing_opts.template )
                            },
                        }
                    );
                    $this.on('typeahead:selected', function (e, data) {
                        e.preventDefault();
                        setTimeout(function(){
                            $('.apus-autocompleate-input').val(data.title);    
                        }, 5);
                        
                        return false;
                    });
                });
            }
        },
        submitListing: function() {
            $(document).on('click', 'ul.submit-listing-heading li a', function(e) {
                e.preventDefault();
                var href = $(this).attr('href');
                if ( $(href).length ) {
                    $('ul.submit-listing-heading li').removeClass('active');
                    $(this).closest('li').addClass('active');
                    $('.before-group-row').removeClass('active');
                    $(href).addClass('active');

                    $( "input" ).trigger( "pxg:simplerefreshmap" );
                }
            });

            $(document).on('click', '.job-submission-previous-btn, .job-submission-next-btn', function(e) {
                e.preventDefault();
                var index = $(this).data('index');
                if ( $('.before-group-row-'+index).length ) {
                    $('.before-group-row').removeClass('active');
                    $('.before-group-row-'+index).addClass('active');

                    $('.submit-listing-heading li').removeClass('active');
                    $('.submit-listing-heading-'+index).addClass('active');

                    $( "input" ).trigger( "pxg:simplerefreshmap" );
                }
            });
        },
        changePaddingTopContent: function() {
            var admin_bar_h = 0;
            if ( $('#wpadminbar').length ){
                var admin_bar_h = $('#wpadminbar').outerHeight();
            }
            var header_h = 0;
            if ($(window).width() >= 1200) {
                if ( $('#apus-header').length ) {
                    var header_h = $('#apus-header').outerHeight();
                }

                $('.inner-dashboard .sidebar').css({ 'top': header_h + admin_bar_h });
                $('body.page-template-page-dashboard #apus-main-content').css({ 'padding-top': header_h });
            } else {

                var header_mobile = $('#apus-header-mobile').outerHeight();

                if ( $('#apus-header-mobile').length ) {
                    var header_h = $('#apus-header-mobile').outerHeight();
                }

                $('body.page-template-page-dashboard #apus-main-content').css({ 'padding-top': header_mobile });
                $('.inner-dashboard .sidebar').css({ 'top': header_h + admin_bar_h });
            }
            
            if ($('#listings-google-maps').is('.fix-map')) {
                var header_h = header_h + admin_bar_h;
                if ( $('.layout-type-half-map-v4 .listings-filter-sidebar-wrapper').length ) {
                    $('.layout-type-half-map-v4 .listings-filter-sidebar-wrapper').css({ 'top': header_h, 'height': 'calc(100vh - ' + header_h+ 'px)' });
                }

                if ($(window).width() >= 1200) {
                    $('#apus-main-content').css({ 'padding-top': header_h - admin_bar_h });
                } else{
                    $('#apus-main-content').css({ 'padding-top': header_mobile });
                }

                $('#listings-google-maps').css({ 'top': header_h, 'height': 'calc(100vh - ' + header_h+ 'px)' });
                
            }

            // fix for header
            $('body.page-template-page-dashboard #apus-header, body.fix-header #apus-header').css({ 'top': admin_bar_h });
            $('body.page-template-page-dashboard #apus-header-mobile, body.fix-header #apus-header-mobile').css({ 'top': admin_bar_h });


            // fix for half map
            $('.layout-type-half-map .filter-sidebar').css({ 'padding-top': header_h + 30 });
            if ( $('.layout-type-half-map .filter-scroll').length ) {
                var ps = new PerfectScrollbar('.layout-type-half-map .filter-scroll', {
                    wheelPropagation: true
                });
            }
            // offcanvas-filter-sidebar 
            $('.offcanvas-filter-sidebar').css({ 'padding-top': header_h + 10 });
        },
        listingDetail: function() {
            var self = this;
            
            var adjustheight = 145;
            $('.show-more-less-wrapper').each(function(){
                var desc_height = $(this).closest('.description-inner').find('.description-inner-wrapper').height();
                if ( desc_height > adjustheight ) {
                    $(this).closest('.description-inner').addClass('show-more');
                    $(this).closest('.description-inner').find('.description-inner-wrapper').css({
                        'height': adjustheight,
                        'overflow': 'hidden',
                    });
                }
                $(this).find('.show-more').on('click', function(){
                    $(this).closest('.description-inner').removeClass('show-more').addClass('show-less');
                    $(this).closest('.description-inner').find('.description-inner-wrapper').css({
                        'height': 'auto',
                        'overflow': 'visible',
                    });
                });
                $(this).find('.show-less').on('click', function(){
                    $(this).closest('.description-inner').removeClass('show-less').addClass('show-more');
                    $(this).closest('.description-inner').find('.description-inner-wrapper').css({
                        'height': adjustheight,
                        'overflow': 'hidden',
                    });
                });
            });

            
            $('.btn-print-listing').on('click', function(e){
                e.preventDefault();
                
                var $this = $(this);
                $this.addClass('loading');
                var listing_id = $(this).data('listing_id');
                var nonce = $(this).data('nonce');

                var ajaxurl = voiture_listing_opts.ajaxurl;
                if ( typeof wp_cardealer_opts.ajaxurl_endpoint !== 'undefined' ) {
                    var ajaxurl =  wp_cardealer_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'voiture_ajax_print_listing' );
                }

                var printWindow = window.open('', 'Print Me', 'width=700 ,height=842');
                $.ajax({
                    url: ajaxurl,
                    type:'POST',
                    dataType: 'html',
                    data: {
                        'listing_id': listing_id,
                        'nonce': nonce,
                        'action': 'voiture_ajax_print_listing',
                    }
                }).done(function(data) {
                    $this.removeClass('loading');
                    
                    printWindow.document.write(data);
                    printWindow.document.close();
                    printWindow.focus();

                });

            });

            $('.contact-form-popup-btn').magnificPopup({
                mainClass: 'apus-mfp-zoom-in contact-form-popup',
                type:'inline',
                midClick: true,
                modal: false
            });

            $('.send-private-message-btn').magnificPopup({
                mainClass: 'apus-mfp-zoom-in private-message-form-popup',
                type:'inline',
                midClick: true,
                modal: false
            });

            $('.make-an-offer-btn').magnificPopup({
                mainClass: 'apus-mfp-zoom-in make-an-offer-form-popup',
                type:'inline',
                midClick: true,
                modal: false
            });

            $('.schedule-test-drives-btn').magnificPopup({
                mainClass: 'apus-mfp-zoom-in schedule-test-drives-form-popup',
                type:'inline',
                midClick: true,
                modal: false
            });

            if ( $('input.datetimepicker-date').length ) {
                $('input.datetimepicker-date').datetimepicker({
                    timepicker:true,
                    minDate:new Date(),
                    disabledDates: [new Date()],
                });
            }

            if ($('.content-listing-detail .sticky-this').length > 0 ) {
                if ($(window).width() > 991) {
                    $('.content-listing-detail .sticky-this').stick_in_parent({
                        parent: ".listing-v-wrapper"
                    });
                }
            }
        },
        mortgageCalculator: function() {
            $('#btn_mortgage_get_results').on('click', function (e) {
                e.preventDefault();

                var listing_price = $('#apus_mortgage_listing_price').val();
                var deposit = $('#apus_mortgage_deposit').val();
                var interest_rate = parseFloat($('#apus_mortgage_interest_rate').val(), 10) / 100;
                var years = parseInt($('#apus_mortgage_term_years').val(), 10);
                

                var interest_rate_month = interest_rate / 12;
                var nbp_month = years * 12;

                var loan_amount = listing_price - deposit;
                var monthly_payment = parseFloat((loan_amount * interest_rate_month) / (1 - Math.pow(1 + interest_rate_month, -nbp_month))).toFixed(2);

                if (monthly_payment === 'NaN') {
                    monthly_payment = 0;
                }
                
                $('.apus_mortgage_results').html( voiture_listing_opts.monthly_text + voiture_listing_opts.currency + monthly_payment);

            });
        },
        dashboardChartInit: function() {
            var self = this;
            var $this = $('#dashboard_listing_chart_wrapper');
            if( $this.length <= 0 ) {
                return;
            }

            // select2
            if ( $.isFunction( $.fn.select2 ) && typeof wp_cardealer_select2_opts !== 'undefined' ) {
                var select2_args = wp_cardealer_select2_opts;
                select2_args['allowClear']              = false;
                select2_args['minimumResultsForSearch'] = 10;
                
                if ( typeof wp_cardealer_select2_opts.language_result !== 'undefined' ) {
                    select2_args['language'] = {
                        noResults: function(){
                            return wp_cardealer_select2_opts.language_result;
                        }
                    };
                }
                
                select2_args['width'] = '100%';

                $('.stats-graph-search-form select').select2( select2_args );
            }


            var listing_id = $this.data('listing_id');
            var nb_days = $this.data('nb_days');
            self.dashboardChartAjaxInit($this, listing_id, nb_days);

            $('form.stats-graph-search-form select[name="listing_id"]').on('change', function(){
                $('form.stats-graph-search-form').trigger('submit');
            });

            $('form.stats-graph-search-form select[name="nb_days"]').on('change', function(){
                $('form.stats-graph-search-form').trigger('submit');
            });

            $('form.stats-graph-search-form').on('submit', function(e){
                e.preventDefault();
                var listing_id = $('form.stats-graph-search-form select[name="listing_id"]').val();
                var nb_days = $('form.stats-graph-search-form select[name="nb_days"]').val();
                self.dashboardChartAjaxInit($this, listing_id, nb_days);
                return false;
            });
        },
        dashboardChartAjaxInit: function($this, listing_id, nb_days) {
            var self = this;
            if( $this.length <= 0 ) {
                return;
            }
            var parent_div = $this.parent();
            if ( parent_div.hasClass('loading') ) {
                return;
            }
            parent_div.addClass('loading');

            var ajaxurl = voiture_listing_opts.ajaxurl;
            if ( typeof wp_cardealer_opts.ajaxurl_endpoint !== 'undefined' ) {
                ajaxurl =  wp_cardealer_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_cardealer_get_listing_chart' );
            }

            $.ajax({
                url: ajaxurl,
                type:'POST',
                dataType: 'json',
                data: {
                    action: 'wp_cardealer_get_listing_chart',
                    listing_id: listing_id,
                    nb_days: nb_days,
                    nonce: $this.data('nonce'),
                }
            }).done(function(response) {
                if (response.status == 'error') {
                    $this.remove();
                } else {
                    var ctx = $this.get(0).getContext("2d");

                    var data = {
                        labels: response.stats_labels,
                        datasets: [
                            {
                                label: response.stats_view,
                                backgroundColor: response.bg_color,
                                borderColor: response.border_color,
                                borderWidth: 1,
                                data: response.stats_values
                            },
                        ]
                    };

                    var options = {
                        //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
                        scaleBeginAtZero : true,
                        //Boolean - Whether grid lines are shown across the chart
                        scaleShowGridLines : false,
                        //String - Colour of the grid lines
                        scaleGridLineColor : "rgba(0,0,0,.05)",
                        //Number - Width of the grid lines
                        scaleGridLineWidth : 1,
                        //Boolean - Whether to show horizontal lines (except X axis)
                        scaleShowHorizontalLines: true,
                        //Boolean - Whether to show vertical lines (except Y axis)
                        scaleShowVerticalLines: true,
                        //Boolean - If there is a stroke on each bar
                        barShowStroke : false,
                        //Number - Pixel width of the bar stroke
                        barStrokeWidth : 2,
                        //Number - Spacing between each of the X value sets
                        barValueSpacing : 5,
                        //Number - Spacing between data sets within X values
                        barDatasetSpacing : 1,
                        legend: { display: false },

                        tooltips: {
                            enabled: true,
                            mode: 'x-axis',
                            cornerRadius: 4
                        },
                    }

                    if (typeof self.myBarChart !== 'undefined') {
                        self.myBarChart.destroy();
                    }

                    self.myBarChart = new Chart(ctx, {
                        type: response.chart_type,
                        data: data,
                        options: options
                    });
                }
                parent_div.removeClass('loading');
            });
        },
        listingBtnFilter: function(){
            $('.btn-view-map').on('click', function(e){
                e.preventDefault();
                $('#listings-google-maps').removeClass('hidden-sm').removeClass('hidden-xs');
                $('.content-listing .listings-listing-wrapper, .content-listing .agencies-listing-wrapper').addClass('hidden-sm').addClass('hidden-xs');
                $('.btn-view-listing').removeClass('hidden-sm').removeClass('hidden-xs');
                $(this).addClass('hidden-sm').addClass('hidden-xs');
                $('.listings-pagination-wrapper, .agencies-pagination-wrapper').addClass('p-fix-pagination');
                setTimeout(function() {
                    $(window).trigger('pxg:refreshmap');
                }, 100);
            });
            $('.btn-view-listing').on('click', function(e){
                e.preventDefault();
                $('#listings-google-maps').addClass('hidden-sm').addClass('hidden-xs');
                $('.content-listing .listings-listing-wrapper, .content-listing .agencies-listing-wrapper').removeClass('hidden-sm').removeClass('hidden-xs');
                $('.btn-view-map').removeClass('hidden-sm').removeClass('hidden-xs');
                $(this).addClass('hidden-sm').addClass('hidden-xs');
                $('.listings-pagination-wrapper, .agencies-pagination-wrapper').removeClass('p-fix-pagination');
            });

            $('.show-filter-listings').on('click', function(e){
                e.stopPropagation();
                $('.layout-type-half-map .filter-sidebar').toggleClass('active');
                $('.filter-sidebar + .over-dark').toggleClass('active');
            });
            
            $(document).on('click', '.filter-sidebar + .over-dark', function(){
                $('.layout-type-half-map .filter-sidebar').removeClass('active');
                $('.filter-sidebar + .over-dark').removeClass('active');
            });

            // filter sidebar fixed
            $(document).on('click', '.listings-filter-sidebar-wrapper .close-filter, .btn-show-filter, .filter-in-sidebar, .listings-filter-sidebar-wrapper + .over-dark-filter', function(){
                $('.listings-filter-sidebar-wrapper').toggleClass('active');
            });
        },
        filterListingFnc: function(){
            var self = this;
            $('body').on('click', '.btn-show-filter, .offcanvas-filter-sidebar + .over-dark', function(){
                $('.offcanvas-filter-sidebar, .offcanvas-filter-sidebar + .over-dark').toggleClass('active');
                // $('.offcanvas-filter-sidebar').perfectScrollbar();
                if ( $('.offcanvas-filter-sidebar').length ) {
                    var ps = new PerfectScrollbar('.offcanvas-filter-sidebar', {
                        wheelPropagation: true
                    });
                }
                
            });

            $(document).on('after_add_listing_favorite', function(e, $this, data) {
                $this.attr('data-original-title', voiture_listing_opts.favorite_added_tooltip_title);
            });
            $(document).on('after_remove_listing_favorite', function( event, $this, data ) {
                $this.attr('data-original-title', voiture_listing_opts.favorite_add_tooltip_title);
            });


            $('body').on('keyup', '.price-input-wrapper input', function(){
                var $from_val = $(this).closest('.price-input-wrapper').find('.filter-from').val();
                var $to_val = $(this).closest('.price-input-wrapper').find('.filter-to').val();
                var $wrapper = $(this).closest('.from-to-text-wrapper');

                if ( $wrapper.hasClass('price') ) {
                    if ( wp_cardealer_opts.enable_multi_currencies === 'yes' ) {
                        $from_val = self.shortenNumber($from_val);
                        $to_val = self.shortenNumber($to_val);
                    } else {
                        $from_val = self.addCommas($from_val);
                        $to_val = self.addCommas($to_val);
                    }
                    $wrapper.find('.from-text .price-text').text( $from_val );
                    $wrapper.find('.to-text .price-text').text( $to_val );
                } else {
                    $wrapper.find('.from-text').text( $from_val );
                    $wrapper.find('.to-text').text( $to_val );
                }
            });
            $('body').on('change', '.price-input-wrapper input', function(){
                var $from_val = $(this).closest('.price-input-wrapper').find('.filter-from').val();
                var $to_val = $(this).closest('.price-input-wrapper').find('.filter-to').val();
                var $wrapper = $(this).closest('.from-to-text-wrapper');
                if ( $wrapper.hasClass('price') ) {
                    if ( wp_cardealer_opts.enable_multi_currencies === 'yes' ) {
                        $from_val = self.shortenNumber($from_val);
                        $to_val = self.shortenNumber($to_val);
                    } else {
                        $from_val = self.addCommas($from_val);
                        $to_val = self.addCommas($to_val);
                    }

                    $wrapper.find('.from-text .price-text').text( $from_val );
                    $wrapper.find('.to-text .price-text').text( $to_val );
                } else {
                    $wrapper.find('.from-text').text( $from_val );
                    $wrapper.find('.to-text').text( $to_val );
                }
            });
            $('body').on('click', '.from-to-wrapper.price-list .price-filter li', function(){
                var $parent = $(this).closest('.from-to-wrapper');
                var $min = $(this).data('min');
                var $max = $(this).data('max');
                $parent.find('input.filter-from').val($min);
                $parent.find('input.filter-to').val($max);
                $(this).closest('.from-to-wrapper').find('.heading-filter-price .price-text').html($(this).find('.price-text').html());
                $(this).closest('.price-input-wrapper').slideUp();
                $(this).closest('form').trigger('submit');
            });

            $('body').on('click', '.reset-search-btn', function(e){
                e.preventDefault();
                var $form = $( this ).closest( 'form' );

                $form.find(':input').not( ':input[type="hidden"]' ).val( '' ).trigger( 'change.select2' );
                $('.main-range-slider').each(function(){
                    var $this = $(this);
                    $this.slider("values", 0, $this.data('min'));
                    $this.slider("values", 1, $this.data('max'));
                    $this.closest('.form-group-inner').find('.filter-from').val($this.data('min'));
                    $this.closest('.form-group-inner').find('.filter-to').val($this.data('max'));

                    $this.closest('.form-group-inner').find('.from-text').val($this.data('min'));
                    $this.closest('.form-group-inner').find('.to-text').val($this.data('max'));
                });

                $('.price-range-slider').each(function(){
                    var $this = $(this);
                    var $from_price = $this.data('min');
                    var $to_price = $this.data('max');

                    $this.slider("values", 0, $this.data('min'));
                    $this.slider("values", 1, $this.data('max'));

                    if ( wp_cardealer_opts.enable_multi_currencies === 'yes' ) {
                        $from_price = self.shortenNumber($from_price);
                        $to_price = self.shortenNumber($to_price);
                    } else {
                        $from_price = self.addCommas($from_price);
                        $to_price = self.addCommas($to_price);
                    }

                    $this.closest('.form-group-inner').find('.from-text .price-text').text( $from_price );
                    $this.closest('.form-group-inner').find('.filter-from').val( $this.data('min') )
                    $this.closest('.form-group-inner').find('.to-text .price-text').text( $to_price );
                    $this.closest('.form-group-inner').find('.filter-to').val( $this.data('max') );

                });

                if ( $('.listings-listing-wrapper.main-items-wrapper').length ) {
                    $form.trigger('submit');
                }
            });
        },
        listingCompare: function(){
            var self = this;
            if ( $('.compare-sidebar-inner .compare-list').length ) {
                var ps = new PerfectScrollbar('.compare-sidebar-inner .compare-list', {
                    wheelPropagation: true
                });
            }

            $(document).on('after_add_listing_compare', function(e, $this, data) {
                var html_output = '';
                if ( data.html_output ) {
                    html_output = data.html_output;
                }
                $('#compare-sidebar .compare-sidebar-inner').html(html_output);
                $('.compare-sidebar-btn .count').html(data.count);

                if ( $('.compare-sidebar-inner .compare-list').length ) {
                    var ps = new PerfectScrollbar('.compare-sidebar-inner .compare-list', {
                        wheelPropagation: true
                    });
                }

                self.layzyLoadImage();

                if ( !$('#compare-sidebar').hasClass('active') ) {
                    $('#compare-sidebar').addClass('active');
                }
                if ( !$('#compare-sidebar').hasClass('open') ) {
                    $('#compare-sidebar').addClass('open');
                }
                $this.attr('data-original-title', voiture_listing_opts.compare_added_tooltip_title);
                $this.find('span').text(voiture_listing_opts.compare_added_title);
            });
            

            $(document).on('after_remove_listing_compare', function( event, $this, data ) {
                var html_output = '';
                if ( data.html_output ) {
                    html_output = data.html_output;
                }
                $('#compare-sidebar .compare-sidebar-inner').html(html_output);
                $('.compare-sidebar-btn .count').html(data.count);
                
                if ( $('.compare-sidebar-inner .compare-list').length ) {
                    var ps = new PerfectScrollbar('.compare-sidebar-inner .compare-list', {
                        wheelPropagation: true
                    });
                }

                if ( data.count == '0' ) {
                    $('#compare-sidebar').removeClass('active');
                }

                $this.attr('data-original-title', voiture_listing_opts.compare_add_tooltip_title);
                $this.find('span').text(voiture_listing_opts.compare_title);

                self.layzyLoadImage();
            });

            $('.compare-sidebar-inner').on('click', '.btn-remove-listing-compare-list', function(e) {
                e.stopPropagation();
                var $this = $(this);
                $this.addClass('loading');
                var listing_id = $(this).data('listing_id');
                var nonce = $(this).data('nonce');

                var ajaxurl = voiture_listing_opts.ajaxurl;
                if ( typeof wp_cardealer_opts.ajaxurl_endpoint !== 'undefined' ) {
                    var ajaxurl =  wp_cardealer_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_cardealer_ajax_remove_listing_compare' );
                }
                $.ajax({
                    url: ajaxurl,
                    type:'POST',
                    dataType: 'json',
                    data: {
                        'listing_id': listing_id,
                        'nonce': nonce,
                        'action': 'wp_cardealer_ajax_remove_listing_compare',
                    }
                }).done(function(data) {
                    $this.removeClass('loading');
                    if ( data.status ) {
                        
                        $(document).trigger( "after_remove_listing_compare", [$this, data] );

                        if ( $('.btn-remove-listing-compare-list').length <= 0 ) {
                            $('#compare-sidebar').removeClass('active');
                            $('#compare-sidebar').removeClass('open');
                        }

                        $('a.btn-added-listing-compare').each(function(){
                            if ( listing_id == $(this).data('listing_id') ) {
                                $(this).removeClass('btn-added-listing-compare').addClass('btn-add-listing-compare');
                                $(this).attr('data-original-title', voiture_listing_opts.compare_add_tooltip_title);
                                $(this).find('span').text(voiture_listing_opts.compare_title);
                                $(this).data('nonce', data.nonce);
                            }
                        });
                    }
                });
            });

            $('.compare-sidebar-inner').on('click', '.btn-remove-compare-all', function(e) {
                e.stopPropagation();
                var $this = $(this);
                $this.addClass('loading');
                var nonce = $(this).data('nonce');

                var ajaxurl = voiture_listing_opts.ajaxurl;
                if ( typeof wp_cardealer_opts.ajaxurl_endpoint !== 'undefined' ) {
                    var ajaxurl =  wp_cardealer_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_cardealer_ajax_remove_all_listing_compare' );
                }

                $.ajax({
                    url: ajaxurl,
                    type:'POST',
                    dataType: 'json',
                    data: {
                        'nonce': nonce,
                        'action': 'wp_cardealer_ajax_remove_all_listing_compare',
                    }
                }).done(function(data) {
                    $this.removeClass('loading');
                    if ( data.status ) {
                        
                        $(document).trigger( "after_remove_listing_compare", [$this, data] );

                        $('a.btn-added-listing-compare').each(function(){
                            $(this).removeClass('btn-added-listing-compare').addClass('btn-add-listing-compare');
                            $(this).data('nonce', data.nonce);
                        });
                    }
                });
            });

            $('body').on('click', '#compare-sidebar .compare-sidebar-btn', function(e){
                e.stopPropagation();
                $('#compare-sidebar').toggleClass('open');
            });
            $('body').on('click', function() {
                if ($('#compare-sidebar').hasClass('open')) {
                    $('#compare-sidebar').removeClass('open');
                }
            });
            $('.compare-sidebar-inner').on('click', function(e) {
                e.stopPropagation();
            });
        },
        listingsGetPage: function(pageUrl, isBackButton){
            var self = this;
            if (self.filterAjax) { return false; }

            self.listingsSetCurrentUrl();

            if (pageUrl) {
                // Show 'loader' overlay
                self.listingsShowLoader();
                
                // Make sure the URL has a trailing-slash before query args (301 redirect fix)
                pageUrl = pageUrl.replace(/\/?(\?|#|$)/, '/$1');
                
                if (!isBackButton) {
                    self.setPushState(pageUrl);
                }

                self.filterAjax = $.ajax({
                    url: pageUrl,
                    data: {
                        load_type: 'full'
                    },
                    dataType: 'html',
                    cache: false,
                    headers: {'cache-control': 'no-cache'},
                    
                    method: 'POST', // Note: Using "POST" method for the Ajax request to avoid "load_type" query-string in pagination links
                    
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        console.log('Apus: AJAX error - listingsGetPage() - ' + errorThrown);
                        
                        // Hide 'loader' overlay (after scroll animation)
                        self.listingsHideLoader();
                        
                        self.filterAjax = false;
                    },
                    success: function(response) {
                        // Update listings content
                        self.listingsUpdateContent(response);
                        
                        self.filterAjax = false;
                    }
                });
                
            }
        },
        listingsHideLoader: function(){
            $('body').find('.main-items-wrapper').removeClass('loading');
        },
        listingsShowLoader: function(){
            $('body').find('.main-items-wrapper').addClass('loading');
        },
        setPushState: function(pageUrl) {
            window.history.pushState({apusShop: true}, '', pageUrl);
        },
        listingsSetCurrentUrl: function() {
            var self = this;
            
            // Set current page URL
            self.searchAndTagsResetURL = window.location.href;
        },
        /**
         *  Listings: Update listings content with AJAX HTML
         */
        listingsUpdateContent: function(ajaxHTML) {
            var self = this,
                $ajaxHTML = $('<div>' + ajaxHTML + '</div>');

            var $listings = $ajaxHTML.find('.main-items-wrapper'),
                $display_mode = $ajaxHTML.find('.listings-display-mode-wrapper-ajax .listings-display-mode-wrapper'),
                $pagination = $ajaxHTML.find('.main-pagination-wrapper');

            // Replace listings
            if ($listings.length) {
                $('.main-items-wrapper').replaceWith($listings);
            }
            if ($display_mode.length) {
                $('.listings-display-mode-wrapper').replaceWith($display_mode);
            }
            // Replace pagination
            if ($pagination.length) {
                $('.main-pagination-wrapper').replaceWith($pagination);
            }
            
            // Load images (init Unveil)
            self.layzyLoadImage();

            // pagination
            if ( $('.ajax-pagination').length ) {
                self.infloadScroll = false;
                self.ajaxPaginationLoad();
            }

            if ( $.isFunction( $.fn.select2 ) && typeof wp_cardealer_select2_opts !== 'undefined' ) {
                var select2_args = wp_cardealer_select2_opts;
                select2_args['allowClear']              = false;
                select2_args['minimumResultsForSearch'] = 10;
                select2_args['width'] = 'auto';
                
                if ( typeof wp_cardealer_select2_opts.language_result !== 'undefined' ) {
                    select2_args['language'] = {
                        noResults: function(){
                            return wp_cardealer_select2_opts.language_result;
                        }
                    };
                }
                
                $('select.orderby').select2( select2_args );
            }
            
            self.updateMakerCards('listings-google-maps');
            setTimeout(function() {
                // Hide 'loader'
                self.listingsHideLoader();
            }, 100);
        },

        /**
         *  Shop: Initialize infinite load
         */
        ajaxPaginationLoad: function() {
            var self = this,
                $infloadControls = $('body').find('.ajax-pagination'),                   
                nextPageUrl;

            self.infloadScroll = ($infloadControls.hasClass('infinite-action')) ? true : false;
            
            if (self.infloadScroll) {
                self.infscrollLock = false;
                
                var pxFromWindowBottomToBottom,
                    pxFromMenuToBottom = Math.round($(document).height() - $infloadControls.offset().top);
                
                /* Bind: Window resize event to re-calculate the 'pxFromMenuToBottom' value (so the items load at the correct scroll-position) */
                var to = null;
                $(window).resize(function() {
                    if (to) { clearTimeout(to); }
                    to = setTimeout(function() {
                        var $infloadControls = $('.ajax-pagination'); // Note: Don't cache, element is dynamic
                        pxFromMenuToBottom = Math.round($(document).height() - $infloadControls.offset().top);
                    }, 100);
                });
                
                $(window).scroll(function(){
                    if (self.infscrollLock) {
                        return;
                    }
                    
                    pxFromWindowBottomToBottom = 0 + $(document).height() - ($(window).scrollTop()) - $(window).height();
                    
                    // If distance remaining in the scroll (including buffer) is less than the pagination element to bottom:
                    if (pxFromWindowBottomToBottom < pxFromMenuToBottom) {
                        self.ajaxPaginationGet();
                    }
                });
            } else {
                var $productsWrap = $('body');
                /* Bind: "Load" button */
                $productsWrap.on('click', '.main-pagination-wrapper .apus-loadmore-btn', function(e) {
                    e.preventDefault();
                    self.ajaxPaginationGet();
                });
                
            }
            
            if (self.infloadScroll) {
                $(window).trigger('scroll'); // Trigger scroll in case the pagination element (+buffer) is above the window bottom
            }
        },
        /**
         *  Shop: AJAX load next page
         */
        ajaxPaginationGet: function() {
            var self = this;
            
            if (self.filterAjax) return false;
            
            // Get elements (these can be replaced with AJAX, don't pre-cache)
            var $nextPageLink = $('.apus-pagination-next-link').find('a'),
                $infloadControls = $('.ajax-pagination'),
                nextPageUrl = $nextPageLink.attr('href');
            
            if (nextPageUrl) {
                // Show 'loader'
                $infloadControls.addClass('apus-loader');
                
                // self.setPushState(nextPageUrl);

                self.filterAjax = $.ajax({
                    url: nextPageUrl,
                    data: {
                        load_type: 'items'
                    },
                    dataType: 'html',
                    cache: false,
                    headers: {'cache-control': 'no-cache'},
                    method: 'GET',
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        console.log('APUS: AJAX error - ajaxPaginationGet() - ' + errorThrown);
                    },
                    complete: function() {
                        // Hide 'loader'
                        $infloadControls.removeClass('apus-loader');
                    },
                    success: function(response) {
                        var $response = $('<div>' + response + '</div>'), // Wrap the returned HTML string in a dummy 'div' element we can get the elements
                            $gridItemElement = $('.items-wrapper', $response).html(),
                            $resultCount = $('.results-count .last', $response).html(),
                            $display_mode = $('.main-items-wrapper').data('display_mode');
                        

                        // Append the new elements
                        if ( $display_mode == 'grid') {
                            $('.main-items-wrapper .items-wrapper .row').append($gridItemElement);
                        } else {
                            $('.main-items-wrapper .items-wrapper').append($gridItemElement);
                        }
                        
                        // Append results
                        $('.main-items-wrapper .results-count .last').html($resultCount);

                        // Update Maps
                        self.updateMakerCards('listings-google-maps');
                        
                        // Load images (init Unveil)
                        self.layzyLoadImage();
                        
                        // Get the 'next page' URL
                        nextPageUrl = $response.find('.apus-pagination-next-link').children('a').attr('href');
                        
                        if (nextPageUrl) {
                            $nextPageLink.attr('href', nextPageUrl);
                        } else {
                            $('.main-items-wrapper').addClass('all-listings-loaded');
                            
                            if (self.infloadScroll) {
                                self.infscrollLock = true;
                            }
                            $infloadControls.find('.apus-loadmore-btn').addClass('hidden');
                            $nextPageLink.removeAttr('href');
                        }
                        
                        self.filterAjax = false;
                        
                        if (self.infloadScroll) {
                            $(window).trigger('scroll'); // Trigger 'scroll' in case the pagination element (+buffer) is still above the window bottom
                        }
                    }
                });
            } else {
                if (self.infloadScroll) {
                    self.infscrollLock = true; // "Lock" scroll (no more products/pages)
                }
            }
        },
        shortenNumber: function($number) {
            var self = this;

            var divisors = wp_cardealer_opts.divisors;
            var $key_sign = '';
            $.each(divisors, function( $index, $value ) {
                if ($number < ($value['divisor'] * 1000)) {
                    $key_sign = $value['key'];
                    $number = $number / $value['divisor'];
                    return false;
                }
            });

            return self.addCommas($number) + $key_sign;
        },
        addCommas: function(str) {
            var parts = (str + "").split("."),
                main = parts[0],
                len = main.length,
                output = "",
                first = main.charAt(0),
                i;
            
            if (first === '-') {
                main = main.slice(1);
                len = main.length;    
            } else {
                first = "";
            }
            i = len - 1;
            while(i >= 0) {
                output = main.charAt(i) + output;
                if ((len - i) % 3 === 0 && i > 0) {
                    output = wp_cardealer_opts.money_thousands_separator + output;
                }
                --i;
            }
            // put sign back
            output = first + output;
            // put decimal part back
            if (parts.length > 1) {
                output += wp_cardealer_opts.money_dec_point + parts[1];
            }
            
            return output;
        },
        galleryPropery: function() {
            var self = this;
            $(document).on( 'mouseenter', 'article.listing-item', function(){
                if ( !$(this).hasClass('loaded-gallery') && $(this).data('images') ) {
                    var $this = $(this);
                    var href = $(this).find('a.listing-image').attr('href')
                    var images = $(this).data('images');
                    var html = '<div class="slick-carousel-gallery-listings hidden" style="width: ' + $(this).find('.listing-thumbnail-wrapper').width() + 'px;"><div class="slick-carousel" data-items="1" data-smallmedium="1" data-extrasmall="1" data-pagination="false" data-nav="true" data-disable_draggable="true">';
                    images.forEach(function(img_url, index){
                        html += '<div class="item"><a class="listing-image" href="'+ href +'"><img src="'+img_url+'"></a></div>';
                    });
                    html += '</div></div>';
                    $(this).find('.listing-thumbnail-wrapper .image-thumbnail').append(html);

                    $(this).find('.slick-carousel-gallery-listings').imagesLoaded( function(){

                        $this.find('.slick-carousel-gallery-listings').removeClass("hidden").delay(200).queue(function(){
                            $(this).addClass("active").dequeue();
                        });

                        self.initSlick($this.find('.slick-carousel'));
                        
                    }).progress( function( instance, image ) {
                        $this.addClass('images-loading');
                    }).done( function( instance ) {
                        $this.addClass('images-loaded').removeClass('images-loading');
                    });

                    $(this).addClass('loaded-gallery');
                }
            });
        }
    });

    $.apusThemeExtensions.listing = $.apusThemeCore.listing_init;

    
})(jQuery);