{"id":15069,"date":"2026-08-18T17:58:33","date_gmt":"2026-08-18T15:58:33","guid":{"rendered":"https:\/\/caramba.lu\/?page_id=15069"},"modified":"2026-08-21T15:04:26","modified_gmt":"2026-08-21T13:04:26","slug":"test","status":"publish","type":"page","link":"https:\/\/caramba.lu\/index.php\/test\/","title":{"rendered":"test"},"content":{"rendered":"\t\t<style>\n\t\t\t.caramba-privatisation-pricing-display { max-width: 640px; font-family: inherit; }\n\t\t\t.caramba-privatisation-pricing-display h3 {\n\t\t\t\tmargin: 0 0 1rem; padding-bottom: .5rem;\n\t\t\t\tborder-bottom: 2px solid #c9a227; font-size: 1.1rem; color: #1b1f27;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display h4 {\n\t\t\t\tmargin: 1.6rem 0 .6rem; font-size: .95rem; color: #1b1f27;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display table {\n\t\t\t\twidth: 100%; border-collapse: collapse; font-size: .88rem;\n\t\t\t\tborder: 1px solid #e2ddd0;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display th {\n\t\t\t\tbackground: #1b1f27; color: #fff; font-weight: 600;\n\t\t\t\tpadding: .6rem .5rem; text-align: center; border: 1px solid #2c3038;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display th:first-child { text-align: left; }\n\t\t\t.caramba-privatisation-pricing-display td {\n\t\t\t\tpadding: .55rem .5rem; text-align: center; border: 1px solid #e2ddd0;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display td:first-child {\n\t\t\t\ttext-align: left; font-weight: 600;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display tbody tr:nth-child(even) td { background: #faf8f2; }\n\t\t\t.caramba-privatisation-pricing-display .caramba-pp-extras td:last-child {\n\t\t\t\ttext-align: right; font-variant-numeric: tabular-nums; font-weight: 600;\n\t\t\t}\n\t\t\t.caramba-privatisation-pricing-display .caramba-pp-extras td:first-child { font-weight: 400; }\n\t\t\t.caramba-privatisation-pricing-display .caramba-pp-note {\n\t\t\t\tfont-size: .82rem; color: #666; margin-top: .6rem; line-height: 1.5;\n\t\t\t}\n\t\t\t\/* The price grid has 9 columns (label + 8 time slots) -- too\n\t\t\t   wide to ever fit legibly in every context (phones, tablets, a\n\t\t\t   narrow sidebar\/column layout...) no matter how much text\n\t\t\t   shrinks. Rather than truncating it, this makes it scroll\n\t\t\t   horizontally within its own wrapper -- the fade + swipe hint\n\t\t\t   below only show when JS actually detects the content\n\t\t\t   overflows (via the .is-scrollable class), so this works\n\t\t\t   correctly regardless of viewport size or where the shortcode\n\t\t\t   ends up embedded, rather than guessing from a fixed\n\t\t\t   px breakpoint that a narrow desktop column could fall outside\n\t\t\t   of just as easily as a wide tablet could exceed it. *\/\n\t\t\t.caramba-pp-grid-wrap {\n\t\t\t\tposition: relative; overflow-x: auto; -webkit-overflow-scrolling: touch;\n\t\t\t}\n\t\t\t.caramba-pp-grid-wrap table { min-width: 560px; }\n\t\t\t.caramba-pp-swipe-hint { display: none; }\n\t\t\t.caramba-pp-grid-wrap.is-scrollable {\n\t\t\t\tbox-shadow: inset -12px 0 8px -8px rgba(0,0,0,.12);\n\t\t\t}\n\t\t\t.caramba-pp-grid-wrap.is-scrollable ~ .caramba-pp-swipe-hint {\n\t\t\t\tdisplay: block; font-size: .78rem; color: #9a9384; margin: .4rem 0 0;\n\t\t\t\ttext-align: right;\n\t\t\t}\n\t\t<\/style>\n\t\t<div class=\"caramba-privatisation-pricing-display\">\n\t\t\t\n\t\t\t\t\t\t\t<div class=\"caramba-pp-grid-wrap\">\n\t\t\t\t<table>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>Horaire standard<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>08:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>10:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>12:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>14:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>16:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>18:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>20:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th>22:00<\/th>\n\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Lundi - Vendredi<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>250 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Samedi<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>200 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>250 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Dimanche<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>350 \u20ac<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t\t<\/table>\n\t\t\t<\/div>\n\t\t\t<p class=\"caramba-pp-swipe-hint\">\u2190 Faites glisser pour voir tous les horaires \u2192<\/p>\n\t\t\t<p class=\"caramba-pp-note\">\n\t\t\t\t\tLes prix ci-dessus sont TVA comprise. Un jour f\u00e9ri\u00e9 applique un tarif sp\u00e9cifique (proche de celui du samedi ou du dimanche selon le cas). Un horaire de d\u00e9but en dehors des cr\u00e9neaux list\u00e9s, ou une dur\u00e9e d\u00e9passant 2 heures, peut entra\u00eener un suppl\u00e9ment -- le formulaire de r\u00e9servation calcule le prix exact pour votre date et vos horaires.\n\t\t\t\t<\/p>\n\n\t\t\t\t\t\t\t\t\t<h4>Nombre de spectateurs<\/h4>\n\t\t\t\t\t<p class=\"caramba-pp-note\">\n\t\t\t\t\t\tLe prix de base inclut 20 places.\n\t\t\t\t\t\t\t\t\t\t\t\t\tAu-del\u00e0, un suppl\u00e9ment de 10.00 \u20ac est appliqu\u00e9 par spectateur suppl\u00e9mentaire.\n\t\t\t\t\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h4>Options suppl\u00e9mentaires<\/h4>\n\t\t\t\t\t<table class=\"caramba-pp-extras\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Film hors programmation<\/td><td>150.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Micro<\/td><td>75.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Connexion Laptop<\/td><td>75.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Mobilier suppl\u00e9mentaire<\/td><td>25.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Location du lounge (Cin\u00e9 Waasserhaus)<\/td><td>75.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Nettoyage (Cin\u00e9 Waasserhaus)<\/td><td>50.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr><td>Privatisation de l&#039;espace VIP (CineKursaal)<\/td><td>0.00 \u20ac<\/td><\/tr>\n\t\t\t\t\t\t\t\t\t\t\t<\/table>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h4>Sous-titrage<\/h4>\n\t\t\t\t\t<p class=\"caramba-pp-note\">\n\t\t\t\t\t\tUn sous-titrage dans une seule langue n'entra\u00eene aucun suppl\u00e9ment. Un sous-titrage dans deux langues ou plus entra\u00eene un suppl\u00e9ment de 100.00 \u20ac -- sauf si le film est actuellement \u00e0 l'affiche ou sort prochainement, auquel cas ce suppl\u00e9ment ne s'applique pas.\n\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t<script>\n\t\t(function() {\n\t\t\t\/\/ Detects REAL overflow (table wider than its wrapper) rather\n\t\t\t\/\/ than guessing from a fixed screen-width breakpoint -- this is\n\t\t\t\/\/ what actually determines whether the fade\/swipe-hint should\n\t\t\t\/\/ show, correctly handling tablets, a narrow desktop sidebar\/\n\t\t\t\/\/ column layout, or any other context this shortcode ends up\n\t\t\t\/\/ embedded in, not just an assumed \"mobile\" width. Re-checked on\n\t\t\t\/\/ resize since a browser window (or a tablet rotation) can\n\t\t\t\/\/ change this at any time.\n\t\t\tfunction updateScrollHints() {\n\t\t\t\tdocument.querySelectorAll('.caramba-pp-grid-wrap').forEach(function(wrap) {\n\t\t\t\t\tvar table = wrap.querySelector('table');\n\t\t\t\t\tif (!table) { return; }\n\t\t\t\t\twrap.classList.toggle('is-scrollable', table.scrollWidth > wrap.clientWidth);\n\t\t\t\t});\n\t\t\t}\n\t\t\tupdateScrollHints();\n\t\t\twindow.addEventListener('resize', updateScrollHints);\n\t\t})();\n\t\t<\/script>\n\t\t\n\n\n\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=\"84709c126e\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/index.php\/wp-json\/wp\/v2\/pages\/15069\" \/>\t\t\t<input type=\"hidden\" name=\"_redirect\" value=\"https:\/\/caramba.lu\/index.php\/test\/\">\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 = {\"SUP\":{\"label\":\"Tickets d\\u00e9passant les places comprises dans le tarif de base\",\"amount\":10},\"FHP\":{\"label\":\"Film hors programmation\",\"amount\":150},\"LON\":{\"label\":\"D\\u00e9passement 120'\",\"amount\":0.5},\"HOR\":{\"label\":\"Horaire impair\",\"amount\":0.5},\"VIP\":{\"label\":\"Privatisation VIP lors d'une s\\u00e9ance publique\",\"amount\":0},\"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},\"JFO\":{\"label\":\"Suppl\\u00e9ment jour f\\u00e9ri\\u00e9 ouvr\\u00e9 (voir calendrier)\",\"amount\":1},\"JFD\":{\"label\":\"Suppl\\u00e9ment jour f\\u00e9ri\\u00e9 dominical (voir calendrier)\",\"amount\":0.25}};\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 = 20;\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-15069","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15069","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=15069"}],"version-history":[{"count":3,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15069\/revisions"}],"predecessor-version":[{"id":15089,"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/pages\/15069\/revisions\/15089"}],"wp:attachment":[{"href":"https:\/\/caramba.lu\/index.php\/wp-json\/wp\/v2\/media?parent=15069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}