{"id":22227,"date":"2024-11-18T16:00:00","date_gmt":"2024-11-18T15:00:00","guid":{"rendered":"https:\/\/telemedi.com\/?page_id=22227"},"modified":"2026-04-13T14:57:54","modified_gmt":"2026-04-13T12:57:54","slug":"formularz-refundacji","status":"publish","type":"page","link":"https:\/\/telemedi.com\/pl\/formularz-refundacji\/","title":{"rendered":"Formularz refundacji"},"content":{"rendered":"\n<script>\n\twindow.TELEMEDI_API_BASE_URL = 'https:\/\/ims-backend.tmdi00.com';\n<\/script>\n\n\n\n<script>\n    if (!window.TELEMEDI_API_BASE_URL) {\n        document.addEventListener('DOMContentLoaded', function() {\n            document.getElementById('form__wrapper').style.display = 'none';\n            document.getElementById('unavailablePage').classList.add('show');\n        });\n    }\n<\/script>\n\n\n\n<noscript>\n    <div class=\"bg-red-600 text-white p-4 text-center font-bold mb-4\">\n        Uwaga! Ta strona wymaga w\u0142\u0105czonego JavaScript, aby dzia\u0142a\u0107 poprawnie. W\u0142\u0105cz obs\u0142ug\u0119 JavaScript w przegl\u0105darce i od\u015bwie\u017c stron\u0119.\n    <\/div>\n<\/noscript>\n\n<!-- Customowy modal dla komunikat\u00f3w -->\n<div id=\"customModal\" class=\"custom-modal\">\n    <div class=\"modal-content\">\n        <div class=\"modal-header\">\n            <div id=\"modalIcon\" class=\"modal-icon\"><\/div>\n            <h3 id=\"modalTitle\" class=\"modal-title\"><\/h3>\n        <\/div>\n        <div class=\"modal-body\">\n            <div id=\"modalMessage\" class=\"modal-message\"><\/div>\n        <\/div>\n        <div class=\"modal-footer\">\n            <button id=\"modalCloseBtn\" class=\"modal-close-btn\">Zamknij<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Modal potwierdzenia wys\u0142ania -->\n<div id=\"confirmModal\" class=\"custom-modal\">\n    <div class=\"modal-content\">\n        <div class=\"confirm-modal-body\">\n            <h3>Sprawd\u017a wniosek przed wys\u0142aniem<\/h3>\n            <p>Upewnij si\u0119, \u017ce wszystkie dane s\u0105 poprawne.<\/p>\n            <div class=\"confirm-modal-note confirm-modal-note--warn\">\n                <p class=\"confirm-note-title\">B\u0142\u0119dne dane wyd\u0142u\u017c\u0105 weryfikacj\u0119<\/p>\n                <p>Nieprawid\u0142owe lub niekompletne informacje (np. dane g\u0142\u00f3wnego ubezpieczonego, dane wsp\u00f3\u0142ubezpieczonego, adres, dane plac\u00f3wki, dane \u015bwiadczenia) mog\u0105 znacznie op\u00f3\u017ani\u0107 rozpatrzenie wniosku.<\/p>\n            <\/div>\n            <div class=\"confirm-modal-note confirm-modal-note--danger\">\n                <p class=\"confirm-note-title\">Nieprawid\u0142owy produkt<\/p>\n                <p>Z\u0142y wyb\u00f3r produktu obj\u0119tego refundacj\u0105 mo\u017ce wi\u0105za\u0107 si\u0119 z konieczno\u015bci\u0105 z\u0142o\u017cenia wniosku od nowa. Upewnij si\u0119, \u017ce wybrany produkt jest zgodny z prawd\u0105.<\/p>\n            <\/div>\n        <\/div>\n        <div class=\"confirm-modal-footer\">\n            <button type=\"button\" id=\"confirmBackBtn\" class=\"confirm-btn confirm-btn-back\">Wr\u00f3\u0107 i sprawd\u017a<\/button>\n            <button type=\"button\" id=\"confirmSubmitBtn\" class=\"confirm-btn confirm-btn-submit\">Tak, wysy\u0142am wniosek<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Modal potwierdzenia usuni\u0119cia \u015bwiadczenia -->\n<div id=\"deleteServiceModal\" class=\"custom-modal\">\n    <div class=\"modal-content\">\n        <div class=\"confirm-modal-body\">\n            <h3>Usun\u0105\u0107 to \u015bwiadczenie?<\/h3>\n            <p>Wszystkie dane wprowadzone w tym \u015bwiadczeniu (kategoria, daty, kwota, faktura) zostan\u0105 usuni\u0119te. Tej operacji nie mo\u017cna cofn\u0105\u0107.<\/p>\n        <\/div>\n        <div class=\"confirm-modal-footer\">\n            <button type=\"button\" id=\"deleteServiceCancelBtn\" class=\"confirm-btn confirm-btn-back\">Anuluj<\/button>\n            <button type=\"button\" id=\"deleteServiceConfirmBtn\" class=\"confirm-btn confirm-btn-danger\">Tak, usu\u0144<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Strona niedost\u0119pna (gdy brak konfiguracji API) -->\n<div id=\"unavailablePage\" class=\"unavailable-page\">\n    <div class=\"unavailable-card\">\n        <div class=\"unavailable-icon\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\" \/>\n            <\/svg>\n        <\/div>\n        <h1>Strona chwilowo niedost\u0119pna<\/h1>\n        <p>Formularz refundacji jest w tej chwili niedost\u0119pny. Przepraszamy za utrudnienia.<\/p>\n        <div class=\"unavailable-divider\"><\/div>\n        <p class=\"unavailable-hint\">Spr\u00f3buj ponownie za kilka minut.<\/p>\n    <\/div>\n<\/div>\n\n<div id=\"form__wrapper\" class=\"p-8 flex items-center justify-center min-h-screen\">\n    <form method=\"POST\" enctype=\"multipart\/form-data\" class=\"bg-white p-6 rounded-lg shadow-md w-full max-w-lg\">\n        <div class=\"flex justify-center mb-6\">\n            <img decoding=\"async\" src=\"https:\/\/telemedi.com\/wp-content\/themes\/telemedico-home-page\/src\/icons\/telemedi.svg\" \n                 alt=\"Telemedi Logo\" \n                 class=\"h-12\">\n        <\/div>\n        \n        <h2 class=\"text-2xl font-bold mb-4\">Wniosek o Refundacj\u0119<\/h2>\n        \n        <p class=\"text-gray-700 mb-6\">\n            Zwrot koszt\u00f3w dokonywany jest na podstawie faktur VAT lub rachunk\u00f3w wystawionych na osob\u0119 fizyczn\u0105 (osob\u0119 uprawnion\u0105 korzystaj\u0105c\u0105 ze \u015bwiadcze\u0144), wraz ze specyfikacj\u0105 wykonanych \u015bwiadcze\u0144 zawieraj\u0105c\u0105 nazw\u0119 us\u0142ugi, ilo\u015b\u0107 i cen\u0119 jednostkow\u0105 us\u0142ugi.\n            <br><br>\n            Nie dokonujemy zwrot\u00f3w na podstawie paragon\u00f3w fiskalnych.\n        <\/p>\n\n        <h3 class=\"font-semibold mb-2\">Dane osoby uprawnionej do Refundacji* &#8211; Osoba, kt\u00f3ra skorzysta\u0142a z us\u0142ug<\/h3>\n        <div class=\"mb-4\">\n            <label for=\"firstName\" class=\"block text-gray-700\">Imi\u0119 *<\/label>\n            <input type=\"text\" id=\"firstName\" name=\"firstName\" autocomplete=\"given-name\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"lastName\" class=\"block text-gray-700\">Nazwisko *<\/label>\n            <input type=\"text\" id=\"lastName\" name=\"lastName\" autocomplete=\"family-name\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"pesel\" class=\"block text-gray-700\">PESEL *<\/label>\n            <input type=\"text\" id=\"pesel\" name=\"pesel\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <p id=\"peselError\" class=\"text-red-500 text-sm mt-1 hidden\">Wprowadzony numer PESEL jest nieprawid\u0142owy.<\/p>\n            <p id=\"peselSameError\" class=\"text-red-500 text-sm mt-1 hidden\">PESEL osoby uprawnionej i g\u0142\u00f3wnego ubezpieczonego nie mog\u0105 by\u0107 identyczne dla opcji &#8222;Inna osoba&#8221;.<\/p>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"birthDate\" class=\"block text-gray-700\">Data urodzenia *<\/label>\n            <input type=\"date\" id=\"birthDate\" name=\"birthDate\" autocomplete=\"bday\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <p id=\"birthDateError\" class=\"text-red-500 text-sm mt-1 hidden\">Data urodzenia nie mo\u017ce by\u0107 z przysz\u0142o\u015bci.<\/p>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"contactNumber\" class=\"block text-gray-700\">Numer kontaktowy *<\/label>\n            <input type=\"tel\" id=\"contactNumber\" name=\"contactNumber\" autocomplete=\"tel\" class=\"block w-full border border-gray-300 rounded-md p-2\" value=\"+48\" required>\n            <p id=\"phoneError\" class=\"text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawny numer telefonu w formacie +48XXXXXXXXX.<\/p>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"email\" class=\"block text-gray-700\">Adres e-mail do korespondencji *<\/label>\n            <input type=\"email\" id=\"email\" name=\"email\" autocomplete=\"email\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        \n        <div class=\"mb-4\">\n            <label for=\"insuredPerson\" class=\"block text-gray-700\">Kogo dotyczy zg\u0142oszenie? *<\/label>\n            <select id=\"insuredPerson\" name=\"insuredPerson\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                <option value=\"G\u0142\u00f3wny ubezpieczony (posiadacz polisy)\">G\u0142\u00f3wny ubezpieczony (posiadacz polisy)<\/option>\n                <option value=\"Inna osoba\">Inna osoba<\/option>\n            <\/select>\n        <\/div>\n        <div id=\"relationshipDegreeContainer\" class=\"mb-4 hidden\">\n            <label for=\"relationshipDegree\" class=\"block text-gray-700\">Stopie\u0144 pokrewie\u0144stwa<\/label>\n            <input type=\"text\" id=\"relationshipDegree\" name=\"relationshipDegree\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\">\n        <\/div>\n\n        <div class=\"mb-4\">\n            <label for=\"insuredPesel\" class=\"block text-gray-700\">PESEL g\u0142\u00f3wnego ubezpieczonego *<\/label>\n            <input type=\"text\" id=\"insuredPesel\" name=\"insuredPesel\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <p id=\"insuredPeselError\" class=\"text-red-500 text-sm mt-1 hidden\">Wprowadzony numer PESEL jest nieprawid\u0142owy.<\/p>\n            <p id=\"insuredPeselSameError\" class=\"text-red-500 text-sm mt-1 hidden\">PESEL g\u0142\u00f3wnego ubezpieczonego i osoby uprawnionej nie mog\u0105 by\u0107 identyczne dla opcji &#8222;Inna osoba&#8221;.<\/p>\n        <\/div>\n\n        <h3 class=\"font-semibold mb-2\">Adres do korespondencji *<\/h3>\n        <div class=\"mb-4\">\n            <label for=\"street\" class=\"block text-gray-700\">Ulica *<\/label>\n            <input type=\"text\" id=\"street\" name=\"street\" autocomplete=\"street-address\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"houseNumber\" class=\"block text-gray-700\">Nr domu *<\/label>\n            <input type=\"text\" id=\"houseNumber\" name=\"houseNumber\" autocomplete=\"address-line2\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"postalCode\" class=\"block text-gray-700\">Kod pocztowy *<\/label>\n            <input type=\"text\" id=\"postalCode\" name=\"postalCode\" autocomplete=\"postal-code\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <p id=\"postalCodeError\" class=\"text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawny kod pocztowy w formacie 00-000.<\/p>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"city\" class=\"block text-gray-700\">Miejscowo\u015b\u0107 *<\/label>\n            <input type=\"text\" id=\"city\" name=\"city\" autocomplete=\"address-level2\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n\n        <h3 class=\"font-semibold mb-2\">Dane do wyp\u0142aty *<\/h3>\n        <div class=\"mb-4\">\n            <label for=\"bank\" class=\"block text-gray-700\">Bank\/Oddzia\u0142 *<\/label>\n            <input type=\"text\" id=\"bank\" name=\"bank\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"accountOwner\" class=\"block text-gray-700\">W\u0142a\u015bciciel konta *<\/label>\n            <input type=\"text\" id=\"accountOwner\" name=\"accountOwner\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n        <\/div>\n        <div class=\"mb-4\">\n            <label for=\"accountNumber\" class=\"block text-gray-700\">Nr rachunku *<\/label>\n            <input type=\"text\" id=\"accountNumber\" name=\"accountNumber\" autocomplete=\"off\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <p id=\"accountNumberError\" class=\"text-red-500 text-sm mt-1 hidden\">Wprowadzony numer konta jest nieprawid\u0142owy. Sprawd\u017a czy poda\u0142e\u015b poprawny numer IBAN.<\/p>\n        <\/div>\n\n        <h3 class=\"font-semibold mb-2\">Informacje o Ubezpieczeniu<\/h3>\n        <div class=\"mb-4\">\n            <label for=\"productType\" class=\"block text-gray-700\">Wybierz polis\u0119 z kt\u00f3rej ubiegasz si\u0119 o refundacj\u0119 *<\/label>\n            <select id=\"productType\" name=\"productType\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                <option value=\"\">Wybierz polis\u0119<\/option>\n                <option value=\"5\">Twoje \u017bycie \u2013 Assistance Medyczny (Allianz)<\/option>\n                <option value=\"6\">Opieka Medyczna (Ergo Hestia)<\/option>\n                <option value=\"7\">Assistance Medyczny (Generali)<\/option>\n                <option value=\"8\">Assistance (GSU)<\/option>\n                <option value=\"9\">Antidotum Plus (Interrisk)<\/option>\n                <option value=\"10\">Moje Zdrowie Plus (Nationale Nederlanden)<\/option>\n                <option value=\"11\">Plan na Zdrowie (PZU)<\/option>\n                <option value=\"12\">Pe\u0142nia Zdrowia (Signal Iduna)<\/option>\n                <option value=\"3\">Opieka24 (Uniqa)<\/option>\n                <option value=\"4\">Medipomoc (Uniqa)<\/option>\n                <option value=\"13\">Plan Medyczny, Pakiet Kleszcz, NNW szkolne, Mentalhealth (Uniqa)<\/option>\n                <option value=\"19\">Medycyna bez granic (Uniqa)<\/option>\n                <option value=\"14\">Pakiet Telezdrowie (Warta)<\/option>\n                <option value=\"15\">Pakiet Zdrowie i Pomoc, Pakiet Zdrowie i Ochrona (We4med)<\/option>\n                <option value=\"16\">Badania medycyny pracy<\/option>\n                <option value=\"17\">Profilaktyka, Badania Diagnostyczne, Konsultacje (Unum)<\/option>\n                <option value=\"18\">Direct Ubezpieczenia (UNEXT)<\/option>\n            <\/select>\n            <div class=\"mt-3 px-4 py-3 rounded-lg warning-box\">\n                <p class=\"text-sm warning-box-text\"><span class=\"font-bold\">Uwaga!<\/span> Wyb\u00f3r nieprawid\u0142owej polisy spowoduje odrzucenie wniosku o refundacj\u0119.<\/p>\n            <\/div>\n        <\/div>\n\n        <h3 class=\"font-semibold mb-2 hidden\" id=\"reasonSectionHeader\">Pow\u00f3d refundacji *<\/h3>\n        <div class=\"mb-4 hidden\" id=\"eventDateContainer\">\n            <label for=\"eventDate\" class=\"block text-gray-700\">Data pierwszej diagnozy choroby\/schorzenia, data urazu *<\/label>\n            <input type=\"date\" id=\"eventDate\" name=\"eventDate\" class=\"block w-full border border-gray-300 rounded-md p-2\" disabled>\n            <p id=\"eventDateError\" class=\"text-red-500 text-sm mt-1 hidden\">Data zdarzenia nie mo\u017ce by\u0107 z przysz\u0142o\u015bci.<\/p>\n        <\/div>\n        <div class=\"mb-4 hidden\" id=\"reasonContainer\">\n            <label for=\"reason\" class=\"block text-gray-700\">Co by\u0142o przyczyn\u0105 zdarzenia? *<\/label>\n            <select id=\"reason\" name=\"reason\" class=\"block w-full border border-gray-300 rounded-md p-2\" disabled>\n                <option value=\"Choroba\">Choroba<\/option>\n                <option value=\"Wypadek\">Wypadek<\/option>\n                <option value=\"Inne\">Inne<\/option>\n            <\/select>\n        <\/div>\n        <div class=\"mb-4 hidden\" id=\"descriptionContainer\">\n            <label for=\"description\" class=\"block text-gray-700\">Opis choroby\/wypadku *<\/label>\n            <textarea id=\"description\" name=\"description\" class=\"block w-full border border-gray-300 rounded-md p-2\" disabled><\/textarea>\n        <\/div>\n\n        <h3 class=\"font-semibold mb-2\">\u015awiadczenia zdrowotne oraz dowody poniesionych koszt\u00f3w *<\/h3>\n        <div id=\"servicesContainer\">\n            <div class=\"service-group\" data-service-index=\"0\">\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Nazwa \u015awiadczenia *<\/label>\n                    <select name=\"serviceName[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                        <option value=\"\">Wybierz kategori\u0119<\/option>\n                        <option value=\"Badania obrazowe\">Badania obrazowe<\/option>\n                        <option value=\"Us\u0142uga stacjonarna\">Us\u0142uga stacjonarna<\/option>\n                        <option value=\"Wizyta domowa\">Wizyta domowa<\/option>\n                        <option value=\"Rehabilitacje\">Rehabilitacje<\/option>\n                        <option value=\"Sprz\u0119t rehabilitacyjny\">Sprz\u0119t rehabilitacyjny<\/option>\n                        <option value=\"Transport\">Transport<\/option>\n                        <option value=\"Badania laboratoryjne\">Badania laboratoryjne<\/option>\n                        <option value=\"Us\u0142uga Assistance (np. korepetycje)\">Us\u0142uga Assistance (np. korepetycje)<\/option>\n                        <option value=\"Us\u0142uga stomatologiczna\">Us\u0142uga stomatologiczna<\/option>\n                        <option value=\"Badania medycyny pracy\">Badania medycyny pracy<\/option>\n                    <\/select>\n                    <div class=\"mt-3 px-4 py-3 rounded-lg warning-box\">\n                        <p class=\"text-sm warning-box-text\"><span class=\"font-bold\">Uwaga!<\/span> Wybranie z\u0142ego \u015bwiadczenia spowoduje odrzucenie wniosku refundacyjnego.<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"mb-4 flex justify-end\">\n                    <button type=\"button\" class=\"remove-service confirm-btn confirm-btn-back remove-service-btn remove-service-btn--hidden\">\n                        Usu\u0144 to \u015bwiadczenie\n                    <\/button>\n                <\/div>\n                <div class=\"mb-4 service hidden\">\n                    <label class=\"block text-gray-700\">Czy w ramach wizyty lekarskiej by\u0142y realizowane dodatkowe badania? *<\/label>\n                    <div class=\"flex gap-4\">\n                        <label class=\"flex items-center\">\n                            <input type=\"radio\" name=\"additionalTests_0\" value=\"tak\" class=\"mr-2 additional-tests-radio\">\n                            <span>Tak<\/span>\n                        <\/label>\n                        <label class=\"flex items-center\">\n                            <input type=\"radio\" name=\"additionalTests_0\" value=\"nie\" class=\"mr-2 additional-tests-radio\">\n                            <span>Nie<\/span>\n                        <\/label>\n                    <\/div>\n                <\/div>\n                <div class=\"mb-4 service additional-tests-details hidden\">\n                    <label class=\"block text-gray-700\">Jakie badania by\u0142y realizowane? *<\/label>\n                    <input type=\"text\" name=\"examName[]\" class=\"block w-full border border-gray-300 rounded-md p-2\">\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Data wykonania *<\/label>\n                    <input type=\"date\" name=\"serviceDate[]\" class=\"block w-full border border-gray-300 rounded-md p-2 service-date\" required>\n                    <p class=\"service-date-error text-red-500 text-sm mt-1 hidden\">Data wykonania nie mo\u017ce by\u0107 z przysz\u0142o\u015bci.<\/p>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Nazwa plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"servicePlace[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Adres plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"serviceAddress[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Kod pocztowy plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"servicePostalCode[]\" class=\"block w-full border border-gray-300 rounded-md p-2 servicePostalCode\" required>\n                    <p class=\"servicePostalCodeError text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawny kod pocztowy w formacie 00-000.<\/p>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Miejscowo\u015b\u0107 plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"serviceCity[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Kwota *<\/label>\n                    <input type=\"text\" name=\"amount[]\" class=\"block w-full border border-gray-300 rounded-md p-2 amount-input\" required>\n                    <p class=\"amount-error text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawn\u0105 kwot\u0119 (np. 123,45 lub 123.45).<\/p>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Nr faktury\/rachunku *<\/label>\n                    <input type=\"text\" name=\"invoiceNumber[]\" class=\"block w-full border border-gray-300 rounded-md p-2 invoice-number\" maxlength=\"50\" required>\n                    <p class=\"invoice-number-error text-red-500 text-sm mt-1 hidden\">Numer faktury\/rachunku nie mo\u017ce przekracza\u0107 50 znak\u00f3w.<\/p>\n                <\/div>\n                <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700 mb-1\">Za\u0142\u0105cz faktur\u0119\/rachunek *<\/label>\n                    <div class=\"file-upload-zone\" data-upload-for=\"invoiceFile0\">\n                        <input type=\"file\" name=\"invoiceFile0\" accept=\"image\/*,.pdf\" data-was-required=\"true\">\n                        <p class=\"text-sm text-gray-600\"><span class=\"file-upload-browse\">Wybierz plik<\/span> lub przeci\u0105gnij tutaj<\/p>\n                        <div class=\"file-upload-meta\">Zdj\u0119cia i PDF &middot; maks. 10 MB<\/div>\n                    <\/div>\n                    <div class=\"file-list\" data-list-for=\"invoiceFile0\"><\/div>\n                <\/div>\n                <hr class=\"my-4\">\n            <\/div>\n        <\/div>\n        <button type=\"button\" id=\"addService\" class=\"bg-green-500 text-white font-bold py-2 px-4 rounded-md hover:bg-green-600\">Dodaj kolejne \u015bwiadczenie<\/button>\n\n        <h3 class=\"font-semibold mb-2 mt-4 hidden\" id=\"attachmentsSectionHeader\">Za\u0142\u0105czniki *<\/h3>\n        <div class=\"mb-4 hidden\" id=\"attachmentsContainer\">\n            <label class=\"block text-gray-700 mb-1\">Dodaj dodatkowe za\u0142\u0105czniki (skierowanie, dokumentacja medyczna) *<\/label>\n            <div class=\"file-upload-zone\" data-upload-for=\"attachments\" data-multiple=\"true\">\n                <input type=\"file\" id=\"attachments\" name=\"attachments[]\" multiple accept=\"image\/*,.pdf\" data-was-required=\"true\" disabled>\n                <p class=\"text-sm text-gray-600\"><span class=\"file-upload-browse\">Wybierz pliki<\/span> lub przeci\u0105gnij tutaj<\/p>\n                <div class=\"file-upload-meta\">Zdj\u0119cia i PDF &middot; maks. 10 MB na plik &middot; mo\u017cna dodawa\u0107 wielokrotnie<\/div>\n            <\/div>\n            <div class=\"file-list\" data-list-for=\"attachments\"><\/div>\n        <\/div>\n\n        <hr class=\"my-6\">\n\n        <div class=\"mb-3\">\n            <label class=\"consent-checkbox\">\n                <input type=\"checkbox\" id=\"medicalConsent\" name=\"medicalConsent\" required>\n                <span class=\"consent-check\"><svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M2.5 7.5L5.5 10.5L11.5 3.5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span>\n                <span class=\"consent-text\">Upowa\u017cniam Telmedicin Sp. z o.o. do dost\u0119pu do dokumentacji medycznej oraz weryfikacji przedstawionej faktury z podmiotem kt\u00f3ry j\u0105 wystawi\u0142 w celu weryfikacji zasadno\u015bci realizacji wniosku o refundacj\u0119 *<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"mb-3\">\n            <label class=\"consent-checkbox\">\n                <input type=\"checkbox\" id=\"privacyPolicy\" name=\"privacyPolicy\" required>\n                <span class=\"consent-check\"><svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M2.5 7.5L5.5 10.5L11.5 3.5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span>\n                <span class=\"consent-text\">Je\u017celi prze\u015blesz do nas formularz, administratorem Twoich danych osobowych b\u0119dzie Telmedicin sp. z o.o. Twoje dane b\u0119dziemy przetwarza\u0107 w celu obs\u0142ugi zg\u0142oszenia (jako nasz prawnie uzasadniony interes). Szczeg\u00f3\u0142owe informacje o zasadach ochrony Twoich danych osobowych i przys\u0142uguj\u0105cych Ci prawach znajdziesz w naszej <a href=\"https:\/\/telemedi.com\/pl\/privacy-policy\/\" target=\"_blank\" rel=\"noopener\">Polityce Prywatno\u015bci<\/a>. *<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"mb-3\">\n            <label class=\"consent-checkbox\">\n                <input type=\"checkbox\" id=\"dataAccuracy\" name=\"dataAccuracy\" required>\n                <span class=\"consent-check\"><svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M2.5 7.5L5.5 10.5L11.5 3.5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span>\n                <span class=\"consent-text\">O\u015bwiadczam, \u017ce wszystkie dane zawarte w formularzu s\u0105 zgodne ze stanem faktycznym oraz jestem \u015bwiadomy\/\u015bwiadoma odpowiedzialno\u015bci za zeznanie nieprawdy lub zatajenie okoliczno\u015bci, mog\u0105cych mie\u0107 wp\u0142yw na proces likwidacyjny *<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"mb-4\">\n            <label class=\"consent-checkbox\">\n                <input type=\"checkbox\" id=\"communicationConsent\" name=\"communicationConsent\" required>\n                <span class=\"consent-check\"><svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M2.5 7.5L5.5 10.5L11.5 3.5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span>\n                <span class=\"consent-text\">O\u015bwiadczam, \u017ce wyra\u017cam zgod\u0119 na przekazywanie informacji dotycz\u0105cych umowy ubezpieczenia z wykorzystaniem \u015brodk\u00f3w porozumiewania si\u0119 na odleg\u0142o\u015b\u0107 na wskazany przeze mnie w formularzu adres email *<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"flex items-center justify-between mt-6\">\n            <button type=\"submit\" id=\"submitButton\" class=\"bg-green-500 text-white font-bold py-2 px-4 rounded-md hover:bg-green-600 flex items-center gap-2\">\n                <span>Wy\u015blij wniosek<\/span>\n                <span id=\"loader\" class=\"spinner-border\"><\/span>\n            <\/button>\n        <\/div>\n    <\/form>\n<\/div>\n\n\n\n\n<script data-cookieconsent=\"ignore\">\n    const REFUND_API_ENDPOINT = '\/api\/refund\/issue\/create';\n\n    \/\/ Funkcje do obs\u0142ugi customowego modala\n    function showModal(type, title, message) {\n        \/\/ Sprawd\u017a czy parametry nie s\u0105 puste\n        if (!title && !message) {\n            console.error('showModal: brak tytu\u0142u i wiadomo\u015bci');\n            return;\n        }\n        \n        const modal = document.getElementById('customModal');\n        const modalIcon = document.getElementById('modalIcon');\n        const modalTitle = document.getElementById('modalTitle');\n        const modalMessage = document.getElementById('modalMessage');\n        \n        \/\/ Ustawienie ikony i klasy w zale\u017cno\u015bci od typu\n        if (type === 'error') {\n            modalIcon.innerHTML = '\u274c';\n            modalIcon.className = 'modal-icon error';\n        } else if (type === 'success') {\n            modalIcon.innerHTML = '\u2705';\n            modalIcon.className = 'modal-icon success';\n        } else if (type === 'warning') {\n            modalIcon.innerHTML = '\u26a0\ufe0f';\n            modalIcon.className = 'modal-icon error';\n        } else {\n            modalIcon.innerHTML = '\u2139\ufe0f';\n            modalIcon.className = 'modal-icon';\n        }\n        \n        modalTitle.textContent = title || 'Powiadomienie';\n        modalMessage.textContent = message || '';\n        \n        \/\/ Pokazanie modala\n        modal.classList.add('show');\n        \n        \/\/ Zapobieganie przewijaniu strony w tle\n        document.body.style.overflow = 'hidden';\n        \n        \/\/ Fokus na przycisku zamkni\u0119cia dla dost\u0119pno\u015bci\n        setTimeout(() => {\n            document.getElementById('modalCloseBtn').focus();\n        }, 100);\n    }\n    \n    function hideModal() {\n        const modal = document.getElementById('customModal');\n        modal.classList.remove('show');\n        \n        \/\/ Przywr\u00f3\u0107 przewijanie strony\n        document.body.style.overflow = '';\n    }\n    \n    \/\/ Event listeners dla zamykania modala\n    document.getElementById('modalCloseBtn').addEventListener('click', hideModal);\n    \n    \/\/ Zamkni\u0119cie modala klawiszem Enter na przycisku\n    document.getElementById('modalCloseBtn').addEventListener('keydown', function(e) {\n        if (e.key === 'Enter') {\n            hideModal();\n        }\n    });\n    \n    \/\/ Zamkni\u0119cie modala przy klikni\u0119ciu w t\u0142o\n    document.getElementById('customModal').addEventListener('click', function(e) {\n        if (e.target === this) {\n            hideModal();\n        }\n    });\n    \n    \/\/ Zamkni\u0119cie modala klawiszem Escape\n    document.addEventListener('keydown', function(e) {\n        if (e.key === 'Escape') {\n            const modal = document.getElementById('customModal');\n            if (modal.classList.contains('show')) {\n                hideModal();\n            }\n        }\n    });\n\n    document.getElementById('addService').addEventListener('click', function() {\n        const servicesContainer = document.getElementById('servicesContainer');\n        const serviceCount = document.querySelectorAll('.service-group').length;\n        const newService = document.createElement('div');\n        newService.classList.add('service-group');\n        newService.setAttribute('data-service-index', serviceCount);\n        newService.innerHTML = `\n            <div class=\"mb-4 service\">\n                <label class=\"block text-gray-700\">Nazwa \u015awiadczenia *<\/label>\n                <select name=\"serviceName[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n                    <option value=\"\">Wybierz kategori\u0119<\/option>\n                    <option value=\"Badania obrazowe\">Badania obrazowe<\/option>\n                    <option value=\"Us\u0142uga stacjonarna\">Us\u0142uga stacjonarna<\/option>\n                    <option value=\"Wizyta domowa\">Wizyta domowa<\/option>\n                    <option value=\"Rehabilitacje\">Rehabilitacje<\/option>\n                    <option value=\"Sprz\u0119t rehabilitacyjny\">Sprz\u0119t rehabilitacyjny<\/option>\n                    <option value=\"Transport\">Transport<\/option>\n                    <option value=\"Badania laboratoryjne\">Badania laboratoryjne<\/option>\n                    <option value=\"Us\u0142uga Assistance (np. korepetycje)\">Us\u0142uga Assistance (np. korepetycje)<\/option>\n                    <option value=\"Us\u0142uga stomatologiczna\">Us\u0142uga stomatologiczna<\/option>\n                    <option value=\"Badania medycyny pracy\">Badania medycyny pracy<\/option>\n                <\/select>\n                <div class=\"mt-3 px-4 py-3 rounded-lg warning-box\">\n                    <p class=\"text-sm warning-box-text\"><span class=\"font-bold\">Uwaga!<\/span> Wybranie z\u0142ego \u015bwiadczenia spowoduje odrzucenie wniosku refundacyjnego.<\/p>\n                <\/div>\n            <\/div>\n            <div class=\"mb-4 flex justify-end\">\n                <button type=\"button\" class=\"remove-service confirm-btn confirm-btn-back remove-service-btn\">\n                    Usu\u0144 to \u015bwiadczenie\n                <\/button>\n            <\/div>\n            <div class=\"mb-4 service hidden\">\n                <label class=\"block text-gray-700\">Czy w ramach wizyty lekarskiej by\u0142y realizowane dodatkowe badania? *<\/label>\n                <div class=\"flex gap-4\">\n                    <label class=\"flex items-center\">\n                        <input type=\"radio\" name=\"additionalTests_${serviceCount}\" value=\"tak\" class=\"mr-2 additional-tests-radio\">\n                        <span>Tak<\/span>\n                    <\/label>\n                    <label class=\"flex items-center\">\n                        <input type=\"radio\" name=\"additionalTests_${serviceCount}\" value=\"nie\" class=\"mr-2 additional-tests-radio\">\n                        <span>Nie<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n            <div class=\"mb-4 service additional-tests-details hidden\">\n                <label class=\"block text-gray-700\">Jakie badania by\u0142y realizowane? *<\/label>\n                <input type=\"text\" name=\"examName[]\" class=\"block w-full border border-gray-300 rounded-md p-2\">\n            <\/div>\n            <div class=\"mb-4 service\">\n                <label class=\"block text-gray-700\">Data wykonania *<\/label>\n                <input type=\"date\" name=\"serviceDate[]\" class=\"block w-full border border-gray-300 rounded-md p-2 service-date\" required>\n                <p class=\"service-date-error text-red-500 text-sm mt-1 hidden\">Data wykonania nie mo\u017ce by\u0107 z przysz\u0142o\u015bci.<\/p>\n            <\/div>\n            <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Nazwa plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"servicePlace[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <\/div>\n            <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Adres plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"serviceAddress[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <\/div>\n            <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Kod pocztowy plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"servicePostalCode[]\" class=\"block w-full border border-gray-300 rounded-md p-2 servicePostalCode\" required>\n                    <p class=\"servicePostalCodeError text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawny kod pocztowy w formacie 00-000.<\/p>\n            <\/div>\n            <div class=\"mb-4 service\">\n                    <label class=\"block text-gray-700\">Miejscowo\u015b\u0107 plac\u00f3wki w kt\u00f3rej by\u0142a realizowana us\u0142uga *<\/label>\n                    <input type=\"text\" name=\"serviceCity[]\" class=\"block w-full border border-gray-300 rounded-md p-2\" required>\n            <\/div>\n            <div class=\"mb-4 service\">\n                <label class=\"block text-gray-700\">Kwota *<\/label>\n                <input type=\"text\" name=\"amount[]\" class=\"block w-full border border-gray-300 rounded-md p-2 amount-input\" required>\n                <p class=\"amount-error text-red-500 text-sm mt-1 hidden\">Wprowad\u017a poprawn\u0105 kwot\u0119 (np. 123,45 lub 123.45).<\/p>\n            <\/div>\n            <div class=\"mb-4 service\">\n                <label class=\"block text-gray-700\">Nr faktury\/rachunku *<\/label>\n                <input type=\"text\" name=\"invoiceNumber[]\" class=\"block w-full border border-gray-300 rounded-md p-2 invoice-number\" maxlength=\"50\" required>\n                <p class=\"invoice-number-error text-red-500 text-sm mt-1 hidden\">Numer faktury\/rachunku nie mo\u017ce przekracza\u0107 50 znak\u00f3w.<\/p>\n            <\/div>\n            <div class=\"mb-4 service\">\n                <label class=\"block text-gray-700 mb-1\">Za\u0142\u0105cz faktur\u0119\/rachunek *<\/label>\n                <div class=\"file-upload-zone\" data-upload-for=\"invoiceFile${serviceCount}\">\n                    <input type=\"file\" name=\"invoiceFile${serviceCount}\" accept=\"image\/*,.pdf\" data-was-required=\"true\">\n                    <p class=\"text-sm text-gray-600\"><span class=\"file-upload-browse\">Wybierz plik<\/span> lub przeci\u0105gnij tutaj<\/p>\n                    <div class=\"file-upload-meta\">Zdj\u0119cia i PDF &middot; maks. 10 MB<\/div>\n                <\/div>\n                <div class=\"file-list\" data-list-for=\"invoiceFile${serviceCount}\"><\/div>\n            <\/div>\n            <hr class=\"my-4\">\n        `;\n        servicesContainer.appendChild(newService);\n        \n        \/\/ Aktualizuj numeracj\u0119 po dodaniu\n        updateServiceNumbers();\n        \/\/ Aktualizuj widoczno\u015b\u0107 przycisk\u00f3w usuwania\n        updateRemoveButtonsVisibility();\n    });\n\n    \/\/ Funkcja do usuwania \u015bwiadcze\u0144\n    let pendingDeleteServiceGroup = null;\n\n    document.addEventListener('click', function(e) {\n        if (e.target.classList.contains('remove-service')) {\n            pendingDeleteServiceGroup = e.target.closest('.service-group');\n            const modal = document.getElementById('deleteServiceModal');\n            modal.classList.add('show');\n            document.body.style.overflow = 'hidden';\n        }\n    });\n\n    document.getElementById('deleteServiceCancelBtn').addEventListener('click', function() {\n        pendingDeleteServiceGroup = null;\n        const modal = document.getElementById('deleteServiceModal');\n        modal.classList.remove('show');\n        document.body.style.overflow = '';\n    });\n\n    document.getElementById('deleteServiceModal').addEventListener('click', function(e) {\n        if (e.target === this) {\n            pendingDeleteServiceGroup = null;\n            this.classList.remove('show');\n            document.body.style.overflow = '';\n        }\n    });\n\n    document.getElementById('deleteServiceConfirmBtn').addEventListener('click', function() {\n        const modal = document.getElementById('deleteServiceModal');\n        modal.classList.remove('show');\n        document.body.style.overflow = '';\n\n        if (pendingDeleteServiceGroup) {\n            \/\/ Usu\u0144 plik ze store'a przed usuni\u0119ciem elementu DOM\n            const zone = pendingDeleteServiceGroup.querySelector('.file-upload-zone');\n            if (zone) {\n                const oldKey = zone.dataset.uploadFor;\n                delete fileStores[oldKey];\n            }\n\n            pendingDeleteServiceGroup.remove();\n            pendingDeleteServiceGroup = null;\n            updateServiceNumbers();\n            updateFileInputNames();\n            updateRemoveButtonsVisibility();\n\n            \/\/ Od\u015bwie\u017c funkcje walidacji po usuni\u0119ciu\n            setTimeout(function() {\n                setupServicePostalCodeValidation();\n                setupAmountValidation();\n                setupInvoiceNumberValidation();\n                setupServiceDateValidation();\n            }, 100);\n        }\n    });\n\n    \/\/ Funkcja do aktualizacji numeracji \u015bwiadcze\u0144\n    function updateServiceNumbers() {\n        const serviceGroups = document.querySelectorAll('.service-group');\n        serviceGroups.forEach((group, index) => {\n            \/\/ Aktualizuj data-service-index\n            group.setAttribute('data-service-index', index);\n            \n            \/\/ Aktualizuj nazwy radio button\u00f3w dla dodatowych bada\u0144\n            const radioButtons = group.querySelectorAll('.additional-tests-radio');\n            radioButtons.forEach(radio => {\n                const oldName = radio.name;\n                radio.name = `additionalTests_${index}`;\n            });\n        });\n    }\n\n    \/\/ Funkcja do aktualizacji nazw plik\u00f3w po usuni\u0119ciu \u015bwiadczenia\n    function updateFileInputNames() {\n        \/\/ Zbierz stare store'y i przeindeksuj\n        const newStores = {};\n        const serviceGroups = document.querySelectorAll('.service-group');\n        serviceGroups.forEach((group, index) => {\n            const zone = group.querySelector('.file-upload-zone');\n            const fileInput = group.querySelector('input[type=\"file\"]');\n            const fileList = group.querySelector('.file-list');\n            if (zone && fileInput) {\n                const oldKey = zone.dataset.uploadFor;\n                const newKey = `invoiceFile${index}`;\n\n                \/\/ Przenie\u015b pliki ze starego klucza do nowego\n                if (fileStores[oldKey] && oldKey !== newKey) {\n                    newStores[newKey] = fileStores[oldKey];\n                    delete fileStores[oldKey];\n                } else if (fileStores[newKey]) {\n                    newStores[newKey] = fileStores[newKey];\n                } else if (fileStores[oldKey]) {\n                    newStores[newKey] = fileStores[oldKey];\n                }\n\n                zone.dataset.uploadFor = newKey;\n                fileInput.name = newKey;\n                if (fileList) {\n                    fileList.dataset.listFor = newKey;\n                }\n            }\n        });\n\n        \/\/ Zastosuj przeindeksowane store'y\n        Object.keys(newStores).forEach(key => {\n            fileStores[key] = newStores[key];\n        });\n\n        \/\/ Rerenderuj listy plik\u00f3w\n        serviceGroups.forEach((group, index) => {\n            renderFileList(`invoiceFile${index}`);\n        });\n    }\n\n    \/\/ Funkcja do kontrolowania widoczno\u015bci przycisk\u00f3w usuwania\n    function updateRemoveButtonsVisibility() {\n        const serviceGroups = document.querySelectorAll('.service-group');\n        const removeButtons = document.querySelectorAll('.remove-service');\n        \n        \/\/ Poka\u017c przyciski usuwania tylko gdy jest wi\u0119cej ni\u017c jedno \u015bwiadczenie\n        removeButtons.forEach(button => {\n            if (serviceGroups.length > 1) {\n                button.classList.remove('remove-service-btn--hidden');\n            } else {\n                button.classList.add('remove-service-btn--hidden');\n            }\n        });\n    }\n\n    document.getElementById('insuredPerson').addEventListener('change', function() {\n        const relationshipDegreeContainer = document.getElementById('relationshipDegreeContainer');\n        const insuredPeselInput = document.getElementById('insuredPesel');\n        const peselInput = document.getElementById('pesel');\n        const peselSameError = document.getElementById('peselSameError');\n        const insuredPeselSameError = document.getElementById('insuredPeselSameError');\n        \n        if (this.value === 'Inna osoba') {\n            relationshipDegreeContainer.classList.remove('hidden');\n            insuredPeselInput.value = '';\n            insuredPeselInput.readOnly = false;\n            insuredPeselInput.classList.remove('bg-gray-100');\n        } else {\n            \/\/ G\u0142\u00f3wny ubezpieczony - kopiujemy PESEL z pola PESEL i blokujemy edycj\u0119\n            relationshipDegreeContainer.classList.add('hidden');\n            insuredPeselInput.value = peselInput.value;\n            insuredPeselInput.readOnly = true;\n            insuredPeselInput.classList.add('bg-gray-100');\n            \n            \/\/ Ukryj komunikaty b\u0142\u0119d\u00f3w o identycznych PESEL-ach\n            peselSameError.classList.add('hidden');\n            insuredPeselSameError.classList.add('hidden');\n            \n            \/\/ Usu\u0144 podkre\u015blenia b\u0142\u0119d\u00f3w je\u015bli by\u0142y zwi\u0105zane tylko z identycznymi PESEL-ami\n            if (validatePESEL(peselInput.value)) {\n                peselInput.classList.remove('border-red-500');\n            }\n            if (validatePESEL(insuredPeselInput.value)) {\n                insuredPeselInput.classList.remove('border-red-500');\n            }\n        }\n    });\n\n    \/\/ Modyfikujemy event listenery dla p\u00f3l PESEL\n    document.getElementById('pesel').addEventListener('input', function(e) {\n        \/\/ Pozostaw tylko cyfry\n        let value = e.target.value.replace(\/[^0-9]\/g, '');\n        \n        \/\/ Ogranicz d\u0142ugo\u015b\u0107 do 11 cyfr\n        value = value.substring(0, 11);\n        \n        \/\/ Zaktualizuj warto\u015b\u0107 pola\n        e.target.value = value;\n        \n        \/\/ Je\u015bli wybrana opcja to g\u0142\u00f3wny ubezpieczony, aktualizujemy r\u00f3wnie\u017c pole insuredPesel\n        const insuredPerson = document.getElementById('insuredPerson');\n        if (insuredPerson.value === 'G\u0142\u00f3wny ubezpieczony (posiadacz polisy)') {\n            document.getElementById('insuredPesel').value = value;\n        }\n    });\n\n    document.getElementById('pesel').addEventListener('blur', function() {\n        const pesel = this.value;\n        const errorElement = document.getElementById('peselError');\n        const sameErrorElement = document.getElementById('peselSameError');\n        \n        let hasError = false;\n        \n        \/\/ Sprawd\u017a poprawno\u015b\u0107 PESEL\n        if (!validatePESEL(pesel)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n            hasError = true;\n        } else {\n            errorElement.classList.add('hidden');\n        }\n        \n        \/\/ Sprawd\u017a czy PESEL-e nie s\u0105 identyczne\n        if (!validatePESELUnique()) {\n            sameErrorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n            hasError = true;\n        } else {\n            sameErrorElement.classList.add('hidden');\n        }\n        \n        if (!hasError) {\n            this.classList.remove('border-red-500');\n        }\n    });\n\n    document.getElementById('insuredPesel').addEventListener('input', function(e) {\n        \/\/ Pozostaw tylko cyfry\n        let value = e.target.value.replace(\/[^0-9]\/g, '');\n        \n        \/\/ Ogranicz d\u0142ugo\u015b\u0107 do 11 cyfr\n        value = value.substring(0, 11);\n        \n        \/\/ Zaktualizuj warto\u015b\u0107 pola\n        e.target.value = value;\n    });\n\n    document.getElementById('insuredPesel').addEventListener('blur', function() {\n        const pesel = this.value;\n        const errorElement = document.getElementById('insuredPeselError');\n        const sameErrorElement = document.getElementById('insuredPeselSameError');\n        \n        let hasError = false;\n        \n        \/\/ Sprawd\u017a poprawno\u015b\u0107 PESEL\n        if (!validatePESEL(pesel)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n            hasError = true;\n        } else {\n            errorElement.classList.add('hidden');\n        }\n        \n        \/\/ Sprawd\u017a czy PESEL-e nie s\u0105 identyczne\n        if (!validatePESELUnique()) {\n            sameErrorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n            hasError = true;\n        } else {\n            sameErrorElement.classList.add('hidden');\n        }\n        \n        if (!hasError) {\n            this.classList.remove('border-red-500');\n        }\n    });\n\n\n    \/\/ Obs\u0142uga wyboru produktu - pokazywanie p\u00f3l tylko dla produkt\u00f3w 3 i 4\n    document.getElementById('productType').addEventListener('change', function() {\n        const showFields = this.value === '3' || this.value === '4';\n\n        const eventDateInput = document.getElementById('eventDate');\n        const reasonSelect = document.getElementById('reason');\n        const descriptionTextarea = document.getElementById('description');\n        const attachmentsInput = document.getElementById('attachments');\n\n        const containers = [\n            document.getElementById('eventDateContainer'),\n            document.getElementById('reasonContainer'),\n            document.getElementById('descriptionContainer'),\n            document.getElementById('attachmentsContainer')\n        ];\n        const headers = [\n            document.getElementById('reasonSectionHeader'),\n            document.getElementById('attachmentsSectionHeader')\n        ];\n        const fields = [eventDateInput, reasonSelect, descriptionTextarea, attachmentsInput];\n\n        if (showFields) {\n            containers.forEach(c => c.classList.remove('hidden'));\n            headers.forEach(h => h.classList.remove('hidden'));\n            fields.forEach(f => f.disabled = false);\n            eventDateInput.required = true;\n            reasonSelect.required = true;\n            descriptionTextarea.required = true;\n            \/\/ attachments file validation handled by JS file store check\n        } else {\n            containers.forEach(c => c.classList.add('hidden'));\n            headers.forEach(h => h.classList.add('hidden'));\n            fields.forEach(f => {\n                f.required = false;\n                f.disabled = true;\n                if (f.type === 'file') {\n                    f.value = '';\n                } else {\n                    f.value = '';\n                }\n            });\n        }\n    });\n\n    \/\/ Inicjalizacja stanu pola PESEL g\u0142\u00f3wnego ubezpieczonego przy za\u0142adowaniu strony\n    document.addEventListener('DOMContentLoaded', function() {\n        \/\/ Symulujemy zmian\u0119, \u017ceby zainicjalizowa\u0107 stan pola\n        const insuredPerson = document.getElementById('insuredPerson');\n        \/\/ Wywo\u0142ujemy r\u0119cznie zdarzenie change\n        const event = new Event('change');\n        insuredPerson.dispatchEvent(event);\n    });\n\n    const form = document.querySelector('form');\n    const submitButton = document.getElementById('submitButton');\n    \n    form.addEventListener('submit', function(event) {\n        let hasMissingFiles = false;\n        let hasValidationErrors = false;\n\n        \/\/ Sprawd\u017a czy wymagane uploady maj\u0105 pliki\n        document.querySelectorAll('.file-upload-zone').forEach(zone => {\n            const storeKey = zone.dataset.uploadFor;\n            const input = zone.querySelector('input[type=\"file\"]');\n            const files = fileStores[storeKey] || [];\n            const isRequired = input && (input.dataset.wasRequired === 'true' || input.hasAttribute('required'));\n\n            \/\/ Sprawd\u017a czy pole jest widoczne (nie ukryte przez warunki)\n            const container = zone.closest('.hidden');\n            if (container) return;\n\n            if (isRequired && files.length === 0) {\n                hasMissingFiles = true;\n                zone.style.borderColor = '#ef4444';\n            } else {\n                zone.style.borderColor = '';\n            }\n        });\n\n        if (hasMissingFiles) {\n            event.preventDefault();\n            showModal('error', 'Brak wymaganych plik\u00f3w', 'Dodaj wymagane pliki (faktury\/rachunki, za\u0142\u0105czniki) przed wys\u0142aniem formularza.');\n            submitButton.disabled = false;\n            submitButton.classList.remove('opacity-50', 'cursor-not-allowed');\n            return false;\n        }\n\n        \/\/ Dodatkowa walidacja numeru telefonu\n        const phoneInput = document.getElementById('contactNumber');\n        const phoneError = document.getElementById('phoneError');\n        if (!\/^\\+48\\d{9}$\/.test(phoneInput.value)) {\n            phoneError.classList.remove('hidden');\n            phoneInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n            phoneInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        }\n        \n        \/\/ Dodatkowa walidacja PESEL\n        const peselInput = document.getElementById('pesel');\n        const peselError = document.getElementById('peselError');\n        if (!validatePESEL(peselInput.value)) {\n            peselError.classList.remove('hidden');\n            peselInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n            if (!phoneError.classList.contains('hidden')) {\n                peselInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\n            }\n        }\n        \n        \/\/ Dodatkowa walidacja PESEL g\u0142\u00f3wnego ubezpieczonego\n        const insuredPeselInput = document.getElementById('insuredPesel');\n        const insuredPeselError = document.getElementById('insuredPeselError');\n        const insuredPeselSameError = document.getElementById('insuredPeselSameError');\n        if (!validatePESEL(insuredPeselInput.value)) {\n            insuredPeselError.classList.remove('hidden');\n            insuredPeselInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n            \/\/> this comment is used to circumvent the https:\/\/core.trac.wordpress.org\/ticket\/43785 bug\n            if (phoneError.classList.contains('hidden') && peselError.classList.contains('hidden')) {\n                insuredPeselInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\n            }\n        }\n        \n        \/\/ Dodatkowa walidacja czy PESEL-e nie s\u0105 identyczne\n        const peselSameError = document.getElementById('peselSameError');\n        if (!validatePESELUnique()) {\n            peselSameError.classList.remove('hidden');\n            insuredPeselSameError.classList.remove('hidden');\n            peselInput.classList.add('border-red-500');\n            insuredPeselInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n            if (phoneError.classList.contains('hidden') && peselError.classList.contains('hidden') && insuredPeselError.classList.contains('hidden')) {\n                peselInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\n            }\n        }\n        \n        \/\/ Dodatkowa walidacja daty urodzenia\n        const birthDateInput = document.getElementById('birthDate');\n        const birthDateError = document.getElementById('birthDateError');\n        if (!validateDateNotFromFuture(birthDateInput.value)) {\n            birthDateError.classList.remove('hidden');\n            birthDateInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n        }\n        \n        \/\/ Dodatkowa walidacja daty zdarzenia\n        const eventDateInput = document.getElementById('eventDate');\n        const eventDateError = document.getElementById('eventDateError');\n        if (!validateDateNotFromFuture(eventDateInput.value)) {\n            eventDateError.classList.remove('hidden');\n            eventDateInput.classList.add('border-red-500');\n            hasValidationErrors = true;\n        }\n        \n        \/\/ Dodatkowa walidacja dat wykonania \u015bwiadcze\u0144\n        const serviceDateInputs = document.querySelectorAll('.service-date');\n        let hasServiceDateError = false;\n        serviceDateInputs.forEach(input => {\n            if (!validateDateNotFromFuture(input.value)) {\n                const errorElement = input.parentElement.querySelector('.service-date-error');\n                errorElement.classList.remove('hidden');\n                input.classList.add('border-red-500');\n                hasValidationErrors = true;\n                hasServiceDateError = true;\n            }\n        });\n        \n        \/\/ Dodatkowa walidacja numer\u00f3w faktur\/rachunk\u00f3w\n        const invoiceNumberInputs = document.querySelectorAll('.invoice-number');\n        let hasInvoiceNumberError = false;\n        invoiceNumberInputs.forEach(input => {\n            if (input.value.length > 50) {\n                const errorElement = input.nextElementSibling;\n                errorElement.classList.remove('hidden');\n                input.classList.add('border-red-500');\n                hasValidationErrors = true;\n                hasInvoiceNumberError = true;\n                if (!hasInvoiceNumberError && phoneError.classList.contains('hidden') && peselError.classList.contains('hidden') && insuredPeselError.classList.contains('hidden')) {\n                    input.scrollIntoView({ behavior: 'smooth', block: 'center' });\n                }\n            }\n        });\n        \n        \/\/ Walidacja checkbox\u00f3w zg\u00f3d\n        let hasUncheckedConsent = false;\n        let firstUncheckedConsent = null;\n        const consentCheckboxes = document.querySelectorAll('.consent-checkbox input[type=\"checkbox\"][required]');\n        consentCheckboxes.forEach(checkbox => {\n            const label = checkbox.closest('.consent-checkbox');\n            if (!checkbox.checked) {\n                label.classList.add('consent-error');\n                hasValidationErrors = true;\n                hasUncheckedConsent = true;\n                if (!firstUncheckedConsent) {\n                    firstUncheckedConsent = label;\n                }\n            } else {\n                label.classList.remove('consent-error');\n            }\n        });\n\n        \/\/ Scroll do pierwszego niezaznaczonego checkboxa je\u015bli to jedyny b\u0142\u0105d\n        if (hasUncheckedConsent && firstUncheckedConsent) {\n            firstUncheckedConsent.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        }\n\n        \/\/ Je\u015bli s\u0105 b\u0142\u0119dy walidacji, nie wysy\u0142aj formularza\n        if (hasValidationErrors) {\n            event.preventDefault();\n            let errorMessage = 'Formularz zawiera b\u0142\u0119dy w nast\u0119puj\u0105cych polach:';\n            \n            if (!phoneError.classList.contains('hidden')) {\n                errorMessage += '\\n- Numer kontaktowy (wymagany format: +48XXXXXXXXX)';\n            }\n            \n            if (!peselError.classList.contains('hidden')) {\n                errorMessage += '\\n- PESEL (nieprawid\u0142owy numer PESEL)';\n            }\n            \n            if (!insuredPeselError.classList.contains('hidden')) {\n                errorMessage += '\\n- PESEL g\u0142\u00f3wnego ubezpieczonego (nieprawid\u0142owy numer PESEL)';\n            }\n            \n            if (!peselSameError.classList.contains('hidden')) {\n                errorMessage += '\\n- PESEL osoby uprawnionej i g\u0142\u00f3wnego ubezpieczonego nie mog\u0105 by\u0107 identyczne dla opcji \"Inna osoba\"';\n            }\n            \n            if (!birthDateError.classList.contains('hidden')) {\n                errorMessage += '\\n- Data urodzenia nie mo\u017ce by\u0107 z przysz\u0142o\u015bci';\n            }\n            \n            if (!eventDateError.classList.contains('hidden')) {\n                errorMessage += '\\n- Data zdarzenia nie mo\u017ce by\u0107 z przysz\u0142o\u015bci';\n            }\n            \n            if (hasServiceDateError) {\n                errorMessage += '\\n- Data wykonania \u015bwiadczenia nie mo\u017ce by\u0107 z przysz\u0142o\u015bci';\n            }\n            \n            \/\/ Dodajemy informacj\u0119 o b\u0142\u0119dzie w numerze faktury\n            const invoiceErrors = document.querySelectorAll('.invoice-number-error:not(.hidden)');\n            if (invoiceErrors.length > 0) {\n                errorMessage += '\\n- Numer faktury\/rachunku (przekroczono limit 50 znak\u00f3w)';\n            }\n            \n            if (hasUncheckedConsent) {\n                errorMessage += '\\n- Wymagane zgody nie zosta\u0142y zaznaczone';\n            }\n\n            errorMessage += '\\n\\nPopraw zaznaczone pola przed wys\u0142aniem.';\n            \n            showModal('error', 'B\u0142\u0119dy w formularzu', errorMessage);\n            submitButton.disabled = false;\n            submitButton.classList.remove('opacity-50', 'cursor-not-allowed');\n            return false;\n        }\n        \n        event.preventDefault();\n\n        \/\/ Poka\u017c modal potwierdzenia\n        const confirmModal = document.getElementById('confirmModal');\n        confirmModal.classList.add('show');\n        document.body.style.overflow = 'hidden';\n    });\n\n    \/\/ Obs\u0142uga przycisk\u00f3w modala potwierdzenia\n    document.getElementById('confirmBackBtn').addEventListener('click', function() {\n        const confirmModal = document.getElementById('confirmModal');\n        confirmModal.classList.remove('show');\n        document.body.style.overflow = '';\n    });\n\n    document.getElementById('confirmModal').addEventListener('click', function(e) {\n        if (e.target === this) {\n            this.classList.remove('show');\n            document.body.style.overflow = '';\n        }\n    });\n\n    document.getElementById('confirmSubmitBtn').addEventListener('click', function() {\n        const confirmModal = document.getElementById('confirmModal');\n        confirmModal.classList.remove('show');\n        document.body.style.overflow = '';\n\n        \/\/ Wy\u0142\u0105cz przycisk i zmie\u0144 jego wygl\u0105d\n        submitButton.disabled = true;\n        submitButton.classList.add('opacity-50', 'cursor-not-allowed');\n\n        const loader = document.getElementById('loader');\n        loader.classList.add('show');\n\n        const formData = new FormData(form);\n\n        \/\/ Dodaj pliki ze store'\u00f3w do FormData\n        appendStoredFilesToFormData(formData);\n\n        \/\/ Zbierz wszystkie warto\u015bci additionalTests\n        const additionalTests = [];\n        document.querySelectorAll('.service-group').forEach((group, index) => {\n            const value = formData.get(`additionalTests_${index}`);\n            if (value) {\n                additionalTests.push(value);\n                formData.delete(`additionalTests_${index}`);\n            }\n        });\n\n        \/\/ Dodaj zebrane warto\u015bci jako tablic\u0119\n        additionalTests.forEach(value => {\n            formData.append('additionalTests[]', value);\n        });\n\n        const baseUrl = window.TELEMEDI_API_BASE_URL.replace(\/\\\/+$\/, '');\n        const originalEndpoint = baseUrl + REFUND_API_ENDPOINT;\n\n        \/\/ Wysy\u0142anie formularza - jedna pr\u00f3ba\n        const sendForm = async () => {\n            try {\n                \/\/ Kontroler do anulowania \u017c\u0105dania po timeout\n                const controller = new AbortController();\n                const timeoutId = setTimeout(() => {\n                    controller.abort();\n                }, 60000); \/\/ 60 sekund timeout\n                \n                const response = await fetch(originalEndpoint, {\n                    method: 'POST',\n                    body: formData,\n                    signal: controller.signal\n                });\n                \n                clearTimeout(timeoutId);\n                \n                if (response.ok) {\n                    \/\/ Przekierowujemy u\u017cytkownika na stron\u0119 sukcesu po pomy\u015blnym zako\u0144czeniu\n                    window.location.href = 'https:\/\/telemedi.com\/pl\/formularz-refundacji-success\/';\n                } else {\n                    \/\/ === LOGOWANIE B\u0141\u0118DU API ===\n                    console.error('=== B\u0141\u0104D API - ODPOWIED\u0179 SERWERA NIE OK ===');\n                    console.error('Timestamp:', new Date().toISOString());\n                    console.error('Response status:', response.status);\n                    console.error('Response statusText:', response.statusText);\n                    console.error('Response headers:', Object.fromEntries(response.headers.entries()));\n                    console.error('Response URL:', response.url);\n                    console.error('Endpoint:', originalEndpoint);\n                    console.error('User Agent:', navigator.userAgent);\n                    console.error('Online status:', navigator.onLine);\n                    \n                    \/\/ Pobierz tre\u015b\u0107 b\u0142\u0119du z odpowiedzi API\n                    let errorData;\n                    try {\n                        const responseText = await response.text();\n                        console.error('Response body (raw):', responseText);\n                        \n                        if (responseText) {\n                            errorData = JSON.parse(responseText);\n                            console.error('Response body (parsed):', errorData);\n                        }\n                    } catch (parseError) {\n                        console.error('B\u0142\u0105d parsowania odpowiedzi serwera:', parseError);\n                        errorData = { message: `HTTP ${response.status}: ${response.statusText}` };\n                    }\n                    \n                    throw new Error(JSON.stringify(errorData));\n                }\n            } catch (error) {\n                \/\/ === LOGOWANIE B\u0141\u0118DU SIECIOWEGO\/FETCH ===\n                console.error('=== B\u0141\u0104D PODCZAS WYSY\u0141ANIA FORMULARZA ===');\n                console.error('Timestamp:', new Date().toISOString());\n                console.error('Error:', error);\n                console.error('User Agent:', navigator.userAgent);\n                console.error('URL:', window.location.href);\n                console.error('Endpoint:', originalEndpoint);\n                console.error('Online status:', navigator.onLine);\n                console.error('Connection type:', navigator.connection ? navigator.connection.effectiveType : 'unknown');\n                console.error('Platform:', navigator.platform);\n                console.error('Language:', navigator.language);\n                \n                \/\/ Szczeg\u00f3\u0142owe logowanie r\u00f3\u017cnych typ\u00f3w b\u0142\u0119d\u00f3w\n                if (error.name === 'AbortError') {\n                    console.error('\ud83d\udd50 B\u0142\u0105d: Timeout - \u017c\u0105danie przekroczy\u0142o limit czasu (60s)');\n                    console.error('Mo\u017cliwe przyczyny: wolne po\u0142\u0105czenie internetowe, przeci\u0105\u017cony serwer');\n                } else if (error.name === 'TypeError' && error.message.includes('fetch')) {\n                    console.error('\ud83c\udf10 B\u0142\u0105d: TypeError podczas fetch - prawdopodobnie problem sieciowy');\n                    console.error('Mo\u017cliwe przyczyny:');\n                    console.error('- Brak po\u0142\u0105czenia internetowego');\n                    console.error('- Problem z DNS');\n                    console.error('- Firewall\/antywirus blokuje po\u0142\u0105czenie');\n                    console.error('- Problem z certyfikatem SSL');\n                    console.error('- CORS error');\n                    console.error('- Serwer niedost\u0119pny');\n                } else if (error.name === 'NetworkError') {\n                    console.error('\ud83d\udce1 B\u0142\u0105d sieci - problem z po\u0142\u0105czeniem');\n                }\n                \n                \/\/ Logowanie dodatkowych informacji diagnostycznych\n                console.error('Error name:', error.name);\n                console.error('Error message:', error.message);\n                console.error('Error stack:', error.stack);\n                \n                throw error;\n            }\n        };\n        \n        \/\/ Wywo\u0142anie funkcji wysy\u0142ania z obs\u0142ug\u0105 b\u0142\u0119d\u00f3w\n        sendForm()\n        .catch(error => {\n            console.error('=== OSTATECZNY B\u0141\u0104D WYSY\u0141ANIA FORMULARZA ===');\n            console.error('Timestamp:', new Date().toISOString());\n            console.error('Final error:', error);\n            \n            let errorMessage = '';\n            \n            \/\/ Sprawd\u017a typ b\u0142\u0119du i dostosuj komunikat\n            if (error.name === 'AbortError') {\n                errorMessage += '\ud83d\udd50 Przekroczono limit czasu odpowiedzi serwera. Sprawd\u017a po\u0142\u0105czenie internetowe i spr\u00f3buj ponownie.';\n                console.error('\ud83d\udca1 Sugestia: U\u017cytkownik mo\u017ce mie\u0107 wolne po\u0142\u0105czenie internetowe');\n            } else if (error.name === 'TypeError' && error.message.includes('fetch')) {\n                errorMessage += '\ud83c\udf10 Problem z po\u0142\u0105czeniem internetowym.\\n\\nSpr\u00f3buj:\\n1. Od\u015bwie\u017cy\u0107 stron\u0119 (F5) i wys\u0142a\u0107 ponownie\\n2. U\u017cy\u0107 innej sieci (np. internet mobilny zamiast WiFi firmowego)\\n3. Wy\u0142\u0105czy\u0107 VPN je\u015bli jest w\u0142\u0105czony\\n\\nProblem mo\u017ce by\u0107 spowodowany ustawieniami sieci, z kt\u00f3rej korzystasz.';\n                console.error('\ud83d\udca1 Sugestia: Problem sieciowy po stronie u\u017cytkownika lub firewall');\n            } else {\n                \/\/ Sprawd\u017a czy mamy odpowied\u017a z API\n                try {\n                    const errorData = JSON.parse(error.message);\n                    \n                    \/\/ Logowanie szczeg\u00f3\u0142\u00f3w b\u0142\u0119du API do konsoli\n                    console.error('Szczeg\u00f3\u0142y b\u0142\u0119du API:', errorData);\n                    \n                    \/\/ Obs\u0142uga formatu b\u0142\u0119d\u00f3w z tablic\u0105 errors\n                    if (errorData.errors && Array.isArray(errorData.errors) && errorData.errors.length > 0) {\n                        errorMessage += 'B\u0142\u0119dy:';\n                        \n                        \/\/ Dodaj wszystkie b\u0142\u0119dy z tablicy errors\n                        errorData.errors.forEach(err => {\n                            if (err.field && err.message) {\n                                errorMessage += `\\n- ${err.message}`;\n                            } else if (err.message) {\n                                errorMessage += `\\n- ${err.message}`;\n                            }\n                        });\n                    } \n                    \/\/ Obs\u0142uga standardowego formatu z message\/error\n                    else if (errorData.message) {\n                        errorMessage += 'Tre\u015b\u0107 b\u0142\u0119du: ' + errorData.message;\n                    } else if (errorData.error) {\n                        errorMessage += 'Tre\u015b\u0107 b\u0142\u0119du: ' + errorData.error;\n                    }\n                } catch (e) {\n                    \/\/ Je\u015bli nie mamy odpowiedzi JSON, poka\u017c standardowy komunikat z b\u0142\u0119dem\n                    console.error('B\u0142\u0105d parsowania odpowiedzi JSON:', e);\n                    errorMessage += error.message;\n                }\n            }\n            \n            \/\/ Dodatkowe informacje dla u\u017cytkownika w przypadku problem\u00f3w sieciowych\n            if (!navigator.onLine) {\n                errorMessage += '\\n\\n\u26a0\ufe0f Uwaga: Brak po\u0142\u0105czenia internetowego. Sprawd\u017a po\u0142\u0105czenie i spr\u00f3buj ponownie.';\n            }\n            \n            \/\/ Dodaj informacj\u0119 o infolinii na ko\u0144cu\n            errorMessage += '\\n\\nW razie pyta\u0144 skontaktuj si\u0119 z infolini\u0105 +48 22 307 49 94.';\n            \n            showModal('error', 'B\u0142\u0105d wysy\u0142ania formularza', errorMessage);\n            \n            \/\/ Przywr\u00f3\u0107 przycisk do stanu pocz\u0105tkowego w przypadku b\u0142\u0119du\n            submitButton.disabled = false;\n            submitButton.classList.remove('opacity-50', 'cursor-not-allowed');\n            \n\n        })\n        .finally(() => {\n            loader.classList.remove('show');\n        });\n    });\n\n\n\n\n\n    function validateIBAN(accountNumber) {\n        \/\/ Dodaj PL na pocz\u0105tku je\u015bli go nie ma\n        let iban = accountNumber;\n        if (!iban.startsWith('PL')) {\n            iban = 'PL' + iban;\n        }\n        \n        \/\/ Usu\u0144 wszystkie spacje i zamie\u0144 na wielkie litery\n        iban = iban.replace(\/\\s\/g, '').toUpperCase();\n        \n        \/\/ Sprawd\u017a czy mamy dok\u0142adnie 26 cyfr\n        if (!\/^\\d{26}$\/.test(accountNumber)) {\n            return false;\n        }\n        \n        \/\/ Przesu\u0144 pierwsze 4 znaki na koniec\n        const rearranged = iban.substring(4) + iban.substring(0, 4);\n        \n        \/\/ Zamie\u0144 litery na cyfry (A=10, B=11, ...)\n        const converted = rearranged.split('').map(char => {\n            if (\/[0-9]\/.test(char)) {\n                return char;\n            }\n            return (char.charCodeAt(0) - 55).toString();\n        }).join('');\n        \n        \/\/ Oblicz modulo 97\n        let checksum = 0;\n        for (let i = 0; i < converted.length; i++) {\n            checksum = ((checksum * 10) + parseInt(converted[i])) % 97;\n        }\n        \n        return checksum === 1;\n    }\n\n    function validatePESEL(pesel) {\n        \/\/ Sprawd\u017a czy PESEL ma dok\u0142adnie 11 cyfr\n        if (!\/^\\d{11}$\/.test(pesel)) {\n            return false;\n        }\n        \n        \/\/ Wagi dla poszczeg\u00f3lnych cyfr PESEL\n        const weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1];\n        \n        \/\/ Obliczanie sumy kontrolnej\n        let sum = 0;\n        for (let i = 0; i < 11; i++) {\n            sum += parseInt(pesel.charAt(i)) * weights[i];\n        }\n        \n        \/\/ Sprawdzenie sumy kontrolnej - ostatnia cyfra sumy musi by\u0107 0\n        return sum % 10 === 0;\n    }\n\n    function validatePESELUnique() {\n        const insuredPerson = document.getElementById('insuredPerson').value;\n        const pesel = document.getElementById('pesel').value;\n        const insuredPesel = document.getElementById('insuredPesel').value;\n        \n        \/\/> this comment is used to circumvent the https:\/\/core.trac.wordpress.org\/ticket\/43785 bug\n        \/\/ Sprawdzamy tylko gdy wybrana jest opcja \"Inna osoba\"\n        if (insuredPerson === 'Inna osoba' && pesel && insuredPesel) {\n            return pesel !== insuredPesel;\n        }\n        \n        return true; \/\/ Je\u015bli nie ma konfliktu lub nie wybrano \"Inna osoba\"\n    }\n\n    function validateDateNotFromFuture(dateString) {\n        if (!dateString) return true; \/\/ Puste pole mo\u017ce by\u0107, wymagane sprawdza HTML\n        \n        const inputDate = new Date(dateString);\n        const today = new Date();\n        today.setHours(23, 59, 59, 999); \/\/ Ustaw na koniec dnia, \u017ceby dzisiejsza data by\u0142a OK\n        \n        return inputDate <= today;\n    }\n\n    \/\/ Modyfikujemy event listener dla pola numeru konta\n    document.getElementById('accountNumber').addEventListener('input', function(e) {\n        \/\/ Pozostaw tylko cyfry\n        let value = e.target.value.replace(\/[^0-9]\/g, '');\n        \n        \/\/ Ogranicz d\u0142ugo\u015b\u0107 do 26 cyfr\n        value = value.substring(0, 26);\n        \n        \/\/ Zaktualizuj warto\u015b\u0107 pola\n        e.target.value = value;\n    });\n\n    document.getElementById('accountNumber').addEventListener('blur', function() {\n        const numerKonta = this.value;\n        const errorElement = document.getElementById('accountNumberError');\n        \n        if (!validateIBAN(numerKonta)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    });\n\n    \/\/ Dodajemy walidacj\u0119 numeru telefonu\n    document.getElementById('contactNumber').addEventListener('input', function(e) {\n        let value = e.target.value;\n        \n        \/\/ Upewnij si\u0119, \u017ce numer zaczyna si\u0119 od +48\n        if (!value.startsWith('+48')) {\n            value = '+48';\n        }\n        \n        \/\/ Usu\u0144 wszystkie nie-cyfry po +48\n        const prefix = value.substring(0, 3);\n        let rest = value.substring(3).replace(\/[^0-9]\/g, '');\n        \n        \/\/ Ogranicz d\u0142ugo\u015b\u0107 do 9 cyfr po +48\n        rest = rest.substring(0, 9);\n        \n        \/\/ Zaktualizuj warto\u015b\u0107 pola\n        e.target.value = prefix + rest;\n    });\n\n    document.getElementById('contactNumber').addEventListener('blur', function() {\n        const phone = this.value;\n        const errorElement = document.getElementById('phoneError');\n        \n        \/\/ Sprawd\u017a czy numer jest w formacie +48 + 9 cyfr\n        if (!\/^\\+48\\d{9}$\/.test(phone)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    });\n\n    \/\/ Usuwanie b\u0142\u0119du z checkbox\u00f3w zg\u00f3d po zaznaczeniu\n    document.querySelectorAll('.consent-checkbox input[type=\"checkbox\"]').forEach(checkbox => {\n        checkbox.addEventListener('change', function() {\n            const label = this.closest('.consent-checkbox');\n            if (this.checked) {\n                label.classList.remove('consent-error');\n            }\n        });\n    });\n\n    \/\/ Dodajemy walidacj\u0119 daty urodzenia\n    document.getElementById('birthDate').addEventListener('blur', function() {\n        const date = this.value;\n        const errorElement = document.getElementById('birthDateError');\n        \n        if (!validateDateNotFromFuture(date)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    });\n\n    \/\/ Dodajemy walidacj\u0119 daty zdarzenia\n    document.getElementById('eventDate').addEventListener('blur', function() {\n        const date = this.value;\n        const errorElement = document.getElementById('eventDateError');\n        \n        if (!validateDateNotFromFuture(date)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    });\n\n    document.addEventListener('DOMContentLoaded', function() {\n        document.body.addEventListener('change', function(e) {\n            if (e.target.classList.contains('additional-tests-radio')) {\n                const serviceGroup = e.target.closest('.service-group');\n                const detailsDiv = serviceGroup.querySelector('.additional-tests-details');\n                const detailsInput = detailsDiv.querySelector('input');\n                \n                if (e.target.value === 'tak') {\n                    detailsDiv.classList.remove('hidden');\n                    detailsInput.required = true;\n                } else {\n                    detailsDiv.classList.add('hidden');\n                    detailsInput.required = false;\n                    detailsInput.value = '';\n                }\n            }\n        });\n        \n        \/\/ Inicjalizacja uploadu plik\u00f3w\n        initFileUploads();\n    });\n\n    \/\/ Globalne przechowywanie plik\u00f3w per upload zone\n    const fileStores = {};\n\n    function validateFileType(file) {\n        const acceptedTypes = ['image\/jpeg', 'image\/png', 'image\/gif', 'image\/jpg', 'image\/webp', 'image\/heic', 'image\/heif', 'application\/pdf'];\n        return acceptedTypes.includes(file.type);\n    }\n\n    function validateFileSize(file) {\n        const maxSize = 10 * 1024 * 1024;\n        return file.size <= maxSize;\n    }\n\n    function formatFileSize(bytes) {\n        if (bytes === 0) return '0 B';\n        const k = 1024;\n        const sizes = ['B', 'KB', 'MB', 'GB'];\n        const i = Math.floor(Math.log(bytes) \/ Math.log(k));\n        return parseFloat((bytes \/ Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n    }\n\n    function getFileIcon(file) {\n        if (file.type === 'application\/pdf') {\n            return '<svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M3 1h5l4 4v8H3V1z\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><path d=\"M8 1v4h4\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><\/svg>';\n        }\n        return '<svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1.5\" y=\"2\" width=\"11\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><circle cx=\"5\" cy=\"6\" r=\"1.2\" stroke=\"currentColor\" stroke-width=\"1\"\/><path d=\"M1.5 10l3-3 2 2 2.5-2.5L12.5 10\" stroke=\"currentColor\" stroke-width=\"1\"\/><\/svg>';\n    }\n\n    function renderFileList(storeKey) {\n        const listEl = document.querySelector(`.file-list[data-list-for=\"${storeKey}\"]`);\n        if (!listEl) return;\n\n        const files = fileStores[storeKey] || [];\n        listEl.innerHTML = '';\n\n        files.forEach((file, index) => {\n            const item = document.createElement('div');\n            item.className = 'file-list-item';\n            item.innerHTML = `\n                <div class=\"file-list-item-info\">\n                    <div class=\"file-list-item-icon\">${getFileIcon(file)}<\/div>\n                    <span class=\"file-list-item-name\">${file.name}<\/span>\n                    <span class=\"file-list-item-size\">${formatFileSize(file.size)}<\/span>\n                <\/div>\n                <button type=\"button\" class=\"file-list-item-remove\" data-store=\"${storeKey}\" data-index=\"${index}\">\n                    <svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M3 3l8 8M11 3l-8 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/><\/svg>\n                <\/button>\n            `;\n            listEl.appendChild(item);\n        });\n\n        \/\/ Wyczy\u015b\u0107 czerwon\u0105 ramk\u0119 po dodaniu pliku\n        if (files.length > 0) {\n            const zone = document.querySelector(`.file-upload-zone[data-upload-for=\"${storeKey}\"]`);\n            if (zone) {\n                zone.style.borderColor = '';\n            }\n        }\n    }\n\n    function addFilesToStore(storeKey, newFiles, isMultiple) {\n        if (!fileStores[storeKey]) {\n            fileStores[storeKey] = [];\n        }\n\n        let hasInvalidFile = false;\n        let hasOversizedFile = false;\n        const validFiles = [];\n\n        for (let i = 0; i < newFiles.length; i++) {\n            const file = newFiles[i];\n            if (!validateFileType(file)) {\n                hasInvalidFile = true;\n                break;\n            }\n            if (!validateFileSize(file)) {\n                hasOversizedFile = true;\n                break;\n            }\n            \/\/ Sprawd\u017a duplikaty po nazwie i rozmiarze\n            const isDuplicate = fileStores[storeKey].some(\n                existing => existing.name === file.name && existing.size === file.size\n            );\n            if (!isDuplicate) {\n                validFiles.push(file);\n            }\n        }\n\n        if (hasInvalidFile) {\n            showModal('error', 'B\u0142\u0105d formatu pliku', 'Wykryto niedozwolony format pliku. Dozwolone s\u0105 tylko zdj\u0119cia i pliki PDF.');\n            return false;\n        }\n\n        if (hasOversizedFile) {\n            showModal('error', 'B\u0142\u0105d rozmiaru pliku', 'Wykryto plik przekraczaj\u0105cy maksymalny rozmiar 10MB. Ka\u017cdy plik nie mo\u017ce by\u0107 wi\u0119kszy ni\u017c 10MB.');\n            return false;\n        }\n\n        if (isMultiple) {\n            fileStores[storeKey] = fileStores[storeKey].concat(validFiles);\n        } else {\n            fileStores[storeKey] = validFiles.length > 0 ? [validFiles[0]] : fileStores[storeKey];\n        }\n\n        renderFileList(storeKey);\n        return true;\n    }\n\n    function removeFileFromStore(storeKey, index) {\n        if (fileStores[storeKey]) {\n            fileStores[storeKey].splice(index, 1);\n            renderFileList(storeKey);\n        }\n    }\n\n    \/\/ Delegowany event listener dla przycisk\u00f3w usuwania plik\u00f3w\n    document.addEventListener('click', function(e) {\n        const removeBtn = e.target.closest('.file-list-item-remove');\n        if (removeBtn) {\n            const storeKey = removeBtn.dataset.store;\n            const index = parseInt(removeBtn.dataset.index);\n            removeFileFromStore(storeKey, index);\n        }\n    });\n\n    function initFileUploads() {\n        document.querySelectorAll('.file-upload-zone').forEach(zone => {\n            \/\/ Pomijamy ju\u017c zainicjalizowane strefy\n            if (zone.dataset.initialized === 'true') return;\n            zone.dataset.initialized = 'true';\n\n            const input = zone.querySelector('input[type=\"file\"]');\n            const initialKey = zone.dataset.uploadFor;\n\n            if (!fileStores[initialKey]) {\n                fileStores[initialKey] = [];\n            }\n\n            \/\/ Dynamiczne odczytywanie klucza i trybu z atrybut\u00f3w\n            function getCurrentKey() { return zone.dataset.uploadFor; }\n            function isMultiple() { return zone.dataset.multiple === 'true'; }\n\n            \/\/ Klik na stref\u0119 otwiera dialog plik\u00f3w\n            zone.addEventListener('click', function(e) {\n                if (e.target.closest('.file-list-item-remove')) return;\n                input.click();\n            });\n\n            \/\/ Obs\u0142uga wyboru plik\u00f3w\n            input.addEventListener('change', function() {\n                if (this.files.length > 0) {\n                    addFilesToStore(getCurrentKey(), this.files, isMultiple());\n                }\n                this.value = '';\n            });\n\n            \/\/ Drag & drop\n            zone.addEventListener('dragover', function(e) {\n                e.preventDefault();\n                this.classList.add('dragover');\n            });\n\n            zone.addEventListener('dragleave', function(e) {\n                e.preventDefault();\n                this.classList.remove('dragover');\n            });\n\n            zone.addEventListener('drop', function(e) {\n                e.preventDefault();\n                this.classList.remove('dragover');\n                if (e.dataTransfer.files.length > 0) {\n                    addFilesToStore(getCurrentKey(), e.dataTransfer.files, isMultiple());\n                }\n            });\n        });\n    }\n\n    \/\/ Funkcja do pobrania wszystkich plik\u00f3w ze store'\u00f3w do FormData\n    function appendStoredFilesToFormData(formData) {\n        \/\/ Usu\u0144 pliki z natywnych input\u00f3w (s\u0105 puste bo resetujemy po ka\u017cdym wyborze)\n        \/\/ Dodaj pliki ze store'\u00f3w\n        Object.keys(fileStores).forEach(storeKey => {\n            const files = fileStores[storeKey];\n            if (storeKey === 'attachments') {\n                \/\/ Usu\u0144 istniej\u0105ce wpisy attachments[]\n                formData.delete('attachments[]');\n                files.forEach(file => {\n                    formData.append('attachments[]', file);\n                });\n            } else {\n                \/\/ Invoice files - pojedyncze pliki\n                formData.delete(storeKey);\n                if (files.length > 0) {\n                    formData.append(storeKey, files[0]);\n                }\n            }\n        });\n    }\n\n    \/\/ Funkcja waliduj\u0105ca kod pocztowy\n    function validatePostalCode(postalCode) {\n        \/\/ Format kodu pocztowego: 00-000\n        return \/^\\d{2}-\\d{3}$\/.test(postalCode);\n    }\n    \n    \/\/ Walidacja kodu pocztowego u\u017cytkownika\n    document.getElementById('postalCode').addEventListener('input', function(e) {\n        let value = e.target.value.replace(\/[^0-9-]\/g, '');\n        \/\/> this comment is used to circumvent the https:\/\/core.trac.wordpress.org\/ticket\/43785 bug\n        \/\/ Automatycznie dodajemy my\u015blnik po dw\u00f3ch cyfrach, je\u015bli go nie ma\n        if (value.length === 2 && !value.includes('-')) {\n            value += '-';\n        }\n        \n        \/\/ Usuwamy wszystkie my\u015blniki poza pierwszym po 2 cyfrach\n        if (value.length > 3) {\n            const firstPart = value.substring(0, 3); \/\/ Pierwsze 2 cyfry + my\u015blnik\n            const secondPart = value.substring(3).replace(\/-\/g, ''); \/\/ Reszta bez my\u015blnik\u00f3w\n            value = firstPart + secondPart;\n        }\n        \n        \/\/ Ograniczamy d\u0142ugo\u015b\u0107 do 6 znak\u00f3w (2 cyfry + my\u015blnik + 3 cyfry)\n        value = value.substring(0, 6);\n        \n        \/\/ Aktualizujemy warto\u015b\u0107 pola\n        e.target.value = value;\n    });\n    \n    document.getElementById('postalCode').addEventListener('blur', function() {\n        const postalCode = this.value;\n        const errorElement = document.getElementById('postalCodeError');\n        \n        if (!validatePostalCode(postalCode)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    });\n    \n    \/\/ Funkcja do dodawania event listener\u00f3w dla kod\u00f3w pocztowych plac\u00f3wek\n    function setupServicePostalCodeValidation() {\n        document.querySelectorAll('.servicePostalCode').forEach(input => {\n            \/\/ Usuwamy poprzednie event listenery \u017ceby unikn\u0105\u0107 duplikacji\n            input.removeEventListener('input', postalCodeInputHandler);\n            input.removeEventListener('blur', postalCodeBlurHandler);\n            \n            \/\/ Dodajemy nowe event listenery\n            input.addEventListener('input', postalCodeInputHandler);\n            input.addEventListener('blur', postalCodeBlurHandler);\n        });\n    }\n    \n    \/\/ Funkcja do dodawania event listener\u00f3w dla dat \u015bwiadcze\u0144\n    function setupServiceDateValidation() {\n        document.querySelectorAll('.service-date').forEach(input => {\n            \/\/ Usuwamy poprzednie event listenery \u017ceby unikn\u0105\u0107 duplikacji\n            input.removeEventListener('blur', serviceDateBlurHandler);\n            \n            \/\/ Dodajemy nowe event listenery\n            input.addEventListener('blur', serviceDateBlurHandler);\n        });\n    }\n    \n    function serviceDateBlurHandler() {\n        const date = this.value;\n        const errorElement = this.parentElement.querySelector('.service-date-error');\n        \n        if (!validateDateNotFromFuture(date)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    }\n    \n    function postalCodeInputHandler(e) {\n        let value = e.target.value.replace(\/[^0-9-]\/g, '');\n        \n        \/\/ Automatycznie dodajemy my\u015blnik po dw\u00f3ch cyfrach, je\u015bli go nie ma\n        if (value.length === 2 && !value.includes('-')) {\n            value += '-';\n        }\n        \n        \/\/ Usuwamy wszystkie my\u015blniki poza pierwszym po 2 cyfrach\n        if (value.length > 3) {\n            const firstPart = value.substring(0, 3); \/\/ Pierwsze 2 cyfry + my\u015blnik\n            const secondPart = value.substring(3).replace(\/-\/g, ''); \/\/ Reszta bez my\u015blnik\u00f3w\n            value = firstPart + secondPart;\n        }\n        \n        \/\/ Ograniczamy d\u0142ugo\u015b\u0107 do 6 znak\u00f3w (2 cyfry + my\u015blnik + 3 cyfry)\n        value = value.substring(0, 6);\n        \n        \/\/ Aktualizujemy warto\u015b\u0107 pola\n        e.target.value = value;\n    }\n    \n    function postalCodeBlurHandler() {\n        const postalCode = this.value;\n        const errorElement = this.parentElement.querySelector('.servicePostalCodeError');\n        \n        if (!validatePostalCode(postalCode)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n        }\n    }\n    \n    document.addEventListener('DOMContentLoaded', function() {\n        \/\/ Inicjalizacja walidacji kod\u00f3w pocztowych plac\u00f3wek\n        setupServicePostalCodeValidation();\n        \/\/ Inicjalizacja walidacji kwot\n        setupAmountValidation();\n        \/\/ Inicjalizacja walidacji numer\u00f3w faktur\n        setupInvoiceNumberValidation();\n        \/\/ Inicjalizacja walidacji dat \u015bwiadcze\u0144\n        setupServiceDateValidation();\n        \n        \/\/ Dodajemy event listener do przycisku dodawania nowego \u015bwiadczenia\n        document.getElementById('addService').addEventListener('click', function() {\n            \/\/ Po dodaniu nowego \u015bwiadczenia czekamy chwil\u0119, a\u017c DOM si\u0119 zaktualizuje\n            setTimeout(function() {\n                setupServicePostalCodeValidation();\n                setupAmountValidation();\n                setupInvoiceNumberValidation();\n                setupServiceDateValidation();\n                initFileUploads();\n            }, 100);\n        });\n        \n        \/\/ Wywo\u0142ujemy aktualizacj\u0119 numeracji przy za\u0142adowaniu strony\n        updateServiceNumbers();\n        \/\/ Wywo\u0142ujemy aktualizacj\u0119 widoczno\u015bci przycisk\u00f3w przy za\u0142adowaniu strony\n        updateRemoveButtonsVisibility();\n    });\n\n    \/\/ Funkcja do walidacji kwoty\n    function validateAmount(amount) {\n        \/\/ Akceptujemy liczby z przecinkiem lub kropk\u0105\n        return \/^(\\d+)([\\.,]\\d{1,2})?$\/.test(amount);\n    }\n    \n    \/\/ Funkcja do dodawania event listener\u00f3w dla p\u00f3l kwot\n    function setupAmountValidation() {\n        document.querySelectorAll('.amount-input').forEach(input => {\n            \/\/ Usuwamy poprzednie event listenery \u017ceby unikn\u0105\u0107 duplikacji\n            input.removeEventListener('input', amountInputHandler);\n            input.removeEventListener('blur', amountBlurHandler);\n            \n            \/\/ Dodajemy nowe event listenery\n            input.addEventListener('input', amountInputHandler);\n            input.addEventListener('blur', amountBlurHandler);\n        });\n    }\n    \n    function amountInputHandler(e) {\n        \/\/ Pozwalamy tylko na cyfry, kropk\u0119 i przecinek\n        let value = e.target.value.replace(\/[^0-9.,]\/g, '');\n        \n        \/\/ Ograniczamy do jednego separatora dziesi\u0119tnego\n        let dotIndex = value.indexOf('.');\n        let commaIndex = value.indexOf(',');\n        \n        if (dotIndex !== -1 && commaIndex !== -1) {\n            \/\/ Je\u015bli s\u0105 oba separatory, usuwamy drugi\n            if (dotIndex < commaIndex) {\n                value = value.replace(',', '');\n            } else {\n                value = value.replace('.', '');\n            }\n        }\n        \n        \/\/ Aktualizujemy warto\u015b\u0107 pola\n        e.target.value = value;\n    }\n    \n    function amountBlurHandler() {\n        const amount = this.value;\n        const errorElement = this.parentElement.querySelector('.amount-error');\n        \n        if (!validateAmount(amount)) {\n            errorElement.classList.remove('hidden');\n            this.classList.add('border-red-500');\n        } else {\n            errorElement.classList.add('hidden');\n            this.classList.remove('border-red-500');\n            \n            \/\/ Zamieniamy przecinek na kropk\u0119, aby zapewni\u0107 poprawny format dla API\n            this.value = amount.replace(',', '.');\n        }\n    }\n\n    \/\/ Funkcja do walidacji d\u0142ugo\u015bci numeru faktury\/rachunku\n    function setupInvoiceNumberValidation() {\n        document.querySelectorAll('.invoice-number').forEach(input => {\n            \/\/ Usuwamy poprzednie event listenery \u017ceby unikn\u0105\u0107 duplikacji\n            input.removeEventListener('input', invoiceNumberInputHandler);\n            \n            \/\/ Dodajemy nowe event listenery\n            input.addEventListener('input', invoiceNumberInputHandler);\n        });\n    }\n    \n    function invoiceNumberInputHandler(e) {\n        let value = e.target.value;\n        const errorElement = e.target.nextElementSibling;\n        \n        \/\/ Sprawdzamy d\u0142ugo\u015b\u0107\n        if (value.length > 50) {\n            \/\/ Przycinamy warto\u015b\u0107 do 50 znak\u00f3w\n            value = value.substring(0, 50);\n            e.target.value = value;\n            \n            \/\/ Pokazujemy b\u0142\u0105d\n            errorElement.classList.remove('hidden');\n            e.target.classList.add('border-red-500');\n        } else {\n            \/\/ Ukrywamy b\u0142\u0105d\n            errorElement.classList.add('hidden');\n            e.target.classList.remove('border-red-500');\n        }\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Uwaga! Ta strona wymaga w\u0142\u0105czonego JavaScript, aby dzia\u0142a\u0107 poprawnie. W\u0142\u0105cz obs\u0142ug\u0119 JavaScript w przegl\u0105darce i od\u015bwie\u017c stron\u0119. Zamknij Sprawd\u017a wniosek przed wys\u0142aniem Upewnij si\u0119, \u017ce wszystkie dane s\u0105 poprawne. B\u0142\u0119dne dane wyd\u0142u\u017c\u0105 weryfikacj\u0119 Nieprawid\u0142owe lub niekompletne informacje (np. dane g\u0142\u00f3wnego ubezpieczonego, dane wsp\u00f3\u0142ubezpieczonego, adres, dane plac\u00f3wki, dane \u015bwiadczenia) mog\u0105 znacznie op\u00f3\u017ani\u0107 rozpatrzenie wniosku. Nieprawid\u0142owy produkt [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-22227","page","type-page","status-publish","hentry"],"acf":[],"lang":"pl","translations":{"pl":22227},"_links":{"self":[{"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/pages\/22227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/comments?post=22227"}],"version-history":[{"count":39,"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/pages\/22227\/revisions"}],"predecessor-version":[{"id":25156,"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/pages\/22227\/revisions\/25156"}],"wp:attachment":[{"href":"https:\/\/telemedi.com\/tm-api\/wp\/v2\/media?parent=22227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}