{"id":15092,"date":"2026-08-21T15:28:08","date_gmt":"2026-08-21T13:28:08","guid":{"rendered":"https:\/\/caramba.lu\/?page_id=15092"},"modified":"2026-08-21T15:29:36","modified_gmt":"2026-08-21T13:29:36","slug":"formulaire-privatisation","status":"publish","type":"page","link":"https:\/\/caramba.lu\/index.php\/formulaire-privatisation\/","title":{"rendered":"Formulaire privatisation"},"content":{"rendered":"\t\t<style>\n\t\t\t.caramba-privatisation-form-wrap, .caramba-privatisation-form-wrap * { box-sizing: border-box; }\n\t\t\t.caramba-privatisation-form-wrap { max-width: 780px; margin: 0 auto; font-family: inherit; }\n\t\t\t.caramba-privatisation-form-wrap h3 {\n\t\t\t\tmargin: 2.2rem 0 1rem; padding-bottom: .5rem;\n\t\t\t\tborder-bottom: 2px solid #c9a227; font-size: 1.15rem; letter-spacing: .02em;\n\t\t\t\tcolor: #1b1f27;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap h3:first-of-type { margin-top: 0; }\n\t\t\t.caramba-form-notice {\n\t\t\t\tpadding: .8rem 1rem; border-radius: 8px; margin: .6rem 0 1.2rem;\n\t\t\t\tfont-size: .92rem; line-height: 1.5;\n\t\t\t}\n\t\t\t.caramba-form-notice { background: #eef3fb; border: 1px solid #c9d8ef; color: #1c3f66; }\n\t\t\t.caramba-form-error { background: #fdecec; border-color: #f3bcbc; color: #8a1f1f; }\n\t\t\t.caramba-form-warning { background: #fff8e6; border: 1px solid #f0dca0; color: #7a5c00; }\n\n\t\t\t.caramba-field { display: flex; align-items: center; gap: .7rem; margin-bottom: 1rem; }\n\t\t\t.caramba-field > label {\n\t\t\t\tflex: 0 0 auto; min-width: 150px; max-width: 220px; text-align: right;\n\t\t\t\tfont-weight: 600; font-size: .88rem; color: #2c2f36;\n\t\t\t}\n\t\t\t.caramba-field > input, .caramba-field > select {\n\t\t\t\tflex: 1 1 auto; min-width: 0; width: 100%; max-width: 100%; padding: .55rem .75rem;\n\t\t\t\tborder: 1px solid #d6d6d6; border-radius: 8px;\n\t\t\t\tfont-size: 16px; \/* stays >= 16px on purpose -- iOS Safari auto-zoom fix, same as the school form *\/\n\t\t\t\ttransition: border-color .15s, box-shadow .15s;\n\t\t\t}\n\t\t\t\/* Same explicit field-sizing + native date\/time appearance reset as\n\t\t\t   the school form -- proven fix for this exact theme's own\n\t\t\t   conflicting input styles, see class-school-requests.php's own\n\t\t\t   longer comment on this for the full debugging history. *\/\n\t\t\t.caramba-privatisation-form-wrap input[type=\"text\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"email\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"tel\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"number\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"date\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"time\"],\n\t\t\t.caramba-privatisation-form-wrap select {\n\t\t\t\theight: 44px !important;\n\t\t\t\tmin-height: 44px !important;\n\t\t\t\tmax-height: 44px !important;\n\t\t\t\tline-height: 1.2 !important;\n\t\t\t\tpadding: 0 .75rem !important;\n\t\t\t\tbox-sizing: border-box !important;\n\t\t\t\tfont-size: 16px !important;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap input[type=\"date\"],\n\t\t\t.caramba-privatisation-form-wrap input[type=\"time\"] {\n\t\t\t\t-webkit-appearance: none !important;\n\t\t\t\tappearance: none !important;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap input[type=\"date\"]::-webkit-datetime-edit,\n\t\t\t.caramba-privatisation-form-wrap input[type=\"time\"]::-webkit-datetime-edit {\n\t\t\t\tpadding: 0 !important; line-height: 44px !important;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap input[type=\"date\"]::-webkit-inner-spin-button,\n\t\t\t.caramba-privatisation-form-wrap input[type=\"time\"]::-webkit-inner-spin-button {\n\t\t\t\theight: 24px !important;\n\t\t\t}\n\t\t\t.caramba-field > input:focus, .caramba-field > select:focus {\n\t\t\t\toutline: none; border-color: #c9a227; box-shadow: 0 0 0 3px rgba(201,162,39,.18);\n\t\t\t}\n\t\t\t.caramba-row { display: flex; gap: 1rem; flex-wrap: wrap; align-items: flex-start; }\n\t\t\t.caramba-row .caramba-field { flex: 1 1 200px; min-width: 0; }\n\t\t\t.caramba-row .caramba-field > label { min-width: 90px; max-width: 160px; font-size: .82rem; }\n\t\t\t.caramba-row .caramba-field.caramba-field-narrow { flex: 0 1 200px; }\n\t\t\t.caramba-row .caramba-field.caramba-field-wide { flex: 2 1 260px; }\n\t\t\t@media (max-width: 680px) {\n\t\t\t\t.caramba-field { flex-direction: column; align-items: stretch; gap: .3rem; }\n\t\t\t\t.caramba-field > label, .caramba-row .caramba-field > label { text-align: left; min-width: 0; max-width: none; font-size: .88rem; }\n\t\t\t\t.caramba-row { flex-direction: column; gap: 0; align-items: stretch; }\n\t\t\t\t.caramba-row .caramba-field,\n\t\t\t\t.caramba-row .caramba-field.caramba-field-narrow,\n\t\t\t\t.caramba-row .caramba-field.caramba-field-wide { flex-basis: auto; }\n\t\t\t}\n\n\t\t\t.caramba-checkbox-field { margin-bottom: 1.2rem; font-size: .92rem; }\n\t\t\t.caramba-option-row {\n\t\t\t\tdisplay: flex; align-items: center; justify-content: space-between; gap: 1rem;\n\t\t\t\tpadding: .55rem 0; border-bottom: 1px solid #eee; font-size: .92rem;\n\t\t\t}\n\t\t\t.caramba-option-row label { display: flex; align-items: center; gap: .6rem; flex: 1 1 auto; }\n\t\t\t.caramba-option-row .caramba-option-price { font-variant-numeric: tabular-nums; color: #555; min-width: 70px; text-align: right; }\n\t\t\t.caramba-option-row input[type=\"text\"] {\n\t\t\t\tmax-width: 220px; margin-left: 1rem;\n\t\t\t}\n\n\t\t\t.caramba-subs-options { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; padding-top: .5rem; }\n\t\t\t.caramba-subs-checkbox { display: flex; align-items: center; gap: .4rem; font-size: .92rem; font-weight: 400; }\n\t\t\t.caramba-form-notice.caramba-form-dst-active { background: #eef3fb; border-color: #c9d8ef; color: #1c3f66; }\n\n\t\t\t.caramba-totals-box {\n\t\t\t\tbackground: #faf8f2; border: 1px solid #ecdfb3; border-radius: 10px;\n\t\t\t\tpadding: 1.1rem 1.3rem; margin-top: 1.2rem;\n\t\t\t}\n\t\t\t.caramba-totals-box p { display: flex; justify-content: space-between; margin: .35rem 0; font-size: .95rem; }\n\t\t\t.caramba-totals-box .caramba-amount-due {\n\t\t\t\tborder-top: 1px solid #ecdfb3; margin-top: .6rem; padding-top: .7rem;\n\t\t\t\tfont-size: 1.25rem; font-weight: 700; color: #1b1f27;\n\t\t\t}\n\t\t\t.caramba-totals-box span { font-variant-numeric: tabular-nums; }\n\t\t\t.caramba-tva-breakdown {\n\t\t\t\tmargin-top: .5rem; padding-top: .5rem; border-top: 1px dashed #ecdfb3;\n\t\t\t}\n\t\t\t.caramba-tva-breakdown p {\n\t\t\t\tfont-size: .78rem; font-weight: 400; color: #9a9384; margin: .15rem 0;\n\t\t\t}\n\t\t\t#caramba-supplements-detail { margin: .2rem 0; }\n\t\t\t#caramba-supplements-detail p {\n\t\t\t\tfont-size: .85rem; color: #6b6558; padding-left: .8rem;\n\t\t\t}\n\n\t\t\t.caramba-submit-row { text-align: right; margin-top: 2rem; }\n\t\t\t.caramba-privatisation-form-wrap button[type=\"submit\"] {\n\t\t\t\tbackground: #1b1f27; color: #fff; border: none; border-radius: 30px;\n\t\t\t\tpadding: .85rem 2.2rem; font-size: 1rem; font-weight: 600; cursor: pointer;\n\t\t\t\ttransition: background .15s, transform .1s;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap button[type=\"submit\"]:hover { background: #c9a227; }\n\t\t\t.caramba-privatisation-form-wrap button[type=\"submit\"]:disabled {\n\t\t\t\tbackground: #ccc; color: #888; cursor: not-allowed;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap button[type=\"submit\"]:disabled:hover { background: #ccc; }\n\t\t\t.caramba-privatisation-form-wrap button[type=\"submit\"]:active { transform: scale(.98); }\n\t\t\t.caramba-privatisation-form-wrap button.caramba-reset-btn {\n\t\t\t\tbackground: transparent; color: #555; border: 1px solid #d6d6d6; border-radius: 30px;\n\t\t\t\tpadding: .85rem 1.6rem; font-size: 1rem; font-weight: 600; cursor: pointer;\n\t\t\t\tmargin-right: .8rem; transition: border-color .15s, color .15s;\n\t\t\t}\n\t\t\t.caramba-privatisation-form-wrap button.caramba-reset-btn:hover { border-color: #a00; color: #a00; }\n\t\t\t.caramba-privatisation-form-title {\n\t\t\t\ttext-align: center; font-size: 1.5rem; font-weight: 700; color: #1b1f27;\n\t\t\t\tmargin: 0 0 1.8rem; padding-bottom: 1rem; border-bottom: 3px solid #c9a227;\n\t\t\t}\n\t\t<\/style>\n\n\t\t<div class=\"caramba-privatisation-form-wrap\">\n\t\t<h2 class=\"caramba-privatisation-form-title\">Formulaire de demande de privatisation<\/h2>\n\t\t\n\t\t<form method=\"post\" action=\"https:\/\/caramba.lu\/wp-admin\/admin-post.php\" id=\"caramba-privatisation-form\" lang=\"fr\">\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"caramba_privatisation_submit\">\n\t\t\t<input type=\"hidden\" id=\"caramba_privatisation_nonce\" name=\"caramba_privatisation_nonce\" value=\"bfe70cb5d0\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/index.php\/wp-json\/wp\/v2\/pages\/15092\" \/>\t\t\t<input type=\"hidden\" name=\"_redirect\" value=\"https:\/\/caramba.lu\/index.php\/formulaire-privatisation\/\">\n\n\t\t\t<h3>Demandeur<\/h3>\n\t\t\t<div class=\"caramba-field\"><label>Nom \/ soci\u00e9t\u00e9 *<\/label><input type=\"text\" name=\"requester_name\" required><\/div>\n\t\t\t<div class=\"caramba-field\"><label>Adresse *<\/label><input type=\"text\" name=\"requester_address\" required><\/div>\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field caramba-field-narrow\"><label>CP *<\/label><input type=\"text\" name=\"requester_zip\" required><\/div>\n\t\t\t\t<div class=\"caramba-field\"><label>Localit\u00e9 *<\/label><input type=\"text\" name=\"requester_city\" required><\/div>\n\t\t\t<\/div>\n\n\t\t\t<h3>Facturation<\/h3>\n\t\t\t<p class=\"caramba-checkbox-field\"><label><input type=\"checkbox\" name=\"invoice_same\" value=\"1\" id=\"caramba-same-as-requester\" checked> Adresse de facturation identique \u00e0 l'adresse du demandeur<\/label><\/p>\n\t\t\t<div id=\"caramba-invoice-fields\">\n\t\t\t\t<div class=\"caramba-field\"><label>Nom \/ soci\u00e9t\u00e9 *<\/label><input type=\"text\" name=\"invoice_name\" required><\/div>\n\t\t\t\t<div class=\"caramba-field\"><label>Adresse *<\/label><input type=\"text\" name=\"invoice_address\" required><\/div>\n\t\t\t\t<div class=\"caramba-row\">\n\t\t\t\t\t<div class=\"caramba-field caramba-field-narrow\"><label>CP *<\/label><input type=\"text\" name=\"invoice_zip\" required><\/div>\n\t\t\t\t\t<div class=\"caramba-field\"><label>Localit\u00e9 *<\/label><input type=\"text\" name=\"invoice_city\" required><\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t\t\t<h3>Contact<\/h3>\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field\"><label>Nom *<\/label><input type=\"text\" name=\"contact_lname\" required><\/div>\n\t\t\t\t<div class=\"caramba-field\"><label>Pr\u00e9nom *<\/label><input type=\"text\" name=\"contact_fname\" required><\/div>\n\t\t\t<\/div>\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field\"><label>Email *<\/label><input type=\"email\" name=\"contact_email\" required><\/div>\n\t\t\t\t<div class=\"caramba-field caramba-field-narrow\"><label>T\u00e9l\u00e9phone *<\/label><input type=\"tel\" name=\"contact_phone\" required><\/div>\n\t\t\t<\/div>\n\n\t\t\t<h3>R\u00e9servation<\/h3>\n\t\t\t<div class=\"caramba-field\">\n\t\t\t\t<label>Cin\u00e9ma *<\/label>\n\t\t\t\t<select name=\"cinema_id\" id=\"caramba-cinema\" required>\n\t\t\t\t\t<option value=\"\">-- choisir --<\/option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"141\" data-name=\"CineKursaal\">CineKursaal<\/option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"14895\" data-name=\"CineSura\">CineSura<\/option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"142\" data-name=\"CineWaasserhaus\">CineWaasserhaus<\/option>\n\t\t\t\t\t\t\t\t\t<\/select>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field\"><label>Date *<\/label><input type=\"date\" name=\"reservation_date\" id=\"caramba-date\" required><\/div>\n\t\t\t\t<div class=\"caramba-field\">\n\t\t\t\t\t<label>Heure d\u00e9but *<\/label>\n\t\t\t\t\t<input type=\"time\" name=\"reserve_from\" id=\"caramba-from\" list=\"caramba-slot-options\" required>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"caramba-field\">\n\t\t\t\t\t<label>Heure fin *<\/label>\n\t\t\t\t\t<input type=\"time\" name=\"reserve_to\" id=\"caramba-to\" list=\"caramba-slot-options\" required>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t<datalist id=\"caramba-slot-options\">\n\t\t\t\t\t\t\t\t\t<option value=\"08:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"10:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"12:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"14:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"16:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"18:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"20:00\">\n\t\t\t\t\t\t\t\t\t<option value=\"22:00\">\n\t\t\t\t\t\t\t<\/datalist>\n\t\t\t<div id=\"caramba-msg-slot\" class=\"caramba-form-notice caramba-form-warning\" style=\"display:none;\"><\/div>\n\n\t\t\t<div class=\"caramba-field\"><label>Nombre de spectateurs *<\/label><input type=\"number\" min=\"1\" name=\"patrons\" required><\/div>\n\n\t\t\t<div id=\"caramba-vip-row\" class=\"caramba-checkbox-field\" style=\"display:none;\">\n\t\t\t\t<label><input type=\"checkbox\" name=\"opt_VIP\" value=\"1\"> Privatisation de l'espace VIP lors d'une s\u00e9ance publique<\/label>\n\t\t\t<\/div>\n\n\t\t\t<h3>Film<\/h3>\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field\">\n\t\t\t\t\t<label>Titre du film *<\/label>\n\t\t\t\t\t<input type=\"text\" name=\"film_title\" id=\"caramba-film\" list=\"caramba-film-options\" placeholder=\"Choisir une date d'abord, ou saisir un titre\" required>\n\t\t\t\t\t<datalist id=\"caramba-film-options\"><\/datalist>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"caramba-field caramba-field-narrow\">\n\t\t\t\t\t<label>Version *<\/label>\n\t\t\t\t\t<input type=\"text\" name=\"film_version\" list=\"caramba-version-options\" placeholder=\"VF, VO...\" required>\n\t\t\t\t\t<datalist id=\"caramba-version-options\">\n\t\t\t\t\t\t<option value=\"VF\"><option value=\"VO\"><option value=\"VOST\"><option value=\"VA\">\n\t\t\t\t\t<\/datalist>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t<div id=\"caramba-msg-duration\" class=\"caramba-form-notice caramba-form-warning\" style=\"display:none;\">La dur\u00e9e du film d\u00e9passe le cr\u00e9neau horaire choisi, un suppl\u00e9ment peut s'appliquer.<\/div>\n\t\t\t<div class=\"caramba-row\">\n\t\t\t\t<div class=\"caramba-field caramba-field-wide\" style=\"align-items:flex-start;\">\n\t\t\t\t\t<label style=\"padding-top:.6rem;\">Sous-titres<\/label>\n\t\t\t\t\t<div class=\"caramba-subs-options\">\n\t\t\t\t\t\t<label class=\"caramba-subs-checkbox\"><input type=\"checkbox\" class=\"caramba-subs-lang\" name=\"subs_de\" value=\"1\"> Allemand<\/label>\n\t\t\t\t\t\t<label class=\"caramba-subs-checkbox\"><input type=\"checkbox\" class=\"caramba-subs-lang\" name=\"subs_fr\" value=\"1\"> Fran\u00e7ais<\/label>\n\t\t\t\t\t\t<label class=\"caramba-subs-checkbox\"><input type=\"checkbox\" class=\"caramba-subs-lang\" name=\"subs_en\" value=\"1\"> Anglais<\/label>\n\t\t\t\t\t\t<label class=\"caramba-subs-checkbox\">\n\t\t\t\t\t\t\t<input type=\"checkbox\" class=\"caramba-subs-lang\" id=\"caramba-subs-other-cb\" name=\"subs_other\" value=\"1\"> Autre :\n\t\t\t\t\t\t\t<input type=\"text\" name=\"subs_other_text\" id=\"caramba-subs-other-text\" placeholder=\"pr\u00e9cisez\" disabled style=\"width:140px;display:inline-block;\">\n\t\t\t\t\t\t<\/label>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t<div id=\"caramba-msg-dst\" class=\"caramba-form-notice\" style=\"display:none;\">Sous-titrage dans 2 langues ou plus : le suppl\u00e9ment \"Double sous-titrage\" s'applique automatiquement.<\/div>\n\n\t\t\t<div class=\"caramba-totals-box\" style=\"margin-bottom:1.5rem;\">\n\t\t\t\t<p>Prix de base de la r\u00e9servation <span id=\"caramba-base-price\">-- \u20ac<\/span><\/p>\n\t\t\t<\/div>\n\t\t\t<h3>Autres options<\/h3>\n\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_FHP\" value=\"1\"> Film hors programmation<\/label>\n\t\t\t\t<span class=\"caramba-option-price\">150.00 \u20ac<\/span>\n\t\t\t<\/div>\n\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_MIC\" value=\"1\"> Micro<\/label>\n\t\t\t\t<span class=\"caramba-option-price\">75.00 \u20ac<\/span>\n\t\t\t<\/div>\n\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_LAP\" value=\"1\"> Connexion Laptop<\/label>\n\t\t\t\t<span class=\"caramba-option-price\">75.00 \u20ac<\/span>\n\t\t\t<\/div>\n\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_MOB\" value=\"1\"> Mobilier suppl\u00e9mentaire<\/label>\n\t\t\t\t<span class=\"caramba-option-price\">25.00 \u20ac<\/span>\n\t\t\t<\/div>\n\t\t\t<div id=\"caramba-waasserhaus-options\" style=\"display:none;\">\n\t\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_LOU\" value=\"1\"> Location lounge (par heure)<\/label>\n\t\t\t\t\t<span class=\"caramba-option-price\">75.00 \u20ac<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"caramba-option-row\">\n\t\t\t\t\t<label><input type=\"checkbox\" class=\"caramba-opt\" name=\"opt_NET\" value=\"1\"> Nettoyage <small style=\"font-weight:400;color:#666;\">(si collations\/boissons amen\u00e9es par le client)<\/small><\/label>\n\t\t\t\t\t<span class=\"caramba-option-price\">50.00 \u20ac<\/span>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"caramba-totals-box\">\n\t\t\t\t<p>Prix de base <span id=\"caramba-total-base\">-- \u20ac<\/span><\/p>\n\t\t\t\t<div id=\"caramba-supplements-detail\"><\/div>\n\t\t\t\t<p id=\"caramba-total-supplements-row\" style=\"display:none;\">Suppl\u00e9ments <span id=\"caramba-total-supplements\">0.00 \u20ac<\/span><\/p>\n\t\t\t\t<p class=\"caramba-amount-due\">Total \u00e0 payer (TVA incluse) <span id=\"caramba-total-amount\">-- \u20ac<\/span><\/p>\n\t\t\t\t<div id=\"caramba-tva-breakdown\" class=\"caramba-tva-breakdown\" style=\"display:none;\">\n\t\t\t\t\t<p>dont TVA (<span id=\"caramba-tva-rate\">--<\/span>) <span id=\"caramba-tva-amount\">-- \u20ac<\/span><\/p>\n\t\t\t\t\t<p>Prix HTVA <span id=\"caramba-price-ht\">-- \u20ac<\/span><\/p>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t\t\t<p class=\"caramba-checkbox-field caramba-consent-field\">\n\t\t\t\t<label><input type=\"checkbox\" id=\"caramba-consent\" name=\"consent\" value=\"1\" required> J'ai lu et j'accepte les <a href=\"https:\/\/caramba.lu\/index.php\/privatisations-conditions\/\" target=\"_blank\" rel=\"noopener\">conditions r\u00e9gissant les privatisations<\/a><\/label>\n\t\t\t<\/p>\n\n\t\t\t<p class=\"caramba-submit-row\">\n\t\t\t\t<button type=\"reset\" class=\"caramba-reset-btn\">R\u00e9initialiser<\/button>\n\t\t\t\t<button type=\"submit\" id=\"caramba-submit-btn\" disabled>Envoyer la demande<\/button>\n\t\t\t<\/p>\n\t\t<\/form>\n\t\t<\/div>\n\n\t\t<script>\n\t\t(function() {\n\t\t\tvar form = document.getElementById('caramba-privatisation-form');\n\n\t\t\t\/\/ -- Pricing data passed from PHP, mirrors Caramba_Privatisation_Pricing --\n\t\t\tvar SUPPLEMENTS = {\"FHP\":{\"label\":\"Film hors programmation\",\"amount\":150},\"LON\":{\"label\":\"D\\u00e9passement 120'\",\"amount\":0.5},\"HOR\":{\"label\":\"Horaire impair\",\"amount\":0.5},\"DST\":{\"label\":\"Double sous-titrage\",\"amount\":100},\"LOU\":{\"label\":\"Location lounge (hre)\",\"amount\":75},\"MIC\":{\"label\":\"Micro\",\"amount\":75},\"LAP\":{\"label\":\"Connexion Laptop\",\"amount\":75},\"MOB\":{\"label\":\"Mobilier suppl\\u00e9mentaire\",\"amount\":25},\"NET\":{\"label\":\"Nettoyage\",\"amount\":50}};\n\t\t\tvar TIME_SLOTS = [\"08:00\",\"10:00\",\"12:00\",\"14:00\",\"16:00\",\"18:00\",\"20:00\",\"22:00\"];\n\t\t\tvar TICKETS_INCLUDED = null;\n\t\t\tvar TVA_RATE = 0.17;\n\n\t\t\t\/\/ French validation messages, same as the school form.\n\t\t\tfunction frenchValidationMessage(input) {\n\t\t\t\tvar v = input.validity;\n\t\t\t\tif (v.valueMissing) { return 'Ce champ est obligatoire.'; }\n\t\t\t\tif (v.typeMismatch) {\n\t\t\t\t\tif (input.type === 'email') { return \"Merci d'indiquer une adresse e-mail valide.\"; }\n\t\t\t\t\treturn 'Format invalide.';\n\t\t\t\t}\n\t\t\t\tif (v.rangeUnderflow) { return 'Valeur trop basse.'; }\n\t\t\t\treturn 'Merci de corriger ce champ.';\n\t\t\t}\n\t\t\tform.querySelectorAll('input, select').forEach(function(field) {\n\t\t\t\tfield.addEventListener('invalid', function() { field.setCustomValidity(frenchValidationMessage(field)); });\n\t\t\t\tfield.addEventListener('input', function() { field.setCustomValidity(''); });\n\t\t\t\tfield.addEventListener('change', function() { field.setCustomValidity(''); });\n\t\t\t});\n\n\t\t\tfunction fmt(n) { return n.toLocaleString('fr-LU', {minimumFractionDigits:2, maximumFractionDigits:2}) + ' \u20ac'; }\n\n\t\t\t\/\/ -- Same-as-requester billing address copy --\n\t\t\tvar sameCheckbox = document.getElementById('caramba-same-as-requester');\n\t\t\tvar invoiceFields = document.getElementById('caramba-invoice-fields');\n\t\t\tvar fieldPairs = [\n\t\t\t\t['requester_name', 'invoice_name'],\n\t\t\t\t['requester_address', 'invoice_address'],\n\t\t\t\t['requester_zip', 'invoice_zip'],\n\t\t\t\t['requester_city', 'invoice_city'],\n\t\t\t];\n\t\t\tfunction copyRequesterIntoInvoice() {\n\t\t\t\tfieldPairs.forEach(function(pair) {\n\t\t\t\t\tvar src = form.querySelector('[name=' + pair[0] + ']');\n\t\t\t\t\tvar dst = form.querySelector('[name=' + pair[1] + ']');\n\t\t\t\t\tif (src && dst) { dst.value = src.value; }\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction syncInvoiceFields() {\n\t\t\t\tinvoiceFields.style.display = sameCheckbox.checked ? 'none' : '';\n\t\t\t\tinvoiceFields.querySelectorAll('input').forEach(function(el) { el.required = !sameCheckbox.checked; });\n\t\t\t\tif (sameCheckbox.checked) { copyRequesterIntoInvoice(); }\n\t\t\t}\n\t\t\tsameCheckbox.addEventListener('change', syncInvoiceFields);\n\t\t\t\/\/ Keep the (hidden) invoice fields in sync if the requester's own\n\t\t\t\/\/ fields are edited AFTER checking the box -- without this, only\n\t\t\t\/\/ the values present at the moment of checking would be copied,\n\t\t\t\/\/ silently going stale on any later edit while still checked.\n\t\t\tfieldPairs.forEach(function(pair) {\n\t\t\t\tvar src = form.querySelector('[name=' + pair[0] + ']');\n\t\t\t\tif (src) { src.addEventListener('input', function() { if (sameCheckbox.checked) { copyRequesterIntoInvoice(); } }); }\n\t\t\t});\n\t\t\tsyncInvoiceFields();\n\n\t\t\t\/\/ -- Cinema-dependent field visibility --\n\t\t\tvar cinemaSelect = document.getElementById('caramba-cinema');\n\t\t\tfunction cinemaName() {\n\t\t\t\tvar opt = cinemaSelect.options[cinemaSelect.selectedIndex];\n\t\t\t\treturn opt ? (opt.getAttribute('data-name') || '') : '';\n\t\t\t}\n\t\t\tfunction syncCinemaFields() {\n\t\t\t\tvar name = cinemaName();\n\t\t\t\tdocument.getElementById('caramba-vip-row').style.display = (name === 'CineKursaal') ? '' : 'none';\n\t\t\t\tdocument.getElementById('caramba-waasserhaus-options').style.display = (name === 'CineWaasserhaus') ? '' : 'none';\n\t\t\t}\n\t\t\tcinemaSelect.addEventListener('change', function() { syncCinemaFields(); recalc(); });\n\t\t\tsyncCinemaFields();\n\n\t\t\t\/\/ -- Subtitle \"Autre\" checkbox enables\/disables its text field --\n\t\t\t\/\/ -- Consent checkbox controls the submit button --\n\t\t\tvar consentCheckbox = document.getElementById('caramba-consent');\n\t\t\tvar submitBtn = document.getElementById('caramba-submit-btn');\n\t\t\tconsentCheckbox.addEventListener('change', function() {\n\t\t\t\tsubmitBtn.disabled = !consentCheckbox.checked;\n\t\t\t});\n\n\t\t\tvar subsOtherCb = document.getElementById('caramba-subs-other-cb');\n\t\t\tvar subsOtherText = document.getElementById('caramba-subs-other-text');\n\t\t\tsubsOtherCb.addEventListener('change', function() {\n\t\t\t\tsubsOtherText.disabled = !subsOtherCb.checked;\n\t\t\t\tif (!subsOtherCb.checked) { subsOtherText.value = ''; }\n\t\t\t});\n\n\t\t\t\/\/ -- Film field: free-text input + datalist, loaded via AJAX once\n\t\t\t\/\/ a date is picked. A datalist (unlike a <select>) lets someone\n\t\t\t\/\/ type a title that isn't in the list at all, per the confirmed\n\t\t\t\/\/ requirement -- the visual \"\u2500\u2500\u2500\u2500\u2500\u2500\" separator option is just a\n\t\t\t\/\/ harmless suggestion entry, not a real film, to distinguish the\n\t\t\t\/\/ two alphabetically-sorted groups (current\/other) at a glance.\n\t\t\tvar dateInput = document.getElementById('caramba-date');\n\t\t\tvar filmInput = document.getElementById('caramba-film');\n\t\t\tvar filmDatalist = document.getElementById('caramba-film-options');\n\t\t\tvar ajaxUrl = \"https:\\\/\\\/caramba.lu\\\/wp-admin\\\/admin-ajax.php\";\n\t\t\tvar currentPrices = null; \/\/ {slot: price}, for the currently-loaded date\n\t\t\tvar filmDetails = {}; \/\/ title -> {is_current, duration_minutes}, for the DST-exemption and film-duration checks\n\n\t\t\t\/\/ Strict HH:MM check -- confirmed requirement: a native\n\t\t\t\/\/ <input type=\"time\"> should always submit either a complete\n\t\t\t\/\/ value or an empty one, but this doesn't reliably hold across\n\t\t\t\/\/ every browser\/interaction path (e.g. via the attached\n\t\t\t\/\/ datalist), so this is enforced explicitly rather than relied\n\t\t\t\/\/ on implicitly.\n\t\t\tfunction isCompleteTime(v) { return \/^\\d{2}:\\d{2}$\/.test(v); }\n\n\t\t\t\/\/ Film field is only enabled once a full date AND a complete\n\t\t\t\/\/ start AND end time are present -- confirmed requirement:\n\t\t\t\/\/ typing a film title must not be possible before that, since\n\t\t\t\/\/ there'd be no reservation date to validate it against (e.g.\n\t\t\t\/\/ release-date fit) at all.\n\t\t\tfunction syncFilmFieldEnabled() {\n\t\t\t\tvar fromEl = document.getElementById('caramba-from');\n\t\t\t\tvar toEl = document.getElementById('caramba-to');\n\t\t\t\tvar ready = !!dateInput.value && isCompleteTime(fromEl.value) && isCompleteTime(toEl.value);\n\t\t\t\tfilmInput.disabled = !ready;\n\t\t\t\tif (!ready) {\n\t\t\t\t\tfilmInput.placeholder = \"Choisir une date et une heure compl\u00e8te d'abord\";\n\t\t\t\t\tfilmInput.value = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tsyncFilmFieldEnabled();\n\t\t\tdocument.getElementById('caramba-from').addEventListener('input', syncFilmFieldEnabled);\n\t\t\tdocument.getElementById('caramba-to').addEventListener('input', syncFilmFieldEnabled);\n\n\t\t\tdateInput.addEventListener('change', function() {\n\t\t\t\tsyncFilmFieldEnabled();\n\t\t\t\tif (!dateInput.value) return;\n\t\t\t\tfilmInput.placeholder = 'Chargement...';\n\t\t\t\tvar body = new URLSearchParams();\n\t\t\t\tbody.set('action', 'caramba_privatisation_films');\n\t\t\t\tbody.set('date', dateInput.value);\n\t\t\t\tfetch(ajaxUrl, { method: 'POST', body: body })\n\t\t\t\t\t.then(function(r) { return r.json(); })\n\t\t\t\t\t.then(function(json) {\n\t\t\t\t\t\tif (!json.success) { return; }\n\t\t\t\t\t\tvar current = json.data.films_current || [];\n\t\t\t\t\t\tvar other = json.data.films_other || [];\n\t\t\t\t\t\tcurrentDayInfo = json.data.day_info || null;\n\t\t\t\t\t\tcurrentPrices = json.data.prices || null;\n\t\t\t\t\t\tfilmDetails = json.data.film_details || {};\n\n\t\t\t\t\t\tfilmDatalist.innerHTML = '';\n\t\t\t\t\t\tfunction addOption(title) {\n\t\t\t\t\t\t\tvar opt = document.createElement('option');\n\t\t\t\t\t\t\topt.value = title;\n\t\t\t\t\t\t\tfilmDatalist.appendChild(opt);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent.forEach(addOption);\n\t\t\t\t\t\tif (current.length && other.length) { addOption('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500'); }\n\t\t\t\t\t\tother.forEach(addOption);\n\n\t\t\t\t\t\tsyncFilmFieldEnabled();\n\t\t\t\t\t\tif (dateInput.value && isCompleteTime(document.getElementById('caramba-from').value) && isCompleteTime(document.getElementById('caramba-to').value)) {\n\t\t\t\t\t\t\tfilmInput.placeholder = (current.length || other.length)\n\t\t\t\t\t\t\t\t? 'Choisir dans la liste, ou saisir un titre'\n\t\t\t\t\t\t\t\t: 'Aucun film existant pour cette date -- saisir un titre';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trecalc();\n\t\t\t\t\t});\n\t\t\t});\n\n\t\t\t\/\/ -- Slot resolution (mirrors Caramba_Privatisation_Pricing::resolve_slot_for_time) --\n\t\t\tfunction resolveSlot(time) {\n\t\t\t\tvar resolved = null;\n\t\t\t\tfor (var i = 0; i < TIME_SLOTS.length; i++) {\n\t\t\t\t\tif (TIME_SLOTS[i] <= time) { resolved = TIME_SLOTS[i]; } else { break; }\n\t\t\t\t}\n\t\t\t\treturn resolved;\n\t\t\t}\n\t\t\tfunction toMinutes(hhmm) {\n\t\t\t\tvar parts = hhmm.split(':');\n\t\t\t\treturn parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10);\n\t\t\t}\n\n\t\t\t\/\/ -- Day info (mirrors Caramba_Privatisation_Pricing::get_day_info) --\n\t\t\t\/\/ Holiday computation is intentionally NOT duplicated in JS (Easter-\n\t\t\t\/\/ based date math is exactly the kind of thing worth keeping in ONE\n\t\t\t\/\/ place) -- instead, day info for the CHOSEN date is fetched from\n\t\t\t\/\/ the server once, via the same AJAX round-trip that loads films,\n\t\t\t\/\/ piggybacking on it rather than adding a second request.\n\t\t\tvar currentDayInfo = null; \/\/ {tariff_row, supplement}, or null if not yet known \/ non-holiday\n\t\t\t\/\/ -- Live price calculation, mirrors\n\t\t\t\/\/ Caramba_Privatisation_Pricing::compute_reservation_price()\n\t\t\t\/\/ exactly (including the strictly-greater-than LON fix -- see\n\t\t\t\/\/ that method's own doc comment for why) -- this is DISPLAY\n\t\t\t\/\/ ONLY; the server recomputes authoritatively on submit and\n\t\t\t\/\/ never trusts a total posted from here.\n\t\t\t\/\/ French labels for the itemized breakdown -- mirrors\n\t\t\t\/\/ Caramba_Privatisation_Requests::supplement_label() on the\n\t\t\t\/\/ server (used in the PDF), kept in sync manually since this\n\t\t\t\/\/ is just display text, not business logic.\n\t\t\tvar SUPPLEMENT_LABELS = {\n\t\t\t\tFHP: 'Film hors programmation', DST: 'Double sous-titrage', MIC: 'Micro',\n\t\t\t\tLAP: 'Connexion Laptop', MOB: 'Mobilier suppl\u00e9mentaire', LOU: 'Location lounge',\n\t\t\t\tNET: 'Nettoyage', VIP: 'Privatisation VIP', HOR: 'Horaire non standard',\n\t\t\t\tLON: 'Dur\u00e9e non standard', JFO: 'Suppl\u00e9ment jour f\u00e9ri\u00e9', JFD: 'Suppl\u00e9ment jour f\u00e9ri\u00e9'\n\t\t\t};\n\n\t\t\tfunction recalc() {\n\t\t\t\tvar fromInput = document.getElementById('caramba-from');\n\t\t\t\tvar toInput = document.getElementById('caramba-to');\n\t\t\t\tvar from = fromInput.value, to = toInput.value;\n\n\t\t\t\tdocument.getElementById('caramba-msg-slot').style.display = 'none';\n\t\t\t\tdocument.getElementById('caramba-supplements-detail').innerHTML = '';\n\t\t\t\tdocument.getElementById('caramba-msg-dst').style.display = 'none';\n\n\t\t\t\tif (!currentPrices || !from || !to) {\n\t\t\t\t\tdocument.getElementById('caramba-base-price').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-base').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-amount').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-supplements-row').style.display = 'none';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!isCompleteTime(from) || !isCompleteTime(to)) {\n\t\t\t\t\tvar timeMsg = document.getElementById('caramba-msg-slot');\n\t\t\t\t\ttimeMsg.textContent = \"Merci de renseigner une heure compl\u00e8te (HH:MM) pour le d\u00e9but et la fin.\";\n\t\t\t\t\ttimeMsg.style.display = '';\n\t\t\t\t\tdocument.getElementById('caramba-base-price').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-base').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-amount').textContent = '-- \u20ac';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar fromSlot = resolveSlot(from);\n\t\t\t\tif (!fromSlot) {\n\t\t\t\t\tvar msg = document.getElementById('caramba-msg-slot');\n\t\t\t\t\tmsg.textContent = \"L'heure de d\u00e9but est avant le premier cr\u00e9neau disponible (08:00).\";\n\t\t\t\t\tmsg.style.display = '';\n\t\t\t\t\tdocument.getElementById('caramba-base-price').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-base').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-amount').textContent = '-- \u20ac';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar basePrice = currentPrices[fromSlot];\n\t\t\t\tif (basePrice === null || basePrice === undefined) {\n\t\t\t\t\tdocument.getElementById('caramba-base-price').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-base').textContent = '-- \u20ac';\n\t\t\t\t\tdocument.getElementById('caramba-total-amount').textContent = '-- \u20ac';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar notices = [];\n\t\t\t\tvar pctRate = 0;\n\t\t\t\tvar pctCodesApplied = []; \/\/ which percentage supplements actually applied, for the breakdown list\n\n\t\t\t\t\/\/ HOR: start time isn't exactly a standard slot\n\t\t\t\tif (TIME_SLOTS.indexOf(from) === -1) {\n\t\t\t\t\tpctRate += (SUPPLEMENTS.HOR && SUPPLEMENTS.HOR.amount) || 0;\n\t\t\t\t\tpctCodesApplied.push('HOR');\n\t\t\t\t\tnotices.push('Horaire non standard, suppl\u00e9ment possible.');\n\t\t\t\t}\n\n\t\t\t\t\/\/ LON: confirmed rule reduces to a plain duration check --\n\t\t\t\t\/\/ \u00e9cart (requested start minus preceding slot) + following\n\t\t\t\t\/\/ slot always equals requested start + 120 minutes, since\n\t\t\t\t\/\/ every slot is uniformly 2h apart (verified numerically\n\t\t\t\t\/\/ server-side before relying on this simplification). So\n\t\t\t\t\/\/ this applies purely based on actual duration exceeding 2\n\t\t\t\t\/\/ hours, regardless of which slot boundary the booking\n\t\t\t\t\/\/ started near -- a non-standard start (e.g. 15:30) still\n\t\t\t\t\/\/ gets a full, fair 2h grace period measured from when it\n\t\t\t\t\/\/ actually begins.\n\t\t\t\tvar fromMinutesRaw = toMinutes(from);\n\t\t\t\tvar toMinutesVal = toMinutes(to);\n\t\t\t\tif (toMinutesVal < fromMinutesRaw) { toMinutesVal += 24 * 60; } \/\/ midnight wrap\n\n\t\t\t\tvar overlong = (toMinutesVal - fromMinutesRaw) > 120;\n\t\t\t\tif (overlong) {\n\t\t\t\t\tpctRate += (SUPPLEMENTS.LON && SUPPLEMENTS.LON.amount) || 0;\n\t\t\t\t\tpctCodesApplied.push('LON');\n\t\t\t\t\tnotices.push('Dur\u00e9e non standard, suppl\u00e9ment possible.');\n\t\t\t\t}\n\n\t\t\t\t\/\/ Holiday supplement, from the server-provided day info\n\t\t\t\tif (currentDayInfo && currentDayInfo.supplement) {\n\t\t\t\t\tvar code = currentDayInfo.supplement;\n\t\t\t\t\tpctRate += (SUPPLEMENTS[code] && SUPPLEMENTS[code].amount) || 0;\n\t\t\t\t\tpctCodesApplied.push(code);\n\t\t\t\t}\n\n\t\t\t\tvar pctAmount = Math.round(basePrice * pctRate * 100) \/ 100;\n\n\t\t\t\t\/\/ Flat-fee options, gated by cinema name (same rule as the\n\t\t\t\t\/\/ server: VIP only at CineKursaal, LOU\/NET only at\n\t\t\t\t\/\/ CineWaasserhaus -- checkboxes for the wrong venue are\n\t\t\t\t\/\/ hidden already, but this only sums whichever are actually\n\t\t\t\t\/\/ visible\/checked, so hidden-but-somehow-checked never\n\t\t\t\t\/\/ contributes).\n\t\t\t\tvar flatTotal = 0;\n\t\t\t\tvar flatCodesApplied = [];\n\t\t\t\tform.querySelectorAll('.caramba-opt, #caramba-vip-row input').forEach(function(cb) {\n\t\t\t\t\tif (!cb.checked) return;\n\t\t\t\t\tif (cb.closest('[style*=\"display: none\"]')) return; \/\/ hidden section, don't count\n\t\t\t\t\tvar code = cb.name.replace('opt_', '');\n\t\t\t\t\tvar supp = SUPPLEMENTS[code];\n\t\t\t\t\tif (supp && supp.amount !== null) { flatTotal += supp.amount; flatCodesApplied.push(code); }\n\t\t\t\t});\n\n\t\t\t\t\/\/ DST (Double sous-titrage) is NEVER a manual choice -- it\n\t\t\t\t\/\/ applies automatically if 2 or more subtitle languages are\n\t\t\t\t\/\/ requested (single-language subtitling carries no supplement\n\t\t\t\t\/\/ at all), EXCEPT it never applies at all to a currently-\n\t\t\t\t\/\/ showing film, regardless of language count (confirmed rule).\n\t\t\t\tvar filmDetail = filmDetails[filmInput.value];\n\t\t\t\tvar isCurrentFilm = !!(filmDetail && filmDetail.is_current);\n\n\t\t\t\tvar subsCount = 0;\n\t\t\t\tif (form.querySelector('[name=subs_de]').checked) { subsCount++; }\n\t\t\t\tif (form.querySelector('[name=subs_fr]').checked) { subsCount++; }\n\t\t\t\tif (form.querySelector('[name=subs_en]').checked) { subsCount++; }\n\t\t\t\tif (subsOtherCb.checked && subsOtherText.value.trim() !== '') { subsCount++; }\n\n\t\t\t\tvar dstMsg = document.getElementById('caramba-msg-dst');\n\t\t\t\tif (subsCount >= 2 && !isCurrentFilm) {\n\t\t\t\t\tvar dstAmount = SUPPLEMENTS.DST && SUPPLEMENTS.DST.amount;\n\t\t\t\t\tif (dstAmount !== null && dstAmount !== undefined) {\n\t\t\t\t\t\tflatTotal += dstAmount;\n\t\t\t\t\t\tflatCodesApplied.push('DST');\n\t\t\t\t\t}\n\t\t\t\t\tdstMsg.style.display = '';\n\t\t\t\t\tdstMsg.classList.add('caramba-form-dst-active');\n\t\t\t\t} else {\n\t\t\t\t\tdstMsg.style.display = 'none';\n\t\t\t\t\tdstMsg.classList.remove('caramba-form-dst-active');\n\t\t\t\t}\n\n\t\t\t\t\/\/ Film duration vs the chosen reservation window -- only\n\t\t\t\t\/\/ checkable when the typed title matches a known film with a\n\t\t\t\t\/\/ synced duration; a custom\/unrecognized title has nothing to\n\t\t\t\t\/\/ check against.\n\t\t\t\tvar durMsg = document.getElementById('caramba-msg-duration');\n\t\t\t\tif (filmDetail && filmDetail.duration_minutes) {\n\t\t\t\t\tvar windowMinutes = toMinutesVal - fromMinutesRaw; \/\/ already computed above for the LON check\n\t\t\t\t\tdurMsg.style.display = (filmDetail.duration_minutes > windowMinutes) ? '' : 'none';\n\t\t\t\t} else {\n\t\t\t\t\tdurMsg.style.display = 'none';\n\t\t\t\t}\n\n\t\t\t\t\/\/ SUP: per-spectator charge for exceeding the ticket count\n\t\t\t\t\/\/ included in the base price -- confirmed rule. Charged PER\n\t\t\t\t\/\/ HEAD over the included count, so (unlike every other flat\n\t\t\t\t\/\/ code) its displayed amount isn't just SUPPLEMENTS.SUP.amount\n\t\t\t\t\/\/ directly -- that's the PER-SPECTATOR rate, multiplied here\n\t\t\t\t\/\/ by however many patrons exceed the included count.\n\t\t\t\tvar patronsInput = form.querySelector('[name=patrons]');\n\t\t\t\tvar patrons = parseInt(patronsInput.value, 10) || 0;\n\t\t\t\tvar supAmount = 0;\n\t\t\t\tif (TICKETS_INCLUDED !== null && patrons > TICKETS_INCLUDED && SUPPLEMENTS.SUP && SUPPLEMENTS.SUP.amount !== null) {\n\t\t\t\t\tsupAmount = Math.round((patrons - TICKETS_INCLUDED) * SUPPLEMENTS.SUP.amount * 100) \/ 100;\n\t\t\t\t\tflatTotal += supAmount;\n\t\t\t\t}\n\n\t\t\t\tvar total = Math.round((basePrice + pctAmount + flatTotal) * 100) \/ 100;\n\n\t\t\t\tdocument.getElementById('caramba-base-price').textContent = fmt(basePrice);\n\t\t\t\tdocument.getElementById('caramba-total-base').textContent = fmt(basePrice);\n\t\t\t\tvar supplementsTotal = pctAmount + flatTotal;\n\t\t\t\tif (supplementsTotal > 0) {\n\t\t\t\t\tdocument.getElementById('caramba-total-supplements-row').style.display = '';\n\t\t\t\t\tdocument.getElementById('caramba-total-supplements').textContent = fmt(supplementsTotal);\n\n\t\t\t\t\t\/\/ Itemized breakdown -- names the NATURE of each applied\n\t\t\t\t\t\/\/ supplement, not just a lump sum. Percentage supplements\n\t\t\t\t\t\/\/ (HOR\/LON\/JFO\/JFD) share one combined amount (same\n\t\t\t\t\t\/\/ reasoning as the server\/PDF: they were added together\n\t\t\t\t\t\/\/ once against the base price, not separately), shown as\n\t\t\t\t\t\/\/ one line naming all that applied; each flat-fee option\n\t\t\t\t\t\/\/ gets its own line at its own price.\n\t\t\t\t\tvar detail = document.getElementById('caramba-supplements-detail');\n\t\t\t\t\tif (pctCodesApplied.length) {\n\t\t\t\t\t\tvar pctLabel = pctCodesApplied.map(function(c) { return SUPPLEMENT_LABELS[c] || c; }).join(' + ');\n\t\t\t\t\t\tvar p1 = document.createElement('p');\n\t\t\t\t\t\tp1.innerHTML = '<span>' + pctLabel + '<\/span><span>' + fmt(pctAmount) + '<\/span>';\n\t\t\t\t\t\tdetail.appendChild(p1);\n\t\t\t\t\t}\n\t\t\t\t\tflatCodesApplied.forEach(function(code) {\n\t\t\t\t\t\tvar supp = SUPPLEMENTS[code];\n\t\t\t\t\t\tvar p2 = document.createElement('p');\n\t\t\t\t\t\tp2.innerHTML = '<span>' + (SUPPLEMENT_LABELS[code] || code) + '<\/span><span>' + fmt(supp.amount) + '<\/span>';\n\t\t\t\t\t\tdetail.appendChild(p2);\n\t\t\t\t\t});\n\t\t\t\t\tif (supAmount > 0) {\n\t\t\t\t\t\tvar p3 = document.createElement('p');\n\t\t\t\t\t\tp3.innerHTML = '<span>' + (patrons - TICKETS_INCLUDED) + ' spectateur(s) au-del\u00e0 de ' + TICKETS_INCLUDED + ' inclus<\/span><span>' + fmt(supAmount) + '<\/span>';\n\t\t\t\t\t\tdetail.appendChild(p3);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdocument.getElementById('caramba-total-supplements-row').style.display = 'none';\n\t\t\t\t}\n\t\t\t\tdocument.getElementById('caramba-total-amount').textContent = fmt(total);\n\n\t\t\t\t\/\/ TVA breakdown, de-emphasized (smaller\/lighter), shown after\n\t\t\t\t\/\/ the main total -- reverse-calculated from the (already tax-\n\t\t\t\t\/\/ inclusive) total, since TVA is included in every price, not\n\t\t\t\t\/\/ added on top of it.\n\t\t\t\tvar tvaBox = document.getElementById('caramba-tva-breakdown');\n\t\t\t\tif (TVA_RATE !== null) {\n\t\t\t\t\tvar priceHt = Math.round((total \/ (1 + TVA_RATE)) * 100) \/ 100;\n\t\t\t\t\tvar tvaAmount = Math.round((total - priceHt) * 100) \/ 100;\n\t\t\t\t\tdocument.getElementById('caramba-tva-rate').textContent = (TVA_RATE * 100).toFixed(0) + '%';\n\t\t\t\t\tdocument.getElementById('caramba-tva-amount').textContent = fmt(tvaAmount);\n\t\t\t\t\tdocument.getElementById('caramba-price-ht').textContent = fmt(priceHt);\n\t\t\t\t\ttvaBox.style.display = '';\n\t\t\t\t} else {\n\t\t\t\t\ttvaBox.style.display = 'none';\n\t\t\t\t}\n\n\n\t\t\t\tif (notices.length) {\n\t\t\t\t\tvar msg = document.getElementById('caramba-msg-slot');\n\t\t\t\t\tmsg.textContent = notices.join(' ');\n\t\t\t\t\tmsg.style.display = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tform.addEventListener('input', recalc);\n\t\t\tform.addEventListener('change', recalc);\n\n\t\t\tform.addEventListener('reset', function() {\n\t\t\t\t\/\/ Runs on the SAME tick as the native reset, before field\n\t\t\t\t\/\/ values are actually restored -- defer this sync to just\n\t\t\t\t\/\/ after, once the browser has finished resetting values.\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tsyncInvoiceFields();\n\t\t\t\t\tsyncCinemaFields();\n\t\t\t\t\tfilmInput.placeholder = \"Choisir une date d'abord, ou saisir un titre\";\n\t\t\t\t\tfilmDatalist.innerHTML = '';\n\t\t\t\t\tcurrentDayInfo = null;\n\t\t\t\t\tcurrentPrices = null;\n\t\t\t\t\tdocument.getElementById('caramba-msg-slot').style.display = 'none';\n\t\t\t\t\t\/\/ The consent checkbox itself IS restored to unchecked by\n\t\t\t\t\t\/\/ the native reset (checkbox state participates in normal\n\t\t\t\t\t\/\/ form-reset semantics) -- but a button's disabled\n\t\t\t\t\t\/\/ attribute, toggled here via JS, does NOT, so it must be\n\t\t\t\t\t\/\/ re-synced explicitly or it could stay enabled after a\n\t\t\t\t\t\/\/ reset despite consent now being unchecked.\n\t\t\t\t\tsubmitBtn.disabled = !consentCheckbox.checked;\n\t\t\t\t\trecalc();\n\t\t\t\t}, 0);\n\t\t\t});\n\n\t\t\trecalc();\n\t\t})();\n\t\t<\/script>\n\t\t\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":{"_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-15092","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/comments?post=15092"}],"version-history":[{"count":2,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15092\/revisions"}],"predecessor-version":[{"id":15094,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15092\/revisions\/15094"}],"wp:attachment":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/media?parent=15092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}