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>Home - San Remo Hoteles</title> 18 <meta name="description" content="Somos una cadena hotelera con 56 años de trayectoria que avalan nuestra experiencia en el servicio al huésped."> 19 20 <meta http-equiv="content-language" content="pt"> 21 <link rel="canonical" href="https://www.sanremohoteles.com/pt/" /> 22 <meta property="og:url" content="https://www.sanremohoteles.com/pt/" /> 23 <meta property="og:type" content="website" /> 24 <meta property="og:title" content="Home - San Remo Hoteles" /> 25 <meta property="og:description" content="Somos una cadena hotelera con 56 años de trayectoria que avalan nuestra experiencia en el servicio al huésped." /> 26 27 <meta property="og:image" content="https://images-new.pxsol.com/X2asHAcuZ24vQ_a8xAP7c69KsZT3avCBkHzDnE0uc3M/rs:fill:630:430:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F17192626940e9e7e7cb10828bce348612de95523245.jpg@jpg" /> 28 29 30 31 <link rel="alternate" hreflang="es-AR" href="https://www.sanremohoteles.com/" /> 32 <link rel="alternate" hreflang="en-US" href="https://www.sanremohoteles.com/en/" /> 33 <link rel="alternate" hreflang="pt-BR" href="https://www.sanremohoteles.com/pt/" /> 34 <link rel="alternate" hreflang="fr-FR" href="https://www.sanremohoteles.com/fr/" /> 35 <link rel="alternate" hreflang="x-default" href="https://www.sanremohoteles.com/" /> 36 37<link rel="icon" type="image/png" sizes="16x16" href="https://images-new.pxsol.com/i8aTnK9z_I7yMOE6uhTDRjt7u974dallnI0vpd-wgKc/rs:fill:16:16:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 38<link rel="icon" type="image/png" sizes="32x32" href="https://images-new.pxsol.com/Na6WSYRu9xt0nvBwWoJXCjcZUU0hDjy94UBvLStJTnE/rs:fill:32:32:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 39<link rel="icon" type="image/png" sizes="48x48" href="https://images-new.pxsol.com/vXQsDGVrobVKfmOIBuWkATPU3ay3i4mI-e7hG6GBTmQ/rs:fill:48:48:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 40<link rel="icon" type="image/png" sizes="96x96" href="https://images-new.pxsol.com/qnK7mhDfUwm27MqRnhtiKMQtvFhqKxXMmPbKm2rPOkg/rs:fill:96:96:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 41<link rel="shortcut icon" href="https://files-p.pxsol.com/13307/company/library/user/5126930364ea8a9a40b647af1c2cabae351ef5e772.png" /> 42 43<link rel="apple-touch-icon" sizes="57x57" href="https://images-new.pxsol.com/0Ns7SAkuELF-9IkX4hwCBxt0JYnuWua_OiolB5A94JU/rs:fill:57:57:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 44<link rel="apple-touch-icon" sizes="72x72" href="https://images-new.pxsol.com/Wf7bwULbfl4jw3AgLGjvEh_CbwL48bqth4VC5a_NJXk/rs:fill:72:72:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 45<link rel="apple-touch-icon" sizes="76x76" href="https://images-new.pxsol.com/mUynYO5S4DHMv7SRfMIiemu5rchRgy8mvncyJ4HjxQ0/rs:fill:76:76:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 46<link rel="apple-touch-icon" sizes="114x114" href="https://images-new.pxsol.com/tDzltV8zRUlgI2CqfSvTHm4CvOGkjw1lAtb188TIrqs/rs:fill:114:114:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 47<link rel="apple-touch-icon" sizes="120x120" href="https://images-new.pxsol.com/DjfKoHijr5ulDWQ1sKqrOkBwJqiyAIKGu2cjFF-c7nw/rs:fill:120:120:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 48<link rel="apple-touch-icon" sizes="144x144" href="https://images-new.pxsol.com/8Skc2RbdMtUnWpu_vtjiJvyDmIg1DBiaJ9VjO8kPlpo/rs:fill:144:144:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 49<link rel="apple-touch-icon" sizes="152x152" href="https://images-new.pxsol.com/jOm0xThLFbk9O-i6qVU7-VOzF3PxvnB8Z3nUhCJdChU/rs:fill:152:152:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 50<link rel="apple-touch-icon" sizes="180x180" href="https://images-new.pxsol.com/FHLyab3zm8ybaGF8mU38Z-T0jcfkqHDCWIp-bzF_RYU/rs:fill:180:180:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 51 52<link rel="icon" sizes="192x192" href="https://images-new.pxsol.com/SvryX25ZdDr538yVWjo1QawJBoBNmpkArqcR1f-qCec/rs:fill:192:192:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 53<link rel="icon" sizes="512x512" href="https://images-new.pxsol.com/BJEPhNpVdEnVxWSk3IB3nOgtC4ZnU8fWWDVAfHZd6O8/rs:fill:512:512:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 54 55 <link rel="manifest" href="/manifest.json?pos=Sanremohoteles"> 56 57<meta name="theme-color" content="#b09d21"> 58 59<meta property="og:site_name" content="Home - San Remo Hoteles" /> 60<meta name="twitter:card" content="summary"> 61<meta name="twitter:site" content="Home - San Remo Hoteles"> 62<meta name="twitter:title" content="Home - San Remo Hoteles"> 63<meta name="twitter:description" content="Somos una cadena hotelera con 56 años de trayectoria que avalan
63nuestra experiencia en el servicio al huésped."> 64<meta name="twitter:creator" content="PXSOL"> 65<meta name="twitter:image" content="https://images-new.pxsol.com/X2asHAcuZ24vQ_a8xAP7c69KsZT3avCBkHzDnE0uc3M/rs:fill:630:430:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F17192626940e9e7e7cb10828bce348612de95523245.jpg@jpg"> 66 67 68 69<style> 70 .neo_bgcolor_primary, .MuiButton-containedSecondary { 71background-color: #b09d21 !important; 72} 73 74.MuiButton-containedSecondary.MuiButton-contained.Mui-disabled { 75 box-shadow: none !important; 76 background-color: rgba(0, 0, 0, 0.12) !important; 77} 78 79.neo_color_primary { 80color: #b09d21; 81} 82 83.cta_webcheckin_px:not(.btn_sesion) { 84background-color: #b09d21 !important; 85color: white !important; 86border: none !important; 87font-weight: bold; 88right: 0; 89display: flex; 90align-items: center; 91font-size: 13px !important; 92padding: 7px 8px !important; 93line-height: 1.2; 94text-align: left; 95} 96 97.cta_webcheckin_px.btn_sesion { 98border: none !important; 99font-weight: bold; 100right: 0; 101display: flex; 102align-items: center; 103font-size: 13px !important; 104padding: 7px 8px !important; 105line-height: 1.2; 106text-align: left; 107} 108 109.cta_webcheckin_px * { 110color: inherit !important; 111} 112 113.cta_webcheckin_px.btn_sesion > i { 114 color: #b09d21 !important; 115} 116 117.cta_webcheckin_px { 118background-color: #c0b14e; 119} 120.cta_webcheckin_px i { 121margin-right: 10px; 122font-size: 15px; 123} 124 125.neo_bgcolor_primary:hover, .MuiButton-containedSecondary:hover { 126background-color: #c0b14e; 127} 128.px-sm-inputcontainer:hover label { 129color: #b09d21 !important; 130} 131div.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 { 132background-color: #b09d21 !important; 133} 134 135.px-mk-iconchangesearch { 136color: #b09d21 !important; 137} 138 139.px-mk-locationdropdown>*:hover .px-mk-locationimg { 140fill: #b09d21 !important; 141} 142 143.neo_mobile_supratop .neo_supratop_selector i { 144color: #b09d21 !important; 145} 146 147.standard_cta { 148padding: 10px 15px; 149box-sizing: border-box; 150border-radius: 5px; 151display: flex; 152justify-content: center; 153text-align: center; 154align-items: center; 155background: #b09d21 !important; 156color: #000000; 157transition: .2s ease-out; 158color: white; 159text-decoration: none; 160font-size: 18px; 161border: none; 162transition: .25s ease-out; 163cursor: pointer; 164} 165 166.standard_cta:hover { 167background-color: #c8bb64; 168} 169.standard_cta:disabled { 170opacity: .5; 171cursor: not-allowed; 172} 173 174.neo_cta_naked {
175font-weight: bold; 176text-decoration: none; 177color: #b09d21; 178display: inline-flex; 179background-color: transparent; 180border: none; 181cursor: pointer; 182transition: .2s ease-out; 183} 184 185.neo_cta_naked.gray { 186color: darkgray; 187} 188 189.neo_cta_naked:hover { 190color: #7c6e18; 191} 192 193.neo_cta_standard { 194border: none; 195border-radius: 10px; 196padding: 12px 20px; 197font-size: 18px; 198display: flex; 199align-items: center; 200justify-content: space-between; 201font-weight: bold; 202cursor: pointer; 203transition: .25s ease-out; 204box-sizing: border-box; 205text-decoration: none; 206} 207 208.neo_cta_standard.smaller { 209font-size: 16px; 210padding: 7px 13px; 211} 212 213.neo_cta_standard.shadow { 214box-shadow: 0px -1px 15px rgba(0,0,0,.3); 215} 216 217.neo_cta_standard.lowpadding { 218padding: 12px; 219} 220.neo_cta_standard.lowpadding > i { 221margin: 0; 222} 223 224.neo_cta_standard:disabled { 225opacity: .5; 226cursor: not-allowed; 227} 228 229.neo_cta_standard.primary { 230background: #b09d21; 231color: #000000; 232} 233.neo_cta_standard.white_cta { 234background: white; 235color: black; 236} 237.neo_cta_standard.primary:hover { 238background-color: #7c6e18; 239color: #FFFFFF; 240} 241.neo_cta_standard.primary:active { 242background-color: #584f11; 243color: #FFFFFF; 244} 245 246.neo_cta_standard > i { 247margin-left: 10px; 248} 249 250.neo_cta_standard:disabled, .neo_cta_standard[disabled] {
251cursor: not-allowed; 252filter: saturate(.3); 253opacity: 0.8; 254} 255 256.neo_cta_standard.v_disabled { 257background-color: #1e1e1e; 258} 259 260.neo_cta_standard .loading-text, .neo_cta_standard .success-text { 261display:none; 262} 263 264.neo_cta_standard.v_loading { 265pointer-events: none; 266} 267.neo_cta_standard.v_loading { 268position: relative; 269} 270.neo_cta_standard .loading-text { 271display:none; 272} 273.neo_cta_standard.v_loading > *:not(i,.loading-text) { 274display:none; 275} 276.neo_cta_standard.v_loading > i { 277position: relative; 278height: 20px; 279width: 20px; 280} 281 282.neo_cta_standard.v_loading > i:before { 283content: none; 284} 285 286.neo_cta_standard.v_loading > i::after { 287content: ""; 288position: absolute; 289width: 100%; 290height: 100%; 291box-sizing: border-box; 292top: 0; 293left: 0; 294right: 0; 295bottom: 0; 296margin: auto; 297border: 0.25rem solid transparent; 298border-top-color: #ffffff; 299border-right-color: #ffffff; 300border-radius: 50%; 301animation: spinner .6s linear infinite; 302} 303.neo_cta_standard.v_loading .loading-text { 304display:block; 305} 306 307.neo_cta_standard.v_success { 308background-color: #00a651; 309} 310.neo_cta_standard.v_success > *:not(.success-text) { 311display:none; 312} 313.neo_cta_standard.v_success .success-text { 314display:block; 315} 316@keyframes button-loading-spinner { 317from { 318transform: rotate(0turn); 319} 320 321to { 322transform: rotate(1turn); 323} 324} 325 326@keyframes spinner { 327to { 328transform: rotate(360deg); 329} 330} 331 332#innerLoader, .innerLoader { 333height: 100%; 334display: flex; 335justify-content: center; 336align-items: center; 337min-height: 200px; 338} 339.neo_spin_loader { 340height: 60px; 341width: 60px; 342margin-bottom: 20px; 343} 344.neo_spin_loader:before { 345content: ""; 346box-sizing: border-box; 347position: absolute; 348width: 60px; 349height: 60px; 350border-radius: 50%; 351border: 3px solid #ccc; 352border-top-color: #b09d21; 353animation: spinner 1s linear infinite; 354} 355.neo_bgcolor_primary { 356background-color: #b09d21; 357} 358 359.neo_button_partyselector { 360border: 1px solid #b09d21; 361height: 40px; 362width: 40px; 363display: flex; 364justify-content: center; 365align-items: center; 366text-align: center; 367background: transparent; 368color: #b09d21; 369margin: 10px 0; 370transition: .2s ease-out; 371border-radius: 10px; 372font-size: 18px; 373cursor: pointer; 374 375} 376 377.neo_button_partyselector:hover { 378background-color: #e0d8a7; 379} 380 381.neo_button_partyselector:focus { 382box-shadow: 0 0 0 3px #f0ecd3; 383} 384 385.neo_button_partyselector:active { 386color: #000000; 387background: #b09d21; 388} 389 390.neo_partyselector_quantity { 391padding: 15px 10px; 392font-size: 18px; 393} 394 395.ChildrensAgeSelect { 396width: 100%; 397box-sizing: border-box; 398padding: 10px; 399margin-bottom: 10px; 400border-radius: 10px; 401border-color: #ccc; 402} 403 404.PartyTypeSimulator .px-mk-inputicon svg { 405height: 1.2em; 406width: 1.2em; 407fill: #aaa; 408} 409.neo_bgcolor_primary_text { 410color: #000000; 411} 412 413.neo_pxuser_mainbtn { 414height: 3.5rem; 415max-height: 100%; 416overflow: hidden; 417transition: .2s ease-out; 418border-radius: .5rem; 419cursor: pointer; 420padding: 0 0.5rem; 421background-color: white; 422color: black !important; 423} 424 425.neo_pxuser_mainbtn * { 426color: black !important; 427} 428 429.neo_pxuser_mainbtn:hover { 430background-color: #f2f2f2; 431} 432 433.neo_pxuser_avatar_container { 434height: 100%; 435width: 3rem; 436display: flex; 437justify-content: center; 438align-items: center; 439} 440 441.neo_pxuser_avatar_container img { 442height: 80%; 443border-radius: 2rem; 444} 445 446.neo_pxuser_text_block { 447padding: .5rem .5rem .5rem .5rem; 448box-sizing: border-box; 449height: 100%; 450justify-content: center; 451line-height: 1.5; 452} 453 454.neo_pxuser_icon_dd { 455padding: .5rem; 456box-sizing: border-box; 457} 458 459.neo_pxuser_dropdown { 460position: absolute; 461right: 0; 462top: 100% !important; 463background: white; 464border-radius: .25rem; 465min-width: 110%; 466box-shadow: 0 3px 6px rgba(0,0,0,.5); 467text-align: left; 468display: none !important; 469} 470 471.neo_pxuser_dropdown * { 472color: black !important; 473} 474 475.neo_pxuser_dropdown.open { 476display: flex !important; 477top: 100% !important; 478} 479 480.neo_pxuser_dd_button { 481padding: 1rem; 482transition: .2s ease-out; 483cursor: pointer; 484text-decoration: none; 485color: black; 486} 487 488.neo_pxuser_dd_button > .mdi { 489font-size: 1.2rem; 490line-height: 1; 491vertical-align: middle; 492display: inline-flex; 493width: 2rem; 494justify-content: center; 495align-items: center; 496height: 2rem; 497} 498 499.neo_pxuser_dd_button > span { 500padding: .5rem; 501display: inline-flex; 502flex-grow: 1; 503width: calc(100% - 3rem); 504} 505 506.neo_pxuser_dd_button:hover { 507background-color: #f2f2f2; 508border-radius: .25rem; 509} 510 511.neo_pxuser_email { 512 max-width: 8rem; 513 overflow: hidden; 514 text-overflow: ellipsis; 515} 516 517@media only screen and (max-width: 468px) { 518 519 .neo_pxuser_mainbtn { 520 flex-flow: row-reverse; 521 flex-grow: 1; 522 } 523 524 .neo_pxuser_icon_dd { 525 display: none; 526 } 527 528 .neo_pxuser_text_block { 529 text-align: right; 530 text-transform: none; 531 letter-spacing: initial; 532 color: black; 533 line-height: 1; 534 max-width: 50%; 535 } 536 537 .neo_pxuser_email { 538 display: none; 539 } 540 541 .neo_pxuser_container { 542 text-transform: initial; 543 letter-spacing: initial; 544 font-weight: normal; 545 font-size: .8rem; 546 } 547 548 .neo_pxuser_name { 549 font-weight: bold; 550 text-align: left; 551 white-space: nowrap; 552 overflow: hidden; 553 text-overflow: ellipsis; 554 display: flex; 555 align-items: center; 556 } 557 558 .neo_pxuser_name strong { 559 display: inline-block; 560 max-width: 150px; 561 overflow: hidden; 562 white-space: nowrap; 563 text-overflow: ellipsis; 564 vertical-align: middle; 565 line-height: 1.2; 566 } 567 568 .neo_pxuser_dd_button { 569 padding: .5rem; 570 } 571 572 573}</style> 574 575 576
577<script type="application/ld+json" defer async> 578{ 579 "url" : "https:\/\/www.sanremohoteles.com\/pt\/", 580 "telephone": "+54 9 223 417 2848", 581 "description" : "Somos una cadena hotelera con 56 a\u00f1os de trayectoria que avalan nuestra experiencia en el servicio al hu\u00e9sped.", 582 "name" : "Home - San Remo Hoteles", 583 "logo" : "https:\/\/images-new.pxsol.com\/BJEPhNpVdEnVxWSk3IB3nOgtC4ZnU8fWWDVAfHZd6O8\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png", 584 "image" : "https:\/\/images-new.pxsol.com\/X2asHAcuZ24vQ_a8xAP7c69KsZT3avCBkHzDnE0uc3M\/rs:fill:630:430:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F17192626940e9e7e7cb10828bce348612de95523245.jpg@jpg", 585 "@type" : "Hotel", 586 "address" : { 587 "postalCode" : "0", 588 "streetAddress" : "Completar con la dirección de su establecimiento, 0 Ciudad, Capital, Mendoza, Argentina", 589 "addressCountry" : "Argentina", 590 "addressRegion" : "Mendoza", 591 "addressLocality" : "Ciudad, Capital", 592 "@type" : "PostalAddress" 593 }, 594 "geo": { 595 "@type": "GeoCoordinates", 596 "latitude": 0, 597 "longitude": 0 }, 598 "@context" : "http://schema.org" 599 } 600</script>
600 601 602<!-- Organization Schema for Brand/Logo SEO -->
603<script type="application/ld+json"> 604{ 605 "@context": "https://schema.org", 606 "@type": "Organization", 607 "name": "Home - San Remo Hoteles", 608 "url": "https:\/\/www.sanremohoteles.com\/pt\/", 609 "logo": "https:\/\/images-new.pxsol.com\/BJEPhNpVdEnVxWSk3IB3nOgtC4ZnU8fWWDVAfHZd6O8\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png", 610 "image": "https:\/\/images-new.pxsol.com\/BJEPhNpVdEnVxWSk3IB3nOgtC4ZnU8fWWDVAfHZd6O8\/rs:fill:512:512:1\/q:80\/plain\/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"} 611</script>
611 612 613 614 615 <link rel="icon" sizes="192x192" href="https://images-new.pxsol.com/SvryX25ZdDr538yVWjo1QawJBoBNmpkArqcR1f-qCec/rs:fill:192:192:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F5126930364ea8a9a40b647af1c2cabae351ef5e772.png@png"> 616 <link rel="icon" type="image/png" href="https://files-p.pxsol.com/13307/company/library/user/5126930364ea8a9a40b647af1c2cabae351ef5e772.png" /> 617 <!-- CustomHTMLHead (SiteJson) --><link rel="preconnect" href="https://fonts.googleapis.com"> 618<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 619<link href="https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap" rel="stylesheet"> <!-- Pos->Type: hotel.css --> 620 621<!-- Google tag (gtag.js) GA4 PXSOL TODOS LOS HOTELES -->
622<script> 623 window.dataLayer = window.dataLayer || []; 624 function gtag(){dataLayer.push(arguments);} 625 gtag('js', new Date()); 626</script>
vendor: 64 bytes, lines 626-627
626 627<script async src="https://www.googletagmanager.com/gtag/js?id=
627G-SYSQR6EL6E
vendor: 12 bytes, line 627
627"></script>
628<script> 629 let globalSessionGA4Config = { 630 'pos': 'Sanremohoteles', 631 'product_id': '19322', 632 'product_name': 'San Remo Hoteles', 633 'product_country': 'Argentina', 634 'product_state': 'Mendoza', 635 'product_plaza': 'Ciudad, Capital', 636 'product_score': '' 637 }; 638 639 gtag('config', 'G-2CG83MMWR8', globalSessionGA4Config); 640 641 gtag('config', 'G-SYSQR6EL6E', globalSessionGA4Config); 642 643 644 // Mirror page_view into dataLayer for GTM debug (guard to avoid duplicates) 645 if (!window.__dl_page_view_pushed) { 646 window.dataLayer.push({ event: 'page_view' }); 647 window.__dl_page_view_pushed = true; 648 } 649 650 651</script>
651 652 653<!-- Global site tag (gtag.js) -->
vendor: 64 bytes, lines 653-654
653 654<script async src="https://www.googletagmanager.com/gtag/js?id=
654UA-34517567-10
vendor: 12 bytes, line 654
654"></script>
655<script> 656 window.dataLayer = window.dataLayer || []; 657 658 function gtag() { 659 dataLayer.push(arguments); 660 try { 661 var args = Array.prototype.slice.call(arguments); 662 if (args[0] === 'event') { 663 var dlEventName = args[1]; 664 var dlParams = (args.length > 2 && typeof args[2] === 'object') ? args[2] : {}; 665 var dlObject = {}; 666 for (var key in dlParams) { 667 if (Object.prototype.hasOwnProperty.call(dlParams, key)) { 668 dlObject[key] = dlParams[key]; 669 } 670 } 671 dlObject.event = dlEventName; 672 window.dataLayer.push(dlObject); 673 674 // Intercept add_to_cart and fire form_success after it 675 if (dlEventName === 'add_to_cart') { 676 setTimeout(function() { 677 console.log('%c[pxTrack] ð FIRING form_success for add_to_cart', 'color: #4CAF50; font-weight: bold;'); 678 window.pxTrack('form_success', { 679 form_id: 'add_to_cart', 680 lead_id: null, 681 transaction_id: null 682 }); 683 }, 100); 684 } 685 } 686 } catch (e) {} 687 } 688 gtag('js', new Date()); 689 690 gtag('config', 'G-2CG83MMWR8'); 691 692 gtag('config', 'UA-34517567-10'); 693 694 695 </script>
695 696 697<!-- Pxsol Data Layer utilities and event wiring -->
698<script> 699 (function() { 700 // DEBUG: Confirm script is loaded and updated 701 console.log('%c[pxTrack] Script loaded - Version: 2025-01-15-no-inventory-v3-rate-limit-fix', 'color: #4CAF50; font-weight: bold; font-size: 12px;'); 702 703 // Define manual scan function globally FIRST (before any other code that might fail) 704 window.__px_manual_no_inventory_scan = function() { 705 console.log('[pxTrack] Manual scan triggered'); 706 if (window.__px_no_inventory_scan_func) { 707 return window.__px_no_inventory_scan_func(); 708 } else { 709 console.warn('[pxTrack] Watcher not initialized yet. Performing basic scan...'); 710 // Perform basic scan even if watcher not initialized 711 try { 712 var hasNoInventory = false; 713 var detectionMethod = ''; 714 715 // Check DOM elements 716 var noInventoryContainer = document.querySelector('#no-inventory-container'); 717 var noInventoryElement = document.querySelector('#no-inventory'); 718 if (noInventoryContainer || noInventoryElement) { 719 hasNoInventory = true; 720 detectionMethod = 'DOM element (ID)'; 721 console.log('[pxTrack] â Found #no-inventory-container or #no-inventory'); 722 } 723 724 // Check px_jsonQuery 725 if (!hasNoInventory && typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 726 var jsonQuery = window.px_jsonQuery; 727 if (jsonQuery.ProductList && Array.isArray(jsonQuery.ProductList) && jsonQuery.ProductList.length > 0) { 728 var allZero = true; 729 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 730 var product = jsonQuery.ProductList[i]; 731 var productAvail = product.Availability || 0; 732 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 733 for (var j = 0; j < product.SkuList.length; j++) { 734 if (product.SkuList[j].Availability && product.SkuList[j].Availability > 0) { 735 allZero = false; 736 break; 737 } 738 } 739 } else if (productAvail > 0) { 740 allZero = false; 741 } 742 if (!allZero) break; 743 } 744 if (allZero) { 745 hasNoInventory = true; 746 detectionMethod = 'Json_Query'; 747 console.log('[pxTrack] â All products have Availability === 0'); 748 } 749 } 750 } 751 752 if (hasNoInventory && !window.__px_no_inventory_pushed) { 753 console.log('[pxTrack] ð FIRING no_inventory event manually - Method:', detectionMethod); 754 window.__px_no_inventory_pushed = true; 755 var params = {}; 756 try { 757 // Try to get search params 758 var startRaw = (document.querySelector('#fechaingreso') || {}).value || ''; 759 var endRaw = (document.querySelector('#fechaegreso') || {}).value || ''; 760 params.start_date = startRaw; 761 params.end_date = endRaw; 762 params.no_inventory = true; 763 } catch(e) {} 764 window.pxTrack('no_inventory', params); 765 766 // Fire form_success for search form after no_inventory 767 setTimeout(function() { 768 console.log('%c[pxTrack] ð FIRING form_success for search form (after manual no_inventory)', 'color: #4CAF50; font-weight: bold;'); 769 window.pxTrack('form_success', { 770 form_id: 'pxmk_searchform', 771 lead_id: null, 772 transaction_id: null 773 }); 774 }, 100); 775 776 return { fired: true, method: detectionMethod, params: params }; 777 } else if (hasNoInventory) { 778 return { already_fired: true, method: detectionMethod }; 779 } else { 780 return { no_inventory_detected: false, px_jsonQuery_exists: typeof window.px_jsonQuery !== 'undefined' }; 781 } 782 } catch(e) { 783 console.error('[pxTrack] Error in manual scan:', e); 784 return { error: 'Scan failed', message: e.message }; 785 } 786 } 787 }; 788 789 window.dataLayer = window.dataLayer || []; 790 791 // Helper that tracks to both GA4 and dataLayer 792 if (!window.pxTrack) { 793 window.pxTrack = function(eventName, params) { 794 params = params || {}; 795 try { gtag('event', eventName, params); } catch(e) {} 796 try { 797 var dl = {}; 798 for (var k in params) if (Object.prototype.hasOwnProperty.call(params, k)) dl[k] = params[k]; 799 dl.event = eventName; 800 window.dataLayer.push(dl); 801 } catch(e) {} 802 }; 803 } 804 805 // Privacy-safe booleans for PII presence 806 function bool(val) { return !!val; } 807 808 // Read URL param 809 function getUrlParam(name) {
810 try { 811 var params = new URLSearchParams(location.search); 812 return params.get(name) || ''; 813 } catch (e) { return ''; } 814 } 815 816 // Normalize common date formats to YYYY-MM-DD (best-effort) 817 function normalizeDate(value) { 818 try { 819 if (!value) return ''; 820 var v = String(value).trim(); 821 // dd/mm/yyyy -> yyyy-mm-dd 822 if (/^\d{2}\/\d{2}\/\d{4}$/.test(v)) { 823 var p = v.split('/'); 824 return [p[2], p[1].padStart(2, '0'), p[0].padStart(2, '0')].join('-'); 825 } 826 // Already ISO 827 if (/^\d{4}-\d{2}-\d{2}$/.test(v)) return v; 828 return v; 829 } catch (e) { 830 return String(value || ''); 831 } 832 } 833 834 // Session id generator 835 function getPxSessionId() { 836 try { 837 var key = 'px_session_id'; 838 var match = document.cookie.match(new RegExp('(^| )' + key + '=([^;]+)')); 839 if (match) return match[2]; 840 var id = (crypto && crypto.randomUUID) ? crypto.randomUUID() : String(Date.now()) + '_' + Math.floor(Math.random()*1e9); 841 document.cookie = key + '=' + id + ';path=/;max-age=' + (60*60*24*365).toString(); 842 return id; 843 } catch(e) { 844 return 'sid_' + String(Date.now()); 845 } 846 } 847 848 // Expose chat helpers (to be called from chat widget) 849 window.pxChatOpen = function(payload) { window.pxTrack('chat_open', payload || {}); }; 850 window.pxChatMessage = function(payload) { window.pxTrack('chat_message', payload || {}); }; 851 window.pxChatClose = function(payload) { window.pxTrack('chat_close', payload || {}); }; 852 window.pxFormSuccess = function(payload) { window.pxTrack('form_success', payload || {}); }; 853 window.pxNoInventory = function(payload) { window.pxTrack('no_inventory', payload || { no_inventory: true }); }; 854 855 // Context payload from PHP (best-effort) 856 var pxContext = { 857 pos: 'Sanremohoteles', 858 product_id: '19322', 859 product_name: 'San Remo Hoteles', 860 product_country: 'Argentina', 861 product_state: 'Mendoza', 862 product_plaza: 'Ciudad, Capital', 863 search_id: '', 864 start_date: '', 865 end_date: '', 866 transaction_id: '', 867 value: null, 868 currency: '', 869 page_url: location.href, 870 session_id: getPxSessionId() 871 }; 872 873 // --- External engine redirect auto event when engine is disabled --- 874 875 876 // Adults/children/rooms best-effort totals from PHP when available 877 pxContext.adults = 0; 878 pxContext.children = 0; 879 pxContext.rooms = 0; 880 881 // Push context for GTM usage 882 try { window.dataLayer.push(Object.assign({ event: 'px_context' }, pxContext)); } catch(e) {} 883 884 // Boot event para validar integración en DebugView/GTM 885 if (!window.__px_boot_pushed) { 886 window.__px_boot_pushed = true; 887 window.pxTrack('px_layer_ready', { 888 session_id: pxContext.session_id, 889 page_url: pxContext.page_url, 890 pos: pxContext.pos || '', 891 product_id: pxContext.product_id || '', 892 search_id: pxContext.search_id || '', 893 ts: Date.now() 894 }); 895 } 896 897 // ----- Search events wiring (V3/V8) ----- 898 function getSearchParamsFromDOM() { 899 var startRaw = (document.querySelector('.neo_marketplace_buscador_v3 #fechaingreso') || 900 document.querySelector('#fechaingreso') || 901 document.querySelector('[name="Start"]') || 902 document.querySelector('#Start') || { }).value || pxContext.start_date || ''; 903 var endRaw = (document.querySelector('.neo_marketplace_buscador_v3 #fechaegreso') || 904 document.querySelector('#fechaegreso') || 905 document.querySelector('[name="End"]') || 906 document.querySelector('#End') || { }).value || pxContext.end_date || ''; 907 var sidRaw = (document.querySelector('#SearchID') || { }).value || getUrlParam('SearchID') || pxContext.search_id || ''; 908 var params = { 909 start_date: normalizeDate(startRaw) || '', 910 end_date: normalizeDate(endRaw) || '', 911 pos: pxContext.pos || '', 912 hotel_id: pxContext.product_id || '', 913 page_url: location.href, 914 session_id: pxContext.session_id 915 };
916 if (sidRaw) params.search_id = sidRaw; 917 // Adults/children from UI if present 918 try { 919 var adultsEl = document.querySelector('.neo_partyselector_quantity[party-type="adults"]'); 920 var childrenEl = document.querySelector('.neo_partyselector_quantity[party-type="children"]'); 921 if (adultsEl) params.adults = Number(adultsEl.getAttribute('val') || adultsEl.textContent) || pxContext.adults || 0; 922 if (childrenEl) params.children = Number(childrenEl.getAttribute('val') || childrenEl.textContent) || pxContext.children || 0; 923 // Fallback from hidden GroupsForm if exists 924 if ((!params.adults || !params.children) && document.querySelector('#GroupsForm')) { 925 var gf = document.querySelector('#GroupsForm').value || ''; 926 var rooms = 0, adults = 0, children = 0; 927 if (gf) { 928 gf.split(';').forEach(function(groupStr){ 929 if (!groupStr) return; 930 rooms += 1; 931 var parts = groupStr.split(':'); 932 if (parts.length < 2) return; 933 var trio = parts[1].split(','); 934 var a = parseInt(trio[0] || '0', 10); 935 adults += isNaN(a) ? 0 : a; 936 var childrenAges = (trio[1] || '0'); 937 if (childrenAges && childrenAges !== '0') { 938 children += childrenAges.split('.').filter(Boolean).length; 939 } 940 }); 941 if (!params.adults) params.adults = adults; 942 if (!params.children) params.children = children; 943 if (!params.rooms) params.rooms = rooms; 944 } 945 } 946 } catch(e) {} 947 return params; 948 } 949 950 // -- Estado COMPARTIDO del throttle de `search_modify` -------------------------------- 951 // Vive FUERA de las funciones de cableado a proposito: `wireSearchEventsWhenReady()` puede 952 // re-ejecutar `wireSearchEvents()` varias veces hasta enganchar el buscador que llega por 953 // AJAX, y con el throttle dentro del cierre cada invocacion tenia su propia ventana de 1 s 954 // => dos cableados equivalentes podian emitir el mismo cambio dos veces. 955 var pxLastModifyMs = 0; 956 var pxLastSnapshot = null; 957 958 function getModifySnapshot() { 959 var p = getSearchParamsFromDOM(); 960 return { 961 start_date: p.start_date || '', 962 end_date: p.end_date || '', 963 rooms: (p.rooms*1) || 0, 964 adults: (p.adults*1) || 0, 965 children: (p.children*1) || 0 966 }; 967 } 968 function pushModifyFlagsIfChanged(prevSnap, nextSnap) { 969 try { 970 if (!prevSnap) return true; 971 var changes = {}; 972 if (nextSnap.start_date !== prevSnap.start_date) changes.start_date = true; 973 if (nextSnap.end_date !== prevSnap.end_date) changes.end_date = true; 974 if ((nextSnap.rooms*1) !== (prevSnap.rooms*1)) changes.rooms = true; 975 if ((nextSnap.adults*1) !== (prevSnap.adults*1)) changes.adults = true; 976 if ((nextSnap.children*1) !== (prevSnap.children*1)) changes.children = true; 977 if (Object.keys(changes).length) return true; 978 } catch (e) {} 979 return false; 980 } 981 function throttledModifyFire() { 982 var now = Date.now(); 983 if (now - pxLastModifyMs < 1000) return; // throttle to 1s 984 pxLastModifyMs = now; 985 var current = getModifySnapshot(); 986 // Push GA/DataLayer event with current values 987 window.pxTrack('search_modify', getSearchParamsFromDOM()); 988 // Also push a probe event with the current values for GTM debug 989 try { 990 window.dataLayer.push({ 991 event: 'px_search_modify_probe', 992 search_modify: current, 993 ts: Date.now() 994 }); 995 } catch(e) {} 996 // Update snapshot only if something changed 997 if (pushModifyFlagsIfChanged(pxLastSnapshot, current)) { 998 pxLastSnapshot = current; 999 } 1000 } 1001 1002 /** 1003 * Respaldos de `search_modify` que NO dependen de que el buscador exista en el DOM: 1004 * listeners DELEGADOS en `document` (captura) + un poller de 400 ms sobre 1005 * `#fechaingreso`/`#fechaegreso`/`#GroupsForm`. 1006 * 1007 * OJO: se instalan SIEMPRE en el init, sin pasar por `searchDomPresent()` ni por el tope de 1008 * 20 s del watcher -- que es exactamente como se instalaban antes, cuando `wireSearchEvents()` 1009 * se llamaba incondicionalmente. Justamente por ser delegados/poll son los que hacen que 1010 * `search_modify` funcione sobre un buscador inyectado por AJAX: meterlos detras del 1011 * reintento dejaba sin ningun listener a las sesiones donde el buscador tarda mas de 20 s 1012 * (telefono con red lenta), que ANTES si los tenian. 1013 */ 1014 function wireSearchFallbacks() { 1015 if (window.__px_search_fallbacks_wired) return; 1016 window.__px_search_fallbacks_wired = true; 1017 pxLastSnapshot = getModifySnapshot(); 1018 // Debug: signal that search watchers are alive
1019 try { 1020 window.dataLayer.push({ 1021 event: 'px_search_watchers_ready', 1022 ts: Date.now() 1023 }); 1024 } catch(e) {} 1025 // Listeners delegados (capturan aunque el DOM se re-renderice) 1026 try { 1027 if (!window.__px_global_search_listeners) { 1028 window.__px_global_search_listeners = true; 1029 var selectorList = ['#fechaingreso','#fechaegreso','.AdultsSelect','.ChildrensSelect','.neo_partyselector_quantity','.ChildrensAgeSelect']; 1030 function matchesTracked(el) { 1031 try { return selectorList.some(function(sel){ return el && el.matches && el.matches(sel); }); } catch(e) { return false; } 1032 } 1033 document.addEventListener('change', function(e){ if (matchesTracked(e.target)) throttledModifyFire(); }, true); 1034 document.addEventListener('input', function(e){ if (matchesTracked(e.target)) throttledModifyFire(); }, true); 1035 document.addEventListener('click', function(e){ 1036 var t = e.target; 1037 if (t && t.classList && t.classList.contains('neo_button_partyselector')) throttledModifyFire(); 1038 }, true); 1039 } 1040 } catch(e) {} 1041 // Robust watchers for datepicker-driven value changes and hidden GroupsForm updates 1042 try { 1043 if (!window.__px_modify_watchers_started) { 1044 window.__px_modify_watchers_started = true; 1045 var lastIn = (document.querySelector('#fechaingreso') || {}).value || ''; 1046 var lastOut = (document.querySelector('#fechaegreso') || {}).value || ''; 1047 var lastGF = (document.querySelector('#GroupsForm') || {}).value || ''; 1048 setInterval(function(){ 1049 try { 1050 var inEl = document.querySelector('#fechaingreso'); 1051 var outEl = document.querySelector('#fechaegreso'); 1052 var gfEl = document.querySelector('#GroupsForm'); 1053 var curIn = inEl ? inEl.value : ''; 1054 var curOut = outEl ? outEl.value : ''; 1055 var curGF = gfEl ? gfEl.value : ''; 1056 if (curIn !== lastIn || curOut !== lastOut || curGF !== lastGF) { 1057 lastIn = curIn; lastOut = curOut; lastGF = curGF; 1058 throttledModifyFire(); 1059 } 1060 } catch(e) {} 1061 }, 400); 1062 } 1063 } catch(e) {} 1064 } 1065 1066 /** 1067 * SOLO los cableados que necesitan el nodo del buscador en el DOM: `search_open` (existe el 1068 * contenedor) y `search_submit` (existe el form). Los reintenta `wireSearchEventsWhenReady()`. 1069 * 1070 * OJO: ya NO cuelga listeners de `search_modify` del contenedor. Eran un duplicado EXACTO de 1071 * los delegados de `wireSearchFallbacks()` (la misma lista de 6 selectores y el mismo click 1072 * sobre `.neo_button_partyselector`). Mientras esta funcion corria una sola vez compartian el 1073 * cierre -- y con el el throttle -- asi que no se notaba; con el reintento podian quedar en 1074 * invocaciones distintas y contar el mismo cambio dos veces. 1075 */ 1076 function wireSearchEvents() { 1077 var searchForm = document.querySelector('.neo_marketplace_buscador_v3 #pxmk_searchform') || document.querySelector('#search_form'); 1078 var searchContainer = document.querySelector('.neo_marketplace_buscador_v3') || document.querySelector('.px-mk-buscador-container') || document.querySelector('#search_form') || document.querySelector('.PartyTypeSimulatorContainer'); 1079 1080 if (searchContainer && !window.__px_search_container_bound) { 1081 window.__px_search_container_bound = true; 1082 // fire search_open once 1083 if (!window.__px_search_open_pushed) { 1084 window.__px_search_open_pushed = true; 1085 window.pxTrack('search_open', { page_url: location.href }); 1086 } 1087 } 1088 1089 if (searchForm && !window.__px_search_form_bound) { 1090 window.__px_search_form_bound = true; 1091 searchForm.addEventListener('submit', function() { 1092 window.pxTrack('search_submit', getSearchParamsFromDOM()); 1093 }, true); 1094 var searchBtn = document.querySelector('.neo_marketplace_buscador_v3 #PxMkAcion_Search') || document.querySelector('#Acion_Search'); 1095 if (searchBtn) { 1096 searchBtn.addEventListener('click', function() {
1097 window.pxTrack('search_submit', getSearchParamsFromDOM()); 1098 }, true); 1099 } 1100 } 1101 } 1102 1103 /** 1104 * El buscador NO existe al DOMContentLoaded en NINGUNA `lp.html`: lo inyecta por AJAX 1105 * `neo_modules/lp_cart.php` (CargarModulo) cientos de ms despues. `wireSearchEvents()` se 1106 * cableaba UNA sola vez, asi que sus dos gates de DOM evaluaban null y no se emitian nunca 1107 * `search_open` (gate `if (searchContainer)`) ni `search_submit` (gate `if (searchForm)`), 1108 * ni `start_search`/`egreso_search` (`wireDatePickers`). Sólo disparaban en las HOME 1109 * server-rendered, donde el buscador viene en el HTML inicial. 1110 * 1111 * Medido en vivo el 2026-08-21 sobre `fincaogawa.reservadirecto.com/lp.html`: los 6 1112 * selectores del buscador estan en 0 en DOMContentLoaded (1389 ms) y en load (2369 ms), y 1113 * recien aparecen a los ~3010 ms; un click en el submit real (`#Acion_Search`) generaba 1114 * SearchID y `has_inventory`, pero CERO `search_submit`. 1115 * 1116 * `has_inventory`/`no_inventory` nunca sufrieron esto porque cuelgan de una cascada de scans 1117 * + MutationObserver (`wireNoInventoryWatcher` / `observeAvailabilityContainers`), no de un 1118 * cableado one-shot. Esta funcion aplica esa MISMA tecnica a la fam
1118ilia de busqueda. 1119 * 1120 * Se apaga sola en cuanto engancha el contenedor y el form (los dos productores de 1121 * `search_open`/`search_submit`), con tope duro de 20 s. Cada bind es idempotente por su 1122 * propia guarda global, asi que re-correr no duplica ni un listener ni un evento. 1123 */ 1124 function searchDomPresent() { 1125 try { 1126 return !!(document.querySelector('.neo_marketplace_buscador_v3') 1127 || document.querySelector('.px-mk-buscador-container') 1128 || document.querySelector('#search_form') 1129 || document.querySelector('.PartyTypeSimulatorContainer') 1130 || document.querySelector('#fechaingreso')); 1131 } catch (e) { return false; } 1132 } 1133 function wireSearchEventsWhenReady() { 1134 if (window.__px_search_ready_watcher) return; 1135 window.__px_search_ready_watcher = true; 1136 var mo = null; 1137 var stopped = false; 1138 function stop() { 1139 if (stopped) return; 1140 stopped = true; 1141 if (mo) { try { mo.disconnect(); } catch (e) {} mo = null; } 1142 } 1143 function attempt() { 1144 if (stopped) return; 1145 // Chequeo barato primero: sin buscador en el DOM no se toca nada. Evita correr 1146 // `wireSearchEvents()` (que lee bastante DOM) en cada mutacion de una pagina sin motor. 1147 if (!searchDomPresent()) return; 1148 if (!window.__px_search_container_bound || !window.__px_search_form_bound) { 1149 try { wireSearchEvents(); } catch (e) {} 1150 } 1151 if (!window.__px_date_pickers_bound) { 1152 try { wireDatePickers(); } catch (e) {} 1153 } 1154 if (window.__px_search_container_bound && window.__px_search_form_bound) stop(); 1155 } 1156 attempt(); 1157 if (stopped) return; 1158 [200, 500, 1000, 2000, 3000, 5000, 8000, 12000].forEach(function(ms){ 1159 setTimeout(attempt, ms); 1160 }); 1161 setTimeout(stop, 20000); 1162 if ('MutationObserver' in window && document.body) { 1163 try { 1164 mo = new MutationObserver(function(){ 1165 if (stopped || mo.__px_scheduled) return; 1166 mo.__px_scheduled = true; 1167 setTimeout(function(){ if (mo) { mo.__px_scheduled = false; } attempt(); }, 100); 1168 }); 1169 mo.observe(document.body, { childList: true, subtree: true }); 1170 } catch (e) { mo = null; } 1171 } 1172 } 1173 1174 // ----- Form events wiring (generic) ----- 1175 function wireFormEvents() { 1176 var forms = Array.prototype.slice.call(document.querySelectorAll('form:not([data-px-ignore="true"])')); 1177 var observed = new WeakSet(); 1178 1179 // form_view when enters viewport first time 1180 if ('IntersectionObserver' in window) { 1181 var io = new IntersectionObserver(function(entries) { 1182 entries.forEach(function(entry) { 1183 if (entry.isIntersecting && !observed.has(entry.target)) { 1184 observed.add(entry.target); 1185 window.pxTrack('form_view', { 1186 form_id: entry.target.id || entry.target.getAttribute('name') || 'form', 1187 page_url: location.href 1188 }); 1189 } 1190 }); 1191 }, { threshold: 0.2 }); 1192 forms.forEach(function(f){ io.observe(f); }); 1193 } else { 1194 forms.forEach(function(f){ 1195 window.pxTrack('form_view', { form_id: f.id || f.getAttribute('name') || 'form', page_url: location.href }); 1196 }); 1197 } 1198 1199 // form_interaction on field focus 1200 document.addEventListener('focusin', function(e) { 1201 var field = e.target; 1202 var form = field.form; 1203 if (!form) return; 1204 var fieldName = field.name || field.id || field.type || 'field'; 1205 try { 1206 if (field.classList && field.classList.contains('neo_partyselector_quantity')) { 1207 var pt = field.getAttribute('party-type'); 1208 if (pt) fieldName = 'party_' + pt; 1209 } 1210 } catch(e) {} 1211 window.pxTrack('form_interaction', { 1212 form_id: form.id || form.getAttribute('name') || 'form', 1213 field_name: fieldName 1214 }); 1215 }); 1216 1217 // form_submit with privacy-safe flags 1218 forms.forEach(function(form) { 1219 form.addEventListener('submit', function() { 1220 var email = form.querySelector('input[type="email"]'); 1221 var phone = form.querySelector('input[type="tel"], input[name*="phone"], input[name*="telefono"]'); 1222 var required = Array.prototype.slice.call(form.querySelectorAll('[required]')); 1223 var incomplete = required.some(function(el){ return !el.value; }); 1224 window.pxTrack('form_submit', { 1225 form_id: form.id || form.getAttribute('name') || 'form', 1226 page_url: location.href, 1227 fields_status: incomplete ? 'incompletos' : 'completos', 1228 email_provided: bool(email && email.value), 1229 phone_provided: bool(phone && phone.value), 1230 session_id: pxContext.session_id 1231 }); 1232 }, true); 1233 }); 1234 } 1235 // Extra: map clicks/changes on party selector controls to meaningful field_name 1236 (function wirePartySelectorInteractions(){
1237 try { 1238 var lastMs = 0; 1239 function pushPartyInteraction(partyType) { 1240 var now = Date.now(); 1241 if (now - lastMs < 400) return; 1242 lastMs = now; 1243 var form = document.querySelector('#search_form') || document.querySelector('.neo_marketplace_buscador_v3 #pxmk_searchform'); 1244 window.pxTrack('form_interaction', { 1245 form_id: form ? (form.id || form.getAttribute('name') || 'form') : 'form', 1246 field_name: partyType ? ('party_' + partyType) : 'party_selector' 1247 }); 1248 } 1249 document.addEventListener('click', function(e){ 1250 var t = e.target; 1251 if (t && t.classList && t.classList.contains('neo_button_partyselector')) { 1252 pushPartyInteraction(t.getAttribute('party-type') || ''); 1253 } 1254 }, true); 1255 document.addEventListener('change', function(e){ 1256 var t = e.target; 1257 if (t && t.classList && t.classList.contains('neo_partyselector_quantity')) { 1258 pushPartyInteraction(t.getAttribute('party-type') || ''); 1259 } 1260 }, true); 1261 document.addEventListener('input', function(e){ 1262 var t = e.target; 1263 if (t && t.classList && t.classList.contains('neo_partyselector_quantity')) { 1264 pushPartyInteraction(t.getAttribute('party-type') || ''); 1265 } 1266 }, true); 1267 } catch(e) {} 1268 })(); 1269 1270 // Fire specific date interactions (optional) 1271 function wireDatePickers() { 1272 if (window.__px_date_pickers_bound) return; 1273 var inEl = document.querySelector('.neo_marketplace_buscador_v3 #fechaingreso'); 1274 var outEl = document.querySelector('.neo_marketplace_buscador_v3 #fechaegreso'); 1275 // Todavia no llego el buscador: NO se marca como cableado, lo reintenta 1276 // `wireSearchEventsWhenReady()`. 1277 if (!inEl && !outEl) return; 1278 window.__px_date_pickers_bound = true; 1279 if (inEl) inEl.addEventListener('change', function(){ window.pxTrack('start_search', { start_search: inEl.value || '', page_url: location.href }); }); 1280 if (outEl) outEl.addEventListener('change', function(){ window.pxTrack('egreso_search', { egreso_search: outEl.value || '', page_url: location.href }); }); 1281 } 1282 1283 // ----- WhatsApp click tracking (GA4/dataLayer + Meta Pixel "Contact") ----- 1284 // El cliente pidió medir el clic en el botón de WhatsApp como una conversión más. 1285 // Se replica el patrón del resto de los eventos (window.pxTrack -> gtag + dataLayer) y, 1286 // si el POS tiene el pixel cargado (FacebookPixelID), se dispara el evento estándar "Contact". 1287 function wireWhatsappClick() { 1288 if (window.__px_whatsapp_wired) return; 1289 window.__px_whatsapp_wired = true; 1290 1291 var companyId = ''; 1292 var lastWaMs = 0; 1293 1294 function extractPhone(href) { 1295 try { 1296 var m = href.match(/[?&]phone=(\+?\d+)/i); 1297 if (m) return m[1]; 1298 m = href.match(/wa\.me\/(\+?\d+)/i); 1299 if (m) return m[1]; 1300 } catch (e) {} 1301 return ''; 1302 } 1303 1304 // Cualquier <a> hacia WhatsApp (api./web.whatsapp.com o wa.me), incluidos los botones 1305 // flotantes .wsp_floating (neo_social_links / standard_lp_motor) y #checkout_wsp_floating. 1306 function findWhatsappLink(el) { 1307 try { 1308 if (!el || !el.closest) return null; 1309 var a = el.closest('a'); 1310 if (!a) return null; 1311 var href = (a.getAttribute('href') || '').toLowerCase(); 1312 if (/(?:api\.|web\.)?whatsapp\.com|wa\.me/.test(href)) return a; 1313 if (a.closest('.wsp_floating') || a.closest('#checkout_wsp_floating')) return a; 1314 } catch (e) {} 1315 return null; 1316 } 1317 1318 // Delegado en captura: se dispara aunque el módulo re-renderice el botón (los .wsp_floating 1319 // se re-inyectan/mueven al body). target="_blank" mantiene la página viva para los beacons. 1320 document.addEventListener('click', function (e) { 1321 var link = findWhatsappLink(e.target); 1322 if (!link) return; 1323 var now = Date.now(); 1324 if (now - lastWaMs < 800) return; // dedupe de doble-disparo 1325 lastWaMs = now; 1326 1327 var href = link.getAttribute('href') || ''; 1328 var phone = extractPhone(href); 1329 var payload = { 1330 phone: phone, 1331 destination_url: href, 1332 pos: pxContext.pos || '', 1333 product_id: pxContext.product_id || '', 1334 product_name: pxContext.product_name || '', 1335 company_id: companyId || '', 1336 search_id: pxContext.search_id || '', 1337 currency: pxContext.currency || '', 1338 page_url: location.href, 1339 session_id: pxContext.session_id 1340 }; 1341 1342 // GA4 + dataLayer (Google y GTM) 1343 window.pxTrack('whatsapp_click', payload); 1344 1345 // Meta Pixel: evento estándar "Contact". fbq solo existe si el POS tiene FacebookPixelID 1346 // (se inicializa en Conversion_SearchOK.php / PageView), asà que este typeof es el guard. 1347 try { 1348 if (typeof window.fbq === 'function') { 1349 window.fbq('track', 'Contact', { content_name: 'whatsapp', content_category: 'whatsapp_click' }); 1350 } 1351 } catch (e) {} 1352 }, true); 1353 } 1354
1355 // Enrich context from hidden inputs present in LP/consultas templates 1356 function enhanceContextFromHiddenInputs() { 1357 var startRaw = (document.querySelector('#Start') || 1358 document.querySelector('#fechaingreso') || 1359 document.querySelector('[name="Start"]') || { }).value || ''; 1360 var endRaw = (document.querySelector('#End') || 1361 document.querySelector('#fechaegreso') || 1362 document.querySelector('[name="End"]') || { }).value || ''; 1363 var start = normalizeDate(startRaw); 1364 var end = normalizeDate(endRaw); 1365 var sid = (document.querySelector('#SearchID') || {}).value || ''; 1366 var gf = (document.querySelector('#GroupsForm') || {}).value || ''; 1367 var rooms = 0, adults = 0, children = 0; 1368 if (gf) { 1369 gf.split(';').forEach(function(groupStr){ 1370 if (!groupStr) return; 1371 rooms += 1; 1372 var parts = groupStr.split(':'); 1373 if (parts.length < 2) return; 1374 var trio = parts[1].split(','); 1375 var a = parseInt(trio[0] || '0', 10); 1376 adults += isNaN(a) ? 0 : a; 1377 var childrenAges = (trio[1] || '0'); 1378 if (childrenAges && childrenAges !== '0') { 1379 children += childrenAges.split('.').filter(Boolean).length; 1380 } 1381 }); 1382 } 1383 var updated = {}; 1384 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1385 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1386 if (sid && sid !== pxContext.search_id) { pxContext.search_id = sid; updated.search_id = sid; } 1387 if (adults && adults !== pxContext.adults) { pxContext.adults = adults; updated.adults = adults; } 1388 if (children && children !== pxContext.children) { pxContext.children = children; updated.children = children; } 1389 if (rooms && rooms !== pxContext.rooms) { pxContext.rooms = rooms; updated.rooms = rooms; } 1390 if (Object.keys(updated).length) { 1391 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1392 } 1393 } 1394 1395 // Parse GroupsForm like "1:2,0,0;1:1,5.7,0" into {rooms, adults, children} 1396 function parseGroupsForm(gf) { 1397 var out = { rooms: 0, adults: 0, children: 0 };
1398 try { 1399 if (!gf) return out; 1400 String(gf).split(';').forEach(function(groupStr){ 1401 if (!groupStr) return; 1402 out.rooms += 1; 1403 var parts = groupStr.split(':'); 1404 if (parts.length < 2) return; 1405 var trio = parts[1].split(','); 1406 var a = parseInt(trio[0] || '0', 10); 1407 out.adults += isNaN(a) ? 0 : a; 1408 var childrenAges = (trio[1] || '0'); 1409 if (childrenAges && childrenAges !== '0') { 1410 out.children += childrenAges.split('.').filter(Boolean).length; 1411 } 1412 // Babies are not counted in children 1413 }); 1414 } catch (e) {} 1415 return out; 1416 } 1417 1418 // Enrich context from px_jsonQuery (server-rendered Json_Query) when available 1419 function enhanceContextFromPxJson() { 1420 try { 1421 var q = (typeof window !== 'undefined' && window.px_jsonQuery) ? window.px_jsonQuery : (typeof px_jsonQuery !== 'undefined' ? px_jsonQuery : null); 1422 if (!q) return; 1423 var updated = {}; 1424 // SearchID 1425 if (q.SearchID && String(q.SearchID) !== String(pxContext.search_id || '')) { 1426 pxContext.search_id = String(q.SearchID); 1427 updated.search_id = pxContext.search_id; 1428 } 1429 // Dates 1430 var start = normalizeDate(q.Start || ''); 1431 var end = normalizeDate(q.End || ''); 1432 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1433 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1434 // Pax/rooms from GroupsForm or Group array 1435 var paxParsed = null; 1436 if (q.GroupsForm) { 1437 paxParsed = parseGroupsForm(q.GroupsForm); 1438 } else if (q.Group && Array.isArray(q.Group)) { 1439 paxParsed = { rooms: 0, adults: 0, children: 0 }; 1440 q.Group.forEach(function(g){ 1441 paxParsed.rooms += 1; 1442 paxParsed.adults += (g.Adults*1) || 0; 1443 paxParsed.children += (g.Childs*1) || 0; 1444 }); 1445 } 1446 if (paxParsed) { 1447 if (paxParsed.adults && paxParsed.adults !== pxContext.adults) { pxContext.adults = paxParsed.adults; updated.adults = paxParsed.adults; } 1448 if (paxParsed.children && paxParsed.children !== pxContext.children) { pxContext.children = paxParsed.children; updated.children = paxParsed.children; } 1449 if (paxParsed.rooms && paxParsed.rooms !== pxContext.rooms) { pxContext.rooms = paxParsed.rooms; updated.rooms = paxParsed.rooms; } 1450 } 1451 if (Object.keys(updated).length) { 1452 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1453 } 1454 } catch (e) {} 1455 } 1456 1457 // Process API payloads to enrich context 1458 function processApiData(url, data) { 1459 try { 1460 if (!data) return; 1461 // avoid reprocessing same SearchID repeatedly 1462 window.__px_processed_sids = window.__px_processed_sids || {}; 1463 var updated = {}; 1464 var payload = data && data.Json_Query ? data.Json_Query : data; 1465 // SearchID present? 1466 if (typeof payload.SearchID !== 'undefined' && String(payload.SearchID)) { 1467 var sid = String(payload.SearchID); 1468 if (window.__px_processed_sids[sid]) return; 1469 if (sid && sid !== String(pxContext.search_id || '')) { pxContext.search_id = sid; updated.search_id = sid; } 1470 window.__px_processed_sids[sid] = true; 1471 } 1472 // Start / End can exist either top-level or nested 1473 var start = payload.Start || (data && data.Start) || ''; 1474 var end = payload.End || (data && data.End) || ''; 1475 start = normalizeDate(start); 1476 end = normalizeDate(end); 1477 if (start && start !== pxContext.start_date) { pxContext.start_date = start; updated.start_date = start; } 1478 if (end && end !== pxContext.end_date) { pxContext.end_date = end; updated.end_date = end; } 1479 // GroupsForm could be present 1480 var gf = payload.GroupsForm || (data && data.GroupsForm) || ''; 1481 if (gf) { 1482 var parsed = parseGroupsForm(gf); 1483 if (parsed.adults && parsed.adults !== pxContext.adults) { pxContext.adults = parsed.adults; updated.adults = parsed.adults; } 1484 if (parsed.children && parsed.children !== pxContext.children) { pxContext.children = parsed.children; updated.children = parsed.children; } 1485 if (parsed.rooms && parsed.rooms !== pxContext.rooms) { pxContext.rooms = parsed.rooms; updated.rooms = parsed.rooms; } 1486 } 1487 // Some APIs include Group arrays; attempt totals 1488 if (payload.Group && Array.isArray(payload.Group)) { 1489 var aT = 0, cT = 0, rT = 0; 1490 payload.Group.forEach(function(g){ 1491 if (!g) return; 1492 rT += 1; 1493 aT += (g.Adults*1) || 0; 1494 cT += (g.Childs*1) || 0; 1495 }); 1496 if (aT && aT !== pxContext.adults) { pxContext.adults = aT; updated.adults = aT; } 1497 if (cT && cT !== pxContext.children) { pxContext.children = cT; updated.children = cT; } 1498 if (rT && rT !== pxContext.rooms) { pxContext.rooms = rT; updated.rooms = rT; } 1499 } 1500 if (Object.keys(updated).length) { 1501 try { window.dataLayer.push(Object.assign({ event: 'px_context_update' }, updated)); } catch(e) {} 1502 } 1503 } catch(e) {} 1504 } 1505 1506 // Intercept fetch/XHR to learn from API responses 1507 (function installNetworkTaps(){
1508 try { 1509 var origFetch = window.fetch; 1510 if (origFetch && !window.__px_fetch_hooked) { 1511 window.__px_fetch_hooked = true; 1512 window.fetch = function(input, init) { 1513 var p = origFetch(input, init); 1514 try { 1515 var url = typeof input === 'string' ? input : (input && input.url) || ''; 1516 p.then(function(res){ 1517 try { 1518 var ct = (res.headers && res.headers.get && res.headers.get('content-type')) || ''; 1519 if (ct && ct.indexOf('application/json') !== -1 && (/\/query\/list/i.test(url) || /\/search\/info/i.test(url))) { 1520 res.clone().json().then(function(json){ processApiData(url, json); }).catch(function(){}); 1521 } 1522 } catch(e) {} 1523 }).catch(function(){}); 1524 } catch(e) {} 1525 return p; 1526 }; 1527 } 1528 } catch(e) {} 1529 try { 1530 if (!window.__px_xhr_hooked && window.XMLHttpRequest) { 1531 window.__px_xhr_hooked = true; 1532 var XHR = window.XMLHttpRequest; 1533 var open = XHR.prototype.open; 1534 var send = XHR.prototype.send; 1535 XHR.prototype.open = function(method, url) { 1536 this.__px_url = url; 1537 return open.apply(this, arguments); 1538 }; 1539 XHR.prototype.send = function(body) { 1540 try { 1541 this.addEventListener('load', function() { 1542 try { 1543 var url = this.__px_url || ''; 1544 var ct = this.getResponseHeader && this.getResponseHeader('content-type') || ''; 1545 if (ct && ct.indexOf('application/json') !== -1 && (/\/query\/list/i.test(url) || /\/search\/info/i.test(url))) { 1546 var txt = this.responseText; 1547 try { processApiData(url, JSON.parse(txt)); } catch(e) {} 1548 } 1549 } catch(e) {} 1550 }); 1551 } catch(e) {} 1552 return send.apply(this, arguments); 1553 }; 1554 } 1555 } catch(e) {} 1556 })(); 1557 1558 // If we have SearchID but missing details, fetch /search/info 1559 function fetchSearchInfoIfNeeded() { 1560 try { 1561 var sid = pxContext.search_id || getUrlParam('SearchID') || (document.querySelector('#SearchID')||{}).value || ''; 1562 var needsDates = !(pxContext.start_date && pxContext.end_date); 1563 var needsPaxs = !((pxContext.adults*1) > 0 || (pxContext.children*1) > 0); 1564 if (sid && (needsDates || needsPaxs)) { 1565 fetchSearchInfoForSid(sid); 1566 } 1567 } catch(e) {} 1568 } 1569 1570 // Cached fetch per SearchID 1571 function fetchSearchInfoForSid(sid) { 1572 try { 1573 window.__px_sid_promises = window.__px_sid_promises || {}; 1574 if (window.__px_sid_promises[sid]) return window.__px_sid_promises[sid]; 1575 var endpoint = 'https://api-1-eb-web.pxsol.io/search/info?SearchID=' + encodeURIComponent(sid); 1576 var pr = fetch(endpoint, { credentials: 'omit' }).then(function(res){ 1577 if (!res.ok) return; 1578 var ct = (res.headers && res.headers.get && res.headers.get('content-type')) || ''; 1579 if (ct.indexOf('application/json') === -1) return; 1580 return res.json(); 1581 }).then(function(json){ 1582 if (json) processApiData(endpoint, json); 1583 return true; 1584 }).catch(function(){ return false; }); 1585 window.__px_sid_promises[sid] = pr; 1586 return pr; 1587 } catch(e) { return Promise.resolve(false); } 1588 } 1589 1590 // Ensure dates/paxs are ready before firing a callback 1591 function ensureContextReady(cb) { 1592 try { 1593 // Try quick enrichments first 1594 enhanceContextFromHiddenInputs(); 1595 enhanceContextFromPxJson(); 1596 var sid = pxContext.search_id || getUrlParam('SearchID') || (document.querySelector('#SearchID')||{}).value || ''; 1597 var hasDates = !!(pxContext.start_date && pxContext.end_date); 1598 var hasPaxs = ((pxContext.adults*1) > 0) || ((pxContext.children*1) > 0); 1599 if (hasDates && hasPaxs) { cb(); return; } 1600 if (sid) { 1601 fetchSearchInfoForSid(sid).finally(function(){ cb(); }); 1602 return; 1603 } 1604 // Last resort: try to enrich from DOM then run
1605 enhanceContextFromHiddenInputs(); 1606 cb(); 1607 } catch(e) { cb(); } 1608 } 1609 1610 // Detect "No hay resultados" to push no_inventory automatically 1611 function wireNoInventoryWatcher() { 1612 console.log('%c[pxTrack] ð Initializing no_inventory watcher...', 'color: #2196F3; font-weight: bold; font-size: 14px;'); 1613 console.log('[pxTrack] wireNoInventoryWatcher() called at:', new Date().toISOString()); 1614 var scanCount = 0; 1615 var lastScanResult = null; 1616 var lastSearchID = null; // Track SearchID to detect new searches 1617 var lastScanTime = 0; // For throttling scans 1618 var SCAN_THROTTLE_MS = 1000; // Maximum 1 scan per second 1619 var EVENT_COOLDOWN_MS = 5000; // Minimum 5 seconds between events of the same type 1620 var lastEventTime = {}; // Track last time each event type was fired 1621 var MAX_SCANS_PER_SEARCH = 30; // Maximum scans per search to prevent excessive polling 1622 var __px_has_inventory_pushed = false; // Flag para has_inventory (opuesto de no_inventory) 1623 1624 // Log immediately to confirm function is executing 1625 console.log('[pxTrack] â wireNoInventoryWatcher() is executing - scan function will be defined'); 1626 1627 // Expose scan function to global manual trigger 1628 window.__px_no_inventory_scan_func = function() { 1629 console.log('[pxTrack] Manual scan triggered via global function'); 1630 scan(); 1631 return lastScanResult; 1632 }; 1633 1634 function checkJsonQueryAvailability() { 1635 try { 1636 // Check if px_jsonQuery is available 1637 if (typeof window.px_jsonQuery === 'undefined' || !window.px_jsonQuery) { 1638 return false; 1639 } 1640 1641 var jsonQuery = window.px_jsonQuery; 1642 1643 // Log full structure on first check (for debugging) 1644 if (!window.__px_jsonQuery_logged) { 1645 window.__px_jsonQuery_logged = true; 1646 try { 1647 console.log('[pxTrack] ð¦ px_jsonQuery structure detected:', { 1648 hasProductList: !!(jsonQuery.ProductList), 1649 productListIsArray: Array.isArray(jsonQuery.ProductList), 1650 productListLength: jsonQuery.ProductList ? jsonQuery.ProductList.length : 0, 1651 sampleProduct: jsonQuery.ProductList && jsonQuery.ProductList.length > 0 ? { 1652 hasAvailability: typeof jsonQuery.ProductList[0].Availability !== 'undefined', 1653 availability: jsonQuery.ProductList[0].Availability, 1654 hasSkuList: !!(jsonQuery.ProductList[0].SkuList), 1655 skuListLength: jsonQuery.ProductList[0].SkuList ? jsonQuery.ProductList[0].SkuList.length : 0 1656 } : null 1657 }); 1658 // Log first product details if available 1659 if (jsonQuery.ProductList && jsonQuery.ProductList.length > 0) { 1660 var firstProduct = jsonQuery.ProductList[0]; 1661 console.log('[pxTrack] First product sample:', { 1662 Availability: firstProduct.Availability, 1663 hasSkuList: !!(firstProduct.SkuList), 1664 SkuList: firstProduct.SkuList ? firstProduct.SkuList.map(function(sku) { 1665 return { Availability: sku.Availability }; 1666 }).slice(0, 3) : null 1667 }); 1668 } 1669 } catch(e) { 1670 console.error('[pxTrack] Error logging Json_Query structure:', e); 1671 } 1672 } 1673 1674 // Check if ProductList exists and is an array 1675 if (!jsonQuery.ProductList) { 1676 // ProductList might not be loaded yet, but object exists 1677 return false; 1678 } 1679 1680 if (!Array.isArray(jsonQuery.ProductList)) { 1681 console.warn('[pxTrack] px_jsonQuery.ProductList exists but is not an array:', typeof jsonQuery.ProductList); 1682 return false; 1683 } 1684 1685 if (jsonQuery.ProductList.length === 0) { 1686 // Empty ProductList might indicate no inventory, but we need at least one product to check 1687 return false; 1688 } 1689 1690 // Check if ALL products have Availability === 0 1691 var allZeroAvailability = true; 1692 var availabilityDetails = []; 1693 1694 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 1695 var product = jsonQuery.ProductList[i]; 1696 // Check Availability property (could be at product level or in SkuList) 1697 var productAvailability = product.Availability || 0; 1698 var productHasAvailability = typeof product.Availability !== 'undefined'; 1699 1700 // If product has SkuList, check all SKUs 1701 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 1702 var allSkusZero = true; 1703 var skuAvailabilities = []; 1704 for (var j = 0; j < product.SkuList.length; j++) { 1705 var sku = product.SkuList[j]; 1706 var skuAvail = sku.Availability || 0; 1707 skuAvailabilities.push(skuAvail); 1708 if (sku.Availability && sku.Availability > 0) { 1709 allSkusZero = false;
1710 break; 1711 } 1712 } 1713 availabilityDetails.push({ 1714 productIndex: i, 1715 hasProductAvailability: productHasAvailability, 1716 productAvailability: productAvailability, 1717 hasSkuList: true, 1718 skuAvailabilities: skuAvailabilities, 1719 allSkusZero: allSkusZero 1720 }); 1721 if (!allSkusZero) { 1722 allZeroAvailability = false; 1723 break; 1724 } 1725 } else { 1726 // Product-level availability check 1727 availabilityDetails.push({ 1728 productIndex: i, 1729 hasProductAvailability: productHasAvailability, 1730 productAvailability: productAvailability, 1731 hasSkuList: false 1732 }); 1733 if (productAvailability > 0) { 1734 allZeroAvailability = false; 1735 break; 1736 } 1737 } 1738 } 1739 1740 // Log availability details when checking (first time or when all zero) 1741 if (allZeroAvailability || !window.__px_availability_details_logged) { 1742 window.__px_availability_details_logged = true; 1743 console.log('[pxTrack] Availability check result:', { 1744 allZeroAvailability: allZeroAvailability, 1745 totalProducts: jsonQuery.ProductList.length, 1746 details: availabilityDetails.slice(0, 3) // Show first 3 products 1747 }); 1748 } 1749 1750 return allZeroAvailability; 1751 } catch(e) { 1752 console.error('[pxTrack] Error checking Json_Query availability:', e); 1753 return false; 1754 } 1755 } 1756 1757 function checkJsonQueryHasAvailability() { 1758 try { 1759 // Check if px_jsonQuery is available 1760 if (typeof window.px_jsonQuery === 'undefined' || !window.px_jsonQuery) { 1761 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1762 } 1763 1764 var jsonQuery = window.px_jsonQuery; 1765 1766 // Check if ProductList exists and is an array 1767 if (!jsonQuery.ProductList || !Array.isArray(jsonQuery.ProductList) || jsonQuery.ProductList.length === 0) { 1768 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1769 } 1770 1771 var totalAvailability = 0; 1772 var hasAnyAvailability = false; 1773 var availabilityDetails = []; 1774 1775 for (var i = 0; i < jsonQuery.ProductList.length; i++) { 1776 var product = jsonQuery.ProductList[i]; 1777 var productAvailability = product.Availability || 0; 1778 var productTotal = 0; 1779 1780 // If product has SkuList, sum all SKU availabilities 1781 if (product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) { 1782 for (var j = 0; j < product.SkuList.length; j++) { 1783 var sku = product.SkuList[j]; 1784 var skuAvail = sku.Availability || 0; 1785 productTotal += skuAvail; 1786 if (skuAvail > 0) { 1787 hasAnyAvailability = true; 1788 } 1789 } 1790 } else { 1791 // Product-level availability 1792 productTotal = productAvailability; 1793 if (productAvailability > 0) { 1794 hasAnyAvailability = true; 1795 } 1796 } 1797 1798 totalAvailability += productTotal; 1799 availabilityDetails.push({ 1800 productIndex: i, 1801 productAvailability: productAvailability, 1802 productTotal: productTotal, 1803 hasSkuList: !!(product.SkuList && Array.isArray(product.SkuList) && product.SkuList.length > 0) 1804 }); 1805 } 1806 1807 return { 1808 hasAvailability: hasAnyAvailability, 1809 totalAvailability: totalAvailability, 1810 availabilityDetails: availabilityDetails, 1811 productCount: jsonQuery.ProductList.length 1812 }; 1813 } catch(e) { 1814 console.error('[pxTrack] Error checking Json_Query for availability:', e); 1815 return { hasAvailability: false, totalAvailability: 0, availabilityDetails: null }; 1816 } 1817 } 1818 1819 function scan() { 1820 // THROTTLING: Evitar escaneos muy frecuentes 1821 var now = Date.now(); 1822 if (now - lastScanTime < SCAN_THROTTLE_MS) { 1823 console.debug('[pxTrack] scan() throttled (too soon after last scan)'); 1824 return; 1825 } 1826 lastScanTime = now; 1827 1828 // Check if SearchID changed (new search) - if so, reset the flag 1829 try { 1830 var currentSearchID = null; 1831 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery && window.px_jsonQuery.SearchID) { 1832 currentSearchID = String(window.px_jsonQuery.SearchID); 1833 } else { 1834 var searchIDEl = document.querySelector('#SearchID'); 1835 if (searchIDEl && searchIDEl.value) { 1836 currentSearchID = String(searchIDEl.value); 1837 } else { 1838 try {
1839 var urlParams = new URLSearchParams(location.search); 1840 currentSearchID = urlParams.get('SearchID') || null; 1841 } catch(e) {} 1842 } 1843 } 1844 1845 // If SearchID changed, reset the flags for new search 1846 if (currentSearchID && currentSearchID !== lastSearchID && lastSearchID !== null) { 1847 console.log('[pxTrack] ð New search detected (SearchID: ' + lastSearchID + ' â ' + currentSearchID + '), resetting flags'); 1848 window.__px_no_inventory_pushed = false; 1849 __px_has_inventory_pushed = false; 1850 scanCount = 0; // Reset scan count 1851 lastScanTime = 0; // Reset throttling for new search 1852 } 1853 1854 // Update lastSearchID 1855 if (currentSearchID) { 1856 lastSearchID = currentSearchID; 1857 } 1858 } catch(e) { 1859 console.error('[pxTrack] Error checking SearchID:', e); 1860 } 1861 1862 // Don't scan if event already fired (unless we just reset it) 1863 if (window.__px_no_inventory_pushed) { 1864 console.debug('[pxTrack] scan() called but event already fired, skipping'); 1865 return; 1866 } 1867 1868 // LÃmite máximo de escaneos por búsqueda 1869 if (scanCount >= MAX_SCANS_PER_SEARCH) { 1870 console.debug('[pxTrack] scan() skipped - maximum scans per search reached (' + MAX_SCANS_PER_SEARCH + ')'); 1871 return; 1872 } 1873 1874 scanCount++; 1875 // Log first few scans to confirm function is working 1876 if (scanCount <= 5) { 1877 console.log('[pxTrack] scan() executing - Scan #' + scanCount); 1878 } 1879 var shouldFire = false; 1880 var detectionMethod = ''; 1881 var debugInfo = { 1882 scanNumber: scanCount, 1883 px_jsonQuery_exists: typeof window.px_jsonQuery !== 'undefined' && !!window.px_jsonQuery, 1884 productList_length: 0, 1885 productList_details: [] 1886 }; 1887 1888 // Method 1: Check px_jsonQuery.ProductList for all Availability === 0 1889 try { 1890 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 1891 debugInfo.productList_length = (window.px_jsonQuery.ProductList && Array.isArray(window.px_jsonQuery.ProductList)) ? window.px_jsonQuery.ProductList.length : 0; 1892 1893 if (checkJsonQueryAvailability()) { 1894 shouldFire = true; 1895 detectionMethod = 'Json_Query'; 1896 try { 1897 console.log('%c[pxTrack] â no_inventory DETECTED via Json_Query (all Availability === 0) - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1898 } catch(_e){} 1899 } else { 1900 // Log details about why it didn't fire 1901 try { 1902 if (window.px_jsonQuery.ProductList && Array.isArray(window.px_jsonQuery.ProductList)) { 1903 var productDetails = []; 1904 for (var idx = 0; idx < Math.min(window.px_jsonQuery.ProductList.length, 3); idx++) { 1905 var p = window.px_jsonQuery.ProductList[idx]; 1906 var prodAvail = p.Availability || 0; 1907 var skuAvail = 'N/A'; 1908 if (p.SkuList && Array.isArray(p.SkuList) && p.SkuList.length > 0) { 1909 var skuAvails = []; 1910 for (var skuIdx = 0; skuIdx < p.SkuList.length; skuIdx++) { 1911 skuAvails.push(p.SkuList[skuIdx].Availability || 0); 1912 } 1913 skuAvail = skuAvails.join(','); 1914 } 1915 productDetails.push({productAvail: prodAvail, skuAvail: skuAvail}); 1916 } 1917 debugInfo.productList_details = productDetails; 1918 } 1919 } catch(e) {} 1920 } 1921 } 1922 } catch(e) { 1923 console.error('[pxTrack] Error in Json_Query availability check:', e); 1924 } 1925 1926 // Method 2: Check for specific DOM elements (most reliable) 1927 if (!shouldFire) { 1928 try { 1929 // Check for #no-inventory-container or #no-inventory (from sindispo.php) 1930 var noInventoryContainer = document.querySelector('#no-inventory-container'); 1931 var noInventoryElement = document.querySelector('#no-inventory'); 1932 if (noInventoryContainer || noInventoryElement) { 1933 shouldFire = true; 1934 detectionMethod = 'DOM element (ID)'; 1935 try { 1936 console.log('%c[pxTrack] â no_inventory DETECTED via DOM element (#no-inventory-container or #no-inventory) - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1937 console.log('[pxTrack] DOM elements found:', { 1938 hasContainer: !!noInventoryContainer, 1939 hasElement: !!noInventoryElement, 1940 containerVisible: noInventoryContainer ? (noInventoryContainer.offsetParent !== null) : false, 1941 elementText: noInventoryElement ? (noInventoryElement.textContent || noInventoryElement.innerText || '').substring(0, 50) : '' 1942 }); 1943 } catch(_e){} 1944 } else if (scanCount <= 3 || scanCount % 10 === 0) { 1945 // Log when elements are not found (for debugging) 1946 try { 1947 console.debug('[pxTrack] DOM check: #no-inventory-container and #no-inventory not found (scan #' + scanCount + ')'); 1948 } catch(_e){} 1949 } 1950 } catch(e) { 1951 console.error('[pxTrack] Error in DOM element check:', e); 1952 } 1953 } 1954 1955 // Method 3: Fallback - Check DOM text for "No hay resultados" or "No results" 1956 if (!shouldFire) { 1957 try { 1958 var candidates = Array.prototype.slice.call(document.querySelectorAll('body *')); 1959 for (var i=0; i<candidates.length; i++) { 1960 var t = (candidates[i].innerText || '').trim(); 1961 if (!t) continue; 1962 if (t.indexOf('No hay resultados') !== -1 || t.indexOf('No results') !== -1) { 1963 shouldFire = true; 1964 detectionMethod = 'DOM text'; 1965 try { 1966 console.log('%c[pxTrack] â no_inventory DETECTED via DOM text - Scan #' + scanCount, 'color: #FF5722; font-weight: bold;'); 1967 } catch(_e){} 1968 break; 1969 } 1970 } 1971 } catch(e) { 1972 console.error('[pxTrack] Error in DOM text check:', e); 1973 } 1974 } 1975 1976 // Store last scan result for debugging 1977 lastScanResult = { 1978 shouldFire: shouldFire, 1979 method: detectionMethod, 1980 scanCount: scanCount, 1981 px_jsonQuery_exists: debugInfo.px_jsonQuery_exists, 1982 productList_length: debugInfo.productList_length, 1983 productList_details: debugInfo.productList_details 1984 }; 1985 1986 // Log scan details every 5th scan or when px_jsonQuery becomes available 1987 if (scanCount % 5 === 0 || (debugInfo.px_jsonQuery_exists && scanCount <= 3)) { 1988 try { 1989 console.log('[pxTrack] no_inventory scan #' + scanCount + ':', { 1990 px_jsonQuery_exists: debugInfo.px_jsonQuery_exists, 1991 productList_length: debugInfo.productList_length, 1992 shouldFire: shouldFire, 1993 method: detectionMethod 1994 }); 1995 if (debugInfo.productList_details.length > 0) { 1996 console.log('[pxTrack] Sample product availability:', debugInfo.productList_details); 1997 } 1998 } catch(_e){} 1999 } 2000 2001 if (shouldFire && !window.__px_no_inventory_pushed) { 2002 // COOLDOWN: Verificar que no se haya disparado recientemente 2003 var eventType = 'no_inventory'; 2004 var now = Date.now(); 2005 if (lastEventTime[eventType] && (now - lastEventTime[eventType] < EVENT_COOLDOWN_MS)) { 2006 console.log('[pxTrack] â¸ï¸ Event cooldown active, skipping no_inventory event (last fired ' + Math.round((now - lastEventTime[eventType]) / 1000) + 's ago)'); 2007 return; 2008 } 2009 2010 window.__px_no_inventory_pushed = true; 2011 lastEventTime[eventType] = now; // Registrar tiempo del evento 2012 2013 // Ensure dates/paxs are enriched before sending 2014 ensureContextReady(function(){ 2015 var params = getSearchParamsFromDOM(); 2016 params.no_inventory = true; 2017 try { 2018 console.log('%c[pxTrack] ð FIRING no_inventory event - Detection method: ' + detectionMethod + ' - Scan #' + scanCount, 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2019 console.log('[pxTrack] no_inventory payload:', params); 2020 console.log('[pxTrack] Last scan result:', lastScanResult); 2021 } catch(_e){} 2022 window.pxTrack('no_inventory', params); 2023 2024 // Fire form_success for search form after no_inventory 2025 setTimeout(function() { 2026 console.log('%c[pxTrack] ð FIRING form_success for search form (after no_inventory)', 'color: #4CAF50; font-weight: bold;'); 2027 window.pxTrack('form_success', { 2028 form_id: 'pxmk_searchform', 2029 lead_id: null, 2030 transaction_id: null 2031 }); 2032 }, 100); 2033 }); 2034 } 2035 2036 // OPPOSITE: Check if there IS availability (has_inventory) 2037 // Only check if no_inventory was NOT detected and has_inventory hasn't been fired yet 2038 if (!shouldFire && !__px_has_inventory_pushed && !window.__px_no_inventory_pushed) { 2039 try { 2040 // Also verify that no "no inventory" DOM elements are present 2041 var noInventoryContainer = document.querySelector('#no-inventory-container'); 2042 var noInventoryElement = document.querySelector('#no-inventory'); 2043 var hasNoInventoryDOM = !!(noInventoryContainer || noInventoryElement); 2044 2045 if (hasNoInventoryDOM) { 2046 console.debug('[pxTrack] has_inventory blocked - no inventory DOM elements present'); 2047 } else { 2048 var availabilityInfo = checkJsonQueryHasAvailability(); 2049 2050 if (availabilityInfo.hasAvailability) { 2051 // COOLDOWN: Verificar que no se haya disparado recientemente 2052 var eventType = 'has_inventory'; 2053 var now = Date.now(); 2054 if (lastEventTime[eventType] && (now - lastEventTime[eventType] < EVENT_COOLDOWN_MS)) { 2055 console.log('[pxTrack] â¸ï¸ Event cooldown active, skipping has_inventory event (last fired ' + Math.round((now - lastEventTime[eventType]) / 1000) + 's ago)'); 2056 } else { 2057 2058 __px_has_inventory_pushed = true; 2059 lastEventTime[eventType] = now; 2060 2061 // Ensure dates/paxs are enriched before sending 2062 ensureContextReady(function(){ 2063 var params = getSearchParamsFromDOM(); 2064 params.has_availability = true; 2065 params.availability = availabilityInfo.totalAvailability; 2066 params.product_count = availabilityInfo.productC
2066ount || 0; 2067 2068 // Add SearchID if available 2069 try { 2070 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery && window.px_jsonQuery.SearchID) { 2071 params.search_id = String(window.px_jsonQuery.SearchID); 2072 } 2073 } catch(e) {} 2074 2075 // Add availability details (first 3 products for debugging) 2076 if (availabilityInfo.availabilityDetails && availabilityInfo.availabilityDetails.length > 0) { 2077 params.availability_details = availabilityInfo.availabilityDetails.slice(0, 3).map(function(detail) { 2078 return { 2079 product_index: detail.productIndex, 2080 availability: detail.productTotal, 2081 has_skus: detail.hasSkuList 2082 }; 2083 }); 2084 } 2085 2086 try { 2087 console.log('%c[pxTrack] ð FIRING has_inventory event (availability detected) - Scan #' + scanCount, 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2088 console.log('[pxTrack] has_inventory payload:', params); 2089 console.log('[pxTrack] Availability info:', { 2090 totalAvailability: availabilityInfo.totalAvailability, 2091 productCount: availabilityInfo.productCount, 2092 hasAvailability: availabilityInfo.hasAvailability 2093 }); 2094 } catch(_e){} 2095 window.pxTrack('has_inventory', params); 2096 2097 // Fire form_success for search form after has_inventory 2098 setTimeout(function() { 2099 console.log('%c[pxTrack] ð FIRING form_success for search form (after has_inventory)', 'color: #4CAF50; font-weight: bold;'); 2100 window.pxTrack('form_success', { 2101 form_id: 'pxmk_searchform', 2102 lead_id: null, 2103 transaction_id: null 2104 }); 2105 }, 100); 2106 }); 2107 } 2108 } 2109 } 2110 } catch(e) { 2111 console.error('[pxTrack] Error checking for availability (has_inventory):', e); 2112 } 2113 } 2114 } 2115 2116 // Try to intercept px_jsonQuery assignment (works if px_jsonQuery is undefined) 2117 try { 2118 if (typeof window.px_jsonQuery === 'undefined') { 2119 try { 2120 var _px_jsonQuery_value = undefined; 2121 var _px_jsonQuery_lastTrigger = 0; 2122 Object.defineProperty(window, 'px_jsonQuery', { 2123 get: function() { return _px_jsonQuery_value; }, 2124 set: function(newValue) { 2125 _px_jsonQuery_value = newValue; 2126 if (newValue) { 2127 try { 2128 // Throttle interceptor triggers (máximo 1 cada 1 segundo) 2129 var now = Date.now(); 2130 if (now - _px_jsonQuery_lastTrigger < 1000) { 2131 console.debug('[pxTrack] px_jsonQuery interceptor throttled'); 2132 return; 2133 } 2134 _px_jsonQuery_lastTrigger = now; 2135 console.log('[pxTrack] px_jsonQuery was set via Object.defineProperty, triggering scan'); 2136 setTimeout(function() { scan(); }, 150); 2137 } catch(e) { 2138 console.error('[pxTrack] Error in triggerScan:', e); 2139 } 2140 } 2141 }, 2142 configurable: true, 2143 enumerable: true 2144 }); 2145 } catch(e) { 2146 console.error('[pxTrack] Object.defineProperty failed for px_jsonQuery:', e); 2147 } 2148 } 2149 } catch(e) { 2150 console.error('[pxTrack] Error setting up px_jsonQuery interception:', e); 2151 } 2152 2153 // Multiple initial scans with increasing delays (for Chrome compatibility) 2154 function runInitialScans() { 2155 console.log('%c[pxTrack] Starting initial scans for no_inventory detection...', 'color: #FF9800; font-weight: bold;'); 2156 console.log('[pxTrack] runInitialScans() called - will execute multiple scans'); 2157 // Immediate scan 2158 console.log('[pxTrack] Executing immediate scan...'); 2159 scan(); 2160 // Delayed scans to catch px_jsonQuery if it loads later AND DOM elements that load dynamically 2161 setTimeout(function() { scan(); }, 200); 2162 setTimeout(function() { scan(); }, 500); 2163 setTimeout(function() { scan(); }, 1000); 2164 setTimeout(function() { scan(); }, 2000); 2165 setTimeout(function() { scan(); }, 3000); 2166 setTimeout(function() { scan(); }, 5000); 2167 } 2168 2169 // Run initial scans after DOM is ready 2170 if (document.readyState === 'loading') { 2171 console.log('[pxTrack] DOM is loading, will wait for DOMContentLoaded'); 2172 document.addEventListener('DOMContentLoaded', function() { 2173 console.log('[pxTrack] DOMContentLoaded fired, scheduling runInitialScans() in 100ms'); 2174 setTimeout(function() { 2175 console.log('[pxTrack] Executing runInitialScans() now...'); 2176 runInitialScans(); 2177 }, 100); 2178 }); 2179 } else { 2180 console.log('[pxTrack] DOM already ready, scheduling runInitialScans() in 100ms'); 2181 setTimeout(function() { 2182 console.log('[pxTrack] Executing runInitialScans() now...'); 2183 runInitialScans(); 2184 }, 100); 2185 } 2186 2187 // Also use requestAnimationFrame for Chrome (ensures DOM is painted) 2188 if (window.requestAnimationFrame) { 2189 requestAnimationFrame(function() { 2190 setTimeout(function() { scan(); }, 500); 2191 }); 2192 } 2193 2194 // Watch for px_jsonQuery availability (reduced polling frequency to prevent rate limiting) 2195 var jsonQueryCheckStart = Date.now(); 2196 var jsonQueryCheckTimeout = 20000; // 20 seconds 2197 var jsonQueryCheckInterval = setInterval(function() { 2198 // Stop if timeout reached 2199 if (Date.now() - jsonQueryCheckStart > jsonQueryCheckTimeout) { 2200 clearInterval(jsonQueryCheckInterval); 2201 try { 2202 console.log('[pxTrack] no_inventory px_jsonQuery polling timed out after', scanCount, 'scans'); 2203 console.log('[pxTrack] Last scan result:', lastScanResult); 2204 } catch(_e){} 2205 return; 2206 } 2207 2208 // Stop if event already fired 2209 if (window.__px_no_inventory_pushed) { 2210 clearInterval(jsonQueryCheckInterval); 2211 return; 2212 } 2213 2214 // Check if px_jsonQuery is now available and scan 2215 if (typeof window.px_jsonQuery !== 'undefined' && window.px_jsonQuery) { 2216 scan(); 2217 } 2218 }, 1000); // Reduced to 1 second to prevent rate limiting 2219 2220 // Watch DOM changes and specifically look for #no-inventory-container or #no-inventory
2221 try { 2222 var mo = new MutationObserver(function(mutations) { 2223 if (window.__px_no_inventory_pushed) return; 2224 2225 // Throttling más agresivo para MutationObserver (2 segundos mÃnimo) 2226 var now = Date.now(); 2227 if (mo.__px_lastScan && (now - mo.__px_lastScan < 2000)) { 2228 return; 2229 } 2230 2231 // Check if any of the mutations added our target elements 2232 var foundTarget = false; 2233 for (var i = 0; i < mutations.length; i++) { 2234 var mutation = mutations[i]; 2235 if (mutation.addedNodes && mutation.addedNodes.length > 0) { 2236 for (var j = 0; j < mutation.addedNodes.length; j++) { 2237 var node = mutation.addedNodes[j]; 2238 if (node.nodeType === 1) { // Element node 2239 // Check if the added node is our target or contains it 2240 if (node.id === 'no-inventory-container' || node.id === 'no-inventory' || 2241 node.querySelector && (node.querySelector('#no-inventory-container') || node.querySelector('#no-inventory'))) { 2242 foundTarget = true; 2243 break; 2244 } 2245 } 2246 } 2247 } 2248 if (foundTarget) break; 2249 } 2250 2251 // If target found or if enough time passed, scan 2252 if (foundTarget || !mo.__px_lastScan || Date.now() - mo.__px_lastScan > 2000) { 2253 mo.__px_lastScan = Date.now(); 2254 if (foundTarget) { 2255 console.log('[pxTrack] MutationObserver detected #no-inventory-container or #no-inventory added to DOM'); 2256 } 2257 scan(); 2258 } 2259 }); 2260 mo.observe(document.body, { childList: true, subtree: true }); 2261 } catch(e) { 2262 console.error('[pxTrack] MutationObserver failed for no_inventory:', e); 2263 } 2264 2265 // Additional polling specifically for DOM elements (reduced frequency to prevent rate limiting) 2266 var domPollingStart = Date.now(); 2267 var domPollingTimeout = 15000; // 15 seconds 2268 var domPollingInterval = setInterval(function() { 2269 if (Date.now() - domPollingStart > domPollingTimeout) { 2270 clearInterval(domPollingInterval); 2271 return; 2272 } 2273 2274 if (window.__px_no_inventory_pushed) { 2275 clearInterval(domPollingInterval); 2276 return; 2277 } 2278 2279 // Quick check for target elements 2280 var noInventoryContainer = document.querySelector('#no-inventory-container'); 2281 var noInventoryElement = document.querySelector('#no-inventory'); 2282 if (noInventoryContainer || noInventoryElement) { 2283 console.log('[pxTrack] DOM polling detected #no-inventory-container or #no-inventory'); 2284 scan(); 2285 clearInterval(domPollingInterval); 2286 } 2287 }, 1000); // Reduced to 1 second to prevent rate limiting 2288 2289 // Confirm watcher is fully initialized 2290 console.log('%c[pxTrack] â no_inventory watcher fully initialized and ready', 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 2291 console.log('[pxTrack] wireNoInventoryWatcher() completed at:', new Date().toISOString()); 2292 console.log('[pxTrack] All watchers, observers, and polling intervals are now active'); 2293 } 2294 2295 // Observe availability containers to re-enrich context after dynamic updates 2296 function observeAvailabilityContainers() { 2297 try { 2298 var targets = []; 2299 var el1 = document.querySelector('#neo_cart_results_list'); 2300 var el2 = document.querySelector('#neo_cart_pedido_container'); 2301 if (el1) targets.push(el1); 2302 if (el2) targets.push(el2); 2303 if (!targets.length || !('MutationObserver' in window)) return; 2304 var refresh = function() { 2305 enhanceContextFromHiddenInputs(); 2306 enhanceContextFromPxJson(); 2307 }; 2308 var mo = new MutationObserver(function(muts) { 2309 // throttle bursts 2310 if (mo.__px_scheduled) return; 2311 mo.__px_scheduled = true;
2312 setTimeout(function(){ mo.__px_scheduled = false; refresh(); }, 100); 2313 }); 2314 targets.forEach(function(t){ mo.observe(t, { childList: true, subtree: true }); }); 2315 // initial pass 2316 refresh(); 2317 } catch (e) {} 2318 } 2319 2320 // Init after DOM ready - LOG EARLY AND OFTEN 2321 console.log('%c[pxTrack] STEP 1: Checking DOM readyState...', 'color: #9C27B0; font-weight: bold; font-size: 14px;'); 2322 console.log('[pxTrack] document.readyState:', document.readyState); 2323 console.log('[pxTrack] wireNoInventoryWatcher function exists:', typeof wireNoInventoryWatcher); 2324 2325 if (document.readyState === 'loading') { 2326 console.log('%c[pxTrack] STEP 2: DOM is loading, setting up DOMContentLoaded listener', 'color: #9C27B0; font-weight: bold;'); 2327 document.addEventListener('DOMContentLoaded', function() { 2328 console.log('%c[pxTrack] STEP 3: DOMContentLoaded fired!', 'color: #9C27B0; font-weight: bold; font-size: 16px;'); 2329 console.log('[pxTrack] DOMContentLoaded fired, initializing watchers...'); 2330 try { 2331 wireSearchFallbacks(); 2332 wireSearchEventsWhenReady(); 2333 wireFormEvents(); 2334 wireWhatsappClick(); 2335 if (typeof wireCheckoutForm === 'function') { 2336 wireCheckoutForm(); 2337 } else { 2338 console.log('[pxTrack] wireCheckoutForm() not available (may be conditional)'); 2339 } 2340 wireDatePickers(); 2341 enhanceContextFromHiddenInputs(); 2342 enhanceContextFromPxJson(); 2343 fetchSearchInfoIfNeeded(); 2344 console.log('%c[pxTrack] STEP 4: About to call wireNoInventoryWatcher()...', 'color: #FF5722; font-weight: bold; font-size: 16px;'); 2345 try { 2346 wireNoInventoryWatcher(); 2347 console.log('%c[pxTrack] STEP 5: wireNoInventoryWatcher() completed successfully!', 'color: #4CAF50; font-weight: bold; font-size: 16px;'); 2348 } catch(e) { 2349 console.error('[pxTrack] ERROR calling wireNoInventoryWatcher():', e); 2350 console.error('[pxTrack] Error stack:', e.stack); 2351 } 2352 observeAvailabilityContainers(); 2353 // delayed retries in case modules/scripts load late 2354 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 500); 2355 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 1500); 2356 // checkout success detector (thank-you page) - multiple attempts with delays 2357 if (typeof maybePushFormSuccess === 'function') { 2358 maybePushFormSuccess(); // Immediate 2359 setTimeout(function(){ maybePushFormSuccess(); }, 500); // After 500ms 2360 setTimeout(function(){ maybePushFormSuccess(); }, 1500); // After 1.5s 2361 setTimeout(function(){ maybePushFormSuccess(); }, 3000); // After 3s (for slow loading pages) 2362 } 2363 } catch(e) { 2364 console.error('[pxTrack] Error during initialization:', e); 2365 } 2366 }); 2367 } else { 2368 console.log('%c[pxTrack] STEP 2: DOM already ready, initializing immediately', 'color: #9C27B0; font-weight: bold;'); 2369 console.log('[pxTrack] DOM already ready, initializing watchers immediately...'); 2370 try { 2371 wireSearchFallbacks(); 2372 wireSearchEventsWhenReady(); 2373 wireFormEvents(); 2374 wireWhatsappClick(); 2375 if (typeof wireCheckoutForm === 'function') { 2376 wireCheckoutForm(); 2377 } else { 2378 console.log('[pxTrack] wireCheckoutForm() not available (may be conditional)'); 2379 } 2380 wireDatePickers(); 2381 enhanceContextFromHiddenInputs(); 2382 enhanceContextFromPxJson(); 2383 fetchSearchInfoIfNeeded(); 2384 console.log('%c[pxTrack] STEP 4: About to call wireNoInventoryWatcher()...', 'color: #FF5722; font-weight: bold; font-size: 16px;'); 2385 try { 2386 wireNoInventoryWatcher(); 2387 console.log('%c[pxTrack] STEP 5: wireNoInventoryWatcher() completed successfully!', 'color: #4CAF50; font-weight: bold; font-size: 16px;'); 2388 } catch(e) { 2389 console.error('[pxTrack] ERROR calling wireNoInventoryWatcher():', e); 2390 console.error('[pxTrack] Error stack:', e.stack); 2391 } 2392 observeAvailabilityContainers();
2393 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 500); 2394 setTimeout(function(){ enhanceContextFromHiddenInputs(); enhanceContextFromPxJson(); }, 1500); 2395 // checkout success detector (thank-you page) - multiple attempts with delays 2396 if (typeof maybePushFormSuccess === 'function') { 2397 maybePushFormSuccess(); // Immediate 2398 setTimeout(function(){ maybePushFormSuccess(); }, 500); // After 500ms 2399 setTimeout(function(){ maybePushFormSuccess(); }, 1500); // After 1.5s 2400 setTimeout(function(){ maybePushFormSuccess(); }, 3000); // After 3s (for slow loading pages) 2401 } 2402 } catch(e) { 2403 console.error('[pxTrack] Error during initialization:', e); 2404 console.error('[pxTrack] Error stack:', e.stack); 2405 } 2406 } 2407 })(); 2408</script>
2408 2409 2410 2411<!-- Google Tag Manager -->
2412<script>
vendor: 436 bytes, lines 2412-2426
2412 2413 (function(w, d, s, l, i) { 2414 w[l] = w[l] || []; 2415 w[l].push({ 2416 'gtm.start': new Date().getTime(), 2417 event: 'gtm.js' 2418 }); 2419 var f = d.getElementsByTagName(s)[0], 2420 j = d.createElement(s), 2421 dl = l != 'dataLayer' ? '&l=' + l : ''; 2422 j.async = true; 2423 j.src = 2424 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 2425 f.parentNode.insertBefore(j, f); 2426 })(window, document, 'script', 'dataLayer', '
2426GTM-TPTNCNX
vendor: 4 bytes, line 2426
2426');
2427</script>
2427 2428<!-- End Google Tag Manager --> 2429 2430 <!-- Google Tag Manager --> 2431
2431<script> 2432 (function(w, d, s, l, i) { 2433 w[l] = w[l] || []; 2434 w[l].push({ 2435 'gtm.start': new Date().getTime(), 2436 event: 'gtm.js' 2437 }); 2438 var f = d.getElementsByTagName(s)[0], 2439 j = d.createElement(s), 2440 dl = l != 'dataLayer' ? '&l=' + l : ''; 2441 j.async = true; 2442 j.src = 2443 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 2444 f.parentNode.insertBefore(j, f); 2445 })(window, document, 'script', 'dataLayer', 'AW-824953249'); 2446 </script>
2446 2447 <!-- End Google Tag Manager --> 2448 2449 2450 2451</head> 2452 2453<body> 2454 <!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 2454-2455
2454 2455 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
2455GTM-TPTNCNX
vendor: 84 bytes, lines 2455-2456
2455" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 2456
2456<!-- End Google Tag Manager (noscript) --> 2457 2458 <!-- Google Tag Manager (noscript) --> 2459 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=AW-824953249" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 2460 <!-- End Google Tag Manager (noscript) --> 2461 2462 2463 2464 <div class="neo_loader"> 2465 <style> 2466 .linear-activity { 2467 overflow: hidden; 2468 width: 100%; 2469 height: 4px; 2470 background-color: #B3E5FC; 2471 margin: 0 2472 } 2473 2474 .determinate { 2475 position: relative; 2476 max-width: 100%; 2477 height: 100%; 2478 -webkit-transition: width .5s ease-out 1s; 2479 -moz-transition: width .5s ease-out 1s; 2480 -o-transition: width .5s ease-out 1s; 2481 transition: width .5s ease-out 1s; 2482 background-color: #03A9F4 2483 } 2484 2485 .indeterminate { 2486 position: relative; 2487 width: 100%; 2488 height: 100% 2489 } 2490 2491 .indeterminate:after, 2492 .indeterminate:before { 2493 content: ''; 2494 position: absolute; 2495 height: 100% 2496 } 2497 2498 .indeterminate:before { 2499 background-color: #03A9F4; 2500 animation: indeterminate_first 1.5s infinite ease-out 2501 } 2502 2503 .indeterminate:after { 2504 background-color: #4FC3F7; 2505 animation: indeterminate_second 1.5s infinite ease-in 2506 } 2507 2508 @keyframes indeterminate_first { 2509 0% { 2510 left: -100%; 2511 width: 100% 2512 } 2513 2514 100% { 2515 left: 100%; 2516 width: 10% 2517 } 2518 } 2519 2520 @keyframes indeterminate_second { 2521 0% { 2522 left: -150%; 2523 width: 100% 2524 } 2525 2526 100% { 2527 left: 100%; 2528 width: 10% 2529 } 2530 } 2531 2532 .neo_loader { 2533 position: fixed; 2534 top: 0; 2535 left: 0; 2536 right: 0; 2537 bottom: 0; 2538 z-index: 9999999999999999999999; 2539 background: #fff; 2540 height: 100vh; 2541 width: 100vw; 2542 display: flex; 2543 flex-direction: column; 2544 justify-content: center; 2545 align-items: center; 2546 padding: 40px; 2547 box-sizing: border-box; 2548 text-align: center; 2549 } 2550 2551 .neo_loader .loaderline { 2552 width: 400px; 2553 margin: 40px; 2554 max-width: 90vw 2555 } 2556 2557 .loadername { 2558 color: #bbb; 2559 font-family: Helvetica, Arial, sans-serif; 2560 margin: 10px auto 15px 2561 } 2562 2563 .linear-activity.gray { 2564 background-color: #eaeaea 2565 } 2566 2567 .gray .indeterminate:after, 2568 .gray .indeterminate:before { 2569 background-color: #bbb 2570 } 2571 2572 .neo_megacontainer { 2573 display: none 2574 } 2575 </style> 2576 2577 <img loading="lazy" style=" max-height: 200px; max-width: 200px; object-fit: contain; margin-bottom: 20px;" src="https://files-p.pxsol.com/13307/company/library/user/5126930364ea8a9a40b647af1c2cabae351ef5e772.png" alt="San Remo Hoteles"> 2578 <div class="loadername"> 2579 San Remo Hoteles </div> 2580 <div class="loaderline"> 2581 <div class="linear-activity gray"> 2582 <div class="indeterminate"></div> 2583 </div> 2584 </div> 2585 </div> 2586 2587 <div class="neo_megacontainer index"> 2588 2589 2590 2591 2592 2593<div class="main_wraper_top" id="main_wraper_top"> 2594 2595 2596<div class="neo_template_container neo_template_ computer"> 2597 2598 2599<div id='amerian_supratop' class="amerian_top_container diplo_top_container flex flex-m-center" ><div id='diploTopContainer' class="flex flex-s-center amerian_main_top" ><a class="diplo_top_logo padding-5 padding-left-20 fullh" href="/pt/" target=""> <img loading="lazy" class="diplo_top_logo_img fullh" lazy-src="https://files-p.pxsol.com/13307/company/library/user/5126930364ea8a9a40b647af1c2cabae351ef5e772.png" alt="San Remo Hoteles" > </image></a><div id='diploMenuTop' class="amerian_menu_container flex-column flex-grow fullh padding-left-20 padding-right-20" ><div class="amerian_supramenu flex flex-s-center padding-20" ><div class='diplo_idiomas fullh' ><div class='pxModule_include ModuloWrap_idiomas '><div id="top_menu"> 2600 2601 <div id="contenedor_top"> 2602 <div id="menu_div_top"> 2603 <div class="nav_top flex flex-s-center"> 2604 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="7"> 2610 <div class="texto_idiomaymoneda"> 2611 Moneda - </div> 2612 <div id="deploymoneda" class='cursornormal';> 2613 <div class="monedaactual hidden" cur="ARS"> 2614 ARS $ </div> 2615 </div> 2616 </div> 2617 <div class="texto_idiomaymoneda"> 2618 Idioma - </div> 2619 2620 2621 <div id="deployidioma" class="deployidioma"> 2622 <img alt="Bandera" style="object-fit: contain;" class="bandera" src="/css/images/bnd_pt.png" height="24px" width="24px" /> 2623 </div> 2624 2625 2626 <div id="idiomasshow" class="idiomasshow"> 2627 <div class="titlemenujs"> 2628 Elija el idioma de su preferencia </div> 2629 <div class="idiomaitem"> 2630 <a class="idiomalink" lng="es" href="/?lng=es" ignorar-vista="true" style="width: 100%;"> 2631 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_es.png" height="20" width="20" alt="es" /> 2632 <span class="nameidioma"> 2633 Español </span> 2634 </a> 2635 </div> 2636 <div class="idiomaitem"> 2637 <a class="idiomalink" lng="en" href="/en/?lng=en" ignorar-vista="true" style="width: 100%;"> 2638 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_en.png" height="20" width="20" alt="en" /> 2639 <span class="nameidioma"> 2640 English </span> 2641 </a> 2642 </div> 2643 <div class="idiomaitem"> 2644 <a class="idiomalink" lng="fr" href="/fr/?lng=fr" ignorar-vista="true" style="width: 100%;"> 2645 <img class="bandera" style="object-fit: contain;" src="/css/images/bnd_fr.png" height="20" width="20" alt="fr" /> 2646 <span class="nameidioma"> 2647 Français </span> 2648 </a> 2649 </div> 2650 </div>
2651 </div> 2652 2653 2654 <a href="https://app.reservadirecto.com/auth_web?return_url=https%3A%2F%2Fwww.sanremohoteles.com%2Fauthorize.php%3Fredirect_url%3Dhttps%253A%252F%252Fwww.sanremohoteles.com%252Fpt%252F%253Flng%253Dpt&origin_pos=Sanremohoteles" ignorar-vista="true" class="btn_sesion cta_webcheckin_px margin-sm-right-10" style="text-decoration: none"> 2655 <i class="mdi mdi-account" aria-hidden="true"></i> 2656 <span> 2657 Iniciar Sesión </span> 2658 </a> 2659 2660
2660<script src="https://accounts.google.com/gsi/intermediate"></script>
2660 2661
2661<script src="https://accounts.google.com/gsi/intermediatesupport"></script>
2661 2662 2663 <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.sanremohoteles.com&redirect_url=https%3A%2F%2Fwww.sanremohoteles.com%2Fpt%2F%3Flng%3Dpt&pos=Sanremohoteles"> 2664 </div> 2665 2666 <style> 2667 .neo_login_incentive { 2668 position: fixed; 2669 top: 10rem; 2670 right: calc(1rem + 10px); 2671 width: 375px; 2672 text-align: left; 2673 z-index: 1; 2674 } 2675 2676 .neo_login_incentive>div { 2677 margin: 0; 2678 border-radius: 10px; 2679 } 2680 2681 iframe#onetap_google_intermediate_iframe, 2682 #credential_picker_container, 2683 #credential_picker_container iframe, 2684 iframe[src*="google_one_tap_intermediate_iframe"] { 2685 top: 18.5rem !important; 2686 right: 1rem !important; 2687 } 2688 2689 @media only screen and (max-width: 468px) { 2690 .neo_login_incentive { 2691 display: none !important; 2692 bottom: 0rem; 2693 top: initial; 2694 left: 0; 2695 right: 0; 2696 position: fixed; 2697 width: 100%; 2698 text-transform: initial; 2699 letter-spacing: normal; 2700 font-weight: initial; 2701 } 2702 2703 iframe#onetap_google_intermediate_iframe, 2704 #credential_picker_container, 2705 #credential_picker_container iframe, 2706 iframe[src*="google_one_tap_intermediate_iframe"] { 2707 top: initial !important; 2708 bottom: 5rem !important; 2709 right: initial !important; 2710 z-index: 1; 2711 } 2712 } 2713 </style> 2714
2714<script> 2715 (function() { 2716 var repositioned = false; 2717 var attempts = 0; 2718 var timer = setInterval(function() { 2719 if (repositioned || ++attempts > 60) { clearInterval(timer); return; } 2720 var el = document.getElementById('credential_picker_container') 2721 || document.querySelector('iframe[src*="google_one_tap_intermediate_iframe"]') 2722 || document.getElementById('onetap_google_intermediate_iframe'); 2723 if (el) { 2724 var target = (el.tagName === 'IFRAME' && el.parentElement && el.parentElement.style.position === 'fixed') ? el.parentElement : el; 2725 var isMobile = window.innerWidth <= 468; 2726 if (isMobile) { 2727 target.style.setProperty('top', 'initial', 'important'); 2728 target.style.setProperty('bottom', '5rem', 'important'); 2729 target.style.setProperty('right', 'initial', 'important'); 2730 } else { 2731 target.style.setProperty('top', '18.5rem', 'important'); 2732 target.style.setProperty('right', '1rem', 'important'); 2733 } 2734 repositioned = true; 2735 clearInterval(timer); 2736 } 2737 }, 100); 2738 })(); 2739 </script>
2739 2740 2741 </div> 2742 </div> 2743 </div> 2744 2745</div> 2746</div></div></div></div><div class="diplo_cta padding-20 toggle_search fullh heightplus1" style='display: none'><i class='mdi mdi-room-service-outline margin-right-10 fontsize-20px' ></i><div class="" >Reserve Ahora</div></div></div></div> 2747 2748 2749<div id='mainTopSearch' class="diplo_top_search active_search" ></div> 2750 2751 2752<div id='searchOverlay' class="search_overlay" ></div> 2753 2754</div> 2755 2756</div> 2757 <div class="main_wraper_content" id="main_wraper_content"> 2758 2759 2760<div class="neo_template_container neo_template_ computer"> 2761 2762 2763<div id='introHero' class="full diplo_main_heroimg flex flex-s-end flex-m-center" ><div class="diplo_main_herotxt flex flex-center fullh flex-column flex-center full padding-xs-top-60 padding-lg-top-20" ><div class="diplo_heading diplo_white fontsize-35px fontsize-lg-4em diplo_hero_heading hero_max" >Bienvenidos a San Remo Hoteles</div><div class="margin-top-20 margin-bottom-40" ></div><div id='mainSearchHero' class="chdm_search_hero" ><div class='' LocationSearch='true'> 2764 <div class="neo_template_block neo_marketplace_buscador_v3 pxModule_include ModuloWrap_marketplace_buscador_v3" id="marketplace_buscador_v3" > 2765 2766 2767 <div class="px-mk-buscador-container buscar_lp "> 2768 2769 2770 2771 <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"> 2772 <label class="error px-mk-generalerror nodisplay">Ha ocurrido un error, por favor intente nuevamente</label> 2773 <div class="px-sm-inputcontainer px-mk-fixedwidth-inputcontainer-max"> 2774 <label for="CountryListID" class="px-mk-inputicon ignoreclick"> 2775 <?xml version="1.0" encoding="iso-8859-1"?> 2776<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2777<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" 2778 viewBox="0 0 373.12 373.12" style="enable-background:new 0 0 373.12 373.12;" xml:space="preserve"> 2779<g> 2780 <g> 2781 <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 2782 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 2783 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 2784 C234.667,191.68,191.68,234.667,138.667,234.667z"/> 2785 </g> 2786</g> 2787<g> 2788</g> 2789<g> 2790</g> 2791<g> 2792</g> 2793<g> 2794</g> 2795<g> 2796</g> 2797<g> 2798</g> 2799<g> 2800</g> 2801<g> 2802</g> 2803<g> 2804</g> 2805<g> 2806</g> 2807<g> 2808</g> 2809<g> 2810</g> 2811<g> 2812</g> 2813<g> 2814</g> 2815<g> 2816</g> 2817</svg> 2818 </label> 2819 <div class="px-mk-locationautocomplete"> 2820 <input disabled autocomplete="off" type="search" style='font-size: 16px !important;' name="LocationSearch" id="LocationSearch" maxlength="200" placeholder="¿A dónde vas?" value="" data-testid="location-search"> 2821 <div class="px-mk-locationdropdown"> 2822 <div class="px-mk-locationitem px-mk-everylocation" location-id=""> 2823 <div class="px-mk-locationimg"> 2824 <?xml version="1.0" encoding="iso-8859-1"?> 2825<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2826<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2827<svg version="1.1" id="Capa_1" 2828 xmlns="http://www.w3.org/2000/svg" 2829 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2830 <g> 2831 <g id="public"> 2832 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2833 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2834 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2835 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2836 </g> 2837 </g> 2838</svg> 2839 </div> 2840 <div class="px-mk-locationtxt"> 2841 Buscar en todas las ubicaciones </div> 2842 </div> 2843 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Argentina"> 2844 <div class="px-mk-locationimg"> 2845 <?xml version="1.0" encoding="iso-8859-1"?> 2846<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2847<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2848<svg version="1.1" id="Capa_1" 2849 xmlns="http://www.w3.org/2000/svg" 2850 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2851 <g> 2852 <g id="public"> 2853 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2854 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2855 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2856 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2857 </g> 2858 </g> 2859</svg> 2860 </div> 2861 <div class="px-mk-locationtxt"> 2862 Argentina </div> 2863 </div> 2864 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Santiago del Estero, Argentina"> 2865 <div class="px-mk-locationimg"> 2866 <?xml version="1.0" encoding="iso-8859-1"?> 2867<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2868<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2869<svg version="1.1" id="Capa_1" 2870 xmlns="http://www.w3.org/2000/svg" 2871 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2872 <g> 2873 <g id="public"> 2874 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2875 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2876 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2877 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2878 </g> 2879 </g> 2880</svg> 2881 </div> 2882 <div class="px-mk-locationtxt"> 2883 Santiago del Estero, Argentina </div> 2884 </div> 2885 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Termas de RÃo Hondo, Santiago del Estero, Argentina"> 2886 <div class="px-mk-locationimg"> 2887 <?xml version="1.0" encoding="iso-8859-1"?> 2888<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2889<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2890<svg version="1.1" id="Capa_1" 2891 xmlns="http://www.w3.org/2000/svg" 2892 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2893 <g> 2894 <g id="public"> 2895 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2896 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2897 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2898 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2899 </g> 2900 </g> 2901</svg> 2902 </div> 2903 <div class="px-mk-locationtxt"> 2904 Termas de RÃo Hondo, Santiago del Estero, Argentina </div> 2905 </div> 2906 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Provincia de Buenos Aires, Argentina"> 2907 <div class="px-mk-locationimg"> 2908 <?xml version="1.0" encoding="iso-8859-1"?> 2909<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2910<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2911<svg version="1.1" id="Capa_1" 2912 xmlns="http://www.w3.org/2000/svg" 2913 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2914 <g> 2915 <g id="public"> 2916 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2917 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2918 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2919 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2920 </g> 2921 </g> 2922</svg> 2923 </div> 2924 <div class="px-mk-locationtxt"> 2925 Provincia de Buenos Aires, Argentina </div> 2926 </div> 2927 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Mar del Plata, Provincia de Buenos Aires, Argentina"> 2928 <div class="px-mk-locationimg"> 2929 <?xml version="1.0" encoding="iso-8859-1"?> 2930<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2931<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2932<svg version="1.1" id="Capa_1" 2933 xmlns="http://www.w3.org/2000/svg" 2934 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2935 <g> 2936 <g id="public"> 2937 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2938 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2939 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2940 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2941 </g> 2942 </g> 2943</svg> 2944 </div> 2945 <div class="px-mk-locationtxt"> 2946 Mar del Plata, Provincia de Buenos Aires, Argentina </div> 2947 </div> 2948 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Ciudad Autónoma de Buenos Aires, Argentina"> 2949 <div class="px-mk-locationimg"> 2950 <?xml version="1.0" encoding="iso-8859-1"?> 2951<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2952<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2953<svg version="1.1" id="Capa_1" 2954 xmlns="http://www.w3.org/2000/svg" 2955 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2956 <g> 2957 <g id="public"> 2958 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2959 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2960 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2961 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2962 </g> 2963 </g> 2964</svg> 2965 </div> 2966 <div class="px-mk-locationtxt"> 2967 Ciudad Autónoma de Buenos Aires, Argentina </div> 2968 </div> 2969 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Comuna 1, Ciudad Autónoma de Buenos Aires, Argentina"> 2970 <div class="px-mk-locationimg"> 2971 <?xml version="1.0" encoding="iso-8859-1"?> 2972<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2973<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2974<svg version="1.1" id="Capa_1" 2975 xmlns="http://www.w3.org/2000/svg" 2976 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2977 <g> 2978 <g id="public"> 2979 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 2980 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 2981 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 2982 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 2983 </g> 2984 </g> 2985</svg> 2986 </div> 2987 <div class="px-mk-locationtxt"> 2988 Comuna 1, Ciudad Autónoma de Buenos Aires, Argentina </div> 2989 </div> 2990 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Buenos Aires, Argentina"> 2991 <div class="px-mk-locationimg"> 2992 <?xml version="1.0" encoding="iso-8859-1"?> 2993<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 2994<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 2995<svg version="1.1" id="Capa_1" 2996 xmlns="http://www.w3.org/2000/svg" 2997 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 2998 <g> 2999 <g id="public"> 3000 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3001 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3002 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3003 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3004 </g> 3005 </g> 3006</svg> 3007 </div> 3008 <div class="px-mk-locationtxt"> 3009 Buenos Aires, Argentina </div> 3010 </div> 3011 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Cariló, Buenos Aires, Buenos Aires, Argentina"> 3012 <div class="px-mk-locationimg"> 3013 <?xml version="1.0" encoding="iso-8859-1"?> 3014<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3015<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3016<svg version="1.1" id="Capa_1" 3017 xmlns="http://www.w3.org/2000/svg" 3018 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3019 <g> 3020 <g id="public"> 3021 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3022 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3023 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3024 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3025 </g> 3026 </g> 3027</svg> 3028 </div> 3029 <div class="px-mk-locationtxt"> 3030 Cariló, Buenos Aires, Buenos Aires, Argentina </div> 3031 </div> 3032 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Mar de Ajó, Provincia de Buenos Aires, Argentina"> 3033 <div class="px-mk-locationimg"> 3034
3034 <?xml version="1.0" encoding="iso-8859-1"?> 3035<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3036<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3037<svg version="1.1" id="Capa_1" 3038 xmlns="http://www.w3.org/2000/svg" 3039 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3040 <g> 3041 <g id="public"> 3042 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3043 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3044 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3045 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3046 </g> 3047 </g> 3048</svg> 3049 </div> 3050 <div class="px-mk-locationtxt"> 3051 Mar de Ajó, Provincia de Buenos Aires, Argentina </div> 3052 </div> 3053 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="La Costa, Provincia de Buenos Aires, Argentina"> 3054 <div class="px-mk-locationimg"> 3055 <?xml version="1.0" encoding="iso-8859-1"?> 3056<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3057<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3058<svg version="1.1" id="Capa_1" 3059 xmlns="http://www.w3.org/2000/svg" 3060 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3061 <g> 3062 <g id="public"> 3063 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3064 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3065 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3066 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3067 </g> 3068 </g> 3069</svg> 3070 </div> 3071 <div class="px-mk-locationtxt"> 3072 La Costa, Provincia de Buenos Aires, Argentina </div> 3073 </div> 3074 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="San Clemente del Tuyu, Provincia de Buenos Aires, Argentina"> 3075 <div class="px-mk-locationimg"> 3076 <?xml version="1.0" encoding="iso-8859-1"?> 3077<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3078<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3079<svg version="1.1" id="Capa_1" 3080 xmlns="http://www.w3.org/2000/svg" 3081 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3082 <g> 3083 <g id="public"> 3084 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3085 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3086 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3087 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3088 </g> 3089 </g> 3090</svg> 3091 </div> 3092 <div class="px-mk-locationtxt"> 3093 San Clemente del Tuyu, Provincia de Buenos Aires, Argentina </div> 3094 </div> 3095 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Pinamar, Provincia de Buenos Aires, Argentina"> 3096 <div class="px-mk-locationimg"> 3097 <?xml version="1.0" encoding="iso-8859-1"?> 3098<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3099<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3100<svg version="1.1" id="Capa_1" 3101 xmlns="http://www.w3.org/2000/svg" 3102 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3103 <g> 3104 <g id="public"> 3105 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3106 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3107 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3108 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3109 </g> 3110 </g> 3111</svg> 3112 </div> 3113 <div class="px-mk-locationtxt"> 3114 Pinamar, Provincia de Buenos Aires, Argentina </div> 3115 </div> 3116 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Ostende, Provincia de Buenos Aires, Argentina"> 3117 <div class="px-mk-locationimg"> 3118 <?xml version="1.0" encoding="iso-8859-1"?> 3119<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3120<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3121<svg version="1.1" id="Capa_1" 3122 xmlns="http://www.w3.org/2000/svg" 3123 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3124 <g> 3125 <g id="public"> 3126 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3127 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3128 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3129 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3130 </g> 3131 </g> 3132</svg> 3133 </div> 3134 <div class="px-mk-locationtxt"> 3135 Ostende, Provincia de Buenos Aires, Argentina </div> 3136 </div> 3137 <div class="px-mk-locationitem" style="display:none" location-plaza="" location-id="Villa Gesell, Provincia de Buenos Aires, Argentina"> 3138 <div class="px-mk-locationimg"> 3139 <?xml version="1.0" encoding="iso-8859-1"?> 3140<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3141<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3142<svg version="1.1" id="Capa_1" 3143 xmlns="http://www.w3.org/2000/svg" 3144 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 3145 <g> 3146 <g id="public"> 3147 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 3148 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 3149 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 3150 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 3151 </g> 3152 </g> 3153</svg> 3154 </div> 3155 <div class="px-mk-locationtxt"> 3156 Villa Gesell, Provincia de Buenos Aires, Argentina </div> 3157 </div> 3158 3159 </div> 3160 <input name="LocationID" id="LocationID" hidden value=""> 3161 </div> 3162 3163 </div> 3164 3165 3166 3167 3168 3169 <div class="fechas_ancho_entrada px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 3170 <label class="px-mk-inputicon" for="fechaingreso"> 3171 <?xml version="1.0" encoding="iso-8859-1"?> 3172<svg version="1.1" id="Capa_1" 3173 xmlns="http://www.w3.org/2000/svg" 3174 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"> 3175 <g> 3176 <g> 3177 <g> 3178 <rect x="213.333" y="234.667" width="106.667" height="106.667"/> 3179 <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"/> 3180 </g> 3181 </g> 3182 </g> 3183</svg> </label> 3184 <label class="px-mk-labelinput" for="fechaingreso"> 3185 Fecha de Llegada </label> 3186 <input name="Start" type="text" style="font-size: 16px !important;" onfocus="return false;
3186" readonly id="fechaingreso" class="" value="05/10/2026" placeholder="Llegada" data-testid="date-start" /> 3187 </div> 3188 3189 <div class=" fechas_ancho_salida px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 3190 <label class="px-mk-inputicon" for="fechaegreso"> 3191 <?xml version="1.0" encoding="iso-8859-1"?> 3192<svg version="1.1" id="Capa_1" 3193 xmlns="http://www.w3.org/2000/svg" 3194 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"> 3195 <g> 3196 <g> 3197 <g> 3198 <rect x="213.333" y="234.667" width="106.667" height="106.667"/> 3199 <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"/> 3200 </g> 3201 </g> 3202 </g> 3203</svg> </label> 3204 <label class="px-mk-labelinput" for="fechaegreso"> 3205 Fecha de Salida </label> 3206 <input name="End" type="text" style="font-size: 16px !important;" onfocus="return false;" readonly id="fechaegreso" size="10" value="06/10/2026" class="relative maxzindex pointer" placeholder="Salida" data-testid="date-end" /> 3207 </div> 3208 3209 3210 <div id="NochesError" class="error" style="display:none"></div> 3211 3212 3213 <div class="codigopromocional px-sm-inputcontainer w-padding px-mk-fixedwidth-inputcontainer"> 3214 <label class="px-mk-inputicon" for="fechaegreso"> 3215 <?xml version="1.0" encoding="iso-8859-1"?> 3216<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3217<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" 3218 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> 3219<g> 3220 <g> 3221 <path d="M32,271.692v192c0,17.664,14.368,32,32,32h160v-224H32z"/> 3222 </g> 3223</g> 3224<g> 3225 <g> 3226 <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 3227 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 3228 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 3229 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 3230 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 3231 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 3232 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 3233 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 3234 C360.128,120.716,317.92,143.692,295.776,143.692z"/> 3235 </g> 3236</g> 3237<g> 3238 <g> 3239 <path d="M288,271.692v224h160c17.664,0,32-14.336,32-32v-192H288z"/> 3240 </g> 3241</g> 3242<g> 3243</g> 3244<g> 3245</g> 3246<g> 3247</g> 3248<g> 3249</g> 3250<g> 3251</g> 3252<g> 3253</g> 3254<g> 3255</g> 3256<g> 3257</g> 3258<g> 3259</g> 3260<g> 3261</g> 3262<g> 3263</g> 3264<g> 3265</g> 3266<g> 3267</g> 3268<g> 3269</g> 3270<g> 3271</g> 3272</svg> 3273 </label> 3274 <label class="px-mk-labelinput" for="PromoCode"> 3275 Código Promocional </label> 3276 <input name="Code" type="text" id="PromoCode" size="6" class="relative maxzindex pointer" data-testid="promo-code" /> 3277 </div> 3278 3279 3280 3281 3282<style> 3283 /* Quitar flechitas de inputs number en Chrome, Safari, Edge, Opera */ 3284 .neo_partyselector_quantity::-webkit-outer-spin-button, 3285 .neo_partyselector_quantity::-webkit-inner-spin-button { 3286 -webkit-appearance: none; 3287 margin: 0; 3288 } 3289 3290 /* Desktop - mantener original, todo en una lÃnea */ 3291 .txtPartyGroup .guests-row, 3292 .txtPartyGroup .rooms-row { 3293 display: inline; 3294 } 3295 3296 /* Nacionalidad label - desktop #000, mobile #333 */ 3297 .nacionalidad-label { 3298 color: #000 !important; 3299 } 3300 3301 @media only screen and (max-width: 650px) { 3302 .nacionalidad-label { 3303 color: #333 !important; 3304 } 3305 } 3306 3307 .txtPartyGroup .party-number { 3308 margin-right: 4px; 3309 } 3310 3311 .txtPartyGroup .party-separator { 3312 color: #999; 3313 margin: 0 4px; 3314 } 3315 3316 /* Mobile - formato de dos lÃneas mejorado */ 3317 @media only screen and (max-width: 650px) { 3318 3319 /* Ocultar separador entre huéspedes y habitaciones en mobile */ 3320 .txtPartyGroup .rooms-separator { 3321 display: none; 3322 } 3323 3324 .txtPartyGroup { 3325 display: flex; 3326 flex-direction: column; 3327 align-items: flex-start; 3328 gap: 2px; 3329 font-size: 15px; 3330 line-height: 1.4;
3331 color: #555; 3332 } 3333 3334 .txtPartyGroup .guests-row { 3335 display: flex; 3336 align-items: center; 3337 flex-wrap: wrap; 3338 } 3339 3340 .txtPartyGroup .party-item { 3341 display: inline-flex; 3342 align-items: baseline; 3343 white-space: nowrap; 3344 } 3345 3346 .txtPartyGroup .party-number { 3347 font-weight: 700; 3348 color: #333; 3349 margin-right: 4px; 3350 } 3351 3352 .txtPartyGroup .party-label { 3353 color: #666; 3354 } 3355 3356 .txtPartyGroup .party-separator { 3357 color: #ccc; 3358 margin: 0 8px; 3359 } 3360 3361 .txtPartyGroup .rooms-row { 3362 display: block; 3363 color: #666; 3364 margin: 0; 3365 padding: 0; 3366 text-align: left; 3367 } 3368 3369 .SelectorInitial { 3370 min-height: 65px; 3371 padding: 12px 45px 12px 14px; 3372 display: flex; 3373 align-items: center; 3374 } 3375 3376 .PartyTypeSimulatorContainer { 3377 overflow: visible; 3378 } 3379 3380 /* Ajuste para los labels del selector */ 3381 .neo_party_selector>div:first-child { 3382 display: flex; 3383 flex-direction: column; 3384 min-width: 0; 3385 } 3386 3387 .neo_party_selector>div:first-child>div { 3388 white-space: nowrap; 3389 overflow: visible; 3390 font-size: 14px; 3391 font-weight: 500; 3392 } 3393 3394 .neo_party_selector>div:first-child>div:last-child { 3395 font-size: 12px; 3396 color: #888; 3397 margin-top: 3px; 3398 white-space: nowrap; 3399 font-weight: 400; 3400 } 3401 3402 /* Asegurar que en mobile los controles sigan alineados a la derecha */ 3403 .neo_party_selector { 3404 display: flex; 3405 justify-content: space-between; 3406 align-items: center; 3407 width: 100%; 3408 margin-bottom: 14px; 3409 padding-bottom: 14px; 3410 border-bottom: 1px solid #f0f0f0; 3411 } 3412 3413 .neo_party_selector:last-of-type { 3414 border-bottom: none; 3415 margin-bottom: 0; 3416 padding-bottom: 0; 3417 } 3418 3419 .neo_party_selector>div:last-child { 3420 display: flex; 3421 align-items: center; 3422 justify-content: flex-end; 3423 flex-shrink: 0; 3424 margin-left: 15px; 3425 } 3426 3427 .neo_party_selector .flex.flex-s-center { 3428 display: flex; 3429 align-items: center; 3430 gap: 4px; 3431 } 3432 } 3433 3434 /* Estilos para alinear correctamente los controles numéricos */ 3435 .neo_party_selector { 3436 display: flex !important; 3437 justify-content: space-between !important; 3438 align-items: center !important; 3439 width: 100% !important; 3440 margin-bottom: 15px !important; 3441 } 3442 3443 .neo_party_selector>div:first-child { 3444 flex: 1 !important; 3445 min-width: 0 !important; 3446 } 3447 3448 .neo_party_selector>div:last-child { 3449 display: flex !important; 3450 align-items: center !important; 3451 justify-content: flex-end !important; 3452 flex-shrink: 0 !important; 3453 margin-left: 15px !important; 3454 } 3455 3456 /* Asegurar que los botones y input estén alineados correctamente */ 3457 .neo_party_selector .flex.flex-s-center { 3458 display: flex !important; 3459 align-items: center !important; 3460 gap: 3px !important; 3461 } 3462</style> 3463 3464<div class="relative PartyTypeSimulatorContainer"> 3465 <div class="PartyTypeSimulator px-sm-inputcontainer w-padding" style="border-right: none" maxadult="6" maxchild="5" maxrooms="4"> 3466 <div class="SelectorInitial" data-testid="guest-selector-trigger"> 3467 <span class="txtPartyGroup" style="align-items: flex-start !important;"> 3468 <span class="guests-row"> 3469 <span class="party-item txtAdults"> 3470 <span class="party-number numberAdults">2</span> 3471 <span class="party-label txtAdultsTxt" plural="adultos" singular="adulto"> 3472 adultos </span> 3473 </span> 3474 <span class="party-item txtChildren" style="display:none;"> 3475 <span class="party-separator">â¢</span> 3476 <span class="party-number numberChildren">0</span> 3477 <span class="party-label txtChildrenTxt" plural="niños" singular="niño"> 3478 niño </span> 3479 </span> 3480 <span class="party-item txtBabies" style="display:none;"> 3481 <span class="party-separator">â¢</span> 3482 <span class="party-number numberBabies">0</span> 3483 <span class="party-label txtBabiesTxt" plural="bebés" singular="bebé"> 3484 bebé </span> 3485 </span> 3486 </span> 3487 <span class="rooms-separator party-separator">â¢</span> 3488 <span class="rooms-row txtRooms"> 3489 <span class="party-number numberRooms">1</span> 3490 <span 3491 class="party-label txtRoomsTxt" 3492 plural="habitaciones" 3493 singular="habitación"> 3494 habitación </span> 3495 </span> 3496 </span> 3497 <label class='ignoreclick px-mk-inputicon'> 3498 <?xml version="1.0" encoding="iso-8859-1"?> 3499<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3500<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" 3501 viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> 3502<g> 3503 <g> 3504 <g> 3505 <path d="M309.333,213.333c29.44,0,53.12-23.893,53.12-53.333s-23.68
3505-53.333-53.12-53.333S256,130.56,256,160 3506 S279.893,213.333,309.333,213.333z"/> 3507 <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 3508 C85.333,163.307,114.027,192,149.333,192z"/> 3509 <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 3510 C181.333,236.693,163.307,234.667,149.333,234.667z"/> 3511 <path d="M309.333,256C270.187,256,192,275.627,192,314.667v48h234.667v-48C426.667,275.627,348.48,256,309.333,256z"/> 3512 </g> 3513 </g> 3514</g> 3515<g> 3516</g> 3517<g> 3518</g> 3519<g> 3520</g> 3521<g> 3522</g> 3523<g> 3524</g> 3525<g> 3526</g> 3527<g> 3528</g> 3529<g> 3530</g> 3531<g> 3532</g> 3533<g> 3534</g> 3535<g> 3536</g> 3537<g> 3538</g> 3539<g> 3540</g> 3541<g> 3542</g> 3543<g> 3544</g> 3545</svg> 3546 </label> 3547 </div> 3548 </div> 3549 <div class="PartyTypeSimulatorSelect nodisplay padding-xs-20"> 3550 <div class="flex-column full"> 3551 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3552 <div> 3553 <div>Adultos</div> 3554 <div style="font-size: 11px; color: #888; margin-top: 2px;"> 3555 11 años o más </div> 3556 </div> 3557 <div class="flex flex-s-center"> 3558 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_minus_button" type='button' party-type="adults" action-type='minus' data-testid="adults-minus">-</button> 3559 <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" /> 3560 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_plus_button" type='button' party-type="adults" action-type='plus' data-testid="adults-plus">+</button> 3561 </div> 3562 </div> 3563 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3564 <div> 3565 <div>Menores</div> 3566 <div style="font-size: 11px; color: #888; margin-top: 2px;"> 3567 Hasta 10 años </div> 3568 </div> 3569 <div class="flex flex-s-center"> 3570 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_minus_button" type='button' party-type="children" action-type='minus' data-testid="children-minus">-</button> 3571 <input type="number" inputmode="numeric" query-default="0" class="neo_partyselector_quantity" party-type="children" val="0" value="0" onchange="handlePartyInputChange(this);" min="0" max="5" 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="children-input" /> 3572 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_plus_button" type='button' party-type="children" action-type='plus' data-testid="children-plus">+</button> 3573 </div> 3574 </div> 3575 <div class="neo_party_selector neo_adults_selector flex flex-m-sb flex-s-center"> 3576 <div>Habitaciones</div> 3577 <div class="flex flex-s-center"> 3578 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_minus_button" type='button' party-type="rooms" action-type='minus' data-testid="rooms-minus">-</button> 3579 <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" /> 3580 <button onclick="alterPartyGroup(this);" class="neo_button_partyselector neo_plus_button" type='button' party-type="rooms" action-type='plus' data-testid="rooms-plus">+</button> 3581 </div> 3582 </div> 3583 </div> 3584 <div class="ChildrenAgesContainer nodisplay"> 3585 <div class="flex-column"> 3586 <div class="texto padding-xs-bottom-20" style="font-size: 12px !important;">¿Qué edades tienen los menores con los que viajas?</div> 3587 <div class="ChildrensAges" child-id="0" style="max-height: 200px !important; overflow-y: auto !important; padding-right: 5px !important;"> 3588 <div class="ChildrensAgesSelectContainer" child-id="0" style="margin-bottom: 10px !important;"> 3589 <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"> 3590 <option value="" disabled selected>Edad el dÃa del check-out</option> 3591 <option value="0">0 años</option> 3592 <option value="1">1 año</option> 3593 <option value="2">2 años</option> 3594 <option value="3">3 años</option> 3595 <option value="4">4 años</option> 3596 <option value="5">5 años</option> 3597 <option value="6">6 años</option> 3598 <option value="7">7 años</option> 3599 <option value="8">8 años</option> 3600 <option value="9">9 años</option> 3601 <option value="10">10 años</option> 3602 </select> 3603 </div>
3604 </div> 3605 <div class="NotValidChildrens nodisplay animated shake"><i class="fa fa-exclamation" aria-hidden="true"></i> Seleccione edad de los menores por favor</div> 3606 </div> 3607 </div> 3608 3609 3610 3611 </div> 3612 3613</div> 3614
3615<script> 3616 // Global flag to track if ages have been initialized 3617 var childrenAgesInitialized = false; 3618 3619 // Function to initialize children ages from GroupsForm 3620 function initializeChildrenAgesFromGroupsForm(force) { 3621 // Only initialize once unless forced 3622 if (childrenAgesInitialized && !force) { 3623 return; 3624 } 3625 3626 try { 3627 } catch (e) { 3628 console.error('Error initializing children ages:', e); 3629 } 3630 } 3631 3632 // Call initialization on page load (in case selects already exist) 3633 $(document).ready(function() { 3634 // Wait a bit to ensure selects are created 3635 setTimeout(function() { 3636 initializeChildrenAgesFromGroupsForm(); 3637 }, 100); 3638 }); 3639</script>
3639 3640 <input name="MaxRooms" type="hidden" id="MaxRooms" value="4" /> 3641 <input name="Nights" type="hidden" id="Nights" /> 3642 <input name="Channel" type="hidden" id="Channel" value="2" /> 3643 <input name="RateType" type="hidden" id="RateType" value="auto" /> 3644 <input name="Pos" type="hidden" id="Pos" value='Sanremohoteles' /> 3645 <input name="Lng" type="hidden" id="Lng" value='pt' /> 3646 <input name="Currency" type="hidden" id="Currency" value="ARS" /> 3647 <input name="MaxAgeChildrenNumber" type="hidden" id="MaxAgeChildrenNumber" value="10" /> 3648 <input name="MaxAgeBabiesNumber" type="hidden" id="MaxAgeBabiesNumber" value="1" /> 3649 <input name="MaxBabiesNumber" type="hidden" id="MaxBabiesNumber" value="2" /> 3650 <input name="ReturnUrl" type="hidden" id="ReturnUrl" value="https://www.sanremohoteles.com/pt/list.html" /> 3651 3652 <input name="FromUrl" type="hidden" id="FromUrl" value="https://www.sanremohoteles.com/pt/" /> 3653 <input name="Tag" type="hidden" id="Tag" value="" /> 3654 <input name="Source" id="Source" type="hidden" value="Contact Form"> 3655 3656 <input name="ProductTimezone" id="ProductTimezone" type="hidden" value="America/Argentina/Buenos_Aires"> 3657 <input name="GlobalDaysModifier" id="GlobalDaysModifier" type="hidden" value="0"> 3658 3659 <input name="SearchID" type="hidden" id="SearchID" value="0" /> 3660 3661 <input name="FromPID" type="hidden" id="FromPID" value="19322" /> 3662 3663 <input name="Type" type="hidden" id="Type" value="Hotel" /> 3664 3665 3666 <input name="ProductID" type="hidden" id="ProductID" value="19322" /> 3667 3668 <input name="ListID" type="hidden" id="ListID" value="910" /> 3669 3670 <input name="Location" type="hidden" id="Location" value="" /> 3671 3672 <input name="Device" type="hidden" id="Device" value="Computer" /> 3673 <input name="UserID" type="hidden" id="UserID" value="0" /> 3674 <input name="tag" type="hidden" id="tag" class="tag_cookie" value="" /> 3675 <input name="Email" type="hidden" id="Email" value="" /> 3676 <input name="UserType" type="hidden" id="UserType" value="" /> 3677 <input name="AgreementType" type="hidden" id="AgreementType" value="" /> 3678 3679 <input name="GroupsForm" type="hidden" id="GroupsForm" value="1:2,0,0" /> 3680 3681 3682 3683 3684 3685 3686 <input name="SkuID" type="hidden" id="SkuID" value="" /> 3687 3688 3689 <div class="nodisplay" id="MinNightsError"> 3690 El minimo de noches debe ser mayor o igual a 0 </div> 3691 3692 <input name="MinNights" type="hidden" id="MinNights" value="0" /> 3693 3694 <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="Buscando" data-testid="search-button"> 3695 <span class="update-search-span">Ver Tarifas</span> 3696 <label for="" class="px-mk-searchicon px-mk-inputicon ignoreclick"> 3697 <?xml version="1.0" encoding="iso-8859-1"?> 3698<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3699<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" 3700 viewBox="0 0 373.12 373.12" style="enable-background:new 0 0 373.12 373.12;" xml:space="preserve"> 3701<g> 3702 <g> 3703 <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 3704 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 3705 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 3706 C234.667,191.68,191.68,234.667,138.667,234.667z"/> 3707 </g> 3708</g> 3709<g> 3710</g> 3711<g> 3712</g> 3713<g> 3714</g> 3715<g> 3716</g> 3717<g> 3718</g> 3719<g> 3720</g> 3721<g> 3722</g> 3723<g> 3724</g> 3725<g> 3726</g> 3727<g> 3728</g> 3729<g> 3730</g> 3731<g> 3732</g> 3733<g> 3734</g> 3735<g> 3736</g> 3737<g> 3738</g> 3739</svg> 3740 </label> 3741 <label for="" class="px-mk-searchloader px-mk-inputicon nodisplay ignoreclick"> 3742 <?xml version="1.0" encoding="iso-8859-1"?> 3743<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 3744<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3745<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" 3746 width="26.349px" height="26.35px" viewBox="0 0 26.349 26.35" style="enable-background:new 0 0 26.349 26.35;" 3747 xml:space="preserve"> 3748<g> 3749 <g> 3750 <circle cx="13.792" cy="3.082" r="3.082"/> 3751 <circle cx="13.792" cy="24.501" r="1.849"/> 3752 <circle cx="6.219" cy="6.218" r="2.774"/> 3753 <circle cx="21.365" cy="21.363" r="1.541"/> 3754 <circle cx="3.082" cy="13.792" r="2.465"/> 3755 <circle cx="24.501" cy="13.791" r="1.232"/> 3756 <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 3757 C6.902,18.996,5.537,18.988,4.694,19.84z"/> 3758 <circle cx="21.364" cy="6.218" r="0.924"/> 3759 </g> 3760</g> 3761<g> 3762</g> 3763<g> 3764</g> 3765<g> 3766</g> 3767<g> 3768</g> 3769<g> 3770</g> 3771<g> 3772</g> 3773<g> 3774</g> 3775<g> 3776</g> 3777<g> 3778</g> 3779<g> 3780</g> 3781<g> 3782</g> 3783<g> 3784</g> 3785<g> 3786</g> 3787<g> 3788</g> 3789<g> 3790</g> 3791</svg> 3792 </label>
3793 </div> 3794 3795 </form> 3796 3797 <input type="hidden" id="MainPos" value="Sanremohoteles"> 3798 3799 3800 </div> 3801 3802 3803 3804<div id="dataconfig" product-timezone="America/Argentina/Buenos_Aires" urldispo="id=19322&RateID=24629&start=2026-10-05" class="nodisplay" lng="pt" DatePickerStart="0"></div> 3805 3806<link rel="stylesheet" href="https://unpkg.com/tippy.js@6/animations/scale.css" />
3807<script src="https://unpkg.com/@popperjs/core@2"></script>
vendor: 1 bytes, line 3807
3807
3808<script src="https://unpkg.com/tippy.js@6"></script>
3808 3809
3809<script defer src="/neo_modules/marketplace_buscador_v8/js.js?filev=1778144039" type="text/javascript"></script>
3809 3810<style>/* ------------ VARIABLES ------------ */ 3811@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"); 3812.px-mk-buscador-container { 3813 font-size: 12px; 3814} 3815 3816#MinNightsError { 3817 float: left; 3818 width: calc(100% - 22px); 3819 padding: 10px; 3820 border: 1px solid #982828; 3821 line-height: 20px; 3822 background: #f3e8e8; 3823 color: #000; 3824} 3825 3826.NotValidChildrens { 3827 width: 100%; 3828 float: left; 3829 text-align: center; 3830 color: #800; 3831 font-size: 1em; 3832 font-weight: bold; 3833 padding: 10px 0px; 3834} 3835 3836.update-search-span { 3837 font-weight: 400; 3838 margin-right: 10px; 3839} 3840 3841.ChildrensAgesSelect.notvalid { 3842 border: 1px solid #b51212 !important; 3843} 3844 3845.buscar_lp .buscar_lp_beforerate { 3846 display: none; 3847} 3848 3849.buscar_lp .NochesError { 3850 display: none; 3851} 3852 3853#NochesError { 3854 background: white; 3855 border-right: 1px solid #ccc; 3856 display: flex; 3857 justify-content: center; 3858 align-items: center; 3859} 3860 3861.buscar_lp .TextoFormulario { 3862 float: left; 3863 width: auto; 3864 margin-right: 10px; 3865 text-transform: capitalize; 3866 padding-top: 5px; 3867 font-size: 13px; 3868} 3869 3870.buscar_lp .imput_text_rooms { 3871 font-size: 1em; 3872 padding: 4px 2px; 3873 border: 1px solid #eaeaea; 3874 margin-right: 10px; 3875 float: left; 3876 max-width: 35px; 3877} 3878 3879.buscar_lp .roomtypecontariner { 3880 float: left; 3881 width: auto; 3882} 3883 3884.buscar_lp .bucle { 3885 float: left; 3886 width: auto; 3887} 3888 3889.button_bucar { 3890 float: right; 3891 width: auto; 3892 border: 1px solid #999; 3893 font-size: 14px; 3894 padding: 4px 10px; 3895 background: #eaeaea; 3896 color: #000; 3897} 3898 3899.button_bucar:hover { 3900 background: #999; 3901 color: #fff; 3902 cursor: pointer; 3903} 3904 3905.ContenidoHab { 3906 overflow: hidden; 3907 width: 100%; 3908 margin-bottom: 5px; 3909} 3910 3911.px-mk-buscador-container.buscar_lp .SelectorInitial { 3912 padding: 1em; 3913 margin: 0; 3914 cursor: pointer; 3915 border: none; 3916 box-sizing: border-box; 3917 font-size: 1.1em; 3918 text-overflow: ellipsis; 3919 overflow: hidden; 3920 min-width: 150px; 3921 text-align: left; 3922 padding-right: 2rem !important; 3923 width: 100%; 3924 height: 100%; 3925 display: flex; 3926 background: transparent !important; 3927 align-items: center; 3928} 3929.px-mk-buscador-container.buscar_lp .SelectorInitial .texto { 3930 font-weight: bold; 3931} 3932 3933.px-mk-buscador-container.buscar_lp .RoomsSelectContainer { 3934 width: 100%; 3935 padding-bottom: 5px; 3936 margin-bottom: 5px; 3937 border-bottom: 1px dotted #ccc; 3938 display: flex; 3939 align-items: center; 3940} 3941.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .RoomNameContainer { 3942 width: calc(40% - 10px); 3943 margin-right: 10px; 3944 text-transform: capitalize; 3945 font-size: 1em; 3946 color: #444; 3947} 3948.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .texto { 3949 float: left; 3950 width: 100%; 3951 padding-bottom: 3px; 3952 font-size: 14px; 3953 color: #444; 3954} 3955.px-mk-buscador-container.buscar_lp .RoomsSelectContainer select { 3956 border: 1px solid #d0d0d0; 3957 width: 100%; 3958 border-radius: 4px; 3959 padding: 2px; 3960 color: #666; 3961 font-size: 11px; 3962 margin-bottom: 5px; 3963 cursor: pointer; 3964} 3965.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer { 3966 width: 60%; 3967} 3968.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .AdultsContainer, 3969.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .ChildrensContainers { 3970 display: flex; 3971 flex-direction: column; 3972 justify-content: center; 3973 align-items: center; 3974 flex: 1; 3975 margin: 3px; 3976} 3977.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .AdultsContainer > *, 3978.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .hostPeopleContainer .ChildrensContainers > * { 3979 flex-grow: 1; 3980 width: 100%; 3981} 3982.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges { 3983 float: left; 3984 width: 100%; 3985 margin-top: 5px; 3986} 3987.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .ChildrensAgesSelect { 3988 float: left; 3989 width: calc(50% - 5px) !important; 3990 margin-right: 5px; 3991 margin-bottom: 5px; 3992} 3993.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .ChildrensAgesSelect:nth-child(even) { 3994 float: right !important; 3995 margin-right: 0px; 3996} 3997.px-mk-buscador-container.buscar_lp .RoomsSelectContainer .hostContainer .ChildrensAges .texto { 3998 float: left; 3999 width: 100%; 4000 padding-bottom: 3px; 4001 font-size: 14px; 4002 color: #444; 4003} 4004 4005.px-mk-buscador-container.buscar_lp .px-mk-addnewroom, 4006.px-mk-buscador-container.buscar_lp .px-mk-removeroom { 4007 flex: 1; 4008 cursor: pointer; 4009 margin: 3px; 4010} 4011.px-mk-buscador-container.buscar_lp .px-mk-addnewroom.nodisplay, 4012.px-mk-buscador-container.buscar_lp .px-mk-removeroom.nodisplay { 4013 display: none; 4014} 4015.px-mk-buscador-container.buscar_lp .px-mk-addnewroom svg, 4016.px-mk-buscador-container.buscar_lp .px-mk-removeroom svg { 4017 height: 18px; 4018 width: 18px; 4019 fill: currentColor; 4020 margin-left: 3px; 4021} 4022.px-mk-buscador-container.buscar_lp .px-mk-addnewroom button, 4023.px-mk-buscador-container.buscar_lp .px-mk-removeroom button { 4024 width: 100%; 4025 display: flex; 4026 align-items: center; 4027 justify-content: center; 4028 text-align: center; 4029 background: #f3f3f3; 4030 border: 1px solid #ccc; 4031 padding: 5px 0px; 4032 box-sizing: border-box; 4033 border-radius: 30px; 4034 color: #444; 4035 font-size: 0.9em; 4036 text-transform: capitalize; 4037 cursor: pointer; 4038} 4039.px-mk-buscador-container.buscar_lp .px-mk-addnewroom button span, 4040.px-mk-buscador-container.buscar_lp .px-mk-removeroom button span { 4041 text-transform: capitalize; 4042 line-height: 1; 4043} 4044 4045.px-mk-buscador-container.buscar_lp { 4046 display: flex; 4047 align-items: center; 4048 height: 100%; 4049 padding: 3px; 4050 box-sizing: border-box; 4051 transition: 0.3s ease-out; 4052} 4053.px-mk-buscador-container.buscar_lp #MultiplePartySelect { 4054 float: left; 4055 flex-direction: column; 4056 display: flex; 4057 width: calc(100% - 12px); 4058 padding: 5px; 4059 background: #fff; 4060 border: 1px solid #ddd; 4061 margin: 0px; 4062 position: absolute; 4063 top: 100%; 4064 min-width: 250px; 4065 z-index: 11; 4066 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 4067} 4068.px-mk-buscador-container.buscar_lp #MultiplePartySelect.nodisplay { 4069 display: none; 4070} 4071.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect { 4072 background: #fff; 4073 border: 1px solid #ddd; 4074 margin: 0px; 4075 position: absolute; 4076 top: 100%; 4077 left: 0; 4078 display: flex; 4079 z-index: 99; 4080 flex-direction: column; 4081} 4082.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer { 4083 height: 50px;
4084 border-right: none; 4085 border-bottom: 1px solid #ccc; 4086 cursor: pointer; 4087 padding: 1em 4em 1em 1em; 4088 box-sizing: border-box; 4089} 4090.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer:last-child { 4091 border-bottom: none; 4092} 4093.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer .texto { 4094 padding: 0px; 4095 display: flex; 4096 align-items: center; 4097 text-align: left; 4098 font-size: 14px; 4099 color: #888; 4100} 4101.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect .px-sm-inputcontainer .texto:hover { 4102 color: #444; 4103} 4104.px-mk-buscador-container.buscar_lp .PartyTypeSimulatorSelect.nodisplay { 4105 display: none; 4106} 4107.px-mk-buscador-container.buscar_lp .px-mk-searchform { 4108 float: none; 4109 width: auto; 4110 display: flex; 4111 align-items: center; 4112 height: 60px; 4113 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 4114} 4115.px-mk-buscador-container.buscar_lp .px-mk-searchform > * { 4116 height: 100%; 4117 margin: 0; 4118 float: none; 4119 position: relative; 4120 flex-shrink: 0; 4121 flex-grow: 1; 4122} 4123.px-mk-buscador-container.buscar_lp .px-mk-searchform .px-sm-searchbtn { 4124 min-width: 18em; 4125} 4126 4127.ModuloWrap_marketplace_buscador_v3.isolate::after { 4128 content: ""; 4129 position: fixed; 4130 top: 0; 4131 left: 0; 4132 width: 100vw; 4133 height: 100vh; 4134 background: rgba(0, 0, 0, 0.3); 4135 z-index: -1; 4136 bottom: 0; 4137 right: 0; 4138 -webkit-backdrop-filter: blur(5px); 4139 backdrop-filter: blur(5px); 4140 animation: appearIsolate 1s cubic-bezier(0.165, 0.84, 0.44, 1) forwards; 4141} 4142 4143@keyframes appearIsolate { 4144 from { 4145 opacity: 0; 4146 } 4147 to { 4148 opacity: 1; 4149 } 4150} 4151.px-sm-inputcontainer { 4152 display: flex; 4153 position: relative; 4154 border-right: 1px solid #ccc; 4155 transition: 0.3s ease-out; 4156 cursor: pointer; 4157 flex-direction: column; 4158 justify-content: center; 4159 align-items: flex-start; 4160 text-align: left; 4161 box-sizing: border-box; 4162 background-color: white; 4163} 4164.px-sm-inputcontainer .hasDatepicker { 4165 cursor: pointer !important; 4166} 4167.px-sm-inputcontainer input { 4168 border-bottom: none !important; 4169 box-shadow: none !important; 4170} 4171.px-sm-inputcontainer label.error { 4172 background: #bf0000; 4173 float: none; 4174 min-width: 100%; 4175 margin: 0px; 4176 left: 0; 4177 padding: 10px 20px; 4178 box-sizing: border-box; 4179 top: 100%; 4180 bottom: initial; 4181 right: auto; 4182 transform: translatey(0); 4183 color: white; 4184 font-weight: 400; 4185 text-transform: uppercase; 4186 font-size: 10px; 4187 letter-spacing: 2px; 4188 position: absolute; 4189 line-height: 1.6em; 4190} 4191.px-sm-inputcontainer.px-mk-fixedwidth-inputcontainer { 4192 width: 11em; 4193} 4194.px-sm-inputcontainer.px-mk-fixedwidth-inputcontainer-max { 4195 width: 18em; 4196} 4197.px-sm-inputcontainer.w-padding { 4198 padding: 0.6em 1em; 4199} 4200.px-sm-inputcontainer .px-mk-labelinput { 4201 margin-bottom: 3px; 4202 font-size: 13px; 4203 opacity: 1; 4204 cursor: pointer; 4205 margin-top: 3px; 4206} 4207.px-sm-inputcontainer .px-mk-inputicon { 4208 position: absolute; 4209 z-index: 2; 4210 right: 1.2em; 4211 color: #aaa; 4212 top: 50%; 4213 transform: translatey(-50%); 4214 font-size: 1.2em; 4215 transition: 0.3s ease-out; 4216 cursor: pointer; 4217} 4218.px-sm-inputcontainer .px-mk-inputicon svg { 4219 height: 1.2em; 4220 width: 1.2em; 4221 fill: currentColor; 4222} 4223.px-sm-inputcontainer.nodisplay { 4224 display: none; 4225} 4226.px-sm-inputcontainer:last-child { 4227 border-right: none; 4228} 4229.px-sm-inputcontainer input, 4230.px-sm-inputcontainer select, 4231.px-sm-inputcontainer textarea { 4232 position: relative; 4233 -webkit-appearance: none; 4234 -moz-appearance: none; 4235 border: none; 4236 box-sizing: border-box; 4237 font-size: 1.1em; 4238 text-overflow: ellipsis; 4239 height: auto; 4240 transition: inherit; 4241 background-color: transparent; 4242 max-width: 100%; 4243 width: 100%; 4244} 4245.px-sm-inputcontainer input option, 4246.px-sm-inputcontainer select option, 4247.px-sm-inputcontainer textarea option { 4248 background-color: #fff; 4249} 4250.px-sm-inputcontainer input[type=text]:not(.hasDatepicker), 4251.px-sm-inputcontainer select[type=text]:not(.hasDatepicker), 4252.px-sm-inputcontainer textarea[type=text]:not(.hasDatepicker) { 4253 cursor: text; 4254} 4255.px-sm-inputcontainer input { 4256 padding: 0px; 4257 margin: 0px !important; 4258} 4259.px-sm-inputcontainer > select { 4260 padding: 1em 4em 1em 1em; 4261 height: 100%; 4262 width: 100%; 4263 cursor: pointer; 4264 white-space: initial; 4265} 4266.px-sm-inputcontainer > select::-ms-expand { 4267 display: none; 4268 /* hide the default arrow in ie10 and ie11 */ 4269} 4270.px-sm-inputcontainer:hover { 4271 background-color: #f0f0f0; 4272} 4273.px-sm-inputcontainer:hover label {
4274 color: #e0ae1b; 4275} 4276 4277.px-mk-searchinfo + .px-mk-buscador-container .px-mk-searchform { 4278 width: 100%; 4279} 4280.px-mk-searchinfo .px-mk-searchinfo-inner { 4281 width: 100%; 4282 height: 40px; 4283 background: #fafafa; 4284 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 4285 border-radius: 2px; 4286 text-transform: uppercase; 4287 font-size: 1em; 4288 box-sizing: border-box; 4289 font-weight: 600; 4290} 4291.px-mk-searchinfo .px-mk-searchinfo-inner > div { 4292 text-align: center; 4293 border-right: 1px solid #ccc; 4294 padding: 0 20px; 4295 box-sizing: border-box; 4296 height: 100%; 4297} 4298.px-mk-searchinfo .px-mk-searchinfo-inner i { 4299 color: goldenrod; 4300 margin-right: 10px; 4301 font-size: 20px; 4302} 4303.px-mk-searchinfo .px-mk-searchinfo-inner > .searchinfo-title { 4304 flex-grow: 0; 4305 background: #eee; 4306 color: #000; 4307} 4308.px-mk-searchinfo .px-mk-searchinfo-inner > .px-sm-searchbtn { 4309 width: auto; 4310 font-weight: 400; 4311 text-align: center; 4312 justify-content: center; 4313} 4314.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column { 4315 height: auto; 4316 flex-wrap: wrap; 4317 width: 100%; 4318} 4319.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column > * { 4320 height: 3em; 4321 border-bottom: 1px solid #ccc; 4322 padding: 1em; 4323 width: 50%; 4324 text-align: left; 4325 line-height: 1.2; 4326} 4327.px-mk-searchinfo .px-mk-searchinfo-inner.px-mk-searchinfo-column > * .px-mk-iconchangesearch { 4328 height: 1.2em; 4329 width: 1.2em; 4330} 4331 4332.px-mk-iconchangesearch { 4333 color: goldenrod; 4334 height: 1.5em; 4335 width: 1.5em; 4336 margin-right: 0.5em; 4337} 4338.px-mk-iconchangesearch svg { 4339 fill: currentColor; 4340 height: 100%; 4341 width: 100%; 4342} 4343 4344div.ui-datepicker#ui-datepicker-div .ui-widget-header { 4345 background: transparent !important; 4346 border: none !important; 4347} 4348div.ui-datepicker#ui-datepicker-div .ui-datepicker-next, 4349div.ui-datepicker#ui-datepicker-div .ui-datepicker-prev { 4350 border-radius: 40px !important; 4351 cursor: pointer !important; 4352} 4353div.ui-datepicker#ui-datepicker-div .ui-state-default, 4354div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-default, 4355div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-default { 4356 border-radius: 8px; 4357 border: none; 4358 background-color: rgba(0, 0, 0, 0.02); 4359 text-align: center; 4360 display: inline-flex; 4361 justify-content: center; 4362 align-items: center; 4363 width: 90%; 4364 font-size: 1em; 4365 transition: 0.3s ease-out; 4366 border: 1px solid #eee; 4367} 4368div.ui-datepicker#ui-datepicker-div .ui-state-focus, 4369div.ui-datepicker#ui-datepicker-div .ui-state-hover, 4370div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-focus, 4371div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-hover, 4372div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-focus, 4373div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-hover { 4374 background: white; 4375 border: 1px solid #000 !important; 4376} 4377div.ui-datepicker#ui-datepicker-div .ui-state-active, 4378div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-active, 4379div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-active, 4380div.ui-datepicker#ui-datepicker-div .ui-state-highlight, 4381div.ui-datepicker#ui-datepicker-div .ui-widget-content .ui-state-highlight, 4382div.ui-datepicker#ui-datepicker-div .ui-widget-header .ui-state-highlight { 4383 background: #000; 4384 color: white; 4385} 4386div.ui-datepicker#ui-datepicker-div td { 4387 text-align: center; 4388} 4389 4390.px-mk-searchloader { 4391 animation: spinStep steps(1) 1s infinite; 4392 height: 1em; 4393 width: 1em; 4394 transform-origin: top; 4395} 4396 4397.neo_m_buscador .neo_marketplace_buscador_v3 { 4398 padding: 30px 20px; 4399 justify-content: center; 4400 align-items: center; 4401} 4402 4403@keyframes spinStep { 4404 0% { 4405 transform: translatey(-50%); 4406 } 4407 12.5% { 4408 transform: rotate(45deg) translatey(-50%); 4409 } 4410 25% { 4411 transform: rotate(90deg) translatey(-50%); 4412 } 4413 37.5% { 4414 transform: rotate(135deg) translatey(-50%); 4415 } 4416 50% { 4417 transform: rotate(180deg) translatey(-50%); 4418 } 4419 62.5% { 4420 transform: rotate(225deg) translatey(-50%); 4421 } 4422 75% { 4423 transform: rotate(270deg) translatey(-50%); 4424 } 4425 87.5% { 4426 transform: rotate(315deg) translatey(-50%); 4427 } 4428 100% { 4429 transform: rotate(360deg) translatey(-50%); 4430 } 4431} 4432.px-sm-searchbtn { 4433 height: 100%; 4434 box-sizing: border-box; 4435 display: flex; 4436 text-align: left; 4437 align-items: flex-start; 4438 justify-content: center; 4439 text-transform: uppercase; 4440 font-size: 1em; 4441 letter-spacing: 1px; 4442 line-height: 1; 4443 background-color: #000; 4444 color: white; 4445 cursor: pointer; 4446 transition: 0.3s ease-out; 4447 border: none; 4448 width: 11em; 4449 padding: 1em 4em 1em 1em; 4450 flex: 1; 4451} 4452.px-sm-searchbtn .px-mk-inputicon svg { 4453 height: 1em; 4454 width: 1em; 4455 fill: white !important; 4456} 4457.px-sm-searchbtn:hover { 4458 background-color: #a37a00; 4459} 4460 4461.ModuloWrap_marketplace_list { 4462 width: 100%; 4463} 4464 4465.buscar_lp:not(.px-mk-buscador-vertical) .PartyTypeSimulator { 4466 height: 100%; 4467} 4468 4469.buscar_lp.px-mk-buscador-vertical { 4470 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 4471 border-radius: 2px; 4472 padding: 0; 4473 margin: 3px; 4474 height: auto; 4475 width: auto; 4476} 4477.buscar_lp.px-mk-buscador-vertical .px-mk-searchform { 4478 transition: 1s cubic-bezier(0.17, 0.84, 0.44, 1); 4479 height: auto; 4480 width: 100%; 4481 flex-wrap: wrap; 4482} 4483.buscar_lp.px-mk-buscador-vertical .px-mk-searchform > * { 4484 width: 100%; 4485 height: 4.5em; 4486}
4487.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator { 4488 height: auto; 4489 min-height: 4.5em; 4490 width: 50%; 4491 box-sizing: border-box; 4492} 4493.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator .SelectorInitial { 4494 min-height: 4.5em; 4495 padding: 0.6em 1em; 4496} 4497.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator .PartyTypeSimulatorSelect, 4498.buscar_lp.px-mk-buscador-vertical .px-mk-searchform .wrap_PartyTypeSimulator #MultiplePartySelect { 4499 position: static; 4500 background: rgba(248, 248, 248, 0.9725490196); 4501} 4502.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer { 4503 border-bottom: 1px solid #ccc; 4504 border-right: none; 4505 max-width: none; 4506 width: 100%; 4507} 4508.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_entrada, .buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_salida { 4509 width: 100%; 4510 box-sizing: border-box; 4511 margin: 0px; 4512} 4513.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.fechas_ancho_salida { 4514 border-left: 1px solid #ccc; 4515} 4516.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer.px-mk-productidhidden { 4517 height: 0px; 4518 width: 100%; 4519} 4520.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer input, 4521.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer select, 4522.buscar_lp.px-mk-buscador-vertical .px-sm-inputcontainer textarea { 4523 max-width: 100%; 4524} 4525 4526.px-mk-filter-disabled { 4527 pointer-events: none !important; 4528 opacity: 0.5 !important; 4529} 4530 4531.px-mk-buscador-vertical.px-mk-searchform .px-sm-inputcontainer:last-child, 4532.px-mk-buscador-vertical .px-sm-inputcontainer:last-child { 4533 border-bottom: none; 4534 border-right: none; 4535} 4536 4537.px-mk-hidesearchform { 4538 opacity: 0; 4539 pointer-events: none; 4540 max-height: 0px; 4541 overflow: hidden; 4542} 4543 4544.ignoreclick { 4545 pointer-events: none; 4546} 4547 4548.px-sm-searchbtn > i { 4549 font-size: 20px; 4550 position: relative; 4551 left: 0; 4552 top: -1px; 4553 margin-right: 20px; 4554 margin-left: -10px; 4555} 4556 4557.btn-searching span { 4558 opacity: 0; 4559 max-width: 0px; 4560 overflow: hidden; 4561 transition: 0.3s ease-out; 4562} 4563 4564#ProductID option { 4565 text-transform: none; 4566} 4567 4568#ProductID option[value=everyproduct] { 4569 font-weight: 600; 4570} 4571 4572#ProductID option[value=""][disabled] { 4573 background-color: #eee; 4574 color: #555; 4575} 4576 4577.px-mk-disabled-temp { 4578 background-color: #eee; 4579 cursor: not-allowed; 4580 pointer-events: none; 4581 color: #bbb; 4582} 4583 4584.px-mk-productid.px-sm-inputcontainer.px-mk-productidhidden { 4585 opacity: 0; 4586 max-width: 0px; 4587 pointer-events: none; 4588 padding: 0px; 4589 margin: 0px; 4590 border: none; 4591} 4592 4593.px-mk-productid.px-sm-inputcontainer { 4594 max-width: 300px; 4595 transition: 0.3s ease; 4596 overflow: hidden; 4597} 4598 4599.px-mk-locationdropdown { 4600 position: absolute; 4601 top: calc(100% + 0.1em); 4602 left: 0; 4603 padding: 0; 4604 line-height: 1.2; 4605 background: white; 4606 box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08); 4607 z-index: 999; 4608 border-radius: 0 0 4px 4px; 4609 max-height: 50vh; 4610 overflow: auto; 4611 transition: 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); 4612 opacity: 0; 4613 pointer-events: none; 4614 transform: translateY(-1em); 4615 width: 100%; 4616} 4617.px-mk-locationdropdown.activeAC { 4618 transform: none; 4619 pointer-events: initial; 4620 opacity: 1; 4621} 4622.px-mk-locationdropdown > * { 4623 padding: 1.2em 1.5em; 4624 white-space: nowrap; 4625 max-width: 400px; 4626 overflow: hidden; 4627 text-overflow: ellipsis; 4628 width: 100%; 4629 cursor: pointer; 4630 display: flex; 4631 align-items: center; 4632 justify-content: flex-start; 4633 box-sizing: border-box; 4634} 4635.px-mk-locationdropdown > *.suggestion_hover { 4636 background-color: #f2f2f2; 4637} 4638.px-mk-locationdropdown > *:hover { 4639 background-color: #f2f2f2; 4640} 4641.px-mk-locationdropdown > *:hover .px-mk-locationimg { 4642 fill: goldenrod; 4643} 4644.px-mk-locationdropdown > * .px-mk-locationtxt { 4645 width: 100%; 4646 overflow: hidden; 4647 text-overflow: ellipsis; 4648} 4649.px-mk-locationdropdown > * .px-mk-locationimg { 4650 height: 1.1em; 4651 width: 1.1em; 4652 margin-right: 0.6em; 4653 flex-shrink: 0; 4654 fill: #aaa; 4655 margin-right: 0.8em; 4656} 4657.px-mk-locationdropdown > * .px-mk-locationimg svg { 4658 height: 100%; 4659 width: 100%; 4660 -o-object-fit: contain; 4661 object-fit: contain; 4662} 4663 4664.px-mk-locationautocomplete { 4665 height: 100%; 4666 width: 100%; 4667 box-sizing: border-box; 4668 padding-right: 2em; 4669} 4670.px-mk-locationautocomplete input { 4671 height: 100%; 4672 padding: 0em 1em; 4673 width: 100%; 4674} 4675 4676.ui-datepicker { 4677 font-size: 16px !important; 4678 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.2); 4679 width: auto; 4680 border-radius: 0px !important; 4681 padding: 5px !important; 4682 width: auto !important; 4683 box-sizing: border-box; 4684} 4685 4686.ui-datepicker td { 4687 margin: 0px !important; 4688 padding: 0px; 4689} 4690 4691.ui-datepicker td > * { 4692 height: 40px; 4693 width: 40px !important; 4694 border-radius: 0px !important; 4695 border: 1px solid transparent !important; 4696 box-sizing: border-box; 4697} 4698 4699.ui-datepicker table { 4700 margin: 0px !important; 4701} 4702 4703.neo_marketplace_buscador_v3 * { 4704 font-size: 13px !important; 4705} 4706 4707.neo_marketplace_buscador_v3 input, .neo_marketplace_buscador_v3 select { 4708 font-size: 16px !important; 4709} 4710 4711.neo_modules_cart_hotel_v2 .cart_top_hotel_v2 .PartyTypeSimulator { 4712 width: 100%; 4713} 4714 4715.neo_marketplace_buscador_v3 .PartyTypeSimulatorSelect { 4716 position: absolute; 4717 z-index: 999; 4718 top: 55px; 4719 left: 0px; 4720 padding: 5px; 4721 background: #fff; 4722 margin: 0px; 4723 box-shadow: 0 2px 16px rgba(0, 0, 0, 0.15); 4724 padding: 20px 25px; 4725 line-height: 1.5; 4726 box-sizing: border-box; 4727 width: 300px; 4728 max-width: 100vw; 4729} 4730 4731.txtPartyGroup { 4732 white-space: nowrap; 4733 overflow: hidden; 4734 text-overflow: ellipsis; 4735 margin-right: auto; 4736 padding-right: 30px; 4737} 4738 4739input.neo_partyselector_quantity { 4740 padding: 15px 10px; 4741 font-size: 18px; 4742 text-align: center; 4743 border: none; 4744 background: transparent; 4745 width: 60px; 4746 -moz-appearance: textfield; 4747} 4748input.neo_partyselector_quantity::-webkit-outer-spin-button, 4749input.neo_partyselector_quantity::-webkit-inner-spin-button { 4750 -webkit-appearance: none; 4751 margin: 0; 4752} 4753input.neo_partyselector_quantity:focus { 4754 outline: none; 4755 background-color: rgba(0, 0, 0, 0.03); 4756 border-radius: 5px; 4757} 4758 4759.ChildrensAges { 4760 max-height: 180px; 4761 overflow-y: auto; 4762 overflow-x: hidden; 4763 padding-right: 5px; 4764} 4765.ChildrensAges::-webkit-scrollbar {
4766 width: 6px; 4767} 4768.ChildrensAges::-webkit-scrollbar-track { 4769 background: #f1f1f1; 4770 border-radius: 10px; 4771} 4772.ChildrensAges::-webkit-scrollbar-thumb { 4773 background: #888; 4774 border-radius: 10px; 4775} 4776.ChildrensAges::-webkit-scrollbar-thumb:hover { 4777 background: #555; 4778} 4779 4780@media only screen and (max-width: 650px) { 4781 .PartyTypeSimulatorContainer { 4782 height: auto !important; 4783 } 4784 .PartyTypeSimulatorContainer .PartyTypeSimulatorSelect { 4785 position: static !important; 4786 width: 100%; 4787 } 4788 .px-mk-locationdropdown { 4789 width: 100%; 4790 box-shadow: 0 4px 9px rgba(0, 0, 0, 0.5); 4791 } 4792 .neo_marketplace_buscador_v3 * { 4793 font-size: 15px !important; 4794 } 4795 .neo_marketplace_buscador_v3 input, .neo_marketplace_buscador_v3 select { 4796 font-size: 16px !important; 4797 } 4798 .neo_marketplace_buscador_v3 { 4799 width: 100%; 4800 display: flex; 4801 } 4802 .ui-datepicker { 4803 font-size: 19px !important; 4804 z-index: 1000 !important; 4805 width: calc(100vw - 30px) !important; 4806 left: 10px !important; 4807 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.5); 4808 padding: 10px !important; 4809 box-sizing: border-box; 4810 } 4811 4812 /* Ajustes para el selector de party en mobile */ 4813 .neo_marketplace_buscador_v3 .txtPartyGroup, 4814 .PartyTypeSimulator .txtPartyGroup, 4815 .SelectorInitial .txtPartyGroup { 4816 white-space: normal !important; 4817 overflow: visible !important; 4818 text-overflow: clip !important; 4819 padding-right: 10px !important; 4820 font-size: 10px !important; 4821 line-height: 1.4 !important; 4822 display: flex !important; 4823 flex-wrap: wrap !important; 4824 align-items: center !important; 4825 gap: 2px !important; 4826 max-width: calc(100% - 40px) !important; 4827 } 4828 4829 .neo_marketplace_buscador_v3 .txtPartyGroup span, 4830 .PartyTypeSimulator .txtPartyGroup span, 4831 .SelectorInitial .txtPartyGroup span { 4832 white-space: nowrap !important; 4833 font-size: 15px !important; 4834 } 4835 4836 .neo_marketplace_buscador_v3 .txtPartyGroup .mdi-circle-small, 4837 .PartyTypeSimulator .txtPartyGroup .mdi-circle-small, 4838 .SelectorInitial .txtPartyGroup .mdi-circle-small { 4839 font-size: 12px !important; 4840 margin: 0 -3px !important; 4841 } 4842 4843 .neo_marketplace_buscador_v3 .SelectorInitial, 4844 .PartyTypeSimulator .SelectorInitial { 4845 min-height: 55px !important; 4846 padding: 8px 40px 8px 10px !important; 4847 display: flex !important; 4848 align-items: center !important; 4849 } 4850 4851 .neo_marketplace_buscador_v3 .PartyTypeSimulatorContainer, 4852 .PartyTypeSimulatorContainer { 4853 overflow: visible !important; 4854 } 4855 4856 .px-mk-buscador-container { 4857 font-size: 16px; 4858 } 4859 .px-mk-buscador-container select, 4860 .px-mk-buscador-container textarea, 4861 .px-mk-buscador-container input[type=text], 4862 .px-mk-buscador-container input[type=password], 4863 .px-mk-buscador-container input[type=datetime], 4864 .px-mk-buscador-container input[type=datetime-local], 4865 .px-mk-buscador-container input[type=date], 4866 .px-mk-buscador-container input[type=month], 4867 .px-mk-buscador-container input[type=time], 4868 .px-mk-buscador-container input[type=week], 4869 .px-mk-buscador-container input[type=number], 4870 .px-mk-buscador-container input[type=email], 4871 .px-mk-buscador-container input[type=url], 4872 .px-mk-buscador-container input[type=search], 4873 .px-mk-buscador-container input[type=tel], 4874 .px-mk-buscador-container input[type=color] { 4875 font-size: 1em; 4876 } 4877}/*# sourceMappingURL=css.css.map */</style>
4878<script> 4879 (function() { 4880 function run() { 4881 try { 4882 var span = document.querySelector('#PxMkAcion_Search .update-search-span'); 4883 var btn = document.getElementById('PxMkAcion_Search'); 4884 if (!span) return; 4885 4886 var themeHex = '#b09d21'; 4887 4888 function parseHex(hex) { 4889 if (!hex) return null; 4890 hex = String(hex).trim(); 4891 if (hex.startsWith('#')) hex = hex.slice(1); 4892 if (hex.length === 3) { 4893 hex = hex.split('').map(function(ch) { 4894 return ch + ch; 4895 }).join(''); 4896 } 4897 if (hex.length !== 6) return null; 4898 var r = parseInt(hex.slice(0, 2), 16); 4899 var g = parseInt(hex.slice(2, 4), 16); 4900 var b = parseInt(hex.slice(4, 6), 16); 4901 if ([r, g, b].some(function(v) { 4902 return isNaN(v); 4903 })) return null; 4904 return { 4905 r: r, 4906 g: g, 4907 b: b 4908 }; 4909 } 4910 4911 function relL(rgb) { 4912 function toLin(c) { 4913 c = c / 255; 4914 return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); 4915 } 4916 var R = toLin(rgb.r), 4917 G = toLin(rgb.g), 4918 B = toLin(rgb.b); 4919 return 0.2126 * R + 0.7152 * G + 0.0722 * B; 4920 } 4921 4922 function contrast(L1, L2) { 4923 var a = Math.max(L1, L2); 4924 var b = Math.min(L1, L2); 4925 return (a + 0.05) / (b + 0.05); 4926 } 4927 4928 var rgb = parseHex(themeHex); 4929 if (!rgb) { 4930 if (btn) { 4931 var bg = window.getComputedStyle(btn).backgroundColor; // rgb(a) 4932 var m = bg && bg.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); 4933 if (m) { 4934 rgb = { 4935 r: parseInt(m[1], 10), 4936 g: parseInt(m[2], 10), 4937 b: parseInt(m[3], 10) 4938 }; 4939 } 4940 } 4941 } 4942 if (!rgb) return; 4943 4944 var Lbg = relL(rgb); 4945 var Lwhite = relL({ 4946 r: 255, 4947 g: 255, 4948 b: 255 4949 }); 4950 var Lblack = relL({ 4951 r: 0, 4952 g: 0, 4953 b: 0 4954 }); 4955 var cWhite = contrast(Lbg, Lwhite); 4956 var cBlack = contrast(Lbg, Lblack); 4957 4958 var textColor = cBlack >= cWhite ? '#000000' : '#FFFFFF'; 4959 span.style.setProperty('color', textColor, 'important'); 4960 if (btn) { 4961 btn.style.setProperty('color', textColor, 'important'); 4962 4963 // Recolor inline SVG icons (search and loading) to match the contrast color 4964 function paintInlineSVG(container, color) { 4965 try { 4966 var svgs = container.querySelectorAll('svg'); 4967 svgs.forEach(function(svg) { 4968 // Support SVGs that use currentColor 4969 svg.style.setProperty('color', color, 'important'); 4970 svg.setAttribute('color', color); 4971 // Force fill/stroke via style to override inline attrs 4972 svg.style.setProperty('fill', color, 'important'); 4973 svg.style.setProperty('stroke', color, 'important'); 4974 // Update common shape elements 4975 svg.querySelectorAll('path, circle, rect, polygon, line, polyline, ellipse, g').forEach(function(node) { 4976 node.style.setProperty('fill', color, 'important'); 4977 node.style.setProperty('stroke', color, 'important'); 4978 }); 4979 // Also override attributes for stubborn icons 4980 svg.querySelectorAll('[fill]').forEach(function(node) { 4981 node.setAttribute('fill', color); 4982 }); 4983 svg.querySelectorAll('[stroke]').forEach(function(node) { 4984 node.setAttribute('stroke', color); 4985 }); 4986 }); 4987 } catch (e) { 4988 /* ignore */ 4989 } 4990 } 4991 4992 var iconLabel = btn.querySelector('.px-mk-searchicon'); 4993 var loaderLabel = btn.querySelector('.px-mk-searchloader'); 4994 if (iconLabel) paintInlineSVG(iconLabel, textColor); 4995 if (loaderLabel) paintInlineSVG(loaderLabel, textColor); 4996 } 4997 } catch (e) { 4998 /* ignore */ 4999 } 5000 } 5001 5002 if (document.readyState === 'loading') { 5003 document.addEventListener('DOMContentLoaded', run); 5004 } else { 5005 run(); 5006 } 5007 })(); 5008</script>
5008 5009
5009<script> 5010 if (localStorage.getItem('tradename')) { 5011 localStorage.removeItem('tradename'); 5012 } 5013 </script>
5013 5014 5015<!-- Scripts para el mapa -->
5016<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" crossorigin=""></script>
vendor: 1 bytes, line 5016
5016
5017<script> 5018 (function() { 5019 // Desactivar logs dentro de este módulo (solo en este scope) 5020 var console = { 5021 log: function() {}, 5022 warn: function() {}, 5023 error: function() {} 5024 }; 5025 // Variables para el mapa 5026 let map; 5027 let marker; 5028 let selectedLat = 0; 5029 let selectedLng = 0; 5030 let radiusCircle; // Variable para el cÃrculo del radio 5031 const defaultZoom = 13; 5032 // Coordenadas por defecto: Mendoza, Argentina 5033 const DEFAULT_LAT = -32.889458; 5034 const DEFAULT_LNG = -68.845839; 5035 const DEFAULT_RADIUS = 50000; // 50km en metros 5036 5037 // Elementos del DOM 5038 const mapModal = document.getElementById('map-modal'); 5039 const mapBtn = document.getElementById('map-search-btn'); 5040 const closeBtn = document.querySelector('.map-close'); 5041 const confirmBtn = document.getElementById('confirm-location'); 5042 const enableLocationGuideBtn = document.getElementById('enable-location-guide'); 5043 const centerLocationBtn = document.getElementById('center-location'); 5044 const locationPermissionsGuide = document.getElementById('location-permissions-guide'); 5045 const browserGuideContent = document.getElementById('browser-guide-content'); 5046 const closeGuideBtn = document.getElementById('close-guide'); 5047 const latitudeInput = document.getElementById('webroot_latitude'); 5048 const longitudeInput = document.getElementById('webroot_longitude'); 5049 const radiusInput = document.getElementById('webroot_distance_radius'); 5050 const locationInput = document.getElementById('webroot_location_search'); 5051 const locationGoogleSearch = document.getElementById('location_google_search'); 5052 5053 // Variables para rastrear estado de permisos 5054 let locationPermissionsDenied = false; 5055 let locationPermissionsEnabled = false; 5056 5057 // Función para detectar el navegador 5058 function detectBrowser() { 5059 const userAgent = navigator.userAgent.toLowerCase(); 5060 if (userAgent.includes('chrome') && !userAgent.includes('edg')) return 'chrome'; 5061 if (userAgent.includes('firefox')) return 'firefox'; 5062 if (userAgent.includes('safari') && !userAgent.includes('chrome')) return 'safari'; 5063 if (userAgent.includes('edg')) return 'edge'; 5064 return 'chrome'; 5065 } 5066 5067 // Función para obtener el contenido de la guÃa según el navegador 5068 function getBrowserGuideContent(browser) { 5069 const guides = { 5070 chrome: { 5071 title: 'Google Chrome', 5072 steps: [ 5073 'Haz clic en el icono de candado en la barra de direcciones', 5074 'Selecciona "Configuración del sitio" o "Permisos"', 5075 'Cambia "Ubicación" de "Bloquear" a "Permitir"', 5076 'Recarga la página' 5077 ], 5078 link: 'https://support.google.com/chrome/answer/142065' 5079 }, 5080 firefox: { 5081 title: 'Mozilla Firefox', 5082 steps: [ 5083 'Haz clic en el icono de escudo en la barra de direcciones', 5084 'Selecciona "Configuración mejorada de seguimiento"', 5085 'Habilita los permisos de ubicación para este sitio', 5086 'Recarga la página' 5087 ], 5088 link: 'https://support.mozilla.org/es/kb/compartir-ubicacion-con-sitios-web' 5089 }, 5090 safari: { 5091 title: 'Safari', 5092 steps: [ 5093 'Ve a Safari > Preferencias > Sitios web', 5094 'Selecciona "Ubicación" en la barra lateral', 5095 'Encuentra este sitio y cambia a "Permitir"', 5096 'Recarga la página' 5097 ], 5098 link: 'https://support.apple.com/es-es/guide/safari/ibrw1056/mac' 5099 }, 5100 edge: { 5101 title: 'Microsoft Edge', 5102 steps: [ 5103 'Haz clic en el icono de candado en la barra de direcciones', 5104 'Selecciona "Permisos para este sitio"', 5105 'Cambia "Ubicación" a "Permitir"', 5106 'Recarga la página' 5107 ], 5108 link: 'https://support.microsoft.com/es-es/microsoft-edge/ubicaci%C3%B3n-y-privacidad-en-microsoft-edge-31b5d9e7-bb24-43a0-8b0e-d9f4b38f6cf5' 5109 } 5110 }; 5111 return guides[browser] || guides.chrome; 5112 } 5113 5114 // Función para mostrar la guÃa de permisos 5115 function showLocationPermissionsGuide() { 5116 const browser = detectBrowser(); 5117 const guide = getBrowserGuideContent(browser); 5118 5119 let content = ` 5120 <div style="margin: 10px 0; padding: 15px; background: white; border-radius: 6px; border: 1px solid #e5e7eb;"> 5121 <h5 style="margin: 0 0 8px 0; color: #374151; font-size: 16px; font-weight: 600;">Instrucciones para ${guide.title}</h5> 5122 <p style="margin: 0 0 12px 0; color: #6b7280; font-size: 13px;">Sigue estos pasos para habilitar los permisos:</p> 5123 <ol style="margin: 8px 0 8px 20px; padding: 0;"> 5124 `; 5125 5126 guide.steps.forEach(step => { 5127 content += `<li style="margin: 6px 0; font-size: 14px; color: #4b5563;">${step}</li>`; 5128 }); 5129 5130 content += ` 5131 </ol> 5132 <a href="${guide.link}" target="_blank" style="display: inline-block; margin-top: 10px; color: #3b82f6; text-decoration: none; font-size: 13px;"> 5133 Ver guÃa oficial de ${guide.title} â 5134 </a> 5135 </div> 5136 `; 5137 5138 if (browserGuideContent) { 5139 browserGuideContent.innerHTML = content; 5140 } 5141 5142 if (locationPermissionsGuide) { 5143 locationPermissionsGuide.style.display = 'block'; 5144 } 5145 } 5146 5147 // Función para ocultar la guÃa de permisos 5148 function hideLocationPermissionsGuide() { 5149 if (locationPermissionsGuide) { 5150 locationPermissionsGuide.style.display = 'none'; 5151 } 5152 } 5153 5154 // Función para centrar el mapa en la ubicación actual 5155 function centerMapOnCurrentLocation() { 5156 if (!navigator.geolocation) { 5157 alert('Tu navegador no soporta geolocalización.'); 5158 return; 5159 } 5160 5161 // Mostrar loader en el botón centrar 5162 if (centerLocationBtn) { 5163 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 5164 const text = centerLocationBtn.querySelector('.center-btn-text'); 5165 if (loader && text) { 5166 loader.style.display = 'inline-block'; 5167 text.style.display = 'none'; 5168 } 5169 centerLocationBtn.disabled = true; 5170 } 5171 5172 navigator.geolocation.getCurrentPosition( 5173 async function(position) { 5174 const lat = position.coords.latitude; 5175 const lng = position.coords.longitude; 5176 5177 // Centrar el mapa en la nueva ubicación 5178 if (map) {
5179 map.setView([lat, lng], defaultZoom); 5180 5181 // Remover marcador anterior si existe 5182 if (marker) { 5183 map.removeLayer(marker); 5184 } 5185 5186 // Añadir nuevo marcador 5187 marker = L.marker([lat, lng], { 5188 draggable: true 5189 }).addTo(map); 5190 5191 // Actualizar posición del cÃrculo 5192 if (radiusCircle) { 5193 radiusCircle.setLatLng([lat, lng]); 5194 } else { 5195 // Si por alguna razón no existe, crearlo 5196 const radiusSelect = document.getElementById('radius-select'); 5197 const currentRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 5198 radiusCircle = L.circle([lat, lng], { 5199 color: '#3388ff', 5200 fillColor: '#3388ff', 5201 fillOpacity: 0.2, 5202 radius: currentRadius 5203 }).addTo(map); 5204 } 5205 5206 // Actualizar coordenadas seleccionadas 5207 selectedLat = lat; 5208 selectedLng = lng; 5209 5210 // Obtener información de ubicación para el marcador 5211 try { 5212 const locationName = await getAddressFromCoordinates(lat, lng); 5213 if (locationName && !locationName.includes(lat.toString())) { 5214 marker.bindPopup(locationName).openPopup(); 5215 } 5216 } catch (error) { 5217 console.log('â ï¸ No se pudo obtener información de ubicación para el marcador'); 5218 } 5219 5220 // Actualizar coordenadas al arrastrar el marcador 5221 marker.on('dragend', async function(e) { 5222 const position = marker.getLatLng(); 5223 selectedLat = position.lat; 5224 selectedLng = position.lng; 5225 5226 // Actualizar posición del cÃrculo 5227 if (radiusCircle) { 5228 radiusCircle.setLatLng(position); 5229 } 5230 5231 // Actualizar popup al arrastrar 5232 try { 5233 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 5234 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 5235 marker.setPopupContent(newLocationName); 5236 } 5237 } catch (error) { 5238 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 5239 } 5240 }); 5241 5242 // Actualizar coordenadas al arrastrar el marcador 5243 marker.on('dragend', async function(e) { 5244 const position = marker.getLatLng(); 5245 selectedLat = position.lat; 5246 selectedLng = position.lng; 5247 5248 // Actualizar popup al arrastrar 5249 try { 5250 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 5251 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 5252 marker.setPopupContent(newLocationName); 5253 } 5254 } catch (error) { 5255 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 5256 } 5257 }); 5258 } 5259 5260 // Ocultar loader del botón 5261 if (centerLocationBtn) { 5262 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 5263 const text = centerLocationBtn.querySelector('.center-btn-text'); 5264 if (loader && text) { 5265 loader.style.display = 'none'; 5266 text.style.display = 'inline-block'; 5267 } 5268 centerLocationBtn.disabled = false; 5269 } 5270 }, 5271 function(error) { 5272 console.log('Error al obtener ubicación actual:', error); 5273 alert('No se pudo obtener tu ubicación actual. Verifica que los permisos estén habilitados.'); 5274 5275 // Ocultar loader del botón 5276 if (centerLocationBtn) { 5277 const loader = centerLocationBtn.querySelector('.center-btn-loader'); 5278 const text = centerLocationBtn.querySelector('.center-btn-text'); 5279 if (loader && text) { 5280 loader.style.display = 'none'; 5281 text.style.display = 'inline-block'; 5282 } 5283 centerLocationBtn.disabled = false; 5284 } 5285 } 5286 ); 5287 } 5288 5289 console.log('Botón de mapa:', mapBtn); // Debug para verificar que el botón existe 5290 5291 // Asegurar que el modal existe en el DOM 5292 if (!mapModal) { 5293 console.error('Modal de mapa no encontrado en el DOM'); 5294 // Añadir el modal al final del body si no existe 5295 const modalHTML = ` 5296 <div id="map-modal" class="map-modal"> 5297 <div class="map-modal-content"> 5298 <span class="map-close">×</span> 5299 <h3>Selecciona una ubicación en el mapa</h3> 5300 <div id="map-container"></div> 5301 <div class="map-footer">
5302 <div class="map-footer-controls"> 5303 <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;"> 5304 <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> 5305 <span class="center-btn-text">Localizarme</span> 5306 </button> 5307 <div class="radius-selector"> 5308 <label for="radius-select" style="margin-right: 5px; font-weight: bold;">Radio:</label> 5309 <select id="radius-select" style="padding: 8px; border-radius: 4px; border: 1px solid #ccc;"> 5310 <option value="10000">10 km</option> 5311 <option value="30000">30 km</option> 5312 <option value="50000" selected>50 km</option> 5313 <option value="100000">100 km</option> 5314 </select> 5315 </div> 5316 </div> 5317 <button id="confirm-location" class="neo_bgcolor_primary"> 5318 <span class="btn-loader"></span> 5319 <span class="btn-text">Buscar en esta zona</span> 5320 </button> 5321 </div> 5322 </div> 5323 </div> 5324 `; 5325 document.body.insertAdjacentHTML('beforeend', modalHTML); 5326 } 5327 5328 // Función para inicializar el mapa 5329 function initMap(lat, lng) { 5330 // Limpiar mapa existente de manera segura 5331 if (map) { 5332 try { 5333 map.remove(); 5334 } catch (e) { 5335 console.log('Error al remover mapa:', e); 5336 } 5337 map = null; 5338 } 5339 5340 // Reset marker 5341 marker = null; 5342 5343 // Coordenadas por defecto (si no hay seleccionadas): Mendoza 5344 lat = (typeof lat === 'number' ? lat : null) ?? DEFAULT_LAT; 5345 lng = (typeof lng === 'number' ? lng : null) ?? DEFAULT_LNG; 5346 5347 // Crear mapa con un timeout para asegurar que el contenedor está visible 5348 setTimeout(() => { 5349 try { 5350 // Verificar que el contenedor principal existe 5351 const mapContainer = document.getElementById('map-container'); 5352 if (!mapContainer) { 5353 console.error('Contenedor del mapa no encontrado'); 5354 return; 5355 } 5356 5357 // Crear un nuevo contenedor para evitar el error de "already initialized" 5358 const mapId = 'map-instance-' + Date.now(); 5359 mapContainer.innerHTML = `<div id="${mapId}" style="height: 100%; width: 100%;"></div>`; 5360 5361 // Crear el mapa en el nuevo contenedor 5362 map = L.map(mapId, { 5363 scrollWheelZoom: true 5364 }).setView([lat, lng], defaultZoom); 5365 5366 // Invalidar tamaño inmediatamente para asegurar renderizado correcto 5367 map.invalidateSize(); 5368 5369 // Añadir capa de mapa base (OpenStreetMap) 5370 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 5371 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' 5372 }).addTo(map); 5373 5374 // Añadir marcador SIEMPRE (incluido Mendoza por defecto) y preparar comportamiento 5375 marker = L.marker([lat, lng], { 5376 draggable: true 5377 }).addTo(map); 5378 5379 // Dibujar cÃrculo de radio inicial 5380 const radiusSelect = document.getElementById('radius-select'); 5381 const initialRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 5382 5383 radiusCircle = L.circle([lat, lng], { 5384 color: '#3388ff', 5385 fillColor: '#3388ff', 5386 fillOpacity: 0.2, 5387 radius: initialRadius 5388 }).addTo(map); 5389 5390 // Evento para actualizar el radio cuando cambia el select 5391 if (radiusSelect) { 5392 // Remover listeners anteriores para evitar duplicados 5393 const newRadiusSelect = radiusSelect.cloneNode(true); 5394 radiusSelect.parentNode.replaceChild(newRadiusSelect, radiusSelect); 5395 5396 newRadiusSelect.addEventListener('change', function() { 5397 const newRadius = parseInt(this.value); 5398 if (radiusCircle) { 5399 radiusCircle.setRadius(newRadius); 5400 } 5401 }); 5402 } 5403 5404 // Obtener información de ubicación para el marcador inicial 5405 (async () => { 5406 try { 5407 const locationName = await getAddressFromCoordinates(lat, lng); 5408 if (locationName && !locationName.includes(lat.toString())) { 5409 marker.bindPopup(locationName);
5410 console.log('ð Información inicial del marcador:', locationName); 5411 } 5412 } catch (error) { 5413 console.log('â ï¸ No se pudo obtener información inicial del marcador'); 5414 } 5415 })(); 5416 5417 // Actualizar coordenadas al arrastrar el marcador 5418 marker.on('dragend', async function(e) { 5419 const position = marker.getLatLng(); 5420 selectedLat = position.lat; 5421 selectedLng = position.lng; 5422 5423 // Actualizar posición del cÃrculo 5424 if (radiusCircle) { 5425 radiusCircle.setLatLng(position); 5426 } 5427 5428 // Actualizar popup al arrastrar 5429 try { 5430 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 5431 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 5432 marker.setPopupContent(newLocationName); 5433 } 5434 } catch (error) { 5435 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 5436 } 5437 }); 5438 5439 selectedLat = lat; 5440 selectedLng = lng; 5441 5442 // Añadir evento de clic al mapa 5443 map.on('click', async function(e) { 5444 // Si ya existe un marcador, lo eliminamos 5445 if (marker) { 5446 map.removeLayer(marker); 5447 } 5448 5449 // Añadir nuevo marcador en la posición del clic 5450 marker = L.marker(e.latlng, { 5451 draggable: true 5452 }).addTo(map); 5453 5454 // Actualizar posición del cÃrculo 5455 if (radiusCircle) { 5456 radiusCircle.setLatLng(e.latlng); 5457 } else { 5458 // Si por alguna razón no existe, crearlo 5459 const radiusSelect = document.getElementById('radius-select'); 5460 const currentRadius = radiusSelect ? parseInt(radiusSelect.value) : DEFAULT_RADIUS; 5461 radiusCircle = L.circle(e.latlng, { 5462 color: '#3388ff', 5463 fillColor: '#3388ff', 5464 fillOpacity: 0.2, 5465 radius: currentRadius 5466 }).addTo(map); 5467 } 5468 5469 // Guardar coordenadas seleccionadas 5470 selectedLat = e.latlng.lat; 5471 selectedLng = e.latlng.lng; 5472 5473 // Intentar obtener y mostrar información de ubicación en el marcador 5474 try { 5475 const locationName = await getAddressFromCoordinates(selectedLat, selectedLng); 5476 if (locationName && !locationName.includes(selectedLat.toString())) { 5477 marker.bindPopup(locationName).openPopup(); 5478 console.log('ð Información del marcador establecida:', locationName); 5479 } 5480 } catch (error) { 5481 console.log('â ï¸ No se pudo obtener información de ubicación para el marcador'); 5482 } 5483 5484 // Actualizar coordenadas al arrastrar el marcador 5485 marker.on('dragend', async function(e) { 5486 const position = marker.getLatLng(); 5487 selectedLat = position.lat; 5488 selectedLng = position.lng; 5489 5490 // Actualizar posición del cÃrculo 5491 if (radiusCircle) { 5492 radiusCircle.setLatLng(position); 5493 } 5494 5495 // Actualizar popup al arrastrar 5496 try { 5497 const newLocationName = await getAddressFromCoordinates(selectedLat, selectedLng); 5498 if (newLocationName && !newLocationName.includes(selectedLat.toString())) { 5499 marker.setPopupContent(newLocationName); 5500 } 5501 } catch (error) { 5502 console.log('â ï¸ No se pudo actualizar información al arrastrar'); 5503 } 5504 }); 5505 }); 5506 5507 // Invalidar tamaño para asegurar que se renderiza correctamente 5508 setTimeout(() => { 5509 if (map) { 5510 map.invalidateSize(); 5511 } 5512 }, 100); 5513 // Segundo intento para móviles lentos 5514 setTimeout(() => { 5515 if (map) { 5516 map.invalidateSize(); 5517 } 5518 }, 500); 5519 } catch (e) { 5520 console.error('Error al inicializar el mapa:', e); 5521 } 5522 }, 500); // Aumentar timeout para dar más tiempo al modal 5523 } 5524 5525 // Evento clic en botón de mapa (consolidado en un único listener) 5526 if (mapBtn) { 5527 console.log('Asignando evento click al botón de mapa'); 5528 5529 function openMapModalHandler(e) { 5530 console.log('Botón de mapa clickeado'); 5531 e.preventDefault(); 5532 e.stopPropagation(); 5533 mapModal.style.display = 'flex'; 5534 5535 // Resetear estado de permisos y ocultar elementos al abrir el modal 5536 locationPermissionsDenied = false;
5537 locationPermissionsEnabled = false; 5538 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 5539 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 5540 hideLocationPermissionsGuide(); 5541 5542 // Si ya hay coordenadas guardadas, las usamos 5543 const currentLat = latitudeInput.value ? parseFloat(latitudeInput.value) : null; 5544 const currentLng = longitudeInput.value ? parseFloat(longitudeInput.value) : null; 5545 5546 if (currentLat && currentLng) { 5547 initMap(currentLat, currentLng); 5548 } else { 5549 // Inicializar inmediatamente con Mendoza para evitar mapa en blanco 5550 initMap(DEFAULT_LAT, DEFAULT_LNG); 5551 5552 // Mostrar botón de centrar si la geolocalización está disponible en el navegador 5553 if (navigator.geolocation) { 5554 if (centerLocationBtn) centerLocationBtn.style.display = 'inline-block'; 5555 } 5556 } 5557 return false; 5558 } 5559 5560 // Agregar un único listener 5561 mapBtn.addEventListener('click', openMapModalHandler); 5562 } else { 5563 console.error('El botón de mapa no se encontró en el DOM'); 5564 } 5565 5566 // Event listeners para los botones de la guÃa 5567 if (enableLocationGuideBtn) { 5568 enableLocationGuideBtn.addEventListener('click', function() { 5569 showLocationPermissionsGuide(); 5570 }); 5571 } 5572 5573 if (closeGuideBtn) { 5574 closeGuideBtn.addEventListener('click', function() { 5575 hideLocationPermissionsGuide(); 5576 }); 5577 } 5578 5579 // Event listener para el botón "Centrar" 5580 if (centerLocationBtn) { 5581 centerLocationBtn.addEventListener('click', function() { 5582 centerMapOnCurrentLocation(); 5583 }); 5584 } 5585 5586 // Cerrar modal 5587 if (closeBtn) { 5588 closeBtn.addEventListener('click', function() { 5589 mapModal.style.display = 'none'; 5590 // Resetear estado al cerrar 5591 locationPermissionsDenied = false; 5592 locationPermissionsEnabled = false; 5593 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 5594 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 5595 hideLocationPermissionsGuide(); 5596 // Limpiar mapa al cerrar 5597 if (map) { 5598 try { 5599 map.remove(); 5600 } catch (e) { 5601 console.log('Error al limpiar mapa:', e); 5602 } 5603 map = null; 5604 marker = null; 5605 } 5606 }); 5607 } 5608 5609 // Cerrar modal al hacer clic fuera del contenido 5610 window.addEventListener('click', function(event) { 5611 if (event.target === mapModal) { 5612 mapModal.style.display = 'none'; 5613 // Resetear estado al cerrar 5614 locationPermissionsDenied = false; 5615 locationPermissionsEnabled = false; 5616 if (enableLocationGuideBtn) enableLocationGuideBtn.style.display = 'none'; 5617 if (centerLocationBtn) centerLocationBtn.style.display = 'none'; 5618 hideLocationPermissionsGuide(); 5619 // Limpiar mapa al cerrar 5620 if (map) { 5621 try { 5622 map.remove(); 5623 } catch (e) { 5624 console.log('Error al limpiar mapa:', e); 5625 } 5626 map = null; 5627 marker = null; 5628 } 5629 } 5630 }); 5631 5632 // Confirmar ubicación seleccionada 5633 if (confirmBtn) { 5634 confirmBtn.addEventListener('click', async function() { 5635 if (selectedLat && selectedLng) { 5636 // Mostrar loader y deshabilitar botón 5637 confirmBtn.classList.add('loading'); 5638 confirmBtn.disabled = true; 5639 5640 try { 5641 // Guardar coordenadas en los campos hidden 5642 latitudeInput.value = selectedLat; 5643 longitudeInput.value = selectedLng; 5644 const radiusSelect = document.getElementById('radius-select'); 5645 radiusInput.value = radiusSelect ? radiusSelect.value : DEFAULT_RADIUS; 5646 5647 // Intentar obtener información del marcador primero 5648 let address = ''; 5649 5650 // Verificar si el marcador tiene información de ubicación 5651 if (marker && marker.getPopup && marker.getPopup()) { 5652 const popupContent = marker.getPopup().getContent(); 5653 if (popupContent && typeof popupContent === 'string' && popupContent.trim() !== '') { 5654 address = popupContent; 5655 console.log('ð Usando información del marcador:', address); 5656 } 5657 } 5658 5659 // Si el mapa no proporcionó información, hacer reverse geocoding 5660 if (!address || address.includes('lat') || address.includes('lng')) { 5661 console.log('ðºï¸ Obteniendo dirección para coordenadas:', selectedLat, selectedLng); 5662 address = await getAddressFromCoordinates(selectedLat, selectedLng); 5663 console.log('ðï¸ Dirección obtenida via geocoding:', address); 5664 } 5665 5666 locationInput.value = address; 5667 5668 // Si existe el campo visible de búsqueda, también lo actualizamos 5669 if (locationGoogleSearch) { 5670 console.log('ð Actualizando campo visible con:', address); 5671 locationGoogleSearch.value = address; 5672 } 5673 5674 // Definimos el tipo de búsqueda 5675 const searchTypeInput = document.getElementById('SearchType'); 5676 if (searchTypeInput) { 5677 searchTypeInput.value = 'lat_lng'; 5678 } 5679 5680 // Pequeña pausa para mostrar que el proceso se completó 5681 await new Promise(resolve => setTimeout(resolve, 500)); 5682 5683 // Cerrar el modal 5684 mapModal.style.display = 'none'; 5685 5686 // Limpiar mapa después de confirmar 5687 if (map) { 5688 try { 5689 map.remove(); 5690 } catch (e) { 5691 console.log('Error al limpiar mapa después de confirmar:', e); 5692 } 5693 map = null; 5694 marker = null; 5695 } 5696 } catch (error) { 5697 console.error('Error al procesar la ubicación:', error); 5698 alert('Error al procesar la ubicación. Por favor, inténtelo de nuevo.'); 5699 } finally { 5700 // Ocultar loader y rehabilitar botón 5701 confirmBtn.classList.remove('loading'); 5702 confirmBtn.disabled = false;
5703 } 5704 } else { 5705 alert('Por favor, seleccione una ubicación en el mapa antes de confirmar.'); 5706 } 5707 }); 5708 } 5709 5710 // Función para obtener la dirección aproximada a partir de coordenadas 5711 async function getAddressFromCoordinates(lat, lng) { 5712 try { 5713 console.log('ð Solicitando dirección para:', lat, lng); 5714 5715 // Intentar con el servicio que ya está funcionando en el autocomplete 5716 const response = await fetch(`https://ipapi.co/${lat},${lng}/json/`); 5717 5718 if (!response.ok) { 5719 throw new Error(`HTTP ${response.status}`); 5720 } 5721 5722 const data = await response.json(); 5723 console.log('ð¥ Respuesta de ipapi.co:', data); 5724 5725 if (data && !data.error) { 5726 let locationName = ''; 5727 5728 // Extraer información útil en orden de preferencia 5729 if (data.city) { 5730 locationName = data.city; 5731 } else if (data.region) { 5732 locationName = data.region; 5733 } 5734 5735 // Agregar región/estado si existe y es diferente 5736 if (data.region && data.region !== locationName && locationName) { 5737 locationName += `, ${data.region}`; 5738 } 5739 5740 // Agregar paÃs si existe 5741 if (data.country_name) { 5742 locationName += locationName ? `, ${data.country_name}` : data.country_name; 5743 } 5744 5745 const finalResult = locationName || `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 5746 console.log('â Dirección procesada:', finalResult); 5747 return finalResult; 5748 } else { 5749 throw new Error('No data received or API error'); 5750 } 5751 } catch (error) { 5752 console.warn('â ï¸ Error con ipapi.co, intentando con método alternativo:', error); 5753 5754 // Fallback: usar reverse geocoding simplificado 5755 try { 5756 // Intentar con un servicio público que sà permite CORS 5757 const response = await fetch(`https://api.bigdatacloud.net/data/reverse-geocode-client?latitude=${lat}&longitude=${lng}&localityLanguage=es`); 5758 const data = await response.json(); 5759 console.log('ð¥ Respuesta de BigDataCloud:', data); 5760 5761 if (data) { 5762 let locationName = ''; 5763 5764 if (data.city) { 5765 locationName = data.city; 5766 } else if (data.locality) { 5767 locationName = data.locality; 5768 } else if (data.principalSubdivision) { 5769 locationName = data.principalSubdivision; 5770 } 5771 5772 // Agregar paÃs 5773 if (data.countryName && locationName) { 5774 locationName += `, ${data.countryName}`; 5775 } else if (data.countryName) { 5776 locationName = data.countryName; 5777 } 5778 5779 const finalResult = locationName || `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 5780 console.log('â Dirección obtenida con BigDataCloud:', finalResult); 5781 return finalResult; 5782 } 5783 } catch (secondError) { 5784 console.error('ð¥ Error con ambos servicios:', secondError); 5785 } 5786 5787 // Si todo falla, devolver coordenadas simplificadas 5788 const errorResult = `${lat.toFixed(4)}, ${lng.toFixed(4)}`; 5789 console.log('ð¯ Usando coordenadas como último recurso:', errorResult); 5790 return errorResult; 5791 } 5792 } 5793 5794 // Mover el modal de mapa al final del body para evitar problemas de desbordamiento 5795 document.addEventListener("DOMContentLoaded", function() { 5796 if (mapModal && document.body) { 5797 document.body.appendChild(mapModal); 5798 } 5799 }); 5800 })(); 5801</script>
5801 5802 5803<!-- Script independiente para limpiar modal si no hay botón de mapa -->
5804<script> 5805 (function() { 5806 // Función robusta para limpiar el modal 5807 function cleanupMapModal() { 5808 try { 5809 // Verificar si existe el botón del mapa 5810 const mapBtn = document.getElementById('map-search-btn'); 5811 5812 if (!mapBtn) { 5813 console.log('ðï¸ Botón del mapa no encontrado - removiendo modal del mapa...'); 5814 // Si no existe el botón, remover el modal del mapa 5815 const mapModal = document.getElementById('map-modal'); 5816 if (mapModal) { 5817 mapModal.remove(); 5818 console.log('â Modal del mapa removido correctamente'); 5819 return true; // Indica que se completó la limpieza 5820 } 5821 } else { 5822 console.log('â Botón del mapa encontrado - modal del mapa disponible'); 5823 return true; // Indica que se completó la verificación 5824 } 5825 } catch (error) { 5826 console.error('Error al limpiar modal del mapa:', error); 5827 } 5828 return false; // Indica que no se pudo completar 5829 } 5830 5831 // Estrategia 1: Ejecutar inmediatamente si el DOM ya está listo 5832 if (document.readyState === 'loading') { 5833 // El DOM aún se está cargando, usar múltiples eventos 5834 let cleaned = false; 5835 5836 // Función que se ejecuta una sola vez 5837 function tryCleanup() { 5838 if (!cleaned && cleanupMapModal()) { 5839 cleaned = true; 5840 } 5841 } 5842 5843 // Estrategia 2: Múltiples eventos para garantizar ejecución 5844 document.addEventListener('DOMContentLoaded', tryCleanup); 5845 document.addEventListener('readystatechange', function() { 5846 if (document.readyState === 'interactive' || document.readyState === 'complete') { 5847 tryCleanup(); 5848 } 5849 }); 5850 window.addEventListener('load', tryCleanup); 5851 5852 // Estrategia 3: Verificación periódica como respaldo 5853 let attempts = 0; 5854 const maxAttempts = 20; // Máximo 2 segundos 5855 const checkInterval = setInterval(function() { 5856 attempts++; 5857 if (cleaned || attempts >= maxAttempts) { 5858 clearInterval(checkInterval); 5859 return; 5860 } 5861 5862 // Verificar si el DOM está listo 5863 if (document.readyState === 'interactive' || document.readyState === 'complete') { 5864 if (cleanupMapModal()) { 5865 cleaned = true; 5866 clearInterval(checkInterval); 5867 } 5868 } 5869 }, 100); 5870 5871 } else { 5872 // El DOM ya está listo, ejecutar inmediatamente 5873 cleanupMapModal(); 5874 } 5875 })(); 5876</script>
vendor: 1 bytes, line 5876
5876
5877<script> 5878 (function() { 5879 function run() { 5880 try { 5881 var span = document.querySelector('#PxMkAcion_Search .update-search-span'); 5882 var btn = document.getElementById('PxMkAcion_Search'); 5883 if (!span) return; 5884 5885 var themeHex = '#b09d21'; 5886 5887 function parseHex(hex) { 5888 if (!hex) return null; 5889 hex = String(hex).trim(); 5890 if (hex.startsWith('#')) hex = hex.slice(1); 5891 if (hex.length === 3) { 5892 hex = hex.split('').map(function(ch) { 5893 return ch + ch; 5894 }).join(''); 5895 } 5896 if (hex.length !== 6) return null; 5897 var r = parseInt(hex.slice(0, 2), 16); 5898 var g = parseInt(hex.slice(2, 4), 16); 5899 var b = parseInt(hex.slice(4, 6), 16); 5900 if ([r, g, b].some(function(v) { 5901 return isNaN(v); 5902 })) return null; 5903 return { 5904 r: r, 5905 g: g, 5906 b: b 5907 }; 5908 } 5909 5910 function relL(rgb) { 5911 function toLin(c) { 5912 c = c / 255; 5913 return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); 5914 } 5915 var R = toLin(rgb.r), 5916 G = toLin(rgb.g), 5917 B = toLin(rgb.b); 5918 return 0.2126 * R + 0.7152 * G + 0.0722 * B; 5919 } 5920 5921 function contrast(L1, L2) { 5922 var a = Math.max(L1, L2); 5923 var b = Math.min(L1, L2); 5924 return (a + 0.05) / (b + 0.05); 5925 } 5926 5927 var rgb = parseHex(themeHex); 5928 if (!rgb) { 5929 if (btn) { 5930 var bg = window.getComputedStyle(btn).backgroundColor; // rgb(a) 5931 var m = bg && bg.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); 5932 if (m) { 5933 rgb = { 5934 r: parseInt(m[1], 10), 5935 g: parseInt(m[2], 10), 5936 b: parseInt(m[3], 10) 5937 }; 5938 } 5939 } 5940 } 5941 if (!rgb) return; 5942 5943 var Lbg = relL(rgb); 5944 var Lwhite = relL({ 5945 r: 255, 5946 g: 255, 5947 b: 255 5948 }); 5949 var Lblack = relL({ 5950 r: 0, 5951 g: 0, 5952 b: 0 5953 }); 5954 var cWhite = contrast(Lbg, Lwhite); 5955 var cBlack = contrast(Lbg, Lblack); 5956 5957 var textColor = cBlack >= cWhite ? '#000000' : '#FFFFFF'; 5958 span.style.setProperty('color', textColor, 'important'); 5959 if (btn) { 5960 btn.style.setProperty('color', textColor, 'important'); 5961 5962 // Recolor inline SVG icons (search and loading) to match contrast color 5963 function paintInlineSVG(container, color) { 5964 try { 5965 var svgs = container.querySelectorAll('svg'); 5966 svgs.forEach(function(svg) { 5967 // Support SVGs that use currentColor 5968 svg.style.setProperty('color', color, 'important'); 5969 svg.setAttribute('color', color); 5970 // Force fill/stroke 5971 svg.style.setProperty('fill', color, 'important'); 5972 svg.style.setProperty('stroke', color, 'important'); 5973 // Update common shape elements 5974 svg.querySelectorAll('path, circle, rect, polygon, line, polyline, ellipse, g').forEach(function(node) { 5975 node.style.setProperty('fill', color, 'important'); 5976 node.style.setProperty('stroke', color, 'important'); 5977 }); 5978 5979 // Override attributes if they exist 5980 svg.querySelectorAll('[fill]').forEach(function(node) { 5981 node.setAttribute('fill', color); 5982 }); 5983 svg.querySelectorAll('[stroke]').forEach(function(node) { 5984 node.setAttribute('stroke', color); 5985 }); 5986 }); 5987 } catch (e) { 5988 /* ignore */ 5989 } 5990 } 5991 5992 var iconLabel = btn.querySelector('.px-mk-searchicon'); 5993 var loaderLabel = btn.querySelector('.px-mk-searchloader'); 5994 if (iconLabel) paintInlineSVG(iconLabel, textColor); 5995 if (loaderLabel) paintInlineSVG(loaderLabel, textColor); 5996 } 5997 } catch (e) { 5998 /* ignore */ 5999 } 6000 } 6001 6002 if (document.readyState === 'loading') { 6003 document.addEventListener('DOMContentLoaded', run); 6004 } else { 6005 run(); 6006 } 6007 })(); 6008</script>
6008 </div> 6009 </div></div></div><div class='container-neo-slider amerian_swiper_main' Slide='HomePage' Width='1900' Height='600' Loop='true' Effect='Fade '> 6010 <div class="neo_template_block neo_neo_swiper pxModule_include ModuloWrap_neo_swiper" id="neo_swiper" > 6011 6012 6013<!-- Module Start --> 6014 6015<div class="megacontainer-neo-swiper"> 6016 <div class="swiper-container-3842"> <!-- le asignamos el numero random al contenedor --> 6017 6018 <div class="swiper-wrapper"> 6019 <div class="swiper-slide slide-one-pic"> 6020 <img src="https://images-new.pxsol.com/fuFCQ3ogZ9-ZarnrJzjuueE3Vc-Z-URju6AO0zFWFSM/rs:fill:1900:600:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F17192626940e9e7e7cb10828bce348612de95523245.jpg@jpg" 6021 width="1900" 6022 height="600" 6023 style="aspect-ratio: 1900/600;" 6024 alt="San Remo Hoteles"> 6025 </div> 6026 </div> 6027 <!-- Add Arrows --> 6028 6029 </div> 6030 <!-- Asà mismo para dataconfig-swiper le pasamos el numero random para identificarlo de otros --> 6031 <div class="dataconfig-swiper" data-id="3842" data-loop="true" data-speed=800 data-effect="fade" data-delay=5000 style="display:none" ></div> 6032</div> 6033 6034 6035 </div> 6036 </div></div> 6037 6038 6039<div class="neo_full background_white" ><div class="diplo_contentblock flex-column flex-s-center padding-top-80 padding-bottom-30" ><h1 class='diplo_hero_sub golden text-center margin-bottom-40 text-center' >San Remo Hoteles</h1><div class="diplo_divider_small golden" ></div><h2 class='diplo_h2 full padding-20 padding-lg-40 text-center' >La Cadena San Remo Hoteles pertenece a capitales nacionales, nacida hace 57 años con su primer hotel en la ciudad balnearia bonaerense de Santa Teresita y supo expandirse en toda la costa atlántica contando con 11 hoteles, llegando hasta Capital Federal.<br>En sus años extendió su marca con 2 hoteles en Uruguay y 2 en Brasil.<br>De generación en generación, la Familia San Remo invierte cada año en sus hoteles para convertir la estadÃa de cada huésped en una experiencia placentera e inigualable.<br>¡Te esperamos todo el año! Seguinos en redes sociales y vivà la experiencia del #mundosanremo</h2></div></div> 6040 6041 6042<div id='introText' class="diplo_contentblock flex-column flex-s-center padding-top-30 padding-bottom-30" ><div id='home_hotel_list' class="flex-column full flex-center" ><div class="diplo_heading diplo_primary fontsize-40px txtUpper txtLetterSpacing padding-bottom-30 text-center" >Nuestros Hoteles</div><div class='full' Horizontal='true' LinkType='marketplace_booking_engine'> 6043 <div class="neo_template_block neo_neo_marketplace_list pxModule_include ModuloWrap_neo_marketplace_list" id="neo_marketplace_list" > 6044 6045<div px-listid="910" class="px-mklist-listcontainer px-mklist-litemode px-mklist-litehoriz " linkType="marketplace_booking_engine"> 6046 6047 <div px-pid="24471" px-product="HSR TERMAS" px-type="Hotel" px-country="Argentina" px-category="2" class="px-mklist-listitemlite "> 6048 <div class="px-mklist-liimage"> 6049 <a class="" rel="https://images-new.pxsol.com/DylSY3FRRsKwRdC3d0rTd64moOq_JWqzFcljNOGl4g4/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F23437%2Fcompany%2Flibrary%2Fuser%2F1602001633576143f09f9529628de298d9cc1c25e5f.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=24471&origin=marketplace_homepage"> 6050 <img src="https://images-new.pxsol.com/DylSY3FRRsKwRdC3d0rTd64moOq_JWqzFcljNOGl4g4/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F23437%2Fcompany%2Flibrary%2Fuser%2F1602001633576143f09f9529628de298d9cc1c25e5f.jpg@jpg" width="" height="" /> 6051 </a> 6052 </div> 6053 6054 <div class="px-mklist-liinfo"> 6055 6056 <div class="px-mklist-lidata"> 6057 6058 <div class="flex flex-m-sb full"> 6059 <div class="px-mklist-lidireccion"> 6060 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6061<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6062<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6063<svg version="1.1" id="Capa_1" 6064 xmlns="http://www.w3.org/2000/svg" 6065 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6066 <g> 6067 <g id="public"> 6068 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6069 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6070 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6071 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6072 </g> 6073 </g> 6074</svg> 6075</div> <span class="text-ellipsis">Termas de RÃo Hondo, Santiago del Estero, Argentina</span> 6076 </div> 6077 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6078<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6079<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6080<svg version="1.1" id="Capa_1" 6081 xmlns="http://www.w3.org/2000/svg" 6082 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6083 <g> 6084 <g id="star-rate"> 6085 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6086 94.35,187.425 58.65,299.625 "/> 6087 </g> 6088 </g> 6089</svg> 6090</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6091<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6092<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6093<svg version="1.1" id="Capa_1" 6094 xmlns="http://www.w3.org/2000/svg" 6095 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6096 <g> 6097 <g id="star-rate"> 6098 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6099 94.35,187.425 58.65,299.625 "/> 6100 </g> 6101 </g> 6102</svg> 6103</div></div> 6104 </div> 6105 <a href="/list.html?mkt_active=true&Pid=24471&origin=marketplace_homepage" class="px-mklist-lititulo ">HSR TERMAS</a> 6106 </div> 6107 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=24471&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6108 Consultar Tarifas </a> 6109 </div> 6110 6111 6112</div><div px-pid="15202" px-product="Grand Hotel Mar del Plata" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6113 <div class="px-mklist-liimage"> 6114 <a class="" rel="https://images-new.pxsol.com/6mZD1sFPA7IEHQRNXBowW6C4l3YVsrN3FQqy7KCSSgE/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F154522870202bae1d1197e43785c398182a9d2dccb3.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=15202&origin=marketplace_homepage"> 6115 <img src="https://images-new.pxsol.com/6mZD1sFPA7IEHQRNXBowW6C4l3YVsrN3FQqy7KCSSgE/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F154522870202bae1d1197e43785c398182a9d2dccb3.jpg@jpg" width="" height="" /> 6116 </a> 6117 </div> 6118 6119 <div class="px-mklist-liinfo"> 6120 6121 <div class="px-mklist-lidata"> 6122 6123 <div class="flex flex-m-sb full"> 6124 <div class="px-mklist-lidireccion"> 6125 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6126<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6127<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6128<svg version="1.1" id="Capa_1" 6129 xmlns="http://www.w3.org/2000/svg" 6130 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6131 <g> 6132 <g id="public"> 6133 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6134 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6135 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6136 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6137 </g> 6138 </g> 6139</svg> 6140</div> <span class="text-ellipsis">Mar del Plata, Provincia de Buenos Aires, Argentina</span> 6141 </div> 6142 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6143<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6144<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6145<svg version="1.1" id="Capa_1" 6146 xmlns="http://www.w3.org/2000/svg" 6147 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6148 <g> 6149 <g id="star-rate"> 6150 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6151 94.35,187.425 58.65,299.625 "/> 6152 </g> 6153 </g> 6154</svg> 6155</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6156<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6157<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6158<svg version="1.1" id="Capa_1" 6159 xmlns="http://www.w3.org/2000/svg" 6160 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6161 <g> 6162 <g id="star-rate"> 6163 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6164 94.35,187.425 58.65,299.625 "/> 6165 </g> 6166 </g> 6167</svg> 6168</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6169<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6170<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6171<svg version="1.1" id="Capa_1" 6172 xmlns="http://www.w3.org/2000/svg" 6173 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6174 <g> 6175 <g id="star-rate"> 6176 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6177 94.35,187.425 58.65,299.625 "/> 6178 </g> 6179 </g> 6180</svg> 6181</div></div> 6182 </div> 6183 <a href="/list.html?mkt_active=true&Pid=15202&origin=marketplace_homepage" class="px-mklist-lititulo ">Grand Hotel Mar del Plata</a> 6184 <div class="pk-mklist-ratinghotel"> 6185 <div class="pk-mkratingnum">7.8</div> 6186 <div class="pk-mkratingtxt">Muy bueno</div>
6187 </div> 6188 </div> 6189 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=15202&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6190 Consultar Tarifas </a> 6191 </div> 6192 6193 6194</div><div px-pid="18055" px-product="City Hotel Buenos Aires" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6195 <div class="px-mklist-liimage"> 6196 <a class="" rel="https://images-new.pxsol.com/h2kM7NoldkFmYGNJORmTDUkim6k5fiaFG-FFvkGi-OM/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F34302296944d851b3cb8c42475e52597232a649b50.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18055&origin=marketplace_homepage"> 6197 <img src="https://images-new.pxsol.com/h2kM7NoldkFmYGNJORmTDUkim6k5fiaFG-FFvkGi-OM/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F34302296944d851b3cb8c42475e52597232a649b50.jpg@jpg" width="" height="" /> 6198 </a> 6199 </div> 6200 6201 <div class="px-mklist-liinfo"> 6202 6203 <div class="px-mklist-lidata"> 6204 6205 <div class="flex flex-m-sb full"> 6206 <div class="px-mklist-lidireccion"> 6207 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6208<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6209<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6210<svg version="1.1" id="Capa_1" 6211 xmlns="http://www.w3.org/2000/svg" 6212 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6213 <g> 6214 <g id="public"> 6215 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6216 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6217 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6218 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6219 </g> 6220 </g> 6221</svg> 6222</div> <span class="text-ellipsis">Comuna 1, Ciudad Autónoma de Buenos Aires, Argentina</span> 6223 </div> 6224 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6225<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6226<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6227<svg version="1.1" id="Capa_1" 6228 xmlns="http://www.w3.org/2000/svg" 6229 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6230 <g> 6231 <g id="star-rate"> 6232 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6233 94.35,187.425 58.65,299.625 "/> 6234 </g> 6235 </g> 6236</svg> 6237</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6238<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6239<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6240<svg version="1.1" id="Capa_1" 6241 xmlns="http://www.w3.org/2000/svg" 6242 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6243 <g> 6244 <g id="star-rate"> 6245 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6246 94.35,187.425 58.65,299.625 "/> 6247 </g> 6248 </g> 6249</svg> 6250</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6251<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6252<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6253<svg version="1.1" id="Capa_1" 6254 xmlns="http://www.w3.org/2000/svg" 6255 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6256 <g> 6257 <g id="star-rate"> 6258 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6259 94.35,187.425 58.65,299.625 "/> 6260 </g> 6261 </g> 6262</svg> 6263</div></div> 6264 </div> 6265 <a href="/list.html?mkt_active=true&Pid=18055&origin=marketplace_homepage" class="px-mklist-lititulo ">City Hotel Buenos Aires</a> 6266 <div class="pk-mklist-ratinghotel"> 6267 <div class="pk-mkratingnum">8.3</div> 6268 <div class="pk-mkratingtxt">Muy bueno</div>
6269 </div> 6270 </div> 6271 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18055&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6272 Consultar Tarifas </a> 6273 </div> 6274 6275 6276</div><div px-pid="18056" px-product="Villa Corral Apart Hotel Carilo" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6277 <div class="px-mklist-liimage"> 6278 <a class="" rel="https://images-new.pxsol.com/qVUBv0IR84bL8FdJzMnUMiDLUlT6eZSKJic-E0Qnj34/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F102901233245bf6a48ffa513d087a841ffd24dbbfa1.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18056&origin=marketplace_homepage"> 6279 <img src="https://images-new.pxsol.com/qVUBv0IR84bL8FdJzMnUMiDLUlT6eZSKJic-E0Qnj34/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F102901233245bf6a48ffa513d087a841ffd24dbbfa1.jpg@jpg" width="" height="" /> 6280 </a> 6281 </div> 6282 6283 <div class="px-mklist-liinfo"> 6284 6285 <div class="px-mklist-lidata"> 6286 6287 <div class="flex flex-m-sb full"> 6288 <div class="px-mklist-lidireccion"> 6289 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6290<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6291<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6292<svg version="1.1" id="Capa_1" 6293 xmlns="http://www.w3.org/2000/svg" 6294 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6295 <g> 6296 <g id="public"> 6297 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6298 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6299 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6300 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6301 </g> 6302 </g> 6303</svg> 6304</div> <span class="text-ellipsis">Cariló, Buenos Aires, Buenos Aires, Argentina</span> 6305 </div> 6306 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6307<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6308<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6309<svg version="1.1" id="Capa_1" 6310 xmlns="http://www.w3.org/2000/svg" 6311 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6312 <g> 6313 <g id="star-rate"> 6314 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6315 94.35,187.425 58.65,299.625 "/> 6316 </g> 6317 </g> 6318</svg> 6319</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6320<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6321<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6322<svg version="1.1" id="Capa_1" 6323 xmlns="http://www.w3.org/2000/svg" 6324 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6325 <g> 6326 <g id="star-rate"> 6327 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6328 94.35,187.425 58.65,299.625 "/> 6329 </g> 6330 </g> 6331</svg> 6332</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6333<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6334<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6335<svg version="1.1" id="Capa_1" 6336 xmlns="http://www.w3.org/2000/svg" 6337 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6338 <g> 6339 <g id="star-rate"> 6340 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6341 94.35,187.425 58.65,299.625 "/> 6342 </g> 6343 </g> 6344</svg> 6345</div></div> 6346 </div> 6347 <a href="/list.html?mkt_active=true&Pid=18056&origin=marketplace_homepage" class="px-mklist-lititulo ">Villa Corral Apart Hotel Carilo</a> 6348 <div class="pk-mklist-ratinghotel"> 6349 <div class="pk-mkratingnum">7.9</div> 6350 <div class="pk-mkratingtxt">Muy bueno</div>
6351 </div> 6352 </div> 6353 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18056&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6354 Consultar Tarifas </a> 6355 </div> 6356 6357 6358</div><div px-pid="18057" px-product="Majestic Hotel Mar de Ajo" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6359 <div class="px-mklist-liimage"> 6360 <a class="" rel="https://images-new.pxsol.com/Bv0Xxy8b2vaoXIfOBGaEOuDiACW4z3zf81xPEQYnbfk/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F27436123088b5a42d350f72d3cd701f0a9eaa9a2082.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18057&origin=marketplace_homepage"> 6361 <img src="https://images-new.pxsol.com/Bv0Xxy8b2vaoXIfOBGaEOuDiACW4z3zf81xPEQYnbfk/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F27436123088b5a42d350f72d3cd701f0a9eaa9a2082.jpg@jpg" width="" height="" /> 6362 </a> 6363 </div> 6364 6365 <div class="px-mklist-liinfo"> 6366 6367 <div class="px-mklist-lidata"> 6368 6369 <div class="flex flex-m-sb full"> 6370 <div class="px-mklist-lidireccion"> 6371 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6372<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6373<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6374<svg version="1.1" id="Capa_1" 6375 xmlns="http://www.w3.org/2000/svg" 6376 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6377 <g> 6378 <g id="public"> 6379 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6380 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6381 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6382 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6383 </g> 6384 </g> 6385</svg> 6386</div> <span class="text-ellipsis">Mar de Ajó, Provincia de Buenos Aires, Argentina</span> 6387 </div> 6388 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6389<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6390<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6391<svg version="1.1" id="Capa_1" 6392 xmlns="http://www.w3.org/2000/svg" 6393 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6394 <g> 6395 <g id="star-rate"> 6396 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6397 94.35,187.425 58.65,299.625 "/> 6398 </g> 6399 </g> 6400</svg> 6401</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6402<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6403<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6404<svg version="1.1" id="Capa_1" 6405 xmlns="http://www.w3.org/2000/svg" 6406 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6407 <g> 6408 <g id="star-rate"> 6409 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6410 94.35,187.425 58.65,299.625 "/> 6411 </g> 6412 </g> 6413</svg> 6414</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6415<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6416<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6417<svg version="1.1" id="Capa_1" 6418 xmlns="http://www.w3.org/2000/svg" 6419 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6420 <g> 6421 <g id="star-rate"> 6422 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6423 94.35,187.425 58.65,299.625 "/> 6424 </g> 6425 </g> 6426</svg> 6427</div></div> 6428 </div> 6429 <a href="/list.html?mkt_active=true&Pid=18057&origin=marketplace_homepage" class="px-mklist-lititulo ">Majestic Hotel Mar de Ajo</a> 6430 </div> 6431 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18057&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6432 Consultar Tarifas </a> 6433 </div> 6434 6435 6436</div><div px-pid="18058" px-product="Park Hotel San Bernardo" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6437 <div class="px-mklist-liimage"> 6438 <a class="" rel="https://images-new.pxsol.com/j9dBWpAMhTNMCx3ksqeR59uELlRpEUeykdiThWW2INc/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F342952177697bbc2dbb3e86123e7e4dd74c8c730e6.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18058&origin=marketplace_homepage"> 6439 <img src="https://images-new.pxsol.com/j9dBWpAMhTNMCx3ksqeR59uELlRpEUeykdiThWW2INc/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F342952177697bbc2dbb3e86123e7e4dd74c8c730e6.jpg@jpg" width="" height="" /> 6440 </a> 6441 </div> 6442 6443 <div class="px-mklist-liinfo"> 6444 6445 <div class="px-mklist-lidata"> 6446 6447 <div class="flex flex-m-sb full"> 6448 <div class="px-mklist-lidireccion"> 6449 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6450<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6451<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6452<svg version="1.1" id="Capa_1" 6453 xmlns="http://www.w3.org/2000/svg" 6454 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6455 <g> 6456 <g id="public"> 6457 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6458 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6459 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6460 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6461 </g> 6462 </g> 6463</svg> 6464</div> <span class="text-ellipsis">La Costa, Provincia de Buenos Aires, Argentina</span> 6465 </div> 6466 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6467<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6468<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6469<svg version="1.1" id="Capa_1" 6470 xmlns="http://www.w3.org/2000/svg" 6471 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6472 <g> 6473 <g id="star-rate"> 6474 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6475 94.35,187.425 58.65,299.625 "/> 6476 </g> 6477 </g> 6478</svg> 6479</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6480<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6481<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6482<svg version="1.1" id="Capa_1" 6483 xmlns="http://www.w3.org/2000/svg" 6484 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6485 <g> 6486 <g id="star-rate"> 6487 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6488 94.35,187.425 58.65,299.625 "/> 6489 </g> 6490 </g> 6491</svg> 6492</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6493<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6494<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6495<svg version="1.1" id="Capa_1" 6496 xmlns="http://www.w3.org/2000/svg" 6497 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6498 <g> 6499 <g id="star-rate"> 6500 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6501 94.35,187.425 58.65,299.625 "/> 6502 </g> 6503 </g> 6504</svg> 6505</div></div> 6506 </div> 6507 <a href="/list.html?mkt_active=true&Pid=18058&origin=marketplace_homepage" class="px-mklist-lititulo ">Park Hotel San Bernardo</a> 6508 <div class="pk-mklist-ratinghotel"> 6509 <div class="pk-mkratingnum">7.1</div> 6510 <div class="pk-mkratingtxt">Muy bueno</div>
6511 </div> 6512 </div> 6513 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18058&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6514 Consultar Tarifas </a> 6515 </div> 6516 6517 6518</div><div px-pid="18059" px-product="World Hotel San Clemente" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6519 <div class="px-mklist-liimage"> 6520 <a class="" rel="https://images-new.pxsol.com/hkKbmy7KVbco8wiTCMo33xmRLjQVR3w68PtT2X7uvuQ/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F223392262606fa0a3cf30801f3c6c9bf907c7fa1344.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18059&origin=marketplace_homepage"> 6521 <img src="https://images-new.pxsol.com/hkKbmy7KVbco8wiTCMo33xmRLjQVR3w68PtT2X7uvuQ/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F223392262606fa0a3cf30801f3c6c9bf907c7fa1344.jpg@jpg" width="" height="" /> 6522 </a> 6523 </div> 6524 6525 <div class="px-mklist-liinfo"> 6526 6527 <div class="px-mklist-lidata"> 6528 6529 <div class="flex flex-m-sb full"> 6530 <div class="px-mklist-lidireccion"> 6531 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6532<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6533<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6534<svg version="1.1" id="Capa_1" 6535 xmlns="http://www.w3.org/2000/svg" 6536 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6537 <g> 6538 <g id="public"> 6539 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6540 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6541 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6542 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6543 </g> 6544 </g> 6545</svg> 6546</div> <span class="text-ellipsis">San Clemente del Tuyu, Provincia de Buenos Aires, Argentina</span> 6547 </div> 6548 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6549<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6550<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6551<svg version="1.1" id="Capa_1" 6552 xmlns="http://www.w3.org/2000/svg" 6553 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6554 <g> 6555 <g id="star-rate"> 6556 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6557 94.35,187.425 58.65,299.625 "/> 6558 </g> 6559 </g> 6560</svg> 6561</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6562<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6563<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6564<svg version="1.1" id="Capa_1" 6565 xmlns="http://www.w3.org/2000/svg" 6566 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6567 <g> 6568 <g id="star-rate"> 6569 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6570 94.35,187.425 58.65,299.625 "/> 6571 </g> 6572 </g> 6573</svg> 6574</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6575<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6576<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6577<svg version="1.1" id="Capa_1" 6578 xmlns="http://www.w3.org/2000/svg" 6579 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6580 <g> 6581 <g id="star-rate"> 6582 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6583 94.35,187.425 58.65,299.625 "/> 6584 </g> 6585 </g> 6586</svg> 6587</div></div> 6588 </div> 6589 <a href="/list.html?mkt_active=true&Pid=18059&origin=marketplace_homepage" class="px-mklist-lititulo ">World Hotel San Clemente</a> 6590 <div class="pk-mklist-ratinghotel"> 6591 <div class="pk-mkratingnum">7.7</div> 6592 <div class="pk-mkratingtxt">Muy bueno</div>
6593 </div> 6594 </div> 6595 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18059&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6596 Consultar Tarifas </a> 6597 </div> 6598 6599 6600</div><div px-pid="18062" px-product="Resort Hotel Santa Teresita" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6601 <div class="px-mklist-liimage"> 6602 <a class="" rel="https://images-new.pxsol.com/lZCRwgjn1tBZ5elkhccISExIbeX6HDX3ExqmVW2ih4E/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F10290048012fd7af99988e1164ebce340318faaeffd.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18062&origin=marketplace_homepage"> 6603 <img src="https://images-new.pxsol.com/lZCRwgjn1tBZ5elkhccISExIbeX6HDX3ExqmVW2ih4E/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F10290048012fd7af99988e1164ebce340318faaeffd.jpg@jpg" width="" height="" /> 6604 </a> 6605 </div> 6606 6607 <div class="px-mklist-liinfo"> 6608 6609 <div class="px-mklist-lidata"> 6610 6611 <div class="flex flex-m-sb full"> 6612 <div class="px-mklist-lidireccion"> 6613 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6614<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6615<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6616<svg version="1.1" id="Capa_1" 6617 xmlns="http://www.w3.org/2000/svg" 6618 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6619 <g> 6620 <g id="public"> 6621 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6622 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6623 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6624 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6625 </g> 6626 </g> 6627</svg> 6628</div> <span class="text-ellipsis">La Costa, Provincia de Buenos Aires, Argentina</span> 6629 </div> 6630 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6631<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6632<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6633<svg version="1.1" id="Capa_1" 6634 xmlns="http://www.w3.org/2000/svg" 6635 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6636 <g> 6637 <g id="star-rate"> 6638 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6639 94.35,187.425 58.65,299.625 "/> 6640 </g> 6641 </g> 6642</svg> 6643</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6644<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6645<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6646<svg version="1.1" id="Capa_1" 6647 xmlns="http://www.w3.org/2000/svg" 6648 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6649 <g> 6650 <g id="star-rate"> 6651 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6652 94.35,187.425 58.65,299.625 "/> 6653 </g> 6654 </g> 6655</svg> 6656</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6657<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6658<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6659<svg version="1.1" id="Capa_1" 6660 xmlns="http://www.w3.org/2000/svg" 6661 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6662 <g> 6663 <g id="star-rate"> 6664 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6665 94.35,187.425 58.65,299.625 "/> 6666 </g> 6667 </g> 6668</svg> 6669</div></div> 6670 </div> 6671 <a href="/list.html?mkt_active=true&Pid=18062&origin=marketplace_homepage" class="px-mklist-lititulo ">Resort Hotel Santa Teresita</a> 6672 </div> 6673 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18062&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6674 Consultar Tarifas </a> 6675 </div> 6676 6677 6678</div><div px-pid="18063" px-product="Viking Hotel Pinamar" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6679 <div class="px-mklist-liimage"> 6680 <a class="" rel="https://images-new.pxsol.com/Kl_0qS4izuoMyoTiE9uulp1DuH1FL7d03jpYpEzW_JY/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F137200825443ed8ce823c4fe3caf204a892ad04ea91.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18063&origin=marketplace_homepage"> 6681 <img src="https://images-new.pxsol.com/Kl_0qS4izuoMyoTiE9uulp1DuH1FL7d03jpYpEzW_JY/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F137200825443ed8ce823c4fe3caf204a892ad04ea91.jpg@jpg" width="" height="" /> 6682 </a> 6683 </div> 6684 6685 <div class="px-mklist-liinfo"> 6686 6687 <div class="px-mklist-lidata"> 6688 6689 <div class="flex flex-m-sb full"> 6690 <div class="px-mklist-lidireccion"> 6691 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6692<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6693<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6694<svg version="1.1" id="Capa_1" 6695 xmlns="http://www.w3.org/2000/svg" 6696 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6697 <g> 6698 <g id="public"> 6699 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6700 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6701 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6702 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6703 </g> 6704 </g> 6705</svg> 6706</div> <span class="text-ellipsis">Pinamar, Provincia de Buenos Aires, Argentina</span> 6707 </div> 6708 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6709<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6710<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6711<svg version="1.1" id="Capa_1" 6712 xmlns="http://www.w3.org/2000/svg" 6713 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6714 <g> 6715 <g id="star-rate"> 6716 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6717 94.35,187.425 58.65,299.625 "/> 6718 </g> 6719 </g> 6720</svg> 6721</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6722<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6723<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6724<svg version="1.1" id="Capa_1" 6725 xmlns="http://www.w3.org/2000/svg" 6726 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6727 <g> 6728 <g id="star-rate"> 6729 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6730 94.35,187.425 58.65,299.625 "/> 6731 </g> 6732 </g> 6733</svg> 6734</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6735<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6736<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6737<svg version="1.1" id="Capa_1" 6738 xmlns="http://www.w3.org/2000/svg" 6739 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6740 <g> 6741 <g id="star-rate"> 6742 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6743 94.35,187.425 58.65,299.625 "/> 6744 </g> 6745 </g> 6746</svg> 6747</div></div> 6748 </div> 6749 <a href="/list.html?mkt_active=true&Pid=18063&origin=marketplace_homepage" class="px-mklist-lititulo ">Viking Hotel Pinamar</a> 6750 <div class="pk-mklist-ratinghotel"> 6751 <div class="pk-mkratingnum">8</div> 6752 <div class="pk-mkratingtxt">Muy bueno</div>
6753 </div> 6754 </div> 6755 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18063&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6756 Consultar Tarifas </a> 6757 </div> 6758 6759 6760</div><div px-pid="18064" px-product="Amapola Apart Ostende" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6761 <div class="px-mklist-liimage"> 6762 <a class="" rel="https://images-new.pxsol.com/8hBml1_YsrpyyZ8T_1YAEaa8mokoxRhgb13_tD5KDAs/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F257647950454d9fa56550e44673564d226d3d54a79f.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18064&origin=marketplace_homepage"> 6763 <img src="https://images-new.pxsol.com/8hBml1_YsrpyyZ8T_1YAEaa8mokoxRhgb13_tD5KDAs/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F257647950454d9fa56550e44673564d226d3d54a79f.jpg@jpg" width="" height="" /> 6764 </a> 6765 </div> 6766 6767 <div class="px-mklist-liinfo"> 6768 6769 <div class="px-mklist-lidata"> 6770 6771 <div class="flex flex-m-sb full"> 6772 <div class="px-mklist-lidireccion"> 6773 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6774<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6775<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6776<svg version="1.1" id="Capa_1" 6777 xmlns="http://www.w3.org/2000/svg" 6778 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6779 <g> 6780 <g id="public"> 6781 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6782 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6783 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6784 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6785 </g> 6786 </g> 6787</svg> 6788</div> <span class="text-ellipsis">Ostende, Provincia de Buenos Aires, Argentina</span> 6789 </div> 6790 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6791<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6792<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6793<svg version="1.1" id="Capa_1" 6794 xmlns="http://www.w3.org/2000/svg" 6795 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6796 <g> 6797 <g id="star-rate"> 6798 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6799 94.35,187.425 58.65,299.625 "/> 6800 </g> 6801 </g> 6802</svg> 6803</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6804<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6805<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6806<svg version="1.1" id="Capa_1" 6807 xmlns="http://www.w3.org/2000/svg" 6808 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6809 <g> 6810 <g id="star-rate"> 6811 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6812 94.35,187.425 58.65,299.625 "/> 6813 </g> 6814 </g> 6815</svg> 6816</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6817<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6818<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6819<svg version="1.1" id="Capa_1" 6820 xmlns="http://www.w3.org/2000/svg" 6821 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6822 <g> 6823 <g id="star-rate"> 6824 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6825 94.35,187.425 58.65,299.625 "/> 6826 </g> 6827 </g> 6828</svg> 6829</div></div> 6830 </div> 6831 <a href="/list.html?mkt_active=true&Pid=18064&origin=marketplace_homepage" class="px-mklist-lititulo ">Amapola Apart Ostende</a> 6832 <div class="pk-mklist-ratinghotel"> 6833 <div class="pk-mkratingnum">7.4</div> 6834 <div class="pk-mkratingtxt">Muy bueno</div>
6835 </div> 6836 </div> 6837 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18064&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6838 Consultar Tarifas </a> 6839 </div> 6840 6841 6842</div><div px-pid="18065" px-product="Palace Hotel Villa Gesell" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6843 <div class="px-mklist-liimage"> 6844 <a class="" rel="https://images-new.pxsol.com/RI2uimS4sjCwpW5g_uzmpKrGjOWcLi-OlqQ80a-dUVc/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F188969936650f528a55075dbb9aa80c724a0a4fb3ef.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18065&origin=marketplace_homepage"> 6845 <img src="https://images-new.pxsol.com/RI2uimS4sjCwpW5g_uzmpKrGjOWcLi-OlqQ80a-dUVc/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F188969936650f528a55075dbb9aa80c724a0a4fb3ef.jpg@jpg" width="" height="" /> 6846 </a> 6847 </div> 6848 6849 <div class="px-mklist-liinfo"> 6850 6851 <div class="px-mklist-lidata"> 6852 6853 <div class="flex flex-m-sb full"> 6854 <div class="px-mklist-lidireccion"> 6855 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6856<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6857<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6858<svg version="1.1" id="Capa_1" 6859 xmlns="http://www.w3.org/2000/svg" 6860 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6861 <g> 6862 <g id="public"> 6863 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6864 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6865 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6866 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6867 </g> 6868 </g> 6869</svg> 6870</div> <span class="text-ellipsis">Villa Gesell, Provincia de Buenos Aires, Argentina</span> 6871 </div> 6872 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6873<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6874<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6875<svg version="1.1" id="Capa_1" 6876 xmlns="http://www.w3.org/2000/svg" 6877 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6878 <g> 6879 <g id="star-rate"> 6880 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6881 94.35,187.425 58.65,299.625 "/> 6882 </g> 6883 </g> 6884</svg> 6885</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6886<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6887<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6888<svg version="1.1" id="Capa_1" 6889 xmlns="http://www.w3.org/2000/svg" 6890 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6891 <g> 6892 <g id="star-rate"> 6893 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6894 94.35,187.425 58.65,299.625 "/> 6895 </g> 6896 </g> 6897</svg> 6898</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6899<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6900<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6901<svg version="1.1" id="Capa_1" 6902 xmlns="http://www.w3.org/2000/svg" 6903 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6904 <g> 6905 <g id="star-rate"> 6906 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6907 94.35,187.425 58.65,299.625 "/> 6908 </g> 6909 </g> 6910</svg> 6911</div></div> 6912 </div> 6913 <a href="/list.html?mkt_active=true&Pid=18065&origin=marketplace_homepage" class="px-mklist-lititulo ">Palace Hotel Villa Gesell</a> 6914 </div> 6915 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18065&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6916 Consultar Tarifas </a> 6917 </div> 6918 6919 6920</div><div px-pid="18066" px-product="Gesell Mar Apart" px-type="Hotel" px-country="Argentina" px-category="3" class="px-mklist-listitemlite "> 6921 <div class="px-mklist-liimage"> 6922 <a class="" rel="https://images-new.pxsol.com/s7pbDPmCirdKfmt70zJcTT5n-Xnl6HpWnHO0Px5wu1s/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F12204797150557162e2f9ff91c2758ab4e7b9712db9.jpg@jpg" title="" href="/list.html?mkt_active=true&Pid=18066&origin=marketplace_homepage"> 6923 <img src="https://images-new.pxsol.com/s7pbDPmCirdKfmt70zJcTT5n-Xnl6HpWnHO0Px5wu1s/rs:fill:500:300:1/q:80/plain/https%3A%2F%2Ffiles-p.pxsol.com%2F13307%2Fcompany%2Flibrary%2Fuser%2F12204797150557162e2f9ff91c2758ab4e7b9712db9.jpg@jpg" width="" height="" /> 6924 </a> 6925 </div> 6926 6927 <div class="px-mklist-liinfo"> 6928 6929 <div class="px-mklist-lidata"> 6930 6931 <div class="flex flex-m-sb full"> 6932 <div class="px-mklist-lidireccion"> 6933 <div class="margin-right-5"><?xml version="1.0" encoding="iso-8859-1"?> 6934<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6935<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6936<svg version="1.1" id="Capa_1" 6937 xmlns="http://www.w3.org/2000/svg" 6938 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> 6939 <g> 6940 <g id="public"> 6941 <path d="M255,0C114.75,0,0,114.75,0,255s114.75,255,255,255s255-114.75,255-255S395.25,0,255,0z M229.5,456.45 6942 C130.05,443.7,51,357,51,255c0-15.3,2.55-30.6,5.1-45.9l122.4,122.4V357c0,28.05,22.95,51,51,51V456.45z M405.45,392.7 6943 C397.8,372.3,379.95,357,357,357h-25.5v-76.5c0-15.3-10.2-25.5-25.5-25.5H153v-51h51c15.3,0,25.5-10.2,25.5-25.5v-51h51 6944 c28.05,0,51-22.95,51-51V66.3C405.45,96.9,459,170.85,459,255C459,308.55,438.6,357,405.45,392.7z"/> 6945 </g> 6946 </g> 6947</svg> 6948</div> <span class="text-ellipsis">Villa Gesell, Provincia de Buenos Aires, Argentina</span> 6949 </div> 6950 <div class="px-mklist-stars"><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6951<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6952<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6953<svg version="1.1" id="Capa_1" 6954 xmlns="http://www.w3.org/2000/svg" 6955 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6956 <g> 6957 <g id="star-rate"> 6958 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6959 94.35,187.425 58.65,299.625 "/> 6960 </g> 6961 </g> 6962</svg> 6963</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6964<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6965<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6966<svg version="1.1" id="Capa_1" 6967 xmlns="http://www.w3.org/2000/svg" 6968 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6969 <g> 6970 <g id="star-rate"> 6971 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6972 94.35,187.425 58.65,299.625 "/> 6973 </g> 6974 </g> 6975</svg> 6976</div><div class="px-mklist-star"><?xml version="1.0" encoding="iso-8859-1"?> 6977<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 6978<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 6979<svg version="1.1" id="Capa_1" 6980 xmlns="http://www.w3.org/2000/svg" 6981 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve"> 6982 <g> 6983 <g id="star-rate"> 6984 <polygon points="153,230.775 247.35,299.625 211.65,187.425 306,121.125 191.25,121.125 153,6.375 114.75,121.125 0,121.125 6985 94.35,187.425 58.65,299.625 "/> 6986 </g> 6987 </g> 6988</svg> 6989</div></div> 6990 </div> 6991 <a href="/list.html?mkt_active=true&Pid=18066&origin=marketplace_homepage" class="px-mklist-lititulo ">Gesell Mar Apart</a> 6992 <div class="pk-mklist-ratinghotel"> 6993 <div class="pk-mkratingnum">7.3</div> 6994 <div class="pk-mkratingtxt">Muy bueno</div>
6995 </div> 6996 </div> 6997 <a class="px-mklist-licta" href="/list.html?mkt_active=true&Pid=18066&origin=marketplace_homepage" data-testid="view-rates-button-lite"> 6998 Consultar Tarifas </a> 6999 </div> 7000 7001 7002</div> 7003 7004</div> </div> 7005 </div></div></div> 7006 7007 7008<div class="logos-container" ><a class="" target='_blank' href="https://rutatlantica.com.ar/" target=""> <img loading="lazy" class="" lazy-src="https://picsv3.pxsol.com/13307/company/library/user/70114740081ae8a2df42e2b8ad98ba73ac9f279651.png?ixlib=js-2.3.2&s=f38a1092a867c416030485baf7013b72" alt="Sanremohoteles" > </image></a><a class="" target='_blank' href="https://www.costadelsoltermas.com.ar/" target=""> <img loading="lazy" class="" lazy-src="https://picsv3.pxsol.com/13307/company/library/user/52567833249d56b575e61e7de4f9d429c26d36d00a.jpg?ixlib=js-2.3.2&s=905620668d8f412f95c5a3a861955407" alt="Sanremohoteles" > </image></a></div> 7009 7010 7011<div class="container-uru-bra" ><section class='hotels-info-section' ><h2 class='main-title' >Nuestros Hoteles en Brasil y Uruguay</h2><div class="countries-container" ><div class="country-section" ><div class="country-title" >Hoteles en Brasil</div><div class="hotels-container" ><div class="hotel-card" ><h3 class='hotel-name' >Hanna Balneario - SR Camboriu</h3><p class='' ><strong>Reservas:</strong></p><p class='' >WhatsApp Hotel: +55 (47) 3047-0209</p><p class='' >Ubicación: Rua 1301, 296 - Centro â Camboriu â Santa Catarina</p></div><div class="hotel-card" ><h3 class='hotel-name' >Hanna Praia Hotel - SR Canasvieiras</h3><p class='' ><strong>Reservas:</strong></p><p class='' >Teléfono: +55 48 3054-8829</p><p class='' >WhatsApp: +55 48 3054-8829</p><p class='' >Ubicación: R. do Kalifa, 435 - Canasvieiras, Florianópolis - Brasil</p></div></div></div><div class="country-section" ><div class="country-title" >Hoteles en Uruguay</div><div class="hotels-container" ><div class="hotel-card" ><h3 class='hotel-name' >San Remo Piriápolis</h3><p class='' ><strong>Reservas:</strong></p><p class='' >Teléfono: +598 4432 0468</p><p class='' >WhatsApp: +598 92 594 212</p></div><div class="hotel-card" ><h3 class='hotel-name' >San Remo Punta del Este</h3><p class='' ><strong>Reservas:</strong></p><p class='' >Teléfono: +598 4432 0468</p><p class='' >WhatsApp: +598 92 594 212</p></div></div></div></div></section></div> 7012 7013</div> 7014 7015 </div> 7016 7017 7018 7019 <div class="main_wraper_footer" id="main_wraper_footer"> 7020 7021 7022<div class="neo_template_container neo_template_ computer"> 7023 7024 7025<div class="diplo_footercontainer full flex flex-wrap padding-20 padding-top-60 padding-bottom-40" ><div class="xs-100 lg-10" ></div><div class="xs-100 lg-50 flex flex-column" > <img loading="lazy" class="amerian_footerimg margin-top-10 margin-bottom-30" lazy-src="https://files-p.pxsol.com/13307/company/library/user/5126930364ea8a9a40b647af1c2cabae351ef5e772.png" alt="San Remo Hoteles" > </image><div class="fontsize-1em diplo_white padding-bottom-30" ><div class="diplo_footerinfo flex-column" ><div class="margin-bottom-30 txtUpper txtWhite amerian_heading" >Central de Reservas</div><a class="margin-bottom-5 flex flex-s-center txtUpper amerian_supramenu_item nopadding fontsize-20px" href="tel:8102208880" target=""><div class="" >8102208880</div></a><a class="margin-bottom-5 flex flex-s-center txtUpper amerian_supramenu_item nopadding fontsize-20px" href="tel:5491127216237" target=""><div class="" >5491127216237</div></a></div></div></div><div class="xs-100 lg-30" ><div class="diplo_social flex flex-m-end flex-s-center padding-bottom-20 padding-right-20" ><div class='' > 7026 <div class="neo_template_block neo_neo_social_links pxModule_include ModuloWrap_neo_social_links" id="neo_social_links" > 7027 7028 7029<div class="neo_social_links_container social_block"> 7030 <ul class="neo_links_list"> 7031 <li class="facebook_page"> 7032 <a href="https://www.facebook.com/sanremohoteles" target="_blank"> 7033 <i class="mdi mdi-facebook"></i> 7034 </a> 7035 </li> 7036 <li class="instagram_page"> 7037 <a href="https://www.instagram.com/hotelessanremo" target="_blank"> 7038 <i class="mdi mdi-instagram"></i> 7039 </a> 7040 </li> 7041 <li class="linkedin_page"> 7042 <a href="https://www.linkedin.com/company/101938064" target="_blank"> 7043 <i class="mdi mdi-linkedin"></i> 7044 </a> 7045 </li> 7046 </ul> 7047</div> 7048 <div class="wsp_floating">
7049 <a href="https://api.whatsapp.com/send?phone=5491127216237" target="_blank"> 7050 <i class="mdi mdi-whatsapp"></i> 7051 </a> 7052 </div> 7053 </div> 7054 </div><ul class='neo_links_list' ><li class='youtube_page' ><a class="" target='_blank' href="https://www.youtube.com/@sanremohoteles5949" target=""><i class='mdi mdi mdi-youtube' ></i></a></li></ul></div><div class="diplo_social flex flex-m-end flex-s-center padding-bottom-20 padding-right-20" ></div></div><div class="xs-100 lg-10" ></div></div> 7055 7056</div> 7057 7058 <div id="footer_px" class="noprint footer_px_fix" style="max-width: 100vw; box-sizing: border-box; overflow-x: hidden;"> 7059 <div class="wraper_footerpx flex-column flex-center"> 7060 7061 7062 <div class="texto_footerpx"> 7063 Al utilizar este sitio web, acepta el uso de cookies. <a target="_blank" rel="nofollow" href="/cookiespolicies.php?pos=Sanremohoteles" class="footer_link">PolÃtica de cookies</a> | <a target="_blank" rel="nofollow" href="/terms.php?pos=Sanremohoteles" class="footer_link">Términos y condiciones</a> | <a target="_blank" rel="nofollow" href="/policies.php?pos=Sanremohoteles" class="footer_link">PolÃtica de privacidad</a> | <span>Cache: 7064 2026-10-05 06:35:32 | </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> 7065 </div> 7066 7067 <div class="pxsol_link_f"> 7068 <a style="text-decoration: underline !important;" target="_blank" href="https://www.pxsol.com/pos_source=Sanremohoteles" class="footer_link">Sistema Hotelero</a> 7069 por <a href="/" target="_blank" class="footer_link footer_logo_svg" title="Sistema Hotelero"> 7070 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 7071<svg 7072 xmlns:dc="http://purl.org/dc/elements/1.1/" 7073 xmlns:cc="http://creativecommons.org/ns#" 7074 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 7075 xmlns:svg="http://www.w3.org/2000/svg" 7076 xmlns="http://www.w3.org/2000/svg" 7077 viewBox="0 0 752.42535 358.37866" 7078 height="50px" 7079 width="23px" 7080 xml:space="preserve" 7081 id="svg2" 7082 version="1.1"><metadata 7083 id="metadata8"><rdf:RDF><cc:Work 7084 rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type 7085 rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs 7086 id="defs6"><clipPath 7087 id="clipPath18" 7088 clipPathUnits="userSpaceOnUse"><path 7089 id="path16" 7090 d="M 0,268.784 H 564.319 V 0 H 0 Z" /></clipPath></defs><g 7091 transform="matrix(1.3333333,0,0,-1.3333333,0,358.37867)" 7092 id="g10"><g 7093 id="g12"><g 7094 clip-path="url(#clipPath18)" 7095 id="g14"><g 7096 transform="translate(23.3438,154.8828)" 7097 id="g20"><path 7098 id="path22" 7099 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 7100 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 7101 transform="translate(325.4336,123.7686)" 7102 id="g24"><path 7103 id="path26" 7104 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 7105 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 7106 transform="translate(355.8486,153.5532)" 7107 id="g28"><path 7108 id="path30" 7109 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 7110 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
711010.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 7111 transform="translate(480.5166,88.5742)" 7112 id="g32"><path 7113 id="path34" 7114 style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" 7115 d="M 0,0 V 129.603 H 23.342 V 18.175 H 83.803 V 0 Z" /></g><g 7116 transform="translate(95.5459,218.4404)" 7117 id="g36"><path 7118 id="path38" 7119 style="fill:#ee2735;fill-opacity:1;fill-rule:nonzero;stroke:none" 7120 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> 7121 </div> 7122 7123 </div> 7124</div> 7125 7126
7127<script> 7128 function loadPxChatWidget() { 7129 const posToGetApiKey = 'Sanremohoteles'; 7130 const timestamp = '1788314973'; 7131 const urlToGetApiKey = `https://px-chat-widget-prod.pxsol.com/company-widget/apiKey/${posToGetApiKey}?v=${timestamp}`; 7132 7133 fetch(urlToGetApiKey, { 7134 method: 'GET', 7135 headers: { 7136 'Content-Type': 'application/json', 7137 } 7138 }) 7139 .then(response => { 7140 if (!response.ok) { 7141 throw new Error(`HTTP error! status: ${response.status}`); 7142 } 7143 return response.json(); 7144 }) 7145 .then(data => { 7146 const internalKey = data?.data?.api_key; 7147 if (!internalKey) { 7148 throw new Error('API key not found in response'); 7149 } 7150 7151 const script = document.createElement('script'); 7152 script.src = `https://cdn.pxsol.com/dist/chat-widget.min.js?k=${internalKey}&v=${timestamp}`; 7153 script.async = true; 7154 script.onload = () => { 7155 console.log('PxChat widget loaded successfully'); 7156 }; 7157 script.onerror = (error) => { 7158 console.error('Failed to load PxChat widget:', error); 7159 }; 7160 document.body.appendChild(script); 7161 }) 7162 .catch(error => { 7163 console.error('PxChat widget initialization failed:', error.message); 7164 }); 7165 } 7166 document.addEventListener("DOMContentLoaded", loadPxChatWidget); 7167 </script>
7167 7168 7169<style> 7170 /* El botón flotante de WhatsApp (.wsp_floating) y el launcher del widget de chat (pxChat) 7171 se ubican ambos en la esquina inferior derecha y chocan entre sÃ. Cuando el chat está 7172 activo/montado, ocultamos el botón de WhatsApp para evitar la superposición. */ 7173 body.px-chat-widget-active .wsp_floating { display: none !important; } 7174</style>
7175<script> 7176 (function () { 7177 // El widget pxChat monta su launcher/panel bajo #px-widget-root (clase .widget-launcher-button). 7178 function chatWidgetPresent() { 7179 return !!( 7180 document.getElementById('px-widget-root') || 7181 document.querySelector('.widget-launcher-button, [class*="widget-launcher"]') 7182 ); 7183 } 7184 var applied = false; 7185 var observer = null; 7186 var fallbackTimer = null; 7187 function apply() { 7188 if (applied || !document.body || !chatWidgetPresent()) return; 7189 document.body.classList.add('px-chat-widget-active'); 7190 applied = true; 7191 if (observer) observer.disconnect(); 7192 if (fallbackTimer) clearTimeout(fallbackTimer); 7193 } 7194 function start() { 7195 apply(); 7196 if (applied || !('MutationObserver' in window) || !document.body) return; 7197 // El widget carga async (fetch de apiKey + inyección del
7197<script>), asà que observamos 7198 // el DOM hasta que aparezca. Si a los 20s no montó, dejamos de observar. 7199 observer = new MutationObserver(apply); 7200 observer.observe(document.body, { childList: true, subtree: true }); 7201 fallbackTimer = setTimeout(function () { 7202 if (observer) observer.disconnect(); 7203 }, 20000); 7204 } 7205 if (document.readyState === 'loading') { 7206 document.addEventListener('DOMContentLoaded', start); 7207 } else { 7208 start(); 7209 } 7210 })(); 7211</script>
7211 7212
7213<script src="https://cdn.pxsol.com/js/domready.js"></script>
vendor: 1 bytes, line 7213
7213
7214<script> 7215 var head = document.getElementsByTagName('head')[0]; 7216 7217 function initializeFontAwesome() { 7218 var link = document.createElement('link'); 7219 link.id = "fawesome"; 7220 link.rel = 'stylesheet'; 7221 link.type = 'text/css'; 7222 link.href = 'https://use.fontawesome.com/releases/v5.7.1/css/all.css'; 7223 head.appendChild(link); 7224 } 7225 7226 function initializeMDI() { 7227 var link = document.createElement('link'); 7228 link.id = "fawesome"; 7229 link.rel = 'stylesheet'; 7230 link.type = 'text/css'; 7231 link.href = '/css/materialdesignicons.min.css'; 7232 head.appendChild(link); 7233 } 7234 7235 function initializeToast() { 7236 // check if jquery is loaded 7237 if (typeof jQuery == 'function') { 7238 let link = document.createElement('link'); 7239 link.id = "jqToastCss"; 7240 link.rel = 'stylesheet'; 7241 link.type = 'text/css'; 7242 link.href = '/includes/toast/jquery.toast.min.css'; 7243 head.appendChild(link); 7244 let script = document.createElement('script'); 7245 script.id = "jqToastJs"; 7246 script.type = 'text/javascript'; 7247 script.defer = true; 7248 script.async = true; 7249 script.src = '/includes/toast/jquery.toast.min.js'; 7250 head.appendChild(script); 7251 } else { 7252 console.log('jQuery is not loaded. Toast could not be initialized.'); 7253 } 7254 } 7255 7256 DomReady.ready(function() { 7257 var link = document.createElement('link'); 7258 link.id = "siteCss"; 7259 link.rel = 'stylesheet'; 7260 link.type = 'text/css'; 7261 7262 link.href = 7263 '/css_3.css?pos=Sanremohoteles&device=computer&posv=1788314973_2025-08-29T20:43:48.000Z&filev=1782498034'; 7264 head.appendChild(link); 7265 7266 if (typeof deferFontAwesome !== "undefined") { 7267 if (!deferFontAwesome) { 7268 initializeFontAwesome(); 7269 } 7270 } else { 7271 initializeFontAwesome(); 7272 } 7273 7274 if (typeof deferMDI !== "undefined") { 7275 if (!deferMDI) { 7276 initializeMDI(); 7277 } 7278 } else { 7279 initializeMDI(); 7280 } 7281 7282 if (typeof deferToast !== "undefined") { 7283 if (!deferToast) { 7284 initializeToast(); 7285 } 7286 } else { 7287 initializeToast(); 7288 } 7289 7290 }); 7291</script>
vendor: 1 bytes, line 7291
7291
7292<script> 7293 (function(){ 7294 console.log('%c[pxChat] ð Chat tracking script loaded (Chromium optimized)', 'color: #4CAF50; font-weight: bold; font-size: 14px;'); 7295 window.dataLayer = window.dataLayer || []; 7296 function generateId(prefix){ 7297 const rnd = ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => 7298 (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) 7299 ); 7300 return (prefix || 'id_') + rnd; 7301 } 7302 function getPxContext(){ 7303 try { return window.pxContext || {}; } catch(e){ return {}; } 7304 } 7305 function getSessionId(){ 7306 const ctx = getPxContext(); 7307 if (ctx.session_id) return ctx.session_id; 7308 let sid = sessionStorage.getItem('px_session_id'); 7309 if (!sid){ sid = generateId('s_'); sessionStorage.setItem('px_session_id', sid); } 7310 return sid; 7311 } 7312 function getChatSessionId(){ 7313 let cid = sessionStorage.getItem('px_chat_session_id'); 7314 if (!cid){ cid = generateId('c_'); sessionStorage.setItem('px_chat_session_id', cid); } 7315 return cid; 7316 } 7317 function basePayload(){ 7318 const ctx = getPxContext(); 7319 const pos = (ctx.pos || 'Sanremohoteles') || null; 7320 const hotelId = (ctx.product_id || '19322') || null; 7321 return { 7322 session_id: getSessionId(), 7323 search_id: ctx.search_id || ctx.SearchID || null, 7324 pos: pos, 7325 post: pos, 7326 hotel_id: hotelId, 7327 page_url: location.href 7328 }; 7329 } 7330 function pushEvent(name, extra){ 7331 const params = Object.assign({}, basePayload(), extra || {}); 7332 // Dedupe: evita repetidos en ±1s por sesión/mensaje 7333 try { 7334 const keyId = params.chat_session_id || params.chat_id || ''; 7335 const key = name + '|' + String(keyId); 7336 const now = Date.now(); 7337 window.__px_evt_dedupe = window.__px_evt_dedupe || {}; 7338 const last = window.__px_evt_dedupe[key] || 0; 7339 if (now - last < 1000) { 7340 return; 7341 } 7342 window.__px_evt_dedupe[key] = now; 7343 } catch(_e){ 7344 console.error('[pxChat] Error in pushEvent dedupe:', _e); 7345 } 7346 // Evitar duplicados: si pxTrack existe, delegamos y NO empujamos a dataLayer aquà 7347 if (typeof window.pxTrack === 'function') { 7348 try { 7349 console.log('[pxChat] ð¤ Calling pxTrack for', name, 'with params:', params); 7350 window.pxTrack(name, params); 7351 console.log('%c[pxChat] â ' + name + ' event dispatched successfully', 'color: #4CAF50; font-weight: bold;'); 7352 } catch(e){ 7353 console.error('[pxChat] â Error calling window.pxTrack for', name, ':', e); 7354 } 7355 return; 7356 } 7357 const payload = Object.assign({ event: name }, params); 7358 console.log('[pxChat] ð¤ Pushing to dataLayer:', payload); 7359 window.dataLayer.push(payload); 7360 console.log('%c[pxChat] â ' + name + ' event pushed to dataLayer', 'color: #4CAF50; font-weight: bold;'); 7361 } 7362 let chatOpenTsMs = null; 7363 let chatIsOpen = false; 7364 let lastOpenPushMs = 0; 7365 let closeGuardTimer = null; 7366 let lastStateChangeMs = 0; 7367 let lastCloseCallMs = 0; // Guard para prevenir múltiples llamadas rápidas a handleChatClose 7368 let lastOpenCallMs = 0; // Guard para prevenir múltiples llamadas rápidas a handleChatOpen 7369 let MIN_CHAT_DURATION_MS = 3000; // MÃnimo 3 segundos entre chat_open y chat_close (previene falsos positivos en Chrome) 7370 let OPEN_DEBOUNCE_MS = 300; // Debounce para chat_open (300ms - solo para múltiples llamadas rápidas) 7371 let CLOSE_DEBOUNCE_MS = 400; // Debounce para chat_close (400ms - solo para múltiples llamadas rápidas) 7372 let pendingOpenTimer = null; // Timer para debounce de open 7373 let pendingCloseTimer = null; // Timer para debounce de close 7374 let openCallCount = 0; // Contador de llamadas rápidas a open 7375 let closeCallCount = 0; // Contador de llamadas rápidas a close 7376 function syncChatState(){ 7377 try { 7378 // Guard mÃnimo: no sincronizar si acabamos de cambiar estado hace menos de 200ms 7379 const now = Date.now(); 7380 if (now - lastStateChangeMs < 200) { 7381 console.log('[pxChat] syncChatState throttled (' + (now - lastStateChangeMs) + 'ms ago)'); 7382 return; 7383 } 7384 // Priorizar estado del launcher: clase --open 7385 // Buscar el botón con múltiples selectores 7386 const btn = document.querySelector('.widget-launcher-button') || 7387 document.querySelector('[class*="widget-launcher"]') || 7388 document.querySelector('[class*="launcher-button"]'); 7389 if (btn && btn.classList) { 7390 const isOpenBtn = btn.classList.contains('widget-launcher-button--open') || 7391 btn.classList.toString().indexOf('--open') !== -1; 7392 console.log('[pxChat] syncChatState: button state check:', { 7393 isOpenBtn: isOpenBtn, 7394 chatIsOpen: chatIsOpen,
7395 buttonClasses: btn.className 7396 }); 7397 if (isOpenBtn && !chatIsOpen) { 7398 console.log('[pxChat] syncChatState: button is open but chatIsOpen is false, calling handleChatOpen'); 7399 lastStateChangeMs = now; 7400 return handleChatOpen(); 7401 } 7402 if (!isOpenBtn && chatIsOpen) { 7403 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 7404 const startMs = chatOpenTsMs || lastOpenPushMs || null; 7405 if (startMs && (now - startMs < 3000)) { 7406 console.log('[pxChat] syncChatState: chat_close blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s)'); 7407 return; 7408 } 7409 // CRÃTICO: Esperar y verificar nuevamente que el botón realmente está cerrado 7410 // Esto previene disparos prematuros cuando el DOM aún se está actualizando 7411 setTimeout(function() { 7412 const btnCheck = document.querySelector('.widget-launcher-button') || 7413 document.querySelector('[class*="widget-launcher"]') || 7414 document.querySelector('[class*="launcher-button"]'); 7415 const isStillOpen = btnCheck && btnCheck.classList && ( 7416 btnCheck.classList.contains('widget-launcher-button--open') || 7417 btnCheck.classList.toString().indexOf('--open') !== -1 7418 ); 7419 const ifrCheck = findChatIframe(); 7420 const isIframeVisible = isElementVisible(ifrCheck); 7421 7422 console.log('[pxChat] syncChatState: delayed verification after button close:', { 7423 isStillOpen: isStillOpen, 7424 isIframeVisible: isIframeVisible, 7425 chatIsOpen: chatIsOpen 7426 }); 7427 7428 if (isStillOpen) { 7429 console.log('[pxChat] syncChatState: chat_close CANCELLED - button still shows as open after delay'); 7430 return; 7431 } 7432 if (isIframeVisible) { 7433 console.log('[pxChat] syncChatState: chat_close CANCELLED - iframe still visible after delay'); 7434 return; 7435 } 7436 if (!chatIsOpen) { 7437 console.log('[pxChat] syncChatState: chat_close CANCELLED - chatIsOpen is already false'); 7438 return; 7439 } 7440 7441 console.log('[pxChat] syncChatState: button confirmed closed after delay, calling handleChatClose'); 7442 lastStateChangeMs = Date.now(); 7443 handleChatClose(); 7444 }, 600); // Esperar 600ms para confirmar que el DOM se actualizó completamente 7445 return; 7446 } 7447 } 7448 // CRÃTICO: NO usar iframe como fallback si hay un botón disponible 7449 // El iframe puede no ser visible incluso cuando el chat está abierto 7450 // Solo confiar en el botón launcher para determinar el estado 7451 if (!btn) { 7452 // Solo si NO hay botón, intentar buscar el botón de nuevo con un selector más amplio 7453 const btnRetry = document.querySelector('.widget-launcher-button, [class*="widget-launcher"], [class*="launcher-button"]'); 7454 if (btnRetry && btnRetry.classList) { 7455 const isOpenBtnRetry = btnRetry.classList.contains('widget-launcher-button--open') || 7456 btnRetry.classList.toString().indexOf('--open') !== -1; 7457 console.log('[pxChat] syncChatState: retry button found:', { 7458 isOpenBtnRetry: isOpenBtnRetry, 7459 chatIsOpen: chatIsOpen, 7460 buttonClasses: btnRetry.className 7461 }); 7462 if (isOpenBtnRetry && !chatIsOpen) { 7463 console.log('[pxChat] syncChatState: retry button is open but chatIsOpen is false, calling handleChatOpen'); 7464 lastStateChangeMs = now; 7465 return handleChatOpen(); 7466 } 7467 if (!isOpenBtnRetry && chatIsOpen) { 7468 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 7469 const startMs = chatOpenTsMs || lastOpenPushMs || null; 7470 if (startMs && (now - startMs < 3000)) { 7471 console.log('[pxChat] syncChatState: chat_close blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s)'); 7472 return; 7473 } 7474 // Verificar nuevamente antes de cerrar 7475 setTimeout(function() { 7476 const btnCheck = document.querySelector('.widget-launcher-button, [class*="widget-launcher"], [class*="launcher-button"]'); 7477 const isStillOpen = btnCheck && (btnCheck.classList.contains('widget-launcher-button--open') || 7478 btnCheck.classList.toString().indexOf('--open') !== -1); 7479 7480 if (isStillOpen || !chatIsOpen) { 7481 console.log('[pxChat] syncChatState: chat_close CANCELLED - button still open or chatIsOpen is false'); 7482 return; 7483 } 7484 7485 console.log('[pxChat] syncChatState: retry button confirmed closed after delay, calling handleChatClose'); 7486 lastStateChangeMs = Date.now(); 7487 handleChatClose(); 7488 }, 600); 7489 return; 7490 } 7491 } 7492 7493 // ÃLTIMO RECURSO: Solo usar iframe si NO hay botón Y el chat está abierto 7494 // Y solo para abrir, NUNCA para cerrar (el iframe no es confiable para cerrar) 7495 const ifr = findChatIframe(); 7496 const visible = isElementVisible(ifr); 7497 console.log('[pxChat] syncChatState: iframe LAST RESORT check (only for opening):', { 7498 visible: visible, 7499 chatIsOpen: chatIsOpen, 7500 hasIframe: !!ifr 7501 }); 7502 // Solo usar iframe para detectar apertura, NUNCA para cerrar 7503 if (visible && !chatIsOpen) { 7504 console.log('[pxChat] syncChatState: iframe visible but chatIsOpen is false, calling handleChatOpen'); 7505 lastStateChangeMs = now; 7506 return handleChatOpen(); 7507 } 7508 // NO usar iframe para cerrar - solo confiar en el botón 7509 if (!visible && chatIsOpen) { 7510 console.log('[pxChat] syncChatState: iframe not visible but chatIsOpen is true - IGNORING (iframe not reliable for closing)'); 7511 return; // NO hacer nada - solo el botón puede cerrar 7512 } 7513 } 7514 } catch(_e){ 7515 console.error('[pxChat] syncChatState error:', _e); 7516 } 7517 } 7518 function handleChatOpen(meta){ 7519 console.log('[pxChat] handleChatOpen called:', { chatIsOpen: chatIsOpen, meta: meta }); 7520 7521 // Si ya está abierto, no hacer nada 7522 if (chatIsOpen) { 7523 console.log('[pxChat] handleChatOpen skipped - chat already open'); 7524 return; 7525 } 7526 7527 const now = Date.now(); 7528
7529 // Guard mÃnimo: no abrir si se cerró hace menos de 500ms (solo para prevenir toggle extremo) 7530 if (lastCloseCallMs && (now - lastCloseCallMs < 500)) { 7531 console.log('[pxChat] handleChatOpen blocked - chat closed too recently (' + (now - lastCloseCallMs) + 'ms ago)'); 7532 return; 7533 } 7534 7535 // Throttling mÃnimo: solo prevenir llamadas duplicadas en menos de 200ms 7536 if (now - lastOpenCallMs < 200) { 7537 console.log('[pxChat] handleChatOpen throttled (too soon)'); 7538 return; 7539 } 7540 7541 lastOpenCallMs = now; 7542 7543 // Cancelar cualquier close pendiente 7544 if (pendingCloseTimer) { 7545 clearTimeout(pendingCloseTimer); 7546 pendingCloseTimer = null; 7547 console.log('[pxChat] handleChatOpen: cancelled pending close'); 7548 } 7549 7550 // Disparar inmediatamente (sin debounce para Chromium) 7551 console.log('[pxChat] handleChatOpen: calling doChatOpen immediately'); 7552 doChatOpen(meta); 7553 } 7554 7555 function doChatOpen(meta) { 7556 // Verificar estado del botón (prioridad máxima para Chromium) 7557 // Buscar el botón con múltiples selectores 7558 const btn = document.querySelector('.widget-launcher-button') || 7559 document.querySelector('[class*="widget-launcher"]') || 7560 document.querySelector('[class*="launcher-button"]'); 7561 const isActuallyOpen = btn && btn.classList && ( 7562 btn.classList.contains('widget-launcher-button--open') || 7563 btn.classList.toString().indexOf('--open') !== -1 7564 ); 7565 const ifr = findChatIframe(); 7566 const isIframeVisible = isElementVisible(ifr); 7567 7568 // Log detallado para debugging en Chromium 7569 console.log('[pxChat] doChatOpen called:', { 7570 isActuallyOpen: isActuallyOpen, 7571 isIframeVisible: isIframeVisible, 7572 chatIsOpen: chatIsOpen, 7573 hasButton: !!btn, 7574 buttonClasses: btn ? btn.className : 'no button' 7575 }); 7576 7577 // Si el botón existe y dice que está abierto, proceder 7578 // Si no hay botón pero el iframe es visible, también proceder 7579 if (!isActuallyOpen && !isIframeVisible && btn) { 7580 console.warn('[pxChat] doChatOpen: button exists but not showing as open, proceeding anyway'); 7581 } 7582 7583 // Guardar timestamp ANTES de cambiar el estado (importante para Chrome) 7584 const now = Date.now(); 7585 chatOpenTsMs = now; 7586 lastOpenPushMs = now; 7587 chatIsOpen = true; 7588 const chat_session_id = (meta && (meta.chat_session_id || meta.session_id)) || getChatSessionId(); 7589 7590 // Log para debugging 7591 console.log('[pxChat] ð FIRING chat_open event:', { 7592 chatOpenTsMs: chatOpenTsMs, 7593 lastOpenPushMs: lastOpenPushMs, 7594 timestamp: now, 7595 chat_session_id: chat_session_id 7596 }); 7597 pushEvent('chat_open', { chat_session_id }); 7598 } 7599 function handleChatMessage(meta){ 7600 const chat_id = meta && (meta.chat_id || meta.message_id) || null; 7601 const message_type = meta && (meta.message_type || meta.type) || null; 7602 const payload = { chat_id, message_type }; 7603 pushEvent('chat_message', payload); 7604 } 7605 function handleChatClose(meta){ 7606 console.log('[pxChat] handleChatClose called:', { chatIsOpen: chatIsOpen, meta: meta }); 7607 7608 // Si ya está cerrado, no hacer nada 7609 if (!chatIsOpen) { 7610 console.log('[pxChat] handleChatClose skipped - chat already closed'); 7611 return; 7612 } 7613 7614 const now = Date.now(); 7615 7616 // Guard crÃtico: prevenir que chat_close se dispare inmediatamente después de chat_open 7617 // Aumentado a 3 segundos para evitar disparos prematuros 7618 const startMs = chatOpenTsMs || lastOpenPushMs || null; 7619 if (startMs && (now - startMs < 3000)) { 7620 console.log('[pxChat] handleChatClose blocked - chat opened too recently (' + Math.round((now - startMs) / 1000) + 's ago, minimum 3s required)'); 7621 return; 7622 } 7623 7624 // Verificación adicional: asegurarse de que el botón realmente está cerrado 7625 // Buscar el botón con múltiples selectores 7626 const btn = document.querySelector('.widget-launcher-button') || 7627 document.querySelector('[class*="widget-launcher"]') || 7628 document.querySelector('[class*="launcher-button"]'); 7629 const isActuallyOpen = btn && btn.classList && ( 7630 btn.classList.contains('widget-launcher-button--open') || 7631 btn.classList.toString().indexOf('--open') !== -1 7632 ); 7633 if (isActuallyOpen) { 7634 console.log('[pxChat] handleChatClose blocked - button still shows as open'); 7635 return; 7636 } 7637 7638 // Throttling mÃnimo: solo prevenir llamadas duplicadas en menos de 200ms 7639 if (now - lastCloseCallMs < 200) { 7640 console.log('[pxChat] handleChatClose throttled (too soon)'); 7641 return; 7642 } 7643 7644 lastCloseCallMs = now; 7645 7646 // Cancelar cualquier open pendiente 7647 if (pendingOpenTimer) { 7648 clearTimeout(pendingOpenTimer); 7649 pendingOpenTimer = null; 7650 console.log('[pxChat] handleChatClose: cancelled pending open'); 7651 } 7652 7653 // Disparar inmediatamente (sin debounce para Chromium)
7654 console.log('[pxChat] handleChatClose: calling doChatClose immediately'); 7655 doChatClose(meta, startMs); 7656 } 7657 7658 function doChatClose(meta, startMs) { 7659 // Verificar estado del botón (prioridad máxima para Chromium) 7660 // Buscar el botón con múltiples selectores 7661 const btn = document.querySelector('.widget-launcher-button') || 7662 document.querySelector('[class*="widget-launcher"]') || 7663 document.querySelector('[class*="launcher-button"]'); 7664 const isActuallyOpen = btn && btn.classList && ( 7665 btn.classList.contains('widget-launcher-button--open') || 7666 btn.classList.toString().indexOf('--open') !== -1 7667 ); 7668 const ifr = findChatIframe(); 7669 const isIframeVisible = isElementVisible(ifr); 7670 7671 // Log detallado para debugging en Chromium 7672 console.log('[pxChat] doChatClose called:', { 7673 isActuallyOpen: isActuallyOpen, 7674 isIframeVisible: isIframeVisible, 7675 chatIsOpen: chatIsOpen, 7676 hasButton: !!btn, 7677 buttonClasses: btn ? btn.className : 'no button', 7678 startMs: startMs 7679 }); 7680 7681 // CRÃTICO: Solo proceder si el chat realmente está cerrado 7682 // Si hay un botón, confiar solo en el botón (no en el iframe) 7683 if (btn) { 7684 if (isActuallyOpen) { 7685 console.warn('[pxChat] doChatClose BLOCKED - button still shows as open'); 7686 return; 7687 } 7688 // Si hay botón y no está abierto, proceder (ignorar iframe) 7689 console.log('[pxChat] doChatClose: button exists and is closed, proceeding'); 7690 } else { 7691 // Solo si NO hay botón, verificar iframe 7692 if (isIframeVisible) { 7693 console.warn('[pxChat] doChatClose BLOCKED - iframe still visible (no button found)'); 7694 return; 7695 } 7696 console.log('[pxChat] doChatClose: no button found, iframe not visible, proceeding'); 7697 } 7698 7699 // Guardar timestamp ANTES de cambiar el estado (importante para Chrome) 7700 const now = Date.now(); 7701 const endMs = now; 7702 // Calcular duración antes de resetear variables 7703 const duration_sec = startMs ? Math.max(0, Math.round((endMs - startMs) / 1000)) : null; 7704 // Ahora sà cambiar el estado 7705 chatIsOpen = false; 7706 const chat_session_id = (meta && (meta.chat_session_id || meta.session_id)) || getChatSessionId(); 7707 7708 // Log para debugging 7709 console.log('[pxChat] ð FIRING chat_close event:', { 7710 startMs: startMs, 7711 endMs: endMs, 7712 duration_sec: duration_sec, 7713 chatOpenTsMs: chatOpenTsMs, 7714 lastOpenPushMs: lastOpenPushMs, 7715 calculated: endMs - startMs + 'ms', 7716 chat_session_id: chat_session_id 7717 }); 7718 pushEvent('chat_close', { chat_session_id, duration_sec }); 7719 // Resetear timestamp inmediatamente (ya calculamos la duración) 7720 chatOpenTsMs = null; 7721 lastOpenPushMs = 0; 7722 } 7723 function isElementVisible(el){ 7724 if (!el) return false; 7725 const cs = window.getComputedStyle ? window.getComputedStyle(el) : null; 7726 if (!cs || cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return false; 7727 const r = el.getBoundingClientRect(); 7728 return !!(r.width && r.height); 7729 } 7730 function findChatIframe(){ 7731 try { 7732 const ifrs = document.querySelectorAll('iframe'); 7733 for (let i = 0; i < ifrs.length; i++){ 7734 const n = ifrs[i]; 7735 if (isChatIframe(n)) return n; 7736 } 7737 } catch(_e){} 7738 return null; 7739 } 7740 // Detect launcher button presence (instala watcher; no toggle directo) 7741 document.addEventListener('click', function(ev){ 7742 try { 7743 // Detectar click en el botón de cerrar del header 7744 let closeBtn = null; 7745 if (ev.composedPath) { 7746 const path = ev.composedPath(); 7747 for (let i = 0; i < path.length; i++) { 7748 const n = path[i]; 7749 if (n && n.classList && n.classList.contains && n.classList.contains('widget-header-close')) { 7750 closeBtn = n; 7751 break; 7752 } 7753 } 7754 } 7755 if (!closeBtn && ev.target && ev.target.closest) { 7756 closeBtn = ev.target.closest('.widget-header-close'); 7757 } 7758 7759 // Si se hizo click en el botón de cerrar, esperar a que el DOM se actualice 7760 if (closeBtn && chatIsOpen) { 7761 console.log('[pxChat] Close button clicked, waiting for DOM update...'); 7762 // Esperar más tiempo para que el widget actualice el estado del botón 7763 setTimeout(function() { 7764 const launcherBtn = document.querySelector('.widget-launcher-button'); 7765 const isStillOpen = launcherBtn && launcherBtn.classList && launcherBtn.classList.contains('widget-launcher-button--open'); 7766 console.log('[pxChat] After close button click, launcher state:', { 7767 isStillOpen: isStillOpen, 7768 chatIsOpen: chatIsOpen 7769 }); 7770 if (!isStillOpen && chatIsOpen) { 7771 console.log('[pxChat] Close button clicked and launcher is now closed, calling handleChatClose'); 7772 handleChatClose(); 7773 } 7774 }, 500); // Esperar 500ms para que el DOM se actualice 7775 return; 7776 } 7777 7778 // Detectar click en el botón launcher 7779 let btn = null; 7780 if (ev.composedPath) { 7781 const path = ev.composedPath(); 7782 for (let i = 0; i < path.length; i++) { 7783 const n = path[i]; 7784 if (n && n.classList && n.classList.contains && n.classList.contains('widget-launcher-button')) { btn = n; break; } 7785 } 7786 } 7787 if (!btn && ev.target && ev.target.closest) { 7788 btn = ev.target.closest('.widget-launcher-button'); 7789 } 7790 if (btn) { 7791 installButtonListener(btn); 7792 // Si el botón tiene --open, está abierto; si no, está cerrado 7793 const isOpen = btn.classList.contains('widget-launcher-button--open'); 7794 if (isOpen && !chatIsOpen) { 7795 // Chat se está abriendo 7796 console.log('[pxChat] Launcher button clicked (opening), calling handleChatOpen'); 7797 setTimeout(function() { handleChatOpen(); }, 300); 7798 } else if (!isOpen && chatIsOpen) { 7799 // Chat se está cerrando 7800 console.log('[pxChat] Launcher button clicked (closing), waiting for DOM update...'); 7801 setTimeout(function() { 7802 const launcherBtn = document.querySelector('.widget-launcher-button'); 7803 const isStillOpen = launcherBtn && launcherBtn.classList && launcherBtn.classList.contains('widget-launcher-button--open'); 7804 if (!isStillOpen && chatIsOpen) { 7805 console.log('[pxChat] Launcher button clicked and confirmed closed, calling handleChatClose'); 7806 handleChatClose(); 7807 } 7808 }, 500); // Esperar 500ms para confirmar que está cerrado 7809 } 7810 } 7811 } catch(_e){ 7812 console.error('[pxChat] Error in click listener:', _e); 7813 } 7814 }, true); 7815 // Keyboard open on launcher 7816 document.addEventListener('keydown', function(ev){ 7817 try { 7818 if (ev.key !== 'Enter' && ev.key !== ' ') return; 7819 let btn = null; 7820 if (ev.composedPath) { 7821 const path = ev.composedPath(); 7822 for (let i = 0; i < path.length; i++) { 7823 const n = path[i]; 7824 if (n && n.classList && n.classList.contains && n.classList.contains('widget-launcher-button')) { btn = n; break; } 7825 } 7826 } 7827 if (!btn && ev.target && ev.target.closest) { 7828 btn = ev.target.closest('.widget-launcher-button'); 7829 } 7830 if (btn) { 7831 installButtonListener(btn); 7832 // Delay mÃnimo para dar tiempo al widget a actualizar la clase (Chromium) 7833 setTimeout(syncChatState, 200); 7834 } 7835 } catch(_e){} 7836 }, true); 7837 // Bridge postMessage events from the widget iframe 7838 window.addEventListener('message', function(ev){ 7839 const d = ev.data; 7840 try { 7841 if (!d) return; 7842 if (typeof d === 'object') { 7843 const type = d.type || d.event || d.name || d.px_chat_event; 7844 if (!type) return; 7845 const payload = d.payload || d.meta || d; 7846 switch (String(type)) { 7847 case 'chat_opened': 7848 case 'widget_opened': 7849 case 'open': 7850 return handleChatOpen(payload); 7851 case 'message_sent': 7852 case 'chat_message': 7853 case 'message': 7854 case 'message_received': 7855 case 'new_message': 7856 // Extraer message_id del payload 7857 const messageId = payload && (payload.message_id || payload.messageId || payload.id || payload.chat_id); 7858 const messageType = payload && (payload.type || payload.message_type || 'text'); 7859 const from = payload && (payload.from || payload.user_id || payload.userId); 7860 if (messageId) { 7861 detectChatMessage(messageId, messageType, from); 7862 } else { 7863 return handleChatMessage(payload); 7864 } 7865 return; 7866 case 'chat_closed': 7867 case 'widget_closed': 7868 case 'close': 7869 return handleChatClose(payload); 7870 } 7871 // También buscar en propiedades del objeto directamente 7872 if (d.message_id || d.messageId || d.id) { 7873 const messageId = d.message_id || d.messageId || d.id; 7874 const messageType = d.type || d.message_type || 'text'; 7875 const from = d.from || d.user_id || d.userId; 7876 detectChatMessage(messageId, messageType, from); 7877 } 7878 } 7879 if (typeof d === 'string' && d.indexOf('px-chat:') === 0) { 7880 const parts = d.split(':'); 7881 const type = parts[1]; 7882 let payload = null; 7883 if (parts[2]) { try { payload = JSON.parse(parts.slice(2).join(':')); } catch(_e){} } 7884 if (type === 'open') return handleChatOpen(payload); 7885 if (type === 'message') { 7886 if (payload && (payload.message_id || payload.messageId || payload.id)) { 7887 detectChatMessage(payload.message_id || payload.messageId || payload.id, payload.type || 'text', payload.from); 7888 } else { 7889 return handleChatMessage(payload); 7890 } 7891 return; 7892 } 7893 if (type === 'close') return handleChatClose(payload); 7894 } 7895 } catch(_e){} 7896 }); 7897 // Message detection: interceptar mensajes del widget 7898 let lastMessageIds = new Set(); // Track mensajes ya procesados para evitar duplicados 7899 let lastMessageTime = 0; 7900 const MESSAGE_THROTTLE_MS = 500; // Máximo 1 mensaje cada 500ms 7901 7902 function detectChatMessage(messageId, messageType, from) { 7903 if (!messageId) { 7904 console.debug('[pxChat] detectChatMessage: no messageId provided'); 7905 return; 7906 } 7907 7908 // Evitar duplicados usando messageId (verificar primero) 7909 if (messageId && lastMessageIds.has(messageId)) { 7910 console.debug('[pxChat] detectChatMessage: message already processed', messageId); 7911 return; 7912 } 7913 7914 // Throttling: evitar procesar mensajes muy rápidos 7915 const now = Date.now(); 7916 const timeSinceLast = now - lastMessageTime; 7917 if (timeSinceLast < MESSAGE_THROTTLE_MS) { 7918 console.debug('[pxChat] detectChatMessage: throttled', timeSinceLast, 'ms since last'); 7919 return; 7920 } 7921 7922 // Permitir trackear mensajes incluso si el chat no está visualmente abierto 7923 // Los mensajes pueden llegar cuando el chat está minimizado pero activo 7924 // En Chromium, el chat puede estar activo sin que chatIsOpen sea true 7925 const hasChatSession = getChatSessionId() !== null; 7926 const shouldProcess = hasChatSession || chatIsOpen; 7927 7928 if (!shouldProcess) { 7929 // Si no hay sesión y el chat no está abierto, intentar una vez más después de un delay 7930 console.debug('[pxChat] detectChatMessage: no session/open, will retry', { hasChatSession, chatIsOpen }); 7931 setTimeout(function() { 7932 const retryHasSession = getChatSessionId() !== null; 7933 const retryIsOpen = chatIsOpen; 7934 if ((retryHasSession || retryIsOpen) && messageId && !lastMessageIds.has(messageId)) { 7935 console.debug('[pxChat] detectChatMessage: retry after delay', { retryHasSession, retryIsOpen }); 7936 detectChatMessage(messageId, messageType, from); 7937 } else { 7938 console.debug('[pxChat] detectChatMessage: retry failed - conditions not met'); 7939 } 7940 }, 1500); // Aumentado a 1.5s para dar más tiempo en Chromium 7941 return; 7942 } 7943
7944 // Limpiar Set si tiene más de 100 mensajes (evitar memory leak) 7945 if (lastMessageIds.size > 100) { 7946 lastMessageIds.clear(); 7947 } 7948 7949 if (messageId) { 7950 lastMessageIds.add(messageId); 7951 } 7952 lastMessageTime = now; 7953 7954 // Disparar evento 7955 try { 7956 const payload = { 7957 chat_id: messageId, 7958 message_type: messageType || 'text', 7959 from: from 7960 }; 7961 console.debug('[pxChat] detectChatMessage: processing message', payload); 7962 handleChatMessage(payload); 7963 } catch(e) { 7964 console.error('[pxChat] â Error processing message:', e); 7965 } 7966 } 7967 7968 // Listener para eventos personalizados que el widget podrÃa disparar 7969 document.addEventListener('px-chat-message', function(ev) { 7970 try { 7971 const data = ev.detail || ev.data || {}; 7972 detectChatMessage(data.message_id || data.messageId || data.id, data.type || data.message_type, data.from); 7973 } catch(_e){} 7974 }); 7975 7976 // Interceptar logs de console.log para detectar mensajes de Pusher 7977 // El widget loguea mensajes con formato especÃfico que podemos interceptar 7978 try { 7979 const originalConsoleLog = console.log; 7980 let isProcessing = false; // Flag para evitar recursión 7981 let processedMessageIds = new Set(); // Track mensajes ya procesados por el interceptor 7982 7983 console.log = function(...args) { 7984 // Llamar al console.log original primero (siempre) 7985 originalConsoleLog.apply(console, args); 7986 7987 // Evitar procesamiento recursivo 7988 if (isProcessing) return; 7989 7990 try { 7991 isProcessing = true; 7992 7993 let detectedMessageId = null; 7994 let detectedMessageType = 'text'; 7995 let detectedFrom = null; 7996 7997 // Buscar message_id en los argumentos directamente (mejorado para Chromium) 7998 for (let i = 0; i < args.length; i++) { 7999 const arg = args[i]; 8000 if (typeof arg === 'object' && arg !== null && !Array.isArray(arg)) { 8001 // Buscar directamente en el objeto 8002 if (arg.message_id || arg.messageId || arg.id) { 8003 detectedMessageId = arg.message_id || arg.messageId || arg.id; 8004 detectedMessageType = arg.type || arg.message_type || 'text'; 8005 detectedFrom = arg.from || arg.user_id || arg.userId || null; 8006 break; 8007 } 8008 // Buscar en rawData (estructura anidada común en Pusher) 8009 if (arg.rawData && typeof arg.rawData === 'object') { 8010 if (arg.rawData.message_id || arg.rawData.messageId || arg.rawData.id) { 8011 detectedMessageId = arg.rawData.message_id || arg.rawData.messageId || arg.rawData.id; 8012 detectedMessageType = arg.rawData.type || arg.rawData.message_type || 'text'; 8013 detectedFrom = arg.rawData.from || arg.rawData.user_id || arg.rawData.userId || null; 8014 break; 8015 } 8016 } 8017 // Buscar en propiedades anidadas (para Chromium que puede tener estructura diferente) 8018 try { 8019 for (let key in arg) { 8020 if (arg.hasOwnProperty(key) && typeof arg[key] === 'object' && arg[key] !== null) { 8021 if (arg[key].message_id || arg[key].messageId || arg[key].id) { 8022 detectedMessageId = arg[key].message_id || arg[key].messageId || arg[key].id; 8023 detectedMessageType = arg[key].type || arg[key].message_type || 'text'; 8024 detectedFrom = arg[key].from || arg[key].user_id || arg[key].userId || null; 8025 break; 8026 } 8027 } 8028 } 8029 if (detectedMessageId) break; 8030 } catch(_e) {} 8031 } 8032 } 8033 8034 // Si no encontramos en objetos, buscar en strings (solo si contiene patrones de Pusher) 8035 if (!detectedMessageId) { 8036 const logStr = args.map(arg => { 8037 if (typeof arg === 'string') return arg; 8038 if (typeof arg === 'object' && arg !== null) { 8039 try { return JSON.stringify(arg); } catch(_e) { return String(arg); } 8040 } 8041 return String(arg); 8042 }).join(' '); 8043 8044 // Solo procesar si contiene patrones especÃficos de Pusher 8045 if ((logStr.indexOf('[Pusher] ð¨ MENSAJE RECIBIDO') !== -1 || 8046 logStr.indexOf('[Pusher] ð¨ Mensaje recibido') !== -1 || 8047 logStr.indexOf('[Pusher] Body completo:') !== -1 || 8048 logStr.indexOf('[Pusher]') !== -1) && 8049 (logStr.indexOf('message_id') !== -1 || logStr.indexOf('messageId') !== -1)) { 8050 8051 // Intentar extraer message_id del string (múltiples formatos) 8052 try { 8053 // Formato: "message_id": "xxx" 8054 let messageIdMatch = logStr.match(/["']message_id["']\s*:\s
8054*["']([^"']+)["']/); 8055 if (!messageIdMatch) { 8056 // Formato: messageId: "xxx" 8057 messageIdMatch = logStr.match(/["']messageId["']\s*:\s*["']([^"']+)["']/); 8058 } 8059 if (!messageIdMatch) { 8060 // Formato: message_id: xxx (sin comillas) 8061 messageIdMatch = logStr.match(/message_id["']?\s*:\s*["']?([a-zA-Z0-9\-_]+)/); 8062 } 8063 if (messageIdMatch && messageIdMatch[1]) { 8064 detectedMessageId = messageIdMatch[1]; 8065 console.debug('[pxChat] Detected message_id from log string:', detectedMessageId); 8066 } 8067 } catch(_e) {} 8068 } 8069 } 8070 8071 // Procesar solo si encontramos un messageId y no lo hemos procesado antes 8072 if (detectedMessageId && !processedMessageIds.has(detectedMessageId)) { 8073 processedMessageIds.add(detectedMessageId); 8074 // Limpiar Set si tiene más de 50 mensajes 8075 if (processedMessageIds.size > 50) { 8076 processedMessageIds.clear(); 8077 } 8078 8079 console.debug('[pxChat] Detected message from Pusher log:', { 8080 messageId: detectedMessageId, 8081 messageType: detectedMessageType, 8082 from: detectedFrom 8083 }); 8084 8085 setTimeout(function() { 8086 detectChatMessage(detectedMessageId, detectedMessageType, detectedFrom); 8087 }, 300); // Aumentado a 300ms para dar tiempo a que se establezca la sesión 8088 } 8089 } catch(e) { 8090 // Silenciar errores en el interceptor para no romper otros logs 8091 console.debug('[pxChat] Error in console.log interceptor:', e); 8092 } finally { 8093 isProcessing = false; 8094 } 8095 }; 8096 8097 originalConsoleLog('[pxChat] Console.log interceptor installed for Pusher message detection'); 8098 } catch(e) { 8099 console.error('[pxChat] Error setting up console.log interceptor:', e); 8100 } 8101 8102 // MutationObserver para detectar mensajes en el DOM del chat (dentro del iframe) 8103 // Nota: Esto solo funciona si tenemos acceso al contenido del iframe (mismo origen) 8104 try { 8105 const chatMessageObserver = new MutationObserver(function(mutations) { 8106 if (!chatIsOpen) return; 8107 8108 for (let i = 0; i < mutations.length; i++) { 8109 const mutation = mutations[i]; 8110 if (mutation.addedNodes && mutation.addedNodes.length > 0) { 8111 for (let j = 0; j < mutation.addedNodes.length; j++) { 8112 const node = mutation.addedNodes[j]; 8113 if (node.nodeType === 1) { // Element node 8114 // Buscar elementos que parezcan mensajes de chat 8115 // Selectores comunes: .message, .chat-message, [data-message-id], etc. 8116 const messageEl = node.classList && ( 8117 node.classList.contains('message') || 8118 node.classList.contains('chat-message') || 8119 node.classList.contains('msg') || 8120 node.getAttribute('data-message-id') 8121 ) ? node : (node.querySelector && ( 8122 node.querySelector('.message') || 8123 node.querySelector('.chat-message') || 8124 node.querySelector('[data-message-id]') 8125 )); 8126 8127 if (messageEl) { 8128 const messageId = messageEl.getAttribute('data-message-id') || 8129 messageEl.getAttribute('data-id') || 8130 messageEl.id || 8131 null; 8132 const messageType = messageEl.getAttribute('data-type') || 8133 messageEl.getAttribute('data-message-type') || 8134 'text'; 8135 const from = messageEl.getAttribute('data-from') || null; 8136 8137 if (messageId) { 8138 detectChatMessage(messageId, messageType, from); 8139 } 8140 } 8141 } 8142 } 8143 } 8144 } 8145 }); 8146 8147 // Observar el iframe del chat cuando esté disponible 8148 function observeChatIframe() { 8149 const ifr = findChatIframe(); 8150 if (ifr && ifr.contentDocument && ifr.contentDocument.body) { 8151 try { 8152 chatMessageObserver.observe(ifr.contentDocument.body, { 8153 childList: true, 8154 subtree: true 8155 }); 8156 console.debug('[pxChat] Message observer installed on chat iframe'); 8157 } catch(e) { 8158 // Cross-origin: no podemos acceder al contenido del iframe 8159 console.debug('[pxChat] Cannot observe iframe content (cross-origin)'); 8160 } 8161 } 8162 } 8163 8164 // Intentar observar cuando el iframe se carga 8165 const ifr = findChatIframe(); 8166 if (ifr) { 8167 if (ifr.contentDocument && ifr.contentDocument.body) { 8168 observeChatIframe(); 8169 } else { 8170 ifr.addEventListener('load', observeChatIframe); 8171 } 8172 } 8173 8174 // También intentar cuando se detecta un nuevo iframe
8175 const iframeObserver = new MutationObserver(function() { 8176 const ifr = findChatIframe(); 8177 if (ifr && !ifr.__px_chat_message_observed) { 8178 ifr.__px_chat_message_observed = true; 8179 if (ifr.contentDocument && ifr.contentDocument.body) { 8180 observeChatIframe(); 8181 } else { 8182 ifr.addEventListener('load', observeChatIframe); 8183 } 8184 } 8185 }); 8186 iframeObserver.observe(document.body, { childList: true, subtree: true }); 8187 } catch(e) { 8188 console.error('[pxChat] Error setting up message observer:', e); 8189 } 8190 8191 // Expose helpers for manual triggers if needed 8192 window.pxChatOpen = function(meta){ handleChatOpen(meta || {}); }; 8193 window.pxChatMessage = function(meta){ handleChatMessage(meta || {}); }; 8194 window.pxChatClose = function(meta){ handleChatClose(meta || {}); }; 8195 // Expose message detection function for external use 8196 window.pxChatDetectMessage = function(messageId, messageType, from) { 8197 detectChatMessage(messageId, messageType, from); 8198 }; 8199 // Robust DOM observer: button presence and iframe lifecycle 8200 const observedIframes = new Set(); 8201 function isChatIframe(node){ 8202 if (!node || node.nodeName !== 'IFRAME') return false; 8203 try { 8204 const src = node.getAttribute('src') || ''; 8205 return /pxsol|chat|widget/i.test(src); 8206 } catch(_e){ return false; } 8207 } 8208 function installButtonListener(btn){ 8209 if (!btn || btn.__px_chat_hooked) return; 8210 btn.__px_chat_hooked = true; 8211 try { 8212 btn.__px_open_state = !!(btn.classList && btn.classList.contains('widget-launcher-button--open')); 8213 // NO sincronizar estado inicial aquà - solo observar cambios futuros 8214 let buttonChangeTimer = null; 8215 const ob = new MutationObserver(function(muts){ 8216 for (let i = 0; i < muts.length; i++){ 8217 const m = muts[i]; 8218 if (m.type === 'attributes' && m.attributeName === 'class') { 8219 const isOpen = btn.classList.contains('widget-launcher-button--open'); 8220 // Solo disparar si realmente cambió el estado 8221 if (isOpen !== btn.__px_open_state) { 8222 const now = Date.now(); 8223 if (now - lastStateChangeMs < 300) { 8224 console.debug('[pxChat] MutationObserver: change throttled'); 8225 return; // Ignorar cambios muy rápidos 8226 } 8227 8228 // Procesar inmediatamente (sin debounce para Chromium) 8229 if (buttonChangeTimer) { 8230 clearTimeout(buttonChangeTimer); 8231 } 8232 // Delay mÃnimo solo para asegurar que el DOM se actualizó 8233 buttonChangeTimer = setTimeout(function() { 8234 processButtonStateChange(btn, now); 8235 buttonChangeTimer = null; 8236 }, 50); // Delay mÃnimo de 50ms para Chromium 8237 } 8238 } 8239 } 8240 }); 8241 ob.observe(btn, { attributes: true, attributeFilter: ['class'] }); 8242 btn.__px_chat_observer = ob; 8243 } catch(_e){} 8244 } 8245 8246 function processButtonStateChange(btn, timestamp) { 8247 // Verificar que el estado realmente cambió 8248 const currentIsOpen = btn.classList.contains('widget-launcher-button--open') || 8249 btn.classList.toString().indexOf('--open') !== -1; 8250 console.log('[pxChat] processButtonStateChange:', { 8251 currentIsOpen: currentIsOpen, 8252 previousState: btn.__px_open_state, 8253 chatIsOpen: chatIsOpen 8254 }); 8255 8256 if (currentIsOpen === btn.__px_open_state) { 8257 console.log('[pxChat] MutationObserver: state unchanged, skipping'); 8258 return; 8259 } 8260 8261 btn.__px_open_state = currentIsOpen; 8262 lastStateChangeMs = timestamp || Date.now(); 8263 8264 if (currentIsOpen) { 8265 console.log('[pxChat] MutationObserver: button opened, calling handleChatOpen'); 8266 handleChatOpen(); 8267 } else { 8268 // Verificar que chatIsOpen es true antes de intentar cerrar 8269 if (!chatIsOpen) { 8270 console.log('[pxChat] MutationObserver: button closed but chatIsOpen is already false, skipping'); 8271 return; 8272 } 8273 // Guard mÃnimo: no cerrar si el chat se abrió hace menos de 3 segundos 8274 const finalNow = Date.now(); 8275 const startMs = chatOpenTsMs || lastOpenPushMs || null; 8276 if (startMs && (finalNow - startMs < 3000)) { 8277 console.log('[pxChat] MutationObserver: chat_close blocked - chat opened too recently (' + Math.round((finalNow - startMs) / 1000) + 's ago, minimum 3s)'); 8278 return; 8279 } 8280 8281 // CRÃTICO: Esperar y verificar nuevamente que el botón realmente perdió la clase --open 8282 // Esto previene disparos prematuros cuando el DOM aún se está actualizando 8283 setTimeout(function() { 8284 const btnCheck = document.querySelector('.widget-launcher-button') || 8285 document.querySelector('[class*="widget-launcher"]') || 8286 document.querySelector('[class*="launcher-button"]'); 8287 const isStillOpen = btnCheck && btnCheck.classList && ( 8288 btnCheck.classList.contains('widget-launcher-button--open') || 8289 btnCheck.classList.toString().indexOf('--open') !== -1 8290 ); 8291 8292 console.log('[pxChat] MutationObserver: delayed verification after button close:', { 8293 isStillOpen: isStillOpen, 8294 chatIsOpen: chatIsOpen, 8295 hasButton: !!btnCheck 8296 }); 8297 8298 // Solo proceder si el botón realmente está cerrado 8299 // Si hay botón, confiar solo en el botón (no en el iframe) 8300 if (isStillOpen) { 8301 console.log('[pxChat] MutationObserver: chat_close CANCELLED - button still shows as open after delay'); 8302 return; 8303 } 8304 // Solo verificar iframe si NO hay botón 8305 if (!btnCheck) { 8306 const ifr = findChatIframe(); 8307 const isIframeVisible = isElementVisible(ifr); 8308 if (isIframeVisible) { 8309 console.log('[pxChat] MutationObserver: chat_close CANCELLED - iframe still visible after delay (no button found)'); 8310 return; 8311 } 8312 } 8313 if (!chatIsOpen) { 8314 console.log('[pxChat] MutationObserver: chat_close CANCELLED - chatIsOpen is already false'); 8315 return; 8316 } 8317 8318 console.log('[pxChat] MutationObserver: button confirmed closed after delay, calling handleChatClose'); 8319 handleChatClose(); 8320 }, 600); // Esperar 600ms para confirmar que el DOM se actualizó completamente 8321 } 8322 } 8323
8324 function scanExisting(){ 8325 try { 8326 const btn = document.querySelector('.widget-launcher-button'); 8327 if (btn) installButtonListener(btn); 8328 document.querySelectorAll('iframe').forEach(function(ifr){ 8329 if (isChatIframe(ifr) && !observedIframes.has(ifr)) { 8330 observedIframes.add(ifr); 8331 // Delay más largo para evitar falsos positivos 8332 setTimeout(syncChatState, 800); 8333 } 8334 }); 8335 } catch(_e){} 8336 } 8337 const mo = new MutationObserver(function(mutations){ 8338 let anyRemoval = false; 8339 for (const m of mutations) { 8340 if (m.type === 'childList') { 8341 // Added nodes 8342 m.addedNodes && m.addedNodes.forEach(function(n){ 8343 try { 8344 if (!(n instanceof Element)) return; 8345 if (n.classList && n.classList.contains('widget-launcher-button')) { 8346 installButtonListener(n); 8347 } 8348 if (isChatIframe(n) && !observedIframes.has(n)) { observedIframes.add(n); setTimeout(syncChatState, 800); } 8349 // Deep scan 8350 n.querySelectorAll && n.querySelectorAll('.widget-launcher-button,iframe').forEach(function(x){ 8351 if (x.classList && x.classList.contains('widget-launcher-button')) installButtonListener(x); 8352 if (isChatIframe(x) && !observedIframes.has(x)) { observedIframes.add(x); setTimeout(syncChatState, 800); } 8353 }); 8354 } catch(_e){} 8355 }); 8356 // Removed nodes 8357 if (m.removedNodes && m.removedNodes.length) { 8358 anyRemoval = true; 8359 } 8360 } 8361 }
8362 if (anyRemoval) { 8363 // Check if any observed iframe is gone 8364 const still = new Set(); 8365 observedIframes.forEach(function(ifr){ 8366 if (document.body && document.body.contains(ifr)) { 8367 still.add(ifr); 8368 } else { 8369 // Delay más largo cuando se remueve el iframe (chat cerrado) 8370 setTimeout(syncChatState, 500); 8371 } 8372 }); 8373 observedIframes.clear(); 8374 still.forEach(function(x){ observedIframes.add(x); }); 8375 } 8376 }); 8377 // Poller de respaldo acotado: solo durante una ventana corta post-load 8378 // para evitar loops eternos si no aparece el botón. 8379 const CHAT_FALLBACK_POLL_INTERVAL_MS = 500; 8380 const CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD = 2000; 8381 let chatFallbackPollIntervalId = null; 8382 let chatFallbackPollStartMs = null; 8383 8384 function stopChatFallbackPoller(reason) { 8385 if (!chatFallbackPollIntervalId) return; 8386 clearInterval(chatFallbackPollIntervalId); 8387 chatFallbackPollIntervalId = null; 8388 console.log('[pxChat] Polling stopped:', reason); 8389 } 8390 8391 function runChatFallbackPollTick() { 8392 const btn = document.querySelector('.widget-launcher-button') || 8393 document.querySelector('[class*="widget-launcher"]') || 8394 document.querySelector('[class*="launcher-button"]'); 8395 // Solo ejecutar syncChatState si NO hay botón (el botón tiene su propio observer) 8396 if (!btn) { 8397 console.log('[pxChat] Polling syncChatState (no button found)'); 8398 syncChatState(); 8399 return; 8400 } 8401 8402 console.debug('[pxChat] Polling skipped - button found, using MutationObserver instead'); 8403 stopChatFallbackPoller('button found'); 8404 } 8405 8406 function startChatFallbackPoller() { 8407 if (chatFallbackPollIntervalId) return; 8408 chatFallbackPollStartMs = Date.now(); 8409 runChatFallbackPollTick(); // Tick inicial inmediato 8410 chatFallbackPollIntervalId = setInterval(function() { 8411 if (Date.now() - chatFallbackPollStartMs > CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD) { 8412 stopChatFallbackPoller('load + ' + CHAT_FALLBACK_POLL_MAX_MS_AFTER_LOAD + 'ms timeout'); 8413 return; 8414 } 8415 runChatFallbackPollTick(); 8416 }, CHAT_FALLBACK_POLL_INTERVAL_MS); 8417 } 8418 8419 // Ejecutar solo post-load (o inmediatamente si la página ya terminó de cargar) 8420 if (document.readyState === 'complete') { 8421 startChatFallbackPoller(); 8422 } else { 8423 window.addEventListener('load', function onLoadStartChatFallbackPoller() { 8424 window.removeEventListener('load', onLoadStartChatFallbackPoller); 8425 startChatFallbackPoller(); 8426 }); 8427 } 8428 try { 8429 mo.observe(document.documentElement || document, { childList: true, subtree: true }); 8430 // Initial scan after load tick 8431 if (document.readyState === 'loading') { 8432 document.addEventListener('DOMContentLoaded', scanExisting); 8433 } else { 8434 setTimeout(scanExisting, 0); 8435 } 8436 } catch(_e){} 8437 })(); 8438</script>
vendor: 1 bytes, line 8438
8438
8439<script> 8440 // Override para evitar espejo de chat_* al dataLayer y evitar doble track 8441 (function(){ 8442 if (typeof window.gtag === 'function') { 8443 window.gtag = function(){ 8444 try { window.dataLayer.push(arguments); } catch(_e){} 8445 }; 8446 } 8447 // Redefinir pxTrack: usa gtag si existe; sino, dataLayer 8448 window.pxTrack = function(eventName, params){ 8449 params = params || {}; 8450 if (typeof window.gtag === 'function') { 8451 try { window.gtag('event', eventName, params); } catch(_e){} 8452 } else { 8453 try { window.dataLayer.push(Object.assign({ event: eventName }, params)); } catch(_e){} 8454 } 8455 }; 8456 })(); 8457</script>
8457 8458</script>
8458 </div> 8459 8460 8461 <div id="ContainerRD" class="nodisplay"> 8462 <div class="flex flex-center fullheight"> 8463 <div id="ContainerRDInner"> 8464 <div id="Loader" class="fullheight flex flex-center"> 8465 <img class="animated slideInUp" src="https://cdn.pxsol.com/css/images/logo_loginrd.png" /> 8466 </div> 8467 <div id="CloseRDContainer"><i class="fa fa-times" aria-hidden="true"></i></div> 8468 <iframe style="width: 100%; height: 100%" src="" id="IframeRD" scrolling="no"> 8469 8470 </iframe> 8471 </div> 8472 </div> 8473 </div> 8474 8475 <div id="CortinaCargando" align="center" class="Loading nodisplay"> 8476 <div class="linear-activity"> 8477 <div class="indeterminate"></div> 8478 </div> 8479 </div> 8480 8481 <div id="dialogBox" title="..." class="nodisplay"> 8482 <p><span class="ui-icon ui-icon-alert alerticon"></span>...</p> 8483 </div> 8484 8485
8485<script src='/js_3.js?pos=Sanremohoteles&device=computer&filev=1790891789&posv=1788314973_2025-08-29T20:43:48.000Z_2025-08-29T20:43:48.000Z' defer="true" async></script>
8485 8486 8487 <div id="diccionario"> 8488 </div> 8489 8490 </div>
8490<script> 8491 window.currentContent = "index"; 8492 window.currentDevice = "desktop"; 8493 console.log('CurrentState', window.currentContent, window.currentDevice); 8494</script>
8494 8495 8496
8496<script src="/neo_modules/neo_popup/js.js?v=121790891789"></script>
8496 8497<!-- End Popup code --> 8498<div class="EndError left full" style="max-width: 100vw; overflow: auto;"> 8499 </div> 8500 8501
8502<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":"1a7d7c25cb794fbbb525883f1f41f61e","r":1,"spa":2}' crossorigin="anonymous"></script>
8502 8503</body> 8504<div id="dialogBox" title="..." class="nodisplay"> 8505 <p><span class="ui-icon ui-icon-alert alerticon"></span>...</p> 8506</div> 8507 8508 8509 8510 8511</html> 8512 8513
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.