PageSourceSearch

https://www.sanremohoteles.com/neo_modules/marketplace_buscador_v8/js.js?filev=1778144039

js sanremohoteles.com collected 2026-10-05 09:35:40 UTC 66,425 bytes, 2,039 lines download raw bytes

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("&amp;", "&"),
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: "&#x3C;Ant",
1429          nextText: "Sig&#x3E;",
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: "&#x3C;Anterior",
1496          nextText: "Próximo&#x3E;",
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.