/* J_Inc_Dates.jsp */ var getAvailabilityServiceURL = "https://calendar.idiso.com/smartxmlpull/rest/getCalendar/"; var today; var tomorrow; var cal_sessionArrivalDate; var cal_sessionDepartureDate; var cal_nights = 0; // Variable que contiene el número de noches var availability_requests = new HashMap(); // Guarda los las peticiones que se han hecho para no repetirlas var availability_arrival = new HashMap(); // Contiene todas las configuraciones de disponibilidad para los calendarios de llegada var availability_departure = new HashMap(); // Contiene todas las configuraciones de disponibilidad para los calendarios de salida var firstUnavailableDay = new HashMap(); // Contiene los primeros días no disponibles del calendario de salida var cal_specialdays = []; // Contiene la lista de días que el calendario pintará en rojo // Inicializa los calendarios del formulario de búsqueda function cal_initCalendars(inputArrivalDate, inputDepartureDate, inDate, outDate) { // Inicializacion calendario fecha entrada setCalendarConfiguration(inputArrivalDate, today, new Date( new Date().getFullYear()+2, 11, 31, 23, 59, 59 ), inDate); $i(inputArrivalDate).datepicker("option", { onSelect: function() { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform" || inputID[1]=="cancelform") { $i("#inDate-"+inputID[1]).find('.ui-widget-content').removeAttr('style').hide(); } if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { firstUnavailableDay.put($i('#codigoHotelSeleccionado').val(), undefined); } } if (inputID[1]!="searchform" && inputID[1]!="cancelform") { firstUnavailableDay.put(inputID[1], undefined); } var selectedArrivalDate = $i("#inDate-"+inputID[1]).datepicker("getDate"); var selectedArrivalDateNextDay = getNDaysAfter(selectedArrivalDate, 1); var maxDay = getNDaysAfter(selectedArrivalDate, 62); setCalendarConfiguration($i("#outDate-"+inputID[1]), selectedArrivalDateNextDay, maxDay, null); if (inputID[1]=="searchform" || inputID[1]=="cancelform") { cal_nights=getStayNights($i("#inDate-"+inputID[1]).datepicker("getDate"), $i("#outDate-"+inputID[1]).datepicker("getDate")); paintDatesUI($i("#inDate-"+inputID[1])); paintDatesUI($i("#outDate-"+inputID[1])); } storeDatesText($i("#inDate-"+inputID[1])); storeDatesText($i("#outDate-"+inputID[1])); }, onChangeMonthYear: function(year, month, obj) { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { fetchHotelAvailability($i('#codigoHotelSeleccionado').val(), year, month, $i(this).attr("id")); } } else if (inputID[1]=="cancelform") { // No hotels availability needed } else { fetchHotelAvailability(inputID[1], year, month, $i(this).attr("id")); } }, beforeShowDay: function(date) { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { return isHotelAvailable($i('#codigoHotelSeleccionado').val(), date, "arrival", "inDate-"+inputID[1]); } else { return [true]; } } else if (inputID[1]=="cancelform") { return [true]; } else { return isHotelAvailable(inputID[1], date, "arrival", "inDate-"+inputID[1]); } } }); // Inicializacion calendario fecha salida var selectedArrivalDate = $i(inputArrivalDate).datepicker("getDate"); var selectedArrivalDateNextDay = getNDaysAfter(selectedArrivalDate, 1); var maxDay = getNDaysAfter(selectedArrivalDate, 62); var selectedDepartureDate = $i(inputDepartureDate).datepicker("getDate"); setCalendarConfiguration(inputDepartureDate, selectedArrivalDateNextDay, maxDay, outDate); $i(inputDepartureDate).datepicker("option", { onSelect: function() { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform" || inputID[1]=="cancelform") { $i("#outDate-"+inputID[1]).find('.ui-widget-content').removeAttr('style').hide(); cal_nights=getStayNights($i("#inDate-"+inputID[1]).datepicker("getDate"), $i("#outDate-"+inputID[1]).datepicker("getDate")); paintDatesUI($i("#outDate-"+inputID[1])); } storeDatesText($i("#outDate-"+inputID[1])); }, onChangeMonthYear: function(year, month, obj) { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { fetchHotelAvailability($i('#codigoHotelSeleccionado').val(), year, month, $i(this).attr("id")); } } else if (inputID[1]=="cancelform") { // No hotels availability needed } else { fetchHotelAvailability(inputID[1], year, month, $i(this).attr("id")); } }, beforeShowDay: function(date) { var inputID = $i(this).attr("id").split("-"); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { return isHotelAvailable($i('#codigoHotelSeleccionado').val(), date, "departure", "outDate-"+inputID[1]); } else { return [true]; } } else if (inputID[1]=="cancelform") { return [true]; } else { return isHotelAvailable(inputID[1], date, "departure", "outDate-"+inputID[1]); } } }); // Obtener datos del hotel en la primera ejecución var inputID = $i(inputArrivalDate).attr("id").split("-"); var inSelectedDate = $i(inputArrivalDate).datepicker("getDate"); var year = inSelectedDate.getFullYear(); var month = inSelectedDate.getMonth(); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { fetchHotelAvailability($i('#codigoHotelSeleccionado').val(), year, month, $i(inputArrivalDate).attr("id")); } } else if (inputID[1]=="cancelform") { // No hotels availability needed } else { fetchHotelAvailability(inputID[1], year, month, $i(inputArrivalDate).attr("id")); } var inputID = $i(inputDepartureDate).attr("id").split("-"); var outSelectedDate = $i(inputDepartureDate).datepicker("getDate"); var year = outSelectedDate.getFullYear(); var month = outSelectedDate.getMonth(); if (inputID[1]=="searchform") { if ($i('#codigoHotelSeleccionado').val()!="") { fetchHotelAvailability($i('#codigoHotelSeleccionado').val(), year, month, $i(inputDepartureDate).attr("id")); } } else if (inputID[1]=="cancelform") { // No hotels availability needed } else { fetchHotelAvailability(inputID[1], year, month, $i(inputDepartureDate).attr("id")); } cal_nights=getStayNights(inputArrivalDate.datepicker("getDate"), inputDepartureDate.datepicker("getDate")); paintDatesUI(inputArrivalDate); paintDatesUI(inputDepartureDate); } function setCalendarConfiguration(obj, minDate, maxDate, selectDate) { $i(obj).datepicker("option", { minDate: minDate, maxDate: maxDate, }); if (selectDate!=null) { /*obj.datepicker("option", { defaultDate: selectDate, });*/ $i(obj).datepicker("setDate",selectDate); } } // Devuelve el numero de noches entre dos fechas function getStayNights(date1, date2) { try{ var tiempoRestante = date2.getTime() - date1.getTime(); var noches = Math.round(tiempoRestante / (1000 * 60 * 60 * 24)); return noches; } catch(err){ return 0; } } // Devuelve la fecha resultante de sumar 'days' dias a la fecha 'date' function getNDaysAfter(date, days) { var after = new Date(date.getTime() + (days * 24 * 60 * 60 * 1000)); var before = after; // Si después de sumar 24 horas, el día es el mismo, agregamos una hora más, porque corresponderá al cambio de horario de verano if (before.getDate()==after.getDate()) after = new Date(after.getTime() + (60 * 60 * 1000)); return after; } // Devuelve la fecha resultante de restar 'days' dias a la fecha 'date' function getNDaysBefore(date, days){ return new Date(date.getTime() - (days * 24 * 60 * 60 * 1000)); } // Indica si la fecha 'date1' es mayor o igual que 'date2' function equalOrGreater(date1, date2){ if(date1.getFullYear() > date2.getFullYear()) return true; else{ if(date1.getFullYear() == date2.getFullYear()){ if(date1.getMonth() > date2.getMonth()) return true; else if(date1.getMonth() == date2.getMonth()){ if(date1.getDate() >= date2.getDate()) return true; else return false; } else return false; } else return false; } } // Indica si la fecha 'date1' es mayor que 'date2' function greater(date1, date2){ if(date1.getFullYear() > date2.getFullYear()) return true; else{ if(date1.getFullYear() == date2.getFullYear()){ if(date1.getMonth() > date2.getMonth()) return true; else if(date1.getMonth() == date2.getMonth()){ if(date1.getDate() > date2.getDate()) return true; else return false; } else return false; } else return false; } } // Indica si la fecha 'date1' es igual que 'date2' function equals(date1, date2){ if ( date1.getFullYear() == date2.getFullYear() && date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate() ) { return true; } else { return false; } } function actionSelectDates(hotelCode) { var inDate = $i("#inDate-" + hotelCode).datepicker("getDate"); var outDate = $i("#outDate-" + hotelCode).datepicker("getDate"); var inDateText = aDayNames[inDate.getDay()] + " " + parseInt(inDate.getDate()) + " " + aMonthNames[inDate.getMonth()] + " " + parseInt(inDate.getFullYear()); var outDateText = aDayNames[outDate.getDay()] + " " + parseInt(outDate.getDate()) + " " + aMonthNames[outDate.getMonth()] + " " + parseInt(outDate.getFullYear()); var nights = getStayNights(inDate, outDate); $i("#inDate-new").text(inDateText); $i("#outDate-new").text(outDateText); $i("#nights-new").text(nights); $i("#loading-price-new").hide(); $i("#unavailable-price-new").hide(); $i("#button-save-price-new").hide(); if (equals(global_inDate, inDate) && equals(global_outDate, outDate)) { $i("#button-price-new").hide(); $i("#price-new").html($i("#price-old").html()); $i("#price-new").show(); } else { $i("#price-new").hide(); $i("#button-price-new").show(); } } // Pinta la interfaz UI a partir de los datos del datepicker function paintDatesUI(obj) { var months=new Array("Jan ","Feb ","Mar ","Apr ","May","Jun ","Jul ","Aug ","Sep ","Oct ","Nov ","Dec "); var weekdays=new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); var date = obj.datepicker("getDate"); $i(obj).parent().parent().find('.day').text(weekdays[date.getDay()]); $i(obj).parent().parent().find('.month').text(months[date.getMonth()]); $i(obj).parent().parent().find('.dayOfMonth').text(date.getDate()); if ($i(obj).attr("id")=="inDate-searchform" || $i(obj).attr("id")=="outDate-searchform") { $i('.nights .num').text(cal_nights); } storeDatesText(obj); } function storeDatesText(obj) { var inputID = $i(obj).attr("id").split("-"); if (inputID[1] != "cancelform") { var months=new Array("January","February","March","April","May","June","July","August","September","October","November","December"); var weekdays=new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); var date = obj.datepicker("getDate"); // Escribimos los nombres de la fecha $i('#'+inputID[0]+'-text').val(date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear()); } } /* Gets availability from a hotel and fill the hashmap */ function fetchHotelAvailability(hotel, year, month, sourceID) { //console.log("fetchHotelAvailability : hotel:" + hotel + " year:" + year + " month:" + month + " sourceID: " + sourceID); var arrivalCalendar = new Array(); for (var i=0; i<=31; i++) arrivalCalendar[i]=["",""]; var departureCalendar = new Array(); for (var i=0; i<=31; i++) departureCalendar[i]=["",""]; var urlRequest = getAvailabilityServiceURL + hotel + "/" + year + "/" + strPad(month,2,0); var requested = availability_requests.get(urlRequest+sourceID); if (!requested) { availability_requests.put(urlRequest+sourceID, true); $i.ajax({ type: "GET", url: urlRequest, data: "rand="+Math.random(), dataType: "json", async: true }).done(function(response){ if (null != response && response.length > 0 ) { $i.each(response, function(key, value) { var aDate = value.date.split("-"); var pos = aDate[2]; if (value.open == false) { arrivalCalendar[pos-1]=["nodisp",""]; departureCalendar[pos-1]=["nodisp",""]; } else { if (value.cta == true){ arrivalCalendar[pos-1]=["cta",""]; } if (value.ctd == true) { departureCalendar[pos-1]=["ctd",""]; } } }); availability_arrival.put(hotel+"/"+month+"/"+year, arrivalCalendar); availability_departure.put(hotel+"/"+month+"/"+year, departureCalendar); if (sourceID!=null) { $i("#"+sourceID).datepicker("refresh"); } } }).fail(function(xhr, status, errorThrown) { availability_requests.put(urlRequest+sourceID,false); }); } } function isHotelAvailable(hotel, date, calendarType, sourceID) { var day = date.getDate(); var month = date.getMonth()+1; var year = date.getFullYear(); var calendarArrival = availability_arrival.get(hotel+"/"+month+"/"+year); var calendarDeparture = availability_departure.get(hotel+"/"+month+"/"+year); switch (calendarType) { case "arrival": calendarData = calendarArrival; break; case "departure": calendarData = calendarDeparture; break; } if (equalOrGreater(date, today)) { if (calendarData!=undefined) { if (calendarData[day-1]!=undefined) { var status=calendarData[day-1][0]; if (status=="nodisp") { /////////////////////////////////////////////////////////////////////////////////// if (calendarType=="departure") { // Obtenemos la fecha de entrada seleccionada var inSelectedDate=$i('#'+sourceID.replace("out","in")).datepicker("getDate"); // El primer día posterior a la fecha de entrada que sea nodisp, se guardará if (equalOrGreater(date, inSelectedDate)) { var fud = firstUnavailableDay.get(hotel); if (fud == undefined) { firstUnavailableDay.put(hotel, new Date(date)); } } //alert(firstUnavailableDay.get(hotel)); var fud = firstUnavailableDay.get(hotel); if (fud == undefined) { if (greater(date, inSelectedDate)) { return [false, "nodisp-calendario"]; } else { return [false]; } } else { if (equals(date,fud)) { return [true]; } else if (equals(date,getNDaysAfter(fud,1))) { return [false, "nodisp-calendario"]; } else { return [false]; } } } else { // claendarType == "arrival" return [false, "nodisp-calendario"]; } } else if (status=="cta" && calendarType=="arrival") { return [false, "cta"]; } else if (status=="ctd" && calendarType=="departure") { return [false, "ctd"]; } else { ///////////////////////////////////////////////////////////////////////////////////////////////// if (calendarType=="departure") { var fud = firstUnavailableDay.get(hotel); if (fud == undefined) { return [true]; } else { if (greater(date,fud)) { //alert("FLASE date: "+date+"\nfud: "+fud); return [false, ""]; } else { return [true]; } } } else { return [true]; } } } else { return [true]; } } else { fetchHotelAvailability(hotel, year, month, sourceID); return [true]; } } else { return [true]; } } /**************************************************************************/ // Seteamos las fechas que vienen del servidor today = new Date( new Number("2019"), new Number("9")-1, new Number("23"), 0, 0, 0 ); tomorrow = getNDaysAfter(today, 1); // Parámetros recibidos por la URL var inDay=""; var inMonth=""; var inYear=""; var outDay=""; var outMonth=""; var outYear=""; var nights=""; // Variables de Calendarios del buscador de hoteles if (inDay && inMonth && inYear) { cal_sessionArrivalDate = new Date( new Number(inYear), new Number(inMonth)-1, new Number(inDay), 0, 0, 0 ); } else { cal_sessionArrivalDate = new Date( new Number("2019"), new Number("9")-1, new Number("23"), 0, 0, 0 ); } if (inDay && inMonth && inYear && outDay && outMonth && outYear) { cal_sessionDepartureDate = new Date( new Number(outYear), new Number(outMonth)-1, new Number(outDay), 0, 0, 0 ); } else { if (nights) { cal_sessionDepartureDate = getNDaysAfter(cal_sessionArrivalDate, nights); } else { cal_sessionDepartureDate = getNDaysAfter(cal_sessionArrivalDate, 1); } } if (cal_sessionDepartureDate<=cal_sessionArrivalDate) cal_sessionDepartureDate=getNDaysAfter(cal_sessionArrivalDate,1); $i(function() { // Habilitar los calendarios del formulario de búsqueda $i('#booking-form .datepicker').datepicker({ monthNames: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ], monthNamesShort: [ 'Jan ', 'Feb ', 'Mar ', 'Apr ', 'May', 'Jun ', 'Jul ', 'Aug ', 'Sep ', 'Oct ', 'Nov ', 'Dec ' ], dayNames: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ], dayNamesMin: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ], firstDay: '0', }); // Mostrar los calendarios sólo al hacer clic en las cajas de calendario $i('#booking-form .dates .datepicker').find('.ui-widget-content').hide(); $i("#booking-form .calendar_from, #booking-form .calendar_to").click(function(obj) { var currentcal=$i(this).closest('.web-ui-input-text').find('.ui-widget-content'); $i(this).closest('.dates').find('.ui-widget-content').not(currentcal).removeAttr('style').hide(); if (currentcal.is(':visible')) { currentcal.hide(); currentcal.attr("style","display:none !important;"); } else { cal_initCalendars($i("#inDate-searchform"), $i("#outDate-searchform")); currentcal.show(); currentcal.attr("style","display:block !important;"); } }); cal_initCalendars($i("#inDate-searchform"), $i("#outDate-searchform"), cal_sessionArrivalDate, cal_sessionDepartureDate); }); /* / J_Inc_Dates.jsp */