var bookingWidgetController = function () {
return {
config: {
_custom_hotel_namespace: false,
_custom_hotel_domain: false
},
init: function () {
this.prepare_dependencies();
},
is_mobile: function() {
if(navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/iPad/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)) {
return true;
}
return false;
},
prepare_dependencies: function () {
$('head').append('');
var target_css = "//amare-marbella-dot-amare-hotels.appspot.com/static_1/css/amare/booking_widget_amare.css?v=202512031206";
$('head').append($('').attr('href', target_css));
var target_fawesome = "//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css";
$('head').append($('').attr('href', target_fawesome));
$('head').append('');
$('head').append('');
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_inj/lib/jquery-ui-1.10.1.custom.min.modified.js").done(function(){
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/js/mainWebSkeletonAux_injection.js");
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/lib/selectric/jquery.selectric.1.8.js").done(function () {
bookingWidgetController.get_booking_widget_html();
});
});
},
setupFlightHotel: function () {
try {
const setFlightHotelEnabledClass = function(active){
const wrapper = $('#full_wrapper_booking');
if (!wrapper.length) return;
if (active) {
wrapper.addClass('flight_hotel_enabled');
} else {
wrapper.removeClass('flight_hotel_enabled');
}
};
const addFlightHotelToggle = function () {
if (typeof FlightHotelWidgetController === 'undefined') return;
if (!$('#full_wrapper_booking .origin_flight_wrapper').length) return;
if ($('#full_wrapper_booking .amare_fh_toggle').length) return;
let labelOn = (typeof $.i18n !== 'undefined' && $.i18n._) ? $.i18n._('T_flight_hotel_activated') : '';
let labelOff = (typeof $.i18n !== 'undefined' && $.i18n._) ? $.i18n._('T_flight_hotel_deactivated') : '';
let checked = !!(FlightHotelWidgetController.config && FlightHotelWidgetController.config.searchWithFlight);
let toggle = $(
`
${checked ? labelOn : labelOff}
`
);
$('#full_wrapper_booking').append(toggle);
setFlightHotelEnabledClass(checked);
const updateLabel = function(active){
toggle.find('.amare_fh_label').html(` ${active ? labelOn : labelOff}`);
};
updateLabel(checked);
const applyInlineAirportSelector = function(active){
const container = $('.airport_selector_container');
const destinationWrapper = $('.destination_wrapper');
const datesSelector = $('.dates_selector_personalized');
if (!container.length) return;
if (active) {
$(".origin_flight_wrapper, .step_flight").off('click');
if (destinationWrapper.length) {
container.detach().insertBefore(destinationWrapper);
} else if (datesSelector.length) {
container.detach().insertBefore(datesSelector);
}
container.show();
} else {
container.hide();
}
};
applyInlineAirportSelector(checked);
const updateToggleState = function(active) {
setFlightHotelEnabledClass(!!active);
updateLabel(!!active);
applyInlineAirportSelector(!!active);
};
toggle.find('.amare_fh_checkbox').on('change', function(){
if (typeof FlightHotelWidgetController !== 'undefined') {
const active = !!this.checked;
FlightHotelWidgetController.setSearchWithFlight(active);
}
});
$(window).on('flight_hotel.change_search_with_flight', function (_e, active){
if (typeof FlightHotelWidgetController === 'undefined') return;
toggle.find('.amare_fh_checkbox').prop('checked', !!active);
updateToggleState(active);
});
};
const initFlightHotel = function () {
if (typeof FlightHotelWidgetController === 'undefined') return;
FlightHotelWidgetController.config.baseUrl = '//amare-marbella-dot-amare-hotels.appspot.com';
FlightHotelWidgetController.config.flightHotelConfig = JSON.parse(``);
FlightHotelWidgetController.init();
addFlightHotelToggle();
$(document).on('change', '#flight_hotel_selector_popup', function() {
if ($(this).val()) {
$('.select2-selection--single').removeClass('error');
}
});
$(document).on('select2:select select2:clear', '#flight_hotel_selector_popup', function() {
if ($(this).val()) {
$('.select2-selection--single').removeClass('error');
}
});
$(document).off('click.amareSubmitValidation', '.wrapper_booking_button .submit_button');
$(document).on('click.amareSubmitValidation', '.wrapper_booking_button .submit_button', function(e){
if (FlightHotelWidgetController.config.searchWithFlight && !FlightHotelWidgetController.isValidFlightOrigin()) {
e.preventDefault();
e.stopImmediatePropagation();
let hasHotelSelected = false;
const destinationInput = $('.destination_wrapper input[name="destination"]');
if (destinationInput.length && destinationInput.val() && destinationInput.val().trim() !== '') {
hasHotelSelected = true;
}
const airportSelect = $('#flight_hotel_selector_popup');
if (airportSelect.length) {
try {
airportSelect.select2('open');
} catch (e) {
$('.select2-selection--single').addClass('error');
}
} else {
$('.select2-selection--single').addClass('error');
}
return false;
}
});
};
if (typeof FlightHotelWidgetController === 'undefined') {
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/js/flight_hotel/flight_hotel_controller.js").done(function () {
initFlightHotel();
});
} else {
initFlightHotel();
}
} catch (e) {
console.error('Error loading Flight + Hotel controller', e);
}
},
append_widget_html: function () {
var booking_special_section = $(".wrap_reservas").length && $(".content_reservas").length;
var injForm = $("#injectForm");
if (injForm.length) {
injForm.append(parent_wrapper_widget);
}
if(booking_special_section){
$(".wrap_reservas").remove();
$("main").append(parent_wrapper_widget);
$("#full_wrapper_booking").addClass('booking_section_element');
return;
}
if ($(".home-booking, .big-image").length) {
$(".home-booking, .big-image").append(parent_wrapper_widget);
} else {
$("#booking-mobile-desktop #b-booking").html("").append(parent_wrapper_widget);
}
},
get_booking_widget_html: function () {
const language_widget = $("html").attr("lang").replace(/-.*/, '');
let target_widget_url = "//amare-marbella-dot-amare-hotels.appspot.com/amarewidget/" + language_widget;
const paraty_widget_namespace = bookingWidgetController.get_namespace_widget();
if (paraty_widget_namespace && !paraty_widget_namespace == 'custom-paraty-format') {
target_widget_url += "?namespace=" + paraty_widget_namespace;
}
$.get(target_widget_url, function (e) {
parent_wrapper_widget = $("").html(e);
}).done(function () {
if (!bookingWidgetController.is_mobile() || paraty_widget_namespace) {
if (paraty_widget_namespace) {
bookingWidgetController.custom_html_build(paraty_widget_namespace, parent_wrapper_widget);
} else {
bookingWidgetController.append_widget_html();
}
} else {
var booking_engine_mobile_wrapper = $("").attr('id', 'mobile_booking_engine_wrapper');
booking_engine_mobile_wrapper.html(parent_wrapper_widget);
$("#booking-mobile-search").html("");
$("body").append(booking_engine_mobile_wrapper);
}
var custom_wrapper_widget = $("#paraty_custom_wrapper_widget");
if(custom_wrapper_widget.length && custom_wrapper_widget.val() != "") {
$(custom_wrapper_widget.val()).each(function(){
$(this).html(parent_wrapper_widget.clone(true));
});
}
if ($(".destination_wrapper").length) {
$("#full_wrapper_booking").addClass("with_hotel_selector");
}
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/lib/jquery-i18n-1.1.1/jquery.i18n.js").done(function () {
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/i18n/messages_" + language_widget + ".js?v=1.02").done(function () {
$.i18n.load(messages);
if (bookingWidgetController.is_mobile()) {
bookingWidgetController.prepare_mobile_version();
}
/*
const translations = messages;
$("#adults_tag").val(translations['T_personas']);
$("#adult_tag").val(translations['T_persona']);
*/
bookingWidgetController.adding_adults_tag_selector();
});
});
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/js/datepicker/jquery.ui.datepicker-" + language_widget + ".js?v=1").done(function () {
_set_datepicker_regional($);
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/plugins/pricescalendar/calendar.plugin.js?v=1.1").done(function(){
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/plugins/dates-selector/datepicker_v1.js?v=1.4").done(function () {
DP_extend_info.config.booking_version = '7';
DP_extend_info.config.hotel_path_endpoint = '//amare-marbella-dot-amare-hotels.appspot.com';
if (bookingWidgetController.config._custom_hotel_domain){
DP_extend_info.config.hotel_path_endpoint = bookingWidgetController.config._custom_hotel_domain;
}
DP_extend_info.init();
$.getScript("//amare-marbella-dot-amare-hotels.appspot.com/static_1/scripts/booking_7.js").done(function () {
bookingWidgetController.prepare_booking_button();
$(".days_number_datepicker").html("1");
$(".room_selector").selectric({disableOnMobile: false});
$(".rooms_number").selectric({disableOnMobile: false});
_set_datepicker_regional($);
if($(".destination_wrapper").length) {
if (bookingWidgetController.config._custom_hotel_namespace) {
$("#" + bookingWidgetController.config._custom_hotel_namespace).trigger('click');
}
}
if (DP_extend_info.config.min_date) {
DP_extend_info.format_dates($.datepicker.formatDate("dd/mm/yy", DP_extend_info.config.min_date));
}
if (window.location.href.includes("early-booking")) {
let autoSelected = $(".hotel_selector_option.autoSelected");
if (autoSelected.length > 0) {
autoSelected[0].click();
}
}
var promocode_hidden_input = $("#paraty_promocode");
if (promocode_hidden_input.length) {
var promocode_applied_mesage = $("").addClass('promocode_applied_message').html("PROMO CODE"),
full_wrapper_booking = $(".booking_form.paraty-booking-form"),
promocode_input = full_wrapper_booking.find(".promocode_input");
promocode_input.addClass("auto_applied").val(promocode_hidden_input.val());
full_wrapper_booking.find(".wrapper_booking_button ").addClass('promocode_autoapplied');
promocode_applied_mesage.insertAfter(promocode_input);
}
var hide_hotel_selector_input = $("#paraty_hotel_selector_hidden");
if (hide_hotel_selector_input.length){
var engine_wrapper_selector = $("#full_wrapper_booking");
engine_wrapper_selector.find(".destination_wrapper").addClass('hide');
engine_wrapper_selector.removeClass('with_hotel_selector');
}
});
});
});
});
if ($(".babies_selector").length) {
$("#full_wrapper_booking").addClass("widget_with_babies");
}
bookingWidgetController.adding_room_tag_selector();
bookingWidgetController.adding_adults_tag_selector();
bookingWidgetController.prepare_rooms_modifications();
bookingWidgetController.bind_click_buttons();
bookingWidgetController.hide_hotels_in_selector();
bookingWidgetController.analytics_utils();
var has_promocode_at_url = getUrlParameter('promocode');
if (has_promocode_at_url) {
$(".promocode_wrapper .promocode_input").val(has_promocode_at_url);
}
//Custom configuration
if (window.location.host.indexOf('promo.') > -1) {
$(".tooltip_wrapper").remove();
}
bookingWidgetController.setupFlightHotel();
});
$("html").click(function(event){
if($(event.target).closest(".datepicker_wrapper_element").length === 0 && $(event.target).closest(".dates_selector_personalized").length === 0 && $(event.target).closest(".ui-widget-header").length === 0) {
$(".datepicker_wrapper_element").slideUp();
}
});
},
get_namespace_widget: function () {
const paraty_widget_namespace = $("#paraty_widget_namespace");
const paraty_widget_internal_url = $("#paraty_widget_url");
if (paraty_widget_namespace.length){
this.config._custom_hotel_namespace = paraty_widget_namespace.val();
if (paraty_widget_namespace.val() == 'custom-paraty-format') return 'custom-paraty-format';
this.config._custom_hotel_domain = paraty_widget_internal_url.val();
return this.config._custom_hotel_namespace;
}
},
custom_html_build: function(namespace, widget_html){
const injForm = $("#injectForm");
if (injForm.length) {
injForm.append(widget_html.clone());
}
// Always setting amare-ibiza as widget class. Maintaining old code functionallity (check this).
widget_html.addClass('amare-ibiza');
namespace !== 'custom-paraty-format' && widget_html.find("#namespace").val(namespace);
$("#modal-booking").find(".b-booking__inner").html(widget_html);
if ($(".destination_wrapper").length) {
$(`.hotel_selector #${namespace}`).trigger("click");
}
},
prepare_mobile_version: function() {
//Create button to open booking widget
var mobile_booking_button = $("").attr('id', 'mobile_booking_button').html($.i18n._("reserva_ahora")),
wrapper_booking_button = $("").attr('id', 'mobile_booking_wrapper'),
close_booking_button = $("").attr('id', 'close_booking_widget').html("X");
wrapper_booking_button.append(mobile_booking_button);
$("#mobile_booking_engine_wrapper").append(close_booking_button);
if (!bookingWidgetController.config._custom_hotel_namespace) $("body").append(wrapper_booking_button);
$("#mobile_booking_wrapper").click(function(){
$("#mobile_booking_engine_wrapper").addClass('active');
$(this).addClass('hide');
});
$("#close_booking_widget").click(function(){
$("#mobile_booking_engine_wrapper").removeClass('active');
$("#mobile_booking_wrapper").removeClass('hide');
});
},
bind_click_buttons: function(){
$("a.btn-submit[href*='booking']").click(function(e){
e.preventDefault();
$(".start_end_date_wrapper").trigger('click');
});
$(".hotel_selector_option").click(function () {
const hotel_namespace = $(this).attr('id');
const adults_selector = $(".adults_selector .room_selector");
const hotels_config = JSON.parse('{"amare-marbella": {"namespace": "amare-marbella", "closed_periods": [{"servingUrl": null, "title": "Periodo 7", "spanish_title": "Periodo 7", "description": "", "enabled": true, "priority": "a4", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgNDQ-OuQCwyiAQ5hbWFyZS1tYXJiZWxsYQ", "altText": "Am\u00e0re Beach Hotel Marbella. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Periodo 7", "close": "2025-11-23", "open": "2026-03-06"}, {"servingUrl": null, "title": "Cerrado a partir de aqui", "spanish_title": "Cerrado a partir de aqui", "description": "", "enabled": true, "priority": "a5", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgICOpp6bCQyiAQ5hbWFyZS1tYXJiZWxsYQ", "altText": "Am\u00e0re Beach Hotel Marbella. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Cerrado a partir de aqui", "last_close": "2026-11-22"}], "valid_adults": 3}, "amare-ibiza": {"namespace": "amare-ibiza", "closed_periods": [{"servingUrl": null, "title": "Periodo 26", "spanish_title": "Periodo 26", "description": "", "enabled": true, "priority": "a7", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgNDUm6WeCwyiAQthbWFyZS1pYml6YQ", "altText": "Am\u00e0re Beach Hotel Ibiza. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Periodo 26", "close": "2025-10-26", "open": "2026-04-24"}, {"servingUrl": null, "title": "Perido m\u00e1ximo", "spanish_title": "Perido m\u00e1ximo", "description": "", "enabled": true, "priority": "a8", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgIDOyJeCCwyiAQthbWFyZS1pYml6YQ", "altText": "Am\u00e0re Beach Hotel Ibiza. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Perido m\u00e1ximo", "last_close": "2026-10-25"}], "valid_adults": 3}, "amare-sancti-petri": {"namespace": "amare-sancti-petri", "closed_periods": [{"servingUrl": null, "title": "Periodo 1", "spanish_title": "Periodo 1", "description": "", "enabled": true, "priority": "a1", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgNCYnNCsCQyiARJhbWFyZS1zYW5jdGktcGV0cmk", "altText": "Am\u00e0re Beach Hotel Sancti Petri. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Periodo 1", "open": "2026-05-01", "close": "2025-11-03"}, {"servingUrl": null, "title": "Cerrado a partir de aqu\u00ed", "spanish_title": "Cerrado a partir de aqu\u00ed", "description": "", "enabled": true, "priority": "a8", "linkUrl": "", "key": "ag5zfmFtYXJlLWhvdGVsc3IUCxIHUGljdHVyZRiAgNCYnNC1CQyiARJhbWFyZS1zYW5jdGktcGV0cmk", "altText": "Am\u00e0re Beach Hotel Sancti Petri. Web Oficial", "allowInMobile": true, "onlyInMobile": false, "pictureTitle": "Cerrado a partir de aqu\u00ed", "last_close": "2026-11-01"}], "valid_adults": 3}}') || {};
const hotel_config = hotels_config[hotel_namespace];
if (hotel_config) {
bookingWidgetController.configure_hotel_settings(hotel_config, adults_selector);
} else {
// Fallback for hotels not in configuration
bookingWidgetController.configure_default_settings(adults_selector);
}
});
this.prepare_user_info();
},
configure_hotel_settings: function(hotel_config, adults_selector) {
const closed_periods = hotel_config.closed_periods || [];
const valid_adults = hotel_config.valid_adults || 8;
DP_extend_info.config.period_closed = closed_periods;
let target_min_date = new Date();
// Calculate minimum date based on closed periods
if (closed_periods.length > 0) {
for (const period of closed_periods) {
const closed_date = period.close ? new Date(period.close) : null;
const open_date = period.open ? new Date(period.open) : null;
if (closed_date && closed_date <= new Date()) {
if (open_date && open_date >= new Date()) {
target_min_date = new Date(open_date);
}
}
}
}
this.set_datepicker_dates(target_min_date);
this.populate_adults_selector(adults_selector, valid_adults);
},
configure_default_settings: function(adults_selector) {
DP_extend_info.config.period_closed = [];
const max_infinite = new Date(2999, 10, 10);
const today_day = new Date();
DP_extend_info.config.datepicker_sd_wrapper.datepicker('option', 'maxDate', max_infinite);
DP_extend_info.config.datepicker_ed_wrapper.datepicker('option', 'maxDate', max_infinite);
this.set_datepicker_dates(today_day);
const tomorrow_date = new Date(min_date);
tomorrow_date.setDate(min_date.getDate() + 1);
DP_extend_info.set_datepicker_end_date($.datepicker.formatDate("dd/mm/yy", tomorrow_date));
this.populate_adults_selector(adults_selector, 8);
},
set_datepicker_dates: function(min_date) {
DP_extend_info.config.datepicker_sd_wrapper.datepicker('option', 'minDate', min_date);
DP_extend_info.config.datepicker_ed_wrapper.datepicker('option', 'minDate', min_date);
DP_extend_info.format_dates($.datepicker.formatDate("dd/mm/yy", min_date));
DP_extend_info.set_datepicker_start_date($.datepicker.formatDate("dd/mm/yy", min_date));
},
populate_adults_selector: function(adults_selector, max_adults) {
adults_selector.each(function() {
$(this).find("option").remove();
for (let i = 1; i <= max_adults; i++) {
const option = $("