PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / core / wpbc-js-vars.php

wpbc-js-vars.php in Booking Calendar 11.9, at core/wpbc-js-vars.php

256 lines 16.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php /**
2 * @version 1.0
3 * @package Booking Calendar - JavaScript
4 * @category Define JavaScript variables
5 * @author wpdevelop
6 *
7 * @web-site https://wpbookingcalendar.com/
8 * @email [email protected]
9 *
10 * @modified 19.10.2015
11 */
12
13 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
14
15 /**
16 * Set local today date ( can depend from the parameters in shortcode: [booking resource_id=1 calendar_dates_start='2025-01-01' calendar_dates_end='2025-12-31'] )
17 *
18 * @param $start_it - default 'now', but you can pass date: '2024-07-26' (usually from the past to set ability to select the time slots in the past).
19 *
20 * @return string
21 */
22 function wpbc_get_localized_js__time_local( $start_it = 'now' ) {
23
24 $script = '';
25 // FixIn: 10.8.1.4.
26 $gmt_time = gmdate( 'Y-m-d H:i:s', strtotime( $start_it ) );
27
28 if ( ( isset( $_REQUEST['allow_past'] ) ) || ( wpbc_is_new_booking_page() && ( isset( $_GET['booking_hash'] ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
29 // Get time in past. //FixIn: 10.10.3.2.
30 $gmt_time = gmdate( 'Y-m-d H:i:s', strtotime( '-' . intval( wpbc_get_max_visible_days_in_calendar() ) . ' days' ) ); // - 365 days or more
31 }
32
33 $gmt_csv = wpbc_datetime_localized__no_wp_timezone( $gmt_time, 'Y,m,d,H,i' );
34 $local_csv = wpbc_datetime_localized__use_wp_timezone( $gmt_time, 'Y,m,d,H,i' );
35
36 $gmt_arr = wpbc_csv_numbers_to_int_array( $gmt_csv );
37 $local_arr = wpbc_csv_numbers_to_int_array( $local_csv );
38
39 $script .= "_wpbc.set_other_param('time_gmt_arr', " . wp_json_encode( $gmt_arr ) . " ); ";
40 $script .= "_wpbc.set_other_param('time_local_arr', " . wp_json_encode( $local_arr ) . " ); ";
41
42 // $script .= "_wpbc.set_other_param( 'time_gmt_arr', [" . wpbc_set_csd_as_int( wpbc_datetime_localized__no_wp_timezone( $gmt_time, 'Y,m,d,H,i' ) ) . '] ); ';
43 // $script .= "_wpbc.set_other_param( 'time_local_arr', [" . wpbc_set_csd_as_int( wpbc_datetime_localized__use_wp_timezone( $gmt_time, 'Y,m,d,H,i' ) ) . '] ); ';
44
45 $unavailable_time_from_today = get_bk_option( 'booking_unavailable_days_num_from_today' );
46
47 if ( ! empty( $unavailable_time_from_today ) ) {
48 if ( 'm' === substr( $unavailable_time_from_today, - 1 ) ) {
49
50 // Get time ONLY, if it is not in past. //FixIn: 10.10.3.2.
51 if ( ( ! isset( $_REQUEST['allow_past'] ) ) && ( ! ( wpbc_is_new_booking_page() && ( isset( $_GET['booking_hash'] ) ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
52 $gmt_time = gmdate( 'Y-m-d H:i:s', strtotime( '+' . ( intval( $unavailable_time_from_today ) - 1 ) . ' minutes' ) );
53 }
54
55 // Local timezone unavailable time. // FixIn: 10.9.6.3.
56 $local_unavailable_datetime_ymdhis = wpbc_datetime_localized__use_wp_timezone( $gmt_time, 'Y-m-d H:i:s' ); // Local unavailable.
57 // Local timezone Now time.
58 $local_now_datetime_ymdhis = wpbc_datetime_localized__use_wp_timezone( strtotime( $start_it ), 'Y-m-d H:i:s' ); // Local Now.
59 // Local timezone Today midnight time.
60 $local_now_datetime_ymd000 = wpbc_datetime_localized__use_wp_timezone( strtotime( $start_it ), 'Y-m-d 00:00:00' ); // Local Midnight.
61
62 // Check time from local MIDNIGHT to Unavailable.
63 $days_number_shift = intval( ( strtotime( $local_unavailable_datetime_ymdhis ) - strtotime( $local_now_datetime_ymd000 ) ) / 86400 );
64 $unavailable_time_from_today = $days_number_shift;
65 // $unavailable_time_from_today = '0'; // FixIn: 10.9.2.6.
66 }
67 } else {
68 $unavailable_time_from_today = '0';
69 }
70
71 $today_local_csv = wpbc_datetime_localized__use_wp_timezone( $gmt_time, 'Y,m,d,H,i' );
72 $today_arr = wpbc_csv_numbers_to_int_array( $today_local_csv );
73
74 $script .= "_wpbc.set_other_param( 'today_arr', " . wp_json_encode( $today_arr ) . " ); ";
75
76 // FixIn: 10.8.1.4.
77 $script .= "_wpbc.set_other_param( 'availability__unavailable_from_today', '" . esc_js( $unavailable_time_from_today ) . "' ); "; //Default: 0 ' Old JS: block_some_dates_from_today' _wpbc.get_other_param( 'availability__unavailable_from_today' )
78
79 return $script;
80 }
81
82
83 /**
84 * Get script string for localised variables.
85 *
86 * @return string
87 */
88 function wpbc_get_localized_js_vars() {
89
90 // $script = 'var1 = '. wp_json_encode('var1') .'; '; // JSON.parse(wpbc_global_var); //.
91
92 $script = '';
93 $script .= "_wpbc.set_other_param( 'locale_active', '" . esc_js( wpbc_get_maybe_reloaded_booking_locale() ) . "' ); ";
94
95 $script .= wpbc_get_localized_js__time_local();
96
97 $script .= "_wpbc.set_other_param( 'url_plugin', '" . esc_url( plugins_url( '', WPBC_FILE ) ) . "' ); ";
98
99 $get_booking_hash = ( ( isset( $_GET['booking_hash'] ) ) ? sanitize_text_field( wp_unslash( $_GET['booking_hash'] ) ) : '' ); /* phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing */ /* FixIn: sanitize_unslash */
100
101 $script .= "_wpbc.set_other_param( 'this_page_booking_hash', '" . esc_js( $get_booking_hash ) . "' ); ";
102
103
104 $script .= "_wpbc.set_other_param( 'calendars__on_this_page', [] ); ";
105
106 $script .= "_wpbc.set_other_param( 'calendars__first_day', '" . intval( get_bk_option( 'booking_start_day_weeek' ) ) . "' ); "; //."\n";
107 $script .= "_wpbc.set_other_param( 'calendars__max_monthes_in_calendar', '" . esc_js( get_bk_option( 'booking_max_monthes_in_calendar' ) ) . "' ); ";
108 if ( class_exists( 'wpdev_bk_biz_m' ) ) {
109 $script .= "_wpbc.set_other_param( 'availability__available_from_today', '" . esc_js( get_bk_option( 'booking_available_days_num_from_today' ) ) . "' ); "; //Default '' - all days. Old JS: 'wpbc_available_days_num_from_today'
110 }
111 $script .= "_wpbc.set_other_param( 'availability__week_days_unavailable', ["
112 . ( ( get_bk_option( 'booking_unavailable_day0') == 'On' ) ? '0,' : '' )
113 . ( ( get_bk_option( 'booking_unavailable_day1') == 'On' ) ? '1,' : '' )
114 . ( ( get_bk_option( 'booking_unavailable_day2') == 'On' ) ? '2,' : '' )
115 . ( ( get_bk_option( 'booking_unavailable_day3') == 'On' ) ? '3,' : '' )
116 . ( ( get_bk_option( 'booking_unavailable_day4') == 'On' ) ? '4,' : '' )
117 . ( ( get_bk_option( 'booking_unavailable_day5') == 'On' ) ? '5,' : '' )
118 . ( ( get_bk_option( 'booking_unavailable_day6') == 'On' ) ? '6,' : '' )
119 . "999] ); "; // 999 - blank day, which will not impact to the checking of the week days. Required for correct creation of this array.
120 // General days selection.
121 $days_selection_arr = wpbc__calendar__js_params__get_days_selection_arr();
122
123 $script .= "_wpbc.set_other_param( 'calendars__days_select_mode', '" . $days_selection_arr['days_select_mode'] . "' ); ";
124 $script .= "_wpbc.set_other_param( 'calendars__fixed__days_num', " . $days_selection_arr['fixed__days_num'] . " ); ";
125 $script .= "_wpbc.set_other_param( 'calendars__fixed__week_days__start', [" . $days_selection_arr['fixed__week_days__start'] . "] ); ";
126 $script .= "_wpbc.set_other_param( 'calendars__dynamic__days_min', " . $days_selection_arr['dynamic__days_min'] . " ); ";
127 $script .= "_wpbc.set_other_param( 'calendars__dynamic__days_max', " . $days_selection_arr['dynamic__days_max'] . " ); ";
128 $script .= "_wpbc.set_other_param( 'calendars__dynamic__days_specific', [" . $days_selection_arr['dynamic__days_specific'] . "] ); ";
129 $script .= "_wpbc.set_other_param( 'calendars__dynamic__week_days__start', [" . $days_selection_arr['dynamic__week_days__start'] . "] ); ";
130
131 // FixIn: 10.3.0.9.
132 if ( false !== strpos( get_bk_option( 'booking_skin' ), 'light__24_8' ) ) {
133 $script .= "_wpbc.set_other_param( 'calendars__days_selection__middle_days_opacity', '0.5' ); ";
134 } else {
135 $script .= "_wpbc.set_other_param( 'calendars__days_selection__middle_days_opacity', '0.75' ); ";
136 }
137
138
139 // Defined in BS.
140 $script .= "_wpbc.set_other_param( 'is_enabled_booking_recurrent_time', " . ( ( get_bk_option( 'booking_recurrent_time' ) !== 'On' ) ? 'false' : 'true' ) . " ); ";
141 $script .= "_wpbc.set_other_param( 'is_allow_several_months_on_mobile', " . ( ( get_bk_option( 'booking_calendar_allow_several_months_on_mobile' ) !== 'On' ) ? 'false' : 'true' ) . " ); ";
142 $script .= "_wpbc.set_other_param( 'is_enabled_change_over', " . (
143 (
144 ( function_exists( 'wpbc_is_booking_used_check_in_out_time' ) )
145 && ( wpbc_is_booking_used_check_in_out_time() )
146 ) ? 'true' : 'false'
147 ) . " ); ";
148
149 $script .= "_wpbc.set_other_param( 'is_enabled_booking_timeslot_picker', " . ( ( 'On' === get_bk_option( 'booking_timeslot_picker' ) ) ? 'true' : 'false' ) . " ); ";
150
151 if ( class_exists( 'wpdev_bk_biz_l' ) ) {
152 $script .= "_wpbc.set_other_param( 'is_enabled_booking_search_results_days_select', '" . esc_js( get_bk_option( 'booking_search_results_days_select' ) ) . "' ); ";
153 }
154
155 $script .= "_wpbc.set_other_param( 'update', '" . esc_attr( WP_BK_VERSION_NUM ) . "' ); ";
156 $script .= "_wpbc.set_other_param( 'version', '" . wpbc_get_version_type__and_mu() . "' ); ";
157
158 // Visitor-facing messages resolve through one multilingual, plain-text registry.
159 foreach ( array_keys( wpbc_frontend_messages__get_registry() ) as $message_key ) {
160 $script .= '_wpbc.set_message( ' . wp_json_encode( $message_key ) . ', ' . wp_json_encode( wpbc_frontend_messages__get( $message_key ) ) . ' ); ';
161 }
162
163 // Internal/admin progress messages remain gettext-controlled and cannot be customized from the booking-form page.
164 $script .= "_wpbc.set_message( 'message_processing', " . wp_json_encode( __( 'Processing', 'booking' ) ) . " ); ";
165 $script .= "_wpbc.set_message( 'message_deleting', " . wp_json_encode( __( 'Deleting', 'booking' ) ) . " ); ";
166 $script .= "_wpbc.set_message( 'message_updating', " . wp_json_encode( __( 'Updating', 'booking' ) ) . " ); ";
167 $script .= "_wpbc.set_message( 'message_saving', " . wp_json_encode( __( 'Saving', 'booking' ) ) . " ); ";
168 $script .= "_wpbc.set_message( 'message_inline_preview_submission_disabled', " . wp_json_encode( __( 'This is a request-local preview. Booking submission is disabled, and no booking will be created.', 'booking' ) ) . " ); ";
169 $script .= "_wpbc.set_message( 'message_error_check_in_out_time', " . wp_json_encode( __( 'Error! Please reset your check-in/check-out dates above.', 'booking' ) ) . " ); ";
170
171 // $script .= "console.log( '== WPBC VARS " . esc_attr( WP_BK_VERSION_NUM ) . ' [' . wpbc_get_version_type__and_mu() . "] LOADED ==' );";
172 $script .= "console.log( '== WPBC VARS " . esc_attr( wpbc_get_wpbc_versions_numbers() ) . ' [' . wpbc_get_version_type__and_mu() . "] LOADED ==' );";
173 return $script;
174 }
175
176
177 // FixIn: 10.14.4.2. (loader made cache-proof)
178 /**
179 * Print inline JS for Booking Calendar that initializes safely even with cache plugins (delay/defer/on-interaction).
180 *
181 * @param string $where_to_load 'both' by default.
182 *
183 * @return void
184 */
185 function wpbc_localize_js_vars( $where_to_load = 'both' ) {
186
187 // Allow disabling, if needed.
188 if ( apply_filters( 'wpbc_disable_inline_bootstrap', false, $where_to_load ) ) {
189 return;
190 }
191
192 // 1) BEFORE: essentials used by inlines or deferred scripts. - Define both a global var and window property for maximum compatibility.
193 $script_before = 'var wpbc_url_ajax = ' . wp_json_encode( admin_url( 'admin-ajax.php' ) ) . ';' . 'window.wpbc_url_ajax = wpbc_url_ajax;';
194 wp_add_inline_script( 'wpbc_all', $script_before, 'before' );
195
196 // 2) Existing payload (calls to _wpbc.set_other_param, _wpbc.set_message, …).
197 $payload_js = wpbc_get_localized_js_vars();
198
199 // 3) Robust bootstrap: runs payload only when _wpbc is ready.
200 $max_wait_ms = (int) apply_filters( 'wpbc_js_bootstrap_max_wait_ms', 10000 ); // 10s cap
201 $poll_interval_ms = (int) apply_filters( 'wpbc_js_bootstrap_poll_interval_ms', 50 ); // 50ms
202 $custom_events = (array) apply_filters( 'wpbc_js_bootstrap_ready_events', array( 'wpbc-ready', 'wpbc:ready', 'wpbc_ready', 'wpbcReady' ) );
203 $user_events = (array) apply_filters( 'wpbc_js_bootstrap_user_events', array( 'click', 'mousemove', 'touchstart', 'keydown', 'scroll' ) );
204
205 $boot_js = '(function(){' . "\n" .
206 '"use strict";' . "\n" .
207 'function wpbc_init__head(){' . $payload_js . '}' . "\n" .
208 '(function(){' . "\n" .
209 ' if (window.__wpbc_boot_done__ === true) return;' . "\n" .
210 // global guard across duplicates.
211 ' var started = false;' . "\n" .
212 ' function run_once(){' . "\n" .
213 ' if (started || window.__wpbc_boot_done__ === true) return true;' . "\n" .
214 ' started = true;' . "\n" .
215 ' try { wpbc_init__head(); window.__wpbc_boot_done__ = true; }' . "\n" .
216 ' catch(e){ started = false; try{console.error("WPBC init failed:", e);}catch(_){} }' . "\n" .
217 ' return (window.__wpbc_boot_done__ === true);' . "\n" .
218 ' }' . "\n" .
219 // Fast path.
220 ' function is_ready(){ return !!(window._wpbc && typeof window._wpbc.set_other_param === "function"); }' . "\n" .
221 ' if ( is_ready() && run_once() ) return;' . "\n" .
222 // Polling fallback (covers delayed/deferred/on-interaction loaders).
223 ' var waited = 0, max_ms = ' . $max_wait_ms . ', step = ' . $poll_interval_ms . ';' . "\n" .
224 ' var timer = setInterval(function(){' . "\n" .
225 ' if ( is_ready() && run_once() ) { clearInterval(timer); return; }' . "\n" .
226 ' waited += step;' . "\n" .
227 ' if ( waited >= max_ms ) {' . "\n" .
228 ' clearInterval(timer);' . "\n" .
229 ' // Switch to slow polling (1s) so we still init even without user interaction later.' . "\n" .
230 ' var slow = setInterval(function(){ if ( is_ready() && run_once() ) clearInterval(slow); }, 1000);' . "\n" .
231 ' try{console.warn("WPBC: _wpbc not detected within " + max_ms + "ms; using slow polling.");}catch(_){}' . "\n" .
232 ' }' . "\n" .
233 ' }, step);' . "\n" .
234 // Listen for your custom ready events (emit from core once _wpbc is ready).
235 ' var evs = ' . wp_json_encode( array_values( $custom_events ) ) . ';' . "\n" .
236 ' evs.forEach(function(name){' . "\n" .
237 ' document.addEventListener(name, function onready(){ if (is_ready() && run_once()) document.removeEventListener(name, onready); });' . "\n" .
238 ' });' . "\n" .
239 // Standard lifecycle events (covers DOMContentLoaded + load).
240 ' if (document.readyState === "loading") {' . "\n" .
241 ' document.addEventListener("DOMContentLoaded", function(){ if (is_ready()) run_once(); }, { once:true });' . "\n" .
242 ' }' . "\n" .
243 ' window.addEventListener("load", function(){ if (is_ready()) run_once(); }, { once:true });' . "\n" .
244 ' window.addEventListener("pageshow", function(){ if (is_ready()) run_once(); }, { once:true });' . "\n" .
245 ' document.addEventListener("visibilitychange", function(){ if (!document.hidden && is_ready()) run_once(); });' . "\n" .
246 // User interaction hooks — some cache plugins load delayed JS only after interaction.
247 ' var ui = ' . wp_json_encode( array_values( $user_events ) ) . ';' . "\n" .
248 ' var ui_bailed = false;' . "\n" .
249 ' function on_ui(){ if (ui_bailed) return; if (is_ready() && run_once()){ ui_bailed = true; ui.forEach(function(t){ document.removeEventListener(t, on_ui, true); }); } }' . "\n" .
250 ' ui.forEach(function(t){ document.addEventListener(t, on_ui, true); });' . "\n" .
251 '})();' . "\n" .
252 '})();';
253 wp_add_inline_script( 'wpbc_all', $boot_js );
254 }
255 add_action( 'wpbc_enqueue_js_files', 'wpbc_localize_js_vars', 51 );
256