array( 'default' => '...', ), 'check_out_date_hint' => array( 'default' => '...', ), 'selected_dates_hint' => array( 'default' => '...', ), 'days_number_hint' => array( 'default' => '0', ), 'start_time_hint' => array( 'default' => '...', ), 'end_time_hint' => array( 'default' => '...', ), ); } /** * Enqueue front-end JS. * * @param string $where_to_load Loading context. * * @return void */ public static function enqueue_js( $where_to_load ) { if ( ! self::is_active() ) { return; } if ( ! in_array( $where_to_load, array( 'client', 'both' ), true ) ) { return; } wp_enqueue_script( 'wpbc-free-date-hints', wpbc_plugin_url( '/js/wpbc-free-date-hints.js' ), array( 'jquery', 'wpbc_capacity' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); } /** * Replace supported hint shortcodes in booking form markup. * * @param string $form_content Booking form markup. * @param int $resource_id Booking resource ID. * @param string $form_slug Booking form slug. * * @return string */ public static function replace_hints_in_form( $form_content, $resource_id = 1, $form_slug = 'standard' ) { if ( ! self::is_active() ) { return $form_content; } $resource_id = (int) $resource_id; foreach ( self::get_hint_definitions() as $hint_name => $hint_params ) { $form_content = self::replace_single_hint_shortcode( $form_content, array( 'shortcode' => '[' . $hint_name . ']', 'span_class' => $hint_name . '_tip' . $resource_id, 'span_value' => $hint_params['default'], 'input_name' => $hint_name . $resource_id, 'input_data' => $hint_params['default'], ) ); } return $form_content; } /** * Replace one hint shortcode, preserving support for repeated usage. * * The first occurrence receives a stable ID and hidden input; additional * occurrences receive the same class, matching the Pro hint convention. * * @param string $form_content Booking form markup. * @param array $params Replacement params. * * @return string */ private static function replace_single_hint_shortcode( $form_content, $params ) { $shortcode = str_replace( array( '[', ']' ), '', $params['shortcode'] ); $pattern = '/\[' . preg_quote( $shortcode, '/' ) . '\]/'; $first_html = '' . esc_html( $params['span_value'] ) . '' . ''; $form_content = preg_replace( $pattern, $first_html, $form_content, 1 ); $other_html = '' . esc_html( $params['span_value'] ) . ''; return str_replace( '[' . $shortcode . ']', $other_html, $form_content ); } /** * AJAX responder for Free date hints. * * @return void */ public static function ajax_show_hints() { if ( ! self::is_active() ) { return; } $default_resource_id = 1; if ( class_exists( 'WPBC_FE_Attr_Postprocessor' ) && method_exists( 'WPBC_FE_Attr_Postprocessor', 'get_default_booking_resource_id' ) ) { $default_resource_id = WPBC_FE_Attr_Postprocessor::get_default_booking_resource_id(); } // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing $resource_id = isset( $_POST['bk_type'] ) ? intval( $_POST['bk_type'] ) : $default_resource_id; make_bk_action( 'check_multiuser_params_for_client_side', $resource_id ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing $selected_dates = isset( $_POST['all_dates'] ) ? sanitize_text_field( wp_unslash( $_POST['all_dates'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing $form_data = isset( $_POST['form'] ) ? sanitize_text_field( wp_unslash( $_POST['form'] ) ) : ''; $hints = self::calculate_hints( $selected_dates, $resource_id, $form_data ); self::print_update_script( $resource_id, $hints ); } /** * Calculate supported hint values. * * @param string $selected_dates Selected dates in dd.mm.yyyy CSV/range format. * @param int $resource_id Booking resource ID. * @param string $form_data Serialized booking form data. * * @return array */ private static function calculate_hints( $selected_dates, $resource_id, $form_data ) { $hints = array(); foreach ( self::get_hint_definitions() as $hint_name => $hint_params ) { $hints[ $hint_name ] = $hint_params['default']; } $selected_dates = trim( (string) $selected_dates ); if ( '' === $selected_dates || false !== strpos( $selected_dates, '13.01.2981' ) ) { return $hints; } $dates_in_diff_formats = wpbc_get_dates_in_diff_formats( $selected_dates, $resource_id, $form_data ); if ( empty( $dates_in_diff_formats['array'] ) || ! is_array( $dates_in_diff_formats['array'] ) ) { return $hints; } $only_dates = array_values( array_unique( array_filter( $dates_in_diff_formats['array'] ) ) ); if ( empty( $only_dates ) ) { return $hints; } $selected_dates_localized = array(); $only_full_days = array(); foreach ( $only_dates as $day ) { $only_full_days[] = $day . ' 00:00:00'; $selected_dates_localized[] = wpbc_get_dates_comma_string_localized( $day . ' 00:00:00' ); } $hints['check_in_date_hint'] = wpbc_get_dates_comma_string_localized( $only_full_days[0] ); $hints['check_out_date_hint'] = wpbc_get_dates_comma_string_localized( $only_full_days[ count( $only_full_days ) - 1 ] ); $hints['selected_dates_hint'] = implode( ', ', $selected_dates_localized ); $hints['days_number_hint'] = (string) count( $selected_dates_localized ); $start_time = $dates_in_diff_formats['start_time']; $end_time = $dates_in_diff_formats['end_time']; if ( ( ! isset( $start_time[0] ) ) || ( '' === $start_time[0] ) ) { $start_time[0] = '00'; } if ( ( ! isset( $start_time[1] ) ) || ( '' === $start_time[1] ) ) { $start_time[1] = '00'; } if ( ( ! isset( $start_time[2] ) ) || ( '' === $start_time[2] ) ) { $start_time[2] = '00'; } if ( ( ! isset( $end_time[0] ) ) || ( '' === $end_time[0] ) ) { $end_time[0] = '00'; } if ( ( ! isset( $end_time[1] ) ) || ( '' === $end_time[1] ) ) { $end_time[1] = '00'; } if ( ( ! isset( $end_time[2] ) ) || ( '' === $end_time[2] ) ) { $end_time[2] = '00'; } $hints['start_time_hint'] = wpbc_time_localized( implode( ':', $start_time ) ); $hints['end_time_hint'] = wpbc_time_localized( implode( ':', $end_time ) ); return $hints; } /** * Print JavaScript that applies calculated hint values. * * @param int $resource_id Booking resource ID. * @param array $hints Calculated hint values. * * @return void */ private static function print_update_script( $resource_id, $hints ) { ?>