/**
* =====================================================================================================================
* includes/__js/cal/wpbc_cal.js
* =====================================================================================================================
*/
/**
* Order or child booking resources saved here: _wpbc.booking__get_param_value( resource_id, 'resources_id_arr__in_dates' ) [2,10,12,11]
*/
/**
* How to check booked times on specific date: ?
*
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21');
console.log(
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_seconds,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[10].booked_time_slots.merged_seconds,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[11].booked_time_slots.merged_seconds,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_seconds
);
* OR
console.log(
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_readable,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[10].booked_time_slots.merged_readable,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[11].booked_time_slots.merged_readable,
_wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_readable
);
*
*/
/**
* Days selection:
* wpbc_calendar__unselect_all_dates( resource_id );
*
* var resource_id = 1;
* Example 1: var num_selected_days = wpbc_auto_select_dates_in_calendar( resource_id, '2024-05-15', '2024-05-25' );
* Example 2: var num_selected_days = wpbc_auto_select_dates_in_calendar( resource_id, ['2024-05-09','2024-05-19','2024-05-25'] );
*
*/
/**
* C A L E N D A R ---------------------------------------------------------------------------------------------------
*/
/**
* Show WPBC Calendar
*
* @param resource_id - resource ID
* @returns {boolean}
*/
function wpbc_calendar_show( resource_id ){
// If no calendar HTML tag, then exit
if ( 0 === jQuery( '#calendar_booking' + resource_id ).length ){ return false; }
// If the calendar with the same Booking resource is activated already, then exit.
if ( true === jQuery( '#calendar_booking' + resource_id ).hasClass( 'hasDatepick' ) ){ return false; }
// -----------------------------------------------------------------------------------------------------------------
// Days selection
// -----------------------------------------------------------------------------------------------------------------
var local__is_range_select = false;
var local__multi_days_select_num = 365; // multiple | fixed
if ( 'dynamic' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ){
local__is_range_select = true;
local__multi_days_select_num = 0;
}
if ( 'single' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ){
local__multi_days_select_num = 0;
}
// -----------------------------------------------------------------------------------------------------------------
// Min - Max days to scroll/show
// -----------------------------------------------------------------------------------------------------------------
var local__min_date = 0;
local__min_date = new Date( _wpbc.get_other_param( 'today_arr' )[ 0 ], (parseInt( _wpbc.get_other_param( 'today_arr' )[ 1 ] ) - 1), _wpbc.get_other_param( 'today_arr' )[ 2 ], 0, 0, 0 ); // FixIn: 9.9.0.17.
//console.log( local__min_date );
var local__max_date = _wpbc.calendar__get_param_value( resource_id, 'booking_max_monthes_in_calendar' );
//local__max_date = new Date(2024, 5, 28); It is here issue of not selectable dates, but some dates showing in calendar as available, but we can not select it.
//// Define last day in calendar (as a last day of month (and not date, which is related to actual 'Today' date).
//// E.g. if today is 2023-09-25, and we set 'Number of months to scroll' as 5 months, then last day will be 2024-02-29 and not the 2024-02-25.
// var cal_last_day_in_month = jQuery.datepick._determineDate( null, local__max_date, new Date() );
// cal_last_day_in_month = new Date( cal_last_day_in_month.getFullYear(), cal_last_day_in_month.getMonth() + 1, 0 );
// local__max_date = cal_last_day_in_month; // FixIn: 10.0.0.26.
if ( ( location.href.indexOf('page=wpbc-new') != -1 )
&& (
( location.href.indexOf('booking_hash') != -1 ) // Comment this line for ability to add booking in past days at Booking > Add booking page.
|| ( location.href.indexOf('allow_past') != -1 ) // FixIn: 10.7.1.2.
)
){
local__min_date = null;
local__max_date = null;
}
var local__start_weekday = _wpbc.calendar__get_param_value( resource_id, 'booking_start_day_weeek' );
var local__number_of_months = parseInt( _wpbc.calendar__get_param_value( resource_id, 'calendar_number_of_months' ) );
jQuery( '#calendar_booking' + resource_id ).text( '' ); // Remove all HTML in calendar tag
// -----------------------------------------------------------------------------------------------------------------
// Show calendar
// -----------------------------------------------------------------------------------------------------------------
jQuery('#calendar_booking'+ resource_id).datepick(
{
beforeShowDay: function ( js_date ){
return wpbc__calendar__apply_css_to_days( js_date, {'resource_id': resource_id}, this );
},
onSelect: function ( string_dates, js_dates_arr ){ /**
* string_dates = '23.08.2023 - 26.08.2023' | '23.08.2023 - 23.08.2023' | '19.09.2023, 24.08.2023, 30.09.2023'
* js_dates_arr = range: [ Date (Aug 23 2023), Date (Aug 25 2023)] | multiple: [ Date(Oct 24 2023), Date(Oct 20 2023), Date(Oct 16 2023) ]
*/
return wpbc__calendar__on_select_days( string_dates, {'resource_id': resource_id}, this );
},
onHover: function ( string_date, js_date ){
return wpbc__calendar__on_hover_days( string_date, js_date, {'resource_id': resource_id}, this );
},
onChangeMonthYear: function ( year, real_month, js_date__1st_day_in_month ){ },
showOn : 'both',
numberOfMonths: local__number_of_months,
stepMonths : 1,
// prevText : '«',
// nextText : '»',
prevText : '‹',
nextText : '›',
dateFormat : 'dd.mm.yy',
changeMonth : false,
changeYear : false,
minDate : local__min_date,
maxDate : local__max_date, // '1Y',
// minDate: new Date(2020, 2, 1), maxDate: new Date(2020, 9, 31), // Ability to set any start and end date in calendar
showStatus : false,
multiSeparator : ', ',
closeAtTop : false,
firstDay : local__start_weekday,
gotoCurrent : false,
hideIfNoPrevNext: true,
multiSelect : local__multi_days_select_num,
rangeSelect : local__is_range_select,
// showWeeks: true,
useThemeRoller: false
}
);
// -----------------------------------------------------------------------------------------------------------------
// Clear today date highlighting
// -----------------------------------------------------------------------------------------------------------------
setTimeout( function (){ wpbc_calendars__clear_days_highlighting( resource_id ); }, 500 ); // FixIn: 7.1.2.8.
// -----------------------------------------------------------------------------------------------------------------
// Scroll calendar to specific month
// -----------------------------------------------------------------------------------------------------------------
var start_bk_month = _wpbc.calendar__get_param_value( resource_id, 'calendar_scroll_to' );
if ( false !== start_bk_month ){
wpbc_calendar__scroll_to( resource_id, start_bk_month[ 0 ], start_bk_month[ 1 ] );
}
}
/**
* Apply CSS to calendar date cells
*
* @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time)
* @param calendar_params_arr - Calendar Settings Object: {
* "resource_id": 4
* }
* @param datepick_this - this of datepick Obj
* @returns {(*|string)[]|(boolean|string)[]} - [ {true -available | false - unavailable}, 'CSS classes for calendar day cell' ]
*/
function wpbc__calendar__apply_css_to_days( date, calendar_params_arr, datepick_this ){
var today_date = new Date( _wpbc.get_other_param( 'today_arr' )[ 0 ], (parseInt( _wpbc.get_other_param( 'today_arr' )[ 1 ] ) - 1), _wpbc.get_other_param( 'today_arr' )[ 2 ], 0, 0, 0 ); // Today JS_Date_Obj.
var class_day = wpbc__get__td_class_date( date ); // '1-9-2023'
var sql_class_day = wpbc__get__sql_class_date( date ); // '2023-01-09'
var resource_id = ( 'undefined' !== typeof(calendar_params_arr[ 'resource_id' ]) ) ? calendar_params_arr[ 'resource_id' ] : '1'; // '1'
// Get Selected dates in calendar
var selected_dates_sql = wpbc_get__selected_dates_sql__as_arr( resource_id );
// Get Data --------------------------------------------------------------------------------------------------------
var date_bookings_obj = _wpbc.bookings_in_calendar__get_for_date( resource_id, sql_class_day );
// Array with CSS classes for date ---------------------------------------------------------------------------------
var css_classes__for_date = [];
css_classes__for_date.push( 'sql_date_' + sql_class_day ); // 'sql_date_2023-07-21'
css_classes__for_date.push( 'cal4date-' + class_day ); // 'cal4date-7-21-2023'
css_classes__for_date.push( 'wpbc_weekday_' + date.getDay() ); // 'wpbc_weekday_4'
// Define Selected Check In/Out dates in TD -----------------------------------------------------------------------
if (
( selected_dates_sql.length )
//&& ( selected_dates_sql[ 0 ] !== selected_dates_sql[ (selected_dates_sql.length - 1) ] )
){
if ( sql_class_day === selected_dates_sql[ 0 ] ){
css_classes__for_date.push( 'selected_check_in' );
css_classes__for_date.push( 'selected_check_in_out' );
}
if ( ( selected_dates_sql.length > 1 ) && ( sql_class_day === selected_dates_sql[ (selected_dates_sql.length - 1) ] ) ) {
css_classes__for_date.push( 'selected_check_out' );
css_classes__for_date.push( 'selected_check_in_out' );
}
}
var is_day_selectable = false;
// If something not defined, then this date closed ---------------------------------------------------------------
if ( false === date_bookings_obj ){
css_classes__for_date.push( 'date_user_unavailable' );
return [ is_day_selectable, css_classes__for_date.join(' ') ];
}
// -----------------------------------------------------------------------------------------------------------------
// date_bookings_obj - Defined. Dates can be selectable.
// -----------------------------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------
// Add season names to the day CSS classes -- it is required for correct work of conditional fields --------------
var season_names_arr = _wpbc.seasons__get_for_date( resource_id, sql_class_day );
for ( var season_key in season_names_arr ){
css_classes__for_date.push( season_names_arr[ season_key ] ); // 'wpdevbk_season_september_2023'
}
// -----------------------------------------------------------------------------------------------------------------
// Cost Rate -------------------------------------------------------------------------------------------------------
css_classes__for_date.push( 'rate_' + date_bookings_obj[ resource_id ][ 'date_cost_rate' ].toString().replace( /[\.\s]/g, '_' ) ); // 'rate_99_00' -> 99.00
if ( parseInt( date_bookings_obj[ 'day_availability' ] ) > 0 ){
is_day_selectable = true;
css_classes__for_date.push( 'date_available' );
css_classes__for_date.push( 'reserved_days_count' + parseInt( date_bookings_obj[ 'max_capacity' ] - date_bookings_obj[ 'day_availability' ] ) );
} else {
is_day_selectable = false;
css_classes__for_date.push( 'date_user_unavailable' );
}
switch ( date_bookings_obj[ 'summary']['status_for_day' ] ){
case 'available':
break;
case 'time_slots_booking':
css_classes__for_date.push( 'timespartly', 'times_clock' );
break;
case 'full_day_booking':
css_classes__for_date.push( 'full_day_booking' );
break;
case 'season_filter':
css_classes__for_date.push( 'date_user_unavailable', 'season_unavailable' );
date_bookings_obj[ 'summary']['status_for_bookings' ] = ''; // Reset booking status color for possible old bookings on this date
break;
case 'resource_availability':
css_classes__for_date.push( 'date_user_unavailable', 'resource_unavailable' );
date_bookings_obj[ 'summary']['status_for_bookings' ] = ''; // Reset booking status color for possible old bookings on this date
break;
case 'weekday_unavailable':
css_classes__for_date.push( 'date_user_unavailable', 'weekday_unavailable' );
date_bookings_obj[ 'summary']['status_for_bookings' ] = ''; // Reset booking status color for possible old bookings on this date
break;
case 'from_today_unavailable':
css_classes__for_date.push( 'date_user_unavailable', 'from_today_unavailable' );
date_bookings_obj[ 'summary']['status_for_bookings' ] = ''; // Reset booking status color for possible old bookings on this date
break;
case 'limit_available_from_today':
css_classes__for_date.push( 'date_user_unavailable', 'limit_available_from_today' );
date_bookings_obj[ 'summary']['status_for_bookings' ] = ''; // Reset booking status color for possible old bookings on this date
break;
case 'change_over':
/*
*
// check_out_time_date2approve check_in_time_date2approve
// check_out_time_date2approve check_in_time_date_approved
// check_in_time_date2approve check_out_time_date_approved
// check_out_time_date_approved check_in_time_date_approved
*/
css_classes__for_date.push( 'timespartly', 'check_in_time', 'check_out_time' );
// FixIn: 10.0.0.2.
if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'approved_pending' ) > -1 ){
css_classes__for_date.push( 'check_out_time_date_approved', 'check_in_time_date2approve' );
}
if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'pending_approved' ) > -1 ){
css_classes__for_date.push( 'check_out_time_date2approve', 'check_in_time_date_approved' );
}
break;
case 'check_in':
css_classes__for_date.push( 'timespartly', 'check_in_time' );
// FixIn: 9.9.0.33.
if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'pending' ) > -1 ){
css_classes__for_date.push( 'check_in_time_date2approve' );
} else if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'approved' ) > -1 ){
css_classes__for_date.push( 'check_in_time_date_approved' );
}
break;
case 'check_out':
css_classes__for_date.push( 'timespartly', 'check_out_time' );
// FixIn: 9.9.0.33.
if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'pending' ) > -1 ){
css_classes__for_date.push( 'check_out_time_date2approve' );
} else if ( date_bookings_obj[ 'summary' ][ 'status_for_bookings' ].indexOf( 'approved' ) > -1 ){
css_classes__for_date.push( 'check_out_time_date_approved' );
}
break;
default:
// mixed statuses: 'change_over check_out' .... variations.... check more in function wpbc_get_availability_per_days_arr()
date_bookings_obj[ 'summary']['status_for_day' ] = 'available';
}
if ( 'available' != date_bookings_obj[ 'summary']['status_for_day' ] ){
var is_set_pending_days_selectable = _wpbc.calendar__get_param_value( resource_id, 'pending_days_selectable' ); // set pending days selectable // FixIn: 8.6.1.18.
switch ( date_bookings_obj[ 'summary']['status_for_bookings' ] ){
case '':
// Usually it's means that day is available or unavailable without the bookings
break;
case 'pending':
css_classes__for_date.push( 'date2approve' );
is_day_selectable = (is_day_selectable) ? true : is_set_pending_days_selectable;
break;
case 'approved':
css_classes__for_date.push( 'date_approved' );
break;
// Situations for "change-over" days: ----------------------------------------------------------------------
case 'pending_pending':
css_classes__for_date.push( 'check_out_time_date2approve', 'check_in_time_date2approve' );
is_day_selectable = (is_day_selectable) ? true : is_set_pending_days_selectable;
break;
case 'pending_approved':
css_classes__for_date.push( 'check_out_time_date2approve', 'check_in_time_date_approved' );
is_day_selectable = (is_day_selectable) ? true : is_set_pending_days_selectable;
break;
case 'approved_pending':
css_classes__for_date.push( 'check_out_time_date_approved', 'check_in_time_date2approve' );
is_day_selectable = (is_day_selectable) ? true : is_set_pending_days_selectable;
break;
case 'approved_approved':
css_classes__for_date.push( 'check_out_time_date_approved', 'check_in_time_date_approved' );
break;
default:
}
}
return [ is_day_selectable, css_classes__for_date.join( ' ' ) ];
}
/**
* Mouseover calendar date cells
*
* @param string_date
* @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time)
* @param calendar_params_arr - Calendar Settings Object: {
* "resource_id": 4
* }
* @param datepick_this - this of datepick Obj
* @returns {boolean}
*/
function wpbc__calendar__on_hover_days( string_date, date, calendar_params_arr, datepick_this ) {
if ( null === date ) {
wpbc_calendars__clear_days_highlighting( ('undefined' !== typeof (calendar_params_arr[ 'resource_id' ])) ? calendar_params_arr[ 'resource_id' ] : '1' ); // FixIn: 10.5.2.4.
return false;
}
var class_day = wpbc__get__td_class_date( date ); // '1-9-2023'
var sql_class_day = wpbc__get__sql_class_date( date ); // '2023-01-09'
var resource_id = ( 'undefined' !== typeof(calendar_params_arr[ 'resource_id' ]) ) ? calendar_params_arr[ 'resource_id' ] : '1'; // '1'
// Get Data --------------------------------------------------------------------------------------------------------
var date_booking_obj = _wpbc.bookings_in_calendar__get_for_date( resource_id, sql_class_day ); // {...}
if ( ! date_booking_obj ){ return false; }
// T o o l t i p s -------------------------------------------------------------------------------------------------
var tooltip_text = '';
if ( date_booking_obj[ 'summary']['tooltip_availability' ].length > 0 ){
tooltip_text += date_booking_obj[ 'summary']['tooltip_availability' ];
}
if ( date_booking_obj[ 'summary']['tooltip_day_cost' ].length > 0 ){
tooltip_text += date_booking_obj[ 'summary']['tooltip_day_cost' ];
}
if ( date_booking_obj[ 'summary']['tooltip_times' ].length > 0 ){
tooltip_text += date_booking_obj[ 'summary']['tooltip_times' ];
}
if ( date_booking_obj[ 'summary']['tooltip_booking_details' ].length > 0 ){
tooltip_text += date_booking_obj[ 'summary']['tooltip_booking_details' ];
}
wpbc_set_tooltip___for__calendar_date( tooltip_text, resource_id, class_day );
// U n h o v e r i n g in UNSELECTABLE_CALENDAR ------------------------------------------------------------
var is_unselectable_calendar = ( jQuery( '#calendar_booking_unselectable' + resource_id ).length > 0); // FixIn: 8.0.1.2.
var is_booking_form_exist = ( jQuery( '#booking_form_div' + resource_id ).length > 0 );
if ( ( is_unselectable_calendar ) && ( ! is_booking_form_exist ) ){
/**
* Un Hover all dates in calendar (without the booking form), if only Availability Calendar here and we do not insert Booking form by mistake.
*/
wpbc_calendars__clear_days_highlighting( resource_id ); // Clear days highlighting
var css_of_calendar = '.wpbc_only_calendar #calendar_booking' + resource_id;
jQuery( css_of_calendar + ' .datepick-days-cell, '
+ css_of_calendar + ' .datepick-days-cell a' ).css( 'cursor', 'default' ); // Set cursor to Default
return false;
}
// D a y s H o v e r i n g ------------------------------------------------------------------------------------
if (
( location.href.indexOf( 'page=wpbc' ) == -1 )
|| ( location.href.indexOf( 'page=wpbc-new' ) > 0 )
|| ( location.href.indexOf( 'page=wpbc-setup' ) > 0 )
|| ( location.href.indexOf( 'page=wpbc-availability' ) > 0 )
|| ( ( location.href.indexOf( 'page=wpbc-settings' ) > 0 ) &&
( location.href.indexOf( '&tab=form' ) > 0 )
)
){
// The same as dates selection, but for days hovering
if ( 'function' == typeof( wpbc__calendar__do_days_highlight__bs ) ){
wpbc__calendar__do_days_highlight__bs( sql_class_day, date, resource_id );
}
}
}
/**
* Select calendar date cells
*
* @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time)
* @param calendar_params_arr - Calendar Settings Object: {
* "resource_id": 4
* }
* @param datepick_this - this of datepick Obj
*
*/
function wpbc__calendar__on_select_days( date, calendar_params_arr, datepick_this ){
var resource_id = ( 'undefined' !== typeof(calendar_params_arr[ 'resource_id' ]) ) ? calendar_params_arr[ 'resource_id' ] : '1'; // '1'
// Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake).
var is_unselectable_calendar = ( jQuery( '#calendar_booking_unselectable' + resource_id ).length > 0); // FixIn: 8.0.1.2.
var is_booking_form_exist = ( jQuery( '#booking_form_div' + resource_id ).length > 0 );
if ( ( is_unselectable_calendar ) && ( ! is_booking_form_exist ) ){
wpbc_calendar__unselect_all_dates( resource_id ); // Unselect Dates
jQuery('.wpbc_only_calendar .popover_calendar_hover').remove(); // Hide all opened popovers
return false;
}
jQuery( '#date_booking' + resource_id ).val( date ); // Add selected dates to hidden textarea
if ( 'function' === typeof (wpbc__calendar__do_days_select__bs) ){ wpbc__calendar__do_days_select__bs( date, resource_id ); }
wpbc_disable_time_fields_in_booking_form( resource_id );
// Hook -- trigger day selection -----------------------------------------------------------------------------------
var mouse_clicked_dates = date; // Can be: "05.10.2023 - 07.10.2023" | "10.10.2023 - 10.10.2023" |
var all_selected_dates_arr = wpbc_get__selected_dates_sql__as_arr( resource_id ); // Can be: [ "2023-10-05", "2023-10-06", "2023-10-07", … ]
jQuery( ".booking_form_div" ).trigger( "date_selected", [ resource_id, mouse_clicked_dates, all_selected_dates_arr ] );
}
// Mark middle selected dates with 0.5 opacity // FixIn: 10.3.0.9.
jQuery( document ).ready( function (){
jQuery( ".booking_form_div" ).on( 'date_selected', function ( event, resource_id, date ){
if (
( 'fixed' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ))
|| ('dynamic' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ))
){
var closed_timer = setTimeout( function (){
var middle_days_opacity = _wpbc.get_other_param( 'calendars__days_selection__middle_days_opacity' );
jQuery( '#calendar_booking' + resource_id + ' .datepick-current-day' ).not( ".selected_check_in_out" ).css( 'opacity', middle_days_opacity );
}, 10 );
}
} );
} );
/**
* -- T i m e F i e l d s start --------------------------------------------------------------------------
*/
/**
* Disable time slots in booking form depend on selected dates and booked dates/times
*
* @param resource_id
*/
function wpbc_disable_time_fields_in_booking_form( resource_id ){
/**
* 1. Get all time fields in the booking form as array of objects
* [
* { jquery_option: jQuery_Object {}
* name: 'rangetime2[]'
* times_as_seconds: [ 21600, 23400 ]
* value_option_24h: '06:00 - 06:30'
* }
* ...
* { jquery_option: jQuery_Object {}
* name: 'starttime2[]'
* times_as_seconds: [ 21600 ]
* value_option_24h: '06:00'
* }
* ]
*/
var time_fields_obj_arr = wpbc_get__time_fields__in_booking_form__as_arr( resource_id );
// 2. Get all selected dates in SQL format like this [ "2023-08-23", "2023-08-24", "2023-08-25", ... ]
var selected_dates_arr = wpbc_get__selected_dates_sql__as_arr( resource_id );
// 3. Get child booking resources or single booking resource that exist in dates
var child_resources_arr = wpbc_clone_obj( _wpbc.booking__get_param_value( resource_id, 'resources_id_arr__in_dates' ) );
var sql_date;
var child_resource_id;
var merged_seconds;
var time_fields_obj;
var is_intersect;
var is_check_in;
var today_time__real = new Date( _wpbc.get_other_param( 'time_local_arr' )[0], ( parseInt( _wpbc.get_other_param( 'time_local_arr' )[1] ) - 1), _wpbc.get_other_param( 'time_local_arr' )[2], _wpbc.get_other_param( 'time_local_arr' )[3], _wpbc.get_other_param( 'time_local_arr' )[4], 0 );
var today_time__shift = new Date( _wpbc.get_other_param( 'today_arr' )[0], ( parseInt( _wpbc.get_other_param( 'today_arr' )[1] ) - 1), _wpbc.get_other_param( 'today_arr' )[2], _wpbc.get_other_param( 'today_arr' )[3], _wpbc.get_other_param( 'today_arr' )[4], 0 );
// 4. Loop all time Fields options // FixIn: 10.3.0.2.
for ( let field_key = 0; field_key < time_fields_obj_arr.length; field_key++ ){
time_fields_obj_arr[ field_key ].disabled = 0; // By default, this time field is not disabled.
time_fields_obj = time_fields_obj_arr[ field_key ]; // { times_as_seconds: [ 21600, 23400 ], value_option_24h: '06:00 - 06:30', name: 'rangetime2[]', jquery_option: jQuery_Object {}}
// Loop all selected dates.
for ( var i = 0; i < selected_dates_arr.length; i++ ) {
// Get Date: '2023-08-18'.
sql_date = selected_dates_arr[ i ];
var is_time_in_past = wpbc_check_is_time_in_past( today_time__shift, sql_date, time_fields_obj );
if ( is_time_in_past ) {
// This time for selected date already in the past.
time_fields_obj_arr[field_key].disabled = 1;
break; // exist from Dates LOOP.
}
// FixIn: 9.9.0.31.
if (
( 'Off' === _wpbc.calendar__get_param_value( resource_id, 'booking_recurrent_time' ) )
&& ( selected_dates_arr.length>1 )
){
//TODO: skip some fields checking if it's start / end time for mulple dates selection mode.
//TODO: we need to fix situation for entimes, when user select several dates, and in start time booked 00:00 - 15:00 , but systsme block untill 15:00 the end time as well, which is wrong, because it 2 or 3 dates selection and end date can be fullu available
if ( (0 == i) && (time_fields_obj[ 'name' ].indexOf( 'endtime' ) >= 0) ){
break;
}
if ( ( (selected_dates_arr.length-1) == i ) && (time_fields_obj[ 'name' ].indexOf( 'starttime' ) >= 0) ){
break;
}
}
var how_many_resources_intersected = 0;
// Loop all resources ID
// for ( var res_key in child_resources_arr ){ // FixIn: 10.3.0.2.
for ( let res_key = 0; res_key < child_resources_arr.length; res_key++ ){
child_resource_id = child_resources_arr[ res_key ];
// _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_seconds = [ "07:00:11 - 07:30:02", "10:00:11 - 00:00:00" ]
// _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_seconds = [ [ 25211, 27002 ], [ 36011, 86400 ] ]
if ( false !== _wpbc.bookings_in_calendar__get_for_date( resource_id, sql_date ) ){
merged_seconds = _wpbc.bookings_in_calendar__get_for_date( resource_id, sql_date )[ child_resource_id ].booked_time_slots.merged_seconds; // [ [ 25211, 27002 ], [ 36011, 86400 ] ]
} else {
merged_seconds = [];
}
if ( time_fields_obj.times_as_seconds.length > 1 ){
is_intersect = wpbc_is_intersect__range_time_interval( [
[
( parseInt( time_fields_obj.times_as_seconds[0] ) + 20 ),
( parseInt( time_fields_obj.times_as_seconds[1] ) - 20 )
]
]
, merged_seconds );
} else {
is_check_in = (-1 !== time_fields_obj.name.indexOf( 'start' ));
is_intersect = wpbc_is_intersect__one_time_interval(
( ( is_check_in )
? parseInt( time_fields_obj.times_as_seconds ) + 20
: parseInt( time_fields_obj.times_as_seconds ) - 20
)
, merged_seconds );
}
if (is_intersect){
how_many_resources_intersected++; // Increase
}
}
if ( child_resources_arr.length == how_many_resources_intersected ) {
// All resources intersected, then it's means that this time-slot or time must be Disabled, and we can exist from selected_dates_arr LOOP
time_fields_obj_arr[ field_key ].disabled = 1;
break; // exist from Dates LOOP
}
}
}
// 5. Now we can disable time slot in HTML by using ( field.disabled == 1 ) property
wpbc__html__time_field_options__set_disabled( time_fields_obj_arr );
jQuery( ".booking_form_div" ).trigger( 'wpbc_hook_timeslots_disabled', [resource_id, selected_dates_arr] ); // Trigger hook on disabling timeslots. Usage: jQuery( ".booking_form_div" ).on( 'wpbc_hook_timeslots_disabled', function ( event, bk_type, all_dates ){ ... } ); // FixIn: 8.7.11.9.
}
/**
* Check if specific time(-slot) already in the past for selected date
*
* @param js_current_time_to_check - JS Date
* @param sql_date - '2025-01-26'
* @param time_fields_obj - Object
* @returns {boolean}
*/
function wpbc_check_is_time_in_past( js_current_time_to_check, sql_date, time_fields_obj ) {
// FixIn: 10.9.6.4
var sql_date_arr = sql_date.split( '-' );
var sql_date__midnight = new Date( parseInt( sql_date_arr[0] ), ( parseInt( sql_date_arr[1] ) - 1 ), parseInt( sql_date_arr[2] ), 0, 0, 0 );
var sql_date__midnight_miliseconds = sql_date__midnight.getTime();
var is_intersect = false;
if ( time_fields_obj.times_as_seconds.length > 1 ) {
if ( js_current_time_to_check.getTime() > (sql_date__midnight_miliseconds + (parseInt( time_fields_obj.times_as_seconds[0] ) + 20) * 1000) ) {
is_intersect = true;
}
if ( js_current_time_to_check.getTime() > (sql_date__midnight_miliseconds + (parseInt( time_fields_obj.times_as_seconds[1] ) - 20) * 1000) ) {
is_intersect = true;
}
} else {
var is_check_in = (-1 !== time_fields_obj.name.indexOf( 'start' ));
var times_as_seconds_check = (is_check_in) ? parseInt( time_fields_obj.times_as_seconds ) + 20 : parseInt( time_fields_obj.times_as_seconds ) - 20;
times_as_seconds_check = sql_date__midnight_miliseconds + times_as_seconds_check * 1000;
if ( js_current_time_to_check.getTime() > times_as_seconds_check ) {
is_intersect = true;
}
}
return is_intersect;
}
/**
* Is number inside /intersect of array of intervals ?
*
* @param time_A - 25800
* @param time_interval_B - [ [ 25211, 27002 ], [ 36011, 86400 ] ]
* @returns {boolean}
*/
function wpbc_is_intersect__one_time_interval( time_A, time_interval_B ){
for ( var j = 0; j < time_interval_B.length; j++ ){
if ( (parseInt( time_A ) > parseInt( time_interval_B[ j ][ 0 ] )) && (parseInt( time_A ) < parseInt( time_interval_B[ j ][ 1 ] )) ){
return true
}
// if ( ( parseInt( time_A ) == parseInt( time_interval_B[ j ][ 0 ] ) ) || ( parseInt( time_A ) == parseInt( time_interval_B[ j ][ 1 ] ) ) ) {
// // Time A just at the border of interval
// }
}
return false;
}
/**
* Is these array of intervals intersected ?
*
* @param time_interval_A - [ [ 21600, 23400 ] ]
* @param time_interval_B - [ [ 25211, 27002 ], [ 36011, 86400 ] ]
* @returns {boolean}
*/
function wpbc_is_intersect__range_time_interval( time_interval_A, time_interval_B ){
var is_intersect;
for ( var i = 0; i < time_interval_A.length; i++ ){
for ( var j = 0; j < time_interval_B.length; j++ ){
is_intersect = wpbc_intervals__is_intersected( time_interval_A[ i ], time_interval_B[ j ] );
if ( is_intersect ){
return true;
}
}
}
return false;
}
/**
* Get all time fields in the booking form as array of objects
*
* @param resource_id
* @returns []
*
* Example:
* [
* {
* value_option_24h: '06:00 - 06:30'
* times_as_seconds: [ 21600, 23400 ]
* jquery_option: jQuery_Object {}
* name: 'rangetime2[]'
* }
* ...
* {
* value_option_24h: '06:00'
* times_as_seconds: [ 21600 ]
* jquery_option: jQuery_Object {}
* name: 'starttime2[]'
* }
* ]
*/
function wpbc_get__time_fields__in_booking_form__as_arr( resource_id ){
/**
* Fields with [] like this select[name="rangetime1[]"]
* it's when we have 'multiple' in shortcode: [select* rangetime multiple "06:00 - 06:30" ... ]
*/
var time_fields_arr=[
'select[name="rangetime' + resource_id + '"]',
'select[name="rangetime' + resource_id + '[]"]',
'select[name="starttime' + resource_id + '"]',
'select[name="starttime' + resource_id + '[]"]',
'select[name="endtime' + resource_id + '"]',
'select[name="endtime' + resource_id + '[]"]'
];
var time_fields_obj_arr = [];
// Loop all Time Fields
for ( var ctf= 0; ctf < time_fields_arr.length; ctf++ ){
var time_field = time_fields_arr[ ctf ];
var time_option = jQuery( time_field + ' option' );
// Loop all options in time field
for ( var j = 0; j < time_option.length; j++ ){
var jquery_option = jQuery( time_field + ' option:eq(' + j + ')' );
var value_option_seconds_arr = jquery_option.val().split( '-' );
var times_as_seconds = [];
// Get time as seconds
if ( value_option_seconds_arr.length ){ // FixIn: 9.8.10.1.
for ( let i = 0; i < value_option_seconds_arr.length; i++ ){ // FixIn: 10.0.0.56.
// value_option_seconds_arr[i] = '14:00 ' | ' 16:00' (if from 'rangetime') and '16:00' if (start/end time)
var start_end_times_arr = value_option_seconds_arr[ i ].trim().split( ':' );
var time_in_seconds = parseInt( start_end_times_arr[ 0 ] ) * 60 * 60 + parseInt( start_end_times_arr[ 1 ] ) * 60;
times_as_seconds.push( time_in_seconds );
}
}
time_fields_obj_arr.push( {
'name' : jQuery( time_field ).attr( 'name' ),
'value_option_24h': jquery_option.val(),
'jquery_option' : jquery_option,
'times_as_seconds': times_as_seconds
} );
}
}
return time_fields_obj_arr;
}
/**
* Disable HTML options and add booked CSS class
*
* @param time_fields_obj_arr - this value is from the func: wpbc_get__time_fields__in_booking_form__as_arr( resource_id )
* [
* { jquery_option: jQuery_Object {}
* name: 'rangetime2[]'
* times_as_seconds: [ 21600, 23400 ]
* value_option_24h: '06:00 - 06:30'
* disabled = 1
* }
* ...
* { jquery_option: jQuery_Object {}
* name: 'starttime2[]'
* times_as_seconds: [ 21600 ]
* value_option_24h: '06:00'
* disabled = 0
* }
* ]
*
*/
function wpbc__html__time_field_options__set_disabled( time_fields_obj_arr ){
var jquery_option;
for ( var i = 0; i < time_fields_obj_arr.length; i++ ){
var jquery_option = time_fields_obj_arr[ i ].jquery_option;
if ( 1 == time_fields_obj_arr[ i ].disabled ){
jquery_option.prop( 'disabled', true ); // Make disable some options
jquery_option.addClass( 'booked' ); // Add "booked" CSS class
// if this booked element selected --> then deselect it
if ( jquery_option.prop( 'selected' ) ){
jquery_option.prop( 'selected', false );
jquery_option.parent().find( 'option:not([disabled]):first' ).prop( 'selected', true ).trigger( "change" );
}
} else {
jquery_option.prop( 'disabled', false ); // Make active all times
jquery_option.removeClass( 'booked' ); // Remove class "booked"
}
}
}
/**
* Check if this time_range | Time_Slot is Full Day booked
*
* @param timeslot_arr_in_seconds - [ 36011, 86400 ]
* @returns {boolean}
*/
function wpbc_is_this_timeslot__full_day_booked( timeslot_arr_in_seconds ){
if (
( timeslot_arr_in_seconds.length > 1 )
&& ( parseInt( timeslot_arr_in_seconds[ 0 ] ) < 30 )
&& ( parseInt( timeslot_arr_in_seconds[ 1 ] ) > ( (24 * 60 * 60) - 30) )
){
return true;
}
return false;
}
// -----------------------------------------------------------------------------------------------------------------
/* == S e l e c t e d D a t e s / T i m e - F i e l d s ==
// ----------------------------------------------------------------------------------------------------------------- */
/**
* Get all selected dates in SQL format like this [ "2023-08-23", "2023-08-24" , ... ]
*
* @param resource_id
* @returns {[]} [ "2023-08-23", "2023-08-24", "2023-08-25", "2023-08-26", "2023-08-27", "2023-08-28", "2023-08-29" ]
*/
function wpbc_get__selected_dates_sql__as_arr( resource_id ){
var selected_dates_arr = [];
selected_dates_arr = jQuery( '#date_booking' + resource_id ).val().split(',');
if ( selected_dates_arr.length ){ // FixIn: 9.8.10.1.
for ( let i = 0; i < selected_dates_arr.length; i++ ){ // FixIn: 10.0.0.56.
selected_dates_arr[ i ] = selected_dates_arr[ i ].trim();
selected_dates_arr[ i ] = selected_dates_arr[ i ].split( '.' );
if ( selected_dates_arr[ i ].length > 1 ){
selected_dates_arr[ i ] = selected_dates_arr[ i ][ 2 ] + '-' + selected_dates_arr[ i ][ 1 ] + '-' + selected_dates_arr[ i ][ 0 ];
}
}
}
// Remove empty elements from an array
selected_dates_arr = selected_dates_arr.filter( function ( n ){ return parseInt(n); } );
selected_dates_arr.sort();
return selected_dates_arr;
}
/**
* Get all time fields in the booking form as array of objects
*
* @param resource_id
* @param is_only_selected_time
* @returns []
*
* Example:
* [
* {
* value_option_24h: '06:00 - 06:30'
* times_as_seconds: [ 21600, 23400 ]
* jquery_option: jQuery_Object {}
* name: 'rangetime2[]'
* }
* ...
* {
* value_option_24h: '06:00'
* times_as_seconds: [ 21600 ]
* jquery_option: jQuery_Object {}
* name: 'starttime2[]'
* }
* ]
*/
function wpbc_get__selected_time_fields__in_booking_form__as_arr( resource_id, is_only_selected_time = true ){
/**
* Fields with [] like this select[name="rangetime1[]"]
* it's when we have 'multiple' in shortcode: [select* rangetime multiple "06:00 - 06:30" ... ]
*/
var time_fields_arr=[
'select[name="rangetime' + resource_id + '"]',
'select[name="rangetime' + resource_id + '[]"]',
'select[name="starttime' + resource_id + '"]',
'select[name="starttime' + resource_id + '[]"]',
'select[name="endtime' + resource_id + '"]',
'select[name="endtime' + resource_id + '[]"]',
'select[name="durationtime' + resource_id + '"]',
'select[name="durationtime' + resource_id + '[]"]'
];
var time_fields_obj_arr = [];
// Loop all Time Fields
for ( var ctf= 0; ctf < time_fields_arr.length; ctf++ ){
var time_field = time_fields_arr[ ctf ];
var time_option;
if ( is_only_selected_time ){
time_option = jQuery( '#booking_form' + resource_id + ' ' + time_field + ' option:selected' ); // Exclude conditional fields, because of using '#booking_form3 ...'
} else {
time_option = jQuery( '#booking_form' + resource_id + ' ' + time_field + ' option' ); // All time fields
}
// Loop all options in time field
for ( var j = 0; j < time_option.length; j++ ){
var jquery_option = jQuery( time_option[ j ] ); // Get only selected options //jQuery( time_field + ' option:eq(' + j + ')' );
var value_option_seconds_arr = jquery_option.val().split( '-' );
var times_as_seconds = [];
// Get time as seconds
if ( value_option_seconds_arr.length ){ // FixIn: 9.8.10.1.
for ( let i = 0; i < value_option_seconds_arr.length; i++ ){ // FixIn: 10.0.0.56.
// value_option_seconds_arr[i] = '14:00 ' | ' 16:00' (if from 'rangetime') and '16:00' if (start/end time)
var start_end_times_arr = value_option_seconds_arr[ i ].trim().split( ':' );
var time_in_seconds = parseInt( start_end_times_arr[ 0 ] ) * 60 * 60 + parseInt( start_end_times_arr[ 1 ] ) * 60;
times_as_seconds.push( time_in_seconds );
}
}
time_fields_obj_arr.push( {
'name' : jQuery( '#booking_form' + resource_id + ' ' + time_field ).attr( 'name' ),
'value_option_24h': jquery_option.val(),
'jquery_option' : jquery_option,
'times_as_seconds': times_as_seconds
} );
}
}
// Text: [starttime] - [endtime] -----------------------------------------------------------------------------
var text_time_fields_arr=[
'input[name="starttime' + resource_id + '"]',
'input[name="endtime' + resource_id + '"]',
];
for ( var tf= 0; tf < text_time_fields_arr.length; tf++ ){
var text_jquery = jQuery( '#booking_form' + resource_id + ' ' + text_time_fields_arr[ tf ] ); // Exclude conditional fields, because of using '#booking_form3 ...'
if ( text_jquery.length > 0 ){
var time__h_m__arr = text_jquery.val().trim().split( ':' ); // '14:00'
if ( 0 == time__h_m__arr.length ){
continue; // Not entered time value in a field
}
if ( 1 == time__h_m__arr.length ){
if ( '' === time__h_m__arr[ 0 ] ){
continue; // Not entered time value in a field
}
time__h_m__arr[ 1 ] = 0;
}
var text_time_in_seconds = parseInt( time__h_m__arr[ 0 ] ) * 60 * 60 + parseInt( time__h_m__arr[ 1 ] ) * 60;
var text_times_as_seconds = [];
text_times_as_seconds.push( text_time_in_seconds );
time_fields_obj_arr.push( {
'name' : text_jquery.attr( 'name' ),
'value_option_24h': text_jquery.val(),
'jquery_option' : text_jquery,
'times_as_seconds': text_times_as_seconds
} );
}
}
return time_fields_obj_arr;
}
// ---------------------------------------------------------------------------------------------------------------------
/* == S U P P O R T for C A L E N D A R ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* Get Calendar datepick Instance
* @param resource_id of booking resource
* @returns {*|null}
*/
function wpbc_calendar__get_inst( resource_id ){
if ( 'undefined' === typeof (resource_id) ){
resource_id = '1';
}
if ( jQuery( '#calendar_booking' + resource_id ).length > 0 ){
return jQuery.datepick._getInst( jQuery( '#calendar_booking' + resource_id ).get( 0 ) );
}
return null;
}
/**
* Unselect all dates in calendar and visually update this calendar
*
* @param resource_id ID of booking resource
* @returns {boolean} true on success | false, if no such calendar
*/
function wpbc_calendar__unselect_all_dates( resource_id ){
if ( 'undefined' === typeof (resource_id) ){
resource_id = '1';
}
var inst = wpbc_calendar__get_inst( resource_id )
if ( null !== inst ){
// Unselect all dates and set properties of Datepick
jQuery( '#date_booking' + resource_id ).val( '' ); //FixIn: 5.4.3
inst.stayOpen = false;
inst.dates = [];
jQuery.datepick._updateDatepick( inst );
return true
}
return false;
}
/**
* Clear days highlighting in All or specific Calendars
*
* @param resource_id - can be skiped to clear highlighting in all calendars
*/
function wpbc_calendars__clear_days_highlighting( resource_id ){
if ( 'undefined' !== typeof ( resource_id ) ){
jQuery( '#calendar_booking' + resource_id + ' .datepick-days-cell-over' ).removeClass( 'datepick-days-cell-over' ); // Clear in specific calendar
} else {
jQuery( '.datepick-days-cell-over' ).removeClass( 'datepick-days-cell-over' ); // Clear in all calendars
}
}
/**
* Scroll to specific month in calendar
*
* @param resource_id ID of resource
* @param year - real year - 2023
* @param month - real month - 12
* @returns {boolean}
*/
function wpbc_calendar__scroll_to( resource_id, year, month ){
if ( 'undefined' === typeof (resource_id) ){ resource_id = '1'; }
var inst = wpbc_calendar__get_inst( resource_id )
if ( null !== inst ){
year = parseInt( year );
month = parseInt( month ) - 1; // In JS date, month -1
inst.cursorDate = new Date();
// In some cases, the setFullYear can set only Year, and not the Month and day // FixIn: 6.2.3.5.
inst.cursorDate.setFullYear( year, month, 1 );
inst.cursorDate.setMonth( month );
inst.cursorDate.setDate( 1 );
inst.drawMonth = inst.cursorDate.getMonth();
inst.drawYear = inst.cursorDate.getFullYear();
jQuery.datepick._notifyChange( inst );
jQuery.datepick._adjustInstDate( inst );
jQuery.datepick._showDate( inst );
jQuery.datepick._updateDatepick( inst );
return true;
}
return false;
}
/**
* Is this date selectable in calendar (mainly it's means AVAILABLE date)
*
* @param {int|string} resource_id 1
* @param {string} sql_class_day '2023-08-11'
* @returns {boolean} true | false
*/
function wpbc_is_this_day_selectable( resource_id, sql_class_day ){
// Get Data --------------------------------------------------------------------------------------------------------
var date_bookings_obj = _wpbc.bookings_in_calendar__get_for_date( resource_id, sql_class_day );
var is_day_selectable = ( parseInt( date_bookings_obj[ 'day_availability' ] ) > 0 );
if ( typeof (date_bookings_obj[ 'summary' ]) === 'undefined' ){
return is_day_selectable;
}
if ( 'available' != date_bookings_obj[ 'summary']['status_for_day' ] ){
var is_set_pending_days_selectable = _wpbc.calendar__get_param_value( resource_id, 'pending_days_selectable' ); // set pending days selectable // FixIn: 8.6.1.18.
switch ( date_bookings_obj[ 'summary']['status_for_bookings' ] ){
case 'pending':
// Situations for "change-over" days:
case 'pending_pending':
case 'pending_approved':
case 'approved_pending':
is_day_selectable = (is_day_selectable) ? true : is_set_pending_days_selectable;
break;
default:
}
}
return is_day_selectable;
}
/**
* Is date to check IN array of selected dates
*
* @param {date}js_date_to_check - JS Date - simple JavaScript Date object
* @param {[]} js_dates_arr - [ JSDate, ... ] - array of JS dates
* @returns {boolean}
*/
function wpbc_is_this_day_among_selected_days( js_date_to_check, js_dates_arr ){
for ( var date_index = 0; date_index < js_dates_arr.length ; date_index++ ){ // FixIn: 8.4.5.16.
if ( ( js_dates_arr[ date_index ].getFullYear() === js_date_to_check.getFullYear() ) &&
( js_dates_arr[ date_index ].getMonth() === js_date_to_check.getMonth() ) &&
( js_dates_arr[ date_index ].getDate() === js_date_to_check.getDate() ) ) {
return true;
}
}
return false;
}
/**
* Get SQL Class Date '2023-08-01' from JS Date
*
* @param date JS Date
* @returns {string} '2023-08-12'
*/
function wpbc__get__sql_class_date( date ){
var sql_class_day = date.getFullYear() + '-';
sql_class_day += ( ( date.getMonth() + 1 ) < 10 ) ? '0' : '';
sql_class_day += ( date.getMonth() + 1 ) + '-'
sql_class_day += ( date.getDate() < 10 ) ? '0' : '';
sql_class_day += date.getDate();
return sql_class_day;
}
/**
* Get JS Date from the SQL date format '2024-05-14'
* @param sql_class_date
* @returns {Date}
*/
function wpbc__get__js_date( sql_class_date ){
var sql_class_date_arr = sql_class_date.split( '-' );
var date_js = new Date();
date_js.setFullYear( parseInt( sql_class_date_arr[ 0 ] ), (parseInt( sql_class_date_arr[ 1 ] ) - 1), parseInt( sql_class_date_arr[ 2 ] ) ); // year, month, date
// Without this time adjust Dates selection in Datepicker can not work!!!
date_js.setHours(0);
date_js.setMinutes(0);
date_js.setSeconds(0);
date_js.setMilliseconds(0);
return date_js;
}
/**
* Get TD Class Date '1-31-2023' from JS Date
*
* @param date JS Date
* @returns {string} '1-31-2023'
*/
function wpbc__get__td_class_date( date ){
var td_class_day = (date.getMonth() + 1) + '-' + date.getDate() + '-' + date.getFullYear(); // '1-9-2023'
return td_class_day;
}
/**
* Get date params from string date
*
* @param date string date like '31.5.2023'
* @param separator default '.' can be skipped.
* @returns { {date: number, month: number, year: number} }
*/
function wpbc__get__date_params__from_string_date( date , separator){
separator = ( 'undefined' !== typeof (separator) ) ? separator : '.';
var date_arr = date.split( separator );
var date_obj = {
'year' : parseInt( date_arr[ 2 ] ),
'month': (parseInt( date_arr[ 1 ] ) - 1),
'date' : parseInt( date_arr[ 0 ] )
};
return date_obj; // for = new Date( date_obj.year , date_obj.month , date_obj.date );
}
/**
* Add Spin Loader to calendar
* @param resource_id
*/
function wpbc_calendar__loading__start( resource_id ){
if ( ! jQuery( '#calendar_booking' + resource_id ).next().hasClass( 'wpbc_spins_loader_wrapper' ) ){
jQuery( '#calendar_booking' + resource_id ).after( '<div class="wpbc_spins_loader_wrapper"><div class="wpbc_spins_loader"></div></div>' );
}
if ( ! jQuery( '#calendar_booking' + resource_id ).hasClass( 'wpbc_calendar_blur_small' ) ){
jQuery( '#calendar_booking' + resource_id ).addClass( 'wpbc_calendar_blur_small' );
}
wpbc_calendar__blur__start( resource_id );
}
/**
* Remove Spin Loader to calendar
* @param resource_id
*/
function wpbc_calendar__loading__stop( resource_id ){
jQuery( '#calendar_booking' + resource_id + ' + .wpbc_spins_loader_wrapper' ).remove();
jQuery( '#calendar_booking' + resource_id ).removeClass( 'wpbc_calendar_blur_small' );
wpbc_calendar__blur__stop( resource_id );
}
/**
* Add Blur to calendar
* @param resource_id
*/
function wpbc_calendar__blur__start( resource_id ){
if ( ! jQuery( '#calendar_booking' + resource_id ).hasClass( 'wpbc_calendar_blur' ) ){
jQuery( '#calendar_booking' + resource_id ).addClass( 'wpbc_calendar_blur' );
}
}
/**
* Remove Blur in calendar
* @param resource_id
*/
function wpbc_calendar__blur__stop( resource_id ){
jQuery( '#calendar_booking' + resource_id ).removeClass( 'wpbc_calendar_blur' );
}
// .................................................................................................................
/* == Calendar Update - View ==
// ................................................................................................................. */
/**
* Update Look of calendar
*
* @param resource_id
*/
function wpbc_calendar__update_look( resource_id ){
var inst = wpbc_calendar__get_inst( resource_id );
jQuery.datepick._updateDatepick( inst );
}
/**
* Update dynamically Number of Months in calendar
*
* @param resource_id int
* @param months_number int
*/
function wpbc_calendar__update_months_number( resource_id, months_number ){
var inst = wpbc_calendar__get_inst( resource_id );
if ( null !== inst ){
inst.settings[ 'numberOfMonths' ] = months_number;
//_wpbc.calendar__set_param_value( resource_id, 'calendar_number_of_months', months_number );
wpbc_calendar__update_look( resource_id );
}
}
/**
* Show calendar in different Skin
*
* @param selected_skin_url
*/
function wpbc__calendar__change_skin( selected_skin_url ){
//console.log( 'SKIN SELECTION ::', selected_skin_url );
// Remove CSS skin
var stylesheet = document.getElementById( 'wpbc-calendar-skin-css' );
stylesheet.parentNode.removeChild( stylesheet );
// Add new CSS skin
var headID = document.getElementsByTagName( "head" )[ 0 ];
var cssNode = document.createElement( 'link' );
cssNode.type = 'text/css';
cssNode.setAttribute( "id", "wpbc-calendar-skin-css" );
cssNode.rel = 'stylesheet';
cssNode.media = 'screen';
cssNode.href = selected_skin_url; //"http://beta/wp-content/plugins/booking/css/skins/green-01.css";
headID.appendChild( cssNode );
}
function wpbc__css__change_skin( selected_skin_url, stylesheet_id = 'wpbc-time_picker-skin-css' ){
// Remove CSS skin
var stylesheet = document.getElementById( stylesheet_id );
stylesheet.parentNode.removeChild( stylesheet );
// Add new CSS skin
var headID = document.getElementsByTagName( "head" )[ 0 ];
var cssNode = document.createElement( 'link' );
cssNode.type = 'text/css';
cssNode.setAttribute( "id", stylesheet_id );
cssNode.rel = 'stylesheet';
cssNode.media = 'screen';
cssNode.href = selected_skin_url; //"http://beta/wp-content/plugins/booking/css/skins/green-01.css";
headID.appendChild( cssNode );
}
// ---------------------------------------------------------------------------------------------------------------------
/* == S U P P O R T M A T H ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* Merge several intersected intervals or return not intersected: [[1,3],[2,6],[8,10],[15,18]] -> [[1,6],[8,10],[15,18]]
*
* @param [] intervals [ [1,3],[2,4],[6,8],[9,10],[3,7] ]
* @returns [] [ [1,8],[9,10] ]
*
* Exmample: wpbc_intervals__merge_inersected( [ [1,3],[2,4],[6,8],[9,10],[3,7] ] );
*/
function wpbc_intervals__merge_inersected( intervals ){
if ( ! intervals || intervals.length === 0 ){
return [];
}
var merged = [];
intervals.sort( function ( a, b ){
return a[ 0 ] - b[ 0 ];
} );
var mergedInterval = intervals[ 0 ];
for ( var i = 1; i < intervals.length; i++ ){
var interval = intervals[ i ];
if ( interval[ 0 ] <= mergedInterval[ 1 ] ){
mergedInterval[ 1 ] = Math.max( mergedInterval[ 1 ], interval[ 1 ] );
} else {
merged.push( mergedInterval );
mergedInterval = interval;
}
}
merged.push( mergedInterval );
return merged;
}
/**
* Is 2 intervals intersected: [36011, 86392] <=> [1, 43192] => true ( intersected )
*
* Good explanation here https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-if-two-ranges-overlap
*
* @param interval_A - [ 36011, 86392 ]
* @param interval_B - [ 1, 43192 ]
*
* @return bool
*/
function wpbc_intervals__is_intersected( interval_A, interval_B ) {
if (
( 0 == interval_A.length )
|| ( 0 == interval_B.length )
){
return false;
}
interval_A[ 0 ] = parseInt( interval_A[ 0 ] );
interval_A[ 1 ] = parseInt( interval_A[ 1 ] );
interval_B[ 0 ] = parseInt( interval_B[ 0 ] );
interval_B[ 1 ] = parseInt( interval_B[ 1 ] );
var is_intersected = Math.max( interval_A[ 0 ], interval_B[ 0 ] ) - Math.min( interval_A[ 1 ], interval_B[ 1 ] );
// if ( 0 == is_intersected ) {
// // Such ranges going one after other, e.g.: [ 12, 15 ] and [ 15, 21 ]
// }
if ( is_intersected < 0 ) {
return true; // INTERSECTED
}
return false; // Not intersected
}
/**
* Get the closets ABS value of element in array to the current myValue
*
* @param myValue - int element to search closet 4
* @param myArray - array of elements where to search [5,8,1,7]
* @returns int 5
*/
function wpbc_get_abs_closest_value_in_arr( myValue, myArray ){
if ( myArray.length == 0 ){ // If the array is empty -> return the myValue
return myValue;
}
var obj = myArray[ 0 ];
var diff = Math.abs( myValue - obj ); // Get distance between 1st element
var closetValue = myArray[ 0 ]; // Save 1st element
for ( var i = 1; i < myArray.length; i++ ){
obj = myArray[ i ];
if ( Math.abs( myValue - obj ) < diff ){ // we found closer value -> save it
diff = Math.abs( myValue - obj );
closetValue = obj;
}
}
return closetValue;
}
// ---------------------------------------------------------------------------------------------------------------------
/* == T O O L T I P S ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* Define tooltip to show, when mouse over Date in Calendar
*
* @param tooltip_text - Text to show 'Booked time: 12:00 - 13:00<br>Cost: $20.00'
* @param resource_id - ID of booking resource '1'
* @param td_class - SQL class '1-9-2023'
* @returns {boolean} - defined to show or not
*/
function wpbc_set_tooltip___for__calendar_date( tooltip_text, resource_id, td_class ){
//TODO: make escaping of text for quot symbols, and JS/HTML...
jQuery( '#calendar_booking' + resource_id + ' td.cal4date-' + td_class ).attr( 'data-content', tooltip_text );
var td_el = jQuery( '#calendar_booking' + resource_id + ' td.cal4date-' + td_class ).get( 0 ); // FixIn: 9.0.1.1.
if (
( 'undefined' !== typeof(td_el) )
&& ( undefined == td_el._tippy )
&& ( '' !== tooltip_text )
){
wpbc_tippy( td_el , {
content( reference ){
var popover_content = reference.getAttribute( 'data-content' );
return '<div class="popover popover_tippy">'
+ '<div class="popover-content">'
+ popover_content
+ '</div>'
+ '</div>';
},
allowHTML : true,
trigger : 'mouseenter focus',
interactive : false,
hideOnClick : true,
interactiveBorder: 10,
maxWidth : 550,
theme : 'wpbc-tippy-times',
placement : 'top',
delay : [400, 0], // FixIn: 9.4.2.2.
//delay : [0, 9999999999], // Debuge tooltip
ignoreAttributes : true,
touch : true, //['hold', 500], // 500ms delay // FixIn: 9.2.1.5.
appendTo: () => document.body,
});
return true;
}
return false;
}
// ---------------------------------------------------------------------------------------------------------------------
/* == Dates Functions ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* Get number of dates between 2 JS Dates
*
* @param date1 JS Date
* @param date2 JS Date
* @returns {number}
*/
function wpbc_dates__days_between(date1, date2) {
// The number of milliseconds in one day
var ONE_DAY = 1000 * 60 * 60 * 24;
// Convert both dates to milliseconds
var date1_ms = date1.getTime();
var date2_ms = date2.getTime();
// Calculate the difference in milliseconds
var difference_ms = date1_ms - date2_ms;
// Convert back to days and return
return Math.round(difference_ms/ONE_DAY);
}
/**
* Check if this array of dates is consecutive array of dates or not.
* e.g. ['2024-05-09','2024-05-19','2024-05-30'] -> false
* e.g. ['2024-05-09','2024-05-10','2024-05-11'] -> true
* @param sql_dates_arr array e.g.: ['2024-05-09','2024-05-19','2024-05-30']
* @returns {boolean}
*/
function wpbc_dates__is_consecutive_dates_arr_range( sql_dates_arr ){ // FixIn: 10.0.0.50.
if ( sql_dates_arr.length > 1 ){
var previos_date = wpbc__get__js_date( sql_dates_arr[ 0 ] );
var current_date;
for ( var i = 1; i < sql_dates_arr.length; i++ ){
current_date = wpbc__get__js_date( sql_dates_arr[i] );
if ( wpbc_dates__days_between( current_date, previos_date ) != 1 ){
return false;
}
previos_date = current_date;
}
}
return true;
}
// ---------------------------------------------------------------------------------------------------------------------
/* == Auto Dates Selection ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* == How to use ? ==
*
* For Dates selection, we need to use this logic! We need select the dates only after booking data loaded!
*
* Check example bellow.
*
* // Fire on all booking dates loaded
* jQuery( 'body' ).on( 'wpbc_calendar_ajx__loaded_data', function ( event, loaded_resource_id ){
*
* if ( loaded_resource_id == select_dates_in_calendar_id ){
* wpbc_auto_select_dates_in_calendar( select_dates_in_calendar_id, '2024-05-15', '2024-05-25' );
* }
* } );
*
*/
/**
* Try to Auto select dates in specific calendar by simulated clicks in datepicker
*
* @param resource_id 1
* @param check_in_ymd '2024-05-09' OR ['2024-05-09','2024-05-19','2024-05-20']
* @param check_out_ymd '2024-05-15' Optional
*
* @returns {number} number of selected dates
*
* Example 1: var num_selected_days = wpbc_auto_select_dates_in_calendar( 1, '2024-05-15', '2024-05-25' );
* Example 2: var num_selected_days = wpbc_auto_select_dates_in_calendar( 1, ['2024-05-09','2024-05-19','2024-05-20'] );
*/
function wpbc_auto_select_dates_in_calendar( resource_id, check_in_ymd, check_out_ymd = '' ){ // FixIn: 10.0.0.47.
console.log( 'WPBC_AUTO_SELECT_DATES_IN_CALENDAR( RESOURCE_ID, CHECK_IN_YMD, CHECK_OUT_YMD )', resource_id, check_in_ymd, check_out_ymd );
if (
( '2100-01-01' == check_in_ymd )
|| ( '2100-01-01' == check_out_ymd )
|| ( ( '' == check_in_ymd ) && ( '' == check_out_ymd ) )
){
return 0;
}
// -----------------------------------------------------------------------------------------------------------------
// If check_in_ymd = [ '2024-05-09','2024-05-19','2024-05-30' ] ARRAY of DATES // FixIn: 10.0.0.50.
// -----------------------------------------------------------------------------------------------------------------
var dates_to_select_arr = [];
if ( Array.isArray( check_in_ymd ) ){
dates_to_select_arr = wpbc_clone_obj( check_in_ymd );
// -------------------------------------------------------------------------------------------------------------
// Exceptions to set MULTIPLE DAYS mode
// -------------------------------------------------------------------------------------------------------------
// if dates as NOT CONSECUTIVE: ['2024-05-09','2024-05-19','2024-05-30'], -> set MULTIPLE DAYS mode
if (
( dates_to_select_arr.length > 0 )
&& ( '' == check_out_ymd )
&& ( ! wpbc_dates__is_consecutive_dates_arr_range( dates_to_select_arr ) )
){
wpbc_cal_days_select__multiple( resource_id );
}
// if multiple days to select, but enabled SINGLE day mode, -> set MULTIPLE DAYS mode
if (
( dates_to_select_arr.length > 1 )
&& ( '' == check_out_ymd )
&& ( 'single' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) )
){
wpbc_cal_days_select__multiple( resource_id );
}
// -------------------------------------------------------------------------------------------------------------
check_in_ymd = dates_to_select_arr[ 0 ];
if ( '' == check_out_ymd ){
check_out_ymd = dates_to_select_arr[ (dates_to_select_arr.length-1) ];
}
}
// -----------------------------------------------------------------------------------------------------------------
if ( '' == check_in_ymd ){
check_in_ymd = check_out_ymd;
}
if ( '' == check_out_ymd ){
check_out_ymd = check_in_ymd;
}
if ( 'undefined' === typeof (resource_id) ){
resource_id = '1';
}
var inst = wpbc_calendar__get_inst( resource_id );
if ( null !== inst ){
// Unselect all dates and set properties of Datepick
jQuery( '#date_booking' + resource_id ).val( '' ); //FixIn: 5.4.3
inst.stayOpen = false;
inst.dates = [];
var check_in_js = wpbc__get__js_date( check_in_ymd );
var td_cell = wpbc_get_clicked_td( inst.id, check_in_js );
// Is ome type of error, then select multiple days selection mode.
if ( '' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ) {
_wpbc.calendar__set_param_value( resource_id, 'days_select_mode', 'multiple' );
}
// ---------------------------------------------------------------------------------------------------------
// == DYNAMIC ==
if ( 'dynamic' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ){
// 1-st click
inst.stayOpen = false;
jQuery.datepick._selectDay( td_cell, '#' + inst.id, check_in_js.getTime() );
if ( 0 === inst.dates.length ){
return 0; // First click was unsuccessful, so we must not make other click
}
// 2-nd click
var check_out_js = wpbc__get__js_date( check_out_ymd );
var td_cell_out = wpbc_get_clicked_td( inst.id, check_out_js );
inst.stayOpen = true;
jQuery.datepick._selectDay( td_cell_out, '#' + inst.id, check_out_js.getTime() );
}
// ---------------------------------------------------------------------------------------------------------
// == FIXED ==
if ( 'fixed' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' )) {
jQuery.datepick._selectDay( td_cell, '#' + inst.id, check_in_js.getTime() );
}
// ---------------------------------------------------------------------------------------------------------
// == SINGLE ==
if ( 'single' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ){
//jQuery.datepick._restrictMinMax( inst, jQuery.datepick._determineDate( inst, check_in_js, null ) ); // Do we need to run this ? Please note, check_in_js must have time, min, sec defined to 0!
jQuery.datepick._selectDay( td_cell, '#' + inst.id, check_in_js.getTime() );
}
// ---------------------------------------------------------------------------------------------------------
// == MULTIPLE ==
if ( 'multiple' === _wpbc.calendar__get_param_value( resource_id, 'days_select_mode' ) ){
var dates_arr;
if ( dates_to_select_arr.length > 0 ){
// Situation, when we have dates array: ['2024-05-09','2024-05-19','2024-05-30']. and not the Check In / Check out dates as parameter in this function
dates_arr = wpbc_get_selection_dates_js_str_arr__from_arr( dates_to_select_arr );
} else {
dates_arr = wpbc_get_selection_dates_js_str_arr__from_check_in_out( check_in_ymd, check_out_ymd, inst );
}
if ( 0 === dates_arr.dates_js.length ){
return 0;
}
// For Calendar Days selection
for ( var j = 0; j < dates_arr.dates_js.length; j++ ){ // Loop array of dates
var str_date = wpbc__get__sql_class_date( dates_arr.dates_js[ j ] );
// Date unavailable !
if ( 0 == _wpbc.bookings_in_calendar__get_for_date( resource_id, str_date ).day_availability ){
return 0;
}
if ( dates_arr.dates_js[ j ] != -1 ) {
inst.dates.push( dates_arr.dates_js[ j ] );
}
}
var check_out_date = dates_arr.dates_js[ (dates_arr.dates_js.length - 1) ];
inst.dates.push( check_out_date ); // Need add one additional SAME date for correct works of dates selection !!!!!
var checkout_timestamp = check_out_date.getTime();
var td_cell = wpbc_get_clicked_td( inst.id, check_out_date );
jQuery.datepick._selectDay( td_cell, '#' + inst.id, checkout_timestamp );
}
if ( 0 !== inst.dates.length ){
// Scroll to specific month, if we set dates in some future months
wpbc_calendar__scroll_to( resource_id, inst.dates[ 0 ].getFullYear(), inst.dates[ 0 ].getMonth()+1 );
}
return inst.dates.length;
}
return 0;
}
/**
* Get HTML td element (where was click in calendar day cell)
*
* @param calendar_html_id 'calendar_booking1'
* @param date_js JS Date
* @returns {*|jQuery} Dom HTML td element
*/
function wpbc_get_clicked_td( calendar_html_id, date_js ){
var td_cell = jQuery( '#' + calendar_html_id + ' .sql_date_' + wpbc__get__sql_class_date( date_js ) ).get( 0 );
return td_cell;
}
/**
* Get arrays of JS and SQL dates as dates array
*
* @param check_in_ymd '2024-05-15'
* @param check_out_ymd '2024-05-25'
* @param inst Datepick Inst. Use wpbc_calendar__get_inst( resource_id );
* @returns {{dates_js: *[], dates_str: *[]}}
*/
function wpbc_get_selection_dates_js_str_arr__from_check_in_out( check_in_ymd, check_out_ymd , inst ){
var original_array = [];
var date;
var bk_distinct_dates = [];
var check_in_date = check_in_ymd.split( '-' );
var check_out_date = check_out_ymd.split( '-' );
date = new Date();
date.setFullYear( check_in_date[ 0 ], (check_in_date[ 1 ] - 1), check_in_date[ 2 ] ); // year, month, date
var original_check_in_date = date;
original_array.push( jQuery.datepick._restrictMinMax( inst, jQuery.datepick._determineDate( inst, date, null ) ) ); //add date
if ( ! wpbc_in_array( bk_distinct_dates, (check_in_date[ 2 ] + '.' + check_in_date[ 1 ] + '.' + check_in_date[ 0 ]) ) ){
bk_distinct_dates.push( parseInt(check_in_date[ 2 ]) + '.' + parseInt(check_in_date[ 1 ]) + '.' + check_in_date[ 0 ] );
}
var date_out = new Date();
date_out.setFullYear( check_out_date[ 0 ], (check_out_date[ 1 ] - 1), check_out_date[ 2 ] ); // year, month, date
var original_check_out_date = date_out;
var mewDate = new Date( original_check_in_date.getFullYear(), original_check_in_date.getMonth(), original_check_in_date.getDate() );
mewDate.setDate( original_check_in_date.getDate() + 1 );
while (
(original_check_out_date > date) &&
(original_check_in_date != original_check_out_date) ){
date = new Date( mewDate.getFullYear(), mewDate.getMonth(), mewDate.getDate() );
original_array.push( jQuery.datepick._restrictMinMax( inst, jQuery.datepick._determineDate( inst, date, null ) ) ); //add date
if ( !wpbc_in_array( bk_distinct_dates, (date.getDate() + '.' + parseInt( date.getMonth() + 1 ) + '.' + date.getFullYear()) ) ){
bk_distinct_dates.push( (parseInt(date.getDate()) + '.' + parseInt( date.getMonth() + 1 ) + '.' + date.getFullYear()) );
}
mewDate = new Date( date.getFullYear(), date.getMonth(), date.getDate() );
mewDate.setDate( mewDate.getDate() + 1 );
}
original_array.pop();
bk_distinct_dates.pop();
return {'dates_js': original_array, 'dates_str': bk_distinct_dates};
}
/**
* Get arrays of JS and SQL dates as dates array
*
* @param dates_to_select_arr = ['2024-05-09','2024-05-19','2024-05-30']
*
* @returns {{dates_js: *[], dates_str: *[]}}
*/
function wpbc_get_selection_dates_js_str_arr__from_arr( dates_to_select_arr ){ // FixIn: 10.0.0.50.
var original_array = [];
var bk_distinct_dates = [];
var one_date_str;
for ( var d = 0; d < dates_to_select_arr.length; d++ ){
original_array.push( wpbc__get__js_date( dates_to_select_arr[ d ] ) );
one_date_str = dates_to_select_arr[ d ].split('-')
if ( ! wpbc_in_array( bk_distinct_dates, (one_date_str[ 2 ] + '.' + one_date_str[ 1 ] + '.' + one_date_str[ 0 ]) ) ){
bk_distinct_dates.push( parseInt(one_date_str[ 2 ]) + '.' + parseInt(one_date_str[ 1 ]) + '.' + one_date_str[ 0 ] );
}
}
return {'dates_js': original_array, 'dates_str': original_array};
}
// =====================================================================================================================
/* == Auto Fill Fields / Auto Select Dates ==
// ===================================================================================================================== */
jQuery( document ).ready( function (){
var url_params = new URLSearchParams( window.location.search );
// Disable days selection in calendar, after redirection from the "Search results page, after search availability" // FixIn: 8.8.2.3.
if ( 'On' != _wpbc.get_other_param( 'is_enabled_booking_search_results_days_select' ) ) {
if (
( url_params.has( 'wpbc_select_check_in' ) ) &&
( url_params.has( 'wpbc_select_check_out' ) ) &&
( url_params.has( 'wpbc_select_calendar_id' ) )
){
var select_dates_in_calendar_id = parseInt( url_params.get( 'wpbc_select_calendar_id' ) );
// Fire on all booking dates loaded
jQuery( 'body' ).on( 'wpbc_calendar_ajx__loaded_data', function ( event, loaded_resource_id ){
if ( loaded_resource_id == select_dates_in_calendar_id ){
wpbc_auto_select_dates_in_calendar( select_dates_in_calendar_id, url_params.get( 'wpbc_select_check_in' ), url_params.get( 'wpbc_select_check_out' ) );
}
} );
}
}
if ( url_params.has( 'wpbc_auto_fill' ) ){
var wpbc_auto_fill_value = url_params.get( 'wpbc_auto_fill' );
// Convert back. Some systems do not like symbol '~' in URL, so we need to replace to some other symbols
wpbc_auto_fill_value = wpbc_auto_fill_value.replaceAll( '_^_', '~' );
wpbc_auto_fill_booking_fields( wpbc_auto_fill_value );
}
} );
/**
* Autofill / select booking form fields by values from the GET request parameter: ?wpbc_auto_fill=
*
* @param auto_fill_str
*/
function wpbc_auto_fill_booking_fields( auto_fill_str ){ // FixIn: 10.0.0.48.
if ( '' == auto_fill_str ){
return;
}
// console.log( 'WPBC_AUTO_FILL_BOOKING_FIELDS( AUTO_FILL_STR )', auto_fill_str);
var fields_arr = wpbc_auto_fill_booking_fields__parse( auto_fill_str );
for ( let i = 0; i < fields_arr.length; i++ ){
jQuery( '[name="' + fields_arr[ i ][ 'name' ] + '"]' ).val( fields_arr[ i ][ 'value' ] );
}
}
/**
* Parse data from get parameter: ?wpbc_auto_fill=visitors231^2~max_capacity231^2
*
* @param data_str = 'visitors231^2~max_capacity231^2';
* @returns {*}
*/
function wpbc_auto_fill_booking_fields__parse( data_str ){
var filter_options_arr = [];
var data_arr = data_str.split( '~' );
for ( var j = 0; j < data_arr.length; j++ ){
var my_form_field = data_arr[ j ].split( '^' );
var filter_name = ('undefined' !== typeof (my_form_field[ 0 ])) ? my_form_field[ 0 ] : '';
var filter_value = ('undefined' !== typeof (my_form_field[ 1 ])) ? my_form_field[ 1 ] : '';
filter_options_arr.push(
{
'name' : filter_name,
'value' : filter_value
}
);
}
return filter_options_arr;
}
/**
* Parse data from get parameter: ?search_get__custom_params=...
*
* @param data_str = 'text^search_field__display_check_in^23.05.2024~text^search_field__display_check_out^26.05.2024~selectbox-one^search_quantity^2~selectbox-one^location^Spain~selectbox-one^max_capacity^2~selectbox-one^amenity^parking~checkbox^search_field__extend_search_days^5~submit^^Search~hidden^search_get__check_in_ymd^2024-05-23~hidden^search_get__check_out_ymd^2024-05-26~hidden^search_get__time^~hidden^search_get__quantity^2~hidden^search_get__extend^5~hidden^search_get__users_id^~hidden^search_get__custom_params^~';
* @returns {*}
*/
function wpbc_auto_fill_search_fields__parse( data_str ){
var filter_options_arr = [];
var data_arr = data_str.split( '~' );
for ( var j = 0; j < data_arr.length; j++ ){
var my_form_field = data_arr[ j ].split( '^' );
var filter_type = ('undefined' !== typeof (my_form_field[ 0 ])) ? my_form_field[ 0 ] : '';
var filter_name = ('undefined' !== typeof (my_form_field[ 1 ])) ? my_form_field[ 1 ] : '';
var filter_value = ('undefined' !== typeof (my_form_field[ 2 ])) ? my_form_field[ 2 ] : '';
filter_options_arr.push(
{
'type' : filter_type,
'name' : filter_name,
'value' : filter_value
}
);
}
return filter_options_arr;
}
// ---------------------------------------------------------------------------------------------------------------------
/* == Auto Update number of months in calendars ON screen size changed ==
// --------------------------------------------------------------------------------------------------------------------- */
/**
* Auto Update Number of Months in Calendar, e.g.: if ( WINDOW_WIDTH <= 782px ) >>> MONTHS_NUMBER = 1
* ELSE: number of months defined in shortcode.
* @param resource_id int
*
*/
function wpbc_calendar__auto_update_months_number__on_resize( resource_id ){
if ( true === _wpbc.get_other_param( 'is_allow_several_months_on_mobile' ) ) {
return false;
}
var local__number_of_months = parseInt( _wpbc.calendar__get_param_value( resource_id, 'calendar_number_of_months' ) );
if ( local__number_of_months > 1 ){
if ( jQuery( window ).width() <= 782 ){
wpbc_calendar__update_months_number( resource_id, 1 );
} else {
wpbc_calendar__update_months_number( resource_id, local__number_of_months );
}
}
}
/**
* Auto Update Number of Months in ALL Calendars
*
*/
function wpbc_calendars__auto_update_months_number(){
var all_calendars_arr = _wpbc.calendars_all__get();
// This LOOP "for in" is GOOD, because we check here keys 'calendar_' === calendar_id.slice( 0, 9 )
for ( var calendar_id in all_calendars_arr ){
if ( 'calendar_' === calendar_id.slice( 0, 9 ) ){
var resource_id = parseInt( calendar_id.slice( 9 ) ); // 'calendar_3' -> 3
if ( resource_id > 0 ){
wpbc_calendar__auto_update_months_number__on_resize( resource_id );
}
}
}
}
/**
* If browser window changed, then update number of months.
*/
jQuery( window ).on( 'resize', function (){
wpbc_calendars__auto_update_months_number();
} );
/**
* Auto update calendar number of months on initial page load
*/
jQuery( document ).ready( function (){
var closed_timer = setTimeout( function (){
wpbc_calendars__auto_update_months_number();
}, 100 );
});