{"id":12571,"date":"2025-11-14T09:46:06","date_gmt":"2025-11-14T09:46:06","guid":{"rendered":"https:\/\/strippersdeluxe.com\/male-stripper-show-majorca\/"},"modified":"2025-12-03T18:24:28","modified_gmt":"2025-12-03T18:24:28","slug":"mannelijke-stripper-majorca","status":"publish","type":"page","link":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/","title":{"rendered":"Mannelijke Stripper\ufeff | Majorca"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12571\" class=\"elementor elementor-12571 elementor-10942\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ccca2db e-flex e-con-boxed e-con e-parent\" data-id=\"ccca2db\" 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<div class=\"elementor-element elementor-element-69d5562 e-flex e-con-boxed e-con e-parent\" data-id=\"69d5562\" 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-502d47a elementor-widget elementor-widget-html\" data-id=\"502d47a\" 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\/nl\/\">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\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-7353de5 e-con-full e-flex e-con e-child\" data-id=\"7353de5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-653433c elementor-widget elementor-widget-heading\" data-id=\"653433c\" 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\">Boysshow \/ mannelijke stripper | Mallorca<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-82f8152 elementor-widget elementor-widget-heading\" data-id=\"82f8152\" 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<h2 class=\"elementor-heading-title elementor-size-default\">Top entertainment voor vrijgezellenfeesten, verjaardagen en events op het eiland Mallorca<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-62c1157 elementor-widget elementor-widget-heading\" data-id=\"62c1157\" 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<p class=\"elementor-heading-title elementor-size-default\"><div class=\"faq-link\" style=\"text-align: center;margin: 20px 0;padding: 15px;border: 2px solid #6852f4;border-radius: 8px\">\n  <p style=\"margin: 0 0 10px 0;font-weight: bold;color: #333\">Vragen?<\/p>\n  <a href=\"https:\/\/strippersdeluxe.com\/male-stripper-show\/spain\/#faq-section\" class=\"btn\" rel=\"internal\" aria-label=\"View full FAQ, estimated prices, and details for male stripper shows in Spain\">\n \u2192 Bekijk de volledige FAQ, geschatte prijs en alle details voor het boeken van een mannelijke stripshow in Spanje.\n  <\/a>\n<\/div>\n<\/p>\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-5292b67 e-flex e-con-boxed e-con e-parent\" data-id=\"5292b67\" 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-aaa69e2 e-con-full e-flex e-con e-child\" data-id=\"aaa69e2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;shape_divider_top&quot;:&quot;curve&quot;}\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n    <path class=\"elementor-shape-fill\" d=\"M1000,4.3V0H0v4.3C0.9,23.1,126.7,99.2,500,100S1000,22.7,1000,4.3z\"\/>\n<\/svg>\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ccf775 e-con-full e-flex e-con e-child\" data-id=\"5ccf775\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-be43149 e-con-full e-flex e-con e-child\" data-id=\"be43149\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-d23bca6 e-con-full e-flex e-con e-child\" data-id=\"d23bca6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8a8031c elementor-widget elementor-widget-image\" data-id=\"8a8031c\" 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=\"599\" height=\"479\" src=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg\" class=\"attachment-full size-full wp-image-12570\" alt=\"\" srcset=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg 599w, https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1-300x240.jpg 300w\" sizes=\"(max-width: 599px) 100vw, 599px\" \/>\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<div class=\"elementor-element elementor-element-2b5864e e-con-full e-flex e-con e-child\" data-id=\"2b5864e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9581906 elementor-widget elementor-widget-heading\" data-id=\"9581906\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Boysshow op Mallorca<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cb2acee elementor-widget elementor-widget-text-editor\" data-id=\"cb2acee\" 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<p>Boek je show in Palma, Marratx\u00ed, Inca, Manacor, Llucmajor enzovoort en krijg direct informatie over beschikbaarheid en prijs op de locatie waar jullie verblijven.<\/p>\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ee5244d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ee5244d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-8b9cb51\" data-id=\"8b9cb51\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-54b02a6 elementor-widget elementor-widget-heading\" data-id=\"54b02a6\" 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<h4 class=\"elementor-heading-title elementor-size-default\"><h4 style=\"text-align: center;font-size: 22px\">Voor alle details en om het boekingsproces voor een boysshow voor jullie groep te starten:<\/h4>\n<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\"><\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-ee3f1ce e-flex e-con-boxed e-con e-parent\" data-id=\"ee3f1ce\" 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-a6cce81 elementor-widget elementor-widget-html\" data-id=\"a6cce81\" 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\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f12557-o1\" lang=\"nl\" dir=\"ltr\" data-wpcf7-id=\"12557\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/nl\/wp-json\/wp\/v2\/pages\/12571#wpcf7-f12557-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Contact form\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"12557\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.4\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"nl\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f12557-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=\"artist1_id\" value=\"14j8lx\" type=\"hidden\" name=\"artist1_id\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"artist2_id\" value=\"442viw\" type=\"hidden\" name=\"artist2_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-costumes-block\" value=\"\" type=\"hidden\" name=\"artist_costumes_block\" \/>\n<!-- Independientemente de que tenga vestuario o no -->\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=\"lugar_final\" value=\"\" type=\"hidden\" name=\"lugar_final\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"language\" value=\"nl\" 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=\"Artiest (Man show)\" 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=\"Mallorca\" type=\"hidden\" name=\"city_province\" \/>\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=\"flexibilidad_final\" value=\"\" type=\"hidden\" name=\"cf7_make_flexibilidad\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"flexibilidad_es\" value=\"\" type=\"hidden\" name=\"cf7_make_flexibilidad_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"flexibilidad_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_flexibilidad_provider\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"lugar_evento_final\" value=\"\" type=\"hidden\" name=\"cf7_make_lugar_evento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"lugar_evento_es\" value=\"\" type=\"hidden\" name=\"cf7_make_lugar_evento_es\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"lugar_evento_provider\" value=\"\" type=\"hidden\" name=\"cf7_make_lugar_evento_provider\" \/>\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=\"telefono_completo\" value=\"\" type=\"hidden\" name=\"telefono_completo\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"ubicacion-base\" value=\"\" type=\"hidden\" name=\"ubicacion-base\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"distancia-km\" value=\"\" type=\"hidden\" name=\"distancia-km\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"tiempo-viaje\" value=\"\" type=\"hidden\" name=\"tiempo-viaje\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"incremento\" value=\"\" type=\"hidden\" name=\"incremento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"incrementos-agencia\" value=\"\" type=\"hidden\" name=\"incrementos-agencia\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"precio_total\" value=\"\" type=\"hidden\" name=\"precio_total\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"precio_redondeado\" value=\"\" type=\"hidden\" name=\"precio_redondeado\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"precio_por_pers_show\" value=\"\" type=\"hidden\" name=\"precio_por_pers_show\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"mensaje_precio_persona\" value=\"\" type=\"hidden\" name=\"mensaje_precio_persona\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"precio_agencia\" value=\"\" type=\"hidden\" name=\"precio_agencia\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"precio_artista\" value=\"\" type=\"hidden\" name=\"precio_artista\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"pais_evento\" value=\"\" type=\"hidden\" name=\"pais_evento\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"booking_payment\" value=\"\" type=\"hidden\" name=\"booking-payment\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"maps_url\" value=\"\" type=\"hidden\" name=\"maps_url\" \/>\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=\"advance_agency_fee\" value=\"\" type=\"hidden\" name=\"advance_agency_fee\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"pending_agency_fee\" value=\"\" type=\"hidden\" name=\"pending_agency_fee\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"price_with_payment_in_advance\" value=\"\" type=\"hidden\" name=\"price_with_payment_in_advance\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"region\" value=\"\" type=\"hidden\" name=\"region\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"province\" value=\"\" type=\"hidden\" name=\"province\" \/>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"name_st\">Naam:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"name_st\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"name_st\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Uw naam\" value=\"\" type=\"text\" name=\"name_st\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"telefono\">Mobiel nummer:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"tel\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"telefono\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Uw mobiele nummer\" value=\"\" type=\"text\" name=\"tel\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"email_st\">E-mail:<\/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=\"Uw e-mailadres\" value=\"\" type=\"email\" name=\"email_st\" \/><\/span>\n\t\t<\/p>\n\t\t<p style=\"font-size: 13px; font-weight: 600;\">\u261d Controleer uw e-mailadres zorgvuldig (u ontvangt informatie op dit e-mailadres)\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<div style=\"height: 1em;\">\n\t\t<\/div><!-- Double line break -->\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"fecha\">Selecteer de datum:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"date\"><input class=\"wpcf7-form-control wpcf7-date wpcf7-validates-as-required wpcf7-validates-as-date\" id=\"fecha\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Selecteer de datum*\" value=\"\" type=\"date\" name=\"date\" \/><\/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=\"horaaproximada\">Voorkeurstijd:<\/label><br \/>\n<input type=\"time\" id=\"horaaproximada\" name=\"horaaproximada\" placeholder=\"HH:MM\" required \/>\n\t\t<\/p>\n\t<\/div>\n\n \n <!-- Line break -->\n\t<div class=\"form-group\">\n\t\t<p><label for=\"flexibilidad\"><br \/>\nHoe flexibel is de groep met de aangegeven datum en tijd van de show?<br \/>\n<small>Hoe flexibeler de groep is, hoe groter de kans dat een artiest uw aanvraag kan accepteren.<\/small><br \/>\n<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"flexibilidad\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"flex-field\" aria-required=\"true\" aria-invalid=\"false\" name=\"flexibilidad\"><option value=\"Exact tijdstip\">Exact tijdstip<\/option><option value=\"Flexibel\">Flexibel<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div id=\"franja_horaria_container\" class=\"form-group\" style=\"display:none; margin-top:10px;\">\n\t\t<p><label for=\"hora_inicio\">De starttijd van de show kan zijn tussen:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"hora_inicio\"><select class=\"wpcf7-form-control wpcf7-select\" id=\"hora_inicio\" aria-invalid=\"false\" name=\"hora_inicio\"><option value=\"\"><\/option><option value=\"10:00\">10:00<\/option><option value=\"10:30\">10:30<\/option><option value=\"11:00\">11:00<\/option><option value=\"11:30\">11:30<\/option><option value=\"12:00\">12:00<\/option><option value=\"12:30\">12:30<\/option><option value=\"13:00\">13:00<\/option><option value=\"13:30\">13:30<\/option><option value=\"14:00\">14:00<\/option><option value=\"14:30\">14:30<\/option><option value=\"15:00\">15:00<\/option><option value=\"15:30\">15:30<\/option><option value=\"16:00\">16:00<\/option><option value=\"16:30\">16:30<\/option><option value=\"17:00\">17:00<\/option><option value=\"17:30\">17:30<\/option><option value=\"18:00\">18:00<\/option><option value=\"18:30\">18:30<\/option><option value=\"19:00\">19:00<\/option><option value=\"19:30\">19:30<\/option><option value=\"20:00\">20:00<\/option><option value=\"20:30\">20:30<\/option><option value=\"21:00\">21:00<\/option><option value=\"21:30\">21:30<\/option><option value=\"22:00\">22:00<\/option><option value=\"22:30\">22:30<\/option><option value=\"23:00\">23:00<\/option><option value=\"23:30\">23:30<\/option><option value=\"00:00\">00:00<\/option><option value=\"00:30\">00:30<\/option><option value=\"01:00\">01:00<\/option><\/select><\/span><br \/>\n<span>en<\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"hora_fin\"><select class=\"wpcf7-form-control wpcf7-select\" id=\"hora_fin\" aria-invalid=\"false\" name=\"hora_fin\"><option value=\"\"><\/option><option value=\"10:00\">10:00<\/option><option value=\"10:30\">10:30<\/option><option value=\"11:00\">11:00<\/option><option value=\"11:30\">11:30<\/option><option value=\"12:00\">12:00<\/option><option value=\"12:30\">12:30<\/option><option value=\"13:00\">13:00<\/option><option value=\"13:30\">13:30<\/option><option value=\"14:00\">14:00<\/option><option value=\"14:30\">14:30<\/option><option value=\"15:00\">15:00<\/option><option value=\"15:30\">15:30<\/option><option value=\"16:00\">16:00<\/option><option value=\"16:30\">16:30<\/option><option value=\"17:00\">17:00<\/option><option value=\"17:30\">17:30<\/option><option value=\"18:00\">18:00<\/option><option value=\"18:30\">18:30<\/option><option value=\"19:00\">19:00<\/option><option value=\"19:30\">19:30<\/option><option value=\"20:00\">20:00<\/option><option value=\"20:30\">20:30<\/option><option value=\"21:00\">21:00<\/option><option value=\"21:30\">21:30<\/option><option value=\"22:00\">22:00<\/option><option value=\"22:30\">22:30<\/option><option value=\"23:00\">23:00<\/option><option value=\"23:30\">23:30<\/option><option value=\"00:00\">00:00<\/option><option value=\"00:30\">00:30<\/option><option value=\"01:00\">01:00<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<div style=\"height: 1em;\">\n\t\t<\/div><!-- Double line break -->\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p>Geef de locatie en het adres van het evenement aan. U ontvangt een exacte offerte.\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"lugar_evento\">Geef de locatie van het evenement aan:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"lugar_evento\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"lugar_evento\" aria-required=\"true\" aria-invalid=\"false\" name=\"lugar_evento\"><option value=\"Kies de locatie van het evenement\">Kies de locatie van het evenement<\/option><option value=\"Appartement\">Appartement<\/option><option value=\"Hotel\">Hotel<\/option><option value=\"Villa\">Villa<\/option><option value=\"Plattelandshuis\">Plattelandshuis<\/option><option value=\"Afgesproken restaurant\">Afgesproken restaurant<\/option><option value=\"Afgesproken Pub\/Muzieklocatie of soortgelijk\">Afgesproken Pub\/Muzieklocatie of soortgelijk<\/option><option value=\"Anders\">Anders<\/option><\/select><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div id=\"nombre_lugar_container\" class=\"form-group\" style=\"display:none; margin-top:10px;\">\n\t\t<p><label id=\"nombre_lugar_label\" for=\"nombre_lugar_input\"><\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"nombre_lugar\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"nombre_lugar\" aria-invalid=\"false\" placeholder=\"\" value=\"\" type=\"text\" name=\"nombre_lugar\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\n \n <!-- Line break -->\n\t<div class=\"direccion-container\">\n\t\t<p><label for=\"direccion\">Exacte adres van het evenement:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"direccion\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"direccion\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Exacte offerte op het opgegeven adres\" value=\"\" type=\"text\" name=\"direccion\" \/><\/span><br \/>\n<span id=\"direccion-mensaje\"><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<div style=\"height: 1em;\">\n\t\t<\/div><!-- Double line break -->\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><label for=\"tipo_grupo\">We zijn een groep van:<\/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=\"Kies\">Kies<\/option><option value=\"Vrouwen\">Vrouwen<\/option><option value=\"Mannen\">Mannen<\/option><option value=\"Beiden\">Beiden<\/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 viering:<\/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=\"Kies\">Kies<\/option><option value=\"Vrijgezellenfeest voor vrouwen\">Vrijgezellenfeest voor vrouwen<\/option><option value=\"Vrijgezellenfeest voor mannen\">Vrijgezellenfeest voor mannen<\/option><option value=\"Verjaardag\">Verjaardag<\/option><option value=\"Ander soort feest\">Ander soort feest<\/option><option value=\"Ander\">Ander<\/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=\"numero-personas\">Geef het aantal personen aan:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"numero_personas\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required\" id=\"numero_personas\" aria-required=\"true\" aria-invalid=\"false\" name=\"numero_personas\"><option value=\"4\">4<\/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=\"Meer dan 25\">Meer dan 25<\/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=\"comentario\">Opmerkingen over het evenement:<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"comentario\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"comentario\" aria-invalid=\"false\" placeholder=\"\" value=\"\" type=\"text\" name=\"comentario\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-group\">\n\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"capital-quiz\"><label><span class=\"wpcf7-quiz-label\">Beveiligingsvraag, 3 + 4?<\/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=\"c3d883c134c4c4594692d5b6595bd811\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div>\n\t\t<p style=\"font-size: 13px; font-weight: 600;\">\u25ba Vink het vakje aan en klik op verzenden\n\t\t<\/p>\n\t\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> Ik heb het <a target=\"blank\" href=\"\/privacy-policy\/\"><strong><u>Privacybeleid<\/u><\/strong><\/a> en de <a target=\"blank\" href=\"\/terms-and-conditions\/\"><strong><u>Algemene Voorwaarden<\/u><\/strong><\/a> gelezen en geaccepteerd<br \/>\n[recaptcha]\n\t\t<\/p>\n\t\t<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Verzenden\" \/>\n\t\t<\/p>\n\t<\/div>\n\t<div style=\"font-size: 12px; color: #555; margin-top: 15px;\">\n\t\t<p>Deze pagina wordt beschermd door reCAPTCHA en het <a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\">Privacybeleid<\/a> en de <a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\">Servicevoorwaarden<\/a> van Google zijn van toepassing.\n\t\t<\/p>\n\t<\/div>\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=\"3\"\/><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<script async src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyDenjG_RK0_HfJCW9jN9gBQRvS5ApTry4k&loading=async&libraries=places&callback=initAutocomplete\">\r\n  \/\/ Con Loading Async Correctamente <\/script>\r\n\r\n<script defer>\r\n\/\/ ===== 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>\r\n  \/\/ ===== Init AutoComplete Universal ES PT AD FR =====\r\nwindow.initAutocomplete = 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      error: \"Por favor escribe la direcci\u00f3n y selecci\u00f3nala de la lista. Si todav\u00eda no sabes la direcci\u00f3n exacta, escribe la localidad m\u00e1s cercana y selecci\u00f3nala. Si tienes problemas, por favor actualiza la p\u00e1gina e intenta de nuevo.\",\r\n      submitError: \"Debe rellenar y seleccionar una direcci\u00f3n v\u00e1lida antes de enviar. Gracias\",\r\n      success: \"\u2713 \u00a1Genial!, direcci\u00f3n encontrada\"\r\n    },\r\n    en: {\r\n      error: \"Please enter the address and select it from the list. If you don't know the exact address yet, enter the nearest town and select it. If you have issues, please refresh the page and try again.\",\r\n      submitError: \"You must fill in and select a valid address before submitting. Thank you\",\r\n      success: \"\u2713 Great! Address found\"\r\n    },\r\n    fr: {\r\n      error: \"Veuillez saisir l'adresse et la s\u00e9lectionner dans la liste. Si vous ne connaissez pas encore l'adresse exacte, saisissez la localit\u00e9 la plus proche et s\u00e9lectionnez-la. En cas de probl\u00e8me, veuillez actualiser la page et r\u00e9essayer.\",\r\n      submitError: \"Vous devez remplir et s\u00e9lectionner une adresse valide avant de soumettre. Merci\",\r\n      success: \"\u2713 Super ! Adresse trouv\u00e9e\"\r\n    },\r\n    ca: {\r\n      error: \"Si us plau, escriu l'adre\u00e7a i selecciona-la de la llista. Si encara no saps l'adre\u00e7a exacta, escriu la localitat m\u00e9s propera i selecciona-la. Si tens problemes, actualitza la p\u00e0gina i torna-ho a intentar.\",\r\n      submitError: \"Cal que emplenis i seleccionis una adre\u00e7a v\u00e0lida abans d'enviar. Gr\u00e0cies\",\r\n      success: \"\u2713 D'acord! Adre\u00e7a trobada\"\r\n    },\r\n    pt: {\r\n      error: \"Por favor, insira o endere\u00e7o e selecione-o na lista. Se ainda n\u00e3o souber o endere\u00e7o exato, insira a localidade mais pr\u00f3xima e selecione-a. Se tiver problemas, atualize a p\u00e1gina e tente novamente.\",\r\n      submitError: \"Voc\u00ea deve preencher e selecionar um endere\u00e7o v\u00e1lido antes de enviar. Obrigado\",\r\n      success: \"\u2713 \u00d3timo! Endere\u00e7o encontrado\"\r\n    },\r\n    nl: {\r\n      error: \"Vul het adres in en selecteer het uit de lijst. Als je het exacte adres nog niet weet, voer dan de dichtstbijzijnde plaats in en selecteer deze. Als je problemen hebt, vernieuw de pagina en probeer opnieuw.\",\r\n      submitError: \"Je moet een geldig adres invullen en selecteren voordat je verzendt. Bedankt\",\r\n      success: \"\u2713 Geweldig! Adres gevonden\"\r\n    },\r\n    de: {\r\n      error: \"Bitte geben Sie die Adresse ein und w\u00e4hlen Sie sie aus der Liste aus. Wenn Sie die genaue Adresse noch nicht wissen, geben Sie den n\u00e4chstgelegenen Ort ein und w\u00e4hlen Sie ihn aus. Wenn Sie Probleme haben, aktualisieren Sie die Seite und versuchen Sie es erneut.\",\r\n      submitError: \"Sie m\u00fcssen eine g\u00fcltige Adresse eingeben und ausw\u00e4hlen, bevor Sie absenden. Vielen Dank\",\r\n      success: \"\u2713 Super! Adresse gefunden\"\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 addressField = document.getElementById('direccion');\r\n  const mapsUrlField = document.getElementById('maps_url');\r\n  const autocompleteErrorMessage = document.createElement('div');\r\n\r\n  \/\/ Crear el contenedor de mensajes de error\r\n  autocompleteErrorMessage.id = 'autocomplete-mensaje';\r\n  autocompleteErrorMessage.style.display = 'none';\r\n\r\n  \/\/ A\u00f1adir el mensaje de error despu\u00e9s del campo de direcci\u00f3n\r\n  addressField.parentNode.insertBefore(autocompleteErrorMessage, addressField.nextSibling);\r\n\r\n  let autocomplete;\r\n  let sessionToken;\r\n\r\n  \/\/ Iniciar sesi\u00f3n y autocompletado solo al escribir 5+ caracteres\r\n  addressField.addEventListener('input', function () {\r\n    const inputValue = addressField.value.trim();\r\n\r\n    if (inputValue.length >= 5) {\r\n      if (!autocomplete) {\r\n        sessionToken = new google.maps.places.AutocompleteSessionToken(); \/\/ Generar token de sesi\u00f3n\r\n        autocomplete = new google.maps.places.Autocomplete(addressField, {\r\n          types: ['geocode'], \/\/ Solo direcciones\r\n          componentRestrictions: { country: ['es','ad','fr','pt'] },\r\n          sessionToken: sessionToken\r\n        });\r\n        addAutocompleteListener();\r\n      }\r\n    } else {\r\n      \/\/ Reiniciar si no alcanza los 5 caracteres\r\n      if (autocomplete) {\r\n        google.maps.event.clearInstanceListeners(autocomplete);\r\n        autocomplete = null;\r\n      }\r\n    }\r\n  });\r\n\r\n  function addAutocompleteListener() {\r\n    autocomplete.addListener('place_changed', function () {\r\n      setTimeout(() => {\r\n        const place = autocomplete.getPlace();\r\n\r\n        \/\/ Limpiar mensaje previo\r\n        addressField.classList.remove('valid-address');\r\n        autocompleteErrorMessage.style.display = 'none'; \/\/ Ocultar mensaje de error\r\n\r\n        if (!place.geometry) {\r\n          \/\/ Mostrar mensaje de error si no se selecciona una direcci\u00f3n v\u00e1lida\r\n          displayAutocompleteErrorMessage(langMessages.error);\r\n          return;\r\n        }\r\n\r\n        \/\/ Direcci\u00f3n v\u00e1lida\r\n        addressField.classList.add('valid-address');\r\n        autocompleteErrorMessage.style.display = 'none'; \/\/ Ocultar mensaje de error\r\n\r\n        \/\/ Extraer direcci\u00f3n completa y \u00e1reas administrativas\r\n        const fullAddress = extractFullAddress(place);\r\n        const region = extractAdministrativeAreaLevel(place, 'administrative_area_level_1');\r\n        const province = extractAdministrativeAreaLevel(place, 'administrative_area_level_2');\r\n\r\n        \/\/ Asignar los valores\r\n        addressField.value = fullAddress;\r\n        mapsUrlField.value = generateGoogleMapsUrl(fullAddress);\r\n\r\n        document.getElementById('region').value = region;\r\n        document.getElementById('province').value = province;\r\n\r\n        \/\/ Mostrar mensaje de \u00e9xito inmediatamente\r\n        const mensajeField = document.getElementById('direccion-mensaje'); \/\/ Asegurarse de que el campo exista\r\n        if (mensajeField) {\r\n          mensajeField.className = 'success-message';\r\n          mensajeField.innerText = langMessages.success;\r\n        }\r\n\r\n        \/\/ Disparar el evento blur para Distance Matrix solo si no se ha disparado antes\r\n        if (!addressField.classList.contains('valid-address')) {\r\n          addressField.dispatchEvent(new Event('blur'));\r\n        }\r\n        \/\/ Resetear el token de sesi\u00f3n\r\n        sessionToken = new google.maps.places.AutocompleteSessionToken(); \/\/ Generar un nuevo token de sesi\u00f3n\r\n      }, 50); \/\/ Peque\u00f1o retraso para procesamiento correcto\r\n    });\r\n  }\r\n\r\n  \/\/ Si el usuario intenta avanzar sin alcanzar el m\u00ednimo o seleccionar del autocompletado\r\n  addressField.addEventListener('blur', function () {\r\n    const currentValue = addressField.value;\r\n    if (!currentValue || !addressField.classList.contains('valid-address')) {\r\n      displayAutocompleteErrorMessage(langMessages.error);\r\n    }\r\n  });\r\n\r\n  \/\/ Mostrar mensaje de error\r\n  function displayAutocompleteErrorMessage(message) {\r\n    autocompleteErrorMessage.innerText = message;\r\n    autocompleteErrorMessage.style.display = 'block';\r\n    addressField.focus(); \/\/ Redirigir al campo con error\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para extraer la direcci\u00f3n completa\r\n  function extractFullAddress(place) {\r\n    let streetNumber = '', streetName = '', city = '';\r\n    place.address_components.forEach(component => {\r\n      const types = component.types;\r\n      if (types.includes('street_number')) streetNumber = component.long_name;\r\n      if (types.includes('route')) streetName = component.long_name;\r\n      if (types.includes('locality')) city = component.long_name;\r\n    });\r\n    return `${streetNumber ? streetNumber + ' ' : ''}${streetName ? streetName + ', ' : ''}${city}`;\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para extraer \u00e1reas administrativas (e.g., administrative_area_level_1 o _2)\r\n  function extractAdministrativeAreaLevel(place, level) {\r\n    let area = '';\r\n    place.address_components.forEach(component => {\r\n      if (component.types.includes(level)) {\r\n        area = component.long_name;\r\n      }\r\n    });\r\n    return area;\r\n  }\r\n\r\n  function generateGoogleMapsUrl(address) {\r\n    return `https:\/\/www.google.com\/maps\/search\/?api=1&query=${encodeURIComponent(address)}`;\r\n  }\r\n\r\n  \/\/ Validaci\u00f3n en el env\u00edo del formulario (Contact Form 7)\r\n  const form = document.querySelector('form.wpcf7-form');\r\n  if (form) {\r\n    form.addEventListener('submit', function (event) {\r\n      const addressField = document.getElementById('direccion');\r\n      if (!addressField.classList.contains('valid-address')) {\r\n        const autocompleteErrorMessage = document.getElementById('autocomplete-mensaje');\r\n        if (autocompleteErrorMessage) {\r\n          autocompleteErrorMessage.innerText = langMessages.submitError;\r\n          autocompleteErrorMessage.style.display = 'block';\r\n        }\r\n        addressField.focus(); \/\/ Redirigir al campo con error\r\n        event.preventDefault(); \/\/ Bloquea el env\u00edo\r\n        event.stopImmediatePropagation(); \/\/ Detiene propagaci\u00f3n\r\n      }\r\n    });\r\n  }\r\n};\r\n\r\n\r\n<\/script>\r\n\r\n<script defer>\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      success: \"\u2713 \u00a1Genial! Direcci\u00f3n encontrada\",\r\n      error: \"\u2717 \u00a1Oops! Algo sali\u00f3 mal. Por favor, intenta de nuevo o selecciona otra direcci\u00f3n.\"\r\n    },\r\n    en: {\r\n      success: \"\u2713 Great! Address found\",\r\n      error: \"\u2717 Oops! Something went wrong. Please try or select again.\"\r\n    },\r\n    fr: {\r\n      success: \"\u2713 Super ! Adresse trouv\u00e9e\",\r\n      error: \"\u2717 Oups ! Quelque chose s'est mal pass\u00e9. Veuillez r\u00e9essayer ou s\u00e9lectionner \u00e0 nouveau.\"\r\n    },\r\n    ca: {\r\n      success: \"\u2713 D'acord! Adre\u00e7a trobada\",\r\n      error: \"\u2717 D'acord! Alguna cosa ha anat malament. Si us plau, intenta-ho de nou o selecciona una altra adre\u00e7a.\"\r\n    },\r\n    pt: {\r\n      success: \"\u2713 \u00d3timo! Endere\u00e7o encontrado\",\r\n      error: \"\u2717 Ops! Algo deu errado. Por favor, tente novamente ou selecione outro endere\u00e7o.\"\r\n    },\r\n    nl: {\r\n      success: \"\u2713 Geweldig! Adres gevonden\",\r\n      error: \"\u2717 Oeps! Er ging iets mis. Probeer opnieuw of selecteer nogmaals.\"\r\n    },\r\n    de: {\r\n      success: \"\u2713 Super! Adresse gefunden\",\r\n      error: \"\u2717 Ups! Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut oder w\u00e4hlen Sie erneut aus.\"\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  \/\/ Referencias a los elementos del DOM\r\n    var addressField = document.getElementById('direccion');\r\n    var ubicacionBaseField = document.getElementById('ubicacion-base');\r\n    var distanciaKmField = document.getElementById('distancia-km');\r\n    var incrementoField = document.getElementById('incremento');\r\n    var precioTotalField = document.getElementById('precio_total');\r\n    var precioRedondeadoField = document.getElementById('precio_redondeado');\r\n    var precioField = document.getElementById('precio');\r\n    var precioArtistaField = document.getElementById('precio_artista');\r\n    var precioAgenciaField = document.getElementById('precio_agencia');\r\n    var incrementosAgenciaField = document.getElementById('incrementos-agencia');\r\n    var paisEventoField = document.getElementById('pais_evento');\r\n    var tiempoViajeField = document.getElementById('tiempo-viaje');\r\n    var mensajeField = document.getElementById('direccion-mensaje');\r\n    var bookingPaymentField = document.getElementById('booking-payment');\r\n    var mapsUrlField = document.getElementById('maps_url');\r\n    var priceWithPaymentInAdvanceField = document.getElementById('price_with_payment_in_advance');\r\n    var advanceAgencyFeeField = document.getElementById('advance_agency_fee');\r\n    var pendingAgencyFeeField = document.getElementById('pending_agency_fee');\r\n    var precioDobleShowField = document.getElementById('precio_doble_show');\r\n    var precioRedondeadoDobleShowField = document.getElementById('precio_redondeado_doble_show');\r\n    var precioDobleShowConDescuentoField = document.getElementById('precio_doble_show_con_descuento');\r\n    var precioAgenciaDobleShowField = document.getElementById('precio_agencia_doble_show');\r\n    var priceWithPaymentInAdvanceDobleShowField = document.getElementById('price_with_payment_in_advance_doble_show');\r\n    var pendingAgencyFeeDobleShowField = document.getElementById('pending_agency_fee_doble_show');\r\n    var precioArtistaDobleShowField = document.getElementById('precio_artista_doble_show');\r\n    var restanteDiaEventoDobleShowField = document.getElementById('restante_dia_evento_doble_show');\r\n\r\n  \/\/ Os2 - El KmThreshold siempre debe ser mayor que 1 aunque el feeIncrement sino da error el calculo.\r\n  var locations = [\r\n    { name: 'Andorra', baseAddress: 'Carrer Josep Viladomat, 22, AD700 Escaldes-Engordany, Andorra', basePrice: 347, incrementRate: 0.50, agencyFee: 100, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 50 },\r\n    { name: 'Castellon', baseAddress: 'Castell\u00f3n, Espa\u00f1a', basePrice: 207, incrementRate: 0.77, agencyFee: 100, kmThreshold: 60, feeIncrement: 0, advanceAgencyFee: 100 },\r\n    { name: 'Valencia', baseAddress: 'Valencia, Espa\u00f1a', basePrice: 222, incrementRate: 0.75, agencyFee: 115, kmThreshold: 60, feeIncrement: 5, advanceAgencyFee: 115},\r\n    { name: 'Javea', baseAddress: 'X\u00e0bia, Espa\u00f1a', basePrice: 278, incrementRate: 0.75, agencyFee: 100, kmThreshold: 60, feeIncrement: 5, advanceAgencyFee: 100},\r\n    { name: 'Murcia-Mojacar', baseAddress: 'Murcia, Espa\u00f1a', basePrice: 197, incrementRate: 0.35, agencyFee: 100, kmThreshold: 60, feeIncrement: 0, advanceAgencyFee: 30 },\r\n    { name: 'Alicante', baseAddress: 'Alicante, Espa\u00f1a', basePrice: 227, incrementRate: 0.52, agencyFee: 110, kmThreshold: 60, feeIncrement: 0, advanceAgencyFee: 30 },\r\n    { name: 'Torrevieja', baseAddress: 'Torrevieja, Espa\u00f1a', basePrice: 228, incrementRate: 0.3, agencyFee: 110, kmThreshold: 60, feeIncrement: 0, advanceAgencyFee: 30 },\r\n    { name: 'Elche', baseAddress: 'Elche, Espa\u00f1a', basePrice: 227, incrementRate: 0.59, agencyFee: 110, kmThreshold: 60, feeIncrement: 0, advanceAgencyFee: 30 },\r\n    { name: 'Barcelona', baseAddress: 'Barcelona, Espa\u00f1a', basePrice: 217, incrementRate: 0.75, agencyFee: 120, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 30 },\r\n    { name: 'Girona1', baseAddress: 'Lloret de Mar, Girona', basePrice: 233, incrementRate: 0.95, agencyFee: 115, kmThreshold: 50, feeIncrement: 5, advanceAgencyFee: 25 },\r\n    { name: 'Girona2', baseAddress: 'Playa de Aro, Girona', basePrice: 233, incrementRate: 0.95, agencyFee: 115, kmThreshold: 50, feeIncrement: 5, advanceAgencyFee: 25 },\r\n    { name: 'Girona3', baseAddress: 'Vilanova de la Muga, Girona', basePrice: 313, incrementRate: 0.1, agencyFee: 115, kmThreshold: 50, feeIncrement: 0, advanceAgencyFee: 25 },\r\n    { name: 'Tarragona-Reus1', baseAddress: 'Reus, Espa\u00f1a', basePrice: 223, incrementRate: 0.45, agencyFee: 115, kmThreshold: 80, feeIncrement: 0, advanceAgencyFee: 20 },\r\n    { name: 'Tarragona-Sitges', baseAddress: 'El Vendrell, Tarragona', basePrice: 223, incrementRate: 0.45, agencyFee: 115, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 20 },\r\n    { name: 'Tarragona-Reus2', baseAddress: 'Salou, Espa\u00f1a', basePrice: 223, incrementRate: 0.45, agencyFee: 115, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 20 },\r\n    { name: 'Tarragona-Reus3', baseAddress: 'Tarragona, Espa\u00f1a', basePrice: 223, incrementRate: 0.45, agencyFee: 115, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 20 },\r\n    { name: 'Tarragona-Reus4', baseAddress: 'Riudoms, Espa\u00f1a', basePrice: 223, incrementRate: 0.70, agencyFee: 115, kmThreshold: 80, feeIncrement: 0, advanceAgencyFee: 20 },\r\n    { name: 'Tarragona-Reus5', baseAddress: 'Cambrils, Espa\u00f1a', basePrice: 223, incrementRate: 0.50, agencyFee: 115, kmThreshold: 80, feeIncrement: 5, advanceAgencyFee: 20 },\r\n    { name: 'Zaragoza', baseAddress: 'Zaragoza, Espa\u00f1a', basePrice: 248, incrementRate: 0.60, agencyFee: 80, kmThreshold: 40, feeIncrement: 50, advanceAgencyFee: 30 },\r\n    { name: 'Ibiza', baseAddress: 'Ibiza, Espa\u00f1a', basePrice: 233, incrementRate: 0.01, agencyFee: 115, advanceAgencyFee: 30, kmThreshold: 50, feeIncrement: 30 },\r\n    { name: 'Mallorca', baseAddress: 'Palma, Espa\u00f1a', basePrice: 237, incrementRate: 0.65, agencyFee: 115, kmThreshold: 60, feeIncrement: 5, advanceAgencyFee: 30 }\r\n  ];\r\n\r\n  if (addressField && mensajeField) {\r\n    addressField.addEventListener('input', function() {\r\n      if (mensajeField.classList.contains('success-message')) {\r\n        mensajeField.innerText = '';\r\n        mensajeField.classList.remove('success-message');\r\n      }\r\n      if (addressField.classList.contains('valid-address')) {\r\n        addressField.classList.remove('valid-address');\r\n      }\r\n    });\r\n\r\n    addressField.addEventListener('blur', function() {\r\n      var address = addressField.value;\r\n\r\n      if (!address || !addressField.classList.contains('valid-address')) {\r\n        return;\r\n      }\r\n\r\n      var service = new google.maps.DistanceMatrixService();\r\n      var origins = locations.map(location => location.baseAddress);\r\n\r\n      service.getDistanceMatrix({\r\n        origins: origins,\r\n        destinations: [address],\r\n        travelMode: 'DRIVING',\r\n      }, function(response, status) {\r\n        if (status !== 'OK') {\r\n          mensajeField.className = 'error-message';\r\n          mensajeField.innerText = langMessages.error;\r\n          addressField.classList.remove('valid-address');\r\n          return;\r\n        }\r\n\r\n        var results = response.rows.map((row, index) => {\r\n          var distanceElement = row.elements[0];\r\n          if (!distanceElement.distance || !distanceElement.duration) {\r\n            return null;\r\n          }\r\n          return {\r\n            location: locations[index],\r\n            distanceInKm: distanceElement.distance.value \/ 1000,\r\n            travelTime: distanceElement.duration.value\r\n          };\r\n        }).filter(result => result !== null);\r\n\r\n        if (results.length === 0) {\r\n          mensajeField.className = 'error-message';\r\n          mensajeField.innerText = langMessages.error;\r\n          addressField.classList.remove('valid-address');\r\n          return;\r\n        }\r\n\r\n        var nearestLocation = results.reduce((prev, curr) => {\r\n          return (prev.distanceInKm < curr.distanceInKm) ? prev : curr;\r\n        });\r\n\r\n        var distanceInKm = nearestLocation.distanceInKm;\r\n        var travelTimeInSeconds = nearestLocation.travelTime;\r\n        var basePrice = nearestLocation.location.basePrice;\r\n        var incrementRate = nearestLocation.location.incrementRate;\r\n        var baseAgencyFee = nearestLocation.location.agencyFee;\r\n        var advanceAgencyFee = nearestLocation.location.advanceAgencyFee || 0;\r\n        var kmThreshold = nearestLocation.location.kmThreshold;\r\n        var feeIncrement = nearestLocation.location.feeIncrement;\r\n        var increment = Math.ceil(distanceInKm * incrementRate);\r\n        var precioTotal = basePrice + increment;\r\n\r\n        var agencyFeeIncrements = Math.floor(distanceInKm \/ kmThreshold) * feeIncrement;\r\n        var agencyFee = baseAgencyFee + agencyFeeIncrements;\r\n\r\n        var precioRedondeado = Math.ceil(precioTotal \/ 5) * 5;\r\n        var precioArtista = precioRedondeado - agencyFee;\r\n        var priceWithPaymentInAdvance = precioRedondeado - advanceAgencyFee;\r\n        var pendingAgencyFee = agencyFee - advanceAgencyFee;\r\n\r\n        \/\/ C\u00e1lculo del precio para doble show\r\n        var precioRedondeadoDobleShow = Math.ceil(precioRedondeado * 2 \/ 5) * 5;\r\n        var agencyFeeDobleShow = agencyFee * 2;\r\n        var advanceAgencyFeeDobleShow = advanceAgencyFee * 2;\r\n\r\n        var descuentoDobleShow = precioRedondeadoDobleShow * 0.10;\r\n        var precioConDescuentoDobleShow = precioRedondeadoDobleShow - descuentoDobleShow;\r\n\r\n        var agencyFeeDobleShowFinal = agencyFeeDobleShow - descuentoDobleShow;\r\n        var precioArtistaDobleShow = (precioConDescuentoDobleShow - agencyFeeDobleShowFinal) \/ 2;\r\n\r\n        \/\/ Calcular el pago por adelantado correcto para el doble show\r\n        var priceWithPaymentInAdvanceDobleShow = advanceAgencyFeeDobleShow;\r\n        var restanteDiaEventoDobleShow = precioConDescuentoDobleShow - priceWithPaymentInAdvanceDobleShow;\r\n\r\n        const hours = Math.floor(travelTimeInSeconds \/ 3600);\r\n        const minutes = Math.floor((travelTimeInSeconds % 3600) \/ 60);\r\n\r\n        \/\/ Actualizar los campos de la UI\r\n        if (ubicacionBaseField) ubicacionBaseField.value = nearestLocation.location.baseAddress;\r\n        if (distanciaKmField) distanciaKmField.value = distanceInKm.toFixed(2);\r\n        if (incrementoField) incrementoField.value = increment.toFixed(0);\r\n        if (precioTotalField) precioTotalField.value = precioTotal.toFixed(0);\r\n        if (precioRedondeadoField) precioRedondeadoField.value = precioRedondeado.toFixed(0);\r\n        if (precioField) precioField.value = precioRedondeado.toFixed(0);\r\n        if (precioArtistaField) precioArtistaField.value = precioArtista.toFixed(0);\r\n        if (precioAgenciaField) precioAgenciaField.value = agencyFee.toFixed(0);\r\n        if (incrementosAgenciaField) incrementosAgenciaField.value = agencyFeeIncrements.toFixed(0);\r\n        if (tiempoViajeField) tiempoViajeField.value = `${hours} hora\/s y ${minutes} min`;\r\n        if (priceWithPaymentInAdvanceField) priceWithPaymentInAdvanceField.value = priceWithPaymentInAdvance.toFixed(0);\r\n        if (paisEventoField) paisEventoField.value = response.destinationAddresses[0].split(',').pop().trim();\r\n        if (pendingAgencyFeeField) pendingAgencyFeeField.value = pendingAgencyFee.toFixed(0);\r\n        if (advanceAgencyFeeField) advanceAgencyFeeField.value = advanceAgencyFee.toFixed(0);\r\n\r\n        \/\/ Campos adicionales para doble show\r\n        if (precioDobleShowField) precioDobleShowField.value = precioRedondeadoDobleShow.toFixed(0);\r\n        if (precioRedondeadoDobleShowField) precioRedondeadoDobleShowField.value = precioRedondeadoDobleShow.toFixed(0);\r\n        if (precioDobleShowConDescuentoField) precioDobleShowConDescuentoField.value = precioConDescuentoDobleShow.toFixed(0);\r\n        if (precioAgenciaDobleShowField) precioAgenciaDobleShowField.value = agencyFeeDobleShowFinal.toFixed(0);\r\n        if (priceWithPaymentInAdvanceDobleShowField) priceWithPaymentInAdvanceDobleShowField.value = priceWithPaymentInAdvanceDobleShow.toFixed(0);\r\n        if (pendingAgencyFeeDobleShowField) pendingAgencyFeeDobleShowField.value = (agencyFeeDobleShowFinal - advanceAgencyFeeDobleShow).toFixed(0);\r\n        if (precioArtistaDobleShowField) precioArtistaDobleShowField.value = precioArtistaDobleShow.toFixed(0);\r\n        if (restanteDiaEventoDobleShowField) restanteDiaEventoDobleShowField.value = restanteDiaEventoDobleShow.toFixed(0);\r\n\r\n        \/\/ Mostrar mensaje de \u00e9xito\r\n        mensajeField.className = 'success-message';\r\n        mensajeField.innerText = langMessages.success;\r\n        addressField.classList.add('valid-address');\r\n      });\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\t\t\t  \/\/ ===== Script Thanks Only 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',\r\n    en: 'thanks',\r\n    fr: 'merci',\r\n    ca: 'gracies',\r\n    pt: 'obrigado',\r\n    nl: 'bedankt',\r\n    de: '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 \/\/ No se recogia bien la url para make - si se imprimia nativamente la url en el email de informacion\r\ndocument.addEventListener('DOMContentLoaded', function() {\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<\/script> \r\n\r\n\r\n<script defer>\r\n\/\/ Script Tipo de Grupo - Tipo de Evento Universal\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ 1) Configuraci\u00f3n de locales\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    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    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    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    pl: {\r\n      tipo_grupo_options: ['Wybierz', 'Kobiet', 'M\u0119\u017cczyzn', 'Obojga'],\r\n      tipo_evento_options: ['Wybierz', 'Wiecz\u00f3r panie\u0144ski', 'Wiecz\u00f3r kawalerski', 'Urodziny', 'Inny rodzaj imprezy', 'Inne'],\r\n      tipo_grupo_label: 'Jeste\u015bmy grup\u0105:',\r\n      tipo_evento_label: 'Rodzaj uroczysto\u015bci:',\r\n      requiredMessage: 'Prosz\u0119 wybra\u0107 wa\u017cn\u0105 opcj\u0119.',\r\n      invalidGrupoMessage: 'Prosz\u0119 wybra\u0107 wa\u017cny typ grupy (nie \"Wybierz\").',\r\n      invalidEventoMessage: 'Prosz\u0119 wybra\u0107 wa\u017cny typ uroczysto\u015bci (nie \"Wybierz\").',\r\n      successGrupoMessage: 'Bardzo dobrze',\r\n      successEventoMessage: 'Idealnie'\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  };\r\n\r\n  \/\/ 2) Config sitio (dominio + idiomas) - NUEVA L\u00d3GICA ROBUSTA\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  \/\/ 3) Detecci\u00f3n idioma (html lang -> primer segmento -> default) - NUEVA FUNCI\u00d3N\r\n  function getLocaleFromUrl() {\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    \r\n    \/\/ Prioridad: 1) HTML lang, 2) Segmento URL, 3) Default del sitio\r\n    if (site.langs.includes(htmlLang)) {\r\n      return htmlLang;\r\n    } else if (site.langs.includes(firstSeg)) {\r\n      return firstSeg;\r\n    } else {\r\n      return site.defaultLang;\r\n    }\r\n  }\r\n\r\n  \/\/ 4) Formatear valores\r\n  function formatValue(value, options, locale, primaryLocale) {\r\n    \/\/ Determinar si el valor pertenece a tipo_grupo o tipo_evento\r\n    const isGrupo = locales[primaryLocale].tipo_grupo_options.includes(value);\r\n    const sourceOptions = isGrupo ? locales[primaryLocale].tipo_grupo_options : locales[primaryLocale].tipo_evento_options;\r\n    const targetOptions = isGrupo ? locales[locale].tipo_grupo_options : locales[locale].tipo_evento_options;\r\n    \r\n    \/\/ Encontrar el \u00edndice del valor en las opciones del idioma del formulario\r\n    const index = sourceOptions.indexOf(value);\r\n    if (index === -1) return value; \/\/ Devolver el valor original si no se encuentra\r\n    return targetOptions[index] || value; \/\/ Devolver el valor traducido o el original\r\n  }\r\n\r\n  \/\/ 5) 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  \/\/ 6) 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 = 'black';\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.marginTop = '5px';\r\n  if (tipoGrupoField) {\r\n    tipoGrupoField.parentNode.insertBefore(grupoSuccessDisplay, grupoErrorDisplay);\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 = 'black';\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.marginTop = '5px';\r\n  if (tipoEventoField) {\r\n    tipoEventoField.parentNode.insertBefore(eventoSuccessDisplay, eventoErrorDisplay);\r\n  }\r\n\r\n  \/\/ 7) Rastrear interacci\u00f3n del usuario\r\n  let hasInteractedGrupo = false;\r\n  let hasInteractedEvento = false;\r\n\r\n  \/\/ 8) Forzar redibujo del mensaje\r\n  function forceRedibujo(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight;\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ 9) Validar campos en tiempo real\r\n  function validateFields() {\r\n    if (!tipoGrupoField || !tipoEventoField || !hiddenTipoGrupo || !hiddenTipoEvento) {\r\n      return;\r\n    }\r\n    const primaryLocale = getLocaleFromUrl();\r\n    const { tipo_grupo_options, tipo_evento_options, invalidGrupoMessage, invalidEventoMessage, successGrupoMessage, successEventoMessage } = locales[primaryLocale] || locales['es'];\r\n\r\n    let isValid = true;\r\n\r\n    \/\/ Validar tipo_grupo (no mostrar error a menos que haya interacci\u00f3n)\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      forceRedibujo(grupoErrorDisplay);\r\n      isValid = false;\r\n    } else if (tipoGrupoField.value && tipoGrupoField.value !== tipo_grupo_options[0]) {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.innerText = '';\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.innerText = hasInteractedGrupo ? successGrupoMessage : '';\r\n      grupoSuccessDisplay.style.display = hasInteractedGrupo ? 'block' : 'none';\r\n      if (hasInteractedGrupo) forceRedibujo(grupoSuccessDisplay);\r\n    } else {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.innerText = '';\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.innerText = '';\r\n      grupoSuccessDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Validar tipo_evento (no mostrar error a menos que haya interacci\u00f3n)\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      forceRedibujo(eventoErrorDisplay);\r\n      isValid = false;\r\n    } else if (tipoEventoField.value && tipoEventoField.value !== tipo_evento_options[0]) {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.innerText = '';\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.innerText = hasInteractedEvento ? successEventoMessage : '';\r\n      eventoSuccessDisplay.style.display = hasInteractedEvento ? 'block' : 'none';\r\n      if (hasInteractedEvento) forceRedibujo(eventoSuccessDisplay);\r\n    } else {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.innerText = '';\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.innerText = '';\r\n      eventoSuccessDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Asignar valores a campos ocultos para el idioma principal\r\n    hiddenTipoGrupo.value = formatValue(tipoGrupoField.value, tipo_grupo_options, primaryLocale, primaryLocale);\r\n    hiddenTipoEvento.value = formatValue(tipoEventoField.value, tipo_evento_options, primaryLocale, primaryLocale);\r\n\r\n    \/\/ Asignar valores para el proveedor (usar idioma del sufijo del campo oculto o 'es' por defecto)\r\n    let grupoProviderLocale = 'es'; \/\/ Predeterminado a espa\u00f1ol si no hay campo oculto\r\n    if (extraTipoGrupoField) {\r\n      const localeFromExtra = extraTipoGrupoField.id.replace('tipo_grupo_final_', '');\r\n      if (locales[localeFromExtra]) {\r\n        grupoProviderLocale = localeFromExtra;\r\n      }\r\n    }\r\n    if (providerTipoGrupo) {\r\n      providerTipoGrupo.value = formatValue(tipoGrupoField.value, locales[grupoProviderLocale].tipo_grupo_options, grupoProviderLocale, primaryLocale);\r\n      if (extraTipoGrupoField) extraTipoGrupoField.value = providerTipoGrupo.value;\r\n    }\r\n\r\n    let eventoProviderLocale = 'es'; \/\/ Predeterminado a espa\u00f1ol si no hay campo oculto\r\n    if (extraTipoEventoField) {\r\n      const localeFromExtra = extraTipoEventoField.id.replace('tipo_evento_final_', '');\r\n      if (locales[localeFromExtra]) {\r\n        eventoProviderLocale = localeFromExtra;\r\n      }\r\n    }\r\n    if (providerTipoEvento) {\r\n      providerTipoEvento.value = formatValue(tipoEventoField.value, locales[eventoProviderLocale].tipo_evento_options, eventoProviderLocale, primaryLocale);\r\n      if (extraTipoEventoField) extraTipoEventoField.value = providerTipoEvento.value;\r\n    }\r\n\r\n    return isValid;\r\n  }\r\n\r\n  \/\/ 10) Validar antes del env\u00edo\r\n  function validateForm(event) {\r\n    const primaryLocale = getLocaleFromUrl();\r\n    const { tipo_grupo_options, tipo_evento_options, invalidGrupoMessage, invalidEventoMessage, successGrupoMessage, successEventoMessage } = locales[primaryLocale] || locales['es'];\r\n\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      forceRedibujo(grupoErrorDisplay);\r\n      tipoGrupoField.focus();\r\n      isValid = false;\r\n    } else {\r\n      tipoGrupoField.setCustomValidity('');\r\n      grupoErrorDisplay.innerText = '';\r\n      grupoErrorDisplay.style.display = 'none';\r\n      grupoSuccessDisplay.innerText = successGrupoMessage;\r\n      grupoSuccessDisplay.style.display = 'block';\r\n      forceRedibujo(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      forceRedibujo(eventoErrorDisplay);\r\n      tipoEventoField.focus();\r\n      isValid = false;\r\n    } else {\r\n      tipoEventoField.setCustomValidity('');\r\n      eventoErrorDisplay.innerText = '';\r\n      eventoErrorDisplay.style.display = 'none';\r\n      eventoSuccessDisplay.innerText = successEventoMessage;\r\n      eventoSuccessDisplay.style.display = 'block';\r\n      forceRedibujo(eventoSuccessDisplay);\r\n    }\r\n\r\n    return isValid;\r\n  }\r\n\r\n  \/\/ 11) 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  \/\/ 12) Inicializar al cargar\r\n  validateFields();\r\n});\r\n<\/script>\r\n\r\n\r\n<script defer>\r\n\/\/ Script Nuevo Flexibilidad Universal\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ 1) Configuraci\u00f3n de locales\r\n  const locales = {\r\n    es: {\r\n      options: ['Horario exacto', 'Flexible'],\r\n      label: 'El inicio del espect\u00e1culo podr\u00eda ser entre:',\r\n      fullLabel: 'Horario Flexible (inicio del espect\u00e1culo podr\u00eda ser entre):',\r\n      separator: ' y ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'La hora de fin debe ser posterior a la hora de inicio.',\r\n      requiredMessage: 'Por favor, selecciona tanto la hora de inicio como la de fin.',\r\n      successMessage: 'Genial'\r\n    },\r\n    en: {\r\n      options: ['Exact time', 'Flexible'],\r\n      label: 'The show start time could be between:',\r\n      fullLabel: 'Flexible Schedule (the show start time could be between):',\r\n      separator: ' and ',\r\n      timeFormat: '12h',\r\n      errorMessage: 'The end time must be later than the start time.',\r\n      requiredMessage: 'Please select both start and end times.',\r\n      successMessage: 'Great'\r\n    },\r\n    fr: {\r\n      options: ['Horaire exact', 'Flexible'],\r\n      label: 'L\u00b4heure de d\u00e9but du spectacle pourrait \u00eatre entre :',\r\n      fullLabel: 'Horaire Flexible (l\u00b4heure de d\u00e9but du spectacle pourrait \u00eatre entre) :',\r\n      separator: ' et ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'L\u00b4heure de fin doit \u00eatre post\u00e9rieure \u00e0 l\u00b4heure de d\u00e9but.',\r\n      requiredMessage: 'Veuillez s\u00e9lectionner l\u00b4heure de d\u00e9but et l\u00b4heure de fin.',\r\n      successMessage: 'Super'\r\n    },\r\n    pt: {\r\n      options: ['Hor\u00e1rio exato', 'Flex\u00edvel'],\r\n      label: 'O hor\u00e1rio de in\u00edcio do show poderia ser entre:',\r\n      fullLabel: 'Hor\u00e1rio Flex\u00edvel (o hor\u00e1rio de in\u00edcio do show poderia ser entre):',\r\n      separator: ' e ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'O hor\u00e1rio de t\u00e9rmino deve ser posterior ao hor\u00e1rio de in\u00edcio.',\r\n      requiredMessage: 'Por favor, selecione o hor\u00e1rio de in\u00edcio e o de t\u00e9rmino.',\r\n      successMessage: '\u00d3timo'\r\n    },\r\n    de: {\r\n      options: ['Genauer Zeitpunkt', 'Flexibel'],\r\n      label: 'Die Startzeit der Show k\u00f6nnte zwischen folgenden Zeiten liegen:',\r\n      fullLabel: 'Flexibler Zeitplan (die Startzeit der Show k\u00f6nnte zwischen folgenden Zeiten liegen):',\r\n      separator: ' und ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'Die Endzeit muss sp\u00e4ter als die Startzeit sein.',\r\n      requiredMessage: 'Bitte w\u00e4hlen Sie sowohl die Start- als auch die Endzeit aus.',\r\n      successMessage: 'Toll'\r\n    },\r\n    nl: {\r\n      options: ['Exact tijdstip', 'Flexibel'],\r\n      label: 'De begintijd van de show kan tussen de volgende tijden liggen:',\r\n      fullLabel: 'Flexibel Schema (de begintijd van de show kan tussen de volgende tijden liggen):',\r\n      separator: ' en ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'De eindtijd moet later zijn dan de begintijd.',\r\n      requiredMessage: 'Selecteer zowel de start- als de eindtijd.',\r\n      successMessage: 'Geweldig'\r\n    },\r\n    pl: {\r\n      options: ['Dok\u0142adny czas', 'Elastyczny'],\r\n      label: 'Godzina rozpocz\u0119cia pokazu mo\u017ce by\u0107 mi\u0119dzy:',\r\n      fullLabel: 'Elastyczny Harmonogram (godzina rozpocz\u0119cia pokazu mo\u017ce by\u0107 mi\u0119dzy):',\r\n      separator: ' a ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'Czas zako\u0144czenia musi by\u0107 p\u00f3\u017aniejszy ni\u017c czas rozpocz\u0119cia.',\r\n      requiredMessage: 'Prosz\u0119 wybra\u0107 zar\u00f3wno godzin\u0119 rozpocz\u0119cia, jak i zako\u0144czenia.',\r\n      successMessage: '\u015awietnie'\r\n    },\r\n    ca: {\r\n      options: ['Horari exacte', 'Flexible'],\r\n      label: 'L\u00b4hora d\u00b4inici de l\u00b4espectacle podria ser entre:',\r\n      fullLabel: 'Horari Flexible (l\u00b4hora d\u00b4inici de l\u00b4espectacle podria ser entre):',\r\n      separator: ' i ',\r\n      timeFormat: '24h',\r\n      errorMessage: 'L\u00b4hora de finalitzaci\u00f3 ha de ser posterior a l\u00b4hora d\u00b4inici.',\r\n      requiredMessage: 'Si us plau, selecciona tant l\u00b4hora d\u00b4inici com la de fi.',\r\n      successMessage: 'Genial'\r\n    }\r\n  };\r\n\r\n  \/\/ 2) Config sitio (dominio + idiomas) - NUEVA L\u00d3GICA ROBUSTA\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  \/\/ 3) Detecci\u00f3n idioma (html lang -> primer segmento -> default) - NUEVA FUNCI\u00d3N\r\n  function getLocaleFromUrl() {\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    \r\n    \/\/ Prioridad: 1) HTML lang, 2) Segmento URL, 3) Default del sitio\r\n    if (site.langs.includes(htmlLang)) {\r\n      return htmlLang;\r\n    } else if (site.langs.includes(firstSeg)) {\r\n      return firstSeg;\r\n    } else {\r\n      return site.defaultLang;\r\n    }\r\n  }\r\n\r\n  \/\/ 4) === NUEVO: Parseo universal de horas (24h y 12h con AM\/PM) ===\r\n  \/\/ Devuelve { h24, m, valid } desde \"HH:MM\", \"HH\", \"H:MM\", \"H\", \"h:mm AM\/PM\"\r\n  function parseTimeUniversal(t) {\r\n    if (!t || typeof t !== 'string') return { h24: NaN, m: NaN, valid: false };\r\n    const s = t.trim().toUpperCase();\r\n\r\n    \/\/ \u00bfFormato con AM\/PM?\r\n    const ampmMatch = s.match(\/\\b(AM|PM)\\b\/);\r\n    if (ampmMatch) {\r\n      const m = s.match(\/^\\s*(\\d{1,2})(?::(\\d{2}))?\\s*(AM|PM)\\s*$\/i);\r\n      if (!m) return { h24: NaN, m: NaN, valid: false };\r\n      let h = Number(m[1]);\r\n      let min = m[2] !== undefined ? Number(m[2]) : 0;\r\n      if (!Number.isInteger(h) || h < 1 || h > 12) return { h24: NaN, m: NaN, valid: false };\r\n      if (!Number.isInteger(min) || min < 0 || min > 59) return { h24: NaN, m: NaN, valid: false };\r\n      const isPM = m[3].toUpperCase() === 'PM';\r\n      if (h === 12) h = 0; \/\/ 12 AM -> 0; 12 PM -> 12 (se suma abajo)\r\n      const h24 = isPM ? h + 12 : h;\r\n      return { h24, m: min, valid: true };\r\n    }\r\n\r\n    \/\/ Formato 24h: \"HH:MM\" o \"HH\"\r\n    const parts = s.split(':');\r\n    const h = Number(parts[0]);\r\n    const min = parts.length > 1 ? Number(parts[1]) : 0;\r\n    const valid = Number.isInteger(h) && h >= 0 && h < 24 && Number.isInteger(min) && min >= 0 && min < 60;\r\n    return valid ? { h24: h, m: min, valid: true } : { h24: NaN, m: NaN, valid: false };\r\n  }\r\n\r\n  function to12HourFrom24(h24, m) {\r\n    const period = h24 >= 12 ? 'PM' : 'AM';\r\n    const h12 = (h24 % 12) || 12;\r\n    return `${h12}:${String(m).padStart(2, '0')} ${period}`;\r\n  }\r\n\r\n  function to24HourText(h24, m) {\r\n    return `${String(h24).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\r\n  }\r\n\r\n  \/\/ Convertir hora de 24h a 12h (ACTUALIZADA para aceptar cualquier entrada)\r\n  function to12HourFormat(time) {\r\n    if (!time) return '';\r\n    const t = parseTimeUniversal(time);\r\n    if (!t.valid) return ''; \/\/ evita NaN\r\n    return to12HourFrom24(t.h24, t.m);\r\n  }\r\n\r\n  \/\/ Mapear el valor de flexibilidad al espa\u00f1ol\r\n  function mapFlexibilityToSpanish(flexibility, primaryLocale) {\r\n    const options = locales[primaryLocale] ? locales[primaryLocale].options : locales['es'].options;\r\n    const index = options.indexOf(flexibility);\r\n    return index !== -1 ? locales['es'].options[index] : flexibility;\r\n  }\r\n\r\n  \/\/ Formatear flexibilidad (ACTUALIZADA para usar parseo universal)\r\n  function formatFlexibility(flexibility, startTime, endTime, locale) {\r\n    const { options, fullLabel, separator, timeFormat } = locales[locale] || locales['es'];\r\n    const index = locales['es'].options.indexOf(flexibility);\r\n    if (index === -1) return flexibility;\r\n    const translatedFlexibility = options[index] || flexibility;\r\n    if (flexibility !== locales['es'].options[1] || (!startTime && !endTime)) {\r\n      return translatedFlexibility;\r\n    }\r\n\r\n    \/\/ Parseo robusto de ambos inputs\r\n    const s = parseTimeUniversal(startTime);\r\n    const e = parseTimeUniversal(endTime);\r\n    if (!s.valid || !e.valid) {\r\n      return translatedFlexibility; \/\/ no construyas el rango si hay algo inv\u00e1lido\r\n    }\r\n\r\n    const formattedStart = timeFormat === '12h' ? to12HourFrom24(s.h24, s.m) : to24HourText(s.h24, s.m);\r\n    const formattedEnd   = timeFormat === '12h' ? to12HourFrom24(e.h24, e.m) : to24HourText(e.h24, e.m);\r\n    return `${fullLabel} ${formattedStart}${separator}${formattedEnd}`;\r\n  }\r\n\r\n  \/\/ 5) Elementos del DOM\r\n  const selectField = document.getElementById('flex-field');\r\n  const container = document.getElementById('franja_horaria_container');\r\n  const labelField = document.querySelector('label[for=\"hora_inicio\"]');\r\n  const startTimeInput = document.getElementById('hora_inicio');\r\n  const endTimeInput = document.getElementById('hora_fin');\r\n  const hiddenFlexibility = document.getElementById('flexibilidad_final');\r\n  const extraFlexibilityField = document.querySelector('[id^=\"flexibilidad_\"]:not([id=\"flexibilidad_final\"],[id=\"flexibilidad_provider\"])');\r\n  const providerFlexibilityField = document.getElementById('flexibilidad_provider');\r\n  const form = selectField ? selectField.closest('form') : null;\r\n\r\n  \/\/ Verificar si los elementos necesarios est\u00e1n presentes\r\n  if (!selectField || !container || !labelField || !startTimeInput || !endTimeInput || !hiddenFlexibility) {\r\n    return;\r\n  }\r\n\r\n  \/\/ 6) Crear contenedor para mensaje de error\r\n  const errorDisplay = document.createElement('div');\r\n  errorDisplay.id = 'flexibilidad-error-display';\r\n  errorDisplay.className = 'error-message';\r\n  errorDisplay.style.display = 'none';\r\n  errorDisplay.style.marginTop = '5px';\r\n  endTimeInput.parentNode.insertBefore(errorDisplay, endTimeInput.nextSibling);\r\n\r\n  \/\/ Crear contenedor para mensaje de \u00e9xito\r\n  const successDisplay = document.createElement('div');\r\n  successDisplay.id = 'flexibilidad-success-display';\r\n  successDisplay.className = 'success-message';\r\n  successDisplay.style.display = 'none';\r\n  endTimeInput.parentNode.insertBefore(successDisplay, errorDisplay);\r\n\r\n  \/\/ 7) Forzar redibujo del mensaje\r\n  function forceRedibujo(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight;\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ 8) Validar flexibilidad en tiempo real (ACTUALIZADA: usa parseo universal)\r\n  function validateFlexibility() {\r\n    const primaryLocale = getLocaleFromUrl();\r\n    const { options, label, timeFormat, errorMessage, requiredMessage, successMessage } = locales[primaryLocale] || locales['es'];\r\n\r\n    const val = selectField.value;\r\n    if (val === options[1]) { \/\/ Flexible\r\n      labelField.innerText = label;\r\n      container.style.display = '';\r\n      startTimeInput.required = true;\r\n      endTimeInput.required = true;\r\n      startTimeInput.disabled = false;\r\n      endTimeInput.disabled = false;\r\n    } else { \/\/ Horario exacto\r\n      container.style.display = 'none';\r\n      startTimeInput.required = false;\r\n      endTimeInput.required = false;\r\n      startTimeInput.disabled = true;\r\n      endTimeInput.disabled = true;\r\n      startTimeInput.value = '';\r\n      endTimeInput.value = '';\r\n      errorDisplay.style.display = 'none';\r\n      successDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Validar campos requeridos y coherencia horaria\r\n    if (val === options[1]) {\r\n      if (!startTimeInput.value || !endTimeInput.value) {\r\n        startTimeInput.setCustomValidity(requiredMessage);\r\n        errorDisplay.innerText = requiredMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        return false;\r\n      }\r\n\r\n      \/\/ NUEVO: parseo universal\r\n      const s = parseTimeUniversal(startTimeInput.value);\r\n      const e = parseTimeUniversal(endTimeInput.value);\r\n      if (!s.valid || !e.valid) {\r\n        startTimeInput.setCustomValidity(requiredMessage);\r\n        errorDisplay.innerText = requiredMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        return false;\r\n      }\r\n\r\n      \/\/ L\u00f3gica de madrugada conservada, sobre 24h limpias\r\n      let startHours = s.h24, startMinutes = s.m;\r\n      let endHours   = e.h24, endMinutes   = e.m;\r\n      if (startHours < 10) startHours += 24;\r\n      if (endHours < 10) endHours += 24;\r\n      const startTotalMinutes = startHours * 60 + startMinutes;\r\n      const endTotalMinutes = endHours * 60 + endMinutes;\r\n\r\n      if (endTotalMinutes <= startTotalMinutes) {\r\n        endTimeInput.setCustomValidity(errorMessage);\r\n        errorDisplay.innerText = errorMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        return false;\r\n      }\r\n\r\n      startTimeInput.setCustomValidity('');\r\n      endTimeInput.setCustomValidity('');\r\n      errorDisplay.innerText = '';\r\n      errorDisplay.style.display = 'none';\r\n      successDisplay.innerText = successMessage;\r\n      successDisplay.style.display = 'block';\r\n      forceRedibujo(successDisplay);\r\n    } else {\r\n      startTimeInput.setCustomValidity('');\r\n      endTimeInput.setCustomValidity('');\r\n      errorDisplay.innerText = '';\r\n      errorDisplay.style.display = 'none';\r\n      successDisplay.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Establecer valor para flexibilidad_final (idioma de la URL)\r\n    hiddenFlexibility.value = formatFlexibility(selectField.value, startTimeInput.value, endTimeInput.value, primaryLocale);\r\n\r\n    \/\/ Determinar idioma para el proveedor\r\n    let providerLocale = primaryLocale;\r\n    if (extraFlexibilityField) {\r\n      const localeFromExtra = extraFlexibilityField.id.replace('flexibilidad_', '');\r\n      if (locales[localeFromExtra]) {\r\n        providerLocale = localeFromExtra;\r\n      }\r\n    }\r\n\r\n    \/\/ Mapear selectField.value al espa\u00f1ol antes de formatear para el proveedor\r\n    const flexibilityForProvider = mapFlexibilityToSpanish(selectField.value, primaryLocale);\r\n\r\n    \/\/ Establecer valores para flexibilidad_provider y extraFlexibilityField\r\n    if (providerFlexibilityField) {\r\n      providerFlexibilityField.value = formatFlexibility(flexibilityForProvider, startTimeInput.value, endTimeInput.value, providerLocale);\r\n    }\r\n    if (extraFlexibilityField) {\r\n      extraFlexibilityField.value = formatFlexibility(flexibilityForProvider, startTimeInput.value, endTimeInput.value, providerLocale);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  \/\/ 9) Validar antes del env\u00edo (ACTUALIZADA: usa parseo universal)\r\n  function validateForm(event) {\r\n    const primaryLocale = getLocaleFromUrl();\r\n    const { options, requiredMessage, errorMessage } = locales[primaryLocale] || locales['es'];\r\n    if (selectField.value === options[1]) {\r\n      if (!startTimeInput.value || !endTimeInput.value) {\r\n        event.preventDefault();\r\n        event.stopImmediatePropagation();\r\n        startTimeInput.setCustomValidity(requiredMessage);\r\n        errorDisplay.innerText = requiredMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        startTimeInput.focus();\r\n        return false;\r\n      }\r\n\r\n      \/\/ NUEVO: parseo universal\r\n      const s = parseTimeUniversal(startTimeInput.value);\r\n      const e = parseTimeUniversal(endTimeInput.value);\r\n      if (!s.valid || !e.valid) {\r\n        event.preventDefault();\r\n        event.stopImmediatePropagation();\r\n        startTimeInput.setCustomValidity(requiredMessage);\r\n        errorDisplay.innerText = requiredMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        startTimeInput.focus();\r\n        return false;\r\n      }\r\n\r\n      \/\/ L\u00f3gica de madrugada conservada\r\n      let startHours = s.h24, startMinutes = s.m;\r\n      let endHours   = e.h24, endMinutes   = e.m;\r\n      if (startHours < 10) startHours += 24;\r\n      if (endHours < 10) endHours += 24;\r\n      const startTotalMinutes = startHours * 60 + startMinutes;\r\n      const endTotalMinutes = endHours * 60 + endMinutes;\r\n\r\n      if (endTotalMinutes <= startTotalMinutes) {\r\n        event.preventDefault();\r\n        event.stopImmediatePropagation();\r\n        endTimeInput.setCustomValidity(errorMessage);\r\n        errorDisplay.innerText = errorMessage;\r\n        errorDisplay.style.display = 'block';\r\n        successDisplay.style.display = 'none';\r\n        forceRedibujo(errorDisplay);\r\n        startTimeInput.focus();\r\n        return false;\r\n      }\r\n    }\r\n    startTimeInput.setCustomValidity('');\r\n    endTimeInput.setCustomValidity('');\r\n    startTimeInput.disabled = selectField.value !== options[1];\r\n    endTimeInput.disabled = selectField.value !== options[1];\r\n    errorDisplay.innerText = '';\r\n    errorDisplay.style.display = 'none';\r\n    successDisplay.style.display = 'none';\r\n    return true;\r\n  }\r\n\r\n  \/\/ 10) Listeners\r\n  if (selectField) selectField.addEventListener('change', validateFlexibility);\r\n  if (startTimeInput) startTimeInput.addEventListener('change', validateFlexibility);\r\n  if (endTimeInput) endTimeInput.addEventListener('change', validateFlexibility);\r\n  if (form) form.addEventListener('submit', validateForm);\r\n\r\n  \/\/ 11) Inicializar al cargar\r\n  validateFlexibility();\r\n});\r\n<\/script>\r\n\r\n\r\n<script defer>\r\n\/\/ Nuevo Script Lugar Universal\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ 1) Configuraci\u00f3n de locales\r\n  const locales = {\r\n    es: {\r\n      options: ['Hotel', 'Restaurante concertado', 'Pub\/Local Musical o similar concertado', 'Otro', 'Villa', 'Casa Rural'],\r\n      locations: ['Apartamento', 'Hotel', 'Villa', 'Casa Rural', 'Restaurante concertado', 'Pub\/Local Musical o similar concertado', 'Otro'],\r\n      labelPrefix: 'Indica nombre de ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Otro') return 'Indica el tipo de lugar del evento';\r\n        if (val === 'Villa' || val === 'Casa Rural') return 'Solamente indicar si tiene nombre, sino dejar vac\u00edo';\r\n        return `Escribe el nombre de tu ${val}`;\r\n      }\r\n    },\r\n    en: {\r\n      options: ['Hotel', 'Arranged Restaurant', 'Arranged Pub\/Music Venue or Similar', 'Other', 'Villa', 'Cottage \/ Farmhouse \/ Country House'],\r\n      locations: ['Apartment', 'Hotel', 'Villa', 'Cottage \/ Farmhouse \/ Country House', 'Arranged Restaurant', 'Arranged Pub\/Music Venue or Similar', 'Other'],\r\n      labelPrefix: 'Indicate name of ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Other') return 'Indicate the type of event location';\r\n        if (val === 'Villa' || val === 'Cottage \/ Farmhouse \/ Country House') return 'Only indicate if it has a name, otherwise leave empty';\r\n        return `Enter your ${val} name`;\r\n      }\r\n    },\r\n    fr: {\r\n      options: ['H\u00f4tel', 'Restaurant convenu', 'Pub\/Lieu musical ou similaire convenu', 'Autre', 'Villa', 'Maison rurale'],\r\n      locations: ['Appartement', 'H\u00f4tel', 'Villa', 'Maison rurale', 'Restaurant convenu', 'Pub\/Lieu musical ou similaire convenu', 'Autre'],\r\n      labelPrefix: 'Indiquez le nom de ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Autre') return 'Indiquez le type de lieu de l\\'\u00e9v\u00e9nement';\r\n        if (val === 'Villa' || val === 'Maison rurale') return 'Indiquez uniquement si cela a un nom, sinon laissez vide';\r\n        return `Entrez le nom de votre ${val}`;\r\n      }\r\n    },\r\n    pt: {\r\n      options: ['Hotel', 'Restaurante combinado', 'Pub\/Local musical ou semelhante combinado', 'Outro', 'Vila', 'Casa Rural'],\r\n      locations: ['Apartamento', 'Hotel', 'Vila', 'Casa Rural', 'Restaurante combinado', 'Pub\/Local musical ou semelhante combinado', 'Outro'],\r\n      labelPrefix: 'Indique o nome de ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Outro') return 'Indique o tipo do local do evento';\r\n        if (val === 'Vila' || val === 'Casa Rural') return 'Indique apenas se tiver um nome, caso contr\u00e1rio, deixe em branco';\r\n        return `Digite o nome do seu ${val}`;\r\n      }\r\n    },\r\n    de: {\r\n      options: ['Hotel', 'Abgestimmtes Restaurant', 'Abgestimmte Bar\/Musiklokal oder \u00c4hnliches', 'Andere', 'Villa', 'Landhaus'],\r\n      locations: ['Wohnung', 'Hotel', 'Villa', 'Landhaus', 'Abgestimmtes Restaurant', 'Abgestimmte Bar\/Musiklokal oder \u00c4hnliches', 'Andere'],\r\n      labelPrefix: 'Geben Sie den Namen des ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Andere') return 'Geben Sie die Art des Veranstaltungsortes an';\r\n        if (val === 'Villa' || val === 'Landhaus') return 'Nur angeben, wenn es einen Namen hat, sonst leer lassen';\r\n        return `Geben Sie den Namen Ihres ${val} ein`;\r\n      }\r\n    },\r\n    nl: {\r\n      options: ['Hotel', 'Afgesproken restaurant', 'Afgesproken Pub\/Muzieklocatie of soortgelijk', 'Anders', 'Villa', 'Plattelandshuis'],\r\n      locations: ['Appartement', 'Hotel', 'Villa', 'Plattelandshuis', 'Afgesproken restaurant', 'Afgesproken Pub\/Muzieklocatie of soortgelijk', 'Anders'],\r\n      labelPrefix: 'Geef de naam op van ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Anders') return 'Geef het type evenementlocatie aan';\r\n        if (val === 'Villa' || val === 'Plattelandshuis') return 'Alleen invullen als het een naam heeft, anders leeg laten';\r\n        return `Voer de naam van uw ${val} in`;\r\n      }\r\n    },\r\n    pl: {\r\n      options: ['Hotel', 'Uzgodniona restauracja', 'Uzgodniony pub\/lokal muzyczny lub podobny', 'Inne', 'Willa', 'Dom wiejski'],\r\n      locations: ['Mieszkanie', 'Hotel', 'Willa', 'Dom wiejski', 'Uzgodniona restauracja', 'Uzgodniony pub\/lokal muzyczny lub podobny', 'Inne'],\r\n      labelPrefix: 'Podaj nazw\u0119 ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Inne') return 'Wska\u017c typ miejsca wydarzenia';\r\n        if (val === 'Willa' || val === 'Dom wiejski') return 'Podaj tylko, je\u015bli ma nazw\u0119, w przeciwnym razie pozostaw pustym';\r\n        return `Wprowad\u017a nazw\u0119 swojego ${val}`;\r\n      }\r\n    },\r\n    ca: {\r\n      options: ['Hotel', 'Restaurant concertat', 'Pub\/Local Musical o similar concertat', 'Altres', 'Villa', 'Casa Rural'],\r\n      locations: ['Apartament', 'Hotel', 'Villa', 'Casa Rural', 'Restaurant concertat', 'Pub\/Local Musical o similar concertat', 'Altres'],\r\n      labelPrefix: 'Indica el nom de ',\r\n      inputPlaceholder: val => {\r\n        if (val === 'Altres') return 'Indica el tipus de lloc de l\\'esdeveniment';\r\n        if (val === 'Villa' || val === 'Casa Rural') return 'Nom\u00e9s indica si t\u00e9 nom, sin\u00f3 deixa en blanc';\r\n        return `Escriu el nom del teu ${val}`;\r\n      }\r\n    }\r\n  };\r\n\r\n  \/\/ 2) Config sitio (dominio + idiomas) - NUEVA L\u00d3GICA ROBUSTA\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  \/\/ 3) Detecci\u00f3n idioma (html lang -> primer segmento -> default) - NUEVA FUNCI\u00d3N\r\n  function getLocaleFromUrl() {\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    \r\n    \/\/ Prioridad: 1) HTML lang, 2) Segmento URL, 3) Default del sitio\r\n    if (site.langs.includes(htmlLang)) {\r\n      return htmlLang;\r\n    } else if (site.langs.includes(firstSeg)) {\r\n      return firstSeg;\r\n    } else {\r\n      return site.defaultLang;\r\n    }\r\n  }\r\n\r\n  \/\/ 4) Formatea lugar\r\n  function formatLocation(location, name, locale, primaryLocale) {\r\n    const isOther = locales[primaryLocale].locations.includes(location);\r\n    const sourceLocations = locales[primaryLocale].locations;\r\n    const targetLocations = locales[locale].locations;\r\n    \r\n    \/\/ Encontrar el \u00edndice del valor en las opciones del idioma del formulario\r\n    const index = sourceLocations.indexOf(location);\r\n    if (index === -1) return location; \/\/ Devolver el valor original si no se encuentra\r\n    const translatedLocation = targetLocations[index] || location;\r\n    return name && locales[primaryLocale].options.includes(location) ? `${translatedLocation}. ${name}` : translatedLocation;\r\n  }\r\n\r\n  \/\/ 5) Elementos del DOM\r\n  const selectField = document.getElementById('lugar_evento');\r\n  const container = document.getElementById('nombre_lugar_container');\r\n  const labelField = document.getElementById('nombre_lugar_label');\r\n  const textInput = document.getElementById('nombre_lugar');\r\n  const hiddenLocation = document.getElementById('lugar_evento_final');\r\n  const extraLocationField = document.querySelector('[id^=\"lugar_evento_\"]:not([id=\"lugar_evento_final\"])');\r\n  const providerLocationField = document.getElementById('lugar_evento_provider');\r\n  const form = selectField ? selectField.closest('form') : null;\r\n\r\n  \/\/ 6) Actualizar campos de lugar\r\n  function updateLocationFields() {\r\n    if (!selectField || !container || !labelField || !textInput || !hiddenLocation) {\r\n      return;\r\n    }\r\n    const primaryLocale = getLocaleFromUrl();\r\n    const { options, labelPrefix, inputPlaceholder } = locales[primaryLocale] || locales['es'];\r\n    \r\n    const val = selectField.value;\r\n    if (options.includes(val)) {\r\n      labelField.innerText = labelPrefix + val;\r\n      textInput.placeholder = inputPlaceholder(val);\r\n      container.style.display = '';\r\n      textInput.value = textInput.value || '';\r\n    } else {\r\n      container.style.display = 'none';\r\n      textInput.value = '';\r\n    }\r\n\r\n    hiddenLocation.value = formatLocation(selectField.value, textInput.value, primaryLocale, primaryLocale);\r\n\r\n    let providerLocale = primaryLocale;\r\n    if (extraLocationField) {\r\n      const localeFromExtra = extraLocationField.id.replace('lugar_evento_', '');\r\n      if (locales[localeFromExtra]) {\r\n        providerLocale = localeFromExtra;\r\n      }\r\n    }\r\n    if (providerLocationField) {\r\n      providerLocationField.value = formatLocation(selectField.value, textInput.value, providerLocale, primaryLocale);\r\n      if (extraLocationField) extraLocationField.value = providerLocationField.value;\r\n    }\r\n  }\r\n\r\n  \/\/ 7) Listeners\r\n  if (selectField) selectField.addEventListener('change', updateLocationFields);\r\n  if (textInput) textInput.addEventListener('input', updateLocationFields);\r\n  if (form) form.addEventListener('submit', updateLocationFields);\r\n\r\n  \/\/ 8) Inicializar al cargar\r\n  updateLocationFields();\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n  \/\/ Generador de booking_id \u00fanico: combina timestamp y un fragmento aleatorio\r\ndocument.addEventListener('DOMContentLoaded', function() {\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\t\r\n<script defer>\r\n\/\/ New Fecha Completa Universal Imprime en Email WebHook\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ 1) 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    'pl': { \r\n      days: ['Niedziela', 'Poniedzia\u0142ek', 'Wtorek', '\u015aroda', 'Czwartek', 'Pi\u0105tek', 'Sobota'], \r\n      months: ['Stycze\u0144', 'Luty', 'Marzec', 'Kwiecie\u0144', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpie\u0144', 'Wrzesie\u0144', 'Pa\u017adziernik', 'Listopad', 'Grudzie\u0144'], \r\n      at: 'o',\r\n      nightFromTo: (prevDay, day) => `W nocy z ${prevDay} na ${day}`,\r\n      earlyMorning: day => `We wczesnych godzinach porannych ${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  \/\/ 2) Config sitio (dominio + idiomas) - NUEVA L\u00d3GICA ROBUSTA\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  \/\/ 3) Detecci\u00f3n idioma (html lang -> primer segmento -> default) - NUEVA FUNCI\u00d3N\r\n  function getLocaleFromUrl() {\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    \r\n    \/\/ Prioridad: 1) HTML lang, 2) Segmento URL, 3) Default del sitio\r\n    if (site.langs.includes(htmlLang)) {\r\n      return htmlLang;\r\n    } else if (site.langs.includes(firstSeg)) {\r\n      return firstSeg;\r\n    } else {\r\n      return site.defaultLang;\r\n    }\r\n  }\r\n\r\n  \/\/ 4) Formatea fecha\r\n  function formatDate(dateStr, locale, timeStr = '', withTime = false) {\r\n    const { days, months, at, nightFromTo, earlyMorning } = locales[locale] || locales['es'];\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  \/\/ 5) 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 hiddenLang = document.getElementById('language');\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  \/\/ 6) 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 = getLocaleFromUrl();\r\n    if (hiddenLang) hiddenLang.value = primaryLocale;\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 (locales[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  \/\/ 7) Listeners\r\n  if (datePicker) datePicker.addEventListener('change', updateHidden);\r\n  if (timePicker) timePicker.addEventListener('change', updateHidden);\r\n\r\n  \/\/ 8) Inicializa al cargar\r\n  updateHidden();\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\t\/\/ New Script Mensaje Visualizaci\u00f3n de Fecha Universal- Muestra Fecha debajo del select date\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  \/\/ 1) 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    },\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    },\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    },\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    },\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    },\r\n    pl: {\r\n      days: ['Niedziela', 'Poniedzia\u0142ek', 'Wtorek', '\u015aroda', 'Czwartek', 'Pi\u0105tek', 'Sobota'],\r\n      months: ['Stycze\u0144', 'Luty', 'Marzec', 'Kwiecie\u0144', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpie\u0144', 'Wrzesie\u0144', 'Pa\u017adziernik', 'Listopad', 'Grudzie\u0144']\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    },\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    }\r\n  };\r\n\r\n  \/\/ 2) Config sitio (dominio + idiomas) - NUEVA L\u00d3GICA ROBUSTA\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  \/\/ 3) Detecci\u00f3n idioma (html lang -> primer segmento -> default) - NUEVA FUNCI\u00d3N\r\n  function getLocaleFromUrl() {\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    \r\n    \/\/ Prioridad: 1) HTML lang, 2) Segmento URL, 3) Default del sitio\r\n    if (site.langs.includes(htmlLang)) {\r\n      return htmlLang;\r\n    } else if (site.langs.includes(firstSeg)) {\r\n      return firstSeg;\r\n    } else {\r\n      return site.defaultLang;\r\n    }\r\n  }\r\n\r\n  const currentLocale = getLocaleFromUrl();\r\n  const { days, months } = locales[currentLocale] || locales['es'];\r\n\r\n  \/\/ 4) Formatea la fecha\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  \/\/ 5) Captura el campo de fecha\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';\r\n  fechaDisplay.style.display = 'none';\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  \/\/ 6) Forzar redibujo del mensaje\r\n  function forceRedibujo(element) {\r\n    element.style.display = 'none';\r\n    element.offsetHeight;\r\n    element.style.display = 'block';\r\n  }\r\n\r\n  \/\/ 7) 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;\r\n        fechaDisplay.style.display = 'block';\r\n        forceRedibujo(fechaDisplay);\r\n      } else {\r\n        fechaDisplay.innerText = '';\r\n        fechaDisplay.style.display = 'none';\r\n        forceRedibujo(fechaDisplay);\r\n      }\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\t  \/\/ ===== \/\/ New Script Mensaje Visualizaci\u00f3n de Exito debajo de Horario Deseado con Fecha y Hora seleccionado y Advertencias Noche del Viernes al Sabado etc =====\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: {\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      alert1: \"El inicio del show debe ser entre las 10:00h de la ma\u00f1ana y la 01:00h de la madrugada. Por favor, elige un horario v\u00e1lido.\",\r\n      alert2: \"Lo sentimos, no hay disponibilidad para el d\u00eda seleccionado. Por favor, elige otra fecha.\",\r\n      success: \"\u2713 Perfecto\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Has indicado en la noche del ${prevDay} al ${day}. En la madrugada del ${day}, ${date} ${month}, ${year}.`,\r\n      warning1: \"Lo sentimos, no hay disponibilidad. Las solicitudes de reserva deben hacerse con al menos 20 horas de antelaci\u00f3n por motivos organizativos.\",\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 envio del formulario. Gracias.\"\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      alert1: \"The show must start between 10:00 AM and 01:00 AM (midnight). Please select a valid time.\",\r\n      alert2: \"Sorry, there is no availability for the selected date. Please choose another date.\",\r\n      success: \"\u2713 Great\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `You have selected the night from ${prevDay} to ${day}. In the early morning of ${day}, ${month} ${date}, ${year}.`,\r\n      warning1: \"Sorry, there is no availability. Reservation requests must be made at least 20 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      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      alert1: \"Le spectacle doit commencer entre 10h00 et 01h00 (minuit). Veuillez s\u00e9lectionner une heure valide.\",\r\n      alert2: \"D\u00e9sol\u00e9, il n'y a pas de disponibilit\u00e9 pour la date s\u00e9lectionn\u00e9e. Veuillez choisir une autre date.\",\r\n      success: \"\u2713 Parfait\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Vous avez indiqu\u00e9 la nuit du ${prevDay} au ${day}. Au petit matin du ${day}, ${date} ${month} ${year}.`,\r\n      warning1: \"D\u00e9sol\u00e9, il n'y a pas de disponibilit\u00e9. Les demandes de r\u00e9servation doivent \u00eatre faites au moins 20 heures \u00e0 l'avance pour des raisons d'organisation.\",\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      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      alert1: \"L'espectacle ha de comen\u00e7ar entre les 10:00 i la 01:00 de la matinada. Si us plau, selecciona un horari v\u00e0lid.\",\r\n      alert2: \"Ho sentim, no hi ha disponibilitat per a la data seleccionada. Si us plau, tria una altra data.\",\r\n      success: \"\u2713 Perfecte\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Has indicat la nit del ${prevDay} al ${day}. A la matinada del ${day}, ${date} ${month}, ${year}.`,\r\n      warning1: \"Ho sentim, no hi ha disponibilitat. Les sol\u00b7licituds de reserva s'han de fer amb almenys 20 hores d'antelaci\u00f3 per motius organitzatius.\",\r\n      warning2: \"Amb menys de 5 dies per a l'esdeveniment, hauries d'iniciar el proc\u00e9s de reserva avui o tan aviat com sigui possible si el grup est\u00e0 interessat. No podem garantir disponibilitat. Revisa la safata d'entrada (i la de correu no desitjat per si de cas) despr\u00e9s d'enviar el formulari. Gr\u00e0cies.\"\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      alert1: \"O espet\u00e1culo deve come\u00e7ar entre as 10:00 e 01:00 da madrugada. Por favor, selecione um hor\u00e1rio v\u00e1lido.\",\r\n      alert2: \"Desculpe-nos, n\u00e3o h\u00e1 disponibilidade para a data selecionada. Por favor, escolha outra data.\",\r\n      success: \"\u2713 Perfeito\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Voc\u00ea indicou a noite de ${prevDay} para ${day}. Na madrugada de ${day}, ${date} ${month}, ${year}.`,\r\n      warning1: \"Desculpe-nos, n\u00e3o h\u00e1 disponibilidade. Os pedidos de reserva devem ser feitos com pelo menos 20 horas de anteced\u00eancia por raz\u00f5es organizacionais.\",\r\n      warning2: \"Com menos de 5 dias para 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 a pasta de spam, por precau\u00e7\u00e3o) ap\u00f3s o envio do formul\u00e1rio. Obrigado.\"\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      alert1: \"De show moet beginnen tussen 10:00 en 01:00 (middernacht). Selecteer een geldige tijd.\",\r\n      alert2: \"Sorry, er is geen beschikbaarheid voor de geselecteerde datum. Kies een andere datum.\",\r\n      success: \"\u2713 Geweldig\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Je hebt de nacht van ${prevDay} naar ${day} aangegeven. In de vroege ochtend van ${day}, ${date} ${month} ${year}.`,\r\n      warning1: \"Sorry, er is geen beschikbaarheid. Reserveringsverzoeken moeten minstens 20 uur van tevoren worden ingediend om organisatorische redenen.\",\r\n      warning2: \"Met minder dan 5 dagen tot het evenement, moet je vandaag of zo snel mogelijk het reserveringsproces starten als de groep ge\u00efnteresseerd is. We kunnen geen beschikbaarheid garanderen. Controleer je inbox (en spamfolder voor de zekerheid) na het verzenden van het formulier. Bedankt.\"\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      alert1: \"Die Show muss zwischen 10:00 Uhr und 01:00 Uhr (Mitternacht) beginnen. Bitte w\u00e4hlen Sie eine g\u00fcltige Zeit.\",\r\n      alert2: \"Es tut uns leid, f\u00fcr das ausgew\u00e4hlte Datum gibt es keine Verf\u00fcgbarkeit. Bitte w\u00e4hlen Sie ein anderes Datum.\",\r\n      success: \"\u2713 Perfekt\",\r\n      earlyMorningMessage: (prevDay, day, date, month, year) => `Sie haben die Nacht von ${prevDay} auf ${day} angegeben. In den fr\u00fchen Morgenstunden des ${day}, ${date}. ${month} ${year}.`,\r\n      warning1: \"Es tut uns leid, es gibt keine Verf\u00fcgbarkeit. Reservierungsanfragen m\u00fcssen mindestens 20 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  \/\/ Seleccionar mensajes seg\u00fan el idioma actual\r\n  const messages = locales[currentLang] || locales[site.defaultLang];\r\n\r\n  \/\/ Formatea fecha para el mensaje adicional\r\n  function formatEarlyMorningMessage(dateStr, locale) {\r\n    const { days, months, earlyMorningMessage } = 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    \/\/ 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    \r\n    return earlyMorningMessage(prevDayName, dayName, day, month, year);\r\n  }\r\n\r\n  \/\/ Captura elementos\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  \/\/ Crear los mensajes de error y \u00e9xito din\u00e1micos\r\n  const horaErrorMessage = document.createElement('div');\r\n  horaErrorMessage.id = 'hora-mensaje';\r\n  horaErrorMessage.style.display = 'none';\r\n  horaErrorMessage.style.marginTop = '5px';\r\n\r\n  const horaSuccessMessage = document.createElement('div');\r\n  horaSuccessMessage.id = 'hora-success-mensaje';\r\n  horaSuccessMessage.style.display = 'none';\r\n  horaSuccessMessage.style.marginTop = '5px';\r\n\r\n  const warningMessage1 = document.createElement('div');\r\n  warningMessage1.id = 'warning-message1';\r\n  warningMessage1.style.display = 'none';\r\n  warningMessage1.style.marginTop = '5px';\r\n\r\n  const warningMessage2 = document.createElement('div');\r\n  warningMessage2.id = 'warning-message2';\r\n  warningMessage2.style.display = 'none';\r\n  warningMessage2.style.marginTop = '5px';\r\n\r\n  \/\/ A\u00f1adir los mensajes despu\u00e9s del campo de hora\r\n  if (horaInput) {\r\n    horaInput.parentNode.insertBefore(horaErrorMessage, horaInput.nextSibling);\r\n    horaInput.parentNode.insertBefore(horaSuccessMessage, horaErrorMessage.nextSibling);\r\n    horaInput.parentNode.insertBefore(warningMessage1, horaSuccessMessage.nextSibling);\r\n    horaInput.parentNode.insertBefore(warningMessage2, warningMessage1.nextSibling);\r\n  }\r\n\r\n  \/\/ Funci\u00f3n para mostrar mensaje de error, \u00e9xito o advertencia\r\n  function displayMessage(message, className, element) {\r\n    element.innerText = message;\r\n    element.className = className;\r\n    element.style.display = 'block';\r\n    forceRedibujo(element); \/\/ Forzar redibujo para visibilidad correcta\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  \/\/ Funci\u00f3n de validaci\u00f3n\r\n  function validateTime() {\r\n    const fechaSeleccionada = new Date(fechaInput.value);\r\n    const horaSeleccionada = horaInput.value.split(\":\");\r\n\r\n    \/\/ Verificar que ambos campos (hora y fecha) est\u00e9n seleccionados\r\n    if (!horaInput.value || !fechaInput.value) {\r\n      displayMessage(messages.alert1, 'error-message', horaErrorMessage);\r\n      horaSuccessMessage.style.display = 'none'; \/\/ Ocultar el mensaje de \u00e9xito\r\n      return false; \/\/ Prevenir el env\u00edo si falta la hora o la fecha\r\n    }\r\n\r\n    \/\/ Ajustar la fecha seleccionada para incluir la hora\r\n    fechaSeleccionada.setHours(horaSeleccionada[0], horaSeleccionada[1], 0, 0);\r\n\r\n    \/\/ Validar horarios permitidos (dos rangos)\r\n    const horariosPermitidos = [\r\n      { inicio: [10, 00], fin: [24, 00] }, \/\/ Primer rango (10:00 AM - 12:00 AM)\r\n      { inicio: [0, 00], fin: [1, 00] }   \/\/ Segundo rango (12:00 AM - 1:00 AM)\r\n    ];\r\n\r\n    const selectedHour = fechaSeleccionada.getHours();\r\n    const selectedMinute = fechaSeleccionada.getMinutes();\r\n    let horarioValido = false;\r\n    let isEarlyMorning = false;\r\n\r\n    for (const rango of horariosPermitidos) {\r\n      const [startHour, startMinute] = rango.inicio;\r\n      const [endHour, endMinute] = rango.fin;\r\n\r\n      const isInThisRange =\r\n        (selectedHour > startHour || (selectedHour === startHour && selectedMinute >= startMinute)) &&\r\n        (selectedHour < endHour || (selectedHour === endHour && selectedMinute <= endMinute));\r\n\r\n      if (isInThisRange) {\r\n        horarioValido = true;\r\n        if (rango.inicio[0] === 0 && rango.fin[0] === 1) {\r\n          isEarlyMorning = true; \/\/ Detectar si est\u00e1 en el rango 00:00\u201301:00\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    \/\/ Si el horario no es v\u00e1lido, mostrar el mensaje de error\r\n    if (!horarioValido) {\r\n      displayMessage(messages.alert1, 'error-message', horaErrorMessage);\r\n      horaSuccessMessage.style.display = 'none'; \/\/ Ocultar el mensaje de \u00e9xito\r\n      return false; \/\/ Evitar env\u00edo si el horario no es v\u00e1lido\r\n    } else {\r\n      \/\/ Mostrar mensaje de \u00e9xito, con mensaje adicional si es 00:00\u201301:00\r\n      const successMessage = isEarlyMorning\r\n        ? `${messages.success}\\n${formatEarlyMorningMessage(fechaInput.value, currentLang)}`\r\n        : messages.success;\r\n      displayMessage(successMessage, 'success-message', horaSuccessMessage);\r\n      horaErrorMessage.style.display = 'none'; \/\/ Ocultar el mensaje de error\r\n    }\r\n\r\n    \/\/ Validar d\u00edas cerrados del restaurante\r\n    const restaurantClosedDays = []; \/\/ Ejemplo: 0 = Domingo 1 = Lunes...\r\n    const dayOfWeek = fechaSeleccionada.getDay();\r\n    if (restaurantClosedDays.includes(dayOfWeek)) {\r\n      displayMessage(messages.alert2, 'error-message', horaErrorMessage);\r\n      horaSuccessMessage.style.display = 'none'; \/\/ Ocultar el mensaje de \u00e9xito\r\n      return false; \/\/ Evitar env\u00edo si el restaurante est\u00e1 cerrado\r\n    }\r\n\r\n    \/\/ Validaci\u00f3n de advertencia: 20 horas de antelaci\u00f3n\r\n    const ahora = new Date();\r\n    const limiteFecha = new Date(ahora.getTime() + 20 * 60 * 60 * 1000); \/\/ 20 horas\r\n    if (fechaSeleccionada < limiteFecha) {\r\n      displayMessage(messages.warning1, 'error-message', warningMessage1);\r\n      warningMessage2.style.display = 'none'; \/\/ Ocultar la advertencia del evento ma\u00f1ana\r\n      horaSuccessMessage.style.display = 'none'; \/\/ Ocultar mensaje de \u00e9xito\r\n      return false; \/\/ Detener env\u00edo del formulario si el mensaje warning1 es visible\r\n    } else {\r\n      warningMessage1.style.display = 'none'; \/\/ Ocultar la advertencia de las 20 horas\r\n    }\r\n\r\n    \/\/ Validaci\u00f3n: De 20h a quedar menos de 5 d\u00edas (20-140 hours)\r\n    const limiteFechaAdicional = new Date(ahora.getTime() + 140 * 60 * 60 * 1000); \/\/ 5 d\u00edas aprox\r\n    if (fechaSeleccionada >= limiteFecha && fechaSeleccionada < limiteFechaAdicional) {\r\n      displayMessage(messages.warning2, 'error-message', warningMessage2);\r\n    } else {\r\n      warningMessage2.style.display = 'none'; \/\/ Ocultar advertencia si no es el caso\r\n    }\r\n\r\n    return true; \/\/ Permitir env\u00edo si todas las validaciones pasan\r\n  }\r\n\r\n  \/\/ A\u00f1adir eventos de validaci\u00f3n en tiempo real\r\n  if (horaInput && fechaInput) {\r\n    horaInput.addEventListener(\"input\", validateTime); \/\/ Validar cuando se cambia la hora\r\n    fechaInput.addEventListener(\"input\", validateTime); \/\/ Validar cuando se cambia la fecha\r\n  }\r\n\r\n  if (form) {\r\n    form.addEventListener(\"submit\", function (event) {\r\n      \/\/ Si el mensaje de advertencia (warning1) o error est\u00e1 visible, prevenimos el env\u00edo\r\n      if (warningMessage1.style.display === 'block' || horaErrorMessage.style.display === 'block') {\r\n        event.preventDefault(); \/\/ Prevenir el env\u00edo del formulario\r\n        event.stopImmediatePropagation(); \/\/ Detener otros eventos de env\u00edo\r\n        horaInput.focus(); \/\/ Enfocar el campo de hora\r\n        return false; \/\/ Detener el flujo\r\n      }\r\n    });\r\n  }\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ ===== PRECIO DIVIDIDO ESPECTACULO POR PERSONA 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  \/\/ Idioma actual como antes...\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  \/\/ Mensajes multiling\u00fces como antes...\r\n  const messages = {\r\n    es: { pricePerPerson: 'Precio por persona para tu grupo redondeado (invitando a la persona homenajeada): ', perPerson: '' },\r\n    en: { pricePerPerson: 'Price per person for your group rounded (treating the guest of honor): ', perPerson: '' },\r\n    fr: { pricePerPerson: 'Prix par personne pour votre groupe arrondi (en invitant la personne honor\u00e9e): ', perPerson: '' },\r\n    ca: { pricePerPerson: 'Preu per persona pel teu grup arrodonit (convidant la persona homenatjada): ', perPerson: '' },\r\n    pt: { pricePerPerson: 'Pre\u00e7o por pessoa para o seu grupo arredondado (convidando a pessoa homenageada): ', perPerson: '' },\r\n    nl: { pricePerPerson: 'Prijs per persoon voor uw groep afgerond (de gast van eer trakteren): ', perPerson: '' },\r\n    de: { pricePerPerson: 'Preis pro Person f\u00fcr Ihre Gruppe gerundet (Ehrengast wird eingeladen): ', perPerson: '' }\r\n  };\r\n  const langMessages = messages[currentLang] || messages[site.defaultLang];\r\n\r\n  \/\/ Mapa de s\u00edmbolos y formato por currency code\r\n  const currencyMap = {\r\n    eur: { symbol: '\u20ac', format: 'comma', suffix: '\/pers.', name: 'Euro' },\r\n    gbp: { symbol: '\u00a3', format: 'point', suffix: '\/person', name: 'GBP' },\r\n    chf: { symbol: 'CHF', format: 'point', suffix: '\/person', name: 'Franc' },\r\n    dkk: { symbol: 'DKK', format: 'comma', suffix: '\/person', name: 'DKK' },\r\n    sek: { symbol: 'SEK', format: 'comma', suffix: '\/person', name: 'SEK' },\r\n    nok: { symbol: 'NOK', format: 'comma', suffix: '\/person', name: 'NOK' },\r\n    czk: { symbol: 'K\u010d', format: 'comma', suffix: '\/person', name: 'CZK' },\r\n    pln: { symbol: 'z\u0142', format: 'comma', suffix: '\/person', name: 'PLN' },\r\n    huf: { symbol: 'Ft', format: 'comma', suffix: '\/person', name: 'HUF' },\r\n    ron: { symbol: 'lei', format: 'comma', suffix: '\/person', name: 'RON' },\r\n    bgn: { symbol: '\u043b\u0432', format: 'comma', suffix: '\/person', name: 'BGN' },\r\n    try: { symbol: '\u20ba', format: 'comma', suffix: '\/person', name: 'TRY' },\r\n    usd: { symbol: '$', format: 'point', suffix: '\/person', name: 'USD' },\r\n    cad: { symbol: '$', format: 'point', suffix: '\/person', name: 'CAD' },\r\n    aud: { symbol: '$', format: 'point', suffix: '\/person', name: 'AUD' },\r\n  };\r\n\r\n  \/\/ Elementos del DOM\r\n  const precioRedondeadoField = document.getElementById('precio_redondeado');\r\n  const numeroPersonasSelect = document.getElementById('numero_personas');\r\n  const precioPorPersonaField = document.getElementById('precio_por_pers_show');\r\n  const mensajeCompleto = document.getElementById('mensaje_precio_persona');\r\n  const currencyField = document.getElementById('currency'); \/\/\r\n\r\n  function calcularPrecioPorPersona() {\r\n    if (!precioRedondeadoField || !numeroPersonasSelect || !currencyField) { return; }\r\n\r\n    const precioTotal = parseFloat(precioRedondeadoField.value);\r\n    const numeroPersonasText = numeroPersonasSelect.value;\r\n    const currencyCode = (currencyField.value || 'eur').toLowerCase();\r\n    const currency = currencyMap[currencyCode] || currencyMap['eur']; \/\/ Default EUR\r\n\r\n    \/\/ No calcular si no hay datos v\u00e1lidos\r\n    if (!precioTotal || precioTotal <= 0 || !numeroPersonasText) {\r\n      if (precioPorPersonaField) precioPorPersonaField.value = '';\r\n      if (mensajeCompleto) mensajeCompleto.value = '';\r\n      return;\r\n    }\r\n\r\n    if (numeroPersonasText.toLowerCase().includes('more') || \r\n        numeroPersonasText.toLowerCase().includes('m\u00e1s') ||\r\n        numeroPersonasText.toLowerCase().includes('plus')) {\r\n      if (precioPorPersonaField) precioPorPersonaField.value = '';\r\n      if (mensajeCompleto) mensajeCompleto.value = '';\r\n      return;\r\n    }\r\n\r\n    const numeroPersonas = parseInt(numeroPersonasText);\r\n    if (isNaN(numeroPersonas) || numeroPersonas <= 1) {\r\n      if (precioPorPersonaField) precioPorPersonaField.value = '';\r\n      if (mensajeCompleto) mensajeCompleto.value = '';\r\n      return;\r\n    }\r\n\r\n    \/\/ C\u00e1lculo y redondeo\r\n    const personasQuePagan = numeroPersonas - 1;\r\n    const precioPorPersona = precioTotal \/ personasQuePagan;\r\n    const precioRedondeado = Math.ceil(precioPorPersona * 2) \/ 2; \/\/ m\u00faltiplo de 0.50\r\n\r\n    \/\/ Formato por moneda\r\n    let precioFormateado = precioRedondeado.toFixed(2);\r\n    if (currency.format === 'comma') precioFormateado = precioFormateado.replace('.', ',');\r\n    \/\/ EUR: 18,50 | USD\/GBP: 18.50\r\n    let symbolPos = (currency.symbol === '$' || currency.symbol === '\u00a3') ? 'prefix' : 'suffix';\r\n    let priceText = symbolPos === 'prefix' ? (currency.symbol + precioFormateado) : (precioFormateado + currency.symbol);\r\n\r\n    \/\/ Guardamos valor puro\r\n    if (precioPorPersonaField) precioPorPersonaField.value = precioFormateado;\r\n\r\n    \/\/ Mensaje multiling\u00fce + currency\r\n    if (mensajeCompleto) {\r\n      mensajeCompleto.value = langMessages.pricePerPerson + priceText + currency.suffix;\r\n    }\r\n  }\r\n\r\n  if (numeroPersonasSelect) {\r\n    numeroPersonasSelect.addEventListener('change', calcularPrecioPorPersona);\r\n  }\r\n\r\n  \/\/ Escuchar cambios de precio, moneda\r\n  if (precioRedondeadoField) {\r\n    const observer = new MutationObserver(function() { calcularPrecioPorPersona(); });\r\n    observer.observe(precioRedondeadoField, { attributes: true, attributeFilter: ['value'] });\r\n    const originalValueSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set;\r\n    Object.defineProperty(precioRedondeadoField, 'value', {\r\n      set: function(val) { originalValueSetter.call(this, val); calcularPrecioPorPersona(); },\r\n      get: function() { return this.getAttribute('value'); }\r\n    });\r\n  }\r\n  if (currencyField) {\r\n    currencyField.addEventListener('change', calcularPrecioPorPersona);\r\n  }\r\n  calcularPrecioPorPersona();\r\n});\r\n<\/script>\r\n\r\n<script defer>\r\n\/** \/** Script Artist Universal\r\nShow \u2014 P\u00e1gina NEUTRAL (sin selector, artistas predefinidos por URL)\r\n * - N artistas: artist1_id, artist2_id, ... y\/o CSV neutral: artist_ids\r\n * - Genera [photos_block_html] y [request_block_html]\r\n * - Multi-sitio\/idioma (es,en,fr,ca,pt,nl,de) con URLs p\u00fablicas correctas por dominio\/lang\r\n * - Si no hay artistas -> bloquea env\u00edo y muestra un aviso (fallback)\r\n * - Retro: rellena artist_id \/ artist_id_2 \/ url_espectaculo \/ _2 \/ request_* \/ _2 (primeras 2 opciones)\r\n *\/\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n  \/\/ ===== Localiza el formulario =====\r\n  const form = document.getElementById('photos_block_html')?.closest('form')\r\n           || document.querySelector('.wpcf7 form')\r\n           || document.querySelector('form');\r\n  if (!form) { console.error('[DS-neutral] No se encontr\u00f3 <form>.'); return; }\r\n\r\n  \/\/ ===== Entradas cat\u00e1logo =====\r\n  \/\/ Numerados neutral: artist1_id, artist2_id, ...\r\n  const numberedEls = Array.from(form.querySelectorAll('input[id$=\"_id\"]'))\r\n    .filter(el => \/^artist\\d+_id$\/.test(el.id));\r\n\r\n  \/\/ CSV neutrales y compat (acepta tambi\u00e9n antiguos por si los usas)\r\n  const csvNeutralEl = form.querySelector('#artist_ids');         \/\/ recomendado\r\n  const csvMaleEl    = form.querySelector('#artist_ids_male');    \/\/ compat\r\n  const csvFemaleEl  = form.querySelector('#artist_ids_female');  \/\/ compat\r\n\r\n  \/\/ Fallback singles (compat)\r\n  const fallbackNeutral = form.querySelector('#artist_id');       \/\/ compat\r\n  const fallbackMale    = form.querySelector('#artist_id_male');  \/\/ compat\r\n  const fallbackFemale  = form.querySelector('#artist_id_female');\/\/ compat\r\n\r\n  \/\/ ===== Salidas (bloques email) =====\r\n  const photosBlock  = form.querySelector('#photos_block_html');\r\n  const requestBlock = form.querySelector('#request_block_html');\r\n  if (!photosBlock || !requestBlock) {\r\n    console.error('[DS-neutral] Faltan #photos_block_html o #request_block_html.');\r\n    return;\r\n  }\r\n\r\n  \/\/ ===== Compatibilidad (opcional)\r\n  const artistIdEl   = form.querySelector('#artist_id');\r\n  const artistIdEl2  = form.querySelector('#artist_id_2');\r\n  const idsListEl    = form.querySelector('#artist_ids_selected');\r\n  const urlField     = form.querySelector('#url_espectaculo');\r\n  const urlField2    = form.querySelector('#url_espectaculo_2');\r\n  const reqDinner    = form.querySelector('#request_artist_dinner');\r\n  const reqDinner2   = form.querySelector('#request_artist_dinner_2');\r\n\r\n  \/\/ ===== Soporte\r\n  const bookingEl  = form.querySelector('#booking_id');\r\n  const langHidden = form.querySelector('#language');\r\n  const pageUrlEl  = form.querySelector('#page_url');\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 (fallback neutral) =====\r\nconst messagesByLang = {\r\n  es: { \r\n    noAvailability: 'Lo sentimos mucho. El sistema ha indicado que actualmente no hay ning\u00fan artista disponible para espect\u00e1culos en la ciudad que has indicado. Si lo deseas, puedes buscar en otra plataforma o web. Disculpa las molestias y gracias por tu inter\u00e9s.'\r\n  },\r\n  en: { \r\n    noAvailability: \"We're very sorry. The system has indicated that there are currently no artists available for shows in the city you entered. If you wish, you can try searching on another platform or website. Sorry for the inconvenience and thank you for your interest.\"\r\n  },\r\n  fr: { \r\n    noAvailability: \"Nous sommes vraiment d\u00e9sol\u00e9s. Le syst\u00e8me a indiqu\u00e9 qu'il n'y a actuellement aucun artiste disponible pour des spectacles dans la ville que vous avez indiqu\u00e9e. Si vous le souhaitez, vous pouvez chercher sur une autre plateforme ou un autre site. D\u00e9sol\u00e9 pour le d\u00e9sagr\u00e9ment et merci pour votre int\u00e9r\u00eat.\"\r\n  },\r\n  ca: { \r\n    noAvailability: \"Ho sentim molt. El sistema ha indicat que actualment no hi ha cap artista disponible per a espectacles a la ciutat que has indicat. Si ho desitges, pots buscar en una altra plataforma o web. Disculpa les mol\u00e8sties i gr\u00e0cies per l'inter\u00e8s.\"\r\n  },\r\n  pt: { \r\n    noAvailability: \"Lamentamos muito. O sistema indicou que atualmente n\u00e3o h\u00e1 nenhum artista dispon\u00edvel para espet\u00e1culos na cidade que indicou. Se desejar, pode procurar noutra plataforma ou site. Pedimos desculpa pelo inc\u00f3modo e obrigado pelo seu interesse.\"\r\n  },\r\n  nl: { \r\n    noAvailability: \"Het spijt ons erg. Het systeem heeft aangegeven dat er momenteel geen artiesten beschikbaar zijn voor optredens in de stad die je hebt opgegeven. Je kunt eventueel op een ander platform of website zoeken. Onze excuses voor het ongemak en bedankt voor je interesse.\"\r\n  },\r\n  de: { \r\n    noAvailability: \"Es tut uns sehr leid. Das System hat best\u00e4tigt, dass derzeit keine K\u00fcnstler f\u00fcr Auftritte in der von Ihnen angegebenen Stadt verf\u00fcgbar sind. Sie k\u00f6nnen es gerne auf einer anderen Plattform oder Website versuchen. Entschuldigen Sie die Unannehmlichkeiten und vielen Dank f\u00fcr Ihr Interesse.\"\r\n  }\r\n};\r\n\t\r\n  const M = messagesByLang[currentLang] || messagesByLang[site.defaultLang];\r\n\r\n  \/\/ ===== Textos botones (i18n neutros) =====\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\u2019option' },\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\u2019s 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  \/\/ ===== Intro bloque fotos (NEUTRAL artista\/s) =====\r\n  const photosIntroNeutral = {\r\n    es: { 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    en: { one:'Photos of the performer likely available for that date. Click the button to view photos:',\r\n          many:'Photos of the performers likely available for that date. Click the buttons to view photos of the options:' },\r\n    fr: { one:'Photos de l\u2019artiste probablement disponible \u00e0 cette date. Cliquez sur le bouton pour voir les photos :',\r\n          many:'Photos des artistes probablement disponibles \u00e0 cette date. Cliquez sur les boutons pour voir les photos des options :' },\r\n    ca: { one:'Fotos de l\u2019artista probablement disponible per a aquesta data. Feu clic al bot\u00f3 per veure les fotos:',\r\n          many:'Fotos dels artistes probablement disponibles per a aquesta data. Feu clic als botons per veure les fotos de les opcions:' },\r\n    pt: { one:'Fotos do artista provavelmente dispon\u00edvel para essa data. Clique no bot\u00e3o para ver fotos:',\r\n          many:'Fotos dos artistas provavelmente dispon\u00edveis para essa data. Clique nos bot\u00f5es para ver fotos das op\u00e7\u00f5es:' },\r\n    nl: { one:'Foto\u2019s van de artiest die waarschijnlijk beschikbaar is op die datum. Klik op de knop om foto\u2019s te bekijken:',\r\n          many:'Foto\u2019s van de artiesten die waarschijnlijk beschikbaar zijn op die datum. Klik op de knoppen om foto\u2019s van de opties te bekijken:' },\r\n    de: { one:'Fotos des K\u00fcnstlers\/der K\u00fcnstlerin, der\/die voraussichtlich an diesem Datum verf\u00fcgbar ist. Klicke auf die Schaltfl\u00e4che, um Fotos anzusehen:',\r\n          many:'Fotos der K\u00fcnstlerinnen\/K\u00fcnstler, die voraussichtlich an diesem Datum verf\u00fcgbar sind. Klicke auf die Schaltfl\u00e4chen, um Fotos der Optionen anzusehen:' }\r\n  };\r\n  function getIntro(count){\r\n    const pack = photosIntroNeutral[currentLang] || photosIntroNeutral[site.defaultLang] || photosIntroNeutral.es;\r\n    return pack[count === 1 ? 'one' : 'many'];\r\n  }\r\n\r\n  \/\/ ===== Mensaje de error debajo del submit (solo si no hay artistas) =====\r\n  const errorMessage = document.createElement('div');\r\n  errorMessage.id = 'ds-neutral-error';\r\n  errorMessage.style.display = 'none';\r\n  errorMessage.style.margin = '0 0 8px 0';\r\n  errorMessage.setAttribute('role', 'alert');\r\n  errorMessage.setAttribute('aria-live', 'polite');\r\nconst submitBtn = form.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\r\nif (submitBtn && submitBtn.parentNode) {\r\n  submitBtn.parentNode.insertBefore(errorMessage, submitBtn.nextSibling);\r\n} else {\r\n  form.appendChild(errorMessage); \/\/ Si no encuentra el bot\u00f3n, al final\r\n}\r\n\r\n  function showError(msg){ errorMessage.textContent = msg; errorMessage.className='error-message'; errorMessage.style.display='block'; }\r\n  function hideError(){ errorMessage.style.display='none'; }\r\n\r\n  \/\/ ===== Webhook base (Make) NUEVO =====\r\n  const MAKE_BASE = 'https:\/\/hook.eu2.make.com\/3y8rgwa42rz23wf918ctejnypnoqx6c2';\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  \/\/ ===== Recolecci\u00f3n de IDs (N) =====\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 collectIds(){\r\n    const list = [];\r\n    \/\/ 1) artistN_id (en orden DOM)\r\n    numberedEls.forEach(el => { const v=(el.value||'').trim(); if(v && !list.includes(v)) list.push(v); });\r\n    \/\/ 2) CSV neutral y compat\r\n    [csvNeutralEl, csvMaleEl, csvFemaleEl].forEach(el => {\r\n      splitCsv(el).forEach(v => { if(!list.includes(v)) list.push(v); });\r\n    });\r\n    \/\/ 3) fallbacks singles (compat)\r\n    [fallbackNeutral, fallbackMale, fallbackFemale].forEach(el => {\r\n      const s = (el && el.value || '').trim();\r\n      if (s && !list.includes(s)) list.push(s);\r\n    });\r\n    return list;\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  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){\r\n    if (!urls.length) return '';\r\n    const intro = `<p style=\"margin: 16px 0 8px;\"><u>${esc(getIntro(urls.length))}<\/u><\/p>`;\r\n    return (intro + '\\n' + buildPhotosButtons(urls)).trim();\r\n  }\r\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  \/\/ ===== Core =====\r\n  function actualizar(){\r\n    hideError();\r\n\r\n    const ids = collectIds(); \/\/ N >= 0\r\n    if (!ids.length){\r\n      \/\/ Sin artistas -> limpiar (y mostrar aviso solo al enviar)\r\n      photosBlock.value  = '';\r\n      requestBlock.value = '';\r\n      if (artistIdEl)  artistIdEl.value  = '';\r\n      if (artistIdEl2) artistIdEl2.value = '';\r\n      if (idsListEl)   idsListEl.value   = '';\r\n      if (urlField)    urlField.value    = '';\r\n      if (urlField2)   urlField2.value   = '';\r\n      if (reqDinner)   reqDinner.value   = '';\r\n      if (reqDinner2)  reqDinner2.value  = '';\r\n      return false;\r\n    }\r\n\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    \/\/ (opcional) a\u00f1ade contexto al webhook:\r\n    \/\/ hooks = hooks.map(h => h + `&lang=${encodeURIComponent(currentLang)}&domain=${encodeURIComponent(host)}`);\r\n\r\n    \/\/ Bloques email\r\n    photosBlock.value  = buildPhotosBlock(urls);\r\n    requestBlock.value = buildRequestBlock(hooks);\r\n\r\n    \/\/ Compat (primeras 2)\r\n    if (artistIdEl)  artistIdEl.value  = ids[0] || '';\r\n    if (artistIdEl2) artistIdEl2.value = ids[1] || '';\r\n    if (idsListEl)   idsListEl.value   = ids.join(',');\r\n    if (urlField)    urlField.value    = urls[0] || '';\r\n    if (urlField2)   urlField2.value   = urls[1] || '';\r\n    if (reqDinner)   reqDinner.value   = hooks[0] || '';\r\n    if (reqDinner2)  reqDinner2.value  = hooks[1] || '';\r\n\r\n    return true;\r\n  }\r\n\r\n  \/\/ Inicializa\r\n  actualizar();\r\n\r\n  \/\/ Si booking_id se rellena despu\u00e9s, re-generar\r\n  if (bookingEl) bookingEl.addEventListener('input', actualizar);\r\n\r\n  \/\/ Validaci\u00f3n al enviar (aviso solo si realmente no hay artistas)\r\n  form.addEventListener('submit', function(e){\r\n    const ok = actualizar();\r\n    if (!ok){\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      showError(M.noAvailability);\r\n    }\r\n  });\r\n});\r\n<\/script>\r\n\r\n<!-- Matrix Os 2 | Spain Andorra Universal -->\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Boysshow \/ mannelijke stripper | Mallorca Top entertainment voor vrijgezellenfeesten, verjaardagen en events op het eiland Mallorca Vragen? \u2192 Bekijk de volledige FAQ, geschatte prijs en alle details voor het boeken van een mannelijke stripshow in Spanje. Boysshow op Mallorca Boek je show in Palma, Marratx\u00ed, Inca, Manacor, Llucmajor enzovoort en krijg direct informatie over [&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-12571","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>Mannelijke Stripper\ufeff | Majorca - Strippers Deluxe Global<\/title>\n<meta name=\"description\" content=\"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.\" \/>\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\/nl\/mannelijke-stripper-majorca\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mannelijke Stripper\ufeff | Majorca\" \/>\n<meta property=\"og:description\" content=\"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/\" \/>\n<meta property=\"og:site_name\" content=\"Strippers Deluxe Global\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-03T18:24:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/\",\"name\":\"Mannelijke Stripper\ufeff | Majorca - Strippers Deluxe Global\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/15-1.jpg\",\"datePublished\":\"2025-11-14T09:46:06+00:00\",\"dateModified\":\"2025-12-03T18:24:28+00:00\",\"description\":\"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/#breadcrumb\"},\"inLanguage\":\"nl\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/#primaryimage\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/15-1.jpg\",\"contentUrl\":\"https:\\\/\\\/strippersdeluxe.com\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/15-1.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/mannelijke-stripper-majorca\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mannelijke Stripper\ufeff | Majorca\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/#website\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/\",\"name\":\"Strippers Deluxe Global\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/#organization\",\"name\":\"Strippers Deluxe Global\",\"url\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl\",\"@id\":\"https:\\\/\\\/strippersdeluxe.com\\\/nl\\\/#\\\/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\\\/nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mannelijke Stripper\ufeff | Majorca - Strippers Deluxe Global","description":"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.","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\/nl\/mannelijke-stripper-majorca\/","og_locale":"nl_NL","og_type":"article","og_title":"Mannelijke Stripper\ufeff | Majorca","og_description":"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.","og_url":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/","og_site_name":"Strippers Deluxe Global","article_modified_time":"2025-12-03T18:24:28+00:00","og_image":[{"url":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/","url":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/","name":"Mannelijke Stripper\ufeff | Majorca - Strippers Deluxe Global","isPartOf":{"@id":"https:\/\/strippersdeluxe.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/#primaryimage"},"image":{"@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/#primaryimage"},"thumbnailUrl":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg","datePublished":"2025-11-14T09:46:06+00:00","dateModified":"2025-12-03T18:24:28+00:00","description":"Boek een boysshow op Mallorca voor het vrijgezellenfeest van je vriendin, verjaardag of evenement. Professionele shows in Spanje.","breadcrumb":{"@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/#breadcrumb"},"inLanguage":"nl","potentialAction":[{"@type":"ReadAction","target":["https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/"]}]},{"@type":"ImageObject","inLanguage":"nl","@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/#primaryimage","url":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg","contentUrl":"https:\/\/strippersdeluxe.com\/wp-content\/uploads\/2024\/07\/15-1.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/strippersdeluxe.com\/nl\/mannelijke-stripper-majorca\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/strippersdeluxe.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Mannelijke Stripper\ufeff | Majorca"}]},{"@type":"WebSite","@id":"https:\/\/strippersdeluxe.com\/nl\/#website","url":"https:\/\/strippersdeluxe.com\/nl\/","name":"Strippers Deluxe Global","description":"","publisher":{"@id":"https:\/\/strippersdeluxe.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/strippersdeluxe.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl"},{"@type":"Organization","@id":"https:\/\/strippersdeluxe.com\/nl\/#organization","name":"Strippers Deluxe Global","url":"https:\/\/strippersdeluxe.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl","@id":"https:\/\/strippersdeluxe.com\/nl\/#\/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\/nl\/#\/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\/nl\/author\/sd_global\/"},"uagb_comment_info":0,"uagb_excerpt":"Boysshow \/ mannelijke stripper | Mallorca Top entertainment voor vrijgezellenfeesten, verjaardagen en events op het eiland Mallorca Vragen? \u2192 Bekijk de volledige FAQ, geschatte prijs en alle details voor het boeken van een mannelijke stripshow in Spanje. Boysshow op Mallorca Boek je show in Palma, Marratx\u00ed, Inca, Manacor, Llucmajor enzovoort en krijg direct informatie over&hellip;","_links":{"self":[{"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/pages\/12571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/comments?post=12571"}],"version-history":[{"count":2,"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/pages\/12571\/revisions"}],"predecessor-version":[{"id":12578,"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/pages\/12571\/revisions\/12578"}],"wp:attachment":[{"href":"https:\/\/strippersdeluxe.com\/nl\/wp-json\/wp\/v2\/media?parent=12571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}