PageSourceSearch

https://www.pasazer.com/_assets/js/controller-v5.min.js?v=092501

js pasazer.com collected 2026-09-24 23:03:02 UTC 34,212 bytes, 935 lines download raw bytes

1jQuery(document).ready(function ($) {
2
3    if ($('[data-ajaxloadcontent]').length > 0) {
4        _pazerAjaxLoadContent();
5    }
6
7    /* =========================
8       OWL dots position
9       ========================= */
10    var moveOwlControllerPosition = function () {
11        var img = document.getElementById('nd_pic0');
12        if (document.body.clientWidth < 992 || !img) {
13            return;
14        }
15
16        var owlDots = document.querySelector('#main_banners .owl-dots');
17        if (!owlDots) return;
18
19        var span = owlDots.querySelector('span');
20        owlDots.style.top = 50 + 'px';
21    };
22
23    var owl = $('#main_banners .owl-carousel');
24    owl.on('initialized.owl.carousel', function (event) {
25        setTimeout(function () {
26            moveOwlControllerPosition();
27            var mb = document.querySelector('#main_banners');
28            if (mb) mb.style.opacity = 1;
29        }, 1500);
30    });
31
32    window.addEventListener('resize', function (event) {
33        moveOwlControllerPosition();
34    }, true);
35
36    /* =========================
37       Autocomplete
38       ========================= */
39    var setAutocomplete = function (k, item) {
40        var $item = $(item),
41            url = item.dataset.autocomplete,
42            minLength = 2,
43            additionaTargetId = item.dataset.additionaltargetbyid;
44
45        $item.autocomplete({
46            source: url,
47            minLength: minLength,
48            select: function (event, ui) {
49                if (typeof (additionaTargetId) === 'string') {
50                    $('#' + additionaTargetId).val(ui.item.value);
51                }
52                $item.val(ui.item.label);
53                return false;
54            }
55        });
56    };
57
58    $('[data-autocomplete]').each(setAutocomplete);
59
60    /* ============================================================
61       REGISTER helpers
62       ============================================================ */
63
64    function isFormRequiredFilled($form) {
65        var ok = true;
66
67        $form.find('[required]').each(function () {
68            var el = this;
69            var type = (el.type || '').toLowerCase();
70
71            if (type === 'checkbox' || type === 'radio') {
72                if (!el.checked) ok = false;
73                return ok;
74            }
75
76            var v = $(el).val();
77            if (typeof v !== 'string') v = '' + (v || '');
78            if ($.trim(v) === '') ok = false;
79
80            return ok;
81        });
82
83        return ok;
84    }
85
86    function updateRegisterButtonState() {
87        var $form = $('#UserRegisterForm');
88        var $btn  = $('#RegisterSubmitBtn');
89        if ($form.length === 0 || $btn.length === 0) return;
90
91        if ($form.data('is_submitting') === 1) {
92    $btn.prop('disabled', true);
93    return;
94}
95
96        var errors =
97            ($form.data('error_username')   || 0) +
98            ($form.data('error_email')      || 0) +
99            ($form.data('error_password1')  || 0) +
100            ($form.data('error_password2')  || 0) +
101            ($form.data('error_first_name') || 0) +
102            ($form.data('error_last_name')  || 0);
103
104        var requiredOk = isFormRequiredFilled($form);
105
106        // reCAPTCHA: jeśli jest obecna, token musi być niepusty
107        var recaptchaOk = true;
108        var $rec = $form.find('[name="g-recaptcha-response"]').first();
109        if ($rec.length > 0) {
110            recaptchaOk = ($.trim($rec.val() || '') !== '');
111        }
112
113        $btn.prop('disabled', !(errors === 0 && requiredOk && recaptchaOk));
114    }
115
116    function registerErrorsCount($form) {
117        return (
118            ($form.data('error_username')   || 0) +
119            ($form.data('error_email')      || 0) +
120            ($form.data('error_password1')  || 0) +
121            ($form.data('error_password2')  || 0) +
122            ($form.data('error_first_name') || 0) +
123            ($form.data('error_last_name')  || 0)
124        );
125    }
126
127    /* ============================================================
128       GLOBAL submit handler (ALL forms)
129       ============================================================ */
130
131    var submitForm = function (e) {
132        var $form = $(this);
133
134        /* ============================================================
135           REGISTER: przejmujemy submit, żeby NIE kasowało dymków
136           i NIE scrollowało do góry (omijamy globalne walidatory)
137           ============================================================ */
138        if ($form.attr('id') === 'UserRegisterForm') {
139
140            // jeśli to natywny submit (wywołany this.submit()), przepuść
141            if ($form.data('native_submit') === 1) {
142                return true;
143            }
144
145            e.preventDefault();
146            e.stopPropagation();
147            if (e.stopImmediatePropagation) e.stopImmediatePropagation();
148
149            // zablokuj czyszczenie dymków w trakcie kliku submit
150            $form.data('is_submitting', 1);
151
152            var errors = registerErrorsCount($form);
153            var requiredOk = isFormRequiredFilled($form);
154
155            var recaptchaOk = true;
156            var $rec = $form.find('[name="g-recaptcha-response"]').first();
157            if ($rec.length > 0) {
158                recaptchaOk = ($.trim($rec.val() || '') !== '');
159            }
160
161            // jeśli coś nie gra -> nie wysyłaj, nie skacz do góry
162            if (!(errors === 0 && requiredOk && recaptchaOk)) {
163
164                $('.js_valid_robot').remove();
165                if (!recaptchaOk) {
166                    $('<p class="alert alert-danger p-2 mt-1 js_valid_robot">Prosimy zaznaczyć, że nie jesteś robotem</p>')
167                        .insertAfter($form.find('#RegisterSubmitBtn'));
168                }
169
170                $form.data('is_submitting', 0);
171                updateRegisterButtonState();
172                return false;
173            }
174
175            // OK -> natywny submit (bez jQuery submit-chain)
176            $form.data('native_submit', 1);
177
178            var $btn = $('#RegisterSubmitBtn');
179            if ($btn.length) {
180                if (!$btn.data('orig_html')) $btn.data('orig_html', $btn.html());
181                $btn.prop('disabled', true).html('Rejestruję twoje konto');
182            }
183
184            this.submit();
185            return false;
186        }
187
188        /* ============================================================
189           reszta: Twoja stara logika dla innych formularzy
190           ============================================================ */
191
192        e.stopPropagation();
193
194        if (!_pasazerHelperFormFieldValid(this)) {
195            return false;
196        }
197
198        switch ($form.attr('id')) {
199            case 'RateRateForm':
200                var valid_date = false;
201                var $rate = $form.find('.js_rate_radio');
202                $form.find('.text-danger').remove();
203                $rate.each(function (a, b) {
204                    if (b.checked) {
205                        valid_date = true;
206                    }
207                });
208                if (!valid_date) {
209                    $('<small class="text-danger">Wystaw ocenę</small>').insertAfter($form.find('.stars').first());
210                    return false;
211                }
212                break;
213        }
214
215        switch ($form.attr('name')) {
216            case 'register_form':
217                // tu normalnie już nie wchodzimy (bo register przejmujemy powyżej)
218                var errorRegister = ($form.data('error_username') || 0) + ($form.data('error_email') || 0);
219                if (errorRegister > 0) {
220                    return false;
221                }
222                break;
223
224            case 'newsletter_form':
225            case 'newsletter_settings':
226
227                $form.find('.text-danger').remove();
228
229                var $inputCheck0 = $form.find('input[name="data[Newsletter][policy]"]');
230                var $inputCheck1 = $('input[name="data[Newsletter][send_sumup]"]');
231                var $inputCheck2 = $('input[name="data[Newsletter][send_newnews]"]');
232                var $inputCheck3 = $('input[name="data[Newsletter][send_pro]"]');
233
234                var check1 = $inputCheck1.prop('checked');
235                var check2 = $inputCheck2.prop('checked');
236                var check3 = $inputCheck3.prop('checked');
237
238                var valid = $inputCheck0.prop('checked');
239
240                if (!valid) {
241                    $('<small class="text-danger">Wyraź zgodę</small>').appendTo($inputCheck0.parent('label'));
242                }
243
244                if (!check1 && !check2 && !check3) {
245                    valid = false;
246                    $('<small class="text-danger">Wybierz przynajmniej jedną z opcji</small>').appendTo($inputCheck1.parent('label'));
247                    $('<small class="text-danger">Wybierz przynajmniej jedną z opcji</small>').appendTo($inputCheck2.parent('label'));
248                    $('<small class="text-danger">Wybierz przynajmniej jedną z opcji</small>').appendTo($inputCheck3.parent('label'));
249                }
250
251                if (!valid) {
252                    return false;
253                }
254
255                break;
256        }
257
258        switch ($form.attr('name')) {
259            case 'service_search':
260                location.href = $form.attr('action') + $form.find('[name=phrase]').val().replace(/ /g,'+');
261                return true;
262
263            default:
264                var $captcha = $form.find('[data-gcaptchafield]');
265                if ($captcha.length === 0) {
266                    return true;
267                }
268
269                var $recaptcha2 = $form.find('[name=g-recaptcha-response]').first();
270
271                if (typeof ($recaptcha2.val()) === 'string' && $.trim($recaptcha2.val()) !== '') {
272                    return true;
273                } else {
274                    $('.js_valid_robot').remove();
275                    var message = '<p class="alert alert-danger p-2 mt-1 js_valid_robot">Prosimy zaznaczyć, że nie jesteś robotem</p>';
276                    $(message).insertAfter($form.find('button[type="submit"]'));
277                }
278        }
279
280        return false;
281    };
282
283    $('body').on('submit', 'form', submitForm);
284
285    /* ============================================================
286       REGISTER flags init
287       ============================================================ */
288    $('#UserRegisterForm').data('error_username', 0);
289    $('#UserRegisterForm').data('error_email', 0);
290    $('#UserRegisterForm').data('error_password1', 0);
291    $('#UserRegisterForm').data('error_password2', 0);
292    $('#UserRegisterForm').data('error_first_name', 0);
293    $('#UserRegisterForm').data('error_last_name', 0);
294
295
296
297// ============================================================
298// REGISTER: forbidden words in username (reserved + profanity)
299// ============================================================
300
301var REGISTER_FORBIDDEN_WORDS = [
302    // reserved
303    'admin', 'administrator', 'root', 'moderator', 'support', 'helpdesk',
304    'security', 'staff', 'system', 'owner', 'webmaster', 'pasazer', 'redakcja',
305
306    // profanity (PL) — dopisuj kolejne według uznania
307    'kurwa', 'chuj', 'cipa', 'pizda', 'jebac', 'jebany', 'pierdol', 'skurw', 'dziwka'
308];
309
310function normalizeUsernameForFilter(s) {
311    s = (s || '').toLowerCase();
312
313    // proste leetspeak (bo i tak masz tylko a-z0-9._-)
314    s = s.replace(/0/g, 'o')
315         .replace(/1/g, 'i')
316         .replace(/3/g, 'e')
317         .replace(/4/g, 'a')
318         .replace(/5/g, 's')
319         .replace(/7/g, 't');
320
321    // usuń separatory do obchodzenia filtrów
322    s = s.replace(/[._-\s]+/g, '');
323
324    return s;
325}
326
327function usernameContainsForbiddenWord(username) {
328    var norm = normalizeUsernameForFilter(username);
329
330    for (var i = 0; i < REGISTER_FORBIDDEN_WORDS.length; i++) {
331        var w = REGISTER_FORBIDDEN_WORDS[i];
332        if (!w) continue;
333
334        var wn = normalizeUsernameForFilter(w);
335
336        if (norm.indexOf(wn) !== -1) {
337            return w;
338        }
339    }
340    return false;
341}
342
343
344    /* ============================================================
345       REGISTER: USERNAME live validation + availability
346       ============================================================ */
347    var usernameSel = '#UserRegisterForm input[name="data[User][username]"]';
348
349    $('body').off('input.usernameCheck change.usernameCheck', usernameSel);
350    $('body').on('input.usernameCheck change.usernameCheck', usernameSel, function (ev) {
351        ev.stopPropagation();
352
353        var $f = $(this);
354        var $form = $('#UserRegisterForm');
355
356        if ($form.data('is_submitting') !== 1) {
357            $f.nextAll('small.js_username_msg').remove();
358        }
359
360        var raw = $f.val();
361        if (typeof raw !== 'string') raw = '';
362        var v = $.trim(raw).toLowerCase();
363
364        if ($f.val() !== v) $f.val(v);
365
366    
367
368        if (/\s/.test(v)) {
369            $form.data('error_username', 1);
370            $('<small class="text-danger js_username_msg">Login nie może zawierać spacji.</small>').insertAfter($f);
371            updateRegisterButtonState();
372            return;
373        }
374
375        if (v.length < 5 || v.length > 20) {
376            $form.data('error_username', 1);
377            $('<small class="text-danger js_username_msg">Login musi mieć od 5 do 20 znaków.</small>').insertAfter($f);
378            updateRegisterButtonState();
379            return;
380        }
381
382        if (!/^[a-z0-9._-]+$/.test(v)) {
383            $form.data('error_username', 1);
384            $('<small class="text-danger js_username_msg">Dozwolone znaki: a-z, 0-9 oraz . _ -</small>').insertAfter($f);
385            updateRegisterButtonState();
386            return;
387        }
388
389        if (/^[._-]|[._-]$/.test(v)) {
390            $form.data('error_username', 1);
391            $('<small class="text-danger js_username_msg">Login nie może zaczynać ani kończyć się znakiem . _ -</small>').insertAfter($f);
392            updateRegisterButtonState();
393            return;
394        }
395
396        if (/[._-]{2,}/.test(v)) {
397            $form.data('error_username', 1);
398            $('<small class="text-danger js_username_msg">Nie używaj kilku znaków . _ - obok siebie.</small>').insertAfter($f);
399            updateRegisterButtonState();
400            return;
401        }
402
403         var hit = usernameContainsForbiddenWord(v);
404		if (hit) {
405		    $form.data('error_username', 1);
406		    $('<small class="text-danger js_username_msg">Login zawiera niedozwolone słowo.</small>').insertAfter($f);
407		    updateRegisterButtonState();
408		    return;
409		}
410
411        $form.data('error_username', 0);
412        $('<small class="text-muted js_username_msg">Sprawdzam dostępność...</small>').insertAfter($f);
413        updateRegisterButtonState();
414
415        $.ajax({
416            url: '/users/check_availability_username/' + encodeURIComponent(v),
417            cache: false,
418            dataType: 'json',
419            success: function (data) {
420                if ($form.data('is_submitting') !== 1) {
421                    $f.nextAll('small.js_username_msg').remove();
422                }
423
424                if (data && parseInt(data.count, 10) > 0) {
425                    $form.data('error_username', 1);
426                    $('<small class="text-danger js_username_msg">Nazwa jest już zajęta, wybierz inną.</small>').insertAfter($f);
427                } else {
428                    $form.data('error_username', 0);
429                    $('<small class="text-success js_username_msg">Login dostępny i prawidłowy ✅</small>').insertAfter($f);
430                }
431                updateRegisterButtonState();
432            },
433            error: function () {
434                if ($form.data('is_submitting') !== 1) {
435                    $f.nextAll('small.js_username_msg').remove();
436                }
437                $form.data('error_username', 1);
438                $('<small class="text-warning js_username_msg">Nie udało się sprawdzić dostępności. Spróbuj ponownie.</small>').insertAfter($f);
439                updateRegisterButtonState();
440            }
441        });
442    });
443
444    /* ============================================================
445       REGISTER: EMAIL live + availability
446       ============================================================ */
447    var emailSel = '#UserRegisterForm input[name="data[User][email]"]';
448
449    $('body').off('input.emailCheck change.emailCheck', emailSel);
450    $('body').on('input.emailCheck change.emailCheck', emailSel, function (ev) {
451        ev.stopPropagation();
452
453        var $f = $(this);
454        var $form = $('#UserRegisterForm');
455
456        if ($form.data('is_submitting') !== 1) {
457            $f.nextAll('small.js_email_msg').remove();
458        }
459
460        var v = $.trim($f.val() || '');
461
462        if (v.length < 6 || v.length > 120) {
463            $form.data('error_email', 1);
464            $('<small class="text-danger js_email_msg">Email musi mieć sensowną długość.</small>').insertAfter($f);
465            updateRegisterButtonState();
466            return;
467        }
468
469        if (/\s/.test(v)) {
470            $form.data('error_email', 1);
471            $('<small class="text-danger js_email_msg">Email nie może zawierać spacji.</small>').insertAfter($f);
472            updateRegisterButtonState();
473            return;
474        }
475
476        var atPos = v.indexOf('@');
477        if (atPos < 1 || atPos !== v.lastIndexOf('@')) {
478            $form.data('error_email', 1);
479            $('<small class="text-danger js_email_msg">Podaj poprawny adres e-mail.</small>').insertAfter($f);
480            updateRegisterButtonState();
481            return;
482        }
483
484        var local = v.substring(0, atPos);
485        var domain = v.substring(atPos + 1);
486
487        if (!domain) {
488            $form.data('error_email', 1);
489            $('<small class="text-danger js_email_msg">Podaj domenę po znaku @ (np. example.com).</small>').insertAfter($f);
490            updateRegisterButtonState();
491            return;
492        }
493
494        if (!/^[A-Za-z0-9.-]+$/.test(domain)) {
495            $form.data('error_email', 1);
496            $('<small class="text-danger js_email_msg">Domena zawiera niedozwolone znaki.</small>').insertAfter($f);
497            updateRegisterButtonState();
498            return;
499        }
500
501        if (domain.indexOf('.') === -1 || domain.indexOf('..') !== -1) {
502            $form.data('error_email', 1);
503            $('<small class="text-danger js_email_msg">Podaj poprawną domenę (np. example.com).</small>').insertAfter($f);
504            updateRegisterButtonState();
505            return;
506        }
507
508        var parts = domain.split('.');
509        var tld = parts[parts.length - 1];
510        if (!/^[A-Za-z]{2,}$/.test(tld)) {
511            $form.data('error_email', 1);
512            $('<small class="text-danger js_email_msg">Końcówka domeny wygląda niepoprawnie.</small>').insertAfter($f);
513            updateRegisterButtonState();
514            return;
515        }
516
517        $form.data('error_email', 0);
518        $('<small class="text-muted js_email_msg">Sprawdzam dostępność...</small>').insertAfter($f);
519        updateRegisterButtonState();
520
521        $.ajax({
522            url: '/users/check_availability_email/' + encodeURIComponent(v),
523            cache: false,
524            dataType: 'json',
525            success: function (data) {
526                if ($form.data('is_submitting') !== 1) {
527                    $f.nextAll('small.js_email_msg').remove();
528                }
529
530                if (data && parseInt(data.count, 10) > 0) {
531                    $form.data('error_email', 1);
532                    $('<small class="text-danger js_email_msg">Email jest już zajęty</small>').insertAfter($f);
533                } else {
534                    $form.data('error_email', 0);
535                    $('<small class="text-success js_email_msg">Email wygląda poprawnie ✅</small>').insertAfter($f);
536                }
537                updateRegisterButtonState();
538            },
539            error: function () {
540                if ($form.data('is_submitting') !== 1) {
541                    $f.nextAll('small.js_email_msg').remove();
542                }
543                $form.data('error_email', 1);
544                $('<small class="text-warning js_email_msg">Nie udało się sprawdzić emaila. Spróbuj ponownie.</small>').insertAfter($f);
545                updateRegisterButtonState();
546            }
547        });
548    });
549
550    /* ============================================================
551       REGISTER: PASSWORD 1
552       ============================================================ */
553    var pass1Sel = '#UserRegisterForm input[name="data[User][password1]"]';
554
555    $('body').off('input.passCheck change.passCheck', pass1Sel);
556    $('body').on('input.passCheck change.passCheck', pass1Sel, function (ev) {
557        ev.stopPropagation();
558
559        var $f = $(this);
560        var $form = $('#UserRegisterForm');
561
562        if ($form.data('is_submitting') !== 1) {
563            $f.nextAll('small.js_pass_msg').remove();
564        }
565
566        var v = $f.val() || '';
567        if (typeof v !== 'string') v = '';
568
569        if (v.length < 6) {
570            $form.data('error_password1', 1);
571            $('<small class="text-danger js_pass_msg">Hasło musi mieć min. 6 znaków.</small>').insertAfter($f);
572            updateRegisterButtonState();
573            return;
574        }
575
576        if (!/[a-z]/.test(v)) {
577            $form.data('error_password1', 1);
578            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 małą literę.</small>').insertAfter($f);
579            updateRegisterButtonState();
580            return;
581        }
582
583        if (!/[A-Z]/.test(v)) {
584            $form.data('error_password1', 1);
585            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 wielką literę.</small>').insertAfter($f);
586            updateRegisterButtonState();
587            return;
588        }
589
590        if (!/[^A-Za-z0-9]/.test(v)) {
591            $form.data('error_password1', 1);
592            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 znak specjalny.</small>').insertAfter($f);
593            updateRegisterButtonState();
594            return;
595        }
596
597        $form.data('error_password1', 0);
598        $('<small class="text-success js_pass_msg">Hasło wygląda OK ✅</small>').insertAfter($f);
599        updateRegisterButtonState();
600    });
601
602    /* ============================================================
603       REGISTER: FIRST NAME
604       ============================================================ */
605    var firstSel = '#UserRegisterForm input[name="data[User][first_name]"]';
606
607    $('body').off('input.nameCheck change.nameCheck', firstSel);
608    $('body').on('input.nameCheck change.nameCheck', firstSel, function (ev) {
609        ev.stopPropagation();
610
611        var $f = $(this);
612        var $form = $('#UserRegisterForm');
613
614        if ($form.data('is_submitting') !== 1) {
615            $f.nextAll('small.js_first_msg').remove();
616        }
617
618        var v = $f.val() || '';
619        if (typeof v !== 'string') v = '';
620        v = $.trim(v).replace(/\s{2,}/g, ' ');
621        $f.val(v);
622
623        if (v.length < 2 || v.length > 40) {
624            $form.data('error_first_name', 1);
625            $('<small class="text-danger js_first_msg">Imię: 2–40 znaków.</small>').insertAfter($f);
626            updateRegisterButtonState();
627            return;
628        }
629
630        if (!/^[A-Za-zĄĆĘŁŃÓŚŹŻąćęłńóśźż' -]+$/.test(v)) {
631            $form.data('error_first_name', 1);
632            $('<small class="text-danger js_first_msg">Imię zawiera niedozwolone znaki.</small>').insertAfter($f);
633            updateRegisterButtonState();
634            return;
635        }
636
637        if (/^[ '\-]|[ '\-]$/.test(v)) {
638            $form.data('error_first_name', 1);
639            $('<small class="text-danger js_first_msg">Imię nie może zaczynać ani kończyć się spacją/\'/-.</small>').insertAfter($f);
640            updateRegisterButtonState();
641            return;
642        }
643
644        if (/([ '\-])\1+/.test(v)) {
645            $form.data('error_first_name', 1);
646            $('<small class="text-danger js_first_msg">Imię: usuń podwójne spacje / znaki.</small>').insertAfter($f);
647            updateRegisterButtonState();
648            return;
649        }
650
651        $form.data('error_first_name', 0);
652        $('<small class="text-success js_first_msg">OK ✅</small>').insertAfter($f);
653        updateRegisterButtonState();
654    });
655
656    /* ============================================================
657       REGISTER: LAST NAME
658       ============================================================ */
659    var lastSel = '#UserRegisterForm input[name="data[User][last_name]"]';
660
661    $('body').off('input.lastCheck change.lastCheck', lastSel);
662    $('body').on('input.lastCheck change.lastCheck', lastSel, function (ev) {
663        ev.stopPropagation();
664
665        var $f = $(this);
666        var $form = $('#UserRegisterForm');
667
668        if ($form.data('is_submitting') !== 1) {
669            $f.nextAll('small.js_last_msg').remove();
670        }
671
672        var v = $f.val() || '';
673        if (typeof v !== 'string') v = '';
674        v = $.trim(v).replace(/\s{2,}/g, ' ');
675        $f.val(v);
676
677        if (v.length < 2 || v.length > 60) {
678            $form.data('error_last_name', 1);
679            $('<small class="text-danger js_last_msg">Nazwisko: 2–60 znaków.</small>').insertAfter($f);
680            updateRegisterButtonState();
681            return;
682        }
683
684        if (!/^[A-Za-zĄĆĘŁŃÓŚŹŻąćęłńóśźż' -]+$/.test(v)) {
685            $form.data('error_last_name', 1);
686            $('<small class="text-danger js_last_msg">Nazwisko zawiera niedozwolone znaki.</small>').insertAfter($f);
687            updateRegisterButtonState();
688            return;
689        }
690
691        if (/^[ '\-]|[ '\-]$/.test(v)) {
692            $form.data('error_last_name', 1);
693            $('<small class="text-danger js_last_msg">Nazwisko nie może zaczynać ani kończyć się spacją/\'/-.</small>').insertAfter($f);
694            updateRegisterButtonState();
695            return;
696        }
697
698        if (/([ '\-])\1+/.test(v)) {
699            $form.data('error_last_name', 1);
700            $('<small class="text-danger js_last_msg">Nazwisko: usuń podwójne spacje / znaki.</small>').insertAfter($f);
701            updateRegisterButtonState();
702            return;
703        }
704
705        $form.data('error_last_name', 0);
706        $('<small class="text-success js_last_msg">OK ✅</small>').insertAfter($f);
707        updateRegisterButtonState();
708    });
709
710    /* ============================================================
711       REGISTER: PASSWORD 2 confirm
712       ============================================================ */
713    var pass2Sel = '#UserRegisterForm input[name="data[User][password2]"]';
714
715    $('body').off('input.pass2Check change.pass2Check', pass2Sel);
716    $('body').on('input.pass2Check change.pass2Check', pass2Sel, function (ev) {
717        ev.stopPropagation();
718
719        var $f2 = $(this);
720        var $form = $('#UserRegisterForm');
721
722        if ($form.data('is_submitting') !== 1) {
723            $f2.nextAll('small.js_pass2_msg').remove();
724        }
725
726        var p1 = $(pass1Sel).val() || '';
727        var p2 = $f2.val() || '';
728
729        if (p2.length < 1) {
730            $form.data('error_password2', 1);
731            $('<small class="text-danger js_pass2_msg">Powtórz hasło.</small>').insertAfter($f2);
732            updateRegisterButtonState();
733            return;
734        }
735
736        if (p1 !== p2) {
737            $form.data('error_password2', 1);
738            $('<small class="text-danger js_pass2_msg">Hasła nie są identyczne.</small>').insertAfter($f2);
739            updateRegisterButtonState();
740            return;
741        }
742
743        $form.data('error_password2', 0);
744        $('<small class="text-success js_pass2_msg">Hasła są zgodne ✅</small>').insertAfter($f2);
745        updateRegisterButtonState();
746    });
747
748    /* ============================================================
749       REGISTER: live button state recalculation
750       ============================================================ */
751    $('body').on('input change', '#UserRegisterForm input, #UserRegisterForm select', function () {
752        updateRegisterButtonState();
753    });
754
755    // watcher reCAPTCHA token (checkbox nie zawsze triggeruje change/input)
756    setInterval(function () {
757        updateRegisterButtonState();
758    }, 500);
759
760    // start
761    updateRegisterButtonState();
762
763    /* ============================================================
764       REGISTER: anti double-submit + loading state
765       (ten handler nie może przeszkadzać native_submit)
766       ============================================================ */
767    $('body').off('submit.registerLock', '#UserRegisterForm');
768    $('body').on('submit.registerLock', '#UserRegisterForm', function (ev) {
769
770        // jeśli idziemy natywnie (this.submit()), nie przeszkadzaj
771        if ($(this).data('native_submit') === 1) {
772            return true;
773        }
774
775        var $form = $('#UserRegisterForm');
776        var $btn  = $('#RegisterSubmitBtn');
777
778        if ($btn.length === 0) {
779            return true;
780        }
781
782        if ($form.data('is_submitting') === 1) {
783            ev.preventDefault();
784            return false;
785        }
786
787        if ($btn.prop('disabled')) {
788            ev.preventDefault();
789            return false;
790        }
791
792        $form.data('is_submitting', 1);
793
794        $btn.prop('disabled', true);
795
796        if (!$btn.data('orig_html')) {
797            $btn.data('orig_html', $btn.html());
798        }
799
800        $btn.html('Rejestruję twoje konto');
801
802        return true;
803    });
804
805    /* ============================================================
806       pozostałe Twoje eventy
807       ============================================================ */
808
809    $('body').on('click', '[data-reportdata]', function (e) {
810        var data = $(this).data('reportdata');
811        $('#report_messagf3rjcefuh').data('type', data.type).data('id', data.id);
812    });
813
814    $('body').on('click', '[data-skipflightinfo]', function (e) {
815        e.stopPropagation();
816        e.preventDefault();
817
818        var id = parseInt(this.dataset.skipflightinfo, 10);
819        var $row = $('#skip_fiueh742yq_' + id);
820
821        $.ajax({
822            url: '/flights/ajaxSkip/' + id,
823            cache: false
824        }).done(function (respond) {
825            $row.fadeOut('slow', function () {
826                $row.remove();
827            });
828        });
829
830        return false;
831    });
832
833    $('body').on('click', '[data-reportsend]', function (e) {
834        var $report = $('#report_messagf3rjcefuh');
835        var message = $report.val();
836        $('.report_message_error').remove();
837
838        if ($.trim(message).length < 5) {
839            $report.after('<small class="report_message_error text-danger">min. 5 znaków</small>');
840            return false;
841        }
842
843        $.ajax({
844            url: '/flags/ajaxAdd/',
845            method: 'post',
846            data: { id: $report.data('id'), what: $report.data('type'), comment: $report.val() }
847        }).done(function (msg) {
848            $report.data('id', 0).data('type', '').val('');
849            $('.report_message_error').remove();
850            $('[data-reportmodalclose]').click();
851        });
852    });
853
854    $('.jsexpand').hover(
855        function () { $(this).addClass('expand'); },
856        function () { $(this).removeClass('expand'); }
857    );
858
859    _pasazerSetJqueryCallendar();
860
861
862
863    /* ============================================================
864       RESET PASSWORD: PASSWORD 1
865       ============================================================ */
866    var resetPass1Sel = '#UserForgottenPasswordForm3 input[name="data[User][password1]"]';
867
868    $('body').off('input.resetPassCheck change.resetPassCheck', resetPass1Sel);
869    $('body').on('input.resetPassCheck change.resetPassCheck', resetPass1Sel, function (ev) {
870        ev.stopPropagation();
871
872        var $f = $(this);
873        $f.nextAll('small.js_pass_msg').remove();
874
875        var v = $f.val() || '';
876        if (typeof v !== 'string') v = '';
877
878        if (v.length < 6) {
879            $f.addClass('is-invalid');
880            $('<small class="text-danger js_pass_msg">Hasło musi mieć min. 6 znaków.</small>').insertAfter($f);
881            return;
882        }
883        if (!/[a-z]/.test(v)) {
884            $f.addClass('is-invalid');
885            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 małą literę.</small>').insertAfter($f);
886            return;
887        }
888        if (!/[A-Z]/.test(v)) {
889            $f.addClass('is-invalid');
890            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 wielką literę.</small>').insertAfter($f);
891            return;
892        }
893        if (!/[^A-Za-z0-9]/.test(v)) {
894            $f.addClass('is-invalid');
895            $('<small class="text-danger js_pass_msg">Hasło musi zawierać min. 1 znak specjalny.</small>').insertAfter($f);
896            return;
897        }
898        $f.removeClass('is-invalid');
899        $('<small class="text-success js_pass_msg">Hasło wygląda OK ✅</small>').insertAfter($f);
900    });
901
902
903
904    /* ============================================================
905       RESET PASSWORD: PASSWORD 2
906       ============================================================ */
907    var resetPass2Sel = '#UserForgottenPasswordForm3 input[name="data[User][password2]"]';
908
909    $('body').off('input.resetPass2Check change.resetPass2Check', resetPass2Sel);
910    $('body').on('input.resetPass2Check change.resetPass2Check', resetPass2Sel, function (ev) {
911        ev.stopPropagation();
912
913        var $f2 = $(this);
914        $f2.nextAll('small.js_pass2_msg').remove();
915
916        var p1 = $('#UserForgottenPasswordForm3 input[name="data[User][password1]"]').val() || '';
917        var p2 = $f2.val() || '';
918
919        if (p2.length < 1) {
920            $f2.addClass('is-invalid');
921            $('<small class="text-danger js_pass2_msg">Powtórz hasło.</small>').insertAfter($f2);
922            return;
923        }
924
925        if (p1 !== p2) {
926            $f2.addClass('is-invalid');
927            $('<small class="text-danger js_pass2_msg">Hasła nie są identyczne.</small>').insertAfter($f2);
928            return;
929        }
930
931        $f2.removeClass('is-invalid');
932        $('<small class="text-success js_pass2_msg">Hasła są zgodne ✅</small>').insertAfter($f2);
933    });
934
935});

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.