1/* MARKETPLACE_BUSCADOR_v8 JS.JS BEGIN */ 2 3// Global variables 4var NochesError_txt = "Please select a check-out date"; 5 6function SetPartyGroup() { 7 var PartyTypeVal = $(".px-mk-buscador-container #PartyType").val(); 8 if (PartyTypeVal === "single") { 9 $(".px-mk-buscador-container #GroupsForm").val("1:1,0,0"); 10 } 11 if (PartyTypeVal === "double") { 12 $(".px-mk-buscador-container #GroupsForm").val("1:2,0,0"); 13 } 14 if (PartyTypeVal === "multiple" || PartyTypeVal == "familiar") { 15 $(".px-mk-buscador-container #MultiplePartySelect").css("display", "flex"); 16 CalculatePartyGroup(); 17 } else { 18 $(".px-mk-buscador-container #MultiplePartySelect").hide(); 19 } 20} 21 22// Get valid timezone or fallback to default 23function getValidTimezone() { 24 const timezoneElement = document.querySelector( 25 ".px-mk-buscador-container #ProductTimezone", 26 ); 27 let timezone = timezoneElement ? timezoneElement.value : null; 28 // Check if timezone input exists and has a value 29 if (!timezone) { 30 return "America/Argentina/Mendoza"; 31 } 32 33 // Validate timezone 34 try { 35 Intl.DateTimeFormat(undefined, { timeZone: timezone }); 36 return timezone; 37 } catch (e) { 38 console.warn( 39 "Invalid timezone: " + timezone + ". Falling back to default.", 40 ); 41 return "America/Argentina/Mendoza"; 42 } 43} 44 45// Get global days modifier for testing 46function getDaysModifier() { 47 const modifierElement = document.querySelector( 48 ".px-mk-buscador-container #GlobalDaysModifier", 49 ); 50 let modifier = modifierElement ? modifierElement.value : null; 51 if (modifier && !isNaN(parseInt(modifier))) { 52 return parseInt(modifier); 53 } 54 return 0; 55} 56 57/** Tooltip / tÃtulo nativo al pasar el mouse por dÃas de salida > 90 noches (paridad con cart_hotel). */ 58function getPxMkMaxNightsMsg() { 59 var lng = ( 60 $(".px-mk-buscador-container #dataconfig").attr("lng") || "" 61 ).trim(); 62 if (!lng) lng = "es"; 63 var msg = "Sorry, reservations for more than 90 nights are not possible."; 64 if (lng == "es") 65 msg = 66 "Lo sentimos, no es posible realizar reservas para más de 90 noches."; 67 if (lng == "pt" || lng == "pt-BR") 68 msg = 69 "Lamentamos, não é possÃvel efetuar reservas para mais de 90 noites."; 70 if (lng == "de") 71 msg = 72 "Es tut uns leid, Reservierungen für mehr als 90 Nächte sind nicht möglich."; 73 if (lng == "fr") 74 msg = 75 "Nous sommes désolés, il n'est pas possible d'effectuer une réservation pour plus de 90 nuits."; 76 if (lng == "it") 77 msg = 78 "Ci dispiace, non è possibile effettuare prenotazioni per più di 90 notti."; 79 if (lng == "gl") 80 msg = 81 "Lamentámolo, non é posible realizar reservas para máis de 90 noites."; 82 if (lng == "ja") 83 msg = 84 "ç³ã訳ãããã¾ãããã90æ³ãè¶ ãããäºç´ã¯æ¿ããã¨ãã§ãã¾ããã"; 85 if (lng == "zh") msg = "徿±æï¼æ æ³é¢è®¢è¶ è¿90æçä½å®¿ã"; 86 return msg; 87} 88 89// Tippy solo dentro del datepicker (evita tocar el resto del DOM y bucles con el calendario). 90window.initializeTippy = 91 window.initializeTippy || 92 function () { 93 if (typeof tippy === "undefined") { 94 return; 95 } 96 try { 97 if (!document.getElementById("ui-datepicker-div")) { 98 return; 99 } 100 // Solo celdas de dÃas (>90 noches); no flechas prev/next ni otros [title] del widget. 101 tippy("#ui-datepicker-div .ui-datepicker-calendar td[title]", { 102 content: function (reference) { 103 var title = reference.getAttribute("title"); 104 if (title) { 105 reference.removeAttribute("title"); 106 } 107 return title; 108 }, 109 allowHTML: true, 110 animation: "scale", 111 interactive: true, 112 }); 113 } catch (e) {} 114 }; 115 116// Siempre definir asÃ: si cart cargó antes una versión que solo mira `initializeTippy` global 117// (sin main.js en /), en home nunca corrÃa Tippy; si usamos `||` quedaba esa y no window.initializeTippy. 118window.pxSetupMaxNightsTooltips = function () { 119 var init = 120 typeof window.initializeTippy === "function" 121 ? window.initializeTippy 122 : typeof initializeTippy === "function" 123 ? initializeTippy 124 : null; 125 if (typeof init === "function") { 126 try { 127 init(); 128 } catch (e) {} 129 } 130}; 131 132function pxMkBindTippyAfterCalendarPaint() { 133 setTimeout(function () { 134 if (typeof window.pxSetupMaxNightsTooltips === "function") { 135 window.pxSetupMaxNightsTooltips(); 136 } 137 }, 0); 138} 139 140// jQuery UI ejecuta _setDateFromField después de beforeShow; el mes mostrado puede 141// quedar en maxDate (+90 dÃas). Re-alineamos la vista con el valor dd/mm/yyyy del input. 142window.pxSyncCheckoutDatepickerAfterShow = 143 window.pxSyncCheckoutDatepickerAfterShow || 144 function (checkoutInput) { 145 if (!checkoutInput) { 146 return; 147 } 148 var raw = String($(checkoutInput).val() || "").trim(); 149 if (!raw) { 150 return; 151 } 152 var parts = raw.split("/"); 153 if (parts.length !== 3) { 154 return; 155 } 156 var day = parseInt(parts[0], 10);
157 var month = parseInt(parts[1], 10) - 1; 158 var year = parseInt(parts[2], 10); 159 if (isNaN(day) || isNaN(month) || isNaN(year)) { 160 return; 161 } 162 var parsed = new Date(year, month, day, 12, 0, 0, 0); 163 if (isNaN(parsed.getTime())) { 164 return; 165 } 166 var el = checkoutInput; 167 setTimeout(function () { 168 if (typeof $.datepicker === "undefined") { 169 return; 170 } 171 if ( 172 !$.datepicker._datepickerShowing || 173 $.datepicker._lastInput !== el 174 ) { 175 return; 176 } 177 $(el).datepicker("setDate", parsed); 178 window.pxSetupMaxNightsTooltips(); 179 }, 0); 180 }; 181 182// Apply the global days modifier to a date 183function applyDaysModifier(date) { 184 const modifier = getDaysModifier(); 185 if (modifier !== 0) { 186 date.setDate(date.getDate() + modifier); 187 } 188 return date; 189} 190 191function ChildrensSelect(elem) { 192 var RoomNumber = $(elem).attr("roomnumber"); 193 var ChildrensQty = $(elem).val(); 194 if (ChildrensQty > 0) { 195 $( 196 ".px-mk-buscador-container .ChildrensAgesSelectContainer[roomnumber='" + 197 RoomNumber + 198 "']", 199 ).html(""); 200 $( 201 ".px-mk-buscador-container .ChildrensAges[roomnumber='" + 202 RoomNumber + 203 "']", 204 ).show(); 205 var ChildrensAgesContent = 206 '<select class="ChildrensAgesSelect" onchange="CalculatePartyGroup(this)" roomnumber="' + 207 RoomNumber + 208 '">'; 209 var MaxAgeChildrenNumber = $( 210 ".px-mk-buscador-container #MaxAgeChildrenNumber", 211 ).val(); 212 let MaxAgeBabiesNumber = $( 213 ".px-mk-buscador-container #MaxAgeBabiesNumber", 214 ).val() 215 ? Number($(".px-mk-buscador-container #MaxAgeBabiesNumber").val()) 216 : 2; 217 let MaxBabiesRaw = $( 218 ".px-mk-buscador-container #MaxBabiesNumber", 219 ).val(); 220 let MaxBabiesNumber = 221 MaxBabiesRaw === undefined || MaxBabiesRaw === "" 222 ? -1 223 : Number(MaxBabiesRaw); 224 // Si el alojamiento no admite bebés (cantidad máxima = 0) pero tiene una 225 // edad máxima de bebés configurada, el selector de edades se corta y 226 // arranca en MaxAgeBabiesNumber + 1 (ej: edad máx. bebés 11 -> desde 12). 227 let startAge = 228 MaxBabiesNumber === 0 && MaxAgeBabiesNumber > 0 229 ? MaxAgeBabiesNumber + 1 230 : MaxAgeBabiesNumber === 0 231 ? 1 232 : 0; 233 //ChildrensAgesContent += '<option value="">-</option>'; 234 for (var i = startAge; i <= MaxAgeChildrenNumber; i++) { 235 ChildrensAgesContent += 236 '<option value="' + 237 i + 238 '" ' + 239 (i === 12 ? "selected" : "") + 240 " >" + 241 i + 242 "</option>"; 243 } 244 ChildrensAgesContent += "</select>"; 245 for (var j = 1; j <= ChildrensQty; j++) { 246 $( 247 ".px-mk-buscador-container .ChildrensAgesSelectContainer[roomnumber='" + 248 RoomNumber + 249 "']", 250 ).append(ChildrensAgesContent); 251 } 252 } else { 253 $( 254 ".px-mk-buscador-container .ChildrensAges[roomnumber='" + 255 RoomNumber + 256 "']", 257 ).hide(); 258 } 259 CalculatePartyGroup(); 260} 261 262function CheckChildrens() { 263 var ValidChildrens = 1; 264 $(".px-mk-buscador-container .NotValidChildrens").hide(); 265 $(".px-mk-buscador-container .ChildrensSelect").each(function () { 266 var HasChilds = $(this).val(); 267 var RoomNumber = $(this).attr("roomnumber"); 268 if (HasChilds !== "0") { 269 $( 270 ".px-mk-buscador-container .ChildrensAgesSelect[roomnumber='" + 271 RoomNumber + 272 "']", 273 ).each(function () { 274 if ($(this).val() === "") { 275 ValidChildrens = 0; 276 $(this).addClass("notvalid"); 277 } 278 }); 279 } 280 }); 281 if (ValidChildrens === 0) { 282 $(".px-mk-buscador-container .NotValidChildrens").show(); 283 } 284 return ValidChildrens; 285} 286 287function CalculatePartyGroup(elem) { 288 $(elem).removeClass("notvalid"); 289 var RoomsQty = $(".px-mk-buscador-container .RoomsSelectContainer").length; 290 var PartyGroup = ""; 291 var RoomsQtyLoop = 1; 292 $(".px-mk-buscador-container .RoomsSelectContainer").each(function () { 293 PartyGroup += RoomsQtyLoop; 294 if (RoomsQtyLoop <= RoomsQty) { 295 RoomsQtyLoop = RoomsQtyLoop + 1; 296 } 297 var RoomNumber = $(this).attr("roomnumber"); 298 var Adults = $( 299 ".px-mk-buscador-container .AdultsSelect[roomnumber='" + 300 RoomNumber + 301 "']", 302 ).val(); 303 304 if ($(".px-mk-buscador-container #Combinations").length > 0) { 305 var JsonCombinations = $( 306 ".px-mk-buscador-container #Combinations", 307 ).text(); 308 JsonCombinations = JSON.parse(JsonCombinations); 309 $.each(JsonCombinations, function (i, item) { 310 if (JsonCombinations[i].Adults === Adults) { 311 console.log("MAXCHILDS=" + JsonCombinations[i].Childs); 312 var DefaultChilds = $( 313 ".px-mk-buscador-container .ChildrensSelect[roomnumber='" + 314 RoomNumber + 315 "']", 316 ).val(); 317 console.log("DEFAULTCHILDS=" + DefaultChilds); 318 $( 319 ".px-mk-buscador-container .ChildrensSelect[roomnumber='" + 320 RoomNumber + 321 "']", 322 ).html(""); 323 for (var c = 0; c <= JsonCombinations[i].Childs; c++) { 324 if (c === 0) { 325 var itext = "-"; 326 } else { 327 var itext = c; 328 } 329 $( 330 ".px-mk-buscador-container .ChildrensSelect[roomnumber='" + 331 RoomNumber + 332 "']", 333 ).append('<option value="' + c + '">' + itext + "</option>"); 334 } 335 $( 336 ".px-mk-buscador-container .ChildrensSelect[roomnumber='" + 337 RoomNumber + 338 "']", 339 ).val(DefaultChilds); 340 } 341 }); 342 } 343 344 PartyGroup += ":" + Adults + ","; 345 var Childrens = $( 346 ".px-mk-buscador-container .ChildrensSelect[roomnumber='" + 347 RoomNumber + 348 "']", 349 ).val(); 350 var BabiesQty = 0; 351 var MaxAgeBabies = $(".px-mk-buscador-container #MaxAgeBabiesNumber").val(); 352 var ChildrenPartyGroup = ""; 353 354 if (Number(Childrens) !== 0) { 355 $( 356 ".px-mk-buscador-container .ChildrensAgesSelect[roomnumber='" + 357 RoomNumber + 358 "']", 359 ).each(function () { 360 var ChildrensAgeValue = $(this).val(); 361 console.log(ChildrensAgeValue); 362 console.log("MaxAgeBabies=" + MaxAgeBabies); 363 if (Number(MaxAgeBabies) > 0 && Number(ChildrensAgeValue) <= Number(MaxAgeBabies)) { 364 BabiesQty += 1; 365 } else { 366 ChildrenPartyGroup += ChildrensAgeValue + "."; 367 } 368 }); 369 if (ChildrenPartyGroup.indexOf(".") !== -1) { 370 ChildrenPartyGroup = ChildrenPartyGroup.substr( 371 0, 372 ChildrenPartyGroup.length - 1, 373 ); 374 } 375 } else { 376 ChildrenPartyGroup = "0"; 377 } 378 if (ChildrenPartyGroup === "") { 379 ChildrenPartyGroup = "0"; 380 } 381 console.log(ChildrenPartyGroup); 382 PartyGroup += ChildrenPartyGroup + "," + BabiesQty + ";"; 383 }); 384 PartyGroup = PartyGroup.substring(0, PartyGroup.length - 1); 385 PartyGroup = PartyGroup.replace("0.0", "0"); 386 console.log("PARTYGROUP=" + PartyGroup); 387 $(".px-mk-buscador-container #GroupsForm").val(PartyGroup); 388} 389 390function GetFormattedDate(dia) { 391 var timezone = getValidTimezone(); 392 var todayTime = new Date(
393 new Date().toLocaleString("en-US", { timeZone: timezone }), 394 ); 395 396 // Apply global days modifier 397 todayTime = applyDaysModifier(todayTime); 398 399 if (dia !== null) { 400 var manana = todayTime.setDate(todayTime.getDate() + dia); 401 } 402 var month = todayTime.getMonth() + 1; 403 var day = todayTime.getDate(); 404 var year = todayTime.getFullYear(); 405 if (dia !== null) { 406 return day + "/" + month + "/" + year; 407 } else { 408 return manana + "/" + month + "/" + year; 409 } 410} 411 412function dateafter(entrada, salida) { 413 var fechaegreso = $(entrada).val(); 414 var newdate = fechaegreso.split("/").reverse().join("-"); 415 var checkInDate = $.datepicker.parseDate("yy-mm-dd", newdate); 416 // Calculate minDate (check-in + 1 day) 417 var dt = new Date(checkInDate); 418 dt.setDate(dt.getDate() + 1); 419 var dtNew = $.datepicker.formatDate("yy-mm-dd", dt); 420 dtNew = dtNew.split("-").reverse().join("/"); 421 // Set minDate for checkout to day after checkin 422 $(salida).datepicker("option", "minDate", dt); 423 // Set maxDate for checkout to 90 days after checkin (based on original check-in date, not dt) 424 var maxDate = new Date(checkInDate); 425 maxDate.setDate(maxDate.getDate() + 90); 426 $(salida).datepicker("option", "maxDate", maxDate); 427 // Refresh the checkout datepicker if it's open to update the blocked dates 428 if ($(salida).datepicker("widget").is(":visible")) { 429 $(salida).datepicker("refresh"); 430 } 431 $(salida).datepicker("setDate", dtNew); 432 VerNoches(1); 433} 434 435function VerNoches(Noches) { 436 if (Noches <= 0) { 437 console.log(Noches); 438 $(".px-mk-buscador-container #NochesError").html(NochesError_txt); 439 $(".px-mk-buscador-container #NochesError").show(); 440 $(".px-mk-buscador-container #Nights").val(Noches); 441 $(".px-mk-buscador-container #NochesText").html("<b>" + Noches + "</b>"); 442 } else { 443 console.log(Noches); 444 $(".px-mk-buscador-container #NochesError").html(""); 445 $(".px-mk-buscador-container #NochesError").hide(); 446 $(".px-mk-buscador-container #Nights").val(Noches); 447 $(".px-mk-buscador-container #NochesText").html("<b>" + Noches + "</b>"); 448 } 449} 450 451// search/insert tiene DOS contratos de respuesta y el buscador usa el de JSON 452// (`ReturnUrl=NoReturn`) para refrescar la grilla in-place con CargarModulo. Cuando la API 453// rompe ese contrato y contesta cualquier otra cosa (p. ej. cortaba con la URL interna 454// `<api>/list/info?id=<ListID>` si el ListID de la URL apuntaba a una lista vacia), el 455// `dataType:'json'` de ApiPost lo tomaba como error de red => `alert("AJAX Error: <url>")` y la 456// busqueda nueva NUNCA se aplicaba. Estas dos funciones evitan ese callejon sin salida: se 457// parsea el body a mano y, si no hay JSON usable, se repite la busqueda por el camino NATIVO 458// (submit del form con la ReturnUrl real), que la API sigue resolviendo bien con un redirect a 459// la MISMA pagina con el SearchID nuevo. Peor caso: recarga completa en vez de refresco 460// in-place; nunca un alert y la busqueda vieja en pantalla. 461function MktSearchApiPost(e, Form, onJson, onBrokenContract) { 462 e.preventDefault(); 463 if (!Form.valid()) { 464 if (typeof MostrarError === "function") 465 MostrarError("Algunos datos ingresados no son correctos"); 466 return; 467 } 468 var endPoint = (Form.attr("px-endpoint") || window.apiUrl || "").replace( 469 /\/+$/, 470 "" 471 ); 472 var BtnSubmit = Form.find("button[type='submit']"); 473 BtnSubmit.prop("disabled", true); 474 if (typeof FnLoadingON === "function") FnLoadingON(); 475 $.ajax({ 476 url: endPoint + "/" + Form.attr("action"), 477 data: Form.serialize(), 478 type: "POST", 479 dataType: "text", 480 success: function (raw) { 481 var Json = null; 482 try { 483 Json = JSON.parse(raw); 484 } catch (err) { 485 Json = null; 486 } 487 if (Json && typeof Json === "object") onJson(Json); 488 else onBrokenContract(raw); 489 }, 490 error: function (xhr) { 491 onBrokenContract(xhr ? xhr.responseText : ""); 492 }, 493 complete: function () { 494 BtnSubmit.prop("disabled", false); 495 if (typeof FnLoadingOFF === "function") FnLoadingOFF(); 496 }, 497 }); 498} 499 500// Rehace la busqueda por el camino nativo (form POST + redirect server-side de la API). 501// `nativeReturnUrl` es el valor que el PHP dejo en #ReturnUrl antes de que SubmitForm lo 502// pisara con "NoReturn": en el listado de marketplace es la propia list.html, asi que la API 503// devuelve el redirect a la misma pagina con el SearchID/fechas nuevos. 504function MktSearchNativeFallback(FormEl, nativeReturnUrl, rawBody) { 505 var Form = $(FormEl); 506 if (!Form.length || Form.data("mktNativeFallbackDone")) return; 507 Form.data("mktNativeFallbackDone", true); 508 console.error( 509 "search/insert no devolvio JSON; se rehace la busqueda por navegacion nativa.", 510 rawBody 511 ); 512 var endPoint = (Form.attr("px-endpoint") || window.apiUrl || "").replace( 513 /\/+$/, 514 "" 515 ); 516 var action = Form.attr("ajax-action") || "search/insert"; 517 Form.attr("action", endPoint + "/" + action); 518 Form.find("#ReturnUrl").val( 519 nativeReturnUrl || window.location.href.split("#")[0] 520 ); 521 Form.off("submit"); // saco el handler AJAX: esta vez queremos la navegacion real 522 var el = Form.get(0); 523 if (el) HTMLFormElement.prototype.submit.call(el); 524} 525 526function SubmitForm(elem) { 527 $(elem).off("submit"); 528 $(elem).on("submit", function (e) { 529 e.preventDefault(); 530 var formdata = $(this).serializeArray(); 531 var serFormData = {}; 532 $(formdata).each(function (index, obj) { 533 serFormData[obj.name] = obj.value; 534 }); 535 536 var FormEl = elem; 537 $(this).find("[name=NextUrl]").val(""); 538 $(this).find("[name=CheckOutUrl]").val(""); 539 var ajaxAction = $(this).attr("ajax-action"); 540 $(this).attr("action", ajaxAction); 541 $(this).find("#Lng").val(LngTk); 542 $(this).find("#Tag").val(tagPxsolEngine); 543 $(this).find("#Email").val(Email); 544 $(this).find("#Currency").val(CurrencyTk); 545 var NativeReturnUrl = $(this).find("#ReturnUrl").val(); 546 $(this).find("#ReturnUrl").val("NoReturn"); 547 MktSearchApiPost(e, $(this), function (Json) { 548 if (Json.readyState) { 549 console.log("ApiPost Finish", Json); 550 return; 551 } 552 if (Json.Response == 1) { 553 if ( 554 $(FormEl).attr("action") == "budget/del_pug" || 555 $(FormEl).attr("action") == "budget/delgroup" 556 ) {
557 ReloadModulo(".container_cargarmodulo", true); 558 } else { 559 var urlParams = new URLSearchParams(window.location.search); 560 var cartOriginPar = urlParams.get("origin") 561 ? "&origin=" + urlParams.get("origin") 562 : ""; 563 564 var budgetCurrency = Json.Currency 565 ? Json.Currency 566 : serFormData.Currency; 567 var ReturnUrlQuery = 568 "?pos=" + 569 Json.Pos + 570 "&lng=" + 571 Json.Lng + 572 "&cur=" + 573 budgetCurrency + 574 "&SearchID=" + 575 Json.SearchID + 576 "&tag=" + 577 (tagPxsolEngine != null ? tagPxsolEngine : ""); 578 var ReturnUrl; 579 if ($(FormEl).attr("action") == "search/insert") { 580 var ListIDString = 581 Json.ListID !== "" ? "&ListID=" + Json.ListID : ""; 582 var LocationString = 583 Json.Location !== "" ? "&Location=" + Json.Location : ""; 584 ReturnUrlQuery += 585 ListIDString + LocationString + "&search=OK&Email=" + Json.Email; 586 ReturnUrl = 587 "/neo_marketplace_lp/cart_body.php" + 588 ReturnUrlQuery + 589 cartOriginPar; 590 } else { 591 ReturnUrl = 592 "/neo_marketplace_lp/cart_body.php" + 593 ReturnUrlQuery + 594 cartOriginPar; 595 } 596 597 var loaderText = $("#loaderTextDefault").length 598 ? $("#loaderTextDefault").text() + "..." 599 : "Cargando..."; 600 history.pushState( 601 { 602 queryString: ReturnUrlQuery, 603 }, 604 "", 605 ReturnUrlQuery, 606 ); 607 if (ReturnUrl && typeof ReturnUrl === "string") { 608 CargarModulo(ReturnUrl, loaderText, ".container_cargarmodulo"); 609 } else { 610 if (typeof MostrarError === "function") 611 MostrarError("Error al generar la URL de retorno"); 612 } 613 } 614 } else { 615 // check if $.toast is available 616 console.error("SubmitForm Error", Json); 617 if (typeof $.toast === "function") { 618 $.toast({ 619 text: Json?.message 620 ? Json?.message 621 : "Ha ocurrido un error, por favor intente nuevamente mas tarde.", 622 heading: "Error", 623 icon: "error", 624 showHideTransition: "slide", 625 allowToastClose: true, 626 hideAfter: 10000, 627 stack: 10, 628 position: "top-left", 629 textAlign: "left", 630 loader: true, 631 loaderBg: "#9EC600", 632 }); 633 } else { 634 alert( 635 Json?.message 636 ? Json?.message 637 : "Ha ocurrido un error, por favor intente nuevamente mas tarde.", 638 ); 639 } 640 if ( 641 $(FormEl).attr("action") == "budget/del_pug" || 642 $(FormEl).attr("action") == "budget/delgroup" 643 ) { 644 ReloadModulo(".container_cargarmodulo", true); 645 } 646 } 647 }, function (rawBody) { 648 MktSearchNativeFallback(FormEl, NativeReturnUrl, rawBody); 649 }); 650 }); 651 //$(elem).submit(); 652} 653 654// Función para manejar cambios directos en el input 655function handlePartyInputChange(input) { 656 try { 657 // Obtener lÃmites directamente del input 658 let minVal = Number($(input).attr("min")) || 0; 659 let maxVal = Number($(input).attr("max")) || 999; 660 let value = parseInt($(input).val()) || 0; 661 662 // Aplicar lÃmites 663 value = Math.max(minVal, Math.min(maxVal, value)); 664 665 // Actualizar el valor 666 $(input).val(value); 667 $(input).attr("val", value); 668 669 // Ejecutar la lógica de alterPartyGroup sin elemento 670 alterPartyGroup(); 671 } catch (error) { 672 console.error("handlePartyInputChange Error: ", error); 673 } 674} 675 676function alterPartyGroup(element) { 677 try { 678 if (element) { 679 if ($(element).is(".neo_button_partyselector")) { 680 let partyType = $(element).attr("party-type"); 681 let valObj = $( 682 `.neo_partyselector_quantity[party-type='${partyType}']`, 683 ); 684 685 // Obtener lÃmites directamente del input 686 let minVal = Number(valObj.attr("min")) || 0; 687 let maxVal = Number(valObj.attr("max")) || 999; 688 689 // Leer del valor actual del input (no del atributo) 690 let currentVal = 691 Number(valObj.val()) || Number(valObj.attr("val")) || 0; 692 693 if ($(element).attr("action-type") === "minus") currentVal--; 694 if ($(element).attr("action-type") === "plus") currentVal++; 695 696 // Aplicar lÃmites 697 currentVal = Math.max(minVal, Math.min(maxVal, currentVal)); 698 699 // Forzar la actualización del input 700 valObj.attr("val", currentVal); 701 valObj.attr("value", currentVal); 702 valObj.val(currentVal); 703 valObj[0].value = currentVal; // Actualización directa del DOM 704 } 705 } 706 let roomsQty = Number( 707 $(".neo_partyselector_quantity[party-type='rooms']").val(), 708 ); 709 let adultsQty = Number( 710 $(".neo_partyselector_quantity[party-type='adults']").val(), 711 );
712 let childrenQty = Number( 713 $(".neo_partyselector_quantity[party-type='children']").val(), 714 ); 715 let babiesQty = 0; 716 let childrensGf = []; 717 718 if (childrenQty) { 719 $(".ChildrenAgesContainer").show(); 720 // Agregar selectores si hay menos de los necesarios 721 while ($(`.ChildrensAgeSelect`).length < childrenQty) { 722 $(`.ChildrensAgeSelect`) 723 .last() 724 .clone() 725 .appendTo(".ChildrensAgesSelectContainer"); 726 } 727 // Eliminar selectores si hay más de los necesarios 728 while ($(`.ChildrensAgeSelect`).length > childrenQty) { 729 $(`.ChildrensAgeSelect`).last().remove(); 730 } 731 $(`.ChildrensAgeSelect`).each(function (index, el) { 732 $(this).attr("child-id", index); 733 }); 734 // Initialize ages from GroupsForm after creating selects 735 if (typeof initializeChildrenAgesFromGroupsForm === "function") { 736 initializeChildrenAgesFromGroupsForm(); 737 } 738 let MaxAgeChildrenNumber = $( 739 ".px-mk-buscador-container #MaxAgeChildrenNumber", 740 ).val() 741 ? Number($(".px-mk-buscador-container #MaxAgeChildrenNumber").val()) 742 : 12; 743 let MaxAgeBabiesNumber = $( 744 ".px-mk-buscador-container #MaxAgeBabiesNumber", 745 ).val() 746 ? Number($(".px-mk-buscador-container #MaxAgeBabiesNumber").val()) 747 : 2; 748 for (let i = 0; i < childrenQty; i++) { 749 let childAge = $(`.ChildrensAgeSelect[child-id=${i}]`).val(); 750 // Manejar valores vacÃos o null - asumir edad media si no está seleccionada 751 if (childAge === null || childAge === "" || childAge === undefined) { 752 childAge = Math.floor(MaxAgeChildrenNumber / 2); 753 } else { 754 childAge = parseInt(childAge); 755 } 756 if (MaxAgeBabiesNumber > 0 && childAge <= MaxAgeBabiesNumber) { 757 babiesQty += 1; 758 } else if (childAge <= MaxAgeChildrenNumber) { 759 childrensGf.push(childAge === 0 ? "00" : childAge); 760 } else { 761 adultsQty += 1; 762 } 763 } 764 var __realChildren = childrensGf.length; 765 childrensGf = childrensGf.length ? childrensGf.join(".") : "0"; 766 } else { 767 var __realChildren = 0; 768 $(".ChildrenAgesContainer").hide(); 769 } 770 if (!childrensGf || !childrensGf?.length) childrensGf = "0"; 771 let partyGroup = `${roomsQty}:${adultsQty},${childrensGf},${babiesQty}`; 772 773 $(".px-mk-buscador-container #GroupsForm").val(partyGroup); 774 775 // Calcular niños reales (excluyendo bebés) 776 let realChildrenQty = __realChildren; 777 778 $(".txtAdults .numberAdults").text(adultsQty); 779 $(".txtChildren .numberChildren").text(realChildrenQty); 780 $(".txtRooms .numberRooms").text(roomsQty); 781 adultsQty > 1 782 ? $(".txtAdults .party-label").text( 783 $(".txtAdults .party-label").attr("plural"), 784 ) 785 : $(".txtAdults .party-label").text( 786 $(".txtAdults .party-label").attr("singular"), 787 ); 788 realChildrenQty > 1 789 ? $(".txtChildren .party-label").text( 790 $(".txtChildren .party-label").attr("plural"), 791 ) 792 : $(".txtChildren .party-label").text( 793 $(".txtChildren .party-label").attr("singular"), 794 ); 795 roomsQty > 1 796 ? $(".txtRooms .party-label").text( 797 $(".txtRooms .party-label").attr("plural"), 798 ) 799 : $(".txtRooms .party-label").text( 800 $(".txtRooms .party-label").attr("singular"), 801 ); 802 // Mostrar/ocultar niños 803 realChildrenQty > 0 804 ? $(".txtChildren").css("display", "inline-flex") 805 : $(".txtChildren").hide(); 806 // Actualizar bebés 807 if (babiesQty > 0) { 808 $(".txtBabies .numberBabies").text(babiesQty); 809 babiesQty > 1 810 ? $(".txtBabies .party-label").text( 811 $(".txtBabies .party-label").attr("plural") || "bebés", 812 ) 813 : $(".txtBabies .party-label").text( 814 $(".txtBabies .party-label").attr("singular") || "bebé", 815 ); 816 $(".txtBabies").css("display", "inline-flex"); 817 } else { 818 $(".txtBabies").hide(); 819 } 820 } catch (error) { 821 console.error("alterPartyGroup Error: ", error); 822 } 823} 824 825function multiProductIDChange(el) { 826 var ownLP = $(el).attr("ownlp") === "true" ? true : false;
827 var selectedProduct = $( 828 ".px-mk-buscador-container #MultiProductID option[value='" + 829 $(el).val() + 830 "']", 831 ); 832 if ($(el).val() == "everyproduct") { 833 var currentLoc = 834 window.location.protocol + 835 "//" + 836 window.location.host + 837 "/marketplace.html"; 838 $(".px-mk-buscador-container #ReturnUrl").val(currentLoc); 839 $(".px-mk-buscador-container #ProductID").val(""); 840 var currentListID = $(el).find('[value="everyproduct"]').attr("listid"); 841 if (currentListID) 842 $(".px-mk-buscador-container #ListID").val(currentListID); 843 var multiListID = $(".px-mk-buscador-container #MultiListID").val(); 844 if (multiListID) { 845 $(".px-mk-buscador-container #ListID").val(multiListID); 846 } 847 } else { 848 var currentLoc = 849 window.location.protocol + "//" + window.location.host + "/lp.html"; 850 //$('.px-mk-buscador-container #ReturnUrl').val(currentLoc); 851 $(".px-mk-buscador-container #ReturnUrl").val(""); 852 $(".px-mk-buscador-container #ProductID").val($(el).val()); 853 $(".px-mk-buscador-container #ListID").val(""); 854 } 855 if (ownLP) { 856 var ownPos = selectedProduct.attr("ownpos"); 857 $(".px-mk-buscador-container #Pos").val(ownPos); 858 } 859} 860 861function chooseLocation(item) { 862 var locDropdown = $(".px-mk-locationdropdown"); 863 var locationID = $(item).attr("location-id"); 864 var locationName = $.trim($(item).find(".px-mk-locationtxt").text()); 865 $(".px-mk-buscador-container #LocationSearch").val(locationName); 866 $(".px-mk-buscador-container #LocationID").val(locationID); 867 $(".px-mk-buscador-container #Location").val(locationName); 868 if (!locationID) { 869 $(".px-mk-buscador-container #Location").val(""); 870 } 871 $(locDropdown).removeClass("activeAC"); 872 locationChoosenClick = true; 873} 874 875function loadProducts() { 876 $(".px-mk-generalerror").hide(); 877 var endPoint = $(".px-mk-buscador-container #pxmk_searchform").attr( 878 "px-endpoint", 879 ); 880 var ReturnUrl = $( 881 ".px-mk-buscador-container #MultiListID option:selected", 882 ).attr("px-listurl"); 883 var ListID = $(".px-mk-buscador-container #MultiListID").val(); 884 $(".px-mk-buscador-container #ReturnUrl").val(ReturnUrl); 885 $(".px-mk-buscador-container #MultiProductID").addClass( 886 "px-mk-disabled-temp", 887 ); 888 if (ListID !== "") { 889 $.ajax(endPoint + "/list/info?id=" + ListID) 890 .done(function (res) { 891 let listData = res; 892 var ownLP = 893 $(".px-mk-buscador-container #MultiProductID").attr("ownlp") === 894 "true" 895 ? true 896 : false; 897 $(".px-mk-buscador-container #MultiProductID") 898 .children() 899 .not("[disabled]") 900 .not("[value='everyproduct']") 901 .remove(); 902 $(".px-mk-buscador-container #ProductID").val(""); 903 $(".px-mk-buscador-container #MultiProductID").val(""); 904 $(".px-mk-buscador-container #MultiProductID") 905 .children("[value='everyproduct']") 906 .attr("listid", ListID); 907 $(listData.Products).each(function (i, product) { 908 $(".px-mk-buscador-container #MultiProductID").append( 909 $("<option>", { 910 value: product.ProductID, 911 text: product.Product.replace("&", "&"), 912 "px-producturl": ownLP 913 ? "https://secure.pxsol.com/lp.html" 914 : product.Url, 915 ownpos: product.OwnPos 916 ? product.OwnPos 917 : $(".px-mk-buscador-container #MainPos").val(), 918 }), 919 ); 920 }); 921 $(".px-mk-buscador-container #MultiProductID").removeClass( 922 "px-mk-disabled-temp", 923 ); 924 $(".px-mk-productid").removeClass("px-mk-productidhidden"); 925 }) 926 .fail(function (jqXHR, textstatus) { 927 console.log("Error: ", textstatus); 928 console.log(jqXHR); 929 $(".px-mk-generalerror").show(); 930 }); 931 } else { 932 $(".px-mk-buscador-container #MultiProductID").removeClass( 933 "px-mk-disabled-temp", 934 ); 935 $(".px-mk-productid").addClass("px-mk-productidhidden"); 936 } 937} 938 939function RunClosedOnArrivalV8(disableddates) { 940 disableddates = disableddates.split(","); 941 var timezone = getValidTimezone(); 942 943 $(".px-mk-buscador-container #fechaingreso").datepicker({ 944 dateFormat: "dd/mm/yy",
945 showAnim: "", 946 onSelect: function () { 947 $(this).datepicker("hide"); 948 dateSelecionada1 = $(this).datepicker("getDate"); 949 $(".px-mk-buscador-container #fechaegreso").val(""); 950 // Store original check-in date for maxDate calculation 951 var originalCheckIn = new Date(dateSelecionada1); 952 // Calculate minDate (check-in + 1 day) 953 var minCheckoutDate = new Date(dateSelecionada1); 954 minCheckoutDate.setDate(minCheckoutDate.getDate() + 1); 955 $(".px-mk-buscador-container #fechaegreso").datepicker( 956 "option", 957 "minDate", 958 minCheckoutDate, 959 ); 960 // Set maxDate for checkout to 90 days after checkin (based on original check-in date) 961 var maxDate = new Date(originalCheckIn); 962 maxDate.setDate(maxDate.getDate() + 90); 963 $(".px-mk-buscador-container #fechaegreso").datepicker( 964 "option", 965 "maxDate", 966 maxDate, 967 ); 968 // Refresh the checkout datepicker if it's open to update the blocked dates 969 if ( 970 $(".px-mk-buscador-container #fechaegreso") 971 .datepicker("widget") 972 .is(":visible") 973 ) { 974 $(".px-mk-buscador-container #fechaegreso").datepicker("refresh"); 975 pxMkBindTippyAfterCalendarPaint(); 976 } 977 VerNoches(0); 978 dateafter($(this), ".px-mk-buscador-container #fechaegreso"); 979 setTimeout(() => { 980 $(".px-mk-buscador-container #fechaegreso").datepicker("show"); 981 }, 100); 982 }, 983 beforeShowDay: function (date) { 984 var sdate = $.datepicker.formatDate("yy-mm-dd", date); 985 if ($.inArray(String(sdate), disableddates) !== -1) { 986 return [false]; 987 } 988 return [true]; 989 }, 990 }); 991 992 RunMinDateV8(); 993} 994 995function RunClosedOnDeparturesV8(disableddates) { 996 disableddates = disableddates.split(","); 997 var timezone = getValidTimezone(); 998 999 $(".px-mk-buscador-container #fechaegreso").datepicker({ 1000 dateFormat: "dd/mm/yy", 1001 showAnim: "", 1002 beforeShow: function (input) { 1003 window.pxSyncCheckoutDatepickerAfterShow(input); 1004 pxMkBindTippyAfterCalendarPaint(); 1005 }, 1006 onChangeMonthYear: function () { 1007 pxMkBindTippyAfterCalendarPaint(); 1008 }, 1009 onSelect: function () { 1010 dateSelecionada1 = $( 1011 ".px-mk-buscador-container #fechaingreso", 1012 ).datepicker("getDate"); 1013 dateSelecionada2 = $(".px-mk-buscador-container #fechaegreso").datepicker( 1014 "getDate", 1015 ); 1016 one_day = 1000 * 60 * 60 * 24; 1017 Noches = Math.ceil( 1018 (dateSelecionada2.getTime() - dateSelecionada1.getTime()) / one_day, 1019 ); 1020 VerNoches(Noches); 1021 $(".px-mk-buscador-container #fechaegreso").valid(); 1022 }, 1023 beforeShowDay: function (date) { 1024 var sdate = $.datepicker.formatDate("yy-mm-dd", date); 1025 1026 var today = new Date( 1027 new Date().toLocaleString("en-US", { timeZone: timezone }), 1028 ); 1029 today = applyDaysModifier(today); 1030 var smallerdate = new Date(sdate); 1031 1032 if ($.inArray(String(sdate), disableddates) !== -1) { 1033 return [false]; 1034 } 1035 var checkInDate = $(".px-mk-buscador-container #fechaingreso").datepicker( 1036 "getDate", 1037 ); 1038 if (checkInDate) { 1039 var maxCheckoutDate = new Date(checkInDate); 1040 maxCheckoutDate.setDate(maxCheckoutDate.getDate() + 90); 1041 var dateToCheck = new Date( 1042 date.getFullYear(), 1043 date.getMonth(), 1044 date.getDate(), 1045 ); 1046 var maxDateNormalized = new Date( 1047 maxCheckoutDate.getFullYear(), 1048 maxCheckoutDate.getMonth(), 1049 maxCheckoutDate.getDate(), 1050 ); 1051 if (dateToCheck.getTime() > maxDateNormalized.getTime()) { 1052 return [false, "ui-state-disabled", getPxMkMaxNightsMsg()]; 1053 } 1054 } 1055 return [true]; 1056 }, 1057 }); 1058 1059 RunMinDateV8(); 1060} 1061 1062function RunMinDateV8() { 1063 var timezone = getValidTimezone(); 1064 var today = new Date( 1065 new Date().toLocaleString("en-US", { timeZone: timezone }), 1066 ); 1067 var tomorrow = new Date( 1068 new Date().toLocaleString("en-US", { timeZone: timezone }), 1069 ); 1070 1071 // Apply global days modifier to today and tomorrow 1072 today = applyDaysModifier(today); 1073 tomorrow = applyDaysModifier(tomorrow); 1074 1075 // Get DatePickerStart (BookingWindow) from dataconfig 1076 // Note: #dataconfig may be outside .px-mk-buscador-container, so we search globally 1077 var DatePickerStart = $("#dataconfig").attr("DatePickerStart"); 1078 DatePickerStart = DatePickerStart ? Number(DatePickerStart) : 0; 1079 1080 // Apply DatePickerStart to minDate (today + DatePickerStart days) 1081 today.setDate(today.getDate() + DatePickerStart); 1082 tomorrow.setDate(tomorrow.getDate() + DatePickerStart + 1); 1083 today.setHours(0, 0, 0, 0); 1084 tomorrow.setHours(0, 0, 0, 0); 1085 1086 // Set minDate for checkin (today + DatePickerStart) 1087 $(".px-mk-buscador-container #fechaingreso").datepicker( 1088 "option", 1089 "minDate", 1090 today, 1091 ); 1092 1093 // Fix cached dates - check if dates from HTML are invalid and correct them 1094 var $checkin = $(".px-mk-buscador-container #fechaingreso"); 1095 var $checkout = $(".px-mk-buscador-container #fechaegreso"); 1096 var checkinStr = $checkin.val(); 1097 var checkoutStr = $checkout.val(); 1098 1099 if (checkinStr && checkoutStr) { 1100 var checkinParts = checkinStr.split("/"); 1101 var checkoutParts = checkoutStr.split("/"); 1102 var checkinDate = new Date( 1103 checkinParts[2], 1104 checkinParts[1] - 1, 1105 checkinParts[0], 1106 ); 1107 var checkoutDate = new Date( 1108 checkoutParts[2], 1109 checkoutParts[1] - 1, 1110 checkoutParts[0], 1111 ); 1112 checkinDate.setHours(0, 0, 0, 0); 1113 checkoutDate.setHours(0, 0, 0, 0); 1114 1115 var needsFix = checkinDate < today || checkoutDate <= checkinDate; 1116 1117 if (needsFix) { 1118 var formatDate = function (d) { 1119 return ( 1120 String(d.getDate()).padStart(2, "0") + 1121 "/" + 1122 String(d.getMonth() + 1).padStart(2, "0") + 1123 "/" + 1124 d.getFullYear() 1125 ); 1126 }; 1127 $checkin.val(formatDate(today)); 1128 $checkout.val(formatDate(tomorrow)); 1129 checkinDate = today; // Update for minDate calculation below 1130 console.log( 1131 "[Cache Fix] Dates corrected: " + 1132 formatDate(today) + 1133 " -> " + 1134 formatDate(tomorrow), 1135 ); 1136 } 1137 1138 // Set minDate for checkout based on current checkin (checkin + 1 day) 1139 var checkoutMinDate = new Date(checkinDate); 1140 checkoutMinDate.setDate(checkoutMinDate.getDate() + 1); 1141 $checkout.datepicker("option", "minDate", checkoutMinDate); 1142 // Set maxDate for checkout to 90 days after checkin 1143 var checkoutMaxDate = new Date(checkinDate); 1144 checkoutMaxDate.setDate(checkoutMaxDate.getDate() + 90); 1145 $checkout.datepicker("option", "maxDate", checkoutMaxDate); 1146 } else { 1147 // Fallback: minDate is tomorrow 1148 $checkout.datepicker("option", "minDate", tomorrow); 1149 // Set maxDate to 90 days from tomorrow 1150 var checkoutMaxDate = new Date(tomorrow); 1151 checkoutMaxDate.setDate(checkoutMaxDate.getDate() + 90); 1152 $checkout.datepicker("option", "maxDate", checkoutMaxDate); 1153 } 1154 1155 if (dateSelecionada1 != null && dateSelecionada2 != null) { 1156 one_day = 1000 * 60 * 60 * 24; 1157 Tiempo = Math.ceil(dateSelecionada2.getTime() - dateSelecionada1.getTime()); 1158 Noches = Math.round(Tiempo / one_day); 1159 VerNoches(Noches); 1160 } 1161 1162 var fullDate = new Date(
1163 new Date().toLocaleString("en-US", { timeZone: timezone }), 1164 ); 1165 fullDate = applyDaysModifier(fullDate); 1166 console.log(fullDate); 1167 var twoDigitMonth = 1168 fullDate.getMonth() + 1 < 10 1169 ? fullDate.getMonth() + 1 1170 : "0" + (fullDate.getMonth() + 1); 1171} 1172 1173function initBuscadorV8() { 1174 console.log("Init Buscador V8"); 1175 1176 // Check and log timezone and days modifier 1177 console.log("Using timezone: " + getValidTimezone()); 1178 var daysModifier = getDaysModifier(); 1179 if (daysModifier !== 0) { 1180 console.log("Applying global days modifier: " + daysModifier + " days"); 1181 } 1182 1183 $(".filtersku i").click(function (e) { 1184 $(".filtersku").remove(); 1185 $(".filterby").remove(); 1186 $(".skufilercontainer input").val(""); 1187 }); 1188 1189 if (!tagPxsolEngine) { 1190 var tagPxsolEngine = setTag(); 1191 } 1192 1193 var locationChoosenClick = false; 1194 1195 var lng = $(".px-mk-buscador-container #dataconfig").attr("lng"); 1196 var DatePickerStart = $(".px-mk-buscador-container #dataconfig").attr( 1197 "DatePickerStart", 1198 ); 1199 DatePickerStart = DatePickerStart * 1; 1200 1201 $(".ModuloWrap_marketplace_buscador_v3").click(function () { 1202 $(this).removeClass("isolate"); 1203 }); 1204 1205 var required_txt_date = "Please select a date"; 1206 var required_txt_search = "Please select a destination"; 1207 if (LngTk == "es") { 1208 required_txt_date = "Por favor seleccione una Fecha"; 1209 required_txt_search = "Por favor seleccione una destino"; 1210 } 1211 if (LngTk == "pt") { 1212 required_txt_date = "Selecione uma data"; 1213 required_txt_search = "Seleccione um destino"; 1214 } 1215 1216 $(".px-mk-buscador-container #pxmk_searchform").validate({ 1217 rules: { 1218 Search: { 1219 required: true, 1220 }, 1221 Start: { 1222 required: true, 1223 }, 1224 End: { 1225 required: true, 1226 }, 1227 }, 1228 messages: { 1229 Search: { 1230 required: required_txt_search, 1231 }, 1232 Start: { 1233 required: required_txt_date, 1234 }, 1235 End: { 1236 required: required_txt_date, 1237 }, 1238 }, 1239 errorPlacement: function (error, element) { 1240 // No mostrar mensajes de error en los campos de adultos, menores y habitaciones 1241 if ($(element).hasClass("neo_partyselector_quantity")) { 1242 return false; // No mostrar el mensaje de error 1243 } 1244 // Para otros campos, mostrar el error normalmente 1245 error.insertAfter(element); 1246 }, 1247 }); 1248 1249 $(".px-mk-buscador-container .CalculateParty").change(function () { 1250 CalculatePartyGroup(); 1251 }); 1252 1253 var InitialContent = $( 1254 ".px-mk-buscador-container .RoomsSelectContainer[roomnumber='1']", 1255 ).html(); 1256 var MaxRooms = Number($(".px-mk-buscador-container #MaxRooms").val()); 1257 1258 $(".px-mk-buscador-container .px-mk-addnewroom").off(); 1259 $(".px-mk-buscador-container .px-mk-addnewroom").click(function () { 1260 $(".px-mk-buscador-container .px-mk-removeroom").show(); 1261 var CurrentRooms = $( 1262 ".px-mk-buscador-container .RoomsSelectContainer", 1263 ).length; 1264 if (CurrentRooms < MaxRooms) { 1265 var LastRoomNumber = $(".px-mk-buscador-container .RoomsSelectContainer") 1266 .last() 1267 .attr("roomnumber"); 1268 var NewRoomNumber = Number(LastRoomNumber) + 1; 1269 var NewContent = 1270 '<div class="RoomsSelectContainer" roomnumber="' + 1271 NewRoomNumber + 1272 '">' + 1273 InitialContent + 1274 "</div>"; 1275 $(NewContent).insertAfter( 1276 $(".px-mk-buscador-container .RoomsSelectContainer").last(), 1277 ); 1278 1279 $( 1280 ".px-mk-buscador-container .RoomsSelectContainer[roomnumber='" + 1281 NewRoomNumber + 1282 "']", 1283 ) 1284 .find("#RoomNumber") 1285 .text(NewRoomNumber); 1286 $( 1287 ".px-mk-buscador-container .RoomsSelectContainer[roomnumber='" + 1288 NewRoomNumber + 1289 "']", 1290 ) 1291 .find("[roomnumber]") 1292 .attr("roomnumber", NewRoomNumber); 1293 1294 if (Number(CurrentRooms + 1) === Number(MaxRooms)) { 1295 $(".px-mk-buscador-container .px-mk-addnewroom").hide(); 1296 } 1297 } 1298 CalculatePartyGroup(); 1299 }); 1300 1301 $(".px-mk-buscador-container #PartyType").change(function () { 1302 SetPartyGroup(); 1303 }); 1304 1305 SetPartyGroup(); 1306 1307 console.log("Init rmRoom"); 1308 $(".px-mk-buscador-container .px-mk-removeroom-btn").off(); 1309 $(".px-mk-buscador-container .px-mk-removeroom-btn").click(function () { 1310 var MaxRooms = $(".px-mk-buscador-container #MaxRooms").val(); 1311 var CurrentRooms = $( 1312 ".px-mk-buscador-container .RoomsSelectContainer", 1313 ).length; 1314 1315 //console.log(CurrentRooms+" < "+MaxRooms); 1316 1317 $(".px-mk-buscador-container .RoomsSelectContainer").last().remove(); 1318 if (Number(CurrentRooms - 1) < Number(MaxRooms)) { 1319 $(".px-mk-buscador-container .px-mk-addnewroom").show(); 1320 } 1321 if (Number(CurrentRooms - 1) === 1) { 1322 $(".px-mk-buscador-container .px-mk-removeroom").hide(); 1323 } 1324 CalculatePartyGroup(); 1325 }); 1326 1327 $(".px-mk-buscador-container .SelectorInitial").click(function () { 1328 $(".px-mk-buscador-container .PartyTypeSimulatorSelect").show(); 1329 }); 1330 1331 $("body").click(function (e) { 1332 if ( 1333 !$(e.target).is(".px-mk-buscador-container .SelectorInitial") && 1334 !$(e.target).is(".px-mk-buscador-container") && 1335 !$(e.target).parents(".SelectorInitial").length && 1336 !$(e.target).parents(".PartyTypeSimulatorSelect").length && 1337 !$(e.target).parents(".country-selector-container").length && 1338 !$(e.target).is(".country-selector-dropdown") && 1339 !$(e.target).parents(".country-selector-dropdown").length 1340 ) { 1341 $(".PartyTypeSimulatorSelect").hide(); 1342 } 1343 }); 1344 1345 $(".px-mk-buscador-container .PartyTypeSimulatorSelect .Selector").click( 1346 function () { 1347 var PartyType = $(this).attr("rel"); 1348 $(".px-mk-buscador-container #PartyType").val(PartyType); 1349 SetPartyGroup(); 1350 $(".px-mk-buscador-container .SelectorInitial").hide(); 1351 $( 1352 ".px-mk-buscador-container .SelectorInitial[rel='" + PartyType + "']", 1353 ).css("display", "flex"); 1354 $(".px-mk-buscador-container .PartyTypeSimulatorSelect").hide(); 1355 }, 1356 ); 1357 1358 $("body").on("click", function (e) { 1359 if ( 1360 !$(e.target).parents("#MultiplePartySelect").length && 1361 !$(e.target).parents('[rel="multiple"]').length && 1362 !$(e.target).is('[rel="multiple"]') 1363 ) { 1364 $(".px-mk-buscador-container #MultiplePartySelect").hide(); 1365 } 1366 }); 1367 1368 if ($(".px-mk-buscador-container #fechaingreso").length) { 1369 NochesError_txt = "Please select a check-out date"; 1370 if (lng == "es") { 1371 NochesError_txt = "Por favor seleccione una fecha de salida"; 1372 } 1373 if (lng == "pt") { 1374 NochesError_txt = "Por favor seleccione uma data de partida"; 1375 } 1376 1377 var Noches = ""; 1378 var Tiempo = ""; 1379 1380 $( 1381 ".px-mk-buscador-container #fechaingreso_icon,.fechas_ancho_entrada", 1382 ).click(function () { 1383 $(".px-mk-buscador-container #fechaingreso").datepicker("show"); 1384 document.activeElement.blur(); 1385 $(".PartyTypeSimulatorSelect").hide(); 1386 }); 1387 $(".px-mk-buscador-container #fechaegreso_icon,.fechas_ancho_salida").click( 1388 function () { 1389 $(".px-mk-buscador-container #fechaegreso").datepicker("show"); 1390 document.activeElement.blur(); 1391 $(".PartyTypeSimulatorSelect").hide(); 1392 }, 1393 ); 1394 1395 $(".px-mk-buscador-container #fechaingreso,.fechas_ancho_entrada").click( 1396 function () { 1397 document.activeElement.blur(); 1398 $(".PartyTypeSimulatorSelect").hide(); 1399 }, 1400 ); 1401 1402 $(".px-mk-buscador-container #fechaegreso,.fechas_ancho_salida").click( 1403 function () { 1404 document.activeElement.blur(); 1405 $(".PartyTypeSimulatorSelect").hide(); 1406 }, 1407 ); 1408 1409 dateSelecionada1 = $(".px-mk-buscador-container #fechaingreso").datepicker( 1410 "getDate", 1411 ); 1412 dateSelecionada2 = $(".px-mk-buscador-container #fechaegreso").datepicker( 1413 "getDate", 1414 ); 1415 1416 if (LngTk === "es") { 1417 (function (factory) { 1418 if (typeof define === "function" && define.amd) { 1419 // AMD. Register as an anonymous module. 1420 define(["../widgets/datepicker"], factory); 1421 } else { 1422 // Browser globals 1423 factory(jQuery.datepicker); 1424 } 1425 })(function (datepicker) { 1426 datepicker.regional.es = { 1427 closeText: "Cerrar", 1428 prevText: "<Ant", 1429 nextText: "Sig>", 1430 currentText: "Hoy", 1431 monthNames: [ 1432 "enero", 1433 "febrero", 1434 "marzo", 1435 "abril", 1436 "mayo", 1437 "junio", 1438 "julio", 1439 "agosto", 1440 "Septiembre", 1441 "octubre", 1442 "noviembre", 1443 "diciembre", 1444 ], 1445 monthNamesShort: [ 1446 "ene", 1447 "feb", 1448 "mar", 1449 "abr", 1450 "may", 1451 "jun", 1452 "jul", 1453 "ago", 1454 "sep", 1455 "oct", 1456 "nov", 1457 "dic", 1458 ], 1459 dayNames: [ 1460 "domingo", 1461 "lunes", 1462 "martes", 1463 "miércoles", 1464 "jueves", 1465 "viernes", 1466 "sábado", 1467 ], 1468 dayNamesShort: ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], 1469 dayNamesMin: ["D", "L", "M", "X", "J", "V", "S"], 1470 weekHeader: "Sm", 1471 dateFormat: "dd/mm/yy", 1472 firstDay: 1, 1473 isRTL: false, 1474 showMonthAfterYear: false, 1475 yearSuffix: "", 1476 }; 1477 datepicker.setDefaults(datepicker.regional.es); 1478 1479 return datepicker.regional.es; 1480 }); 1481 } 1482 1483 if (LngTk === "pt") { 1484 (function (factory) { 1485 if (typeof define === "function" && define.amd) { 1486 // AMD. Register as an anonymous module. 1487 define(["../widgets/datepicker"], factory); 1488 } else { 1489 // Browser globals 1490 factory(jQuery.datepicker); 1491 } 1492 })(function (datepicker) { 1493 datepicker.regional[LngTk] = { 1494 closeText: "Fechar", 1495 prevText: "<Anterior", 1496 nextText: "Próximo>", 1497 currentText: "Hoje", 1498 monthNames: [ 1499 "Janeiro", 1500 "Fevereiro", 1501 "Março", 1502 "Abril", 1503 "Maio", 1504 "Junho", 1505 "Julho", 1506 "Agosto", 1507 "Setembro", 1508 "Outubro", 1509 "Novembro", 1510 "Dezembro", 1511 ], 1512 monthNamesShort: [ 1513 "Jan", 1514 "Fev", 1515 "Mar", 1516 "Abr", 1517 "Mai", 1518 "Jun", 1519 "Jul", 1520 "Ago", 1521 "Set", 1522 "Out", 1523 "Nov", 1524 "Dez", 1525 ], 1526 dayNames: [ 1527 "Domingo", 1528 "Segunda-feira", 1529 "Terça-feira", 1530 "Quarta-feira", 1531 "Quinta-feira", 1532 "Sexta-feira", 1533 "Sábado", 1534 ], 1535 dayNamesShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], 1536 dayNamesMin: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], 1537 weekHeader: "Sm", 1538 dateFormat: "dd/mm/yy", 1539 firstDay: 0, 1540 isRTL: false, 1541 showMonthAfterYear: false, 1542 yearSuffix: "", 1543 };
1544 datepicker.setDefaults(datepicker.regional["pt-BR"]); 1545 1546 return datepicker.regional["pt-BR"]; 1547 }); 1548 } 1549 1550 $.datepicker.setDefaults($.datepicker.regional[LngTk]); 1551 1552 $(".px-mk-buscador-container #Nights").val("1"); 1553 } 1554 1555 $(".px-mk-buscador-container #LocationSearch").on("keydown", function (e) { 1556 var locDropdown = $(".px-mk-locationdropdown"); 1557 var itemClass = "px-mk-locationitem"; 1558 var suggestionHoverClass = "suggestion_hover"; 1559 if (e.key == "ArrowDown") { 1560 e.preventDefault(); 1561 1562 if ($("." + suggestionHoverClass).length > 0) { 1563 if ( 1564 $(locDropdown) 1565 .find("." + suggestionHoverClass) 1566 .nextAll(":visible:first").length > 0 1567 ) { 1568 var currentHover = $(locDropdown).find("." + suggestionHoverClass); 1569 $(currentHover) 1570 .nextAll(":visible:first") 1571 .addClass(suggestionHoverClass); 1572 $(currentHover).removeClass(suggestionHoverClass).focus(); 1573 var suggCont = $(locDropdown); 1574 var suggGoTo = $(currentHover).nextAll(":visible:first"); 1575 if ( 1576 suggGoTo.offset().top + suggGoTo.innerHeight() > 1577 suggCont.offset().top + suggCont.innerHeight() 1578 ) { 1579 suggCont.scrollTop(suggCont.scrollTop() + suggGoTo.innerHeight()); 1580 } 1581 } else { 1582 $("." + suggestionHoverClass).removeClass(suggestionHoverClass); 1583 $(locDropdown) 1584 .find("." + itemClass + ":visible:first") 1585 .addClass(suggestionHoverClass); 1586 var suggCont = $(locDropdown); 1587 suggCont.scrollTop(0); 1588 } 1589 } else { 1590 $(locDropdown) 1591 .find("." + itemClass + ":visible:first") 1592 .addClass(suggestionHoverClass); 1593 var currentHover = $(locDropdown).find("." + suggestionHoverClass); 1594 var suggCont = $(locDropdown); 1595 var suggGoTo = $(currentHover).nextAll(":visible:first"); 1596 suggCont.scrollTop(0); 1597 } 1598 } else if (e.key == "ArrowUp") { 1599 e.preventDefault(); 1600 1601 if ($("." + suggestionHoverClass).length > 0) { 1602 if ( 1603 $(locDropdown) 1604 .find("." + suggestionHoverClass) 1605 .prevAll(":visible:first").length > 0 1606 ) { 1607 var currentHover = $(locDropdown).find("." + suggestionHoverClass); 1608 $(currentHover) 1609 .prevAll(":visible:first") 1610 .addClass(suggestionHoverClass); 1611 $(currentHover).removeClass(suggestionHoverClass).focus(); 1612 1613 var suggCont = $(locDropdown); 1614 var suggGoTo = $(currentHover).prevAll(":visible:first"); 1615 if (suggGoTo.offset().top < suggCont.offset().top) { 1616 suggCont.scrollTop( 1617 suggGoTo.offset().top - 1618 suggCont.offset().top + 1619 suggCont.scrollTop(), 1620 ); 1621 } 1622 } else { 1623 $("." + suggestionHoverClass).removeClass(suggestionHoverClass); 1624 $(locDropdown) 1625 .find("." + itemClass + ":visible:last") 1626 .addClass(suggestionHoverClass); 1627 var currentHover = $(locDropdown).find("." + suggestionHoverClass); 1628 1629 var suggCont = $(locDropdown); 1630 var suggGoTo = $(currentHover).prevAll(":visible:first"); 1631 1632 suggCont.scrollTop( 1633 suggGoTo.offset().top - 1634 suggCont.offset().top + 1635 suggCont.scrollTop(), 1636 ); 1637 } 1638 } else { 1639 $(locDropdown) 1640 .find("." + itemClass + ":visible:last") 1641 .addClass(suggestionHoverClass); 1642 var currentHover = $(locDropdown).find("." + suggestionHoverClass); 1643 var suggCont = $(locDropdown); 1644 var suggGoTo = $(currentHover).prevAll(":visible:first"); 1645 suggCont.scrollTop( 1646 suggGoTo.offset().top - suggCont.offset().top + suggCont.scrollTop(), 1647 ); 1648 } 1649 } else if (e.key == "Enter") { 1650 e.preventDefault(); 1651 if (!$("." + itemClass + ":visible:not(.px-mk-everylocation)").length) { 1652 chooseLocation($(".px-mk-everylocation")); 1653 } else { 1654 var itemHighlighted = $(locDropdown).find("." + suggestionHoverClass); 1655 $("." + suggestionHoverClass).removeClass(suggestionHoverClass); 1656 chooseLocation(itemHighlighted); 1657 } 1658 } 1659 }); 1660 1661 $(".px-mk-buscador-container #LocationSearch").on("click focus", function () { 1662 $(this).select(); 1663 $(this).select(); 1664 }); 1665 1666 $(".px-mk-buscador-container #LocationSearch").on("blur", function (e) { 1667 setTimeout(function () { 1668 if (!locationChoosenClick && $("#LocationSearch").val() === "") { 1669 chooseLocation( 1670 $(".px-mk-buscador-container .px-mk-locationitem:visible")[0], 1671 ); 1672 } else { 1673 locationChoosenClick = false;
1674 } 1675 }, 200); 1676 }); 1677 1678 $(".px-mk-buscador-container #LocationSearch").on("focus", function (e) { 1679 var locDropdown = $(".px-mk-locationdropdown"); 1680 $(locDropdown).addClass("activeAC"); 1681 }); 1682 1683 // Función para normalizar texto eliminando tildes y acentos - disponible globalmente 1684 window.normalizeTextForSearch = function (str) { 1685 if (!str || typeof str !== "string") return ""; 1686 1687 // Convertir a minúsculas 1688 var normalized = str.toLowerCase(); 1689 1690 // Normalizar usando normalize() si está disponible (método más robusto) 1691 try { 1692 if (typeof String.prototype.normalize === "function") { 1693 normalized = normalized 1694 .normalize("NFD") 1695 .replace(/[\u0300-\u036f]/g, ""); 1696 return normalized; 1697 } 1698 } catch (e) { 1699 // Continuar con fallback si normalize falla 1700 } 1701 1702 // Fallback manual para navegadores antiguos o si normalize falla 1703 var replacements = { 1704 á: "a", 1705 à : "a", 1706 ä: "a", 1707 â: "a", 1708 ã: "a", 1709 Ã¥: "a", 1710 Ä: "a", 1711 Ä: "a", 1712 Ä : "a", 1713 é: "e", 1714 è: "e", 1715 ë: "e", 1716 ê: "e", 1717 Ä: "e", 1718 Ä: "e", 1719 Ä: "e", 1720 Ä: "e", 1721 Ã: "i", 1722 ì: "i", 1723 ï: "i", 1724 î: "i", 1725 Ä«: "i", 1726 į: "i", 1727 ı: "i", 1728 ó: "o", 1729 ò: "o", 1730 ö: "o", 1731 ô: "o", 1732 õ: "o", 1733 ø: "o", 1734 Å: "o", 1735 Å: "o", 1736 ú: "u", 1737 ù: "u", 1738 ü: "u", 1739 û: "u", 1740 Å«: "u", 1741 ů: "u", 1742 ű: "u", 1743 ų: "u", 1744 ñ: "n", 1745 Å: "n", 1746 Å: "n", 1747 Å: "n", 1748 ç: "c", 1749 Ä: "c", 1750 Ä: "c", 1751 Ä: "c", 1752 Ä: "c", 1753 ý: "y", 1754 ỳ: "y", 1755 ÿ: "y", 1756 Å·: "y", 1757 }; 1758 1759 for (var accented in replacements) { 1760 if (replacements.hasOwnProperty(accented)) { 1761 normalized = normalized.replace( 1762 new RegExp(accented, "gi"), 1763 replacements[accented], 1764 ); 1765 } 1766 } 1767 1768 return normalized; 1769 }; 1770 1771 // Remover eventos anteriores para evitar duplicados 1772 $(".px-mk-buscador-container #LocationSearch").off("input paste focus"); 1773 1774 $(".px-mk-buscador-container #LocationSearch").on( 1775 "input paste focus keyup", 1776 function (e) { 1777 var defSearch = false; 1778 var searchValue = $(this).val() || ""; 1779 1780 if ( 1781 $.inArray(searchValue, [ 1782 "Buscar en todas las ubicaciones", 1783 "Search in all locations", 1784 "Pesquisar em todos os locais", 1785 ]) !== -1 && 1786 searchValue 1787 ) { 1788 defSearch = true; 1789 } 1790 1791 var locDropdown = $(".px-mk-locationdropdown"); 1792 var searchTerm = window.normalizeTextForSearch(searchValue); 1793 var resultados = 0; 1794 1795 $(locDropdown) 1796 .children() 1797 .each(function () { 1798 var $item = $(this); 1799 1800 // Obtener el texto de la ubicación, priorizando .px-mk-locationtxt si existe 1801 var $locationTxt = $item.find(".px-mk-locationtxt"); 1802 var locationTextRaw = 1803 $locationTxt.length > 0 1804 ? $locationTxt.text().trim() 1805 : $item.text().trim(); 1806 1807 var locationText = window.normalizeTextForSearch(locationTextRaw); 1808 1809 // Debug: verificar comparaciones 1810 if ( 1811 searchValue && 1812 searchValue.toLowerCase().indexOf("caril") !== -1 && 1813 locationTextRaw.toLowerCase().indexOf("caril") !== -1 1814 ) { 1815 console.log("Comparando:", { 1816 original: locationTextRaw, 1817 normalizado: locationText, 1818 busqueda: searchValue, 1819 busquedaNormalizada: searchTerm, 1820 match: locationText.indexOf(searchTerm) !== -1, 1821 }); 1822 } 1823 1824 // Buscar si el término normalizado está en el texto normalizado 1825 if ( 1826 searchTerm === "" || 1827 locationText.indexOf(searchTerm) !== -1 || 1828 defSearch 1829 ) { 1830 $item.show(); 1831 resultados++; 1832 } else { 1833 $item.hide(); 1834 } 1835 1836 // Siempre mostrar la opción "Buscar en todas las ubicaciones" 1837 if ($item.is(".px-mk-everylocation")) { 1838 $item.show(); 1839 } 1840 }); 1841 1842 if (resultados > 0 || searchTerm === "") { 1843 $(locDropdown).addClass("activeAC"); 1844 } else { 1845 $(locDropdown).removeClass("activeAC"); 1846 } 1847 1848 if (window.outerWidth < 650) { 1849 setTimeout(function () { 1850 $(window).scrollTop($("#LocationSearch").offset().top - 60); 1851 }, 100); 1852 } 1853 }, 1854 ); 1855 1856 // Usar namespace y .off() para evitar acumulación de handlers cuando initBuscadorV8 1857 // se ejecuta múltiples veces (p.ej. tras CargarModulo en 2ª, 3ª búsqueda) 1858 $(document) 1859 .off("click.mktbuscadorDropdownClose") 1860 .on("click.mktbuscadorDropdownClose", function (e) { 1861 if ( 1862 !$(e.target).parents(".px-mk-locationdropdown").length && 1863 !$(e.target).is("#LocationSearch") 1864 ) { 1865 $(".px-mk-locationdropdown").removeClass("activeAC"); 1866 $(".suggestion_hover").removeClass("suggestion_hover"); 1867 } 1868 }); 1869
1870 $(".px-mk-buscador-container .px-mk-locationitem").click(function () { 1871 chooseLocation(this); 1872 }); 1873 1874 if ($(".px-mk-buscador-container #MultiListID").length > 0) { 1875 $(".px-mk-buscador-container #MultiListID").change(function (e) { 1876 var ListID = $(".px-mk-buscador-container #MultiListID").val(); 1877 $(".px-mk-buscador-container #ListID").val(ListID); 1878 loadProducts(); 1879 }); 1880 } 1881 1882 if ($(".px-mk-buscador-container #MultiProductID").length > 0) { 1883 $(".px-mk-buscador-container #MultiProductID").change(function () { 1884 var el = $(this); 1885 multiProductIDChange(el); 1886 }); 1887 } 1888 1889 // Event delegation: el botón "Cambiar búsqueda" puede estar en contenido dinámico 1890 // (tras CargarModulo). Delegación en document asegura que funcione tras cada carga. 1891 // Namespace + .off() evita duplicar handlers cuando initBuscadorV8 corre varias veces. 1892 $(document) 1893 .off( 1894 "click.mktbuscadorChangesearch", 1895 ".px-mk-buscador-container #mktbuscador_changesearch, .mktbuscador_changesearch", 1896 ) 1897 .on( 1898 "click.mktbuscadorChangesearch", 1899 ".px-mk-buscador-container #mktbuscador_changesearch, .mktbuscador_changesearch", 1900 function () { 1901 $(".px-mk-buscador-container").removeClass("px-mk-hidesearchform"); 1902 $(this).parents(".px-mk-searchinfo").hide(); 1903 }, 1904 ); 1905 1906 $(document).ready(function () { 1907 var buscando = false; 1908 1909 $(".px-mk-buscador-container #MultiListID, #LocationSearch").prop( 1910 "disabled", 1911 false, 1912 ); 1913 1914 if (!buscando) { 1915 var btntxt = $(".px-mk-buscador-container #PxMkAcion_Search").attr( 1916 "btntxt", 1917 ) 1918 ? $(".px-mk-buscador-container #PxMkAcion_Search").attr("btntxt") 1919 : "Ver Tarifas"; 1920 $(".px-mk-buscador-container #PxMkAcion_Search span").html(btntxt); 1921 $( 1922 ".px-mk-buscador-container #PxMkAcion_Search .px-mk-searchicon", 1923 ).removeClass("nodisplay"); 1924 $( 1925 ".px-mk-buscador-container #PxMkAcion_Search .px-mk-searchloader", 1926 ).addClass("nodisplay"); 1927 } 1928 1929 if ($(".px-mk-buscador-container #MultiProductID").val()) { 1930 $(".px-mk-productid").removeClass("px-mk-productidhidden"); 1931 } 1932 1933 if ($(".px-mk-buscador-container #MultiListID").val()) { 1934 var multiListID = $(".px-mk-buscador-container #MultiListID").val(); 1935 $(".px-mk-productid").removeClass("px-mk-productidhidden"); 1936 $(".px-mk-buscador-container #ListID").val(multiListID); 1937 } 1938 1939 var urldispo = $(".px-mk-buscador-container #dataconfig").attr("urldispo"); 1940 1941 RunClosedOnArrivalV8(","); 1942 RunClosedOnDeparturesV8(","); 1943 if (window.autoOpenDatepicker) { 1944 if ($(".marketplace_buscador_v3 #fechainicio").is(":visible")) { 1945 $(".px-mk-buscador-container #fechaingreso").datepicker("show"); 1946 } 1947 } 1948 }); 1949 1950 // Event delegation: ensures the handler works even after CargarModulo replaces the DOM 1951 // Namespace + .off() prevents duplicate handlers when initBuscadorV8 runs multiple times 1952 $(document) 1953 .off( 1954 "click.mktbuscadorSearch", 1955 ".px-mk-buscador-container #PxMkAcion_Search", 1956 ) 1957 .on( 1958 "click.mktbuscadorSearch", 1959 ".px-mk-buscador-container #PxMkAcion_Search", 1960 function () { 1961 $(".px-mk-buscador-container .px-mk-generalerror").show(); 1962 if ( 1963 $(".px-mk-buscador-container #MinNights").val() !== 0 && 1964 $(".px-mk-buscador-container #Nights").val() >= 1965 $(".px-mk-buscador-container #MinNights").val() 1966 ) { 1967 $(".px-mk-buscador-container #MinNightsError").hide(); 1968 if ( 1969 $(".px-mk-buscador-container #pxmk_searchform").valid() && 1970 CheckChildrens() === 1 1971 ) { 1972 var loadingbtntxt = $( 1973 ".px-mk-buscador-container #PxMkAcion_Search", 1974 ).attr("loadingbtntxt") 1975 ? $(".px-mk-buscador-container #PxMkAcion_Search").attr( 1976 "loadingbtntxt", 1977 ) 1978 : "Buscando"; 1979 $(".px-mk-buscador-container #PxMkAcion_Search span").html( 1980 loadingbtntxt, 1981 ); 1982 $( 1983 ".px-mk-buscador-container #PxMkAcion_Search .px-mk-searchicon", 1984 ).addClass("nodisplay"); 1985 $( 1986 ".px-mk-buscador-container #PxMkAcion_Search .px-mk-searchloader", 1987 ).removeClass("nodisplay"); 1988 if ($(".neo_neo_marketplace_list_meta, #mktRoot").length) { 1989 SubmitForm(".px-mk-buscador-container #pxmk_searchform"); 1990 } 1991 $(".px-mk-buscador-container #pxmk_searchform").submit(); 1992 buscando = true; 1993 } else { 1994 FnLoadingOFF(); 1995 } 1996 } else { 1997 FnLoadingOFF(); 1998 $(".px-mk-buscador-container #MinNightsError").show(); 1999 } 2000 }, 2001 ); 2002 2003 alterPartyGroup(); 2004 if ($(".px-mk-buscador-container #MultiProductID").length) 2005 multiProductIDChange($(".px-mk-buscador-container #MultiProductID")); 2006 2007 // Update maxDate of checkout whenever check-in date changes 2008 // This ensures the calendar updates even if checkout datepicker is already open 2009 $(".px-mk-buscador-container #fechaingreso").on("change", function () { 2010 var checkInDate = $(".px-mk-buscador-container #fechaingreso").datepicker( 2011 "getDate", 2012 ); 2013 if (checkInDate) { 2014 var maxCheckoutDate = new Date(checkInDate); 2015 maxCheckoutDate.setDate(maxCheckoutDate.getDate() + 90); 2016 $(".px-mk-buscador-container #fechaegreso").datepicker( 2017 "option", 2018 "maxDate", 2019 maxCheckoutDate, 2020 ); 2021 // Refresh the checkout datepicker if it's open to update the blocked dates 2022 if ( 2023 $(".px-mk-buscador-container #fechaegreso") 2024 .datepicker("widget") 2025 .is(":visible") 2026 ) { 2027 $(".px-mk-buscador-container #fechaegreso").datepicker("refresh"); 2028 pxMkBindTippyAfterCalendarPaint(); 2029 } 2030 } 2031 }); 2032} 2033 2034if (!finalCallbacks) var finalCallbacks = []; 2035finalCallbacks.push(initBuscadorV8); 2036 2037initBuscadorV8(); 2038 2039/* MARKETPLACE_BUSCADOR_V3 JS.JS END */
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.