1<!doctype html> 2<html lang="pt"> 3 4<head> 5 <meta name="viewport" content="width=1300, max-width=1300"> 6 <meta name="google-site-verification" content="l_kBGVByEFuQBNvWwVoARudBcFDIGjXjDZ9cFhfwagg" /> 7 8 9 10 11 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 12<meta http-equiv="Cache-Control" content="Public" /> 13<meta name="robots" content="index, follow" /> 14 15 16 17 <title>Sarmiento Palace Hotel</title> 18 <meta name="description" content="Hotel Sarmiento Palace 3â no centro de Buenos Aires. Conforto, elegância e clima familiar. Reserve direto e economize."> 19 20 <meta property="og:title" content="Sarmiento Palace Hotel" /> 21 <meta property="og:description" content="Hotel Sarmiento Palace 3â no centro de Buenos Aires. Conforto, elegância e clima familiar. Reserve direto e economize." /> 22 <meta property="og:type" content="website" /> 23 <meta property="og:url" content="https://www.hotelsarmiento.com.ar/pt/" /> 24 <link rel="canonical" href="https://www.hotelsarmiento.com.ar/pt/" /> 25 <meta property="og:image" content="https://images-new.pxsol.com/NM2IxjDm9P-3VKQkWFhh00QIgSEC8BIXp27nlDJs_04/rs:fill:1200:630:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F42fe99e3912227273a3da86ddcd34990d9d5c525.jpg@jpg" /> 26 <meta property="og:image:type" content="image/jpeg" /> 27 <meta property="og:image:width" content="1200" /> 28 <meta property="og:image:height" content="630" /> 29 <meta property="og:image:alt" content="Sarmiento Palace Hotel" /> 30 <meta name="keywords" content="hotel em Buenos Aires, hotéis em Buenos Aires, alojamento em Buenos Aires, onde se hospedar em Buenos Aires?, hotel perto do Congresso Nacional, hotel com café da manhã buffet em Buenos Aires" /> <meta name="robots" content="index" /> 31 <meta property="" content="Sarmiento Palace Hotel" /> 32 <meta property="" content="Hotel Sarmiento Palace 3â no centro de Buenos Aires. Conforto, elegância e clima familiar. Reserve direto e economize." /> 33 <meta property="" content="https://files-p.pxsol.com/68/P203/photos/42fe99e3912227273a3da86ddcd34990d9d5c525.jpg" /> 34 <meta property="" content="https://www.hotelsarmiento.com.ar/pt/" /> 35 <meta property="" content="index" /> 36 <meta property="" content="hotel em Buenos Aires, hotéis em Buenos Aires, alojamento em Buenos Aires, onde se hospedar em Buenos Aires?, hotel perto do Congresso Nacional, hotel com café da manhã buffet em Buenos Aires" /> 37 38 <link rel="alternate" hreflang="es-AR" href="https://www.hotelsarmiento.com.ar/" /> 39 <link rel="alternate" hreflang="en-US" href="https://www.hotelsarmiento.com.ar/en/" /> 40 <link rel="alternate" hreflang="pt-BR" href="https://www.hotelsarmiento.com.ar/pt/" /> 41 <link rel="alternate" hreflang="fr-FR" href="https://www.hotelsarmiento.com.ar/fr/" /> 42 <link rel="alternate" hreflang="de-DE" href="https://www.hotelsarmiento.com.ar/de/" /> 43 <link rel="alternate" hreflang="x-default" href="https://www.hotelsarmiento.com.ar/" /> 44 45<link rel="icon" type="image/png" sizes="16x16" href="https://images-new.pxsol.com/RJKNiBF3-U8kkX8sOZKT0AGv8O0TcM1xPAvPx9V7mTA/rs:fill:16:16:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 46<link rel="icon" type="image/png" sizes="32x32" href="https://images-new.pxsol.com/iWqy1sbbKS850ALUIa88bc2Lkeoj9ByKr7Y0tQLlkiw/rs:fill:32:32:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 47<link rel="icon" type="image/png" sizes="48x48" href="https://images-new.pxsol.com/Il0hY7wBc4oPLRtWfgml0MPg5DLgId9EnUeENs3LcLM/rs:fill:48:48:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 48<link rel="icon" type="image/png" sizes="96x96" href="https://images-new.pxsol.com/ZPXvY4TjcD42ioGzsaEXbyget6C28SosPHU3MThhCvo/rs:fill:96:96:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 49<link rel="shortcut icon" href="https://files-p.pxsol.com/68/company/library/user/181438789186709c06ec3b520fccf0dc4d0a0285e1e.png" /> 50 51<link rel="apple-touch-icon" sizes="57x57" href="https://images-new.pxsol.com/yaMidJ463R9BoKllgSpI88btFe7HpMPNT5iO8kQTDyA/rs:fill:57:57:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 52<link rel="apple-touch-icon" sizes="72x72" href="https://images-new.pxsol.com/oUbgXPq3jUQe-A9am3OYg7iiYz0O74yZh-3ojZJPSa4/rs:fill:72:72:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 53<link rel="apple-touch-icon" sizes="76x76" href="https://images-new.pxsol.com/4-xLeuH8hJEU6bUWBYOKK7u6cXtP5CosNw72hUjcEjk/rs:fill:76:76:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 54<link rel="apple-touch-icon" sizes="114x114" href="https://images-new.pxsol.com/ZhPZeAVUGaeQRpq8wxwvlazFK2YQLKI2C6CeX_vXcLg/rs:fill:114:114:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 55<link rel="apple-touch-icon" sizes="120x120" href="https://images-new.pxsol.com/0njXfZVjMdv--pdBaqGKh96Y3lxnS2hv7Z5HiGpk_Eo/rs:fill:120:120:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 56<link rel="apple-touch-icon" sizes="144x144" href="https://images-new.pxsol.com/mw6WPhCJl49c8ndyc0540lV8_GErtD12YXzoaiNWPNs/rs:fill:144:144:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 57<link rel="apple-touch-icon" sizes="152x152" href="https://images-new.pxsol.com/B3G6z691xcQ8Tjziig0NjuK6s5oAazw_pBvE2JGdgig/rs:fill:152:152:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 58<link rel="apple-touch-icon" sizes="180x180" href="https://images-new.pxsol.com/iXU1KQNiGfgF7Oq459x
587VEzuQuHKMEQ7Ayi6cqRgjQE/rs:fill:180:180:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 59 60<link rel="icon" sizes="192x192" href="https://images-new.pxsol.com/dlDwk8ZjgnX6yFNAz_v6uK677t45-2x9kfTFXMi2spY/rs:fill:192:192:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 61<link rel="icon" sizes="512x512" href="https://images-new.pxsol.com/VB6Cu37zJa7gv-0BFNN4YSH2B5KzS475LEJiUWNJvtU/rs:fill:512:512:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 62 63 <link rel="manifest" href="/manifest.json?pos=SarmientoPalace"> 64 65<meta name="theme-color" content="#006633"> 66 67<meta property="og:site_name" content="Inicio - Sarmiento Palace Hotel" /> 68<meta name="twitter:card" content="summary"> 69<meta name="twitter:site" content="Inicio - Sarmiento Palace Hotel"> 70<meta name="twitter:title" content="Inicio - Sarmiento Palace Hotel"> 71<meta name="twitter:description" content="En pleno corazón de Buenos Aires, para que disfrutes de teatros, restaurantes, complejos culturales y de entretenimiento"> 72<meta name="twitter:creator" content="PXSOL"> 73<meta name="twitter:image" content="https://images-new.pxsol.com/N37o-Zv-mlWdNNlte5a-hrR8kF9lQiNUxJq49WWVWU4/rs:fill:630:430:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F42fe99e3912227273a3da86ddcd34990d9d5c525.jpg@jpg"> 74 75 76 77<style> 78 .neo_bgcolor_primary, .MuiButton-containedSecondary { 79background-color: #006633 !important; 80} 81 82.MuiButton-containedSecondary.MuiButton-contained.Mui-disabled { 83 box-shadow: none !important; 84 background-color: rgba(0, 0, 0, 0.12) !important; 85} 86 87.neo_color_primary { 88color: #006633; 89} 90 91.cta_webcheckin_px:not(.btn_sesion) { 92background-color: #006633 !important; 93color: white !important; 94border: none !important; 95font-weight: bold; 96right: 0; 97display: flex; 98align-items: center; 99font-size: 13px !important; 100padding: 7px 8px !important; 101line-height: 1.2; 102text-align: left; 103} 104 105.cta_webcheckin_px.btn_sesion { 106border: none !important; 107font-weight: bold; 108right: 0; 109display: flex; 110align-items: center; 111font-size: 13px !important; 112padding: 7px 8px !important; 113line-height: 1.2; 114text-align: left; 115} 116 117.cta_webcheckin_px * { 118color: inherit !important; 119} 120 121.cta_webcheckin_px.btn_sesion > i { 122 color: #006633 !important; 123} 124 125.cta_webcheckin_px { 126background-color: #33855c; 127} 128.cta_webcheckin_px i { 129margin-right: 10px; 130font-size: 15px; 131} 132 133.neo_bgcolor_primary:hover, .MuiButton-containedSecondary:hover { 134background-color: #33855c; 135} 136.px-sm-inputcontainer:hover label { 137color: #006633 !important; 138} 139div.ui-datepicker#ui-datepicker-div .ui-state-active, div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-active, div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-active, div.ui-datepicker#ui-datepicker-div td:not(.ui-datepicker-today) .ui-state-highlight, div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-highlight, div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-highlight { 140background-color: #006633 !important; 141} 142 143.px-mk-iconchangesearch { 144color: #006633 !important; 145} 146 147.px-mk-locationdropdown>*:hover .px-mk-locationimg { 148fill: #006633 !important; 149} 150 151.neo_mobile_supratop .neo_supratop_selector i { 152color: #006633 !important; 153} 154 155.standard_cta { 156padding: 10px 15px; 157box-sizing: border-box; 158border-radius: 5px; 159display: flex; 160justify-content: center; 161text-align: center; 162align-items: center; 163background: #006633 !important; 164color: #FFFFFF; 165transition: .2s ease-out; 166color: white; 167text-decoration: none; 168font-size: 18px; 169border: none; 170transition: .25s ease-out; 171cursor: pointer; 172} 173 174.standard_cta:hover { 175background-color: #4d9471; 176} 177.standard_cta:disabled { 178opacity: .5; 179cursor: not-allowed; 180} 181 182.neo_cta_naked {
183font-weight: bold; 184text-decoration: none; 185color: #006633; 186display: inline-flex; 187background-color: transparent; 188border: none; 189cursor: pointer; 190transition: .2s ease-out; 191} 192 193.neo_cta_naked.gray { 194color: darkgray; 195} 196 197.neo_cta_naked:hover { 198color: #004824; 199} 200 201.neo_cta_standard { 202border: none; 203border-radius: 10px; 204padding: 12px 20px; 205font-size: 18px; 206display: flex; 207align-items: center; 208justify-content: space-between; 209font-weight: bold; 210cursor: pointer; 211transition: .25s ease-out; 212box-sizing: border-box; 213text-decoration: none; 214} 215 216.neo_cta_standard.smaller { 217font-size: 16px; 218padding: 7px 13px; 219} 220 221.neo_cta_standard.shadow { 222box-shadow: 0px -1px 15px rgba(0,0,0,.3); 223} 224 225.neo_cta_standard.lowpadding { 226padding: 12px; 227} 228.neo_cta_standard.lowpadding > i { 229margin: 0; 230} 231 232.neo_cta_standard:disabled { 233opacity: .5; 234cursor: not-allowed; 235} 236 237.neo_cta_standard.primary { 238background: #006633; 239color: #FFFFFF; 240} 241.neo_cta_standard.white_cta { 242background: white; 243color: black; 244} 245.neo_cta_standard.primary:hover { 246background-color: #004824; 247color: #FFFFFF; 248} 249.neo_cta_standard.primary:active { 250background-color: #00331a; 251color: #FFFFFF; 252} 253 254.neo_cta_standard > i { 255margin-left: 10px; 256} 257 258.neo_cta_standard:disabled, .neo_cta_standard[disabled] {
259cursor: not-allowed; 260filter: saturate(.3); 261opacity: 0.8; 262} 263 264.neo_cta_standard.v_disabled { 265background-color: #1e1e1e; 266} 267 268.neo_cta_standard .loading-text, .neo_cta_standard .success-text { 269display:none; 270} 271 272.neo_cta_standard.v_loading { 273pointer-events: none; 274} 275.neo_cta_standard.v_loading { 276position: relative; 277} 278.neo_cta_standard .loading-text { 279display:none; 280} 281.neo_cta_standard.v_loading > *:not(i,.loading-text) { 282display:none; 283} 284.neo_cta_standard.v_loading > i { 285position: relative; 286height: 20px; 287width: 20px; 288} 289 290.neo_cta_standard.v_loading > i:before { 291content: none; 292} 293 294.neo_cta_standard.v_loading > i::after { 295content: ""; 296position: absolute; 297width: 100%; 298height: 100%; 299box-sizing: border-box; 300top: 0; 301left: 0; 302right: 0; 303bottom: 0; 304margin: auto; 305border: 0.25rem solid transparent; 306border-top-color: #ffffff; 307border-right-color: #ffffff; 308border-radius: 50%; 309animation: spinner .6s linear infinite; 310} 311.neo_cta_standard.v_loading .loading-text { 312display:block; 313} 314 315.neo_cta_standard.v_success { 316background-color: #00a651; 317} 318.neo_cta_standard.v_success > *:not(.success-text) { 319display:none; 320} 321.neo_cta_standard.v_success .success-text { 322display:block; 323} 324@keyframes button-loading-spinner { 325from { 326transform: rotate(0turn); 327} 328 329to { 330transform: rotate(1turn); 331} 332} 333 334@keyframes spinner { 335to { 336transform: rotate(360deg); 337} 338} 339 340#innerLoader, .innerLoader { 341height: 100%; 342display: flex; 343justify-content: center; 344align-items: center; 345min-height: 200px; 346} 347.neo_spin_loader { 348height: 60px; 349width: 60px; 350margin-bottom: 20px; 351} 352.neo_spin_loader:before { 353content: ""; 354box-sizing: border-box; 355position: absolute; 356width: 60px; 357height: 60px; 358border-radius: 50%; 359border: 3px solid #ccc; 360border-top-color: #006633; 361animation: spinner 1s linear infinite; 362} 363.neo_bgcolor_primary { 364background-color: #006633; 365} 366 367.neo_button_partyselector { 368border: 1px solid #006633; 369height: 40px; 370width: 40px; 371display: flex; 372justify-content: center; 373align-items: center; 374text-align: center; 375background: transparent; 376color: #006633; 377margin: 10px 0; 378transition: .2s ease-out; 379border-radius: 10px; 380font-size: 18px; 381cursor: pointer; 382 383} 384 385.neo_button_partyselector:hover { 386background-color: #99c2ae; 387} 388 389.neo_button_partyselector:focus { 390box-shadow: 0 0 0 3px #cce1d7; 391} 392 393.neo_button_partyselector:active { 394color: #FFFFFF; 395background: #006633; 396} 397 398.neo_partyselector_quantity { 399padding: 15px 10px; 400font-size: 18px; 401} 402 403.ChildrensAgeSelect { 404width: 100%; 405box-sizing: border-box; 406padding: 10px; 407margin-bottom: 10px; 408border-radius: 10px; 409border-color: #ccc; 410} 411 412.PartyTypeSimulator .px-mk-inputicon svg { 413height: 1.2em; 414width: 1.2em; 415fill: #aaa; 416} 417.neo_bgcolor_primary_text { 418color: #FFFFFF; 419} 420 421.neo_pxuser_mainbtn { 422height: 3.5rem; 423max-height: 100%; 424overflow: hidden; 425transition: .2s ease-out; 426border-radius: .5rem; 427cursor: pointer; 428padding: 0 0.5rem; 429background-color: white; 430color: black !important; 431} 432 433.neo_pxuser_mainbtn * { 434color: black !important; 435} 436 437.neo_pxuser_mainbtn:hover { 438background-color: #f2f2f2; 439} 440 441.neo_pxuser_avatar_container { 442height: 100%; 443width: 3rem; 444display: flex; 445justify-content: center; 446align-items: center; 447} 448 449.neo_pxuser_avatar_container img { 450height: 80%; 451border-radius: 2rem; 452} 453 454.neo_pxuser_text_block { 455padding: .5rem .5rem .5rem .5rem; 456box-sizing: border-box; 457height: 100%; 458justify-content: center; 459line-height: 1.5; 460} 461 462.neo_pxuser_icon_dd { 463padding: .5rem; 464box-sizing: border-box; 465} 466 467.neo_pxuser_dropdown { 468position: absolute; 469right: 0; 470top: 100% !important; 471background: white; 472border-radius: .25rem; 473min-width: 110%; 474box-shadow: 0 3px 6px rgba(0,0,0,.5); 475text-align: left; 476display: none !important; 477} 478 479.neo_pxuser_dropdown * { 480color: black !important; 481} 482 483.neo_pxuser_dropdown.open { 484display: flex !important; 485top: 100% !important; 486} 487 488.neo_pxuser_dd_button { 489padding: 1rem; 490transition: .2s ease-out; 491cursor: pointer; 492text-decoration: none; 493color: black; 494} 495 496.neo_pxuser_dd_button > .mdi { 497font-size: 1.2rem; 498line-height: 1; 499vertical-align: middle; 500display: inline-flex; 501width: 2rem; 502justify-content: center; 503align-items: center; 504height: 2rem; 505} 506 507.neo_pxuser_dd_button > span { 508padding: .5rem; 509display: inline-flex; 510flex-grow: 1; 511width: calc(100% - 3rem); 512} 513 514.neo_pxuser_dd_button:hover { 515background-color: #f2f2f2; 516border-radius: .25rem; 517} 518 519.neo_pxuser_email { 520 max-width: 8rem; 521 overflow: hidden; 522 text-overflow: ellipsis; 523} 524 525@media only screen and (max-width: 468px) { 526 527 .neo_pxuser_mainbtn { 528 flex-flow: row-reverse; 529 flex-grow: 1; 530 } 531 532 .neo_pxuser_icon_dd { 533 display: none; 534 } 535 536 .neo_pxuser_text_block { 537 text-align: right; 538 text-transform: none; 539 letter-spacing: initial; 540 color: black; 541 line-height: 1; 542 max-width: 50%; 543 } 544 545 .neo_pxuser_email { 546 display: none; 547 } 548 549 .neo_pxuser_container { 550 text-transform: initial; 551 letter-spacing: initial; 552 font-weight: normal; 553 font-size: .8rem; 554 } 555 556 .neo_pxuser_name { 557 font-weight: bold; 558 text-align: left; 559 white-space: nowrap; 560 overflow: hidden; 561 text-overflow: ellipsis; 562 display: flex; 563 align-items: center; 564 } 565 566 .neo_pxuser_name strong { 567 display: inline-block; 568 max-width: 150px; 569 overflow: hidden; 570 white-space: nowrap; 571 text-overflow: ellipsis; 572 vertical-align: middle; 573 line-height: 1.2; 574 } 575 576 .neo_pxuser_dd_button { 577 padding: .5rem; 578 } 579 580 581}</style> 582 583 584
585<script type="application/ld+json" defer async> 586{ 587 "url" : "https:\/\/www.hotelsarmiento.com.ar\/pt\/", 588 "telephone": "+54 11 2051-3061", 589 "description" : "En pleno coraz\u00f3n de Buenos Aires, para que disfrutes de teatros, restaurantes, complejos culturales y de entretenimiento", 590 "name" : "Inicio - Sarmiento Palace Hotel", 591 "logo" : "https:\/\/images-new.pxsol.com\/VB6Cu37zJa7gv-0BFNN4YSH2B5KzS475LEJiUWNJvtU\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png", 592 "image" : "https:\/\/images-new.pxsol.com\/N37o-Zv-mlWdNNlte5a-hrR8kF9lQiNUxJq49WWVWU4\/rs:fill:630:430:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F42fe99e3912227273a3da86ddcd34990d9d5c525.jpg@jpg", 593 "aggregateRating" : { 594 "reviewCount" : 3025, 595 "@type" : "AggregateRating", 596 "bestRating" : 10, 597 "ratingValue" : 9.4 }, 598 "@type" : "Hotel", 599 "address" : { 600 "postalCode" : "C1044", 601 "streetAddress" : "Sarmiento 1953, C1044 Cdad. Autónoma de Buenos Aires, Argentina, C1044 Comuna 3, Buenos Aires, Argentina", 602 "addressCountry" : "Argentina", 603 "addressRegion" : "Buenos Aires", 604 "addressLocality" : "Comuna 3", 605 "@type" : "PostalAddress" 606 }, 607 "geo": { 608 "@type": "GeoCoordinates", 609 "latitude": -34.6057266, 610 "longitude": -58.3944636 }, 611 "@context" : "http://schema.org" 612 } 613</script>
613 614 615<!-- Organization Schema for Brand/Logo SEO -->
616<script type="application/ld+json"> 617{ 618 "@context": "https://schema.org", 619 "@type": "Organization", 620 "name": "Inicio - Sarmiento Palace Hotel", 621 "url": "https:\/\/www.hotelsarmiento.com.ar\/pt\/", 622 "logo": "https:\/\/images-new.pxsol.com\/VB6Cu37zJa7gv-0BFNN4YSH2B5KzS475LEJiUWNJvtU\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png", 623 "image": "https:\/\/images-new.pxsol.com\/VB6Cu37zJa7gv-0BFNN4YSH2B5KzS475LEJiUWNJvtU\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"} 624</script>
624 625 626 627 628 <link rel="icon" sizes="192x192" href="https://images-new.pxsol.com/dlDwk8ZjgnX6yFNAz_v6uK677t45-2x9kfTFXMi2spY/rs:fill:192:192:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F181438789186709c06ec3b520fccf0dc4d0a0285e1e.png@png"> 629 <link rel="icon" type="image/png" href="https://files-p.pxsol.com/68/company/library/user/181438789186709c06ec3b520fccf0dc4d0a0285e1e.png" /> 630 <!-- CustomHTMLHead (SiteJson) --><link rel="preconnect" href="https://fonts.googleapis.com"> 631<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 632<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&family=Source+Sans+Pro:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet"> <!-- Pos->Type: hotel.css --> 633 634<!-- Google tag (gtag.js) GA4 PXSOL TODOS LOS HOTELES -->
635<script> 636 window.dataLayer = window.dataLayer || []; 637 function gtag(){dataLayer.push(arguments);} 638 gtag('js', new Date()); 639</script>
vendor: 64 bytes, lines 639-640
639 640<script async src="https://www.googletagmanager.com/gtag/js?id=
640G-SYSQR6EL6E
vendor: 12 bytes, line 640
640"></script>
641<script> 642 let globalSessionGA4Config = { 643 'pos': 'SarmientoPalace', 644 'product_id': '203', 645 'product_name': 'Sarmiento Palace Hotel', 646 'product_country': 'Argentina', 647 'product_state': 'Buenos Aires', 648 'product_plaza': 'Comuna 3', 649 'product_score': '93.97' 650 }; 651 652 gtag('config', 'G-R46ZZR63SX', globalSessionGA4Config); 653 654 gtag('config', 'G-SYSQR6EL6E', globalSessionGA4Config); 655 656 gtag('config', 'AW-1028619328', globalSessionGA4Config); 657 658 // Mirror page_view into dataLayer for GTM debug (guard to avoid duplicates) 659 if (!window.__dl_page_view_pushed) { 660 window.dataLayer.push({ event: 'page_view' }); 661 window.__dl_page_view_pushed = true; 662 } 663 664 665</script>
665 666 667<!-- Global site tag (gtag.js) -->
vendor: 64 bytes, lines 667-668
667 668<script async src="https://www.googletagmanager.com/gtag/js?id=
668UA-34517567-10
vendor: 12 bytes, line 668
668"></script>
669<script> 670 window.dataLayer = window.dataLayer || []; 671 672 function gtag() { 673 dataLayer.push(arguments); 674 try { 675 var args = Array.prototype.slice.call(arguments); 676 if (args[0] === 'event') { 677 var dlEventName = args[1]; 678 var dlParams = (args.length > 2 && typeof args[2] === 'object') ? args[2] : {}; 679 var dlObject = {}; 680 for (var key in dlParams) { 681 if (Object.prototype.hasOwnProperty.call(dlParams, key)) { 682 dlObject[key] = dlParams[key]; 683 } 684 } 685 dlObject.event = dlEventName; 686 window.dataLayer.push(dlObject); 687 688 // Intercept add_to_cart and fire form_success after it 689 if (dlEventName === 'add_to_cart') { 690 setTimeout(function() { 691 console.log('%c[pxTrack] ð FIRING form_success for add_to_cart', 'color: #4CAF50; font-weight: bold;'); 692 window.pxTrack('form_success', { 693 form_id: 'add_to_cart', 694 lead_id: null, 695 transaction_id: null 696 }); 697 }, 100); 698 } 699 } 700 } catch (e) {} 701 } 702 gtag('js', new Date()); 703 704 gtag('config', 'G-R46ZZR63SX'); 705 706 gtag('config', 'UA-34517567-10'); 707 708 gtag('config', 'AW-1028619328'); 709 710 </script>
710 711 712<!-- Pxsol Data Layer utilities and event wiring -->
713<script> 714 (function() { 715 // DEBUG: Confirm script is loaded and updated 716 console.log('%c[pxTrack] Script loaded - Version: 2025-01-15-no-inventory-v3-rate-limit-fix', 'color: #4CAF50; font-weight: bold; font-size: 12px;'); 717 718 // Define manual scan function globally FIRST (before any other code that might fail) 719 window.__px_manual_no_inventory_scan = function() { 720 console.log('[pxTrack] Manual scan triggered'); 721 if (window.__px_no_inventory_scan_func) { 722 return window.__px_no_inventory_scan_func(); 723 } else { 724 console.warn('[pxTrack] Watcher not initialized yet. Performing basic scan...'); 725 // Perform basic scan even if watcher not initialized 726 try { 727 var hasNoInventory = false; 728 var detectionMethod = ''; 729 730 // Check DOM elements 731 var noInventoryContainer = document.querySelector('#no-inventory-container'); 732 var noInventoryElement = document.querySelector('#no-inventory'); 733 if (noInventoryContainer || noInventoryElement) { 734 hasNoInventory = true; 735 detectionMethod = 'DOM element (ID)'; 736 console.log('[pxTrack] â Found #no-inventory-container or #no-inventory'); 737 } 738 739 // Check px_jsonQuery 740 if (!hasNoInventory && typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 741 var jsonQuery = window.px_jsonQuery; 742 if (jsonQuery.ProductList && Array.isArray(jsonQuery.ProductList) && jsonQuery.ProductList.length > 0) { 743 var allZero = true; 744 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 745 var product = jsonQuery.ProductList[i]; 746 var productAvail = product.Availability || 0; 747 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 748 for (var j = 0; j < product.SkuList.length; j++) { 749 if (product.SkuList[j].Availability && product.SkuList[j].Availability > 0) { 750 allZero = false; 751 break; 752 } 753 } 754 } else if (productAvail > 0) { 755 allZero = false; 756 } 757 if (!allZero) break; 758 } 759 if (allZero) { 760 hasNoInventory = true; 761 detectionMethod = 'Json_Query'; 762 console.log('[pxTrack] â All products have Availability === 0'); 763 } 764 } 765 } 766 767 if (hasNoInventory && !window.__px_no_inventory_pushed) { 768 console.log('[pxTrack] ð FIRING no_inventory event manually - Method:', detectionMethod); 769 window.__px_no_inventory_pushed = true; 770 var params = {}; 771 try { 772 // Try to get search params 773 var startRaw = (document.querySelector('#fechaingreso') || {}).value || ''; 774 var endRaw = (document.querySelector('#fechaegreso') || {}).value || ''; 775 params.start_date = startRaw; 776 params.end_date = endRaw; 777 params.no_inventory = true; 778 } catch(e) {} 779 window.pxTrack('no_inventory', params); 780 781 // Fire form_success for search form after no_inventory 782 setTimeout(function() { 783 console.log('%c[pxTrack] ð FIRING form_success for search form (after manual no_inventory)', 'color: #4CAF50; font-weight: bold;'); 784 window.pxTrack('form_success', { 785 form_id: 'pxmk_searchform', 786 lead_id: null, 787 transaction_id: null 788 }); 789 }, 100); 790 791 return { fired: true, method: detectionMethod, params: params }; 792 } else if (hasNoInventory) { 793 return { already_fired: true, method: detectionMethod }; 794 } else { 795 return { no_inventory_detected: false, px_jsonQuery_exists: typeof window.px_jsonQuery !== 'undefined' }; 796 } 797 } catch(e) { 798 console.error('[pxTrack] Error in manual scan:', e); 799 return { error: 'Scan failed', message: e.message }; 800 } 801 } 802 }; 803 804 window.dataLayer = window.dataLayer || []; 805 806 // Helper that tracks to both GA4 and dataLayer 807 if (!window.pxTrack) { 808 window.pxTrack = function(eventName, params) { 809 params = params || {}; 810 try { gtag('event', eventName, params); } catch(e) {} 811 try { 812 var dl = {}; 813 for (var k in params) if (Object.prototype.hasOwnProperty.call(params, k)) dl[k] = params[k]; 814 dl.event = eventName; 815 window.dataLayer.push(dl); 816 } catch(e) {} 817 }; 818 } 819 820 // Privacy-safe booleans for PII presence 821 function bool(val) { return !!val; } 822 823 // Read URL param 824 function getUrlParam(name) {
825 try { 826 var params = new URLSearchParams(location.search); 827 return params.get(name) || ''; 828 } catch (e) { return ''; } 829 } 830 831 // Normalize common date formats to YYYY-MM-DD (best-effort) 832 function normalizeDate(value) { 833 try { 834 if (!value) return ''; 835 var v = String(value).trim(); 836 // dd/mm/yyyy -> yyyy-mm-dd 837 if (/^\d{2}\/\d{2}\/\d{4}$/.test(v)) { 838 var p = v.split('/'); 839 return [p[2], p[1].padStart(2, '0'), p[0].padStart(2, '0')].join('-'); 840 } 841 // Already ISO 842 if (/^\d{4}-\d{2}-\d{2}$/.test(v)) return v; 843 return v; 844 } catch (e) { 845 return String(value || ''); 846 } 847 } 848 849 // Session id generator 850 function getPxSessionId() { 851 try { 852 var key = 'px_session_id'; 853 var match = document.cookie.match(new RegExp('(^| )' + key + '=([^;]+)')); 854 if (match) return match[2]; 855 var id = (crypto && crypto.randomUUID) ? crypto.randomUUID() : String(Date.now()) + '_' + Math.floor(Math.random()*1e9); 856 document.cookie = key + '=' + id + ';path=/;max-age=' + (60*60*24*365).toString(); 857 return id; 858 } catch(e) { 859 return 'sid_' + String(Date.now()); 860 } 861 } 862 863 // Expose chat helpers (to be called from chat widget) 864 window.pxChatOpen = function(payload) { window.pxTrack('chat_open', payload || {}); }; 865 window.pxChatMessage = function(payload) { window.pxTrack('chat_message', payload || {}); }; 866 window.pxChatClose = function(payload) { window.pxTrack('chat_close', payload || {}); }; 867 window.pxFormSuccess = function(payload) { window.pxTrack('form_success', payload || {}); }; 868 window.pxNoInventory = function(payload) { window.pxTrack('no_inventory', payload || { no_inventory: true }); }; 869 870 // Context payload from PHP (best-effort) 871 var pxContext = { 872 pos: 'SarmientoPalace', 873 product_id: '203', 874 product_name: 'Sarmiento Palace Hotel', 875 product_country: 'Argentina', 876 product_state: 'Buenos Aires', 877 product_plaza: 'Comuna 3', 878 search_id: '', 879 start_date: '', 880 end_date: '', 881 transaction_id: '', 882 value: null, 883 currency: '', 884 page_url: location.href, 885 session_id: getPxSessionId() 886 }; 887 888 // --- External engine redirect auto event when engine is disabled --- 889 890 891 // Adults/children/rooms best-effort totals from PHP when available 892 pxContext.adults = 0; 893 pxContext.children = 0; 894 pxContext.rooms = 0; 895 896 // Push context for GTM usage 897 try { window.dataLayer.push(Object.assign({ event: 'px_context' }, pxContext)); } catch(e) {} 898 899 // Boot event para validar integración en DebugView/GTM 900 if (!window.__px_boot_pushed) { 901 window.__px_boot_pushed = true; 902 window.pxTrack('px_layer_ready', { 903 session_id: pxContext.session_id, 904 page_url: pxContext.page_url, 905 pos: pxContext.pos || '', 906 product_id: pxContext.product_id || '', 907 search_id: pxContext.search_id || '', 908 ts: Date.now() 909 }); 910 } 911 912 // ----- Search events wiring (V3/V8) ----- 913 function getSearchParamsFromDOM() { 914 var startRaw = (document.querySelector('.neo_marketplace_buscador_v3 #fechaingreso') || 915 document.querySelector('#fechaingreso') || 916 document.querySelector('[name="Start"]') || 917 document.querySelector('#Start') || { }).value || pxContext.start_date || ''; 918 var endRaw = (document.querySelector('.neo_marketplace_buscador_v3 #fechaegreso') || 919 document.querySelector('#fechaegreso') || 920 document.querySelector('[name="End"]') || 921 document.querySelector('#End') || { }).value || pxContext.end_date || ''; 922 var sidRaw = (document.querySelector('#SearchID') || { }).value || getUrlParam('SearchID') || pxContext.search_id || ''; 923 var params = { 924 start_date: normalizeDate(startRaw) || '', 925 end_date: normalizeDate(endRaw) || '', 926 pos: pxContext.pos || '', 927 hotel_id: pxContext.product_id || '', 928 page_url: location.href, 929 session_id: pxContext.session_id 930 };
931 if (sidRaw) params.search_id = sidRaw; 932 // Adults/children from UI if present 933 try { 934 var adultsEl = document.querySelector('.neo_partyselector_quantity[party-type="adults"]'); 935 var childrenEl = document.querySelector('.neo_partyselector_quantity[party-type="children"]'); 936 if (adultsEl) params.adults = Number(adultsEl.getAttribute('val') || adultsEl.textContent) || pxContext.adults || 0; 937 if (childrenEl) params.children = Number(childrenEl.getAttribute('val') || childrenEl.textContent) || pxContext.children || 0; 938 // Fallback from hidden GroupsForm if exists 939 if ((!params.adults || !params.children) && document.querySelector('#GroupsForm')) { 940 var gf = document.querySelector('#GroupsForm').value || ''; 941 var rooms = 0, adults = 0, children = 0; 942 if (gf) { 943 gf.split(';').forEach(function(groupStr){ 944 if (!groupStr) return; 945 rooms += 1; 946 var parts = groupStr.split(':'); 947 if (parts.length < 2) return; 948 var trio = parts[1].split(','); 949 var a = parseInt(trio[0] || '0', 10); 950 adults += isNaN(a) ? 0 : a; 951 var childrenAges = (trio[1] || '0'); 952 if (childrenAges && childrenAges !== '0') { 953 children += childrenAges.split('.').filter(Boolean).length; 954 } 955 }); 956 if (!params.adults) params.adults = adults; 957 if (!params.children) params.children = children; 958 if (!params.rooms) params.rooms = rooms; 959 } 960 } 961 } catch(e) {} 962 return params; 963 } 964 965 // -- Estado COMPARTIDO del throttle de `search_modify` -------------------------------- 966 // Vive FUERA de las funciones de cableado a proposito: `wireSearchEventsWhenReady()` puede 967 // re-ejecutar `wireSearchEvents()` varias veces hasta enganchar el buscador que llega por 968 // AJAX, y con el throttle dentro del cierre cada invocacion tenia su propia ventana de 1 s 969 // => dos cableados equivalentes podian emitir el mismo cambio dos veces. 970 var pxLastModifyMs = 0; 971 var pxLastSnapshot = null; 972 973 function getModifySnapshot() { 974 var p = getSearchParamsFromDOM(); 975 return { 976 start_date: p.start_date || '', 977 end_date: p.end_date || '', 978 rooms: (p.rooms*1) || 0, 979 adults: (p.adults*1) || 0, 980 children: (p.children*1) || 0 981 }; 982 } 983 function pushModifyFlagsIfChanged(prevSnap, nextSnap) { 984 try { 985 if (!prevSnap) return true; 986 var changes = {}; 987 if (nextSnap.start_date !== prevSnap.start_date) changes.start_date = true; 988 if (nextSnap.end_date !== prevSnap.end_date) changes.end_date = true; 989 if ((nextSnap.rooms*1) !== (prevSnap.rooms*1)) changes.rooms = true; 990 if ((nextSnap.adults*1) !== (prevSnap.adults*1)) changes.adults = true; 991 if ((nextSnap.children*1) !== (prevSnap.children*1)) changes.children = true; 992 if (Object.keys(changes).length) return true; 993 } catch (e) {} 994 return false; 995 } 996 function throttledModifyFire() { 997 var now = Date.now(); 998 if (now - pxLastModifyMs < 1000) return; // throttle to 1s 999 pxLastModifyMs = now; 1000 var current = getModifySnapshot(); 1001 // Push GA/DataLayer event with current values 1002 window.pxTrack('search_modify', getSearchParamsFromDOM()); 1003 // Also push a probe event with the current values for GTM debug 1004 try { 1005 window.dataLayer.push({ 1006 event: 'px_search_modify_probe', 1007 search_modify: current, 1008 ts: Date.now() 1009 }); 1010 } catch(e) {} 1011 // Update snapshot only if something changed 1012 if (pushModifyFlagsIfChanged(pxLastSnapshot, current)) { 1013 pxLastSnapshot = current; 1014 } 1015 } 1016 1017 /** 1018 * Respaldos de `search_modify` que NO dependen de que el buscador exista en el DOM: 1019 * listeners DELEGADOS en `document` (captura) + un poller de 400 ms sobre 1020 * `#fechaingreso`/`#fechaegreso`/`#GroupsForm`. 1021 * 1022 * OJO: se instalan SIEMPRE en el init, sin pasar por `searchDomPresent()` ni por el tope de 1023 * 20 s del watcher -- que es exactamente como se instalaban antes, cuando `wireSearchEvents()` 1024 * se llamaba incondicionalmente. Justamente por ser delegados/poll son los que hacen que 1025 * `search_modify` funcione sobre un buscador inyectado por AJAX: meterlos detras del 1026 * reintento dejaba sin ningun listener a las sesiones donde el buscador tarda mas de 20 s 1027 * (telefono con red lenta), que ANTES si los tenian. 1028 */ 1029 function wireSearchFallbacks() { 1030 if (window.__px_search_fallbacks_wired) return; 1031 window.__px_search_fallbacks_wired = true; 1032 pxLastSnapshot = getModifySnapshot(); 1033 // Debug: signal that search watchers are alive
1034 try { 1035 window.dataLayer.push({ 1036 event: 'px_search_watchers_ready', 1037 ts: Date.now() 1038 }); 1039 } catch(e) {} 1040 // Listeners delegados (capturan aunque el DOM se re-renderice) 1041 try { 1042 if (!window.__px_global_search_listeners) { 1043 window.__px_global_search_listeners = true; 1044 var selectorList = ['#fechaingreso','#fechaegreso','.AdultsSelect','.ChildrensSelect','.neo_partyselector_quantity','.ChildrensAgeSelect']; 1045 function matchesTracked(el) { 1046 try { return selectorList.some(function(sel){ return el && el.matches && el.matches(sel); }); } catch(e) { return false; } 1047 } 1048 document.addEventListener('change', function(e){ if (matchesTracked(e.target)) throttledModifyFire(); }, true); 1049 document.addEventListener('input', function(e){ if (matchesTracked(e.target)) throttledModifyFire(); }, true); 1050 document.addEventListener('click', function(e){ 1051 var t = e.target; 1052 if (t && t.classList && t.classList.contains('neo_button_partyselector')) throttledModifyFire(); 1053 }, true); 1054 } 1055 } catch(e) {} 1056 // Robust watchers for datepicker-driven value changes and hidden GroupsForm updates 1057 try { 1058 if (!window.__px_modify_watchers_started) { 1059 window.__px_modify_watchers_started = true; 1060 var lastIn = (document.querySelector('#fechaingreso') || {}).value || ''; 1061 var lastOut = (document.querySelector('#fechaegreso') || {}).value || ''; 1062 var lastGF = (document.querySelector('#GroupsForm') || {}).value || ''; 1063 setInterval(function(){ 1064 try { 1065 var inEl = document.querySelector('#fechaingreso'); 1066 var outEl = document.querySelector('#fechaegreso'); 1067 var gfEl = document.querySelector('#GroupsForm'); 1068 var curIn = inEl ? inEl.value : ''; 1069 var curOut = outEl ? outEl.value : ''; 1070 var curGF = gfEl ? gfEl.value : ''; 1071 if (curIn !== lastIn || curOut !== lastOut || curGF !== lastGF) { 1072 lastIn = curIn; lastOut = curOut; lastGF = curGF; 1073 throttledModifyFire(); 1074 } 1075 } catch(e) {} 1076 }, 400); 1077 } 1078 } catch(e) {} 1079 } 1080 1081 /** 1082 * SOLO los cableados que necesitan el nodo del buscador en el DOM: `search_open` (existe el 1083 * contenedor) y `search_submit` (existe el form). Los reintenta `wireSearchEventsWhenReady()`. 1084 * 1085 * OJO: ya NO cuelga listeners de `search_modify` del contenedor. Eran un duplicado EXACTO de 1086 * los delegados de `wireSearchFallbacks()` (la misma lista de 6 selectores y el mismo click 1087 * sobre `.neo_button_partyselector`). Mientras esta funcion corria una sola vez compartian el 1088 * cierre -- y con el el throttle -- asi que no se notaba; con el reintento podian quedar en 1089 * invocaciones distintas y contar el mismo cambio dos veces. 1090 */ 1091 function wireSearchEvents() { 1092 var searchForm = document.querySelector('.neo_marketplace_buscador_v3 #pxmk_searchform') || document.querySelector('#search_form'); 1093 var searchContainer = document.querySelector('.neo_marketplace_buscador_v3') || document.querySelector('.px-mk-buscador-container') || document.querySelector('#search_form') || document.querySelector('.PartyTypeSimulatorContainer'); 1094 1095 if (searchContainer && !window.__px_search_container_bound) { 1096 window.__px_search_container_bound = true; 1097 // fire search_open once 1098 if (!window.__px_search_open_pushed) { 1099 window.__px_search_open_pushed = true; 1100 window.pxTrack('search_open', { page_url: location.href }); 1101 } 1102 } 1103 1104 if (searchForm && !window.__px_search_form_bound) { 1105 window.__px_search_form_bound = true; 1106 searchForm.addEventListener('submit', function() { 1107 window.pxTrack('search_submit', getSearchParamsFromDOM()); 1108 }, true); 1109 var searchBtn = document.querySelector('.neo_marketplace_buscador_v3 #PxMkAcion_Search') || document.querySelector('#Acion_Search'); 1110 if (searchBtn) { 1111 searchBtn.addEventListener('click', function() {
1112 window.pxTrack('search_submit', getSearchParamsFromDOM()); 1113 }, true); 1114 } 1115 } 1116 } 1117 1118 /** 1119 * El buscador NO existe al DOMContentLoaded en NINGUNA `lp.html`: lo inyecta por AJAX 1120 * `neo_modules/lp_cart.php` (CargarModulo) cientos de ms despues. `wireSearchEvents()` se 1121 * cableaba UNA sola vez, asi que sus dos gates de DOM evaluaban null y no se emitian nunca 1122 * `search_open` (gate `if (searchContainer)`) ni `search_submit` (gate `if (searchForm)`), 1123 * ni `start_search`/`egreso_search` (`wireDatePickers`). Sólo disparaban en las HOME 1124 * server-rendered, donde el buscador viene en el HTML inicial. 1125 * 1126 * Medido en vivo el 2026-08-21 sobre `fincaogawa.reservadirecto.com/lp.html`: los 6 1127 * selectores del buscador estan en 0 en DOMContentLoaded (1389 ms) y en load (2369 ms), y 1128 * recien aparecen a los ~3010 ms; un click en el submit real (`#Acion_Search`) generaba 1129 * SearchID y `has_inventory`, pero CERO `search_submit`. 1130 * 1131 * `has_inventory`/`no_inventory` nunca sufrieron esto porque cuelgan de una cascada de scans 1132 * + MutationObserver (`wireNoInventoryWatcher` / `observeAvailabilityContainers`), no de un 1133 * cableado one-shot. Esta funcion aplica esa MISMA tecnica a la fam
1133ilia de busqueda. 1134 * 1135 * Se apaga sola en cuanto engancha el contenedor y el form (los dos productores de 1136 * `search_open`/`search_submit`), con tope duro de 20 s. Cada bind es idempotente por su 1137 * propia guarda global, asi que re-correr no duplica ni un listener ni un evento. 1138 */ 1139 function searchDomPresent() { 1140 try { 1141 return !!(document.querySelector('.neo_marketplace_buscador_v3') 1142 || document.querySelector('.px-mk-buscador-container') 1143 || document.querySelector('#search_form') 1144 || document.querySelector('.PartyTypeSimulatorContainer') 1145 || document.querySelector('#fechaingreso')); 1146 } catch (e) { return false; } 1147 } 1148 function wireSearchEventsWhenReady() { 1149 if (window.__px_search_ready_watcher) return; 1150 window.__px_search_ready_watcher = true; 1151 var mo = null; 1152 var stopped = false; 1153 function stop() { 1154 if (stopped) return; 1155 stopped = true; 1156 if (mo) { try { mo.disconnect(); } catch (e) {} mo = null; } 1157 } 1158 function attempt() { 1159 if (stopped) return; 1160 // Chequeo barato primero: sin buscador en el DOM no se toca nada. Evita correr 1161 // `wireSearchEvents()` (que lee bastante DOM) en cada mutacion de una pagina sin motor. 1162 if (!searchDomPresent()) return; 1163 if (!window.__px_search_container_bound || !window.__px_search_form_bound) { 1164 try { wireSearchEvents(); } catch (e) {} 1165 } 1166 if (!window.__px_date_pickers_bound) { 1167 try { wireDatePickers(); } catch (e) {} 1168 } 1169 if (window.__px_search_container_bound && window.__px_search_form_bound) stop(); 1170 } 1171 attempt(); 1172 if (stopped) return; 1173 [200, 500, 1000, 2000, 3000, 5000, 8000, 12000].forEach(function(ms){ 1174 setTimeout(attempt, ms); 1175 }); 1176 setTimeout(stop, 20000); 1177 if ('MutationObserver' in window && document.body) { 1178 try { 1179 mo = new MutationObserver(function(){ 1180 if (stopped || mo.__px_scheduled) return; 1181 mo.__px_scheduled = true; 1182 setTimeout(function(){ if (mo) { mo.__px_scheduled = false; } attempt(); }, 100); 1183 }); 1184 mo.observe(document.body, { childList: true, subtree: true }); 1185 } catch (e) { mo = null; } 1186 } 1187 } 1188 1189 // ----- Form events wiring (generic) ----- 1190 function wireFormEvents() { 1191 var forms = Array.prototype.slice.call(document.querySelectorAll('form:not([data-px-ignore="true"])')); 1192 var observed = new WeakSet(); 1193 1194 // form_view when enters viewport first time 1195 if ('IntersectionObserver' in window) { 1196 var io = new IntersectionObserver(function(entries) { 1197 entries.forEach(function(entry) { 1198 if (entry.isIntersecting && !observed.has(entry.target)) { 1199 observed.add(entry.target); 1200 window.pxTrack('form_view', { 1201 form_id: entry.target.id || entry.target.getAttribute('name') || 'form', 1202 page_url: location.href 1203 }); 1204 } 1205 }); 1206 }, { threshold: 0.2 }); 1207 forms.forEach(function(f){ io.observe(f); }); 1208 } else { 1209 forms.forEach(function(f){ 1210 window.pxTrack('form_view', { form_id: f.id || f.getAttribute('name') || 'form', page_url: location.href }); 1211 }); 1212 } 1213 1214 // form_interaction on field focus 1215 document.addEventListener('focusin', function(e) { 1216 var field = e.target; 1217 var form = field.form; 1218 if (!form) return; 1219 var fieldName = field.name || field.id || field.type || 'field'; 1220 try { 1221 if (field.classList && field.classList.contains('neo_partyselector_quantity')) { 1222 var pt = field.getAttribute('party-type'); 1223 if (pt) fieldName = 'party_' + pt; 1224 } 1225 } catch(e) {} 1226 window.pxTrack('form_interaction', { 1227 form_id: form.id || form.getAttribute('name') || 'form', 1228 field_name: fieldName 1229 }); 1230 }); 1231 1232 // form_submit with privacy-safe flags 1233 forms.forEach(function(form) { 1234 form.addEventListener('submit', function() { 1235 var email = form.querySelector('input[type="email"]'); 1236 var phone = form.querySelector('input[type="tel"], input[name*="phone"], input[name*="telefono"]'); 1237 var required = Array.prototype.slice.call(form.querySelectorAll('[required]')); 1238 var incomplete = required.some(function(el){ return !el.value; }); 1239 window.pxTrack('form_submit', { 1240 form_id: form.id || form.getAttribute('name') || 'form', 1241 page_url: location.href, 1242 fields_status: incomplete ? 'incompletos' : 'completos', 1243 email_provided: bool(email && email.value), 1244 phone_provided: bool(phone && phone.value), 1245 session_id: pxContext.session_id 1246 }); 1247 }, true); 1248 }); 1249 } 1250 // Extra: map clicks/changes on party selector controls to meaningful field_name 1251 (function wirePartySelectorInteractions(){
1252 try { 1253 var lastMs = 0; 1254 function pushPartyInteraction(partyType) { 1255 var now = Date.now(); 1256 if (now - lastMs < 400) return; 1257 lastMs = now; 1258 var form = document.querySelector('#search_form') || document.querySelector('.neo_marketplace_buscador_v3 #pxmk_searchform'); 1259 window.pxTrack('form_interaction', { 1260 form_id: form ? (form.id || form.getAttribute('name') || 'form') : 'form', 1261 field_name: partyType ? ('party_' + partyType) : 'party_selector' 1262 }); 1263 } 1264 document.addEventListener('click', function(e){ 1265 var t = e.target; 1266 if (t && t.classList && t.classList.contains('neo_button_partyselector')) { 1267 pushPartyInteraction(t.getAttribute('party-type') || ''); 1268 } 1269 }, true); 1270 document.addEventListener('change', function(e){ 1271 var t = e.target; 1272 if (t && t.classList && t.classList.contains('neo_partyselector_quantity')) { 1273 pushPartyInteraction(t.getAttribute('party-type') || ''); 1274 } 1275 }, true); 1276 document.addEventListener('input', function(e){ 1277 var t = e.target; 1278 if (t && t.classList && t.classList.contains('neo_partyselector_quantity')) { 1279 pushPartyInteraction(t.getAttribute('party-type') || ''); 1280 } 1281 }, true); 1282 } catch(e) {} 1283 })(); 1284 1285 // Fire specific date interactions (optional) 1286 function wireDatePickers() { 1287 if (window.__px_date_pickers_bound) return; 1288 var inEl = document.querySelector('.neo_marketplace_buscador_v3 #fechaingreso'); 1289 var outEl = document.querySelector('.neo_marketplace_buscador_v3 #fechaegreso'); 1290 // Todavia no llego el buscador: NO se marca como cableado, lo reintenta 1291 // `wireSearchEventsWhenReady()`. 1292 if (!inEl && !outEl) return; 1293 window.__px_date_pickers_bound = true; 1294 if (inEl) inEl.addEventListener('change', function(){ window.pxTrack('start_search', { start_search: inEl.value || '', page_url: location.href }); }); 1295 if (outEl) outEl.addEventListener('change', function(){ window.pxTrack('egreso_search', { egreso_search: outEl.value || '', page_url: location.href }); }); 1296 } 1297 1298 // ----- WhatsApp click tracking (GA4/dataLayer + Meta Pixel "Contact") ----- 1299 // El cliente pidió medir el clic en el botón de WhatsApp como una conversión más. 1300 // Se replica el patrón del resto de los eventos (window.pxTrack -> gtag + dataLayer) y, 1301 // si el POS tiene el pixel cargado (FacebookPixelID), se dispara el evento estándar "Contact". 1302 function wireWhatsappClick() { 1303 if (window.__px_whatsapp_wired) return; 1304 window.__px_whatsapp_wired = true; 1305 1306 var companyId = ''; 1307 var lastWaMs = 0; 1308 1309 function extractPhone(href) { 1310 try { 1311 var m = href.match(/[?&]phone=(\+?\d+)/i); 1312 if (m) return m[1]; 1313 m = href.match(/wa\.me\/(\+?\d+)/i); 1314 if (m) return m[1]; 1315 } catch (e) {} 1316 return ''; 1317 } 1318 1319 // Cualquier <a> hacia WhatsApp (api./web.whatsapp.com o wa.me), incluidos los botones 1320 // flotantes .wsp_floating (neo_social_links / standard_lp_motor) y #checkout_wsp_floating. 1321 function findWhatsappLink(el) { 1322 try { 1323 if (!el || !el.closest) return null; 1324 var a = el.closest('a'); 1325 if (!a) return null; 1326 var href = (a.getAttribute('href') || '').toLowerCase(); 1327 if (/(?:api\.|web\.)?whatsapp\.com|wa\.me/.test(href)) return a; 1328 if (a.closest('.wsp_floating') || a.closest('#checkout_wsp_floating')) return a; 1329 } catch (e) {} 1330 return null; 1331 } 1332 1333 // Delegado en captura: se dispara aunque el módulo re-renderice el botón (los .wsp_floating 1334 // se re-inyectan/mueven al body). target="_blank" mantiene la página viva para los beacons. 1335 document.addEventListener('click', function (e) { 1336 var link = findWhatsappLink(e.target); 1337 if (!link) return; 1338 var now = Date.now(); 1339 if (now - lastWaMs < 800) return; // dedupe de doble-disparo 1340 lastWaMs = now; 1341 1342 var href = link.getAttribute('href') || ''; 1343 var phone = extractPhone(href); 1344 var payload = { 1345 phone: phone, 1346 destination_url: href, 1347 pos: pxContext.pos || '', 1348 product_id: pxContext.product_id || '', 1349 product_name: pxContext.product_name || '', 1350 company_id: companyId || '', 1351 search_id: pxContext.search_id || '', 1352 currency: pxContext.currency || '', 1353 page_url: location.href, 1354 session_id: pxContext.session_id 1355 }; 1356 1357 // GA4 + dataLayer (Google y GTM) 1358 window.pxTrack('whatsapp_click', payload); 1359 1360 // Meta Pixel: evento estándar "Contact". fbq solo existe si el POS tiene FacebookPixelID 1361 // (se inicializa en Conversion_SearchOK.php / PageView), asà que este typeof es el guard. 1362 try { 1363 if (typeof window.fbq === 'function') { 1364 window.fbq('track', 'Contact', { content_name: 'whatsapp', content_category: 'whatsapp_click' }); 1365 } 1366 } catch (e) {} 1367 }, true); 1368 } 1369
1370 // Enrich context from hidden inputs present in LP/consultas templates 1371 function enhanceContextFromHiddenInputs() { 1372 var startRaw = (document.querySelector('#Start') || 1373 document.querySelector('#fechaingreso') || 1374 document.querySelector('[name="Start"]') || { }).value || ''; 1375 var endRaw = (document.querySelector('#End') || 1376 document.querySelector('#fechaegreso') || 1377 document.querySelector('[name="End"]') || { }).value || ''; 1378 var start = normalizeDate(startRaw); 1379 var end = normalizeDate(endRaw); 1380 var sid = (document.querySelector('#SearchID') || {}).value || ''; 1381 var gf = (document.querySelector('#GroupsForm') || {}).value || ''; 1382 var rooms = 0, adults = 0, children = 0; 1383 if (gf) { 1384 gf.split(';').forEach(function(groupStr){ 1385 if (!groupStr) return; 1386 rooms += 1; 1387 var parts = groupStr.split(':'); 1388 if (parts.length < 2) return; 1389 var trio = parts[1].split(','); 1390 var a = parseInt(trio[0] || '0', 10); 1391 adults += isNaN(a) ? 0 : a; 1392 var childrenAges = (trio[1] || '0'); 1393 if (childrenAges && childrenAges !== '0') { 1394 children += childrenAges.split('.').filter(Boolean).length; 1395 } 1396 }); 1397 } 1398 var updated = {}; 1399 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1400 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1401 if (sid && sid !== pxContext.search_id) { pxContext.search_id = sid; updated.search_id = sid; } 1402 if (adults && adults !== pxContext.adults) { pxContext.adults = adults; updated.adults = adults; } 1403 if (children && children !== pxContext.children) { pxContext.children = children; updated.children = children; } 1404 if (rooms && rooms !== pxContext.rooms) { pxContext.rooms = rooms; updated.rooms = rooms; } 1405 if (Object.keys(updated).length) { 1406 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1407 } 1408 } 1409 1410 // Parse GroupsForm like "1:2,0,0;1:1,5.7,0" into {rooms, adults, children} 1411 function parseGroupsForm(gf) { 1412 var out = { rooms: 0, adults: 0, children: 0 };
1413 try { 1414 if (!gf) return out; 1415 String(gf).split(';').forEach(function(groupStr){ 1416 if (!groupStr) return; 1417 out.rooms += 1; 1418 var parts = groupStr.split(':'); 1419 if (parts.length < 2) return; 1420 var trio = parts[1].split(','); 1421 var a = parseInt(trio[0] || '0', 10); 1422 out.adults += isNaN(a) ? 0 : a; 1423 var childrenAges = (trio[1] || '0'); 1424 if (childrenAges && childrenAges !== '0') { 1425 out.children += childrenAges.split('.').filter(Boolean).length; 1426 } 1427 // Babies are not counted in children 1428 }); 1429 } catch (e) {} 1430 return out; 1431 } 1432 1433 // Enrich context from px_jsonQuery (server-rendered Json_Query) when available 1434 function enhanceContextFromPxJson() { 1435 try { 1436 var q = (typeof window !== 'undefined' && window.px_jsonQuery) ? window.px_jsonQuery : (typeof px_jsonQuery !== 'undefined' ? px_jsonQuery : null); 1437 if (!q) return; 1438 var updated = {}; 1439 // SearchID 1440 if (q.SearchID && String(q.SearchID) !== String(pxContext.search_id || '')) { 1441 pxContext.search_id = String(q.SearchID); 1442 updated.search_id = pxContext.search_id; 1443 } 1444 // Dates 1445 var start = normalizeDate(q.Start || ''); 1446 var end = normalizeDate(q.End || ''); 1447 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1448 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1449 // Pax/rooms from GroupsForm or Group array 1450 var paxParsed = null; 1451 if (q.GroupsForm) { 1452 paxParsed = parseGroupsForm(q.GroupsForm); 1453 } else if (q.Group && Array.isArray(q.Group)) { 1454 paxParsed = { rooms: 0, adults: 0, children: 0 }; 1455 q.Group.forEach(function(g){ 1456 paxParsed.rooms += 1; 1457 paxParsed.adults += (g.Adults*1) || 0; 1458 paxParsed.children += (g.Childs*1) || 0; 1459 }); 1460 } 1461 if (paxParsed) { 1462 if (paxParsed.adults && paxParsed.adults !== pxContext.adults) { pxContext.adults = paxParsed.adults; updated.adults = paxParsed.adults; } 1463 if (paxParsed.children && paxParsed.children !== pxContext.children) { pxContext.children = paxParsed.children; updated.children = paxParsed.children; } 1464 if (paxParsed.rooms && paxParsed.rooms !== pxContext.rooms) { pxContext.rooms = paxParsed.rooms; updated.rooms = paxParsed.rooms; } 1465 } 1466 if (Object.keys(updated).length) { 1467 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1468 } 1469 } catch (e) {} 1470 } 1471 1472 // Process API payloads to enrich context 1473 function processApiData(url, data) { 1474 try { 1475 if (!data) return; 1476 // avoid reprocessing same SearchID repeatedly 1477 window.__px_processed_sids = window.__px_processed_sids || {}; 1478 var updated = {}; 1479 var payload = data && data.Json_Query ? data.Json_Query : data; 1480 // SearchID present? 1481 if (typeof payload.SearchID !== 'undefined' && String(payload.SearchID)) { 1482 var sid = String(payload.SearchID); 1483 if (window.__px_processed_sids[sid]) return; 1484 if (sid && sid !== String(pxContext.search_id || '')) { pxContext.search_id = sid; updated.search_id = sid; } 1485 window.__px_processed_sids[sid] = true; 1486 } 1487 // Start / End can exist either top-level or nested 1488 var start = payload.Start || (data && data.Start) || ''; 1489 var end = payload.End || (data && data.End) || ''; 1490 start = normalizeDate(start); 1491 end = normalizeDate(end); 1492 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1493 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1494 // GroupsForm could be present 1495 var gf = payload.GroupsForm || (data && data.GroupsForm) || ''; 1496 if (gf) { 1497 var parsed = parseGroupsForm(gf); 1498 if (parsed.adults && parsed.adults !== pxContext.adults) { pxContext.adults = parsed.adults; updated.adults = parsed.adults; } 1499 if (parsed.children && parsed.children !== pxContext.children) { pxContext.children = parsed.children; updated.children = parsed.children; } 1500 if (parsed.rooms && parsed.rooms !== pxContext.rooms) { pxContext.rooms = parsed.rooms; updated.rooms = parsed.rooms; } 1501 } 1502 // Some APIs include Group arrays; attempt totals 1503 if (payload.Group && Array.isArray(payload.Group)) { 1504 var aT = 0, cT = 0, rT = 0; 1505 payload.Group.forEach(function(g){ 1506 if (!g) return; 1507 rT += 1; 1508 aT += (g.Adults*1) || 0; 1509 cT += (g.Childs*1) || 0; 1510 }); 1511 if (aT && aT !== pxContext.adults) { pxContext.adults = aT; updated.adults = aT; } 1512 if (cT && cT !== pxContext.children) { pxContext.children = cT; updated.children = cT; } 1513 if (rT && rT !== pxContext.rooms) { pxContext.rooms = rT; updated.rooms = rT; } 1514 } 1515 if (Object.keys(updated).length) { 1516 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1517 } 1518 } catch(e) {} 1519 } 1520 1521 // Intercept fetch/XHR to learn from API responses 1522 (function installNetworkTaps(){
1523 try { 1524 var origFetch = window.fetch; 1525 if (origFetch && !window.__px_fetch_hooked) { 1526 window.__px_fetch_hooked = true; 1527 window.fetch = function(input, init) { 1528 var p = origFetch(input, init); 1529 try { 1530 var url = typeof input === 'string' ? input : (input && input.url) || ''; 1531 p.then(function(res){ 1532 try { 1533 var ct = (res.headers && res.headers.get && res.headers.get('content-type')) || ''; 1534 if (ct && ct.indexOf('application/json') !== -1 && (/\/query\/list/i.test(url) || /\/search\/info/i.test(url))) { 1535 res.clone().json().then(function(json){ processApiData(url, json); }).catch(function(){}); 1536 } 1537 } catch(e) {} 1538 }).catch(function(){}); 1539 } catch(e) {} 1540 return p; 1541 }; 1542 } 1543 } catch(e) {} 1544 try { 1545 if (!window.__px_xhr_hooked && window.XMLHttpRequest) { 1546 window.__px_xhr_hooked = true; 1547 var XHR = window.XMLHttpRequest; 1548 var open = XHR.prototype.open; 1549 var send = XHR.prototype.send; 1550 XHR.prototype.open = function(method, url) { 1551 this.__px_url = url; 1552 return open.apply(this, arguments); 1553 }; 1554 XHR.prototype.send = function(body) { 1555 try { 1556 this.addEventListener('load', function() { 1557 try { 1558 var url = this.__px_url || ''; 1559 var ct = this.getResponseHeader && this.getResponseHeader('content-type') || ''; 1560 if (ct && ct.indexOf('application/json') !== -1 && (/\/query\/list/i.test(url) || /\/search\/info/i.test(url))) { 1561 var txt = this.responseText; 1562 try { processApiData(url, JSON.parse(txt)); } catch(e) {} 1563 } 1564 } catch(e) {} 1565 }); 1566 } catch(e) {} 1567 return send.apply(this, arguments); 1568 }; 1569 } 1570 } catch(e) {} 1571 })(); 1572 1573 // If we have SearchID but missing details, fetch /search/info 1574 function fetchSearchInfoIfNeeded() { 1575 try { 1576 var sid = pxContext.search_id || getUrlParam('SearchID') || (document.querySelector('#SearchID')||{}).value || ''; 1577 var needsDates = !(pxContext.start_date && pxContext.end_date); 1578 var needsPaxs = !((pxContext.adults*1) > 0 || (pxContext.children*1) > 0); 1579 if (sid && (needsDates || needsPaxs)) { 1580 fetchSearchInfoForSid(sid); 1581 } 1582 } catch(e) {} 1583 } 1584 1585 // Cached fetch per SearchID 1586 function fetchSearchInfoForSid(sid) { 1587 try { 1588 window.__px_sid_promises = window.__px_sid_promises || {}; 1589 if (window.__px_sid_promises[sid]) return window.__px_sid_promises[sid]; 1590 var endpoint = 'https://api-1-eb-web.pxsol.io/search/info?SearchID=' + encodeURIComponent(sid); 1591 var pr = fetch(endpoint, { credentials: 'omit' }).then(function(res){ 1592 if (!res.ok) return; 1593 var ct = (res.headers && res.headers.get && res.headers.get('content-type')) || ''; 1594 if (ct.indexOf('application/json') === -1) return; 1595 return res.json(); 1596 }).then(function(json){ 1597 if (json) processApiData(endpoint, json); 1598 return true; 1599 }).catch(function(){ return false; }); 1600 window.__px_sid_promises[sid] = pr; 1601 return pr; 1602 } catch(e) { return Promise.resolve(false); } 1603 } 1604 1605 // Ensure dates/paxs are ready before firing a callback 1606 function ensureContextReady(cb) { 1607 try { 1608 // Try quick enrichments first 1609 enhanceContextFromHiddenInputs(); 1610 enhanceContextFromPxJson(); 1611 var sid = pxContext.search_id || getUrlParam('SearchID') || (document.querySelector('#SearchID')||{}).value || ''; 1612 var hasDates = !!(pxContext.start_date && pxContext.end_date); 1613 var hasPaxs = ((pxContext.adults*1) > 0) || ((pxContext.children*1) > 0); 1614 if (hasDates && hasPaxs) { cb(); return; } 1615 if (sid) { 1616 fetchSearchInfoForSid(sid).finally(function(){ cb(); }); 1617 return; 1618 } 1619 // Last resort: try to enrich from DOM then run
1620 enhanceContextFromHiddenInputs(); 1621 cb(); 1622 } catch(e) { cb(); } 1623 } 1624 1625 // Detect "No hay resultados" to push no_inventory automatically 1626 function wireNoInventoryWatcher() { 1627 console.log('%c[pxTrack] ð Initializing no_inventory watcher...', 'color: #2196F3; font-weight: bold; font-size: 14px;'); 1628 console.log('[pxTrack] wireNoInventoryWatcher() called at:', new Date().toISOString()); 1629 var scanCount = 0; 1630 var lastScanResult = null; 1631 var lastSearchID = null; // Track SearchID to detect new searches 1632 var lastScanTime = 0; // For throttling scans 1633 var SCAN_THROTTLE_MS = 1000; // Maximum 1 scan per second 1634 var EVENT_COOLDOWN_MS = 5000; // Minimum 5 seconds between events of the same type 1635 var lastEventTime = {}; // Track last time each event type was fired 1636 var MAX_SCANS_PER_SEARCH = 30; // Maximum scans per search to prevent excessive polling 1637 var __px_has_inventory_pushed = false; // Flag para has_inventory (opuesto de no_inventory) 1638 1639 // Log immediately to confirm function is executing 1640 console.log('[pxTrack] â wireNoInventoryWatcher() is executing - scan function will be defined'); 1641 1642 // Expose scan function to global manual trigger 1643 window.__px_no_inventory_scan_func = function() { 1644 console.log('[pxTrack] Manual scan triggered via global function'); 1645 scan(); 1646 return lastScanResult; 1647 }; 1648 1649 function checkJsonQueryAvailability() { 1650 try { 1651 // Check if px_jsonQuery is available 1652 if (typeof window.px_jsonQuery === 'undefined' || !window.px_jsonQuery) { 1653 return false; 1654 } 1655 1656 var jsonQuery = window.px_jsonQuery; 1657 1658 // Log full structure on first check (for debugging) 1659 if (!window.__px_jsonQuery_logged) { 1660 window.__px_jsonQuery_logged = true; 1661 try { 1662 console.log('[pxTrack] ð¦ px_jsonQuery structure detected:', { 1663 hasProductList: !!(jsonQuery.ProductList), 1664 productListIsArray: Array.isArray(jsonQuery.ProductList), 1665 productListLength: jsonQuery.ProductList ? jsonQuery.ProductList.length : 0, 1666 sampleProduct: jsonQuery.ProductList && jsonQuery.ProductList.length > 0 ? { 1667 hasAvailability: typeof jsonQuery.ProductList[0].Availability !== 'undefined', 1668 availability: jsonQuery.ProductList[0].Availability, 1669 hasSkuList: !!(jsonQuery.ProductList[0].SkuList), 1670 skuListLength: jsonQuery.ProductList[0].SkuList ? jsonQuery.ProductList[0].SkuList.length : 0 1671 } : null 1672 }); 1673 // Log first product details if available 1674 if (jsonQuery.ProductList && jsonQuery.ProductList.length > 0) { 1675 var firstProduct = jsonQuery.ProductList[0]; 1676 console.log('[pxTrack] First product sample:', { 1677 Availability: firstProduct.Availability, 1678 hasSkuList: !!(firstProduct.SkuList), 1679 SkuList: firstProduct.SkuList ? firstProduct.SkuList.map(function(sku) { 1680 return { Availability: sku.Availability }; 1681 }).slice(0, 3) : null 1682 }); 1683 } 1684 } catch(e) { 1685 console.error('[pxTrack] Error logging Json_Query structure:', e); 1686 } 1687 } 1688 1689 // Check if ProductList exists and is an array 1690 if (!jsonQuery.ProductList) { 1691 // ProductList might not be loaded yet, but object exists 1692 return false; 1693 } 1694 1695 if (!Array.isArray(jsonQuery.ProductList)) { 1696 console.warn('[pxTrack] px_jsonQuery.ProductList exists but is not an array:', typeof jsonQuery.ProductList); 1697 return false; 1698 } 1699 1700 if (jsonQuery.ProductList.length === 0) { 1701 // Empty ProductList might indicate no inventory, but we need at least one product to check 1702 return false; 1703 } 1704 1705 // Check if ALL products have Availability === 0 1706 var allZeroAvailability = true; 1707 var availabilityDetails = []; 1708 1709 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 1710 var product = jsonQuery.ProductList[i]; 1711 // Check Availability property (could be at product level or in SkuList) 1712 var productAvailability = product.Availability || 0; 1713 var productHasAvailability = typeof product.Availability !== 'undefined'; 1714 1715 // If product has SkuList, check all SKUs 1716 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 1717 var allSkusZero = true; 1718 var skuAvailabilities = []; 1719 for (var j = 0; j < product.SkuList.length; j++) { 1720 var sku = product.SkuList[j]; 1721 var skuAvail = sku.Availability || 0; 1722 skuAvailabilities.push(skuAvail); 1723 if (sku.Availability && sku.Availability > 0) { 1724 allSkusZero = false;
1725 break; 1726 } 1727 } 1728 availabilityDetails.push({ 1729 productIndex: i, 1730 hasProductAvailability: productHasAvailability, 1731 productAvailability: productAvailability, 1732 hasSkuList: true, 1733 skuAvailabilities: skuAvailabilities, 1734 allSkusZero: allSkusZero 1735 }); 1736 if (!allSkusZero) { 1737 allZeroAvailability = false; 1738 break; 1739 } 1740 } else { 1741 // Product-level availability check 1742 availabilityDetails.push({ 1743 productIndex: i, 1744 hasProductAvailability: productHasAvailability, 1745 productAvailability: productAvailability, 1746 hasSkuList: false 1747 }); 1748 if (productAvailability > 0) { 1749 allZeroAvailability = false; 1750 break; 1751 } 1752 } 1753 } 1754 1755 // Log availability details when checking (first time or when all zero) 1756 if (allZeroAvailability || !window.__px_availability_details_logged) { 1757 window.__px_availability_details_logged = true; 1758 console.log('[pxTrack] Availability check result:', { 1759 allZeroAvailability: allZeroAvailability, 1760 totalProducts: jsonQuery.ProductList.length, 1761 details: availabilityDetails.slice(0, 3) // Show first 3 products 1762 }); 1763 } 1764 1765 return allZeroAvailability; 1766 } catch(e) { 1767 console.error('[pxTrack] Error checking Json_Query availability:', e); 1768 return false; 1769 } 1770 } 1771 1772 function checkJsonQueryHasAvailability() { 1773 try { 1774 // Check if px_jsonQuery is available 1775 if (typeof window.px_jsonQuery === 'undefined' || !window.px_jsonQuery) { 1776 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1777 } 1778 1779 var jsonQuery = window.px_jsonQuery; 1780 1781 // Check if ProductList exists and is an array 1782 if (!jsonQuery.ProductList || !Array.isArray(jsonQuery.ProductList) || jsonQuery.ProductList.length === 0) { 1783 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1784 } 1785 1786 var totalAvailability = 0; 1787 var hasAnyAvailability = false; 1788 var availabilityDetails = []; 1789 1790 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 1791 var product = jsonQuery.ProductList[i]; 1792 var productAvailability = product.Availability || 0; 1793 var productTotal = 0; 1794 1795 // If product has SkuList, sum all SKU availabilities 1796 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 1797 for (var j = 0; j < product.SkuList.length; j++) { 1798 var sku = product.SkuList[j]; 1799 var skuAvail = sku.Availability || 0; 1800 productTotal += skuAvail; 1801 if (skuAvail > 0) { 1802 hasAnyAvailability = true; 1803 } 1804 } 1805 } else { 1806 // Product-level availability 1807 productTotal = productAvailability; 1808 if (productAvailability > 0) { 1809 hasAnyAvailability = true; 1810 } 1811 } 1812 1813 totalAvailability += productTotal; 1814 availabilityDetails.push({ 1815 productIndex: i, 1816 productAvailability: productAvailability, 1817 productTotal: productTotal, 1818 hasSkuList: !!(product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) 1819 }); 1820 } 1821 1822 return { 1823 hasAvailability: hasAnyAvailability, 1824 totalAvailability: totalAvailability, 1825 availabilityDetails: availabilityDetails, 1826 productCount: jsonQuery.ProductList.length 1827 }; 1828 } catch(e) { 1829 console.error('[pxTrack] Error checking Json_Query for availability:', e); 1830 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1831 } 1832 } 1833 1834 function scan() { 1835 // THROTTLING: Evitar escaneos muy frecuentes 1836 var now = Date.now(); 1837 if (now - lastScanTime < SCAN_THROTTLE_MS) { 1838 console.debug('[pxTrack] scan() throttled (too soon after last scan)'); 1839 return; 1840 } 1841 lastScanTime = now; 1842 1843 // Check if SearchID changed (new search) - if so, reset the flag 1844 try { 1845 var currentSearchID = null; 1846 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery && window.px_jsonQuery.SearchID) { 1847 currentSearchID = String(window.px_jsonQuery.SearchID); 1848 } else { 1849 var searchIDEl = document.querySelector('#SearchID'); 1850 if (searchIDEl && searchIDEl.value) { 1851 currentSearchID = String(searchIDEl.value); 1852 } else { 1853 try {
1854 var urlParams = new URLSearchParams(location.search); 1855 currentSearchID = urlParams.get('SearchID') || null; 1856 } catch(e) {} 1857 } 1858 } 1859 1860 // If SearchID changed, reset the flags for new search 1861 if (currentSearchID && currentSearchID !== lastSearchID && lastSearchID !== null) { 1862 console.log('[pxTrack] ð New search detected (SearchID: ' + lastSearchID + ' â ' + currentSearchID + '), resetting flags'); 1863 window.__px_no_inventory_pushed = false; 1864 __px_has_inventory_pushed = false; 1865 scanCount = 0; // Reset scan count 1866 lastScanTime = 0; // Reset throttling for new search 1867 } 1868 1869 // Update lastSearchID 1870 if (currentSearchID) { 1871 lastSearchID = currentSearchID; 1872 } 1873 } catch(e) { 1874 console.error('[pxTrack] Error checking SearchID:', e); 1875 } 1876 1877 // Don't scan if event already fired (unless we just reset it) 1878 if (window.__px_no_inventory_pushed) { 1879 console.debug('[pxTrack] scan() called but event already fired, skipping'); 1880 return; 1881 } 1882 1883 // LÃmite máximo de escaneos por búsqueda 1884 if (scanCount >= MAX_SCANS_PER_SEARCH) { 1885 console.debug('[pxTrack] scan() skipped - maximum scans per search reached (' + MAX_SCANS_PER_SEARCH + ')'); 1886 return; 1887 } 1888 1889 scanCount++; 1890 // Log first few scans to confirm function is working 1891 if (scanCount <= 5) { 1892 console.log('[pxTrack] scan() executing - Scan #' + scanCount); 1893 } 1894 var shouldFire = false; 1895 var detectionMethod = ''; 1896 var debugInfo = { 1897 scanNumber: scanCount, 1898 px_jsonQuery_exists: typeof window.px_jsonQuery !== 'undefined' && !!window.px_jsonQuery, 1899 productList_length: 0, 1900 productList_details: [] 1901 }; 1902 1903 // Method 1: Check px_jsonQuery.ProductList for all Availability === 0 1904 try { 1905 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 1906 debugInfo.productList_length = (window.px_jsonQuery.ProductList && Array.isArray(window.px_jsonQuery.ProductList)) ? window.px_jsonQuery.ProductList.length : 0; 1907 1908 if (checkJsonQueryAvailability()) { 1909 shouldFire = true; 1910 detectionMethod = 'Json_Query'; 1911 try { 1912 console.log('%c[pxTrack] â no_inventory DETECTED via Json_Query (all Availability === 0) - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1913 } catch(_e){} 1914 } else { 1915 // Log details about why it didn't fire 1916 try { 1917 if (window.px_jsonQuery.ProductList && Array.isArray(window.px_jsonQuery.ProductList)) { 1918 var productDetails = []; 1919 for (var idx = 0; idx < Math.min(window.px_jsonQuery.ProductList.length, 3); idx++) { 1920 var p = window.px_jsonQuery.ProductList[idx]; 1921 var prodAvail = p.Availability || 0; 1922 var skuAvail = 'N/A'; 1923 if (p.SkuList && Array.isArray(p.SkuList) && p.SkuList.length > 0) { 1924 var skuAvails = []; 1925 for (var skuIdx = 0; skuIdx < p.SkuList.length; skuIdx++) { 1926 skuAvails.push(p.SkuList[skuIdx].Availability || 0); 1927 } 1928 skuAvail = skuAvails.join(','); 1929 } 1930 productDetails.push({productAvail: prodAvail, skuAvail: skuAvail}); 1931 } 1932 debugInfo.productList_details = productDetails; 1933 } 1934 } catch(e) {} 1935 } 1936 } 1937 } catch(e) { 1938 console.error('[pxTrack] Error in Json_Query availability check:', e); 1939 } 1940 1941 // Method 2: Check for specific DOM elements (most reliable) 1942 if (!shouldFire) { 1943 try { 1944 // Check for #no-inventory-container or #no-inventory (from sindispo.php) 1945 var noInventoryContainer = document.querySelector('#no-inventory-container'); 1946 var noInventoryElement = document.querySelector('#no-inventory'); 1947 if (noInventoryContainer || noInventoryElement) { 1948 shouldFire = true; 1949 detectionMethod = 'DOM element (ID)'; 1950 try { 1951 console.log('%c[pxTrack] â no_inventory DETECTED via DOM element (#no-inventory-container or #no-inventory) - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1952 console.log('[pxTrack] DOM elements found:', { 1953 hasContainer: !!noInventoryContainer, 1954 hasElement: !!noInventoryElement, 1955 containerVisible: noInventoryContainer ? (noInventoryContainer.offsetParent !== null) : false, 1956 elementText: noInventoryElement ? (noInventoryElement.textContent || noInventoryElement.innerText || '').substring(0, 50) : '' 1957 }); 1958 } catch(_e){} 1959 } else if (scanCount <= 3 || scanCount % 10 === 0) { 1960 // Log when elements are not found (for debugging) 1961 try { 1962 console.debug('[pxTrack] DOM check: #no-inventory-container and #no-inventory not found (scan #' + scanCount + ')'); 1963 } catch(_e){} 1964 } 1965 } catch(e) { 1966 console.error('[pxTrack] Error in DOM element check:', e); 1967 } 1968 } 1969 1970 // Method 3: Fallback - Check DOM text for "No hay resultados" or "No results" 1971 if (!shouldFire) { 1972 try { 1973 var candidates = Array.prototype.slice.call(document.querySelectorAll('body *')); 1974 for (var i=0; i<candidates.length; i++) { 1975 var t = (candidates[i].innerText || '').trim(); 1976 if (!t) continue; 1977 if (t.indexOf('No hay resultados') !== -1 || t.indexOf('No results') !== -1) { 1978 shouldFire = true; 1979 detectionMethod = 'DOM text'; 1980 try { 1981 console.log('%c[pxTrack] â no_inventory DETECTED via DOM text - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1982 } catch(_e){} 1983 break; 1984 } 1985 } 1986 } catch(e) { 1987 console.error('[pxTrack] Error in DOM text check:', e); 1988 } 1989 } 1990 1991 // Store last scan result for debugging 1992 lastScanResult = { 1993 shouldFire: shouldFire, 1994 method: detectionMethod, 1995 scanCount: scanCount, 1996 px_jsonQuery_exists: debugInfo.px_jsonQuery_exists, 1997 productList_length: debugInfo.productList_length, 1998 productList_details: debugInfo.productList_details 1999 }; 2000 2001 // Log scan details every 5th scan or when px_jsonQuery becomes available 2002 if (scanCount % 5 === 0 || (debugInfo.px_jsonQuery_exists && scanCount <= 3)) { 2003 try { 2004 console.log('[pxTrack] no_inventory scan #' + scanCount + ':', { 2005 px_jsonQuery_exists: debugInfo.px_jsonQuery_exists, 2006 productList_length: debugInfo.productList_length, 2007 shouldFire: shouldFire, 2008 method: detectionMethod 2009 }); 2010 if (debugInfo.productList_details.length > 0) { 2011 console.log('[pxTrack] Sample product availability:', debugInfo.productList_details); 2012 } 2013 } catch(_e){} 2014 } 2015 2016 if (shouldFire && !window.__px_no_inventory_pushed) { 2017 // COOLDOWN: Verificar que no se haya disparado recientemente 2018 var eventType = 'no_inventory'; 2019 var now = Date.now(); 2020 if (lastEventTime[eventType] && (now - lastEventTime[eventType] < EVENT_COOLDOWN_MS)) { 2021 console.log('[pxTrack] â¸ï¸ Event cooldown active, skipping no_inventory event (last fired ' + Math.round((now - lastEventTime[eventType]) / 1000) + 's ago)'); 2022 return; 2023 } 2024 2025 window.__px_no_inventory_pushed = true; 2026 lastEventTime[eventType] = now; // Registrar tiempo del evento 2027 2028 // Ensure dates/paxs are enriched before sending 2029 ensureContextReady(function(){ 2030 var params = getSearchParamsFromDOM(); 2031 params.no_inventory = true; 2032 try { 2033 console.log('%c[pxTrack] ð FIRING no_inventory event - Detection method: ' + detectionMethod + ' - Scan #' + scanCount, 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2034 console.log('[pxTrack] no_inventory payload:', params); 2035 console.log('[pxTrack] Last scan result:', lastScanResult); 2036 } catch(_e){} 2037 window.pxTrack('no_inventory', params); 2038 2039 // Fire form_success for search form after no_inventory 2040 setTimeout(function() { 2041 console.log('%c[pxTrack] ð FIRING form_success for search form (after no_inventory)', 'color: #4CAF50; font-weight: bold;'); 2042 window.pxTrack('form_success', { 2043 form_id: 'pxmk_searchform', 2044 lead_id: null, 2045 transaction_id: null 2046 }); 2047 }, 100); 2048 }); 2049 } 2050 2051 // OPPOSITE: Check if there IS availability (has_inventory) 2052 // Only check if no_inventory was NOT detected and has_inventory hasn't been fired yet 2053 if (!shouldFire && !__px_has_inventory_pushed && !window.__px_no_inventory_pushed) { 2054 try { 2055 // Also verify that no "no inventory" DOM elements are present 2056 var noInventoryContainer = document.querySelector('#no-inventory-container'); 2057 var noInventoryElement = document.querySelector('#no-inventory'); 2058 var hasNoInventoryDOM = !!(noInventoryContainer || noInventoryElement); 2059 2060 if (hasNoInventoryDOM) { 2061 console.debug('[pxTrack] has_inventory blocked - no inventory DOM elements present'); 2062 } else { 2063 var availabilityInfo = checkJsonQueryHasAvailability(); 2064 2065 if (availabilityInfo.hasAvailability) { 2066 // COOLDOWN: Verificar que no se haya disparado recientemente 2067 var eventType = 'has_inventory'; 2068 var now = Date.now(); 2069 if (lastEventTime[eventType] && (now - lastEventTime[eventType] < EVENT_COOLDOWN_MS)) { 2070 console.log('[pxTrack] â¸ï¸ Event cooldown active, skipping has_inventory event (last fired ' + Math.round((now - lastEventTime[eventType]) / 1000) + 's ago)'); 2071 } else { 2072 2073 __px_has_inventory_pushed = true; 2074 lastEventTime[eventType] = now; 2075 2076 // Ensure dates/paxs are enriched before sending 2077 ensureContextReady(function(){ 2078 var params = getSearchParamsFromDOM(); 2079 params.has_availability = true; 2080 params.availability = availabilityInfo.totalAvailability; 2081 params.product_count = availabilityInfo.productC
2081ount || 0; 2082 2083 // Add SearchID if available 2084 try { 2085 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery && window.px_jsonQuery.SearchID) { 2086 params.search_id = String(window.px_jsonQuery.SearchID); 2087 } 2088 } catch(e) {} 2089 2090 // Add availability details (first 3 products for debugging) 2091 if (availabilityInfo.availabilityDetails && availabilityInfo.availabilityDetails.length > 0) { 2092 params.availability_details = availabilityInfo.availabilityDetails.slice(0, 3).map(function(detail) { 2093 return { 2094 product_index: detail.productIndex, 2095 availability: detail.productTotal, 2096 has_skus: detail.hasSkuList 2097 }; 2098 }); 2099 } 2100 2101 try { 2102 console.log('%c[pxTrack] ð FIRING has_inventory event (availability detected) - Scan #' + scanCount, 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2103 console.log('[pxTrack] has_inventory payload:', params); 2104 console.log('[pxTrack] Availability info:', { 2105 totalAvailability: availabilityInfo.totalAvailability, 2106 productCount: availabilityInfo.productCount, 2107 hasAvailability: availabilityInfo.hasAvailability 2108 }); 2109 } catch(_e){} 2110 window.pxTrack('has_inventory', params); 2111 2112 // Fire form_success for search form after has_inventory 2113 setTimeout(function() { 2114 console.log('%c[pxTrack] ð FIRING form_success for search form (after has_inventory)', 'color: #4CAF50; font-weight: bold;'); 2115 window.pxTrack('form_success', { 2116 form_id: 'pxmk_searchform', 2117 lead_id: null, 2118 transaction_id: null 2119 }); 2120 }, 100); 2121 }); 2122 } 2123 } 2124 } 2125 } catch(e) { 2126 console.error('[pxTrack] Error checking for availability (has_inventory):', e); 2127 } 2128 } 2129 } 2130 2131 // Try to intercept px_jsonQuery assignment (works if px_jsonQuery is undefined) 2132 try { 2133 if (typeof window.px_jsonQuery === 'undefined') { 2134 try { 2135 var _px_jsonQuery_value = undefined; 2136 var _px_jsonQuery_lastTrigger = 0; 2137 Object.defineProperty(window, 'px_jsonQuery', { 2138 get: function() { return _px_jsonQuery_value; }, 2139 set: function(newValue) { 2140 _px_jsonQuery_value = newValue; 2141 if (newValue) { 2142 try { 2143 // Throttle interceptor triggers (máximo 1 cada 1 segundo) 2144 var now = Date.now(); 2145 if (now - _px_jsonQuery_lastTrigger < 1000) { 2146 console.debug('[pxTrack] px_jsonQuery interceptor throttled'); 2147 return; 2148 } 2149 _px_jsonQuery_lastTrigger = now; 2150 console.log('[pxTrack] px_jsonQuery was set via Object.defineProperty, triggering scan'); 2151 setTimeout(function() { scan(); }, 150); 2152 } catch(e) { 2153 console.error('[pxTrack] Error in triggerScan:', e); 2154 } 2155 } 2156 }, 2157 configurable: true, 2158 enumerable: true 2159 }); 2160 } catch(e) { 2161 console.error('[pxTrack] Object.defineProperty failed for px_jsonQuery:', e); 2162 } 2163 } 2164 } catch(e) { 2165 console.error('[pxTrack] Error setting up px_jsonQuery interception:', e); 2166 } 2167 2168 // Multiple initial scans with increasing delays (for Chrome compatibility) 2169 function runInitialScans() { 2170 console.log('%c[pxTrack] Starting initial scans for no_inventory detection...', 'color: #FF9800; font-weight: bold;'); 2171 console.log('[pxTrack] runInitialScans() called - will execute multiple scans'); 2172 // Immediate scan 2173 console.log('[pxTrack] Executing immediate scan...'); 2174 scan(); 2175 // Delayed scans to catch px_jsonQuery if it loads later AND DOM elements that load dynamically 2176 setTimeout(function() { scan(); }, 200); 2177 setTimeout(function() { scan(); }, 500); 2178 setTimeout(function() { scan(); }, 1000); 2179 setTimeout(function() { scan(); }, 2000); 2180 setTimeout(function() { scan(); }, 3000); 2181 setTimeout(function() { scan(); }, 5000); 2182 } 2183 2184 // Run initial scans after DOM is ready 2185 if (document.readyState === 'loading') { 2186 console.log('[pxTrack] DOM is loading, will wait for DOMContentLoaded'); 2187 document.addEventListener('DOMContentLoaded', function() { 2188 console.log('[pxTrack] DOMContentLoaded fired, scheduling runInitialScans() in 100ms'); 2189 setTimeout(function() { 2190 console.log('[pxTrack] Executing runInitialScans() now...'); 2191 runInitialScans(); 2192 }, 100); 2193 }); 2194 } else { 2195 console.log('[pxTrack] DOM already ready, scheduling runInitialScans() in 100ms'); 2196 setTimeout(function() { 2197 console.log('[pxTrack] Executing runInitialScans() now...'); 2198 runInitialScans(); 2199 }, 100); 2200 } 2201 2202 // Also use requestAnimationFrame for Chrome (ensures DOM is painted) 2203 if (window.requestAnimationFrame) { 2204 requestAnimationFrame(function() { 2205 setTimeout(function() { scan(); }, 500); 2206 }); 2207 } 2208 2209 // Watch for px_jsonQuery availability (reduced polling frequency to prevent rate limiting) 2210 var jsonQueryCheckStart = Date.now(); 2211 var jsonQueryCheckTimeout = 20000; // 20 seconds 2212 var jsonQueryCheckInterval = setInterval(function() { 2213 // Stop if timeout reached 2214 if (Date.now() - jsonQueryCheckStart > jsonQueryCheckTimeout) { 2215 clearInterval(jsonQueryCheckInterval); 2216 try { 2217 console.log('[pxTrack] no_inventory px_jsonQuery polling timed out after', scanCount, 'scans'); 2218 console.log('[pxTrack] Last scan result:', lastScanResult); 2219 } catch(_e){} 2220 return; 2221 } 2222 2223 // Stop if event already fired 2224 if (window.__px_no_inventory_pushed) { 2225 clearInterval(jsonQueryCheckInterval); 2226 return; 2227 } 2228 2229 // Check if px_jsonQuery is now available and scan 2230 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 2231 scan(); 2232 } 2233 }, 1000); // Reduced to 1 second to prevent rate limiting 2234 2235 // Watch DOM changes and specifically look for #no-inventory-container or #no-inventory
2236 try { 2237 var mo = new MutationObserver(function(mutations) { 2238 if (window.__px_no_inventory_pushed) return; 2239 2240 // Throttling más agresivo para MutationObserver (2 segundos mÃnimo) 2241 var now = Date.now(); 2242 if (mo.__px_lastScan && (now - mo.__px_lastScan < 2000)) { 2243 return; 2244 } 2245 2246 // Check if any of the mutations added our target elements 2247 var foundTarget = false; 2248 for (var i = 0; i < mutations.length; i++) { 2249 var mutation = mutations[i]; 2250 if (mutation.addedNodes && mutation.addedNodes.length > 0) { 2251 for (var j = 0; j < mutation.addedNodes.length; j++) { 2252 var node = mutation.addedNodes[j]; 2253 if (node.nodeType === 1) { // Element node 2254 // Check if the added node is our target or contains it 2255 if (node.id === 'no-inventory-container' || node.id === 'no-inventory' || 2256 node.querySelector && (node.querySelector('#no-inventory-container') || node.querySelector('#no-inventory'))) { 2257 foundTarget = true; 2258 break; 2259 } 2260 } 2261 } 2262 } 2263 if (foundTarget) break; 2264 } 2265 2266 // If target found or if enough time passed, scan 2267 if (foundTarget || !mo.__px_lastScan || Date.now() - mo.__px_lastScan > 2000) { 2268 mo.__px_lastScan = Date.now(); 2269 if (foundTarget) { 2270 console.log('[pxTrack] MutationObserver detected #no-inventory-container or #no-inventory added to DOM'); 2271 } 2272 scan(); 2273 } 2274 }); 2275 mo.observe(document.body, { childList: true, subtree: true }); 2276 } catch(e) { 2277 console.error('[pxTrack] MutationObserver failed for no_inventory:', e); 2278 } 2279 2280 // Additional polling specifically for DOM elements (reduced frequency to prevent rate limiting) 2281 var domPollingStart = Date.now(); 2282 var domPollingTimeout = 15000; // 15 seconds 2283 var domPollingInterval = setInterval(function() { 2284 if (Date.now() - domPollingStart > domPollingTimeout) { 2285 clearInterval(domPollingInterval); 2286 return; 2287 } 2288 2289 if (window.__px_no_inventory_pushed) { 2290 clearInterval(domPollingInterval); 2291 return; 2292 } 2293 2294 // Quick check for target elements 2295 var noInventoryContainer = document.querySelector('#no-inventory-container'); 2296 var noInventoryElement = document.querySelector('#no-inventory'); 2297 if (noInventoryContainer || noInventoryElement) { 2298 console.log('[pxTrack] DOM polling detected #no-inventory-container or #no-inventory'); 2299 scan(); 2300 clearInterval(domPollingInterval); 2301 } 2302 }, 1000); // Reduced to 1 second to prevent rate limiting 2303 2304 // Confirm watcher is fully initialized 2305 console.log('%c[pxTrack] â no_inventory watcher fully initialized and ready', 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2306 console.log('[pxTrack] wireNoInventoryWatcher() completed at:', new Date().toISOString()); 2307 console.log('[pxTrack] All watchers, observers, and polling intervals are now active'); 2308 } 2309 2310 // Observe availability containers to re-enrich context after dynamic updates 2311 function observeAvailabilityContainers() { 2312 try { 2313 var targets = []; 2314 var el1 = document.querySelector('#neo_cart_results_list'); 2315 var el2 = document.querySelector('#neo_cart_pedido_container'); 2316 if (el1) targets.push(el1); 2317 if (el2) targets.push(el2); 2318 if (!targets.length || !('MutationObserver' in window)) return; 2319 var refresh = function() { 2320 enhanceContextFromHiddenInputs(); 2321 enhanceContextFromPxJson(); 2322 }; 2323 var mo = new MutationObserver(function(muts) { 2324 // throttle bursts 2325 if (mo.__px_scheduled) return; 2326 mo.__px_scheduled = true;
2327 setTimeout(function(){ mo.__px_scheduled = false; refresh(); }, 100); 2328 }); 2329 targets.forEach(function(t){ mo.observe(t, { childList: true, subtree: true }); }); 2330 // initial pass 2331 refresh(); 2332 } catch (e) {} 2333 } 2334 2335 // Init after DOM ready - LOG EARLY AND OFTEN 2336 console.log('%c[pxTrack] STEP 1: Checking DOM readyState...', 'color: #9C27B0; font-weight: bold; font-size: 14px;'); 2337 console.log('[pxTrack] document.readyState:', document.readyState); 2338 console.log('[pxTrack] wireNoInventoryWatcher function exists:', typeof wireNoInventoryWatcher); 2339 2340 if (document.readyState === 'loading') { 2341 console.log('%c[pxTrack] STEP 2: DOM is loading, setting up DOMContentLoaded listener', 'color: #9C27B0; font-weight: bold;'); 2342 document.addEventListener('DOMContentLoaded', function() { 2343 console.log('%c[pxTrack] STEP 3: DOMContentLoaded fired!', 'color: #9C27B0; font-weight: bold; font-size: 16px;'); 2344 console.log('[pxTrack] DOMContentLoaded fired, initializing watchers...'); 2345 try { 2346 wireSearchFallbacks(); 2347 wireSearchEventsWhenReady(); 2348 wireFormEvents(); 2349 wireWhatsappClick(); 2350 if (typeof wireCheckoutForm === 'function') { 2351 wireCheckoutForm(); 2352 } else { 2353 console.log('[pxTrack] wireCheckoutForm() not available (may be conditional)'); 2354 } 2355 wireDatePickers(); 2356 enhanceContextFromHiddenInputs(); 2357 enhanceContextFromPxJson(); 2358 fetchSearchInfoIfNeeded(); 2359 console.log('%c[pxTrack] STEP 4: About to call wireNoInventoryWatcher()...', 'color: #FF5722; font-weight: bold; font-size: 16px;'); 2360 try { 2361 wireNoInventoryWatcher(); 2362 console.log('%c[pxTrack] STEP 5: wireNoInventoryWatcher() completed successfully!', 'color: #4CAF50; font-weight: bold; font-size: 16px;'); 2363 } catch(e) { 2364 console.error('[pxTrack] ERROR calling wireNoInventoryWatcher():', e); 2365 console.error('[pxTrack] Error stack:', e.stack); 2366 } 2367 observeAvailabilityContainers(); 2368 // delayed retries in case modules/scripts load late 2369 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 500); 2370 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 1500); 2371 // checkout success detector (thank-you page) - multiple attempts with delays 2372 if (typeof maybePushFormSuccess === 'function') { 2373 maybePushFormSuccess(); // Immediate 2374 setTimeout(function(){ maybePushFormSuccess(); }, 500); // After 500ms 2375 setTimeout(function(){ maybePushFormSuccess(); }, 1500); // After 1.5s 2376 setTimeout(function(){ maybePushFormSuccess(); }, 3000); // After 3s (for slow loading pages) 2377 } 2378 } catch(e) { 2379 console.error('[pxTrack] Error during initialization:', e); 2380 } 2381 }); 2382 } else { 2383 console.log('%c[pxTrack] STEP 2: DOM already ready, initializing immediately', 'color: #9C27B0; font-weight: bold;'); 2384 console.log('[pxTrack] DOM already ready, initializing watchers immediately...'); 2385 try { 2386 wireSearchFallbacks(); 2387 wireSearchEventsWhenReady(); 2388 wireFormEvents(); 2389 wireWhatsappClick(); 2390 if (typeof wireCheckoutForm === 'function') { 2391 wireCheckoutForm(); 2392 } else { 2393 console.log('[pxTrack] wireCheckoutForm() not available (may be conditional)'); 2394 } 2395 wireDatePickers(); 2396 enhanceContextFromHiddenInputs(); 2397 enhanceContextFromPxJson(); 2398 fetchSearchInfoIfNeeded(); 2399 console.log('%c[pxTrack] STEP 4: About to call wireNoInventoryWatcher()...', 'color: #FF5722; font-weight: bold; font-size: 16px;'); 2400 try { 2401 wireNoInventoryWatcher(); 2402 console.log('%c[pxTrack] STEP 5: wireNoInventoryWatcher() completed successfully!', 'color: #4CAF50; font-weight: bold; font-size: 16px;'); 2403 } catch(e) { 2404 console.error('[pxTrack] ERROR calling wireNoInventoryWatcher():', e); 2405 console.error('[pxTrack] Error stack:', e.stack); 2406 } 2407 observeAvailabilityContainers();
2408 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 500); 2409 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 1500); 2410 // checkout success detector (thank-you page) - multiple attempts with delays 2411 if (typeof maybePushFormSuccess === 'function') { 2412 maybePushFormSuccess(); // Immediate 2413 setTimeout(function(){ maybePushFormSuccess(); }, 500); // After 500ms 2414 setTimeout(function(){ maybePushFormSuccess(); }, 1500); // After 1.5s 2415 setTimeout(function(){ maybePushFormSuccess(); }, 3000); // After 3s (for slow loading pages) 2416 } 2417 } catch(e) { 2418 console.error('[pxTrack] Error during initialization:', e); 2419 console.error('[pxTrack] Error stack:', e.stack); 2420 } 2421 } 2422 })(); 2423</script>
2423 2424 2425 2426<!-- Google Tag Manager -->
2427<script>
vendor: 436 bytes, lines 2427-2441
2427 2428 (function(w, d, s, l, i) { 2429 w[l] = w[l] || []; 2430 w[l].push({ 2431 'gtm.start': new Date().getTime(), 2432 event: 'gtm.js' 2433 }); 2434 var f = d.getElementsByTagName(s)[0], 2435 j = d.createElement(s), 2436 dl = l != 'dataLayer' ? '&l=' + l : ''; 2437 j.async = true; 2438 j.src = 2439 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 2440 f.parentNode.insertBefore(j, f); 2441 })(window, document, 'script', 'dataLayer', '
2441GTM-TPTNCNX
vendor: 4 bytes, line 2441
2441');
2442</script>
2442 2443<!-- End Google Tag Manager --> 2444 2445 2446 2447 2448
2448<script src='https://www.thehotelsnetwork.com/js/loader.js?property_id=1038040&account_key=98150CE80D67D53EB87BC01C7D75453C' async></script>
2448 2449</head> 2450 2451<body> 2452 <!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 2452-2453
2452 2453 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
2453GTM-TPTNCNX
vendor: 84 bytes, lines 2453-2454
2453" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 2454
2454<!-- End Google Tag Manager (noscript) --> 2455 2456 2457 2458 2459 <div class="neo_loader"> 2460 <style> 2461 .linear-activity { 2462 overflow: hidden; 2463 width: 100%; 2464 height: 4px; 2465 background-color: #B3E5FC; 2466 margin: 0 2467 } 2468 2469 .determinate { 2470 position: relative; 2471 max-width: 100%; 2472 height: 100%; 2473 -webkit-transition: width .5s ease-out 1s; 2474 -moz-transition: width .5s ease-out 1s; 2475 -o-transition: width .5s ease-out 1s; 2476 transition: width .5s ease-out 1s; 2477 background-color: #03A9F4 2478 } 2479 2480 .indeterminate { 2481 position: relative; 2482 width: 100%; 2483 height: 100% 2484 } 2485 2486 .indeterminate:after, 2487 .indeterminate:before { 2488 content: ''; 2489 position: absolute; 2490 height: 100% 2491 } 2492 2493 .indeterminate:before { 2494 background-color: #03A9F4; 2495 animation: indeterminate_first 1.5s infinite ease-out 2496 } 2497 2498 .indeterminate:after { 2499 background-color: #4FC3F7; 2500 animation: indeterminate_second 1.5s infinite ease-in 2501 } 2502 2503 @keyframes indeterminate_first { 2504 0% { 2505 left: -100%; 2506 width: 100% 2507 } 2508 2509 100% { 2510 left: 100%; 2511 width: 10% 2512 } 2513 } 2514 2515 @keyframes indeterminate_second { 2516 0% { 2517 left: -150%; 2518 width: 100% 2519 } 2520 2521 100% { 2522 left: 100%; 2523 width: 10% 2524 } 2525 } 2526 2527 .neo_loader { 2528 position: fixed; 2529 top: 0; 2530 left: 0; 2531 right: 0; 2532 bottom: 0; 2533 z-index: 9999999999999999999999; 2534 background: #fff; 2535 height: 100vh; 2536 width: 100vw; 2537 display: flex; 2538 flex-direction: column; 2539 justify-content: center; 2540 align-items: center; 2541 padding: 40px; 2542 box-sizing: border-box; 2543 text-align: center; 2544 } 2545 2546 .neo_loader .loaderline { 2547 width: 400px; 2548 margin: 40px; 2549 max-width: 90vw 2550 } 2551 2552 .loadername { 2553 color: #bbb; 2554 font-family: Helvetica, Arial, sans-serif; 2555 margin: 10px auto 15px 2556 } 2557 2558 .linear-activity.gray { 2559 background-color: #eaeaea 2560 } 2561 2562 .gray .indeterminate:after, 2563 .gray .indeterminate:before { 2564 background-color: #bbb 2565 } 2566 2567 .neo_megacontainer { 2568 display: none 2569 } 2570 </style> 2571 2572 <img loading="lazy" style=" max-height: 200px; max-width: 200px; object-fit: contain; margin-bottom: 20px;" src="https://files-p.pxsol.com/68/company/library/user/181438789186709c06ec3b520fccf0dc4d0a0285e1e.png" alt="Sarmiento Palace Hotel"> 2573 <div class="loadername"> 2574 Sarmiento Palace Hotel </div> 2575 <div class="loaderline"> 2576 <div class="linear-activity gray"> 2577 <div class="indeterminate"></div> 2578 </div> 2579 </div> 2580 </div> 2581 2582 <div class="neo_megacontainer index"> 2583 2584 2585 2586 2587 2588<div class="main_wraper_top" id="main_wraper_top"> 2589 2590 2591<div class="neo_template_container neo_template_ computer"> 2592 2593 2594<div id='normalheader' class="navbar-fullwidth normalheader" ><div class="fullwidth flex flex-m-sb flex-s-center padding-xs-5" ><div class='xs-50' ><div class='pxModule_include ModuloWrap_idiomas '><div id="top_menu"> 2595 2596 <div id="contenedor_top"> 2597 <div id="menu_div_top"> 2598 <div class="nav_top flex flex-s-center"> 2599 2600 <a href="/pt/app/" ignorar-vista="true" target="_blank" class="btn_sesion cta_webcheckin_px"> 2601 <i class="mdi mdi-login" aria-hidden="true"></i> 2602 <span> 2603 Check-in online </span> 2604 </a> 2605 2606 <div class="selectidiomaymoneda"> 2607 <div class="currency_module_container" > 2608 <input type="hidden" id='ModuloIdioma_DefaultCurrency' value="ARS"> 2609 <input type="hidden" id="ModuloIdioma_BookingEngineVersion" value="8"> 2610 <div class="texto_idiomaymoneda"> 2611 moeda - </div> 2612 <div id="deploymoneda" class="pointer deploymoneda" > 2613 <div class="monedaactual hidden" cur="ARS"> 2614 ARS $ </div> 2615 <div class="monedaactual hidden" cur="USD"> 2616 USD $ </div> 2617 </div> 2618 <div id="monedasshow" class="monedasshow"> 2619 <div class="titlemenujs"> 2620 Escolha a moeda de sua preferência </div> 2621 <div class="monedaitem changeCurrency hidden" cur="ARS"> 2622 <strong>ARS $</strong> 2623 <div class="monedasname"> 2624 Peso argentino </div> 2625 </div> 2626 <div class="monedaitem changeCurrency hidden" cur="USD"> 2627 <strong>USD $</strong> 2628 <div class="monedasname"> 2629 Dólar americano </div> 2630 </div> 2631 </div> 2632 2633 </div> 2634 <div class="texto_idiomaymoneda"> 2635 LÃngua - </div> 2636 2637 2638 <div id="deployidioma" class="deployidioma"> 2639 <img alt="Bandeira" style="object-fit: contain;" class="bandera" src="/css/images/bnd_pt.png" height="24px" width="24px" /> 2640 </div> 2641 2642 2643 <div id="idiomasshow" class="idiomasshow"> 2644 <div class="titlemenujs"> 2645 Elija el idioma de su preferencia </div> 2646 <div class="idiomaitem"> 2647 <a class="idiomalink" lng="es" href="/?lng=es" ignorar-vista="true" style="width: 100%;"> 2648 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_es.png" height="20" width="20" alt="es" /> 2649 <span class="nameidioma"> 2650 Español </span> 2651 </a> 2652 </div> 2653 <div class="idiomaitem"> 2654 <a class="idiomalink" lng="en" href="/en/?lng=en" ignorar-vista="true" style="width: 100%;"> 2655 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_en.png" height="20" width="20" alt="en" /> 2656 <span class="nameidioma"> 2657 English </span> 2658 </a> 2659 </div> 2660 <div class="idiomaitem"> 2661 <a class="idiomalink" lng="fr" href="/fr/?lng=fr" ignorar-vista="true" style="width: 100%;"> 2662 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_fr.png" height="20" width="20" alt="fr" /> 2663 <span class="nameidioma"> 2664 Français </span> 2665 </a> 2666 </div> 2667 <div class="idiomaitem"> 2668 <a class="idiomalink" lng="de" href="/de/?lng=de" ignorar-vista="true" style="width: 100%;"> 2669 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_de.png" height="20" width="20" alt="de" /> 2670 <span class="nameidioma"> 2671 Deutsch </span> 2672 </a> 2673 </div> 2674 </div>
2675 </div> 2676 2677 2678 <a href="https://app.reservadirecto.com/auth_web?return_url=https%3A%2F%2Fwww.hotelsarmiento.com.ar%2Fauthorize.php%3Fredirect_url%3Dhttps%253A%252F%252Fwww.hotelsarmiento.com.ar%252Fpt%252F%253Flng%253Dpt&origin_pos=SarmientoPalace" ignorar-vista="true" class="btn_sesion cta_webcheckin_px margin-sm-right-10" style="text-decoration: none"> 2679 <i class="mdi mdi-account" aria-hidden="true"></i> 2680 <span> 2681 Iniciar Sesión </span> 2682 </a> 2683 2684
2684<script src="https://accounts.google.com/gsi/intermediate"></script>
2684 2685
2685<script src="https://accounts.google.com/gsi/intermediatesupport"></script>
2685 2686 2687 <div id="g_id_intermediate_iframe" data-src="https://eva.reservadirecto.com/core/includes/google_one_tap_intermediate_iframe.php?origin=https%3A%2F%2Fwww.hotelsarmiento.com.ar&redirect_url=https%3A%2F%2Fwww.hotelsarmiento.com.ar%2Fpt%2F%3Flng%3Dpt&pos=SarmientoPalace"> 2688 </div> 2689 2690 <style> 2691 .neo_login_incentive { 2692 position: fixed; 2693 top: 10rem; 2694 right: calc(1rem + 10px); 2695 width: 375px; 2696 text-align: left; 2697 z-index: 1; 2698 } 2699 2700 .neo_login_incentive>div { 2701 margin: 0; 2702 border-radius: 10px; 2703 } 2704 2705 iframe#onetap_google_intermediate_iframe, 2706 #credential_picker_container, 2707 #credential_picker_container iframe, 2708 iframe[src*="google_one_tap_intermediate_iframe"] { 2709 top: 18.5rem !important; 2710 right: 1rem !important; 2711 } 2712 2713 @media only screen and (max-width: 468px) { 2714 .neo_login_incentive { 2715 display: none !important; 2716 bottom: 0rem; 2717 top: initial; 2718 left: 0; 2719 right: 0; 2720 position: fixed; 2721 width: 100%; 2722 text-transform: initial; 2723 letter-spacing: normal; 2724 font-weight: initial; 2725 } 2726 2727 iframe#onetap_google_intermediate_iframe, 2728 #credential_picker_container, 2729 #credential_picker_container iframe, 2730 iframe[src*="google_one_tap_intermediate_iframe"] { 2731 top: initial !important; 2732 bottom: 5rem !important; 2733 right: initial !important; 2734 z-index: 1; 2735 } 2736 } 2737 </style> 2738
2738<script> 2739 (function() { 2740 var repositioned = false; 2741 var attempts = 0; 2742 var timer = setInterval(function() { 2743 if (repositioned || ++attempts > 60) { clearInterval(timer); return; } 2744 var el = document.getElementById('credential_picker_container') 2745 || document.querySelector('iframe[src*="google_one_tap_intermediate_iframe"]') 2746 || document.getElementById('onetap_google_intermediate_iframe'); 2747 if (el) { 2748 var target = (el.tagName === 'IFRAME' && el.parentElement && el.parentElement.style.position === 'fixed') ? el.parentElement : el; 2749 var isMobile = window.innerWidth <= 468; 2750 if (isMobile) { 2751 target.style.setProperty('top', 'initial', 'important'); 2752 target.style.setProperty('bottom', '5rem', 'important'); 2753 target.style.setProperty('right', 'initial', 'important'); 2754 } else { 2755 target.style.setProperty('top', '18.5rem', 'important'); 2756 target.style.setProperty('right', '1rem', 'important'); 2757 } 2758 repositioned = true; 2759 clearInterval(timer); 2760 } 2761 }, 100); 2762 })(); 2763 </script>
2763 2764 2765 </div> 2766 </div> 2767 </div> 2768 2769</div> 2770</div></div></div><div class="navbar-fullwidth navbar-top" ><ul class='nav-list' ><li class='' ><a class="item-list" href="/pt/index.html" target="">Home</a></li><li class='' ><a class="item-list" href="/pt/habitaciones.html" target="">Quartos</a></li><li class='' ><a class="item-list" href="/pt/servicios.html" target="">Serviços</a></li><li class='' ><a class="item-list" target='_blank' href="https://carta.hotelsarmiento.com.ar/" target="">Carta Bar</a></li></ul><div class="loguito" > <img loading="lazy" class="transparente" lazy-src="https://files-p.pxsol.com/68/company/library/user/215897845808ca7d36eed3f9c129d26e5a0fa645a33.svg" alt="SarmientoPalace" > </image> <img loading="lazy" class="fijo" lazy-src="https://files-p.pxsol.com/68/company/library/user/18268279260d4ed95888b1839b193da8057cb3f54b8.svg" alt="SarmientoPalace" > </image></div><ul class='nav-list' ><li class='' ><a class="item-list" href="/pt/promos.html" target="">Promoções</a></li><li class='' ><a class="item-list" href="/pt/galeria.html" target="">galeria</a></li><li class='' ><a class="item-list" href="/pt/contacto.html" target="">Localização e contato</a></li></ul></div></div> 2771 2772 2773<div class="container-search" ><div id='normalsearch' class="normalsearch" ><div class='' ListSelector='false' ProductSelector='false' LocationSearch='false' BuscadorVertical='false' OwnLP='false'> 2774 <div class="neo_template_block neo_marketplace_buscador_v3 pxModule_include ModuloWrap_marketplace_buscador_v3" id="marketplace_buscador_v3" > 2775 2776 2777 <div class="px-mk-buscador-container buscar_lp "> 2778 2779 2780 2781 <form px-endpoint="https://api-1-eb-web.pxsol.io" action="https://api-1-eb-web.pxsol.io/search/insert" ajax-action="search/insert" method="post" name="pxmk_searchform" id="pxmk_searchform" class="px-mk-searchform marketplace_searchform_computer" target="_self"> 2782 <label class="error px-mk-generalerror nodisplay">Ocorreu um erro, por favor, tente novamente</label> 2783 2784 2785 2786 2787 2788 <div class="fechas_ancho_entrada px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 2789 <label class="px-mk-inputicon" for="fechaingreso"> 2790 <?xml version="1.0" encoding="iso-8859-1"?> 2791<svg version="1.1" id="Capa_1" 2792 xmlns="http://www.w3.org/2000/svg" 2793 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> 2794 <g> 2795 <g> 2796 <g> 2797 <rect x="213.333" y="234.667" width="106.667" height="106.667"/> 2798 <path d="M362.667,42.667h-21.333V0h-42.667v42.667H128V0H85.333v42.667H64c-23.573,0-42.453,19.093-42.453,42.667L21.333,384 c0,23.573,19.093,42.667,42.667,42.667h298.667c23.573,0,42.667-19.093,42.667-42.667V85.333 C405.333,61.76,386.24,42.667,362.667,42.667z M362.667,384H64V149.333h298.667V384z"/> 2799 </g> 2800 </g> 2801 </g> 2802</svg> </label> 2803 <label class="px-mk-labelinput" for="fechaingreso"> 2804 Data de chegada </label> 2805 <input name="Start" type="text" style="font-size: 16px !important;" onfocus="return false;" readonly id="fechaingreso" class="" value="26/09/2026" placeholder="chegada" data-testid="date-start" /> 2806 </div> 2807 2808 <div class=" fechas_ancho_salida px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 2809 <label class="px-mk-inputicon" for="fechaegreso"> 2810 <?xml version="1.0" encoding="iso-8859-1"?> 2811<svg version="1.1" id="Capa_1" 2812 xmlns="http://www.w3.org/2000/svg" 2813 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> 2814 <g> 2815 <g> 2816 <g> 2817 <rect x="213.333" y="234.667" width="106.667" height="106.667"/> 2818 <path d="M362.667,42.667h-21.333V0h-42.667v42.667H128V0H85.333v42.667H64c-23.573,0-42.453,19.093-42.453,42.667L21.333,384 c0,23.573,19.093,42.667,42.667,42.667h298.667c23.573,0,42.667-19.093,42.667-42.667V85.333 C405.333,61.76,386.24,42.667,362.667,42.667z M362.667,384H64V149.333h298.667V384z"/> 2819 </g> 2820 </g> 2821 </g> 2822</svg> </label> 2823 <label class="px-mk-labelinput" for="fechaegreso"> 2824 Data de saÃda </label> 2825 <input name="End" type="text" style="font-size: 16px !important;" onfocus="return false;" readonly id="fechaegreso" size="10" value="27/09/2026" class="relative maxzindex pointer" placeholder="saÃda" data-testid="date-end" /> 2826 </div> 2827 2828 2829 <div id="NochesError" class="error" style="display:none"></div> 2830 2831 2832 <div class="codigopromocional px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 2833 <label class="px-mk-inputicon" for="fechaegreso"> 2834 <?xml version="1.0" encoding="iso-8859-1"?> 2835<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2836<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 2837 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> 2838<g> 2839 <g> 2840 <path d="M32,271.692v192c0,17.664,14.368,32,32,32h160v-224H32z"/> 2841 </g> 2842</g> 2843<g> 2844 <g> 2845 <path d="M480,143.692H378.752c7.264-4.96,13.504-9.888,17.856-14.304c25.824-25.952,25.824-68.192,0-94.144 2846 c-25.088-25.28-68.8-25.216-93.856,0c-13.888,13.92-50.688,70.592-45.6,108.448h-2.304c5.056-37.856-31.744-94.528-45.6-108.448 2847 c-25.088-25.216-68.8-25.216-93.856,0C89.6,61.196,89.6,103.436,115.36,129.388c4.384,4.416,10.624,9.344,17.888,14.304H32 2848 c-17.632,0-32,14.368-32,32v48c0,8.832,7.168,16,16,16h208v-64h64v64h208c8.832,0,16-7.168,16-16v-48 2849 C512,158.06,497.664,143.692,480,143.692z M222.112,142.636c0,0-1.344,1.056-5.92,1.056c-22.112,0-64.32-22.976-78.112-36.864 2850 c-13.408-13.504-13.408-35.52,0-49.024c6.496-6.528,15.104-10.112,24.256-10.112c9.12,0,17.728,3.584,24.224,10.112 2851 C208.128,79.5,229.568,134.924,222.112,142.636z M295.776,143.692c-4.544,0-5.888-1.024-5.888-1.056 2852 c-7.456-7.712,13.984-63.136,35.552-84.832c12.896-13.024,35.456-13.088,48.48,0c13.44,13.504,13.44,35.52,0,49.024 2853 C360.128,120.716,317.92,143.692,295.776,143.692z"/> 2854 </g> 2855</g> 2856<g> 2857 <g> 2858 <path d="M288,271.692v224h160c17.664,0,32-14.336,32-32v-192H288z"/> 2859 </g> 2860</g> 2861<g> 2862</g> 2863<g> 2864</g> 2865<g> 2866</g> 2867<g> 2868</g> 2869<g> 2870</g> 2871<g> 2872</g> 2873<g> 2874</g> 2875<g> 2876</g> 2877<g> 2878</g> 2879<g> 2880</g> 2881<g> 2882</g> 2883<g> 2884</g> 2885<g> 2886</g> 2887<g> 2888</g> 2889<g> 2890</g> 2891</svg> 2892 </label> 2893 <label class="px-mk-labelinput" for="PromoCode"> 2894 Código Promocional </label> 2895 <input name="Code" type="text" id="PromoCode" size="6" class="relative maxzindex pointer" data-testid="promo-code" /> 2896 </div> 2897 2898 2899 2900 <div class="nodisplay" id="Combinations">[{"Adults":1,"Childs":0,"Babies":0},{"Adults":2,"Childs":0,"Babies":0},{"Adults":3,"Childs":0,"Babies":0},{"Adults":4,"Childs":0,"Babies":0},{"Adults":5,"Childs":0,"Babies":0}]</div> 2901 2902<style> 2903 /* Quitar flechitas de inputs number en Chrome, Safari, Edge, Opera */ 2904 .neo_partyselector_quantity::-webkit-outer-spin-button, 2905 .neo_partyselector_quantity::-webkit-inner-spin-button { 2906 -webkit-appearance: none; 2907 margin: 0; 2908 } 2909 2910 /* Desktop - mantener original, todo en una lÃnea */ 2911 .txtPartyGroup .guests-row, 2912 .txtPartyGroup .rooms-row { 2913 display: inline; 2914 } 2915 2916 /* Nacionalidad label - desktop #000, mobile #333 */ 2917 .nacionalidad-label { 2918 color: #000 !important; 2919 } 2920 2921 @media only screen and (max-width: 650px) { 2922 .nacionalidad-label { 2923 color: #333 !important; 2924 } 2925 } 2926 2927 .txtPartyGroup .party-number { 2928 margin-right: 4px; 2929 } 2930 2931 .txtPartyGroup .party-separator { 2932 color: #999; 2933 margin: 0 4px; 2934 } 2935 2936 /* Mobile - formato de dos lÃneas mejorado */ 2937 @media only screen and (max-width: 650px) { 2938 2939 /* Ocultar separador entre huéspedes y habitaciones en mobile */ 2940 .txtPartyGroup .rooms-separator { 2941 display: none; 2942 } 2943 2944 .txtPartyGroup { 2945 display: flex; 2946 flex-direction: column; 2947 align-items: flex-start; 2948 gap: 2px; 2949 font-size: 15px; 2950 line-height: 1.4;
2951 color: #555; 2952 } 2953 2954 .txtPartyGroup .guests-row { 2955 display: flex; 2956 align-items: center; 2957 flex-wrap: wrap; 2958 } 2959 2960 .txtPartyGroup .party-item { 2961 display: inline-flex; 2962 align-items: baseline; 2963 white-space: nowrap; 2964 } 2965 2966 .txtPartyGroup .party-number { 2967 font-weight: 700; 2968 color: #333; 2969 margin-right: 4px; 2970 } 2971 2972 .txtPartyGroup .party-label { 2973 color: #666; 2974 } 2975 2976 .txtPartyGroup .party-separator { 2977 color: #ccc; 2978 margin: 0 8px; 2979 } 2980 2981 .txtPartyGroup .rooms-row { 2982 display: block; 2983 color: #666; 2984 margin: 0; 2985 padding: 0; 2986 text-align: left; 2987 } 2988 2989 .SelectorInitial { 2990 min-height: 65px; 2991 padding: 12px 45px 12px 14px; 2992 display: flex; 2993 align-items: center; 2994 } 2995 2996 .PartyTypeSimulatorContainer { 2997 overflow: visible; 2998 } 2999 3000 /* Ajuste para los labels del selector */ 3001 .neo_party_selector>div:first-child { 3002 display: flex; 3003 flex-direction: column; 3004 min-width: 0; 3005 } 3006 3007 .neo_party_selector>div:first-child>div { 3008 white-space: nowrap; 3009 overflow: visible; 3010 font-size: 14px; 3011 font-weight: 500; 3012 } 3013 3014 .neo_party_selector>div:first-child>div:last-child { 3015 font-size: 12px; 3016 color: #888; 3017 margin-top: 3px; 3018 white-space: nowrap; 3019 font-weight: 400; 3020 } 3021 3022 /* Asegurar que en mobile los controles sigan alineados a la derecha */ 3023 .neo_party_selector { 3024 display: flex; 3025 justify-content: space-between; 3026 align-items: center; 3027 width: 100%; 3028 margin-bottom: 14px; 3029 padding-bottom: 14px; 3030 border-bottom: 1px solid #f0f0f0; 3031 } 3032 3033 .neo_party_selector:last-of-type { 3034 border-bottom: none; 3035 margin-bottom: 0; 3036 padding-bottom: 0; 3037 } 3038 3039 .neo_party_selector>div:last-child { 3040 display: flex; 3041 align-items: center; 3042 justify-content: flex-end; 3043 flex-shrink: 0; 3044 margin-left: 15px; 3045 } 3046 3047 .neo_party_selector .flex.flex-s-center { 3048 display: flex; 3049 align-items: center; 3050 gap: 4px; 3051 } 3052 } 3053 3054 /* Estilos para alinear correctamente los controles numéricos */ 3055 .neo_party_selector { 3056 display: flex !important; 3057 justify-content: space-between !important; 3058 align-items: center !important; 3059 width: 100% !important; 3060 margin-bottom: 15px !important; 3061 } 3062 3063 .neo_party_selector>div:first-child { 3064 flex: 1 !important; 3065 min-width: 0 !important; 3066 } 3067 3068 .neo_party_selector>div:last-child { 3069 display: flex !important; 3070 align-items: center !important; 3071 justify-content: flex-end !important; 3072 flex-shrink: 0 !important; 3073 margin-left: 15px !important; 3074 } 3075 3076 /* Asegurar que los botones y input estén alineados correctamente */ 3077 .neo_party_selector .flex.flex-s-center { 3078 display: flex !important; 3079 align-items: center !important; 3080 gap: 3px !important; 3081 } 3082</style> 3083 3084<div class="relative PartyTypeSimulatorContainer"> 3085 <div class="PartyTypeSimulator px-sm-inputcontainer w-padding" style="border-right: none" maxadult="6" maxchild="0" maxrooms="4"> 3086 <div class="SelectorInitial" data-testid="guest-selector-trigger"> 3087 <span class="txtPartyGroup" style="align-items: flex-start !important;"> 3088 <span class="guests-row"> 3089 <span class="party-item txtAdults"> 3090 <span class="party-number numberAdults">2</span> 3091 <span class="party-label txtAdultsTxt" plural="adultos" singular="adulto"> 3092 adultos </span> 3093 </span> 3094 <span class="party-item txtChildren" style="display:none;"> 3095 <span class="party-separator">â¢</span> 3096 <span class="party-number numberChildren">0</span> 3097 <span class="party-label txtChildrenTxt" plural="niños" singular="niño"> 3098 niño </span> 3099 </span> 3100 <span class="party-item txtBabies" style="display:none;"> 3101 <span class="party-separator">â¢</span> 3102 <span class="party-number numberBabies">0</span> 3103 <span class="party-label txtBabiesTxt" plural="bebés" singular="bebé"> 3104 bebé </span> 3105 </span> 3106 </span> 3107 <span class="rooms-separator party-separator">â¢</span> 3108 <span class="rooms-row txtRooms"> 3109 <span class="party-number numberRooms">1</span> 3110 <span 3111 class="party-label txtRoomsTxt" 3112 plural="habitacion/es" 3113 singular="quarto"> 3114 quarto </span> 3115 </span> 3116 </span> 3117 <label class='ignoreclick px-mk-inputicon'> 3118 <?xml version="1.0" encoding="iso-8859-1"?> 3119<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3120<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 3121 viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> 3122<g> 3123 <g> 3124 <g> 3125 <path d="M309.333,213.333c29.44,0,53.12-23.893,53.12-53.333s-23.68
3125-53.333-53.12-53.333S256,130.56,256,160 3126 S279.893,213.333,309.333,213.333z"/> 3127 <path d="M149.333,192c35.307,0,63.787-28.693,63.787-64c0-35.307-28.48-64-63.787-64s-64,28.693-64,64 3128 C85.333,163.307,114.027,192,149.333,192z"/> 3129 <path d="M149.333,234.667C99.52,234.667,0,259.627,0,309.333v53.333h149.333v-48c0-18.133,7.147-49.813,50.56-74.027 3130 C181.333,236.693,163.307,234.667,149.333,234.667z"/> 3131 <path d="M309.333,256C270.187,256,192,275.627,192,314.667v48h234.667v-48C426.667,275.627,348.48,256,309.333,256z"/> 3132 </g> 3133 </g> 3134</g> 3135<g> 3136</g> 3137<g> 3138</g> 3139<g> 3140</g> 3141<g> 3142</g> 3143<g> 3144</g> 3145<g> 3146</g> 3147<g> 3148</g> 3149<g> 3150</g> 3151<g> 3152</g> 3153<g> 3154</g> 3155<g> 3156</g> 3157<g> 3158</g> 3159<g> 3160</g> 3161<g> 3162</g> 3163<g> 3164</g> 3165</svg> 3166 </label> 3167 </div> 3168 </div> 3169 <div class="PartyTypeSimulatorSelect nodisplay padding-xs-20"> 3170 <div class="flex-column full"> 3171 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3172 <div> 3173 <div>Board / es</div> 3174 <div style="font-size: 11px; color: #888; margin-top: 2px;"> 3175 16 años o más </div> 3176 </div> 3177 <div class="flex flex-s-center"> 3178 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_minus_button" type='button' party-type="adults" action-type='minus' data-testid="adults-minus">-</button> 3179 <input type="number" inputmode="numeric" query-default="2" class="neo_partyselector_quantity" party-type="adults" val="2" value="2" onchange="handlePartyInputChange(this);" min="1" max="6" style="background-color: #f8f8f8 !important; border-radius: 10px !important; width: 50px !important; height: 42px !important; margin: 0 3px !important; padding: 0 !important; border: none; text-align: center !important; -moz-appearance: textfield !important;" data-testid="adults-input" /> 3180 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_plus_button" type='button' party-type="adults" action-type='plus' data-testid="adults-plus">+</button> 3181 </div> 3182 </div> 3183 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3184 <div>Habitacion/es</div> 3185 <div class="flex flex-s-center"> 3186 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_minus_button" type='button' party-type="rooms" action-type='minus' data-testid="rooms-minus">-</button> 3187 <input type="number" inputmode="numeric" class="neo_partyselector_quantity" party-type="rooms" val="1" value="1" onchange="handlePartyInputChange(this);" min="1" max="4" style="background-color: #f8f8f8 !important; border-radius: 10px !important; width: 50px !important; height: 42px !important; margin: 0 3px !important; padding: 0 !important; border: none; text-align: center !important; -moz-appearance: textfield !important;" data-testid="rooms-input" /> 3188 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_plus_button" type='button' party-type="rooms" action-type='plus' data-testid="rooms-plus">+</button> 3189 </div> 3190 </div> 3191 </div> 3192 <div class="ChildrenAgesContainer nodisplay"> 3193 <div class="flex-column"> 3194 <div class="texto padding-xs-bottom-20" style="font-size: 12px !important;">¿Qué edades tienen los con los que viajas?</div> 3195 <div class="ChildrensAges" child-id="0" style="max-height: 200px !important; overflow-y: auto !important; padding-right: 5px !important;"> 3196 <div class="ChildrensAgesSelectContainer" child-id="0" style="margin-bottom: 10px !important;"> 3197 <select class="ChildrensAgeSelect" child-id="0" onchange="alterPartyGroup()" style="color: #444 !important; background-color: transparent !important; padding: 10px 8px !important; border: 1px solid #ddd !important; border-radius: 8px !important; width: 100% !important;" data-testid="child-age-select"> 3198 <option value="" disabled selected>Edad el dÃa del check-out</option> 3199 <option value="3">3 años</option> 3200 <option value="4">4 años</option> 3201 <option value="5">5 años</option> 3202 <option value="6">6 años</option> 3203 <option value="7">7 años</option> 3204 <option value="8">8 años</option> 3205 <option value="9">9 años</option> 3206 <option value="10">10 años</option> 3207 <option value="11">11 años</option> 3208 <option value="12">12 años</option> 3209 <option value="13">13 años</option> 3210 <option value="14">14 años</option> 3211 <option value="15">15 años</option> 3212 </select> 3213 </div>
3214 </div> 3215 <div class="NotValidChildrens nodisplay animated shake"><i class="fa fa-exclamation" aria-hidden="true"></i> Seleccione edad de los por favor</div> 3216 </div> 3217 </div> 3218 3219 3220 <!-- Flag Icons CSS Library --> 3221 <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/lipis/[email protected]/css/flag-icons.min.css"> 3222 3223 <style> 3224 /* Country Selector Component Styles */ 3225 .country-selector-container { 3226 position: relative; 3227 width: 100%; 3228 z-index: 1; 3229 } 3230 3231 .country-selector-container:focus-within { 3232 z-index: 9999; 3233 } 3234 3235 .country-selector-wrapper { 3236 position: relative; 3237 width: 100%; 3238 } 3239 3240 /* Asegurar que el dropdown se muestre sobre contenedores con overflow */ 3241 .country-selector-wrapper:has(.country-selector-dropdown.open) { 3242 overflow: visible !important; 3243 } 3244 3245 .country-selector-trigger { 3246 display: flex; 3247 align-items: center; 3248 justify-content: space-between; 3249 width: 100%; 3250 padding: 10px 12px; 3251 background-color: #fff; 3252 border: 1px solid #ddd; 3253 border-radius: 8px; 3254 cursor: pointer; 3255 transition: all 0.2s ease; 3256 font-size: 14px; 3257 color: #333; 3258 text-align: left; 3259 min-height: 44px; 3260 box-sizing: border-box; 3261 } 3262 3263 .country-selector-trigger:hover { 3264 border-color: #999; 3265 } 3266 3267 .country-selector-trigger:focus { 3268 outline: none; 3269 border-color: #0066cc; 3270 box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.15); 3271 } 3272 3273 .country-selector-trigger[aria-expanded="true"] { 3274 border-color: #0066cc; 3275 border-bottom-left-radius: 0; 3276 border-bottom-right-radius: 0; 3277 } 3278 3279 .country-selector-selected { 3280 display: flex; 3281 align-items: center; 3282 gap: 10px; 3283 flex: 1; 3284 overflow: hidden; 3285 } 3286 3287 .country-selector-selected .country-flag { 3288 flex-shrink: 0; 3289 width: 24px; 3290 height: 18px; 3291 border-radius: 2px; 3292 box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); 3293 } 3294 3295 .country-selector-selected .country-name { 3296 white-space: nowrap; 3297 overflow: hidden; 3298 text-overflow: ellipsis; 3299 } 3300 3301 .country-selector-selected .country-placeholder { 3302 color: #999; 3303 } 3304 3305 .country-selector-arrow { 3306 flex-shrink: 0; 3307 color: #666; 3308 transition: transform 0.2s ease; 3309 display: flex; 3310 align-items: center; 3311 } 3312 3313 .country-selector-trigger[aria-expanded="true"] .country-selector-arrow { 3314 transform: rotate(180deg); 3315 } 3316 3317 /* Dropdown */ 3318 .country-selector-dropdown { 3319 position: absolute; 3320 top: 100%; 3321 left: 0; 3322 right: 0; 3323 background: #fff; 3324 border: 1px solid #0066cc; 3325 border-top: none; 3326 border-radius: 0 0 8px 8px; 3327 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 3328 z-index: 9999; 3329 display: none; 3330 max-height: 320px; 3331 overflow: hidden; 3332 flex-direction: column; 3333 } 3334 3335 /* Asegurar que el contenedor tenga contexto de apilamiento cuando está abierto */ 3336 .country-selector-container:has(.country-selector-dropdown.open) { 3337 z-index: 9999; 3338 } 3339 3340 .country-selector-dropdown.open { 3341 display: flex; 3342 } 3343 3344 /* Search */ 3345 .country-selector-search { 3346 padding: 10px 12px; 3347 border-bottom: 1px solid #eee; 3348 position: relative; 3349 flex-shrink: 0; 3350 } 3351 3352 .country-search-input { 3353 width: 100%; 3354 padding: 8px 12px; 3355 border: 1px solid #ddd; 3356 border-radius: 6px; 3357 font-size: 14px; 3358 outline: none; 3359 transition: border-color 0.2s ease; 3360 box-sizing: border-box; 3361 } 3362 3363 .country-search-input:focus { 3364 border-color: #0066cc; 3365 } 3366 3367 .country-search-input::placeholder { 3368 color: #999; 3369 } 3370 3371 /* Options List */ 3372 .country-selector-list { 3373 overflow-y: auto; 3374 flex: 1; 3375 overscroll-behavior: contain; 3376 padding: 4px 0; 3377 } 3378 3379 .country-option { 3380 display: flex; 3381 align-items: center; 3382 padding: 10px 12px; 3383 cursor: pointer; 3384 transition: background-color 0.15s ease; 3385 gap: 10px; 3386 } 3387 3388 .country-option:hover { 3389 background-color: #f5f5f5; 3390 } 3391 3392 .country-option.selected { 3393 background-color: #e8f4fc; 3394 } 3395 3396 .country-option.highlighted { 3397 background-color: #f0f0f0; 3398 } 3399 3400 .country-option .country-flag { 3401 width: 24px; 3402 height: 18px; 3403 border-radius: 2px; 3404 flex-shrink: 0; 3405 box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
3406 background-color: #e0e0e0; 3407 } 3408 3409 .country-option .country-flag-empty { 3410 width: 24px; 3411 height: 18px; 3412 flex-shrink: 0; 3413 } 3414 3415 .country-option .country-name { 3416 flex: 1; 3417 font-size: 14px; 3418 color: #333; 3419 } 3420 3421 .country-option .country-check { 3422 color: #0066cc; 3423 flex-shrink: 0; 3424 } 3425 3426 .country-option-placeholder { 3427 color: #999; 3428 cursor: default; 3429 pointer-events: none; 3430 } 3431 3432 .country-no-results { 3433 padding: 20px 12px; 3434 text-align: center; 3435 color: #999; 3436 font-size: 14px; 3437 } 3438 3439 /* Ocultar opciones filtradas */ 3440 .country-option.hidden { 3441 display: none; 3442 } 3443 3444 3445 /* Mobile Optimizations */ 3446 @media (max-width: 650px) { 3447 .country-selector-dropdown { 3448 max-height: 50vh; 3449 } 3450 3451 .country-selector-trigger { 3452 min-height: 48px; 3453 font-size: 16px; 3454 /* Previene zoom en iOS */ 3455 } 3456 3457 .country-search-input { 3458 font-size: 16px; 3459 /* Previene zoom en iOS */ 3460 padding: 10px 12px; 3461 } 3462 3463 .country-option { 3464 padding: 12px; 3465 } 3466 } 3467 </style> 3468
3468<script> 3469 (function() { 3470 // Evitar inicialización múltiple 3471 if (window.CountrySelectorInitialized) return; 3472 window.CountrySelectorInitialized = true; 3473 3474 function initCountrySelector(container) { 3475 const selectorId = container.dataset.selectorId; 3476 const trigger = container.querySelector('.country-selector-trigger'); 3477 const dropdown = container.querySelector('.country-selector-dropdown'); 3478 const hiddenInput = container.querySelector('input[type="hidden"]'); 3479 const searchInput = container.querySelector('.country-search-input'); 3480 const optionsList = container.querySelector('.country-selector-list'); 3481 const options = container.querySelectorAll('.country-option:not(.country-option-placeholder)'); 3482 const placeholder = container.querySelector('.country-option-placeholder'); 3483 const noResults = container.querySelector('.country-no-results'); 3484 3485 let highlightedIndex = -1; 3486 let visibleOptions = []; 3487 3488 function updateVisibleOptions() { 3489 visibleOptions = Array.from(options).filter(opt => !opt.classList.contains('hidden')); 3490 } 3491 3492 let isUsingFixedPosition = false; 3493 let scrollHandler = null; 3494 3495 function updateDropdownPosition() { 3496 if (!isUsingFixedPosition) return; 3497 const triggerRect = trigger.getBoundingClientRect(); 3498 dropdown.style.top = triggerRect.bottom + 'px'; 3499 dropdown.style.left = triggerRect.left + 'px'; 3500 dropdown.style.width = triggerRect.width + 'px'; 3501 } 3502 3503 function openDropdown() { 3504 trigger.setAttribute('aria-expanded', 'true'); 3505 3506 // Usar position fixed para checkout para evitar problemas de overflow 3507 const isCheckout = container.closest('.checkout_formfield, .checkout_country, .Formulario_txt'); 3508 if (isCheckout) { 3509 isUsingFixedPosition = true; 3510 const triggerRect = trigger.getBoundingClientRect(); 3511 dropdown.style.position = 'fixed'; 3512 dropdown.style.top = triggerRect.bottom + 'px'; 3513 dropdown.style.left = triggerRect.left + 'px'; 3514 dropdown.style.width = triggerRect.width + 'px'; 3515 dropdown.style.zIndex = '99999'; 3516 3517 // Listener para actualizar posición en scroll/resize 3518 scrollHandler = function() { 3519 updateDropdownPosition(); 3520 }; 3521 window.addEventListener('scroll', scrollHandler, true); 3522 window.addEventListener('resize', scrollHandler); 3523 } 3524 3525 dropdown.classList.add('open'); 3526 3527 if (searchInput) { 3528 searchInput.value = ''; 3529 filterOptions(''); 3530 setTimeout(() => searchInput.focus(), 50); 3531 } 3532 highlightedIndex = -1; 3533 updateVisibleOptions(); 3534 } 3535 3536 function closeDropdown() { 3537 trigger.setAttribute('aria-expanded', 'false'); 3538 dropdown.classList.remove('open'); 3539 3540 // Remover listeners de scroll/resize 3541 if (scrollHandler) { 3542 window.removeEventListener('scroll', scrollHandler, true); 3543 window.removeEventListener('resize', scrollHandler); 3544 scrollHandler = null; 3545 } 3546 3547 // Resetear estilos de position fixed 3548 if (isUsingFixedPosition) { 3549 dropdown.style.position = ''; 3550 dropdown.style.top = ''; 3551 dropdown.style.left = ''; 3552 dropdown.style.width = ''; 3553 dropdown.style.zIndex = ''; 3554 isUsingFixedPosition = false;
3555 } 3556 3557 highlightedIndex = -1; 3558 // Remover highlight de todas las opciones 3559 options.forEach(opt => opt.classList.remove('highlighted')); 3560 } 3561 3562 function selectOption(option) { 3563 const value = option.dataset.value; 3564 const code = option.dataset.code; 3565 const name = option.querySelector('.country-name')?.textContent || ''; 3566 const flagCode = option.dataset.flag || code; 3567 const flagClass = flagCode ? 'fi fi-' + flagCode : ''; 3568 3569 // Actualizar input oculto 3570 hiddenInput.value = value; 3571 hiddenInput.setAttribute('data-code', code || ''); 3572 3573 // Disparar evento change 3574 const event = new Event('change', { 3575 bubbles: true 3576 }); 3577 hiddenInput.dispatchEvent(event); 3578 3579 // Actualizar visualización del trigger 3580 const selectedDisplay = trigger.querySelector('.country-selector-selected'); 3581 if (value && code) { 3582 selectedDisplay.innerHTML = ` 3583 <span class="country-flag ${flagClass}"></span> 3584 <span class="country-name">${name}</span> 3585 `; 3586 } else { 3587 const placeholderText = placeholder?.querySelector('.country-name')?.textContent || 'Seleccione un paÃs'; 3588 selectedDisplay.innerHTML = `<span class="country-placeholder">${placeholderText}</span>`; 3589 } 3590 3591 // Actualizar estado selected de opciones 3592 options.forEach(opt => { 3593 opt.classList.remove('selected'); 3594 opt.setAttribute('aria-selected', 'false'); 3595 // Remover check anterior 3596 const existingCheck = opt.querySelector('.country-check'); 3597 if (existingCheck) existingCheck.remove(); 3598 }); 3599 3600 if (value) { 3601 option.classList.add('selected'); 3602 option.setAttribute('aria-selected', 'true'); 3603 // Agregar check 3604 const check = document.createElement('span'); 3605 check.className = 'country-check'; 3606 check.innerHTML = '<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M11.6667 3.5L5.25 9.91667L2.33333 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'; 3607 option.appendChild(check); 3608 } 3609 3610 closeDropdown(); 3611 } 3612 3613 function filterOptions(query) { 3614 const normalizedQuery = query.toLowerCase().trim(); 3615 let hasResults = false; 3616 3617 options.forEach(option => { 3618 const searchText = option.dataset.search || ''; 3619 const matches = normalizedQuery === '' || searchText.includes(normalizedQuery); 3620 option.classList.toggle('hidden', !matches); 3621 if (matches) hasResults = true; 3622 }); 3623 3624 // Mostrar mensaje de sin resultados 3625 if (noResults) { 3626 noResults.style.display = hasResults ? 'none' : 'block'; 3627 } 3628 3629 updateVisibleOptions(); 3630 highlightedIndex = -1; 3631 } 3632 3633 function highlightOption(index) { 3634 options.forEach(opt => opt.classList.remove('highlighted')); 3635 if (index >= 0 && index < visibleOptions.length) { 3636 highlightedIndex = index; 3637 visibleOptions[index].classList.add('highlighted'); 3638 visibleOptions[index].scrollIntoView({ 3639 block: 'nearest' 3640 }); 3641 } 3642 } 3643 3644 // Event Listeners 3645 trigger.addEventListener('click', function(e) { 3646 e.preventDefault(); 3647 e.stopPropagation(); 3648 const isOpen = trigger.getAttribute('aria-expanded') === 'true'; 3649 if (isOpen) { 3650 closeDropdown(); 3651 } else { 3652 openDropdown(); 3653 } 3654 }); 3655 3656 // Selección de opción 3657 optionsList.addEventListener('click', function(e) { 3658 e.stopPropagation(); 3659 const option = e.target.closest('.country-option'); 3660 if (option && option.dataset.disabled !== 'true') { 3661 selectOption(option); 3662 } 3663 }); 3664 3665 // Búsqueda 3666 if (searchInput) { 3667 searchInput.addEventListener('input', function(e) { 3668 filterOptions(e.target.value); 3669 }); 3670 3671 searchInput.addEventListener('keydown', function(e) { 3672 if (e.key === 'ArrowDown') { 3673 e.preventDefault(); 3674 highlightOption(Math.min(highlightedIndex + 1, visibleOptions.length - 1)); 3675 } else if (e.key === 'ArrowUp') { 3676 e.preventDefault(); 3677 highlightOption(Math.max(highlightedIndex - 1, 0)); 3678 } else if (e.key === 'Enter') { 3679 e.preventDefault(); 3680 if (highlightedIndex >= 0 && visibleOptions[highlightedIndex]) { 3681 selectOption(visibleOptions[highlightedIndex]); 3682 } 3683 } else if (e.key === 'Escape') { 3684 closeDropdown(); 3685 trigger.focus(); 3686 } 3687 }); 3688 } 3689 3690 // Cerrar al hacer clic fuera 3691 document.addEventListener('click', function(e) { 3692 if (!container.contains(e.target)) { 3693 closeDropdown(); 3694 } 3695 }); 3696 3697 // Navegación con teclado en el trigger 3698 trigger.addEventListener('keydown', function(e) { 3699 if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') { 3700 e.preventDefault(); 3701 openDropdown(); 3702 } 3703 }); 3704 } 3705 3706 // Inicializar todos los selectores 3707 function initAllSelectors() { 3708 document.querySelectorAll('.country-selector-container:not([data-initialized]
3708)').forEach(container => { 3709 container.setAttribute('data-initialized', 'true'); 3710 initCountrySelector(container); 3711 }); 3712 } 3713 3714 // Inicializar cuando el DOM esté listo 3715 if (document.readyState === 'loading') { 3716 document.addEventListener('DOMContentLoaded', initAllSelectors); 3717 } else { 3718 initAllSelectors(); 3719 } 3720 3721 // MutationObserver para detectar selectores agregados dinámicamente 3722 const observer = new MutationObserver(function(mutations) { 3723 let shouldInit = false; 3724 mutations.forEach(function(mutation) { 3725 mutation.addedNodes.forEach(function(node) { 3726 if (node.nodeType === 1) { 3727 if (node.classList && node.classList.contains('country-selector-container') && !node.hasAttribute('data-initialized')) { 3728 shouldInit = true; 3729 } else if (node.querySelector && node.querySelector('.country-selector-container:not([data-initialized])')) { 3730 shouldInit = true; 3731 } 3732 } 3733 }); 3734 }); 3735 if (shouldInit) { 3736 initAllSelectors(); 3737 } 3738 }); 3739 3740 observer.observe(document.body, { 3741 childList: true, 3742 subtree: true 3743 }); 3744 3745 // Exponer función para inicialización manual (útil para contenido cargado dinámicamente) 3746 window.initCountrySelectors = initAllSelectors; 3747 })(); 3748 </script>
3748 3749 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3750 <div>Nacionalidad</div> 3751 <div class="flex flex-s-center"> 3752 <div class="country-selector-container party-selector-country" data-selector-id="country_iso_6ab7f1cda26ae"> 3753 <!-- Campo oculto que almacena el valor real --> 3754 <input type="hidden" 3755 name="country_iso" 3756 id="country_iso" 3757 value="US" 3758 data-code="us" 3759 autocomplete="country"> 3760 3761 <!-- Selector visual personalizado --> 3762 <div class="country-selector-wrapper"> 3763 <button type="button" 3764 class="country-selector-trigger neo_partyselector_quantity" 3765 aria-haspopup="listbox" 3766 aria-expanded="false" 3767 data-trigger-for="country_iso_6ab7f1cda26ae" 3768 > 3769 <span class="country-selector-selected"> 3770 <span class="country-flag fi fi-us"></span> 3771 <span class="country-name">Estados Unidos</span> 3772 </span> 3773 <span class="country-selector-arrow"> 3774 <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 3775 <path d="M2.5 4.5L6 8L9.5 4.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /> 3776 </svg> 3777 </span> 3778 </button> 3779 3780 <!-- Dropdown con buscador y opciones --> 3781 <div class="country-selector-dropdown" data-dropdown-for="country_iso_6ab7f1cda26ae" role="listbox"> 3782 <div class="country-selector-search"> 3783 <input type="text" 3784 class="country-search-input" 3785 placeholder="Buscar paÃs..." 3786 autocomplete="off"> 3787 </div> 3788 3789 <div class="country-selector-list"> 3790 <!-- Opción vacÃa/placeholder (no seleccionable) --> 3791 <div class="country-option country-option-placeholder" 3792 data-value="" 3793 data-code="" 3794 data-search="" 3795 data-disabled="true" 3796 role="option" 3797 aria-disabled="true"> 3798 <span class="country-flag-empty"></span> 3799 <span class="country-name">Seleccione un paÃs</span> 3800 </div> 3801 3802 <!-- PaÃses prioritarios primero --> 3803 <div class="country-option " 3804 data-value="AR" 3805 data-code="ar" 3806 data-search="argentina argentina ar" 3807 role="option" 3808 aria-selected="false"> 3809 <span class="country-flag fi fi-ar"></span> 3810 <span class="country-name">Argentina</span> 3811 </div> 3812 <div class="country-option " 3813 data-value="BR" 3814 data-code="br" 3815 data-search="brasil brazil br" 3816 role="option" 3817 aria-selected="false"> 3818 <span class="country-flag fi fi-br"></span> 3819 <span class="country-name">Brasil</span> 3820 </div> 3821 <div class="country-option " 3822 data-value="CL" 3823 data-code="cl" 3824 data-search="chile chile cl" 3825 role="option" 3826 aria-selected="false"> 3827 <span class="country-flag fi fi-cl"></span>
3828 <span class="country-name">Chile</span> 3829 </div> 3830 <div class="country-option " 3831 data-value="MX" 3832 data-code="mx" 3833 data-search="méxico mexico mx" 3834 role="option" 3835 aria-selected="false"> 3836 <span class="country-flag fi fi-mx"></span> 3837 <span class="country-name">México</span> 3838 </div> 3839 <div class="country-option " 3840 data-value="UY" 3841 data-code="uy" 3842 data-search="uruguay uruguay uy" 3843 role="option" 3844 aria-selected="false"> 3845 <span class="country-flag fi fi-uy"></span> 3846 <span class="country-name">Uruguay</span> 3847 </div> 3848 <div class="country-option " 3849 data-value="PY" 3850 data-code="py" 3851 data-search="paraguay paraguay py" 3852 role="option" 3853 aria-selected="false"> 3854 <span class="country-flag fi fi-py"></span> 3855 <span class="country-name">Paraguay</span> 3856 </div> 3857 <div class="country-option " 3858 data-value="BO" 3859 data-code="bo" 3860 data-search="bolivia bolivia bo" 3861 role="option" 3862 aria-selected="false"> 3863 <span class="country-flag fi fi-bo"></span> 3864 <span class="country-name">Bolivia</span> 3865 </div> 3866 <div class="country-option " 3867 data-value="PE" 3868 data-code="pe" 3869 data-search="perú peru pe" 3870 role="option" 3871 aria-selected="false"> 3872 <span class="country-flag fi fi-pe"></span> 3873 <span class="country-name">Perú</span> 3874 </div> 3875 <div class="country-option " 3876 data-value="EC" 3877 data-code="ec" 3878 data-search="ecuador ecuador ec" 3879 role="option" 3880 aria-selected="false"> 3881 <span class="country-flag fi fi-ec"></span> 3882 <span class="country-name">Ecuador</span> 3883 </div> 3884 <div class="country-option " 3885 data-value="CO" 3886 data-code="co" 3887 data-search="colombia colombia co" 3888 role="option" 3889 aria-selected="false"> 3890 <span class="country-flag fi fi-co"></span> 3891 <span class="country-name">Colombia</span> 3892 </div> 3893 3894 <!-- Resto de paÃses --> 3895 <div class="country-option " 3896 data-value="AF" 3897 data-code="af" 3898 data-flag="af" 3899 data-search="afganistan afghanistan af" 3900 role="option" 3901 aria-selected="false">
3902 <span class="country-flag fi fi-af"></span> 3903 <span class="country-name">Afganistan</span> 3904 </div> 3905 <div class="country-option " 3906 data-value="AL" 3907 data-code="al" 3908 data-flag="al" 3909 data-search="albania albania al" 3910 role="option" 3911 aria-selected="false"> 3912 <span class="country-flag fi fi-al"></span> 3913 <span class="country-name">Albania</span> 3914 </div> 3915 <div class="country-option " 3916 data-value="DE" 3917 data-code="de" 3918 data-flag="de" 3919 data-search="alemania germany de" 3920 role="option" 3921 aria-selected="false"> 3922 <span class="country-flag fi fi-de"></span> 3923 <span class="country-name">Alemania</span> 3924 </div> 3925 <div class="country-option " 3926 data-value="AD" 3927 data-code="ad" 3928 data-flag="ad" 3929 data-search="andorra andorra ad" 3930 role="option" 3931 aria-selected="false"> 3932 <span class="country-flag fi fi-ad"></span> 3933 <span class="country-name">Andorra</span> 3934 </div> 3935 <div class="country-option " 3936 data-value="AO" 3937 data-code="ao" 3938 data-flag="ao" 3939 data-search="angola angola ao" 3940 role="option" 3941 aria-selected="false"> 3942 <span class="country-flag fi fi-ao"></span> 3943 <span class="country-name">Angola</span> 3944 </div> 3945 <div class="country-option " 3946 data-value="AI" 3947 data-code="ai" 3948 data-flag="ai" 3949 data-search="anguila anguilla ai" 3950 role="option" 3951 aria-selected="false"> 3952 <span class="country-flag fi fi-ai"></span> 3953 <span class="country-name">Anguila</span> 3954 </div> 3955 <div class="country-option " 3956 data-value="AQ" 3957 data-code="aq" 3958 data-flag="aq" 3959 data-search="antartida antarctica aq" 3960 role="option" 3961 aria-selected="false"> 3962 <span class="country-flag fi fi-aq"></span> 3963 <span class="country-name">Antartida</span> 3964 </div> 3965 <div class="country-option " 3966 data-value="AG" 3967 data-code="ag" 3968 data-flag="ag" 3969 data-search="antigua y barbuda antigua and barbuda ag" 3970 role="option" 3971 aria-selected="false">
3972 <span class="country-flag fi fi-ag"></span> 3973 <span class="country-name">Antigua y Barbuda</span> 3974 </div> 3975 <div class="country-option " 3976 data-value="SA" 3977 data-code="sa" 3978 data-flag="sa" 3979 data-search="arabia saudita saudi arabia sa" 3980 role="option" 3981 aria-selected="false"> 3982 <span class="country-flag fi fi-sa"></span> 3983 <span class="country-name">Arabia Saudita</span> 3984 </div> 3985 <div class="country-option " 3986 data-value="DZ" 3987 data-code="dz" 3988 data-flag="dz" 3989 data-search="argelia algeria dz" 3990 role="option" 3991 aria-selected="false"> 3992 <span class="country-flag fi fi-dz"></span> 3993 <span class="country-name">Argelia</span> 3994 </div> 3995 <div class="country-option " 3996 data-value="AM" 3997 data-code="am" 3998 data-flag="am" 3999 data-search="armenia armenia am" 4000 role="option" 4001 aria-selected="false"> 4002 <span class="country-flag fi fi-am"></span> 4003 <span class="country-name">Armenia</span> 4004 </div> 4005 <div class="country-option " 4006 data-value="AW" 4007 data-code="aw" 4008 data-flag="aw" 4009 data-search="aruba aruba aw" 4010 role="option" 4011 aria-selected="false"> 4012 <span class="country-flag fi fi-aw"></span> 4013 <span class="country-name">Aruba</span> 4014 </div> 4015 <div class="country-option " 4016 data-value="AU" 4017 data-code="au" 4018 data-flag="au" 4019 data-search="australia australia au" 4020 role="option" 4021 aria-selected="false"> 4022 <span class="country-flag fi fi-au"></span> 4023 <span class="country-name">Australia</span> 4024 </div> 4025 <div class="country-option " 4026 data-value="AT" 4027 data-code="at" 4028 data-flag="at" 4029 data-search="austria austria at" 4030 role="option" 4031 aria-selected="false"> 4032 <span class="country-flag fi fi-at"></span> 4033 <span class="country-name">Austria</span> 4034 </div> 4035 <div class="country-option " 4036 data-value="AZ" 4037 data-code="az" 4038 data-flag="az" 4039 data-search="azerbaiyan azerbaijan az" 4040 role="option" 4041 aria-selected="false">
4042 <span class="country-flag fi fi-az"></span> 4043 <span class="country-name">Azerbaiyan</span> 4044 </div> 4045 <div class="country-option " 4046 data-value="BS" 4047 data-code="bs" 4048 data-flag="bs" 4049 data-search="bahamas bahamas bs" 4050 role="option" 4051 aria-selected="false"> 4052 <span class="country-flag fi fi-bs"></span> 4053 <span class="country-name">Bahamas</span> 4054 </div> 4055 <div class="country-option " 4056 data-value="BH" 4057 data-code="bh" 4058 data-flag="bh" 4059 data-search="bahrain bahrain bh" 4060 role="option" 4061 aria-selected="false"> 4062 <span class="country-flag fi fi-bh"></span> 4063 <span class="country-name">Bahrain</span> 4064 </div> 4065 <div class="country-option " 4066 data-value="BD" 4067 data-code="bd" 4068 data-flag="bd" 4069 data-search="bangladesh bangladesh bd" 4070 role="option" 4071 aria-selected="false"> 4072 <span class="country-flag fi fi-bd"></span> 4073 <span class="country-name">Bangladesh</span> 4074 </div> 4075 <div class="country-option " 4076 data-value="BB" 4077 data-code="bb" 4078 data-flag="bb" 4079 data-search="barbados barbados bb" 4080 role="option" 4081 aria-selected="false"> 4082 <span class="country-flag fi fi-bb"></span> 4083 <span class="country-name">Barbados</span> 4084 </div> 4085 <div class="country-option " 4086 data-value="BE" 4087 data-code="be" 4088 data-flag="be" 4089 data-search="belgica belgium be" 4090 role="option" 4091 aria-selected="false"> 4092 <span class="country-flag fi fi-be"></span> 4093 <span class="country-name">Belgica</span> 4094 </div> 4095 <div class="country-option " 4096 data-value="BZ" 4097 data-code="bz" 4098 data-flag="bz" 4099 data-search="belice belize bz" 4100 role="option" 4101 aria-selected="false"> 4102 <span class="country-flag fi fi-bz"></span> 4103 <span class="country-name">Belice</span> 4104 </div> 4105 <div class="country-option " 4106 data-value="BJ" 4107 data-code="bj" 4108 data-flag="bj" 4109 data-search="benin benin bj" 4110 role="option" 4111 aria-selected="false">
4112 <span class="country-flag fi fi-bj"></span> 4113 <span class="country-name">Benin</span> 4114 </div> 4115 <div class="country-option " 4116 data-value="BM" 4117 data-code="bm" 4118 data-flag="bm" 4119 data-search="bermudas bermuda bm" 4120 role="option" 4121 aria-selected="false"> 4122 <span class="country-flag fi fi-bm"></span> 4123 <span class="country-name">Bermudas</span> 4124 </div> 4125 <div class="country-option " 4126 data-value="BY" 4127 data-code="by" 4128 data-flag="by" 4129 data-search="bielorrusia belarus by" 4130 role="option" 4131 aria-selected="false"> 4132 <span class="country-flag fi fi-by"></span> 4133 <span class="country-name">Bielorrusia</span> 4134 </div> 4135 <div class="country-option " 4136 data-value="BA" 4137 data-code="ba" 4138 data-flag="ba" 4139 data-search="bosnia y herzegovina bosnia and herzegovina ba" 4140 role="option" 4141 aria-selected="false"> 4142 <span class="country-flag fi fi-ba"></span> 4143 <span class="country-name">Bosnia y Herzegovina</span> 4144 </div> 4145 <div class="country-option " 4146 data-value="BW" 4147 data-code="bw" 4148 data-flag="bw" 4149 data-search="botswana botswana bw" 4150 role="option" 4151 aria-selected="false"> 4152 <span class="country-flag fi fi-bw"></span> 4153 <span class="country-name">Botswana</span> 4154 </div> 4155 <div class="country-option " 4156 data-value="BN" 4157 data-code="bn" 4158 data-flag="bn" 4159 data-search="brunei darussalam brunei darussalam bn" 4160 role="option" 4161 aria-selected="false"> 4162 <span class="country-flag fi fi-bn"></span> 4163 <span class="country-name">Brunei Darussalam</span> 4164 </div> 4165 <div class="country-option " 4166 data-value="BG" 4167 data-code="bg" 4168 data-flag="bg" 4169 data-search="bulgaria bulgaria bg" 4170 role="option" 4171 aria-selected="false"> 4172 <span class="country-flag fi fi-bg"></span> 4173 <span class="country-name">Bulgaria</span> 4174 </div> 4175 <div class="country-option " 4176 data-value="BF" 4177 data-code="bf" 4178 data-flag="bf" 4179 data-search="burkina faso burkina faso bf" 4180 role="option" 4181 aria-selected="false">
4182 <span class="country-flag fi fi-bf"></span> 4183 <span class="country-name">Burkina Faso</span> 4184 </div> 4185 <div class="country-option " 4186 data-value="BI" 4187 data-code="bi" 4188 data-flag="bi" 4189 data-search="burundi burundi bi" 4190 role="option" 4191 aria-selected="false"> 4192 <span class="country-flag fi fi-bi"></span> 4193 <span class="country-name">Burundi</span> 4194 </div> 4195 <div class="country-option " 4196 data-value="BT" 4197 data-code="bt" 4198 data-flag="bt" 4199 data-search="butan bhutan bt" 4200 role="option" 4201 aria-selected="false"> 4202 <span class="country-flag fi fi-bt"></span> 4203 <span class="country-name">Butan</span> 4204 </div> 4205 <div class="country-option " 4206 data-value="CV" 4207 data-code="cv" 4208 data-flag="cv" 4209 data-search="cabo verde cape verde cv" 4210 role="option" 4211 aria-selected="false"> 4212 <span class="country-flag fi fi-cv"></span> 4213 <span class="country-name">Cabo Verde</span> 4214 </div> 4215 <div class="country-option " 4216 data-value="KH" 4217 data-code="kh" 4218 data-flag="kh" 4219 data-search="camboya cambodia kh" 4220 role="option" 4221 aria-selected="false"> 4222 <span class="country-flag fi fi-kh"></span> 4223 <span class="country-name">Camboya</span> 4224 </div> 4225 <div class="country-option " 4226 data-value="CM" 4227 data-code="cm" 4228 data-flag="cm" 4229 data-search="camerun cameroon cm" 4230 role="option" 4231 aria-selected="false"> 4232 <span class="country-flag fi fi-cm"></span> 4233 <span class="country-name">Camerun</span> 4234 </div> 4235 <div class="country-option " 4236 data-value="CA" 4237 data-code="ca" 4238 data-flag="ca" 4239 data-search="canada canada ca" 4240 role="option" 4241 aria-selected="false"> 4242 <span class="country-flag fi fi-ca"></span> 4243 <span class="country-name">Canada</span> 4244 </div> 4245 <div class="country-option " 4246 data-value="BQ" 4247 data-code="bq" 4248 data-flag="bq" 4249 data-search="caribe neerlandés caribbean netherlands bq" 4250 role="option" 4251 aria-selected="false">
4252 <span class="country-flag fi fi-bq"></span> 4253 <span class="country-name">Caribe Neerlandés</span> 4254 </div> 4255 <div class="country-option " 4256 data-value="TD" 4257 data-code="td" 4258 data-flag="td" 4259 data-search="chad chad td" 4260 role="option" 4261 aria-selected="false"> 4262 <span class="country-flag fi fi-td"></span> 4263 <span class="country-name">Chad</span> 4264 </div> 4265 <div class="country-option " 4266 data-value="CN" 4267 data-code="cn" 4268 data-flag="cn" 4269 data-search="china china cn" 4270 role="option" 4271 aria-selected="false"> 4272 <span class="country-flag fi fi-cn"></span> 4273 <span class="country-name">China</span> 4274 </div> 4275 <div class="country-option " 4276 data-value="CY" 4277 data-code="cy" 4278 data-flag="cy" 4279 data-search="chipre cyprus cy" 4280 role="option" 4281 aria-selected="false"> 4282 <span class="country-flag fi fi-cy"></span> 4283 <span class="country-name">Chipre</span> 4284 </div> 4285 <div class="country-option " 4286 data-value="KM" 4287 data-code="km" 4288 data-flag="km" 4289 data-search="comoras comoros km" 4290 role="option" 4291 aria-selected="false"> 4292 <span class="country-flag fi fi-km"></span> 4293 <span class="country-name">Comoras</span> 4294 </div> 4295 <div class="country-option " 4296 data-value="CG" 4297 data-code="cg" 4298 data-flag="cg" 4299 data-search="congo republic of the congo cg" 4300 role="option" 4301 aria-selected="false"> 4302 <span class="country-flag fi fi-cg"></span> 4303 <span class="country-name">Congo</span> 4304 </div> 4305 <div class="country-option " 4306 data-value="KR" 4307 data-code="kr" 4308 data-flag="kr" 4309 data-search="corea republic of korea kr" 4310 role="option" 4311 aria-selected="false"> 4312 <span class="country-flag fi fi-kr"></span> 4313 <span class="country-name">Corea</span> 4314 </div> 4315 <div class="country-option " 4316 data-value="KP" 4317 data-code="kp"
4318 data-flag="kp" 4319 data-search="corea democrática democratic people's republic of korea kp" 4320 role="option" 4321 aria-selected="false"> 4322 <span class="country-flag fi fi-kp"></span> 4323 <span class="country-name">Corea Democrática</span> 4324 </div> 4325 <div class="country-option " 4326 data-value="CI" 4327 data-code="ci" 4328 data-flag="ci" 4329 data-search="costa de marfil côte d'ivoire ci" 4330 role="option" 4331 aria-selected="false"> 4332 <span class="country-flag fi fi-ci"></span> 4333 <span class="country-name">Costa de Marfil</span> 4334 </div> 4335 <div class="country-option " 4336 data-value="CR" 4337 data-code="cr" 4338 data-flag="cr" 4339 data-search="costa rica costa rica cr" 4340 role="option" 4341 aria-selected="false"> 4342 <span class="country-flag fi fi-cr"></span> 4343 <span class="country-name">Costa Rica</span> 4344 </div> 4345 <div class="country-option " 4346 data-value="HR" 4347 data-code="hr" 4348 data-flag="hr" 4349 data-search="croacia croatia hr" 4350 role="option" 4351 aria-selected="false"> 4352 <span class="country-flag fi fi-hr"></span> 4353 <span class="country-name">Croacia</span> 4354 </div> 4355 <div class="country-option " 4356 data-value="CU" 4357 data-code="cu" 4358 data-flag="cu" 4359 data-search="cuba cuba cu" 4360 role="option" 4361 aria-selected="false"> 4362 <span class="country-flag fi fi-cu"></span> 4363 <span class="country-name">Cuba</span> 4364 </div> 4365 <div class="country-option " 4366 data-value="CW" 4367 data-code="cw" 4368 data-flag="cw" 4369 data-search="curazao curaçao cw" 4370 role="option" 4371 aria-selected="false"> 4372 <span class="country-flag fi fi-cw"></span> 4373 <span class="country-name">Curazao</span> 4374 </div> 4375 <div class="country-option " 4376 data-value="DK" 4377 data-code="dk" 4378 data-flag="dk" 4379 data-search="dinamarca denmark dk" 4380 role="option" 4381 aria-selected="false">
4382 <span class="country-flag fi fi-dk"></span> 4383 <span class="country-name">Dinamarca</span> 4384 </div> 4385 <div class="country-option " 4386 data-value="DJ" 4387 data-code="dj" 4388 data-flag="dj" 4389 data-search="djibouti djibouti dj" 4390 role="option" 4391 aria-selected="false"> 4392 <span class="country-flag fi fi-dj"></span> 4393 <span class="country-name">Djibouti</span> 4394 </div> 4395 <div class="country-option " 4396 data-value="DM" 4397 data-code="dm" 4398 data-flag="dm" 4399 data-search="dominica dominica dm" 4400 role="option" 4401 aria-selected="false"> 4402 <span class="country-flag fi fi-dm"></span> 4403 <span class="country-name">Dominica</span> 4404 </div> 4405 <div class="country-option " 4406 data-value="EG" 4407 data-code="eg" 4408 data-flag="eg" 4409 data-search="egipto egypt eg" 4410 role="option" 4411 aria-selected="false"> 4412 <span class="country-flag fi fi-eg"></span> 4413 <span class="country-name">Egipto</span> 4414 </div> 4415 <div class="country-option " 4416 data-value="SV" 4417 data-code="sv" 4418 data-flag="sv" 4419 data-search="el salvador el salvador sv" 4420 role="option" 4421 aria-selected="false"> 4422 <span class="country-flag fi fi-sv"></span> 4423 <span class="country-name">El Salvador</span> 4424 </div> 4425 <div class="country-option " 4426 data-value="AE" 4427 data-code="ae" 4428 data-flag="ae" 4429 data-search="emiratos arabes unidos united arab emirates ae" 4430 role="option" 4431 aria-selected="false"> 4432 <span class="country-flag fi fi-ae"></span> 4433 <span class="country-name">Emiratos Arabes Unidos</span> 4434 </div> 4435 <div class="country-option " 4436 data-value="ER" 4437 data-code="er" 4438 data-flag="er" 4439 data-search="eritrea eritrea er" 4440 role="option" 4441 aria-selected="false"> 4442 <span class="country-flag fi fi-er"></span> 4443 <span class="country-name">Eritrea</span> 4444 </div> 4445 <div class="country-option " 4446 data-value="XS" 4447 data-code="xs" 4448 data-flag="xs" 4449 data-search="escocia scotland xs" 4450 role="option" 4451 aria-selected="false">
4452 <span class="country-flag fi fi-xs"></span> 4453 <span class="country-name">Escocia</span> 4454 </div> 4455 <div class="country-option " 4456 data-value="SK" 4457 data-code="sk" 4458 data-flag="sk" 4459 data-search="eslovaquia slovak republic sk" 4460 role="option" 4461 aria-selected="false"> 4462 <span class="country-flag fi fi-sk"></span> 4463 <span class="country-name">Eslovaquia</span> 4464 </div> 4465 <div class="country-option " 4466 data-value="SI" 4467 data-code="si" 4468 data-flag="si" 4469 data-search="eslovenia slovenia si" 4470 role="option" 4471 aria-selected="false"> 4472 <span class="country-flag fi fi-si"></span> 4473 <span class="country-name">Eslovenia</span> 4474 </div> 4475 <div class="country-option " 4476 data-value="ES" 4477 data-code="es" 4478 data-flag="es" 4479 data-search="españa spain es" 4480 role="option" 4481 aria-selected="false"> 4482 <span class="country-flag fi fi-es"></span> 4483 <span class="country-name">España</span> 4484 </div> 4485 <div class="country-option " 4486 data-value="VA" 4487 data-code="va" 4488 data-flag="va" 4489 data-search="estado vaticano vatican city state va" 4490 role="option" 4491 aria-selected="false"> 4492 <span class="country-flag fi fi-va"></span> 4493 <span class="country-name">Estado Vaticano</span> 4494 </div> 4495 <div class="country-option selected" 4496 data-value="US" 4497 data-code="us" 4498 data-flag="us" 4499 data-search="estados unidos united states us" 4500 role="option" 4501 aria-selected="true"> 4502 <span class="country-flag fi fi-us"></span> 4503 <span class="country-name">Estados Unidos</span> 4504 <span class="country-check"> 4505 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4506 <path d="M11.6667 3.5L5.25 9.91667L2.33333 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> 4507 </svg> 4508 </span> 4509 </div> 4510 <div class="country-option " 4511 data-value="EE" 4512 data-code="ee" 4513 data-flag="ee" 4514 data-search="estonia estonia ee" 4515 role="option" 4516 aria-selected="false">
4517 <span class="country-flag fi fi-ee"></span> 4518 <span class="country-name">Estonia</span> 4519 </div> 4520 <div class="country-option " 4521 data-value="SJ" 4522 data-code="sj" 4523 data-flag="sj" 4524 data-search="esvalbard y jan mayen svalbard and jan mayen sj" 4525 role="option" 4526 aria-selected="false"> 4527 <span class="country-flag fi fi-sj"></span> 4528 <span class="country-name">Esvalbard y Jan Mayen</span> 4529 </div> 4530 <div class="country-option " 4531 data-value="ET" 4532 data-code="et" 4533 data-flag="et" 4534 data-search="etiopia ethiopia et" 4535 role="option" 4536 aria-selected="false"> 4537 <span class="country-flag fi fi-et"></span> 4538 <span class="country-name">Etiopia</span> 4539 </div> 4540 <div class="country-option " 4541 data-value="FJ" 4542 data-code="fj" 4543 data-flag="fj" 4544 data-search="fiji fiji fj" 4545 role="option" 4546 aria-selected="false"> 4547 <span class="country-flag fi fi-fj"></span> 4548 <span class="country-name">Fiji</span> 4549 </div> 4550 <div class="country-option " 4551 data-value="PH" 4552 data-code="ph" 4553 data-flag="ph" 4554 data-search="filipinas philippines ph" 4555 role="option" 4556 aria-selected="false"> 4557 <span class="country-flag fi fi-ph"></span> 4558 <span class="country-name">Filipinas</span> 4559 </div> 4560 <div class="country-option " 4561 data-value="FI" 4562 data-code="fi" 4563 data-flag="fi" 4564 data-search="finlandia finland fi" 4565 role="option" 4566 aria-selected="false"> 4567 <span class="country-flag fi fi-fi"></span> 4568 <span class="country-name">Finlandia</span> 4569 </div> 4570 <div class="country-option " 4571 data-value="FR" 4572 data-code="fr" 4573 data-flag="fr" 4574 data-search="francia france fr" 4575 role="option" 4576 aria-selected="false"> 4577 <span class="country-flag fi fi-fr"></span> 4578 <span class="country-name">Francia</span> 4579 </div> 4580 <div class="country-option " 4581 data-value="GA" 4582 data-code="ga" 4583 data-flag="ga" 4584 data-search="gabon gabon ga" 4585 role="option" 4586 aria-selected="false">
4587 <span class="country-flag fi fi-ga"></span> 4588 <span class="country-name">Gabon</span> 4589 </div> 4590 <div class="country-option " 4591 data-value="XW" 4592 data-code="xw" 4593 data-flag="xw" 4594 data-search="gales wales xw" 4595 role="option" 4596 aria-selected="false"> 4597 <span class="country-flag fi fi-xw"></span> 4598 <span class="country-name">Gales</span> 4599 </div> 4600 <div class="country-option " 4601 data-value="GM" 4602 data-code="gm" 4603 data-flag="gm" 4604 data-search="gambia gambia gm" 4605 role="option" 4606 aria-selected="false"> 4607 <span class="country-flag fi fi-gm"></span> 4608 <span class="country-name">Gambia</span> 4609 </div> 4610 <div class="country-option " 4611 data-value="GE" 4612 data-code="ge" 4613 data-flag="ge" 4614 data-search="georgia georgia ge" 4615 role="option" 4616 aria-selected="false"> 4617 <span class="country-flag fi fi-ge"></span> 4618 <span class="country-name">Georgia</span> 4619 </div> 4620 <div class="country-option " 4621 data-value="GS" 4622 data-code="gs" 4623 data-flag="gs" 4624 data-search="georgia del sur e islas sandwich del sur south georgia and the south sandwich islands gs" 4625 role="option" 4626 aria-selected="false"> 4627 <span class="country-flag fi fi-gs"></span> 4628 <span class="country-name">Georgia del Sur e Islas Sandwich del Sur</span> 4629 </div> 4630 <div class="country-option " 4631 data-value="GH" 4632 data-code="gh" 4633 data-flag="gh" 4634 data-search="ghana ghana gh" 4635 role="option" 4636 aria-selected="false"> 4637 <span class="country-flag fi fi-gh"></span> 4638 <span class="country-name">Ghana</span> 4639 </div> 4640 <div class="country-option " 4641 data-value="GI" 4642 data-code="gi" 4643 data-flag="gi" 4644 data-search="gibraltar gibraltar gi" 4645 role="option" 4646 aria-selected="false"> 4647 <span class="country-flag fi fi-gi"></span> 4648 <span class="country-name">Gibraltar</span> 4649 </div> 4650 <div class="country-option " 4651 data-value="GD" 4652 data-code="gd" 4653 data-flag="gd" 4654 data-search="granada grenada gd" 4655 role="option" 4656 aria-selected="false">
4657 <span class="country-flag fi fi-gd"></span> 4658 <span class="country-name">Granada</span> 4659 </div> 4660 <div class="country-option " 4661 data-value="GR" 4662 data-code="gr" 4663 data-flag="gr" 4664 data-search="grecia greece gr" 4665 role="option" 4666 aria-selected="false"> 4667 <span class="country-flag fi fi-gr"></span> 4668 <span class="country-name">Grecia</span> 4669 </div> 4670 <div class="country-option " 4671 data-value="GL" 4672 data-code="gl" 4673 data-flag="gl" 4674 data-search="groenlandia greenland gl" 4675 role="option" 4676 aria-selected="false"> 4677 <span class="country-flag fi fi-gl"></span> 4678 <span class="country-name">Groenlandia</span> 4679 </div> 4680 <div class="country-option " 4681 data-value="GP" 4682 data-code="gp" 4683 data-flag="gp" 4684 data-search="guadalupe guadeloupe gp" 4685 role="option" 4686 aria-selected="false"> 4687 <span class="country-flag fi fi-gp"></span> 4688 <span class="country-name">Guadalupe</span> 4689 </div> 4690 <div class="country-option " 4691 data-value="GU" 4692 data-code="gu" 4693 data-flag="gu" 4694 data-search="guam guam gu" 4695 role="option" 4696 aria-selected="false"> 4697 <span class="country-flag fi fi-gu"></span> 4698 <span class="country-name">Guam</span> 4699 </div> 4700 <div class="country-option " 4701 data-value="GT" 4702 data-code="gt" 4703 data-flag="gt" 4704 data-search="guatemala guatemala gt" 4705 role="option" 4706 aria-selected="false"> 4707 <span class="country-flag fi fi-gt"></span> 4708 <span class="country-name">Guatemala</span> 4709 </div> 4710 <div class="country-option " 4711 data-value="GY" 4712 data-code="gy" 4713 data-flag="gy" 4714 data-search="guayana guyana gy" 4715 role="option" 4716 aria-selected="false"> 4717 <span class="country-flag fi fi-gy"></span> 4718 <span class="country-name">Guayana</span> 4719 </div> 4720 <div class="country-option " 4721 data-value="GG" 4722 data-code="gg" 4723 data-flag="gg" 4724 data-search="guernesey guernsey gg" 4725 role="option" 4726 aria-selected="false">
4727 <span class="country-flag fi fi-gg"></span> 4728 <span class="country-name">Guernesey</span> 4729 </div> 4730 <div class="country-option " 4731 data-value="GN" 4732 data-code="gn" 4733 data-flag="gn" 4734 data-search="guinea guinea gn" 4735 role="option" 4736 aria-selected="false"> 4737 <span class="country-flag fi fi-gn"></span> 4738 <span class="country-name">Guinea</span> 4739 </div> 4740 <div class="country-option " 4741 data-value="GQ" 4742 data-code="gq" 4743 data-flag="gq" 4744 data-search="guinea ecuatorial equatorial guinea gq" 4745 role="option" 4746 aria-selected="false"> 4747 <span class="country-flag fi fi-gq"></span> 4748 <span class="country-name">Guinea Ecuatorial</span> 4749 </div> 4750 <div class="country-option " 4751 data-value="GF" 4752 data-code="gf" 4753 data-flag="gf" 4754 data-search="guinea francesa french guiana gf" 4755 role="option" 4756 aria-selected="false"> 4757 <span class="country-flag fi fi-gf"></span> 4758 <span class="country-name">Guinea Francesa</span> 4759 </div> 4760 <div class="country-option " 4761 data-value="GW" 4762 data-code="gw" 4763 data-flag="gw" 4764 data-search="guinea-bissau guinea-bissau gw" 4765 role="option" 4766 aria-selected="false"> 4767 <span class="country-flag fi fi-gw"></span> 4768 <span class="country-name">Guinea-Bissau</span> 4769 </div> 4770 <div class="country-option " 4771 data-value="HT" 4772 data-code="ht" 4773 data-flag="ht" 4774 data-search="haiti haiti ht" 4775 role="option" 4776 aria-selected="false"> 4777 <span class="country-flag fi fi-ht"></span> 4778 <span class="country-name">Haiti</span> 4779 </div> 4780 <div class="country-option " 4781 data-value="HN" 4782 data-code="hn" 4783 data-flag="hn" 4784 data-search="honduras honduras hn" 4785 role="option" 4786 aria-selected="false"> 4787 <span class="country-flag fi fi-hn"></span> 4788 <span class="country-name">Honduras</span> 4789 </div> 4790 <div class="country-option " 4791 data-value="HK" 4792 data-code="hk" 4793 data-flag="hk" 4794 data-search="hong kong hong kong hk" 4795 role="option" 4796 aria-selected="false">
4797 <span class="country-flag fi fi-hk"></span> 4798 <span class="country-name">Hong Kong</span> 4799 </div> 4800 <div class="country-option " 4801 data-value="HU" 4802 data-code="hu" 4803 data-flag="hu" 4804 data-search="hungria hungary hu" 4805 role="option" 4806 aria-selected="false"> 4807 <span class="country-flag fi fi-hu"></span> 4808 <span class="country-name">Hungria</span> 4809 </div> 4810 <div class="country-option " 4811 data-value="IN" 4812 data-code="in" 4813 data-flag="in" 4814 data-search="india india in" 4815 role="option" 4816 aria-selected="false"> 4817 <span class="country-flag fi fi-in"></span> 4818 <span class="country-name">India</span> 4819 </div> 4820 <div class="country-option " 4821 data-value="ID" 4822 data-code="id" 4823 data-flag="id" 4824 data-search="indonesia indonesia id" 4825 role="option" 4826 aria-selected="false"> 4827 <span class="country-flag fi fi-id"></span> 4828 <span class="country-name">Indonesia</span> 4829 </div> 4830 <div class="country-option " 4831 data-value="XE" 4832 data-code="xe" 4833 data-flag="xe" 4834 data-search="inglaterra england xe" 4835 role="option" 4836 aria-selected="false"> 4837 <span class="country-flag fi fi-xe"></span> 4838 <span class="country-name">Inglaterra</span> 4839 </div> 4840 <div class="country-option " 4841 data-value="IQ" 4842 data-code="iq" 4843 data-flag="iq" 4844 data-search="irak iraq iq" 4845 role="option" 4846 aria-selected="false"> 4847 <span class="country-flag fi fi-iq"></span> 4848 <span class="country-name">Irak</span> 4849 </div> 4850 <div class="country-option " 4851 data-value="IR" 4852 data-code="ir" 4853 data-flag="ir" 4854 data-search="iran islamic republic of iran ir" 4855 role="option" 4856 aria-selected="false"> 4857 <span class="country-flag fi fi-ir"></span> 4858 <span class="country-name">Iran</span> 4859 </div> 4860 <div class="country-option " 4861 data-value="IE" 4862 data-code="ie" 4863 data-flag="ie" 4864 data-search="irlanda ireland ie" 4865 role="option" 4866 aria-selected="false">
4867 <span class="country-flag fi fi-ie"></span> 4868 <span class="country-name">Irlanda</span> 4869 </div> 4870 <div class="country-option " 4871 data-value="XI" 4872 data-code="xi" 4873 data-flag="xi" 4874 data-search="irlanda del norte northern ireland xi" 4875 role="option" 4876 aria-selected="false"> 4877 <span class="country-flag fi fi-xi"></span> 4878 <span class="country-name">Irlanda del Norte</span> 4879 </div> 4880 <div class="country-option " 4881 data-value="BV" 4882 data-code="bv" 4883 data-flag="bv" 4884 data-search="isla bouvet bouvet island bv" 4885 role="option" 4886 aria-selected="false"> 4887 <span class="country-flag fi fi-bv"></span> 4888 <span class="country-name">Isla Bouvet</span> 4889 </div> 4890 <div class="country-option " 4891 data-value="IM" 4892 data-code="im" 4893 data-flag="im" 4894 data-search="isla de man isle of man im" 4895 role="option" 4896 aria-selected="false"> 4897 <span class="country-flag fi fi-im"></span> 4898 <span class="country-name">Isla de Man</span> 4899 </div> 4900 <div class="country-option " 4901 data-value="CX" 4902 data-code="cx" 4903 data-flag="cx" 4904 data-search="isla navidad christmas island cx" 4905 role="option" 4906 aria-selected="false"> 4907 <span class="country-flag fi fi-cx"></span> 4908 <span class="country-name">Isla Navidad</span> 4909 </div> 4910 <div class="country-option " 4911 data-value="IS" 4912 data-code="is" 4913 data-flag="is" 4914 data-search="islandia iceland is" 4915 role="option" 4916 aria-selected="false"> 4917 <span class="country-flag fi fi-is"></span> 4918 <span class="country-name">Islandia</span> 4919 </div> 4920 <div class="country-option " 4921 data-value="AX" 4922 data-code="ax" 4923 data-flag="ax" 4924 data-search="islas aland à land islands ax" 4925 role="option" 4926 aria-selected="false"> 4927 <span class="country-flag fi fi-ax"></span> 4928 <span class="country-name">Islas Aland</span> 4929 </div> 4930 <div class="country-option " 4931 data-value="KY" 4932 data-code="ky" 4933 data-flag="ky" 4934 data-search="islas caiman cayman islands ky" 4935 role="option" 4936 aria-selected="false">
4937 <span class="country-flag fi fi-ky"></span> 4938 <span class="country-name">Islas Caiman</span> 4939 </div> 4940 <div class="country-option " 4941 data-value="CC" 4942 data-code="cc" 4943 data-flag="cc" 4944 data-search="islas cocos (keeling) cocos (keeling) islands cc" 4945 role="option" 4946 aria-selected="false"> 4947 <span class="country-flag fi fi-cc"></span> 4948 <span class="country-name">Islas Cocos (Keeling)</span> 4949 </div> 4950 <div class="country-option " 4951 data-value="CK" 4952 data-code="ck" 4953 data-flag="ck" 4954 data-search="islas cook cook islands ck" 4955 role="option" 4956 aria-selected="false"> 4957 <span class="country-flag fi fi-ck"></span> 4958 <span class="country-name">Islas Cook</span> 4959 </div> 4960 <div class="country-option " 4961 data-value="MP" 4962 data-code="mp" 4963 data-flag="mp" 4964 data-search="islas de norte-mariana northern mariana islands mp" 4965 role="option" 4966 aria-selected="false"> 4967 <span class="country-flag fi fi-mp"></span> 4968 <span class="country-name">Islas de Norte-Mariana</span> 4969 </div> 4970 <div class="country-option " 4971 data-value="FO" 4972 data-code="fo" 4973 data-flag="fo" 4974 data-search="islas faroe faroe islands fo" 4975 role="option" 4976 aria-selected="false"> 4977 <span class="country-flag fi fi-fo"></span> 4978 <span class="country-name">Islas Faroe</span> 4979 </div> 4980 <div class="country-option " 4981 data-value="HM" 4982 data-code="hm" 4983 data-flag="hm" 4984 data-search="islas heard e islas mcdonald heard island and mcdonald islands hm" 4985 role="option" 4986 aria-selected="false"> 4987 <span class="country-flag fi fi-hm"></span> 4988 <span class="country-name">Islas Heard e Islas McDonald</span> 4989 </div> 4990 <div class="country-option " 4991 data-value="FK" 4992 data-code="fk" 4993 data-flag="fk" 4994 data-search="islas malvinas falkland islands fk" 4995 role="option" 4996 aria-selected="false">
4997 <span class="country-flag fi fi-fk"></span> 4998 <span class="country-name">Islas Malvinas</span> 4999 </div> 5000 <div class="country-option " 5001 data-value="MH" 5002 data-code="mh" 5003 data-flag="mh" 5004 data-search="islas marshall marshall islands mh" 5005 role="option" 5006 aria-selected="false"> 5007 <span class="country-flag fi fi-mh"></span> 5008 <span class="country-name">Islas Marshall</span> 5009 </div> 5010 <div class="country-option " 5011 data-value="NF" 5012 data-code="nf" 5013 data-flag="nf" 5014 data-search="islas norfolk norfolk island nf" 5015 role="option" 5016 aria-selected="false"> 5017 <span class="country-flag fi fi-nf"></span> 5018 <span class="country-name">Islas Norfolk</span> 5019 </div> 5020 <div class="country-option " 5021 data-value="SB" 5022 data-code="sb" 5023 data-flag="sb" 5024 data-search="islas salomon solomon islands sb" 5025 role="option" 5026 aria-selected="false"> 5027 <span class="country-flag fi fi-sb"></span> 5028 <span class="country-name">Islas Salomon</span> 5029 </div> 5030 <div class="country-option " 5031 data-value="TC" 5032 data-code="tc" 5033 data-flag="tc" 5034 data-search="islas turks y caicos turks and caicos islands tc" 5035 role="option" 5036 aria-selected="false"> 5037 <span class="country-flag fi fi-tc"></span> 5038 <span class="country-name">Islas Turks y Caicos</span> 5039 </div> 5040 <div class="country-option " 5041 data-value="UM" 5042 data-code="um" 5043 data-flag="um" 5044 data-search="islas ultramarinas de estados unidos united states minor outlying islands um" 5045 role="option" 5046 aria-selected="false"> 5047 <span class="country-flag fi fi-um"></span> 5048 <span class="country-name">Islas Ultramarinas de Estados Unidos</span> 5049 </div> 5050 <div class="country-option " 5051 data-value="VG" 5052 data-code="vg" 5053 data-flag="vg" 5054 data-search="islas virgenes britanicas british virgin islands vg" 5055 role="option" 5056 aria-selected="false">
5057 <span class="country-flag fi fi-vg"></span> 5058 <span class="country-name">Islas Virgenes Britanicas</span> 5059 </div> 5060 <div class="country-option " 5061 data-value="VI" 5062 data-code="vi" 5063 data-flag="vi" 5064 data-search="islas virgenes estadounidenses u.s. virgin islands vi" 5065 role="option" 5066 aria-selected="false"> 5067 <span class="country-flag fi fi-vi"></span> 5068 <span class="country-name">Islas Virgenes Estadounidenses</span> 5069 </div> 5070 <div class="country-option " 5071 data-value="IL" 5072 data-code="il" 5073 data-flag="il" 5074 data-search="israel israel il" 5075 role="option" 5076 aria-selected="false"> 5077 <span class="country-flag fi fi-il"></span> 5078 <span class="country-name">Israel</span> 5079 </div> 5080 <div class="country-option " 5081 data-value="IT" 5082 data-code="it" 5083 data-flag="it" 5084 data-search="italia italy it" 5085 role="option" 5086 aria-selected="false"> 5087 <span class="country-flag fi fi-it"></span> 5088 <span class="country-name">Italia</span> 5089 </div> 5090 <div class="country-option " 5091 data-value="JM" 5092 data-code="jm" 5093 data-flag="jm" 5094 data-search="jamaica jamaica jm" 5095 role="option" 5096 aria-selected="false"> 5097 <span class="country-flag fi fi-jm"></span> 5098 <span class="country-name">Jamaica</span> 5099 </div> 5100 <div class="country-option " 5101 data-value="JP" 5102 data-code="jp" 5103 data-flag="jp" 5104 data-search="japon japan jp" 5105 role="option" 5106 aria-selected="false"> 5107 <span class="country-flag fi fi-jp"></span> 5108 <span class="country-name">Japon</span> 5109 </div> 5110 <div class="country-option " 5111 data-value="JE" 5112 data-code="je" 5113 data-flag="je" 5114 data-search="jersey jersey je" 5115 role="option" 5116 aria-selected="false"> 5117 <span class="country-flag fi fi-je"></span> 5118 <span class="country-name">Jersey</span> 5119 </div> 5120 <div class="country-option " 5121 data-value="JO" 5122 data-code="jo" 5123 data-flag="jo" 5124 data-search="jordania jordan jo" 5125 role="option" 5126 aria-selected="false">
5127 <span class="country-flag fi fi-jo"></span> 5128 <span class="country-name">Jordania</span> 5129 </div> 5130 <div class="country-option " 5131 data-value="KZ" 5132 data-code="kz" 5133 data-flag="kz" 5134 data-search="kazajstan kazakhstan kz" 5135 role="option" 5136 aria-selected="false"> 5137 <span class="country-flag fi fi-kz"></span> 5138 <span class="country-name">Kazajstan</span> 5139 </div> 5140 <div class="country-option " 5141 data-value="KE" 5142 data-code="ke" 5143 data-flag="ke" 5144 data-search="kenia kenya ke" 5145 role="option" 5146 aria-selected="false"> 5147 <span class="country-flag fi fi-ke"></span> 5148 <span class="country-name">Kenia</span> 5149 </div> 5150 <div class="country-option " 5151 data-value="KG" 5152 data-code="kg" 5153 data-flag="kg" 5154 data-search="kirguizistan kyrgyzstan kg" 5155 role="option" 5156 aria-selected="false"> 5157 <span class="country-flag fi fi-kg"></span> 5158 <span class="country-name">Kirguizistan</span> 5159 </div> 5160 <div class="country-option " 5161 data-value="KI" 5162 data-code="ki" 5163 data-flag="ki" 5164 data-search="kiribati kiribati ki" 5165 role="option" 5166 aria-selected="false"> 5167 <span class="country-flag fi fi-ki"></span> 5168 <span class="country-name">Kiribati</span> 5169 </div> 5170 <div class="country-option " 5171 data-value="KW" 5172 data-code="kw" 5173 data-flag="kw" 5174 data-search="kuwait kuwait kw" 5175 role="option" 5176 aria-selected="false"> 5177 <span class="country-flag fi fi-kw"></span> 5178 <span class="country-name">Kuwait</span> 5179 </div> 5180 <div class="country-option " 5181 data-value="LA" 5182 data-code="la" 5183 data-flag="la" 5184 data-search="laos lao people's democratic republic la" 5185 role="option" 5186 aria-selected="false"> 5187 <span class="country-flag fi fi-la"></span> 5188 <span class="country-name">Laos</span> 5189 </div> 5190 <div class="country-option " 5191 data-value="LS" 5192 data-code="ls" 5193 data-flag="ls" 5194 data-search="lesoto lesotho ls" 5195 role="option" 5196 aria-selected="false">
5197 <span class="country-flag fi fi-ls"></span> 5198 <span class="country-name">Lesoto</span> 5199 </div> 5200 <div class="country-option " 5201 data-value="LV" 5202 data-code="lv" 5203 data-flag="lv" 5204 data-search="letonia latvia lv" 5205 role="option" 5206 aria-selected="false"> 5207 <span class="country-flag fi fi-lv"></span> 5208 <span class="country-name">Letonia</span> 5209 </div> 5210 <div class="country-option " 5211 data-value="LB" 5212 data-code="lb" 5213 data-flag="lb" 5214 data-search="libano lebanon lb" 5215 role="option" 5216 aria-selected="false"> 5217 <span class="country-flag fi fi-lb"></span> 5218 <span class="country-name">Libano</span> 5219 </div> 5220 <div class="country-option " 5221 data-value="LR" 5222 data-code="lr" 5223 data-flag="lr" 5224 data-search="liberia liberia lr" 5225 role="option" 5226 aria-selected="false"> 5227 <span class="country-flag fi fi-lr"></span> 5228 <span class="country-name">Liberia</span> 5229 </div> 5230 <div class="country-option " 5231 data-value="LY" 5232 data-code="ly" 5233 data-flag="ly" 5234 data-search="libia libyan arab jamahiriya ly" 5235 role="option" 5236 aria-selected="false"> 5237 <span class="country-flag fi fi-ly"></span> 5238 <span class="country-name">Libia</span> 5239 </div> 5240 <div class="country-option " 5241 data-value="LI" 5242 data-code="li" 5243 data-flag="li" 5244 data-search="liechtenstein liechtenstein li" 5245 role="option" 5246 aria-selected="false"> 5247 <span class="country-flag fi fi-li"></span> 5248 <span class="country-name">Liechtenstein</span> 5249 </div> 5250 <div class="country-option " 5251 data-value="LT" 5252 data-code="lt" 5253 data-flag="lt" 5254 data-search="lituania lithuania lt" 5255 role="option" 5256 aria-selected="false"> 5257 <span class="country-flag fi fi-lt"></span> 5258 <span class="country-name">Lituania</span> 5259 </div> 5260 <div class="country-option " 5261 data-value="LU" 5262 data-code="lu" 5263 data-flag="lu" 5264 data-search="luxemburgo luxembourg lu" 5265 role="option" 5266 aria-selected="false">
5267 <span class="country-flag fi fi-lu"></span> 5268 <span class="country-name">Luxemburgo</span> 5269 </div> 5270 <div class="country-option " 5271 data-value="MO" 5272 data-code="mo" 5273 data-flag="mo" 5274 data-search="macao macao mo" 5275 role="option" 5276 aria-selected="false"> 5277 <span class="country-flag fi fi-mo"></span> 5278 <span class="country-name">Macao</span> 5279 </div> 5280 <div class="country-option " 5281 data-value="MK" 5282 data-code="mk" 5283 data-flag="mk" 5284 data-search="macedonia the former yugoslav republic of macedonia mk" 5285 role="option" 5286 aria-selected="false"> 5287 <span class="country-flag fi fi-mk"></span> 5288 <span class="country-name">Macedonia</span> 5289 </div> 5290 <div class="country-option " 5291 data-value="MG" 5292 data-code="mg" 5293 data-flag="mg" 5294 data-search="madagascar madagascar mg" 5295 role="option" 5296 aria-selected="false"> 5297 <span class="country-flag fi fi-mg"></span> 5298 <span class="country-name">Madagascar</span> 5299 </div> 5300 <div class="country-option " 5301 data-value="MY" 5302 data-code="my" 5303 data-flag="my" 5304 data-search="malasia malaysia my" 5305 role="option" 5306 aria-selected="false"> 5307 <span class="country-flag fi fi-my"></span> 5308 <span class="country-name">Malasia</span> 5309 </div> 5310 <div class="country-option " 5311 data-value="MW" 5312 data-code="mw" 5313 data-flag="mw" 5314 data-search="malawi malawi mw" 5315 role="option" 5316 aria-selected="false"> 5317 <span class="country-flag fi fi-mw"></span> 5318 <span class="country-name">Malawi</span> 5319 </div> 5320 <div class="country-option " 5321 data-value="MV" 5322 data-code="mv" 5323 data-flag="mv" 5324 data-search="maldivas maldives mv" 5325 role="option" 5326 aria-selected="false"> 5327 <span class="country-flag fi fi-mv"></span> 5328 <span class="country-name">Maldivas</span> 5329 </div> 5330 <div class="country-option " 5331 data-value="ML" 5332 data-code="ml" 5333 data-flag="ml" 5334 data-search="mali mali ml" 5335 role="option" 5336 aria-selected="false">
5337 <span class="country-flag fi fi-ml"></span> 5338 <span class="country-name">Mali</span> 5339 </div> 5340 <div class="country-option " 5341 data-value="MT" 5342 data-code="mt" 5343 data-flag="mt" 5344 data-search="malta malta mt" 5345 role="option" 5346 aria-selected="false"> 5347 <span class="country-flag fi fi-mt"></span> 5348 <span class="country-name">Malta</span> 5349 </div> 5350 <div class="country-option " 5351 data-value="MA" 5352 data-code="ma" 5353 data-flag="ma" 5354 data-search="marruecos morocco ma" 5355 role="option" 5356 aria-selected="false"> 5357 <span class="country-flag fi fi-ma"></span> 5358 <span class="country-name">Marruecos</span> 5359 </div> 5360 <div class="country-option " 5361 data-value="MQ" 5362 data-code="mq" 5363 data-flag="mq" 5364 data-search="martinica martinique mq" 5365 role="option" 5366 aria-selected="false"> 5367 <span class="country-flag fi fi-mq"></span> 5368 <span class="country-name">Martinica</span> 5369 </div> 5370 <div class="country-option " 5371 data-value="MU" 5372 data-code="mu" 5373 data-flag="mu" 5374 data-search="mauricio mauritius mu" 5375 role="option" 5376 aria-selected="false"> 5377 <span class="country-flag fi fi-mu"></span> 5378 <span class="country-name">Mauricio</span> 5379 </div> 5380 <div class="country-option " 5381 data-value="MR" 5382 data-code="mr" 5383 data-flag="mr" 5384 data-search="mauritania mauritania mr" 5385 role="option" 5386 aria-selected="false"> 5387 <span class="country-flag fi fi-mr"></span> 5388 <span class="country-name">Mauritania</span> 5389 </div> 5390 <div class="country-option " 5391 data-value="YT" 5392 data-code="yt" 5393 data-flag="yt" 5394 data-search="mayote mayotte yt" 5395 role="option" 5396 aria-selected="false"> 5397 <span class="country-flag fi fi-yt"></span> 5398 <span class="country-name">Mayote</span> 5399 </div> 5400 <div class="country-option " 5401 data-value="FM" 5402 data-code="fm" 5403 data-flag="fm" 5404 data-search="micronesia federated states of micronesia fm" 5405 role="option" 5406 aria-selected="false">
5407 <span class="country-flag fi fi-fm"></span> 5408 <span class="country-name">Micronesia</span> 5409 </div> 5410 <div class="country-option " 5411 data-value="MD" 5412 data-code="md" 5413 data-flag="md" 5414 data-search="moldavia republic of moldova md" 5415 role="option" 5416 aria-selected="false"> 5417 <span class="country-flag fi fi-md"></span> 5418 <span class="country-name">Moldavia</span> 5419 </div> 5420 <div class="country-option " 5421 data-value="MC" 5422 data-code="mc" 5423 data-flag="mc" 5424 data-search="monaco monaco mc" 5425 role="option" 5426 aria-selected="false"> 5427 <span class="country-flag fi fi-mc"></span> 5428 <span class="country-name">Monaco</span> 5429 </div> 5430 <div class="country-option " 5431 data-value="MN" 5432 data-code="mn" 5433 data-flag="mn" 5434 data-search="mongolia mongolia mn" 5435 role="option" 5436 aria-selected="false"> 5437 <span class="country-flag fi fi-mn"></span> 5438 <span class="country-name">Mongolia</span> 5439 </div> 5440 <div class="country-option " 5441 data-value="ME" 5442 data-code="me" 5443 data-flag="me" 5444 data-search="montenegro montenegro me" 5445 role="option" 5446 aria-selected="false"> 5447 <span class="country-flag fi fi-me"></span> 5448 <span class="country-name">Montenegro</span> 5449 </div> 5450 <div class="country-option " 5451 data-value="MS" 5452 data-code="ms" 5453 data-flag="ms" 5454 data-search="montserrat montserrat ms" 5455 role="option" 5456 aria-selected="false"> 5457 <span class="country-flag fi fi-ms"></span> 5458 <span class="country-name">Montserrat</span> 5459 </div> 5460 <div class="country-option " 5461 data-value="MZ" 5462 data-code="mz" 5463 data-flag="mz" 5464 data-search="mozambique mozambique mz" 5465 role="option" 5466 aria-selected="false"> 5467 <span class="country-flag fi fi-mz"></span> 5468 <span class="country-name">Mozambique</span> 5469 </div> 5470 <div class="country-option " 5471 data-value="MM" 5472 data-code="mm" 5473 data-flag="mm" 5474 data-search="myanmar myanmar mm" 5475 role="option" 5476 aria-selected="false">
5477 <span class="country-flag fi fi-mm"></span> 5478 <span class="country-name">Myanmar</span> 5479 </div> 5480 <div class="country-option " 5481 data-value="NA" 5482 data-code="na" 5483 data-flag="na" 5484 data-search="namibia namibia na" 5485 role="option" 5486 aria-selected="false"> 5487 <span class="country-flag fi fi-na"></span> 5488 <span class="country-name">Namibia</span> 5489 </div> 5490 <div class="country-option " 5491 data-value="NR" 5492 data-code="nr" 5493 data-flag="nr" 5494 data-search="nauru nauru nr" 5495 role="option" 5496 aria-selected="false"> 5497 <span class="country-flag fi fi-nr"></span> 5498 <span class="country-name">Nauru</span> 5499 </div> 5500 <div class="country-option " 5501 data-value="NP" 5502 data-code="np" 5503 data-flag="np" 5504 data-search="nepal nepal np" 5505 role="option" 5506 aria-selected="false"> 5507 <span class="country-flag fi fi-np"></span> 5508 <span class="country-name">Nepal</span> 5509 </div> 5510 <div class="country-option " 5511 data-value="NI" 5512 data-code="ni" 5513 data-flag="ni" 5514 data-search="nicaragua nicaragua ni" 5515 role="option" 5516 aria-selected="false"> 5517 <span class="country-flag fi fi-ni"></span> 5518 <span class="country-name">Nicaragua</span> 5519 </div> 5520 <div class="country-option " 5521 data-value="NE" 5522 data-code="ne" 5523 data-flag="ne" 5524 data-search="niger niger ne" 5525 role="option" 5526 aria-selected="false"> 5527 <span class="country-flag fi fi-ne"></span> 5528 <span class="country-name">Niger</span> 5529 </div> 5530 <div class="country-option " 5531 data-value="NG" 5532 data-code="ng" 5533 data-flag="ng" 5534 data-search="nigeria nigeria ng" 5535 role="option" 5536 aria-selected="false"> 5537 <span class="country-flag fi fi-ng"></span> 5538 <span class="country-name">Nigeria</span> 5539 </div> 5540 <div class="country-option " 5541 data-value="NU" 5542 data-code="nu" 5543 data-flag="nu" 5544 data-search="niue niue nu" 5545 role="option" 5546 aria-selected="false">
5547 <span class="country-flag fi fi-nu"></span> 5548 <span class="country-name">Niue</span> 5549 </div> 5550 <div class="country-option " 5551 data-value="NO" 5552 data-code="no" 5553 data-flag="no" 5554 data-search="noruega norway no" 5555 role="option" 5556 aria-selected="false"> 5557 <span class="country-flag fi fi-no"></span> 5558 <span class="country-name">Noruega</span> 5559 </div> 5560 <div class="country-option " 5561 data-value="NC" 5562 data-code="nc" 5563 data-flag="nc" 5564 data-search="nueva caledonia new caledonia nc" 5565 role="option" 5566 aria-selected="false"> 5567 <span class="country-flag fi fi-nc"></span> 5568 <span class="country-name">Nueva Caledonia</span> 5569 </div> 5570 <div class="country-option " 5571 data-value="NZ" 5572 data-code="nz" 5573 data-flag="nz" 5574 data-search="nueva zelanda new zealand nz" 5575 role="option" 5576 aria-selected="false"> 5577 <span class="country-flag fi fi-nz"></span> 5578 <span class="country-name">Nueva Zelanda</span> 5579 </div> 5580 <div class="country-option " 5581 data-value="OM" 5582 data-code="om" 5583 data-flag="om" 5584 data-search="oman oman om" 5585 role="option" 5586 aria-selected="false"> 5587 <span class="country-flag fi fi-om"></span> 5588 <span class="country-name">Oman</span> 5589 </div> 5590 <div class="country-option " 5591 data-value="NL" 5592 data-code="nl" 5593 data-flag="nl" 5594 data-search="paÃses bajos netherlands nl" 5595 role="option" 5596 aria-selected="false"> 5597 <span class="country-flag fi fi-nl"></span> 5598 <span class="country-name">PaÃses Bajos</span> 5599 </div> 5600 <div class="country-option " 5601 data-value="PK" 5602 data-code="pk" 5603 data-flag="pk" 5604 data-search="pakistan pakistan pk" 5605 role="option" 5606 aria-selected="false"> 5607 <span class="country-flag fi fi-pk"></span> 5608 <span class="country-name">Pakistan</span> 5609 </div> 5610 <div class="country-option " 5611 data-value="PW" 5612 data-code="pw" 5613 data-flag="pw" 5614 data-search="palau palau pw" 5615 role="option" 5616 aria-selected="false">
5617 <span class="country-flag fi fi-pw"></span> 5618 <span class="country-name">Palau</span> 5619 </div> 5620 <div class="country-option " 5621 data-value="PS" 5622 data-code="ps" 5623 data-flag="ps" 5624 data-search="palestina occupied palestinian territory ps" 5625 role="option" 5626 aria-selected="false"> 5627 <span class="country-flag fi fi-ps"></span> 5628 <span class="country-name">Palestina</span> 5629 </div> 5630 <div class="country-option " 5631 data-value="PA" 5632 data-code="pa" 5633 data-flag="pa" 5634 data-search="panama panama pa" 5635 role="option" 5636 aria-selected="false"> 5637 <span class="country-flag fi fi-pa"></span> 5638 <span class="country-name">Panama</span> 5639 </div> 5640 <div class="country-option " 5641 data-value="PG" 5642 data-code="pg" 5643 data-flag="pg" 5644 data-search="papua nueva guinea papua new guinea pg" 5645 role="option" 5646 aria-selected="false"> 5647 <span class="country-flag fi fi-pg"></span> 5648 <span class="country-name">Papua Nueva Guinea</span> 5649 </div> 5650 <div class="country-option " 5651 data-value="PN" 5652 data-code="pn" 5653 data-flag="pn" 5654 data-search="pitcairn pitcairn pn" 5655 role="option" 5656 aria-selected="false"> 5657 <span class="country-flag fi fi-pn"></span> 5658 <span class="country-name">Pitcairn</span> 5659 </div> 5660 <div class="country-option " 5661 data-value="PF" 5662 data-code="pf" 5663 data-flag="pf" 5664 data-search="polinesia francesa french polynesia pf" 5665 role="option" 5666 aria-selected="false"> 5667 <span class="country-flag fi fi-pf"></span> 5668 <span class="country-name">Polinesia Francesa</span> 5669 </div> 5670 <div class="country-option " 5671 data-value="PL" 5672 data-code="pl" 5673 data-flag="pl" 5674 data-search="polonia poland pl" 5675 role="option" 5676 aria-selected="false"> 5677 <span class="country-flag fi fi-pl"></span> 5678 <span class="country-name">Polonia</span> 5679 </div> 5680 <div class="country-option " 5681 data-value="PT" 5682 data-code="pt" 5683 data-flag="pt" 5684 data-search="portugal portugal pt" 5685 role="option" 5686 aria-selected="false">
5687 <span class="country-flag fi fi-pt"></span> 5688 <span class="country-name">Portugal</span> 5689 </div> 5690 <div class="country-option " 5691 data-value="PR" 5692 data-code="pr" 5693 data-flag="pr" 5694 data-search="puerto rico puerto rico pr" 5695 role="option" 5696 aria-selected="false"> 5697 <span class="country-flag fi fi-pr"></span> 5698 <span class="country-name">Puerto Rico</span> 5699 </div> 5700 <div class="country-option " 5701 data-value="QA" 5702 data-code="qa" 5703 data-flag="qa" 5704 data-search="qatar qatar qa" 5705 role="option" 5706 aria-selected="false"> 5707 <span class="country-flag fi fi-qa"></span> 5708 <span class="country-name">Qatar</span> 5709 </div> 5710 <div class="country-option " 5711 data-value="GB" 5712 data-code="gb" 5713 data-flag="gb" 5714 data-search="reino unido united kingdom gb" 5715 role="option" 5716 aria-selected="false"> 5717 <span class="country-flag fi fi-gb"></span> 5718 <span class="country-name">Reino Unido</span> 5719 </div> 5720 <div class="country-option " 5721 data-value="CF" 5722 data-code="cf" 5723 data-flag="cf" 5724 data-search="republica centroafricana central african cf" 5725 role="option" 5726 aria-selected="false"> 5727 <span class="country-flag fi fi-cf"></span> 5728 <span class="country-name">Republica Centroafricana</span> 5729 </div> 5730 <div class="country-option " 5731 data-value="CZ" 5732 data-code="cz" 5733 data-flag="cz" 5734 data-search="republica checa czech republic cz" 5735 role="option" 5736 aria-selected="false"> 5737 <span class="country-flag fi fi-cz"></span> 5738 <span class="country-name">Republica Checa</span> 5739 </div> 5740 <div class="country-option " 5741 data-value="CD" 5742 data-code="cd" 5743 data-flag="cd" 5744 data-search="republica democratica del congo the democratic republic of the congo cd" 5745 role="option" 5746 aria-selected="false"> 5747 <span class="country-flag fi fi-cd"></span>
5748 <span class="country-name">Republica Democratica del Congo</span> 5749 </div> 5750 <div class="country-option " 5751 data-value="DO" 5752 data-code="do" 5753 data-flag="do" 5754 data-search="republica dominicana dominican republic do" 5755 role="option" 5756 aria-selected="false"> 5757 <span class="country-flag fi fi-do"></span> 5758 <span class="country-name">Republica Dominicana</span> 5759 </div> 5760 <div class="country-option " 5761 data-value="RE" 5762 data-code="re" 5763 data-flag="re" 5764 data-search="reunion réunion re" 5765 role="option" 5766 aria-selected="false"> 5767 <span class="country-flag fi fi-re"></span> 5768 <span class="country-name">Reunion</span> 5769 </div> 5770 <div class="country-option " 5771 data-value="RW" 5772 data-code="rw" 5773 data-flag="rw" 5774 data-search="ruanda rwanda rw" 5775 role="option" 5776 aria-selected="false"> 5777 <span class="country-flag fi fi-rw"></span> 5778 <span class="country-name">Ruanda</span> 5779 </div> 5780 <div class="country-option " 5781 data-value="RO" 5782 data-code="ro" 5783 data-flag="ro" 5784 data-search="rumania romania ro" 5785 role="option" 5786 aria-selected="false"> 5787 <span class="country-flag fi fi-ro"></span> 5788 <span class="country-name">Rumania</span> 5789 </div> 5790 <div class="country-option " 5791 data-value="RU" 5792 data-code="ru" 5793 data-flag="ru" 5794 data-search="rusia russian federation ru" 5795 role="option" 5796 aria-selected="false"> 5797 <span class="country-flag fi fi-ru"></span> 5798 <span class="country-name">Rusia</span> 5799 </div> 5800 <div class="country-option " 5801 data-value="EH" 5802 data-code="eh" 5803 data-flag="eh" 5804 data-search="sahara occidental western sahara eh" 5805 role="option" 5806 aria-selected="false"> 5807 <span class="country-flag fi fi-eh"></span> 5808 <span class="country-name">Sahara Occidental</span> 5809 </div> 5810 <div class="country-option " 5811 data-value="WS" 5812 data-code="ws" 5813 data-flag="ws" 5814 data-search="samoa samoa ws" 5815 role="option" 5816 aria-selected="false">
5817 <span class="country-flag fi fi-ws"></span> 5818 <span class="country-name">Samoa</span> 5819 </div> 5820 <div class="country-option " 5821 data-value="AS" 5822 data-code="as" 5823 data-flag="as" 5824 data-search="samoa americana american samoa as" 5825 role="option" 5826 aria-selected="false"> 5827 <span class="country-flag fi fi-as"></span> 5828 <span class="country-name">Samoa americana</span> 5829 </div> 5830 <div class="country-option " 5831 data-value="BL" 5832 data-code="bl" 5833 data-flag="bl" 5834 data-search="san bartolomé saint barthélemy bl" 5835 role="option" 5836 aria-selected="false"> 5837 <span class="country-flag fi fi-bl"></span> 5838 <span class="country-name">San Bartolomé</span> 5839 </div> 5840 <div class="country-option " 5841 data-value="SM" 5842 data-code="sm" 5843 data-flag="sm" 5844 data-search="san marino san marino sm" 5845 role="option" 5846 aria-selected="false"> 5847 <span class="country-flag fi fi-sm"></span> 5848 <span class="country-name">San Marino</span> 5849 </div> 5850 <div class="country-option " 5851 data-value="SX" 5852 data-code="sx" 5853 data-flag="sx" 5854 data-search="san martÃn (paÃses bajos) sint maarten sx" 5855 role="option" 5856 aria-selected="false"> 5857 <span class="country-flag fi fi-sx"></span> 5858 <span class="country-name">San MartÃn (PaÃses Bajos)</span> 5859 </div> 5860 <div class="country-option " 5861 data-value="MF" 5862 data-code="mf" 5863 data-flag="mf" 5864 data-search="san martÃn (parte francesa) saint martin (french part) mf" 5865 role="option" 5866 aria-selected="false"> 5867 <span class="country-flag fi fi-mf"></span> 5868 <span class="country-name">San MartÃn (parte francesa)</span> 5869 </div> 5870 <div class="country-option " 5871 data-value="PM" 5872 data-code="pm" 5873 data-flag="pm" 5874 data-search="san pedro y miquelon saint-pierre and miquelon pm" 5875 role="option" 5876 aria-selected="false">
5877 <span class="country-flag fi fi-pm"></span> 5878 <span class="country-name">San Pedro y Miquelon</span> 5879 </div> 5880 <div class="country-option " 5881 data-value="VC" 5882 data-code="vc" 5883 data-flag="vc" 5884 data-search="san vincente y las granadinas saint vincent and the grenadines vc" 5885 role="option" 5886 aria-selected="false"> 5887 <span class="country-flag fi fi-vc"></span> 5888 <span class="country-name">San Vincente y Las Granadinas</span> 5889 </div> 5890 <div class="country-option " 5891 data-value="SH" 5892 data-code="sh" 5893 data-flag="sh" 5894 data-search="santa helena saint helena sh" 5895 role="option" 5896 aria-selected="false"> 5897 <span class="country-flag fi fi-sh"></span> 5898 <span class="country-name">Santa Helena</span> 5899 </div> 5900 <div class="country-option " 5901 data-value="KN" 5902 data-code="kn" 5903 data-flag="kn" 5904 data-search="santa kitts y nevis saint kitts and nevis kn" 5905 role="option" 5906 aria-selected="false"> 5907 <span class="country-flag fi fi-kn"></span> 5908 <span class="country-name">Santa Kitts y Nevis</span> 5909 </div> 5910 <div class="country-option " 5911 data-value="LC" 5912 data-code="lc" 5913 data-flag="lc" 5914 data-search="santa lucia saint lucia lc" 5915 role="option" 5916 aria-selected="false"> 5917 <span class="country-flag fi fi-lc"></span> 5918 <span class="country-name">Santa Lucia</span> 5919 </div> 5920 <div class="country-option " 5921 data-value="ST" 5922 data-code="st" 5923 data-flag="st" 5924 data-search="santo tome y principe sao tome and principe st" 5925 role="option" 5926 aria-selected="false"> 5927 <span class="country-flag fi fi-st"></span> 5928 <span class="country-name">Santo Tome y Principe</span> 5929 </div> 5930 <div class="country-option " 5931 data-value="SN" 5932 data-code="sn" 5933 data-flag="sn" 5934 data-search="senegal senegal sn" 5935 role="option" 5936 aria-selected="false">
5937 <span class="country-flag fi fi-sn"></span> 5938 <span class="country-name">Senegal</span> 5939 </div> 5940 <div class="country-option " 5941 data-value="RS" 5942 data-code="rs" 5943 data-flag="rs" 5944 data-search="serbia serbia rs" 5945 role="option" 5946 aria-selected="false"> 5947 <span class="country-flag fi fi-rs"></span> 5948 <span class="country-name">Serbia</span> 5949 </div> 5950 <div class="country-option " 5951 data-value="SC" 5952 data-code="sc" 5953 data-flag="sc" 5954 data-search="seychelles seychelles sc" 5955 role="option" 5956 aria-selected="false"> 5957 <span class="country-flag fi fi-sc"></span> 5958 <span class="country-name">Seychelles</span> 5959 </div> 5960 <div class="country-option " 5961 data-value="SL" 5962 data-code="sl" 5963 data-flag="sl" 5964 data-search="sierra leona sierra leone sl" 5965 role="option" 5966 aria-selected="false"> 5967 <span class="country-flag fi fi-sl"></span> 5968 <span class="country-name">Sierra Leona</span> 5969 </div> 5970 <div class="country-option " 5971 data-value="SG" 5972 data-code="sg" 5973 data-flag="sg" 5974 data-search="singapur singapore sg" 5975 role="option" 5976 aria-selected="false"> 5977 <span class="country-flag fi fi-sg"></span> 5978 <span class="country-name">Singapur</span> 5979 </div> 5980 <div class="country-option " 5981 data-value="SY" 5982 data-code="sy" 5983 data-flag="sy" 5984 data-search="siria syrian arab republic sy" 5985 role="option" 5986 aria-selected="false"> 5987 <span class="country-flag fi fi-sy"></span> 5988 <span class="country-name">Siria</span> 5989 </div> 5990 <div class="country-option " 5991 data-value="SO" 5992 data-code="so" 5993 data-flag="so" 5994 data-search="somalia somalia so" 5995 role="option" 5996 aria-selected="false"> 5997 <span class="country-flag fi fi-so"></span> 5998 <span class="country-name">Somalia</span> 5999 </div> 6000 <div class="country-option " 6001 data-value="LK" 6002 data-code="lk" 6003 data-flag="lk" 6004 data-search="sri lanka sri lanka lk" 6005 role="option" 6006 aria-selected="false">
6007 <span class="country-flag fi fi-lk"></span> 6008 <span class="country-name">Sri Lanka</span> 6009 </div> 6010 <div class="country-option " 6011 data-value="SZ" 6012 data-code="sz" 6013 data-flag="sz" 6014 data-search="suazilandia swaziland sz" 6015 role="option" 6016 aria-selected="false"> 6017 <span class="country-flag fi fi-sz"></span> 6018 <span class="country-name">Suazilandia</span> 6019 </div> 6020 <div class="country-option " 6021 data-value="ZA" 6022 data-code="za" 6023 data-flag="za" 6024 data-search="sudafrica south africa za" 6025 role="option" 6026 aria-selected="false"> 6027 <span class="country-flag fi fi-za"></span> 6028 <span class="country-name">Sudafrica</span> 6029 </div> 6030 <div class="country-option " 6031 data-value="SD" 6032 data-code="sd" 6033 data-flag="sd" 6034 data-search="sudan sudan sd" 6035 role="option" 6036 aria-selected="false"> 6037 <span class="country-flag fi fi-sd"></span> 6038 <span class="country-name">Sudan</span> 6039 </div> 6040 <div class="country-option " 6041 data-value="SS" 6042 data-code="ss" 6043 data-flag="ss" 6044 data-search="sudán del sur south sudan ss" 6045 role="option" 6046 aria-selected="false"> 6047 <span class="country-flag fi fi-ss"></span> 6048 <span class="country-name">Sudán del Sur</span> 6049 </div> 6050 <div class="country-option " 6051 data-value="SE" 6052 data-code="se" 6053 data-flag="se" 6054 data-search="suecia sweden se" 6055 role="option" 6056 aria-selected="false"> 6057 <span class="country-flag fi fi-se"></span> 6058 <span class="country-name">Suecia</span> 6059 </div> 6060 <div class="country-option " 6061 data-value="CH" 6062 data-code="ch" 6063 data-flag="ch" 6064 data-search="suiza switzerland ch" 6065 role="option" 6066 aria-selected="false"> 6067 <span class="country-flag fi fi-ch"></span> 6068 <span class="country-name">Suiza</span> 6069 </div> 6070 <div class="country-option " 6071 data-value="SR" 6072 data-code="sr" 6073 data-flag="sr" 6074 data-search="suriname suriname sr" 6075 role="option" 6076 aria-selected="false">
6077 <span class="country-flag fi fi-sr"></span> 6078 <span class="country-name">Suriname</span> 6079 </div> 6080 <div class="country-option " 6081 data-value="TH" 6082 data-code="th" 6083 data-flag="th" 6084 data-search="tailandia thailand th" 6085 role="option" 6086 aria-selected="false"> 6087 <span class="country-flag fi fi-th"></span> 6088 <span class="country-name">Tailandia</span> 6089 </div> 6090 <div class="country-option " 6091 data-value="TW" 6092 data-code="tw" 6093 data-flag="tw" 6094 data-search="taiwan taiwan tw" 6095 role="option" 6096 aria-selected="false"> 6097 <span class="country-flag fi fi-tw"></span> 6098 <span class="country-name">Taiwan</span> 6099 </div> 6100 <div class="country-option " 6101 data-value="TZ" 6102 data-code="tz" 6103 data-flag="tz" 6104 data-search="tanzania united republic of tanzania tz" 6105 role="option" 6106 aria-selected="false"> 6107 <span class="country-flag fi fi-tz"></span> 6108 <span class="country-name">Tanzania</span> 6109 </div> 6110 <div class="country-option " 6111 data-value="TJ" 6112 data-code="tj" 6113 data-flag="tj" 6114 data-search="tayikistan tajikistan tj" 6115 role="option" 6116 aria-selected="false"> 6117 <span class="country-flag fi fi-tj"></span> 6118 <span class="country-name">Tayikistan</span> 6119 </div> 6120 <div class="country-option " 6121 data-value="IO" 6122 data-code="io" 6123 data-flag="io" 6124 data-search="territorio oceanico de la india britanica british indian ocean territory io" 6125 role="option" 6126 aria-selected="false"> 6127 <span class="country-flag fi fi-io"></span> 6128 <span class="country-name">Territorio Oceanico de la India Britanica</span> 6129 </div> 6130 <div class="country-option " 6131 data-value="TF" 6132 data-code="tf" 6133 data-flag="tf" 6134 data-search="territorios australes franceses french southern territories tf" 6135 role="option" 6136 aria-selected="false"> 6137 <span class="country-flag fi fi-tf"></span>
6138 <span class="country-name">Territorios Australes Franceses</span> 6139 </div> 6140 <div class="country-option " 6141 data-value="TL" 6142 data-code="tl" 6143 data-flag="tl" 6144 data-search="timor leste timor-leste tl" 6145 role="option" 6146 aria-selected="false"> 6147 <span class="country-flag fi fi-tl"></span> 6148 <span class="country-name">Timor Leste</span> 6149 </div> 6150 <div class="country-option " 6151 data-value="TG" 6152 data-code="tg" 6153 data-flag="tg" 6154 data-search="togo togo tg" 6155 role="option" 6156 aria-selected="false"> 6157 <span class="country-flag fi fi-tg"></span> 6158 <span class="country-name">Togo</span> 6159 </div> 6160 <div class="country-option " 6161 data-value="TK" 6162 data-code="tk" 6163 data-flag="tk" 6164 data-search="tokelau tokelau tk" 6165 role="option" 6166 aria-selected="false"> 6167 <span class="country-flag fi fi-tk"></span> 6168 <span class="country-name">Tokelau</span> 6169 </div> 6170 <div class="country-option " 6171 data-value="TO" 6172 data-code="to" 6173 data-flag="to" 6174 data-search="tongo tonga to" 6175 role="option" 6176 aria-selected="false"> 6177 <span class="country-flag fi fi-to"></span> 6178 <span class="country-name">Tongo</span> 6179 </div> 6180 <div class="country-option " 6181 data-value="TT" 6182 data-code="tt" 6183 data-flag="tt" 6184 data-search="trinidad y tobago trinidad and tobago tt" 6185 role="option" 6186 aria-selected="false"> 6187 <span class="country-flag fi fi-tt"></span> 6188 <span class="country-name">Trinidad y Tobago</span> 6189 </div> 6190 <div class="country-option " 6191 data-value="TN" 6192 data-code="tn" 6193 data-flag="tn" 6194 data-search="tunez tunisia tn" 6195 role="option" 6196 aria-selected="false"> 6197 <span class="country-flag fi fi-tn"></span> 6198 <span class="country-name">Tunez</span> 6199 </div> 6200 <div class="country-option " 6201 data-value="TM" 6202 data-code="tm" 6203 data-flag="tm" 6204 data-search="turkmenistan turkmenistan tm" 6205 role="option" 6206 aria-selected="false">
6207 <span class="country-flag fi fi-tm"></span> 6208 <span class="country-name">Turkmenistan</span> 6209 </div> 6210 <div class="country-option " 6211 data-value="TR" 6212 data-code="tr" 6213 data-flag="tr" 6214 data-search="turquia turkey tr" 6215 role="option" 6216 aria-selected="false"> 6217 <span class="country-flag fi fi-tr"></span> 6218 <span class="country-name">Turquia</span> 6219 </div> 6220 <div class="country-option " 6221 data-value="TV" 6222 data-code="tv" 6223 data-flag="tv" 6224 data-search="tuvalu tuvalu tv" 6225 role="option" 6226 aria-selected="false"> 6227 <span class="country-flag fi fi-tv"></span> 6228 <span class="country-name">Tuvalu</span> 6229 </div> 6230 <div class="country-option " 6231 data-value="UA" 6232 data-code="ua" 6233 data-flag="ua" 6234 data-search="ucrania ukraine ua" 6235 role="option" 6236 aria-selected="false"> 6237 <span class="country-flag fi fi-ua"></span> 6238 <span class="country-name">Ucrania</span> 6239 </div> 6240 <div class="country-option " 6241 data-value="UG" 6242 data-code="ug" 6243 data-flag="ug" 6244 data-search="uganda uganda ug" 6245 role="option" 6246 aria-selected="false"> 6247 <span class="country-flag fi fi-ug"></span> 6248 <span class="country-name">Uganda</span> 6249 </div> 6250 <div class="country-option " 6251 data-value="UZ" 6252 data-code="uz" 6253 data-flag="uz" 6254 data-search="uzbekistan uzbekistan uz" 6255 role="option" 6256 aria-selected="false"> 6257 <span class="country-flag fi fi-uz"></span> 6258 <span class="country-name">Uzbekistan</span> 6259 </div> 6260 <div class="country-option " 6261 data-value="VU" 6262 data-code="vu" 6263 data-flag="vu" 6264 data-search="vanuatu vanuatu vu" 6265 role="option" 6266 aria-selected="false"> 6267 <span class="country-flag fi fi-vu"></span> 6268 <span class="country-name">Vanuatu</span> 6269 </div> 6270 <div class="country-option " 6271 data-value="VE" 6272 data-code="ve" 6273 data-flag="ve" 6274 data-search="venezuela venezuela ve" 6275 role="option" 6276 aria-selected="false">
6277 <span class="country-flag fi fi-ve"></span> 6278 <span class="country-name">Venezuela</span> 6279 </div> 6280 <div class="country-option " 6281 data-value="VN" 6282 data-code="vn" 6283 data-flag="vn" 6284 data-search="vietnam vietnam vn" 6285 role="option" 6286 aria-selected="false"> 6287 <span class="country-flag fi fi-vn"></span> 6288 <span class="country-name">Vietnam</span> 6289 </div> 6290 <div class="country-option " 6291 data-value="WF" 6292 data-code="wf" 6293 data-flag="wf" 6294 data-search="wallis y futuna wallis and futuna wf" 6295 role="option" 6296 aria-selected="false"> 6297 <span class="country-flag fi fi-wf"></span> 6298 <span class="country-name">Wallis y Futuna</span> 6299 </div> 6300 <div class="country-option " 6301 data-value="YE" 6302 data-code="ye" 6303 data-flag="ye" 6304 data-search="yemen yemen ye" 6305 role="option" 6306 aria-selected="false"> 6307 <span class="country-flag fi fi-ye"></span> 6308 <span class="country-name">Yemen</span> 6309 </div> 6310 <div class="country-option " 6311 data-value="ZM" 6312 data-code="zm" 6313 data-flag="zm" 6314 data-search="zambia zambia zm" 6315 role="option" 6316 aria-selected="false"> 6317 <span class="country-flag fi fi-zm"></span> 6318 <span class="country-name">Zambia</span> 6319 </div> 6320 <div class="country-option " 6321 data-value="ZW" 6322 data-code="zw" 6323 data-flag="zw" 6324 data-search="zimbabue zimbabwe zw" 6325 role="option" 6326 aria-selected="false"> 6327 <span class="country-flag fi fi-zw"></span> 6328 <span class="country-name">Zimbabue</span> 6329 </div> 6330 6331 <!-- Mensaje cuando no hay resultados --> 6332 <div class="country-no-results" style="display: none;"> 6333 No se encontraron paÃses </div> 6334 </div> 6335 </div> 6336 </div> 6337 </div> 6338 </div> 6339 </div> 6340 <style> 6341 /* Selector de nacionalidad - mismo ancho que controles de arriba (142px) */ 6342 .party-selector-country { 6343 width: 142px; 6344 } 6345 6346 .party-selector-country .country-selector-trigger { 6347 background-color: #f8f8f8 !important; 6348 border-radius: 10px !important; 6349 height: 42px !important; 6350 padding: 0 10px !important; 6351 border: none; 6352 font-size: 14px !important; 6353 } 6354 6355 .party-selector-country .country-selector-dropdown { 6356 border-radius: 0 0 10px 10px; 6357 min-width: 200px; 6358 right: 0; 6359 left: auto; 6360 } 6361 6362 @media only screen and (max-width: 650px) { 6363 .party-selector-country .country-selector-trigger { 6364 height: 40px !important; 6365 } 6366 6367 .party-selector-country .country-selector-dropdown { 6368 right: auto; 6369 left: 0; 6370 min-width: 250px; 6371 transform: translateX(-40%); 6372 } 6373 } 6374 </style> 6375 6376 </div> 6377 6378</div> 6379
6380<script> 6381 // Global flag to track if ages have been initialized 6382 var childrenAgesInitialized = false; 6383 6384 // Function to initialize children ages from GroupsForm 6385 function initializeChildrenAgesFromGroupsForm(force) { 6386 // Only initialize once unless forced 6387 if (childrenAgesInitialized && !force) { 6388 return; 6389 } 6390 6391 try { 6392 } catch (e) { 6393 console.error('Error initializing children ages:', e); 6394 } 6395 } 6396 6397 // Call initialization on page load (in case selects already exist) 6398 $(document).ready(function() { 6399 // Wait a bit to ensure selects are created 6400 setTimeout(function() { 6401 initializeChildrenAgesFromGroupsForm(); 6402 }, 100); 6403 }); 6404</script>
6404 6405 <input name="MaxRooms" type="hidden" id="MaxRooms" value="4" /> 6406 <input name="Nights" type="hidden" id="Nights" /> 6407 <input name="Channel" type="hidden" id="Channel" value="2" /> 6408 <input name="RateType" type="hidden" id="RateType" value="auto" /> 6409 <input name="Pos" type="hidden" id="Pos" value='SarmientoPalace' /> 6410 <input name="Lng" type="hidden" id="Lng" value='pt' /> 6411 <input name="Currency" type="hidden" id="Currency" value="ARS" /> 6412 <input name="MaxAgeChildrenNumber" type="hidden" id="MaxAgeChildrenNumber" value="15" /> 6413 <input name="MaxAgeBabiesNumber" type="hidden" id="MaxAgeBabiesNumber" value="2" /> 6414 <input name="MaxBabiesNumber" type="hidden" id="MaxBabiesNumber" value="0" /> 6415 <input name="ReturnUrl" type="hidden" id="ReturnUrl" value="https://www.hotelsarmiento.com.ar/pt/lp.html" /> 6416 6417 <input name="FromUrl" type="hidden" id="FromUrl" value="https://www.hotelsarmiento.com.ar/pt/" /> 6418 <input name="Tag" type="hidden" id="Tag" value="" /> 6419 <input name="Source" id="Source" type="hidden" value="Contact Form"> 6420 6421 <input name="ProductTimezone" id="ProductTimezone" type="hidden" value="America/Argentina/Buenos_Aires"> 6422 <input name="GlobalDaysModifier" id="GlobalDaysModifier" type="hidden" value="0"> 6423 6424 <input name="SearchID" type="hidden" id="SearchID" value="0" /> 6425 6426 <input name="FromPID" type="hidden" id="FromPID" value="203" /> 6427 6428 <input name="Type" type="hidden" id="Type" value="Hotel" /> 6429 6430 6431 <input name="ProductID" type="hidden" id="ProductID" value="203" /> 6432 6433 <input name="ListID" type="hidden" id="ListID" value="0" /> 6434 6435 <input name="Location" type="hidden" id="Location" value="" /> 6436 6437 <input name="Device" type="hidden" id="Device" value="Computer" /> 6438 <input name="UserID" type="hidden" id="UserID" value="0" /> 6439 <input name="tag" type="hidden" id="tag" class="tag_cookie" value="" /> 6440 <input name="Email" type="hidden" id="Email" value="" /> 6441 <input name="UserType" type="hidden" id="UserType" value="" /> 6442 <input name="AgreementType" type="hidden" id="AgreementType" value="" /> 6443 6444 <input name="GroupsForm" type="hidden" id="GroupsForm" value="1:2,0,0" /> 6445 6446 6447 6448 6449 6450 6451 <input name="SkuID" type="hidden" id="SkuID" value="" /> 6452 6453 6454 <div class="nodisplay" id="MinNightsError"> 6455 O número mÃnimo de noites deve ser maior ou igual a 0 </div> 6456 6457 <input name="MinNights" type="hidden" id="MinNights" value="0" /> 6458 6459 <div name="PxMkAcion_Search" id="PxMkAcion_Search" class="px-sm-searchbtn px-sm-inputcontainer w-padding px-mk-fixedwith-inputcontainer cta_webcheckin_px" btntxt="Ver Tarifas" loadingbtntxt="Procurando por" data-testid="search-button"> 6460 <span class="update-search-span">Ver Tarifas</span> 6461 <label for="" class="px-mk-searchicon px-mk-inputicon ignoreclick"> 6462 <?xml version="1.0" encoding="iso-8859-1"?> 6463<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6464<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 6465 viewBox="0 0 373.12 373.12" style="enable-background:new 0 0 373.12 373.12;" xml:space="preserve"> 6466<g> 6467 <g> 6468 <path d="M266.667,234.667h-16.96l-5.867-5.867c20.907-24.213,33.493-55.68,33.493-90.133C277.333,62.08,215.253,0,138.667,0 6469 S0,62.08,0,138.667s62.08,138.667,138.667,138.667c34.453,0,65.92-12.587,90.133-33.387l5.867,5.867v16.853L341.333,373.12 6470 l31.787-31.787L266.667,234.667z M138.667,234.667c-53.013,0-96-42.987-96-96c0-53.013,42.987-96,96-96c53.013,0,96,42.987,96,96 6471 C234.667,191.68,191.68,234.667,138.667,234.667z"/> 6472 </g> 6473</g> 6474<g> 6475</g> 6476<g> 6477</g> 6478<g> 6479</g> 6480<g> 6481</g> 6482<g> 6483</g> 6484<g> 6485</g> 6486<g> 6487</g> 6488<g> 6489</g> 6490<g> 6491</g> 6492<g> 6493</g> 6494<g> 6495</g> 6496<g> 6497</g> 6498<g> 6499</g> 6500<g> 6501</g> 6502<g> 6503</g> 6504</svg> 6505 </label> 6506 <label for="" class="px-mk-searchloader px-mk-inputicon nodisplay ignoreclick"> 6507 <?xml version="1.0" encoding="iso-8859-1"?> 6508<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6509<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6510<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 6511 width="26.349px" height="26.35px" viewBox="0 0 26.349 26.35" style="enable-background:new 0 0 26.349 26.35;" 6512 xml:space="preserve"> 6513<g> 6514 <g> 6515 <circle cx="13.792" cy="3.082" r="3.082"/> 6516 <circle cx="13.792" cy="24.501" r="1.849"/> 6517 <circle cx="6.219" cy="6.218" r="2.774"/> 6518 <circle cx="21.365" cy="21.363" r="1.541"/> 6519 <circle cx="3.082" cy="13.792" r="2.465"/> 6520 <circle cx="24.501" cy="13.791" r="1.232"/> 6521 <path d="M4.694,19.84c-0.843,0.843-0.843,2.207,0,3.05c0.842,0.843,2.208,0.843,3.05,0c0.843-0.843,0.843-2.207,0-3.05 6522 C6.902,18.996,5.537,18.988,4.694,19.84z"/> 6523 <circle cx="21.364" cy="6.218" r="0.924"/> 6524 </g> 6525</g> 6526<g> 6527</g> 6528<g> 6529</g> 6530<g> 6531</g> 6532<g> 6533</g> 6534<g> 6535</g> 6536<g> 6537</g> 6538<g> 6539</g> 6540<g> 6541</g> 6542<g> 6543</g> 6544<g> 6545</g> 6546<g> 6547</g> 6548<g> 6549</g> 6550<g> 6551</g> 6552<g> 6553</g> 6554<g> 6555</g> 6556</svg> 6557 </label>
6558 </div> 6559 6560 </form> 6561 6562 <input type="hidden" id="MainPos" value="SarmientoPalace"> 6563 6564 6565 </div> 6566 6567 6568 6569<div id="dataconfig" product-timezone="America/Argentina/Buenos_Aires" urldispo="id=203&RateID=246&start=2026-09-26" class="nodisplay" lng="pt" DatePickerStart="0"></div> 6570 6571<link rel="stylesheet" href="https://unpkg.com/tippy.js@6/animations/scale.css" />
6572<script src="https://unpkg.com/@popperjs/core@2"></script>
vendor: 1 bytes, line 6572
6572
6573<script src="https://unpkg.com/tippy.js@6"></script>
6573 6574
6574<script defer src="/neo_modules/marketplace_buscador_v8/js.js?filev=1778144039" type="text/javascript"></script>
6574 6575<style>/* ------------ VARIABLES ------------ */ 6576@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); 6577.px-mk-buscador-container { 6578 font-size: 12px; 6579} 6580 6581#MinNightsError { 6582 float: left; 6583 width: calc(100% - 22px); 6584 padding: 10px; 6585 border: 1px solid #982828; 6586 line-height: 20px; 6587 background: #f3e8e8; 6588 color: #000; 6589} 6590 6591.NotValidChildrens { 6592 width: 100%; 6593 float: left; 6594 text-align: center; 6595 color: #800; 6596 font-size: 1em; 6597 font-weight: bold; 6598 padding: 10px 0px; 6599} 6600 6601.update-search-span { 6602 font-weight: 400; 6603 margin-right: 10px; 6604} 6605 6606.ChildrensAgesSelect.notvalid { 6607 border: 1px solid #b51212 !important; 6608} 6609 6610.buscar_lp .buscar_lp_beforerate { 6611 display: none; 6612} 6613 6614.buscar_lp .NochesError { 6615 display: none; 6616} 6617 6618#NochesError { 6619 background: white; 6620 border-right: 1px solid #ccc; 6621 display: flex; 6622 justify-content: center; 6623 align-items: center; 6624} 6625 6626.buscar_lp .TextoFormulario { 6627 float: left; 6628 width: auto; 6629 margin-right: 10px; 6630 text-transform: capitalize; 6631 padding-top: 5px; 6632 font-size: 13px; 6633} 6634 6635.buscar_lp .imput_text_rooms { 6636 font-size: 1em; 6637 padding: 4px 2px; 6638 border: 1px solid #eaeaea; 6639 margin-right: 10px; 6640 float: left; 6641 max-width: 35px; 6642} 6643 6644.buscar_lp .roomtypecontariner { 6645 float: left; 6646 width: auto; 6647} 6648 6649.buscar_lp .bucle { 6650 float: left; 6651 width: auto; 6652} 6653 6654.button_bucar { 6655 float: right; 6656 width: auto; 6657 border: 1px solid #999; 6658 font-size: 14px; 6659 padding: 4px 10px; 6660 background: #eaeaea; 6661 color: #000; 6662} 6663 6664.button_bucar:hover { 6665 background: #999; 6666 color: #fff; 6667 cursor: pointer; 6668} 6669 6670.ContenidoHab { 6671 overflow: hidden; 6672 width: 100%; 6673 margin-bottom: 5px; 6674} 6675 6676.px-mk-buscador-container.buscar_lp .SelectorInitial { 6677 padding: 1em; 6678 margin: 0; 6679 cursor: pointer; 6680 border: none; 6681 box-sizing: border-box; 6682 font-size: 1.1em; 6683 text-overflow: ellipsis; 6684 overflow: hidden; 6685 min-width: 150px; 6686 text-align: left; 6687 padding-right: 2rem !important; 6688 width: 100%; 6689 height: 100%; 6690 display: flex; 6691 background: transparent !important; 6692 align-items: center; 6693} 6694.px-mk-buscador-container.buscar_lp .SelectorInitial .texto { 6695 font-weight: bold; 6696} 6697 6698.px-mk-buscador-container.buscar_lp .RoomsSelectContainer { 6699 width: 100%; 6700 padding-bottom: 5px; 6701 margin-bottom: 5px; 6702 border-bottom: 1px dotted #ccc; 6703 display: flex; 6704 align-items: center; 6705} 6706.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .RoomNameContainer { 6707 width: calc(40% - 10px); 6708 margin-right: 10px; 6709 text-transform: capitalize; 6710 font-size: 1em; 6711 color: #444; 6712} 6713.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .texto { 6714 float: left; 6715 width: 100%; 6716 padding-bottom: 3px; 6717 font-size: 14px; 6718 color: #444; 6719} 6720.px-mk-buscador-container.buscar_lp .RoomsSelectContainer select { 6721 border: 1px solid #d0d0d0; 6722 width: 100%; 6723 border-radius: 4px; 6724 padding: 2px; 6725 color: #666; 6726 font-size: 11px; 6727 margin-bottom: 5px; 6728 cursor: pointer; 6729} 6730.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer { 6731 width: 60%; 6732} 6733.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .AdultsContainer, 6734.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .ChildrensContainers { 6735 display: flex; 6736 flex-direction: column; 6737 justify-content: center; 6738 align-items: center; 6739 flex: 1; 6740 margin: 3px; 6741} 6742.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .AdultsContainer > *, 6743.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .ChildrensContainers > * { 6744 flex-grow: 1; 6745 width: 100%; 6746} 6747.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges { 6748 float: left; 6749 width: 100%; 6750 margin-top: 5px; 6751} 6752.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .ChildrensAgesSelect { 6753 float: left; 6754 width: calc(50% - 5px) !important; 6755 margin-right: 5px; 6756 margin-bottom: 5px; 6757} 6758.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .ChildrensAgesSelect:nth-child(even) { 6759 float: right !important; 6760 margin-right: 0px; 6761} 6762.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .texto { 6763 float: left; 6764 width: 100%; 6765 padding-bottom: 3px; 6766 font-size: 14px; 6767 color: #444; 6768} 6769 6770.px-mk-buscador-container.buscar_lp .px-mk-addnewroom, 6771.px-mk-buscador-container.buscar_lp .px-mk-removeroom { 6772 flex: 1; 6773 cursor: pointer; 6774 margin: 3px; 6775} 6776.px-mk-buscador-container.buscar_lp .px-mk-addnewroom.nodisplay, 6777.px-mk-buscador-container.buscar_lp .px-mk-removeroom.nodisplay { 6778 display: none; 6779} 6780.px-mk-buscador-container.buscar_lp .px-mk-addnewroom svg, 6781.px-mk-buscador-container.buscar_lp .px-mk-removeroom svg { 6782 height: 18px; 6783 width: 18px; 6784 fill: currentColor; 6785 margin-left: 3px; 6786} 6787.px-mk-buscador-container.buscar_lp .px-mk-addnewroom button, 6788.px-mk-buscador-container.buscar_lp .px-mk-removeroom button { 6789 width: 100%; 6790 display: flex; 6791 align-items: center; 6792 justify-content: center; 6793 text-align: center; 6794 background: #f3f3f3; 6795 border: 1px solid #ccc; 6796 padding: 5px 0px; 6797 box-sizing: border-box; 6798 border-radius: 30px; 6799 color: #444; 6800 font-size: 0.9em; 6801 text-transform: capitalize; 6802 cursor: pointer; 6803} 6804.px-mk-buscador-container.buscar_lp .px-mk-addnewroom button span, 6805.px-mk-buscador-container.buscar_lp .px-mk-removeroom button span { 6806 text-transform: capitalize; 6807 line-height: 1; 6808} 6809 6810.px-mk-buscador-container.buscar_lp { 6811 display: flex; 6812 align-items: center; 6813 height: 100%; 6814 padding: 3px; 6815 box-sizing: border-box; 6816 transition: 0.3s ease-out; 6817} 6818.px-mk-buscador-container.buscar_lp #MultiplePartySelect { 6819 float: left; 6820 flex-direction: column; 6821 display: flex; 6822 width: calc(100% - 12px); 6823 padding: 5px; 6824 background: #fff; 6825 border: 1px solid #ddd; 6826 margin: 0px; 6827 position: absolute; 6828 top: 100%; 6829 min-width: 250px; 6830 z-index: 11; 6831 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 6832} 6833.px-mk-buscador-container.buscar_lp #MultiplePartySelect.nodisplay { 6834 display: none; 6835} 6836.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect { 6837 background: #fff; 6838 border: 1px solid #ddd; 6839 margin: 0px; 6840 position: absolute; 6841 top: 100%; 6842 left: 0; 6843 display: flex; 6844 z-index: 99; 6845 flex-direction: column; 6846} 6847.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer { 6848 height: 50px;
6849 border-right: none; 6850 border-bottom: 1px solid #ccc; 6851 cursor: pointer; 6852 padding: 1em 4em 1em 1em; 6853 box-sizing: border-box; 6854} 6855.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer:last-child { 6856 border-bottom: none; 6857} 6858.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer .texto { 6859 padding: 0px; 6860 display: flex; 6861 align-items: center; 6862 text-align: left; 6863 font-size: 14px; 6864 color: #888; 6865} 6866.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer .texto:hover { 6867 color: #444; 6868} 6869.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect.nodisplay { 6870 display: none; 6871} 6872.px-mk-buscador-container.buscar_lp .px-mk-searchform { 6873 float: none; 6874 width: auto; 6875 display: flex; 6876 align-items: center; 6877 height: 60px; 6878 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 6879} 6880.px-mk-buscador-container.buscar_lp .px-mk-searchform > * { 6881 height: 100%; 6882 margin: 0; 6883 float: none; 6884 position: relative; 6885 flex-shrink: 0; 6886 flex-grow: 1; 6887} 6888.px-mk-buscador-container.buscar_lp .px-mk-searchform .px-sm-searchbtn { 6889 min-width: 18em; 6890} 6891 6892.ModuloWrap_marketplace_buscador_v3.isolate::after { 6893 content: ""; 6894 position: fixed; 6895 top: 0; 6896 left: 0; 6897 width: 100vw; 6898 height: 100vh; 6899 background: rgba(0, 0, 0, 0.3); 6900 z-index: -1; 6901 bottom: 0; 6902 right: 0; 6903 -webkit-backdrop-filter: blur(5px); 6904 backdrop-filter: blur(5px); 6905 animation: appearIsolate 1s cubic-bezier(0.165, 0.84, 0.44, 1) forwards; 6906} 6907 6908@keyframes appearIsolate { 6909 from { 6910 opacity: 0; 6911 } 6912 to { 6913 opacity: 1; 6914 } 6915} 6916.px-sm-inputcontainer { 6917 display: flex; 6918 position: relative; 6919 border-right: 1px solid #ccc; 6920 transition: 0.3s ease-out; 6921 cursor: pointer; 6922 flex-direction: column; 6923 justify-content: center; 6924 align-items: flex-start; 6925 text-align: left; 6926 box-sizing: border-box; 6927 background-color: white; 6928} 6929.px-sm-inputcontainer .hasDatepicker { 6930 cursor: pointer !important; 6931} 6932.px-sm-inputcontainer input { 6933 border-bottom: none !important; 6934 box-shadow: none !important; 6935} 6936.px-sm-inputcontainer label.error { 6937 background: #bf0000; 6938 float: none; 6939 min-width: 100%; 6940 margin: 0px; 6941 left: 0; 6942 padding: 10px 20px; 6943 box-sizing: border-box; 6944 top: 100%; 6945 bottom: initial; 6946 right: auto; 6947 transform: translatey(0); 6948 color: white; 6949 font-weight: 400; 6950 text-transform: uppercase; 6951 font-size: 10px; 6952 letter-spacing: 2px; 6953 position: absolute; 6954 line-height: 1.6em; 6955} 6956.px-sm-inputcontainer.px-mk-fixedwidth-inputcontainer { 6957 width: 11em; 6958} 6959.px-sm-inputcontainer.px-mk-fixedwidth-inputcontainer-max { 6960 width: 18em; 6961} 6962.px-sm-inputcontainer.w-padding { 6963 padding: 0.6em 1em; 6964} 6965.px-sm-inputcontainer .px-mk-labelinput { 6966 margin-bottom: 3px; 6967 font-size: 13px; 6968 opacity: 1; 6969 cursor: pointer; 6970 margin-top: 3px; 6971} 6972.px-sm-inputcontainer .px-mk-inputicon { 6973 position: absolute; 6974 z-index: 2; 6975 right: 1.2em; 6976 color: #aaa; 6977 top: 50%; 6978 transform: translatey(-50%); 6979 font-size: 1.2em; 6980 transition: 0.3s ease-out; 6981 cursor: pointer; 6982} 6983.px-sm-inputcontainer .px-mk-inputicon svg { 6984 height: 1.2em; 6985 width: 1.2em; 6986 fill: currentColor; 6987} 6988.px-sm-inputcontainer.nodisplay { 6989 display: none; 6990} 6991.px-sm-inputcontainer:last-child { 6992 border-right: none; 6993} 6994.px-sm-inputcontainer input, 6995.px-sm-inputcontainer select, 6996.px-sm-inputcontainer textarea { 6997 position: relative; 6998 -webkit-appearance: none; 6999 -moz-appearance: none; 7000 border: none; 7001 box-sizing: border-box; 7002 font-size: 1.1em; 7003 text-overflow: ellipsis; 7004 height: auto; 7005 transition: inherit; 7006 background-color: transparent; 7007 max-width: 100%; 7008 width: 100%; 7009} 7010.px-sm-inputcontainer input option, 7011.px-sm-inputcontainer select option, 7012.px-sm-inputcontainer textarea option { 7013 background-color: #fff; 7014} 7015.px-sm-inputcontainer input[type=text]:not(.hasDatepicker), 7016.px-sm-inputcontainer select[type=text]:not(.hasDatepicker), 7017.px-sm-inputcontainer textarea[type=text]:not(.hasDatepicker) { 7018 cursor: text; 7019} 7020.px-sm-inputcontainer input { 7021 padding: 0px; 7022 margin: 0px !important; 7023} 7024.px-sm-inputcontainer > select { 7025 padding: 1em 4em 1em 1em; 7026 height: 100%; 7027 width: 100%; 7028 cursor: pointer; 7029 white-space: initial; 7030} 7031.px-sm-inputcontainer > select::-ms-expand { 7032 display: none; 7033 /* hide the default arrow in ie10 and ie11 */ 7034} 7035.px-sm-inputcontainer:hover { 7036 background-color: #f0f0f0; 7037} 7038.px-sm-inputcontainer:hover label {
7039 color: #e0ae1b; 7040} 7041 7042.px-mk-searchinfo + .px-mk-buscador-container .px-mk-searchform { 7043 width: 100%; 7044} 7045.px-mk-searchinfo .px-mk-searchinfo-inner { 7046 width: 100%; 7047 height: 40px; 7048 background: #fafafa; 7049 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 7050 border-radius: 2px; 7051 text-transform: uppercase; 7052 font-size: 1em; 7053 box-sizing: border-box; 7054 font-weight: 600; 7055} 7056.px-mk-searchinfo .px-mk-searchinfo-inner > div { 7057 text-align: center; 7058 border-right: 1px solid #ccc; 7059 padding: 0 20px; 7060 box-sizing: border-box; 7061 height: 100%; 7062} 7063.px-mk-searchinfo .px-mk-searchinfo-inner i { 7064 color: goldenrod; 7065 margin-right: 10px; 7066 font-size: 20px; 7067} 7068.px-mk-searchinfo .px-mk-searchinfo-inner > .searchinfo-title { 7069 flex-grow: 0; 7070 background: #eee; 7071 color: #000; 7072} 7073.px-mk-searchinfo .px-mk-searchinfo-inner > .px-sm-searchbtn { 7074 width: auto; 7075 font-weight: 400; 7076 text-align: center; 7077 justify-content: center; 7078} 7079.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column { 7080 height: auto; 7081 flex-wrap: wrap; 7082 width: 100%; 7083} 7084.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column > * { 7085 height: 3em; 7086 border-bottom: 1px solid #ccc; 7087 padding: 1em; 7088 width: 50%; 7089 text-align: left; 7090 line-height: 1.2; 7091} 7092.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column > * .px-mk-iconchangesearch { 7093 height: 1.2em; 7094 width: 1.2em; 7095} 7096 7097.px-mk-iconchangesearch { 7098 color: goldenrod; 7099 height: 1.5em; 7100 width: 1.5em; 7101 margin-right: 0.5em; 7102} 7103.px-mk-iconchangesearch svg { 7104 fill: currentColor; 7105 height: 100%; 7106 width: 100%; 7107} 7108 7109div.ui-datepicker#ui-datepicker-div .ui-widget-header { 7110 background: transparent !important; 7111 border: none !important; 7112} 7113div.ui-datepicker#ui-datepicker-div .ui-datepicker-next, 7114div.ui-datepicker#ui-datepicker-div .ui-datepicker-prev { 7115 border-radius: 40px !important; 7116 cursor: pointer !important; 7117} 7118div.ui-datepicker#ui-datepicker-div .ui-state-default, 7119div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-default, 7120div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-default { 7121 border-radius: 8px; 7122 border: none; 7123 background-color: rgba(0, 0, 0, 0.02); 7124 text-align: center; 7125 display: inline-flex; 7126 justify-content: center; 7127 align-items: center; 7128 width: 90%; 7129 font-size: 1em; 7130 transition: 0.3s ease-out; 7131 border: 1px solid #eee; 7132} 7133div.ui-datepicker#ui-datepicker-div .ui-state-focus, 7134div.ui-datepicker#ui-datepicker-div .ui-state-hover, 7135div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-focus, 7136div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-hover, 7137div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-focus, 7138div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-hover { 7139 background: white; 7140 border: 1px solid #000 !important; 7141} 7142div.ui-datepicker#ui-datepicker-div .ui-state-active, 7143div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-active, 7144div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-active, 7145div.ui-datepicker#ui-datepicker-div .ui-state-highlight, 7146div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-highlight, 7147div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-highlight { 7148 background: #000; 7149 color: white; 7150} 7151div.ui-datepicker#ui-datepicker-div td { 7152 text-align: center; 7153} 7154 7155.px-mk-searchloader { 7156 animation: spinStep steps(1) 1s infinite; 7157 height: 1em; 7158 width: 1em; 7159 transform-origin: top; 7160} 7161 7162.neo_m_buscador .neo_marketplace_buscador_v3 { 7163 padding: 30px 20px; 7164 justify-content: center; 7165 align-items: center; 7166} 7167 7168@keyframes spinStep { 7169 0% { 7170 transform: translatey(-50%); 7171 } 7172 12.5% { 7173 transform: rotate(45deg) translatey(-50%); 7174 } 7175 25% { 7176 transform: rotate(90deg) translatey(-50%); 7177 } 7178 37.5% { 7179 transform: rotate(135deg) translatey(-50%); 7180 } 7181 50% { 7182 transform: rotate(180deg) translatey(-50%); 7183 } 7184 62.5% { 7185 transform: rotate(225deg) translatey(-50%); 7186 } 7187 75% { 7188 transform: rotate(270deg) translatey(-50%); 7189 } 7190 87.5% { 7191 transform: rotate(315deg) translatey(-50%); 7192 } 7193 100% { 7194 transform: rotate(360deg) translatey(-50%); 7195 } 7196} 7197.px-sm-searchbtn { 7198 height: 100%; 7199 box-sizing: border-box; 7200 display: flex; 7201 text-align: left; 7202 align-items: flex-start; 7203 justify-content: center; 7204 text-transform: uppercase; 7205 font-size: 1em; 7206 letter-spacing: 1px; 7207 line-height: 1; 7208 background-color: #000; 7209 color: white; 7210 cursor: pointer; 7211 transition: 0.3s ease-out; 7212 border: none; 7213 width: 11em; 7214 padding: 1em 4em 1em 1em; 7215 flex: 1; 7216} 7217.px-sm-searchbtn .px-mk-inputicon svg { 7218 height: 1em; 7219 width: 1em; 7220 fill: white !important; 7221} 7222.px-sm-searchbtn:hover { 7223 background-color: #a37a00; 7224} 7225 7226.ModuloWrap_marketplace_list { 7227 width: 100%; 7228} 7229 7230.buscar_lp:not(.px-mk-buscador-vertical) .PartyTypeSimulator { 7231 height: 100%; 7232} 7233 7234.buscar_lp.px-mk-buscador-vertical { 7235 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 7236 border-radius: 2px; 7237 padding: 0; 7238 margin: 3px; 7239 height: auto; 7240 width: auto; 7241} 7242.buscar_lp.px-mk-buscador-vertical .px-mk-searchform { 7243 transition: 1s cubic-bezier(0.17, 0.84, 0.44, 1); 7244 height: auto; 7245 width: 100%; 7246 flex-wrap: wrap; 7247} 7248.buscar_lp.px-mk-buscador-vertical .px-mk-searchform > * { 7249 width: 100%; 7250 height: 4.5em; 7251}
7252.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator { 7253 height: auto; 7254 min-height: 4.5em; 7255 width: 50%; 7256 box-sizing: border-box; 7257} 7258.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator .SelectorInitial { 7259 min-height: 4.5em; 7260 padding: 0.6em 1em; 7261} 7262.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator .PartyTypeSimulatorSelect, 7263.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator #MultiplePartySelect { 7264 position: static; 7265 background: rgba(248, 248, 248, 0.9725490196); 7266} 7267.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer { 7268 border-bottom: 1px solid #ccc; 7269 border-right: none; 7270 max-width: none; 7271 width: 100%; 7272} 7273.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_entrada, .buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_salida { 7274 width: 100%; 7275 box-sizing: border-box; 7276 margin: 0px; 7277} 7278.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_salida { 7279 border-left: 1px solid #ccc; 7280} 7281.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.px-mk-productidhidden { 7282 height: 0px; 7283 width: 100%; 7284} 7285.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer input, 7286.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer select, 7287.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer textarea { 7288 max-width: 100%; 7289} 7290 7291.px-mk-filter-disabled { 7292 pointer-events: none !important; 7293 opacity: 0.5 !important; 7294} 7295 7296.px-mk-buscador-vertical.px-mk-searchform .px-sm-inputcontainer:last-child, 7297.px-mk-buscador-vertical .px-sm-inputcontainer:last-child { 7298 border-bottom: none; 7299 border-right: none; 7300} 7301 7302.px-mk-hidesearchform { 7303 opacity: 0; 7304 pointer-events: none; 7305 max-height: 0px; 7306 overflow: hidden; 7307} 7308 7309.ignoreclick { 7310 pointer-events: none; 7311} 7312 7313.px-sm-searchbtn > i { 7314 font-size: 20px; 7315 position: relative; 7316 left: 0; 7317 top: -1px; 7318 margin-right: 20px; 7319 margin-left: -10px; 7320} 7321 7322.btn-searching span { 7323 opacity: 0; 7324 max-width: 0px; 7325 overflow: hidden; 7326 transition: 0.3s ease-out; 7327} 7328 7329#ProductID option { 7330 text-transform: none; 7331} 7332 7333#ProductID option[value=everyproduct] { 7334 font-weight: 600; 7335} 7336 7337#ProductID option[value=""][disabled] { 7338 background-color: #eee; 7339 color: #555; 7340} 7341 7342.px-mk-disabled-temp { 7343 background-color: #eee; 7344 cursor: not-allowed; 7345 pointer-events: none; 7346 color: #bbb; 7347} 7348 7349.px-mk-productid.px-sm-inputcontainer.px-mk-productidhidden { 7350 opacity: 0; 7351 max-width: 0px; 7352 pointer-events: none; 7353 padding: 0px; 7354 margin: 0px; 7355 border: none; 7356} 7357 7358.px-mk-productid.px-sm-inputcontainer { 7359 max-width: 300px; 7360 transition: 0.3s ease; 7361 overflow: hidden; 7362} 7363 7364.px-mk-locationdropdown { 7365 position: absolute; 7366 top: calc(100% + 0.1em); 7367 left: 0; 7368 padding: 0; 7369 line-height: 1.2; 7370 background: white; 7371 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 7372 z-index: 999; 7373 border-radius: 0 0 4px 4px; 7374 max-height: 50vh; 7375 overflow: auto; 7376 transition: 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); 7377 opacity: 0; 7378 pointer-events: none; 7379 transform: translateY(-1em); 7380 width: 100%; 7381} 7382.px-mk-locationdropdown.activeAC { 7383 transform: none; 7384 pointer-events: initial; 7385 opacity: 1; 7386} 7387.px-mk-locationdropdown > * { 7388 padding: 1.2em 1.5em; 7389 white-space: nowrap; 7390 max-width: 400px; 7391 overflow: hidden; 7392 text-overflow: ellipsis; 7393 width: 100%; 7394 cursor: pointer; 7395 display: flex; 7396 align-items: center; 7397 justify-content: flex-start; 7398 box-sizing: border-box; 7399} 7400.px-mk-locationdropdown > *.suggestion_hover { 7401 background-color: #f2f2f2; 7402} 7403.px-mk-locationdropdown > *:hover { 7404 background-color: #f2f2f2; 7405} 7406.px-mk-locationdropdown > *:hover .px-mk-locationimg { 7407 fill: goldenrod; 7408} 7409.px-mk-locationdropdown > * .px-mk-locationtxt { 7410 width: 100%; 7411 overflow: hidden; 7412 text-overflow: ellipsis; 7413} 7414.px-mk-locationdropdown > * .px-mk-locationimg { 7415 height: 1.1em; 7416 width: 1.1em; 7417 margin-right: 0.6em; 7418 flex-shrink: 0; 7419 fill: #aaa; 7420 margin-right: 0.8em; 7421} 7422.px-mk-locationdropdown > * .px-mk-locationimg svg { 7423 height: 100%; 7424 width: 100%; 7425 -o-object-fit: contain; 7426 object-fit: contain; 7427} 7428 7429.px-mk-locationautocomplete { 7430 height: 100%; 7431 width: 100%; 7432 box-sizing: border-box; 7433 padding-right: 2em; 7434} 7435.px-mk-locationautocomplete input { 7436 height: 100%; 7437 padding: 0em 1em; 7438 width: 100%; 7439} 7440 7441.ui-datepicker { 7442 font-size: 16px !important; 7443 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.2); 7444 width: auto; 7445 border-radius: 0px !important; 7446 padding: 5px !important; 7447 width: auto !important; 7448 box-sizing: border-box; 7449} 7450 7451.ui-datepicker td { 7452 margin: 0px !important; 7453 padding: 0px; 7454} 7455 7456.ui-datepicker td > * { 7457 height: 40px; 7458 width: 40px !important; 7459 border-radius: 0px !important; 7460 border: 1px solid transparent !important; 7461 box-sizing: border-box; 7462} 7463 7464.ui-datepicker table { 7465 margin: 0px !important; 7466} 7467 7468.neo_marketplace_buscador_v3 * { 7469 font-size: 13px !important; 7470} 7471 7472.neo_marketplace_buscador_v3 input, .neo_marketplace_buscador_v3 select { 7473 font-size: 16px !important; 7474} 7475 7476.neo_modules_cart_hotel_v2 .cart_top_hotel_v2 .PartyTypeSimulator { 7477 width: 100%; 7478} 7479 7480.neo_marketplace_buscador_v3 .PartyTypeSimulatorSelect { 7481 position: absolute; 7482 z-index: 999; 7483 top: 55px; 7484 left: 0px; 7485 padding: 5px; 7486 background: #fff; 7487 margin: 0px; 7488 box-shadow: 0 2px 16px rgba(0, 0, 0, 0.15); 7489 padding: 20px 25px; 7490 line-height: 1.5; 7491 box-sizing: border-box; 7492 width: 300px; 7493 max-width: 100vw; 7494} 7495 7496.txtPartyGroup { 7497 white-space: nowrap; 7498 overflow: hidden; 7499 text-overflow: ellipsis; 7500 margin-right: auto; 7501 padding-right: 30px; 7502} 7503 7504input.neo_partyselector_quantity { 7505 padding: 15px 10px; 7506 font-size: 18px; 7507 text-align: center; 7508 border: none; 7509 background: transparent; 7510 width: 60px; 7511 -moz-appearance: textfield; 7512} 7513input.neo_partyselector_quantity::-webkit-outer-spin-button, 7514input.neo_partyselector_quantity::-webkit-inner-spin-button { 7515 -webkit-appearance: none; 7516 margin: 0; 7517} 7518input.neo_partyselector_quantity:focus { 7519 outline: none; 7520 background-color: rgba(0, 0, 0, 0.03); 7521 border-radius: 5px; 7522} 7523 7524.ChildrensAges { 7525 max-height: 180px; 7526 overflow-y: auto; 7527 overflow-x: hidden; 7528 padding-right: 5px; 7529} 7530.ChildrensAges::-webkit-scrollbar {
7531 width: 6px; 7532} 7533.ChildrensAges::-webkit-scrollbar-track { 7534 background: #f1f1f1; 7535 border-radius: 10px; 7536} 7537.ChildrensAges::-webkit-scrollbar-thumb { 7538 background: #888; 7539 border-radius: 10px; 7540} 7541.ChildrensAges::-webkit-scrollbar-thumb:hover { 7542 background: #555; 7543} 7544 7545@media only screen and (max-width: 650px) { 7546 .PartyTypeSimulatorContainer { 7547 height: auto !important; 7548 } 7549 .PartyTypeSimulatorContainer .PartyTypeSimulatorSelect { 7550 position: static !important; 7551 width: 100%; 7552 } 7553 .px-mk-locationdropdown { 7554 width: 100%; 7555 box-shadow: 0 4px 9px rgba(0, 0, 0, 0.5); 7556 } 7557 .neo_marketplace_buscador_v3 * { 7558 font-size: 15px !important; 7559 } 7560 .neo_marketplace_buscador_v3 input, .neo_marketplace_buscador_v3 select { 7561 font-size: 16px !important; 7562 } 7563 .neo_marketplace_buscador_v3 { 7564 width: 100%; 7565 display: flex; 7566 } 7567 .ui-datepicker { 7568 font-size: 19px !important; 7569 z-index: 1000 !important; 7570 width: calc(100vw - 30px) !important; 7571 left: 10px !important; 7572 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.5); 7573 padding: 10px !important; 7574 box-sizing: border-box; 7575 } 7576 7577 /* Ajustes para el selector de party en mobile */ 7578 .neo_marketplace_buscador_v3 .txtPartyGroup, 7579 .PartyTypeSimulator .txtPartyGroup, 7580 .SelectorInitial .txtPartyGroup { 7581 white-space: normal !important; 7582 overflow: visible !important; 7583 text-overflow: clip !important; 7584 padding-right: 10px !important; 7585 font-size: 10px !important; 7586 line-height: 1.4 !important; 7587 display: flex !important; 7588 flex-wrap: wrap !important; 7589 align-items: center !important; 7590 gap: 2px !important; 7591 max-width: calc(100% - 40px) !important; 7592 } 7593 7594 .neo_marketplace_buscador_v3 .txtPartyGroup span, 7595 .PartyTypeSimulator .txtPartyGroup span, 7596 .SelectorInitial .txtPartyGroup span { 7597 white-space: nowrap !important; 7598 font-size: 15px !important; 7599 } 7600 7601 .neo_marketplace_buscador_v3 .txtPartyGroup .mdi-circle-small, 7602 .PartyTypeSimulator .txtPartyGroup .mdi-circle-small, 7603 .SelectorInitial .txtPartyGroup .mdi-circle-small { 7604 font-size: 12px !important; 7605 margin: 0 -3px !important; 7606 } 7607 7608 .neo_marketplace_buscador_v3 .SelectorInitial, 7609 .PartyTypeSimulator .SelectorInitial { 7610 min-height: 55px !important; 7611 padding: 8px 40px 8px 10px !important; 7612 display: flex !important; 7613 align-items: center !important; 7614 } 7615 7616 .neo_marketplace_buscador_v3 .PartyTypeSimulatorContainer, 7617 .PartyTypeSimulatorContainer { 7618 overflow: visible !important; 7619 } 7620 7621 .px-mk-buscador-container { 7622 font-size: 16px; 7623 } 7624 .px-mk-buscador-container select, 7625 .px-mk-buscador-container textarea, 7626 .px-mk-buscador-container input[type=text], 7627 .px-mk-buscador-container input[type=password], 7628 .px-mk-buscador-container input[type=datetime], 7629 .px-mk-buscador-container input[type=datetime-local], 7630 .px-mk-buscador-container input[type=date], 7631 .px-mk-buscador-container input[type=month], 7632 .px-mk-buscador-container input[type=time], 7633 .px-mk-buscador-container input[type=week], 7634 .px-mk-buscador-container input[type=number], 7635 .px-mk-buscador-container input[type=email], 7636 .px-mk-buscador-container input[type=url], 7637 .px-mk-buscador-container input[type=search], 7638 .px-mk-buscador-container input[type=tel], 7639 .px-mk-buscador-container input[type=color] { 7640 font-size: 1em; 7641 } 7642}/*# sourceMappingURL=css.css.map */</style>
7643<script> 7644 (function() { 7645 function run() { 7646 try { 7647 var span = document.querySelector('#PxMkAcion_Search .update-search-span'); 7648 var btn = document.getElementById('PxMkAcion_Search'); 7649 if (!span) return; 7650 7651 var themeHex = '#006633'; 7652 7653 function parseHex(hex) { 7654 if (!hex) return null; 7655 hex = String(hex).trim(); 7656 if (hex.startsWith('#')) hex = hex.slice(1); 7657 if (hex.length === 3) { 7658 hex = hex.split('').map(function(ch) { 7659 return ch + ch; 7660 }).join(''); 7661 } 7662 if (hex.length !== 6) return null; 7663 var r = parseInt(hex.slice(0, 2), 16); 7664 var g = parseInt(hex.slice(2, 4), 16); 7665 var b = parseInt(hex.slice(4, 6), 16); 7666 if ([r, g, b].some(function(v) { 7667 return isNaN(v); 7668 })) return null; 7669 return { 7670 r: r, 7671 g: g, 7672 b: b 7673 }; 7674 } 7675 7676 function relL(rgb) { 7677 function toLin(c) { 7678 c = c / 255; 7679 return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); 7680 } 7681 var R = toLin(rgb.r), 7682 G = toLin(rgb.g), 7683 B = toLin(rgb.b); 7684 return 0.2126 * R + 0.7152 * G + 0.0722 * B; 7685 } 7686 7687 function contrast(L1, L2) { 7688 var a = Math.max(L1, L2); 7689 var b = Math.min(L1, L2); 7690 return (a + 0.05) / (b + 0.05); 7691 } 7692 7693 var rgb = parseHex(themeHex); 7694 if (!rgb) { 7695 if (btn) { 7696 var bg = window.getComputedStyle(btn).backgroundColor; // rgb(a) 7697 var m = bg && bg.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); 7698 if (m) { 7699 rgb = { 7700 r: parseInt(m[1], 10), 7701 g: parseInt(m[2], 10), 7702 b: parseInt(m[3], 10) 7703 }; 7704 } 7705 } 7706 } 7707 if (!rgb) return; 7708 7709 var Lbg = relL(rgb); 7710 var Lwhite = relL({ 7711 r: 255, 7712 g: 255, 7713 b: 255 7714 }); 7715 var Lblack = relL({ 7716 r: 0, 7717 g: 0, 7718 b: 0 7719 }); 7720 var cWhite = contrast(Lbg, Lwhite); 7721 var cBlack = contrast(Lbg, Lblack); 7722 7723 var textColor = cBlack >= cWhite ? '#000000' : '#FFFFFF'; 7724 span.style.setProperty('color', textColor, 'important'); 7725 if (btn) { 7726 btn.style.setProperty('color', textColor, 'important'); 7727 7728 // Recolor inline SVG icons (search and loading) to match the contrast color 7729 function paintInlineSVG(container, color) { 7730 try { 7731 var svgs = container.querySelectorAll('svg'); 7732 svgs.forEach(function(svg) { 7733 // Support SVGs that use currentColor 7734 svg.style.setProperty('color', color, 'important'); 7735 svg.setAttribute('color', color); 7736 // Force fill/stroke via style to override inline attrs 7737 svg.style.setProperty('fill', color, 'important'); 7738 svg.style.setProperty('stroke', color, 'important'); 7739 // Update common shape elements 7740 svg.querySelectorAll('path, circle, rect, polygon, line, polyline, ellipse, g').forEach(function(node) { 7741 node.style.setProperty('fill', color, 'important'); 7742 node.style.setProperty('stroke', color, 'important'); 7743 }); 7744 // Also override attributes for stubborn icons 7745 svg.querySelectorAll('[fill]').forEach(function(node) { 7746 node.setAttribute('fill', color); 7747 }); 7748 svg.querySelectorAll('[stroke]').forEach(function(node) { 7749 node.setAttribute('stroke', color); 7750 }); 7751 }); 7752 } catch (e) { 7753 /* ignore */ 7754 } 7755 } 7756 7757 var iconLabel = btn.querySelector('.px-mk-searchicon'); 7758 var loaderLabel = btn.querySelector('.px-mk-searchloader'); 7759 if (iconLabel) paintInlineSVG(iconLabel, textColor); 7760 if (loaderLabel) paintInlineSVG(loaderLabel, textColor); 7761 } 7762 } catch (e) { 7763 /* ignore */ 7764 } 7765 } 7766 7767 if (document.readyState === 'loading') { 7768 document.addEventListener('DOMContentLoaded', run); 7769 } else { 7770 run(); 7771 } 7772 })(); 7773</script>
7773 7774
7774<script> 7775 if (localStorage.getItem('tradename')) { 7776 localStorage.removeItem('tradename'); 7777 } 7778 </script>
7778 7779 7780<!-- Scripts para el mapa -->
7781<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" crossorigin=""></script>
vendor: 1 bytes, line 7781
7781
7782<script> 7783 (function() { 7784 // Desactivar logs dentro de este módulo (solo en este scope) 7785 var console = { 7786 log: function() {}, 7787 warn: function() {}, 7788 error: function() {} 7789 }; 7790 // Variables para el mapa 7791 let map; 7792 let marker; 7793 let selectedLat = 0; 7794 let selectedLng = 0; 7795 let radiusCircle; // Variable para el cÃrculo del radio 7796 const defaultZoom = 13; 7797 // Coordenadas por defecto: Mendoza, Argentina 7798 const DEFAULT_LAT = -32.889458; 7799 const DEFAULT_LNG = -68.845839; 7800 const DEFAULT_RADIUS = 50000; // 50km en metros 7801 7802 // Elementos del DOM 7803 const mapModal = document.getElementById('map-modal'); 7804 const mapBtn = document.getElementById('map-search-btn'); 7805 const closeBtn = document.querySelector('.map-close'); 7806 const confirmBtn = document.getElementById('confirm-location'); 7807 const enableLocationGuideBtn = document.getElementById('enable-location-guide'); 7808 const centerLocationBtn = document.getElementById('center-location'); 7809 const locationPermissionsGuide = document.getElementById('location-permissions-guide'); 7810 const browserGuideContent = document.getElementById('browser-guide-content'); 7811 const closeGuideBtn = document.getElementById('close-guide'); 7812 const latitudeInput = document.getElementById('webroot_latitude'); 7813 const longitudeInput = document.getElementById('webroot_longitude'); 7814 const radiusInput = document.getElementById('webroot_distance_radius'); 7815 const locationInput = document.getElementById('webroot_location_search'); 7816 const locationGoogleSearch = document.getElementById('location_google_search'); 7817 7818 // Variables para rastrear estado de permisos 7819 let locationPermissionsDenied = false; 7820 let locationPermissionsEnabled = false; 7821 7822 // Función para detectar el navegador 7823 function detectBrowser() { 7824 const userAgent = navigator.userAgent.toLowerCase(); 7825 if (userAgent.includes('chrome') && !userAgent.includes('edg')) return 'chrome'; 7826 if (userAgent.includes('firefox')) return 'firefox'; 7827 if (userAgent.includes('safari') && !userAgent.includes('chrome')) return 'safari'; 7828 if (userAgent.includes('edg')) return 'edge'; 7829 return 'chrome'; 7830 } 7831 7832 // Función para obtener el contenido de la guÃa según el navegador 7833 function getBrowserGuideContent(browser) { 7834 const guides = { 7835 chrome: { 7836 title: 'Google Chrome', 7837 steps: [ 7838 'Haz clic en el icono de candado en la barra de direcciones', 7839 'Selecciona "Configuración del sitio" o "Permisos"', 7840 'Cambia "Ubicación" de "Bloquear" a "Permitir"', 7841 'Recarga la página' 7842 ], 7843 link: 'https://support.google.com/chrome/answer/142065' 7844 }, 7845 firefox: { 7846 title: 'Mozilla Firefox', 7847 steps: [ 7848 'Haz clic en el icono de escudo en la barra de direcciones', 7849 'Selecciona "Configuración mejorada de seguimiento"', 7850 'Habilita los permisos de ubicación para este sitio', 7851 'Recarga la página' 7852 ], 7853 link: 'https://support.mozilla.org/es/kb/compartir-ubicacion-con-sitios-web' 7854 }, 7855 safari: { 7856 title: 'Safari', 7857 steps: [ 7858 'Ve a Safari > Preferencias > Sitios web', 7859 'Selecciona "Ubicación" en la barra lateral', 7860 'Encuentra este sitio y cambia a "Permitir"', 7861 'Recarga la página' 7862 ], 7863 link: 'https://support.apple.com/es-es/guide/safari/ibrw1056/mac' 7864 }, 7865 edge: { 7866 title: 'Microsoft Edge', 7867 steps: [ 7868 'Haz clic en el icono de candado en la barra de direcciones', 7869 'Selecciona "Permisos para este sitio"', 7870 'Cambia "Ubicación" a "Permitir"', 7871 'Recarga la página' 7872 ], 7873 link: 'https://support.microsoft.com/es-es/microsoft-edge/ubicaci%C3%B3n-y-privacidad-en-microsoft-edge-31b5d9e7-bb24-43a0-8b0e-d9f4b38f6cf5' 7874 } 7875 }; 7876 return guides[browser] || guides.chrome; 7877 } 7878 7879 // Función para mostrar la guÃa de permisos 7880 function showLocationPermissionsGuide() { 7881 const browser = detectBrowser(); 7882 const guide = getBrowserGuideContent(browser); 7883 7884 let content = ` 7885 <div style="margin: 10px 0; padding: 15px; background: white; border-radius: 6px; border: 1px solid #e5e7eb;"> 7886 <h5 style="margin: 0 0 8px 0; color: #374151; font-size: 16px; font-weight: 600;">Instrucciones para ${guide.title}</h5> 7887 <p style="margin: 0 0 12px 0; color: #6b7280; font-size: 13px;">Sigue estos pasos para habilitar los permisos:</p> 7888 <ol style="margin: 8px 0 8px 20px; padding: 0;"> 7889 `; 7890 7891 guide.steps.forEach(step => { 7892 content += `<li style="margin: 6px 0; font-size: 14px; color: #4b5563;">${step}</li>`; 7893 }); 7894 7895 content += ` 7896 </ol> 7897 <a href="${guide.link}" target="_blank" style="display: inline-block; margin-top: 10px; color: #3b82f6; text-decoration: none; font-size: 13px;"> 7898 Ver guÃa oficial de ${guide.title} â 7899 </a> 7900 </div> 7901 `; 7902 7903 if (browserGuideContent) { 7904 browserGuideContent.innerHTML = content; 7905 } 7906 7907 if (locationPermissionsGuide) { 7908 locationPermissionsGuide.style.display = 'block'; 7909 } 7910 } 7911 7912 // Función para ocultar la guÃa de permisos 7913 function hideLocationPermissionsGuide() { 7914 if (locationPermissionsGuide) { 7915 locationPermissionsGuide.style.display = 'none'; 7916 } 7917 } 7918 7919 // Función para centrar el mapa en la ubicación actual 7920 function centerMapOnCurrentLocation() { 7921 if (!navigator.geolocation) { 7922 alert('Tu navegador no soporta geolocalización.'); 7923 return; 7924 } 7925 7926 // Mostrar loader en el botón centrar 7927 if (centerLocationBtn) { 7928 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 7929 const text = centerLocationBtn.querySelector('.center-btn-text'); 7930 if (loader && text) { 7931 loader.style.display = 'inline-block'; 7932 text.style.display = 'none'; 7933 } 7934 centerLocationBtn.disabled = true; 7935 } 7936 7937 navigator.geolocation.getCurrentPosition( 7938 async function(position) { 7939 const lat = position.coords.latitude; 7940 const lng = position.coords.longitude; 7941 7942 // Centrar el mapa en la nueva ubicación 7943 if (map) {
7944 map.setView([lat, lng], defaultZoom); 7945 7946 // Remover marcador anterior si existe 7947 if (marker) { 7948 map.removeLayer(marker); 7949 } 7950 7951 // Añadir nuevo marcador 7952 marker = L.marker([lat, lng], { 7953 draggable: true 7954 }).addTo(map); 7955 7956 // Actualizar posición del cÃrculo 7957 if (radiusCircle) { 7958 radiusCircle.setLatLng([lat, lng]); 7959 } else { 7960 // Si por alguna razón no existe, crearlo 7961 const radiusSelect = document.getElementById('radius-select'); 7962 const currentRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 7963 radiusCircle = L.circle([lat, lng], { 7964 color: '#3388ff', 7965 fillColor: '#3388ff', 7966 fillOpacity: 0.2, 7967 radius: currentRadius 7968 }).addTo(map); 7969 } 7970 7971 // Actualizar coordenadas seleccionadas 7972 selectedLat = lat; 7973 selectedLng = lng; 7974 7975 // Obtener información de ubicación para el marcador 7976 try { 7977 const locationName = await getAddressFromCoordinates(lat, lng); 7978 if (locationName && !locationName.includes(lat.toString())) { 7979 marker.bindPopup(locationName).openPopup(); 7980 } 7981 } catch (error) { 7982 console.log('â ï¸ No se pudo obtener información de ubicación para el marcador'); 7983 } 7984 7985 // Actualizar coordenadas al arrastrar el marcador 7986 marker.on('dragend', async function(e) { 7987 const position = marker.getLatLng(); 7988 selectedLat = position.lat; 7989 selectedLng = position.lng; 7990 7991 // Actualizar posición del cÃrculo 7992 if (radiusCircle) { 7993 radiusCircle.setLatLng(position); 7994 } 7995 7996 // Actualizar popup al arrastrar 7997 try { 7998 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 7999 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 8000 marker.setPopupContent(newLocationName); 8001 } 8002 } catch (error) { 8003 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 8004 } 8005 }); 8006 8007 // Actualizar coordenadas al arrastrar el marcador 8008 marker.on('dragend', async function(e) { 8009 const position = marker.getLatLng(); 8010 selectedLat = position.lat; 8011 selectedLng = position.lng; 8012 8013 // Actualizar popup al arrastrar 8014 try { 8015 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 8016 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 8017 marker.setPopupContent(newLocationName); 8018 } 8019 } catch (error) { 8020 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 8021 } 8022 }); 8023 } 8024 8025 // Ocultar loader del botón 8026 if (centerLocationBtn) { 8027 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 8028 const text = centerLocationBtn.querySelector('.center-btn-text'); 8029 if (loader && text) { 8030 loader.style.display = 'none'; 8031 text.style.display = 'inline-block'; 8032 } 8033 centerLocationBtn.disabled = false; 8034 } 8035 }, 8036 function(error) { 8037 console.log('Error al obtener ubicación actual:', error); 8038 alert('No se pudo obtener tu ubicación actual. Verifica que los permisos estén habilitados.'); 8039 8040 // Ocultar loader del botón 8041 if (centerLocationBtn) { 8042 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 8043 const text = centerLocationBtn.querySelector('.center-btn-text'); 8044 if (loader && text) { 8045 loader.style.display = 'none'; 8046 text.style.display = 'inline-block'; 8047 } 8048 centerLocationBtn.disabled = false; 8049 } 8050 } 8051 ); 8052 } 8053 8054 console.log('Botón de mapa:', mapBtn); // Debug para verificar que el botón existe 8055 8056 // Asegurar que el modal existe en el DOM 8057 if (!mapModal) { 8058 console.error('Modal de mapa no encontrado en el DOM'); 8059 // Añadir el modal al final del body si no existe 8060 const modalHTML = ` 8061 <div id="map-modal" class="map-modal"> 8062 <div class="map-modal-content"> 8063 <span class="map-close">×</span> 8064 <h3>Selecciona una ubicación en el mapa</h3> 8065 <div id="map-container"></div> 8066 <div class="map-footer">
8067 <div class="map-footer-controls"> 8068 <button id="center-location" style="display: none; padding: 6px 12px; color: white; background-color: #10b981; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; margin-right: 10px;"> 8069 <span class="center-btn-loader" style="display: none; width: 12px; height: 12px; border: 2px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: white; animation: spin 1s ease-in-out infinite; margin-right: 6px;"></span> 8070 <span class="center-btn-text">Localizarme</span> 8071 </button> 8072 <div class="radius-selector"> 8073 <label for="radius-select" style="margin-right: 5px; font-weight: bold;">Radio:</label> 8074 <select id="radius-select" style="padding: 8px; border-radius: 4px; border: 1px solid #ccc;"> 8075 <option value="10000">10 km</option> 8076 <option value="30000">30 km</option> 8077 <option value="50000" selected>50 km</option> 8078 <option value="100000">100 km</option> 8079 </select> 8080 </div> 8081 </div> 8082 <button id="confirm-location" class="neo_bgcolor_primary"> 8083 <span class="btn-loader"></span> 8084 <span class="btn-text">Buscar en esta zona</span> 8085 </button> 8086 </div> 8087 </div> 8088 </div> 8089 `; 8090 document.body.insertAdjacentHTML('beforeend', modalHTML); 8091 } 8092 8093 // Función para inicializar el mapa 8094 function initMap(lat, lng) { 8095 // Limpiar mapa existente de manera segura 8096 if (map) { 8097 try { 8098 map.remove(); 8099 } catch (e) { 8100 console.log('Error al remover mapa:', e); 8101 } 8102 map = null; 8103 } 8104 8105 // Reset marker 8106 marker = null; 8107 8108 // Coordenadas por defecto (si no hay seleccionadas): Mendoza 8109 lat = (typeof lat === 'number' ? lat : null) ?? DEFAULT_LAT; 8110 lng = (typeof lng === 'number' ? lng : null) ?? DEFAULT_LNG; 8111 8112 // Crear mapa con un timeout para asegurar que el contenedor está visible 8113 setTimeout(() => { 8114 try { 8115 // Verificar que el contenedor principal existe 8116 const mapContainer = document.getElementById('map-container'); 8117 if (!mapContainer) { 8118 console.error('Contenedor del mapa no encontrado'); 8119 return; 8120 } 8121 8122 // Crear un nuevo contenedor para evitar el error de "already initialized" 8123 const mapId = 'map-instance-' + Date.now(); 8124 mapContainer.innerHTML = `<div id="${mapId}" style="height: 100%; width: 100%;"></div>`; 8125 8126 // Crear el mapa en el nuevo contenedor 8127 map = L.map(mapId, { 8128 scrollWheelZoom: true 8129 }).setView([lat, lng], defaultZoom); 8130 8131 // Invalidar tamaño inmediatamente para asegurar renderizado correcto 8132 map.invalidateSize(); 8133 8134 // Añadir capa de mapa base (OpenStreetMap) 8135 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 8136 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' 8137 }).addTo(map); 8138 8139 // Añadir marcador SIEMPRE (incluido Mendoza por defecto) y preparar comportamiento 8140 marker = L.marker([lat, lng], { 8141 draggable: true 8142 }).addTo(map); 8143 8144 // Dibujar cÃrculo de radio inicial 8145 const radiusSelect = document.getElementById('radius-select'); 8146 const initialRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 8147 8148 radiusCircle = L.circle([lat, lng], { 8149 color: '#3388ff', 8150 fillColor: '#3388ff', 8151 fillOpacity: 0.2, 8152 radius: initialRadius 8153 }).addTo(map); 8154 8155 // Evento para actualizar el radio cuando cambia el select 8156 if (radiusSelect) { 8157 // Remover listeners anteriores para evitar duplicados 8158 const newRadiusSelect = radiusSelect.cloneNode(true); 8159 radiusSelect.parentNode.replaceChild(newRadiusSelect, radiusSelect); 8160 8161 newRadiusSelect.addEventListener('change', function() { 8162 const newRadius = parseInt(this.value); 8163 if (radiusCircle) { 8164 radiusCircle.setRadius(newRadius); 8165 } 8166 }); 8167 } 8168 8169 // Obtener información de ubicación para el marcador inicial 8170 (async () => { 8171 try { 8172 const locationName = await getAddressFromCoordinates(lat, lng); 8173 if (locationName && !locationName.includes(lat.toString())) { 8174 marker.bindPopup(locationName);
8175 console.log('ð Información inicial del marcador:', locationName); 8176 } 8177 } catch (error) { 8178 console.log('â ï¸ No se pudo obtener información inicial del marcador'); 8179 } 8180 })(); 8181 8182 // Actualizar coordenadas al arrastrar el marcador 8183 marker.on('dragend', async function(e) { 8184 const position = marker.getLatLng(); 8185 selectedLat = position.lat; 8186 selectedLng = position.lng; 8187 8188 // Actualizar posición del cÃrculo 8189 if (radiusCircle) { 8190 radiusCircle.setLatLng(position); 8191 } 8192 8193 // Actualizar popup al arrastrar 8194 try { 8195 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 8196 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 8197 marker.setPopupContent(newLocationName); 8198 } 8199 } catch (error) { 8200 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 8201 } 8202 }); 8203 8204 selectedLat = lat; 8205 selectedLng = lng; 8206 8207 // Añadir evento de clic al mapa 8208 map.on('click', async function(e) { 8209 // Si ya existe un marcador, lo eliminamos 8210 if (marker) { 8211 map.removeLayer(marker); 8212 } 8213 8214 // Añadir nuevo marcador en la posición del clic 8215 marker = L.marker(e.latlng, { 8216 draggable: true 8217 }).addTo(map); 8218 8219 // Actualizar posición del cÃrculo 8220 if (radiusCircle) { 8221 radiusCircle.setLatLng(e.latlng); 8222 } else { 8223 // Si por alguna razón no existe, crearlo 8224 const radiusSelect = document.getElementById('radius-select'); 8225 const currentRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 8226 radiusCircle = L.circle(e.latlng, { 8227 color: '#3388ff', 8228 fillColor: '#3388ff', 8229 fillOpacity: 0.2, 8230 radius: currentRadius 8231 }).addTo(map); 8232 } 8233 8234 // Guardar coordenadas seleccionadas 8235 selectedLat = e.latlng.lat; 8236 selectedLng = e.latlng.lng; 8237 8238 // Intentar obtener y mostrar información de ubicación en el marcador 8239 try { 8240 const locationName = await getAddressFromCoordinates(selectedLat, selectedLng); 8241 if (locationName && !locationName.includes(selectedLat.toString())) { 8242 marker.bindPopup(locationName).openPopup(); 8243 console.log('ð Información del marcador establecida:', locationName); 8244 } 8245 } catch (error) { 8246 console.log('â ï¸ No se pudo obtener información de ubicación para el marcador'); 8247 } 8248 8249 // Actualizar coordenadas al arrastrar el marcador 8250 marker.on('dragend', async function(e) { 8251 const position = marker.getLatLng(); 8252 selectedLat = position.lat; 8253 selectedLng = position.lng; 8254 8255 // Actualizar posición del cÃrculo 8256 if (radiusCircle) { 8257 radiusCircle.setLatLng(position); 8258 } 8259 8260 // Actualizar popup al arrastrar 8261 try { 8262 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 8263 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 8264 marker.setPopupContent(newLocationName); 8265 } 8266 } catch (error) { 8267 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 8268 } 8269 }); 8270 }); 8271 8272 // Invalidar tamaño para asegurar que se renderiza correctamente 8273 setTimeout(() => { 8274 if (map) { 8275 map.invalidateSize(); 8276 } 8277 }, 100); 8278 // Segundo intento para móviles lentos 8279 setTimeout(() => { 8280 if (map) { 8281 map.invalidateSize(); 8282 } 8283 }, 500); 8284 } catch (e) { 8285 console.error('Error al inicializar el mapa:', e); 8286 } 8287 }, 500); // Aumentar timeout para dar más tiempo al modal 8288 } 8289 8290 // Evento clic en botón de mapa (consolidado en un único listener) 8291 if (mapBtn) { 8292 console.log('Asignando evento click al botón de mapa'); 8293 8294 function openMapModalHandler(e) { 8295 console.log('Botón de mapa clickeado'); 8296 e.preventDefault(); 8297 e.stopPropagation(); 8298 mapModal.style.display = 'flex'; 8299 8300 // Resetear estado de permisos y ocultar elementos al abrir el modal 8301 locationPermissionsDenied = false;
8302 locationPermissionsEnabled = false; 8303 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 8304 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 8305 hideLocationPermissionsGuide(); 8306 8307 // Si ya hay coordenadas guardadas, las usamos 8308 const currentLat = latitudeInput.value ? parseFloat(latitudeInput.value) : null; 8309 const currentLng = longitudeInput.value ? parseFloat(longitudeInput.value) : null; 8310 8311 if (currentLat && currentLng) { 8312 initMap(currentLat, currentLng); 8313 } else { 8314 // Inicializar inmediatamente con Mendoza para evitar mapa en blanco 8315 initMap(DEFAULT_LAT, DEFAULT_LNG); 8316 8317 // Mostrar botón de centrar si la geolocalización está disponible en el navegador 8318 if (navigator.geolocation) { 8319 if (centerLocationBtn) centerLocationBtn.style.display = 'inline-block'; 8320 } 8321 } 8322 return false; 8323 } 8324 8325 // Agregar un único listener 8326 mapBtn.addEventListener('click', openMapModalHandler); 8327 } else { 8328 console.error('El botón de mapa no se encontró en el DOM'); 8329 } 8330 8331 // Event listeners para los botones de la guÃa 8332 if (enableLocationGuideBtn) { 8333 enableLocationGuideBtn.addEventListener('click', function() { 8334 showLocationPermissionsGuide(); 8335 }); 8336 } 8337 8338 if (closeGuideBtn) { 8339 closeGuideBtn.addEventListener('click', function() { 8340 hideLocationPermissionsGuide(); 8341 }); 8342 } 8343 8344 // Event listener para el botón "Centrar" 8345 if (centerLocationBtn) { 8346 centerLocationBtn.addEventListener('click', function() { 8347 centerMapOnCurrentLocation(); 8348 }); 8349 } 8350 8351 // Cerrar modal 8352 if (closeBtn) { 8353 closeBtn.addEventListener('click', function() { 8354 mapModal.style.display = 'none'; 8355 // Resetear estado al cerrar 8356 locationPermissionsDenied = false; 8357 locationPermissionsEnabled = false; 8358 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 8359 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 8360 hideLocationPermissionsGuide(); 8361 // Limpiar mapa al cerrar 8362 if (map) { 8363 try { 8364 map.remove(); 8365 } catch (e) { 8366 console.log('Error al limpiar mapa:', e); 8367 } 8368 map = null; 8369 marker = null; 8370 } 8371 }); 8372 } 8373 8374 // Cerrar modal al hacer clic fuera del contenido 8375 window.addEventListener('click', function(event) { 8376 if (event.target === mapModal) { 8377 mapModal.style.display = 'none'; 8378 // Resetear estado al cerrar 8379 locationPermissionsDenied = false; 8380 locationPermissionsEnabled = false; 8381 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 8382 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 8383 hideLocationPermissionsGuide(); 8384 // Limpiar mapa al cerrar 8385 if (map) { 8386 try { 8387 map.remove(); 8388 } catch (e) { 8389 console.log('Error al limpiar mapa:', e); 8390 } 8391 map = null; 8392 marker = null; 8393 } 8394 } 8395 }); 8396 8397 // Confirmar ubicación seleccionada 8398 if (confirmBtn) { 8399 confirmBtn.addEventListener('click', async function() { 8400 if (selectedLat && selectedLng) { 8401 // Mostrar loader y deshabilitar botón 8402 confirmBtn.classList.add('loading'); 8403 confirmBtn.disabled = true; 8404 8405 try { 8406 // Guardar coordenadas en los campos hidden 8407 latitudeInput.value = selectedLat; 8408 longitudeInput.value = selectedLng; 8409 const radiusSelect = document.getElementById('radius-select'); 8410 radiusInput.value = radiusSelect ? radiusSelect.value : DEFAULT_RADIUS; 8411 8412 // Intentar obtener información del marcador primero 8413 let address = ''; 8414 8415 // Verificar si el marcador tiene información de ubicación 8416 if (marker && marker.getPopup && marker.getPopup()) { 8417 const popupContent = marker.getPopup().getContent(); 8418 if (popupContent && typeof popupContent === 'string' && popupContent.trim() !== '') { 8419 address = popupContent; 8420 console.log('ð Usando información del marcador:', address); 8421 } 8422 } 8423 8424 // Si el mapa no proporcionó información, hacer reverse geocoding 8425 if (!address || address.includes('lat') || address.includes('lng')) { 8426 console.log('ðºï¸ Obteniendo dirección para coordenadas:', selectedLat, selectedLng); 8427 address = await getAddressFromCoordinates(selectedLat, selectedLng); 8428 console.log('ðï¸ Dirección obtenida via geocoding:', address); 8429 } 8430 8431 locationInput.value = address; 8432 8433 // Si existe el campo visible de búsqueda, también lo actualizamos 8434 if (locationGoogleSearch) { 8435 console.log('ð Actualizando campo visible con:', address); 8436 locationGoogleSearch.value = address; 8437 } 8438 8439 // Definimos el tipo de búsqueda 8440 const searchTypeInput = document.getElementById('SearchType'); 8441 if (searchTypeInput) { 8442 searchTypeInput.value = 'lat_lng'; 8443 } 8444 8445 // Pequeña pausa para mostrar que el proceso se completó 8446 await new Promise(resolve => setTimeout(resolve, 500)); 8447 8448 // Cerrar el modal 8449 mapModal.style.display = 'none'; 8450 8451 // Limpiar mapa después de confirmar 8452 if (map) { 8453 try { 8454 map.remove(); 8455 } catch (e) { 8456 console.log('Error al limpiar mapa después de confirmar:', e); 8457 } 8458 map = null; 8459 marker = null; 8460 } 8461 } catch (error) { 8462 console.error('Error al procesar la ubicación:', error); 8463 alert('Error al procesar la ubicación. Por favor, inténtelo de nuevo.'); 8464 } finally { 8465 // Ocultar loader y rehabilitar botón 8466 confirmBtn.classList.remove('loading'); 8467 confirmBtn.disabled = false;
8468 } 8469 } else { 8470 alert('Por favor, seleccione una ubicación en el mapa antes de confirmar.'); 8471 } 8472 }); 8473 } 8474 8475 // Función para obtener la dirección aproximada a partir de coordenadas 8476 async function getAddressFromCoordinates(lat, lng) { 8477 try { 8478 console.log('ð Solicitando dirección para:', lat, lng); 8479 8480 // Intentar con el servicio que ya está funcionando en el autocomplete 8481 const response = await fetch(`https://ipapi.co/${lat},${lng}/json/`); 8482 8483 if (!response.ok) { 8484 throw new Error(`HTTP ${response.status}`); 8485 } 8486 8487 const data = await response.json(); 8488 console.log('ð¥ Respuesta de ipapi.co:', data); 8489 8490 if (data && !data.error) { 8491 let locationName = ''; 8492 8493 // Extraer información útil en orden de preferencia 8494 if (data.city) { 8495 locationName = data.city; 8496 } else if (data.region) { 8497 locationName = data.region; 8498 } 8499 8500 // Agregar región/estado si existe y es diferente 8501 if (data.region && data.region !== locationName && locationName) { 8502 locationName += `, ${data.region}`; 8503 } 8504 8505 // Agregar paÃs si existe 8506 if (data.country_name) { 8507 locationName += locationName ? `, ${data.country_name}` : data.country_name; 8508 } 8509 8510 const finalResult = locationName || `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 8511 console.log('â Dirección procesada:', finalResult); 8512 return finalResult; 8513 } else { 8514 throw new Error('No data received or API error'); 8515 } 8516 } catch (error) { 8517 console.warn('â ï¸ Error con ipapi.co, intentando con método alternativo:', error); 8518 8519 // Fallback: usar reverse geocoding simplificado 8520 try { 8521 // Intentar con un servicio público que sà permite CORS 8522 const response = await fetch(`https://api.bigdatacloud.net/data/reverse-geocode-client?latitude=${lat}&longitude=${lng}&localityLanguage=es`); 8523 const data = await response.json(); 8524 console.log('ð¥ Respuesta de BigDataCloud:', data); 8525 8526 if (data) { 8527 let locationName = ''; 8528 8529 if (data.city) { 8530 locationName = data.city; 8531 } else if (data.locality) { 8532 locationName = data.locality; 8533 } else if (data.principalSubdivision) { 8534 locationName = data.principalSubdivision; 8535 } 8536 8537 // Agregar paÃs 8538 if (data.countryName && locationName) { 8539 locationName += `, ${data.countryName}`; 8540 } else if (data.countryName) { 8541 locationName = data.countryName; 8542 } 8543 8544 const finalResult = locationName || `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 8545 console.log('â Dirección obtenida con BigDataCloud:', finalResult); 8546 return finalResult; 8547 } 8548 } catch (secondError) { 8549 console.error('ð¥ Error con ambos servicios:', secondError); 8550 } 8551 8552 // Si todo falla, devolver coordenadas simplificadas 8553 const errorResult = `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 8554 console.log('ð¯ Usando coordenadas como último recurso:', errorResult); 8555 return errorResult; 8556 } 8557 } 8558 8559 // Mover el modal de mapa al final del body para evitar problemas de desbordamiento 8560 document.addEventListener("DOMContentLoaded", function() { 8561 if (mapModal && document.body) { 8562 document.body.appendChild(mapModal); 8563 } 8564 }); 8565 })(); 8566</script>
8566 8567 8568<!-- Script independiente para limpiar modal si no hay botón de mapa -->
8569<script> 8570 (function() { 8571 // Función robusta para limpiar el modal 8572 function cleanupMapModal() { 8573 try { 8574 // Verificar si existe el botón del mapa 8575 const mapBtn = document.getElementById('map-search-btn'); 8576 8577 if (!mapBtn) { 8578 console.log('ðï¸ Botón del mapa no encontrado - removiendo modal del mapa...'); 8579 // Si no existe el botón, remover el modal del mapa 8580 const mapModal = document.getElementById('map-modal'); 8581 if (mapModal) { 8582 mapModal.remove(); 8583 console.log('â Modal del mapa removido correctamente'); 8584 return true; // Indica que se completó la limpieza 8585 } 8586 } else { 8587 console.log('â Botón del mapa encontrado - modal del mapa disponible'); 8588 return true; // Indica que se completó la verificación 8589 } 8590 } catch (error) { 8591 console.error('Error al limpiar modal del mapa:', error); 8592 } 8593 return false; // Indica que no se pudo completar 8594 } 8595 8596 // Estrategia 1: Ejecutar inmediatamente si el DOM ya está listo 8597 if (document.readyState === 'loading') { 8598 // El DOM aún se está cargando, usar múltiples eventos 8599 let cleaned = false; 8600 8601 // Función que se ejecuta una sola vez 8602 function tryCleanup() { 8603 if (!cleaned && cleanupMapModal()) { 8604 cleaned = true; 8605 } 8606 } 8607 8608 // Estrategia 2: Múltiples eventos para garantizar ejecución 8609 document.addEventListener('DOMContentLoaded', tryCleanup); 8610 document.addEventListener('readystatechange', function() { 8611 if (document.readyState === 'interactive' || document.readyState === 'complete') { 8612 tryCleanup(); 8613 } 8614 }); 8615 window.addEventListener('load', tryCleanup); 8616 8617 // Estrategia 3: Verificación periódica como respaldo 8618 let attempts = 0; 8619 const maxAttempts = 20; // Máximo 2 segundos 8620 const checkInterval = setInterval(function() { 8621 attempts++; 8622 if (cleaned || attempts >= maxAttempts) { 8623 clearInterval(checkInterval); 8624 return; 8625 } 8626 8627 // Verificar si el DOM está listo 8628 if (document.readyState === 'interactive' || document.readyState === 'complete') { 8629 if (cleanupMapModal()) { 8630 cleaned = true; 8631 clearInterval(checkInterval); 8632 } 8633 } 8634 }, 100); 8635 8636 } else { 8637 // El DOM ya está listo, ejecutar inmediatamente 8638 cleanupMapModal(); 8639 } 8640 })(); 8641</script>
vendor: 1 bytes, line 8641
8641
8642<script> 8643 (function() { 8644 function run() { 8645 try { 8646 var span = document.querySelector('#PxMkAcion_Search .update-search-span'); 8647 var btn = document.getElementById('PxMkAcion_Search'); 8648 if (!span) return; 8649 8650 var themeHex = '#006633'; 8651 8652 function parseHex(hex) { 8653 if (!hex) return null; 8654 hex = String(hex).trim(); 8655 if (hex.startsWith('#')) hex = hex.slice(1); 8656 if (hex.length === 3) { 8657 hex = hex.split('').map(function(ch) { 8658 return ch + ch; 8659 }).join(''); 8660 } 8661 if (hex.length !== 6) return null; 8662 var r = parseInt(hex.slice(0, 2), 16); 8663 var g = parseInt(hex.slice(2, 4), 16); 8664 var b = parseInt(hex.slice(4, 6), 16); 8665 if ([r, g, b].some(function(v) { 8666 return isNaN(v); 8667 })) return null; 8668 return { 8669 r: r, 8670 g: g, 8671 b: b 8672 }; 8673 } 8674 8675 function relL(rgb) { 8676 function toLin(c) { 8677 c = c / 255; 8678 return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); 8679 } 8680 var R = toLin(rgb.r), 8681 G = toLin(rgb.g), 8682 B = toLin(rgb.b); 8683 return 0.2126 * R + 0.7152 * G + 0.0722 * B; 8684 } 8685 8686 function contrast(L1, L2) { 8687 var a = Math.max(L1, L2); 8688 var b = Math.min(L1, L2); 8689 return (a + 0.05) / (b + 0.05); 8690 } 8691 8692 var rgb = parseHex(themeHex); 8693 if (!rgb) { 8694 if (btn) { 8695 var bg = window.getComputedStyle(btn).backgroundColor; // rgb(a) 8696 var m = bg && bg.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); 8697 if (m) { 8698 rgb = { 8699 r: parseInt(m[1], 10), 8700 g: parseInt(m[2], 10), 8701 b: parseInt(m[3], 10) 8702 }; 8703 } 8704 } 8705 } 8706 if (!rgb) return; 8707 8708 var Lbg = relL(rgb); 8709 var Lwhite = relL({ 8710 r: 255, 8711 g: 255, 8712 b: 255 8713 }); 8714 var Lblack = relL({ 8715 r: 0, 8716 g: 0, 8717 b: 0 8718 }); 8719 var cWhite = contrast(Lbg, Lwhite); 8720 var cBlack = contrast(Lbg, Lblack); 8721 8722 var textColor = cBlack >= cWhite ? '#000000' : '#FFFFFF'; 8723 span.style.setProperty('color', textColor, 'important'); 8724 if (btn) { 8725 btn.style.setProperty('color', textColor, 'important'); 8726 8727 // Recolor inline SVG icons (search and loading) to match contrast color 8728 function paintInlineSVG(container, color) { 8729 try { 8730 var svgs = container.querySelectorAll('svg'); 8731 svgs.forEach(function(svg) { 8732 // Support SVGs that use currentColor 8733 svg.style.setProperty('color', color, 'important'); 8734 svg.setAttribute('color', color); 8735 // Force fill/stroke 8736 svg.style.setProperty('fill', color, 'important'); 8737 svg.style.setProperty('stroke', color, 'important'); 8738 // Update common shape elements 8739 svg.querySelectorAll('path, circle, rect, polygon, line, polyline, ellipse, g').forEach(function(node) { 8740 node.style.setProperty('fill', color, 'important'); 8741 node.style.setProperty('stroke', color, 'important'); 8742 }); 8743 8744 // Override attributes if they exist 8745 svg.querySelectorAll('[fill]').forEach(function(node) { 8746 node.setAttribute('fill', color); 8747 }); 8748 svg.querySelectorAll('[stroke]').forEach(function(node) { 8749 node.setAttribute('stroke', color); 8750 }); 8751 }); 8752 } catch (e) { 8753 /* ignore */ 8754 } 8755 } 8756 8757 var iconLabel = btn.querySelector('.px-mk-searchicon'); 8758 var loaderLabel = btn.querySelector('.px-mk-searchloader'); 8759 if (iconLabel) paintInlineSVG(iconLabel, textColor); 8760 if (loaderLabel) paintInlineSVG(loaderLabel, textColor); 8761 } 8762 } catch (e) { 8763 /* ignore */ 8764 } 8765 } 8766 8767 if (document.readyState === 'loading') { 8768 document.addEventListener('DOMContentLoaded', run); 8769 } else { 8770 run(); 8771 } 8772 })(); 8773</script>
8773 </div> 8774 </div></div></div> 8775 8776 8777<div id='Overlay' class="hidden" onclick='activeSearch()'></div> 8778 8779</div> 8780 8781</div> 8782 <div class="main_wraper_content" id="main_wraper_content"> 8783 8784 8785<div class="neo_template_container neo_template_ computer"> 8786 8787 8788<div class="content-bg-color" ><div class="bg-color top" ></div><div class="bg-color bottom" ></div></div> 8789 8790 8791<div class="content-background" ><div class="background" ></div><div class='container-neo-slider' Slide='HomePage' Width='1900' Height='1000' Loop='true' Effect='Fade'> 8792 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 8793 8794 8795<!-- Module Start --> 8796 8797<div class="megacontainer-neo-swiper"> 8798 <div class="swiper-container-2673"> <!-- le asignamos el numero random al contenedor --> 8799 8800 <div class="swiper-wrapper"> 8801 <div class="swiper-slide"> 8802 <img data-src="https://images-new.pxsol.com/S4j9OtnZ1WBumK4urVy3IhXD2Jknp9SB8v53S_1G8_k/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F6c4bba5f60029f5743083774fcdd2e201f5568ec.jpg@jpg" class="swiper-lazy" 8803 width="1900" 8804 height="1000" 8805 style="aspect-ratio: 1900/1000;" 8806 alt="Sarmiento Palace Hotel"> 8807 <div class="swiper-lazy-preloader"></div> 8808 </div> 8809 <div class="swiper-slide"> 8810 <img data-src="https://images-new.pxsol.com/BHhVWfWUkLCAQ1ZqnFEIxIc7EiR92iviDkhcUncbsSs/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F606be7c8913f6cd9b1dc99058b06b1da5bf3bf3c.jpg@jpg" class="swiper-lazy" 8811 width="1900" 8812 height="1000" 8813 style="aspect-ratio: 1900/1000;" 8814 alt="Sarmiento Palace Hotel"> 8815 <div class="swiper-lazy-preloader"></div> 8816 </div> 8817 <div class="swiper-slide"> 8818 <img data-src="https://images-new.pxsol.com/MO-qgep9lQ9SbN7jBmRunk3q9zXPGYp2agB1HqOOSbQ/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F3164340411bf775f5f1fbf12e8a45488fcebf896.jpg@jpg" class="swiper-lazy" 8819 width="1900" 8820 height="1000" 8821 style="aspect-ratio: 1900/1000;" 8822 alt="Sarmiento Palace Hotel"> 8823 <div class="swiper-lazy-preloader"></div> 8824 </div> 8825 <div class="swiper-slide"> 8826 <img data-src="https://images-new.pxsol.com/uyKyzY3PV9PocedrwGTn_r6nzG2Dv55wYSzzOIjXP5U/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F26661643520f3221b03ce0902d17067f72b95c0fbd4.jpg@jpg" class="swiper-lazy" 8827 width="1900" 8828 height="1000" 8829 style="aspect-ratio: 1900/1000;" 8830 alt="Sarmiento Palace Hotel"> 8831 <div class="swiper-lazy-preloader"></div> 8832 </div> 8833 <div class="swiper-slide"> 8834 <img data-src="https://images-new.pxsol.com/l4Br7Hzt6adnOKFTZM-ObFSRD-lJ2fiiKs6UgVxmJBE/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F233289414269f2c9a1fe4e4557cd5002f6104f39522.jpg@jpg" class="swiper-lazy" 8835 width="1900" 8836 height="1000" 8837 style="aspect-ratio: 1900/1000;" 8838 alt="Sarmiento Palace Hotel"> 8839 <div class="swiper-lazy-preloader"></div> 8840 </div> 8841 <div class="swiper-slide"> 8842 <img data-src="https://images-new.pxsol.com/ydIP7p4EuDdp0x9fCJb0F-DzhQEgcwy1AHDK8fLPcSc/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F1166447172865572dfcf49ff4f0566c35aadaeea90e.jpg@jpg" class="swiper-lazy" 8843 width="1900" 8844 height="1000" 8845 style="aspect-ratio: 1900/1000;" 8846 alt="Sarmiento Palace Hotel"> 8847 <div class="swiper-lazy-preloader"></div> 8848 </div> 8849 <div class="swiper-slide"> 8850 <img data-src="https://images-new.pxsol.com/wNQPE56Ut81WaVK7AWq80xdfXbwRhjN4VY31iOXE-nU/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F16663538470d4c406ee5e6d1289f6f715191b439638.jpg@jpg" class="swiper-lazy" 8851 width="1900" 8852 height="1000" 8853 style="aspect-ratio: 1900/1000;" 8854 alt="Sarmiento Palace Hotel"> 8855 <div class="swiper-lazy-preloader"></div> 8856 </div> 8857 <div class="swiper-slide"> 8858 <img data-src="https://images-new.pxsol.com/T-4C3X_3KfU_dgSgHv7_clIp40Ha3CbQuFNZdJzoLpk/rs:fill:1900:1000:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F151435785245702edfb37339afc9cdc9e7fea8900d5.jpg@jpg" class="swiper-lazy" 8859 width="1900" 8860 height="1000" 8861 style="aspect-ratio: 1900/1000;" 8862 alt="Sarmiento Palace Hotel"> 8863 <div class="swiper-lazy-preloader"></div> 8864 </div> 8865 </div> 8866 <!-- Add Arrows --> 8867 <div class="swiper-button-next swiper-button-next-2673"></div> <!-- igualmente el numero random va para las flechas de cambio de imágenes
8867--> 8868 <div class="swiper-button-prev swiper-button-prev-2673"></div> 8869 8870 </div> 8871 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 8872 <div class="dataconfig-swiper" data-id="2673" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 8873</div> 8874 8875 8876 </div> 8877 </div> <img loading="lazy" class="hidden-desktop logo-top-mobile" lazy-src="https://files-p.pxsol.com/68/company/library/user/148449938943582335ea1aa44003cb5736119b4c552.png" alt="SarmientoPalace" > </image></div> 8878 8879 8880<a class="btn-arrepentimiento" target='_blank' href="https://www.hotelsarmiento.com.ar/app/login" target="">Botón de arrepentimiento</a> 8881 8882 8883<div class="flex flex-wrap container-cards" ><div class="xs-100 sm-50 md-25 card" ><a class="content-items" href="/pt/habitaciones.html" target=""><span class='place' >Quartos</span><div class="btn-gral" >Recorre</div><div class='container-neo-slider' Slide='TopHabitaciones' Width='600' Height='600' Loop='true' Effect='Fade'> 8884 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 8885 8886 8887<!-- Module Start --> 8888 8889<div class="megacontainer-neo-swiper"> 8890 <div class="swiper-container-4237"> <!-- le asignamos el numero random al contenedor --> 8891 8892 <div class="swiper-wrapper"> 8893 <div class="swiper-slide slide-one-pic"> 8894 <img src="https://images-new.pxsol.com/6U7oqW5WvM7Qc_U2Sxgl3S780F1YvUjmG0YZ6rabrfA/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F5047859532cba09c42703af93eb24ab361370a521e.jpg@jpg" 8895 width="600" 8896 height="600" 8897 style="aspect-ratio: 600/600;" 8898 alt="Sarmiento Palace Hotel"> 8899 </div> 8900 </div> 8901 <!-- Add Arrows --> 8902 8903 </div> 8904 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 8905 <div class="dataconfig-swiper" data-id="4237" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 8906</div> 8907 8908 8909 </div> 8910 </div></a></div><div class="xs-100 sm-50 md-25 card two" ><a class="content-items" href="/pt/servicios.html" target=""><span class='place' >Serviços</span><div class="btn-gral" >Conoce</div><div class='container-neo-slider' Slide='TopServicios' Width='600' Height='600' Loop='true' Effect='Fade'> 8911 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 8912 8913 8914<!-- Module Start --> 8915 8916<div class="megacontainer-neo-swiper"> 8917 <div class="swiper-container-3306"> <!-- le asignamos el numero random al contenedor --> 8918 8919 <div class="swiper-wrapper"> 8920 <div class="swiper-slide"> 8921 <img data-src="https://images-new.pxsol.com/klUeBZttk7PszgbwdqlcrS_YSs9EeORjaFu113t_NqA/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2Fe58f0287f47c952e0c7d9ed45467f4ccd40cd18e.jpg@jpg" class="swiper-lazy" 8922 width="600" 8923 height="600" 8924 style="aspect-ratio: 600/600;" 8925 alt="Sarmiento Palace Hotel"> 8926 <div class="swiper-lazy-preloader"></div> 8927 </div> 8928 <div class="swiper-slide"> 8929 <img data-src="https://images-new.pxsol.com/6pYK2wrowzvT29LCJ1m2JmJsTMc7jgPufx1GpFmaLo4/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F5e5d41a7970928aa17d72117f7152
89290d4d3a284cc.jpg@jpg" class="swiper-lazy" 8930 width="600" 8931 height="600" 8932 style="aspect-ratio: 600/600;" 8933 alt="Sarmiento Palace Hotel"> 8934 <div class="swiper-lazy-preloader"></div> 8935 </div> 8936 <div class="swiper-slide"> 8937 <img data-src="https://images-new.pxsol.com/HvYRdnL4sOxeSpWC1TM4kZCn9Vb2MjQT127HyAetsuo/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F606be7c8913f6cd9b1dc99058b06b1da5bf3bf3c.jpg@jpg" class="swiper-lazy" 8938 width="600" 8939 height="600" 8940 style="aspect-ratio: 600/600;" 8941 alt="Sarmiento Palace Hotel"> 8942 <div class="swiper-lazy-preloader"></div> 8943 </div> 8944 <div class="swiper-slide"> 8945 <img data-src="https://images-new.pxsol.com/rhyZl2tNWRFDsH3CuTKuQfSspg3lIcNMi2WzwFpHaLY/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F7d4991f13e6b77eadf4f877aa0a0b8b8359acfa6.jpg@jpg" class="swiper-lazy" 8946 width="600" 8947 height="600" 8948 style="aspect-ratio: 600/600;" 8949 alt="Sarmiento Palace Hotel"> 8950 <div class="swiper-lazy-preloader"></div> 8951 </div> 8952 <div class="swiper-slide"> 8953 <img data-src="https://images-new.pxsol.com/6zuOZ3sxJ_DeOPKPq0CiYJMzf0IZskf92tpjcYky-8M/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F7143115464aa677dc8a47710120a11b8f6e1adeb1f.jpg@jpg" class="swiper-lazy" 8954 width="600" 8955 height="600" 8956 style="aspect-ratio: 600/600;" 8957 alt="Sarmiento Palace Hotel"> 8958 <div class="swiper-lazy-preloader"></div> 8959 </div> 8960 </div> 8961 <!-- Add Arrows --> 8962 <div class="swiper-button-next swiper-button-next-3306"></div> <!-- igualmente el numero random va para las flechas de cambio de imágenes --> 8963 <div class="swiper-button-prev swiper-button-prev-3306"></div> 8964 8965 </div> 8966 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 8967 <div class="dataconfig-swiper" data-id="3306" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 8968</div> 8969 8970 8971 </div> 8972 </div></a></div><div class="xs-100 sm-50 md-25 card three" ><a class="content-items" href="/pt/promos.html" target=""><span class='place' >Promoções</span><div class="btn-gral" >Conoce</div><div class='container-neo-slider' Slide='TopPromos' Width='600' Height='600' Loop='true' Effect='Fade'> 8973 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 8974 8975 8976<!-- Module Start --> 8977 8978<div class="megacontainer-neo-swiper"> 8979 <div class="swiper-container-3524"> <!-- le asignamos el numero random al contenedor --> 8980 8981 <div class="swiper-wrapper"> 8982 <div class="swiper-slide"> 8983 <img data-src="https://images-new.pxsol.com/ftTb_WeoxqbFQEPrqtfJY4F6Yr4_gqy5uN8g7OpFp5M/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F21662569136d314267b7a26a144c3419c62c006a853.jpg@jpg" class="swiper-lazy" 8984 width="600" 8985 height="600" 8986 style="aspect-ratio: 600/600;" 8987 alt="Sarmiento Palace Hotel"> 8988 <div class="swiper-lazy-preloader"></div> 8989 </div> 8990 <div class="swiper-slide"> 8991 <img data-src="https://images-new.pxsol.com/WoSETkfhquFqRvElfZsy7YOwpnmWPZuzLdQCxh7cqMk/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F2332892238675db2aeb9ebe7d1b849e6cbb9fd6913d.jpg@jpg" class="swiper-lazy" 8992 width="600" 8993 height="600" 8994 style="aspect-ratio: 600/600;" 8995 alt="Sarmiento Palace Hotel"> 8996 <div class="swiper-lazy-preloader"></div> 8997 </div> 8998 <div class="swiper-slide"> 8999 <img data-src="https://images-new.pxsol.com/bW7RW67g6-Oc_TAN1EBaZSXbfS9M-JfbRNt3ejVlX-g/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F233289247809b64d75d552e55cb6fc73851dcf175a2.jpg@jpg" class="swiper-lazy" 9000 width="600" 9001 height="600" 9002 style="aspect-ratio: 600/600;" 9003 alt="Sarmiento Palace Hotel"> 9004 <div class="swiper-lazy-preloader"></div> 9005 </div> 9006 <div class="swiper-slide"> 9007 <img data-src="https://images-new.pxsol.com/3xCUiGp7aRYDF52LqFMgpPHn5frVh3hHkrlNJs_sZjU/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F49990560754f1938fcc0718cf62d96ca3fa295330c.jpg@jpg" class="swiper-lazy" 9008 width="600" 9009 height="600" 9010 style="aspect-ratio: 600/600;" 9011 alt="Sarmiento Palace Hotel"> 9012 <div class="swiper-lazy-preloader"></div> 9013 </div> 9014 </div> 9015 <!-- Add Arrows --> 9016 <div class="swiper-button-next swiper-button-next-3524"></div> <!-- igualmente el numero random va para las flechas de cambio de imágenes
9016--> 9017 <div class="swiper-button-prev swiper-button-prev-3524"></div> 9018 9019 </div> 9020 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 9021 <div class="dataconfig-swiper" data-id="3524" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 9022</div> 9023 9024 9025 </div> 9026 </div></a></div><div class="xs-100 sm-50 md-25 card four" ><a class="content-items" href="/pt/contacto.html" target=""><span class='place' >Localização e contato</span><div class="btn-gral" >Descubre</div><div class='container-neo-slider' Slide='TopContacto' Width='600' Height='600' Loop='true' Effect='Fade'> 9027 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 9028 9029 9030<!-- Module Start --> 9031 9032<div class="megacontainer-neo-swiper"> 9033 <div class="swiper-container-3963"> <!-- le asignamos el numero random al contenedor --> 9034 9035 <div class="swiper-wrapper"> 9036 <div class="swiper-slide slide-one-pic"> 9037 <img src="https://images-new.pxsol.com/dfvFdKLlS8B7qr15hHGHOGOyFrakil0P5gB2KJSBwS8/rs:fill:600:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FSarmientoPalace%2FGaleriaFotosced7b4dd74a4611ca251fd9c31333c8dbb52990a.jpg@jpg" 9038 width="600" 9039 height="600" 9040 style="aspect-ratio: 600/600;" 9041 alt="Sarmiento Palace Hotel"> 9042 </div> 9043 </div> 9044 <!-- Add Arrows --> 9045 9046 </div> 9047 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 9048 <div class="dataconfig-swiper" data-id="3963" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 9049</div> 9050 9051 9052 </div> 9053 </div></a></div></div> 9054 9055 9056<div class="info-container-2 padding-xs-50" ><div class="container" ><div class="desc-hotel" ><span class='' >Bienvenido a</span><h1 class='' >Sarmiento Palace Hotel</h1><div class="desc-hotel-down" ><p class='' >Nos encontramos en una de las zonas céntricas más seguras de Buenos Aires, a 100 metros de las famosas Avenidas Corrientes y Callao, a tres cuadras del Congreso Nacional y a pasos de varios teatros, restaurantes, complejos culturales y de entretenimientos. A menos de diez cuadras del Hotel se encuentran la Avenida 9 de Julio, el Obelisco, Recoleta y el Shopping Abasto (centro comercial más grande de la Capital enmarcado en un barrio con gran tradición de tango) junto con el Museo de los Niños, el único en su tipo de Latinoamérica. Además, a 150 metros se encuentra una estación de Metro para un rápido y económico acceso a casi todos los puntos importantes de la Ciudad.</p></div></div></div></div> 9057 9058 <div class="neo_template_block neo_neo_promos container pxModule_include ModuloWrap_neo_promos" id="neo_promos"> 9059 9060 9061<div id="pug_list_module" class="full neo_pug_defaultlp flex flex-wrap padding-top-50 padding-bottom-50"> 9062 <div class="full neo_full flex-column flex-center text-center padding-xs-bottom-20 padding-xs-10 full"> 9063 <h2 class="fontsize-20px lineh-150 full neo_full padding-xs-bottom-10 text-center full neo_promo_slider_titulo"><strong>Promociones y Vouchers seleccionados para usted</strong></h2> 9064 </div> 9065 <link rel="stylesheet" href="/includes/neo_pugs/pug_prose.css?filev=1786562821"> 9066 <link rel="stylesheet" href="/neo_modules/standard_lp_motor/includes/carousel.css"> 9067
9067<script src="/neo_modules/standard_lp_motor/includes/carousel.js?filev=1778144039"></script>
9067 9068
9068<script> 9069 document.addEventListener('click', function (e) { 9070 var trigger = e.target.closest && e.target.closest('.neo_pug_img_trigger'); 9071 if (!trigger || typeof window.PxGallery !== 'function') return; 9072 var draggedGrid = trigger.closest && trigger.closest('[data-pug-suppress-click="true"]'); 9073 if (draggedGrid) { 9074 draggedGrid.removeAttribute('data-pug-suppress-click'); 9075 e.preventDefault(); 9076 e.stopPropagation(); 9077 return; 9078 } 9079 e.preventDefault(); 9080 e.stopPropagation(); 9081 var src = trigger.getAttribute('data-full-src') || ''; 9082 var items = [{ src: src, thumb: src, alt: trigger.getAttribute('data-alt') || '' }]; 9083 if (!window.pxGalleryInstance) { 9084 window.pxGalleryInstance = new window.PxGallery(items); 9085 } else { 9086 window.pxGalleryInstance.items = items; 9087 window.pxGalleryInstance.renderThumbnails(); 9088 } 9089 window.pxGalleryInstance.open(0); 9090 }, true); 9091 </script>
9091 9092 9093 <div class="neo_cart_pug_grid_supracontainer full neo_full relative" id="pugGridContainer441779" > 9094 9095 <div class="neo_cart_pug_grid padding-xs-bottom-20 full neo_full full" id="pugGrid441779" currentloc="website" style="display: block; margin-bottom: 15px;"> 9096 <a pugid="37790" class="flex-column neo_true_wc whitecard_nopadding neo_pug_card preserve neo_fullh padding-0 " href="/pt/promos/1750689717-last-minute-1.html" target="_blank" rel="noopener noreferrer" actionvalue="20" currency="USD" actionamounttype="percentage" actiontype="discount" concurrencies="["[USD][ARS]" startsale="0000-00-00" endsale="0000-00-00" showon="website,puglp,motor" currentLoc="website" content="index"> 9097 <div class="neo_np_previewcard_image"> 9098 <span class="neo_pug_img_trigger" data-full-src="https://images-new.pxsol.com/k-2DPacmIN7-aJEb7ZqwdLwbmLd3yngRu9ZV0U4XdRQ/rs:fill:1600:0:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2Fa318e4801a0851c11d903d338bac11d13d3bb46d.jpg@jpg" data-alt=""> 9099 <img src="https://images-new.pxsol.com/jGyxut7R8jByWC_oiEBtjbvTxqbH0DUn0hYI-2J9b5Q/rs:fill:400:200:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2Fa318e4801a0851c11d903d338bac11d13d3bb46d.jpg@jpg" alt=""> 9100 </span> 9101 </div> 9102 <div class="neo_np_previewcard_info flex-grow flex-column padding-xs-left-20 padding-xs-right-20"> 9103 <div class="padding-xs-top-20 padding-xs-bottom-15 lineh-150"> 9104 <h6 style="color: #006633" class="fontsize-20px">LAST MINUTE</h6> 9105 </div> 9106 9107 <div class="fontsize-14px lineh-150 neo_text_light_gray pug_prose padding-xs-bottom-20" style="max-height: 8.5em; overflow: auto; margin-bottom: 20px;"><p><u><strong>LAST MINUTE EXCLUSIVA RESERVANDO DESDE NUESTRA PAGINA WEB</strong></u> </p><p><br></p><p>¡RESERVANDO 3 dÃas o menos a la fecha de ingreso obtenes un 20% DE DESCUENTO EN TU ESTADÃA !</p><p><br></p><p><br><br><em>NO ACUMULABLE CON OTRAS PROMOCIONES</em></p><p><br></p><p><br></p></div> 9108 <div class="flex flex-wrap neo_pug_card_parameters padding-xs-bottom-15"> 9109 9110 </div> 9111 </div> 9112 <div class="neo_np_preview_actions flex flex-s-center flex-m-sb neo_full padding-xs-right-20 padding-xs-left-20 padding-xs-top-15 padding-xs-bottom-15 "> 9113 <div class="flex-column"> 9114 <small class="neo_smalltxt" style="margin-bottom: 3px;">Descuento</small> 9115 <div class="neo_np_preview_price fontsize-20px lineh-120"> 9116 <span> <span class="new_pug_actionvalue">20</span> % </span> 9117 </div> 9118 </div> 9119 <div class="neo_naked_action pointer fontsize-16px btn-general brand" style="color: #006633"> 9120 Ver mais <i class="mdi mdi-arrow-right"></i> 9121 </div> 9122 </div> 9123 9124 </a> 9125 <a pugid="50569" class="flex-column neo_true_wc whitecard_nopadding neo_pug_card preserve neo_fullh padding-0 " href="/pt/promos/miercoles-viernes-y-sabados-3-cuotas-sin-interes.html" target="_blank" rel="noopener noreferrer" actionvalue="0" currency="ARS" actionamounttype="percentage" actiontype="free" startsale="0000-00-00" endsale="0000-00-00" showon="website,puglp" currentLoc="website" content="index"> 9126 <div class="neo_np_previewcard_image"> 9127 <span class="neo_pug_img_trigger" data-full-src="https://images-new.pxsol.com/ZSTJ3FCWCrUntlUJ3FTajRvN3zhzFcQMlVyn9s9N428/rs:fill:1600:0:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F1958734318277901f2f917a94bc5928890775ffb853.jpg@jpg" data-alt
9127=""> 9128 <img src="https://images-new.pxsol.com/-FTv2ypcKD1wvGjNZPhl1HlV3oxKlXIDmbt7qw7F47o/rs:fill:400:200:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F1958734318277901f2f917a94bc5928890775ffb853.jpg@jpg" alt=""> 9129 </span> 9130 </div> 9131 <div class="neo_np_previewcard_info flex-grow flex-column padding-xs-left-20 padding-xs-right-20"> 9132 <div class="padding-xs-top-20 padding-xs-bottom-15 lineh-150"> 9133 <h6 style="color: #006633" class="fontsize-20px">Miércoles, Viernes y Sábados 3 cuotas sin interés</h6> 9134 </div> 9135 9136 <div class="fontsize-14px lineh-150 neo_text_light_gray pug_prose padding-xs-bottom-20" style="max-height: 8.5em; overflow: auto; margin-bottom: 20px;"><p>3 CUOTAS SIN INTERÃS HASTA EL 31/10 INCLUSIVE</p><p></p><p>ABONANDO CON TARJETAS DE CRÃDITO BANCARIAS VISA O MASTERCARD LOS MIÃRCOLES, VIERNES Y SÃBADOS.</p><p></p><p>(EXCLUSIVO DE MANERA PRESENCIAL EN EL HOTEL)</p><p></p><p></p></div> 9137 <div class="flex flex-wrap neo_pug_card_parameters padding-xs-bottom-15"> 9138 9139 </div> 9140 </div> 9141 <div class="neo_np_preview_actions flex flex-s-center flex-m-sb neo_full padding-xs-right-20 padding-xs-left-20 padding-xs-top-15 padding-xs-bottom-15 "> 9142 <div class="flex-column"> 9143 </div> 9144 <div class="neo_naked_action pointer fontsize-16px btn-general brand" style="color: #006633"> 9145 Ver mais <i class="mdi mdi-arrow-right"></i> 9146 </div> 9147 </div> 9148 9149 </a> 9150 <a pugid="27047" class="flex-column neo_true_wc whitecard_nopadding neo_pug_card preserve neo_fullh padding-0 " href="/pt/promos/1718823286-2031709137774-2031709137681-2031681152732-mejor-tarifa-garantizada.html" target="_blank" rel="noopener noreferrer" actionvalue="10" currency="ARS" actionamounttype="percentage" actiontype="discount" startsale="0000-00-00" endsale="0000-00-00" showon="puglp,motor,showcard,showcard,showcard,showcard,showcard,showcard,showcard,showcard,showcard" currentLoc="website" content="index"> 9151 <div class="neo_np_previewcard_image"> 9152 <span class="neo_pug_img_trigger" data-full-src="https://images-new.pxsol.com/wQu3p_HME44VrkV9fFNk-xcN4R9thpQ5vS_KyrUfj7I/rs:fill:1600:0:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F4948334904c02e56c5fb679cd9739324ab1b562d74.jpg@jpg" data-alt=""> 9153 <img src="https://images-new.pxsol.com/ELY146qM_swkQcaO9x4BlK8cYaYcllf4czVknqspZYk/rs:fill:400:200:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F4948334904c02e56c5fb679cd9739324ab1b562d74.jpg@jpg" alt=""> 9154 </span> 9155 </div> 9156 <div class="neo_np_previewcard_info flex-grow flex-column padding-xs-left-20 padding-xs-right-20"> 9157 <div class="padding-xs-top-20 padding-xs-bottom-15 lineh-150"> 9158 <h6 style="color: #006633" class="fontsize-20px">Mejor tarifa garantizada</h6> 9159 </div> 9160 9161 <div class="fontsize-14px lineh-150 neo_text_light_gray pug_prose padding-xs-bottom-20" style="max-height: 8.5em; overflow: auto; margin-bottom: 20px;"><p><strong>Mejor tarifa garantizada</strong></p><p><br></p><p>Reservando ahora desde nuestra página, obtendrá una tarifa totalmente preferencial.</p><p><br></p><p><br></p><p>Reservá directo y obtené hasta un 10% de descuento en tu alojamiento. </p><p><br></p><p><br></p><p>No pierdas esta oportunidad!!</p></div> 9162 <div class="flex flex-wrap neo_pug_card_parameters padding-xs-bottom-15"> 9163 9164 </div> 9165 </div> 9166 <div class="neo_np_preview_actions flex flex-s-center flex-m-sb neo_full padding-xs-right-20 padding-xs-left-20 padding-xs-top-15 padding-xs-bottom-15 "> 9167 <div class="flex-column"> 9168 <small class="neo_smalltxt" style="margin-bottom: 3px;">Descuento</small> 9169 <div class="neo_np_preview_price fontsize-20px lineh-120">
9170 <span> <span class="new_pug_actionvalue">10</span> % </span> 9171 </div> 9172 </div> 9173 <div class="neo_naked_action pointer fontsize-16px btn-general brand" style="color: #006633"> 9174 Ver mais <i class="mdi mdi-arrow-right"></i> 9175 </div> 9176 </div> 9177 9178 </a> 9179 <a pugid="50515" class="flex-column neo_true_wc whitecard_nopadding neo_pug_card preserve neo_fullh padding-0 " href="/pt/promos/promo-last-minute.html" target="_blank" rel="noopener noreferrer" actionvalue="20" currency="USD" actionamounttype="percentage" actiontype="discount" startsale="0000-00-00" endsale="0000-00-00" showon="website,puglp" currentLoc="website" content="index"> 9180 <div class="neo_np_previewcard_image"> 9181 <span class="neo_pug_img_trigger" data-full-src="https://images-new.pxsol.com/5sfBtN_OC0ITkSJDHsc8iLxpoEJgZqOwm0M5RFSNw6k/rs:fill:1600:0:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F124634827387d581b915a5d99ef0dfdef2de27db2a7.png@png" data-alt=""> 9182 <img src="https://images-new.pxsol.com/WbVAY-rrZO9G53IJPEcc_uGWMAOU-WjXUzcEqyPzEB4/rs:fill:400:200:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F124634827387d581b915a5d99ef0dfdef2de27db2a7.png@png" alt=""> 9183 </span> 9184 </div> 9185 <div class="neo_np_previewcard_info flex-grow flex-column padding-xs-left-20 padding-xs-right-20"> 9186 <div class="padding-xs-top-20 padding-xs-bottom-15 lineh-150"> 9187 <h6 style="color: #006633" class="fontsize-20px">Promo</h6> 9188 </div> 9189 9190 <div class="fontsize-14px lineh-150 neo_text_light_gray pug_prose padding-xs-bottom-20" style="max-height: 8.5em; overflow: auto; margin-bottom: 20px;"><p>Alojandote de Domingos a Miércoles obtenes un descuento del 20%</p><p><br></p><p>Te esperamos !! </p></div> 9191 <div class="flex flex-wrap neo_pug_card_parameters padding-xs-bottom-15"> 9192 9193 </div> 9194 </div> 9195 <div class="neo_np_preview_actions flex flex-s-center flex-m-sb neo_full padding-xs-right-20 padding-xs-left-20 padding-xs-top-15 padding-xs-bottom-15 "> 9196 <div class="flex-column"> 9197 <small class="neo_smalltxt" style="margin-bottom: 3px;">Descuento</small> 9198 <div class="neo_np_preview_price fontsize-20px lineh-120"> 9199 <span> <span class="new_pug_actionvalue">20</span> % </span> 9200 </div> 9201 </div> 9202 <div class="neo_naked_action pointer fontsize-16px btn-general brand" style="color: #006633"> 9203 Ver mais <i class="mdi mdi-arrow-right"></i> 9204 </div> 9205 </div> 9206 9207 </a> 9208 </div> 9209 9210 <div class="siema-prev"><i class="mdi mdi-chevron-left"></i></div> 9211 <div class="siema-next"><i class="mdi mdi-chevron-right"></i></div> 9212 </div> 9213 9214 9215 <link rel="stylesheet" href="/includes/neo_pugs/neo_pugs.css?filev=1785418385"> 9216 9217 9218
vendor: 13,111 bytes, lines 9218-9219
9218<script> 9219 !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Siema",[],t):"object"==typeof exports?exports.Siema=t():e.Siema=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(r){if(i[r])return i[r].exports;var n=i[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,r){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,i){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var i=0;i<t.length;i++){var r=t[i];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,i,r){return i&&e(t.prototype,i),r&&e(t,r),t}}(),l=function(){function e(t){var i=this;if(r(this,e),this.config=e.mergeSettings(t),this.selector="string"==typeof this.config.selector?document.querySelector(this.config.selector):this.config.selector,null===this.selector)throw new Error("Something wrong with your selector ð");this.resolveSlidesNumber(),this.selectorWidth=this.selector.offsetWidth,this.innerElements=[].slice.call(this.selector.children),this.currentSlide=this.config.loop?this.config.startIndex%this.innerElements.length:Math.max(0,Math.min(this.config.startIndex,this.innerElements.length-this.perPage)),this.transformProperty=e.webkitOrNot(),["resizeHandler","touchstartHandler","touchendHandler","touchmoveHandler","mousedownHandler","mouseupHandler","mouseleaveHandler","mousemoveHandler","clickHandler"].forEach(function(e){i[e]=i[e].bind(i)}),this.init()}return s(e,[{key:"attachEvents",value:function(){window.addEventListener("resize",this.resizeHandler),this.config.draggable&&(this.pointerDown=!1,this.drag={startX:0,endX:0,startY:0,letItGo:null,preventClick:!1},this.selector.addEventListener("touchstart",this.touchstartHandler),this.selector.addEventListener("touchend",this.touchendHandler),this.selector.addEventListener("touchmove",this.touchmoveHandler),this.selector.addEventListener("mousedown",this.mousedownHandler),this.selector.addEventListener("mouseup",this.mouseupHandler),this.selector.addEventListener("mouseleave",this.mouseleaveHandler),this.selector.addEventListener("mousemove",this.mousemoveHandler),this.selector.addEventListener("click",this.clickHandler))}},{key:"detachEvents",value:function(){window.removeEventListener("resize",this.resizeHandler),this.selector.removeEventListener("touchstart",this.touchstartHandler),this.selector.removeEventListener("touchend",this.touchendHandler),this.selector.removeEventListener("touchmove",this.touchmoveHandler),this.selector.removeEventListener("mousedown",this.mousedownHandler),this.selector.removeEventListener("mouseup",this.mouseupHandler),this.selector.removeEventListener("mouseleave",this.mouseleaveHandler),this.selector.removeEventListener("mousemove",this.mousemoveHandler),this.selector.removeEventListener("click",this.clickHandler)}},{key:"init",value:function(){this.attachEvents(),this.selector.style.overflow="hidden",this.selector.style.direction=this.config.rtl?"rtl":"ltr",this.buildSliderFrame(),this.config.onInit.call(this)}},{key:"buildSliderFrame",value:function(){var e=this.selectorWidth/this.perPage,t=this.config.loop?this.innerElements.length+2*this.perPage:this.innerElements.length;this.sliderFrame=document.createElement("div"),this.sliderFrame.style.width=e*t+"px",this.enableTransition(),this.config.draggable&&(this.selector.style.cursor="-webkit-grab");var i=document.createDocumentFragment();if(this.config.loop)for(var r=this.innerElements.length-this.perPage;r<this.innerElements.length;r++){var n=this.buildSliderFrameItem(this.innerElements[r].cloneNode(!0));i.appendChild(n)}for(var s=0;s<this.innerElements.length;s++){var l=this.buildSliderFrameItem(this.innerElements[s]);i.appendChild(l)}if(this.config.loop)for(var o=0;o<this.perPage;o++){var a=this.buildSliderFrameItem(this.innerElements[o].cloneNode(!0));i.appendChild(a)}this.sliderFrame.appendChild(i),this.selector.innerHTML="",this.selector.appendChild(this.sliderFrame),this.slideToCurrent()}},{key:"buildSliderFrameItem",value:function(e){var t=document.createElement("div");return t.style.cssFloat=this.config.rtl?"right":"left",t.style.float=this.config.rtl?"right":"left",t.style.width=(this.config.loop?100/(this.innerElements.length+2*this.perPage):100/this.innerElements.length)+"%",t.appendChild(e),t}},{key:"resolveSlidesNumber",value:function(){if("number"==typeof this.config.perPage)this.perPage=this.config.perPage;else if("object"===n(this.config.perPage)){this.perPage=1;for(var e in this.config.perPage)window.innerWidth>=e&&(this.perPage=this.config.perPage[e])}}},{key:"prev",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide-e<0){this.disableTransition();var r=this.currentSlide+this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r-e}else this.currentSlide=this.currentSlide-e}else this.currentSlide=Math.max(this.currentSlide-e,0);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"next",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide+e>this.innerElements.length-this.perPage){this.disableTransition();var r=this.currentSlide-this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r+e}else this.currentSlide=this.currentSlide+e}else this.currentSlide=Math.min(this.currentSlide+e,this.innerElements.length-this.perPage);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"disableTransition",value:function(){this.sliderFrame.style.webkitTransition="all 0ms "+this.config.easing,this.sliderFrame.style.transition="all 0ms "+this.config.easing}},{key:"enableTransition",value:function(){this.sliderFrame.style.webkitTransition="all "+this.config.duration+"ms "+this.config.easing,this.sliderFrame.style.transition="all "+this.config.duration+"ms "+this.config.easing}},{key:"goTo",value:function(e,t){if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;this.currentSlide=this.config.loop?e%this.innerElements.length:Math.min(Math.max(e,0),this.innerElements.length-this.perPage),i!==this.currentSlide&&(this.slideToCurrent(),this.config.onChange.call(this),t&&t.call(this))}}},{key:"slideToCurrent",value:function(e){var t=this,i=this.config.loop?this.currentSlide+this.perPage:this.currentSlide,r=(this.config.rtl?1:-1)*i*(this.selectorWidth/this.perPage);e?requestAnimationFrame(function(){requestAnimationFrame(function(){t.enableTransition(),t.sliderFrame.style[t.transformProperty]="translate3d("+r+"px, 0, 0)"})}):this.sliderFrame.style[this.transformProperty]="translate3d("+r+"px, 0, 0)"}},{key:"updateAfterDrag",value:function(){var e=(this.config.rtl?-1:1)*(this.drag.endX-this.drag.startX),t=Math.abs(e),i=this.config.multipleDrag?Math.ceil(t/(this.selectorWidth/this.perPage)):1,r=e>0&&this.currentSlide-i<0,n=e<0&&this.currentSlide+i>this.innerElements.length-this.perPage;e>0&&t>this.config.threshold&&this.innerElements.length>this.perPage?this.prev(i):e<0&&t>this.config.threshold&&this.innerElements.length>this.perPage&&this.next(i),this.slideToCurrent(r||n)}},{key:"resizeHandler",value:function(){this.resolveSlidesNumber(),this.currentSlide+this.perPage>this.innerElements.length&&(this.currentSlide=this.innerElements.length<=this.perPage?0:this.innerElements.length-this.perPage),this.selectorWidth=this.selector.offsetWidth,this.buildSliderFrame()}},{key:"clearDrag",value:function(){this.drag={startX:0,endX:0,startY:0,letItGo:null,preventClick:this.drag.preventClick}}},{key:"touchstartHandler",value:function(e){-1!==["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)||(e.stopPropagation(),this.pointerDown=!0,this.drag.startX=e.touches[0].pageX,this.drag.startY=e.touches[0].pageY)}},{key:"touchendHandler",value:function(e){e.stopPropagation(),this.pointerDown=!1,this.enableTransition(),this.drag.endX&&this.updateAfterDrag(),this.clearDrag()}},{key:"touchmoveHandler",value:function(e){if(e.stopPropagation(),null===this.drag.letItGo&&(this.drag.letItGo=Math.abs(this.drag.startY-e.touches[0].pageY)<Math.abs(this.drag.startX-e.touches[0].pageX)),this.pointerDown&&this.drag.letItGo){e.preventDefault(),this.drag.endX=e.touches[0].pageX,this.sliderFrame.style.webkitTransition="all 0ms "+this.config.easing,this.sliderFrame.style.transition="all 0ms "+this.config.easing;var t=this.config.loop?this.currentSlide+this.perPage:this.currentSlide,i=t*(this.selectorWidth/this.perPage),r=this.drag.endX-this.drag.startX,n=this.config.rtl?i+r:i-r;this.sliderFrame.style[this.transformProperty]="translate3d("+(this.config.rtl?1:-1)*n+"px, 0, 0)"}}},{key:"mousedownHandler",value:function(e){-1!==["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)||(e.preventDefault(),e.stopPropagation(),this.pointerDown=!0,this.drag.startX=e.pageX)}},{key:"mouseupHandler",value:function(e){e.stopPropagation(),this.pointerDown=!1,this.selector.style.cursor="-webkit-grab",this.enableTransition(),this.drag.endX&&this.updateAfterDrag(),this.clearDrag()}},{key:"mousemoveHandler",value:function(e){if(e.preventDefault(),this.pointerDown){"A"===e.target.nodeName&&(this.drag.preventClick=!0),this.drag.endX=e.pageX,this.selector.style.cursor="-webkit-grabbing",this.sliderFrame.style.webkitTransition="all 0ms "+this.config.easing,this.sliderFrame.style.transition="all 0ms "+this.config.easing;var t=this.config.loop?this.currentSlide+this.perPage:this.currentSlide,i=t*(this.selectorWidth/this.perPage),r=this.drag.endX-this.drag.startX,n=this.config.rtl?i+r:i-r;this.sliderFrame.style[this.transformProperty]="translate3d("+(this.config.rtl?1:-1)*n+"px, 0, 0)"}}},{key:"mouseleaveHandler",value:function(e){this.pointerDown&&(this.pointerDown=!1,this.selector.style.cursor="-webkit-grab",this.drag.endX=e.pageX,this.drag.preventClick=!1,this.enableTransition(),this.updateAfterDrag(),this.clearDrag())}},{key:"clickHandler",value:function(e){this.drag.preventClick&&e.preventDefault(),this.drag.preventClick=!1}},{key:"remove",value:function(e,t){if(e<0||e>=this.innerElements.length)throw new Error("Item to remove doesn't exist ð");var i=e<this.currentSlide,r=this.currentSlide+this.perPage-1===e;(i||r)&&this.currentSlide--,this.innerElements.splice(e,1),this.buildSliderFrame(),t&&t.call(this)}},{key:"insert",value:function(e,t,i){if(t<0||t>this.innerElements.length+1)throw new Error("Unable to inset it at this index ð");if(-1!==this.innerElements.indexOf(e))throw new Error("The same item in a carousel? Really? Nope ð");var r=t<=this.currentSlide>0&&this.innerElements.length;this.currentSlide=r?this.currentSlide+1:this.currentSlide,this.innerElements.splice(t,0,e),this.buildSliderFrame(),i&&i.call(this)}},{key:"prepend",value:function(e,t){this.insert(e,0),t&&t.call(this)}},{key:"append",value:function(e,t){this.insert(e,this.innerElements.length+1),t&&t.call(this)}},{key:"destroy",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments[1];if(this.detachEvents(),this.selector.style.cursor="auto",e){for(var i=document.createDocumentFragment(),r=0;r<this.innerElements.length;r++)i.appendChild(this.innerElements[r]);this.selector.innerHTML="",this.selector.appendChild(i),this.selector.removeAttribute("style")}t&&t.call(this)}}],[{key:"mergeSettings",value:function(e){var t={selector:".siema",duration:200,easing:"ease-out",perPage:1,startIndex:0,draggable:!0,multipleDrag:!0,threshold:20,loop:!1,rtl:!1,onInit:function(){},onChange:function(){}},i=e;for(var r in i)t[r]=i[r];return t}},{key:"webkitOrNot",value:function(){return"string"==typeof document.documentElement.style.transform?"transform":"WebkitTransform"}}]),e}();t.default=l,e.exports=t.default}])}); </script>
9219 9220
9220<script> 9221 try { 9222 9223 9224 let siemaPugInitAttemptsFor441779 = 0; 9225 9226 function initSiemaPug() { 9227 var pugGrid = document.querySelector('#pugGrid441779'); 9228 if (!pugGrid || pugGrid.getAttribute('data-siema-initialized') === 'true') return; 9229 9230 if ($(pugGrid).is(':visible')) { 9231 // Defensa adicional: los includes compartidos pueden emitir assets. Si vuelve a 9232 // ocurrir, se mueven fuera antes de que Siema enumere los hijos como slides. 9233 Array.prototype.slice.call(pugGrid.children).forEach(function (child) { 9234 if (!child.classList.contains('neo_pug_card')) { 9235 pugGrid.parentNode.insertBefore(child, pugGrid); 9236 } 9237 }); 9238 9239 if (pugGrid.children.length < 2) return; 9240 9241 $(pugGrid).children('.neo_pug_card').css({ 9242 margin: '10px', 9243 height: '100%' 9244 }); 9245 var siema441779 = new Siema({ 9246 perPage: { 9247 0: 1, 9248 800: 3 9249 }, 9250 selector: "#pugGrid441779", 9251 loop: false, 9252 draggable: true, 9253 multipleDrag: false 9254 }); 9255 pugGrid.setAttribute('data-siema-initialized', 'true'); 9256 pugGrid.siemaInstance = siema441779; 9257 9258 // Siema evita el click sólo cuando el target exacto es <a>. Las tarjetas tienen 9259 // imágenes y nodos internos, por lo que protegemos cualquier drag horizontal. 9260 var dragStart = null; 9261 var suppressClick = false; 9262 var resetDrag = function (x, y) { 9263 dragStart = { x: x, y: y }; 9264 suppressClick = false; 9265 pugGrid.removeAttribute('data-pug-suppress-click'); 9266 }; 9267 var trackDrag = function (x, y) { 9268 if (!dragStart) return; 9269 var deltaX = Math.abs(x - dragStart.x); 9270 var deltaY = Math.abs(y - dragStart.y); 9271 if (deltaX > 8 && deltaX > deltaY) { 9272 suppressClick = true; 9273 pugGrid.setAttribute('data-pug-suppress-click', 'true'); 9274 } 9275 }; 9276 9277 pugGrid.addEventListener('mousedown', function (e) { 9278 resetDrag(e.pageX, e.pageY); 9279 }, true); 9280 pugGrid.addEventListener('mousemove', function (e) { 9281 trackDrag(e.pageX, e.pageY); 9282 }, true); 9283 pugGrid.addEventListener('touchstart', function (e) { 9284 if (e.touches.length === 1) resetDrag(e.touches[0].pageX, e.touches[0].pageY); 9285 }, true); 9286 pugGrid.addEventListener('touchmove', function (e) { 9287 if (e.touches.length === 1) trackDrag(e.touches[0].pageX, e.touches[0].pageY); 9288 }, true); 9289 pugGrid.addEventListener('click', function (e) { 9290 if (!suppressClick) return; 9291 e.preventDefault(); 9292 e.stopPropagation(); 9293 if (typeof e.stopImmediatePropagation === 'function') e.stopImmediatePropagation(); 9294 suppressClick = false; 9295 pugGrid.removeAttribute('data-pug-suppress-click'); 9296 }, true); 9297 9298 document.querySelector('#pugGridContainer441779 .siema-prev').addEventListener('click', () => siema441779.prev()); 9299 document.querySelector('#pugGridContainer441779 .siema-next').addEventListener('click', () => siema441779.next()); 9300 } else { 9301 // attempt to initialize again in 150ms, up to 10 times 9302 if (siemaPugInitAttemptsFor441779 <= 50) { 9303 siemaPugInitAttemptsFor441779++; 9304 setTimeout(() => { 9305 initSiemaPug(); 9306 }, 150); 9307 } 9308 } 9309 } 9310 9311 if (typeof finalCallbacks === 'undefined') finalCallbacks = []; 9312 finalCallbacks.push(initSiemaPug); 9313 } catch (error) { 9314 } 9315 </script>
9315 9316 </div> 9317
9318<script> 9319 function refreshPug() { 9320 try { 9321 $('.neo_pug_card').each(function() { 9322 9323 let originalActionValue = Number($(this).attr('actionvalue')); 9324 let originalCurrency = $(this).attr('currency'); 9325 let actionAmountType = $(this).attr('actionamounttype'); 9326 let newActionValue = originalActionValue; 9327 let newCurrency = CurrencyTk; 9328 let pugActionType = $(this).attr('actiontype'); 9329 if (pugActionType == 'free_nights') return false; 9330 9331 if (actionAmountType !== 'percentage') { 9332 if (originalCurrency !== newCurrency) newActionValue = originalActionValue * Json_Pos.ExchangeList[`${originalCurrency}${CurrencyTk}`]; 9333 newActionValue = newActionValue.toFixed(2); 9334 $(this).find('.pug_actionvalue').text(newActionValue); 9335 $(this).find('.pug_currency').text(newCurrency); 9336 } 9337 }) 9338 9339 } catch (error) { 9340 console.error('Ha ocurrido un error al refrescar la información de las promociónes: ', error); 9341 } 9342 } 9343</script>
9343 9344 9345 9346 </div> 9347 9348 9349 9350 9351<div id='indexGallery' class="full flex flex-center diplo_indexgal relative" ><div class='container-neo-slider' Slide='Destacado' Width='1900' Height='600' Loop='true' Effect='Fade '> 9352 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 9353 9354 9355<!-- Module Start --> 9356 9357<div class="megacontainer-neo-swiper"> 9358 <div class="swiper-container-1090"> <!-- le asignamos el numero random al contenedor --> 9359 9360 <div class="swiper-wrapper"> 9361 <div class="swiper-slide"> 9362 <img data-src="https://images-new.pxsol.com/PpMNKBZaJ7ar-6CaaLGTsH8xqoEpwCYbfk_1_YIiYz8/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2F98872871405b92ed2342d5ff6be5c2b50b970f20.jpg@jpg" class="swiper-lazy" 9363 width="1900" 9364 height="600" 9365 style="aspect-ratio: 1900/600;" 9366 alt="Sarmiento Palace Hotel"> 9367 <div class="swiper-lazy-preloader"></div> 9368 </div> 9369 <div class="swiper-slide"> 9370 <img data-src="https://images-new.pxsol.com/8lVWJPyfX5cmE5tncIMQyHjCMnnfXdtBz7fmX8e339o/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2Fb3fbf3d669c5145b4a894c44e73687b5be357210.jpg@jpg" class="swiper-lazy" 9371 width="1900" 9372 height="600" 9373 style="aspect-ratio: 1900/600;" 9374 alt="Sarmiento Palace Hotel"> 9375 <div class="swiper-lazy-preloader"></div> 9376 </div> 9377 <div class="swiper-slide"> 9378 <img data-src="https://images-new.pxsol.com/FxjCA8vq5WBEOzPierBOoUQNXWZA4tTSdUOSx7dTkXA/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2FP203%2Fphotos%2Fc8d01bd6eba3acb1920bfca41c7295dad20d993d.jpg@jpg" class="swiper-lazy" 9379 width="1900" 9380 height="600" 9381 style="aspect-ratio: 1900/600;" 9382 alt="Sarmiento Palace Hotel"> 9383 <div class="swiper-lazy-preloader"></div> 9384 </div> 9385 <div class="swiper-slide"> 9386 <img data-src="https://images-new.pxsol.com/6UQ2Uaej8IUTFaeTj7UUtpaxK8JiPpBHMLQQOQMWXkE/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F2332892238675db2aeb9ebe7d1b849e6cbb9fd6913d.jpg@jpg" class="swiper-lazy" 9387 width="1900" 9388 height="600" 9389 style="aspect-ratio: 1900/600;" 9390 alt="Sarmiento Palace Hotel"> 9391 <div class="swiper-lazy-preloader"></div> 9392 </div> 9393 <div class="swiper-slide"> 9394 <img data-src="https://images-new.pxsol.com/nMnB2YgIOlD8ZnzihdZZgcVGDMcISEP-e0zdeKwy3kE/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F233289247809b64d75d552e55cb6fc73851dcf175a2.jpg@jpg" class="swiper-lazy" 9395 width="1900" 9396 height="600" 9397 style="aspect-ratio: 1900/600;" 9398 alt="Sarmiento Palace Hotel"> 9399 <div class="swiper-lazy-preloader"></div> 9400 </div> 9401 <div class="swiper-slide"> 9402 <img data-src="https://images-new.pxsol.com/56itZlen0SzT1XLm-7mHU8j6baXPbVeO6hyyi-53FKk/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F26661643520f3221b03ce0902d17067f72b95c0fbd4.jpg@jpg" class="swiper-lazy" 9403 width="1900" 9404 height="600" 9405 style="aspect-ratio: 1900/600;" 9406 alt="Sarmiento Palace Hotel"> 9407 <div class="swiper-lazy-preloader"></div> 9408 </div> 9409 <div class="swiper-slide"> 9410 <img data-src="https://images-new.pxsol.com/oasimm5IByiE8twwBAPJXK_CvFj8-2Imd3AnympFbTI/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F16663538470d4c406ee5e6d1289f6f715191b439638.jpg@jpg" class="swiper-lazy" 9411 width="1900" 9412 height="600" 9413 style="aspect-ratio: 1900/600;" 9414 alt="Sarmiento Palace Hotel"> 9415 <div class="swiper-lazy-preloader"></div> 9416 </div> 9417 <div class="swiper-slide"> 9418 <img data-src="https://images-new.pxsol.com/6RQ4VNjgrpmO0rdsNYsr8Y92t7LgNoVVpcr6LdxaNKc/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F151435785245702edfb37339afc9cdc9e7fea8900d5.jpg@jpg" class="swiper-lazy" 9419 width="1900" 9420 height="600" 9421 style="aspect-ratio: 1900/600;" 9422 alt="Sarmiento Palace Hotel"> 9423 <div class="swiper-lazy-preloader"></div> 9424 </div> 9425 </div> 9426 <!-- Add Arrows --> 9427 <div class="swiper-button-next swiper-button-next-1090"></div> <!-- igualmente el numero random va para las flechas de cambio de imágenes
9427--> 9428 <div class="swiper-button-prev swiper-button-prev-1090"></div> 9429 9430 </div> 9431 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 9432 <div class="dataconfig-swiper" data-id="1090" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 9433</div> 9434 9435 9436 </div> 9437 </div><div class="diplo_indexgal_overlay flex flex-center" ><div class="diplo_contentblock flex-column flex-m-center flex-s-start" ><div class="diplo_heading_lower fontsize-35px fontsize-lg-60px diplo_white padding-bottom-20 lineh-120" style='max-width: 12em;'>Descubre nuestro hotel</div><div class="diplo_white diplo_paragraphs margin-bottom-20" ><p class='textleft diplo_white ' >Te invitamos a disfrutar todo el confort en el corazón de Buenos Aires</p></div><a class="diplo_cta cta_white_outline cta_autoh padding-20 pointerInitial" href="/pt/galeria.html" target=""><div class="mdi mdi-image-multiple margin-right-10 fontsize-18px" ></div><div class="" >Ver Fotos</div></a></div></div></div> 9438 9439 9440<div id='heroDiploTwo' class="full" ><div class="diplo_hero_half autoheight full flex flex-center padding-top-20 padding-bottom-70" ><div class="diplo_main_herotxt full flex flex-center" ><div class="diplo_contentblock padding-top-25 padding-bottom-25 padding-lg-top-50 padding-lg-bottom-50" ><div class='full' Slides='3'> 9441 <div class="neo_template_block neo_neo_social_proof pxModule_include ModuloWrap_neo_social_proof" id="neo_social_proof" > 9442 9443 9444 9445<div class="swiper-socialproof-initializer" slides="3" swiperid="neosocialproof_1116405228"></div> 9446 9447<div class="neo_socialproof_slider_titulo">Nuestros huéspedes opinan</div> 9448 9449<div class="neo_promoswiper_container swiper-container" id="neosocialproof_1116405228"> 9450 9451<div class="neo_socialproof_slider_container swiper-wrapper"> 9452 9453 9454 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_548043"> 9455 9456 <div class="neo_socialproof_score"> 9457 8.3 </div> 9458 9459 <div class="neo_socialproof_subtitle"> 9460 Lo mejor del hotel: 9461 </div> 9462 <div class="neo_socialproof_slide_besttxt"> 9463 Ubicación </div> 9464 <div class="neo_socialproof_slide_name"> 9465 Guillermo, Argentina </div> 9466 </a> 9467 9468 </div> 9469 9470 9471 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_547398"> 9472 9473 <div class="neo_socialproof_score"> 9474 9 </div> 9475 9476 <div class="neo_socialproof_subtitle"> 9477 Lo mejor del hotel: 9478 </div> 9479 <div class="neo_socialproof_slide_besttxt"> 9480 Habitacion silenciosa y confortable. </div> 9481 <div class="neo_socialproof_slide_name"> 9482 Lilian, Argentina </div> 9483 </a> 9484 9485 </div> 9486 9487 9488 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_547205"> 9489 9490 <div class="neo_socialproof_score"> 9491 9.8 </div> 9492 9493 <div class="neo_socialproof_subtitle"> 9494 Lo mejor del hotel: 9495 </div> 9496 <div class="neo_socialproof_slide_besttxt"> 9497 Todo muy lindo, la atención excelente, realmente la pasé más que bien. Gracias. </div> 9498 <div class="neo_socialproof_slide_name"> 9499 Ruben, Ar </div> 9500 </a> 9501 9502 </div> 9503 9504 9505 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_546221"> 9506 9507 <div class="neo_socialproof_score"> 9508 8.8 </div> 9509 9510 <div class="neo_socialproof_subtitle"> 9511 Lo mejor del hotel: 9512 </div> 9513 <div class="neo_socialproof_slide_besttxt"> 9514 la verdad que el desayuno y la atencion del personal, como asà las instalaciones, son excelentes, sin duda q volveré </div> 9515 <div class="neo_socialproof_slide_name"> 9516 Dario, Argentina </div> 9517 </a> 9518 9519 </div> 9520 9521 9522 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_545417"> 9523 9524 <div class="neo_socialproof_score"> 9525 10 </div> 9526 9527 <div class="neo_socialproof_subtitle"> 9528 Lo mejor del hotel: 9529 </div> 9530 <div class="neo_socialproof_slide_besttxt"> 9531 Destaco la calidez de la atención del personal </div> 9532 <div class="neo_socialproof_slide_name"> 9533 Quinodoz, Ar </div> 9534 </a> 9535 9536 </div> 9537 9538 9539 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_543736"> 9540 9541 <div class="neo_socialproof_score"> 9542 8 </div> 9543 9544 <div class="neo_socialproof_subtitle"> 9545 Lo mejor del hotel: 9546 </div> 9547 <div class="neo_socialproof_slide_besttxt"> 9548 location and personal are very good </div> 9549 <div class="neo_socialproof_slide_name"> 9550 Barrionuevo, United States </div> 9551 </a> 9552 9553 </div> 9554 9555 9556 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_542087"> 9557 9558 <div class="neo_socialproof_score"> 9559 10 </div> 9560 9561 <div class="neo_socialproof_subtitle"> 9562 Lo mejor del hotel: 9563 </div> 9564 <div class="neo_socialproof_slide_besttxt"> 9565 siempre nos atienden diez puntos!! </div> 9566 <div class="neo_socialproof_slide_name"> 9567 Facundo, Ar </div> 9568 </a> 9569 9570 </div> 9571 9572 9573 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_541860"> 9574 9575 <div class="neo_socialproof_score"> 9576 9.8 </div> 9577 9578 <div class="neo_socialproof_subtitle"> 9579 Lo mejor del hotel: 9580 </div> 9581 <div class="neo_socialproof_slide_besttxt"> 9582 Cumprimentos pela amabilidade 9583Pela higiene, pelas instalacoes. Recomendarei sempre seu hotel aos amigos. </div> 9584 <div class="neo_socialproof_slide_name"> 9585 Neusa, Br </div> 9586 </a> 9587 9588 </div> 9589 9590 9591 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_541713"> 9592 9593 <div class="neo_socialproof_score"> 9594 8.7 </div> 9595 9596 <div class="neo_socialproof_subtitle"> 9597 Lo mejor del hotel: 9598 </div> 9599 <div class="neo_socialproof_slide_besttxt"> 9600 Lo más positivo del hotel y que hace a una estadÃa agradable, es el personal. Excelente la atención de todos, en cualquier horario. Realmente el trabajonque hacen suma muchoma dejar de lado algunas cuestiones del hotel. </div> 9601 <div class="neo_socialproof_slide_name"> 9602 Sandra, Uy </div> 9603 </a> 9604 9605 </div> 9606 9607 9608 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_540162"> 9609 9610 <div class="neo_socialproof_score">
9611 9.3 </div> 9612 9613 <div class="neo_socialproof_subtitle"> 9614 Lo mejor del hotel: 9615 </div> 9616 <div class="neo_socialproof_slide_besttxt"> 9617 Todo muy bueno. </div> 9618 <div class="neo_socialproof_slide_name"> 9619 Godoy, Ar </div> 9620 </a> 9621 9622 </div> 9623 9624 9625 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_539977"> 9626 9627 <div class="neo_socialproof_score"> 9628 9.2 </div> 9629 9630 <div class="neo_socialproof_subtitle"> 9631 Lo mejor del hotel: 9632 </div> 9633 <div class="neo_socialproof_slide_besttxt"> 9634 Excelente atención del personal Muy completo el desayuno.Gracias por hacer tan placentera nuestra estadÃa!!! </div> 9635 <div class="neo_socialproof_slide_name"> 9636 Gonzalez, Ar </div> 9637 </a> 9638 9639 </div> 9640 9641 9642 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_539615"> 9643 9644 <div class="neo_socialproof_score"> 9645 8.5 </div> 9646 9647 <div class="neo_socialproof_subtitle"> 9648 Lo mejor del hotel: 9649 </div> 9650 <div class="neo_socialproof_slide_besttxt"> 9651 La ubicacion. El resto mucho no puedo opinar porque fueron pocos dias de estadia. </div> 9652 <div class="neo_socialproof_slide_name"> 9653 Melisa, Argentina </div> 9654 </a> 9655 9656 </div> 9657 9658 9659 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_538930"> 9660 9661 <div class="neo_socialproof_score"> 9662 9.7 </div> 9663 9664 <div class="neo_socialproof_subtitle"> 9665 Lo mejor del hotel: 9666 </div> 9667 <div class="neo_socialproof_slide_besttxt"> 9668 Muy buena la atencion en general, buen desayuno, buena limpieza. Recomiendo, sin dudas volveria en alguna ocasion. </div> 9669 <div class="neo_socialproof_slide_name"> 9670 Federico, Argentina </div> 9671 </a> 9672 9673 </div> 9674 9675 9676 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_538357"> 9677 9678 <div class="neo_socialproof_score"> 9679 9.2 </div> 9680 9681 <div class="neo_socialproof_subtitle"> 9682 Lo mejor del hotel: 9683 </div> 9684 <div class="neo_socialproof_slide_besttxt"> 9685 Personal amable. Desayuno rico. </div> 9686 <div class="neo_socialproof_slide_name"> 9687 Sergio, Argentina </div> 9688 </a> 9689 9690 </div> 9691 9692 9693 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_536488"> 9694 9695 <div class="neo_socialproof_score"> 9696 8.8 </div> 9697 9698 <div class="neo_socialproof_subtitle"> 9699 Lo mejor del hotel: 9700 </div> 9701 <div class="neo_socialproof_slide_besttxt"> 9702 Todo muy limpio, el desayuno abundante y variado </div> 9703 <div class="neo_socialproof_slide_name"> 9704 Gabriel, Argentina </div> 9705 </a> 9706 9707 </div> 9708 9709 9710 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_534363"> 9711 9712 <div class="neo_socialproof_score"> 9713 9.5 </div> 9714 9715 <div class="neo_socialproof_subtitle"> 9716 Lo mejor del hotel: 9717 </div> 9718 <div class="neo_socialproof_slide_besttxt"> 9719 La atención de recepción buena, no tenÃa agua caliente y resolvieron en 5 minutos. </div> 9720 <div class="neo_socialproof_slide_name"> 9721 Nelson, Uruguay </div> 9722 </a> 9723 9724 </div> 9725 9726 9727 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_533823"> 9728 9729 <div class="neo_socialproof_score"> 9730 9.8 </div> 9731 9732 <div class="neo_socialproof_subtitle"> 9733 Lo mejor del hotel: 9734 </div> 9735 <div class="neo_socialproof_slide_besttxt"> 9736 Excelente atención de los empleados, cordiales, atentos. </div> 9737 <div class="neo_socialproof_slide_name"> 9738 Marcelo Hugo, Argentina </div> 9739 </a> 9740 9741 </div> 9742 9743 9744 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_532650"> 9745 9746 <div class="neo_socialproof_score"> 9747 8.3 </div> 9748 9749 <div class="neo_socialproof_subtitle"> 9750 Lo mejor del hotel: 9751 </div> 9752 <div class="neo_socialproof_slide_besttxt"> 9753 Soy celiaca y me resolvieron bien el tema del desayuno. Gracias </div> 9754 <div class="neo_socialproof_slide_name"> 9755 Fabian, Argentina </div> 9756 </a> 9757 9758 </div> 9759 9760 9761 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_531454"> 9762 9763 <div class="neo_socialproof_score"> 9764 8 </div> 9765 9766 <div class="neo_socialproof_subtitle"> 9767 Lo mejor del hotel: 9768 </div> 9769 <div class="neo_socialproof_slide_besttxt"> 9770 El personal muy atentos y amables. </div> 9771 <div class="neo_socialproof_slide_name"> 9772 Moreira, Ar </div> 9773 </a> 9774 9775 </div> 9776 9777 9778 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_527936"> 9779 9780 <div class="neo_socialproof_score"> 9781 9.2 </div> 9782 9783 <div class="neo_socialproof_subtitle"> 9784 Lo mejor del hotel: 9785 </div> 9786 <div class="neo_socialproof_slide_besttxt"> 9787 todo excelente </div> 9788 <div class="neo_socialproof_slide_name"> 9789 Sergio, Argentina </div> 9790 </a> 9791 9792 </div> 9793 9794 9795 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_527488"> 9796 9797 <div class="neo_socialproof_score"> 9798 9.7 </div> 9799 9800 <div class="neo_socialproof_subtitle"> 9801 Lo mejor del hotel: 9802 </div> 9803 <div class="neo_socialproof_slide_besttxt"> 9804 Me gustó mucho el hotel y la habitación, muy cómoda y el trato muy cordial. VolverÃa sin dudar. </div> 9805 <div class="neo_socialproof_slide_name"> 9806 PenÌa, Ar </div> 9807 </a> 9808 9809 </div> 9810 9811 9812 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_527415"> 9813 9814 <div class="neo_socialproof_score"> 9815 9 </div> 9816 9817 <div class="neo_socialproof_subtitle"> 9818 Lo mejor del hotel: 9819 </div> 9820 <div class="neo_socialproof_slide_besttxt"> 9821 El Personal súper atento </div> 9822 <div class="neo_socialproof_slide_name"> 9823 Juan, Ar </div> 9824 </a> 9825 9826 </div> 9827 9828 9829 <div class="neo_socialproof_slide_item swiper-slide" id="neosocial_item_526666"> 9830 9831 <div class="neo_socialproof_score"> 9832 10 </div> 9833 9834 <div class="neo_socialproof_subtitle"> 9835 Lo mejor del hotel: 9836 </div> 9837 <div class="neo_socialproof_slide_besttxt"> 9838 Me hospedé allà por la cercanÃa a los lugares donde debÃa ir a terminar de cursar una especialización. Excelente ubicación, servicio y atención del personal del hotel. VolverÃa y lo recomendarÃa siempre. Muchas gracias, me sentà muy cómoda </div> 9839 <div class="neo_socialproof_slide_name"> 9840 Lorena Melisa, Argentina </div> 9841 </a> 9842 9843 </div> 9844 9845 9846</div> 9847 9848 9849<button type="button" class="swiper-socialproof-nav swiper-prev"><i class="mdi mdi-chevron-left"></i></button> 9850<button type="button" class="swiper-socialproof-nav swiper-next"><i class="mdi mdi-chevron-right"></i></button> 9851 9852 9853</div> 9854 9855 </div> 9856 </div></div></div><div class='container-neo-slider' Slide='FondoComentarios' Width='1900' Height='600' Loop='true' Effect='Fade'> 9857 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 9858 9859 9860<!-- Module Start --> 9861 9862<div class="megacontainer-neo-swiper"> 9863 <div class="swiper-container-1021"> <!-- le asignamos el numero random al contenedor --> 9864 9865 <div class="swiper-wrapper"> 9866 <div class="swiper-slide slide-one-pic"> 9867 <img src="https://images-new.pxsol.com/ARPNxO9Y_UsCNGW0BfsROQ9yae7l0LLosVGzSlEyOAw/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F68%2Fcompany%2Flibrary%2Fuser%2F4948334904c02e56c5fb679cd9739324ab1b562d74.jpg@jpg" 9868 width="1900" 9869 height="600" 9870 style="aspect-ratio: 1900/600;" 9871 alt="Sarmiento Palace Hotel"> 9872 </div> 9873 </div> 9874 <!-- Add Arrows --> 9875 9876 </div> 9877 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para
9877identificarlo de otros --> 9878 <div class="dataconfig-swiper" data-id="1021" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 9879</div> 9880 9881 9882 </div> 9883 </div></div></div> 9884 9885</div> 9886 9887 </div> 9888 9889 9890 9891 <div class="main_wraper_footer" id="main_wraper_footer"> 9892 9893 9894<div class="neo_template_container neo_template_ computer"> 9895 9896 9897<div class="megacontainer-footer" ><div class="container-info-footer" ><div class="contact" ><div id='neo_contact_info' class="neo_template_block neo_neo_contact_info pxModule_include ModuloWrap_neo_contact_info" ><div class="neo-contact-container" ><h4 class='neo-contact-title' >Sarmiento Palace Hotel</h4><ul class='' ><li class='' ><div class="" ><i class="fas fa-phone-volume"></i> +54 11 3530 0451</div></li><li class='' ><div class="" ><i class="fas fa-phone-volume"></i> +54 11 4953 0753</div></li><li class='' ><a class="" target='_blank' href="https://api.whatsapp.com/send?phone=5491173613250" target=""><i class="fab fa-whatsapp"></i> +54 9 11 7361 3250 (Reservas)</a></li><li class='' ><a class="" target='_blank' href="https://api.whatsapp.com/send?phone=5491124050898" target=""><i class="fab fa-whatsapp"></i> +54 9 11 24050898 (Recepción)</a></li><li class='' ><a class="" target='_blank' href="https://www.google.com/maps/search/Sarmiento%20Palace%20Hotel,%20Sarmiento%201953,%20C1044AAC%20CABA,%20Argentina%20Buenos%20Aires%20-%20Argentina" target=""><i class="fas fa-map-marker-alt"></i> Sarmiento 1953, C1044AAC CABA, Argentina</a></li><li class='' ><a class="" target='_blank' href="/cdn-cgi/l/email-protection#264f484049664e4952434a5547544b4f434852490845494b084754" target=""><i class="far fa-envelope"></i> <span class="__cf_email__" data-cfemail="3b52555d547b53544f5e57485a4956525e554f5415585456155a49">[email protected]</span></a></li></ul></div></div></div><div class="logo" > <img loading="lazy" class="" lazy-src="https://files-p.pxsol.com/68/company/library/user/148449938943582335ea1aa44003cb5736119b4c552.png" alt="SarmientoPalace" > </image></div><div class="logo" style='margin:0px 40px;'>
vendor: 108 bytes, line 9897
9897<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
9897<script class='' async='' src='https://badge.hotelstatic.com/embed.js' data-url='https://www.booking.com/hotel/ar/sarmiento-palace.html' data-size='120' data-position='inline' data-clickable='true'></script>
9897</div><div class="logo" ><a class="boton-quejas" href="/pt/librodequejas.html" target="">LIBRO DE QUEJAS ONLINE</a></div><div class="social" ><div class="" ><div class='' > 9898 <div class="neo_template_block neo_neo_social_links pxModule_include ModuloWrap_neo_social_links" id="neo_social_links" > 9899 9900 9901<div class="neo_social_links_container social_block"> 9902 <ul class="neo_links_list"> 9903 <li class="facebook_page"> 9904 <a href="https://www.facebook.com/sarmiento.palace" target="_blank"> 9905 <i class="mdi mdi-facebook"></i> 9906 </a> 9907 </li> 9908 <li class="instagram_page"> 9909 <a href="https://www.instagram.com/hotelsarmientopalace/?hl=es" target="_blank"> 9910 <i class="mdi mdi-instagram"></i> 9911 </a> 9912 </li> 9913 </ul> 9914</div> 9915 <div class="wsp_floating"> 9916 <a href="https://api.whatsapp.com/send?phone=5491173613250" target="_blank"> 9917 <i class="mdi mdi-whatsapp"></i> 9918 </a> 9919 </div> 9920 </div> 9921 </div></div><div class="" ><div class='' ><div class='pxModule_include ModuloWrap_newsletter '><div id="content_news"> 9922 <div class="left full titlenewsletter">SUBSCREVA A NOSSA NEWSLETTER</div> 9923 <form id="form_suscribe" name="form_suscribe" method="post" action="/contact/newsletter"> 9924 <div class="wrap_imputs"> 9925 <div class="wrap_emails"> 9926 <input name="email" type="text" id="email" class="input_newsletter" value="" placeholder="Digite seu email" /> 9927 </div> 9928 <div class="SuscribeTitle"> 9929 <div id="newsletter-recaptcha" data-sitekey="6LfWJEIUAAAAANStHukodcdKv4tnwSFLknAMB_FM"></div> 9930 <button type="submit" onClick="ga('send','event','click','boton_suscribirse','form_suscribirse');" class="boton_newsletter" id="Import">Subscrever</button> 9931 <input name="company_id" type="hidden" id="company_id" value="68" /> 9932 </div> 9933 </div> 9934 </form> 9935</div> 9936</div></div></div></div></div></div> 9937 9938</div> 9939 9940 <div id="footer_px" class="noprint footer_px_fix" style="max-width: 100vw; box-sizing: border-box; overflow-x: hidden;"> 9941 <div class="wraper_footerpx flex-column flex-center"> 9942 9943 9944 <div class="texto_footerpx"> 9945 Ao usar este site, você concorda com o uso de cookies. <a target="_blank" rel="nofollow" href="/cookiespolicies.php?pos=SarmientoPalace" class="footer_link">PolÃtica de cookies</a> | <a target="_blank" rel="nofollow" href="/terms.php?pos=SarmientoPalace" class="footer_link">Termos e Condições</a> | <a target="_blank" rel="nofollow" href="/policies.php?pos=SarmientoPalace" class="footer_link">PolÃtica de privacidade</a> | <span>Cache: 9946 2026-09-26 13:24:46 | </span><a href="" rel="nofollow" target="_blank">Textos</a> | <span class="framework_f">Framework: 3 | <span class="framework_f">Tag: <span class="tag_cookie">..</span> </span> </span> 9947 </div> 9948 9949 <div class="pxsol_link_f"> 9950 <a style="text-decoration: underline !important;" target="_blank" href="https://www.pxsol.com/pos_source=SarmientoPalace" class="footer_link">Sistema Hotelero</a> 9951 por <a href="/" target="_blank" class="footer_link footer_logo_svg" title="Sistema Hotelero"> 9952 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 9953<svg 9954 xmlns:dc="http://purl.org/dc/elements/1.1/" 9955 xmlns:cc="http://creativecommons.org/ns#" 9956 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 9957 xmlns:svg="http://www.w3.org/2000/svg" 9958 xmlns="http://www.w3.org/2000/svg" 9959 viewBox="0 0 752.42535 358.37866" 9960 height="50px" 9961 width="23px" 9962 xml:space="preserve" 9963 id="svg2" 9964 version="1.1"><metadata 9965 id="metadata8"><rdf:RDF><cc:Work 9966 rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type 9967 rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs 9968 id="defs6"><clipPath 9969 id="clipPath18" 9970 clipPathUnits="userSpaceOnUse"><path 9971 id="path16" 9972 d="M 0,268.784 H 564.319 V 0 H 0 Z" /></clipPath></defs><g 9973 transform="matrix(1.3333333,0,0,-1.3333333,0,358.37867)" 9974 id="g10"><g 9975 id="g12"><g 9976 clip-path="url(#clipPath18)" 9977 id="g14"><g 9978 transform="translate(23.3438,154.8828)" 9979 id="g20"><path 9980 id="path22" 9981 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 9982 d="m 0,0 h 12.405 c 11.978,0 20.768,1.891 26.369,5.674 5.601,3.781 8.4,9.691 8.4,17.728 0,7.447 -2.507,13.002 -7.521,16.666 -5.013,3.664 -12.828,5.496 -23.44,5.496 H 0 Z m 71.202,24.112 c 0,-13.534 -4.884,-23.905 -14.65,-31.115 -9.768,-7.21 -23.67,-10.814 -41.707,-10.814 H 0 V -66.309 H -23.344 V 63.294 h 41.118 c 17.841,0 31.207,-3.311 40.097,-9.929 8.886,-6.619 13.331,-16.37 13.331,-29.253" /></g><g 9983 transform="translate(325.4336,123.7686)" 9984 id="g24"><path 9985 id="path26" 9986 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
9987 d="m 0,0 c 0,-11.524 -4.59,-20.565 -13.773,-27.126 -9.179,-6.561 -21.846,-9.84 -37.994,-9.84 -16.149,0 -29.367,2.274 -39.653,6.824 v 20.036 c 6.509,-2.78 13.43,-4.964 20.754,-6.56 7.327,-1.596 14.147,-2.392 20.462,-2.392 9.246,0 16.068,1.594 20.462,4.785 4.396,3.191 6.595,7.475 6.595,12.853 0,4.847 -2.02,8.956 -6.057,12.323 -4.039,3.369 -12.372,7.358 -25.005,11.968 -13.023,4.787 -22.204,10.252 -27.542,16.4 -5.341,6.145 -8.01,13.532 -8.01,22.161 0,10.815 4.233,19.324 12.698,25.53 8.463,6.205 19.827,9.308 34.087,9.308 13.675,0 27.284,-2.719 40.829,-8.156 L -9.572,70.829 c -12.697,4.844 -24.028,7.269 -33.99,7.269 -7.555,0 -13.285,-1.494 -17.19,-4.477 -3.906,-2.985 -5.86,-6.93 -5.86,-11.834 0,-3.369 0.781,-6.25 2.344,-8.644 1.563,-2.393 4.134,-4.653 7.716,-6.782 3.58,-2.127 10.026,-4.935 19.339,-8.421 10.484,-3.959 18.166,-7.654 23.05,-11.08 4.884,-3.429 8.464,-7.3 10.745,-11.613 C -1.14,10.933 0,5.85 0,0" /></g><g 9988 transform="translate(355.8486,153.5532)" 9989 id="g28"><path 9990 id="path30" 9991 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 9992 d="m 0,0 c 0,-15.956 3.547,-28.057 10.646,-36.299 7.097,-8.245 17.614,-12.369 31.548,-12.369 13.87,0 24.335,4.08 31.401,12.235 7.064,8.155 10.598,20.3 10.598,36.433 0,15.897 -3.501,27.953 -10.5,36.168 C 66.693,44.382 56.26,48.49 42.39,48.49 28.391,48.49 17.826,44.382 10.694,36.168 3.564,27.953 0,15.897 0,0 m 109.001,0 c 0,-21.097 -5.811,-37.498 -17.434,-49.198 C 79.946,-60.901 63.486,-66.75 42.194,-66.75 c -21.553,0 -38.108,5.806 -49.667,17.418 -11.558,11.613 -17.334,28.116 -17.334,49.509 0,21.394 5.81,37.823 17.433,49.288 11.622,11.464 28.21,17.198 49.764,17.198 21.227,0 37.635,-5.822 49.227,-17.464 C 103.205,37.556 109.001,21.156 109.001,0" /></g><g 9993 transform="translate(480.5166,88.5742)" 9994 id="g32"><path 9995 id="path34" 9996 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 9997 d="M 0,0 V 129.603 H 23.342 V 18.175 H 83.803 V 0 Z" /></g><g 9998 transform="translate(95.5459,218.4404)" 9999 id="g36"><path 10000 id="path38" 10001 style="fill:#ee2735;fill-opacity:1;fill-rule:nonzero;stroke:none" 10002 d="m 0,0 42.967,-58.803 -68.085,-93.3 30.263,-9.074 56.235,77.141 87.961,-120.538 46.28,-13.866 L 79.583,-59.091 159.441,50.344 112.198,36.084 60.982,-33.892 29.65,9.046 Z" /></g></g></g></g></svg> </a> 10003 </div> 10004 10005 </div> 10006</div> 10007 10008
10009<script> 10010 function loadPxChatWidget() { 10011 const posToGetApiKey = 'SarmientoPalace'; 10012 const timestamp = '1790446792'; 10013 const urlToGetApiKey = `https://px-chat-widget-prod.pxsol.com/company-widget/apiKey/${posToGetApiKey}?v=${timestamp}`; 10014 10015 fetch(urlToGetApiKey, { 10016 method: 'GET', 10017 headers: { 10018 'Content-Type': 'application/json', 10019 } 10020 }) 10021 .then(response => { 10022 if (!response.ok) { 10023 throw new Error(`HTTP error! status: ${response.status}`); 10024 } 10025 return response.json(); 10026 }) 10027 .then(data => { 10028 const internalKey = data?.data?.api_key; 10029 if (!internalKey) { 10030 throw new Error('API key not found in response'); 10031 } 10032 10033 const script = document.createElement('script'); 10034 script.src = `https://cdn.pxsol.com/dist/chat-widget.min.js?k=${internalKey}&v=${timestamp}`; 10035 script.async = true; 10036 script.onload = () => { 10037 console.log('PxChat widget loaded successfully'); 10038 }; 10039 script.onerror = (error) => { 10040 console.error('Failed to load PxChat widget:', error); 10041 }; 10042 document.body.appendChild(script); 10043 }) 10044 .catch(error => { 10045 console.error('PxChat widget initialization failed:', error.message); 10046 }); 10047 } 10048 document.addEventListener("DOMContentLoaded", loadPxChatWidget); 10049 </script>
10049 10050 10051<style> 10052 /* El botón flotante de WhatsApp (.wsp_floating) y el launcher del widget de chat (pxChat) 10053 se ubican ambos en la esquina inferior derecha y chocan entre sÃ. Cuando el chat está 10054 activo/montado, ocultamos el botón de WhatsApp para evitar la superposición. */ 10055 body.px-chat-widget-active .wsp_floating { display: none !important; } 10056</style>
10057<script> 10058 (function () { 10059 // El widget pxChat monta su launcher/panel bajo #px-widget-root (clase .widget-launcher-button). 10060 function chatWidgetPresent() { 10061 return !!( 10062 document.getElementById('px-widget-root') || 10063 document.querySelector('.widget-launcher-button, [class*="widget-launcher"]') 10064 ); 10065 } 10066 var applied = false; 10067 var observer = null; 10068 var fallbackTimer = null; 10069 function apply() { 10070 if (applied || !document.body || !chatWidgetPresent()) return; 10071 document.body.classList.add('px-chat-widget-active'); 10072 applied = true; 10073 if (observer) observer.disconnect(); 10074 if (fallbackTimer) clearTimeout(fallbackTimer); 10075 } 10076 function start() { 10077 apply(); 10078 if (applied || !('MutationObserver' in window) || !document.body) return; 10079 // El widget carga async (fetch de apiKey + inyección del
10079<script>), asà que observamos 10080 // el DOM hasta que aparezca. Si a los 20s no montó, dejamos de observar. 10081 observer = new MutationObserver(apply); 10082 observer.observe(document.body, { childList: true, subtree: true }); 10083 fallbackTimer = setTimeout(function () { 10084 if (observer) observer.disconnect(); 10085 }, 20000); 10086 } 10087 if (document.readyState === 'loading') { 10088 document.addEventListener('DOMContentLoaded', start); 10089 } else { 10090 start(); 10091 } 10092 })(); 10093</script>
10093 10094
10095<script src="https://cdn.pxsol.com/js/domready.js"></script>
vendor: 1 bytes, line 10095
10095
10096<script> 10097 var head = document.getElementsByTagName('head')[0]; 10098 10099 function initializeFontAwesome() { 10100 var link = document.createElement('link'); 10101 link.id = "fawesome"; 10102 link.rel = 'stylesheet'; 10103 link.type = 'text/css'; 10104 link.href = 'https://use.fontawesome.com/releases/v5.7.1/css/all.css'; 10105 head.appendChild(link); 10106 } 10107 10108 function initializeMDI() { 10109 var link = document.createElement('link'); 10110 link.id = "fawesome"; 10111 link.rel = 'stylesheet'; 10112 link.type = 'text/css'; 10113 link.href = '/css/materialdesignicons.min.css'; 10114 head.appendChild(link); 10115 } 10116 10117 function initializeToast() { 10118 // check if jquery is loaded 10119 if (typeof jQuery == 'function') { 10120 let link = document.createElement('link'); 10121 link.id = "jqToastCss"; 10122 link.rel = 'stylesheet'; 10123 link.type = 'text/css'; 10124 link.href = '/includes/toast/jquery.toast.min.css'; 10125 head.appendChild(link); 10126 let script = document.createElement('script'); 10127 script.id = "jqToastJs"; 10128 script.type = 'text/javascript'; 10129 script.defer = true; 10130 script.async = true; 10131 script.src = '/includes/toast/jquery.toast.min.js'; 10132 head.appendChild(script); 10133 } else { 10134 console.log('jQuery is not loaded. Toast could not be initialized.'); 10135 } 10136 } 10137 10138 DomReady.ready(function() { 10139 var link = document.createElement('link'); 10140 link.id = "siteCss"; 10141 link.rel = 'stylesheet'; 10142 link.type = 'text/css'; 10143 10144 link.href = 10145 '/css_3.css?pos=SarmientoPalace&device=computer&posv=1790446792_2025-10-27T15:48:02.000Z&filev=1782498034'; 10146 head.appendChild(link); 10147 10148 if (typeof deferFontAwesome !== "undefined") { 10149 if (!deferFontAwesome) { 10150 initializeFontAwesome(); 10151 } 10152 } else { 10153 initializeFontAwesome(); 10154 } 10155 10156 if (typeof deferMDI !== "undefined") { 10157 if (!deferMDI) { 10158 initializeMDI(); 10159 } 10160 } else { 10161 initializeMDI(); 10162 } 10163 10164 if (typeof deferToast !== "undefined") { 10165 if (!deferToast) { 10166 initializeToast(); 10167 } 10168 } else { 10169 initializeToast(); 10170 } 10171 10172 }); 10173</script>
vendor: 1 bytes, line 10173
10173
10174<script> 10175 (function(){ 10176 console.log('%c[pxChat] ð Chat tracking script loaded (Chromium optimized)', 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 10177 window.dataLayer = window.dataLayer || []; 10178 function generateId(prefix){ 10179 const rnd = ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => 10180 (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) 10181 ); 10182 return (prefix || 'id_') + rnd; 10183 } 10184 function getPxContext(){ 10185 try { return window.pxContext || {}; } catch(e){ return {}; } 10186 } 10187 function getSessionId(){ 10188 const ctx = getPxContext(); 10189 if (ctx.session_id) return ctx.session_id; 10190 let sid = sessionStorage.getItem('px_session_id'); 10191 if (!sid){ sid = generateId('s_'); sessionStorage.setItem('px_session_id', sid); } 10192 return sid; 10193 } 10194 function getChatSessionId(){ 10195 let cid = sessionStorage.getItem('px_chat_session_id'); 10196 if (!cid){ cid = generateId('c_'); sessionStorage.setItem('px_chat_session_id', cid); } 10197 return cid; 10198 } 10199 function basePayload(){ 10200 const ctx = getPxContext(); 10201 const pos = (ctx.pos || 'SarmientoPalace') || null; 10202 const hotelId = (ctx.product_id || '203') || null; 10203 return { 10204 session_id: getSessionId(), 10205 search_id: ctx.search_id || ctx.SearchID || null, 10206 pos: pos, 10207 post: pos, 10208 hotel_id: hotelId, 10209 page_url: location.href 10210 }; 10211 } 10212 function pushEvent(name, extra){ 10213 const params = Object.assign({}, basePayload(), extra || {}); 10214 // Dedupe: evita repetidos en ±1s por sesión/mensaje 10215 try { 10216 const keyId = params.chat_session_id || params.chat_id || ''; 10217 const key = name + '|' + String(keyId); 10218 const now = Date.now(); 10219 window.__px_evt_dedupe = window.__px_evt_dedupe || {}; 10220 const last = window.__px_evt_dedupe[key] || 0; 10221 if (now - last < 1000) { 10222 return; 10223 } 10224 window.__px_evt_dedupe[key] = now; 10225 } catch(_e){ 10226 console.error('[pxChat] Error in pushEvent dedupe:', _e); 10227 } 10228 // Evitar duplicados: si pxTrack existe, delegamos y NO empujamos a dataLayer aquà 10229 if (typeof window.pxTrack === 'function') { 10230 try { 10231 console.log('[pxChat] ð¤ Calling pxTrack for', name, 'with params:', params); 10232 window.pxTrack(name, params); 10233 console.log('%c[pxChat] â ' + name + ' event dispatched successfully', 'color: #4CAF50; font-weight: bold;'); 10234 } catch(e){ 10235 console.error('[pxChat] â Error calling window.pxTrack for', name, ':', e); 10236 } 10237 return; 10238 } 10239 const payload = Object.assign({ event: name }, params); 10240 console.log('[pxChat] ð¤ Pushing to dataLayer:', payload); 10241 window.dataLayer.push(payload); 10242 console.log('%c[pxChat] â ' + name + ' event pushed to dataLayer', 'color: #4CAF50; font-weight: bold;'); 10243 } 10244 let chatOpenTsMs = null; 10245 let chatIsOpen = false; 10246 let lastOpenPushMs = 0; 10247 let closeGuardTimer = null; 10248 let lastStateChangeMs = 0; 10249 let lastCloseCallMs = 0; // Guard para prevenir múltiples llamadas rápidas a handleChatClose 10250 let lastOpenCallMs = 0; // Guard para prevenir múltiples llamadas rápidas a handleChatOpen 10251 let MIN_CHAT_DURATION_MS = 3000; // MÃnimo 3 segundos entre chat_open y chat_close (previene falsos positivos en Chrome) 10252 let OPEN_DEBOUNCE_MS = 300; // Debounce para chat_open (300ms - solo para múltiples llamadas rápidas) 10253 let CLOSE_DEBOUNCE_MS = 400; // Debounce para chat_close (400ms - solo para múltiples llamadas rápidas) 10254 let pendingOpenTimer = null; // Timer para debounce de open 10255 let pendingCloseTimer = null; // Timer para debounce de close 10256 let openCallCount = 0; // Contador de llamadas rápidas a open 10257 let closeCallCount = 0; // Contador de llamadas rápidas a close 10258 function syncChatState(){ 10259 try { 10260 // Guard mÃnimo: no sincronizar si acabamos de cambiar estado hace menos de 200ms 10261 const now = Date.now(); 10262 if (now - lastStateChangeMs < 200) { 10263 console.log('[pxChat] syncChatState throttled (' + (now - lastStateChangeMs) + 'ms ago)'); 10264 return; 10265 } 10266 // Priorizar estado del launcher: clase --open 10267 // Buscar el botón con múltiples selectores 10268 const btn = document.querySelector('.widget-launcher-button') || 10269 document.querySelector('[class*="widget-launcher"]') || 10270 document.querySelector('[class*="launcher-button"]'); 10271 if (btn && btn.classList) { 10272 const isOpenBtn = btn.classList.contains('widget-launcher-button--open') || 10273 btn.classList.toString().indexOf('--open') !== -1; 10274 console.log('[pxChat] syncChatState: button state check:', { 10275 isOpenBtn: isOpenBtn, 10276 chatIsOpen: chatIsOpen,
10277 buttonClasses: btn.className 10278 }); 10279 if (isOpenBtn && !chatIsOpen) { 10280 console.log('[pxChat] syncChatState: button is open but chatIsOpen is false, calling handleChatOpen'); 10281 lastStateChangeMs = now; 10282 return handleChatOpen(); 10283 } 10284 if (!isOpenBtn && chatIsOpen) { 10285 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 10286 const startMs = chatOpenTsMs || lastOpenPushMs || null; 10287 if (startMs && (now - startMs < 3000)) { 10288 console.log('[pxChat] syncChatState: chat_close blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s)'); 10289 return; 10290 } 10291 // CRÃTICO: Esperar y verificar nuevamente que el botón realmente está cerrado 10292 // Esto previene disparos prematuros cuando el DOM aún se está actualizando 10293 setTimeout(function() { 10294 const btnCheck = document.querySelector('.widget-launcher-button') || 10295 document.querySelector('[class*="widget-launcher"]') || 10296 document.querySelector('[class*="launcher-button"]'); 10297 const isStillOpen = btnCheck && btnCheck.classList && ( 10298 btnCheck.classList.contains('widget-launcher-button--open') || 10299 btnCheck.classList.toString().indexOf('--open') !== -1 10300 ); 10301 const ifrCheck = findChatIframe(); 10302 const isIframeVisible = isElementVisible(ifrCheck); 10303 10304 console.log('[pxChat] syncChatState: delayed verification after button close:', { 10305 isStillOpen: isStillOpen, 10306 isIframeVisible: isIframeVisible, 10307 chatIsOpen: chatIsOpen 10308 }); 10309 10310 if (isStillOpen) { 10311 console.log('[pxChat] syncChatState: chat_close CANCELLED - button still shows as open after delay'); 10312 return; 10313 } 10314 if (isIframeVisible) { 10315 console.log('[pxChat] syncChatState: chat_close CANCELLED - iframe still visible after delay'); 10316 return; 10317 } 10318 if (!chatIsOpen) { 10319 console.log('[pxChat] syncChatState: chat_close CANCELLED - chatIsOpen is already false'); 10320 return; 10321 } 10322 10323 console.log('[pxChat] syncChatState: button confirmed closed after delay, calling handleChatClose'); 10324 lastStateChangeMs = Date.now(); 10325 handleChatClose(); 10326 }, 600); // Esperar 600ms para confirmar que el DOM se actualizó completamente 10327 return; 10328 } 10329 } 10330 // CRÃTICO: NO usar iframe como fallback si hay un botón disponible 10331 // El iframe puede no ser visible incluso cuando el chat está abierto 10332 // Solo confiar en el botón launcher para determinar el estado 10333 if (!btn) { 10334 // Solo si NO hay botón, intentar buscar el botón de nuevo con un selector más amplio 10335 const btnRetry = document.querySelector('.widget-launcher-button, [class*="widget-launcher"], [class*="launcher-button"]'); 10336 if (btnRetry && btnRetry.classList) { 10337 const isOpenBtnRetry = btnRetry.classList.contains('widget-launcher-button--open') || 10338 btnRetry.classList.toString().indexOf('--open') !== -1; 10339 console.log('[pxChat] syncChatState: retry button found:', { 10340 isOpenBtnRetry: isOpenBtnRetry, 10341 chatIsOpen: chatIsOpen, 10342 buttonClasses: btnRetry.className 10343 }); 10344 if (isOpenBtnRetry && !chatIsOpen) { 10345 console.log('[pxChat] syncChatState: retry button is open but chatIsOpen is false, calling handleChatOpen'); 10346 lastStateChangeMs = now; 10347 return handleChatOpen(); 10348 } 10349 if (!isOpenBtnRetry && chatIsOpen) { 10350 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 10351 const startMs = chatOpenTsMs || lastOpenPushMs || null; 10352 if (startMs && (now - startMs < 3000)) { 10353 console.log('[pxChat] syncChatState: chat_close blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s)'); 10354 return; 10355 } 10356 // Verificar nuevamente antes de cerrar 10357 setTimeout(function() { 10358 const btnCheck = document.querySelector('.widget-launcher-button, [class*="widget-launcher"], [class*="launcher-button"]'); 10359 const isStillOpen = btnCheck && (btnCheck.classList.contains('widget-launcher-button--open') || 10360 btnCheck.classList.toString().indexOf('--open') !== -1); 10361 10362 if (isStillOpen || !chatIsOpen) { 10363 console.log('[pxChat] syncChatState: chat_close CANCELLED - button still open or chatIsOpen is false'); 10364 return; 10365 } 10366 10367 console.log('[pxChat] syncChatState: retry button confirmed closed after delay, calling handleChatClose'); 10368 lastStateChangeMs = Date.now(); 10369 handleChatClose(); 10370 }, 600); 10371 return; 10372 } 10373 } 10374 10375 // ÃLTIMO RECURSO: Solo usar iframe si NO hay botón Y el chat está abierto 10376 // Y solo para abrir, NUNCA para cerrar (el iframe no es confiable para cerrar) 10377 const ifr = findChatIframe(); 10378 const visible = isElementVisible(ifr); 10379 console.log('[pxChat] syncChatState: iframe LAST RESORT check (only for opening):', { 10380 visible: visible, 10381 chatIsOpen: chatIsOpen, 10382 hasIframe: !!ifr 10383 }); 10384 // Solo usar iframe para detectar apertura, NUNCA para cerrar 10385 if (visible && !chatIsOpen) { 10386 console.log('[pxChat] syncChatState: iframe visible but chatIsOpen is false, calling handleChatOpen'); 10387 lastStateChangeMs = now; 10388 return handleChatOpen(); 10389 } 10390 // NO usar iframe para cerrar - solo confiar en el botón 10391 if (!visible && chatIsOpen) { 10392 console.log('[pxChat] syncChatState: iframe not visible but chatIsOpen is true - IGNORING (iframe not reliable for closing)'); 10393 return; // NO hacer nada - solo el botón puede cerrar 10394 } 10395 } 10396 } catch(_e){ 10397 console.error('[pxChat] syncChatState error:', _e); 10398 } 10399 } 10400 function handleChatOpen(meta){ 10401 console.log('[pxChat] handleChatOpen called:', { chatIsOpen: chatIsOpen, meta: meta }); 10402 10403 // Si ya está abierto, no hacer nada 10404 if (chatIsOpen) { 10405 console.log('[pxChat] handleChatOpen skipped - chat already open'); 10406 return; 10407 } 10408 10409 const now = Date.now(); 10410
10411 // Guard mÃnimo: no abrir si se cerró hace menos de 500ms (solo para prevenir toggle extremo) 10412 if (lastCloseCallMs && (now - lastCloseCallMs < 500)) { 10413 console.log('[pxChat] handleChatOpen blocked - chat closed too recently (' + (now - lastCloseCallMs) + 'ms ago)'); 10414 return; 10415 } 10416 10417 // Throttling mÃnimo: solo prevenir llamadas duplicadas en menos de 200ms 10418 if (now - lastOpenCallMs < 200) { 10419 console.log('[pxChat] handleChatOpen throttled (too soon)'); 10420 return; 10421 } 10422 10423 lastOpenCallMs = now; 10424 10425 // Cancelar cualquier close pendiente 10426 if (pendingCloseTimer) { 10427 clearTimeout(pendingCloseTimer); 10428 pendingCloseTimer = null; 10429 console.log('[pxChat] handleChatOpen: cancelled pending close'); 10430 } 10431 10432 // Disparar inmediatamente (sin debounce para Chromium) 10433 console.log('[pxChat] handleChatOpen: calling doChatOpen immediately'); 10434 doChatOpen(meta); 10435 } 10436 10437 function doChatOpen(meta) { 10438 // Verificar estado del botón (prioridad máxima para Chromium) 10439 // Buscar el botón con múltiples selectores 10440 const btn = document.querySelector('.widget-launcher-button') || 10441 document.querySelector('[class*="widget-launcher"]') || 10442 document.querySelector('[class*="launcher-button"]'); 10443 const isActuallyOpen = btn && btn.classList && ( 10444 btn.classList.contains('widget-launcher-button--open') || 10445 btn.classList.toString().indexOf('--open') !== -1 10446 ); 10447 const ifr = findChatIframe(); 10448 const isIframeVisible = isElementVisible(ifr); 10449 10450 // Log detallado para debugging en Chromium 10451 console.log('[pxChat] doChatOpen called:', { 10452 isActuallyOpen: isActuallyOpen, 10453 isIframeVisible: isIframeVisible, 10454 chatIsOpen: chatIsOpen, 10455 hasButton: !!btn, 10456 buttonClasses: btn ? btn.className : 'no button' 10457 }); 10458 10459 // Si el botón existe y dice que está abierto, proceder 10460 // Si no hay botón pero el iframe es visible, también proceder 10461 if (!isActuallyOpen && !isIframeVisible && btn) { 10462 console.warn('[pxChat] doChatOpen: button exists but not showing as open, proceeding anyway'); 10463 } 10464 10465 // Guardar timestamp ANTES de cambiar el estado (importante para Chrome) 10466 const now = Date.now(); 10467 chatOpenTsMs = now; 10468 lastOpenPushMs = now; 10469 chatIsOpen = true; 10470 const chat_session_id = (meta && (meta.chat_session_id || meta.session_id)) || getChatSessionId(); 10471 10472 // Log para debugging 10473 console.log('[pxChat] ð FIRING chat_open event:', { 10474 chatOpenTsMs: chatOpenTsMs, 10475 lastOpenPushMs: lastOpenPushMs, 10476 timestamp: now, 10477 chat_session_id: chat_session_id 10478 }); 10479 pushEvent('chat_open', { chat_session_id }); 10480 } 10481 function handleChatMessage(meta){ 10482 const chat_id = meta && (meta.chat_id || meta.message_id) || null; 10483 const message_type = meta && (meta.message_type || meta.type) || null; 10484 const payload = { chat_id, message_type }; 10485 pushEvent('chat_message', payload); 10486 } 10487 function handleChatClose(meta){ 10488 console.log('[pxChat] handleChatClose called:', { chatIsOpen: chatIsOpen, meta: meta }); 10489 10490 // Si ya está cerrado, no hacer nada 10491 if (!chatIsOpen) { 10492 console.log('[pxChat] handleChatClose skipped - chat already closed'); 10493 return; 10494 } 10495 10496 const now = Date.now(); 10497 10498 // Guard crÃtico: prevenir que chat_close se dispare inmediatamente después de chat_open 10499 // Aumentado a 3 segundos para evitar disparos prematuros 10500 const startMs = chatOpenTsMs || lastOpenPushMs || null; 10501 if (startMs && (now - startMs < 3000)) { 10502 console.log('[pxChat] handleChatClose blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s required)'); 10503 return; 10504 } 10505 10506 // Verificación adicional: asegurarse de que el botón realmente está cerrado 10507 // Buscar el botón con múltiples selectores 10508 const btn = document.querySelector('.widget-launcher-button') || 10509 document.querySelector('[class*="widget-launcher"]') || 10510 document.querySelector('[class*="launcher-button"]'); 10511 const isActuallyOpen = btn && btn.classList && ( 10512 btn.classList.contains('widget-launcher-button--open') || 10513 btn.classList.toString().indexOf('--open') !== -1 10514 ); 10515 if (isActuallyOpen) { 10516 console.log('[pxChat] handleChatClose blocked - button still shows as open'); 10517 return; 10518 } 10519 10520 // Throttling mÃnimo: solo prevenir llamadas duplicadas en menos de 200ms 10521 if (now - lastCloseCallMs < 200) { 10522 console.log('[pxChat] handleChatClose throttled (too soon)'); 10523 return; 10524 } 10525 10526 lastCloseCallMs = now; 10527 10528 // Cancelar cualquier open pendiente 10529 if (pendingOpenTimer) { 10530 clearTimeout(pendingOpenTimer); 10531 pendingOpenTimer = null; 10532 console.log('[pxChat] handleChatClose: cancelled pending open'); 10533 } 10534 10535 // Disparar inmediatamente (sin debounce para Chromium)
10536 console.log('[pxChat] handleChatClose: calling doChatClose immediately'); 10537 doChatClose(meta, startMs); 10538 } 10539 10540 function doChatClose(meta, startMs) { 10541 // Verificar estado del botón (prioridad máxima para Chromium) 10542 // Buscar el botón con múltiples selectores 10543 const btn = document.querySelector('.widget-launcher-button') || 10544 document.querySelector('[class*="widget-launcher"]') || 10545 document.querySelector('[class*="launcher-button"]'); 10546 const isActuallyOpen = btn && btn.classList && ( 10547 btn.classList.contains('widget-launcher-button--open') || 10548 btn.classList.toString().indexOf('--open') !== -1 10549 ); 10550 const ifr = findChatIframe(); 10551 const isIframeVisible = isElementVisible(ifr); 10552 10553 // Log detallado para debugging en Chromium 10554 console.log('[pxChat] doChatClose called:', { 10555 isActuallyOpen: isActuallyOpen, 10556 isIframeVisible: isIframeVisible, 10557 chatIsOpen: chatIsOpen, 10558 hasButton: !!btn, 10559 buttonClasses: btn ? btn.className : 'no button', 10560 startMs: startMs 10561 }); 10562 10563 // CRÃTICO: Solo proceder si el chat realmente está cerrado 10564 // Si hay un botón, confiar solo en el botón (no en el iframe) 10565 if (btn) { 10566 if (isActuallyOpen) { 10567 console.warn('[pxChat] doChatClose BLOCKED - button still shows as open'); 10568 return; 10569 } 10570 // Si hay botón y no está abierto, proceder (ignorar iframe) 10571 console.log('[pxChat] doChatClose: button exists and is closed, proceeding'); 10572 } else { 10573 // Solo si NO hay botón, verificar iframe 10574 if (isIframeVisible) { 10575 console.warn('[pxChat] doChatClose BLOCKED - iframe still visible (no button found)'); 10576 return; 10577 } 10578 console.log('[pxChat] doChatClose: no button found, iframe not visible, proceeding'); 10579 } 10580 10581 // Guardar timestamp ANTES de cambiar el estado (importante para Chrome) 10582 const now = Date.now(); 10583 const endMs = now; 10584 // Calcular duración antes de resetear variables 10585 const duration_sec = startMs ? Math.max(0, Math.round((endMs - startMs) / 1000)) : null; 10586 // Ahora sà cambiar el estado 10587 chatIsOpen = false; 10588 const chat_session_id = (meta && (meta.chat_session_id || meta.session_id)) || getChatSessionId(); 10589 10590 // Log para debugging 10591 console.log('[pxChat] ð FIRING chat_close event:', { 10592 startMs: startMs, 10593 endMs: endMs, 10594 duration_sec: duration_sec, 10595 chatOpenTsMs: chatOpenTsMs, 10596 lastOpenPushMs: lastOpenPushMs, 10597 calculated: endMs - startMs + 'ms', 10598 chat_session_id: chat_session_id 10599 }); 10600 pushEvent('chat_close', { chat_session_id, duration_sec }); 10601 // Resetear timestamp inmediatamente (ya calculamos la duración) 10602 chatOpenTsMs = null; 10603 lastOpenPushMs = 0; 10604 } 10605 function isElementVisible(el){ 10606 if (!el) return false; 10607 const cs = window.getComputedStyle ? window.getComputedStyle(el) : null; 10608 if (!cs || cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return false; 10609 const r = el.getBoundingClientRect(); 10610 return !!(r.width && r.height); 10611 } 10612 function findChatIframe(){ 10613 try { 10614 const ifrs = document.querySelectorAll('iframe'); 10615 for (let i = 0; i < ifrs.length; i++){ 10616 const n = ifrs[i]; 10617 if (isChatIframe(n)) return n; 10618 } 10619 } catch(_e){} 10620 return null; 10621 } 10622 // Detect launcher button presence (instala watcher; no toggle directo) 10623 document.addEventListener('click', function(ev){ 10624 try { 10625 // Detectar click en el botón de cerrar del header 10626 let closeBtn = null; 10627 if (ev.composedPath) { 10628 const path = ev.composedPath(); 10629 for (let i = 0; i < path.length; i++) { 10630 const n = path[i]; 10631 if (n && n.classList && n.classList.contains && n.classList.contains('widget-header-close')) { 10632 closeBtn = n; 10633 break; 10634 } 10635 } 10636 } 10637 if (!closeBtn && ev.target && ev.target.closest) { 10638 closeBtn = ev.target.closest('.widget-header-close'); 10639 } 10640 10641 // Si se hizo click en el botón de cerrar, esperar a que el DOM se actualice 10642 if (closeBtn && chatIsOpen) { 10643 console.log('[pxChat] Close button clicked, waiting for DOM update...'); 10644 // Esperar más tiempo para que el widget actualice el estado del botón 10645 setTimeout(function() { 10646 const launcherBtn = document.querySelector('.widget-launcher-button'); 10647 const isStillOpen = launcherBtn && launcherBtn.classList && launcherBtn.classList.contains('widget-launcher-button--open'); 10648 console.log('[pxChat] After close button click, launcher state:', { 10649 isStillOpen: isStillOpen, 10650 chatIsOpen: chatIsOpen 10651 }); 10652 if (!isStillOpen && chatIsOpen) { 10653 console.log('[pxChat] Close button clicked and launcher is now closed, calling handleChatClose'); 10654 handleChatClose(); 10655 } 10656 }, 500); // Esperar 500ms para que el DOM se actualice 10657 return; 10658 } 10659 10660 // Detectar click en el botón launcher 10661 let btn = null; 10662 if (ev.composedPath) { 10663 const path = ev.composedPath(); 10664 for (let i = 0; i < path.length; i++) { 10665 const n = path[i]; 10666 if (n && n.classList && n.classList.contains && n.classList.contains('widget-launcher-button')) { btn = n; break; } 10667 } 10668 } 10669 if (!btn && ev.target && ev.target.closest) { 10670 btn = ev.target.closest('.widget-launcher-button'); 10671 } 10672 if (btn) { 10673 installButtonListener(btn); 10674 // Si el botón tiene --open, está abierto; si no, está cerrado 10675 const isOpen = btn.classList.contains('widget-launcher-button--open'); 10676 if (isOpen && !chatIsOpen) { 10677 // Chat se está abriendo 10678 console.log('[pxChat] Launcher button clicked (opening), calling handleChatOpen'); 10679 setTimeout(function() { handleChatOpen(); }, 300); 10680 } else if (!isOpen && chatIsOpen) { 10681 // Chat se está cerrando 10682 console.log('[pxChat] Launcher button clicked (closing), waiting for DOM update...'); 10683 setTimeout(function() { 10684 const launcherBtn = document.querySelector('.widget-launcher-button'); 10685 const isStillOpen = launcherBtn && launcherBtn.classList && launcherBtn.classList.contains('widget-launcher-button--open'); 10686 if (!isStillOpen && chatIsOpen) { 10687 console.log('[pxChat] Launcher button clicked and confirmed closed, calling handleChatClose'); 10688 handleChatClose(); 10689 } 10690 }, 500); // Esperar 500ms para confirmar que está cerrado 10691 } 10692 } 10693 } catch(_e){ 10694 console.error('[pxChat] Error in click listener:', _e); 10695 } 10696 }, true); 10697 // Keyboard open on launcher 10698 document.addEventListener('keydown', function(ev){ 10699 try { 10700 if (ev.key !== 'Enter' && ev.key !== ' ') return; 10701 let btn = null; 10702 if (ev.composedPath) { 10703 const path = ev.composedPath(); 10704 for (let i = 0; i < path.length; i++) { 10705 const n = path[i]; 10706 if (n && n.classList && n.classList.contains && n.classList.contains('widget-launcher-button')) { btn = n; break; } 10707 } 10708 } 10709 if (!btn && ev.target && ev.target.closest) { 10710 btn = ev.target.closest('.widget-launcher-button'); 10711 } 10712 if (btn) { 10713 installButtonListener(btn); 10714 // Delay mÃnimo para dar tiempo al widget a actualizar la clase (Chromium) 10715 setTimeout(syncChatState, 200); 10716 } 10717 } catch(_e){} 10718 }, true); 10719 // Bridge postMessage events from the widget iframe 10720 window.addEventListener('message', function(ev){ 10721 const d = ev.data; 10722 try { 10723 if (!d) return; 10724 if (typeof d === 'object') { 10725 const type = d.type || d.event || d.name || d.px_chat_event; 10726 if (!type) return; 10727 const payload = d.payload || d.meta || d; 10728 switch (String(type)) { 10729 case 'chat_opened': 10730 case 'widget_opened': 10731 case 'open': 10732 return handleChatOpen(payload); 10733 case 'message_sent': 10734 case 'chat_message': 10735 case 'message': 10736 case 'message_received': 10737 case 'new_message': 10738 // Extraer message_id del payload 10739 const messageId = payload && (payload.message_id || payload.messageId || payload.id || payload.chat_id); 10740 const messageType = payload && (payload.type || payload.message_type || 'text'); 10741 const from = payload && (payload.from || payload.user_id || payload.userId); 10742 if (messageId) { 10743 detectChatMessage(messageId, messageType, from); 10744 } else { 10745 return handleChatMessage(payload); 10746 } 10747 return; 10748 case 'chat_closed': 10749 case 'widget_closed': 10750 case 'close': 10751 return handleChatClose(payload); 10752 } 10753 // También buscar en propiedades del objeto directamente 10754 if (d.message_id || d.messageId || d.id) { 10755 const messageId = d.message_id || d.messageId || d.id; 10756 const messageType = d.type || d.message_type || 'text'; 10757 const from = d.from || d.user_id || d.userId; 10758 detectChatMessage(messageId, messageType, from); 10759 } 10760 } 10761 if (typeof d === 'string' && d.indexOf('px-chat:') === 0) { 10762 const parts = d.split(':'); 10763 const type = parts[1]; 10764 let payload = null; 10765 if (parts[2]) { try { payload = JSON.parse(parts.slice(2).join(':')); } catch(_e){} } 10766 if (type === 'open') return handleChatOpen(payload); 10767 if (type === 'message') { 10768 if (payload && (payload.message_id || payload.messageId || payload.id)) { 10769 detectChatMessage(payload.message_id || payload.messageId || payload.id, payload.type || 'text', payload.from); 10770 } else { 10771 return handleChatMessage(payload); 10772 } 10773 return; 10774 } 10775 if (type === 'close') return handleChatClose(payload); 10776 } 10777 } catch(_e){} 10778 }); 10779 // Message detection: interceptar mensajes del widget 10780 let lastMessageIds = new Set(); // Track mensajes ya procesados para evitar duplicados 10781 let lastMessageTime = 0; 10782 const MESSAGE_THROTTLE_MS = 500; // Máximo 1 mensaje cada 500ms 10783 10784 function detectChatMessage(messageId, messageType, from) { 10785 if (!messageId) { 10786 console.debug('[pxChat] detectChatMessage: no messageId provided'); 10787 return; 10788 } 10789 10790 // Evitar duplicados usando messageId (verificar primero) 10791 if (messageId && lastMessageIds.has(messageId)) { 10792 console.debug('[pxChat] detectChatMessage: message already processed', messageId); 10793 return; 10794 } 10795 10796 // Throttling: evitar procesar mensajes muy rápidos 10797 const now = Date.now(); 10798 const timeSinceLast = now - lastMessageTime; 10799 if (timeSinceLast < MESSAGE_THROTTLE_MS) { 10800 console.debug('[pxChat] detectChatMessage: throttled', timeSinceLast, 'ms since last'); 10801 return; 10802 } 10803 10804 // Permitir trackear mensajes incluso si el chat no está visualmente abierto 10805 // Los mensajes pueden llegar cuando el chat está minimizado pero activo 10806 // En Chromium, el chat puede estar activo sin que chatIsOpen sea true 10807 const hasChatSession = getChatSessionId() !== null; 10808 const shouldProcess = hasChatSession || chatIsOpen; 10809 10810 if (!shouldProcess) { 10811 // Si no hay sesión y el chat no está abierto, intentar una vez más después de un delay 10812 console.debug('[pxChat] detectChatMessage: no session/open, will retry', { hasChatSession, chatIsOpen }); 10813 setTimeout(function() { 10814 const retryHasSession = getChatSessionId() !== null; 10815 const retryIsOpen = chatIsOpen; 10816 if ((retryHasSession || retryIsOpen) && messageId && !lastMessageIds.has(messageId)) { 10817 console.debug('[pxChat] detectChatMessage: retry after delay', { retryHasSession, retryIsOpen }); 10818 detectChatMessage(messageId, messageType, from); 10819 } else { 10820 console.debug('[pxChat] detectChatMessage: retry failed - conditions not met'); 10821 } 10822 }, 1500); // Aumentado a 1.5s para dar más tiempo en Chromium 10823 return; 10824 } 10825
10826 // Limpiar Set si tiene más de 100 mensajes (evitar memory leak) 10827 if (lastMessageIds.size > 100) { 10828 lastMessageIds.clear(); 10829 } 10830 10831 if (messageId) { 10832 lastMessageIds.add(messageId); 10833 } 10834 lastMessageTime = now; 10835 10836 // Disparar evento 10837 try { 10838 const payload = { 10839 chat_id: messageId, 10840 message_type: messageType || 'text', 10841 from: from 10842 }; 10843 console.debug('[pxChat] detectChatMessage: processing message', payload); 10844 handleChatMessage(payload); 10845 } catch(e) { 10846 console.error('[pxChat] â Error processing message:', e); 10847 } 10848 } 10849 10850 // Listener para eventos personalizados que el widget podrÃa disparar 10851 document.addEventListener('px-chat-message', function(ev) { 10852 try { 10853 const data = ev.detail || ev.data || {}; 10854 detectChatMessage(data.message_id || data.messageId || data.id, data.type || data.message_type, data.from); 10855 } catch(_e){} 10856 }); 10857 10858 // Interceptar logs de console.log para detectar mensajes de Pusher 10859 // El widget loguea mensajes con formato especÃfico que podemos interceptar 10860 try { 10861 const originalConsoleLog = console.log; 10862 let isProcessing = false; // Flag para evitar recursión 10863 let processedMessageIds = new Set(); // Track mensajes ya procesados por el interceptor 10864 10865 console.log = function(...args) { 10866 // Llamar al console.log original primero (siempre) 10867 originalConsoleLog.apply(console, args); 10868 10869 // Evitar procesamiento recursivo 10870 if (isProcessing) return; 10871 10872 try { 10873 isProcessing = true; 10874 10875 let detectedMessageId = null; 10876 let detectedMessageType = 'text'; 10877 let detectedFrom = null; 10878 10879 // Buscar message_id en los argumentos directamente (mejorado para Chromium) 10880 for (let i = 0; i < args.length; i++) { 10881 const arg = args[i]; 10882 if (typeof arg === 'object' && arg !== null && !Array.isArray(arg)) { 10883 // Buscar directamente en el objeto 10884 if (arg.message_id || arg.messageId || arg.id) { 10885 detectedMessageId = arg.message_id || arg.messageId || arg.id; 10886 detectedMessageType = arg.type || arg.message_type || 'text'; 10887 detectedFrom = arg.from || arg.user_id || arg.userId || null; 10888 break; 10889 } 10890 // Buscar en rawData (estructura anidada común en Pusher) 10891 if (arg.rawData && typeof arg.rawData === 'object') { 10892 if (arg.rawData.message_id || arg.rawData.messageId || arg.rawData.id) { 10893 detectedMessageId = arg.rawData.message_id || arg.rawData.messageId || arg.rawData.id; 10894 detectedMessageType = arg.rawData.type || arg.rawData.message_type || 'text'; 10895 detectedFrom = arg.rawData.from || arg.rawData.user_id || arg.rawData.userId || null; 10896 break; 10897 } 10898 } 10899 // Buscar en propiedades anidadas (para Chromium que puede tener estructura diferente) 10900 try { 10901 for (let key in arg) { 10902 if (arg.hasOwnProperty(key) && typeof arg[key] === 'object' && arg[key] !== null) { 10903 if (arg[key].message_id || arg[key].messageId || arg[key].id) { 10904 detectedMessageId = arg[key].message_id || arg[key].messageId || arg[key].id; 10905 detectedMessageType = arg[key].type || arg[key].message_type || 'text'; 10906 detectedFrom = arg[key].from || arg[key].user_id || arg[key].userId || null; 10907 break; 10908 } 10909 } 10910 } 10911 if (detectedMessageId) break; 10912 } catch(_e) {} 10913 } 10914 } 10915 10916 // Si no encontramos en objetos, buscar en strings (solo si contiene patrones de Pusher) 10917 if (!detectedMessageId) { 10918 const logStr = args.map(arg => { 10919 if (typeof arg === 'string') return arg; 10920 if (typeof arg === 'object' && arg !== null) { 10921 try { return JSON.stringify(arg); } catch(_e) { return String(arg); } 10922 } 10923 return String(arg); 10924 }).join(' '); 10925 10926 // Solo procesar si contiene patrones especÃficos de Pusher 10927 if ((logStr.indexOf('[Pusher] ð¨ MENSAJE RECIBIDO') !== -1 || 10928 logStr.indexOf('[Pusher] ð¨ Mensaje recibido') !== -1 || 10929 logStr.indexOf('[Pusher] Body completo:') !== -1 || 10930 logStr.indexOf('[Pusher]') !== -1) && 10931 (logStr.indexOf('message_id') !== -1 || logStr.indexOf('messageId') !== -1)) { 10932 10933 // Intentar extraer message_id del string (múltiples formatos) 10934 try { 10935 // Formato: "message_id": "xxx" 10936 let messageIdMatch = logStr.match(/["']message_id["']\s*:\s
10936*["']([^"']+)["']/); 10937 if (!messageIdMatch) { 10938 // Formato: messageId: "xxx" 10939 messageIdMatch = logStr.match(/["']messageId["']\s*:\s*["']([^"']+)["']/); 10940 } 10941 if (!messageIdMatch) { 10942 // Formato: message_id: xxx (sin comillas) 10943 messageIdMatch = logStr.match(/message_id["']?\s*:\s*["']?([a-zA-Z0-9\-_]+)/); 10944 } 10945 if (messageIdMatch && messageIdMatch[1]) { 10946 detectedMessageId = messageIdMatch[1]; 10947 console.debug('[pxChat] Detected message_id from log string:', detectedMessageId); 10948 } 10949 } catch(_e) {} 10950 } 10951 } 10952 10953 // Procesar solo si encontramos un messageId y no lo hemos procesado antes 10954 if (detectedMessageId && !processedMessageIds.has(detectedMessageId)) { 10955 processedMessageIds.add(detectedMessageId); 10956 // Limpiar Set si tiene más de 50 mensajes 10957 if (processedMessageIds.size > 50) { 10958 processedMessageIds.clear(); 10959 } 10960 10961 console.debug('[pxChat] Detected message from Pusher log:', { 10962 messageId: detectedMessageId, 10963 messageType: detectedMessageType, 10964 from: detectedFrom 10965 }); 10966 10967 setTimeout(function() { 10968 detectChatMessage(detectedMessageId, detectedMessageType, detectedFrom); 10969 }, 300); // Aumentado a 300ms para dar tiempo a que se establezca la sesión 10970 } 10971 } catch(e) { 10972 // Silenciar errores en el interceptor para no romper otros logs 10973 console.debug('[pxChat] Error in console.log interceptor:', e); 10974 } finally { 10975 isProcessing = false; 10976 } 10977 }; 10978 10979 originalConsoleLog('[pxChat] Console.log interceptor installed for Pusher message detection'); 10980 } catch(e) { 10981 console.error('[pxChat] Error setting up console.log interceptor:', e); 10982 } 10983 10984 // MutationObserver para detectar mensajes en el DOM del chat (dentro del iframe) 10985 // Nota: Esto solo funciona si tenemos acceso al contenido del iframe (mismo origen) 10986 try { 10987 const chatMessageObserver = new MutationObserver(function(mutations) { 10988 if (!chatIsOpen) return; 10989 10990 for (let i = 0; i < mutations.length; i++) { 10991 const mutation = mutations[i]; 10992 if (mutation.addedNodes && mutation.addedNodes.length > 0) { 10993 for (let j = 0; j < mutation.addedNodes.length; j++) { 10994 const node = mutation.addedNodes[j]; 10995 if (node.nodeType === 1) { // Element node 10996 // Buscar elementos que parezcan mensajes de chat 10997 // Selectores comunes: .message, .chat-message, [data-message-id], etc. 10998 const messageEl = node.classList && ( 10999 node.classList.contains('message') || 11000 node.classList.contains('chat-message') || 11001 node.classList.contains('msg') || 11002 node.getAttribute('data-message-id') 11003 ) ? node : (node.querySelector && ( 11004 node.querySelector('.message') || 11005 node.querySelector('.chat-message') || 11006 node.querySelector('[data-message-id]') 11007 )); 11008 11009 if (messageEl) { 11010 const messageId = messageEl.getAttribute('data-message-id') || 11011 messageEl.getAttribute('data-id') || 11012 messageEl.id || 11013 null; 11014 const messageType = messageEl.getAttribute('data-type') || 11015 messageEl.getAttribute('data-message-type') || 11016 'text'; 11017 const from = messageEl.getAttribute('data-from') || null; 11018 11019 if (messageId) { 11020 detectChatMessage(messageId, messageType, from); 11021 } 11022 } 11023 } 11024 } 11025 } 11026 } 11027 }); 11028 11029 // Observar el iframe del chat cuando esté disponible 11030 function observeChatIframe() { 11031 const ifr = findChatIframe(); 11032 if (ifr && ifr.contentDocument && ifr.contentDocument.body) { 11033 try { 11034 chatMessageObserver.observe(ifr.contentDocument.body, { 11035 childList: true, 11036 subtree: true 11037 }); 11038 console.debug('[pxChat] Message observer installed on chat iframe'); 11039 } catch(e) { 11040 // Cross-origin: no podemos acceder al contenido del iframe 11041 console.debug('[pxChat] Cannot observe iframe content (cross-origin)'); 11042 } 11043 } 11044 } 11045 11046 // Intentar observar cuando el iframe se carga 11047 const ifr = findChatIframe(); 11048 if (ifr) { 11049 if (ifr.contentDocument && ifr.contentDocument.body) { 11050 observeChatIframe(); 11051 } else { 11052 ifr.addEventListener('load', observeChatIframe); 11053 } 11054 } 11055 11056 // También intentar cuando se detecta un nuevo iframe
11057 const iframeObserver = new MutationObserver(function() { 11058 const ifr = findChatIframe(); 11059 if (ifr && !ifr.__px_chat_message_observed) { 11060 ifr.__px_chat_message_observed = true; 11061 if (ifr.contentDocument && ifr.contentDocument.body) { 11062 observeChatIframe(); 11063 } else { 11064 ifr.addEventListener('load', observeChatIframe); 11065 } 11066 } 11067 }); 11068 iframeObserver.observe(document.body, { childList: true, subtree: true }); 11069 } catch(e) { 11070 console.error('[pxChat] Error setting up message observer:', e); 11071 } 11072 11073 // Expose helpers for manual triggers if needed 11074 window.pxChatOpen = function(meta){ handleChatOpen(meta || {}); }; 11075 window.pxChatMessage = function(meta){ handleChatMessage(meta || {}); }; 11076 window.pxChatClose = function(meta){ handleChatClose(meta || {}); }; 11077 // Expose message detection function for external use 11078 window.pxChatDetectMessage = function(messageId, messageType, from) { 11079 detectChatMessage(messageId, messageType, from); 11080 }; 11081 // Robust DOM observer: button presence and iframe lifecycle 11082 const observedIframes = new Set(); 11083 function isChatIframe(node){ 11084 if (!node || node.nodeName !== 'IFRAME') return false; 11085 try { 11086 const src = node.getAttribute('src') || ''; 11087 return /pxsol|chat|widget/i.test(src); 11088 } catch(_e){ return false; } 11089 } 11090 function installButtonListener(btn){ 11091 if (!btn || btn.__px_chat_hooked) return; 11092 btn.__px_chat_hooked = true; 11093 try { 11094 btn.__px_open_state = !!(btn.classList && btn.classList.contains('widget-launcher-button--open')); 11095 // NO sincronizar estado inicial aquà - solo observar cambios futuros 11096 let buttonChangeTimer = null; 11097 const ob = new MutationObserver(function(muts){ 11098 for (let i = 0; i < muts.length; i++){ 11099 const m = muts[i]; 11100 if (m.type === 'attributes' && m.attributeName === 'class') { 11101 const isOpen = btn.classList.contains('widget-launcher-button--open'); 11102 // Solo disparar si realmente cambió el estado 11103 if (isOpen !== btn.__px_open_state) { 11104 const now = Date.now(); 11105 if (now - lastStateChangeMs < 300) { 11106 console.debug('[pxChat] MutationObserver: change throttled'); 11107 return; // Ignorar cambios muy rápidos 11108 } 11109 11110 // Procesar inmediatamente (sin debounce para Chromium) 11111 if (buttonChangeTimer) { 11112 clearTimeout(buttonChangeTimer); 11113 } 11114 // Delay mÃnimo solo para asegurar que el DOM se actualizó 11115 buttonChangeTimer = setTimeout(function() { 11116 processButtonStateChange(btn, now); 11117 buttonChangeTimer = null; 11118 }, 50); // Delay mÃnimo de 50ms para Chromium 11119 } 11120 } 11121 } 11122 }); 11123 ob.observe(btn, { attributes: true, attributeFilter: ['class'] }); 11124 btn.__px_chat_observer = ob; 11125 } catch(_e){} 11126 } 11127 11128 function processButtonStateChange(btn, timestamp) { 11129 // Verificar que el estado realmente cambió 11130 const currentIsOpen = btn.classList.contains('widget-launcher-button--open') || 11131 btn.classList.toString().indexOf('--open') !== -1; 11132 console.log('[pxChat] processButtonStateChange:', { 11133 currentIsOpen: currentIsOpen, 11134 previousState: btn.__px_open_state, 11135 chatIsOpen: chatIsOpen 11136 }); 11137 11138 if (currentIsOpen === btn.__px_open_state) { 11139 console.log('[pxChat] MutationObserver: state unchanged, skipping'); 11140 return; 11141 } 11142 11143 btn.__px_open_state = currentIsOpen; 11144 lastStateChangeMs = timestamp || Date.now(); 11145 11146 if (currentIsOpen) { 11147 console.log('[pxChat] MutationObserver: button opened, calling handleChatOpen'); 11148 handleChatOpen(); 11149 } else { 11150 // Verificar que chatIsOpen es true antes de intentar cerrar 11151 if (!chatIsOpen) { 11152 console.log('[pxChat] MutationObserver: button closed but chatIsOpen is already false, skipping'); 11153 return; 11154 } 11155 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 11156 const finalNow = Date.now(); 11157 const startMs = chatOpenTsMs || lastOpenPushMs || null; 11158 if (startMs && (finalNow - startMs < 3000)) { 11159 console.log('[pxChat] MutationObserver: chat_close blocked - chat opened too recently (' + Math.round((finalNow - startMs) / 1000) + 's ago, minimum 3s)'); 11160 return; 11161 } 11162 11163 // CRÃTICO: Esperar y verificar nuevamente que el botón realmente perdió la clase --open 11164 // Esto previene disparos prematuros cuando el DOM aún se está actualizando 11165 setTimeout(function() { 11166 const btnCheck = document.querySelector('.widget-launcher-button') || 11167 document.querySelector('[class*="widget-launcher"]') || 11168 document.querySelector('[class*="launcher-button"]'); 11169 const isStillOpen = btnCheck && btnCheck.classList && ( 11170 btnCheck.classList.contains('widget-launcher-button--open') || 11171 btnCheck.classList.toString().indexOf('--open') !== -1 11172 ); 11173 11174 console.log('[pxChat] MutationObserver: delayed verification after button close:', { 11175 isStillOpen: isStillOpen, 11176 chatIsOpen: chatIsOpen, 11177 hasButton: !!btnCheck 11178 }); 11179 11180 // Solo proceder si el botón realmente está cerrado 11181 // Si hay botón, confiar solo en el botón (no en el iframe) 11182 if (isStillOpen) { 11183 console.log('[pxChat] MutationObserver: chat_close CANCELLED - button still shows as open after delay'); 11184 return; 11185 } 11186 // Solo verificar iframe si NO hay botón 11187 if (!btnCheck) { 11188 const ifr = findChatIframe(); 11189 const isIframeVisible = isElementVisible(ifr); 11190 if (isIframeVisible) { 11191 console.log('[pxChat] MutationObserver: chat_close CANCELLED - iframe still visible after delay (no button found)'); 11192 return; 11193 } 11194 } 11195 if (!chatIsOpen) { 11196 console.log('[pxChat] MutationObserver: chat_close CANCELLED - chatIsOpen is already false'); 11197 return; 11198 } 11199 11200 console.log('[pxChat] MutationObserver: button confirmed closed after delay, calling handleChatClose'); 11201 handleChatClose(); 11202 }, 600); // Esperar 600ms para confirmar que el DOM se actualizó completamente 11203 } 11204 } 11205
11206 function scanExisting(){ 11207 try { 11208 const btn = document.querySelector('.widget-launcher-button'); 11209 if (btn) installButtonListener(btn); 11210 document.querySelectorAll('iframe').forEach(function(ifr){ 11211 if (isChatIframe(ifr) && !observedIframes.has(ifr)) { 11212 observedIframes.add(ifr); 11213 // Delay más largo para evitar falsos positivos 11214 setTimeout(syncChatState, 800); 11215 } 11216 }); 11217 } catch(_e){} 11218 } 11219 const mo = new MutationObserver(function(mutations){ 11220 let anyRemoval = false; 11221 for (const m of mutations) { 11222 if (m.type === 'childList') { 11223 // Added nodes 11224 m.addedNodes && m.addedNodes.forEach(function(n){ 11225 try { 11226 if (!(n instanceof Element)) return; 11227 if (n.classList && n.classList.contains('widget-launcher-button')) { 11228 installButtonListener(n); 11229 } 11230 if (isChatIframe(n) && !observedIframes.has(n)) { observedIframes.add(n); setTimeout(syncChatState, 800); } 11231 // Deep scan 11232 n.querySelectorAll && n.querySelectorAll('.widget-launcher-button,iframe').forEach(function(x){ 11233 if (x.classList && x.classList.contains('widget-launcher-button')) installButtonListener(x); 11234 if (isChatIframe(x) && !observedIframes.has(x)) { observedIframes.add(x); setTimeout(syncChatState, 800); } 11235 }); 11236 } catch(_e){} 11237 }); 11238 // Removed nodes 11239 if (m.removedNodes && m.removedNodes.length) { 11240 anyRemoval = true; 11241 } 11242 } 11243 }
11244 if (anyRemoval) { 11245 // Check if any observed iframe is gone 11246 const still = new Set(); 11247 observedIframes.forEach(function(ifr){ 11248 if (document.body && document.body.contains(ifr)) { 11249 still.add(ifr); 11250 } else { 11251 // Delay más largo cuando se remueve el iframe (chat cerrado) 11252 setTimeout(syncChatState, 500); 11253 } 11254 }); 11255 observedIframes.clear(); 11256 still.forEach(function(x){ observedIframes.add(x); }); 11257 } 11258 }); 11259 // Poller de respaldo acotado: solo durante una ventana corta post-load 11260 // para evitar loops eternos si no aparece el botón. 11261 const CHAT_FALLBACK_POLL_INTERVAL_MS = 500; 11262 const CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD = 2000; 11263 let chatFallbackPollIntervalId = null; 11264 let chatFallbackPollStartMs = null; 11265 11266 function stopChatFallbackPoller(reason) { 11267 if (!chatFallbackPollIntervalId) return; 11268 clearInterval(chatFallbackPollIntervalId); 11269 chatFallbackPollIntervalId = null; 11270 console.log('[pxChat] Polling stopped:', reason); 11271 } 11272 11273 function runChatFallbackPollTick() { 11274 const btn = document.querySelector('.widget-launcher-button') || 11275 document.querySelector('[class*="widget-launcher"]') || 11276 document.querySelector('[class*="launcher-button"]'); 11277 // Solo ejecutar syncChatState si NO hay botón (el botón tiene su propio observer) 11278 if (!btn) { 11279 console.log('[pxChat] Polling syncChatState (no button found)'); 11280 syncChatState(); 11281 return; 11282 } 11283 11284 console.debug('[pxChat] Polling skipped - button found, using MutationObserver instead'); 11285 stopChatFallbackPoller('button found'); 11286 } 11287 11288 function startChatFallbackPoller() { 11289 if (chatFallbackPollIntervalId) return; 11290 chatFallbackPollStartMs = Date.now(); 11291 runChatFallbackPollTick(); // Tick inicial inmediato 11292 chatFallbackPollIntervalId = setInterval(function() { 11293 if (Date.now() - chatFallbackPollStartMs > CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD) { 11294 stopChatFallbackPoller('load + ' + CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD + 'ms timeout'); 11295 return; 11296 } 11297 runChatFallbackPollTick(); 11298 }, CHAT_FALLBACK_POLL_INTERVAL_MS); 11299 } 11300 11301 // Ejecutar solo post-load (o inmediatamente si la página ya terminó de cargar) 11302 if (document.readyState === 'complete') { 11303 startChatFallbackPoller(); 11304 } else { 11305 window.addEventListener('load', function onLoadStartChatFallbackPoller() { 11306 window.removeEventListener('load', onLoadStartChatFallbackPoller); 11307 startChatFallbackPoller(); 11308 }); 11309 } 11310 try { 11311 mo.observe(document.documentElement || document, { childList: true, subtree: true }); 11312 // Initial scan after load tick 11313 if (document.readyState === 'loading') { 11314 document.addEventListener('DOMContentLoaded', scanExisting); 11315 } else { 11316 setTimeout(scanExisting, 0); 11317 } 11318 } catch(_e){} 11319 })(); 11320</script>
vendor: 1 bytes, line 11320
11320
11321<script> 11322 // Override para evitar espejo de chat_* al dataLayer y evitar doble track 11323 (function(){ 11324 if (typeof window.gtag === 'function') { 11325 window.gtag = function(){ 11326 try { window.dataLayer.push(arguments); } catch(_e){} 11327 }; 11328 } 11329 // Redefinir pxTrack: usa gtag si existe; sino, dataLayer 11330 window.pxTrack = function(eventName, params){ 11331 params = params || {}; 11332 if (typeof window.gtag === 'function') { 11333 try { window.gtag('event', eventName, params); } catch(_e){} 11334 } else { 11335 try { window.dataLayer.push(Object.assign({ event: eventName }, params)); } catch(_e){} 11336 } 11337 }; 11338 })(); 11339</script>
11339 11340</script>
11340 </div> 11341 11342 11343 <div id="ContainerRD" class="nodisplay"> 11344 <div class="flex flex-center fullheight"> 11345 <div id="ContainerRDInner"> 11346 <div id="Loader" class="fullheight flex flex-center"> 11347 <img class="animated slideInUp" src="https://cdn.pxsol.com/css/images/logo_loginrd.png" /> 11348 </div> 11349 <div id="CloseRDContainer"><i class="fa fa-times" aria-hidden="true"></i></div> 11350 <iframe style="width: 100%; height: 100%" src="" id="IframeRD" scrolling="no"> 11351 11352 </iframe> 11353 </div> 11354 </div> 11355 </div> 11356 11357 <div id="CortinaCargando" align="center" class="Loading nodisplay"> 11358 <div class="linear-activity"> 11359 <div class="indeterminate"></div> 11360 </div> 11361 </div> 11362 11363 <div id="dialogBox" title="..." class="nodisplay"> 11364 <p><span class="ui-icon ui-icon-alert alerticon"></span>...</p> 11365 </div> 11366 11367
11367<script src='/js_3.js?pos=SarmientoPalace&device=computer&filev=1790284695&posv=1790446792_2025-10-27T15:48:02.000Z_2025-10-27T15:48:02.000Z' defer="true" async></script>
11367 11368 11369 <div id="diccionario"> 11370 </div> 11371 11372 </div>
11372<script> 11373 window.currentContent = "index"; 11374 window.currentDevice = "desktop"; 11375 console.log('CurrentState', window.currentContent, window.currentDevice); 11376</script>
11376 11377 11378
11378<script src="/neo_modules/neo_popup/js.js?v=121790284695"></script>
11378 11379<!-- End Popup code --> 11380<div class="EndError left full" style="max-width: 100vw; overflow: auto;"> 11381 </div> 11382 11383
11384<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"7d975d1d5f324af98acd3f46caefc6c0","r":1,"spa":2}' crossorigin="anonymous"></script>
11384 11385</body> 11386<div id="dialogBox" title="..." class="nodisplay"> 11387 <p><span class="ui-icon ui-icon-alert alerticon"></span>...</p> 11388</div> 11389 11390 11391 11392 11393</html> 11394 11395
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.