PageSourceSearch

https://ecarstrade.com/modules/mod_refine/assets/js/refineCars.js?v=c95fe647

js ecarstrade.com collected 2026-09-24 12:18:29 UTC 27,391 bytes, 705 lines download raw bytes

1RefineSearch = {
2    checkKeys: [
3        //add new field in getPagebar function, and in carsQuery class
4        "search",
5
6        "mark[]", "model[]", "fuel[]", "auction_type[]", "country[]", "gearbox[]",
7        "price", "price_to", "regist", "regist_to", "kilom", "kilom_to", "co2_emission", "co2_emission_to",
8        "engine", "engine_to", "doors", "doors_to", "seats", "seats_to", "emission_class",
9        "category[]", "condition[]", "power", "power_to", "power_value", "vat", "number", "color"
10    ],
11
12    init: function () {
13        RefineSearch.initSetUrl();
14        RefineSearch.initApplyForm();
15        RefineSearch.initClearForm();
16
17        RefineSearch.initAddMarkModel();
18
19        RefineSearch.initSaveSmartFinder();
20        RefineSearch.initGoAdvancedSearch();
21
22        RefineSearch.initSelectValues();
23
24        RefineSearch.updateCounters(false, true);
25        RefineSearch.updateTotal()
26
27        $('.default-set-card').off("click").on("click", function () {
28            let inputName = $(this).data('input');
29            let value = $(this).data('value');
30
31            let container = $(".quick-filters").find("#"+inputName);
32            let input = $(`input[name="${inputName}[]"][value="${value}"]`)
33
34            console.log(input)
35
36            if (!container.hasClass("show")) {
37                container.addClass("show");
38            }
39
40            input.prop("checked", !input.prop("checked")).change();
41        });
42
43        // Mirror Clear for Our stock;
44        const our_stock_name = $('#id_auction select option[value="74"]:selected').text().split(' (')[0].trim()
45
46        // Types;
47        document.querySelector('input[name="auction_type[]"][value="stock"]').addEventListener('change', function(){
48            if($(this).prop('checked') === false){
49                $(this).prop('checked', false)
50
51                Object.entries($('.search-choice')).forEach((item) => {
52                    const filter_name = item[1].children !== undefined && item[1].children[0] !== undefined ? item[1].children[0].innerText.split(' (')[0].trim() : null
53
54                    if(our_stock_name !== '' && filter_name === our_stock_name){
55                        if(window.skipMirrorClick){
56                            window.skipMirrorClick = false
57                        }   else{
58                            window.skipMirrorClick = true
59                            item[1].children[0].nextSibling.click()
60                        }
61                    }
62                })
63            }
64        }, false)
65
66        // Auctions;
67        Object.entries($('.search-choice')).forEach((item) => {
68            const filter_name = item[1].children !== undefined && item[1].children[0] !== undefined ? item[1].children[0].innerText.split(' (')[0].trim() : null
69            if(our_stock_name !== '' && filter_name === our_stock_name){
70                item[1].children[0].nextSibling.addEventListener('click', function() {
71                    if(window.skipMirrorClick){
72                        window.skipMirrorClick = false
73                    }   else{
74                        window.skipMirrorClick = true
75                        $('input[name="auction_type[]"][value="stock"]').click()
76                    }
77                }, false)
78            }
79        })
80    },
81
82    initSelectValues: function () {
83        $(".select-values").find(".dropdown-item").click(function () {
84            let btn = $(this).closest(".select-values");
85            let input = btn.data("input");
86            let group = btn.closest(".input-group");
87
88            group.find("input[name='" + input + "']").val($(this).data("value"));
89            $(this).closest(".list-values").find(".active").removeClass("active");
90            $(this).addClass("active");
91            RefineSearch.setUrl();
92        });
93    },
94
95    initGoAdvancedSearch: function () {
96        $(".to-advanced-search").click(function () {
97            let url = new URL(window.location.origin + "/search");
98            url.searchParams.append("opt", "search");
99
100            let params = window.location.href;
101            params = params.split('?')[1]
102            if (params) {
103                params.replace(new RegExp("/page([0-9]+)?"), '')
104            }
105
106            let advancedPath = url.pathname + url.search;
107            if (typeof window.subfolderPrefixPath === 'function') {
108                advancedPath = window.subfolderPrefixPath(url.pathname) + url.search;
109            }
110            let advancedUrl = url.origin + advancedPath;
111            if (params) {
112                advancedUrl += "&" + params;
113            }
114
115            window.location.href = advancedUrl;
116        });
117    },
118    initSaveSmartFinder: function () {
119        $('.save-filter').off("click").on("click", function () {
120            var link = window.location.href;
121            link = link.split('?')[1];
122            $.ajax({
123                url: "/search/save?"+link,
124                type: "POST",
125                data: {
126                    "url_search" :link,
127                },
128                success: function (xml) {
129                    DisplaySystemHintMessage($("#type", xml).text(), $("#returnMess", xml).text());
130                }
131            });
132        })
133    },
134
135    initSetUrl: function () {
136        var filtersContainer = $(".quick-filters");
137
138        filtersContainer.find("input[type=checkbox]").off("change").on("change", function () {
139
140            let parent = $(this).closest("div[data-input]");
141            if (parent.length) {
142                let defaultSet = $(`.default-set-card[data-input="${parent.data('input')}"][data-value="${parent.data('value')}"]`);
143                if (defaultSet.length) {
144                    defaultSet.toggleClass("active", $(this).prop("checked"));
145                }
146            }
147
148            RefineSearch.setUrl();
149        });
150
151        filtersContainer.find("input[type=radio], select, .quick-filter-input").off("change").on("change", function () {
152            RefineSearch.setUrl();
153        });
154
155        filtersContainer.find("input[type=number], input[type=text]:not(.chosen-search-input)").off("keyup").on("keyup", function (e) {
156
157            if ($(this).closest(".input-group").length) {
158                let group = $(this).closest(".input-group");
159                if (group.find(".select-values[data-input='"+$(this).attr("name")+"']").length) {
160                    let selectValuesList = group.find(".select-values[data-input='"+$(this).attr("name")+"']").find(".list-values");
161                    selectValuesList.find(".active").removeClass("active");
162                    if (selectValuesList.find("[data-value='"+$(this).val()+"']").length) {
163                        selectValuesList.find("[data-value='"+$(this).val()+"']").addClass("active");
164                    }
165                }
166            }
167
168            RefineSearch.setUrl();
169
170            if (e.keyCode === 13) {
171                $(".apply-quick-filters").click();
172            }
173        });
174    },
175
176    setUrl: function (getOnlyFilter) {
177        $(".quick-filters").find(".pulse-refine").removeClass("pulse-refine");
178
179        let currentUrl = window.location.href;
180        let currentUrlParams = new URL(currentUrl).searchParams;
181        let url = new URL(window.location.origin + "/search");
182        RefineSearch.selection_filter = []
183
184        let form = $(".quick-filters").find("form");
185        let refineArray = {};
186        $.each(form.serializeArray(), function (i, v) {
187            if (v.name && v.value && v.value !== "0") {
188                if (typeof refineArray[v.name] !== "undefined") {
189                    refineArray[v.name] += v.value + "|||";
190                } else {
191                    refineArray[v.name] = v.value + "|||";
192                }
193            }
194        });
195
196        if (typeof refineArray['mark[]'] !== "undefined") {
197            //check marks for duplicates
198            var marksTempArray = refineArray['mark[]'].split('|||');
199            refineArray['mark[]'] = marksTempArray.filter(function(value, index, self) {
200                return self.indexOf(value) === index;
201            }).join('|||');
202        }
203
204        //if all unchecked
205        $.each(RefineSearch.checkKeys, function (i, key) {
206            if (typeof refineArray[key] === "undefined") {
207                url.searchParams.delete(key);
208            }
209        });
210
211        //remove old values and add new
212        $.each(refineArray, function (key, values) {
213            url.searchParams.delete(key);
214            $.each(values.split('|||'), function (i, value) {
215                if (value) {
216                    url.searchParams.append(key, value);
217                }
218            });
219        });
220
221        if (currentUrlParams.get("sort")) {
222            url.searchParams.append("sort", currentUrlParams.get("sort"));
223        }
224
225        if(getOnlyFilter !== undefined){
226            if(window.refineCarsSearchURL !== undefined){
227                Pagination.filter = window.refineCarsSearchURL
228            }   else{
229                window.refineCarsSearchURL = url.searchParams.toString()
230                Pagination.filter = url.searchParams.toString()
231            }
232            return
233        }
234
235        let pathNoPage = url.pathname.replace(new RegExp("/page([0-9]+)?"), '');
236
237        if (typeof window.subfolderPrefixPath === 'function') {
238            pathNoPage = window.subfolderPrefixPath(pathNoPage);
239        }
240        let newUrl = url.origin + pathNoPage + "?" + url.searchParams.toString();
241
242        if (currentUrl !== newUrl) {
243            window.history.replaceState(null, null, newUrl);
244
245            window.refineCarsSearchURL = url.searchParams.toString()
246            Pagination.filter = url.searchParams.toString();
247
248            $(".apply-quick-filters").addClass("focus").find(".fas").addClass("d-none");
249
250            RefineSearch.updateCounters();
251        }
252    },
253
254    isCountsLoading: false,
255    getCounts: function (renderPages) {
256        const applyFilterButton = $(".apply-quick-filters")
257
258        clearTimeout(window.searchCounterUpdateTimer)
259
260        if (RefineSearch.isCountsLoading) {
261            RefineSearch.isCountsLoading.abort();
262        }
263        let loader = $("<i class='fas fa-circle-notch fa-spin'></i>");
264        $(".quick-filters").find(".count-badge").html(loader);
265
266        let params = window.location.href;
267        let ispagination = params.split('?')[0].includes('page');
268        params = params.split('?')[1];
269
270        // Crunch for Auction filter;
271        const auction = window.location.href.split('/auction')[2]
272        if(auction !== undefined){
273            if(params === undefined){
274                params = `id_auction[]=${auction}`;
275            }   else{
276                params += `&id_auction[]=${auction}`;
277            }
278        }
279
280        /*
281        if (params != null && !ispagination) {
282            $('.total_count_title').addClass("d-none");
283        }
284         */
285
286        if(window.refineCarsSearchURL !== '' && params === undefined){
287            params = window.refineCarsSearchURL.replace('/search?', '')
288        }
289
290        $('.clouds-container').addClass('loading')
291
292        window.searchCounterUpdateTimer = setTimeout(() => {
293            RefineSearch.isCountsLoading = $.ajax({
294                async: true,
295                type: "POST",
296                url: "/modules/mod_refine/ajax/counts.php",
297                data: {"params": params},
298                success: function (data) {
299                    data = JSON.parse(data);
300                    RefineSearch.isCountsLoading = false;
301
302                    applyFilterButton.find(".total-cars").text(data['total']);
303                    applyFilterButton.removeClass("focus").find(".fas").addClass("d-none");
304                    applyFilterButton.find(".total-cars").removeClass("d-none");
305                    applyFilterButton.removeClass('locked')
306
307                    /*
308                    * Update country origins and auctions;
309                    * */
310                    $.each(data.addition_filters, function(filter, values){
311                        const el = $(`select[name="${filter}[]"]`);
312                        $(`select[name="${filter}[]"] option`).remove()
313                        $.each(values, function(key, value) {
314                            el.append($(`<option ${value.selected ? "selected" : ""}></option>`).attr("value", value.value).text(value.text + ' (' + value.count + ')'));
315                        });
316                        el.trigger("chosen:updated");
317                    })
318
319                    const exclusiveCount = data.is_exclusive?.[1] ?? 0;
320
321                    if (exclusiveCount > 0) {
322                        $('.default-set-card[data-input="is_exclusive"]')
323                            .removeClass('d-none')
324                            .addClass('d-flex');
325                    } else {
326                        $('.default-set-card[data-input="is_exclusive"]')
327                            .removeClass('d-flex')
328                            .addClass('d-none');
329                    }
330
331                    /*
332                    * Update mark model - START;
333                    * */
334                    // Mark;
335                    let new_mark_options = []
336                    $(`select[name="mark[]"] option`).each(function(key, option){
337                        let clearName = option.innerText.slice(0, option.innerText.indexOf(' ('))
338                        const lastName = clearName
339
340                        $.each(data.mark, function(counter_mark_id, count){
341                            if(parseInt(option.getAttribute('value')) === parseInt(counter_mark_id)){
342                                clearName = `${clearName} (${count})`
343                            }
344                        })
345
346                        if(clearName === lastName){
347                            clearName = `${clearName} (0)`
348                        }
349
350                        if(option.innerText.indexOf(' (') === -1){
351                            clearName = option.innerText
352                        }
353                        new_mark_options.push($(`<option ${option.getAttribute('selected') ? "selected" : ""}></option>`).attr("value", option.getAttribute('value')).text(clearName))
354                    })
355
356                    const el = $(`select[name="mark[]"]`);
357                    $(`select[name="mark[]"] option`).remove()
358                    new_mark_options.forEach(function(option){
359                        el.append(option);
360                    })
361                    el.trigger("chosen:updated");
362
363                    // Model;
364                    const searchParams = new URLSearchParams(params);
365                    const filterParams = {};
366                    for (const [key, value] of searchParams.entries()) {
367                        if (filterParams[key]) {
368                            // Если ключ уже существует, добавляем значение в массив
369                            filterParams[key] = Array.isArray(filterParams[key]) ? [...filterParams[key], value] : [filterParams[key], value];
370                        } else {
371                            // Если ключа еще нет, создаем его
372                            filterParams[key] = value;
373                        }
374                    }
375
376                    window.marksLoadingWaiter = setInterval(() => {
377                        if($('select[name="model[]"] option').length === 0) return
378
379                        if(filterParams['model[]'] !== undefined && filterParams['model[]'].length > 0){
380                            if(filterParams['model[]'].isArray){
381                                filterParams['model[]'].forEach((filter_mark_id) => {
382                                    $(`select[name="model[]"] option[value="${filter_mark_id}"]`).attr('selected', 1)
383                                })
384                            }   else{
385                                $(`select[name="model[]"] option[value="${filterParams['model[]']}"]`).attr('selected', 1)
386                            }
387
388                            $('select[name="model[]"]').trigger("chosen:updated")
389                        }
390
391                        clearInterval(window.marksLoadingWaiter)
392                    }, 500)
393
394                    /*
395                    * Update mark model - END;
396                    * */
397
398                    $('.clouds-container').removeClass('loading')
399
400                    $('.total-cars').text(data['total']+' ');
401
402                    // Update pagination;
403                    if(window.initPaginationRender){
404                        if (typeof Pagination !== "undefined") {
405                            Pagination.total = data['total']
406                            Pagination.toggleView()
407                            Pagination.renderPages()
408                        }
409
410                        window.initPaginationRender = false
411                    }
412
413                    if($('.total_count_title').hasClass('d-none')){
414                        RefineSearch.updateTotal()
415                    }
416
417                    if (typeof Pagination !== "undefined") {
418                        Pagination.total = data['total']
419                        if(renderPages){
420                            Pagination.renderPages()
421                        }
422                    }
423                    if (typeof Pagination !== "undefined") {
424                        Pagination.total = data['total']
425                        if(data['search_hash'] !== undefined){
426                            $('.apply-quick-filters').attr('data-search-hash', data['search_hash'])
427                        }
428                        if(renderPages){
429                            Pagination.renderPages()
430                        }
431                    }
432
433                    if(parseInt(applyFilterButton.attr('data-immediate-update')) === 1){
434                        if (typeof Pagination !== "undefined") {
435                            Pagination.type = 'search'
436                        }
437
438                        applyFilterButton.removeAttr('data-immediate-update')
439                        applyFilterButton.click()
440                    }
441
442                    $.each(data, function (inputName, values) {
443                        if (typeof values !== 'object' || values == null) {
444                            return;
445                        }
446                        $.each(values, function (value, count) {
447                            let inputContainer = $(".quick-filters")
448                                .find("[data-input='" + inputName + "'][data-value='" + value + "']");
449                            inputContainer.removeClass('hidden');
450                            inputContainer.find(".count-badge").text(count);
451                        });
452                    });
453
454                    let faSpinElement = $(".quick-filters")
455                        .find(".count-badge").find(".fa-spin");
456
457                    faSpinElement.closest("div[data-input='sources'][data-value]").addClass('hidden');
458                    faSpinElement.closest(".count-badge").text(0);
459
460                }
461            });
462        }, 1000)
463    },
464
465    isMarksDataLoading: false,
466    getMarksData: function (firstLoading) {
467        if (RefineSearch.isMarksDataLoading) {
468            RefineSearch.isMarksDataLoading.abort();
469        }
470        let loader = $("<i class='fas fa-circle-notch fa-spin'></i>");
471        $(".quick-filters").find(".count-badge").html(loader);
472
473        $(".add-model-loader").show();
474        $(".add-model-link").hide();
475
476        let params = window.location.href;
477        params = params.split('?')[1];
478        if (params == null){
479            params = window.location.href;
480        }
481
482        RefineSearch.isMarksDataLoading = $.post("/modules/mod_refine/ajax/marksData.php", {"params": params}, function (data) {
483            data = JSON.parse(data);
484            RefineSearch.isMarksDataLoading = false;
485
486            RefineSearch.setMarksData(data);
487
488            window.marksDataLoaded = true
489
490            if(firstLoading && window.location.search !== "" && typeof updateCouldPills === 'function'){
491                updateCouldPills();
492            }
493        });
494    },
495
496    updateCounters: (renderPages, firstLoading) => {
497        const applyFilterButton = $(".apply-quick-filters")
498        applyFilterButton.addClass('locked')
499        applyFilterButton.find(".total-cars").addClass("d-none");
500        applyFilterButton.find(".fas").removeClass("d-none");
501
502        if(firstLoading){
503            RefineSearch.setUrl(true)
504        }
505
506        RefineSearch.getMarksData(firstLoading)
507        RefineSearch.getCounts(renderPages)
508    },
509
510    setMarksData: function (marksData) {
511        let container = $(".mark-models-container");
512
513        $.each(marksData, function (mark_id, data) {
514            var isNewGroup = false;
515            let group = $('.mark-model-group[data-mark="'+mark_id+'"]');
516
517            if (!group.length) {
518                group = $(".mark-model-template").find(".mark-model-group").clone();
519                isNewGroup = true;
520
521                group.attr("data-mark", mark_id);
522                group.find(".mark-name").text(data.mark);
523            }
524
525            group.find("[name='mark[]']").val(mark_id);
526            group.find("[name='model[]']").html(data.options).chosen();
527
528            if (isNewGroup) {
529                container.append(group);
530            }
531
532            $('select[name="model[]"]').trigger("chosen:updated");
533        });
534
535        $(".add-model-loader").hide();
536        if (!$(".mark-models-container .mark-model-group").length) {
537            $(".add-model-link").hide();
538            $(".add-model-select").show();
539        } else {
540            $(".add-model-link").show();
541            $(".add-model-select").hide();
542        }
543
544        RefineSearch.initSetUrl();
545
546        RefineSearch.initAddMarkModel();
547        RefineSearch.initRemoveMarkModel();
548    },
549
550    initAddMarkModel: function () {
551        $(".add-model-select select").on("change", function () {
552            var selectedMark = $(this).val();
553
554            $(this).val(null);
555            $(this).find("option[value='"+selectedMark+"']").hide();
556            $(this).trigger("chosen:updated");
557
558            $(".add-model-select").hide();
559            $(".add-model-loader").show();
560        });
561
562        $(".add-model-link").click(function () {
563            $(".add-model-select").show();
564            $(this).hide();
565        });
566    },
567
568    initRemoveMarkModel: function () {
569        $(".remove-mark-model").click(function () {
570            let group = $(this).closest(".mark-model-group");
571
572            let addModelSelect = $(".add-model-select select");
573            addModelSelect.val(null);
574            addModelSelect.find("option[value='"+group.data("mark")+"']").show();
575            addModelSelect.trigger("chosen:updated");
576
577            group.remove();
578
579            RefineSearch.setUrl();
580        });
581    },
582
583    isPageLoading: false,
584    initClearForm: function () {
585        $(".clear-quick-filters").off("click").on("click", async function () {
586            var form = $(".quick-filters").find("form");
587
588            form.find(".mark-model-group .remove-mark-model").click();
589            form.find(".quick-filters-default-sets").find(".active").removeClass("active");
590            form.find("input[type=checkbox], input[type=radio]").attr("checked", "").prop("checked",false);
591            form.find(".select-values .dropdown-item.active").removeClass("active");
592            form.find("select:not(.chosen-select)").val("");
593            form.find("select.chosen-select").val("").trigger("chosen:updated");
594            form.find("input[type=number]").val(null).attr("value", "");
595            form.find("input[type=text]:not(.chosen-search-input)").val("").attr("value", "");
596            form.find("textarea").html("").val("");
597
598            $('.clouds-container').html('')
599
600            RefineSearch.setUrl();
601
602            let vatValue = form.find("input[type=radio][name='vat'][value='any']");
603            vatValue.closest(".btn-group").find(".btn.active").removeClass("active");
604            vatValue.prop("checked", true);
605            vatValue.closest(".btn").addClass("active");
606
607            let powerValue = form.find("input[type=radio][name='power_value'][value='kw']");
608            powerValue.closest(".btn-group").find(".btn.active").removeClass("active");
609            powerValue.prop("checked", true);
610            powerValue.closest(".btn").addClass("active");
611
612            RefineSearch.updateCounters(true);
613            RefineSearch.reloadPage();
614        });
615    },
616
617
618    initApplyForm: function () {
619        $(document).off("keyup").on("keyup", function (e) {
620            if (e.keyCode === 13) {
621                $(".apply-quick-filters:not(.locked)").click();
622            }
623        })
624
625        $(document).on("click", '.apply-quick-filters:not(.locked)', function () {
626            // Hide filter only if his is visible;
627            $(".quick-filters:not(.filter-closed)").find(".toggle-filter").click()
628            RefineSearch.updateTotal()
629            RefineSearch.updateCounters();
630            RefineSearch.reloadPage();
631            typeof window.updateCouldPills === 'function' && window.updateCouldPills();
632        });
633    },
634
635    updateTotal: () => {
636        let total = parseInt($('.total-cars').html())
637        if(isNaN(total)){
638            $('.total_count_title').addClass('d-none')
639        }   else{
640            $('.total_count_title').removeClass('d-none')
641            $('.total_count').html(total)
642        }
643    },
644
645    reloadPage: function () {
646        if (typeof Pagination !== "undefined") {
647            Pagination.loadedCars = []
648            Pagination.showPages(1, Pagination.perPage)
649        }
650        /*
651        if (RefineSearch.isPageLoading) {
652            RefineSearch.isPageLoading.abort();
653        }
654
655        let url = new URL(window.location.href);
656        let urlNoPage = url.href.replace(new RegExp("/page([0-9]+)?"), '');
657
658
659        if (!$(".items-view").hasClass("is-loading")) {
660            $(".quick-filters-content").find(".page_title").append('<i class="ml-1 text-danger fas fa-circle-notch fa-spin"></i>');
661            $(".items-view").addClass("is-loading").css("opacity", "0.4");
662        }
663
664        window.scrollTo({
665            top: -10000,
666            behavior: "smooth"
667        });
668
669        RefineSearch.isPageLoading = $.get(urlNoPage, {}, function (data) {
670            data = $($.parseHTML(data));
671
672            $(".quick-filters").closest(".row").find(".quick-filters-content").replaceWith(data);
673
674            if (typeof Cars !== "undefined") {
675                Cars.init();
676            }
677            $(".items-view").removeClass("is-loading").css("opacity", "1");
678            $('.total_count_title').removeClass("d-none");
679            RefineSearch.isPageLoading = false;
680
681            if (typeof Bids !== "undefined") {
682                Bids.init();
683            }
684
685            CountdownTimers.init();
686            BootstrapComponents.init();
687            if (typeof MarketPriceModal != "undefined") {
688                MarketPriceModal.init();
689            }
690            if (typeof ExportExcel != "undefined") {
691                ExportExcel.init();
692            }
693
694            $(".chosen-select").chosen();
695
696            RefineAll.initToggleMobileFiler();
697            RefineSearch.initSaveSmartFinder();
698        });
699        */
700    }
701};
702
703deferPush(function () {
704    RefineSearch.init();
705});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.