PageSourceSearch

https://rodeosusa.com/wp-content/themes/news-pro/js/ajax-search.js?ver=1.0

js rodeosusa.com collected 2026-10-02 07:19:23 UTC 6,958 bytes, 178 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function() {
2  const form = document.querySelector('form.postsRodeosFilter');
3  const resultsContainer = document.querySelector('.rodeosBlock__left');
4
5  // Функция для загрузки результатов по AJAX
6  function loadResults(ajaxUrl, friendlyUrl, pushState = true) {
7    resultsContainer.innerHTML = '<p>Loading...</p>';
8    
9    // Прокрутка вверх до загрузки результатов
10    const scrollTarget = document.querySelector('.rodeoSearch');
11    if (scrollTarget) {
12      scrollTarget.scrollIntoView({ behavior: 'smooth' });
13    }
14    
15    console.log('AJAX URL:', ajaxUrl); // Для отладки
16    
17    fetch(ajaxUrl, { 
18      method: 'POST',
19      headers: {
20        'Content-Type': 'application/x-www-form-urlencoded',
21      },
22      body: new URL(ajaxUrl).searchParams.toString()
23    })
24      .then(function(response) {
25        if (!response.ok) {
26          throw new Error('Network response was not ok');
27        }
28        return response.text();
29      })
30      .then(function(html) {
31        resultsContainer.innerHTML = html;
32        // После обновления контента переназначаем обработчик для новых ссылок пагинации
33        bindPaginationLinks();
34        // Обновляем URL в адресной строке с дружественным адресом
35        if (pushState) {
36          window.history.pushState(null, '', friendlyUrl);
37        }
38      })
39      .catch(function(error) {
40        resultsContainer.innerHTML = '<p>Error loading data</p>';
41        console.error('Error:', error);
42      });
43  }
44
45  // Функция для конвертации даты из формата MM/DD/YYYY в YYYYMMDD
46  function convertDateFormat(dateString) {
47    if (!dateString) return '';
48    
49    // Если уже в формате YYYYMMDD
50    if (/^\d{8}$/.test(dateString)) {
51      return dateString;
52    }
53    
54    // Если в формате MM/DD/YYYY
55    if (/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(dateString)) {
56      const [month, day, year] = dateString.split('/');
57      return year + month.padStart(2, '0') + day.padStart(2, '0');
58    }
59    
60    return dateString;
61  }
62
63  // Обработчик отправки формы поиска
64  if (form && resultsContainer) {
65    form.addEventListener('submit', function(e) {
66      e.preventDefault(); // отменяем стандартное поведение формы
67
68      // Собираем данные формы
69      const formData = new FormData(form);
70      
71      // Конвертируем даты в нужный формат
72      const dateFrom = formData.get('date_from');
73      const dateTo = formData.get('date_to');
74      
75      if (dateFrom) {
76        formData.set('date_from', convertDateFormat(dateFrom));
77      }
78      if (dateTo) {
79        formData.set('date_to', convertDateFormat(dateTo));
80      }
81
82      // Формируем AJAX-URL для запроса (используем admin-ajax.php)
83      formData.append('action', 'load_rodeos');
84      
85      const ajaxParams = new URLSearchParams();
86      for (const pair of formData.entries()) {
87        if (pair[1]) { // Только не пустые значения
88          ajaxParams.append(pair[0], pair[1]);
89        }
90      }
91      
92      // Логирование для отладки
93      console.log('Form data:', Object.fromEntries(formData.entries()));
94      console.log('AJAX params:', ajaxParams.toString());
95      
96      const ajaxUrl = myAjax.ajaxurl + '?' + ajaxParams.toString();
97
98      // Формируем дружественный URL для адресной строки
99      const friendlyUrlObj = new URL(window.location.origin + '/rodeos/');
100      
101      // Добавляем параметры для дружественного URL
102      const searchValue = formData.get('s');
103      const dateFromValue = formData.get('date_from');
104      const dateToValue = formData.get('date_to');
105      
106      if (formData.get('filter_by_date')) {
107        friendlyUrlObj.searchParams.append('filter_by_date', '1');
108      }
109      if (searchValue) {
110        friendlyUrlObj.searchParams.append('s', searchValue);
111      }
112      if (dateFromValue) {
113        friendlyUrlObj.searchParams.append('date_from', dateFromValue);
114      }
115      if (dateToValue) {
116        friendlyUrlObj.searchParams.append('date_to', dateToValue);
117      }
118      
119      const friendlyUrl = friendlyUrlObj.toString();
120
121      loadResults(ajaxUrl, friendlyUrl);
122    });
123  }
124
125  // Функция для навешивания обработчиков на ссылки пагинации
126  function bindPaginationLinks() {
127    const paginationContainer = document.querySelector('.rodeosBlock__result');
128    if (paginationContainer) {
129      const links = paginationContainer.querySelectorAll('a');
130      links.forEach(function(link) {
131        if (link.classList.contains('btn')) {
132          return;
133        }
134        link.addEventListener('click', function(e) {
135          e.preventDefault();
136          const linkUrl = new URL(link.getAttribute('href'), window.location.origin);
137          
138          // Сохраняем текущие параметры поиска из формы
139          const currentFormData = new FormData(form);
140          const searchQuery = currentFormData.get('s');
141          const dateFrom = currentFormData.get('date_from');
142          const dateTo = currentFormData.get('date_to');
143          
144          // Добавляем параметры поиска к пагинации
145          if (searchQuery) {
146            linkUrl.searchParams.set('s', searchQuery);
147          }
148          if (dateFrom) {
149            linkUrl.searchParams.set('date_from', convertDateFormat(dateFrom));
150          }
151          if (dateTo) {
152            linkUrl.searchParams.set('date_to', convertDateFormat(dateTo));
153          }
154          
155          linkUrl.searchParams.set('action', 'load_rodeos');
156          linkUrl.searchParams.set('filter_by_date', '1');
157          
158          const ajaxUrl = myAjax.ajaxurl + '?' + linkUrl.searchParams.toString();
159
160          // Для дружественного URL убираем параметр action
161          linkUrl.searchParams.delete('action');
162          const friendlyUrl = linkUrl.toString();
163
164          loadResults(ajaxUrl, friendlyUrl);
165        });
166      });
167    }
168  }
169
170  // Навесим обработчик на пагинационные ссылки сразу при загрузке страницы
171  bindPaginationLinks();
172
173  // Обработка кнопки "Назад/Вперёд" в браузере (опционально)
174  window.addEventListener('popstate', function(e) {
175    // Здесь можно получить window.location.href и выполнить loadResults() для восстановления состояния
176    location.reload();
177  });
178});

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.