// $(function(){


moment.locale(getCurrentLanguage());
moment.updateLocale('es',{
    monthsShort:'Ene_Feb_Mar_Abr_May_Jun_Jul_Ago_Sep_Oct_Nov_Dic'.split('_')
});
moment.updateLocale('en',{
    monthsShort:'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_')
});

var

//===========================================================================
// CONSTANTES
//===========================================================================

HS_TYPE_CORPORATIVOS = 1,
HS_TYPE_TURISTICOS = 2,
HS_TYPE_LARGA_ESTANCIA = 3,
HS_TYPE_VILLAS = 4,
HS_TYPE_GESTION_LARGA_ESTANCIA = 5,

HS_PRICE_MIN = window.hcPriceMin,
HS_PRICE_MAX = window.hcPriceMax,
    HS_MIN_MAX_PRICES = JSON.parse(window.hcMinMaxPrices),
    HS_CITIES_IDS = {
    'madrid': "1",
        'villas': "2",
        'valencia': "3",
        'sevilla': "4",
        'londres': "5",
        'malaga': "6",
        'dominicana': "7",
        'villas-dominicana': "8",
        'bilbao': "10",
        'san-sebastian': "11",
        'barcelona': "12",
        'miami': "13",
        'ibiza': "14"
    },
/** YYYY-MM-DD */
HS_MAIN_DATE_FORMAT = 'YYYY-MM-DD',
/** DD/MM/YYYY */
HS_DISPLAY_DATE_FORMAT = getCurrentLanguage() === 'es' ? 'D MMM, YYYY' : 'MMM D, YYYY',
/** DD MMM YYYY */
HS_DISPLAY_LONG_DATE_FORMAT = getCurrentLanguage() === 'es' ? 'D MMM, YYYY' : 'MMM D, YYYY',
/** DD MMMM YYYY */
HS_DISPLAY_COMPLETE_DATE_FORMAT = 'DD MMMM YYYY',
/** Valor de estancia flexible al seleccionar en los meses */
HS_FLEXIBLE = 'flexible',
HS_START_OF_WEEK = 'monday',
/** Flecha para siguiente mes en calendarios */
HS_CUSTOM_NEXT_ARROW = '<i class="icon-i_arrow1-thick-r"></i>',
/** Flecha para mes anterior en calendarios */
HS_CUSTOM_PREV_ARROW = '<i class="icon-i_arrow1-thick-l"></i>',
HS_MODAL_ANIMATION_SPEED = 300,

HS_SUPPLIES_NAMES = {
    electricity_consumption : 'js.electricity',
    gas_consumption : 'js.gas',
    tv_consumption : 'js.tv',
    heating_consumption : 'js.heating',
    water_consumption : 'js.water',
    wifi_consumption : 'js.wifi',
    cleaning_consumption : 'js.cleaning'
},

HS_CITIES = {
    'madrid' : 1,
    'barcelona' : 12,
    'ibiza' : 14,
    'san-sebastian' : 11,
    'valencia' : 3,
    'malaga' : 6,
    'miami' : 13,
    'sevilla' : 4,
    'london' : 5,
    'dominicana' : 7,
    'villas-dominicana' : 8,
    'bilbao' : 10,
    'new-york' : 99999991,
    'baja-california' : 99999992,
    'cdmx' : 99999993
},

//===========================================================================
// ELEMENTOS DE INTERFAZ
//===========================================================================

// VENTANA

$window = $(window),
$bodyHtml = $('body,html'),
$lazyElements = $('.lazy'),

// CALENDARIOS DE SELECCIÓN
//---------------------------------------------------------------------------

/** Tabs para seleccionar calendarios de tipo de fechas de estadía, para desktop y mobile */
$dateTabsButtons = $('#date-day, #date-month, #date-year, #date-day-mobile, #date-month-mobile, #date-year-mobile'),

// SLIDERS DE RANGO DE PRECIOS
//---------------------------------------------------------------------------

/** Sliders de rango de precios */
$rangeSliders = $('.slider-range'),
/** Input de precio mínimo para slider de rango de precios */
$minInput = $( ".amount"),
/** Input de precio máximo para slider de rango de precios */
$maxInput = $( ".amount2"),



$monthPriceCheckbox = $( ".barra-custom-list-item-precio input"),
$monthPriceCheckboxParent = $( ".barra-custom-list-item-precio input"),
$priceRangeButton = $( ".button-range-price"),
$savingsDropdown = $('.sdx-savings'),
$savingMoreTimeDropdown = $('.sdx-savings-more-time'),
$dateHolesAlert = $('.fixed-resumen-single-property-content-alert-dates'),
$datesNotAvailable = $('.box-not-available-date'),

// SIDEBAR DE SINGLE
//---------------------------------------------------------------------------

/** Checkbox de 'viajo con mascotas' en single */
$petCheckbox = $('#pet'),
$dateStart = $("#dates-sidebar-llegada"),
$dateEnd = $("#dates-sidebar-salida"),
$dateStartLabel = $('[for=' + $dateStart.attr('id') + ']'),
$dateEndLabel = $('[for=' + $dateEnd.attr('id') + ']'),

$people = $('.dates-sidebar-personas'),

/** Modal de calendario de pagos */
$paymentsCalendar = $('#sdx-calendar-detail'),
$quoteContainer = $('.fixed-resumen-single-property-content-resumen-items'),
$quoteContainerItems = $quoteContainer.find('.sdx-items'),
$dateHolesAlternativesButton = $dateHolesAlert.find('a'),
$btnReserve = $('.btn-reserva'),
$menuHeader = $('.section-header'),
/** Header banner, referencia para mostrar/ocultar botones de búsqueda/calendario */
$firstSection = $('.hs-first-section'),
$searchModals = $(".modal-box-banner"),
$searchModalsLightbox = $(".overlay-modal-box-banner"),
$searchWindowModal = $(".modal-filtro"),
$searchTabsButtons = $(".link-open-box-modal"),
/** Formulario que contiene todos los settings que se usarán para búusqueda */
$formSearchSettings = $('#hs-search-settings'),

// ELEMENTOS DEL LISTADO

/** Botones flotados de apertura de mapa en listado */
$openMapButton = $('.btn-fixed-map'),
$openMapMobileButton = $('.barra-custom-button-m'),
/** Botón flotado de apertura de modal de filtros de búsqueda */
$openSearchFiltersModalButton = $('.barra-button-filter'),
/** Botón de cierre de mapa en listado */
$closeSearchFiltersModalButton = $('.btn-close-modal-map,.overlay-modal-map'),

$buttonType = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-type'),
$buttonDate = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-date'),
    $buttonDate2 = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-date-2'),

    $buttonDateSmall = $('.hs-filter-menu.hs-smallmenu .hs-button-date'),
    $buttonDate2Small = $('.hs-filter-menu.hs-smallmenu .hs-button-date-2'),

    $buttonDestination = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-destination'),
    $buttonDestinationSmall = $('.hs-filter-menu.hs-smallmenu .hs-button-destination'),
    $buttonDuration = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-datetype'),
    $buttonDurationSmall = $('.hs-filter-menu.hs-smallmenu .hs-button-datetype'),
    $buttonPeople = $('.hs-filter-menu:not(.hs-smallmenu) .hs-button-people'),

$labelMobileType = $('.hs-label-mobile-type'),
    $labelMobileOrder = $('.hs-label-mobile-order'),
    $labelMobileDatetype= $('.hs-label-mobile-datetype'),

$labelMobileDate = $('.hs-label-mobile-date'),
$labelMobileDestination = $('.hs-label-mobile-destination'),




$spinnerButtons = $('.plus-btn, .minus-btn'),
// $dateTabsButtons = $('.barra-fecha-box-selector .nav-link'),
$spinnerButtonsMinus = $spinnerButtons.filter('.minus-btn'),
$spinnerButtonsPlus = $spinnerButtons.filter('.plus-btn'),
$spinnerInputs = $spinnerButtons.parent().find('input'),
$hsActiveOnHover = $('.hs-active-on-hover'),
/** Títulos para los spinners de personas y dormitorios, van en plural */
$peopleBedroomsTitle = $('.hs-people-bedrooms-title, .hs-smallmenu .hs-button-people');
/** Unidades para los spinners de personas y dormitorios, van en singular o plural, según el número */
$peopleBedroomsUnits = $('.hs-people-bedrooms-units');
$peopleBedroomsUnitsSmall = $('.hs-filter-menu.hs-smallmenu .hs-button-people'),

$peopleBedroomsUnitsMobile = $('.button-modal-filtro .hs-people-bedrooms-units'),
/** Espacios para colocar valores de spinners */
$peopleBedroomsHolders = $('.hs-people-bedrooms-holder');

/**
 * Bandera para permitir o bloquear la apertura del siguiente dropdown al camnbiar una fecha.
 * Se utiliza junto con setDates y clearDates y en la implementación de setValue de la
 * función createCalendar
 * */
__allowCalendarAutoDropdown = true,

/** Fecha para inicializar los calendarios */
todayDate = moment().format(HS_MAIN_DATE_FORMAT),

//===========================================================================
// CONFIGURACIONES PARA TODOS LOS CALENDARIOS
//===========================================================================

// Calendarios desktop
//---------------------------------------------------------------------------
calDays = {
    named : 'calDays',
    $tab : $('#two-inputs' ),
    containerSelector : '#date-range12-container',
    $startInput : $('#date-range200' ),
    $endInput : $('#date-range201' ),
    separator : ' a ',
    dateType : 'days',
},
calMonths = {
    named : 'calMonths',
    $tab : $('#two-inputs2' ),
    containerSelector : '#date-range12-container-2',
    $startInput : $('#date-range200-2' ),
    $endInput : $('#date-range201-2' ),
    separator : ' a ',
    onFirstDaySelected : function(event, obj) {
        calMonths.$tab.parent().find('.box-exit-closed-flexible').addClass('active');
        },
    dateType : 'months',
},
calYears =  {
    named : 'calYears',
    $tab : $('#two-inputs3' ),
    containerSelector : '#date-range12-container-3',
    $startInput : $('#date-range200-3' ),
    $endInput : $(''),
    separator : ' a ',
    singleDate : true,
    dateType : 'years',
},

// Calendarios mobile
//---------------------------------------------------------------------------
calDaysMobile = {
    named : 'calDaysMobile',
    $tab : $('#two-inputs-mobile' ),
    containerSelector : '#date-range12-container-mobile',
    $startInput : $('#date-range200-mobile' ),
    $endInput : $('#date-range201-mobile' ),
    separator : ' - ',
    dateType : 'days',
},
calMonthsMobile = {
    named : 'calMonthsMobile',
    $tab : $('#two-inputs-mobile2'),
    containerSelector : '#date-range12-container-mobile-2',
    $startInput : $('#date-range200-2-mobile' ),
    $endInput : $('#date-range201-2-mobile' ),
    separator : ' - ',
    onFirstDaySelected : function(event, obj) {
        calMonthsMobile.$tab.parent().find('.box-exit-closed-flexible').addClass('active');
    },
    dateType : 'months',
},
calYearsMobile =  {
    named : 'calYearsMobile',
    $tab : $('#two-inputs-mobile3' ),
    containerSelector : '#date-range12-container-mobile-3',
    $startInput : $('#date-range200-3-mobile' ),
    $endInput : $(''),
    separator : ' - ',
    singleDate : true,
    dateType : 'years',
},

/** Colección que contiene todos los settings de los calendarios */
allCalendars = [
    calDays,
    calMonths,
    calYears,
    calDaysMobile,
    calMonthsMobile,
    calYearsMobile,
],

//===========================================================================
// CONFIGURACIONES PARA TODOS LOS SWIPERS
//===========================================================================
_swiperSettings = {
    'card' : {
        effect: "cards",
        grabCursor: true,
        direction: 'vertical',
        observer: true,
        observeParents: true,
        cardsEffect: {
            rotate: false,
        }
    },
    'apartment_detail' : {
        spaceBetween: 30,
        speed: 300,
        autoHeight: false,
        virtual: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        slidesPerView: 1.3,
        observeSlideChildren: true,
        breakpoints: {
            768 : {
                slidesPerView: 3,
            },
            400 : {
                slidesPerView: 2,
            },
        }
    },
    'recommended' : {
        spaceBetween: 20,
        speed: 300,
        autoHeight: false,
        virtual: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        observeSlideChildren: true,
        centeredSlides: true,
        loop: true,
        slidesPerView: 1.1,
        breakpoints: {
            1380: {
                slidesPerView: 4,
            },
            1260: {
                slidesPerView: 3.5,
            },
            1095 : {
                slidesPerView: 3.2,
            },
            930 : {
                slidesPerView: 2.7,
            },
            775 : {
                slidesPerView: 2.35,
            },
            620 : {
                slidesPerView: 1.8,
            },

            520 : {
                slidesPerView: 1.55,
            },

            420 : {
                slidesPerView: 1.3,
            },
        }
    },
    'timeline' : {
        spaceBetween: 30,
        speed: 300,
        autoHeight: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        observeSlideChildren: true,
        breakpoints: {
            1200: {
                slidesPerView: 3.5,
            },
            992 : {
                slidesPerView: 3,
            },

            768 : {
                slidesPerView: 2.5,
            },
            576 : {
                spaceBetween: 20,
                slidesPerView: 2,
            },
            320 : {
                spaceBetween: 20,
                slidesPerView: 1.5,
            },
        }
    },
    'timeline_center' : {
        spaceBetween: 30,
        speed: 300,
        autoHeight: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        observeSlideChildren: true,
        // centeredSlides: true,
        breakpoints: {
            // 1200: {
            //     slidesPerView: 3.5,
            // },
            992 : {
                slidesPerView: 3,
                centeredSlides: false,
            },

            768 : {
                slidesPerView: 2.5,
            },
            576 : {
                spaceBetween: 20,
                slidesPerView: 2,
            },
            320 : {
                spaceBetween: 20,
                slidesPerView: 1.5,
            },
        }
    },
    'list_buckets' : {
        spaceBetween: 30,
        speed: 300,
        autoHeight: false,
        virtual: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        observeSlideChildren: true,
        breakpoints: {
            1200: { // mayor que 1264
                slidesPerView: 3,
            },
            768 : {
                slidesPerView: 2,
            },
        },
    },
    'list_livings' : {
        spaceBetween: 30,
        speed: 300,
        autoHeight: false,
        virtual: false,
        resizeReInit: true,
        observer: true,
        observeParents: true,
        observeSlideChildren: true,
        breakpointsBase: 'container',
        breakpoints: {
            940: { // mayor que 1264
                slidesPerView: 3,
            },
            520 : {
                slidesPerView: 2,
            },
        },
    },
    'thumbnails' : {
        slidesPerView: 1,
        spaceBetween: 0,
        loop: false,
        lazy: true,
        preloadImages: false,
        observeParents: true,
        observer: true,
        resizeReInit: true,
        pagination: {
            el: '.swiper-pagination',
            clickable: true,
        },
        breakpoints: {
            320: {
                lazy: false,
                // allowTouchMove: false,
            }
        },
    },
    'fade' : {
        effect: "fade",
        speed: 300,
        preloadImages: false,
        lazy: true,
        resizeReInit: true,
    },
    'slide' : {
        spaceBetween: 30,
    },
    'slide-resize' : {
        autoHeight : true,
        spaceBetween: 30,
    },
    'scroll' : {
        spaceBetween: 30,
        slidesPerView: 1.3,
        breakpoints: {
            768: {
                slidesPerView: 1,
            }
        },
    },

    'map' : {
        slidesPerView: 1.1,
        spaceBetween: 10,
        preloadImages: false,
        lazy: false,
        observer: true,
        resizeReInit: true,
        center: true,
        centeredSlides: true,
    }
},


clickOutsideListeners = [];
lastAvailabilityValues = {},

tooltipPaths = '<path d="M5.61002 2.77979C6.61002 2.77979 7.28002 3.33979 7.28002 4.19979C7.28002 4.90979 6.82002 5.23979 6.41002 5.56979C5.96002 5.94979 5.61002 6.17978 5.61002 7.13978H5.03002C5.03002 6.09978 5.44002 5.74979 5.97002 5.31979C6.36002 4.99979 6.70002 4.75979 6.70002 4.21979C6.70002 3.67979 6.31002 3.30979 5.63002 3.30979C4.91002 3.30979 4.35002 3.71979 4.35002 4.67979H3.77002C3.77002 3.60979 4.41002 2.79979 5.61002 2.79979V2.77979ZM5.01002 7.89979H5.68002V8.56979H5.01002V7.89979Z" fill="black"/><path d="M5.59 10.18C8.12499 10.18 10.18 8.12499 10.18 5.59C10.18 3.05501 8.12499 1 5.59 1C3.05501 1 1 3.05501 1 5.59C1 8.12499 3.05501 10.18 5.59 10.18Z" stroke="black" stroke-width="0.5" stroke-miterlimit="10"/>',
tooltipSvgAttributes = ' width="11" height="11" viewBox="0 0 11 11" fill="none" xmlns="http://www.w3.org/2000/svg" data-toggle="tooltip" data-html="true" data-placement="top" class="btn-flexible-tooltip" ';


//===========================================================================
// INICIALIZACIÓN GENERAL
//===========================================================================

initCustomSwipers();
resetLayout();
updatePeopleBedroomNames();
emptyAvailabilityDetails(); // Se ocultan todos los elementos de disponibilidad

// Se inicializan animaciones al scroll
window.addEventListener('load', function () {
	setTimeout(function() {
		AOS.init({ once: true });
	}, 1000);
});

// Se inicializan las imágenes que tienen lazy loading
if ($lazyElements.length) $lazyElements.lazy();

// Se inicializa la navegación animada a anclas
$('.js-anchor-link').click(function(e){
	e.preventDefault();
	var target = $($(this).attr('href'));
	if(target.length){
		var scrollTo = target.offset().top;
		$('body, html').animate({scrollTop: scrollTo+'px'}, 100);
	}
});

// Se inicializan elementos que agreguen una clase 'active' al dar over sobre ellos
$hsActiveOnHover.hover(
    function () { $hsActiveOnHover.addClass("active", 3000); },
    function () { $hsActiveOnHover.removeClass("active", 3000);}
);

// Se agrega acción default a todos los dropdowns para que siempre sincronicen sus valores
// con el formulario oculto de search params
$('[data-dropdown]').data('default-action',function(value, text, name) {
    setSearchParam(name, value);
    if (name == getSpinnerMode()) {
        setSpinnerValue();
    }
});


// Se agrega una clase al body para saber si el sitio está siendo visitado desde un browser mobile
if (isMobileBrowser()) $('body').addClass('hs-is-mobile-browser');

// Para la carga de subsecciones en sidebar lateral
$('.hs-open-in-sidebar').click(function(e){
    e.preventDefault();
    var $this = $(this);
    $('.hs-modal-internal-page').data('open')(
        $this.attr('href'),
        $this.data('title')
    );
    return false;
});

// Bloqueo de click de los tabs de llegada/salida
$('.hs-calendar .nav-date-title').click(false);



$('.hs-modal-internal-page').each(function(){
    var
    $modal = $(this),
    $title = $modal.find('.hs-modal-internal-page-title'),
    $closeButton = $modal.find('button'),
    $iframe = $modal.find('iframe');

    $modal
    .data('open', function(url, title) {
        if ($iframe.attr('src') !== url) $iframe.attr('src', url);
        $title.html(title);
        $modal.removeClass('d-none');
        setTimeout(function(){
            $modal.addClass('active');
        }, 200);
    })
    .data('close', function() {
        $modal.removeClass('active');
        setTimeout(function(){
            $modal.addClass('d-none');
        }, 200);
    });

    $closeButton.click(function(e){
        $modal.data('close')();
    });
});




// INICIALIZACIONES ESPECÍFICAS PARA CADA TIPO DE PÁGINA
switch (window.hcPage) {
    /*case 'listing' :
    case 'listing-city' :
        if(deviceType == 'desktop'){
            setTimeout(function(){
                showListingMap();
            },1000);
        }*/
    case 'home' : {
        //  SE SINCRONIZAN LOS CALENDARIOS MOBILE CON LOS DESKTOP 2 SEGUNDOS DESPUÉS
        //  DE LA CARGA PARA QUE NO INTERVENGAN CON OTRAS INICIALIZACIONES
        setTimeout(function(){
            calDays.$tab.on('datepicker-change', datePickerChange);
            calDaysMobile.$tab.on('datepicker-change', datePickerChange);
            calMonths.$tab.on('datepicker-change', datePickerChange);
            calMonthsMobile.$tab.on('datepicker-change', datePickerChange);
            calYears.$tab.on('datepicker-change', datePickerChange);
            calYearsMobile.$tab.on('datepicker-change', datePickerChange);
        },2000);
        break;
    }
    case 'single' : {
        setTimeout(function(){

            $people.parents('div').find('.barra-dormitorios-box-number button').click(function(){
                setTimeout(function(){
                    if (checkChange()) {
                        callGetAvailability(true);
                    }
                },500);
            });

            calMonths.$tab.on('datepicker-change', function() {
                if (checkChange()) {
                    callGetAvailability(true);
                }
            });
        },2000);
        break;
    }
}

// INICIALIZACIÓN DE TODOS LOS DROPDOWNS
$('[data-dropdown]').each(function(){ addDropdownValueChange($(this)); });

// Carga inicial de zonas y subzonas si existen definidas en los search params
/*if (getSearchParam('city')) {
    loadCityZones(HS_CITIES[getSearchParam('city')], false);
}*/

if (getSearchParam('zone')) {
    setDropdownValue($getDropdownsByName('zone'), getSearchParam('zone'));
    loadZoneSubzones(getSearchParam('zone'), true);
}

// INICIALIZACIÓN DE BOTONES DE BÚSQUEDA PARA QUE GENEREN EL URL DE BÚSQUEDA Y NAVEGUEN A LOS RESULTADOS
$('.btnh-search-button,#hs-filter-search-button,.hs-search-button').click(function(e){
    e.preventDefault();
    var newUrl = generateSearchQuery();
    let hasOnlyFrom = false;
    if (newUrl) {
        hasOnlyFrom = newUrl.includes('from') && !newUrl.includes('to=');
    }
    if (newUrl && !hasOnlyFrom) {
        location.href = newUrl;
    } else{
        if (hasOnlyFrom) {
            $(this).parents('ul').find(".hs-button-date-2").trigger('click');
        } else {
            $(this).parents('ul').find(".hs-button-destination").trigger('click');
            $('#modal-filtro-01 button').trigger('click');
        }
    }
    //else alert(__('js.select-city'));

    return false;
});

$('#modal-filtro-02 button').on('click', function(){
    const city = getSearchParam('city');
    const dateType = getSearchParam('datetype');
    if (!city) {
        $('#modal-filtro-01 button').trigger('click');
        return;
    } else if (!dateType) {
        $('#modal-filtro-06 button').trigger('click');
        return;
    } else {
        if (dateType == 'days') {
            $('#date-day-mobile').click();
        } else {
            $('#date-month-mobile').click();
        }
    }
});

$('#modal-filtro-06 button').on('click', function(){
    const city = getSearchParam('city');
    if (!city) {
        $('#modal-filtro-01 button').trigger('click');
        return;
    }
});

$('.footer-input-search').on('keydown', function(event){
    if (event.keyCode == 13){
        var newUrl = generateSearchQuery(true);
        if (newUrl) location.href = newUrl;
    }
});



$('#accordion').each(function(){
    var
    $accordion = $(this),
    $cards = $accordion.find('.card');

    $cards.each(function(index) {
        var
        $card = $(this),
        $button = $card.find('.hs-button-accordion');

        $card.data('index', index);

        $button.click(function(){
            setTimeout(function(){
                var
                $activeCard = $cards.find('.collapse.show').parents('.card');

                $cards.each(function(){
                    var
                    $loopedCard = $(this),
                    $loopedCardButton = $loopedCard.find('.hs-button-accordion');

                    if ($activeCard.data('index') >= $loopedCard.data('index')) {
                        $loopedCardButton.addClass('hs-recently-closed');
                    }
                    else {
                        $loopedCardButton.removeClass('hs-recently-closed');
                    }
                });
            }, 500);

        });
    });

});




$('#hs-filter-clear, .hs-search-clear').click(function(e){
    e.preventDefault();
    clearFilters();
    return false;
});


function clearFilters() {
    // Sorting
    $(".list-filter-dropdown-item button p").html(__('filter.list'));
    setSearchSort(null);
    // Housing type
    //$('.hs-type').prop("checked", false);
    //setSearchType(null, null);
    // Destination
    //$('.hs-destination').prop("checked", false);
    //setSearchCity(null, null);
    // Dates
    clearDates();
    // Bathrooms
    setSearchParam('bathrooms', 1);
    // Bedrooms
    setSearchParam('bedrooms', 1);
    // People
    setSearchParam('people', 1);
    // Bedrooms & People spinners, etc.
    updatePeopleBedroomDropdownsValues();
    updatePeopleBedroomNames();
    var city = getSearchParam('city')
    if (city) {
        var dateType = getSearchParam('dateType');
        if (dateType == 'days') {
            HS_PRICE_MIN = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].min_tur
            HS_PRICE_MAX = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].max_tur
        } else {
            HS_PRICE_MIN = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].min_corp
            HS_PRICE_MAX = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].max_corp
        }
    }
    // Price range
    $rangeSliders.each(function(){
        var $currentSlider = $(this);
        $currentSlider.slider("values", 0, HS_PRICE_MIN);
        $currentSlider.slider("values", 1, HS_PRICE_MAX);
        setSlidersInputs($currentSlider);
    });
    setSearchParam('min', HS_PRICE_MIN);
    setSearchParam('max', HS_PRICE_MAX);
    // Features
    $('[name="features"]').prop("checked", false);
    // Tolerance
    $('[name="item-tab-group-01"]').prop("checked", false);
    // Signature
    $('[name="signature"]').prop("checked", false);
    // Smartlock
    $('[name="smartlock"]').prop("checked", false);
    // Coliving
    $('[name="coliving"]').prop("checked", false);
    // Coworking
    $('[name="coworking"]').prop("checked", false);
    // Monthly price
    $('[name="precio-mes"]').prop("checked", false);
    // Dormitorios Exacto
    $('[name="exact-match"]').prop("checked", false);

    // Neighboughoods
    setDropdownValue($getDropdownsByName('zone'), null);
    setSearchParam('zone', null);
    // Areas
    clearDropdown('subzone');
    setDropdownValue($getDropdownsByName('subzone'), null);
    setSearchParam('subzone', null);

}

/// Inicialización de modals sidebar
$('.hs-modal-side .hs-close-button').click(function(){
    $(this).parents('.hs-modal-side').fadeOut();
    bodyModalIsClosed();
});


//===========================================================================
// CONTACTO
//===========================================================================

// LLENADO DE DROPDOWN DE CIUDADES
$getDropdownsByName('contact-city').data('action', function(value, text, name){
    var service = window.hcRoot + '/api/zones/' + HS_CITIES[value];
    setDropdown('contact-zone', service);
});

$("#button-contact-reservations").click(function() {
	$(".hs-modal-contact").fadeIn();
	bodyModalIsOpen();
});
$("#button-contact-owners, .button-contact-owners").click(function(event) {
	$(".hs-modal-owners").fadeIn();
	bodyModalIsOpen();
});

$("#button-contact-properties").click(function() {
	$(".hs-modal-property").fadeIn();
	bodyModalIsOpen();
});



//===========================================================================
// LISTADO
//===========================================================================

/**
 * Muestra el mapa lateral de la sección de listados
 */
function showListingMap() {
    $(".modal-map").addClass("active");
    $(".section-page-all-content").addClass("active-map");
    $(".col-map-full").show();
    setListingMapClasses();
    closeModalBoxBanners();
    $openMapButton.removeClass('d-md-block');
}

/**
 * Oculta el mapa lateral de la sección de listados
 */
function hideListingMap() {
    $(".modal-map").removeClass("active");
    $(".section-page-all-content").removeClass("active-map");
    $(".col-map-full").hide();
    $openMapButton.addClass('d-md-block');
    setListingMapClasses();
}

/**
 * Oculta los dropdowns de filtros de búsqueda
 */
function closeModalBoxBanners() {
    $(".modal-box-banner").fadeOut().removeClass("active"); // CIERRE DE TODOS LOS MODALS
    $('.overlay-modal-box-banner').fadeOut();
}

/**
 * Actualiza las clases de la columna de thumbnails de la izquierda en la sección de listados
 * según el tamaño de la ventana
 */
function setListingMapClasses() {
    if ($(".modal-map").hasClass("active")) {
        $(".col-items-map").addClass("col-lg-6");
        $(".col-items-map").addClass("col-xl-8");
        $(".col-items-map").addClass("active-map");
        $(".col-items-map").removeClass("col-lg-12");
    }
    else {
        $(".col-items-map").removeClass("col-lg-6");
        $(".col-items-map").removeClass("col-xl-8");
        $(".col-items-map").removeClass("active-map");
        $(".col-items-map").addClass("col-lg-12");
    }
    // if (window.matchMedia("(min-width: 991px)").matches) {}
}




$openMapButton.click(function (e){
    e.preventDefault();
    showListingMap() ;
});

$openMapMobileButton.click(function(e){
    e.preventDefault();
    showListingMap() ;
});

$closeSearchFiltersModalButton.click(function (e) {
    e.preventDefault();
    hideListingMap();
});



//===========================================================================
// SCROLL FADE
//===========================================================================

$('.hs-scroll-fade').each(function(){
    var
    tolerance = 10,
    $this = $(this),
    $container = $this.find('.hs-scroll-fade-container'),
    $content = $container.find('.hs-scroll-fade-content'),
    $gradientTop = $this.find('.hs-scroll-fade-gradient-top'),
    $gradientBottom = $this.find('.hs-scroll-fade-gradient-bottom');

    $container.on('scroll', function(e){
        var
        scrollPos = $container.scrollTop(),
        maxScrollPos = $content.height() - $container.height();

        if (scrollPos < tolerance) {
            $gradientTop.removeClass('active');
        }
        else {
            $gradientTop.addClass('active');
        }

        if (scrollPos > maxScrollPos - tolerance) {
            $gradientBottom.removeClass('active');
        }
        else {
            $gradientBottom.addClass('active');
        }
    }).trigger('scroll');
});

//===========================================================================
// BARRA DE FILTROS DESKTOP Y MENÚ MOBILE
//===========================================================================

$('.exit-modal-filtro').click(function(){
    $("#barra-destino-box").fadeIn();

    $('#barra-destino-box').css("display", "none");
});


// TODO REVISAR SI ESTÁ REPETIDO
$('.banner-barra-search, .modal-footer-button-search').click(function(){
    var newLocation = generateSearch();

    if (newLocation) location.href = newLocation;
    else $("#barra-destino-box").fadeIn();
});

$('.hs-clear-calendars').click(function(){
    clearDates();
});

// Filtros
$(".dropdown-menu-list-filter .dropdown-item").click(function(e) {
    e.preventDefault();
    var
    $listItem = $(this),
    $button = $listItem.parents('.list-filter-dropdown-item').find('button'),
    value = $listItem.data('value'),
    text = $listItem.html();

	$button.find('p').html(text);
    setSearchSort(value);
    var newUrl = generateSearchQuery();

    if (newUrl) location.href = newUrl;
    else alert(__('js.select-city'));

    return false;
});



// CHECKBOXES DE BARRA DE FILTROS DESTINOS/CIUDADES
$('.hs-destination').click(function(event, abort){
    if (abort) return;

    var
    $this = $(this),
    city = $this.val(),
    text = $('label[for="' + $this.attr('id') + '"]').find('span').text();

    // se sincronizan todos los checkboxes (se manda el true para indicar que no se dispare de nuevo el evento)
    $('.hs-destination[value="' + city + '"]').trigger('click', [true]);
    // se activa botón que permite navegar al dropdown de calendarios
    $('[data-next-dropdown=".hs-button-datetype"]').removeAttr('disabled');
    // se guarda la variable de ciudad en el formulario oculto
    setSearchCity(city, text);
    // se cargan los dropdowns de las zonas y subzonas (barrios y zonas)
    loadCityZones(HS_CITIES[city]);
    loadZoneSubzones(null);
    if (!window.hcDisableAutomaticDropDowns) {
        navigateToNextDropdown($this, '.hs-button-datetype');
        navigateToNextCard('.hs-button-datetype');
    }
    clearDates()
    if ($(this).parents('.gfw-listing-page').length > 0) {
        setSearchDatetype(null, null, true);
    } else {
        setSearchDatetype(null, null);
    }
});

// CHECKBOXES DE BARRA DE FILTROS TIPO DE VIVIENDA
$('.hs-type').click(function(event, abort){
    if (abort) return;

    var
    $this = $(this),
    type = $this.val(),
    text = $('label[for="' + $this.attr('id') + '"]').find('span').text();

    // se sincronizan todos los checkboxes (se manda el true para indicar que no se dispare de nuevo el evento)
    $('.hs-type[value="' + type + '"]').trigger('click', [true]);
    // se activa botón que permite navegar al dropdown de destinos (ciudades)
    $('[data-next-dropdown=".hs-button-destination"]').removeAttr('disabled');
    // se guarda la variable de tipo en el formulario oculto
    setSearchType(type, text);

    if (!window.hcDisableAutomaticDropDowns) {
        navigateToNextDropdown($this, '.hs-button-destination');
        navigateToNextCard('.hs-button-destination');
    }
    clearDates()

});

$('.hs-datetype').click(function(event, abort){
    if (abort) return;

    var
        $this = $(this),
        datetype = $this.val(),
        text = $('label[for="' + $this.attr('id') + '"]').find('span').text();

    // se sincronizan todos los checkboxes (se manda el true para indicar que no se dispare de nuevo el evento)
    $('.hs-datetype[value="' + datetype + '"]').trigger('click', [true]);
    // se activa botón que permite navegar al dropdown de calendarios
    $('[data-next-dropdown=".hs-button-date"]').removeAttr('disabled');
    // se guarda la variable de ciudad en el formulario oculto
    setSearchDatetype(datetype, text);
    setMinDays()
    if (!window.hcDisableAutomaticDropDowns) {
        navigateToNextDropdown($this, '.hs-button-date');
        navigateToNextCard('.hs-button-date');
    }
    clearDates()
});

// CHECKBOXES DE BARRA DE FILTROS TIPO DE VIVIENDA
$('.hs-order').click(function(event, abort){
    if (abort) return;
    var
        $this = $(this),

        type = $this.val(),
        text = $('label[for="' + $this.attr('id') + '"]').find('span').text();

    // se sincronizan todos los checkboxes (se manda el true para indicar que no se dispare de nuevo el evento)
    $('.hs-order[value="' + type + '"]').trigger('click', [true]);

    // se guarda la variable de tipo en el formulario oculto
    setSearchOrder(type, text);

});

// CHECKBOXES DE BARRA DE PRECIO OPTIMO
$('.hs-bestprice').click(function(event, abort){
    if($(this).hasClass('active')) {
        setSearchParam('bestprice', 0);
    } else {
        setSearchParam('bestprice', 1);
    }
});

// CHECKBOX DE DORMITORIOS EXACTOS
$('#exact-bedrooms').click(function(event, abort){
    const isChecked = $(this).is(":checked");

    if(!isChecked) {
        setSearchParam('exactbedrooms', 0);
        if(getCurrentLanguage() === 'es')
            $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace("Estudio","0 "));
        else
            $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace("Studio","0 "));

        $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace($("div[data-dropdown='bedrooms'] button p").text(),$("div[data-dropdown='bedrooms'] button p").text() + "+"));
        $(".dropdown-menu-select-bedrooms a").each(function() {
            if(getCurrentLanguage() === 'es')
                $(this).text($(this).text().replace("Estudio","0 +"));
            else
                $(this).text($(this).text().replace("Studio","0 +"));
            $(this).text($(this).text().replace("1","1 +"));
            $(this).text($(this).text().replace("2","2 +"));
            $(this).text($(this).text().replace("3","3 +"));
            $(this).text($(this).text().replace("4","4 +"));
            $(this).text($(this).text().replace("5","5 +"));
            $(this).text($(this).text().replace("6","6 +"));
            $(this).text($(this).text().replace("7","7 +"));
            $(this).text($(this).text().replace("8","8 +"));
        });

    } else {
        setSearchParam('exactbedrooms', 1);
        if(getCurrentLanguage() === 'es')
            $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace("0 +","Estudio"));
        else
            $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace("0 +","Studio"));

        $("div[data-dropdown='bedrooms'] button p").text($("div[data-dropdown='bedrooms'] button p").text().replace("+",""));
        $(".dropdown-menu-select-bedrooms a").each(function() {
            if(getCurrentLanguage() === 'es')
                $(this).text($(this).text().replace("0 +","Estudio"));
            else
                $(this).text($(this).text().replace("0 +","Studio"));
            $(this).text($(this).text().replace("1 +","1"));
            $(this).text($(this).text().replace("2 +","2"));
            $(this).text($(this).text().replace("3 +","3"));
            $(this).text($(this).text().replace("4 +","4"));
            $(this).text($(this).text().replace("5 +","5"));
            $(this).text($(this).text().replace("6 +","6"));
            $(this).text($(this).text().replace("7 +","7"));
            $(this).text($(this).text().replace("8 +","8"));
        });

    }
});


//===========================================================================
// SINGLE DETAIL
//===========================================================================

// TODO REVISAR SI ESTO ES NECESARIO ELIMINARLO POR PROGRAMACIÓN DE JUSTIN
$btnReserve.click(function(){
    var
    variables = [],
    href = $(this).data('href') + '/' + window.hcPropertyId;

    if ($dateStart.length) variables.push('from=' + $dateStart.val());
    if ($dateEnd.length) variables.push('to=' + $dateEnd.val());
    if ($people.length) variables.push('people=' + $people.val());
    if ($petCheckbox.length) variables.push('pet=' + ($petCheckbox.is(':checked') ? 1 : 0));

    if (variables.length) href += '?' + variables.join('&');
    window.location.href = href;
});


$('.modal-gallery-typeroom-open').click(function(event){
    event.preventDefault();
    $("#modal-gallery-" + $(this).data('typeroom')).fadeIn();
    $("body").addClass("modal-open");
    return false;
});

$('.close-gallery').click(function(event){
    event.preventDefault();
    $(this).parents('.modal-gallery').fadeOut();
    $("body").removeClass("modal-open");
    $("#modal-video-single video").get(0).pause()
    return false;
});

function isFlexible(startDate, endDate, dateType) {
    return (
        (startDate === endDate) &&
        (dateType == 'months')
    );
}


// TODO REVISAR SI ES NECESARIO
function checkChange() {
    var changed = false;

    if ($dateStart.length && $dateStart.val() != lastAvailabilityValues.dateStart) changed = true;
    if ($dateEnd.length && $dateEnd.val() != lastAvailabilityValues.dateEnd) changed = true;
    if ($people.length && $people.val() != lastAvailabilityValues.people) changed = true;

    saveLastAvailabilityValues();
    return changed;
}

function saveLastAvailabilityValues() {
    if (!lastAvailabilityValues) lastAvailabilityValues = {};
    if ($dateStart.length) lastAvailabilityValues.dateStart = $dateStart.val();
    if ($dateEnd.length) lastAvailabilityValues.dateEnd = $dateEnd.val();
    if ($people.length) lastAvailabilityValues.people = $people.val();
}




/**
 * Carga de zonas según la ciudad
 * @param {*} cityId
 */
function loadCityZones(cityId, dontClear = false) {
    // únicamente se hace la carga si existe un dropdown que llenar
    if (!$getDropdownsByName('zone').length) return false;

    var service = window.hcRoot + '/api/zones/' + cityId;
    if (!dontClear) {
        //setSearchParam('zone', '');
        //clearDropdown('subzone');
    }

    // Los barrios en UI en realidad son zonas en DB, y las zonas en UI en realidad son subzonas en DB
    setDropdown('zone', service, loadZoneSubzones);
}


function loadZoneSubzones(zoneId, dontClear = false) {
    if (!$getDropdownsByName('subzone').length) return false;
    let service = {}
    if (zoneId === 0 || zoneId === null) {
       const city = getSearchParam('city');
       const cityId = HS_CITIES[city];
        service = window.hcRoot + '/api/city/subzones/' + cityId;
    } else {
         service = window.hcRoot + '/api/subzones/' + zoneId;
    }
    if (!dontClear) {
        setSearchParam('subzone', '');
    }

    setDropdown('subzone', service);
}


//===========================================================================
// Agrega la funcionalidad de TODOS LOS SLIDERS DE RANGO DE PRECIOS
//===========================================================================
if ($rangeSliders.length) {
    var city = getSearchParam('city')
    if (city) {
        var datetype = getSearchParam('datetype')
        if (datetype == 'days') {
            HS_PRICE_MIN = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].min_tur
            HS_PRICE_MAX = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].max_tur
        } else {
            HS_PRICE_MIN = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].min_corp
            HS_PRICE_MAX = +HS_MIN_MAX_PRICES[HS_CITIES_IDS[city]].max_corp
        }
    }
    var
    minSearchParam = getSearchParam('min'),
    maxSearchParam = getSearchParam('max'),
    values = [
        isNull(minSearchParam) ? HS_PRICE_MIN : minSearchParam,
        isNull(maxSearchParam) ? HS_PRICE_MAX : maxSearchParam < HS_PRICE_MIN ? HS_PRICE_MAX : maxSearchParam
    ];
    $rangeSliders.slider({
        range: true,
        min: HS_PRICE_MIN,
        max: HS_PRICE_MAX,
        values: values,
        slide: function(event, ui) {
            setSlidersInputs(this);
        }
    });

    $monthPriceCheckboxParent.click(function () {
        setSlidersInputs();
    });
    setSlidersInputs();
}






function callGetAvailability(updateUrl) {
    var
    dateStartVal = $dateStart.length ? moment($dateStart.val(), HS_DISPLAY_DATE_FORMAT).format(HS_MAIN_DATE_FORMAT) : null,
    dateEndVal = $dateEnd.length ? moment($dateEnd.val(), HS_DISPLAY_DATE_FORMAT).format(HS_MAIN_DATE_FORMAT) : null,
    peopleVal = $people.length ? $people.val() : null;

    // history.replaceState({ path : newUrl }, '', newUrl);

    emptyAvailabilityDetails();
    // getAvailability(
    //     window.hcPropertyId,
    //     dateStartVal,
    //     dateEndVal,
    //     peopleVal,
    //     function(data) {
    //         setAvailabilityDetails(data, dateStartVal, dateEndVal, peopleVal)
    //     }
    // );
    // saveLastAvailabilityValues();
}

// TODO REVISAR SI ES NECESARIO
function arrangePaymentsObject(payments) {
    var
    byConcept = {},
    byDate = {},
    firstPayDate = '',
    serviceConcept = '',
    securityDeposit = 0,
    total = 0;

    for (var i = 0; i < payments.length; i++) {
        var
        item = payments[i],
        payDate = item['paym_pay_date'],
        payConcept = item['paym_concept'];

        if (!byConcept[payConcept]) byConcept[payConcept] = [];
        byConcept[payConcept].push(item);

        if (!byDate[payDate]) byDate[payDate] = [];
        byDate[payDate].push(item);

        if (payConcept == 'firstPay') firstPayDate = payDate;
        if (payConcept == 'securityDeposit') securityDeposit = Number(item['paym_amount']);

    }

    var todayPayments = byDate[firstPayDate];

    for (var i = 0; i < todayPayments.length; i++) {
        var
        payment = todayPayments[i],
        payConcept = payment['paym_concept'];

        total += Number(payment['paym_amount']);
        if (payConcept == 'serviceFee') serviceConcept = 'serviceFee';
        if (payConcept == 'reserveRatio') serviceConcept = 'reserveRatio';
    }

    return {
        byDate : byDate,
        byConcept : byConcept,
        total : total,
        firstPayDate : firstPayDate,
        securityDeposit : securityDeposit,
        serviceConcept : serviceConcept
    };
}


function emptyAvailabilityDetails() {
    $savingsDropdown.hide();
    $savingMoreTimeDropdown.hide();
    $dateHolesAlert.hide();
    $datesNotAvailable.hide();
    $dateHolesAlternativesButton.hide();
    $paymentsCalendar.hide();
    $quoteContainer.hide();
    $btnReserve.hide();
    $quoteContainerItems.html('');
}

function setAvailabilityDetails(data, fromDate, toDate, people) {

    if (data.success) {
        var arrangedPayments = arrangePaymentsObject(data.info.payments);
        fillQuote(arrangedPayments, fromDate, toDate, people);

        if (true || Object.keys(arrangedPayments.byDate).length > 1) {
            fillCalendarPopupContent(arrangedPayments, fromDate, toDate, people);
            $paymentsCalendar.show();
        }
        $quoteContainer.show();
        if (data.info.surcharge) $dateHolesAlert.show();
        $savingMoreTimeDropdown.show();
        $btnReserve.show();
    }
    else {
        $datesNotAvailable.show();
    }
}


function fillQuote(ordered, fromDate, toDate, people) {
    var
    quoteContent = '',
    period = getPeriod(fromDate, toDate),
    periodTitle = '',//__('js.price-months', {'months':2, 'price':inCurrency(3000, true)}),
    suplies,
    titleString,
    supliesTooltip,
    depositTooltip;



    for (var key in hcSupplies) {
        if (hcSupplies[key]) {
            if (!suplies) suplies = [];
            suplies.push({
                name: HS_SUPPLIES_NAMES[key],
                price: inCurrency(hcSupplies[key], true)
            });
        }
    }

    // Título si solo maneja días
    titleString = 'js.rate-date';

    if (period.months) {
        periodTitle += period.months + ' ' + transChoice('js.months', period.months);
        // Título si también maneja meses
        titleString = 'js.monthly-rate';
        if (period.months >= 12) {
            $savingMoreTimeDropdown.hide();
        }
    }

    if (period.days) {
        if (period.months) {
            periodTitle += ', ';
        }
        periodTitle += period.days + ' ' + transChoice('js.days', period.days);
    }

    if (suplies) {
        supliesTooltip = createTooltip(periodTitle, true, suplies);
    }

    depositTooltip = createTooltip(__('js.warranty-return'));

    quoteContent += createResumenItem({
        title : periodTitle,
        price : inCurrency(ordered.byConcept['firstPay'][0]['paym_amount'], true),
        tooltipHtml : supliesTooltip,
        subtitle : __(titleString,{
            'start':moment(fromDate, HS_MAIN_DATE_FORMAT).format(__('js.date-format')),
            'end':moment(toDate, HS_MAIN_DATE_FORMAT).format(__('js.date-format'))
        }),
        total : true
    });

    quoteContent += createResumenItem({
        title : __('js.suplies'),
        price : __('js.included'),
        tooltipHtml : supliesTooltip
    });

    if (ordered.securityDeposit) {
        quoteContent += createResumenItem({
            title : __('js.deposit'),
            price : inCurrency(ordered.securityDeposit, true),
            tooltipHtml : depositTooltip
        });
    }

    quoteContent += createResumenItem({
        title : __('js.service-fee'),
        price : inCurrency(ordered.byConcept[ordered.serviceConcept][0]['paym_amount'], true)
    })

    quoteContent += createResumenItem({
        title : __('js.to-pay-today'),
        price : inCurrency(ordered.total, true),
        important : true,
        total : true
    });

    quoteContent += createResumenItem({
        title : __('js.total'),
        price : inCurrency(ordered.total - ordered.securityDeposit, true),
        important : true,
        total : true
    });

    $quoteContainerItems.html(quoteContent);

    $('.btn-flexible-tooltip').tooltip({
        template:'<div class="tooltip salida-flexible-tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
    })
}

function getPeriod(fromDate, toDate) {
    var
    totalDays = (new Date(toDate) - new Date(fromDate)) / 86400000,
    totalMonths = totalDays / 30,
    months = 0,
    days = 0;

    if (totalMonths >= 1) {
        months = Math.floor(totalMonths);
        if (!Number.isInteger(totalMonths)) {
            days = totalDays - (months * 30);
        }
    }
    else {
        days = totalDays;
    }
    return {
        months : months,
        days : days
    };
}



function getPricePeriodByType(propertyType, isPlural = false) {
    switch (propertyType) {
        case HS_TYPE_TURISTICOS :
        case HS_TYPE_VILLAS : {
            if (isPlural) return 'días';
            else return 'día';
        }
        default : {
            if (isPlural) return 'meses';
            else return 'mes';
        }
    }
}

function setValidUrl() {
    // history.replaceState({ path : newUrl }, '', newUrl);
}

/**
 * Devuelve la traducción singular/plural según el valor de la variable amount
 * @param {*} textKey las opciones de texto separadas por un pipe [frase en singular]|[frase en plural]
 * @param {*} amount el valor que definirá si el texto es singular o plural
 * @param {*} variables las variables del texto que serán sustituídas (marcadas en el texto como :[variable])
 * @returns
 */
function transChoice(textKey, amount, variables) {
    var
    replacedText = __(textKey, variables),
    texts = replacedText.split('|'),
    selectedText = (amount > 1) ? texts[1] : texts[0];
    return selectedText;
}


function blueItem(itemHtml) {
    var newHtml =
        '<div class="blue-content-single-property">' +
            itemHtml +
        '</div>';
    return newHtml;
}

function createResumenItem(obj) {
    var
    title = obj.title,
    price = obj.price,
    tooltipHtml = obj.tooltipHtml,
    subtitle = obj.subtitle,
    important = obj.important,
    total = obj.total,
    discount = obj.discount,
    itemHtml,
    classes;

    classes = '';
    if (discount) classes += ' fixed-resumen-single-property-content-resumen-item-destaqued ';
    if (total) classes += ' fixed-resumen-single-property-content-resumen-item-total ';

    itemHtml =
        '<div class="fixed-resumen-single-property-content-resumen-item ' + classes + ' ">' +
            '<div class="fixed-resumen-single-property-content-resumen-item-left">' +
                '<h5 class="fixed-resumen-single-property-content-resumen-item-title">' +
                    (important ? '<b>' : '') +
                    title + ' ' + (tooltipHtml ? tooltipHtml : '')  +
                    (important ? '</b>' : '') +
                '</h5>' +
                (subtitle
                    ? '<p class="fixed-resumen-single-property-content-resumen-item-text">' + subtitle + '</p>'
                    : ''
                ) +
            '</div>' +
            '<div class="fixed-resumen-single-property-content-resumen-item-right">' +
                '<h5 class="fixed-resumen-single-property-content-resumen-item-title">' +
                    (important ? '<b>' : '') +
                    price +
                    (important ? '</b>' : '') +
                '</h5>' +
            '</div>' +
        '</div>';

    return itemHtml;
}

function createTooltip(title, important, content) {
    var
    listItems,
    tooltipContentHtml,
    tooltipHtml,
    hasList = Array.isArray(content);

    if (hasList) {
        listItems = ''
        for (var i = 0; i < content.length; i++) {
            var listItem = content[i];
            if (listItem.important) {
                listItems +=
                    '<li>' +
                        '<span><b>' + listItem.name + '</b></span>' +
                        '<span></span>' +
                        '<span><b>' + listItem.price + '</b></span>' +
                    '</li>';
            }
            else {
                listItems +=
                    '<li>' +
                        '<span>' + listItem.name + '</span>' +
                        '<span></span>' +
                        '<span>' + listItem.price + '</span>' +
                    '</li>';
            }
        }
    }

    tooltipContentHtml =
        (important
            ? '<h5><b>' + title + '</b></h5>'
            : title
        ) +
        (content
            ? (hasList
                ? '<ul>' + listItems + '</ul>'
                : content
            )
            : ''
        );

    tooltipHtml =
        '<svg ' + tooltipSvgAttributes + ' ' +
            'data-title="' + title + '" ' +
            'title="' + tooltipContentHtml + '"> ' +
            tooltipPaths +
        '</svg>';


    return tooltipHtml;
}



// TODO eliminar
function fillCalendarPopupContent(ordered, fromDate, toDate, people) {

    // ordered.byDate

    var
    card = '',
    cardIndex = 0;


    // card += '<div class="accordion accordion-meses-list" id="accordionExample">';

    for (var key in ordered.byDate) {
        var
        title = '',
        price = '',
        dateItems = ordered.byDate[key];

        if (key == ordered.firstPayDate) {
            title = __('js.to-pay-today');
            price = ordered.total;
        }
        else {
            title = __('js.to-pay-day', {'date':moment(key, HS_MAIN_DATE_FORMAT).format('D/M/YYYY')});
            price = dateItems[0].paym_amount;
        }

        if (dateItems[0].paym_concept == 'monthly') {
            title = __('js.to-pay-monthly', {'day':moment(key, HS_MAIN_DATE_FORMAT).format('D')});
            price = dateItems[0].paym_amount;
        }

        price = inCurrency(price, true);

        cardIndex++;

        card +=
            '<div class="card">' +
                '<div class="card-header" id="heading' + cardIndex + '">' +
                    '<h2 class="mb-0">' +
                        '<button class="btn btn-link btn-block text-left section-single-booking-calendar-pay-option collapsed" type="button" data-toggle="collapse" data-target="#collapse' + cardIndex + '" aria-expanded="false" aria-controls="collapse' + cardIndex + '">' +
                            '<div class="calendar-pay-option-box">' +
                                '<div class="card-header-calendar-pay">' +
                                    '<p class="text-custom-05">' + title + '</p><p class="text-custom-05">' + price + '</p>' +
                                '</div>' +
                            '</div>' +
                            '<img src="' + window.hcRoot + '/assets/img/arrow-calendar-pay.svg" alt="arrow-calendar-pay" class="arrow-calendar-pay">' +
                        '</button>' +
                    '</h2>' +
                '</div>' +

                '<div id="collapse' + cardIndex + '" class="collapse' + (cardIndex == 1 ? ' show' : '') + '" aria-labelledby="heading' + cardIndex + '" data-parent="#accordionExample">' +
                    '<div class="card-body">' +
                        '<div class="box-calendario-internal box-calendario-internal-active">';



        for (var i = 0; i < dateItems.length; i++) {
            var dateItem = dateItems[i];
            card +=
                '<div class="single-booking-box-discount section-booking-info2-item">' +
                    '<p class="section-booking-title text-custom-05">' +
                        dateItem.paym_concept +
                        // tooltip
                    '</p>' +
                    '<p class="section-booking-value text-custom-05">' +
                        inCurrency(dateItem.paym_amount, true) +
                    '</p>' +
                '</div>';
        } // for

        card +=
                        '</div>' +
                    '</div>' +
                '</div>' +
            '</div>';

    } // for in

    // card += '</div>';
    $('#accordionExample').html(card);

    // return card;
}



/**
 * Genera la URL con todos los settings de búsqueda en un
 *  string utilizando los datos definidos en todo el UI
 *
 * @param {string} baseUrl URL base de la página
 * @returns
 */
function generateSearchQuery(onlyTerms) {
    var
    city = getSearchParam('city'),
    terms = getFilterValue('terms'),
    baseUrl,
    query,
    newQuery,
    newQueryString;

    if (!onlyTerms) {
        if (!city) return null;

        query = {
            // Barra de búsqueda
            from : getSearchParam('from'),
            to : getSearchParam('to'),
            people : getSearchParam('people'),
            bedrooms : getSearchParam('bedrooms'),
            bathrooms : getSearchParam('bathrooms'),
            zone : getSearchParam('zone'),
            subzone : getSearchParam('subzone'),
            sort : getSearchParam('sort'),
            placetype : getSearchParam('placetype'),
            min : getSearchParam('min'),
            max : getSearchParam('max'),
            datetype : getSearchParam('datetype'),
            flexible : getSearchParam('flexible'),
            // Diálogo de filtros
            amenities : getFilterValue('amenities'),
            signature : getFilterValue('signature'),
            smartlock : getFilterValue('smartlock'),
            coliving : getFilterValue('coliving'),
            coworking : getFilterValue('coworking'),
            tolerance : getFilterValue('tolerance'),
            bymonth : getFilterValue('bymonth'),
            bestprice : getSearchParam('bestprice'),
            exactbedrooms : getSearchParam('exactbedrooms'),
            newest : null
        };
    }
    else {
        if (!terms || isEmptyText(terms)) return null;
        if (!city) city = 'madrid';
        query = {
            // Footer
            terms : getFilterValue('terms'),
        };
    }

    var placetype = getSearchParam('placetype');
    if (query.from && query.to && query.datetype == 'months' && query.from == query.to) {
        query.flexible = 1;
    }
    if(window.hcLang!='')
    {
        if(placetype!='livings')
            baseUrl = window.hcRoot + '/' + window.hcLang + '/apartamentos-lujo/' + city;
        else
            baseUrl = window.hcRoot + '/' + window.hcLang + '/livings/' + city;
    }
    else{
        if(placetype!='livings')
            baseUrl = window.hcRoot + '/luxury-apartments/' + city;
        else
            baseUrl = window.hcRoot + '/livings/' + city;
    }

    var datetype = getSearchParam('datetype')
    var from = getSearchParam('from');
    var to = getSearchParam('to');
    if (datetype === 'months' && from && to) {
        var diff = moment(to, HS_MAIN_DATE_FORMAT).diff(moment(from, HS_MAIN_DATE_FORMAT), 'days');
        if (diff < 30 && diff > 0) {
            query.datetype = 'days';
        }
    }

    newQuery = $.extend({}, query);
    removeNull(newQuery);
    newQueryString = (new URLSearchParams(newQuery)).toString();
    return baseUrl + '?' + newQueryString;
}



/**
 *
 * @returns Devuelve cuál es el tipo de fecha que está utilizando la UI
 */
function getDateTypeValue() {
    return getSearchParam('datetype');
}



/**
 * Devuelve cuál es el dato que está modificando el SPINNER DE DORMITORIOS/PERSONAS
 * @returns
 */
function getSpinnerMode() {
    if (getDateTypeValue() == 'days') return 'people';
    else return 'bedrooms';
}




/**
 * Cambia el valor de los inputs del SLIDER DE PRECIOS con el sufijo 'mes' en el lenguaje local
 */
function setSlidersInputs(currentSlider) {
    var dateType = getSearchParam('datetype');
    var
    $currentSlider = $(currentSlider),
    $otherSliders = $(''),
    suffix = dateType === 'days' ? __('js.day') : __('js.month'),
    minVal,
    maxVal;

    // si la función no fue enviada por un slider en específico, se utiliza el
    // primer slider que se encuentra como el slider del que se copiarán los valores
    if (!currentSlider) {
        $currentSlider = $rangeSliders.first();
        currentSlider = $currentSlider.get(0);
    }

    // se seleccionan los sliders a los que se copiarán los datos
    $rangeSliders.each(function(){
        if (this != currentSlider) {
            $otherSliders = $otherSliders.add(this);
        }
    });

    // se obtienen los datos y se pasan a la moneda
    minVal = $currentSlider.slider("values", 0);
    maxVal = $currentSlider.slider("values", 1);
    let lang = getCurrentLanguage();
    minValInCurrency = inCurrency(minVal,true,true, lang);
    maxValInCurrency = inCurrency(maxVal,true,true, lang);
    // se copian los datos a los elementos
    $minInput.val(minValInCurrency + '/' + suffix);
    $maxInput.val(maxValInCurrency + '/' + suffix);
    $otherSliders.slider('values', 0, minVal);
    $otherSliders.slider('values', 1, maxVal);
    $priceRangeButton.text(minValInCurrency + " - " + maxValInCurrency);


    setSearchParam('min', minVal);
    setSearchParam('max', maxVal);
}

/**
 * Llena el componente de dropdown dinámico con datos de un webservice y le agrega
 * el manejo de eventos al componente al seleccionar un elemento
 *
 * @param {string} dropdown El componente de dropdown que se llenará
 * @param {string} service El webservice que alimentará el componente
 * @param {function} action La función que se ejecutará al seleccionar un elemento del dropdown
 */
function setDropdown(dropdown, service, action) {
    var
    $dropdown = $getDropdownsByName(dropdown);
    $dropdown.data('action', action);
    $dropdown.data('clear')();

    $.ajax({
        url : service,
        success : function(data){
            if(data.items){
                if(dropdown == 'zone' || dropdown == 'subzone'){
                    if(getCurrentLanguage() === 'es')
                        allstring = "Todos";
                    else
                        allstring = "All";

                    data.items.unshift({id:0, name: allstring});
                }
                $dropdown.data('setItems')(
                    data.items
                );
                $dropdown.data('setTitle')(
                    data.items.length
                    ? __('js.all')
                    : __('js.all')
                );
            }
            addDropdownValueChange($dropdown, action);
        }
    });
}



function addDropdownValueChange($dropdown, action) {
    var name = $dropdown.data('dropdown');

    $dropdown.data('action', action);

    $dropdown.find('[data-value]').click(function(){
        var
        listItemData = setValue($(this));

        if ($dropdown.data('action')) $dropdown.data('action')(listItemData.value, listItemData.text, name);
        if ($dropdown.data('default-action')) $dropdown.data('default-action')(listItemData.value, listItemData.text, name);

        $dropdown.find(".login-info-contact-dropdown-label").addClass("active-item");
        $dropdown.find(".login-info-contact-dropdown-img").addClass("active-item");
        $dropdown.find(".dropdown-menu-button-custom").addClass("active-item");
    });

    function initAction() {
        if ($dropdown.data('started')) return;
        if ($dropdown.data('init-action')) $dropdown.data('init-action')(name);
        $dropdown.data('started', true);
    }

    function setValue($listItem) {
        if (!$listItem || !$listItem.length) return;

        var
        value = $listItem.data('value'),
        text = $listItem.text();

        $dropdown.data('value', value);
        $dropdown.find('p').text(text);
        return { value:value, text:text };
    }

    function $getListItemByValue(value) {
        return $dropdown.find('[data-value="' + value + '"]');
    }

    function checkForStartingValue() {
        var
        startingValue = $dropdown.data('starting-value');

        if (!startingValue || (startingValue == '')) return;

        setTimeout(function(){
            setValue($getListItemByValue(startingValue));
            $dropdown.data('starting-value', null);
            $dropdown.removeAttr('data-starting-value');

        },100);
    }

    $dropdown.data('setValue', function(value){
        setValue($getListItemByValue(value));
    });

    $dropdown.data('clear', function(){
        $dropdown.data('value', null);
        $dropdown.find('p').html(__('js.all'));
        $dropdown.find('.dropdown-menu').html('');
    });

    $dropdown.data('setTitle', function(title){
        $dropdown.find('p').html(title);
    });

    $dropdown.data('setItems', function(items){
        var html = '';
        if(items){
            for (var i = 0, total = items.length; i < total; i++) {
                html += '<a class="dropdown-item" href="javascript:;" data-value="' + items[i].id + '">' + items[i].name + '</a>';
            }
        }
        $dropdown.find('.dropdown-menu').html(html);

        checkForStartingValue();

        initAction();
    });
}



function setDropdownSelectedItem(dropdown, value) {

}


function getAvailability(id, from, to, people, success) {
    $.ajax({
        url : window.hcRoot + '/api/availability/' + id,
        data : {
            from : from,
            to : to,
            people : people
        },
        success : function(data){
            success(data);
        }
    });
}












/**
 * Vacía el contenido del dropdown
 * @param {string} dropdown el nombre del dropdown que se vaciara, definido por el atributo data-dropdown
 */
function clearDropdown(dropdown) {
    var
    $list = $getDropdownsByName(dropdown),
    $listTitle = $list.find('p'),
    $listContainer = $list.find('.dropdown-menu');

    $list.data('value', null);
    $listTitle.html(__('js.all'));
    $listContainer.html('');
}

function getCurrentLanguage() {
    return window.hcLang;
}

/**
 * Devuelve la cadena traducida correspondiente
 * @param {string} textKey la cadena original que hay que traducir o el key de la cadena con el que obtendrá la traducción
 * @returns la cadena traducida
 */
function __(textKey, variables) {
    var
    textLocalized = textKey,
    newString;

    if (window.hcLocalizedStrings && window.hcLocalizedStrings[textKey]) textLocalized = window.hcLocalizedStrings[textKey];

    if (textLocalized && ((typeof textLocalized) == 'string')) {
        newString = textLocalized;
    }
    else {
        newString = textKey;
    }

    if (variables) {
        for (var varName in variables) {
            newString = newString.replace(':' + varName, variables[varName]);
        }
    }
    return newString;
}


/**
 * Convierte el número a la divisa actual
 * @param {number} number el precio que hay que cambiar de divisa
 * @param {boolean} symbol si se va a devolver con los signos de moneda correspondientes
 * @returns el precio en la nueva divisa
 */
function inCurrency(number, symbol = true, round = false, language = 'es') {
    var
    currency = window.hcCurrency,
    rates =  window.hcRates,
    convertedNumber = Number(number) * rates[currency];
    const locale = language === 'es' ? 'es-ES' : 'en-US';
    if (symbol) {
        var
        numberText = convertedNumber.toLocaleString(
            locale,
            (round
                ? { minimumFractionDigits: 0, maximumFractionDigits: 0, useGrouping: true }
                : { minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: true }
            )
        );
        switch (currency) {
            case 'cad' : {
                return '$' + numberText + ' CAD';
            }
            case 'usd' : {
                return '$' + numberText + ' USD';
            }
            case 'eur' : {
                if (locale === 'en-US')
                    return '€' + numberText ;
                return numberText + ' €';
            }
        }
    }
    else {
        return convertedNumber;
    }
}








//===========================================================================
// CREACIÓN DE MAPAS GOOGLE MAPS
//===========================================================================

var mapSettings = {mapTypeControl:!1,gestureHandling:"greedy",zoom:14,styles:[{featureType:"water",elementType:"geometry.fill",stylers:[{color:"#d3d3d3"}]},{featureType:"transit",stylers:[{color:"#808080"},{visibility:"off"}]},{featureType:"road.highway",elementType:"geometry.stroke",stylers:[{visibility:"on"},{color:"#b3b3b3"}]},{featureType:"road.highway",elementType:"geometry.fill",stylers:[{color:"#ffffff"}]},{featureType:"road.local",elementType:"geometry.fill",stylers:[{visibility:"on"},{color:"#ffffff"},{weight:1.8}]},{featureType:"road.local",elementType:"geometry.stroke",stylers:[{color:"#d7d7d7"}]},{featureType:"poi",elementType:"geometry.fill",stylers:[{visibility:"on"},{color:"#ebebeb"}]},{featureType:"administrative",elementType:"geometry",stylers:[{color:"#a7a7a7"}]},{featureType:"road.arterial",elementType:"geometry.fill",stylers:[{color:"#ffffff"}]},{featureType:"road.arterial",elementType:"geometry.fill",stylers:[{color:"#ffffff"}]},{featureType:"landscape",elementType:"geometry.fill",stylers:[{visibility:"on"},{color:"#efefef"}]},{featureType:"road",elementType:"labels.text.fill",stylers:[{color:"#696969"}]},{featureType:"administrative",elementType:"labels.text.fill",stylers:[{visibility:"on"},{color:"#737373"}]},{featureType:"poi",elementType:"labels.icon",stylers:[{visibility:"off"}]},{featureType:"poi",elementType:"labels",stylers:[{visibility:"off"}]},{featureType:"road.arterial",elementType:"geometry.stroke",stylers:[{color:"#d6d6d6"}]},{featureType:"road",elementType:"labels.icon",stylers:[{visibility:"off"}]},{},{featureType:"poi",elementType:"geometry.fill",stylers:[{color:"#dadada"}]}]};

/**
 * Inicializa el mapa que aparece en la vista SINGLE/DETALLE
 */
 function initDetailsMap() {
    var
    map,
    marker,
    pos = new google.maps.LatLng(window.lat, window.lng);
    bounds = new google.maps.LatLngBounds(),
    iconBase = window.hcRoot + '/assets/img/icon-marker-home.svg';

    mapSettings.mapTypeId = google.maps.MapTypeId.ROADMAP;
    mapSettings.gestureHandling = "auto";
    mapSettings.fullscreenControl = false;
    mapSettings.streetViewControl = false;
    mapSettings.center = pos;

    map = new google.maps.Map(document.getElementById("map-single"), mapSettings);

    bounds.extend(pos);
    marker = new google.maps.Marker({
        position: pos,
        map: map,
        icon: iconBase,
        index: 0
    });
}

function initOfficesMap() {
    var
    markers = [],
    map,
    index = 0,
    infoWindow = new google.maps.InfoWindow(),
    bounds = new google.maps.LatLngBounds();

    mapSettings.mapTypeId = google.maps.MapTypeId.ROADMAP;
    mapSettings.disableDefaultUI = true;
    map = new google.maps.Map(document.getElementById('map'), mapSettings);

    $('.map-markers').each(function(){
        var
        $this = $(this),
        position = new google.maps.LatLng($this.data('lat'), $this.data('lon')),
        contentId = '#' + $this.attr('id'),
        marker = new google.maps.Marker({
            position: position,
            map: map,
            icon: {
                url: $this.data('icon'),
                scaledSize: new google.maps.Size(
                    $this.data('icon-width') / 2,
                    $this.data('icon-height') / 2,
                ),
            },
            index: index++,
            id: $this.data('id'),
        });

        markers.push(marker);
        bounds.extend(position);

        // Al click de cada marcador
        google.maps.event.addListener(marker, 'click', function(event){
            // se cambia el contenido del info window y se muestra
            infoWindow.setContent($(contentId).html());
            infoWindow.open(map, marker);
        });
    });

    map.fitBounds(bounds);
}


/**
 * Inicializa el mapa que aparece en las páginas de los LISTADOS
 */
function initListingMap() {
    var
    markers = [],
    map,
    index = 0,
    infoWindow = new google.maps.InfoWindow(),
    bounds = new google.maps.LatLngBounds();

    mapSettings.mapTypeId = google.maps.MapTypeId.ROADMAP;
    mapSettings.disableDefaultUI = true; //($window.width() < 991);
    map = new google.maps.Map(document.getElementById('map'), mapSettings);

    $('.map-markers').each(function(){
        var
        $this = $(this),
        position = new google.maps.LatLng($this.data('lat'), $this.data('lon')),
        contentId = '#' + $this.attr('id'),
        marker = new google.maps.Marker({
            position: position,
            map: map,
            icon: $this.data('icon'),
            label: {
                text: $this.data('title'),
                className: $this.data('class') + ' marker-label' + index
            },
            index: index++,
            id: $this.data('id'),
        });

        markers.push(marker);
        bounds.extend(position);

        // Al click de cada marcador
        google.maps.event.addListener(marker, 'click', function(event){
            // se cambia el contenido del info window y se muestra
            infoWindow.setContent($(contentId).html());
            infoWindow.open(map, marker);

            // Se cambia el estilo del marcador seleccionado
            setSelectedMarker(marker);

            // si el marcador pertenece a un listado de propiedades multiples se agrega una clase al mapa
            if (marker.label.className.includes('marker-label-multi')) {
                $('.gm-style').addClass('gm-style-iw-a-multi');
            }
            else {
                $('.gm-style').removeClass('gm-style-iw-a-multi');
            }

            // se marca como activo el link correspondiente a la propiedad en el swiper mobile
            $('.link-map-main').removeClass("active")
            $(".link-map-main[data-index='" + this.index + "']").addClass("active");

            animateScroll($('#item-' + this.id));

            setSelectedSlide('map-item-' + this.id);
        });
    });

    var
    mapSwiper = $('.swiper-map-items').data('swiper');

    mapSwiper.on('activeIndexChange', function(){
        var
        $currentSlide = $(mapSwiper.slides[mapSwiper.activeIndex]);

        animateMapZoomTo(map, 15);
        map.panTo(new google.maps.LatLng(
            $currentSlide.data('lat'),
            $currentSlide.data('lon')
        ));
        setSelectedMarker(
            findMarkerById($currentSlide.data('id'))
        );
    });

    function setSelectedSlide(slideId) {
        var slideIndex;
        for (var i = 0; i < mapSwiper.slides.length; i++) {
            if ($(mapSwiper.slides[i]).attr('id') == slideId) {
                slideIndex = i;
                break;
            }
        }
        mapSwiper.slideTo(slideIndex);
    }

    function setSelectedMarker(marker) {
        // se le quita el status de activo a los demás marcadores
        markers.forEach(element => {
            element.setLabel({
                className: element.label.className.replace('active', ' '),
                text: element.label.text
            });
        });

        // se marca como activo el marcador clickeado
        marker.setLabel({
            className: marker.label.className + ' active',
            text: marker.label.text
        });
    }

    function findMarkerById(id) {
        var foundMarker;
        for (var marker of markers) {
            if (marker.id == id) {
                foundMarker = marker;
                break;
            }
        }
        return foundMarker;
    }

    map.fitBounds(bounds);
}

/**
 * https://stackoverflow.com/questions/4752340/how-to-zoom-in-smoothly-on-a-marker-in-google-maps
 * @param {*} map
 * @param {*} targetZoom
 */
function animateMapZoomTo(map, targetZoom) {
    var currentZoom = arguments[2] || map.getZoom();
    if (currentZoom != targetZoom) {
        google.maps.event.addListenerOnce(map, 'zoom_changed', function (event) {
            animateMapZoomTo(map, targetZoom, currentZoom + (targetZoom > currentZoom ? 1 : -1));
        });
        setTimeout(function(){ map.setZoom(currentZoom) }, 80);
    }
}

var
$sectionHeader = $('.section-header'),
$searchFiltersBar = $('.section-listado-custom-sticky');

function getHeadersOffset() {
    var
    offset = $sectionHeader.outerHeight();
    if ($searchFiltersBar.length) offset += $searchFiltersBar.outerHeight();
    return offset;
}

/**
 * Scrollea el body a la posisión del elemento utilizando una animación
 */
function animateScroll($element) {
    var
    newTop = $element.offset().top - getHeadersOffset();
    $('html,body').animate({ scrollTop: newTop }, 1000);
}







clickOutsideListeners.push({
	$container : $searchModals,
	action : hideAllSearchBarDropdowns
});

function hideAllSearchBarDropdowns() {
	deactivateAllSearchBarItems();
	$searchModals.fadeOut(HS_MODAL_ANIMATION_SPEED).removeClass("active");
}

function deactivateSearchBarItem($item) {
	$item.removeClass("active").parents('.hs-list-bar').removeClass('active');
	$searchModalsLightbox.fadeOut(HS_MODAL_ANIMATION_SPEED);
}

function deactivateAllSearchBarItems() {
	$searchTabsButtons.removeClass("active").parents('.hs-list-bar').removeClass('active');
}

function activateSearchBarItem($item) {
	var $target = $($item.attr("data-target"));
	deactivateAllSearchBarItems();
	$item.addClass("active").parents('.hs-list-bar').addClass('active');
	$target.fadeIn(HS_MODAL_ANIMATION_SPEED);
	$searchModalsLightbox.fadeIn(HS_MODAL_ANIMATION_SPEED);
	setPosition($item, $target);
}

function setPosition($item, $target) {
	var
	target = $item.data('target'),
	calledFromBanner = $item.parents('.section-banner-barra').length,
	calledFromHeaderMenu = $item.parents('.section-header').length,
	calledFromFiltersMenu = $item.parents('.section-listado-custom-sticky-content').length,
	isSpinner = target == '#barra-dormitorios-box',
	isPanel = !isSpinner;

	resetTargetCSS($target);


	if (calledFromBanner) {
		var newTop = getOffset($('.section-banner-barra')[0]).top - 20;
		if (isPanel) {
			$target
				.css({
					'position' : 'absolute',
					'left' : '50%',
					'transform' : 'translate(-50%, -100%)',
					'top' : newTop
				});
		}
		if (isSpinner) {
			$target
				.css({
					'position' : 'absolute',
					'transform' : 'translate(-50%, -100%)',
					'top' : newTop
				})
				.attr('data-reference', '.section-banner-barra [data-target="' + $item.data('target') + '"]')
				.attr('data-centered', 'true');
		}
        $target.attr('data-caller', '.section-banner-barra');

	}
	if (calledFromHeaderMenu) {
		$target
			.css({
				'position' : 'fixed',
				'top' : $('.section-header').position().top + 20 + $('.section-header').height()
			})
			.attr('data-reference', '.section-header [data-target="' + $item.data('target') + '"]')
            .attr('data-caller', '.section-header');

		if (isSpinner) {
			$target
				.css({
					'transform' : 'translate(-50%, 0)',
				})
				.attr('data-centered', 'true');
		}
	}
    if (calledFromFiltersMenu) {
        var newTop = $('.section-listado-custom-sticky-content').get(0).getBoundingClientRect().y;
        $target
        .css({
            'position' : 'fixed',
            'top' : newTop + 20 + $('.section-listado-custom-sticky-content').height()
        })
        .attr('data-reference', '.section-listado-custom-sticky-content [data-target="' + $item.data('target') + '"]')
        .attr('data-caller', '.section-listado-custom-sticky-content');

        if (isSpinner) {
            $target
                .css({
                    'transform' : 'translate(-50%, 0)',
                })
                .attr('data-centered', 'true');
        }
    }

	setItemsLeftToReference();
}

//===========================================================================
// BOTONES DE SIGUIENTE EN LOS DROPDOWNS DE SELECCIÓN DE BÚSQUEDA
//===========================================================================

$('.modal-box-banner [data-next-dropdown]').click(function(){
    var $button = $(this);
    navigateToNextDropdown($button, $button.data('next-dropdown'));
});

$('.card-modal-filtro [data-next-dropdown]').click(function(){
    var $button = $(this);
    navigateToNextCard($button.data('next-dropdown'));
});


function navigateToNextDropdown($callerItem, nextDropdown) {
    $("#barra-fecha-box").fadeOut();
  //  $(".hs-button-date").fadeOut().removeClass("active");
    $(".hs-button-date-2").fadeOut().removeClass("active");
    deactivateAllSearchBarItems();
    var
    nextDropdownButtonSelector =
        $callerItem.parents('.modal-box-banner').attr('data-caller') +
        ' ' +
        nextDropdown;

    $(nextDropdownButtonSelector).trigger('click');
}

function navigateToNextCard(nextCard) {
    var
    nextCardButtonSelector =
        '.card-modal-filtro' +
        ' ' +
        nextCard;

    $(nextCardButtonSelector).trigger('click');
}


/**
 * Elimina estilos de los dropdowns de selección de fechas/destinos/dormitorios
 * @param {*} $target
 */
function resetTargetCSS($target) {
	$target
		.css({
			'position' : '',
			'left' : '',
			'transform' : '',
			'top' : ''
		})
		.removeAttr('data-reference')
		.removeAttr('data-centered')
        .removeAttr('data-caller');
}

/**
 * Alinea el dropdown a su botón correspondiente.
 * Esta función también se ejecuta en el resize para que el dropdown siempre se encentre alineado
 */
function setItemsLeftToReference() {
	$('[data-reference]').each(function(){
		var
		$this = $(this),
		$reference = $($this.attr('data-reference')),
		isCentered = $this.attr('data-centered') == 'true';

		$this.css({
			'left' : getOffset($reference[0]).left + (isCentered ? $reference[0].offsetWidth / 2 : 0)
		});
	});
}

// function setHeaderFiltersVisibility() {

//     if (!$firstSection.length) return;

// 	var
// 	firstSectionPositionTop = $firstSection.offset().top - $menuHeader.height();

// 	if ($window.scrollTop() > firstSectionPositionTop) {
// 		$menuHeader.addClass('active-filters');
// 	}
// 	else {
// 		$menuHeader.removeClass('active-filters');
// 	}
// }
function setHeaderFiltersVisibility() {

    if (!$firstSection.length) return;

	var
	firstSectionPositionTop = $firstSection.offset().top - $menuHeader.height();

	if ($window.scrollTop() > firstSectionPositionTop) {
		$menuHeader.addClass('active-filters');
		$('main.section-page-all-content').addClass('scrolled');
	}
	else {
		$menuHeader.removeClass('active-filters');
		$('#barra-destino-box').removeClass('scrolled');
		$('main.section-page-all-content').removeClass('scrolled');
        $(".modal-box-banner").css("display", "none");
	}
}

$window
.resize(function(){
    resetLayout();
})
.scroll(function(){
	setHeaderFiltersVisibility();
});

$(document).mouseup(function(event) {
	$.each(clickOutsideListeners, function(index, item){
		var
		$container = item.$container,
		action = item.action;

		if (!$container.is(event.target) && $container.has(event.target).length === 0) {
			action();
		}
	});
});

function resetLayout() {
	setItemsLeftToReference();
    syncHeights();
    // balanceText($('.hs-title'));
}


/**
 * Sincroniza la altura de dos elementos html aunque se encuentren dentro de distintos
 * contenedores.
 */
function syncHeights() {
    var
    $items = $('[data-resize-item]');

    $items.each(function(){
        var
        $this = $(this),
        $subordinate = $($this.data('resize-item'));
        $subordinate.css('min-height', $this.height() + 'px');
    });
}



function getOffset(el) {
	const rect = el.getBoundingClientRect();
	return {
		left: rect.left + window.scrollX,
		top: rect.top + window.scrollY
	};
}





// Botones del header para abrir modals

$searchTabsButtons.click(function (event) {
	event.preventDefault();
    // let isMobile = deviceType === 'mobile' ? true : false;
    let isMobile = (deviceType === 'mobile' || deviceType === 'tablet') ? true : false;


	var
	$this = $(this),
	tabIsInFloatedBlock = $this.parents('.in-floated').length,
    tabIsInListingAndMobile =
        $this.parents('.section-listado-custom-sticky').length && isMobile;
        // window.matchMedia('(max-width: 991px)').matches;

    // console.log('Device: ' + deviceType);
	// if (tabIsInFloatedBlock || tabIsInListingAndMobile) { // || // si el click viene del menú flotado, se abre el diálogo para mobile
	if (isMobile) {
        $searchWindowModal.addClass('active');
		return;
	}

	hideAllSearchBarDropdowns();

	if ($this.hasClass('active')) {
		deactivateSearchBarItem($this);
	}
	else {
        if ($this.hasClass('hs-button-date') ) {
            setMinDays()
            const city = getSearchParam('city')
            const dateType = getSearchParam('datetype');
            if (!city) {
                $(this).parents('ul').find(".hs-button-destination").trigger('click');
            } else if (!dateType) {
                $(this).parents('ul').find(".hs-button-datetype").trigger('click');
            }
            else {
                activateSearchBarItem($this);
                const dateType = getSearchParam('datetype');
                if (dateType === 'days') {
                    $('#date-day').click();
                    $('#date-day-mobile').click();
                } else {
                    $('#date-month').click();
                    $('#date-month-mobile').click();
                }
                const to = getSearchParam('to')
                if (!to) {
                    $('#clear-dates-month').click()
                    $('#clear-dates-days').click()
                }
            }
        }
       else if($this.hasClass('hs-button-date-2')){
            setMinDays()
            activateSearchBarItem($this);
            openCalendarForSinglePageEnd(event)
        }else if ($this.hasClass('hs-button-date-2')) {

        } else {
            activateSearchBarItem($this);
        }
	}
});



//===========================================================================
// GUARDADO DE PARÁMETROS DE BÚSQUEDA
//===========================================================================

function setSearchDateType(dateType) {
    setSearchParam('datetype', dateType);
}

function setSearchDate(startDate, endDate) {
    if (startDate) setSearchParam('from', startDate);
    if (endDate) setSearchParam('to', endDate);
}

function setSearchSort(sort) {
    setSearchParam('sort',sort);
}

function setSearchCity(city, text) {
    if (!text) text = __('js.add-destination');
    setSearchParam('city', city);
    setMenuButtonDestinationText(text)
    setSearchParam('zone', '');
    setSearchParam('subzone', '');
}

function setSearchFlexible(flexible) {
    setSearchParam('flexible', flexible);
}

function setSearchType(type, text) {
    if (!text) text = __('js.add-housing');
    setSearchParam('placetype', type);
    setMenuButtonTypeText(text)
}

function setSearchDatetype(type, text, isListing = false) {
    let largeText
    if (!text) {
        text = __('js.duration');
        if (!isListing) {
            largeText = __('js.duration-large');
        }
    }
    setSearchParam('datetype', type);
    setDatetypeButtonTypeText(text, largeText)
}

function setSearchOrder(type, text) {
    setSearchParam('sort', type);
    setOrderButtonTypeText(text)

}

function setMinDays(days) {
    const type = getSearchParam('datetype');
    if (type) {
        for (var i = 0; i < allCalendars.length; i++) {
            var calendar = getDateRangePicker(allCalendars[i]);
            if (calendar) {
                if (days) {
                    calendar.setMinDays(days);
                }else if (type === 'days') {
                    calendar.setMinDays(3);
                } else {
                    const city = getSearchParam('city')
                    if (city === 'barcelona') {
                        calendar.setMinDays(33);
                    } else {
                        calendar.setMinDays(31);
                    }
                }
            }
        }
    }
}

function setSearchParam(param, value) {
    var $input = $getSearchFormInput(param);
    $input
        .attr('value', value)
        .val(value);
}
function getSearchParam(param) {
    var
    $input = $getSearchFormInput(param),
    value = $getSearchFormInput(param).val(),
    type = $input.data('type');

    if(param == 'bedrooms' && value == 0)
        return value;

    switch (type) {
        case 'integer' : {
            value = parseInt(value);
            if ((!value) || isNaN(value)) value = null;
            break;
        }
        case 'date' :
        case 'string' : {
            if (value == '') value = null;
            break;
        }
        case 'boolean' : {
            value = parseInt(value);
            if ((value != 1) || isNaN(value)) value = null;
            break;
        }
        case 'number' : {
            value = Number(value);
            if ((!value) || isNaN(value)) value = null;
            break;
        }
    }

    return value;
}

function getSearchParams() {
    var params = {};
    $('#hs-search-settings input').each(function(){
        var
        $this = $(this),
        paramName = $this.attr('name').split('-')[1],
        paramValue = $this.val();
        params[paramName] = paramValue;
    });
    return params;
}

function $getSearchFormInput(param) {
    return $formSearchSettings.find('[name="search-' + param + '"]');
}
function $getFoundFormInput(info) {
    return $formSearchSettings.find('[name="found-' + info + '"]');
}

function getFilterValue(filter) {
    switch (filter) {
        case 'amenities' : {
            var amenities = [];
            $('input[name="features"]:checked').each(function(){
                var value = $(this).val();
                if ((value != '') && (value != 'on')) amenities.push(value);
            });
            return amenities.length ? amenities.join(',') : null;
        }
        case 'tolerance' : {
            var value = $('[name="item-tab-group-01"]:checked').val();
            return (value != '') ? value : null;
        }
        case 'terms' : {
            return $('.footer-input-search').val();
        }
        case 'signature' : {
            return $('[name="signature"]').is(':checked') ? 1 : null;
        }
        case 'smartlock' : {
            return $('[name="smartlock"]').is(':checked') ? 1 : null;
        }
        case 'coliving' : {
            return $('[name="coliving"]').is(':checked') ? 1 : null;
        }
        case 'coworking' : {
            return $('[name="coworking"]').is(':checked') ? 1 : null;
        }
        case 'bymonth' : {
            return $('[name="precio-mes"]').is(':checked') ? 1 : null;
        }

    }
}

function getFoundInfo(param) {
    $getFoundFormInput(param).val();
    return $getFoundFormInput(param).val();
}


function removeNull(obj) {
    return Object.keys(obj).forEach((k) => obj[k] == null && delete obj[k]);
}

//===========================================================================
// CAMBIO DE TEXTOS DE MENUS
//===========================================================================

/**
 * Pinta el texto de la ciudad actual en los botones de navegación y en el popup de búsqueda
 * @param {*} text
 */
function setMenuButtonDestinationText(text) {
    $buttonDestination.text(text);
    $labelMobileDestination.text(text);
    $buttonDestinationSmall.text(text);
}

/**
 * Pinta el texto del tipo de vivienda actual en los botones de navegación y en el popup de búsqueda
 * @param {*} text
 */
function setMenuButtonTypeText(text) {
    $buttonType.text(text);
    $labelMobileType.text(text);
}

function setOrderButtonTypeText(text) {
    $buttonType.text(text);
    $labelMobileOrder.text(text);
}

function setDatetypeButtonTypeText(text, largeText) {
    if (largeText) {
        $buttonDuration.text(largeText);
    } else {
        $buttonDuration.text(text);
    }
    $buttonDurationSmall.text(text);
    $labelMobileDatetype.text(text);
}
/**
 * Pinta el rango de fechas en los botones de navegación y en el popup de búsqueda
 * @param {*} startDate
 * @param {*} endDate
 */
function setMenuButtonDateText(startDate, endDate, dateType) {

    setDateInputTextAndValue($dateStart, startDate, HS_DISPLAY_DATE_FORMAT);
    if (!startDate) {
        if ($buttonDate.parents('.gfw-listing-page').length > 0) {
            $buttonDate.html(__('js.entry'));
        } else {
            $buttonDate.html(__('js.entry-home'));
        }
        $labelMobileDate.html(__('js.add-dates'));
        $buttonDateSmall.html(__('js.entry'));
    }
    if (!endDate) {
        if ($buttonDate2.parents('.gfw-listing-page').length > 0) {
            $buttonDate2.html(__('js.exit'));
        } else {
            $buttonDate2.html(__('js.exit-home'));
        }
        $labelMobileDate.html(__('js.add-dates'));
        $buttonDate2Small.html(__('js.exit'));
    }
    if (!startDate && !endDate) {
        return
    }

    var
        startDateFormatted = moment(startDate).format(HS_DISPLAY_LONG_DATE_FORMAT),
        endDateFormatted;
    if (endDate) {

        if (isFlexible(endDate, startDate, dateType)) {
            endDateFormatted = __('js.flexible');
            $dateEnd.val(__('js.flexible'));
        } else {
            endDateFormatted = moment(endDate).format(HS_DISPLAY_LONG_DATE_FORMAT);
            setDateInputTextAndValue($dateEnd, endDate, HS_DISPLAY_DATE_FORMAT);
        }
    }

    // br class="d-lg-none"
    if (startDateFormatted) {
    $buttonDate.html(
        '<div class="text-capitalize hs-lh-1">' +
        startDateFormatted +
        '</div>'
    );
        $labelMobileDate.html(
            '<span class="text-capitalize">' +
            startDateFormatted +
            '</span>'
        );
        $buttonDateSmall.html(
            '<span class="text-capitalize">' +
            startDateFormatted +

            '</span>'
        );
}
    if (endDateFormatted) {

    $buttonDate2.html(
        '<div class="text-capitalize hs-lh-1">' +
        endDateFormatted
        +
        '</div>'
    );

        $buttonDate2Small.html(
            '<span class="text-capitalize">' +
            endDateFormatted +
            '</span>'
        );
}
if (startDateFormatted && endDateFormatted) {
    $labelMobileDate.html(
        '<span class="text-capitalize">' +
        startDateFormatted +
        (endDate
                ? (' - ' + endDateFormatted)
                : ''
        ) +
        '</span>'
    );
}




                // Actualizando text fields de single



}








//===========================================================================
// CALENDARIOS
//===========================================================================

/**
 * Formatea un rango de fechas con su separador
 * @param {*} startDate
 * @param {*} endDate
 * @param {*} separator
 * @returns
 */
function formatCompleteDate(startDate, endDate, separator) {
    var
    dateString = (
        (startDate
            ? moment(startDate).format(HS_DISPLAY_COMPLETE_DATE_FORMAT)
            : ''
        ) +
        (endDate
            ? (separator + moment(endDate).format(HS_DISPLAY_COMPLETE_DATE_FORMAT))
            : ''
        )
    );
    return dateString;
}

/**
 * Le agrega al input la fecha formateada y guarda la fecha con el formato general
 * en una propiedad data del tag. Esta última es la fecha que se utiliza en JS
 * cuando hay que procesarla
 * @param {*} $input
 * @param {*} date
 * @param {*} format
 */
function setDateInputTextAndValue($input, date, format) {
    if (!$input.length) return;
    if (date) {
        $input
        .val(moment(date).format(format))
        .attr('data-value', moment(date).format(HS_MAIN_DATE_FORMAT));
    }
    else {
        $input
        .val('')
        .attr('data-value', '');
    }
}

/**
 * Devuelve la instancia creada del dateRangePicker del objeto calendarSettingsObject proporcionado
 * @param {*} calendarSettingsObject
 * @returns
 */
function getDateRangePicker(calendarSettingsObject) {

    return calendarSettingsObject.$tab.data('dateRangePicker');
}

/**
 * Reinicializa la selección de fecha del dateRangePicker utilizando la fecha inicial seleccionada
 * @param {*} calendarSettingsObject
 */
function resetDatePickingWithFirstDate(calendarSettingsObject) {
    // return; // TODO Revisar resert picking date
    var
    startDate = calendarSettingsObject.$startInput.attr('data-value');
    setDates(
        getDateRangePicker(calendarSettingsObject),
        startDate
    );
}

/**
 * Define el rango de fechas como una fecha flexible
 * @param {*} calendarSettingsObject
 */
function setFlexibleDate(calendarSettingsObject) {
    // return;
    var
    startDate = calendarSettingsObject.$startInput.attr('data-value');
    const dateRangePicker = getDateRangePicker(calendarSettingsObject);
    dateRangePicker.setMinDays(0);
    getDateRangePicker(calendarSettingsObject).setEnd(startDate);
    setDateInputTextAndValue(calendarSettingsObject.$endInput, null);
    calendarSettingsObject.$endInput.val(__('js.flexible'));
    setSearchDate(startDate, null);

}

/**
 * Vacía todas las fechas de los calendarios y coloca el texto default
 */
function clearDates() {
    $('#minimum-stay').addClass('d-none')
    $('#optimal-price-alert').hide()
    __allowCalendarAutoDropdown = false;
    for (var i = 0; i < allCalendars.length; i++) {
        var calendar = getDateRangePicker(allCalendars[i]);
        if (calendar)  { calendar.clear();
            calendar.resetMonthsView()
            $('.prev').each(function(){
                $(this).click()
            })
            }
    }
    $('[data-next-dropdown=".hs-button-people"]').attr('disabled', 'disabled');
    setMenuButtonDateText(null);
    setSearchFlexible(0);
    setSearchDate(null, null);
    __allowCalendarAutoDropdown = true;
    $('#first_day_available').removeClass('d-none')
}

/**
 * Esta funcion permite cambiar los valores del calendario sin que dispare la apertura del siguiente dropdown
 * @param {*} dateRangePicker
 * @param {*} fromDate
 * @param {*} toDate
 */
function setDates(dateRangePicker, fromDate, toDate) {
    __allowCalendarAutoDropdown = false;
    if (fromDate) {
        dateRangePicker.setStart(fromDate);
    }
    if (toDate) {
        dateRangePicker.setEnd(toDate);
    }
    updateLabels();
    __allowCalendarAutoDropdown = true;
}

// ????????????????????????????????????????????????????????????????????????????????????????????????
// ????????????????????????????????????????????????????????????????????????????????????????????????
// ????????????????????????????????????????????????????????????????????????????????????????????????

/**
 * Crea una instancia del componente dateRangePicker utilizando las opciones
 * que se le mandan (componentes, inputs a los que estará ligado, listeners, etc.)
 * @param {object} calendarOptions
 */
function createCalendar(calendarOptions) {

    if (calendarOptions.$tab.length) {
        calendarOptions.$tab.data('settings', calendarOptions);
        var defaultDate = null;
        var todayStringDate = moment().format(HS_MAIN_DATE_FORMAT);
        calendarOptions.$tab
        .dateRangePicker({
            // separator: ' a ',
            language: getCurrentLanguage(),
            customArrowPrevSymbol: HS_CUSTOM_PREV_ARROW,
            customArrowNextSymbol: HS_CUSTOM_NEXT_ARROW,
            startOfWeek: HS_START_OF_WEEK,
            inline: true,
            singleMonth: false,
            container: calendarOptions.containerSelector,
            alwaysOpen: true,
            selectForward: true,
            beforeShowDay: function(t) {
                var availablePeriods = window.availablePeriods

                    if (availablePeriods && !availablePeriods.success) {
                        return [ false, '', '' ];
                    }

                if (availablePeriods && availablePeriods.success) {
                    let available = false;
                    for (let i = 0; i < availablePeriods.seasonal_periods.length; i++) {
                        const fromDate = new Date(`${availablePeriods.seasonal_periods[i].psp_from}T00:00:00`);
                        const toDate = new Date(`${availablePeriods.seasonal_periods[i].psp_to}T00:00:00`);
                        toDate.setDate(toDate.getDate() + 1);

                        fromDate.setHours(0, 0, 0, 0);
                        toDate.setHours(0, 0, 0, 0);
                        t.setHours(0, 0, 0, 0);

                        if (t >= fromDate && t <= toDate) {
                            available = true;
                            break;
                        }
                    }
                    if (!available) {
                        return [false, '', ''];
                    }

                }
                var notAvailable = window.notAvailableDays?.notAvailable;
                if (!notAvailable) return [true, '',''];
                var valid = true

                var tFormatted = t.toISOString().split('T')[0];

                for (var i = 0; i < notAvailable.length; i++) {
                    if (tFormatted >= notAvailable[i].startDate && tFormatted <= notAvailable[i].endDate) {
                        valid = false;
                        break;
                    }
                }

                var _class = '';
                return [valid,_class,''];
            },
            singleDate: calendarOptions.singleDate,
            startDate: todayStringDate,
            stickyMonths: true,
            hoveringTooltip: function(days, startTime, hoveringTime)
            {
               if(window.hcLang!=='')
                    return days > 1 ? days-1 + ' ' + 'noches' : '';
                else
                    return days > 1 ? days-1 + ' ' + 'nights' : '';
            },

            setValue: function (s, startDate, endDate) {
                if (!calendarOptions.calendarStarted) return;

                // Si el calendario es para solo fecha de inicio, se cambia endDate a null,
                // ya que el componente devuelve la fecha final con una cadena "Fecha inválida" (según el idioma en el que esté)
                if (calendarOptions.singleDate) endDate = null;

                // Actualizando text fields de componente
                setDateInputTextAndValue(calendarOptions.$startInput, startDate, HS_DISPLAY_DATE_FORMAT);
                setDateInputTextAndValue(calendarOptions.$endInput, endDate, HS_DISPLAY_DATE_FORMAT);

                // Únicamente se realizan las siguientes acciones si no se está vaciando el calendario
                if (startDate != null) {
                    // Se guardan las fechs en los search-settings
                    if (calendarOptions.singleDate) {
                        if (startDate) setSearchDate(startDate);
                    }
                    else {
                        if (startDate && endDate) setSearchDate(startDate, endDate);
                    }

                    // Se guarda el tipo de fecha en los search-settings (dias/meses/años)
                    setSearchDateType(calendarOptions.dateType);

                    // Llamada a callback en window para agregar otras funciones de manera externa a este JS
                    if (window.handleCalendar) window.handleCalendar(startDate, endDate);

                    // Se guarda si la fecha es flexible en los search-settings
                    setSearchFlexible(isFlexible(startDate, endDate, calendarOptions.dateType));

                    // Se actualiza el texto del botón de fechas para que indique la fecha actual
                    setMenuButtonDateText(startDate, endDate, calendarOptions.dateType);
                }

                $(".overlay-modal-box-banner").trigger('click');

                // Se navega automáticamente al siguiente dropdown
                if (__allowCalendarAutoDropdown) {
                    switch (calendarOptions.named) {
                        case 'calDays' :
                        case 'calMonths' :
                        case 'calYears' :
                            if (!window.hcDisableAutomaticDropDowns) navigateToNextDropdown(calendarOptions.$startInput, '.hs-button-people');
                            break;
                        case 'calDaysMobile' :
                        case 'calMonthsMobile' :
                        case 'calYearsMobile' :
                            if (!window.hcDisableAutomaticDropDowns) navigateToNextCard('.hs-button-people');
                            break;
                    }

                }

                // Se desbloquea el botón de siguiente (si es que está habilitado)
                $('[data-next-dropdown=".hs-button-people"]').removeAttr('disabled');
            }
        })
        .bind(
            'datepicker-first-date-selected',
            function(event, obj) {
                var startDate = moment(obj.date1).format(HS_MAIN_DATE_FORMAT);
                // cambiamos las clases de los botones tras seleccionar la primera fecha
                $('.hs-list-bar li a.hs-fs-xs-static.link-open-box-modal.hs-button-date.d-flex.align-items-center.active').removeClass('active');
                $('.hs-list-bar li.hs-last-child a').addClass('active');

                if (window.availablePeriods && window.availablePeriods.success && window.availablePeriods.seasonal_periods) {
                    const start = moment(startDate, 'YYYY-MM-DD');
                    $('#minimum-stay').removeClass('d-none');
                    for (const period of window.availablePeriods.seasonal_periods) {
                        const from = moment(period.psp_from, 'YYYY-MM-DD');
                        const to = moment(period.psp_to, 'YYYY-MM-DD');
                        if (start.isBetween(from, to, null, '[]')) {
                            let minimumStayDays;
                            $('#minimum-stay-qnt').text( period.psp_minimum_saty + ' ' + transChoice('js.months', +period.psp_minimum_saty));
                            if (period.psp_type_minimum_stay === 'month') {
                                if (start.date() === 1) {
                                    const end = moment(start).add(period.psp_minimum_saty, 'months');
                                    minimumStayDays = end.diff(start, 'days');
                                } else {
                                    const end = moment(start).add(period.psp_minimum_saty, 'months');
                                    minimumStayDays = end.diff(start, 'days') + 1;
                                }
                            } else {
                                $('#minimum-stay-qnt').text( parseInt(period.psp_minimum_saty, 10)  + ' ' + transChoice('js.nights', +period.psp_minimum_saty));

                                minimumStayDays = parseInt(period.psp_minimum_saty, 10) + 1;
                            }
                            setMinDays(minimumStayDays);
                        }
                    }
                }
                $('[data-next-dropdown=".hs-button-people"]').attr('disabled', 'disabled');
                setDateInputTextAndValue(calendarOptions.$startInput, startDate, HS_DISPLAY_DATE_FORMAT);
                setDateInputTextAndValue($dateStart, startDate, HS_DISPLAY_DATE_FORMAT);
                setDateInputTextAndValue($dateEnd, null, HS_DISPLAY_DATE_FORMAT);
                setSearchDate(startDate, null);
                setSearchParam('to', null);
                const month1 = moment(obj.date1);
                if (month1 && month1.month() > moment().month()  && month1.year() === moment().year()) {
                    //check if prev class elements are showd in page
                    if ($('.tab-pane.fade.show.active .icon-i_arrow1-thick-l').css('display') === 'none') {

                        $(".next").each(function () {
                            $(this).trigger('click');
                        })
                    }
                }
                if (window.handleCalendar) window.handleCalendar(startDate);
                $('[id^="date-exit"]').each(function() {
                    $(this).addClass('active');
                });

                $('[id^="date-arrival"]').each(function() {
                    $(this).removeClass('active');
                });
                if (calendarOptions.onFirstDaySelected) calendarOptions.onFirstDaySelected(event, obj);
                setMenuButtonDateText(obj.date1);
            }
        )
            .bind(
                'datepicker-change',
                function(event, obj) {

                    const month1 = moment(obj.month1);
                    if (month1 && month1.month() > moment().month()  && month1.year() === moment().year()) {
                    $(".active .icon-i_arrow1-thick-l").css("display", "inline-block");
                    $(".section-page-all-content-single-property .icon-i_arrow1-thick-l").css("display", "inline-block")
                    }
                    $('[id^="date-exit"]').each(function() {
                        $(this).removeClass('active');
                    });

                    $('[id^="date-arrival"]').each(function() {
                        $(this).addClass('active');
                    });
                    if (window.availablePeriods && window.availablePeriods.success && window.availablePeriods.seasonal_periods) {
                        const start = moment(obj.date1);
                        $('#minimum-stay').removeClass('d-none');
                        for (const period of window.availablePeriods.seasonal_periods) {
                            const from = moment(period.psp_from, 'YYYY-MM-DD');
                            const to = moment(period.psp_to, 'YYYY-MM-DD');
                            if (start.isBetween(from, to, null, '[]')) {
                                $('#minimum-stay-qnt').text( period.psp_minimum_saty + ' ' + transChoice('js.months', +period.psp_minimum_saty));
                                if (period.psp_type_minimum_stay === 'month') {
                                    if (start.date() === 1) {
                                        const end = moment(start).add(period.psp_minimum_saty, 'months');
                                    } else {
                                        const end = moment(start).add(period.psp_minimum_saty, 'months');
                                    }
                                } else {
                                    $('#minimum-stay-qnt').text( parseInt(period.psp_minimum_saty, 10)  + ' ' + transChoice('js.nights', +period.psp_minimum_saty));

                                }
                            }
                        }
                    }
                    //if start date adn end date are under a month
                    var startDate = moment(obj.date1).format(HS_MAIN_DATE_FORMAT);
                    var endDate = moment(obj.date2).format(HS_MAIN_DATE_FORMAT);
                    var diff = moment(endDate).diff(moment(startDate), 'days');
        /*            if (diff <= 30) {
                                setSearchDateType('days');
                                $('#date-day').trigger('click', [true]);
                    }*/
                }
            )
            .bind(
                'next-month-clicked',
                function(event, obj) {
                    $(".tab-pane.fade.show.active .icon-i_arrow1-thick-l").css("display", "inline-block");
                    $(".section-page-all-content-single-property .icon-i_arrow1-thick-l").css("display", "inline-block")
                }
            )
            .bind(
            'prev-month-clicked',
            function(event, obj) {
                const month1 = moment(obj.month1);
                if (month1 && month1.subtract(1, 'months').month()  <= moment().month()  && month1.year() === moment().year()) {
                    $(".tab-pane.fade.show.active .icon-i_arrow1-thick-l").css("display", "none");
                $(".section-page-all-content-single-property .icon-i_arrow1-thick-l").css("display", "none");            }
            }
        )

        .bind(
            'datepicker-open',
            function(event, obj) {
                if (calendarOptions.onOpen) calendarOptions.onOpen(event, obj);
            }
        )

        setTimeout(function() {
            // Esta bandera habilita que el calendario comience a lanzar eventos y hacer cambios en otros componentes y variables
            calendarOptions.calendarStarted = true;
            if (calendarOptions.dateType === getSearchParam('datetype')) {
                setDates(
                    getDateRangePicker(calendarOptions),
                    getSearchParam('from'),
                    getSearchParam('to')
                );
            }
        }, 1000);
    }
}

// Se crean todas las intancias de calendarios: para seleccionar hospedaje por días, meses y años.
// Los calendarios se crean tanto para la interfaz desktop como para la interfaz mobile
document.addEventListener("DOMContentLoaded", function() {
    createCalendar(calDays);
    createCalendar(calMonths);
    //createCalendar(calYears);
    createCalendar(calDaysMobile);
    createCalendar(calMonthsMobile);
    //createCalendar(calYearsMobile);
    $('#clear-dates-month').click(function (event) {
        event.preventDefault();
        clearDates();
        $dateEnd.val('');
        $('[id^="date-exit"]').each(function() {
            $(this).removeClass('active');
        });

        $('[id^="date-arrival"]').each(function() {
            $(this).addClass('active');
        });

        $('.box-exit-closed-flexible.hs-color-black').removeClass('active');
        setSearchParam('from', null);
        setSearchParam('to', null);
    })
    $('#clear-dates-days').click(function (event) {
        event.preventDefault();
        clearDates();
        $dateEnd.val('');
        $('[id^="date-exit"]').each(function() {
            $(this).removeClass('active');
        });

        $('[id^="date-arrival"]').each(function() {
            $(this).addClass('active');
        });
    })
    $(".icon-i_arrow1-thick-l").css("display", "none");

    /**
     * Inicialización de las interfaces de cada calendario
     */
    $('.hs-calendar').each(function(){
        var
            $this = $(this),
            $calendarElement = $this.find('.nav-tabs'),
            calendarSettingsObject = $calendarElement.data('settings'),
            $calendarFooter = $this.find('.box-footer-tab-pane'),
            $stayTypeWindow = $this.find('.box-exit-closed-flexible'), // esta ventana se abre desde el listener del calMonth.firstDaySelected
            $stayTypeWindowButtons = $stayTypeWindow.find('label'),
            $stayTypeFooterButtons = $calendarFooter.find('label');

        /**
         * Los botones grandes de selección del tipo de estancia
         */
        $stayTypeWindowButtons.click(function(){
            // return;
            var
                $button = $(this),
                $input = $button.parent().find('#' + $button.attr('for')),
                inputValue = $input.val(),
                $footerTab = $stayTypeFooterButtons.parent().find('input[value="' + inputValue + '"]');

            // se oculta ventana de selección
            $stayTypeWindow.removeClass('active');

            // se actualiza el estatus del botón correspondiente en footer
            $footerTab.prop('checked', true);

            if (inputValue === 'flexible') {

                setFlexibleDate(calendarSettingsObject);
                setSearchFlexible(1);
            }
            else {
                setSearchFlexible(0);
            }
        });

        $stayTypeFooterButtons.click(function(){
            var
                $button = $(this),
                $input = $button.parent().find('#' + $button.attr('for')),
                inputValue = $input.val();

            // se actualiza el estatus del botón correspondiente en la ventana de selección de tipo de estadía
            $stayTypeWindowButtons.filter('[value="' + inputValue + '"]').prop('checked', true);

            resetDatePickingWithFirstDate(calendarSettingsObject);

            if (inputValue === 'flexible') {
                setFlexibleDate(calendarSettingsObject);
                setSearchFlexible(1);
            }
            else {
                setSearchFlexible(0);
            }
        });
    });
});

// // Cargado de valores default de calendarios y personas de single/detalle si es que se encuentran definidos en el documento
// setTimeout(function(){
//     var
//     startDate = window.hcFrom,
//     endDate = window.hcTo,
//     people = window.hcPeople;

//     if (startDate != null) setDateInputTextAndValue($dateStart, startDate, HS_DISPLAY_DATE_FORMAT);
//     if (endDate != null) setDateInputTextAndValue($dateEnd, endDate, HS_DISPLAY_DATE_FORMAT);
//     if (people != null) $people.val(people);
//     if (window.handleCalendar) window.handleCalendar(startDate, endDate);
// }, 1000);





/**
 * Sincronizar las FECHAS DE LOS CALENDARIOS DE DESKTOP O MOBILE AL MODIFICAR SU CONTRAPARTE
 * Event handler que se ejecuta al cambiar el valor de cualquiera de los 6 calendarios
 * @param {object} event Evento
 * @param {object} obj El objeto que contiene los datos devueltos por el calendario
 */
function datePickerChange(event,obj) {
//     var
//     inputId = $(event.target).attr('id')
//     fromDate = moment(obj.date1).format(HS_MAIN_DATE_FORMAT),
//     toDate = moment(obj.date2).format(HS_MAIN_DATE_FORMAT);


//     switch (inputId) {
//         case 'two-inputs' : { // days, desktop
//             setCalendarValues('days','mobile', fromDate, toDate);
//             break
//         }
//         case 'two-inputs-mobile' : { // days, mobile
//             setCalendarValues('days','desktop', fromDate, toDate);
//             break
//         }
//         case 'two-inputs2' : { // months, desktop
//             setCalendarValues('months','mobile', fromDate, toDate);
//             break
//         }
//         case 'two-inputs-mobile2' : { // months, mobile
//             setCalendarValues('months','desktop', fromDate, toDate);
//             break
//         }
//         case 'two-inputs3' : { // years, desktop
//             setCalendarValues('years','mobile', fromDate, toDate);
//             break
//         }
//         case 'two-inputs-mobile3' : { // years, mobile
//             setCalendarValues('years','desktop', fromDate, toDate);
//             break
//         }
//     }
}

/**
 * Devuelve los valores de uno de los 3 calendarios distintos
 * @param {string} datetype tipo de calendario, puede ser 'days', 'months' o 'years'
 * @param {string} mode el modo en el que se encuentra la página, puede ser 'desktop' o 'mobile'
 * @returns un objeto con los valores startDate y endDate
 */
// function getCalendaValues(datetype, mode) {
//     var
//     startDate, endDate;
//     switch (datetype) {
//         case 'days': {
//             if (mode === 'desktop') {
//                 startDate = calDays.$startInput.val();
//                 endDate = calDays.$endInput.val();
//             }
//             if (mode === 'mobile') {
//                 startDate = calDaysMobile.$startInput.val();
//                 endDate = calDaysMobile.$endInput.val();
//             }
//             break;
//         }
//         case 'months': {
//             if (mode === 'desktop') {
//                 startDate = calMonths.$startInput.val();
//                 endDate = calMonths.$endInput.val();
//             }
//             if (mode === 'mobile') {
//                 startDate = calMonthsMobile.$startInput.val();
//                 endDate = calMonthsMobile.$endInput.val();
//             }
//             break;
//         }
//         case 'years': {
//             if (mode === 'desktop') {
//                 startDate = calYears.$startInput.val();
//                 endDate = null;
//             }
//             if (mode === 'mobile') {
//                 startDate = calYearsMobile.$startInput.val();
//                 endDate = null;
//             }
//             break;
//         }
//     }
//     moment.locale('es');
//     if (startDate) startDate = moment(startDate, HS_DISPLAY_LONG_DATE_FORMAT).format(HS_MAIN_DATE_FORMAT);
//     if (endDate) endDate = moment(endDate, HS_DISPLAY_LONG_DATE_FORMAT).format(HS_MAIN_DATE_FORMAT);

//     return {
//         startDate : startDate,
//         endDate : endDate
//     }
// }

/**
 * Cambia los valores de los inputs del calendario correspondiente
 * @param {string} datetype tipo de calendario, puede ser 'days', 'months' o 'years'
 * @param {string} mode el modo en el que se encuentra la página, puede ser 'desktop' o 'mobile'
 */
// function setCalendarValues(datetype, mode, startDate, endDate) {


//     var
//     startDateFormatted,
//     endDateFormatted,
//     dateLabelText;

//     moment.locale('es');
//     if (startDate) startDateFormatted = moment(startDate, HS_MAIN_DATE_FORMAT).format(HS_DISPLAY_LONG_DATE_FORMAT);
//     if (endDate) endDateFormatted = moment(endDate, HS_MAIN_DATE_FORMAT).format(HS_DISPLAY_LONG_DATE_FORMAT);


//     dateLabelText =
//         startDateFormatted +
//         (endDateFormatted
//             ? ' - ' + endDateFormatted
//             : ''
//         );
//     switch (datetype) {
//         case 'days': {
//             if (mode === 'desktop') {
//                 calDays.$startInput.val(startDateFormatted);
//                 calDays.$endInput.val(endDateFormatted);
//             }
//             if (mode === 'mobile') {
//                 calDaysMobile.$startInput.val(startDateFormatted);
//                 calDaysMobile.$startInput.val(endDateFormatted);
//             }
//             break;
//         }
//         case 'months': {
//             if (mode === 'desktop') {
//                 calMonths.$startInput.val(startDateFormatted);
//                 calMonths.$endInput.val(endDateFormatted);
//             }
//             if (mode === 'mobile') {
//                 calMonthsMobile.$startInput.val(startDateFormatted);
//                 calMonthsMobile.$endInput.val(endDateFormatted);
//             }
//             break;
//         }
//         case 'years': {
//             if (mode === 'desktop') {
//                 calYears.$startInput.val(startDateFormatted);
//             }
//             if (mode === 'mobile') {
//                 calYearsMobile.$startInput.val(startDateFormatted);
//             }
//             break;
//         }
//     }
//     if (getDateTypeValue() === datetype) {
//         $('#modal-filtro-02 .button-modal-filtro-select').text(
//             dateLabelText
//         );
//         $('.banner-barra-box .barra-list-fechas').text(
//             dateLabelText
//         );
//     }
// }

// Sincronizar DÍAS DE TOLERANCIA

var
$toleranceRadioDesktop = $('[name="item-tab-group-01"]'),
$toleranceRadioMobile = $('[name="item-tab-group-01-mobile"]');

$toleranceRadioDesktop.click(function(event, abort){
    if (abort) return;
    var
    $this = $(this),
    value = $this.val(),
    $other = $toleranceRadioMobile.filter('[value="' + value + '"]');

    $toleranceRadioMobile.removeAttr('checked');
    $other.attr('checked','checked').trigger('click',[true]);
});
$toleranceRadioMobile.click(function(event, abort){
    if (abort) return;
    var
    $this = $(this),
    value = $this.val(),
    $other = $toleranceRadioDesktop.filter('[value="' + value + '"]');

    $toleranceRadioDesktop.removeAttr('checked');
    $other.attr('checked','checked').trigger('click',[true]);
});

// Sincronizar SALIDA FLEXIBLE
var
$flexibleRadioDesktop = $('[name="item_tab_group_02"]'),
$flexibleRadioMobile = $('[name="item_tab_group_02_mobile"]');

$flexibleRadioDesktop.click(function(event, abort){
    if (abort) return;

    var
    $this = $(this),
    value = $this.val(),
    $other = $flexibleRadioMobile.filter('[value="' + value + '"]');

    $flexibleRadioMobile.removeAttr('checked');
    $other.attr('checked','checked').trigger('click',[true]);
});
$flexibleRadioMobile.click(function(event, abort){
    if (abort) return;

    var
    $this = $(this),
    value = $this.val(),
    $other = $flexibleRadioDesktop.filter('[value="' + value + '"]');

    $flexibleRadioDesktop.removeAttr('checked');
    $other.attr('checked','checked').trigger('click',[true]);
});


//===========================================================================
// Sincronizar ESTADO DE BOTONES DE FECHAS DESKTOP CON MOBILE
//===========================================================================
$dateTabsButtons.click(function(event, abort){
    $('[id^="date-exit"]').each(function() {
        $(this).removeClass('active');
    });

    $('[id^="date-arrival"]').each(function() {
        $(this).addClass('active');
    });
    if (abort) return; // si el evento fue lanzado desde aquí, abortar

    var
    $this = $(this),
    itemId = $this.attr('id');



    switch (itemId) {
        case 'date-day' :
        case 'date-day-mobile' :
            setSearchDateType('days');
            break;
        case 'date-month' :
        case 'date-month-mobile' :
            setSearchDateType('months');
            break;
        case 'date-year' :
        case 'date-year-mobile' :
            setSearchDateType('years');
            break;
    }


    switch (itemId) {
        case 'date-day' :
            $('#date-day-mobile').trigger('click', [true]);
            break;
        case 'date-day-mobile' :
            $('#date-day').trigger('click', [true]);
            break;
        case 'date-month' :
            $('#date-month-mobile').trigger('click', [true]);
            break;
        case 'date-month-mobile' :
            $('#date-month').trigger('click', [true]);
            break;
        case 'date-year' :
            $('#date-year-mobile').trigger('click', [true]);
            break;
        case 'date-year-mobile' :
            $('#date-year').trigger('click', [true]);
            break;
    }


    setSpinnerValue();
});







/**
 * Inicialización de los botones de (+) y (-) para selección del número de personas/dormitorios
 * un mismo botón cambia el valor de todas las instancias del spinner.
 */
$spinnerButtons.click(function () {
    var
    spinnerMode = getSpinnerMode(),
    currentValue = getSearchParam(spinnerMode),
    spinnerValue = currentValue != null ? currentValue : 1,
    increment = $(this).hasClass('minus-btn') ? -1 : 1,
    newValue = spinnerValue + increment;

    if (newValue < 1) newValue = 1;
    setSearchParam(spinnerMode, newValue);
    setSpinnerValue();
});

/**
 * Cambia el valor de todos los spinners y el valor del dropdown según el tipo de selección
 * de fecha actual
 * @param {*} newValue
 * @returns
 */
function setSpinnerValue() {
    var spinnerValue = getSearchParam(getSpinnerMode());
    $spinnerInputs.val(spinnerValue != null ? spinnerValue : 1);
    $peopleBedroomsHolders.text(zeroAsEmptyText(spinnerValue));
    activateSpinners(spinnerValue);
    updatePeopleBedroomNames();
    updatePeopleBedroomDropdownsValues()
}

function setSpinnerInputToSavedParam() {
    $spinnerInputs.val(getSearchParam(zeroAsEmptyText(getSpinnerMode())));
}

/**
 * Actualiza los labels de los spinners y títulos de Personas/Dormitorios según el tipo de
 * selección de fecha actual
 */
function updatePeopleBedroomNames() {
    var
    spinnerMode = getSpinnerMode(),
    currentValue = removeNaN(getSearchParam(spinnerMode));
    $peopleBedroomsHolders.text(zeroAsEmptyText(currentValue));
    switch (spinnerMode) {
        case 'people' : {
            $peopleBedroomsTitle.text(__('js.people-title'));
            if (currentValue > 0) {
                $peopleBedroomsUnits.text(transChoice('js.people', currentValue));
                $peopleBedroomsUnitsSmall.text(currentValue + ' ' + transChoice('js.people', currentValue));
            }
            else {
                $peopleBedroomsUnits.text(__('js.people-title'));
                $peopleBedroomsUnitsMobile.text(__('js.add-people'));
                $peopleBedroomsUnitsSmall.text(currentValue + ' ' +  __('js.people-title'));
            }
            break;
        }
        case 'bedrooms' : {
            $peopleBedroomsTitle.text(__('js.bedrooms-title'));
            if (currentValue > 0) {
                $peopleBedroomsUnits.text(transChoice('js.bedrooms', currentValue));
                $peopleBedroomsUnitsSmall.text(currentValue + ' ' +  transChoice('js.bedrooms', currentValue));
            }
            else {
                $peopleBedroomsUnits.text(__('js.bedrooms-title'));
                $peopleBedroomsUnitsMobile.text(__('js.add-bedrooms'));
                const val = currentValue > 0 ? currentValue : '';
                $peopleBedroomsUnitsSmall.text(val + ' ' + __('js.bedrooms-title'));
            }
            break;
        }
    }
}





/**
 * Sincroniza los valores de los dropdowns de bedrooms y people con el valor que está en
 * el formulario oculto de search params
 */
function updatePeopleBedroomDropdownsValues() {
    if(getSearchParam('bedrooms')!=0)
        setDropdownValue($getDropdownsByName('bedrooms'), getSearchParam('bedrooms'));
    else{
        if(getSearchParam('exactbedrooms') == 1)
        {
            if(getCurrentLanguage() === 'es')
                setDropdownValue($getDropdownsByName('bedrooms'), 'Estudio');
            else
                setDropdownValue($getDropdownsByName('bedrooms'), 'Studio');
        }
        else{
            setDropdownValue($getDropdownsByName('bedrooms'), '0');
        }
    }


    setDropdownValue($getDropdownsByName('people'), getSearchParam('people'));
}


/**
 * Devuelve el dropdown correspondiente al modo actual de spinner (personas o dormitorios)
 * @returns
 */
function $getCurrentPeopleBedroomsDropdown() {
    return $getDropdownsByName(getSpinnerMode());
}

/**
 * Devuelve un componente de dropdown según su valor de data-dropdown
 * @param {*} names
 * @returns
 */
function $getDropdownsByName(names) {
    var
    selectors = [],
    namesArray = names.split(',');
    for (var i = 0; i < namesArray.length; i++) {
        selectors.push('[data-dropdown="' + namesArray[i] + '"]');
    }
    return $(selectors.join(','));
}


/**
 * Cambia el valor actual de un Dropdown
 * @param {*} $dropdown
 * @param {*} newValue
 */
function setDropdownValue($dropdown, newValue) {
    var text = newValue;
    console.log("checked: " + $('#exact-bedrooms').is(":checked"));
    if($dropdown.attr('data-dropdown') == 'people' || $dropdown.attr('data-dropdown') == 'bedrooms' || $dropdown.attr('data-dropdown') == 'bathrooms'){
        if(newValue!='All' && newValue!='Todos' && newValue!='Estudio' && newValue!='Studio' && $('#exact-bedrooms').is(":checked") == false)
            text += ' +';
    }

    if (text == null) text = __('js.all');


    $dropdown
    .attr('data-value', newValue)
    .data('value', newValue)
    .find('button p')
    .text(text);
}



/**
 * Activa o desactiva los botones de (+) y (-) según el valor actual del spinner
 * @param {*} value
 */
function activateSpinners(value){
    if (value <= 1) {
        $spinnerButtonsMinus.attr('disabled', 'disabled');
    }
    else {
        $spinnerButtonsMinus.removeAttr('disabled');
    }
}




$('.hs-sticky-footer-detail button, .hs-page-right-content .hs-button-close').click(function(){
    $('body').toggleClass('apartment-detail-open');
});




$('.hs-sticky-header-reservation').click(function(){
    $('body').toggleClass('cart-detail-open');
});


var
$paymentMethodDropdownItems = $('[id^="method-"]'),
$paymentMethodFields = $('[id^="payment-method-"]'),
$paymentSubmitButton = $('#payment-submit'),
$paymentSubmitGeneralFields = $('#payment-submit-general-fields');


/**
 * Botones del dropdown de formas de pago en el carrito
 */
$paymentMethodDropdownItems.click(function(){
    var
    $this = $(this),
    thisId = $this.attr('id');

    //Se ocultan todos los campos custom de métodos de pago
    $paymentMethodFields.addClass('d-none');

    //Se agrega el método de pago al botón de submit, se le pone el texto default y se desbloquea
    $paymentSubmitButton
        .text('Pagar') ////
        .prop('disabled', false)
        .data('method', thisId);

    //Según el método de pago se realizan ajustes específicos
    switch (thisId) {
        case 'method-wire-transfer' :
            $paymentSubmitButton.text('Continuar'); ////
            break;
        case 'method-credit-card' :
            $paymentMethodFields.filter('#payment-method-credit-card').removeClass('d-none');
            break;
        case 'method-amex' :
            break;
        case 'method-paypal' :
            break;
        case 'method-apple-pay' :
            break;
        case 'method-google-pay' :
            break;
    }
});


/**
 * Botón de submit de la forma de pago del carrito
 */
$paymentSubmitButton.click(function(){
    var
    $this = $(this),
    method = $this.data('method');

    //Se realizan acciones específicas según el método de pago
    switch (method) {
        case 'method-wire-transfer' :
            $paymentSubmitGeneralFields.addClass('d-none');
            $paymentMethodFields.filter('#payment-method-wire-transfer').removeClass('d-none');
            break;
        case 'method-credit-card' :
            break;
        case 'method-amex' :
            break;
        case 'method-paypal' :
            break;
        case 'method-apple-pay' :
            break;
        case 'method-google-pay' :
            break;
    }
});







function initCustomSwipers() {

    $('.hs-custom-swiper').each(function(){
        var
        $this = $(this),
        id = $this.attr('id'),
        hasId = !isEmptyText(id),
        navSelector = $this.data('nav'),
        navBar = $($this.data('nav-bar')),
        navWatcher = $($this.data('nav-watcher')),
        swiperSettings = Object.assign(
            {},
            _swiperSettings[$this.data('template')],
            {
                navigation: {
                    nextEl: navSelector + ' .swiper-button-next ' + (hasId ? (', #' + id + ' .swiper-button-next') : ''),
                    prevEl: navSelector + ' .swiper-button-prev ' + (hasId ? (', #' + id + ' .swiper-button-prev') : ''),
                }
            }
        ),
        swiper = new Swiper(this, swiperSettings);
        $this.data('swiper', swiper);

        swiper.on('activeIndexChange', setActive);


        navBar.find('[data-index]').click(function(event){
            event.preventDefault();
            swiper.slideTo($(this).data('index'));
            return false;
        });

        function setActive(){
            var index = swiper.activeIndex;
            navBar.find('[data-index]').removeClass('active');
            navBar.find('[data-index=' + index + ']').addClass('active');
            navWatcher.find('[data-index]').removeClass('active');
            navWatcher.find('[data-index=' + index + ']').addClass('active');
            if (swiperSettings.callback) swiperSettings.callback();
        }
        setActive();
    });
}



// Botón de like
$('body').delegate('.hs-fav', 'click', function() {
    $(this).toggleClass("active");
});


$('.hs-dropdown-toggle').click(function(){
    var $this = $(this);

    if ($this.hasClass('active')) {
        $this.removeClass('active').find('.hs-dropdown-content').slideUp(300);
    }
    else {
        $this.addClass('active').find('.hs-dropdown-content').slideDown(300);
    }
});



var $hsSeoList = $('.hs-seo-list');
$hsSeoList.find('.hs-show').click(function(event){
    event.preventDefault();
    $hsSeoList.addClass('active');
});
$hsSeoList.find('.hs-hide').click(function(event){
    event.preventDefault();
    $hsSeoList.removeClass('active');
});





$('.hs-band-scroll').each(function(){
    var
    componentElement = this,
    $component = $(this);

    $component.find('.hs-move-left').css('float', 'left');
    $component.find('.hs-move-right').css('float', 'right');

    $window.scroll(function(){
        var
        componentWidth = $component.width(),
        percent = getPercentVisible(componentElement);

        $component.find('.hs-move-left, .hs-move-right').each(function(){
            var
            $item = $(this),
            itemWidth = $item.width(),
            offset = ((componentWidth - itemWidth) / 100) * percent;

            if ($item.hasClass('hs-move-left')) $item.css('margin-left', offset);
            if ($item.hasClass('hs-move-right')) $item.css('margin-right', offset);
        });
    });
});


function getPercentVisible(element) {
    var
    yPos = document.documentElement.scrollTop || document.body.scrollTop,
    windowHeight = document.documentElement.clientHeight,
    elementRect = element.getBoundingClientRect(),
    elementStart = elementRect.top + yPos - windowHeight,
    elementEnd = elementRect.bottom + yPos,
    yPosRel = yPos - elementStart,
    percent = (100 / (elementEnd - elementStart))  * yPosRel;

    if (percent > 100) percent = 100;
    if (percent < 0) percent = 0;

    return percent;
}




// Cambio de clases del body para cuando se abre o cierra un modal
//---------------------------------------------------------------
function bodyModalIsOpen() {
	$("body").addClass("modal-open");
}
function bodyModalIsClosed() {
	$("body").removeClass("modal-open");
}

// JS DATE
//---------------------------------------------------------------
if ($(".js-date").length > 0) {
    $(".js-date").each(function() {
        var dateInputMask = function(elm) {
            elm.addEventListener('keypress', function(e) {
                if(e.keyCode < 47 || e.keyCode > 57) {
                    e.preventDefault();
                }

                var len = elm.value.length;

                // If we're at a particular place, let the user type the slash
                // i.e., 12/12/1212
                if(len !== 1 && len !== 3) {
                    if(e.keyCode == 47) {
                        e.preventDefault();
                    }
                }

                // Add slash if not added by user
                if(len === 2 || len === 5) {
                    elm.value += '/';
                }
            });
        };

        dateInputMask(this);
    });
}


// Inicialización de tooltips
//---------------------------------------------------------------

// Tooltip precio optimo

$('.item-listado-custom-precio').tooltip({
	customClass:'precio-optimo-tooltip',
})

// Salida flexible

if ($(window).width() > 991) {
	$('.btn-flexible-tooltip').tooltip({
		customClass:'salida-flexible-tooltip',
	})
}
else {
	$(".btn-flexible-tooltip").click(function (e) {
		e.preventDefault();
		var title = $(this).attr("data-title")
		var content = $(this).attr("title")
		$("#modal-info-tooltip-mobile").fadeIn();
		setTimeout(() => {
			$("#modal-info-tooltip-mobile").addClass("active")
		}, 100);
		$("#modal-info-tooltip-mobile").find(".modal-small-info-content-header-title").html(title);
		$("#modal-info-tooltip-mobile").find(".modal-small-info-content-body").html(content);
	});
}

// Click de inputs de fechas en single
$dateStart.click(openCalendarForSinglePage);
$dateEnd.click(openCalendarForSinglePageEnd);
$dateStartLabel.click(openCalendarForSinglePage);
$dateEndLabel.click(openCalendarForSinglePageEnd);

function openCalendarForSinglePage(e) {
    const from = getSearchParam('from');
    const to = getSearchParam('to');
    //JLM: Revisar. Se borraban las fechas al abrir el calendario
    //$('.gfw-reset-dates').click();
    e.preventDefault();
    if (from !== null && to === null) {
        for (var i = 0; i < allCalendars.length; i++) {
            var calendar = getDateRangePicker(allCalendars[i]);
              if (calendar)  { calendar.clear();
                calendar.resetMonthsView()
                $('.prev').each(function(){
                    $(this).click()
                })
            }
        }
        calMonths.$tab.parent().find('.box-exit-closed-flexible').removeClass('active');
        calMonthsMobile.$tab.parent().find('.box-exit-closed-flexible').removeClass('active');
        $('[id^="date-exit"]').removeClass('active');
        $('[id^="date-arrival"]').addClass('active');
    }
    $("#barra-fecha-box").fadeIn();
    $(".overlay-modal-box-banner").fadeIn();
    updateLabels();
}

function openCalendarForSinglePageEnd(e) {
    const from = getSearchParam('from');
    e.preventDefault();

    if (from !== null) {
        $("#barra-fecha-box").fadeIn();
        $(".overlay-modal-box-banner").fadeIn();

        allCalendars.forEach(picker => {
            try {
                setDates(getDateRangePicker(picker), from);
                if (picker === calMonths || picker === calMonthsMobile) {
                    picker.$tab.parent().find('.box-exit-closed-flexible').addClass('active');
                }
            } catch (error) {
            }
        });

        $('[id^="date-exit"]').addClass('active');
        $('[id^="date-arrival"]').removeClass('active');
        const month1 = moment(from);
        if (month1 && (month1.month() <= moment().month() && month1.year() === moment().year())) {
            $(".active .icon-i_arrow1-thick-l").css("display", "none");
            $(".section-page-all-content-single-property .icon-i_arrow1-thick-l").css("display", "none")
        }
    }
    updateLabels();
}

/**
 * Botón de cerrar en instancias de modal-simple
 */
$('.hs-modal-simple-close').click(function(e){
    e.preventDefault();
    $(this).parents('.hs-modal-simple-back').fadeOut();
    return false;
})

$('.close-button-email').click(function(e){
    e.preventDefault();
    $(this).parents('.hs-modal-simple-back').fadeOut();
    return false;
})

var
$modalPasswordRecovery = $('#hs-modal-password-recovery'),
$modalPayment = $('#hs-modal-payment');

/**
 * Mostrar modal de recuperación de contraseña
 * @param mixed section form, mail-sent, success, mail-error, password-error
 */
function showModalPasswordRecovery(section) {
    $modalPasswordRecovery.find('.hs-modal-simple-section').addClass('d-none');
    $modalPasswordRecovery.find('.hs-modal-recovery-' + section).removeClass('d-none');
    $modalPasswordRecovery.fadeIn();
}

/**
 * Ocultar modal de recuperación de contraseña
 */
function hideModalPasswordRecovery() {
    $modalPasswordRecovery.fadeOut();
}

/**
 * Mostrar modal de mensaje de pago
 * @param mixed section success, error
 */
function showModalPaymentMessage(section) {
    $modalPayment.find('.hs-modal-simple-section').addClass('d-none');
    $modalPayment.find('.hs-modal-payment-' + section).removeClass('d-none');
    $modalPayment.fadeIn();
}

/**
 * Ocultar modal de recuperación de contraseña
 */
function hideModalPaymentMessage() {
    $modalPayment.fadeOut();
}



// Aperturas de modals

$(".open-modal-equipament").click(function (e) {
	e.preventDefault();
	$(".modal-equipament").fadeIn();
	bodyModalIsOpen();
});

$(".open-video-single-property").click(function (e) {
	e.preventDefault();
	$("#modal-video-single").fadeIn();
	$("#modal-video-single video").get(0).play()
	bodyModalIsOpen();
});

$(".open-video-single-property.close-gallery").click(function (e) {
    $("#modal-video-single video").get(0).pause()
});

$(".open-plano-single-property").click(function (e) {
	e.preventDefault();
	$("#modal-plano-single").fadeIn();
	bodyModalIsOpen();
});

$(".open-gallery-single-property").click(function (e) {
	e.preventDefault();
	$("#modal-gallery-single").fadeIn();
	bodyModalIsOpen();
});

// Apertura y cierre de textos de detalle

$(".section-detail-single-rental-more").click(function (e) {
	e.preventDefault();
	$(this).parent().parent().hide();
	$(this).parent().parent().next().show();
});

$(".section-detail-single-rental-minus").click(function (e) {
	e.preventDefault();
	$(this).parent().hide();
	$(this).parent().prev().show();
});

// Apertura da cuadro de búsqueda

$(".hs-link-open-search-modal").click(function (e) {
	$(".modal-filtro").addClass('active');
});

$(".list-filter-dropdown").click(function (e) {
	e.preventDefault();
	$(".link-open-box-modal.active").trigger("click");
});

// Dropdowns

$(".dropdown-menu-language .dropdown-item").click(function () {
	$(".dropdown-language .select-language-button").text($(this).text());
});

$(".select-language-button").click(function () {
	if ($(this).text() == "ES") {
		$(".dropdown-menu-language .dropdown-item").text("EN")
	} else if ($(this).text() == "EN") {
		$(".dropdown-menu-language .dropdown-item").text("ES")
	}
});

$(".dropdown-menu-money .dropdown-item").click(function () {
	$(".dropdown-money .select-money-button").text($(this).text());
});




$(".dropdown-menu-payment-method .dropdown-item").click(function () {
	$(this).parent().prev().find('p').html($(this).html());
	$(".box-custom-credit-card").css("display", "none");
	$(".bottom-pago-text-wire-transfer").css("display", "none");
	$("#checkbox-accept-policy").css("display", "flex");
	$(".box-dropdown-custom-pago .dropdown-menu-button-custom").addClass("selected");
	$(".pago-box-bottom-items .btn-custom-submit").removeClass("payment-incomplete");
	$(".pago-box-bottom-items .btn-custom-submit").addClass("payment-complete");
	$(".pago-box-bottom-items .btn-custom-submit").text("Pagar");
	$(".btn-custom-submit").removeClass("wire-transfer2");
});

// Pagos

$(".method-credit-card").click(function () {
	$(".box-custom-credit-card").css("display", "flex");
});

$(".method-wire-transfer").click(function () {
	$(".pago-box-bottom-items .btn-custom-submit").text("Continuar");
	$(".pago-box-bottom-items .btn-custom-submit").addClass("wire-transfer2");
	$("#checkbox-accept-policy").css("display", "none");
	$(".bottom-pago-text-wire-transfer").css("display", "block");
	$(".pago-box-bottom-items .btn-custom-submit").removeClass("payment-incomplete");
	$(".pago-box-bottom-items .btn-custom-submit").removeClass("payment-complete");
});

$("body").delegate(".wire-transfer2", "click", function (e) {
	$(".card-body-regular-pay-box").fadeOut();
	$(".box-content-wire-transfer").fadeIn().css("display", "flex");
});

$("body").delegate(".payment-incomplete", "click", function (e) {
	$(".modal-credit-card-incomplete").fadeIn();
	bodyModalIsOpen();
	});

$("body").delegate(".payment-complete", "click", function (e) {
	$(".modal-credit-card-complete").fadeIn();
	bodyModalIsOpen();
});

$(".exit-modal-credit-card").click(function () {
	$(".modal-credit-card").fadeOut();
	bodyModalIsClosed();
});

$(".modal-credit-card .modal-overlay").click(function () {
	$(".modal-credit-card").fadeOut();
	bodyModalIsClosed();
});

// Apertura y cierre de menú lateral (hamburguesa)


/* CERRAR MODALES CON CLIC FUERA - 20/07/2024
// Función para cerrar los demás modales.
// Para restaurar la versión previa buscar y comentar closeOtherModals() fuera de este bloque
function closeOtherModals() {
    console.log('try to close other modals');
    closeMainMenu();
    const modals = document.querySelectorAll('[class^="modal-"]:not(.modal-map), .hs-modal-side, .header-menu-content');
    modals.forEach(modal => {
        if (modal.style.display === 'block' || modal.classList.contains('active')) {
            modal.style.display = 'none';
            modal.classList.remove('active');
        }
    });
}

// Hacemos que los clicks en espacios "vacios" del header cierren los modales abiertos
document.querySelectorAll('header.section-header').forEach(header => {
    header.addEventListener('click', function(e) {
        // Define los selectores a ignorar
        const ignoreSelectors = [
            'button.btn-mobile',
            '#btn-modal-access-login',
            '#btn-modal-mobile-access-login',
            '.header-menu-content',
            '.content-header > a',
            '#barra-destino-box-menu',
            '.dropdown-language'
        ].join(', ');

        // Verifica si el elemento clicado no coincide con ninguno de los selectores a ignorar
        if (!e.target.closest(ignoreSelectors)) {
            e.preventDefault();
            closeOtherModals();
        }
    });
});
/* // CERRAR MODALES CON CLIC FUERA - 20/07/2024 */


$(".btn-mobile").click(function (e) {
	e.preventDefault();
	if ($(this).hasClass("active")) {
		$(this).removeClass("active")
		bodyModalIsClosed();
		$(".header-menu").removeClass("active");
		$(".header-buttons-blog-search").removeClass("active");
		$(".header-barra-search").removeClass("active");
		$('.box-input-search-mobile').fadeOut(300);
		$(".btn-menu").removeClass("active");
        //  y closeOtherModals();
	} else {
        //  y closeOtherModals();
		$(this).addClass("active");
		$(".header-menu").addClass("active");
		bodyModalIsOpen();
		$(".btn-menu").addClass("active");
		$(".header-buttons-blog-search").addClass("active");
		$('.modal-search-blog').fadeOut(300);
	}
});

$(".btn-menu").click(function (e) {
	$(".btn-mobile").removeClass("active")
});

function closeMainMenu() {
    $(this).removeClass("active")
	bodyModalIsClosed();
	$(".header-menu").removeClass("active");
	$(".header-buttons-blog-search").removeClass("active");
	$(".header-barra-search").removeClass("active");
	$('.box-input-search-mobile').fadeOut(300);
	$(".btn-menu").removeClass("active");
	$(".btn-mobile").removeClass("active");
}

$(document).click(function(event) {
    if (!$(event.target).closest('.header-menu').length && !$(event.target).closest('.btn-mobile').length) {
        closeMainMenu();
    }
});

//?????

$('.item-listado-custom1').hover(function () {
	$('.item-listado-custom1').addClass("active", 3000);
}, function () {
	$('.item-listado-custom1').removeClass("active", 3000);
});

//?????


$(".barra-button-filter").click(function (e) {
	$(".modal-filtro-avanzado").addClass("active");
	$(".modal-filtro-avanzado .overlay-modal-custom").addClass("active");
	$(".link-open-box-modal.active").trigger("click");
	bodyModalIsOpen();
});

$(".modal-filtro-avanzado .overlay-modal-custom").click(function (e) {
	$(".modal-filtro-avanzado .overlay-modal-custom").removeClass("active")
	$(".modal-filtro-avanzado").removeClass("active")
	bodyModalIsClosed();
});

$(".exit-modal-filtro-avanzado").click(function (e) {
	$(".modal-filtro-avanzado").removeClass("active");
	$(".modal-filtro-avanzado .overlay-modal-custom").removeClass("active");
	bodyModalIsClosed();
});

$(".exit-modal-precio-optimo").click(function (e) {
	$(".modal-precio-optimo").fadeOut();
});

$(".exit-modal-filtro").click(function (e) {
	e.preventDefault();
	$(".modal-filtro").removeClass("active");
	bodyModalIsClosed();
	if ($('#modal-filtro-04 .button-modal-filtro').attr('aria-expanded') === "true") {
		$('[data-target="#modal-filtro-item-04"]').trigger("click");
	}
	if ($('#modal-filtro-03 .button-modal-filtro').attr('aria-expanded') === "true") {
		$('[data-target="#modal-item-filtro-03"]').trigger("click");
	}
	if ($('#modal-filtro-02 .button-modal-filtro').attr('aria-expanded') === "true") {
		$('[data-target="#modal-filtro-item-02"]').trigger("click");
	}
	if ($('#modal-filtro-01 .button-modal-filtro').attr('aria-expanded') === "true") {
		$('[data-target="#modal-filtro-item-01"]').trigger("click");
	}
    if ($('#modal-filtro-06 .button-modal-filtro').attr('aria-expanded') === "true") {
        $('[data-target="#modal-filtro-item-06"]').trigger("click");
    }
});

$(".overlay-modal-box-banner").click(function (e) {
	e.preventDefault();
	$(".overlay-modal-box-banner").fadeOut();
	$("#barra-fecha-box").fadeOut();
	$(".modal-box-banner").fadeOut().removeClass("active");
	// $(".banner-barra-list").removeClass("active")
	$(".link-open-box-modal").removeClass("active").parents('.hs-list-bar').removeClass('active');
    updateLabels();
});

// Newsletter

$('#input-newsletter').keyup(function (e) {
	if (document.getElementById("input-newsletter").value.length == 0) {
		$('.button-newsletter').css('display', 'none');
	} else {
		$('.button-newsletter').css('display', 'block');
	}
});



$(".open-modal-living").click(function (e) {
	e.preventDefault();
	$(".modal-livings").fadeIn();
});

$(".exit-modal-livings").click(function (e) {
	e.preventDefault();
	$(".modal-livings").fadeOut();
});


$('.input-custom').on('focusin', function() {
	$(this).parent().find('label').addClass('active');
});

$('.input-custom:not(.hs-input-single-cal)').on('focusout', function() {
	if (!this.value) {
		$(this).parent().find('label').removeClass('active');
	}
});




$(".modal-login-button-continuar").click(function() {
	$(this).hide();
	$("#register .modal-login-other-login").hide();
	$(".company-input").show();
});

$(".button-view-password").click(function() {
	var
    $this = $(this),
    input = $this.parent().find(".password-input"),
    $eyeOpenedIcon = $this.find(".icon-eye-password"),
    $eyeClosedIcon = $this.find(".icon-eye-password-hide");

	if (input.attr("type") == "password") {
		input.attr("type", "text");
		$eyeClosedIcon.show();
		$eyeOpenedIcon.hide();
	} else {
		input.attr("type", "password");
		$eyeOpenedIcon.show();
		$eyeClosedIcon.hide();
	}
});



$(".dropdown-item-info-c").click(function () {
	$(this).parents('.dropdown').find(".login-info-contact-dropdown-label").addClass("active-item");
	$(this).parents('.dropdown').find(".login-info-contact-dropdown-img").addClass("active-item");
	$(this).parents('.dropdown').find(".dropdown-menu-button-custom").addClass("active-item");
});




/// MODAL LOGIN SIDEBAR

$("#modal-sidebar-login .modal-overlay").click(function(e) {
	$("#modal-sidebar-login").fadeOut();
	bodyModalIsClosed();
});

$(".button-login, .hs-owners-button-signup").click(function() {
	$("#modal-sidebar-login").fadeIn();
	bodyModalIsOpen();
	$('.header-menu').removeClass("active");
	$('.btn-mobile').removeClass("active");

    if ($(this).hasClass('hs-owners-button-signup')) {
        $("#register-tab").click();
    }
});

$(".exit-modal-login").click(function() {
	$("#modal-sidebar-login").fadeOut();
	bodyModalIsClosed();
});

/// MODAL PASSWORD CHANGE SIDEBAR

$("#modal-sidebar-password-change .modal-overlay").click(function(e) {
	$("#modal-sidebar-password-change").fadeOut();
	bodyModalIsClosed();
});

$(".exit-modal-login").click(function() {
	hideModalPasswordChange();
});

function showModalPasswordChange() {
	$("#modal-sidebar-password-change").fadeIn();
	bodyModalIsOpen();
	$('.header-menu').removeClass("active");
}

function hideModalPasswordChange() {
	$("#modal-sidebar-password-change").fadeOut();
	bodyModalIsClosed();
}






$("#modal-login-company").on("change", function () {
	if ($(this).is(":checked") ) {

			$(".box-persona-login-single").fadeOut(0);
			$(".box-empresa-login-single").fadeIn(0);
	}
	else  {
		$(".box-persona-login-single").fadeIn(0);
		$(".box-empresa-login-single").fadeOut(0);
	};
});

$(".pago-box-bottom-items .box-custom-cupon input").change(function(e){
	$(".pago-box-bottom-items .box-custom-cupon .add-cupon-btn").addClass("cupon-active");
});


$(".btn-flexible-tooltip-descuento").hover(
	function () {
		$("body").addClass("discount-class");
	},
	function () {
		$("body").removeClass("discount-class");
	}
);


if ($(".bar-livings-anchors").length && $(".section-life-share").length) {
	var lastScrollTop3 = $(".section-life-share").offset().top;
	$(window).scroll(function (event) {
	var st = $(this).scrollTop();
	if (st > lastScrollTop3) {
		$(".bar-livings-anchors").addClass("active");
	} else {
		$(".bar-livings-anchors").removeClass("active");
	}
	});
}

if ($(".bar-livings-anchors").length && $(".section-way-living").length) {
	var lastScrollTop3 = $(".section-way-living").offset().top - 100;
	$(window).scroll(function (event) {
	var st = $(this).scrollTop();
	if (st > lastScrollTop3) {
		$(".bar-livings-anchors").addClass("active");
	} else {
		$(".bar-livings-anchors").removeClass("active");
	}

	if ($(".bar-livings-anchors-list-item-link").hasClass("active")){
		var itemactive = $(".bar-livings-anchors-list-m .bar-livings-anchors-list-item-link.active").text();
		$(".btn-card-anchors-list").text(itemactive);
	}
	});
}

$(".bar-livings-anchors-list-item-link").click(function (e) {
	e.preventDefault();
	if ($(".bar-livings-anchors-list-item-link").hasClass("active")){
	} else {
	$("#anchors-list-card .btn-card-anchors-list").text($(this).text());
	}

	$('.btn-card-anchors-list').addClass("collapsed");
	$('#anchors-list-items').removeClass("show");
	$('.overlay-anchors').fadeOut();
});





$(".btn-open-calendary-cart").click(function (e) {
	e.preventDefault();
	$('.modal-calendario-cart').fadeIn(300);
	$('body').addClass('modal-open');

    $.ajax({
        url : window.calendarURL,
        method : 'get',
        success : function(data){
            $('.hs-modal-contents').html(data);
        }
    });
});


$(".btn-close-calendar-resume").click(function (e) {
    e.preventDefault();
    $('.modal-calendario-cart').fadeOut(300);
    $('body').removeClass('modal-open');
});





$(".btn-open-modal").click(function (e) {
	e.preventDefault();
    var
    $modal = $($(this).data('modal'));

	$modal.fadeIn(300);
	$('body').addClass('modal-open');
});


$(".hs-modal .hs-modal-close").click(function (e) {
    e.preventDefault();
    $(this).parents('.hs-modal').fadeOut(300);
    $('body').removeClass('modal-open');
});









function isNull(value) {
    return (value === undefined) || (value === null);
}




/**
 * Devuelve el valor convertido a número
 * Si es NaN devuelve 0
 * @param {*} value
 * @returns
 */
function removeNaN(value) {
    value = Number(value);
    if (isNaN(value)) return 0;
    else return value;
}


/**
 * Devuelve el valor si es mayor que 0, y devuelve una cadena vacía si es 0
 * @param {*} value
 */
function zeroAsEmptyText(value) {
    value = removeNaN(value);
    if (value == 0) return '';
    else return value;
}

/**
 * Devuelve si el sitio
 * @returns
 */
function getWindowSizeMode() {
    return ($window.width() < 991) ? 'mobile' : 'desktop';
}


/**
 * Revisa si el sitio está siendo visitado desde un broser mobile
 * se utiliza para saber si los videos tendrán autoplay o no.
 * @return [type]
 */
function isMobileBrowser() {
    return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
}


function isEmptyText(value) {
    return (
        (typeof value === 'undefined') ||
        (typeof value === 'string') &&
        (value.trim() === '')
    );
}


function updateLabels() {
    $('.box-input-custom').each(function(){
        var
        $this = $(this),
        $input = $this.find('input'),
        $label = $this.find('label');

        if (isEmptyText($input.val())) {
            $label.removeClass('active');
        }
        else {
            $label.addClass('active');
        }
    });
}

updateLabels();

function getCurrency(){
    $.ajax({
        url:'/get_currency',
        method: "GET",
        success:function(symbol){
            if(symbol){
                $('.select-money-button').text(symbol);
                if(symbol.includes("USD")){
                    $('.starting_price_usd').show();
                    $('.starting_price_eur').hide();
                    $('.average_price_usd').show();
                    $('.average_price_eur').hide();
                }
            }
        }
    });
}

getCurrency();

function getCurrencyList(){
    var url = $(location).attr('href');
    $.ajax({
        url:'/get_currency_list',
        method: "POST",
        data: {
            'url': url,
            '_token': $('meta[name="csrf-token"]').attr('content')
        },
        success:function(list){
            if(list)
                $('.dropdown-menu-money').html(list);
        }
    });
}

getCurrencyList();
