{"id":12542,"date":"2025-10-02T09:16:58","date_gmt":"2025-10-02T09:16:58","guid":{"rendered":"https:\/\/strippersdeluxe.com\/diner-et-spectacle-lloret-de-mar\/"},"modified":"2025-12-23T11:03:35","modified_gmt":"2025-12-23T11:03:35","slug":"diner-et-spectacle-lloret-de-mar","status":"publish","type":"page","link":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/","title":{"rendered":"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12542\" class=\"elementor elementor-12542 elementor-9287\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1254295 e-flex e-con-boxed e-con e-parent\" data-id=\"1254295\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-be0a362 e-con-full e-flex e-con e-child\" data-id=\"be0a362\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0cb9b2f elementor-widget elementor-widget-html\" data-id=\"0cb9b2f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<nav class=\"breadcrumb-bubble-nav\" aria-label=\"Breadcrumb\"><div class=\"breadcrumb-bubble-yoast\"><span><span><a href=\"https:\/\/strippersdeluxe.com\/fr\/\">Home<\/a><\/span><\/span>\r\n  <\/div><\/nav><style>.breadcrumb-bubble-yoast {\r\n  display: flex;\r\n  width: 100%;\r\n  justify-content: center;\r\n  margin-bottom: 10px;\r\n}\r\n.breadcrumb-bubble-yoast > span {\r\n  display: flex !important;\r\n  flex-wrap: wrap;\r\n  gap: 6px;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n.breadcrumb-bubble-yoast > span > span,\r\n.breadcrumb-bubble-yoast > span > .breadcrumb_last {\r\n  background: #F1F0FA !important; \/* gris lavanda suave *\/\r\n  color: #222 !important;\r\n  border: 1.2px solid #e4e0e6 !important;\r\n  border-radius: 16px !important;\r\n  padding: 4px 14px !important;\r\n  font-size: 12px !important;\r\n  font-weight: 500 !important;\r\n  margin: 0 2px !important;\r\n  min-width: 24px;\r\n  text-align: center;\r\n  box-shadow: 0 2px 6px rgba(104,82,244,0.07);\r\n  display: inline-block !important;\r\n  text-decoration: none !important;\r\n  transition: all 0.17s;\r\n}\r\n.breadcrumb-bubble-yoast > span > .breadcrumb_last {\r\n  background: #6852f4 !important;\r\n  color: #fff !important;\r\n  border-color: #6852f4 !important;\r\n  pointer-events: none !important;\r\n}\r\n\r\n\/* Breadcrumb links inside the span *\/\r\n.breadcrumb-bubble-yoast > span > span > a {\r\n  color: #222 !important;\r\n  text-decoration: none !important;\r\n  font-weight: 500;\r\n  display: inline-block !important;\r\n  transition: color 0.15s;\r\n}\r\n.breadcrumb-bubble-yoast > span > span:hover,\r\n.breadcrumb-bubble-yoast > span > span:focus,\r\n.breadcrumb-bubble-yoast > span > span > a:hover,\r\n.breadcrumb-bubble-yoast > span > span > a:focus {\r\n  background: #eceaff !important;\r\n  color: #6852f4 !important;\r\n  border-color: #6852f4 !important;\r\n}\r\n\r\n\/* Separador moderno \"\u203a\" *\/\r\n.breadcrumb-bubble-yoast > span > .separator,\r\n.breadcrumb-bubble-yoast > span > .breadcrumb-separator {\r\n  background: none !important;\r\n  border: none !important;\r\n  padding: 0 !important;\r\n  margin: 0 4px !important;\r\n  color: #b3b2bc !important;\r\n  font-size: 1.07em !important;\r\n  font-weight: 700;\r\n  user-select: none;\r\n  box-shadow: none !important;\r\n  display: inline !important;\r\n}\r\n\r\n\/* Responsive para m\u00f3viles *\/\r\n@media (max-width: 600px){\r\n  .breadcrumb-bubble-yoast > span > span,\r\n  .breadcrumb-bubble-yoast > span > .breadcrumb_last {\r\n    padding: 4px 10px !important;\r\n    font-size: 12px !important;\r\n  }\r\n}\r\n\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a69996c e-flex e-con-boxed e-con e-parent\" data-id=\"a69996c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-32a05e7 e-con-full e-flex e-con e-child\" data-id=\"32a05e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-8d02f63 e-con-full e-flex e-con e-child\" data-id=\"8d02f63\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-caa2c6e e-con-full e-flex e-con e-child\" data-id=\"caa2c6e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0e26009 elementor-widget elementor-widget-heading\" data-id=\"0e26009\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Vous recherchez une exp\u00e9rience unique pour c\u00e9l\u00e9brer une occasion sp\u00e9ciale avec votre groupe ?<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e5645b elementor-widget elementor-widget-heading\" data-id=\"7e5645b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">\u00c0 Lloret de Mar (Espagne), nous proposons un forfait exclusif qui combine un d\u00e9licieux repas ou d\u00eener dans un restaurant local avec un spectacle priv\u00e9 de stripper \u00e0 la fin, parfait pour surprendre l'invit\u00e9 d'honneur.<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c1737e elementor-widget elementor-widget-image\" data-id=\"0c1737e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"469\" height=\"223\" src=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg\" class=\"attachment-large size-large wp-image-12539\" alt=\"\" srcset=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg 469w, https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party-300x143.jpg 300w\" sizes=\"(max-width: 469px) 100vw, 469px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c47790d e-flex e-con-boxed e-con e-parent\" data-id=\"c47790d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8bb7c31 elementor-widget elementor-widget-text-editor\" data-id=\"8bb7c31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"event-promo-container\"><div class=\"event-header\"><h2 style=\"font-size: 22px; text-align: center;\">D\u00eener et Spectacle Amusant de stripteaseuse ou de stripteaseur\u00a0<\/h2><p class=\"subtitle\" style=\"text-align: center;\">Une Exp\u00e9rience Inoubliable pour Votre Groupe<\/p><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ddc96f elementor-widget elementor-widget-text-editor\" data-id=\"7ddc96f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"event-content\">\n<div class=\"event-details\">\n<h3 style=\"text-align; font-size: 22px;\" data-mce-style=\"text-align; font-size: 22px;\">D\u00e9tails de l&rsquo;Activit\u00e9<\/h3>\n<ul style=\"text-align: left;\" data-mce-style=\"text-align: left;\">\n<li><strong>Type d&rsquo;\u00c9v\u00e9nement :<\/strong> D\u00e9jeuner ou D\u00eener avec un spectacle priv\u00e9 et amusant de stripper \u00e9poustouflant (exclusivement pour votre groupe) apr\u00e8s le repas.<\/li>\n<li><strong>Lieu :<\/strong> Restaurant en bord de mer \u00e0 Lloret de Mar.<\/li>\n<li><strong>Menu Groupe :<\/strong> Comprend des entr\u00e9es \u00e0 partager ou des tapas, un plat principal par personne, dessert et un grand cocktail par personne.<\/li>\n<li><strong>Spectacle Surprise :<\/strong> Une performance palpitante de stripteaseuse ou de stripteaseur apr\u00e8s le d\u00e9jeuner ou le d\u00eener uniquement pour votre groupe.<\/li>\n<li><strong style=\"font-style: inherit;\" data-mce-style=\"font-style: inherit;\">Prix :<\/strong> <strong style=\"font-style: inherit;\" data-mce-style=\"font-style: inherit;\">\u00c0 partir de 59,90\u20ac par personne<\/strong><span style=\"font-style: inherit; font-weight: inherit;\" data-mce-style=\"font-style: inherit; font-weight: inherit;\"> (pour des groupes de 12 personnes ou plus). S&rsquo;il y a moins de personnes, le prix augmente l\u00e9g\u00e8rement selon le nombre.<\/span><\/li>\n<\/ul>\n<\/div>\n<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8647d46 elementor-widget elementor-widget-text-editor\" data-id=\"8647d46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"event-details\"><h3 style=\"text-align: left; font-size: 22px;\">Menu Groupe<\/h3><ul style=\"text-align: left;\"><li><strong>Entr\u00e9es \u00e0 Partager :<\/strong> Nachos avec guacamole et fromage, calamars \u00e0 l&rsquo;andalouse et nuggets de poulet.<\/li><li><strong>Plat Principal (Choisir Un Par Personne) :<\/strong><ul><li><strong>Burger de B\u0153uf (200gr) :<\/strong> Poivrons grill\u00e9s, bacon croustillant, oignons caram\u00e9lis\u00e9s, fromage Gruy\u00e8re et sauce BBQ.<\/li><li><strong>Burger V\u00e9g\u00e9tarien au Seitan et Tofu :<\/strong> Fromage Cheddar, oignon croquant, laitue et sauce moutarde au miel et tomate.<\/li><li><strong>Burger Crazy Chicken :<\/strong> Poitrines de poulet, oignons violets, fromage Provolone, laitue assortie, tomate, sauce soja, ketchup et moutarde.<\/li><\/ul><\/li><li><strong>Dessert par personne :<\/strong> Glace.<\/li><li><strong>Service de Boissons :<\/strong> 1 Cocktail XL (1 litre) par personne, \u00e0 choisir entre \u00ab\u00a0Sex On The Beach\u00a0\u00bb ou \u00ab\u00a0Sangria\u00a0\u00bb.<\/li><\/ul><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6dd78e8 elementor-widget elementor-widget-text-editor\" data-id=\"6dd78e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"event-perfect-for\">\n<h3 style=\"text-align;font-size: 22px;\">Parfait Pour<\/h3>\n<ul>\n<li style=\"text-align: left;\">EVJF<\/li>\n<li style=\"text-align: left;\">EVG<\/li>\n<li>Soir\u00e9e d&rsquo;Enterrement de Vie de Jeune Fille<\/li>\n<li>Soir\u00e9e d&rsquo;Enterrement de Vie de Gar\u00e7on<\/li>\n<li style=\"text-align: left;\">Anniversaires<\/li>\n<li style=\"text-align: left;\">\u00c9v\u00e9nements Sp\u00e9ciaux<\/li>\n<\/ul>\n<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86a580f elementor-widget elementor-widget-text-editor\" data-id=\"86a580f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"event-perfect-for\">\n<h3 style=\"font-size: 22px; text-align: left;\">Sur Demande<\/h3>\n<ul>\n<li style=\"text-align: left;\"><span style=\"font-style: inherit; font-weight: inherit;\">Disponible : Jours de Semaine et Week-ends<\/span><\/li>\n<\/ul>\n<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8eed443 e-flex e-con-boxed e-con e-parent\" data-id=\"8eed443\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-d6de270 e-con-full e-flex e-con e-child\" data-id=\"d6de270\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3392947 elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"3392947\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4 style=\"text-align: center; font-size: 22px;\">Pour tous les d\u00e9tails et pour commencer le processus de r\u00e9servation du d\u00eener et du spectacle de stripper pour votre groupe :<\/h4>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/08\/383153_arrow_double_down_icon.svg\" alt=\"\" width=\"26\" height=\"26\" \/><\/p>\n<p><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-73bc884 elementor-widget-mobile__width-initial elementor-widget elementor-widget-html\" data-id=\"73bc884\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<center>\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f12537-o1\" lang=\"fr-FR\" dir=\"ltr\" data-wpcf7-id=\"12537\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/fr\/wp-json\/wp\/v2\/pages\/12542#wpcf7-f12537-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulaire de contact\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"12537\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.4\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"fr_FR\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f12537-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/>\n<\/fieldset>\n<div class=\"wpcf7-turnstile cf-turnstile\" data-sitekey=\"0x4AAAAAAB3DAWl_mPMOEnz-\" data-response-field-name=\"_wpcf7_turnstile_response\"><\/div>\n\n<center>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"restaurant_id_\" value=\"Re_001\" type=\"hidden\" name=\"restaurant_id\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"lloret\" type=\"hidden\" name=\"city\" \/><!-- Backend Prices -->\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"showtype\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"main-courses-block\" value=\"\" type=\"hidden\" name=\"main_courses_block\" \/>\n<!-- Platos adelantados -->\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist-costumes-block\" value=\"\" type=\"hidden\" name=\"artist_costumes_block\" \/>\n<!-- Vestuario -->\n<!-- <input class=\"wpcf7-form-control wpcf7-hidden\" id=\"webhook_dinner\" value=\"restaurant_confirmation\" type=\"hidden\" name=\"webhook_dinner\" \/> -->\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"only_artist_confirmation\" type=\"hidden\" name=\"webhook_dinner\" \/>\n<!-- Webhook Only Artist or Restaurant Confirmation too -->\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist_id_male_1\" value=\"176ant\" type=\"hidden\" name=\"artist_id_male_1\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist_id_female_1\" value=\"45rps0\" type=\"hidden\" name=\"artist_id_female_1\" \/>\n\n<!-- Slots neutrales para Google Sheets Poner Max Artistas que haya por genero -->\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist1_id\" value=\"\" type=\"hidden\" name=\"artist1_id\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"photos_block_html\" value=\"\" type=\"hidden\" name=\"photos_block_html\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"request_block_html\" value=\"\" type=\"hidden\" name=\"request_block_html\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist_id\" value=\"\" type=\"hidden\" name=\"artist_id\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"url_espectaculo\" value=\"\" type=\"hidden\" name=\"url_espectaculo\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"request_artist_dinner\" value=\"\" type=\"hidden\" name=\"request_artist_dinner\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"delay-minutes\" value=\"\" type=\"hidden\" name=\"delay-minutes\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"page_url\" value=\"\" type=\"hidden\" name=\"page_url\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"currency\" value=\"eur\" type=\"hidden\" name=\"currency\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"language\" value=\"fr\" type=\"hidden\" name=\"language\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"event_type\" value=\"\" type=\"hidden\" name=\"event_type\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"booking_id\" value=\"\" type=\"hidden\" name=\"booking_id\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"platform\" value=\"SD_Global\" type=\"hidden\" name=\"platform\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"platform_name\" value=\"StrippersDeluxe.com\" type=\"hidden\" name=\"platform_name\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"request_type\" value=\"D\u00eener et spectacle\" type=\"hidden\" name=\"request_type\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"country\" value=\"Spain\" type=\"hidden\" name=\"country\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"city_province\" value=\"Girona\" type=\"hidden\" name=\"city_province\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo-espectaculo\" value=\"\" type=\"hidden\" name=\"tipo-espectaculo\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"telefono_completo\" value=\"\" type=\"hidden\" name=\"telefono_completo\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"nueva_fecha\" value=\"\" type=\"hidden\" name=\"nueva_fecha\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"fecha_completa\" value=\"\" type=\"hidden\" name=\"cf7_make_fecha_evento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"fecha_completa_es\" value=\"\" type=\"hidden\" name=\"cf7_make_fecha_evento_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"fecha_completa_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_fecha_evento_provider\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"hora_evento\" value=\"\" type=\"hidden\" name=\"cf7_make_hora_evento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_grupo_final\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_grupo\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_grupo_final_es\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_grupo_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_grupo_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_grupo_provider\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_evento_final\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_evento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_evento_final_es\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_evento_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tipo_evento_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_tipo_evento_provider\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"pais_origen\" value=\"\" type=\"hidden\" name=\"cf7_make_pais_origen\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"pais_origen_es\" value=\"\" type=\"hidden\" name=\"cf7_make_pais_origen_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"pais_origen_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_pais_origen_provider\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"price-per-person\" value=\"\" type=\"hidden\" name=\"price-per-person\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"total-price\" value=\"\" type=\"hidden\" name=\"total-price\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"show-time\" value=\"\" type=\"hidden\" name=\"show-time\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"show-time-en\" value=\"\" type=\"hidden\" name=\"show-time-en\" \/><!-- Formato anglosaj\u00f3n para inicio show dual -->\n\t<div class=\"form-group\">\n\t\t<p><label for=\"nombre\">Pr\u00e9nom :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"nombre\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"nombre\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Votre pr\u00e9nom\" value=\"\" type=\"text\" name=\"nombre\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"telefono\">T\u00e9l\u00e9phone portable :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"tel_st\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"telefono\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Votre num\u00e9ro de portable\" value=\"\" type=\"text\" name=\"tel_st\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"email_st\">Email :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"email_st\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" id=\"email_st\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Votre email\" value=\"\" type=\"email\" name=\"email_st\" \/><\/span>\n\t\t<\/p>\n\t\t<p style=\"font-size: 13px; font-weight: 600;\">\u261d V\u00e9rifiez bien votre email (vous recevrez des informations ici)\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"fecha\">S\u00e9lectionnez la date :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"fecha\"><input class=\"wpcf7-form-control wpcf7-date wpcf7-validates-as-required wpcf7-validates-as-date\" id=\"fecha\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"S\u00e9lectionnez la date*\" value=\"\" type=\"date\" name=\"fecha\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"horaaproximada\">Heure de d\u00e9but souhait\u00e9e :<\/label><br \/>\n<input type=\"time\" id=\"horaaproximada\" name=\"horaaproximada\" placeholder=\"HH:MM\" required \/>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"tipo_grupo\">Nous sommes un groupe de :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"tipo_grupo\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"tipo_grupo\" aria-required=\"true\" aria-invalid=\"false\" name=\"tipo_grupo\"><option value=\"Choisir\">Choisir<\/option><option value=\"Femmes\">Femmes<\/option><option value=\"Hommes\">Hommes<\/option><option value=\"Les deux\">Les deux<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\n\n <!-- Line break -->\n\t<div class=\"form-group\">\n\t\t<p><label for=\"tipo_evento\">Type de c\u00e9l\u00e9bration :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"tipo_evento\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"tipo_evento\" aria-required=\"true\" aria-invalid=\"false\" name=\"tipo_evento\"><option value=\"Choisir\">Choisir<\/option><option value=\"Enterrement de vie de jeune fille\">Enterrement de vie de jeune fille<\/option><option value=\"Enterrement de vie de gar\u00e7on\">Enterrement de vie de gar\u00e7on<\/option><option value=\"Anniversaire\">Anniversaire<\/option><option value=\"Autre type de f\u00eate\">Autre type de f\u00eate<\/option><option value=\"Autre\">Autre<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\n\n <!-- Line break -->\n\t<div class=\"form-group\">\n\t\t<p><label for=\"espectaculo\">Nous aimerions un spectacle de :<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"espectaculo\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"espectaculo\" aria-required=\"true\" aria-invalid=\"false\" name=\"espectaculo\"><option value=\"Selectionnez\">Selectionnez<\/option><option value=\"Stripteaseur Homme\">Stripteaseur Homme<\/option><option value=\"Stripteaseuse Femme\">Stripteaseuse Femme<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<p><label for=\"tipo-evento\">Nombre de personnes :<\/label>\n\t<\/p>\n\t<p style=\"font-size: 13px; font-weight: 600;\">Le nombre minimum de personnes requis est de 5\n\t<\/p>\n\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"group-size\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"group-size\" aria-required=\"true\" aria-invalid=\"false\" name=\"group-size\"><option value=\"\">&#8212;Veuillez choisir une option&#8212;<\/option><option value=\"5\">5<\/option><option value=\"6\">6<\/option><option value=\"7\">7<\/option><option value=\"8\">8<\/option><option value=\"9\">9<\/option><option value=\"10\">10<\/option><option value=\"11\">11<\/option><option value=\"12\">12<\/option><option value=\"13\">13<\/option><option value=\"14\">14<\/option><option value=\"15\">15<\/option><option value=\"16\">16<\/option><option value=\"17\">17<\/option><option value=\"18\">18<\/option><option value=\"19\">19<\/option><option value=\"20\">20<\/option><option value=\"21\">21<\/option><option value=\"22\">22<\/option><option value=\"23\">23<\/option><option value=\"24\">24<\/option><option value=\"25\">25<\/option><\/select><\/span>\n\t<\/p>\n\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"comentario\"><textarea cols=\"60\" rows=\"2\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea\" aria-invalid=\"false\" placeholder=\"Commentaires\" name=\"comentario\"><\/textarea><\/span><br \/>\n<b><span class=\"wpcf7-form-control-wrap\" data-name=\"capital-quiz\"><label><span class=\"wpcf7-quiz-label\">Question de s\u00e9curit\u00e9, 3 + 5 ?<\/span> <input size=\"40\" class=\"wpcf7-form-control wpcf7-quiz\" autocomplete=\"off\" aria-required=\"true\" aria-invalid=\"false\" type=\"text\" name=\"capital-quiz\" \/><\/label><input type=\"hidden\" name=\"_wpcf7_quiz_answer_capital-quiz\" value=\"11afca145c47aefc3302a99b32d5865a\" \/><\/span><\/b>\n\t<\/p>\n\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"acceptance-185\"><span class=\"wpcf7-form-control wpcf7-acceptance\"><span class=\"wpcf7-list-item\"><input type=\"checkbox\" name=\"acceptance-185\" value=\"1\" aria-invalid=\"false\" \/><\/span><\/span><\/span>J'ai lu et j'accepte la <a target=\"blank\" href=\"\/privacy-policy\/\"><strong><u>Politique de Confidentialit\u00e9<\/u><\/strong> et <\/a><a target=\"blank\" href=\"\/terms-and-conditions\/\"><strong><u>les conditions g\u00e9n\u00e9rales<\/u><\/strong><\/a><br \/>\n[recaptcha]\n\t<\/p>\n\t<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Envoyer\" \/>\n\t<\/p>\n\t<p>Cette page est prot\u00e9g\u00e9e par reCAPTCHA, et la <a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\">Politique de Confidentialit\u00e9<\/a> et les <a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\">Conditions d'utilisation<\/a> de Google s'appliquent.\n\t<\/p>\n<\/center><p style=\"display: none !important;\" class=\"akismet-fields-container\" data-prefix=\"_wpcf7_ak_\"><label>&#916;<textarea name=\"_wpcf7_ak_hp_textarea\" cols=\"45\" rows=\"8\" maxlength=\"100\"><\/textarea><\/label><input type=\"hidden\" id=\"ak_js_1\" name=\"_wpcf7_ak_js\" value=\"140\"\/><script>\ndocument.getElementById( \"ak_js_1\" ).setAttribute( \"value\", ( new Date() ).getTime() );\n<\/script>\n<\/p><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n<\/center><style class=\"wpcode-css-snippet\"><style>\r\n.event-promo-container {\r\n  max-width: 1200px;\r\n  margin: 0 auto;\r\n  padding: 40px 20px;\r\n  background: linear-gradient(135deg, #f5f7fa 0%, #e4e7eb 100%);\r\n  border-radius: 12px;\r\n  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\r\n  font-family: 'Arial', sans-serif;\r\n  text-align: left; \/* Ensures all content aligns to the left *\/\r\n}\r\n\r\n.event-header {\r\n  margin-bottom: 40px;\r\n}\r\n\r\n.event-header h1 {\r\n  font-size: 36px;\r\n  color: #1a1a1a;\r\n  margin-bottom: 10px;\r\n  text-align: left; \/* Explicitly align header to the left *\/\r\n}\r\n\r\n.event-header .subtitle {\r\n  font-size: 18px;\r\n  color: #555;\r\n  text-align: left; \/* Explicitly align subtitle to the left *\/\r\n}\r\n\r\n.event-content {\r\n  flex-wrap: wrap;\r\n  gap: 30px;\r\n  justify-content: center; \/* Align content to the left *\/\r\n}\r\n\r\n.event-details, .event-perfect-for {\r\n  border: 1px solid #1e293b;\r\n  flex: 1;\r\n  width: 85%;\r\n  margin-left: 15px;\r\n  min-width: 300px;\r\n  background: #1a73e808;\r\n  padding: 15px;\r\n  border-radius: 8px;\r\n  box-shadow: 0 1px 7px rgba(0, 0, 0, 0.5);\r\n  text-align: left; \/* Ensure text inside these sections is left-aligned *\/\r\n}\r\n\r\n.event-details h2, .event-perfect-for h2 {\r\n  font-size: 24px;\r\n  color: #1a1a1a;\r\n  margin-bottom: 15px;\r\n  text-align: left; \/* Ensure text inside these sections is left-aligned *\/\r\n\r\n}\r\n\r\n.event-details ul, .event-perfect-for ul {\r\n  list-style: none;\r\n  padding: 0;\r\n text-align: left; \/* Ensure text inside these sections is left-aligned *\/\r\n}\r\n\r\n.event-details ul li, .event-perfect-for ul li {\r\n  font-size: 16px;\r\n  color: #333;\r\n  margin-bottom: 10px;\r\n  line-height: 1.6;\r\n}\r\n\r\n.event-details ul li strong {\r\n  color: #0073aa;\r\n}\r\n\r\n.event-cta {\r\n  margin-top: 40px;\r\n  text-align: left; \/* Align call-to-action section to the left *\/\r\n}\r\n\r\n.event-cta p {\r\n  font-size: 18px;\r\n  color: #333;\r\n  margin-bottom: 20px;\r\n  text-align: left; \/* Ensure text inside these sections is left-aligned *\/\r\n\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .event-header h1 {\r\n    font-size: 28px;\r\n  }\r\n\r\n  .event-content {\r\n    flex-direction: column;\r\n  }\r\n\r\n  .event-details, .event-perfect-for {\r\n    width: 91%;\r\n\t  display: center;\r\n  }\r\n}\r\n<\/style><\/style><!-- CSS Dinner & Show City Url --><script defer>\r\n\/\/ ===== 1. EMAIL CHECKER UNIVERSAL (dominio + idiomas + validaci\u00f3n TLD) =====\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ ===== Config sitio (dominio + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                     : site.langs.includes(firstSeg) ? firstSeg\r\n                     : site.defaultLang;\r\n\r\n  \/\/ Definir los mensajes de validaci\u00f3n en varios idiomas\r\n  const messages = {\r\n    es: {\r\n      suggestion: \"\u00bfQuisiste decir\"\r\n    },\r\n    en: {\r\n      suggestion: \"Did you mean\"\r\n    },\r\n    fr: {\r\n      suggestion: \"Vouliez-vous dire\"\r\n    },\r\n    pt: {\r\n      suggestion: \"Voc\u00ea quis dizer\"\r\n    },\r\n    ca: {\r\n      suggestion: \"Volies dir\"\r\n    },\r\n    nl: {\r\n      suggestion: \"Bedoelde je\"\r\n    },\r\n    de: {\r\n      suggestion: \"Meinten Sie\"\r\n    }\r\n  };\r\n\r\n  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const langMessages = messages[currentLang] || messages[site.defaultLang];\r\n\r\n  const emailInput = document.getElementById(\"email_st\");\r\n\r\n  \/\/ Crear el mensaje de sugerencia din\u00e1mico\r\n  const emailErrorMessage = document.createElement('div');\r\n  emailErrorMessage.id = 'email-mensaje';\r\n  emailErrorMessage.style.display = 'none';\r\n  emailErrorMessage.style.marginTop = '5px';\r\n\r\n  \/\/ A\u00f1adir el mensaje despu\u00e9s del campo de email\r\n  if (emailInput) {\r\n    emailInput.parentNode.insertBefore(emailErrorMessage, emailInput.nextSibling);\r\n  }\r\n\r\n  \/\/ Lista de dominios de segundo nivel comunes\r\n  const commonSecondLevelDomains = [\r\n    \"gmail\", \"hotmail\", \"yahoo\", \"outlook\", \"icloud\",\r\n    \"aol\", \"msn\", \"comcast\", \"live\", \"me\",\r\n    \"ymail\", \"googlemail\", \"verizon\", \"att\", \"mail\",\r\n    \"btinternet\", \"btconnect\", \"blueyonder\", \"talktalk\", \"virginmedia\",\r\n    \"tiscali\", \"ntlworld\", \"yandex\", \"mail\", \"qq\",\r\n    \"web\", \"gmx\", \"freenet\", \"arcor\", \"libero\",\r\n    \"alice\", \"wanadoo\", \"orange\", \"neuf\", \"free\",\r\n    \"t-online\", \"o2\", \"wp\", \"onet\", \"seznam\",\r\n    \"centrum\", \"laposte\", \"sfr\", \"protonmail\", \"zoho\",\r\n    \"ya\", \"naver\", \"hanmail\", \"daum\", \"nate\"\r\n  ];\r\n\r\n  \/\/ Proveedores que NUNCA usan .co (solo usan .com)\r\n  const comOnlyProviders = [\r\n    \"gmail\", \"hotmail\", \"yahoo\", \"outlook\", \"aol\", \r\n    \"icloud\", \"ymail\", \"googlemail\", \"live\", \"msn\"\r\n  ];\r\n\r\n  \/\/ TLDs v\u00e1lidos de al menos 2 caracteres\r\n  const validTLDs = [\r\n    'com', 'net', 'org', 'edu', 'gov', 'mil', 'int',\r\n    'es', 'fr', 'de', 'it', 'pt', 'nl', 'be', 'uk', 'ie', 'ch', 'at',\r\n    'us', 'ca', 'mx', 'br', 'ar', 'cl', 'co', 've', 'pe', 'ec',\r\n    'info', 'biz', 'name', 'pro', 'io', 'ai', 'app', 'me',\r\n    'dev', 'tech', 'online', 'site', 'store', 'shop', 'tv',\r\n    'email', 'xyz', 'cloud', 'digital', 'web', 'eu'\r\n  ];\r\n\r\n  \/\/ Mapa de TLD incorrectos -> TLD correcto\r\n  const tldTypos = {\r\n    \/\/ Errores m\u00e1s comunes de .com\r\n    'con': 'com',\r\n    'cim': 'com',\r\n    'vom': 'com',\r\n    'cpm': 'com',\r\n    'comm': 'com',\r\n    'xom': 'com',\r\n    'coom': 'com',\r\n    'coml': 'com',\r\n    'ccom': 'com',\r\n    'come': 'com',\r\n    'ocm': 'com',\r\n    'clm': 'com',\r\n    'comi': 'com',\r\n    'comn': 'com',\r\n    'cmo': 'com',\r\n    'copm': 'com',\r\n    'colm': 'com',\r\n    'conm': 'com',\r\n    'coim': 'com',\r\n    'comj': 'com',\r\n    \r\n    \/\/ Errores comunes de otros TLDs\r\n    'ner': 'net',\r\n    'ney': 'net',\r\n    'met': 'net',\r\n    'bet': 'net',\r\n    'nt': 'net',\r\n    'nrt': 'net',\r\n    \r\n    'ogr': 'org',\r\n    'oeg': 'org',\r\n    'prg': 'org',\r\n    \r\n    'se': 'es',\r\n    'ess': 'es',\r\n    \r\n    'ed': 'de',\r\n    'dd': 'de',\r\n    \r\n    'oc': 'co',\r\n    'cp': 'co',\r\n    \r\n    'uki': 'uk',\r\n    'ul': 'uk'\r\n  };\r\n\r\n  \/\/ Funci\u00f3n para verificar y sugerir correcciones\r\n  function checkEmail() {\r\n    const email = emailInput.value.toLowerCase().trim();\r\n    emailErrorMessage.style.display = \"none\";\r\n    \r\n    \/\/ Resetear borde si est\u00e1 vac\u00edo\r\n    if (!email) {\r\n      emailInput.style.borderColor = '';\r\n      return;\r\n    }\r\n\r\n    \/\/ Verificar que el formato general sea v\u00e1lido\r\n    if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)) {\r\n      emailInput.style.borderColor = '#ff4444';\r\n      return;\r\n    }\r\n\r\n    \/\/ Extraer partes del email\r\n    const [localPart, domainPart] = email.split(\"@\");\r\n    const domainParts = domainPart.split(\".\");\r\n    \r\n    \/\/ Validar que tenga al menos dominio.tld\r\n    if (domainParts.length < 2) {\r\n      emailInput.style.borderColor = '#ff4444';\r\n      return;\r\n    }\r\n\r\n    const secondLevelDomain = domainParts[0];\r\n    const tld = domainParts[domainParts.length - 1];\r\n\r\n    \/\/ VALIDACI\u00d3N: TLD de una sola letra con proveedores comunes\r\n    if (tld.length === 1 && comOnlyProviders.includes(secondLevelDomain)) {\r\n      emailInput.style.borderColor = '#ff9800';\r\n      const suggestedEmail = `${localPart}@${secondLevelDomain}.com`;\r\n      displayEmailMessage(`${langMessages.suggestion} \"${suggestedEmail}\"?`);\r\n      return;\r\n    }\r\n\r\n    \/\/ VALIDACI\u00d3N: TLD de una sola letra en general (muy probable error)\r\n    if (tld.length === 1) {\r\n      emailInput.style.borderColor = '#ff4444';\r\n      return;\r\n    }\r\n\r\n    \/\/ CASO ESPECIAL: Proveedores que nunca usan .co (solo .com)\r\n    if (tld === 'co' && comOnlyProviders.includes(secondLevelDomain)) {\r\n      emailInput.style.borderColor = '#ff9800';\r\n      const correctedDomainParts = [...domainParts];\r\n      correctedDomainParts[correctedDomainParts.length - 1] = 'com';\r\n      const suggestedEmail = `${localPart}@${correctedDomainParts.join('.')}`;\r\n      displayEmailMessage(`${langMessages.suggestion} \"${suggestedEmail}\"?`);\r\n      return;\r\n    }\r\n\r\n    \/\/ Verificar TLD con errores tipogr\u00e1ficos\r\n    if (tldTypos[tld]) {\r\n      emailInput.style.borderColor = '#ff9800';\r\n      const correctTld = tldTypos[tld];\r\n      const correctedDomainParts = [...domainParts];\r\n      correctedDomainParts[correctedDomainParts.length - 1] = correctTld;\r\n      const suggestedEmail = `${localPart}@${correctedDomainParts.join('.')}`;\r\n      displayEmailMessage(`${langMessages.suggestion} \"${suggestedEmail}\"?`);\r\n      return;\r\n    }\r\n\r\n    \/\/ Verificar si el dominio base est\u00e1 en la lista de dominios comunes\r\n    if (commonSecondLevelDomains.includes(secondLevelDomain)) {\r\n    \/\/ Email v\u00e1lido - Borde \r\n      emailInput.style.borderColor = '#4caf50';\r\n      return;\r\n    } else {\r\n      const suggestion = getClosestDomain(secondLevelDomain, commonSecondLevelDomains);\r\n      if (suggestion && suggestion !== secondLevelDomain) {\r\n        emailInput.style.borderColor = '#ff9800';\r\n        const correctedEmail = `${localPart}@${suggestion}.${tld}`;\r\n        displayEmailMessage(`${langMessages.suggestion} \"${correctedEmail}\"?`);\r\n        return;\r\n      }\r\n    }\r\n\r\n    \/\/ Si llega aqu\u00ed y el TLD es v\u00e1lido, considerarlo correcto\r\n    if (validTLDs.includes(tld) && tld.length >= 2) {\r\n      emailInput.style.borderColor = '#4caf50';\r\n    }\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para encontrar el dominio de segundo nivel m\u00e1s cercano en caso de error tipogr\u00e1fico\r\n  function getClosestDomain(domain, domainList) {\r\n    let closestDomain = null;\r\n    let smallestDistance = Infinity;\r\n    domainList.forEach((commonDomain) => {\r\n      const distance = levenshteinDistance(domain, commonDomain);\r\n      if (distance < smallestDistance && distance <= 2) {\r\n        smallestDistance = distance;\r\n        closestDomain = commonDomain;\r\n      }\r\n    });\r\n    return closestDomain;\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para calcular la distancia de Levenshtein entre dos cadenas\r\n  function levenshteinDistance(a, b) {\r\n    const matrix = Array.from({ length: a.length + 1 }, () => []);\r\n    for (let i = 0; i <= a.length; i++) matrix[i][0] = i;\r\n    for (let j = 0; j <= b.length; j++) matrix[0][j] = j;\r\n    for (let i = 1; i <= a.length; i++) {\r\n      for (let j = 1; j <= b.length; j++) {\r\n        matrix[i][j] = a[i - 1] === b[j - 1]\r\n          ? matrix[i - 1][j - 1]\r\n          : Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + 1);\r\n      }\r\n    }\r\n    return matrix[a.length][b.length];\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para mostrar mensaje de sugerencia\r\n  function displayEmailMessage(message) {\r\n    emailErrorMessage.innerText = message;\r\n    emailErrorMessage.className = 'success-message';\r\n    emailErrorMessage.style.display = 'block';\r\n  }\r\n\r\n  \/\/ Evento para verificar el correo al perder el foco\r\n  if (emailInput) {\r\n    emailInput.addEventListener(\"blur\", checkEmail);\r\n    emailInput.addEventListener(\"input\", function() {\r\n      emailErrorMessage.style.display = 'none';\r\n      \/\/ Resetear borde mientras escribe\r\n      if (emailInput.value.trim() === '') {\r\n        emailInput.style.borderColor = '';\r\n      }\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n\r\n<style>\r\n\/* Estilos para email checker *\/\r\n#email-mensaje {\r\n  padding: 8px 12px;\r\n  border-radius: 4px;\r\n  font-size: 14px;\r\n  margin-top: 5px;\r\n}\r\n\r\n.success-message {\r\n  background-color: #fff3e0;\r\n  color: #e65100;\r\n  border-left: 4px solid #ff9800;\r\n}\r\n\r\n\/* Transici\u00f3n suave para el borde *\/\r\n#email_st {\r\n  transition: border-color 0.3s ease;\r\n}\r\n<\/style>\r\n\r\n<script defer>\r\n\/\/ ===== 2. C\u00c1LCULO DE HORA DE SHOW CON DELAY DIN\u00c1MICO =====\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n    const dinnerStartTimeInput = document.querySelector(\"#horaaproximada\");\r\n    const dinnerStartTimeHidden = document.querySelector('input[name=\"horaaproximada\"]');\r\n    const showTimeField = document.querySelector('input[name=\"show-time\"]');\r\n    const showTimeEnField = document.querySelector('input[name=\"show-time-en\"]');\r\n    const delayField = document.querySelector('input[name=\"delay-minutes\"]');\r\n\r\n    if (!dinnerStartTimeInput) {\r\n        console.error('Campo horaaproximada no encontrado');\r\n        return;\r\n    }\r\n\r\n    function calculateShowTime() {\r\n        const dinnerStartTime = dinnerStartTimeInput.value;\r\n        \r\n        \/\/ Copiar al hidden si existe\r\n        if (dinnerStartTimeHidden) {\r\n            dinnerStartTimeHidden.value = dinnerStartTime;\r\n        }\r\n        \r\n        \/\/ Validar formato de hora\r\n        if (!dinnerStartTime || !dinnerStartTime.includes(':')) {\r\n            if (showTimeField) showTimeField.value = '';\r\n            if (showTimeEnField) showTimeEnField.value = '';\r\n            return;\r\n        }\r\n        \r\n        const timeParts = dinnerStartTime.split(':');\r\n        if (timeParts.length !== 2) return;\r\n        \r\n        const hours = parseInt(timeParts[0]);\r\n        const minutes = parseInt(timeParts[1]);\r\n        \r\n        if (isNaN(hours) || isNaN(minutes)) return;\r\n        \r\n        \/\/ Leer delay desde el campo (ya fue llenado por el script de pricing)\r\n        const delayInMinutes = delayField && delayField.value ? parseInt(delayField.value) : 60;\r\n        \r\n        \/\/ Calcular hora de show\r\n        const dinnerStartDate = new Date();\r\n        dinnerStartDate.setHours(hours, minutes, 0, 0);\r\n        const showStartDate = new Date(dinnerStartDate.getTime() + delayInMinutes * 60000);\r\n        const showTime = showStartDate.toTimeString().split(':').slice(0, 2).join(':');\r\n        \r\n        \/\/ Formato 24h\r\n        if (showTimeField) {\r\n            showTimeField.value = showTime;\r\n        }\r\n        \r\n        \/\/ Formato 12h \/ 24h (ingl\u00e9s)\r\n        if (showTimeEnField) {\r\n            const showTimeParts = showTime.split(':');\r\n            const showHours = parseInt(showTimeParts[0]);\r\n            const showMinutes = parseInt(showTimeParts[1]);\r\n            const period = showHours >= 12 ? 'PM' : 'AM';\r\n            const hours12 = showHours % 12 || 12;\r\n            const formattedShowTime = `${hours12}:${showMinutes.toString().padStart(2, '0')} ${period} \/ ${showHours.toString().padStart(2, '0')}:${showMinutes.toString().padStart(2, '0')}h`;\r\n            showTimeEnField.value = formattedShowTime;\r\n        }\r\n        \r\n        console.log(`Show time: ${showTime} (delay: ${delayInMinutes}min)`);\r\n    }\r\n\r\n    \/\/ Calcular cuando cambia la hora de cena\r\n    dinnerStartTimeInput.addEventListener(\"input\", calculateShowTime);\r\n    dinnerStartTimeInput.addEventListener(\"change\", calculateShowTime);\r\n    \r\n    \/\/ **MEJORADO: Observar cambios en el campo delay con MutationObserver**\r\n    if (delayField) {\r\n        \/\/ Listener directo para eventos 'change' e 'input'\r\n        delayField.addEventListener('change', function() {\r\n            console.log('Delay changed via event:', delayField.value);\r\n            if (dinnerStartTimeInput.value) {\r\n                calculateShowTime();\r\n            }\r\n        });\r\n        \r\n        delayField.addEventListener('input', function() {\r\n            console.log('Delay input via event:', delayField.value);\r\n            if (dinnerStartTimeInput.value) {\r\n                calculateShowTime();\r\n            }\r\n        });\r\n        \r\n        \/\/ MutationObserver para detectar cuando otro script cambia el value\r\n        const observer = new MutationObserver(function(mutations) {\r\n            mutations.forEach(function(mutation) {\r\n                if (mutation.type === 'attributes' && mutation.attributeName === 'value') {\r\n                    console.log('Delay changed via mutation:', delayField.value);\r\n                    if (dinnerStartTimeInput.value) {\r\n                        calculateShowTime();\r\n                    }\r\n                }\r\n            });\r\n        });\r\n        \r\n        observer.observe(delayField, {\r\n            attributes: true,\r\n            attributeFilter: ['value']\r\n        });\r\n        \r\n        \/\/ Polling como fallback (cada 500ms por 5 segundos)\r\n        let pollCount = 0;\r\n        const maxPolls = 10;\r\n        const pollInterval = setInterval(function() {\r\n            pollCount++;\r\n            const currentDelay = delayField.value;\r\n            \r\n            if (currentDelay && currentDelay !== '60' && dinnerStartTimeInput.value) {\r\n                console.log('Delay detected via polling:', currentDelay);\r\n                calculateShowTime();\r\n                clearInterval(pollInterval);\r\n            }\r\n            \r\n            if (pollCount >= maxPolls) {\r\n                clearInterval(pollInterval);\r\n            }\r\n        }, 500);\r\n    }\r\n    \r\n    \/\/ Calcular al cargar si ya hay valor (con peque\u00f1o delay para esperar el pricing)\r\n    setTimeout(function() {\r\n        if (dinnerStartTimeInput.value) {\r\n            calculateShowTime();\r\n        }\r\n    }, 300);\r\n});\r\n<\/script>\r\n\r\n\r\n<script defer>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n\t\/\/ 3. Script Tipo de Grupo - Tipo de Evento\r\n  \/\/ ===== Config sitio (dominio + idiomas) Ojo hay que probar que los providers dif idiomas funcione binen de momento solamente aqu\u00ed en SD Global=====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                     : site.langs.includes(firstSeg) ? firstSeg\r\n                     : site.defaultLang;\r\n\r\n  \/\/ Asignar idioma a campo oculto, si existe\r\n  const langHidden = document.getElementById('lang-hidden');\r\n  if (langHidden) langHidden.value = currentLang;\r\n\r\n  \/\/ Localizaciones para todos los idiomas soportados\r\n  const locales = {\r\n    es: {\r\n      tipo_grupo_options: ['Elige', 'Chicas', 'Chicos', 'Ambos'],\r\n      tipo_evento_options: ['Elige', 'Despedida de soltera', 'Despedida de soltero', 'Cumplea\u00f1os', 'Otro tipo de fiesta', 'Otro'],\r\n      tipo_grupo_label: 'Somos un grupo de:',\r\n      tipo_evento_label: 'Tipo de celebraci\u00f3n:',\r\n      requiredMessage: 'Por favor, selecciona una opci\u00f3n v\u00e1lida.',\r\n      invalidGrupoMessage: 'Por favor, selecciona un tipo de grupo v\u00e1lido (no \"Elige\").',\r\n      invalidEventoMessage: 'Por favor, selecciona un tipo de celebraci\u00f3n v\u00e1lido (no \"Elige\").',\r\n      successGrupoMessage: 'Muy bien',\r\n      successEventoMessage: 'Perfecto'\r\n    },\r\n    en: {\r\n      tipo_grupo_options: ['Choose', 'Women', 'Men', 'Both'],\r\n      tipo_evento_options: ['Choose', 'Bachelorette or Hen party', 'Bachelor or Stag party', 'Birthday', 'Other type of party', 'Other'],\r\n      tipo_grupo_label: 'We are a group of:',\r\n      tipo_evento_label: 'Type of celebration:',\r\n      requiredMessage: 'Please select a valid option.',\r\n      invalidGrupoMessage: 'Please select a valid group type (not \"Choose\").',\r\n      invalidEventoMessage: 'Please select a valid celebration type (not \"Choose\").',\r\n      successGrupoMessage: 'Very good!',\r\n      successEventoMessage: 'Perfect'\r\n    },\r\n    fr: {\r\n      tipo_grupo_options: ['Choisir', 'Femmes', 'Hommes', 'Les deux'],\r\n      tipo_evento_options: ['Choisir', 'Enterrement de vie de jeune fille', 'Enterrement de vie de gar\u00e7on', 'Anniversaire', 'Autre type de f\u00eate', 'Autre'],\r\n      tipo_grupo_label: 'Nous sommes un groupe de :',\r\n      tipo_evento_label: 'Type de c\u00e9l\u00e9bration :',\r\n      requiredMessage: 'Veuillez s\u00e9lectionner une option valide.',\r\n      invalidGrupoMessage: 'Veuillez s\u00e9lectionner un type de groupe valide (pas \"Choisir\").',\r\n      invalidEventoMessage: 'Veuillez s\u00e9lectionner un type de c\u00e9l\u00e9bration valide (pas \"Choisir\").',\r\n      successGrupoMessage: 'Tr\u00e8s bien',\r\n      successEventoMessage: 'Parfait'\r\n    },\r\n    ca: {\r\n      tipo_grupo_options: ['Tria', 'Dones', 'Homes', 'Tots dos'],\r\n      tipo_evento_options: ['Tria', 'Comiat de soltera', 'Comiat de solter', 'Aniversari', 'Altre tipus de festa', 'Altres'],\r\n      tipo_grupo_label: 'Som un grup de:',\r\n      tipo_evento_label: 'Tipus de celebraci\u00f3:',\r\n      requiredMessage: 'Si us plau, selecciona una opci\u00f3 v\u00e0lida.',\r\n      invalidGrupoMessage: 'Si us plau, selecciona un tipus de grup v\u00e0lid (no \"Tria\").',\r\n      invalidEventoMessage: 'Si us plau, selecciona un tipus de celebraci\u00f3 v\u00e0lid (no \"Tria\").',\r\n      successGrupoMessage: 'Molt b\u00e9',\r\n      successEventoMessage: 'Perfecte'\r\n    },\r\n    pt: {\r\n      tipo_grupo_options: ['Escolher', 'Mulheres', 'Homens', 'Ambos'],\r\n      tipo_evento_options: ['Escolher', 'Despedida de solteira', 'Despedida de solteiro', 'Anivers\u00e1rio', 'Outro tipo de festa', 'Outro'],\r\n      tipo_grupo_label: 'Somos um grupo de:',\r\n      tipo_evento_label: 'Tipo de celebra\u00e7\u00e3o:',\r\n      requiredMessage: 'Por favor, selecione uma op\u00e7\u00e3o v\u00e1lida.',\r\n      invalidGrupoMessage: 'Por favor, selecione um tipo de grupo v\u00e1lido (n\u00e3o \"Escolher\").',\r\n      invalidEventoMessage: 'Por favor, selecione um tipo de celebra\u00e7\u00e3o v\u00e1lido (n\u00e3o \"Escolher\").',\r\n      successGrupoMessage: 'Muito bem',\r\n      successEventoMessage: 'Perfeito'\r\n    },\r\n    nl: {\r\n      tipo_grupo_options: ['Kies', 'Vrouwen', 'Mannen', 'Beiden'],\r\n      tipo_evento_options: ['Kies', 'Vrijgezellenfeest voor vrouwen', 'Vrijgezellenfeest voor mannen', 'Verjaardag', 'Ander soort feest', 'Ander'],\r\n      tipo_grupo_label: 'Wij zijn een groep van:',\r\n      tipo_evento_label: 'Soort viering:',\r\n      requiredMessage: 'Selecteer een geldige optie.',\r\n      invalidGrupoMessage: 'Selecteer een geldig groepstype (nicht \"Kies\").',\r\n      invalidEventoMessage: 'Selecteer een geldig vieringstype (nicht \"Kies\").',\r\n      successGrupoMessage: 'Goed gedaan',\r\n      successEventoMessage: 'Perfect'\r\n    },\r\n    de: {\r\n      tipo_grupo_options: ['Ausw\u00e4hlen', 'Frauen', 'M\u00e4nner', 'Beiden'],\r\n      tipo_evento_options: ['Ausw\u00e4hlen', 'Junggesellinnenabschied', 'Junggesellenabschied', 'Geburtstag', 'Andere Art von Feier', 'Andere'],\r\n      tipo_grupo_label: 'Wir sind eine Gruppe von:',\r\n      tipo_evento_label: 'Art der Feier:',\r\n      requiredMessage: 'Bitte w\u00e4hlen Sie eine g\u00fcltige Option aus.',\r\n      invalidGrupoMessage: 'Bitte w\u00e4hlen Sie eine g\u00fcltige Gruppenart aus (nicht \"Ausw\u00e4hlen\").',\r\n      invalidEventoMessage: 'Bitte w\u00e4hlen Sie eine g\u00fcltige Feierart aus (nicht \"Ausw\u00e4hlen\").',\r\n      successGrupoMessage: 'Sehr gut',\r\n      successEventoMessage: 'Perfekt'\r\n    }\r\n  };\r\n\r\n  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const messages = locales[currentLang] || locales[site.defaultLang];\r\n\r\n  \/\/ Elementos del DOM\r\n  const tipoGrupoField = document.getElementById('tipo_grupo');\r\n  const tipoEventoField = document.getElementById('tipo_evento');\r\n  const hiddenTipoGrupo = document.getElementById('tipo_grupo_final');\r\n  const hiddenTipoEvento = document.getElementById('tipo_evento_final');\r\n  const providerTipoGrupo = document.getElementById('tipo_grupo_provider');\r\n  const providerTipoEvento = document.getElementById('tipo_evento_provider');\r\n  const extraTipoGrupoField = document.querySelector('[id^=\"tipo_grupo_final_\"]');\r\n  const extraTipoEventoField = document.querySelector('[id^=\"tipo_evento_final_\"]');\r\n  const form = tipoGrupoField ? tipoGrupoField.closest('form') : null;\r\n\r\n  \/\/ Crear contenedores para mensajes\r\n  const grupoErrorDisplay = document.createElement('div');\r\n  grupoErrorDisplay.id = 'tipo-grupo-error-display';\r\n  grupoErrorDisplay.className = 'error-message';\r\n  grupoErrorDisplay.style.display = 'none';\r\n  grupoErrorDisplay.style.color = 'white';\r\n  grupoErrorDisplay.style.marginTop = '5px';\r\n  if (tipoGrupoField) {\r\n    tipoGrupoField.parentNode.insertBefore(grupoErrorDisplay, tipoGrupoField.nextSibling);\r\n  }\r\n\r\n  const grupoSuccessDisplay = document.createElement('div');\r\n  grupoSuccessDisplay.id = 'tipo-grupo-success-display';\r\n  grupoSuccessDisplay.className = 'success-message';\r\n  grupoSuccessDisplay.style.display = 'none';\r\n  grupoSuccessDisplay.style.color = 'green';\r\n  grupoSuccessDisplay.style.marginTop = '5px';\r\n  if (tipoGrupoField) {\r\n    tipoGrupoField.parentNode.insertBefore(grupoSuccessDisplay, grupoErrorDisplay.nextSibling);\r\n  }\r\n\r\n  const eventoErrorDisplay = document.createElement('div');\r\n  eventoErrorDisplay.id = 'tipo-evento-error-display';\r\n  eventoErrorDisplay.className = 'error-message';\r\n  eventoErrorDisplay.style.display = 'none';\r\n  eventoErrorDisplay.style.color = 'white';\r\n  eventoErrorDisplay.style.marginTop = '5px';\r\n  if (tipoEventoField) {\r\n    tipoEventoField.parentNode.insertBefore(eventoErrorDisplay, tipoEventoField.nextSibling);\r\n  }\r\n\r\n  const eventoSuccessDisplay = document.createElement('div');\r\n  eventoSuccessDisplay.id = 'tipo-evento-success-display';\r\n  eventoSuccessDisplay.className = 'success-message';\r\n  eventoSuccessDisplay.style.display = 'none';\r\n  eventoSuccessDisplay.style.color = 'green';\r\n  eventoSuccessDisplay.style.marginTop = '5px';\r\n  if (tipoEventoField) {\r\n    tipoEventoField.parentNode.insertBefore(eventoSuccessDisplay, eventoErrorDisplay.nextSibling);\r\n  }\r\n\r\n  \/\/ Rastrear interacci\u00f3n del usuario\r\n  let hasInteractedGrupo = false;\r\n  let hasInteractedEvento = false;\r\n\r\n  \/\/ Forzar redibujo del mensaje\r\n  function forceRedraw(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight;\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ Formatear valores para campos ocultos\r\n  function formatValue(value, options, targetLocale, sourceLocale) {\r\n    const sourceOptions = options === 'tipo_grupo' ? locales[sourceLocale].tipo_grupo_options : locales[sourceLocale].tipo_evento_options;\r\n    const targetOptions = options === 'tipo_grupo' ? locales[targetLocale].tipo_grupo_options : locales[targetLocale].tipo_evento_options;\r\n    const index = sourceOptions.indexOf(value);\r\n    return index === -1 ? value : targetOptions[index] || value;\r\n  }\r\n\r\n  \/\/ Validar campos\r\n  function validateFields() {\r\n    if (!tipoGrupoField || !tipoEventoField || !hiddenTipoGrupo || !hiddenTipoEvento) {\r\n      return false;\r\n    }\r\n\r\n    let isValid = true;\r\n    const { tipo_grupo_options, tipo_evento_options, invalidGrupoMessage, invalidEventoMessage, successGrupoMessage, successEventoMessage } = messages;\r\n\r\n    \/\/ Validar tipo_grupo\r\n    if (hasInteractedGrupo && (!tipoGrupoField.value || tipoGrupoField.value === tipo_grupo_options[0])) {\r\n      tipoGrupoField.setCustomValidity(invalidGrupoMessage);\r\n      grupoErrorDisplay.innerText = invalidGrupoMessage;\r\n      grupoErrorDisplay.style.display = 'block';\r\n      grupoSuccessDisplay.style.display = 'none';\r\n      forceRedraw(grupoErrorDisplay);\r\n      isValid = false;\r\n    } else if (tipoGrupoField.value && tipoGrupoField.value !== tipo_grupo_options[0]) {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.innerText = successGrupoMessage;\r\n      grupoSuccessDisplay.style.display = 'block';\r\n      forceRedraw(grupoSuccessDisplay);\r\n    } else {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Validar tipo_evento\r\n    if (hasInteractedEvento && (!tipoEventoField.value || tipoEventoField.value === tipo_evento_options[0])) {\r\n      tipoEventoField.setCustomValidity(invalidEventoMessage);\r\n      eventoErrorDisplay.innerText = invalidEventoMessage;\r\n      eventoErrorDisplay.style.display = 'block';\r\n      eventoSuccessDisplay.style.display = 'none';\r\n      forceRedraw(eventoErrorDisplay);\r\n      isValid = false;\r\n    } else if (tipoEventoField.value && tipoEventoField.value !== tipo_evento_options[0]) {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.innerText = successEventoMessage;\r\n      eventoSuccessDisplay.style.display = 'block';\r\n      forceRedraw(eventoSuccessDisplay);\r\n    } else {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Asignar valores a campos ocultos\r\n    hiddenTipoGrupo.value = formatValue(tipoGrupoField.value, 'tipo_grupo', currentLang, currentLang);\r\n    hiddenTipoEvento.value = formatValue(tipoEventoField.value, 'tipo_evento', currentLang, currentLang);\r\n\r\n    \/\/ Asignar valores para el proveedor\r\n    let grupoProviderLocale = site.defaultLang;\r\n    if (extraTipoGrupoField) {\r\n      const localeFromExtra = extraTipoGrupoField.id.replace('tipo_grupo_final_', '');\r\n      if (site.langs.includes(localeFromExtra)) {\r\n        grupoProviderLocale = localeFromExtra;\r\n      }\r\n    }\r\n    if (providerTipoGrupo) {\r\n      providerTipoGrupo.value = formatValue(tipoGrupoField.value, 'tipo_grupo', grupoProviderLocale, currentLang);\r\n      if (extraTipoGrupoField) extraTipoGrupoField.value = providerTipoGrupo.value;\r\n    }\r\n\r\n    let eventoProviderLocale = site.defaultLang;\r\n    if (extraTipoEventoField) {\r\n      const localeFromExtra = extraTipoEventoField.id.replace('tipo_evento_final_', '');\r\n      if (site.langs.includes(localeFromExtra)) {\r\n        eventoProviderLocale = localeFromExtra;\r\n      }\r\n    }\r\n    if (providerTipoEvento) {\r\n      providerTipoEvento.value = formatValue(tipoEventoField.value, 'tipo_evento', eventoProviderLocale, currentLang);\r\n      if (extraTipoEventoField) extraTipoEventoField.value = providerTipoEvento.value;\r\n    }\r\n\r\n    return isValid;\r\n  }\r\n\r\n  \/\/ Validar antes del env\u00edo\r\n  function validateForm(event) {\r\n    const { tipo_grupo_options, tipo_evento_options, invalidGrupoMessage, invalidEventoMessage, successGrupoMessage, successEventoMessage } = messages;\r\n    let isValid = true;\r\n\r\n    if (!tipoGrupoField.value || tipoGrupoField.value === tipo_grupo_options[0]) {\r\n      event.preventDefault();\r\n      event.stopImmediatePropagation();\r\n      tipoGrupoField.setCustomValidity(invalidGrupoMessage);\r\n      grupoErrorDisplay.innerText = invalidGrupoMessage;\r\n      grupoErrorDisplay.style.display = 'block';\r\n      grupoSuccessDisplay.style.display = 'none';\r\n      forceRedraw(grupoErrorDisplay);\r\n      tipoGrupoField.focus();\r\n      isValid = false;\r\n    } else {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.innerText = successGrupoMessage;\r\n      grupoSuccessDisplay.style.display = 'block';\r\n      forceRedraw(grupoSuccessDisplay);\r\n    }\r\n\r\n    if (!tipoEventoField.value || tipoEventoField.value === tipo_evento_options[0]) {\r\n      event.preventDefault();\r\n      event.stopImmediatePropagation();\r\n      tipoEventoField.setCustomValidity(invalidEventoMessage);\r\n      eventoErrorDisplay.innerText = invalidEventoMessage;\r\n      eventoErrorDisplay.style.display = 'block';\r\n      eventoSuccessDisplay.style.display = 'none';\r\n      forceRedraw(eventoErrorDisplay);\r\n      tipoEventoField.focus();\r\n      isValid = false;\r\n    } else {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.innerText = successEventoMessage;\r\n      eventoSuccessDisplay.style.display = 'block';\r\n      forceRedraw(eventoSuccessDisplay);\r\n    }\r\n\r\n    return isValid;\r\n  }\r\n\r\n  \/\/ Listeners\r\n  if (tipoGrupoField) {\r\n    tipoGrupoField.addEventListener('change', () => {\r\n      hasInteractedGrupo = true;\r\n      validateFields();\r\n    });\r\n  }\r\n  if (tipoEventoField) {\r\n    tipoEventoField.addEventListener('change', () => {\r\n      hasInteractedEvento = true;\r\n      validateFields();\r\n    });\r\n  }\r\n  if (form) form.addEventListener('submit', validateForm);\r\n\r\n  \/\/ Inicializar al cargar\r\n  validateFields();\r\n});\r\n\r\n<\/script>\r\n\r\n<script defer>\r\n\/\/ ===== 4. Script Validaci\u00f3n Horarios Dinner & Show (versi\u00f3n final con horarios din\u00e1micos) =====\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es' },\r\n    'strippersdeluxe.es':  { defaultLang: 'es' },\r\n    'strippersdeluxe.com': { defaultLang: 'en' }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es' };\r\n  const htmlLang = (document.documentElement.lang || '').toLowerCase().split('-')[0];\r\n  const currentLang = ['es','en','fr','ca','pt','nl','de'].includes(htmlLang) ? htmlLang : site.defaultLang;\r\n\r\n  const locales = {\r\n    es: {\r\n      alert1: \"El inicio de la comida o cena debe estar dentro del horario de apertura del restaurante: {allowedHours}. Por favor, elija un horario v\u00e1lido.\",\r\n      alert2: \"Lo sentimos, el restaurante est\u00e1 cerrado el d\u00eda seleccionado. Por favor, elija otra fecha.\",\r\n      success: \"\u2713 Perfecto\",\r\n      warning1: \"Lo sentimos, no hay disponibilidad. Las solicitudes de reserva deben hacerse con al menos {hours} horas de antelaci\u00f3n por motivos de organizaci\u00f3n.\",\r\n      warning2: \"Al quedar menos de 5 d\u00edas para el evento, deber\u00edas iniciar el proceso de reserva hoy o lo antes posible si el grupo est\u00e1 interesado. No os podemos garantizar disponibilidad. Revisa la bandeja de entrada (y la de Spam por si acaso) tras el env\u00edo del formulario. Gracias.\"\r\n    },\r\n    en: {\r\n      alert1: \"The start time for lunch or dinner must be within the restaurant's allowed hours: {allowedHours}. Please select a valid time.\",\r\n      alert2: \"Sorry, the restaurant is closed on the selected day. Please choose another date.\",\r\n      success: \"\u2713 Great choice\",\r\n      warning1: \"Sorry, there is no availability. Reservation requests must be made at least {hours} hours in advance for organizational reasons.\",\r\n      warning2: \"With less than 5 days until the event, you should start the reservation process today or as soon as possible if the group is interested. We cannot guarantee availability. Please check your inbox (and spam folder just in case) after submitting the form. Thank you.\"\r\n    },\r\n    fr: {\r\n      alert1: \"L'heure de d\u00e9but du d\u00e9jeuner ou du d\u00eener doit \u00eatre dans les horaires autoris\u00e9s du restaurant: {allowedHours}. Veuillez s\u00e9lectionner une heure valide.\",\r\n      alert2: \"D\u00e9sol\u00e9, le restaurant est ferm\u00e9 le jour s\u00e9lectionn\u00e9. Veuillez choisir une autre date.\",\r\n      success: \"\u2713 Parfait\",\r\n      warning1: \"D\u00e9sol\u00e9, il n'y a pas de disponibilit\u00e9. Les demandes de r\u00e9servation doivent \u00eatre faites au moins {hours} heures \u00e0 l'avance pour des raisons organisationnelles.\",\r\n      warning2: \"\u00c0 moins de 5 jours de l'\u00e9v\u00e9nement, vous devriez commencer le processus de r\u00e9servation aujourd'hui ou le plus t\u00f4t possible si le groupe est int\u00e9ress\u00e9. Nous ne pouvons garantir la disponibilit\u00e9. Veuillez v\u00e9rifier votre bo\u00eete de r\u00e9ception (et votre dossier de spam au cas o\u00f9) apr\u00e8s avoir envoy\u00e9 le formulaire. Merci.\"\r\n    },\r\n    ca: {\r\n      alert1: \"L'hora d'inici del dinar o sopar ha d'estar dins de l'horari perm\u00e8s del restaurant: {allowedHours}. Si us plau, seleccioneu una hora v\u00e0lida.\",\r\n      alert2: \"Ho sentim, el restaurant est\u00e0 tancat el dia seleccionat. Si us plau, trieu una altra data.\",\r\n      success: \"\u2713 Perfecte\",\r\n      warning1: \"Ho sentim, no hi ha disponibilitat. Les sol\u00b7licituds de reserva s'han de fer amb almenys {hours} hores d'antelaci\u00f3 per motius d'organitzaci\u00f3.\",\r\n      warning2: \"En quedar menys de 5 dies per a l'esdeveniment, haurieu d'iniciar el proc\u00e9s de reserva avui o el m\u00e9s aviat possible si el grup est\u00e0 interessat. No podem garantir disponibilitat. Reviseu la safata d'entrada (i la carpeta de correu brossa per si de cas) despr\u00e9s d'enviar el formulari. Gr\u00e0cies.\"\r\n    },\r\n    pt: {\r\n      alert1: \"O hor\u00e1rio de in\u00edcio do almo\u00e7o ou jantar deve estar dentro das horas permitidas do restaurante: {allowedHours}. Por favor, selecione um hor\u00e1rio v\u00e1lido.\",\r\n      alert2: \"Desculpe, o restaurante est\u00e1 fechado no dia selecionado. Por favor, escolha outra data.\",\r\n      success: \"\u2713 Perfeito\",\r\n      warning1: \"Desculpe, n\u00e3o h\u00e1 disponibilidade. As solicita\u00e7\u00f5es de reserva devem ser feitas com pelo menos {hours} horas de anteced\u00eancia por motivos organizacionais.\",\r\n      warning2: \"Com menos de 5 dias at\u00e9 o evento, voc\u00ea deve iniciar o processo de reserva hoje ou o mais r\u00e1pido poss\u00edvel se o grupo estiver interessado. N\u00e3o podemos garantir disponibilidade. Verifique sua caixa de entrada (e pasta de spam por precau\u00e7\u00e3o) ap\u00f3s enviar o formul\u00e1rio. Obrigado.\"\r\n    },\r\n    nl: {\r\n      alert1: \"De starttijd voor lunch of diner moet binnen de toegestane uren van het restaurant liggen: {allowedHours}. Selecteer alstublieft een geldige tijd.\",\r\n      alert2: \"Sorry, het restaurant is gesloten op de geselecteerde dag. Kies alstublieft een andere datum.\",\r\n      success: \"\u2713 Geweldige keuze\",\r\n      warning1: \"Sorry, er is geen beschikbaarheid. Reserveringsaanvragen moeten minimaal {hours} uur van tevoren worden gedaan om organisatorische redenen.\",\r\n      warning2: \"Met minder dan 5 dagen tot het evenement, moet u vandaag of zo snel mogelijk het reserveringsproces starten als de groep ge\u00efnteresseerd is. We kunnen geen beschikbaarheid garanderen. Controleer uw inbox (en spamfolder voor de zekerheid) na het verzenden van het formulier. Bedankt.\"\r\n    },\r\n    de: {\r\n      alert1: \"Die Startzeit f\u00fcr das Mittag- oder Abendessen muss innerhalb der erlaubten \u00d6ffnungszeiten des Restaurants liegen: {allowedHours}. Bitte w\u00e4hlen Sie eine g\u00fcltige Zeit.\",\r\n      alert2: \"Es tut uns leid, das Restaurant ist am ausgew\u00e4hlten Tag geschlossen. Bitte w\u00e4hlen Sie ein anderes Datum.\",\r\n      success: \"\u2713 Perfekt\",\r\n      warning1: \"Es tut uns leid, es gibt keine Verf\u00fcgbarkeit. Reservierungsanfragen m\u00fcssen mindestens {hours} Stunden im Voraus gestellt werden aus organisatorischen Gr\u00fcnden.\",\r\n      warning2: \"Da weniger als 5 Tage bis zum Event verbleiben, sollten Sie den Reservierungsprozess heute oder so bald wie m\u00f6glich beginnen, wenn die Gruppe interessiert ist. Wir k\u00f6nnen keine Verf\u00fcgbarkeit garantieren. Bitte \u00fcberpr\u00fcfen Sie Ihren Posteingang (und den Spam-Ordner zur Sicherheit) nach dem Absenden des Formulars. Vielen Dank.\"\r\n    }\r\n  };\r\n\r\n  const messages = locales[currentLang] || locales.es;\r\n  const form = document.querySelector(\"form.wpcf7-form\");\r\n  const horaInput = document.getElementById(\"horaaproximada\");\r\n  const fechaInput = document.getElementById(\"fecha\");\r\n\r\n  if (!horaInput || !fechaInput || !form) return;\r\n\r\n  const errorMsg = document.createElement('div');\r\n  errorMsg.id = 'hora-error';\r\n  errorMsg.style.display = 'none';\r\n  errorMsg.style.marginTop = '5px';\r\n\r\n  const successMsg = document.createElement('div');\r\n  successMsg.id = 'hora-success';\r\n  successMsg.style.display = 'none';\r\n  successMsg.style.marginTop = '5px';\r\n\r\n  const warning1 = document.createElement('div');\r\n  warning1.id = 'warning1';\r\n  warning1.style.display = 'none';\r\n  warning1.style.marginTop = '5px';\r\n\r\n  const warning2 = document.createElement('div');\r\n  warning2.id = 'warning2';\r\n  warning2.style.display = 'none';\r\n  warning2.style.marginTop = '5px';\r\n\r\n  horaInput.parentNode.insertBefore(errorMsg, horaInput.nextSibling);\r\n  horaInput.parentNode.insertBefore(successMsg, errorMsg.nextSibling);\r\n  horaInput.parentNode.insertBefore(warning1, successMsg.nextSibling);\r\n  horaInput.parentNode.insertBefore(warning2, warning1.nextSibling);\r\n\r\n  function show(el, msg, cls) {\r\n    el.innerText = msg;\r\n    el.className = cls;\r\n    el.style.display = 'block';\r\n  }\r\n\r\n  function hide(el) {\r\n    el.style.display = 'none';\r\n  }\r\n\r\n  function getCity() {\r\n    const cityField = form.querySelector('input[name=\"city\"]');\r\n    return (cityField && cityField.value) ? cityField.value.trim() : 'lloret';\r\n  }\r\n\r\n  \/\/ Normalizaci\u00f3n de g\u00e9nero (igual que en el otro script)\r\n  function normalizedGender(sel) {\r\n    if (!sel) return 'male';\r\n    \r\n    const v = (sel.value || '').trim();\r\n    if (v === '' || v === 'male' || v === 'female') return v || 'male';\r\n    \r\n    if (sel.tagName === 'SELECT') {\r\n      const label = (sel.options[sel.selectedIndex]?.text || '').trim().toLowerCase();\r\n      const maleLabels = ['stripper chico o boy','male stripper','stripteaseur homme','stripper home','stripper masculino','mannelijke stripper','m\u00e4nnlicher stripper'];\r\n      const femaleLabels = ['stripper chica','female stripper','stripteaseuse femme','stripper dona','stripper feminino','vrouwelijke stripper','weibliche stripperin'];\r\n      const placeholders = ['selecciona','choose','s\u00e9lectionnez','seleccione','selecione','kies','w\u00e4hlen','ausw\u00e4hlen','seleccioneu'];\r\n      \r\n      if (placeholders.includes(label)) return 'male'; \/\/ Default si no han seleccionado\r\n      if (maleLabels.includes(label)) return 'male';\r\n      if (femaleLabels.includes(label)) return 'female';\r\n    }\r\n    \r\n    return 'male'; \/\/ Fallback\r\n  }\r\n\r\n  let config = {\r\n    closedDays: [],\r\n    allowedHours: [],\r\n    minAdvanceHours: 20,\r\n    loaded: false\r\n  };\r\n\r\n  async function loadConfig() {\r\n    const city = getCity();\r\n    const groupSizeField = form.querySelector('#group-size');\r\n    const espectaculoField = form.querySelector('#espectaculo') || form.querySelector('input[name=\"espectaculo\"]');\r\n    \r\n    const groupSize = (groupSizeField && groupSizeField.value) ? groupSizeField.value : '8';\r\n    const showType = normalizedGender(espectaculoField);\r\n\r\n    try {\r\n      const url = `\/wp-json\/global\/v1\/calculate-dinner-show?database=pricing&groupSize=${groupSize}&showType=${showType}&city=${city}&token=dinnershow_public_2025_xK9mP3vL`;\r\n      const res = await fetch(url);\r\n      const data = await res.json();\r\n\r\n      console.log('API Response:', data);\r\n\r\n      if (data.success && data.restaurantConfig) {\r\n        const rc = data.restaurantConfig;\r\n        \r\n        config.closedDays = rc.closedDays ? \r\n          rc.closedDays.split(',')\r\n            .map(d => parseInt(d.trim()))\r\n            .filter(n => !isNaN(n)) \r\n          : [];\r\n        \r\n        if (rc.allowedHours) {\r\n          const cleanHours = rc.allowedHours.trim().replace(\/^[\"']|[\"']$\/g, '').trim();\r\n          console.log('Raw allowedHours:', rc.allowedHours);\r\n          console.log('Cleaned allowedHours:', cleanHours);\r\n          \r\n          config.allowedHours = cleanHours.split(',').map(range => {\r\n            const trimmedRange = range.trim();\r\n            const parts = trimmedRange.split('-');\r\n            \r\n            if (parts.length !== 2) {\r\n              console.error('Invalid range format:', trimmedRange);\r\n              return null;\r\n            }\r\n            \r\n            const [start, end] = parts;\r\n            const startParts = start.trim().split(':');\r\n            const endParts = end.trim().split(':');\r\n            \r\n            if (startParts.length !== 2 || endParts.length !== 2) {\r\n              console.error('Invalid time format:', start, end);\r\n              return null;\r\n            }\r\n            \r\n            const sH = parseInt(startParts[0]);\r\n            const sM = parseInt(startParts[1]);\r\n            const eH = parseInt(endParts[0]);\r\n            const eM = parseInt(endParts[1]);\r\n            \r\n            if (isNaN(sH) || isNaN(sM) || isNaN(eH) || isNaN(eM)) {\r\n              console.error('NaN in time parsing:', { sH, sM, eH, eM });\r\n              return null;\r\n            }\r\n            \r\n            return { \r\n              start: sH * 60 + sM, \r\n              end: eH * 60 + eM,\r\n              label: start.trim() + '-' + end.trim()\r\n            };\r\n          }).filter(r => r !== null);\r\n          \r\n          console.log('Parsed allowedHours:', config.allowedHours);\r\n        } else {\r\n          config.allowedHours = [\r\n            { start: 12*60, end: 15*60, label: '12:00-15:00' },\r\n            { start: 19*60, end: 22*60+30, label: '19:00-22:30' }\r\n          ];\r\n        }\r\n        \r\n        config.minAdvanceHours = rc.minAdvanceHours || 20;\r\n        config.loaded = true;\r\n        \r\n        console.log('Final config:', config);\r\n      } else {\r\n        console.error('No restaurantConfig in response:', data);\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading config:', error);\r\n      config.loaded = false;\r\n    }\r\n  }\r\n\r\n  function formatAllowedHours() {\r\n    if (!config.allowedHours || config.allowedHours.length === 0) {\r\n      return '';\r\n    }\r\n    \r\n    \/\/ Obtener los labels de cada rango\r\n    const ranges = config.allowedHours.map(range => range.label);\r\n    \r\n    \/\/ Unir con separador seg\u00fan el idioma\r\n    const separators = {\r\n      es: ' o ',\r\n      en: ' or ',\r\n      fr: ' ou ',\r\n      ca: ' o ',\r\n      pt: ' ou ',\r\n      nl: ' of ',\r\n      de: ' oder '\r\n    };\r\n    \r\n    const separator = separators[currentLang] || ' or ';\r\n    return ranges.join(separator);\r\n  }\r\n\r\n  function validate() {\r\n    hide(errorMsg);\r\n    hide(successMsg);\r\n    hide(warning1);\r\n    hide(warning2);\r\n\r\n    if (!config.loaded) {\r\n      console.log('Config not loaded yet, waiting...');\r\n      return null;\r\n    }\r\n\r\n    const hora = horaInput.value.trim();\r\n    const fecha = fechaInput.value.trim();\r\n\r\n    if (!hora || !fecha) {\r\n      console.log('Waiting for date and time...');\r\n      return null;\r\n    }\r\n\r\n    const dt = new Date(fecha + 'T' + hora);\r\n    if (isNaN(dt.getTime())) {\r\n      const formattedHours = formatAllowedHours();\r\n      show(errorMsg, messages.alert1.replace('{allowedHours}', formattedHours), 'error-message');\r\n      return false;\r\n    }\r\n\r\n    if (config.closedDays.includes(dt.getDay())) {\r\n      show(errorMsg, messages.alert2, 'error-message');\r\n      return false;\r\n    }\r\n\r\n    const selectedMin = dt.getHours() * 60 + dt.getMinutes();\r\n    let valid = false;\r\n    \r\n    for (const range of config.allowedHours) {\r\n      if (selectedMin >= range.start && selectedMin <= range.end) {\r\n        valid = true;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!valid) {\r\n      console.log('Time not in allowed range:', selectedMin, 'minutes. Allowed ranges:', config.allowedHours);\r\n      const formattedHours = formatAllowedHours();\r\n      show(errorMsg, messages.alert1.replace('{allowedHours}', formattedHours), 'error-message');\r\n      return false;\r\n    }\r\n\r\n    const now = new Date();\r\n    const limit = new Date(now.getTime() + config.minAdvanceHours * 60 * 60 * 1000);\r\n    \r\n    if (dt < limit) {\r\n      show(warning1, messages.warning1.replace('{hours}', config.minAdvanceHours), 'error-message');\r\n      return false;\r\n    }\r\n\r\n    const limit5 = new Date(now.getTime() + 120 * 60 * 60 * 1000);\r\n    if (dt >= limit && dt < limit5) {\r\n      show(warning2, messages.warning2, 'error-message');\r\n    }\r\n\r\n    show(successMsg, messages.success, 'success-message');\r\n    return true;\r\n  }\r\n\r\n  horaInput.addEventListener(\"input\", validate);\r\n  fechaInput.addEventListener(\"input\", validate);\r\n\r\n  const groupSizeField = form.querySelector('#group-size');\r\n  const espectaculoField = form.querySelector('#espectaculo') || form.querySelector('input[name=\"espectaculo\"]');\r\n  \r\n  if (groupSizeField) {\r\n    groupSizeField.addEventListener('change', function() {\r\n      loadConfig().then(validate);\r\n    });\r\n  }\r\n  \r\n  if (espectaculoField && espectaculoField.tagName === 'SELECT') {\r\n    espectaculoField.addEventListener('change', function() {\r\n      loadConfig().then(validate);\r\n    });\r\n  }\r\n\r\n  loadConfig().then(() => {\r\n    console.log('Initial config load complete');\r\n    setTimeout(validate, 100);\r\n  });\r\n\r\n  form.addEventListener(\"submit\", function(event) {\r\n    const result = validate();\r\n    if (result === false) {\r\n      event.preventDefault();\r\n      event.stopImmediatePropagation();\r\n      horaInput.focus();\r\n      horaInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      return false;\r\n    }\r\n  }, true);\r\n});\r\n<\/script>\r\n\r\n\r\n\r\n<script defer>\r\n\t  \/\/ ===== 5. Script Num Personas =====\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  \/\/ ===== Config sitio (todos los dominios + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  let currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                   : site.langs.includes(firstSeg) ? firstSeg\r\n                   : site.defaultLang;\r\n\r\n  \/\/ Asignar idioma y URL a elementos ocultos, si existen\r\n  const langHidden = document.getElementById('lang-hidden');\r\n  const pageUrlEl = document.getElementById('page-url');\r\n  if (langHidden) langHidden.value = currentLang;\r\n  if (pageUrlEl) pageUrlEl.value = window.location.href;\r\n\r\n  \/\/ Localizaciones para todos los idiomas soportados\r\n  const locales = {\r\n    es: {\r\n      alert: \"Por favor, selecciona n\u00famero de personas.\",\r\n      success: \"\u2713 Bien\"\r\n    },\r\n    en: {\r\n      alert: \"Please select the number of people.\",\r\n      success: \"\u2713 Nice\"\r\n    },\r\n    fr: {\r\n      alert: \"Veuillez s\u00e9lectionner le nombre de personnes.\",\r\n      success: \"\u2713 Super\"\r\n    },\r\n    ca: {\r\n      alert: \"Si us plau, seleccioneu el nombre de persones.\",\r\n      success: \"\u2713 D'acord\"\r\n    },\r\n    pt: {\r\n      alert: \"Por favor, selecione o n\u00famero de pessoas.\",\r\n      success: \"\u2713 Bom\"\r\n    },\r\n    nl: {\r\n      alert: \"Selecteer alstublieft het aantal personen.\",\r\n      success: \"\u2713 Goed\"\r\n    },\r\n    de: {\r\n      alert: \"Bitte w\u00e4hlen Sie die Anzahl der Personen aus.\",\r\n      success: \"\u2713 Gut\"\r\n    }\r\n  };\r\n\r\n  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const messages = locales[currentLang] || locales[site.defaultLang];\r\n\r\n  \/\/ Elementos del formulario\r\n  const form = document.querySelector(\"form.wpcf7-form\");\r\n  const groupSizeInput = document.getElementById(\"group-size\");\r\n\r\n  \/\/ Crear el mensaje de error din\u00e1mico\r\n  const groupSizeErrorMessage = document.createElement('div');\r\n  groupSizeErrorMessage.id = 'group-size-mensaje';\r\n  groupSizeErrorMessage.style.display = 'none';\r\n  groupSizeErrorMessage.style.marginTop = '5px';\r\n\r\n  \/\/ Crear el mensaje de \u00e9xito din\u00e1mico\r\n  const groupSizeSuccessMessage = document.createElement('div');\r\n  groupSizeSuccessMessage.id = 'group-size-success-mensaje';\r\n  groupSizeSuccessMessage.style.display = 'none';\r\n  groupSizeSuccessMessage.style.marginTop = '5px';\r\n\r\n  \/\/ A\u00f1adir los mensajes despu\u00e9s del campo de grupo\r\n  if (groupSizeInput) {\r\n    groupSizeInput.parentNode.insertBefore(groupSizeErrorMessage, groupSizeInput.nextSibling);\r\n    groupSizeInput.parentNode.insertBefore(groupSizeSuccessMessage, groupSizeErrorMessage.nextSibling);\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para mostrar mensaje de error o \u00e9xito y forzar redibujo\r\n  function displayGroupSizeMessage(message, className) {\r\n    const messageElement = className === 'error-message' ? groupSizeErrorMessage : groupSizeSuccessMessage;\r\n    messageElement.innerText = message;\r\n    messageElement.className = className;\r\n    messageElement.style.display = 'block';\r\n    forceRedraw(messageElement); \/\/ Forzar redibujo para visibilidad correcta\r\n  }\r\n\r\n  \/\/ Forzar redibujo del mensaje\r\n  function forceRedraw(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight; \/\/ Forzar redibujo\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ Al cambiar el n\u00famero de personas\r\n  if (groupSizeInput) {\r\n    groupSizeInput.addEventListener(\"change\", function () {\r\n      \/\/ Si el valor est\u00e1 vac\u00edo, mostrar el mensaje de error\r\n      if (!groupSizeInput.value) {\r\n        displayGroupSizeMessage(messages.alert, 'error-message'); \/\/ Muestra el mensaje de error\r\n      } else {\r\n        displayGroupSizeMessage(messages.success, 'success-message'); \/\/ Muestra el mensaje de \u00e9xito\r\n        groupSizeErrorMessage.style.display = 'none'; \/\/ Oculta el mensaje de error\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Si el formulario se env\u00eda sin seleccionar el n\u00famero de personas, mostrar el mensaje de error\r\n  if (form) {\r\n    form.addEventListener(\"submit\", function (event) {\r\n      \/\/ Validar que se haya seleccionado un n\u00famero de personas\r\n      if (!groupSizeInput.value) {\r\n        displayGroupSizeMessage(messages.alert, 'error-message'); \/\/ Muestra el mensaje de error\r\n        event.preventDefault(); \/\/ Prevenir el env\u00edo del formulario\r\n        event.stopImmediatePropagation(); \/\/ Detener otros manejadores\r\n        groupSizeInput.focus(); \/\/ Enfocar el campo de n\u00famero de personas\r\n        return false; \/\/ Detener el flujo de env\u00edo\r\n      }\r\n\r\n      \/\/ Si se selecciona un n\u00famero v\u00e1lido, se limpia el mensaje de error\r\n      groupSizeErrorMessage.style.display = 'none';\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\/\/ 6.PRICING SEGURO - Dinner & Show (Unificado: male\/female\/drag)\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n    const groupSizeField = document.querySelector(\"#group-size\");\r\n    const espectaculoField = document.querySelector(\"#espectaculo\");\r\n    const form = document.querySelector(\".wpcf7-form\");\r\n    \r\n    if (!groupSizeField || !form) {\r\n        return;\r\n    }\r\n    \r\n    console.log('=== Pricing Script (Secure) ===');\r\n    \r\n    \/\/ Campo hidden para showType (si no existe)\r\n    let showTypeHidden = form.querySelector('input[name=\"showtype\"]');\r\n    if (!showTypeHidden) {\r\n        showTypeHidden = document.createElement('input');\r\n        showTypeHidden.type = 'hidden';\r\n        showTypeHidden.name = 'showtype';\r\n        form.appendChild(showTypeHidden);\r\n    }\r\n    \r\n    \/\/ Funcion para obtener city (dinamica)\r\n    function getCity() {\r\n        const cityField = form.querySelector('input[name=\"city\"]');\r\n        const cityValue = (cityField && cityField.value) ? cityField.value.trim() : '';\r\n        return cityValue || 'lloret';\r\n    }\r\n    \r\n    \/\/ Normalizacion de genero - Orden: Espa\u00f1ol > Ingl\u00e9s > Franc\u00e9s > Catal\u00e1n > Portugu\u00e9s > Alem\u00e1n > Holand\u00e9s\r\n\r\nconst maleLabels = new Set(['stripper chico o boy','male stripper','stripteaseur homme','stripper home','stripper masculino','mannlicher stripper','mannelijke stripper']);\r\nconst femaleLabels = new Set(['stripper chica','female stripper','stripteaseuse femme','stripper dona','stripper feminino','weibliche stripperin','vrouwelijke stripper']);\r\nconst placeholders = new Set(['selecciona','choose','selectionnez','seleccioneu','selecione','wahlen','kies']);\r\n\r\n        function normalizedGender(sel) {\r\n        \/\/ Si no hay selector (Drag Queen), devolver null\r\n        if (!sel) return null;\r\n        \r\n        const v = (sel.value || '').trim();\r\n        if (v === '' || v === 'male' || v === 'female' || v === 'drag') return v;\r\n        const label = (sel.options[sel.selectedIndex]?.text || '').trim().toLowerCase();\r\n        if (placeholders.has(label)) return '';\r\n        if (maleLabels.has(label)) return 'male';\r\n        if (femaleLabels.has(label)) return 'female';\r\n        return '';\r\n    }\r\n    \r\n    async function fetchPricing() {\r\n        const groupSize = groupSizeField.value;\r\n        \r\n        if (!groupSize || groupSize === '') {\r\n            console.log('Waiting for group size...');\r\n            return;\r\n        }\r\n        \r\n        \/\/ Detectar showType:\r\n        \/\/ 1. Si hay selector (#espectaculo), usarlo\r\n        \/\/ 2. Si es campo hidden con value fijo, usarlo\r\n        \/\/ 3. Si no existe, null\r\n        let showType = null;\r\n        \r\n        if (espectaculoField) {\r\n            if (espectaculoField.tagName === 'SELECT') {\r\n                \/\/ Es un selector (male\/female)\r\n                showType = normalizedGender(espectaculoField);\r\n            } else if (espectaculoField.tagName === 'INPUT' && espectaculoField.type === 'hidden') {\r\n                \/\/ Es hidden con valor fijo (drag)\r\n                showType = espectaculoField.value.trim();\r\n            }\r\n        }\r\n        \r\n        if (!showType) {\r\n            console.log('Waiting for valid show type...');\r\n            return;\r\n        }\r\n        \r\n        const city = getCity();\r\n        \r\n        \/\/ Sincronizar showType\r\n        showTypeHidden.value = showType;\r\n        console.log('ShowType synced:', showType);\r\n        \r\n        console.log('Fetching pricing: groupSize=' + groupSize + ', showType=' + showType + ', city=' + city);\r\n        \r\n        try {\r\n            const url = `\/wp-json\/global\/v1\/calculate-dinner-show?database=pricing&groupSize=${groupSize}&showType=${showType}&city=${city}&token=dinnershow_public_2025_xK9mP3vL`;\r\n            const response = await fetch(url);\r\n            const data = await response.json();\r\n            \r\n            if (data.success) {\r\n                console.log('Pricing calculated successfully');\r\n                \r\n                const fieldMap = {\r\n                    'delay-minutes': data.delayInMinutes,\r\n                    'price-per-person': data.pricePerPerson,\r\n                    'total-price': data.totalPrice\r\n                };\r\n                \r\n                let populatedCount = 0;\r\n                Object.keys(fieldMap).forEach(fieldName => {\r\n                    const field = form.querySelector(`input[name=\"${fieldName}\"]`);\r\n                    if (field && fieldMap[fieldName]) {\r\n                        field.value = fieldMap[fieldName];\r\n                        populatedCount++;\r\n                    }\r\n                });\r\n                \r\n                console.log(populatedCount + ' fields populated');\r\n                console.log('Price: EUR' + data.pricePerPerson + '\/person | Total: EUR' + data.totalPrice);\r\n                \r\n                const dinnerTimeInput = document.querySelector(\"#horaaproximada\");\r\n                if (dinnerTimeInput && dinnerTimeInput.value) {\r\n                    dinnerTimeInput.dispatchEvent(new Event('input'));\r\n                }\r\n            } else {\r\n                console.error('API error:', data.message || 'Unknown error');\r\n            }\r\n        } catch (error) {\r\n            console.error('Error fetching pricing:', error);\r\n        }\r\n    }\r\n    \r\n    groupSizeField.addEventListener('change', function() {\r\n        console.log('group-size changed:', this.value);\r\n        fetchPricing();\r\n    });\r\n    \r\n    \/\/ Solo anadir listener si el campo espectaculo es un SELECT\r\n    if (espectaculoField && espectaculoField.tagName === 'SELECT') {\r\n        espectaculoField.addEventListener('change', function() {\r\n            console.log('espectaculo changed:', this.value);\r\n            fetchPricing();\r\n        });\r\n    }\r\n    \r\n    console.log('Script initialized');\r\n    \r\n    setTimeout(() => {\r\n        \/\/ Auto-fetch si ya hay valores iniciales\r\n        if (groupSizeField.value) {\r\n            const showType = espectaculoField ? \r\n                (espectaculoField.tagName === 'SELECT' ? normalizedGender(espectaculoField) : espectaculoField.value.trim()) \r\n                : null;\r\n            \r\n            if (showType) {\r\n                console.log('Auto-fetching with initial values...');\r\n                fetchPricing();\r\n            }\r\n        }\r\n    }, 500);\r\n});\r\n<\/script>\r\n\r\n\r\n<script defer>\r\n\t  \/\/ ===== 7. Script Webhook Dinner & Show =====\r\n\/**\r\n * IMPORTANT: Booking Dinner & Artist | Dynamic Webhook Selection\r\n * Artist Selection Dinner & Show \u2013 N opciones por g\u00e9nero\r\n * - URL din\u00e1mica seg\u00fan webhook_dinner: only_artist_confirmation o restaurant_confirmation\r\n * - UI: success al cambiar, error solo al enviar\r\n * - Multi-sitio\/idioma (es,en,fr,ca,pt,nl,de)\r\n * - Lee IDs de: artist_id_{male|female}_*, artist_ids_{male|female} (CSV), y fallback single\r\n * - Slots neutrales para Sheets: artist1_id, artist2_id, artist3_id, ... (se rellenan con el g\u00e9nero elegido)\r\n * - (Opcional) JSON: artists_selected_json con ids\/urls\/hooks\r\n * - Webhook con booking_id si existe\r\n * - Bloques HTML: [photos_block_html] y [request_block_html] con todas las opciones\r\n * - Retro: rellena artist_id \/ artist_id_2 \/ url_espectaculo \/ _2 \/ request_* \/ _2 con las dos primeras (si existen)\r\n *\/\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n  \/\/ ===== Elementos base =====\r\n  const espectaculoField = document.getElementById('espectaculo');\r\n  const form = espectaculoField ? espectaculoField.closest('form') : null;\r\n\r\n  \/\/ Requisitos m\u00ednimos (verificaci\u00f3n temprana)\r\n  if (!espectaculoField || !form) {\r\n    console.error('[DS] Faltan campos requeridos: #espectaculo o <form>.');\r\n    return;\r\n  }\r\n\r\n  \/\/ Colecciones din\u00e1micas por patr\u00f3n y listas CSV\r\n  const maleManyEls   = Array.from(document.querySelectorAll('input[id^=\"artist_id_male_\"]'));\r\n  const femaleManyEls = Array.from(document.querySelectorAll('input[id^=\"artist_id_female_\"]'));\r\n  const maleCsvEl     = document.getElementById('artist_ids_male');\r\n  const femaleCsvEl   = document.getElementById('artist_ids_female');\r\n\r\n  \/\/ Fallback single\r\n  const idMaleEl   = document.getElementById('artist_id_male');\r\n  const idFemaleEl = document.getElementById('artist_id_female');\r\n\r\n  \/\/ Salidas m\u00ednimas (primera opci\u00f3n)\r\n  const artistIdEl = document.getElementById('artist_id');\r\n  const urlField   = document.getElementById('url_espectaculo');\r\n  const reqDinner  = document.getElementById('request_artist_dinner');\r\n\r\n  \/\/ Retro: segundas salidas (opci\u00f3n 2)\r\n  const artistIdEl2     = document.getElementById('artist_id_2');\r\n  const urlField2       = document.getElementById('url_espectaculo_2');\r\n  const reqDinner2      = document.getElementById('request_artist_dinner_2');\r\n\r\n  \/\/ Lista combinada\r\n  const artistIdsListEl = document.getElementById('artist_ids_selected');\r\n\r\n  \/\/ Bloques HTML\r\n  const photosBlock  = document.getElementById('photos_block_html');\r\n  const requestBlock = document.getElementById('request_block_html');\r\n\r\n  \/\/ Slots neutrales para Sheets (artist1_id, artist2_id, ...)\r\n  const neutralSlots = Array.from(\r\n    form.querySelectorAll('input[id$=\"_id\"]')\r\n  ).filter(el => \/^artist\\d+_id$\/.test(el.id));\r\n\r\n  \/\/ Opcional JSON para Make\/Sheets\r\n  const artistsSelectedJsonEl = document.getElementById('artists_selected_json');\r\n\r\n  \/\/ Opcionales\r\n  const bookingEl  = document.getElementById('booking_id');\r\n  const langHidden = document.getElementById('language');\r\n  const pageUrlEl  = document.getElementById('page_url');\r\n  \r\n  \/\/ **MODIFICADO: Campo para seleccionar webhook din\u00e1mico (buscar dentro del form)**\r\n  const webhookDinnerEl = form.querySelector('input[name=\"webhook_dinner\"]');\r\n\r\n  \/\/ Verificaci\u00f3n de campos m\u00ednimos\r\n  if (!artistIdEl || !urlField || !reqDinner) {\r\n    console.error('[DS] Faltan campos requeridos: #artist_id, #url_espectaculo, #request_artist_dinner.');\r\n    return;\r\n  }\r\n\r\n  \/\/ ===== Config sitio (dominio + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es','en','fr'],               domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es','en'],                    domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en','es','fr','ca','pt','nl','de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es','en','fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  let currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                   : site.langs.includes(firstSeg) ? firstSeg\r\n                   : site.defaultLang;\r\n\r\n  if (langHidden) langHidden.value = currentLang;\r\n  if (pageUrlEl)  pageUrlEl.value  = window.location.href;\r\n\r\n  \/\/ URL p\u00fablica por dominio + idioma\r\n  function buildArtistPublicUrl(artistId) {\r\n    const baseOverride = site.domainByLang[currentLang];\r\n    const baseOrigin   = baseOverride || window.location.origin;\r\n    const langPrefix   = (currentLang === site.defaultLang) ? '' : currentLang + '\/';\r\n    return baseOrigin.replace(\/\\\/+$\/, '') + '\/' + langPrefix + encodeURIComponent(artistId) + '\/';\r\n  }\r\n\r\n\/\/ Mensajes UI (incluye noAvailability en 6 idiomas)\r\n  const messagesByLang = {\r\n    es: {\r\n      noSelection: 'Por favor selecciona si os gustar\u00eda un espect\u00e1culo de chico o chica.',\r\n      noAvailability: 'Lo sentimos mucho. Ahora mismo no hay artistas disponibles para este g\u00e9nero en esta ciudad.',\r\n      success: '\u2713 Genial'\r\n    },\r\n    en: {\r\n      noSelection: 'Please select whether your group would like a male or female performer for the show.',\r\n      noAvailability: 'We\\'re very sorry. No performers are currently available for this gender in this city.',\r\n      success: '\u2713 Your group is going to have a blast'\r\n    },\r\n    fr: {\r\n      noSelection: 'Veuillez s\u00e9lectionner si votre groupe souhaite un spectacle avec un homme ou une femme.',\r\n      noAvailability: 'Nous sommes vraiment d\u00e9sol\u00e9s. Aucun artiste n\\'est actuellement disponible pour ce genre dans cette ville.',\r\n      success: '\u2713 Votre groupe va passer un moment incroyable'\r\n    },\r\n    ca: {\r\n      noSelection: 'Si us plau, seleccioneu si preferiu un espectacle de noi o noia.',\r\n      noAvailability: 'Ho sentim molt. Ara mateix no hi ha artistes disponibles per a aquest g\u00e8nere en aquesta ciutat.',\r\n      success: '\u2713 El vostre grup s\\'ho passar\u00e0 genial'\r\n    },\r\n    pt: {\r\n      noSelection: 'Por favor selecione se o grupo prefere um show com homem ou mulher.',\r\n      noAvailability: 'Lamentamos muito. No momento n\u00e3o h\u00e1 artistas dispon\u00edveis para este g\u00eanero nesta cidade.',\r\n      success: '\u2713 O grupo vai se divertir muito'\r\n    },\r\n    nl: {\r\n      noSelection: 'Selecteer of jullie een mannelijke of vrouwelijke artiest willen.',\r\n      noAvailability: 'Het spijt ons heel erg. Er zijn momenteel geen artiesten beschikbaar voor dit geslacht in deze stad.',\r\n      success: '\u2713 Jullie groep gaat het geweldig hebben'\r\n    },\r\n    de: {\r\n      noSelection: 'Bitte w\u00e4hlt, ob ihr einen m\u00e4nnlichen oder weiblichen K\u00fcnstler m\u00f6chtet.',\r\n      noAvailability: 'Es tut uns sehr leid. Momentan sind keine K\u00fcnstler f\u00fcr dieses Geschlecht in dieser Stadt verf\u00fcgbar.',\r\n      success: '\u2713 Eure Gruppe wird viel Spa\u00df haben'\r\n    }\r\n  };\r\n\r\n  const M = messagesByLang[currentLang] || messagesByLang[site.defaultLang];\r\n\r\n  \/\/ Contenedores de mensajes (error solo en submit)\r\n  const errorMessage = document.createElement('div');\r\n  errorMessage.id = 'espectaculo-error-message';\r\n  errorMessage.style.display = 'none';\r\n  errorMessage.style.marginTop = '5px';\r\n  errorMessage.setAttribute('role', 'alert');\r\n  errorMessage.setAttribute('aria-live', 'polite');\r\n\r\n  const successMessage = document.createElement('div');\r\n  successMessage.id = 'espectaculo-success-message';\r\n  successMessage.style.display = 'none';\r\n  successMessage.style.marginTop = '5px';\r\n  successMessage.setAttribute('role', 'status');\r\n  successMessage.setAttribute('aria-live', 'polite');\r\n\r\n  espectaculoField.parentNode.insertBefore(errorMessage, espectaculoField.nextSibling);\r\n  espectaculoField.parentNode.insertBefore(successMessage, errorMessage.nextSibling);\r\n\r\n  \/\/ Visual helpers\r\n  function forceRedibujo(el){ el.style.display='none'; el.offsetHeight; el.style.display='block'; }\r\n  function displayMessage(msg, className, el){ el.innerText=msg; el.className=className; el.style.display='block'; forceRedibujo(el); }\r\n  function hide(el){ if(el) el.style.display='none'; }\r\n\r\n  \/\/ **MODIFICADO: Webhook din\u00e1mico basado en campo webhook_dinner**\r\n  const WEBHOOK_URLS = {\r\n    'only_artist_confirmation': 'https:\/\/hook.eu2.make.com\/o5q7u8ju7gh8ggkuo1c7wbm57lmfi5ba',\r\n    'restaurant_confirmation': 'https:\/\/hook.eu2.make.com\/tj9oovgvbq96vt38scwmbkeggbczhsbp'\r\n  };\r\n  \r\n  function getMakeBaseUrl() {\r\n    if (!webhookDinnerEl) {\r\n      console.warn('[DS] Campo webhook_dinner no encontrado en el formulario. Usando webhook por defecto (only_artist_confirmation).');\r\n      return WEBHOOK_URLS['only_artist_confirmation'];\r\n    }\r\n    const webhookType = (webhookDinnerEl.value || '').trim();\r\n    if (!webhookType) {\r\n      console.warn('[DS] Campo webhook_dinner est\u00e1 vac\u00edo. Usando webhook por defecto (only_artist_confirmation).');\r\n      return WEBHOOK_URLS['only_artist_confirmation'];\r\n    }\r\n    const url = WEBHOOK_URLS[webhookType];\r\n    if (!url) {\r\n      console.warn(`[DS] Valor webhook_dinner \"${webhookType}\" no reconocido. Usando webhook por defecto (only_artist_confirmation).`);\r\n      return WEBHOOK_URLS['only_artist_confirmation'];\r\n    }\r\n    console.log(`[DS] Usando webhook: ${webhookType}`);\r\n    return url;\r\n  }\r\n  \r\n  function getBookingId(){\r\n    const a = (bookingEl && bookingEl.value || '').trim(); if (a) return a;\r\n    const qs = new URLSearchParams(window.location.search);\r\n    const b = (qs.get('booking_id') || '').trim(); if (b) return b;\r\n    const c = (form.getAttribute('data-booking-id') || '').trim(); if (c) return c;\r\n    return '';\r\n  }\r\n\r\n  \/\/ Normaliza labels (fallback si quitan el pipe)\r\n  const maleLabels = new Set(['stripper chico o boy','male stripper','stripteaseur homme','stripper home','stripper masculino','mannelijke stripper','m\u00e4nnlicher stripper']);\r\n  const femaleLabels = new Set(['stripper chica','female stripper','stripteaseuse femme','stripper dona','stripper feminino','vrouwelijke stripper','weibliche stripperin']);\r\n  const placeholders = new Set(['selecciona','choose','s\u00e9lectionnez','seleccione','selecione','kies','w\u00e4hlen','ausw\u00e4hlen','seleccioneu']);\r\n  function normalizedGender(sel){\r\n    const v = (sel.value || '').trim();\r\n    if (v === '' || v === 'male' || v === 'female') return v;\r\n    const label = (sel.options[sel.selectedIndex]?.text || '').trim().toLowerCase();\r\n    if (placeholders.has(label)) return '';\r\n    if (maleLabels.has(label)) return 'male';\r\n    if (femaleLabels.has(label)) return 'female';\r\n    return '';\r\n  }\r\n\r\n  \/\/ === Recolecci\u00f3n de IDs (N opciones) ===\r\n  function splitCsv(el){\r\n    const val = (el && el.value || '').trim();\r\n    if (!val) return [];\r\n    return val.split(',').map(s=>s.trim()).filter(Boolean);\r\n  }\r\n  function collectMany(prefixEls, csvEl, singleEl){\r\n    const list = [];\r\n    \/\/ 1) inputs artist_id_xxx_N (mantiene orden DOM)\r\n    prefixEls.forEach(el => { const v=(el.value||'').trim(); if(v) list.push(v); });\r\n    \/\/ 2) CSV (a\u00f1ade, sin duplicar)\r\n    splitCsv(csvEl).forEach(v => { if(!list.includes(v)) list.push(v); });\r\n    \/\/ 3) Fallback single\r\n    const s = (singleEl && singleEl.value || '').trim();\r\n    if (s && !list.includes(s)) list.push(s);\r\n    return list;\r\n  }\r\n  function getArtistIdsByGender(gender){\r\n    if (gender === 'male')   return collectMany(maleManyEls, maleCsvEl, idMaleEl);\r\n    if (gender === 'female') return collectMany(femaleManyEls, femaleCsvEl, idFemaleEl);\r\n    return [];\r\n  }\r\n\r\n  function clearOutputs(){\r\n    [artistIdEl, artistIdEl2, artistIdsListEl, urlField, urlField2, reqDinner, reqDinner2].forEach(el => { if (el) el.value=''; });\r\n    if (photosBlock)  photosBlock.value  = '';\r\n    if (requestBlock) requestBlock.value = '';\r\n    \/\/ Slots neutrales\r\n    neutralSlots.forEach(el => { el.value = ''; });\r\n    if (artistsSelectedJsonEl) artistsSelectedJsonEl.value = '';\r\n  }\r\n\r\n  \/\/ Textos botones + intro de fotos\r\n  const labels = {\r\n    es: { option:'Opci\u00f3n',  view:'Ver fotos',           request:'Solicitar Opci\u00f3n' },\r\n    en: { option:'Option',  view:'View photos',         request:'Request Option' },\r\n    fr: { option:'Option',  view:'Voir les photos',     request:'Demander l\\'option' },\r\n    ca: { option:'Opci\u00f3',   view:'Veure fotos',         request:'Sol\u00b7licitar Opci\u00f3' },\r\n    pt: { option:'Op\u00e7\u00e3o',   view:'Ver fotos',           request:'Solicitar Op\u00e7\u00e3o' },\r\n    nl: { option:'Optie',   view:'Foto\\'s bekijken',     request:'Optie aanvragen' },\r\n    de: { option:'Option',  view:'Fotos ansehen',       request:'Option anfragen' }\r\n  };\r\n  const T = labels[currentLang] || labels[site.defaultLang];\r\n\r\n  const photosIntro = {\r\n    es: {\r\n      male:   { one: 'Fotos del artista a priori disponible para esa fecha. Haz clic en el bot\u00f3n para ver fotos:',\r\n                many:'Fotos de los artistas a priori disponibles para esa fecha. Haz clic en los botones para ver fotos de las opciones:' },\r\n      female: { one: 'Fotos de la artista a priori disponible para esa fecha. Haz clic en el bot\u00f3n para ver fotos:',\r\n                many:'Fotos de las artistas a priori disponibles para esa fecha. Haz clic en los botones para ver fotos de las opciones:' }\r\n    },\r\n    en: {\r\n      male:   { one: 'Photos of the male performer likely available for that date. Click the button to view photos:',\r\n                many:'Photos of the male performers likely available for that date. Click the buttons to view photos of the options:' },\r\n      female: { one: 'Photos of the female performer likely available for that date. Click the button to view photos:',\r\n                many:'Photos of the female performers likely available for that date. Click the buttons to view photos of the options:' }\r\n    },\r\n    fr: {\r\n      male:   { one: 'Photos du stripteaseur probablement disponible \u00e0 cette date. Cliquez sur le bouton pour voir les photos :',\r\n                many:'Photos des stripteaseurs probablement disponibles \u00e0 cette date. Cliquez sur les boutons pour voir les photos des options :' },\r\n      female: { one: 'Photos de la stripteaseuse probablement disponible \u00e0 cette date. Cliquez sur le bouton pour voir les photos :',\r\n                many:'Photos des stripteaseuses probablement disponibles \u00e0 cette date. Cliquez sur les boutons pour voir les photos des options :' }\r\n    },\r\n    ca: {\r\n      male:   { one: 'Fotos del stripper home probablement disponible per a aquesta data. Feu clic al bot\u00f3 per veure les fotos:',\r\n                many:'Fotos dels strippers home probablement disponibles per a aquesta data. Feu clic als botons per veure les fotos de les opcions:' },\r\n      female: { one: 'Fotos de la stripper dona probablement disponible per a aquesta data. Feu clic al bot\u00f3 per veure les fotos:',\r\n                many:'Fotos de les strippers dona probablement disponibles per a aquesta data. Feu clic als botons per veure les fotos de les opcions:' }\r\n    },\r\n    pt: {\r\n      male:   { one: 'Fotos do stripper masculino provavelmente dispon\u00edvel para essa data. Clique no bot\u00e3o para ver fotos:',\r\n                many:'Fotos dos strippers masculinos provavelmente dispon\u00edveis para essa data. Clique nos bot\u00f5es para ver fotos das op\u00e7\u00f5es:' },\r\n      female: { one: 'Fotos da stripper feminina provavelmente dispon\u00edvel para essa data. Clique no bot\u00e3o para ver fotos:',\r\n                many:'Fotos das strippers femininas provavelmente dispon\u00edveis para essa data. Clique nos bot\u00f5es ver fotos das op\u00e7\u00f5es:' }\r\n    },\r\n    nl: {\r\n      male:   { one: 'Foto\\'s van de mannelijke stripper die waarschijnlijk beschikbaar is op die datum. Klik op de knop om foto\\'s te bekijken:',\r\n                many:'Foto\\'s van de mannelijke strippers die waarschijnlijk beschikbaar zijn op die datum. Klik op de knoppen om foto\\'s van de opties te bekijken:' },\r\n      female: { one: 'Foto\\'s van de vrouwelijke stripper die waarschijnlijk beschikbaar is op die datum. Klik op de knop om foto\\'s te bekijken:',\r\n                many:'Foto\\'s van de vrouwelijke strippers die waarschijnlijk beschikbaar zijn op die datum. Klik op de knoppen om foto\\'s van de opties te bekijken:' }\r\n    },\r\n    de: {\r\n      male:   { one: 'Fotos des m\u00e4nnlichen Strippers, der voraussichtlich an diesem Datum verf\u00fcgbar ist. Klicke auf die Schaltfl\u00e4che, um Fotos anzusehen:',\r\n                many:'Fotos der m\u00e4nnlichen Stripper, die voraussichtlich an diesem Datum verf\u00fcgbar sind. Klicke auf die Schaltfl\u00e4chen, um Fotos der Optionen anzusehen:' },\r\n      female: { one: 'Fotos der weiblichen Stripperin, die voraussichtlich an diesem Datum verf\u00fcgbar ist. Klicke auf die Schaltfl\u00e4che, um Fotos anzusehen:',\r\n                many:'Fotos der weiblichen Stripperinnen, die voraussichtlich an diesem Datum verf\u00fcgbar sind. Klicke auf die Schaltfl\u00e4chen, um Fotos der Optionen anzusehen:' }\r\n    }\r\n  };\r\n  function getPhotosIntro(gender, count){\r\n    const pack = photosIntro[currentLang] || photosIntro[site.defaultLang] || photosIntro.es;\r\n    const g = (gender === 'female') ? 'female' : 'male';\r\n    return pack[g][count === 1 ? 'one' : 'many'] || '';\r\n  }\r\n\r\n  \/\/ Helpers HTML\r\n  const esc = (s) => String(s||'')\r\n    .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;')\r\n    .replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#39;');\r\n\r\n  \/\/ Botones \"Ver fotos\" (N)\r\n  function buildPhotosButtons(urls){\r\n    return urls.map((href, idx) => `\r\n<p style=\"padding: 12px 0; text-align: center;\">\r\n  <a style=\"display: inline-block; min-width: 150px; padding: 8px 22px; font-size: 16px; font-weight: 600; color: #fff; background: #5191fa; border-radius: 999px; text-decoration: none; box-shadow: 0 2px 8px 0 rgba(40,120,255,0.08); letter-spacing: 0.01em; text-align: center; vertical-align: middle; line-height: 0.8; height: auto;\"\r\n     href=\"${esc(href)}\">${esc(T.option)} ${idx+1} | ${esc(T.view)}<\/a>\r\n<\/p>`).join('\\n').trim();\r\n  }\r\n  function buildPhotosBlock(urls, gender){\r\n    if (!urls.length) return '';\r\n    const intro = `<p style=\"margin: 16px 0 8px;\"><u>${esc(getPhotosIntro(gender, urls.length))}<\/u><\/p>`;\r\n    return (intro + '\\n' + buildPhotosButtons(urls)).trim();\r\n  }\r\n\r\n  \/\/ Botones \"Solicitar disponibilidad\" (N)\r\n  function buildRequestButtons(hooks){\r\n    return hooks.map((href, idx) => `\r\n<div style=\"padding: 12px 0; text-align: center; border-radius: 15px; background: #3681fb1c; margin-bottom: 5px;\">\r\n  <a style=\"display: inline-block; min-width: 150px; padding: 8px 22px; padding-bottom: 16px; font-size: 16px; font-weight: 600; color: #fff; background: #5191fa; border-radius: 999px; text-decoration: none; box-shadow: 0 2px 8px 0 rgba(40,120,255,0.08); letter-spacing: 0.01em; text-align: center; vertical-align: middle; line-height: 0.8; height: auto;\"\r\n     href=\"${esc(href)}\">${esc(T.request)} ${idx+1}<\/a>\r\n<\/div>`).join('\\n').trim();\r\n  }\r\n  function buildRequestBlock(hooks){\r\n    if (!hooks.length) return '';\r\n    return buildRequestButtons(hooks);\r\n  }\r\n\r\n  \/\/ Rellena slots neutrales artist1_id..artistN_id\r\n  function fillNeutralSlots(ids){\r\n    neutralSlots.forEach((el, idx) => { el.value = ids[idx] || ''; });\r\n  }\r\n\r\n  \/\/ Core\r\n  function actualizar({showErrors=false, showSuccess=true} = {}){\r\n    hide(errorMessage); hide(successMessage);\r\n\r\n    const gender = normalizedGender(espectaculoField);\r\n    if (!gender){\r\n      clearOutputs();\r\n      if (showErrors) displayMessage(M.noSelection, 'error-message', errorMessage);\r\n      return false;\r\n    }\r\n\r\n    \/\/ 1) IDs N\r\n    const ids = getArtistIdsByGender(gender); \/\/ N >= 0\r\n    if (!ids.length){\r\n      clearOutputs();\r\n      if (showErrors) displayMessage(M.noAvailability, 'error-message', errorMessage);\r\n      return false;\r\n    }\r\n\r\n    \/\/ 2) URLs & hooks N - **MODIFICADO: usa getMakeBaseUrl() din\u00e1mico**\r\n    const MAKE_BASE = getMakeBaseUrl();\r\n    const bookingId = getBookingId();\r\n    const urls  = ids.map(id => buildArtistPublicUrl(id));\r\n    const hooks = ids.map(id => bookingId\r\n      ? `${MAKE_BASE}?booking_id=${encodeURIComponent(bookingId)}&artist_id=${encodeURIComponent(id)}`\r\n      : `${MAKE_BASE}?artist_id=${encodeURIComponent(id)}`\r\n    );\r\n\r\n    \/\/ 3) Retro-compatibilidad (primeras 2)\r\n    artistIdEl.value = ids[0] || '';\r\n    urlField.value   = urls[0] || '';\r\n    reqDinner.value  = hooks[0] || '';\r\n\r\n    if (artistIdEl2) artistIdEl2.value = ids[1] || '';\r\n    if (urlField2)   urlField2.value   = urls[1] || '';\r\n    if (reqDinner2)  reqDinner2.value  = hooks[1] || '';\r\n\r\n    if (artistIdsListEl) artistIdsListEl.value = ids.join(',');\r\n\r\n    \/\/ 4) Slots neutrales para Sheets\r\n    fillNeutralSlots(ids);\r\n\r\n    \/\/ (Opcional) JSON completo para Make\/Sheets\r\n    if (artistsSelectedJsonEl) {\r\n      artistsSelectedJsonEl.value = JSON.stringify({\r\n        selected_gender: gender,\r\n        count: ids.length,\r\n        ids: ids,\r\n        urls: urls,\r\n        hooks: hooks,\r\n        webhook_type: webhookDinnerEl ? webhookDinnerEl.value : 'only_artist_confirmation'\r\n      });\r\n    }\r\n\r\n    \/\/ 5) Bloques HTML N\r\n    if (photosBlock)  photosBlock.value  = buildPhotosBlock(urls, gender);\r\n    if (requestBlock) requestBlock.value = buildRequestBlock(hooks);\r\n\r\n    if (showSuccess) displayMessage(M.success, 'success-message', successMessage);\r\n    return true;\r\n  }\r\n\r\n  \/\/ Inicio \/ eventos\r\n  actualizar({showErrors:false, showSuccess:false});\r\n  espectaculoField.addEventListener('change', function(){ actualizar({showErrors:false, showSuccess:true}); });\r\n\t  \r\n  \/\/ **NUEVO: Si cambia webhook_dinner, recalcular URLs**\r\n  if (webhookDinnerEl) {\r\n    webhookDinnerEl.addEventListener('change', function(){ \r\n      actualizar({showErrors:false, showSuccess:false}); \r\n    });\r\n  }\r\n\t  \r\n\/\/ Validaci\u00f3n al enviar con enfoque al campo\r\nform.addEventListener('submit', function(e){\r\n  const ok = actualizar({showErrors:true, showSuccess:false});\r\n  if (!ok){ \r\n    e.preventDefault(); \r\n    e.stopImmediatePropagation();\r\n    espectaculoField.focus();\r\n  }\r\n}, true);  \/\/ \u2190 \u00fanico cambio\r\n\r\n  \/\/ Si booking_id se rellena din\u00e1micamente, re-generar\r\n  if (bookingEl) bookingEl.addEventListener('input', function(){ actualizar({showErrors:false, showSuccess:false}); });\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\t  \/\/ ===== 8. Script Fecha Completa Universal =====\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ ===== Config sitio (dominio + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                     : site.langs.includes(firstSeg) ? firstSeg\r\n                     : site.defaultLang;\r\n\r\n  \/\/ Asignar idioma a campo oculto, si existe\r\n  const hiddenLang = document.getElementById('language');\r\n  if (hiddenLang) hiddenLang.value = currentLang;\r\n\r\n  \/\/ Configuraci\u00f3n de locales\r\n  const locales = {\r\n    'es': { \r\n      days: ['Domingo', 'Lunes', 'Martes', 'Mi\u00e9rcoles', 'Jueves', 'Viernes', 'S\u00e1bado'], \r\n      months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'], \r\n      at: 'a las',\r\n      nightFromTo: (prevDay, day) => `En la noche del ${prevDay} al ${day}`,\r\n      earlyMorning: day => `En la madrugada del ${day}`\r\n    },\r\n    'en': { \r\n      days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], \r\n      months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], \r\n      at: 'at',\r\n      nightFromTo: (prevDay, day) => `On the night from ${prevDay} to ${day}`,\r\n      earlyMorning: day => `In the early morning of ${day}`\r\n    },\r\n    'fr': { \r\n      days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], \r\n      months: ['Janvier', 'F\u00e9vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao\u00fbt', 'Septembre', 'Octobre', 'Novembre', 'D\u00e9cembre'], \r\n      at: '\u00e0',\r\n      nightFromTo: (prevDay, day) => `Dans la nuit du ${prevDay} au ${day}`,\r\n      earlyMorning: day => `Au petit matin du ${day}`\r\n    },\r\n    'pt': { \r\n      days: ['Domingo', 'Segunda-feira', 'Ter\u00e7a-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'S\u00e1bado'], \r\n      months: ['Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'], \r\n      at: '\u00e0s',\r\n      nightFromTo: (prevDay, day) => `Na noite de ${prevDay} para ${day}`,\r\n      earlyMorning: day => `Na madrugada de ${day}`\r\n    },\r\n    'de': { \r\n      days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], \r\n      months: ['Januar', 'Februar', 'M\u00e4rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], \r\n      at: 'um',\r\n      nightFromTo: (prevDay, day) => `In der Nacht von ${prevDay} auf ${day}`,\r\n      earlyMorning: day => `In den fr\u00fchen Morgenstunden des ${day}`\r\n    },\r\n    'nl': { \r\n      days: ['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'], \r\n      months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'], \r\n      at: 'om',\r\n      nightFromTo: (prevDay, day) => `In de nacht van ${prevDay} naar ${day}`,\r\n      earlyMorning: day => `In de vroege ochtend van ${day}`\r\n    },\r\n    'ca': { \r\n      days: ['Diumenge', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte'], \r\n      months: ['Gener', 'Febrer', 'Mar\u00e7', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'], \r\n      at: 'a les',\r\n      nightFromTo: (prevDay, day) => `A la nit del ${prevDay} al ${day}`,\r\n      earlyMorning: day => `A la matinada del ${day}`\r\n    }\r\n  };\r\n\r\n  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const messages = locales[currentLang] || locales[site.defaultLang];\r\n\r\n  \/\/ Formatea fecha\r\n  function formatDate(dateStr, locale, timeStr = '', withTime = false) {\r\n    const { days, months, at, nightFromTo, earlyMorning } = locales[locale] || locales[site.defaultLang];\r\n    const d = new Date(dateStr);\r\n    if (isNaN(d.getTime())) return '';\r\n    \r\n    const day = d.getDate();\r\n    const month = months[d.getMonth()];\r\n    const year = d.getFullYear();\r\n    const dayName = days[d.getDay()];\r\n    \r\n    let result = `${dayName}, ${day} ${month}, ${year}`;\r\n    \r\n    if (withTime && timeStr) {\r\n      const [hours, minutes] = timeStr.split(':').map(Number);\r\n      const isEarlyMorning = hours >= 0 && hours < 1 && minutes >= 0 && minutes <= 59;\r\n      \r\n      if (isEarlyMorning) {\r\n        \/\/ Calcular el d\u00eda anterior\r\n        const prevDate = new Date(d);\r\n        prevDate.setDate(d.getDate() - 1);\r\n        const prevDayName = days[prevDate.getDay()];\r\n        \/\/ A\u00f1adir aclaraci\u00f3n de la noche del d\u00eda anterior al d\u00eda actual\r\n        result = `${nightFromTo(prevDayName, dayName)}. ${earlyMorning(dayName)}, ${day} ${month}, ${year}`;\r\n      }\r\n      \r\n      if (locale === 'en') {\r\n        const period = hours >= 12 ? 'PM' : 'AM';\r\n        const hours12 = hours % 12 || 12;\r\n        result += ` ${at} ${hours12}:${minutes.toString().padStart(2, '0')} ${period} \/ ${timeStr}h`;\r\n      } else {\r\n        result += ` ${at} ${timeStr}h`;\r\n      }\r\n    } else {\r\n      result += '.';\r\n    }\r\n    \r\n    return result;\r\n  }\r\n\r\n  \/\/ Captura elementos\r\n  const datePicker = document.getElementById('fecha');\r\n  const timePicker = document.getElementById('horaaproximada');\r\n  const hiddenDate = document.getElementById('fecha_completa');\r\n  const hiddenTime = document.getElementById('hora_evento');\r\n  const extraDateField = document.querySelector('[id^=\"fecha_completa_\"]:not([id=\"fecha_completa\"])');\r\n  const providerDateField = document.getElementById('fecha_completa_provider');\r\n\r\n  \/\/ Funci\u00f3n para actualizar hidden\r\n  function updateHidden() {\r\n    if (!datePicker || !hiddenDate || !timePicker || !hiddenTime) {\r\n      return;\r\n    }\r\n    const primaryLocale = currentLang;\r\n\r\n    if (datePicker.value) {\r\n      try {\r\n        const date = new Date(datePicker.value);\r\n        if (isNaN(date.getTime())) throw new Error('Fecha inv\u00e1lida');\r\n        \r\n        \/\/ Actualizar fecha_completa (fecha + hora, idioma principal)\r\n        hiddenDate.value = formatDate(datePicker.value, primaryLocale, timePicker.value, true);\r\n\r\n        \/\/ Actualizar fecha_completa_provider (fecha + hora, idioma del proveedor o fallback)\r\n        let providerLocale = primaryLocale;\r\n        if (extraDateField) {\r\n          const localeFromExtra = extraDateField.id.replace('fecha_completa_', '');\r\n          if (site.langs.includes(localeFromExtra)) {\r\n            providerLocale = localeFromExtra;\r\n          }\r\n        }\r\n        if (providerDateField) {\r\n          providerDateField.value = formatDate(datePicker.value, providerLocale, timePicker.value, true);\r\n          if (extraDateField) extraDateField.value = providerDateField.value;\r\n        }\r\n      } catch (e) {\r\n        hiddenDate.value = '';\r\n        if (providerDateField) providerDateField.value = '';\r\n        if (extraDateField) extraDateField.value = '';\r\n      }\r\n    } else {\r\n      hiddenDate.value = '';\r\n      if (providerDateField) providerDateField.value = '';\r\n      if (extraDateField) extraDateField.value = '';\r\n    }\r\n    if (timePicker.value) {\r\n      hiddenTime.value = timePicker.value;\r\n    }\r\n  }\r\n\r\n  \/\/ Listeners\r\n  if (datePicker) datePicker.addEventListener('change', updateHidden);\r\n  if (timePicker) timePicker.addEventListener('change', updateHidden);\r\n\r\n  \/\/ Inicializa al cargar\r\n  updateHidden();\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n  \/\/ 9. Script Page Url + Booking ID\r\n  document.addEventListener('DOMContentLoaded', function() {\r\n    \/\/ 1) Rellenar URL de la p\u00e1gina\r\n    var pageUrlField = document.querySelector('#page_url');\r\n    if (pageUrlField) {\r\n      pageUrlField.value = window.location.href;\r\n    }\r\n\r\n    \/\/ 2) Generar booking_id \u00fanico\r\n    const characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n    const timestamp = Date.now().toString(36).slice(-3).toUpperCase();\r\n    let bookingId = timestamp;\r\n    for (let i = 0; i < 3; i++) {\r\n      const randomIndex = Math.floor(Math.random() * characters.length);\r\n      bookingId += characters[randomIndex];\r\n    }\r\n    const bookingField = document.getElementById('booking_id');\r\n    if (bookingField) {\r\n      bookingField.value = bookingId;\r\n    }\r\n  });\r\n<\/script>\r\n\r\n\r\n<script defer>\r\n\t  \/\/ ===== 10. Script Thanks Dinner & Show (dominio + idiomas) =====\r\ndocument.addEventListener('wpcf7mailsent', function () {\r\n  \/\/ ===== Config sitio (dominio + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                     : site.langs.includes(firstSeg) ? firstSeg\r\n                     : site.defaultLang;\r\n\r\n  \/\/ Definir las p\u00e1ginas de agradecimiento por idioma\r\n  const thankYouPages = {\r\n    es: 'gracias-cena',\r\n    en: 'thanks-dinner',\r\n    fr: 'merci-diner',\r\n    ca: 'gracies-dinar',\r\n    pt: 'obrigado-jantar',\r\n    nl: 'diner-bedankt',\r\n    de: 'abendessen-danke'\r\n  };\r\n\r\n  \/\/ Seleccionar la p\u00e1gina de agradecimiento seg\u00fan el idioma actual\r\n  const thankYouPage = thankYouPages[currentLang] || thankYouPages[site.defaultLang];\r\n  const languagePrefix = currentLang === site.defaultLang ? '' : `\/${currentLang}`;\r\n\r\n  \/\/ Redirige a la p\u00e1gina correspondiente con URL relativa\r\n  window.location.href = `${languagePrefix}\/${thankYouPage}\/`;\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\t  \/\/ ===== 11. Script Frontend Fecha Evento Universal=====\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  \/\/ ===== Config sitio (dominio + idiomas) =====\r\n  const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n  const siteConfigs = {\r\n    'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n    'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n    'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n  };\r\n  const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n  \/\/ Detecci\u00f3n idioma (html lang -> primer segmento -> default)\r\n  const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n  const htmlLang = htmlLangRaw.split('-')[0];\r\n  const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n  const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                     : site.langs.includes(firstSeg) ? firstSeg\r\n                     : site.defaultLang;\r\n\r\n  \/\/ Configuraci\u00f3n de locales\r\n  const locales = {\r\n    es: { days: ['Domingo', 'Lunes', 'Martes', 'Mi\u00e9rcoles', 'Jueves', 'Viernes', 'S\u00e1bado'], months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'] },\r\n    en: { days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] },\r\n    fr: { days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], months: ['Janvier', 'F\u00e9vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao\u00fbt', 'Septembre', 'Octobre', 'Novembre', 'D\u00e9cembre'] },\r\n    ca: { days: ['Diumenge', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte'], months: ['Gener', 'Febrer', 'Mar\u00e7', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'] },\r\n    pt: { days: ['Domingo', 'Segunda-feira', 'Ter\u00e7a-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'S\u00e1bado'], months: ['Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'] },\r\n    nl: { days: ['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'], months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'] },\r\n    de: { days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], months: ['Januar', 'Februar', 'M\u00e4rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] }\r\n  };\r\n\r\n  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const { days, months } = locales[currentLang] || locales[site.defaultLang];\r\n\r\n  function formatDate(dateStr) {\r\n    const date = new Date(dateStr);\r\n    const dayName = days[date.getDay()];\r\n    const day = date.getDate();\r\n    const month = months[date.getMonth()];\r\n    const year = date.getFullYear();\r\n\r\n    return `${dayName}, ${day} ${month}, ${year}.`;\r\n  }\r\n\r\n  const fechaInput = document.getElementById(\"fecha\");\r\n  const fechaDisplay = document.createElement('div');\r\n  fechaDisplay.id = 'fecha-completa-display';\r\n  fechaDisplay.className = 'success-message'; \/\/ Aplicar la clase success-message\r\n  fechaDisplay.style.display = 'none'; \/\/ Ocultar el contenedor inicialmente\r\n\r\n  \/\/ A\u00f1adir el div para la fecha debajo del campo de fecha\r\n  if (fechaInput) {\r\n    fechaInput.parentNode.insertBefore(fechaDisplay, fechaInput.nextSibling);\r\n  }\r\n\r\n  \/\/ Forzar redibujo del mensaje\r\n  function forceRedibujo(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight; \/\/ Forzar redibujo\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ Actualizar la fecha completa cuando se cambie la fecha\r\n  if (fechaInput) {\r\n    fechaInput.addEventListener('change', function() {\r\n      if (fechaInput.value) {\r\n        const formattedDate = formatDate(fechaInput.value);\r\n        fechaDisplay.innerText = formattedDate; \/\/ Mostrar la fecha en letras\r\n        fechaDisplay.style.display = 'block'; \/\/ Mostrar el mensaje cuando se selecciona la fecha\r\n        forceRedibujo(fechaDisplay); \/\/ Forzar redibujo para visibilidad correcta\r\n      } else {\r\n        fechaDisplay.innerText = ''; \/\/ Limpiar la fecha si no se ha seleccionado\r\n        fechaDisplay.style.display = 'none'; \/\/ Ocultar el mensaje si no se selecciona la fecha\r\n        forceRedibujo(fechaDisplay); \/\/ Forzar redibujo para visibilidad correcta\r\n      }\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n<script src=\"\/wp-content\/custom\/dinner-show\/12forcing-start-dinner.js?v=1.4\" defer><\/script><!-- Dinner&Show Scripts --><script>\r\n(function() {\r\n    const host = window.location.hostname.replace(\/^www\\.\/, '');\r\n    const siteConfigs = {\r\n        'bestfiesta.es':       { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} },\r\n        'strippersdeluxe.es':  { defaultLang: 'es', langs: ['es', 'en'], domainByLang: {} },\r\n        'strippersdeluxe.com': { defaultLang: 'en', langs: ['en', 'es', 'fr', 'ca', 'pt', 'nl', 'de'], domainByLang: { 'ca': 'https:\/\/strippersdeluxe.es' } }\r\n    };\r\n    const site = siteConfigs[host] || { defaultLang: 'es', langs: ['es', 'en', 'fr'], domainByLang: {} };\r\n\r\n    const htmlLangRaw = (document.documentElement.lang || '').toLowerCase();\r\n    const htmlLang = htmlLangRaw.split('-')[0];\r\n    const firstSeg = (window.location.pathname || '\/').split('\/').filter(Boolean)[0] || '';\r\n    const currentLang = site.langs.includes(htmlLang) ? htmlLang\r\n                       : site.langs.includes(firstSeg) ? firstSeg\r\n                       : site.defaultLang;\r\n\r\n    const texts = {\r\n        es: {\r\n            title: 'Selecci\u00f3n de Platos Principales',\r\n            description: 'Por favor, selecciona los platos principales para tu grupo antes del evento:',\r\n            button: 'Seleccionar Platos Principales'\r\n        },\r\n        en: {\r\n            title: 'Main Course Selection',\r\n            description: 'Please select the main courses for your group before the event:',\r\n            button: 'Select Main Courses'\r\n        },\r\n        fr: {\r\n            title: 'S\u00e9lection des Plats Principaux',\r\n            description: 'Veuillez s\u00e9lectionner les plats principaux pour votre groupe avant l\\'\u00e9v\u00e9nement:',\r\n            button: 'S\u00e9lectionner les Plats'\r\n        },\r\n        ca: {\r\n            title: 'Selecci\u00f3 de Plats Principals',\r\n            description: 'Si us plau, selecciona els plats principals per al teu grup abans de l\\'esdeveniment:',\r\n            button: 'Seleccionar Plats Principals'\r\n        },\r\n        pt: {\r\n            title: 'Sele\u00e7\u00e3o de Pratos Principais',\r\n            description: 'Por favor, selecione os pratos principais para o seu grupo antes do evento:',\r\n            button: 'Selecionar Pratos Principais'\r\n        },\r\n        nl: {\r\n            title: 'Hoofdgerecht Selectie',\r\n            description: 'Selecteer de hoofdgerechten voor uw groep v\u00f3\u00f3r het evenement:',\r\n            button: 'Selecteer Hoofdgerechten'\r\n        },\r\n        de: {\r\n            title: 'Hauptgericht Auswahl',\r\n            description: 'Bitte w\u00e4hlen Sie die Hauptgerichte f\u00fcr Ihre Gruppe vor der Veranstaltung aus:',\r\n            button: 'Hauptgerichte Ausw\u00e4hlen'\r\n        }\r\n    };\r\n\r\n    function generateMainCoursesBlock(bookingId, city) {\r\n        if (!bookingId || !city) return '';\r\n\r\n        let baseURL = window.location.protocol + '\/\/' + host;\r\n        if (currentLang !== site.defaultLang) {\r\n            baseURL += '\/' + currentLang;\r\n        }\r\n        const url = baseURL + '\/main-courses-selection\/?booking_id=' + bookingId + '&city=' + city.toLowerCase();\r\n\r\n        const t = texts[currentLang] || texts['es'];\r\n\r\n    return '<div style=\"margin: 30px 0; padding: 25px; background: #f8f9fa; border-radius: 10px; border-left: 4px solid #4CAF50;\">' +\r\n        '<h3 style=\"margin: 0 0 12px 0; color: #2c3e50; font-size: 14px; font-weight: bold;\">' + t.title + '<\/h3>' +\r\n        '<p style=\"margin: 0 0 20px 0; color: #555; line-height: 1.6; font-size: 14px;\">' + t.description + '<\/p>' +\r\n        '<div style=\"text-align: center;\">' +\r\n        '<a href=\"' + url + '\" style=\"background-color: #4CAF50; color: white; padding: 15px 35px; text-align: center; text-decoration: none; display: inline-block; border-radius: 6px; font-size: 14px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.1);\">' +\r\n        t.button +\r\n        '<\/a><\/div><\/div>';\r\n}\r\n\r\n    function initMainCoursesBlock() {\r\n        const bookingIdField = document.getElementById('booking_id');\r\n        const cityField = document.querySelector('input[name=\"city\"]');\r\n        \r\n        if (!bookingIdField || !cityField) {\r\n            return;\r\n        }\r\n\r\n        function updateBlock() {\r\n            const bookingId = bookingIdField.value;\r\n            const city = cityField.value;\r\n\r\n            if (bookingId && city) {\r\n                const blockHTML = generateMainCoursesBlock(bookingId, city);\r\n                \r\n                \/\/ Buscar el campo que YA existe en CF7 por su name\r\n                let blockField = document.querySelector('input[name=\"main_courses_block\"]');\r\n                \r\n                \/\/ Si no existe, buscarlo por id (el de CF7)\r\n                if (!blockField) {\r\n                    blockField = document.getElementById('main-courses-block');\r\n                }\r\n                \r\n                \/\/ Si a\u00fan no existe, crearlo\r\n                if (!blockField) {\r\n                    blockField = document.createElement('input');\r\n                    blockField.type = 'hidden';\r\n                    blockField.name = 'main_courses_block';\r\n                    blockField.id = 'main-courses-block';\r\n                    bookingIdField.closest('form').appendChild(blockField);\r\n                }\r\n                \r\n                blockField.value = blockHTML;\r\n            }\r\n        }\r\n\r\n        const observer = new MutationObserver(updateBlock);\r\n        observer.observe(bookingIdField, { \r\n            attributes: true, \r\n            attributeFilter: ['value'] \r\n        });\r\n\r\n        bookingIdField.addEventListener('input', updateBlock);\r\n        bookingIdField.addEventListener('change', updateBlock);\r\n        \r\n        \/\/ Ejecutar despu\u00e9s de un delay para asegurar que CF7 ya carg\u00f3\r\n        setTimeout(updateBlock, 1000);\r\n        updateBlock();\r\n    }\r\n\r\n    if (document.readyState === 'loading') {\r\n        document.addEventListener('DOMContentLoaded', initMainCoursesBlock);\r\n    } else {\r\n        initMainCoursesBlock();\r\n    }\r\n\r\n    let attempts = 0;\r\n    const interval = setInterval(function() {\r\n        attempts++;\r\n        if (document.getElementById('booking_id') || attempts > 10) {\r\n            clearInterval(interval);\r\n            initMainCoursesBlock();\r\n        }\r\n    }, 500);\r\n})();\r\n<\/script>\r\n<!-- Bloque Main Course -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a567aa4 e-flex e-con-boxed e-con e-parent\" data-id=\"a567aa4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Vous recherchez une exp\u00e9rience unique pour c\u00e9l\u00e9brer une occasion sp\u00e9ciale avec votre groupe ? \u00c0 Lloret de Mar (Espagne), nous proposons un forfait exclusif qui combine un d\u00e9licieux repas ou d\u00eener dans un restaurant local avec un spectacle priv\u00e9 de stripper \u00e0 la fin, parfait pour surprendre l&rsquo;invit\u00e9 d&rsquo;honneur. D\u00eener et Spectacle Amusant de stripteaseuse [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"default","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-12542","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.4 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar - Strippers Deluxe Global<\/title>\n<meta name=\"description\" content=\"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d&#039;une soir\u00e9e m\u00e9morable.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar\" \/>\n<meta property=\"og:description\" content=\"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d&#039;une soir\u00e9e m\u00e9morable.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/\" \/>\n<meta property=\"og:site_name\" content=\"Strippers Deluxe Global\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-23T11:03:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"469\" \/>\n\t<meta property=\"og:image:height\" content=\"223\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/\",\"name\":\"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar - Strippers Deluxe Global\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/lloret_stag_party.jpg\",\"datePublished\":\"2025-10-02T09:16:58+00:00\",\"dateModified\":\"2025-12-23T11:03:35+00:00\",\"description\":\"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d'une soir\u00e9e m\u00e9morable.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/#primaryimage\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/lloret_stag_party.jpg\",\"contentUrl\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/lloret_stag_party.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/diner-et-spectacle-lloret-de-mar\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/\",\"name\":\"Strippers Deluxe Global\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#organization\",\"name\":\"Strippers Deluxe Global\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/LOGO-1.png\",\"contentUrl\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/LOGO-1.png\",\"width\":1000,\"height\":617,\"caption\":\"Strippers Deluxe Global\"},\"image\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar - Strippers Deluxe Global","description":"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d'une soir\u00e9e m\u00e9morable.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/","og_locale":"fr_FR","og_type":"article","og_title":"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar","og_description":"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d'une soir\u00e9e m\u00e9morable.","og_url":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/","og_site_name":"Strippers Deluxe Global","article_modified_time":"2025-12-23T11:03:35+00:00","og_image":[{"width":469,"height":223,"url":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/","url":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/","name":"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar - Strippers Deluxe Global","isPartOf":{"@id":"https:\/\/strippersdeluxe.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/#primaryimage"},"image":{"@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/#primaryimage"},"thumbnailUrl":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg","datePublished":"2025-10-02T09:16:58+00:00","dateModified":"2025-12-23T11:03:35+00:00","description":"R\u00e9servez un d\u00eener spectacle avec Stripteaseur ou Stripteaseuse \u00e0 Lloret et profitez d'une soir\u00e9e m\u00e9morable.","breadcrumb":{"@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/#primaryimage","url":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg","contentUrl":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2025\/10\/lloret_stag_party.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/strippersdeluxe.com\/fr\/diner-et-spectacle-lloret-de-mar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/strippersdeluxe.com\/fr\/"},{"@type":"ListItem","position":2,"name":"D\u00eener et Spectacle de Stripteaseur ou Stripteaseuse | Lloret de Mar"}]},{"@type":"WebSite","@id":"https:\/\/strippersdeluxe.com\/fr\/#website","url":"https:\/\/strippersdeluxe.com\/fr\/","name":"Strippers Deluxe Global","description":"","publisher":{"@id":"https:\/\/strippersdeluxe.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/strippersdeluxe.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/strippersdeluxe.com\/fr\/#organization","name":"Strippers Deluxe Global","url":"https:\/\/strippersdeluxe.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/strippersdeluxe.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/06\/LOGO-1.png","contentUrl":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/06\/LOGO-1.png","width":1000,"height":617,"caption":"Strippers Deluxe Global"},"image":{"@id":"https:\/\/strippersdeluxe.com\/fr\/#\/schema\/logo\/image\/"}}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"sd_global@","author_link":"https:\/\/strippersdeluxe.com\/fr\/author\/sd_global\/"},"uagb_comment_info":0,"uagb_excerpt":"Vous recherchez une exp\u00e9rience unique pour c\u00e9l\u00e9brer une occasion sp\u00e9ciale avec votre groupe ? \u00c0 Lloret de Mar (Espagne), nous proposons un forfait exclusif qui combine un d\u00e9licieux repas ou d\u00eener dans un restaurant local avec un spectacle priv\u00e9 de stripper \u00e0 la fin, parfait pour surprendre l&rsquo;invit\u00e9 d&rsquo;honneur. D\u00eener et Spectacle Amusant de stripteaseuse\u2026","_links":{"self":[{"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/pages\/12542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/comments?post=12542"}],"version-history":[{"count":9,"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/pages\/12542\/revisions"}],"predecessor-version":[{"id":12778,"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/pages\/12542\/revisions\/12778"}],"wp:attachment":[{"href":"https:\/\/strippersdeluxe.com\/fr\/wp-json\/wp\/v2\/media?parent=12542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}