PageSourceSearch

https://radionerazzurra.it/src/js/app/search.js

js radionerazzurra.it collected 2026-09-30 11:07:36 UTC 22,812 bytes, 508 lines download raw bytes

1var _search = {
2    _data: {},
3    _containerList: "#list-home-search-articles",
4    _containerListPrograms: "#list-home-search-programs",
5    _containerListSpeakers: "#list-home-search-speakers",
6    _counter: null,
7    _inputText: "#list-home-search-text",
8    _totalResult: "#total-result-number",
9    _programSelector: "#list-home-search-filter-program-selector",
10    _showMoreButton: "#search-show-more-button-container",
11    _searchButton: "#search-button",
12    _dateFrom: "#list-home-search-filter-date-from",
13    _dateTo: "#list-home-search-filter-date-to",
14    _orderBy: "#list-home-search-filter-orderby",
15    _programSelectorContainer: "#search-program-selector-container",
16    _programSelector: "#list-home-search-filter-program-selector",
17    _categoryContainer: "#search-category-container",
18    _checkboxContainer: "#checkbox-container",
19    _contentTypeEpisodes: "#list-search-filter-type-episodes",
20    _contentTypePills: "#list-search-filter-type-pills",
21    _contentTypeVideos: "#list-search-filter-type-videos",
22    _contentTypeArticles: "#list-search-filter-type-articles",
23    _pageSize: "10",
24    _baseEndpoint: {
25        "staging" : "", 
26        "production": ""
27    },
28
29
30    init: async function () {
31        //inizializzo il selettore di programmi con la lista di tutti i programmi. 
32        //in una onchange sugli input si aggiorna il selettore.
33        var _this = this;
34        // test
35        if(_system.isNull(_programs.categories._data)){
36            await _data.get(["categories", "programs", "groups", _config.app.radio.group, "radios", _config.app.radio.id], "zrange", 0, -1).then(function (value) {
37                _programs.categories._data = {};
38                _programs.categories._dataSorted = [];
39                var item = {};
40                for (i = 0; i < value['data'].length; i++) {
41                    item = JSON.parse(value['data'][i]);
42                    _programs.categories._data[item['_id']] = item;
43                }
44                _programs.categories._dataSorted = _system.dataSorting(_programs.categories._data, "id_order")["sorted"];
45            })
46        }
47        _this.renderCategoriesCheckbox(_programs.categories._data);
48        
49        this.setProgramOptions();
50    },
51
52    setProgramOptions: function (categoryIds) {
53        var programs = Object.values(_home.items._dataPrograms).filter(x => x != null && x !== undefined);
54        if (categoryIds)
55            programs = programs.filter(x => categoryIds.includes(x.category_id) && x.status == "live")
56        for (var key in programs) {
57            $(this._programSelector).append('<option value="' + programs[key]['_id'] + '">' + programs[key]['title'] + '</option>');
58        }
59    },
60
61    renderCategoriesCheckbox: function (categories) {
62        $(this._checkboxContainer).html("");
63        for (var key in categories) {
64            if (categories[key].status != "live")
65                continue;
66
67            var titleCategory = categories[key].label;
68            var checkboxCategory = '<div class="c-50 form-line-checkbox"><input onchange="_search.changeProgramSelector()" name=' + key + ' class="category" type="checkbox" id="list-home-search-filter-type-' + key + '" checked>' + titleCategory + '</div>';
69            $(this._checkboxContainer).prepend(checkboxCategory);
70        }
71    },
72
73    changeProgramSelector: function () {
74        //controllo le categorie selezionate e ripopolo il filtro
75        var categories = [];
76        var categoryArray = $('input[class=category]:checked');
77        var length = $('input[class=category]:checked').length;
78        for (var i = 0; i < length; i++) {
79            categories.push(categoryArray[i].name);
80        }
81        $(this._programSelector).html("<option value='null'>Seleziona il programma...</option>")
82        this.setProgramOptions(categories);
83    },
84
85    start: function (pageNumber) {
86        //Controlla stringa di ricerca e filtri applicati, li salva in _data ed esegue la query
87        //Il risultato viene passato alla render
88        var _this = this;
89
90        _this.programs();
91        _this.speakers();
92
93        //disabilito temporaneamente il bottone di ricerca
94        //$(this._searchButton).addClass('disabled');
95        $(this._searchButton).addClass('loader');
96
97        _this._counter = 0;
98        //prendo la stringa testuale di ricerca
99        var textSearch = $(_this._inputText).val();
100
101        //imposto il numnero di pagina come stringa
102        if (!pageNumber) {
103            pageNumber = "1";
104            //_system.loaderList(_search._containerList);
105        }
106        else
107            pageNumber = pageNumber.toString();
108
109        //resetto il bottone mostra di più se presente al reset della ricerca  
110        if (pageNumber == "1")
111            $(this._showMoreButton).html("");
112        else {
113            _system.loaderList(this._showMoreButton);
114        }
115
116        //leggo quali sono i filtri impostati
117        var filterSelected = "";
118
119        //se almeno uno dei tre è flaggato, metto il contentType episodi
120        if ($(_this._contentTypeEpisodes).is(":checked") || $(_this._contentTypePills).is(":checked") || $(_this._contentTypeVideos).is(":checked")) {
121            var contentTypeEpisode = "tipo:episode";
122            contentTypeEpisode += _this.checkSourceAndEpisodeType();
123            //source e tipo sono in OR
124            //contentTypeEpisode += " AND episodeType:" + _this.checkEpisodeType() + ")";
125            var filterCategoriesSelected = _this.checkCategoryFilterSelected();
126            var filterSelected = "(" + contentTypeEpisode;
127            if(filterCategoriesSelected != ""){
128                filterSelected += " AND " + filterCategoriesSelected
129            }
130            filterSelected += ")";
131            if ($(_this._programSelector).val() != "null")
132                filterSelected += "AND (idProgramma:" + $(_this._programSelector).val() + ")";
133            console.log(filterSelected);
134        }
135
136        if ($(_this._contentTypeArticles).is(":checked")) {
137            if (filterSelected != "")
138                filterSelected += " OR "
139            filterSelected += "tipo:article";
140        }
141
142        if (filterSelected == ""){
143            filterSelected = "tipo:none"; 
144        }
145        console.log(filterSelected);
146
147        //date range
148        var dateFrom = $(this._dateFrom).val();
149        var dateTo = $(this._dateTo).val();
150        if (new Date(dateFrom) > new Date(dateTo)) {
151            _toastmessage.show("543", "warning");
152            $(this._searchButton).removeClass('loader');
153            return;
154        }
155
156        if(dateFrom === ""){
157            $(this._dateFrom).val("")
158        }
159
160        if(dateTo === ""){
161            $(this._dateTo).val("")
162        }
163
164        if (dateFrom)
165            dateFrom = _system.dateToShow(dateFrom)
166        if (dateTo)
167            dateTo = _system.dateToShow(dateTo)
168
169
170        var query = {
171            "value": _system.escape(textSearch),
172            "filters": filterSelected,
173            "order_by": $(this._orderBy).val(),
174            "page_number": pageNumber,
175            "page_size": this._pageSize,
176            "from_date": dateFrom,
177            "to_date": dateTo
178        }
179        this._data = query;
180
181        $.ajax({
182            contentType: "application/json",
183            dataType: "json",
184            timeout: 10000,
185            type: 'POST',  // http method
186            connection: "keep-alive",
187            Accept: "*",
188            url: _this._baseEndpoint[_config.app.connection],
189            data: JSON.stringify(query),
190            success: function (data) { //da cambiare server staging Radio Company
191                if("status" in data && data.status == 401){
192                    $(_search._searchButton).removeClass('loader');
193                    _search.renderTotalElement(0);
194                    $(_search._containerList).html("<div class='p-20'>" + _system.label("search-no-results").replace("{hint}", _search._data.value) + "</div>");
195                    return
196                }
197                //_this.render(data.search.result.documents, pageNumber, data.search.searchInfo.realnumdocs);
198                _this.render(data.search.result.documents, pageNumber, data.search.searchInfo.realnumdocs).then(function () {
199                    //faccio scroll per visualizzare il contenuto in caso di pagina 1
200                    if (pageNumber == "1") {
201                        if (_system.isBrowser()) {
202                            $('html, body').animate({
203                                scrollTop: $('#total-result-programs-number').offset().top - 60
204                            }, 500);
205                        }
206                        else {
207                            //per mobile uso un altro scroll.
208                            $('#search-level-0').scrollTop($(_this._totalResult).offset().top);
209                            $('#search-level-0').scrollTop($('#total-result-programs-number').offset().top - 60);
210                        }
211
212                    }
213                    //riabilito il bottone
214                    $(_this._searchButton).removeClass('loader');
215                    $(_search._containerList + ' .lazy').lazy({
216                        appendScroll: (_system.isDesktop() ? window : $('section[content="search"]')),
217                    });
218                });
219
220            },
221            error: function (xhr, status, error) {
222                $(_search._searchButton).removeClass('loader');
223                _search.renderTotalElement(0);
224                $(_search._containerList).html("<div class='t-a-c'>" + _system.label("no-connection") + "</div>")
225                console.error(error);
226            },
227        })
228    },
229
230    programs: function() {
231        if ($('#list-home-search-text').val().trim() == ""  
232        || $('#list-home-search-filter-program-selector').val() == "") return;
233
234        $(_search._containerListPrograms).html("");
235
236        var string = $('#list-home-search-text').val().trim().replaceAll(" ","").toLowerCase();
237        var data = _home.items._dataPrograms;
238        var founded = 0;
239        for (var key in data) {
240            var item = {}
241            Object.assign(item, data[key]);
242            //Speakers
243            var speakersConcat = "";
244            for (var keyS in item['speakers']) {
245                var speaker = item['speakers'][keyS];
246                speakersConcat += (_speakers.items._data[speaker['speaker_id']] !== undefined ? _speakers.items._data[speaker['speaker_id']]['title'].trim().replaceAll(" ","").toLowerCase() + ","  : "");
247            }
248            
249            if (item['title'].trim().replaceAll(" ","").toLowerCase().indexOf(string) >= 0
250                || speakersConcat.indexOf(string) >= 0) {
251                founded++;
252                if (founded <= 20) {
253                    item['program'] = "";
254                    item['link'] = _system.createLink("programmi/" + item['vanityurl']);
255                    item['description'] = (item['abstract'] !== "" ? item['abstract'] : _system.removeTags(item['description']));
256                    item["image"] = _system.addParamResizing(item["image"], 576, 360)
257                    _views['home'].article("card-search-image", item).then(function (data) {
258                        $(_search._containerListPrograms).append(data);
259                    });
260                }
261            }
262        }
263        if (founded == 0) {
264            for (var key in data) {
265                var item = data[key];
266                if (item['abstract'] === undefined) item['abstract'] = "";
267                if (item['description'] === undefined) item['description'] = "";
268                if (item['abstract'].trim().replaceAll(" ","").toLowerCase().indexOf(string) >= 0
269                    || item['description'].trim().replaceAll(" ","").toLowerCase().indexOf(string) >= 0) {
270                    founded++;
271                    if (founded <= 20) {
272                        item['program'] = "";
273                        item['link'] = _system.createLink("programmi/" + item['vanityurl']);
274                        item['description'] = (item['abstract'] !== "" ? item['abstract'] : _system.removeTags(item['description']));
275                        _views['home'].article("card-search-image", item).then(function (data) {
276                            $(_search._containerListPrograms).append(data);
277                        });
278                    }
279                }
280            } 
281        }
282        $("#total-result-programs-number").html("");
283        var totalElements = '<h3 class="m-l-20 m-t-20 m-b-20"><span class="t-gray">Programmi:</span> ' + founded + '</h3><!--<hr class="m-l-20 m-r-20">-->';
284        $("#total-result-programs-number").prepend(totalElements);
285        if (founded == 0) {
286            $("#total-result-programs-number").hide();
287            $(_search._containerListPrograms).hide();
288        } else {
289            $("#total-result-programs-number").show();
290            $(_search._containerListPrograms).show();
291            setTimeout(function() {
292                $(_search._containerListPrograms + ' .lazy').lazy({
293                    appendScroll: (_system.isDesktop() ? window : $('section[content="search"]')),
294                });        
295            }, 10);
296        }
297    },
298
299    speakers: function() {
300        if ($('#list-home-search-text').val().trim() == ""  
301        || $('#list-home-search-filter-program-selector').val() == "") return;
302
303        $(_search._containerListSpeakers).html("");
304
305        var string = $('#list-home-search-text').val().trim().replaceAll(" ","").toLowerCase();
306        var data = _speakers.items._data;
307        var founded = 0;
308        for (var key in data) {
309            var item = {}
310            Object.assign(item, data[key]);
311            //Speakers
312            var speakersConcat = "";
313            for (var keyS in item['speakers']) {
314                var speaker = item['speakers'][keyS];
315                speakersConcat += (_speakers.items._data[speaker['speaker_id']] !== undefined ? _speakers.items._data[speaker['speaker_id']]['title'].trim().replaceAll(" ","").toLowerCase() + ","  : "");
316            }
317            
318            if (item['title'].trim().replaceAll(" ","").toLowerCase().indexOf(string) >= 0
319                || speakersConcat.indexOf(string) >= 0) {
320                founded++;
321                if (founded <= 20) {
322                    item['program'] = "";
323                    item['link'] = _system.createLink("conduttori/" + item['vanityurl']);
324                    item["image"] = _system.addParamResizing(item["image"], 576, 360)
325                    _views['home'].article("card-search-image", item).then(function (data) {
326                        $(_search._containerListSpeakers).append(data);
327                    });
328                }
329            }
330        }
331        $("#total-result-speakers-number").html("");
332        var totalElements = '<h3 class="m-l-20 m-t-20 m-b-20"><span class="t-gray">Conduttori:</span> ' + founded + '</h3><!--<hr class="m-l-20 m-r-20">-->';
333        $("#total-result-speakers-number").prepend(totalElements);
334        if (founded == 0) {
335            $("#total-result-speakers-number").hide();
336            $(_search._containerListSpeakers).hide();
337        } else {
338            $("#total-result-speakers-number").show();
339            $(_search._containerListSpeakers).show();
340            setTimeout(function() {
341                $(_search._containerListSpeakers + ' .lazy').lazy({
342                    appendScroll: (_system.isDesktop() ? window : $('section[content="search"]')),
343                });
344            }, 10);
345        }
346    },
347
348    checkCategoryFilterSelected: function () {
349        //ritorno una query che indichi le categorie di programmi da includere nella ricerca
350        var length = $('input[class=category]:checked').length;
351        if (length == 0)
352            return "";
353        var result = "(";
354        var categoryArray = $('input[class=category]:checked');
355        for (var i = 0; i < length; i++) {
356            result += "idCategoria:" + categoryArray[i].name;
357            if (i != length - 1)
358                result += " OR "
359            else
360                result += ")"
361        }
362        return result;
363    },
364
365
366    checkSourceAndEpisodeType: function () {
367        if ($(this._contentTypeVideos).is(":checked") && $(this._contentTypeEpisodes).is(":checked") && $(this._contentTypePills).is(":checked")) {
368            //se tutti selezionati non filtro, quindi passo stringa vuota
369            return "";
370        }
371        else if ($(this._contentTypeEpisodes).is(":checked") && $(this._contentTypePills).is(":checked")) {
372            //caso in cui sono selezionati episodi e pillole
373            return " AND (mediatype:audio || mediatype:audio)";
374        }
375        else if ($(this._contentTypeVideos).is(":checked") && $(this._contentTypePills).is(":checked")) {
376            //caso in cui sono selezionati video e pillole, in questo modo vengono anche selezionate gli episodi video
377            return " AND (tipoEpisodio:pills OR (mediatype:video || mediatype:all))";
378        }
379        else if ($(this._contentTypeVideos).is(":checked") && $(this._contentTypeEpisodes).is(":checked")) {
380            //caso in cui sono selezionati video e podcast, in questo modo vengono anche selezionate le pillole video
381            return " AND (tipoEpisodio:episodes OR (mediatype:video || mediatype:all))";
382        }
383        else if ($(this._contentTypeEpisodes).is(":checked")) {
384            //caso in cui sono selezionati solo episodi audio, uso AND per escludere i video
385            return " AND (tipoEpisodio:episodes AND (mediatype:audio || mediatype:all))";
386        }
387        else if ($(this._contentTypePills).is(":checked")) {
388            //caso in cui sono selezionati solo pillole audio, uso AND per escludere i video
389            return " AND (tipoEpisodio:pills AND (mediatype:audio || mediatype:all))";
390        }
391        else if ($(this._contentTypeVideos).is(":checked")) {
392            //caso in cui sono selezionati solo video
393            return " AND (mediatype:video || mediatype:all)";
394        }
395    },
396
397    /*
398    checkSourceType: function(){
399        if (!$(this._contentTypeVideos).is(":checked")) {
400            return "audio";
401        }
402        else if ($(this._contentTypeEpisodes).is(":checked")) {
403            return "all";
404        }
405        else {
406            return "video";
407        }
408    },
409
410    checkEpisodeType: function(){
411        if (!$(this._contentTypePills).is(":checked")) {
412            return "episodes";
413        }
414        else if ($(this._contentTypeEpisodes).is(":checked")) {
415            return "all";
416        }
417        else {
418            return "pills";
419        }
420    },*/
421
422    renderTotalElement: function (total) {
423        //renderizzo il numero totale di risultati della ricerca.
424        $(this._totalResult).html("");
425        var totalElements = '<h3 class="m-l-20 m-t-20 m-b-20"><span class="t-gray">Articoli o Episodi:</span> ' + total + '</h3><!--<hr class="m-l-20 m-r-20">-->';
426        $(this._totalResult).prepend(totalElements);
427    },
428
429    render: async function (results, pageNumber, totalElements) {
430        //renderizzo il totale dei contenuti
431        this.renderTotalElement(totalElements);
432
433
434        //Renderizza i contenuti della ricerca
435        if (pageNumber == "1")
436            $(this._containerList).html("");
437        else {
438            $(this._showMoreButton).html("");
439        }
440        if (totalElements == 0) {
441            $(this._containerList).html("<div class='p-20'>" + _system.label("search-no-results").replace("{hint}", this._data.value) + "</div>");
442        }
443        for (var key in results) {
444            var searchResult = {};
445            let cardModel = "card-search";
446            Object.assign(searchResult, results[key].fields);
447            //da fare link
448            if(searchResult["URL"].indexOf("/") == 0){
449                searchResult["URL"] = searchResult["URL"].substring(1);
450            }
451            if(searchResult["URL"].indexOf("http") == 0){
452                searchResult['link'] = searchResult["URL"];
453            }else{
454                searchResult['link'] = _system.createLink(searchResult["URL"]);
455            }
456            searchResult['program'] = "";
457            if (searchResult["nomeprogramma"]!==undefined)
458                searchResult['program'] = searchResult["nomeprogramma"];
459            searchResult['title'] = searchResult['Titolo'];
460            searchResult['date'] = searchResult['Data'];
461            searchResult['description'] = ""
462            if (searchResult['VDKSummary'] !== undefined)
463                searchResult['description'] = searchResult['VDKSummary'];
464            searchResult['image'] = searchResult['url_image'];
465            if (searchResult['image']){
466                cardModel = cardModel + "-image";
467                searchResult["image"] = _system.addParamResizing(searchResult["image"], 576, 360);
468            }
469            _views['home'].article(cardModel, searchResult).then(function (data) {
470                $(_search._containerList).append(data);
471                _search._counter++;
472                // if (_search._counter == Math.ceil(window.innerHeight / (_system.isDesktop() ? 180 : 110)) || _speakers._counter == Object.keys(results).length) {
473                //     $(_search._containerList + ' .lazy').lazy({
474                //         appendScroll: (_system.isDesktop() ? window : $('section[content="search"]')),
475                //     });
476                // }
477            });
478        }
479
480        //renderizo il pulsante mostra altro in caso in cui il totale sia maggiore del numero di elementi renderizzati
481        if (parseInt(totalElements) > (parseInt(this._pageSize) * parseInt(pageNumber))) {
482            var nextPageNumber = parseInt(pageNumber);
483            nextPageNumber++;
484            console.log(nextPageNumber);
485            var showMoreButton = '<div class="t-a-c"><button class="show-more m-t-20 m-b-20 mini auto outline" id="search-show-more-button" action="_search.start(' + nextPageNumber + ')">' + _system.label("show-more") +'</button></div>'
486            $(this._showMoreButton).append(showMoreButton);
487        }
488
489    },
490
491    checkContentType: function () {
492        if (!$(this._contentTypeEpisodes).is(":checked") && !$(this._contentTypePills).is(":checked") && !$(this._contentTypeVideos).is(":checked")) {
493            $(this._categoryContainer).hide();
494            $(this._programSelectorContainer).hide();
495        }
496        else {
497            $(this._categoryContainer).show();
498            $(this._programSelectorContainer).show();
499        }
500    },
501
502    checkInputText: function () {
503        if ($(this._inputText).val()) {
504            $(this._searchButton).removeClass('disabled');
505        } else if (!$(this._searchButton).hasClass('disabled'))
506            $(this._searchButton).addClass('disabled');
507    },
508}

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.