PageSourceSearch

https://diecezja.kalisz.pl/js/ajax_req.js

js diecezja.kalisz.pl collected 2026-10-02 18:48:36 UTC 16,562 bytes, 431 lines download raw bytes

1SHOW_REQUEST_DURATION = 0; // czy ma być wpisywany czas trwania zapytań?
2ajax_tot_time = 0;
3
4get_type = (thing) => {
5  if(thing === null){
6    return "[object Null]"; // special case
7  }
8  return Object.prototype.toString.call(thing);
9}
10
11const GetXmlHttpObject = (handler) => {
12  var objXMLHttp=null;
13  if (window.XMLHttpRequest){
14    objXMLHttp=new XMLHttpRequest();
15  }
16  else if (window.ActiveXObject){
17    objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
18  }
19  return objXMLHttp;
20}
21
22const microtime = (get_as_float) => {
23  // http://kevin.vanzonneveld.net
24  // +   original by: Paulo Freitas
25  // *     example 1: timeStamp = microtime(true);
26  // *     results 1: timeStamp > 1000000000 && timeStamp < 2000000000
27  var now = new Date().getTime() / 1000;
28  var s = parseInt(now, 10);
29
30  return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
31}
32
33// helper do dodawania czasu do listy czasów zapytań (i innych zdarzeń)
34// \param label   - etykietka do wypisania
35// \param time1   - jak nie ma time2, to czas [s] zapytania. Jeśli jest time2, to czas zapytania = (time2-time1)
36const addToTotalTime = (label, time1, time2) => {
37  if(time2){
38    var period = ((time2-time1)/1000).toFixed(4);
39  }
40  else {
41    var period = time1;
42  }
43
44  if(!isSet(ajax_tot_time)){
45    ajax_tot_time = +period;
46  }
47  else {
48    ajax_tot_time += +period;
49  }
50
51  if(SHOW_REQUEST_DURATION){
52    var txt = '<tr><td>'+label+'</td><td style="width:70px;margin-left:20px">'+period+'s</td><td style="width:70px;margin-left:20px">'+ajax_tot_time.toFixed(4)+'s</td></tr>';
53    $('#ajax_total_time').append(txt);
54  }
55}
56
57const stateChanged = (AJAX, handler, t0, url) => {
58  if (AJAX.readyState==4 || AJAX.readyState=="complete"){
59    if(handler){
60      var t1 = microtime(true);
61      addToTotalTime(url, t0, t1);
62//      var txt = '<span style="width:500px">'+url+'</span><span style="width:150px">'+dt+'s</span><span style="width:150px">'+ajax_tot_time+'s</span><br />';
63//      var txt = '<tr><td>'+url+'</td><td style="width:70px;margin-left:20px">'+dt.toFixed(4)+'s</td><td style="width:70px;margin-left:20px">'+ajax_tot_time.toFixed(4)+'s</td></tr>';
64//      $('#ajax_total_time').append(txt);
65      handler(AJAX.responseText);
66    }
67  }
68  else {
69    //alert(xmlHttp.status);
70  }
71}
72/*
73// Inicjuje zapytanie AJAXa; zwrócone zapytanie jest przekazywane do podanego handlera.
74// Jeśli nie oczekujemy odpowiedzi, handler powinien być równy null.
75// \post_params   Jeśli jest, zawiera string listę par nazwa=wartość&nazwa=wartość, które mają być wysłane POST-em
76const htmlData = (url,handler,post_params) => {
77//  alert(url);
78  if(url.length == 0){
79//    document.getElementById(element_id).innerHTML="";
80    return;
81  }
82  var AJAX = GetXmlHttpObject()
83  if(AJAX == null){
84    alert("Browser does not support HTTP Request");
85    return;
86  }
87
88  url = url_base + '/' + url + '&sid=' + Math.random();
89  if(handler){
90    var t0 = microtime(true);
91    AJAX.onreadystatechange = () => {
92      stateChanged(AJAX, handler, t0, url)
93    }
94  }
95  if((typeof post_params == 'string' && post_params.length) || typeof post_params == 'object'){
96    // wysyłamy POST-em
97    AJAX.open("POST", url, true); // true powoduje, że NIE czeka na odpowiedź
98    //Send the proper header information along with the request
99    AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
100//    AJAX.setRequestHeader("Content-length", post_params.length);
101//    AJAX.setRequestHeader("Connection", "close");
102    AJAX.send(post_params);
103  }
104  else {
105    // wysyłamy GET-em
106    AJAX.open("GET", url, true); // true powoduje, że NIE czeka na odpowiedź
107    AJAX.send(null);
108  }
109}
110*/
111// Inicjuje zapytanie AJAXa; zwrócone zapytanie jest przekazywane do podanego handlera.
112// Jeśli nie oczekujemy odpowiedzi, handler powinien być równy null.
113// \post_params   Jeśli jest, zawiera string listę par nazwa=wartość&nazwa=wartość, które mają być wysłane POST-em
114const htmlData = (url,handler,post_params) => {
115//  alert(url);
116  if(url.length == 0){
117//    document.getElementById(element_id).innerHTML="";
118    return;
119  }
120  var xhr = new XMLHttpRequest();
121  if(xhr == null){
122    alert("Browser does not support XMLHttpRequest");
123    return;
124  }
125
126  url = url_base + '/' + url + '&sid=' + Math.random();
127
128  var t0 = microtime(true);
129
130  xhr.onload = () => {
131    if(xhr.status === 200){
132
133      var t1 = microtime(true);
134      addToTotalTime(url, t0, t1);
135
136      if(typeof handler == 'function'){
137        handler(xhr.response);
138      }
139    }
140    else {
141      console.error('htmlData(): xhr.onload error');
142    }
143  };
144
145
146  if((typeof post_params == 'string' && post_params.length) || typeof post_params == 'object'){
147    xhr.open('POST', url, true);
148    if(typeof post_params == 'string'){
149      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
150    }
151    xhr.send(post_params);
152
153    // wysyłamy POST-em
154//    AJAX.open("POST", url, true);
154 // true powoduje, że NIE czeka na odpowiedź
155//    AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
156  }
157  else {
158    // wysyłamy GET-em
159    xhr.open("GET", url, true); // true powoduje, że NIE czeka na odpowiedź
160    xhr.send(null);
161  }
162}
163
164
165// wywołuje wskazany url, ale czeka na odpowiedź
166// \post_params   Jeśli jest, zawiera string listą par nazwa=wartość&nazwa=wartość, które mają być wysłane POST-em
167const htmlDataSync = (url, post_params) => {
168  AJAX = GetXmlHttpObject();
169  if (AJAX) {
170    var t0 = microtime(true);
171    if((typeof post_params == 'string' && post_params.length) || typeof post_params == 'object'){
172      // wysyłamy POST-em
173      AJAX.open("POST", url, false); // false powoduje, że czeka na odpowiedź
174      //Send the proper header information along with the request
175      AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
176//      AJAX.setRequestHeader("Content-length", post_params.length);
177//      AJAX.setRequestHeader("Connection", "close");
178      AJAX.send(post_params);
179    }
180    else {
181      // wysyłamy GET-em
182      AJAX.open("GET", url, false); // false powoduje, że czeka na odpowiedź
183      AJAX.send(null);
184    }
185    var t1 = microtime(true);
186    if(SHOW_REQUEST_DURATION){
187      var dt = +(t1-t0);
188      if(!isSet(ajax_tot_time)){
189        ajax_tot_time = dt;
190      }
191      else {
192        ajax_tot_time += dt;
193      }
194
195      var txt = '<span style="width:500px">'+url+'</span><span style="width:150px">'+dt+'s</span><span style="width:150px">'+ajax_tot_time+'s</span><br />';
196      var txt = '<tr><td>'+url+'</td><td style="width:70px;margin-left:20px">'+dt.toFixed(4)+'s</td><td style="width:70px;margin-left:20px">'+ajax_tot_time.toFixed(4)+'s</td></tr>';
197      $('#ajax_total_time').append(txt);
198    }
199
200    return AJAX.responseText;
201  }
202  return false;
203}
204
205// do wskazanego selektora (obiektu HTML lub stringa z id obiektu)
206// dodaje opcję text,value
207const addOptionToSelector = (selector,text,value) => {
208  var typ = get_type(selector);
209  if(typ == '[object String]'){
210    selector = document.getElementById(selector);
211  }
212//  typ = get_type(selector);
213//  if(typ != "[object HTMLSelectElement]"){
214//    return;
215//  }
216
217  opt = document.createElement("option");
218  try {
219    var elOptOld = selector.options[selector.selectedIndex];
220    selector.options.add(opt, elOptOld); // standards compliant; doesn't work in IE
221  }
222  catch(ex){
223    selector.options.add(opt, selector.selectedIndex); // IE only
224  }
225
226  opt.text = text;
227  opt.value = value;
228}
229
230// Helper do synchronicznych wywoływań AJAXA.
231// \param  action Akcja do wykonania
232// \param params  Parametry akcji
233// \show_confirm  TRUE oznacza, że przy wskaźniku myszy pojawi się znikający DIV z wynikiem (OK lub ERROR)
234// \post_params   Jeśli jest, zawiera obiekt z listą par nazwa=wartość&nazwa=wartość, które mają być wysłane POST-em
235// \skip_eval     TRUE oznacza, że funkcja zwróci odpowedź dokładnie taką jak otrzymana z serwera, bez przetwarzania
236const JSONSyncRequest = (action, params, show_confirm, post_params, skip_eval) => {
237  try {
238    if(params.length && params.charAt(0) != '&'){
239      params = '&' + params;
240    }
241    var response = htmlDataSync('ajax_req.php?aaction='+action+params, post_params);
242    var type = get_type(response);
243    if(response === false || (type == '[object String]' && response.substr(0,5) == 'ERROR')){
244      if(response === false){
245        alert("Nie powiodło się stworzenie obiektu zapytania AJAX");
246      }
247      else {
248        alert(response);
249      }
250      return null;
251    }
252    else {
253      // ponieważ ajax powinien zwrócić dane jako JSON, zatem po prostu zewaluujmy je do obiektu
254      if(skip_eval){
255        return response;
256      }
257      else {
258        try {
259          var arr = eval("("+response+")");
260        }
261        catch(e){
262          arr = {};
263        }
264        return arr;
265      }
266    }
267    alert('ajax_req.js(162): nie powinno nas tu być!');
268  }
269  catch(e){
270//    JSONAsyncRequest('ajax_terminarz_sql','action=zapisz_blad&event=JSON SYNC REQUEST&txt='+e,false,'');
271  }
272  return null;
273}
274
275// Helper do asynchronicznych wywoływań AJAXA.
276// \param  action Akcja do wykonania
277// \param params  Parametry akcji
278// \show_confirm  TRUE oznacza, że przy wskaźniku myszy pojawi się znikający DIV z wynikiem (OK lub ERROR)
279// \post_params   Jeśli jest, zawiera obiekt z listą par nazwa=wartość&nazwa=wartość, które mają być wysłane POST-em
280// Jeśli nie oczekujemy odpowiedzi, handler powinien być równy null.
281// UWAGA: handler otrzymuje odpowiedź jako gołe dane, np. JSON, a nie obiekt.
282const JSONAsyncRequest = (action, params, show_confirm, post_params, handler) => {
283//  var response = htmlDataSync('ajax_req.php?aaction=ajax_user_data_save&uid='+uid+'&dane='+json);
284  if(params.length && params.charAt(0) != '&'){
285    params = '&' + params;
286  }
287//  var response = htmlData('ajax_req.php?aaction='+action+params, handler, post_params);
288  var response = htmlData('aaction='+action+params, handler, post_params);
289}
290
291// Podobnie do JSONAsyncRequest, ale ma już wbudowane wychwycenie wyjątku i ewentualne wyświetlanie spinnera
292// Dodatkowe parametry:
293// \param hide_spinner     FALSE (defaultowo) oznacza, że spinner BĘDZIE wyświetlany
294// \param alert_message    Defaultowo (ewentualnie zlokalizowany) napis 'Operacja nie powiodła się.'. Jak zostanie przekazny napis pusty (''), to alert nie zostanie wyświetlony
295// \param files            Pojedynczy obiekt jQuery kontrolki $(input[type="file"]) lub tablica takich obiektów jQuery
296// \param filter_fn   Jeśli jest, to zostanie wywołana z nazwą, typem i długością każdego pliku wybranego w kontrolce; filter_fn(nazwa, typ, długość). Jeśli plik jest akceptowalny, powinna zwrócić true.
297const JSONAsyncRequest2 = (action, params, post_params, files, handler, hide_spinner, alert_message, filter_fn) => {
298
299  if(alert_message !== ''){
300    alert_message = alert_message || 'Błąd parsowania odpowiedzi.';
301    alert_message += ' Odśwież przeglądarkę i spróbuj ponownie.\nBłąd: ';
302  }
303
304  if(!hide_spinner){
305    var spinner = new CWaitSpinner();
306  }
307
308  if(files || post_params){
309    var fd = new FormData();
310
311    if(post_params){
312      fd.append('json', encodeURIComponent(post_params));
313    }
314
315    if(Array.isArray(files)){ // hmm, mamy tablicę inputów, z których każdy może mieć po kilka plików lub nic nie wybranego
316      for(var f = 0; f < files.length; ++f){
317        var input = files[f][0];
318        var name = files[f].attr('name');
319        for(var i = 0; i < input.files.length; i++) {
320          var file = input.files[i];
321          if(!file || !file.name){
322            continue;
323          }
324          if(typeof filter_fn == 'function' && !filter_fn(file.name, file.type, file.size, name)){ // dajmy callerowi szansę na odfiltrowanie niedozwolonych plików
325            if(!hide_spinner){
326              spinner.close();
327            }
328
329            if(typeof handler == 'function'){
330              handler({error_code : 0, result : 'BAD TYPE', message : 'Plik ' + file.name + ' jest niedozwolonego typu'});
331            }
332            return;
333          }
334          fd.append(name+'[]', file, file.name); // Add the file to the request.
335        }
336
337      }
338    }
339    else if(files){ // pojedynczy input
340      var input = files[0];
341      var name = files.attr('name');
342      for(var i = 0; i < input.files.length; i++) {
343        var file = input.files[i];
344        if(!file || !file.name){
345          continue;
346        }
347        if(typeof filter_fn == 'function' && !filter_fn(file.name, file.type, file.size, name)){ // dajmy callerowi szansę na odfiltrowanie niedozwolonych plików
348          if(!hide_spinner){
349            spinner.close();
350          }
351
352          if(typeof handler == 'function'){
353            handler({error_code : 0, result : 'BAD TYPE', message : 'Plik ' + file.name + ' jest niedozwolonego typu'});
354          }
355          return;
356        }
357
358        fd.append(name+'[]', file, file.name); // Add the file to the request.
359
360      }
361    }
362  }
363
364  JSONAsyncRequest(action, params, false, fd, (resp) => {
365    if(!hide_spinner){
366      spinner.close();
367    }
368
369    try {
370      var dane = JSON.parse(resp);
371    }
372    catch(e){
373      if(alert_message !== ''){
374        alert(alert_message + e);
375        console.error(alert_message + e);
376        console.log('Response:\n' + resp);
377      }
378      if(typeof handler == 'function'){
379        handler(null);
380      }
381      return;
382    }
383
384    if(typeof handler == 'function'){
385      handler(dane);
386    }
387  });
388}
389
390// \param post_params  String z parametrami dla POST. Jeśli options.post_json == true, to string jest automatycznie przepuszczany przez JSON.stringify
391// \param options      Opcjonalny obiekt z dodatkowymi parametrami wywołania.
392//                     Dostępne parametry to:
393//    files -          Tablica obiektów CFile do przekazania razem z post_params. Dafaultowo null
394//    post_json        TRUE powoduje, że string post_params jest zamieniany na JSON.stringify(post_params). Defaultowo TRUE.
395//    hide_spinner     TRUE powoduje, że spinner NIE będzie wyświetlany. Defaultowo FALSE
396//    alert_message    Komunikat wyświetlany w przypadku błędu podczas parsowania danych. Jak jest pusty string, to alert nie będzie wyświetlany. Defaultowo 'Błąd w odpowiedzi JSON.'
397//    filter_fn        Jeśli jest, to zostanie wywołana z nazwą, typem i długością każdego pliku wybranego w kontrolce; filter_fn(nazwa, typ, długość). Jeśli plik jest akceptowalny, powinna zwrócić true.
398const JSONAsyncRequest3 = (action, params, post_params = '', options = {}) => {
399
400  options = options || {};
401  options.files         = options.files || null;
402  options.post_json     = options.post_json || true;
403  options.hide_spiner   = options.hide_spiner || false;
404  options.alert_message = options.alert_message ?? 'Błąd w odpowiedzi JSON.';
405  options.filter_fn     = options.filter_fn || null;
406
407  return new Promise((resolve, reject) => {
408    JSONAsyncRequest2(action, params, options.post_json? JSON.stringify(post_params) : post_params, options.files, dane => {
409      if(dane?.result == 'ACCESS DENIED'){ // umarło cookie sesji?
410
411        if(+partner_id){
412          console.log('ACCESS DENIED (1) ON ', action+'?'+params);
413          (new CReloginPartner(null)).relogin().then(() => { // spróbujmy się zalogować i poinformujmy callera, że nastąpiło przelogowanie
414  //          resolve({'error_code' : 1, 'result' : 'AFTER RELOGIN', 'message' : 'Nastąpiło przelogowanie, proszę powtórzyć akcję'});
415          });
416        }
417        else {
418          console.log('ACCESS DENIED (2) ON ', action+'?'+params);
419          (new CReloginUser(null)).relogin().then(() => { // spróbujmy się zalogować i poinformujmy callera, że nastąpiło przelogowanie
420  //          resolve({'error_code' : 1, 'result' : 'AFTER RELOGIN', 'message' : 'Nastąpiło przelogowanie, proszę powtórzyć akcję'});
421          });
422        }
423
424      }
425      else {
426        resolve(dane);
427      }
428    }, options.hide_spinner, options.alert_message, options.filter_fn);
429  });
430}
431

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.