PageSourceSearch

https://veteranfund.com.ua/wp-content/themes/uvgproject/js/custom.js?ver=3364

js veteranfund.com.ua collected 2026-09-24 09:52:52 UTC 15,955 bytes, 577 lines download raw bytes

1// програми
2const mobileNavTabButtons = document.querySelectorAll(".mobile button.tab-btn");
3mobileNavTabButtons.forEach(function(tabButton) {
4    tabButton.addEventListener("click",  e => {
5        e.stopPropagation();
6        const dataId = e.target.getAttribute("data-id")
7        let activeItem = document.querySelector(".mobile #"+dataId+"")
8        let parent = e.target.closest(".tab-btn-wrapper");
9        if(e.target.classList.contains("active")){
10            e.target.classList.remove("active");
11            parent.classList.remove("active");
12            activeItem.classList.add("hide");
13        }else{
14            e.target.classList.add("active");
15            parent.classList.add("active");
16            activeItem.classList.remove("hide");
17        }
18    });
19});
20const desktopTabButtons = document.querySelectorAll(".desktop .tab-btn");
21desktopTabButtons.forEach(function(tabButton) {
22    tabButton.addEventListener("click",  e => {
23        e.stopPropagation();
24        
25        const tabNavs = document.querySelectorAll(".desktop button.active");
26        const tabItems = document.querySelectorAll(".desktop .tab-item");
27
28        tabNavs.forEach(
29            tabNav => {
30                tabNav.classList.remove("active");
31                let parent = tabNav.closest(".tab-btn-wrapper");
32                parent.classList.remove("active");
33            }
34        );
35        tabItems.forEach(tabItem => {
36            tabItem.classList.add("hide");
37
38            let tabItemId = tabItem.getAttribute("id");
39
40            if (e.target.getAttribute("data-id") === tabItemId) {
41                let activeTabButtons =  document.querySelectorAll(".desktop [data-id=\'"+tabItemId+"\']")
42                activeTabButtons.forEach(activeTabButton => {
43                    let parent = activeTabButton.closest(".tab-btn-wrapper");
44                    parent.classList.add("active");
45                    activeTabButton.classList.add("active");
46                })
47
48                tabItem.classList.remove("hide");
49                
50            }
51        });
52    });
53});
54
55// лічильник на головній сторінці
56let SHEET_ID = '12znsz5XtRs3trncueTpuOuBfx_XlSiAme-SHiNQ_dtM';
57let SHEET_TITLE = 'Data';
58let SHEET_RANGE = 'A3:B8';
59
60let FULL_URL = 'https://docs.google.com/spreadsheets/d/' + SHEET_ID + '/gviz/tq?sheet=' + SHEET_TITLE + '&range=' + SHEET_RANGE;
61
62fetch(FULL_URL)
63.then(res => res.text())
64.then(rep => {
65    let data = JSON.parse(rep.substr(47).slice(0, -2));
66    let table_rows = data.table.rows;
67    let value_elements = document.getElementsByClassName('info_data_value');
68
69    for (let i = 0; i < table_rows.length && i < value_elements.length; i++) {
70        let counter = value_elements[i];
71        let cell_value = table_rows[i].c[1]?.v || 0; 
72
73        counter.setAttribute("akhi", cell_value);
74
75        const speed = 200;
76
77        const animate = () => {
78            const value = +counter.getAttribute('akhi');
79            const data = +parseIntWithSpaces(counter.innerText || "0");
80
81            const time = value / speed;
82            if (data < value) {
83                counter.innerText = numberWithSpaces(Math.ceil(data + time));
84                setTimeout(animate, 1);
85            } else {
86                counter.innerText = numberWithSpaces(value);
87            }
88        }
89
90        animate();
91    }
92});
93
94function numberWithSpaces(x) {
95    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
96}
97
98function parseIntWithSpaces(x) {
99    return parseInt(x.replace(/\s/g, ''), 10);
100}
101// каталог проєктів
102	function getArrayofIdForRowsWithReports(){
103		var matchedIds = [];
104		table.rows().every(function() {
105			var d = this.data().n; 
106			var fileUrlPDF = "/wp-content/uploads/doc/PZ/" + d + ".pdf";
107			var fileUrlXLSX = "/wp-content/uploads/doc/PZ/" + d + ".xlsx";
108
109			if (checkFileExists(fileUrlPDF) && checkFileExists(fileUrlXLSX)) {
110				matchedIds.push('^' + parseInt(d) + '$');	
111
112			}
113		});
114		
115		var pattern = matchedIds.join('|');
116		console.log(pattern);
117		return pattern;
118	}	
119
120    function filterGlobal () {
121		console.log('filterGlobal');
122        $('#example').DataTable().search(
123        $('#global_filter').val(),
124        $('#global_regex').prop('checked'),
125        $('#global_smart').prop('checked')
126        ).draw();
127    }
128    function filterColumn ( i ) {
129		console.log('filterColumn');
130    	$('#example').DataTable().column( i ).search(
131    	$('#col'+i+'_filter').val(),
132    	$('#col'+i+'_regex').prop('checked'),
133    	$('#col'+i+'_smart').prop('checked')
134    	).draw();
135    }
136   
137
138		$('select.column_filter').on( 'change', function () {
139        filterColumn( $(this).parents('tr').attr('data-column') );
140    } );
141
142    function format(d) {
143        return (
144            '<div class="block1" style="">'+
145            '<dd>' +
146            '<img src="https://veteranfund.com.ua/wp-content/uploads/doc/id/'+ d.n +
147          '.jpg">'+
148            '</dd>' +
149            '</div>'+
150            
151            '<div class="block2">'+
152            '<dl>' +
153            '<dt>
153Короткий опис проєкту:</dt>' +
154            '<dd>' +
155            d.u +
156            '</dd>' +
157            '<dt>Переможець:</dt>' +
158            '<dd>' +
159            d.w +
160            '</dd>' +
161            '<dt>Регіон де проєкт реалізується:</dt>' +
162            '<dd>' +
163            d.r +
164            '</dd>'+
165			'<dt>Місце реєстрації переможця:</dt>' +
166            '<dd>' +
167            d.s +
168            '</dd>'+
169            '<dt>Бюджет проєкту:</dt>' +
170            '<dd>' +
171            d.y +
172            '</dd>' +
173            '<dt>В рамках якої конкурсної программи було обрано переможцем:</dt>' +
174            '<dd>' +
175            d.q +
176            '</dd>' +
177			'<dt>Номер договору:</dt>' +
178            '<dd>' +
179            d.k +
180            '</dd>' +
181            '<dt>Напрям проєкту:</dt>' +
182            '<dd>' +
183            d.t +
184            '</dd>' +
185            '</dd>' +
186            '<dt>Посилання на сайт, соціальні мережі проєкту:' +
187            '<dd>' +
188            d.i +
189            '</br></br></dd>' +
190            '</dt>' +    
191            '<dt>' +
192            '<dd>' +
193            showFiles(d.k, d.o, d.p)
194            +
195            '</dt>'
196        );
197    };
198	
199
200	function showFiles(d, o, p){
201        if (p.length > 3 && o.length > 3) {
202			var new_d = d.replaceAll("/", "");
203            return (
204                '<div class="block1" style="width:50%"><center><a href="/wp-content/uploads/doc/PZ/zmist/'+ new_d +'_змістовний.pdf" target="_blank"><img src="https://veteranfund.com.ua/wp-content/uploads/doc/icon.png" style="width:75px"><br>Фінальна змістова звітність</a></center></div>	<div class="block2" style="width:50%"><center><a href="/wp-content/uploads/doc/PZ/finans/'+ new_d +'_фінансовий.pdf" target="_blank"><img src="https://veteranfund.com.ua/wp-content/uploads/doc/icon.png" style="width:75px"><br>Фінальна фінансова звітність</a></center></div>');
205        } else {
206            return '';
207        }
208    }
209	
210
211    let pattern = '';
212    let table = new DataTable('#example', {
213        ajax: 'https://veteranfund.com.ua/wp-content/uploads/doc/server_processing.php',
214        processing: true,
215        serverSide: true,
216        lengthMenu: [ 25, 50 ],
217    	search: {
218			regex: true
219		},
220      
221        language: {
222          paginate: {
223                  Next: '>>',
224                Previous: '<<'
225                },
226            "infoEmpty": " Результати відсутні",
227            "info": 'Показано _PAGE_ з _PAGES_ сторінок',
228            "emptyTable": "Відсутні відповідності",
229            "infoFiltered": "(Пошук здійснювався з _MAX_ переможців конкурсних відборів проєÐ
229ºÑ‚ів)",
230            "lengthMenu": "Показувати _MENU_ переможців на сторінці",
231            "loadingRecords": "Завантажуеться...",
232            "processing": "Обробляеться...",
233            "search": "Шукати:",
234                     "paginate": {
235                             "first": "Перша",
236                             "previous": "<<",
237                             "next": ">>",
238                             "last": "Остання"
239                     },
240    
241            "zeroRecords": "Інформація відсутня",
242    },
243      
244       columns: [
245            {
246                className: 'dt-control',
247                orderable: false,
248                data: null,
249                defaultContent: ''
250            },
251		   { data: 'n'},
252            { data: 'e' },
253            { data: 'r' },
254		    { data: 's' },
255            { data: 't' },
256            { data: 'q' },
257            { data: 'w' },
258           { data: 'o' },
259            { data: 'p' },
260		   { data: 'k' },
261            
262        ], 
263         columnDefs: [
264			{
265				targets: -1,
266				visible: false
267			},
268
269			{
270				targets: -2,
271				visible: false
272			},
273			{
274				targets: -3,
275				visible: false
276			},
277			{
278				targets: -4,
279				visible: false
280			},
281			{
282				targets: -5,
283				visible: false
284			},
285			{
286				targets: -6,
287				visible: false
288
289			},
290			 {
291				targets: -7,
292				visible: false
293
294			},
295			 {
296				targets: -8,
297				visible: false
298
299			}
300		
301
302		],
303        order: [[1, 'asc']],
304		initComplete: function (settings, json) {
305		}
306    });
307
308    table.on('click', 'td.dt-control', function (e) {
309        let tr = e.target.closest('tr');
310        let row = table.row(tr);
311        if (row.child.isShown()) {
312            row.child.hide();
313        }
314        else {
315            row.child(format(row.data())).show();
316        }
317    });
318    document.querySelectorAll('input.global_filter').forEach((el) => {
319        el.addEventListener(el.type === 'text' ? 'keyup' : 'change', () =>
320            filterGlobal(table)
321        );
322    });
323     
324    document.querySelectorAll('input.column_filter').forEach((el) => {
325        let tr = el.closest('tr');
326        let columnIndex = tr.getAttribute('data-column');
327     
328        el.addEventListener(el.type === 'text' ? 'keyup' : 'change', () =>
329            filterColumn(table, columnIndex)
330        );
331    });
332    
333		
334		
335		
336// 		вакансії
337 const titles = document.querySelectorAll(".vakansii-title");
338    titles.forEach(function(title) {
339        title.addEventListener("click",  e => {
340        e.stopPropagation();
341        var dataId = title.getAttribute("data-id");
342
343        var content = document.getElementById(dataId);
344        if (content) {
345            if (content.style.display === "none" || content.style.display === "") {
346                content.style.display = "block";
347            } else {
348                content.style.display = "none";
349            }
350            }
351        });
352    });
353		
354//         історії переможців
355document.addEventListener("DOMContentLoaded", function () {
356	var list = document.querySelector(".category-filter ul");
357	var divs = document.querySelectorAll(".posts");
358        
359	list.addEventListener("click", function (event) {
360		if (event.target.tagName === "LI") {
361			var allLiElements = list.getElementsByTagName("li");
362			for (var i = 0; i < allLiElements.length; i++) {
363				allLiElements[i].classList.remove("active");
364			}
365        
366			event.target.classList.add("active");
367        
368			var dataId = event.target.getAttribute("data-id");
369        
370			divs.forEach(function (div) {
371				if (div.id === dataId) {
372                  div.classList.add("active");
373                } else {
374                  div.classList.remove("active");
375                }
376			});
377		}
378	});
379});
380		
381		
382// 		тендерні закупівлі
383
384const SHEET_URL =
385'https://docs.google.com/spreadsheets/d/15zsErynmpVcqvD9Cgi3FhuKRmtpMiza8LJyXuMsxUeI/export?format=csv&gid=0';
386
387let tenders = [];
388
389fetch(SHEET_URL)
390.then(function(response) {
391return response.text();
392})
393.then(function(csv) {
394
395const parsed = Papa.parse(csv, {
396  skipEmptyLines: true
397});
398
399tenders = parsed.data.slice(1);
400
401renderYearFilter(tenders);
402renderDkFilter(tenders);
403renderAccordion(tenders);
404
405});
406
407function renderYearFilter(data) {
408
409const select = document.getElementById('tendersYear');
410
411const years = Array.from(
412new Set(
413data.map(function(item) {
414return item[1];
415})
416)
417)
418.filter(Boolean)
419.sort(function(a, b) {
420return b - a;
421});
422
423years.forEach(function(year) {
424const option = document.createElement('option');
425option.value = year;
426option.textContent = year;
427select.appendChild(option);
428});
429
430select.addEventListener('change', applyFilters);
431}
432
433function renderDkFilter(data) {
434
435const select = document.getElementById('tendersDk');
436
437const codes = Array.from(
438new Set(
439data.map(function(item) {
440return item[2];
441})
442)
443)
444.filter(Boolean)
445.sort();
446
447codes.forEach(function(code) {
448const option = document.createElement('option');
449option.value = code;
450option.textContent = code;
451select.appendChild(option);
452});
453
454select.addEventListener('change', applyFilters);
455}
456
457function applyFilters() {
458
459const selectedYear = document.getElementById('tendersYear').value;
460const selectedDk = document.getElementById('tendersDk').value;
461
462const filteredData = tenders.filter(function(item) {
463
464const yearMatch =
465  selectedYear === 'all' || String(item[1]) === selectedYear;
466
467const dkMatch =
468  selectedDk === 'all' || String(item[2]) === selectedDk;
469
470return yearMatch && dkMatch;
471
472});
473
474renderAccordion(filteredData);
475}
476
477function renderAccordion(data) {
478
479const container = document.getElementById('tendersAccordion');
480
481container.innerHTML = '';
482
483data.forEach(function(item) {
484
485const accordionItem = document.createElement('div');
486
487accordionItem.className = 'accordion-item';
488
489let detailsLink = '';
490
491if (item[8]) {
492  detailsLink =
493    '<a href="' + item[8] + '" target="_blank" rel="noopener">' +
494      'Деталі закупівлі' +
495    '</a>';
496}
497
498accordionItem.innerHTML =
499
500  '<button class="accordion-header" type="button">' +
501
502
503    '<span class="accordion-header-value">' +
504      (item[0] || '') +
505    '</span>' +
506
507  '</button>' +
508
509  '<div class="accordion-content">' +
510
511    '<div class="accordion-inner">' + 
512		
513		'<p>' +
514        '<strong>Рік:</strong> ' +
515        (item[1] || '') +
516      '</p>' +
517	'<p><strong>Обґрунтування технічних та якісних характеристик предмета закупівлі, розміру бюджетного призначення, очікуваної вартості предмета закупівлі</strong></p>' +
518		'<p>' +
519        '<strong>Вид закупівлі:</strong><br>' +
520        (item[2] || '') +
521      '</p>' +
522      '<p>' +
523        '<strong>Код ДК:</strong><br>' +
524        (item[3] || '') +
525      '</p>' +
526	
527      '<p>' +
528        '<strong>Назва предмета закупівлі:</strong><br>' +
529        (item[4] || '') +
530      '</p>' +
531
532      '<p>' +
533        '<strong>Обґрунтування очікуваної вартості:</strong><br>' +
534        (item[5] || '') +
535      '</p>' +
536
537      '<p>' +
538        '<strong>Очікувана вартість закупівлі:</strong><br>' +
539        (item[6] || '') +
540      '</p>' +
541
542      '<p>' +
543        '<strong>Розмір бюджетного призначення:</strong><br>' +
544        (item[7] || '') +
545      '</p>' +
546
547      '<p>' +
548        '<strong>Обґрунтування технічних та якісних характеристик:</strong><br>' +
549        (item[8] || '') +
550      '</p>' +
551
552      detailsLink +
553
554    '</div>' +
555
556  '</div>';
557
558container.appendChild(accordionItem);
559
560});
561
562initAccordion();
563}
564
565function initAccordion() {
566
567document.querySelectorAll('.accordion-header').forEach(function(button) {
568
569button.addEventListener('click', function() {
570
571  const item = button.parentElement;
572
573  item.classList.toggle('active');
574});
575
576});
577}

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.