{"id":869,"date":"2026-02-24T17:08:14","date_gmt":"2026-02-24T16:08:14","guid":{"rendered":"https:\/\/www.providebit.org\/?page_id=869"},"modified":"2026-03-03T17:34:44","modified_gmt":"2026-03-03T16:34:44","slug":"newsletter-anmelden","status":"publish","type":"page","link":"https:\/\/providebit.org\/fr\/newsletter-anmelden\/","title":{"rendered":"Newsletter"},"content":{"rendered":"<style>\n#pbn-wrap {\n  --primary:#3a6b35; --primary-dark:#274e24; --primary-light:#5a9252;\n  --accent:#c4963a; --bg:#faf8f4; --bg-card:#fff;\n  --text:#1e2d1a; --text-muted:#6b7d65; --border:#d4dfd2;\n  --error:#c0392b; --shadow:0 4px 24px rgba(58,107,53,.08); --radius:12px;\n  font-family:'Source Sans 3',sans-serif; color:var(--text);\n}\n#pbn-wrap *{box-sizing:border-box;}\n\n\/* Lang-Switcher (klein, im Formular) *\/\n.pbn-lang-switcher{text-align:right;margin-bottom:8px}\n.lang-btn{padding:4px 10px;font-size:12px;font-weight:700;background:transparent;border:1.5px solid var(--border);border-radius:6px;color:var(--text-muted);cursor:pointer;margin-left:4px}\n.lang-btn.active{background:var(--primary);border-color:var(--primary);color:#fff}\n\n\/* HERO *\/\n.hero{background:linear-gradient(135deg,var(--primary-dark) 0%,var(--primary) 60%,#5a9252 100%);padding:56px 32px 44px;text-align:center;position:relative;overflow:hidden}\n.hero::before{content:'';position:absolute;inset:0;background:url(\"data:image\/svg+xml,%3Csvg width='80' height='80' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cg fill='none' stroke='rgba(255,255,255,0.04)' stroke-width='1'%3E%3Cpath d='M40 10Q55 25 40 40Q25 55 40 70'\/%3E%3Cpath d='M20 30Q35 45 20 60'\/%3E%3C\/g%3E%3C\/svg%3E\")}\n.hero-badge{display:inline-block;background:var(--accent);color:var(--primary-dark);font-size:11px;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;padding:4px 14px;border-radius:20px;margin-bottom:16px;position:relative}\n.hero h1{font-family:'Playfair Display',serif;font-size:38px;color:#fff;margin-bottom:10px;position:relative}\n.hero p{color:rgba(255,255,255,.8);font-size:16px;max-width:500px;margin:0 auto;line-height:1.6;position:relative}\n\n\/* LAYOUT *\/\n.main-container{max-width:880px;margin:0 auto;padding:40px 20px 80px}\n.tabs{display:flex;margin-bottom:28px;border-bottom:2px solid var(--border)}\n.tab-btn{padding:11px 26px;font-family:'Source Sans 3',sans-serif;font-size:14px;font-weight:600;color:var(--text-muted);background:none;border:none;cursor:pointer;border-bottom:3px solid transparent;margin-bottom:-2px;transition:all .2s}\n.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary)}\n.tab-panel{display:none}.tab-panel.active{display:block}\n\n\/* CARD *\/\n.card{background:var(--bg-card);border-radius:var(--radius);border:1px solid var(--border);box-shadow:var(--shadow);padding:28px;margin-bottom:20px}\n.card-title{font-family:'Playfair Display',serif;font-size:18px;color:var(--primary-dark);margin-bottom:8px;display:flex;align-items:center;gap:10px}\n.card-title .icon{width:26px;height:26px;background:var(--primary);border-radius:7px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;flex-shrink:0}\n.card-subtitle{font-size:13px;color:var(--text-muted);margin-bottom:16px}\n\n\/* TYPE TOGGLE *\/\n.contact-type-toggle{display:flex;border:1.5px solid var(--border);border-radius:8px;overflow:hidden;margin-bottom:22px}\n.type-btn{flex:1;padding:10px;font-family:'Source Sans 3',sans-serif;font-size:14px;font-weight:600;background:#fff;border:none;cursor:pointer;color:var(--text-muted);transition:all .2s;display:flex;align-items:center;justify-content:center;gap:7px}\n.type-btn.active{background:var(--primary);color:#fff}\n.type-btn:not(.active):hover{background:#f0f7ee;color:var(--text)}\n\n\/* FORM *\/\n.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}\n.form-group{display:flex;flex-direction:column;gap:5px}\n.form-group.full{grid-column:1\/-1}\nlabel{font-size:13px;font-weight:600;color:var(--text)}\nlabel .req{color:var(--error);margin-left:2px}\nlabel .opt{color:var(--text-muted);font-weight:400;font-size:11px;margin-left:4px}\n#pbn-wrap input[type=text],input[type=email],input[type=tel],input[type=url],input[type=number],input[type=password],select,textarea{\n  padding:9px 12px;border:1.5px solid var(--border);border-radius:7px;\n  font-family:'Source Sans 3',sans-serif;font-size:14px;color:var(--text);\n  background:#fff;transition:border-color .2s,box-shadow .2s;width:100%}\ninput:focus,select:focus,textarea:focus{outline:none;border-color:var(--primary-light);box-shadow:0 0 0 3px rgba(58,107,53,.1)}\ninput.err,select.err{border-color:var(--error)}\n.field-error{color:var(--error);font-size:11px;min-height:14px}\ntextarea{resize:vertical;min-height:90px}\n.addr-row{display:grid;grid-template-columns:1fr 90px;gap:10px}\n.section-label{font-size:11px;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:1px;margin:16px 0 8px;grid-column:1\/-1;padding-top:16px;border-top:1px solid var(--border)}\n.hidden{display:none!important}\n.phone-wrap{position:relative}\n.phone-hint{font-size:11px;color:var(--text-muted);margin-top:3px}\n\n\/* CATEGORIES *\/\n.categories-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:9px}\n.cat-item{display:flex;align-items:center;gap:9px;padding:9px 12px;border:1.5px solid var(--border);border-radius:8px;cursor:pointer;transition:all .15s;user-select:none;background:#fff}\n.cat-item:hover{border-color:var(--primary-light);background:#f5faf4}\n.cat-item.checked{border-color:var(--primary);background:#f0f7ee}\n.cat-item input[type=checkbox]{display:none}\n.cat-check{width:17px;height:17px;border:2px solid var(--border);border-radius:4px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:11px;color:#fff;transition:all .15s}\n.cat-item.checked .cat-check{background:var(--primary);border-color:var(--primary)}\n.cat-emoji{font-size:15px}\n.cat-label{font-size:13px;font-weight:500;line-height:1.3}\n\n\/* NOTICES *\/\n.notice{padding:12px 16px;border-radius:8px;font-size:13px;line-height:1.6;margin-bottom:4px}\n.notice.info{background:#f0f7ee;border:1px solid var(--border);color:var(--primary-dark)}\n.notice.warn{background:#fff8ed;border:1px solid #f0d080;color:#7a5500}\n.notice.ok{background:#edfaf4;border:1px solid #a7e3c5;color:#1e6b45}\n.notice.err-n{background:#fdf0ef;border:1px solid #f5c0bc;color:#8b1a13}\n\n\/* BUTTONS *\/\n.btn-primary{background:var(--primary);color:#fff;border:none;padding:14px 36px;border-radius:8px;font-family:'Source Sans 3',sans-serif;font-size:15px;font-weight:600;cursor:pointer;width:100%;transition:background .2s;display:flex;align-items:center;justify-content:center;gap:10px;margin-top:6px}\n.btn-primary:hover{background:var(--primary-dark)}\n.btn-primary:disabled{background:var(--text-muted);cursor:not-allowed}\n.btn-accent{background:var(--accent);color:#fff;border:none;padding:9px 18px;border-radius:7px;font-family:'Source Sans 3',sans-serif;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s;display:inline-flex;align-items:center;gap:7px;white-space:nowrap}\n.btn-accent:hover{background:#a87d2a}\n.btn-accent:disabled{background:var(--text-muted);cursor:not-allowed}\n.btn-secondary{background:#fff;color:var(--primary);border:2px solid var(--primary);padding:9px 22px;border-radius:8px;font-family:'Source Sans 3',sans-serif;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s}\n.btn-secondary:hover{background:var(--primary);color:#fff}\n.btn-sm{padding:5px 12px;font-size:12px;border-radius:6px;border:1.5px solid var(--border);background:#fff;cursor:pointer;font-family:'Source Sans 3',sans-serif;color:var(--text-muted);transition:all .15s}\n.btn-sm:hover{border-color:var(--error);color:var(--error)}\n\n\/* STATUS *\/\n.status-message{padding:14px 18px;border-radius:8px;font-size:14px;font-weight:500;display:none;margin-top:14px;line-height:1.5}\n.status-message.success{background:#edfaf4;border:1px solid #a7e3c5;color:#1e6b45;display:block}\n.status-message.error{background:#fdf0ef;border:1px solid #f5c0bc;color:#8b1a13;display:block}\n.privacy-note{font-size:12px;color:var(--text-muted);text-align:center;margin-top:14px;line-height:1.5}\n.privacy-note a{color:var(--primary);text-decoration:none}\n\n\/* SPINNER *\/\n.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite;display:none}\n.spinner-sm{width:13px;height:13px;border:2px solid rgba(255,255,255,.4);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite;display:inline-block}\n@keyframes spin{to{transform:rotate(360deg)}}\n\n\/* API STATUS *\/\n.api-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:4px 10px;border-radius:20px;font-weight:600}\n.api-status.connected{background:#edfaf4;color:#1e6b45}\n.api-status.disconnected{background:#f5f5f5;color:var(--text-muted)}\n.api-status.loading{background:#fff8ed;color:#7a5500}\n.api-status.error-s{background:#fdf0ef;color:#8b1a13}\n.status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:#aaa}\n.connected .status-dot{background:#1e6b45}\n.error-s .status-dot{background:var(--error)}\n\n\/* ADMIN TABLES *\/\n.cat-admin-table{width:100%;border-collapse:collapse;font-size:13px}\n.cat-admin-table th{text-align:left;font-size:11px;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:.8px;padding:0 8px 10px 0;border-bottom:1px solid var(--border)}\n.cat-admin-table td{padding:6px 8px 6px 0;border-bottom:1px solid #f0f0f0;vertical-align:middle}\n.cat-admin-table input{padding:5px 8px;font-size:13px;border:1.5px solid var(--border);border-radius:6px}\n.badge{display:inline-flex;align-items:center;gap:4px;background:#f0f7ee;border:1px solid var(--border);border-radius:5px;padding:3px 8px;font-size:11px;color:var(--primary-dark);font-family:monospace}\n.vis-btn{width:30px;height:28px;border-radius:6px;border:1.5px solid var(--border);background:#fff;cursor:pointer;font-size:14px;transition:all .15s;display:inline-flex;align-items:center;justify-content:center}\n.vis-btn.on{border-color:var(--primary);background:#f0f7ee}\n\n\/* FIELD TOGGLES *\/\n.field-toggle-list{display:grid;grid-template-columns:1fr 1fr;gap:7px}\n.field-toggle{display:flex;align-items:center;gap:9px;padding:8px 11px;border:1.5px solid var(--border);border-radius:8px;cursor:pointer;transition:all .15s;user-select:none;font-size:13px;background:#fff}\n.field-toggle.active{border-color:var(--primary);background:#f0f7ee;color:var(--primary-dark)}\n.field-toggle.locked{opacity:.55;cursor:not-allowed}\n.toggle-dot{width:9px;height:9px;border-radius:50%;background:var(--border);flex-shrink:0}\n.field-toggle.active .toggle-dot{background:var(--primary)}\n\n\/* TEXT EDITOR *\/\n.text-editor-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n.text-editor-grid .form-group label{font-size:12px;color:var(--text-muted)}\n.lang-col-header{font-size:11px;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:1px;padding:6px 0;border-bottom:1px solid var(--border);margin-bottom:8px;display:grid;grid-template-columns:1fr 1fr;gap:12px}\n.text-group{margin-bottom:14px}\n.text-group-label{font-size:12px;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:.8px;margin-bottom:8px;padding-bottom:4px;border-bottom:1px dashed var(--border)}\n\n@media(max-width:600px){\n  .form-grid,.field-toggle-list,.text-editor-grid{grid-template-columns:1fr}\n  .hero h1{font-size:26px}\n  .card{padding:18px}\n  .addr-row{grid-template-columns:1fr 70px}\n  .tagline{display:none}\n}\n<\/style>\n\n<div id=\"pbn-wrap\">\n<div class=\"pbn-lang-switcher\">\n  <button class=\"lang-btn active\" id=\"langDE\" onclick=\"setLang('de')\">DE<\/button>\n  <button class=\"lang-btn\" id=\"langFR\" onclick=\"setLang('fr')\">FR<\/button>\n<\/div>\n\n<!-- HERO -->\n<div class=\"hero\">\n  <div class=\"hero-badge\" id=\"heroBadge\"><\/div>\n  <h1 id=\"heroTitle\"><\/h1>\n  <p id=\"heroSubtitle\"><\/p>\n<\/div>\n\n<div class=\"main-container\">\n  <div class=\"tabs\">\n    <button class=\"tab-btn active\" id=\"tabFormBtn\" onclick=\"switchTab('form')\"><\/button>\n  <\/div>\n\n  <!-- ===== FORMULAR ===== -->\n  <div class=\"tab-panel active\" id=\"tab-form\">\n    <form id=\"newsletterForm\" novalidate>\n\n      <!-- STAMMDATEN -->\n      <div class=\"card\">\n        <div class=\"card-title\"><div class=\"icon\">\ud83d\udc64<\/div><span id=\"lbl_stammdaten\"><\/span><\/div>\n        <div class=\"contact-type-toggle\">\n          <button type=\"button\" class=\"type-btn\" id=\"btnFirma\" onclick=\"setType('firma')\">\ud83c\udfe2 <span id=\"lbl_firma\"><\/span><\/button>\n          <button type=\"button\" class=\"type-btn active\" id=\"btnPrivat\" onclick=\"setType('privat')\">\ud83d\udc64 <span id=\"lbl_privat\"><\/span><\/button>\n        <\/div>\n        <div class=\"form-grid\">\n          <!-- Anrede -->\n          <div class=\"form-group full\" id=\"grp_salutation\">\n            <label for=\"salutation\"><span id=\"lbl_anrede\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <select id=\"salutation\"><\/select>\n            <span class=\"field-error\" id=\"err_salutation\"><\/span>\n          <\/div>\n          <!-- Privat -->\n          <div class=\"form-group privat-field\" id=\"grp_title\">\n            <label for=\"title\"><span id=\"lbl_titel\"><\/span> <span class=\"opt\" id=\"lbl_opt_t\"><\/span><\/label>\n            <select id=\"title\"><\/select>\n          <\/div>\n          <div class=\"form-group privat-field\" id=\"grp_vorname\">\n            <label for=\"name_2_p\"><span id=\"lbl_vorname\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"text\" id=\"name_2_p\">\n            <span class=\"field-error\" id=\"err_name_2_p\"><\/span>\n          <\/div>\n          <div class=\"form-group privat-field\" id=\"grp_nachname\">\n            <label for=\"name_1_p\"><span id=\"lbl_nachname\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"text\" id=\"name_1_p\">\n            <span class=\"field-error\" id=\"err_name_1_p\"><\/span>\n          <\/div>\n          <!-- Firma -->\n          <div class=\"form-group full firma-field hidden\" id=\"grp_firma\">\n            <label for=\"name_1_f\"><span id=\"lbl_firmaname\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"text\" id=\"name_1_f\">\n            <span class=\"field-error\" id=\"err_name_1_f\"><\/span>\n          <\/div>\n          <div class=\"form-group full firma-field hidden\" id=\"grp_firmenzusatz\">\n            <label for=\"name_2_f\"><span id=\"lbl_firmenzusatz\"><\/span> <span class=\"opt\" id=\"lbl_opt_fz\"><\/span><\/label>\n            <input type=\"text\" id=\"name_2_f\">\n          <\/div>\n          <!-- Branche (vorbereitet, hidden) -->\n          <div class=\"form-group full\" id=\"grp_branche\">\n            <label for=\"branche\"><span id=\"lbl_branche\"><\/span> <span class=\"opt\" id=\"lbl_opt_br\"><\/span><\/label>\n            <select id=\"branche\"><option value=\"\"><\/option><\/select>\n            <span class=\"field-error\" id=\"err_branche\"><\/span>\n          <\/div>\n\n          <!-- ADRESSE -->\n          <div class=\"section-label\" id=\"lbl_adresse_section\"><\/div>\n          <div class=\"form-group full\" id=\"grp_land\">\n            <label for=\"country_id\"><span id=\"lbl_land\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <select id=\"country_id\" onchange=\"onCountryChange()\"><option value=\"1\">Schweiz<\/option><\/select>\n            <span class=\"field-error\" id=\"err_country_id\"><\/span>\n          <\/div>\n          <div class=\"form-group full\" id=\"grp_strasse\">\n            <label><span id=\"lbl_strasse\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <div class=\"addr-row\">\n              <input type=\"text\" id=\"address\" oninput=\"clearErr('address')\">\n              <input type=\"text\" id=\"address_nr\">\n            <\/div>\n            <span class=\"field-error\" id=\"err_address\"><\/span>\n          <\/div>\n          <div class=\"form-group full\" id=\"grp_adresszusatz\">\n            <label for=\"address2\"><span id=\"lbl_adresszusatz\"><\/span> <span class=\"opt\" id=\"lbl_opt_az\"><\/span><\/label>\n            <input type=\"text\" id=\"address2\">\n          <\/div>\n          <div class=\"form-group\" id=\"grp_plz\">\n            <label for=\"postcode\"><span id=\"lbl_plz\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"text\" id=\"postcode\" oninput=\"clearErr('postcode')\">\n            <span class=\"field-error\" id=\"err_postcode\"><\/span>\n          <\/div>\n          <div class=\"form-group\" id=\"grp_ort\">\n            <label for=\"city\"><span id=\"lbl_ort\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"text\" id=\"city\" oninput=\"clearErr('city')\">\n            <span class=\"field-error\" id=\"err_city\"><\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- KOMMUNIKATION -->\n      <div class=\"card\">\n        <div class=\"card-title\"><div class=\"icon\">\ud83d\udcde<\/div><span id=\"lbl_kommunikation\"><\/span><\/div>\n        <div class=\"form-grid\">\n          <div class=\"form-group\" id=\"grp_mail\">\n            <label for=\"mail\"><span id=\"lbl_email\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <input type=\"email\" id=\"mail\" oninput=\"clearErr('mail')\">\n            <span class=\"field-error\" id=\"err_mail\"><\/span>\n          <\/div>\n          <div class=\"form-group\" id=\"grp_mail2\">\n            <label for=\"mail_second\"><span id=\"lbl_email2\"><\/span> <span class=\"opt\" id=\"lbl_opt_m2\"><\/span><\/label>\n            <input type=\"email\" id=\"mail_second\">\n          <\/div>\n          <div class=\"form-group\" id=\"grp_tel\">\n            <label for=\"phone_fixed\"><span id=\"lbl_telefon\"><\/span> <span class=\"opt\" id=\"lbl_opt_tel\"><\/span><\/label>\n            <input type=\"tel\" id=\"phone_fixed\" oninput=\"clearErr('phone_fixed')\">\n            <span class=\"phone-hint\" id=\"hint_phone_fixed\"><\/span>\n            <span class=\"field-error\" id=\"err_phone_fixed\"><\/span>\n          <\/div>\n          <div class=\"form-group\" id=\"grp_tel2\">\n            <label for=\"phone_fixed_second\"><span id=\"lbl_telefon2\"><\/span> <span class=\"opt\" id=\"lbl_opt_tel2\"><\/span><\/label>\n            <input type=\"tel\" id=\"phone_fixed_second\">\n          <\/div>\n          <div class=\"form-group\" id=\"grp_mobile\">\n            <label for=\"phone_mobile\"><span id=\"lbl_mobile\"><\/span> <span class=\"opt\" id=\"lbl_opt_mob\"><\/span><\/label>\n            <input type=\"tel\" id=\"phone_mobile\" oninput=\"clearErr('phone_mobile')\">\n            <span class=\"phone-hint\" id=\"hint_phone_mobile\"><\/span>\n            <span class=\"field-error\" id=\"err_phone_mobile\"><\/span>\n          <\/div>\n          <div class=\"form-group\" id=\"grp_fax\">\n            <label for=\"fax\"><span id=\"lbl_fax\"><\/span> <span class=\"opt\" id=\"lbl_opt_fax\"><\/span><\/label>\n            <input type=\"tel\" id=\"fax\">\n          <\/div>\n          <div class=\"form-group\" id=\"grp_url\">\n            <label for=\"url\"><span id=\"lbl_website\"><\/span> <span class=\"opt\" id=\"lbl_opt_web\"><\/span><\/label>\n            <input type=\"url\" id=\"url\" placeholder=\"https:\/\/\u2026\">\n          <\/div>\n          <div class=\"form-group\" id=\"grp_skype\">\n            <label for=\"skype_name\"><span id=\"lbl_skype\"><\/span> <span class=\"opt\" id=\"lbl_opt_sky\"><\/span><\/label>\n            <input type=\"text\" id=\"skype_name\">\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- ZUSATZ -->\n      <div class=\"card\">\n        <div class=\"card-title\"><div class=\"icon\">\u2139\ufe0f<\/div><span id=\"lbl_zusatz\"><\/span><\/div>\n        <div class=\"form-grid\">\n          <div class=\"form-group\" id=\"grp_korrespondenz\">\n            <label for=\"korrespondenz\"><span id=\"lbl_korrespondenz\"><\/span> <span class=\"opt\" id=\"lbl_opt_ko\"><\/span><\/label>\n            <select id=\"korrespondenz\">\n              <option value=\"\" id=\"opt_bitte_waehlen\"><\/option>\n              <option value=\"1\" id=\"opt_mail_k\"><\/option>\n              <option value=\"2\" id=\"opt_post_k\"><\/option>\n            <\/select>\n          <\/div>\n          <div class=\"form-group\" id=\"grp_sprache\">\n            <label for=\"sprache\"><span id=\"lbl_sprache\"><\/span> <span class=\"req\">*<\/span><\/label>\n            <select id=\"sprache\">\n              <option value=\"\" id=\"opt_bitte_waehlen2\"><\/option>\n              <option value=\"1\" id=\"opt_deutsch\"><\/option>\n              <option value=\"2\" id=\"opt_franzoesisch\"><\/option>\n              <option value=\"3\" id=\"opt_italienisch\"><\/option>\n              <option value=\"4\" id=\"opt_englisch\"><\/option>\n            <\/select>\n            <span class=\"field-error\" id=\"err_sprache\"><\/span>\n          <\/div>\n          <div class=\"form-group full\" id=\"grp_remarks\">\n            <label for=\"remarks\"><span id=\"lbl_bemerkungen\"><\/span> <span class=\"opt\" id=\"lbl_opt_rem\"><\/span><\/label>\n            <textarea id=\"remarks\"><\/textarea>\n            <span class=\"phone-hint\" id=\"hint_remarks\"><\/span>\n          <\/div>\n          <div class=\"form-group firma-field hidden\" id=\"grp_employees\">\n            <label for=\"employees\"><span id=\"lbl_mitarbeitende\"><\/span> <span class=\"opt\" id=\"lbl_opt_em\"><\/span><\/label>\n            <input type=\"number\" id=\"employees\" min=\"0\">\n          <\/div>\n          <div class=\"form-group firma-field hidden\" id=\"grp_handelsreg\">\n            <label for=\"trade_register_number\"><span id=\"lbl_handelsreg\"><\/span> <span class=\"opt\" id=\"lbl_opt_hr\"><\/span><\/label>\n            <input type=\"text\" id=\"trade_register_number\">\n          <\/div>\n          <div class=\"form-group firma-field hidden\" id=\"grp_mwst\">\n            <label for=\"vat_uid\"><span id=\"lbl_mwst\"><\/span> <span class=\"opt\" id=\"lbl_opt_mw\"><\/span><\/label>\n            <input type=\"text\" id=\"vat_uid\">\n          <\/div>\n          <div class=\"form-group firma-field hidden\" id=\"grp_ust\">\n            <label for=\"vat_uid_eu\"><span id=\"lbl_ust\"><\/span> <span class=\"opt\" id=\"lbl_opt_ust\"><\/span><\/label>\n            <input type=\"text\" id=\"vat_uid_eu\">\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- KATEGORIEN -->\n      <div class=\"card\" id=\"catCard\">\n        <div class=\"card-title\"><div class=\"icon\">\ud83c\udff7\ufe0f<\/div><span id=\"lbl_kategorien\"><\/span><\/div>\n        <p class=\"card-subtitle\" id=\"lbl_kategorien_sub\"><\/p>\n        <div class=\"categories-grid\" id=\"categoriesGrid\">\n          <div class=\"notice info\" id=\"catNoTokenMsg\"><\/div>\n        <\/div>\n      <\/div>\n\n      <!-- SUBMIT -->\n      <div class=\"card\">\n        <button type=\"submit\" class=\"btn-primary\" id=\"submitBtn\">\n          <span id=\"btnText\"><\/span>\n          <div class=\"spinner\" id=\"btnSpinner\"><\/div>\n        <\/button>\n        <div id=\"statusMsg\" class=\"status-message\"><\/div>\n        <p class=\"privacy-note\" id=\"privacyNote\"><\/p>\n      <\/div>\n    <\/form>\n  <\/div>\n\n<\/div>\n\n<script>\n\/\/ ============================================================\n\/\/ \u00dcBERSETZUNGEN\n\/\/ ============================================================\nconst DEFAULT_TEXTS = {\n  de: {\n    \/\/ Hero\n    heroBadge: 'Newsletter',\n    heroTitle: 'Bleiben Sie informiert',\n    heroSubtitle: 'Aktuelle Neuigkeiten zu unseren Projekten und Erkenntnissen aus der nachhaltigen Landwirtschaft.',\n    tagline: 'vorsorgen um zu versorgen',\n    \/\/ Tabs\n    tabForm: '\ud83d\udccb Anmeldung',\n    tabAdmin: '\u2699\ufe0f Konfiguration',\n    \/\/ Karten-Titel\n    stammdaten: 'Stammdaten',\n    kommunikation: 'Kommunikation',\n    zusatz: 'Zusatzinformationen',\n    kategorien: 'Ich interessiere mich f\u00fcr\u2026',\n    kategorienSub: 'W\u00e4hlen Sie die Themen aus, die Sie interessieren.',\n    \/\/ Kontakttyp\n    firma: 'Firma',\n    privat: 'Privat',\n    \/\/ Labels\n    anrede: 'Anrede',\n    titel: 'Titel',\n    vorname: 'Vorname',\n    nachname: 'Nachname',\n    firmaname: 'Firma',\n    firmenzusatz: 'Firmennamen-Zusatz',\n    branche: 'Branche',\n    adresseSection: 'Adresse',\n    land: 'Land',\n    strasse: 'Strasse & Haus-Nr.',\n    adresszusatz: 'Adresszusatz',\n    plz: 'PLZ',\n    ort: 'Ort',\n    email: 'E-Mail',\n    email2: 'E-Mail 2',\n    telefon: 'Telefon',\n    telefon2: 'Telefon 2',\n    mobile: 'Mobile',\n    fax: 'Fax',\n    website: 'Website',\n    skype: 'Skype',\n    korrespondenz: 'Korrespondenzweg',\n    sprache: 'Sprache',\n    bemerkungen: 'Bemerkungen',\n    mitarbeitende: 'Anzahl Mitarbeitende',\n    handelsreg: 'Handelsregister-Nr.',\n    mwst: 'MWST-Nummer',\n    ust: 'USt-Identifikationsnummer',\n    \/\/ Optionaltexte\n    optional: '(optional)',\n    \/\/ Platzhalter\n    ph_vorname: 'Vorname',\n    ph_nachname: 'Nachname',\n    ph_firma: 'Firmenname',\n    ph_firmenzusatz: 'Abteilung, Zusatz\u2026',\n    ph_strasse: 'Strasse',\n    ph_nr: 'Nr.',\n    ph_adresszusatz: 'c\/o, Postfach\u2026',\n    ph_plz: '3000',\n    ph_ort: 'Bern',\n    ph_email: 'name@beispiel.ch',\n    ph_email2: 'alternativ@beispiel.ch',\n    ph_tel: 'z.B. +41 31 123 45 67',\n    ph_mobile: 'z.B. +41 79 123 45 67',\n    ph_website: 'https:\/\/\u2026',\n    ph_skype: 'Skype-Name',\n    ph_handelsreg: 'CHE-\u2026',\n    ph_mwst: 'CHE-000.000.000 MWST',\n    ph_ust: 'DE000000000',\n    ph_mitarbeitende: 'z.B. 10',\n    \/\/ Bemerkungen-Hinweis\n    bemerkungsHinweis: 'Bemerkungen zum Kontakt. F\u00fcr Nachrichten nutzen Sie bitte unser Kontaktformular oder schreiben Sie an info@providebit.org.',\n    \/\/ Anrede-Optionen\n    anredeOpt0: '--',\n    anredeOpt1: 'Herr',\n    anredeOpt2: 'Frau',\n    anredeOpt3: 'Familie',\n    anredeOpt4: 'Herr & Frau',\n    \/\/ Titel-Optionen\n    titelOpt0: '\u2013 kein \u2013',\n    titelOpt1: 'Dr.',\n    titelOpt2: 'Prof.',\n    titelOpt3: 'Prof. Dr.',\n    \/\/ Korrespondenz-Optionen\n    bitteWaehlen: '\u2013 bitte w\u00e4hlen \u2013',\n    optMail: 'Mail',\n    optPost: 'Post',\n    \/\/ Sprach-Optionen\n    optDeutsch: 'Deutsch',\n    optFranzoesisch: 'Franz\u00f6sisch',\n    optItalienisch: 'Italienisch',\n    optEnglisch: 'Englisch',\n    \/\/ Button\n    submitBtn: 'Newsletter abonnieren',\n    submitting: 'Wird \u00fcbermittelt\u2026',\n    \/\/ Datenschutz\n    privacyText: 'Mit der Anmeldung stimmen Sie der Verarbeitung Ihrer Daten gem\u00e4ss unserer',\n    privacyLink: 'Datenschutzrichtlinie',\n    privacyLink2: 'zu. Sie k\u00f6nnen sich jederzeit abmelden.',\n    \/\/ Erfolg\/Fehler\n    successMsg: '\ud83c\udf89 Vielen Dank, {name}! Ihre Anmeldung war erfolgreich.',\n    \/\/ Fehlermeldungen\n    errRequired: 'Dieses Feld ist erforderlich.',\n    errEmail: 'Bitte g\u00fcltige E-Mail-Adresse eingeben.',\n    errEmailDisposable: 'Bitte eine g\u00fcltige, permanente E-Mail-Adresse verwenden.',\n    errPhone: 'Ung\u00fcltiges Format. Bitte mit L\u00e4ndervorwahl eingeben (z.B. +41 79 123 45 67).',\n    \/\/ Kat-Hinweis ohne Token\n    catNoToken: 'Kategorien werden geladen sobald der API-Token hinterlegt ist.',\n    \/\/ Telefon-Hinweis\n    phoneHint: 'Format: +{prefix} XXX XXX XX XX',\n  },\n  fr: {\n    heroBadge: 'Newsletter',\n    heroTitle: 'Restez inform\u00e9',\n    heroSubtitle: 'Actualit\u00e9s de nos projets et insights sur l\\u2019agriculture durable.',\n    tagline: 'pr\u00e9voir pour pourvoir',\n    tabForm: '\ud83d\udccb Inscription',\n    tabAdmin: '\u2699\ufe0f Configuration',\n    stammdaten: 'Donn\u00e9es de base',\n    kommunikation: 'Communication',\n    zusatz: 'Informations compl\u00e9mentaires',\n    kategorien: 'Je m\\u2019int\u00e9resse \u00e0\u2026',\n    kategorienSub: 'S\u00e9lectionnez les th\u00e8mes qui vous int\u00e9ressent.',\n    firma: 'Entreprise',\n    privat: 'Priv\u00e9',\n    anrede: 'Civilit\u00e9',\n    titel: 'Titre',\n    vorname: 'Pr\u00e9nom',\n    nachname: 'Nom',\n    firmaname: 'Entreprise',\n    firmenzusatz: 'Compl\u00e9ment de raison sociale',\n    branche: 'Secteur',\n    adresseSection: 'Adresse',\n    land: 'Pays',\n    strasse: 'Rue & n\u00b0',\n    adresszusatz: 'Compl\u00e9ment d\\u2019adresse',\n    plz: 'NPA',\n    ort: 'Localit\u00e9',\n    email: 'E-mail',\n    email2: 'E-mail 2',\n    telefon: 'T\u00e9l\u00e9phone',\n    telefon2: 'T\u00e9l\u00e9phone 2',\n    mobile: 'Mobile',\n    fax: 'Fax',\n    website: 'Site web',\n    skype: 'Skype',\n    korrespondenz: 'Mode de correspondance',\n    sprache: 'Langue',\n    bemerkungen: 'Remarques',\n    mitarbeitende: 'Nombre d\\u2019employ\u00e9s',\n    handelsreg: 'N\u00b0 registre du commerce',\n    mwst: 'N\u00b0 TVA',\n    ust: 'N\u00b0 identification TVA',\n    optional: '(facultatif)',\n    ph_vorname: 'Pr\u00e9nom',\n    ph_nachname: 'Nom',\n    ph_firma: 'Nom de l\\u2019entreprise',\n    ph_firmenzusatz: 'D\u00e9partement, compl\u00e9ment\u2026',\n    ph_strasse: 'Rue',\n    ph_nr: 'N\u00b0',\n    ph_adresszusatz: 'c\/o, case postale\u2026',\n    ph_plz: '1200',\n    ph_ort: 'Gen\u00e8ve',\n    ph_email: 'nom@exemple.ch',\n    ph_email2: 'alternative@exemple.ch',\n    ph_tel: 'p.ex. +41 22 123 45 67',\n    ph_mobile: 'p.ex. +41 79 123 45 67',\n    ph_website: 'https:\/\/\u2026',\n    ph_skype: 'Nom Skype',\n    ph_handelsreg: 'CHE-\u2026',\n    ph_mwst: 'CHE-000.000.000 TVA',\n    ph_ust: 'FR000000000',\n    ph_mitarbeitende: 'p.ex. 10',\n    bemerkungsHinweis: 'Remarques concernant le contact. Pour les messages, utilisez notre formulaire de contact ou \u00e9crivez \u00e0 info@providebit.org.',\n    anredeOpt0: '--',\n    anredeOpt1: 'M.',\n    anredeOpt2: 'Mme',\n    anredeOpt3: 'Famille',\n    anredeOpt4: 'M. & Mme',\n    titelOpt0: '\u2013 aucun \u2013',\n    titelOpt1: 'Dr',\n    titelOpt2: 'Prof.',\n    titelOpt3: 'Prof. Dr',\n    bitteWaehlen: '\u2013 veuillez choisir \u2013',\n    optMail: 'E-mail',\n    optPost: 'Courrier',\n    optDeutsch: 'Allemand',\n    optFranzoesisch: 'Fran\u00e7ais',\n    optItalienisch: 'Italien',\n    optEnglisch: 'Anglais',\n    submitBtn: 'S\\u2019abonner \u00e0 la newsletter',\n    submitting: 'Envoi en cours\u2026',\n    privacyText: 'En vous inscrivant, vous consentez au traitement de vos donn\u00e9es conform\u00e9ment \u00e0 notre',\n    privacyLink: 'politique de confidentialit\u00e9',\n    privacyLink2: 'Vous pouvez vous d\u00e9sabonner \u00e0 tout moment.',\n    successMsg: '\ud83c\udf89 Merci, {name}! Votre inscription a \u00e9t\u00e9 effectu\u00e9e avec succ\u00e8s.',\n    errRequired: 'Ce champ est obligatoire.',\n    errEmail: 'Veuillez saisir une adresse e-mail valide.',\n    errEmailDisposable: 'Veuillez utiliser une adresse e-mail permanente valide.',\n    errPhone: 'Format invalide. Veuillez saisir avec l\\u2019indicatif pays (p.ex. +41 79 123 45 67).',\n    catNoToken: 'Les cat\u00e9gories seront charg\u00e9es une fois le jeton API configur\u00e9.',\n    phoneHint: 'Format : +{prefix} XXX XXX XX XX',\n  }\n};\n\n\/\/ ============================================================\n\/\/ KONFIGURATION\n\/\/ ============================================================\nlet lang = 'de';\nlet texts = JSON.parse(JSON.stringify(DEFAULT_TEXTS)); \/\/ editierbare Kopie\n\nlet cfg = {\n  apiToken: '',\n  contactType: 'privat',\n  hiddenFields: ['grp_title','grp_mail2','grp_adresszusatz','grp_fax',\n                 'grp_skype','grp_tel2','grp_korrespondenz',\n                 'grp_branche','grp_employees','grp_handelsreg','grp_mwst','grp_ust'],\n  \/\/ Hardcoded Kategorien \u2013 sichtbare Auswahl f\u00fcr Besucher\n  categories: [\n    {id:4,  bexioName:'F4H',        de:'Food4Hope',          fr:'Food4Hope',            emoji:'\ud83d\udce6', visible:true},\n    {id:5,  bexioName:'Verwurzelt', de:'verwurzelt\u00ae',        fr:'enracin\u00e9\u00ae',            emoji:'\ud83c\udf3f', visible:true},\n    {id:13, bexioName:'Providebit', de:'Stiftung Providebit', fr:'Fondation Providebit', emoji:'\ud83c\udfdb\ufe0f', visible:true},\n  ],\n  \/\/ Hardcoded L\u00e4nderliste \u2013 Schweiz zuerst, dann alphabetisch\n  countries: [\n    {id:1,   name:'Schweiz'},\n    {id:3,   name:'Deutschland'},\n    {id:7,   name:'\u00d6sterreich'},\n    {id:76,  name:'Frankreich'},\n    {id:106, name:'Italien'},\n    {id:209, name:'Liechtenstein'},\n    {id:4,   name:'USA'},\n    {id:5,   name:'Vereinigtes K\u00f6nigreich'},\n    {id:6,   name:'Australien'},\n    {id:8,   name:'Belgien'},\n    {id:9,   name:'Brasilien'},\n    {id:10,  name:'Bulgarien'},\n    {id:11,  name:'Chile'},\n    {id:12,  name:'China'},\n    {id:13,  name:'D\u00e4nemark'},\n    {id:15,  name:'Estland'},\n    {id:16,  name:'Finnland'},\n    {id:17,  name:'Griechenland'},\n    {id:18,  name:'Indien'},\n    {id:19,  name:'Indonesien'},\n    {id:20,  name:'Irland'},\n    {id:21,  name:'Israel'},\n    {id:22,  name:'Japan'},\n    {id:23,  name:'Kanada'},\n    {id:24,  name:'Kroatien'},\n    {id:25,  name:'Lettland'},\n    {id:26,  name:'Litauen'},\n    {id:27,  name:'Luxemburg'},\n    {id:28,  name:'Malta'},\n    {id:29,  name:'Mexiko'},\n    {id:30,  name:'Niederlande'},\n    {id:31,  name:'Neuseeland'},\n    {id:32,  name:'Norwegen'},\n    {id:33,  name:'Polen'},\n    {id:34,  name:'Portugal'},\n    {id:35,  name:'Rum\u00e4nien'},\n    {id:36,  name:'Russland'},\n    {id:37,  name:'Schweden'},\n    {id:38,  name:'Serbien'},\n    {id:39,  name:'Singapur'},\n    {id:40,  name:'Slowakei'},\n    {id:41,  name:'Slowenien'},\n    {id:42,  name:'Spanien'},\n    {id:43,  name:'S\u00fcdafrika'},\n    {id:44,  name:'S\u00fcdkorea'},\n    {id:45,  name:'Tschechien'},\n    {id:46,  name:'T\u00fcrkei'},\n    {id:47,  name:'Ukraine'},\n    {id:48,  name:'Ungarn'},\n  ],\n  branches: []\n};\n\n\/\/ Kategorie-Defaults (Bexio-Name \u2192 Einstellungen)\nconst CAT_DEFAULTS = {\n  'E414':                         {emoji:'\u2699\ufe0f', de:'E414',                              fr:'E414',                               visible:false},\n  'Ex-FforH':                     {emoji:'\ud83d\udd04', de:'Ex-Food4Hope',                      fr:'Ex-Food4Hope',                       visible:false},\n  'F4H':                          {emoji:'\ud83d\udce6', de:'Food4Hope',                         fr:'Food4Hope',                          visible:true},\n  'F4H Abo':                      {emoji:'\ud83c\udf3e', de:'Food4Hope Abo',                     fr:'Food4Hope Abonnement',               visible:true},\n  'F4H Kunden':                   {emoji:'\ud83d\udc65', de:'Food4Hope Kunden',                  fr:'Food4Hope Clients',                  visible:false},\n  'F4H Weizen':                   {emoji:'\ud83c\udf3e', de:'Food4Hope Weizen',                  fr:'Food4Hope Bl\u00e9',                     visible:true},\n  'Partner':                      {emoji:'\ud83e\udd1d', de:'Partner',                           fr:'Partenaires',                        visible:true},\n  'Lieferanten':                  {emoji:'\ud83d\ude9a', de:'Lieferanten',                       fr:'Fournisseurs',                       visible:false},\n  'netpoint':                     {emoji:'\ud83c\udf10', de:'netpoint',                          fr:'netpoint',                           visible:false},\n  'Providebit':                   {emoji:'\ud83c\udfdb\ufe0f', de:'Stiftung Providebit',               fr:'Fondation Providebit',               visible:true},\n  'Rahmenvertrag':                {emoji:'\ud83d\udcc4', de:'Rahmenvertrag',                     fr:'Contrat-cadre',                      visible:false},\n  'Reserve':                      {emoji:'\ud83d\udcbc', de:'Reserve',                           fr:'R\u00e9serve',                            visible:false},\n  'S4H':                         {emoji:'\ud83d\udd35', de:'S4H',                               fr:'S4H',                                visible:false},\n  'Stiftungsrat':                 {emoji:'\ud83d\udc54', de:'Stiftungsrat',                      fr:'Conseil de fondation',               visible:false},\n  'vere_partner':                 {emoji:'\ud83c\udf3f', de:'verwurzelt\u00ae Partner',               fr:'enracin\u00e9\u00ae Partenaires',             visible:true},\n  'vere_produzenten':             {emoji:'\ud83c\udf31', de:'verwurzelt\u00ae Produzenten',           fr:'enracin\u00e9\u00ae Producteurs',             visible:true},\n  'vere_supporter':               {emoji:'\ud83d\udc9b', de:'verwurzelt\u00ae Supporter',             fr:'enracin\u00e9\u00ae Supporter',               visible:true},\n  'vere_supporter_20':            {emoji:'\ud83d\udcb0', de:'verwurzelt\u00ae Supporter 20',          fr:'enracin\u00e9\u00ae Supporter 20',            visible:false},\n  'vere_supporter_5':             {emoji:'\ud83d\udcb0', de:'verwurzelt\u00ae Supporter 5',           fr:'enracin\u00e9\u00ae Supporter 5',             visible:false},\n  'vere_verarbeiter und h\u00e4ndler': {emoji:'\ud83d\uded2', de:'verwurzelt\u00ae Verarbeiter & H\u00e4ndler', fr:'enracin\u00e9\u00ae Transformateurs & N\u00e9goce',visible:true},\n  'Verwurzelt':                   {emoji:'\ud83c\udf3f', de:'verwurzelt\u00ae',                       fr:'enracin\u00e9\u00ae',                         visible:false},\n  'Wettbewerb':                   {emoji:'\ud83c\udfc6', de:'Wettbewerb',                        fr:'Concours',                           visible:true},\n};\n\n\/\/ Telefon-Prefixes & Formate (land_id \u2192 {prefix, hint})\nconst PHONE_FORMATS = {\n  1:   {prefix:'41',  hint:'+41 XX XXX XX XX'},   \/\/ Schweiz\n  3:   {prefix:'49',  hint:'+49 XXX XXXXXXXX'},    \/\/ Deutschland\n  7:   {prefix:'43',  hint:'+43 XXX XXXXXXXX'},    \/\/ \u00d6sterreich\n  76:  {prefix:'33',  hint:'+33 X XX XX XX XX'},   \/\/ Frankreich\n  106: {prefix:'39',  hint:'+39 XXX XXXXXXX'},     \/\/ Italien\n  4:   {prefix:'1',   hint:'+1 XXX XXX XXXX'},     \/\/ USA\n  5:   {prefix:'44',  hint:'+44 XXXX XXXXXX'},     \/\/ UK\n};\nconst DEFAULT_PHONE = {prefix:'', hint:'+XX XXX XXX XX XX'};\n\n\/\/ Wegwerf-Mail-Domains\nconst DISPOSABLE_DOMAINS = new Set([\n  'mailinator.com','guerrillamail.com','guerrillamail.net','guerrillamail.org','guerrillamail.biz','guerrillamail.de',\n  'guerrillamail.info','tempmail.com','throwaway.email','yopmail.com','sharklasers.com','spam4.me',\n  'trashmail.com','trashmail.at','trashmail.me','trashmail.net','dispostable.com','spamgourmet.com',\n  'spamgourmet.net','mailnull.com','tempr.email','getairmail.com','filzmail.com','spamex.com',\n  'temp-mail.org','fakeinbox.com','maildrop.cc','spamfree24.org','crap.email','spamcorpse.com',\n  'binkmail.com','spamavert.com','spambeater.com','dontsendmeemail.com','spamcon.org',\n  'tempemail.co','tempinbox.com','discard.email','throwam.com','nospam.ze.tc'\n]);\n\n\/\/ Konfigurierbare Felder\nconst FIELDS = [\n  {id:'grp_salutation',  label:'Anrede',              required:true,  firmaOnly:false},\n  {id:'grp_title',       label:'Titel',               required:false, firmaOnly:false},\n  {id:'grp_vorname',     label:'Vorname',             required:true,  firmaOnly:false},\n  {id:'grp_nachname',    label:'Nachname',            required:true,  firmaOnly:false},\n  {id:'grp_firma',       label:'Firmaname',           required:true,  firmaOnly:true},\n  {id:'grp_firmenzusatz',label:'Firmennamen-Zusatz',  required:false, firmaOnly:true},\n  {id:'grp_branche',     label:'Branche',             required:false, firmaOnly:false},\n  {id:'grp_land',        label:'Land',                required:true,  firmaOnly:false},\n  {id:'grp_strasse',     label:'Strasse & Haus-Nr.',  required:true,  firmaOnly:false},\n  {id:'grp_adresszusatz',label:'Adresszusatz',        required:false, firmaOnly:false},\n  {id:'grp_plz',         label:'PLZ',                 required:true,  firmaOnly:false},\n  {id:'grp_ort',         label:'Ort',                 required:true,  firmaOnly:false},\n  {id:'grp_mail',        label:'E-Mail',              required:true,  firmaOnly:false},\n  {id:'grp_mail2',       label:'E-Mail 2',            required:false, firmaOnly:false},\n  {id:'grp_tel',         label:'Telefon',             required:false, firmaOnly:false},\n  {id:'grp_tel2',        label:'Telefon 2',           required:false, firmaOnly:false},\n  {id:'grp_mobile',      label:'Mobile',              required:false, firmaOnly:false},\n  {id:'grp_fax',         label:'Fax',                 required:false, firmaOnly:false},\n  {id:'grp_url',         label:'Website',             required:false, firmaOnly:false},\n  {id:'grp_skype',       label:'Skype',               required:false, firmaOnly:false},\n  {id:'grp_korrespondenz',label:'Korrespondenzweg',   required:false, firmaOnly:false},\n  {id:'grp_sprache',     label:'Sprache',             required:true,  firmaOnly:false},\n  {id:'grp_remarks',     label:'Bemerkungen',         required:false, firmaOnly:false},\n  {id:'grp_employees',   label:'Anzahl Mitarbeitende',required:false, firmaOnly:true},\n  {id:'grp_handelsreg',  label:'Handelsregister-Nr.', required:false, firmaOnly:true},\n  {id:'grp_mwst',        label:'MWST-Nummer',         required:false, firmaOnly:true},\n  {id:'grp_ust',         label:'USt-ID',              required:false, firmaOnly:true},\n];\n\n\/\/ ============================================================\n\/\/ SPRACHE\n\/\/ ============================================================\nfunction detectLang() {\n  \/\/ WordPress setzt html[lang] \u2013 z.B. \"de-CH\" oder \"fr-FR\"\n  const htmlLang = (document.documentElement.lang || '').toLowerCase();\n  if (htmlLang.startsWith('fr')) return 'fr';\n  \/\/ Alternativ window.providebitLang kann von WP gesetzt werden\n  if (window.providebitLang) return window.providebitLang.startsWith('fr') ? 'fr' : 'de';\n  return 'de';\n}\n\nfunction setLang(l) {\n  lang = l;\n  document.getElementById('langDE').classList.toggle('active', l === 'de');\n  document.getElementById('langFR').classList.toggle('active', l === 'fr');\n  applyTexts();\n}\n\nfunction t(key) { return texts[lang]?.[key] || texts['de'][key] || key; }\n\nfunction applyTexts() {\n  const T = key => t(key);\n  \/\/ Header\n  setText('hTagline', T('tagline'));\n  \/\/ Hero\n  document.getElementById('heroBadge').textContent = T('heroBadge');\n  document.getElementById('heroTitle').textContent = T('heroTitle');\n  document.getElementById('heroSubtitle').textContent = T('heroSubtitle');\n  \/\/ Tabs\n  document.getElementById('tabFormBtn').textContent = T('tabForm');\n  const adminBtn = document.getElementById('tabAdminBtn');\n  if(adminBtn) adminBtn.textContent = T('tabAdmin');\n  \/\/ Karten-Titel\n  setText('lbl_stammdaten', T('stammdaten'));\n  setText('lbl_firma', T('firma'));\n  setText('lbl_privat', T('privat'));\n  setText('lbl_kommunikation', T('kommunikation'));\n  setText('lbl_zusatz', T('zusatz'));\n  setText('lbl_kategorien', T('kategorien'));\n  setText('lbl_kategorien_sub', T('kategorienSub'));\n  \/\/ Labels\n  const labels = {\n    lbl_anrede:'anrede', lbl_titel:'titel', lbl_vorname:'vorname', lbl_nachname:'nachname',\n    lbl_firmaname:'firmaname', lbl_firmenzusatz:'firmenzusatz', lbl_branche:'branche',\n    lbl_adresse_section:'adresseSection', lbl_land:'land', lbl_strasse:'strasse',\n    lbl_adresszusatz:'adresszusatz', lbl_plz:'plz', lbl_ort:'ort',\n    lbl_email:'email', lbl_email2:'email2', lbl_telefon:'telefon', lbl_telefon2:'telefon2',\n    lbl_mobile:'mobile', lbl_fax:'fax', lbl_website:'website', lbl_skype:'skype',\n    lbl_korrespondenz:'korrespondenz', lbl_sprache:'sprache', lbl_bemerkungen:'bemerkungen',\n    lbl_mitarbeitende:'mitarbeitende', lbl_handelsreg:'handelsreg', lbl_mwst:'mwst', lbl_ust:'ust',\n  };\n  Object.entries(labels).forEach(([id, key]) => setText(id, T(key)));\n\n  \/\/ Optional-Texte\n  ['lbl_opt_t','lbl_opt_fz','lbl_opt_br','lbl_opt_az','lbl_opt_m2','lbl_opt_tel','lbl_opt_tel2',\n   'lbl_opt_mob','lbl_opt_fax','lbl_opt_web','lbl_opt_sky','lbl_opt_ko','lbl_opt_sp','lbl_opt_rem',\n   'lbl_opt_em','lbl_opt_hr','lbl_opt_mw','lbl_opt_ust'].forEach(id => setText(id, T('optional')));\n\n  \/\/ Platzhalter\n  setPlaceholder('name_2_p', T('ph_vorname'));\n  setPlaceholder('name_1_p', T('ph_nachname'));\n  setPlaceholder('name_1_f', T('ph_firma'));\n  setPlaceholder('name_2_f', T('ph_firmenzusatz'));\n  setPlaceholder('address', T('ph_strasse'));\n  setPlaceholder('address_nr', T('ph_nr'));\n  setPlaceholder('address2', T('ph_adresszusatz'));\n  setPlaceholder('postcode', T('ph_plz'));\n  setPlaceholder('city', T('ph_ort'));\n  setPlaceholder('mail', T('ph_email'));\n  setPlaceholder('mail_second', T('ph_email2'));\n  setPlaceholder('phone_fixed', T('ph_tel'));\n  setPlaceholder('phone_mobile', T('ph_mobile'));\n  setPlaceholder('skype_name', T('ph_skype'));\n  setPlaceholder('trade_register_number', T('ph_handelsreg'));\n  setPlaceholder('vat_uid', T('ph_mwst'));\n  setPlaceholder('vat_uid_eu', T('ph_ust'));\n  setPlaceholder('employees', T('ph_mitarbeitende'));\n\n  \/\/ Anrede-Optionen\n  const sal = document.getElementById('salutation');\n  if (sal) {\n    sal.innerHTML = [\n      [0, T('anredeOpt0')],[1, T('anredeOpt1')],[2, T('anredeOpt2')],[3, T('anredeOpt3')],[4, T('anredeOpt4')]\n    ].map(([v,l]) => `<option value=\"${v}\">${l}<\/option>`).join('');\n  }\n  \/\/ Titel-Optionen\n  const tit = document.getElementById('title');\n  if (tit) {\n    tit.innerHTML = [\n      [0, T('titelOpt0')],[1, T('titelOpt1')],[2, T('titelOpt2')],[3, T('titelOpt3')]\n    ].map(([v,l]) => `<option value=\"${v}\">${l}<\/option>`).join('');\n  }\n  \/\/ Korrespondenz\n  setText('opt_bitte_waehlen', T('bitteWaehlen'));\n  setText('opt_bitte_waehlen2', T('bitteWaehlen'));\n  setText('opt_mail_k', T('optMail'));\n  setText('opt_post_k', T('optPost'));\n  setText('opt_deutsch', T('optDeutsch'));\n  setText('opt_franzoesisch', T('optFranzoesisch'));\n  setText('opt_italienisch', T('optItalienisch'));\n  setText('opt_englisch', T('optEnglisch'));\n\n  \/\/ Bemerkungshinweis\n  setText('hint_remarks', T('bemerkungsHinweis'));\n\n  \/\/ Telefon-Hinweise aktualisieren\n  updatePhoneHints();\n\n  \/\/ Submit-Button\n  setText('btnText', T('submitBtn'));\n\n  \/\/ Datenschutz\n  const pn = document.getElementById('privacyNote');\n  if (pn) pn.innerHTML = `${T('privacyText')} <a href=\"https:\/\/www.providebit.org\/\" target=\"_blank\">${T('privacyLink')}<\/a>. ${T('privacyLink2')}`;\n\n  \/\/ Kategorie-Karte\n  setText('catNoTokenMsg', T('catNoToken'));\n  if (cfg.categories.length) renderCategoriesForm();\n}\n\nfunction setText(id, val) { const el = document.getElementById(id); if (el) el.textContent = val; }\nfunction setPlaceholder(id, val) { const el = document.getElementById(id); if (el) el.placeholder = val; }\n\n\/\/ ============================================================\n\/\/ TELEFON-FORMAT\n\/\/ ============================================================\nfunction getPhoneFormat() {\n  const cid = parseInt(document.getElementById('country_id')?.value || '1');\n  return PHONE_FORMATS[cid] || DEFAULT_PHONE;\n}\n\nfunction updatePhoneHints() {\n  const fmt = getPhoneFormat();\n  const hint = t('phoneHint').replace('{prefix}', fmt.prefix || 'XX');\n  setText('hint_phone_fixed', fmt.hint ? `\ud83d\udcde ${fmt.hint}` : '');\n  setText('hint_phone_mobile', fmt.hint ? `\ud83d\udcf1 ${fmt.hint}` : '');\n  setPlaceholder('phone_fixed', fmt.hint || t('ph_tel'));\n  setPlaceholder('phone_mobile', fmt.hint || t('ph_mobile'));\n}\n\nfunction onCountryChange() { updatePhoneHints(); }\n\nfunction validatePhone(val) {\n  if (!val) return true; \/\/ optional\n  \/\/ Muss mit + beginnen und 7\u201315 Ziffern nach dem + haben\n  const digits = val.replace(\/[\\s\\-\\(\\)]\/g, '');\n  return \/^\\+[0-9]{7,15}$\/.test(digits);\n}\n\n\/\/ ============================================================\n\/\/ BEXIO DATEN LADEN\n\/\/ ============================================================\n\/\/ Proxy-Aufruf via WordPress REST API\nasync function bexioProxy(endpoint, method='GET', body=null) {\n  if (window.providebitAjax) {\n    const url  = window.providebitAjax.restUrl + '\/bexio\/' + endpoint;\n    const opts = {\n      method:  method,\n      headers: { 'X-WP-Nonce': window.providebitAjax.nonce, 'Accept': 'application\/json' },\n    };\n    if (method === 'POST' && body) {\n      opts.headers['Content-Type'] = 'application\/json';\n      opts.body = JSON.stringify(body);\n    }\n    const res = await fetch(url, opts);\n    if (!res.ok) {\n      const e = await res.json().catch(() => ({}));\n      throw new Error(e.message || 'HTTP ' + res.status);\n    }\n    return await res.json();\n  }\n  \/\/ Fallback: direkter Aufruf (nur lokale Vorschau)\n  const headers = {'Accept':'application\/json','Authorization':'Bearer '+cfg.apiToken};\n  const opts = {headers};\n  if (method==='POST' && body) { opts.method='POST'; opts.body=JSON.stringify(body); headers['Content-Type']='application\/json'; }\n  const res = await fetch('https:\/\/api.bexio.com\/2.0\/'+endpoint, opts);\n  if (!res.ok) { const e=await res.json().catch(()=>({})); throw new Error(e.message||'HTTP '+res.status); }\n  return await res.json();\n}\n\nasync function loadAllFromBexio() {\n  if (!window.providebitAjax) {\n    const token = document.getElementById('apiToken').value.trim();\n    if (!token) { showLoadStatus('warn','\u26a0\ufe0f Bitte zuerst den API-Token eingeben.'); return; }\n    cfg.apiToken = token;\n  }\n\n  const btn = document.getElementById('btnLoadAll');\n  const icon = document.getElementById('loadIcon');\n  const txt = document.getElementById('loadTxt');\n  btn.disabled = true;\n  icon.innerHTML = '<div class=\"spinner-sm\"><\/div>';\n  txt.textContent = 'Lade\u2026';\n  setApiStatus('loading','Verbinde\u2026');\n\n  try {\n    const [groups, countries] = await Promise.all([\n      bexioProxy('contact_group'),\n      bexioProxy('country'),\n    ]);\n    const branches = [];\n\n    \/\/ Kategorien\n    cfg.categories = groups.map(g => {\n      const d = CAT_DEFAULTS[g.name] || {};\n      return {id:g.id, bexioName:g.name, de:d.de||g.name, fr:d.fr||g.name, emoji:d.emoji||'\ud83c\udff7\ufe0f', visible:d.visible!==undefined?d.visible:true};\n    });\n\n    \/\/ L\u00e4nder \u2013 Schweiz zuerst, dann Rest alphabetisch\n    const ch = countries.find(c => c.name === 'Schweiz' || c.id === 1);\n    const rest = countries.filter(c => c.id !== (ch?.id||1)).sort((a,b) => a.name.localeCompare(b.name, 'de'));\n    cfg.countries = ch ? [ch, ...rest] : rest;\n\n    \/\/ Branchen\n    cfg.branches = branches;\n\n    \/\/ Land-Dropdown bef\u00fcllen\n    const sel = document.getElementById('country_id');\n    if (sel) {\n      sel.innerHTML = cfg.countries.map(c => `<option value=\"${c.id}\"${c.id===(ch?.id||1)?' selected':''}>${esc(c.name)}<\/option>`).join('');\n    }\n\n    \/\/ Branche-Dropdown bef\u00fcllen\n    const bSel = document.getElementById('branche');\n    if (bSel && branches.length) {\n      bSel.innerHTML = `<option value=\"\"><\/option>` + branches.map(b => `<option value=\"${b.id}\">${esc(b.name)}<\/option>`).join('');\n    }\n\n    setApiStatus('connected', `Verbunden \u00b7 ${groups.length} Kat. \u00b7 ${cfg.countries.length} L\u00e4nder`);\n    showLoadStatus('ok', `\u2705 ${groups.length} Kategorien, ${cfg.countries.length} L\u00e4nder${branches.length?' und '+branches.length+' Branchen':''} geladen.`);\n    renderCatAdmin();\n    renderCategoriesForm();\n    updatePhoneHints();\n\n  } catch(err) {\n    setApiStatus('error-s','Verbindungsfehler');\n    showLoadStatus('err-n','\u274c Fehler: '+err.message);\n  } finally {\n    btn.disabled = false;\n    icon.textContent = '\u2b07\ufe0f';\n    txt.textContent = 'Daten laden';\n  }\n}\n\nfunction setApiStatus(state, text) {\n  const b = document.getElementById('apiStatusBadge');\n  b.className = 'api-status '+state;\n  document.getElementById('apiStatusText').textContent = text;\n}\nfunction showLoadStatus(cls, msg) {\n  const el = document.getElementById('loadStatus');\n  el.className = 'notice '+cls;\n  el.textContent = msg;\n  el.style.display = 'block';\n}\n\n\/\/ ============================================================\n\/\/ KATEGORIEN (Formular)\n\/\/ ============================================================\nfunction renderCategoriesForm() {\n  const visible = cfg.categories.filter(c => c.visible);\n  if (!visible.length) {\n    document.getElementById('categoriesGrid').innerHTML = `<div class=\"notice info\">${t('catNoToken')}<\/div>`;\n    return;\n  }\n  document.getElementById('categoriesGrid').innerHTML = visible.map(cat => `\n    <label class=\"cat-item checked\" onclick=\"toggleCat(this)\">\n      <input type=\"checkbox\" data-id=\"${cat.id}\" checked>\n      <div class=\"cat-check\">\u2713<\/div>\n      <span class=\"cat-emoji\">${cat.emoji}<\/span>\n      <span class=\"cat-label\">${esc(cat[lang] || cat.de)}<\/span>\n    <\/label>`).join('');\n}\nfunction toggleCat(el) {\n  const cb = el.querySelector('input');\n  cb.checked = !cb.checked;\n  el.classList.toggle('checked', cb.checked);\n}\n\n\/\/ ============================================================\n\/\/ ADMIN: KATEGORIEN-TABELLE\n\/\/ ============================================================\nfunction renderCatAdmin() {\n  if (!cfg.categories.length) {\n    document.getElementById('catAdminContent').innerHTML = '<div class=\"notice info\">Zuerst API-Token eingeben und \u00abDaten laden\u00bb klicken.<\/div>';\n    return;\n  }\n  const rows = cfg.categories.map((cat,i) => `\n    <tr>\n      <td><input style=\"width:48px;text-align:center\" value=\"${esc(cat.emoji)}\" oninput=\"cfg.categories[${i}].emoji=this.value\"><\/td>\n      <td><input style=\"width:100%;min-width:130px\" value=\"${esc(cat.de)}\" oninput=\"cfg.categories[${i}].de=this.value\" placeholder=\"DE\"><\/td>\n      <td><input style=\"width:100%;min-width:130px\" value=\"${esc(cat.fr)}\" oninput=\"cfg.categories[${i}].fr=this.value\" placeholder=\"FR\"><\/td>\n      <td><span class=\"badge\">${esc(cat.bexioName)}<\/span><\/td>\n      <td><span class=\"badge\">#${cat.id}<\/span><\/td>\n      <td><button class=\"vis-btn ${cat.visible?'on':''}\" onclick=\"toggleCatVis(${i},this)\">${cat.visible?'\ud83d\udc41\ufe0f':'\ud83d\ude48'}<\/button><\/td>\n    <\/tr>`).join('');\n  document.getElementById('catAdminContent').innerHTML = `\n    <table class=\"cat-admin-table\">\n      <thead><tr>\n        <th style=\"width:56px\">Emoji<\/th>\n        <th>Name DE<\/th>\n        <th>Name FR<\/th>\n        <th style=\"width:150px\">Bexio-Name<\/th>\n        <th style=\"width:60px\">ID<\/th>\n        <th style=\"width:42px\">\ud83d\udc41\ufe0f<\/th>\n      <\/tr><\/thead>\n      <tbody>${rows}<\/tbody>\n    <\/table>`;\n}\nfunction toggleCatVis(i, btn) {\n  cfg.categories[i].visible = !cfg.categories[i].visible;\n  btn.classList.toggle('on', cfg.categories[i].visible);\n  btn.textContent = cfg.categories[i].visible ? '\ud83d\udc41\ufe0f' : '\ud83d\ude48';\n}\n\n\/\/ ============================================================\n\/\/ ADMIN: FELDER\n\/\/ ============================================================\nfunction renderFieldToggles() {\n  document.getElementById('fieldToggleList').innerHTML = FIELDS.map(f => {\n    const active = !cfg.hiddenFields.includes(f.id);\n    const locked = f.required;\n    return `<div class=\"field-toggle ${active?'active':''} ${locked?'locked':''}\" onclick=\"${locked?'':'toggleFld(\\''+f.id+'\\',this)'}\">\n      <div class=\"toggle-dot\"><\/div>\n      <span>${f.label}${locked?' *':''}${f.firmaOnly?' <small style=\"color:var(--accent)\">[Firma]<\/small>':''}<\/span>\n    <\/div>`;\n  }).join('');\n}\nfunction toggleFld(id, el) {\n  const idx = cfg.hiddenFields.indexOf(id);\n  if (idx>-1){cfg.hiddenFields.splice(idx,1);el.classList.add('active');}\n  else{cfg.hiddenFields.push(id);el.classList.remove('active');}\n}\n\n\/\/ ============================================================\n\/\/ ADMIN: TEXT-EDITOR\n\/\/ ============================================================\nconst TEXT_GROUPS = [\n  {label:'Hero & Header', keys:['heroBadge','heroTitle','heroSubtitle','tagline']},\n  {label:'Fehlermeldungen', keys:['errRequired','errEmail','errEmailDisposable','errPhone']},\n  {label:'Erfolg & Hinweise', keys:['successMsg','bemerkungsHinweis','catNoToken','phoneHint']},\n  {label:'Datenschutz', keys:['privacyText','privacyLink','privacyLink2']},\n  {label:'Button & Status', keys:['submitBtn','submitting']},\n  {label:'Anrede-Optionen', keys:['anredeOpt0','anredeOpt1','anredeOpt2','anredeOpt3','anredeOpt4']},\n  {label:'Allg. Labels', keys:['stammdaten','kommunikation','zusatz','kategorien','kategorienSub','optional','bitteWaehlen']},\n];\nconst TEXT_KEY_LABELS = {\n  heroBadge:'Badge', heroTitle:'Titel', heroSubtitle:'Untertitel', tagline:'Tagline',\n  errRequired:'Pflichtfeld-Fehler', errEmail:'E-Mail-Fehler', errEmailDisposable:'Wegwerf-Mail',\n  errPhone:'Telefon-Fehler', successMsg:'Erfolg (mit {name})', bemerkungsHinweis:'Bemerkungshinweis',\n  catNoToken:'Kat. ohne Token', phoneHint:'Telefon-Hinweis (+{prefix})',\n  privacyText:'Datenschutz Text', privacyLink:'Link-Text', privacyLink2:'Text nach Link',\n  submitBtn:'Button', submitting:'Button beim Senden',\n  anredeOpt0:'-- Option', anredeOpt1:'Herr\/M.', anredeOpt2:'Frau\/Mme', anredeOpt3:'Familie', anredeOpt4:'Herr&Frau',\n  stammdaten:'Stammdaten', kommunikation:'Kommunikation', zusatz:'Zusatzinfos',\n  kategorien:'Kat. Titel', kategorienSub:'Kat. Untertitel', optional:'Optional-Text', bitteWaehlen:'Bitte w\u00e4hlen',\n};\n\nfunction renderTextEditor() {\n  const html = TEXT_GROUPS.map(g => `\n    <div class=\"text-group\">\n      <div class=\"text-group-label\">${g.label}<\/div>\n      ${g.keys.map(key => `\n        <div style=\"margin-bottom:10px\">\n          <div style=\"font-size:12px;font-weight:600;color:var(--text-muted);margin-bottom:5px\">${TEXT_KEY_LABELS[key]||key}<\/div>\n          <div class=\"text-editor-grid\">\n            <div><label style=\"font-size:11px;color:#888;display:block;margin-bottom:3px\">\ud83c\udde9\ud83c\uddea Deutsch<\/label>\n              <${texts.de[key]&&texts.de[key].length>60?'textarea rows=\"2\"':'input type=\"text\"'}\n                style=\"width:100%;padding:7px 10px;border:1.5px solid var(--border);border-radius:6px;font-size:13px;font-family:inherit\"\n                oninput=\"texts.de['${key}']=this.value\">${texts.de[key]&&texts.de[key].length>60?esc(texts.de[key])+'<\/textarea>':'value=\"'+esc(texts.de[key]||'')+'\">'}<\/div>\n            <div><label style=\"font-size:11px;color:#888;display:block;margin-bottom:3px\">\ud83c\uddeb\ud83c\uddf7 Fran\u00e7ais<\/label>\n              <${texts.fr[key]&&texts.fr[key].length>60?'textarea rows=\"2\"':'input type=\"text\"'}\n                style=\"width:100%;padding:7px 10px;border:1.5px solid var(--border);border-radius:6px;font-size:13px;font-family:inherit\"\n                oninput=\"texts.fr['${key}']=this.value\">${texts.fr[key]&&texts.fr[key].length>60?esc(texts.fr[key])+'<\/textarea>':'value=\"'+esc(texts.fr[key]||'')+'\">'}<\/div>\n          <\/div>\n        <\/div>`).join('')}\n    <\/div>`).join('');\n  document.getElementById('textEditorContent').innerHTML = html;\n}\n\n\/\/ ============================================================\n\/\/ ADMIN SPEICHERN\n\/\/ ============================================================\nasync function saveAdmin() {\n  cfg.apiToken = document.getElementById('apiToken').value.trim();\n  applyVisibility();\n  renderCategoriesForm();\n  applyTexts();\n\n  \/\/ In WordPress-Datenbank speichern\n  if (window.providebitAjax) {\n    const saveBtn = document.querySelector('[onclick=\"saveAdmin()\"]');\n    if (saveBtn) { saveBtn.disabled = true; saveBtn.textContent = '\ud83d\udcbe Speichert\u2026'; }\n    try {\n      const saveData = {\n        categories:   cfg.categories,\n        hiddenFields: cfg.hiddenFields,\n        texts:        texts,\n      };\n      const res  = await fetch(window.providebitAjax.restUrl + '\/config', {\n        method:  'POST',\n        headers: { 'Content-Type':'application\/json', 'X-WP-Nonce': window.providebitAjax.nonce },\n        body:    JSON.stringify(saveData),\n      });\n      const json = await res.json();\n      if (res.ok) {\n        switchTab('form');\n        showStatus('success', '\u2705 Konfiguration dauerhaft gespeichert.');\n      } else {\n        showStatus('error', '\u274c Speichern fehlgeschlagen: ' + (json.data?.message||''));\n      }\n    } catch(e) {\n      showStatus('error', '\u274c Netzwerkfehler beim Speichern.');\n    } finally {\n      const saveBtn = document.querySelector('[onclick=\"saveAdmin()\"]');\n      if (saveBtn) { saveBtn.disabled = false; saveBtn.textContent = '\u2705 Speichern & Vorschau'; }\n    }\n  } else {\n    \/\/ Lokale Vorschau ohne WordPress\n    switchTab('form');\n    showStatus('success', '\u2705 Konfiguration gespeichert (nur lokal).');\n    setTimeout(hideStatus, 4000);\n  }\n}\n\n\/\/ ============================================================\n\/\/ KONTAKT-TYP\n\/\/ ============================================================\nfunction setType(type) {\n  cfg.contactType = type;\n  document.getElementById('btnFirma').querySelector('span').textContent = t('firma');\n  document.getElementById('btnPrivat').querySelector('span').textContent = t('privat');\n  document.getElementById('btnFirma').classList.toggle('active', type==='firma');\n  document.getElementById('btnPrivat').classList.toggle('active', type==='privat');\n  document.querySelectorAll('.privat-field').forEach(el => el.classList.toggle('hidden', type==='firma'));\n  applyVisibility();\n}\n\n\/\/ ============================================================\n\/\/ FELDER-SICHTBARKEIT\n\/\/ ============================================================\nfunction applyVisibility() {\n  \/\/ Sprache ist immer Pflichtfeld \u2013 nie verstecken\n  const forcedVisible = ['grp_sprache'];\n  FIELDS.forEach(f => {\n    const el = document.getElementById(f.id);\n    if (!el) return;\n    if (forcedVisible.includes(f.id)) { el.classList.remove('hidden'); return; }\n    const hidden = cfg.hiddenFields.includes(f.id);\n    if (f.firmaOnly) {\n      el.classList.toggle('hidden', hidden || cfg.contactType !== 'firma');\n    } else {\n      el.classList.toggle('hidden', hidden);\n    }\n  });\n  document.querySelectorAll('.privat-field').forEach(el =>\n    el.classList.toggle('hidden', cfg.contactType === 'firma'));\n}\n\n\/\/ ============================================================\n\/\/ TABS\n\/\/ ============================================================\nfunction switchTab(name) {\n  document.querySelectorAll('.tab-btn').forEach((b,i) =>\n    b.classList.toggle('active', (i===0&&name==='form')||(i===1&&name==='admin')));\n  document.getElementById('tab-form').classList.toggle('active', name==='form');\n  document.getElementById('tab-admin').classList.toggle('active', name==='admin');\n  if (name==='admin') { renderFieldToggles(); renderTextEditor(); }\n}\n\n\/\/ ============================================================\n\/\/ FORMULAR SUBMIT\n\/\/ ============================================================\ndocument.getElementById('newsletterForm').addEventListener('submit', async function(e) {\n  e.preventDefault();\n  if (!validate()) return;\n  const btn = document.getElementById('submitBtn');\n  const txt = document.getElementById('btnText');\n  const spin = document.getElementById('btnSpinner');\n  btn.disabled=true; txt.textContent=t('submitting'); spin.style.display='block';\n  hideStatus();\n  try {\n    const data = buildPayload();\n    await sendToBexio(data);\n    const name = cfg.contactType==='privat'\n      ? (gv('name_2_p')+' '+gv('name_1_p')).trim()\n      : gv('name_1_f');\n    showStatus('success', t('successMsg').replace('{name}', name));\n    document.getElementById('newsletterForm').reset();\n    document.querySelectorAll('.cat-item').forEach(el => el.classList.remove('checked'));\n    applyTexts(); \/\/ Optionen nach Reset neu setzen\n  } catch(err) {\n    showStatus('error', '\u274c '+err.message);\n  } finally {\n    btn.disabled=false; txt.textContent=t('submitBtn'); spin.style.display='none';\n  }\n});\n\nfunction buildPayload() {\n  const isF = cfg.contactType === 'firma';\n  const d = {contact_type_id: isF?1:2, country_id: parseInt(gv('country_id'))||1};\n\n  if (isF) {\n    d.name_1 = gv('name_1_f');\n    if (gv('name_2_f')) d.name_2 = gv('name_2_f');\n    if (gv('employees')) d.employees = parseInt(gv('employees'));\n    if (gv('trade_register_number')) d.trade_register_number = gv('trade_register_number');\n    if (gv('vat_uid')) d.vat_uid = gv('vat_uid');\n    if (gv('vat_uid_eu')) d.vat_uid_eu = gv('vat_uid_eu');\n  } else {\n    d.name_1 = gv('name_1_p');\n    if (gv('name_2_p')) d.name_2 = gv('name_2_p');\n    const sal = parseInt(gv('salutation')); if (sal) d.salutation_id = sal;\n    \/\/ title_id wird von Bexio API nicht unterst\u00fctzt\n  }\n\n  const str = gv('address'), nr = gv('address_nr');\n  if (str || nr) d.address = (str + (nr ? ' ' + nr : '')).trim();\n  if (gv('postcode')) d.postcode = gv('postcode');\n  if (gv('city')) d.city = gv('city');\n  ['mail','mail_second','phone_fixed','phone_fixed_second','phone_mobile','fax','url','skype_name']\n    .forEach(f=>{if(gv(f))d[f]=gv(f);});\n  const korr=gv('korrespondenz'); if(korr)d.correspondence_language_id=parseInt(korr);\n  const spr=gv('sprache'); if(spr)d.language_id=parseInt(spr);\n  const bra=gv('branche'); if(bra)d.business_activity_id=parseInt(bra);\n  if(gv('remarks'))d.remarks=gv('remarks');\n\n  \/\/ Kategorien\n  const ids=[];\n  document.querySelectorAll('.cat-item input:checked').forEach(cb=>{\n    const id=parseInt(cb.dataset.id); if(id)ids.push(id);\n  });\n  if(ids.length)d.contact_group_ids=ids;\n  return d;\n}\n\nasync function sendToBexio(data) {\n  if (!window.providebitAjax && !cfg.apiToken) {\n    console.log('\ud83d\udccb Demo-Payload:', JSON.stringify(data,null,2));\n    await new Promise(r=>setTimeout(r,900));\n    return {id:'demo-'+Date.now()};\n  }\n  if (window.providebitAjax) {\n    \/\/ REST API Endpunkt f\u00fcr Kontakt\n    const res = await fetch(window.providebitAjax.restUrl + '\/contact', {\n      method:  'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n        'X-WP-Nonce':   window.providebitAjax.nonce,\n      },\n      body: JSON.stringify(data),\n    });\n    if (!res.ok) {\n      const e = await res.json().catch(() => ({}));\n      throw new Error(e.message || 'HTTP ' + res.status);\n    }\n    return await res.json();\n  }\n  \/\/ Fallback direkt\n  return await bexioProxy('contact', 'POST', data);\n}\n\n\/\/ ============================================================\n\/\/ VALIDIERUNG\n\/\/ ============================================================\nfunction validate() {\n  let ok = true;\n  clearErrors();\n  const isF = cfg.contactType === 'firma';\n\n  \/\/ Anrede (beide Typen)\n  if (!cfg.hiddenFields.includes('grp_salutation')) {\n    const sal = document.getElementById('salutation');\n    if (!sal?.value || sal.value === '0') {\n      sal.classList.add('err');\n      setErr('err_salutation', t('errRequired'));\n      ok = false;\n    }\n  }\n\n  if (isF) {\n    ok = chkReq('name_1_f','err_name_1_f') && ok;\n  } else {\n    ok = chkReq('name_2_p','err_name_2_p') && ok;\n    ok = chkReq('name_1_p','err_name_1_p') && ok;\n  }\n\n  ok = chkReq('country_id','err_country_id') && ok;\n  if (!document.getElementById('grp_sprache')?.classList.contains('hidden')) {\n    ok = chkReq('sprache','err_sprache') && ok;\n  }\n  ok = chkReq('address','err_address') && ok;\n  ok = chkReq('postcode','err_postcode') && ok;\n  ok = chkReq('city','err_city') && ok;\n\n  \/\/ E-Mail\n  const mailEl = document.getElementById('mail');\n  const mailVal = mailEl?.value.trim()||'';\n  if (!mailVal) {\n    mailEl?.classList.add('err'); setErr('err_mail', t('errRequired')); ok=false;\n  } else if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(mailVal)) {\n    mailEl.classList.add('err'); setErr('err_mail', t('errEmail')); ok=false;\n  } else {\n    const domain = mailVal.split('@')[1]?.toLowerCase();\n    if (domain && DISPOSABLE_DOMAINS.has(domain)) {\n      mailEl.classList.add('err'); setErr('err_mail', t('errEmailDisposable')); ok=false;\n    }\n  }\n\n  \/\/ Telefon\n  ['phone_fixed','phone_mobile'].forEach(id => {\n    const el = document.getElementById(id);\n    if (el?.value.trim() && !validatePhone(el.value.trim())) {\n      el.classList.add('err');\n      setErr('err_'+id, t('errPhone'));\n      ok=false;\n    }\n  });\n\n  if (!ok) document.querySelector('.err')?.scrollIntoView({behavior:'smooth',block:'center'});\n  return ok;\n}\n\nfunction chkReq(id, errId) {\n  const el = document.getElementById(id);\n  if (!el?.value.trim()) { el?.classList.add('err'); setErr(errId, t('errRequired')); return false; }\n  return true;\n}\nfunction clearErrors() {\n  document.querySelectorAll('.err').forEach(e=>e.classList.remove('err'));\n  document.querySelectorAll('.field-error').forEach(e=>e.textContent='');\n}\nfunction clearErr(id) {\n  const el=document.getElementById(id); if(el)el.classList.remove('err');\n  const er=document.getElementById('err_'+id); if(er)er.textContent='';\n}\n\n\/\/ ============================================================\n\/\/ HELPERS\n\/\/ ============================================================\nfunction gv(id){const el=document.getElementById(id);return el?el.value.trim():'';}\nfunction setErr(id,msg){const el=document.getElementById(id);if(el)el.textContent=msg;}\nfunction showStatus(type,msg){const el=document.getElementById('statusMsg');el.className='status-message '+type;el.textContent=msg;el.scrollIntoView({behavior:'smooth',block:'nearest'});}\nfunction hideStatus(){const el=document.getElementById('statusMsg');el.className='status-message';el.style.display='none';}\nfunction esc(s){return(s||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;');}\n\n\/\/ ============================================================\n\/\/ INIT\n\/\/ ============================================================\nlang = detectLang();\n\n\/\/ L\u00e4nderliste ins Dropdown schreiben (hardcoded)\n(function() {\n  const sel = document.getElementById('country_id');\n  if (sel) {\n    sel.innerHTML = cfg.countries.map(c =>\n      `<option value=\"${c.id}\"${c.id===1?' selected':''}>${esc(c.name)}<\/option>`\n    ).join('');\n  }\n})();\n\n\/\/ Kategorien rendern (hardcoded)\nrenderCategoriesForm();\nupdatePhoneHints();\n\n\/\/ WordPress-Proxy: Token-Feld verstecken\nif (window.providebitAjax) {\n  const wrap = document.getElementById('tokenInputWrap');\n  const info = document.getElementById('wpProxyInfo');\n  if (wrap) wrap.style.display = 'none';\n  if (info) info.style.display = 'block';\n  setApiStatus('connected', `Bereit \u00b7 ${cfg.categories.length} Kategorien \u00b7 ${cfg.countries.length} L\u00e4nder`);\n}\n\n\/\/ Sprache vorausf\u00fcllen\nconst langSel = document.getElementById('sprache');\nif (langSel) langSel.value = (lang === 'fr') ? '2' : '1';\n\napplyTexts();\napplyVisibility();\n<\/script>\n<\/div><!-- #pbn-wrap -->\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-869","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/pages\/869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/comments?post=869"}],"version-history":[{"count":2,"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/pages\/869\/revisions"}],"predecessor-version":[{"id":896,"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/pages\/869\/revisions\/896"}],"wp:attachment":[{"href":"https:\/\/providebit.org\/fr\/wp-json\/wp\/v2\/media?parent=869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}