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.