WPBC_JS_IN_FOOTER )
);
wp_localize_script(
'wpbc-availability-general-page',
'wpbc_availability_general_page',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'wpbc_availability_general_ajax_nonce' ),
'action' => 'WPBC_AJX_AVAILABILITY_GENERAL_SAVE',
'preview_action' => 'WPBC_AJX_AVAILABILITY_GENERAL_PREVIEW',
'settings' => wpbc_availability_general__get_settings_response(),
'default_settings' => wpbc_availability_general__get_default_settings(),
'open_section' => wpbc_availability_general__get_open_section(),
'is_buffer_available' => class_exists( 'wpdev_bk_biz_m' ),
'is_available_limit_available' => class_exists( 'wpdev_bk_biz_m' ),
'i18n' => array(
'saving' => __( 'Saving', 'booking' ),
'saved' => __( 'General availability settings updated.', 'booking' ),
'reset_applied' => __( 'Default availability settings are ready for preview. Click Save Changes to apply them.', 'booking' ),
'save_failed' => __( 'Unable to save general availability settings.', 'booking' ),
'reset_confirm' => __( 'Reset controls to default values? Saved settings will not change until you click Save Changes.', 'booking' ),
'preview_failed' => __( 'Unable to refresh calendar preview.', 'booking' ),
'security_error' => __( 'Security check failed.', 'booking' ),
'loading' => __( 'Loading', 'booking' ),
'buffer_preview' => __( 'Buffer preview', 'booking' ),
'before_booking' => __( 'Before booking', 'booking' ),
'after_booking' => __( 'After booking', 'booking' ),
'no_buffer' => __( 'No booking buffer is selected.', 'booking' ),
),
)
);
}
add_action( 'wpbc_enqueue_js_files', 'wpbc_availability_general_enqueue_js_files', 66 );
/**
* Print tooltip initializer for General Availability.
*
* @return void
*/
function wpbc_availability_general_print_tooltip_js() {
if ( ! wpbc_availability_general__is_page() ) {
return;
}
if ( function_exists( 'wpbc_bs_javascript_tooltips' ) ) {
wpbc_bs_javascript_tooltips();
}
}
add_action( 'admin_footer', 'wpbc_availability_general_print_tooltip_js', 67 );
/**
* Get resource options.
*
* @return array
*/
function wpbc_availability_general__get_resources() {
$resources = array();
if ( function_exists( 'wpbc_ajx_get_sorted_booking_resources_arr' ) && function_exists( 'wpbc_ajx_get_all_booking_resources_arr' ) ) {
$resource_rows = wpbc_ajx_get_sorted_booking_resources_arr( wpbc_ajx_get_all_booking_resources_arr() );
foreach ( $resource_rows as $resource ) {
$resources[] = array(
'id' => isset( $resource['booking_type_id'] ) ? (int) $resource['booking_type_id'] : 1,
'title' => isset( $resource['title'] ) ? $resource['title'] : __( 'Booking resource', 'booking' ),
);
}
}
if ( empty( $resources ) ) {
$resources[] = array(
'id' => function_exists( 'wpbc_get_default_resource' ) ? (int) wpbc_get_default_resource() : 1,
'title' => __( 'Booking resource', 'booking' ),
);
}
return $resources;
}
/**
* Get capability required to manage General Availability.
*
* @return string
*/
function wpbc_availability_general__get_manage_cap() {
$min_user_role = get_bk_option( 'booking_user_role_settings' );
$capability = array(
'administrator' => 'activate_plugins',
'editor' => 'publish_pages',
'author' => 'publish_posts',
'contributor' => 'edit_posts',
'subscriber' => 'read',
);
return isset( $capability[ $min_user_role ] ) ? $capability[ $min_user_role ] : 'manage_options';
}
/**
* Get selected resource ID for preview.
*
* @return int
*/
function wpbc_availability_general__get_preview_resource_id() {
$resources = wpbc_availability_general__get_resources();
$default_resource = isset( $resources[0]['id'] ) ? (int) $resources[0]['id'] : 1;
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$resource_id = isset( $_REQUEST['resource_id'] ) ? absint( wp_unslash( $_REQUEST['resource_id'] ) ) : $default_resource;
$resource_ids = wp_list_pluck( $resources, 'id' );
return in_array( $resource_id, $resource_ids, true ) ? $resource_id : $default_resource;
}
/**
* Get selected month count for preview.
*
* @return int
*/
function wpbc_availability_general__get_preview_months_count() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$months = isset( $_REQUEST['months_count'] ) ? absint( wp_unslash( $_REQUEST['months_count'] ) ) : 6;
return in_array( $months, array( 1, 2, 3, 4, 6, 12 ), true ) ? $months : 6;
}
/**
* Get the General Availability section that should be opened on page load.
*
* @return string
*/
function wpbc_availability_general__get_open_section() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$open_section = isset( $_REQUEST['wpbc_ag_open'] ) ? sanitize_key( wp_unslash( $_REQUEST['wpbc_ag_open'] ) ) : '';
return in_array( $open_section, array( 'weekdays', 'from_today', 'buffer', 'working_time' ), true ) ? $open_section : '';
}
/**
* Validate preview resource ID.
*
* @param int $resource_id Resource ID.
*
* @return int
*/
function wpbc_availability_general__sanitize_preview_resource_id( $resource_id ) {
$resources = wpbc_availability_general__get_resources();
$default_resource = isset( $resources[0]['id'] ) ? (int) $resources[0]['id'] : 1;
$resource_ids = wp_list_pluck( $resources, 'id' );
return in_array( (int) $resource_id, $resource_ids, true ) ? (int) $resource_id : $default_resource;
}
/**
* Validate preview months count.
*
* @param int $months_count Number of months.
*
* @return int
*/
function wpbc_availability_general__sanitize_preview_months_count( $months_count ) {
$months_count = absint( $months_count );
return in_array( $months_count, array( 1, 2, 3, 4, 6, 12 ), true ) ? $months_count : 6;
}
/**
* Get unavailable-from-today select options.
*
* @return array
*/
function wpbc_availability_general__get_unavailable_from_today_options() {
$options = array( '0' => ' - ' );
foreach ( range( 5, 55, 5 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = $extra_num . ' ' . __( 'minutes', 'booking' );
}
$options['60m'] = '1 ' . __( 'hour', 'booking' );
foreach ( range( 65, 115, 5 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = '1 ' . __( 'hour', 'booking' ) . ' ' . ( $extra_num - 60 ) . ' ' . __( 'minutes', 'booking' );
}
foreach ( range( 120, 1380, 60 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = ( $extra_num / 60 ) . ' ' . __( 'hours', 'booking' );
}
$options['1'] = '1 ' . __( 'day', 'booking' );
for ( $ii = 2; $ii < 92; $ii++ ) {
$options[ (string) $ii ] = $ii . ' ' . __( 'days', 'booking' );
}
return $options;
}
/**
* Get available-from-today select options.
*
* @return array
*/
function wpbc_availability_general__get_available_from_today_options() {
$options = array( '' => ' - ' );
foreach ( range( 1, 365 ) as $value ) {
$options[ (string) $value ] = (string) $value;
}
return $options;
}
/**
* Get minute buffer options.
*
* @return array
*/
function wpbc_availability_general__get_buffer_minutes_options() {
$options = array( '' => ' - ' );
foreach ( range( 5, 55, 5 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = $extra_num . ' ' . __( 'minutes', 'booking' );
}
$options['60m'] = '1 ' . __( 'hour', 'booking' );
foreach ( range( 65, 115, 5 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = '1 ' . __( 'hour', 'booking' ) . ' ' . ( $extra_num - 60 ) . ' ' . __( 'minutes', 'booking' );
}
foreach ( range( 120, 1380, 60 ) as $extra_num ) {
$options[ $extra_num . 'm' ] = ( $extra_num / 60 ) . ' ' . __( 'hours', 'booking' );
}
return $options;
}
/**
* Get day buffer options.
*
* @return array
*/
function wpbc_availability_general__get_buffer_days_options() {
$options = array( '' => ' - ' );
foreach ( range( 1, 30 ) as $extra_num ) {
$options[ $extra_num . 'd' ] = $extra_num . ' ' . __( 'day(s)', 'booking' );
}
return $options;
}
/**
* Get time options for future working-time controls.
*
* @param string $selected Selected value.
*
* @return array
*/
function wpbc_availability_general__get_working_time_options( $selected = '' ) {
$options = array();
for ( $minutes = 0; $minutes <= 1440; $minutes += 30 ) {
$hours = (int) floor( $minutes / 60 );
$mins = $minutes % 60;
$value = sprintf( '%02d:%02d', $hours, $mins );
$label = ( 1440 === $minutes ) ? '24:00' : $value;
$options[ $value ] = $label;
}
if ( '' !== $selected && ! isset( $options[ $selected ] ) ) {
$options[ $selected ] = $selected;
}
return $options;
}
/**
* Render a select field.
*
* @param string $name Field name.
* @param array $options Options.
* @param string $selected Selected value.
* @param array $args Extra args.
*
* @return void
*/
function wpbc_availability_general__render_select( $name, $options, $selected, $args = array() ) {
$args = wp_parse_args(
$args,
array(
'id' => $name,
'class' => 'wpbc_ag_field_control',
'disabled' => false,
)
);
?>
_x( 'Sun', 'Short weekday name', 'booking' ),
1 => _x( 'Mon', 'Short weekday name', 'booking' ),
2 => _x( 'Tue', 'Short weekday name', 'booking' ),
3 => _x( 'Wed', 'Short weekday name', 'booking' ),
4 => _x( 'Thu', 'Short weekday name', 'booking' ),
5 => _x( 'Fri', 'Short weekday name', 'booking' ),
6 => _x( 'Sat', 'Short weekday name', 'booking' ),
);
$start_week_day = absint( get_bk_option( 'booking_start_day_weeek' ) );
if ( $start_week_day > 6 ) {
$start_week_day = 0;
}
$days_ordered = array_slice( $days, $start_week_day, null, true ) + array_slice( $days, 0, $start_week_day, true );
$time_options = wpbc_availability_general__get_working_time_options();
?>
$day_title ) : ?>
9 * HOUR_IN_SECONDS, 'end_second' => 18 * HOUR_IN_SECONDS );
$is_open = ! empty( $weekdays[ $day_num ] );
?>
array(),
'booking_unavailable_days_num_from_today' => '0',
'booking_available_days_num_from_today' => '',
'booking_unavailable_extra_in_out' => '',
'booking_unavailable_extra_minutes_in' => '',
'booking_unavailable_extra_minutes_out' => '',
'booking_unavailable_extra_days_in' => '',
'booking_unavailable_extra_days_out' => '',
'working_time' => wpbc_working_time__get_default_settings(),
);
}
/**
* Validate posted one-interval-per-weekday Working Time schedule.
*
* @param array $post_data Raw post data.
* @param string $prefix Field prefix.
*
* @return array
*/
function wpbc_availability_general__validate_working_time_weekdays( $post_data, $prefix ) {
$weekdays = array();
$enabled_days = array();
$start_values = isset( $post_data[ $prefix . '_start' ] ) && is_array( $post_data[ $prefix . '_start' ] ) ? wp_unslash( $post_data[ $prefix . '_start' ] ) : array();
$end_values = isset( $post_data[ $prefix . '_end' ] ) && is_array( $post_data[ $prefix . '_end' ] ) ? wp_unslash( $post_data[ $prefix . '_end' ] ) : array();
if ( isset( $post_data[ $prefix . '_days' ] ) && is_array( $post_data[ $prefix . '_days' ] ) ) {
foreach ( $post_data[ $prefix . '_days' ] as $day_num ) {
$day_num = absint( $day_num );
if ( $day_num >= 0 && $day_num <= 6 ) {
$enabled_days[] = $day_num;
}
}
}
for ( $day = 0; $day <= 6; $day++ ) {
$weekdays[ $day ] = array();
if ( ! in_array( $day, $enabled_days, true ) ) {
continue;
}
$start = isset( $start_values[ $day ] ) ? wpbc_working_time__time_to_seconds( sanitize_text_field( $start_values[ $day ] ) ) : 0;
$end = isset( $end_values[ $day ] ) ? wpbc_working_time__time_to_seconds( sanitize_text_field( $end_values[ $day ] ) ) : 0;
if ( $start < $end ) {
$weekdays[ $day ][] = array(
'start_second' => $start,
'end_second' => $end,
);
}
}
return $weekdays;
}
/**
* Validate posted Working Time settings.
*
* @param array $post_data Raw post data.
*
* @return array
*/
function wpbc_availability_general__validate_working_time_data( $post_data ) {
$current_settings = wpbc_working_time__get_settings();
$resource_id = isset( $post_data['booking_working_time_resource_id'] ) ? absint( wp_unslash( $post_data['booking_working_time_resource_id'] ) ) : 0;
$resource_mode = isset( $post_data['booking_working_time_resource_mode'] ) ? sanitize_key( wp_unslash( $post_data['booking_working_time_resource_mode'] ) ) : 'inherit';
if ( ! in_array( $resource_mode, array( 'inherit', 'custom', 'disabled' ), true ) ) {
$resource_mode = 'inherit';
}
$current_settings['enabled'] = ( isset( $post_data['booking_working_time_enabled'] ) && 'On' === sanitize_text_field( wp_unslash( $post_data['booking_working_time_enabled'] ) ) ) ? 'On' : 'Off';
$current_settings['default'] = array(
'weekdays' => wpbc_availability_general__validate_working_time_weekdays( $post_data, 'booking_working_time_default' ),
);
if ( $resource_id > 0 ) {
$current_settings['resources'][ $resource_id ] = array(
'mode' => $resource_mode,
'weekdays' => wpbc_availability_general__validate_working_time_weekdays( $post_data, 'booking_working_time_resource' ),
);
}
return wpbc_working_time__normalize_settings( $current_settings );
}
/**
* Validate posted settings.
*
* @param array $post_data Raw post data.
*
* @return array
*/
function wpbc_availability_general__validate_data( $post_data ) {
$cleaned = wpbc_availability_general__get_default_settings();
if ( isset( $post_data['booking_unavailable_days'] ) && is_array( $post_data['booking_unavailable_days'] ) ) {
foreach ( $post_data['booking_unavailable_days'] as $day_num ) {
$day_num = absint( $day_num );
if ( $day_num >= 0 && $day_num <= 6 ) {
$cleaned['weekdays'][] = $day_num;
}
}
}
if ( isset( $post_data['booking_unavailable_days_num_from_today'] ) ) {
$value = sanitize_text_field( wp_unslash( $post_data['booking_unavailable_days_num_from_today'] ) );
if ( preg_match( '/^\d+m$/', $value ) || preg_match( '/^\d+$/', $value ) ) {
$cleaned['booking_unavailable_days_num_from_today'] = $value;
}
}
if ( isset( $post_data['booking_available_days_num_from_today'] ) ) {
$value = sanitize_text_field( wp_unslash( $post_data['booking_available_days_num_from_today'] ) );
$cleaned['booking_available_days_num_from_today'] = ( '' === $value ) ? '' : (string) absint( $value );
}
if ( isset( $post_data['booking_unavailable_extra_in_out'] ) ) {
$value = sanitize_text_field( wp_unslash( $post_data['booking_unavailable_extra_in_out'] ) );
$cleaned['booking_unavailable_extra_in_out'] = in_array( $value, array( '', 'm', 'd' ), true ) ? $value : '';
}
foreach ( array( 'booking_unavailable_extra_minutes_in', 'booking_unavailable_extra_minutes_out' ) as $key ) {
if ( isset( $post_data[ $key ] ) ) {
$value = sanitize_text_field( wp_unslash( $post_data[ $key ] ) );
$cleaned[ $key ] = preg_match( '/^\d+m$/', $value ) ? $value : '';
}
}
foreach ( array( 'booking_unavailable_extra_days_in', 'booking_unavailable_extra_days_out' ) as $key ) {
if ( isset( $post_data[ $key ] ) ) {
$value = sanitize_text_field( wp_unslash( $post_data[ $key ] ) );
$cleaned[ $key ] = preg_match( '/^\d+d$/', $value ) ? $value : '';
}
}
$cleaned['working_time'] = wpbc_availability_general__validate_working_time_data( $post_data );
return $cleaned;
}
/**
* Update settings.
*
* @param array $cleaned_data Cleaned settings.
*
* @return void
*/
function wpbc_availability_general__update_settings( $cleaned_data ) {
for ( $i = 0; $i < 7; $i++ ) {
update_bk_option( 'booking_unavailable_day' . $i, in_array( $i, $cleaned_data['weekdays'], true ) ? 'On' : 'Off' );
}
update_bk_option( 'booking_unavailable_days_num_from_today', $cleaned_data['booking_unavailable_days_num_from_today'] );
if ( class_exists( 'wpdev_bk_biz_m' ) ) {
update_bk_option( 'booking_available_days_num_from_today', $cleaned_data['booking_available_days_num_from_today'] );
update_bk_option( 'booking_unavailable_extra_in_out', $cleaned_data['booking_unavailable_extra_in_out'] );
update_bk_option( 'booking_unavailable_extra_minutes_in', $cleaned_data['booking_unavailable_extra_minutes_in'] );
update_bk_option( 'booking_unavailable_extra_minutes_out', $cleaned_data['booking_unavailable_extra_minutes_out'] );
update_bk_option( 'booking_unavailable_extra_days_in', $cleaned_data['booking_unavailable_extra_days_in'] );
update_bk_option( 'booking_unavailable_extra_days_out', $cleaned_data['booking_unavailable_extra_days_out'] );
}
wpbc_working_time__update_settings( $cleaned_data['working_time'] );
}
/**
* Get current settings prepared for JavaScript and AJAX responses.
*
* @return array
*/
function wpbc_availability_general__get_settings_response() {
$hints = function_exists( 'wpbc_get_unavailable_from_today_hints_arr' ) ? wpbc_get_unavailable_from_today_hints_arr() : array();
$weekdays = array();
for ( $i = 0; $i < 7; $i++ ) {
if ( 'On' === get_bk_option( 'booking_unavailable_day' . $i ) ) {
$weekdays[] = $i;
}
}
return array(
'weekdays' => $weekdays,
'booking_unavailable_days_num_from_today' => get_bk_option( 'booking_unavailable_days_num_from_today' ),
'booking_available_days_num_from_today' => get_bk_option( 'booking_available_days_num_from_today' ),
'booking_unavailable_extra_in_out' => get_bk_option( 'booking_unavailable_extra_in_out' ),
'booking_unavailable_extra_minutes_in' => get_bk_option( 'booking_unavailable_extra_minutes_in' ),
'booking_unavailable_extra_minutes_out' => get_bk_option( 'booking_unavailable_extra_minutes_out' ),
'booking_unavailable_extra_days_in' => get_bk_option( 'booking_unavailable_extra_days_in' ),
'booking_unavailable_extra_days_out' => get_bk_option( 'booking_unavailable_extra_days_out' ),
'working_time' => wpbc_working_time__get_settings(),
'hints' => array(
'booking_unavailable_days_num_from_today__hint' => isset( $hints['booking_unavailable_days_num_from_today__hint'] ) ? $hints['booking_unavailable_days_num_from_today__hint'] : '',
'booking_available_days_num_from_today__hint' => isset( $hints['booking_available_days_num_from_today__hint'] ) ? $hints['booking_available_days_num_from_today__hint'] : '',
),
);
}
/**
* Render booking resource calendar preview.
*
* @param int $resource_id Resource ID.
* @param int $months_count Number of months.
*
* @return void
*/
function wpbc_availability_general__render_calendar_preview( $resource_id, $months_count ) {
$resource_id = wpbc_availability_general__sanitize_preview_resource_id( $resource_id );
$months_count = wpbc_availability_general__sanitize_preview_months_count( $months_count );
$months_in_row = min( 3, max( 1, $months_count ) );
$calendar_css_class_outer = 'wpbc_calendar_wraper';
if ( 'Off' !== get_bk_option( 'booking_change_over_days_triangles' ) ) {
$calendar_css_class_outer .= ' wpbc_change_over_triangle';
}
?>
$resource_id,
'aggregate_resource_id_arr' => array(),
'selected_dates_without_calendar' => '',
'calendar_number_of_months' => $months_count,
'start_month_calendar' => false,
'shortcode_options' => '',
'custom_form' => 'standard',
'skip_general_availability' => 1,
)
);
echo $start_script_code; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
?>
$name,
'disabled' => false,
)
);
?>
$args['id'],
'disabled' => $args['disabled'],
)
);
?>
false,
'slider_label' => __( 'Adjust value', 'booking' ),
)
);
$option_values = array_keys( $options );
$selected_index = 0;
foreach ( $option_values as $option_index => $option_value ) {
if ( (string) $selected === (string) $option_value ) {
$selected_index = (int) $option_index;
break;
}
}
wpbc_availability_general__render_select( $name, $options, $selected, $args );
?>
/>
false,
'right_vertical_sidebar__is_show' => true,
'right_vertical_sidebar__default_view_mode' => '',
'right_vertical_sidebar_compact__is_show' => true,
'left_navigation__default_view_mode' => 'compact',
'title' => __( 'General Availability', 'booking' ) .
'' . esc_html__( 'New', 'booking' ) . '',
'hint' => __( 'Define global front-end availability rules for all calendars, including unavailable weekdays, booking buffers, and availability limits.', 'booking' ),
'page_title' => __( 'General Availability', 'booking' ),
'link' => '',
'position' => '',
'css_classes' => 'wpbc_top_tab__general_availability',
'icon' => '',
'font_icon' => 'wpbc-bi-calendar2-day',
'font_icon_right' => '',
'default' => false,
'disabled' => false,
'hided' => false,
'subtabs' => array(),
'folder_style' => 'order:93;',
);
return $tabs;
}
/**
* Save settings.
*
* @return void
*/
public function maybe_update() {
$form_name = 'wpbc_availability_general_form';
// phpcs:ignore WordPress.Security.NonceVerification.Missing
if ( ! isset( $_POST[ 'is_form_submitted_' . $form_name ] ) ) {
return;
}
check_admin_referer( 'wpbc_settings_page_' . $form_name );
if ( ! wpbc_is_mu_user_can_be_here( 'only_super_admin' ) || ! current_user_can( wpbc_availability_general__get_manage_cap() ) ) {
return;
}
$cleaned_data = wpbc_availability_general__validate_data( $_POST ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
wpbc_availability_general__update_settings( $cleaned_data );
$this->is_updated = true;
}
/**
* Right compact sidebar tabs.
*
* @return void
*/
public function right_sidebar_compact_content() {
WPBC_UI_Sidebar_Panels::render_rightbar_tabs(
array(
array(
'id' => 'wpbc_tab_ag_settings',
'panel_id' => 'wpbc_ag__inspector_settings',
'title' => __( 'Settings', 'booking' ),
'icon' => 'wpbc_icn_tune',
'selected' => true,
),
array(
'id' => 'wpbc_tab_ag_notes',
'panel_id' => 'wpbc_ag__inspector_notes',
'title' => __( 'Notes', 'booking' ),
'icon' => 'wpbc-bi-info-circle',
),
),
array(
'aria_label' => __( 'General Availability Panels', 'booking' ),
'context' => 'general_availability',
'class' => 'wpbc_ag_rightbar_tabs',
)
);
}
/**
* Right sidebar panels.
*
* @return void
*/
public function right_sidebar_content() {
?>
'wpbc_ag__inspector_settings',
'labelledby' => 'wpbc_tab_ag_settings',
'class' => 'wpbc_ag__inspector_settings',
),
array( $this, 'right_panel_settings_content' )
);
WPBC_UI_Sidebar_Panels::render_panel(
array(
'id' => 'wpbc_ag__inspector_notes',
'labelledby' => 'wpbc_tab_ag_notes',
'class' => 'wpbc_ag__inspector_notes',
'hidden' => true,
),
array( $this, 'right_panel_notes_content' )
);
?>
'inherit',
'weekdays' => $working_time_default_settings['default']['weekdays'],
);
for ( $i = 0; $i < 7; $i++ ) {
if ( 'On' === get_bk_option( 'booking_unavailable_day' . $i ) ) {
$unavailable_weekdays[] = $i;
}
}
WPBC_UI_Sidebar_Panels::render_inspector_header( __( 'General Availability', 'booking' ), __( 'Global front-end availability rules for all calendars.', 'booking' ) );
?>