PluginProbe
Booking Calendar / 11.8.4
Booking Calendar v11.8.4
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 10.11 All 204 releases
← All changes | core/wpbc-js.php +432 -418 10.1.311.8.4 View file →
@@ -1,418 +1,432 @@
1 -<?php /**
2 - * @version 1.0
3 - * @package Booking Calendar
4 - * @category JavaScript files and varibales
5 - * @author wpdevelop
6 - *
7 - * @web-site https://wpbookingcalendar.com/
8 - * @email info@wpbookingcalendar.com
9 - *
10 - * @modified 19.10.2015
11 - */
12 -
13 -if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
14 -
15 -class WPBC_JS extends WPBC_JS_CSS {
16 -
17 - public function define() {
18 -
19 - $this->setType('js');
20 -
21 - /*
22 - $this->add( array(
23 - 'handle' => 'wpbc-datepick',
24 - 'src' => wpbc_plugin_url( '/js/datepick/jquery.datepick.js'),
25 - 'deps' => array( 'wpbc-global-vars' ),
26 - 'version' => '1.1',
27 - 'where_to_load' => array( 'admin', 'client' ), //Usage: array( 'admin', 'client' )
28 - 'condition' => false
29 - ) );
30 - */
31 - }
32 -
33 - /**
34 - * Enqueue Files and Varibales.
35 - * Useful in case, if we use get_options and current user functions...
36 - *
37 - * @param type $where_to_load
38 - */
39 - public function enqueue( $where_to_load ) {
40 -
41 - wpbc_remove_js_conflicts(); //FixIn: 9.5.4.2
42 -
43 - wpbc_js_load_vars( $where_to_load );
44 - do_action( 'wpbc_define_js_vars', $where_to_load ); // Define JavaScript variables in all other files
45 -
46 - wpbc_js_load_libs( $where_to_load );
47 - wpbc_js_load_files( $where_to_load );
48 -
49 - if ( wpbc_is_new_booking_page() || wpbc_is_settings_form_page()) {
50 - $where_to_load = 'both';
51 - }
52 -
53 - // Load JavaScript files in all other versions
54 - do_action( 'wpbc_enqueue_js_files', $where_to_load );
55 -
56 - /*
57 - * Remove `async` and `defer` ( check more here https://javascript.info/script-async-defer )
58 - * for scripts registered or enqueued, that required for correct working of plugin, like
59 - * jquery and all Booking Calendar scripts
60 - * because inside content of the page can be something like jQuery( document ).ready( function(){ ...} which will
61 - * generate Uncaught ReferenceError: jQuery is not defined
62 - */
63 - add_filter( 'script_loader_tag', array( $this, 'filter_script_loader_tag' ), 9000000000 , 3 );
64 - }
65 -
66 -
67 - /**
68 - * Remove `async` and `defer` ( check more here https://javascript.info/script-async-defer )
69 - * for scripts registered or enqueued, that required for correct working of plugin, like
70 - * jquery and all Booking Calendar scripts
71 - *
72 - * @param string $tag The script tag.
73 - * @param string $handle The script handle.
74 - *
75 - * @return string Script HTML string.
76 - *
77 - */
78 - public function filter_script_loader_tag( $tag, $handle, $src ) {
79 -
80 - $script_handles_prevent_defer = array(
81 - 'jquery-core' // exact value
82 - , 'jquery-migrate'
83 - //, 'wpbc-' //starting from 'wpbc-' it's not the exact value
84 - //, 'wpdevelop-'
85 - );
86 -
87 -
88 - // Remove defer and async attribute from the src.
89 - if (
90 - ( 'jquery-core' === $handle )
91 - || ( 'jquery-migrate' === $handle )
92 - || ( false !== strpos( $handle, 'wpbc_' ) ) // Booking Calendar script wpbc_all.js //FixIn: 10.1.2.3
93 - || ( false !== strpos( $handle, 'wpbc-' ) ) // Booking Calendar scripts
94 - || ( false !== strpos( $handle, 'wpdevelop-' ) )
95 - || ( false !== strpos( $handle, 'wpbm-' ) )
96 - ) {
97 -
98 - foreach ( array( 'async', 'defer' ) as $attr ) {
99 -
100 - if ( preg_match( ":\s$attr(=|>|\s):", $tag ) ) {
101 - $tag = str_replace($attr, '', $tag);
102 - $tag = str_replace('=""', '', $tag);
103 - $tag = str_replace("=''", '', $tag);
104 -
105 - /*
106 - * Test here https://regex101.com/
107 - *
108 - * Expression: \s+defer(\s*=\s*["']defer["'])?\s?
109 - * Test string: <script type='text/javascript' defer = 'defer' defer="defer" src='http://beta/wp-content/plugins/booking-manager/js/wpbm_vars.js?ver=1.1' id='wpbm-global-vars-js'></script>
110 - *
111 - */
112 - $pattern = ":\s+{$attr}(\s*=\s*[\"']{$attr}[\"'])?\s?:mi";
113 - $replacement = ' ';
114 - $tag = preg_replace($pattern, $replacement, $tag);
115 - }
116 - }
117 - }
118 -
119 - return $tag;
120 - }
121 -
122 -
123 - /**
124 - * Deregister some conflict scripts from other plugins.
125 - *
126 - * @param type $where_to_load
127 - */
128 - public function remove_conflicts( $where_to_load ) {
129 -
130 - if ( wpbc_is_bookings_page() ) {
131 - if (function_exists('wp_dequeue_script')) {
132 - //wp_dequeue_script( 'jquery.cookie' );
133 - //wp_dequeue_script( 'jquery-interdependencies' );
134 - wp_dequeue_script( 'chosen' );
135 - wp_dequeue_script( 'cs-framework' );
136 - wp_dequeue_script( 'cgmp-jquery-tools-tooltip' ); // Remove this script jquery.tools.tooltip.min.js, which is load by the "Comprehensive Google Map Plugin"
137 - wp_dequeue_script( 'bootstrap-script' );
138 - }
139 - }
140 - }
141 -}
142 -
143 -
144 -/** Define JavaScript Varibales */
145 -function wpbc_js_load_vars( $where_to_load ) {
146 -
147 - ////////////////////////////////////////////////////////////////////////////
148 - // JavaScripts Variables
149 - ////////////////////////////////////////////////////////////////////////////
150 -
151 - wp_enqueue_script( 'wpbc-global-vars', wpbc_plugin_url( '/js/wpbc_vars.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); // Blank JS File
152 -
153 -// wp_localize_script( 'wpbc-global-vars' ,
154 -// 'wpbc_js_global', array(
155 -// 'wpdev_bk_plugin_url' => plugins_url( '', WPBC_FILE )
156 -// )
157 -// );
158 -
159 -}
160 -
161 -
162 -/** Default JavaScripts Libraries */
163 -function wpbc_js_load_libs( $where_to_load ) {
164 -
165 - wp_enqueue_script( 'jquery' ); // jQuery
166 -
167 - // Default Admin Libs
168 - if ( 'admin' == $where_to_load ) {
169 - if ( wpbc_is_settings_page() ) {
170 - wp_enqueue_style( 'thickbox' ); // CSS Thickbox
171 - wp_enqueue_script( 'thickbox' ); // JS Thickbox
172 - wp_enqueue_media();
173 - }
174 - wp_enqueue_style( 'wp-color-picker' ); // Color Picker
175 - wp_enqueue_script( 'wp-color-picker' );
176 - wp_enqueue_script( 'jquery-ui-sortable' ); // UI Sortable
177 - }
178 -
179 - // WP Util, that support wp.template, based on underscore _.template system
180 - wp_enqueue_script( 'wp-util' ); //FixIn: TimeFreeGenerator //FixIn: 9.4.4.11
181 -}
182 -
183 -
184 -/** Load JavaScript Files */
185 -function wpbc_js_load_files( $where_to_load ) {
186 -
187 - wp_enqueue_script( 'wpbc_all', wpbc_plugin_url( '/_dist/all/_out/wpbc_all.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.6.1
188 -
189 - /**
190 - * Popover functionality.
191 - * Popover based on Tippy.js ( https://atomiks.github.io/tippyjs/v6/all-props/#allowhtml ), which is based on popper.js ( https://popper.js.org/docs/v2/tutorial/ )
192 - * Install Alt + F12 run
193 - * npm i @popperjs/core
194 - * npm i tippy.js
195 - * Copy ..\node_modules\@popperjs\core\dist\umd to ..\wp-content/plugins/booking/assets/libs/popper
196 - * Copy ..\node_modules\tippy.js\{dist && themes} to ..\wp-content/plugins/booking/assets/libs/tippy.js
197 - * In popper.js edit global.Popper to global.wpbc_Popper
198 - * In tippy-bundle.umd.js edit global.Popper to global.wpbc_Popper and global.tippy to global.wpbc_tippy
199 - */
200 - wp_enqueue_script( 'wpbc-popper', wpbc_plugin_url( '/assets/libs/popper/popper.js' ), array( 'wpbc-global-vars' ), WP_BK_VERSION_NUM ); //FixIn: 9.0.1.1
201 - wp_enqueue_script( 'wpbc-tipcy', wpbc_plugin_url( '/assets/libs/tippy.js/dist/tippy-bundle.umd.js' ), array( 'wpbc-popper' ) , WP_BK_VERSION_NUM ); //FixIn: 9.8.1
202 -
203 - if ( $where_to_load != 'client' ) {
204 - wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/assets/libs/ui/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
205 - }
206 -
207 - wp_enqueue_script( 'wpbc-datepick', wpbc_plugin_url( '/js/datepick/jquery.datepick.wpbc.9.0.js'), array( 'wpbc-global-vars' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
208 - $calendar_localization_url = wpbc_get_calendar_localization_url(); // Localization
209 - if ( ! empty( $calendar_localization_url ) ) {
210 - wp_enqueue_script( 'wpbc-datepick-localize', $calendar_localization_url, array( 'wpbc-datepick' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
211 - }
212 -
213 - if ( ( $where_to_load == 'client' ) || ( wpbc_is_new_booking_page() ) || ( wpbc_is_settings_form_page() ) ) {
214 -
215 - wp_enqueue_script( 'wpbc-main-client', wpbc_plugin_url( '/js/client.js' ), array( 'wpbc-datepick' ), WP_BK_VERSION_NUM ); // Client
216 - wp_enqueue_script( 'wpbc_capacity', wpbc_plugin_url( '/includes/_capacity/_out/create_booking.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM ); // Add new bookings //FixIn: 9.8.0.3
217 - wp_enqueue_script( 'wpbc-times', wpbc_plugin_url( '/js/wpbc_times.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM ); // FixIn: TimeFree 2 //UnComment it for Booking Calendar Free version
218 - if ( 'On' === get_bk_option( 'booking_timeslot_picker' ) ) {
219 - wp_enqueue_script( 'wpbc-time-selector', wpbc_plugin_url( '/js/wpbc_time-selector.js'), array( 'wpbc-times' ), WP_BK_VERSION_NUM); //FixIn: 8.7.11.10
220 - }
221 - }
222 -
223 - if ( $where_to_load == 'admin' ) {
224 - wp_enqueue_script( 'wpbc-js-print', wpbc_plugin_url( '/assets/libs/wpbc_js_print/wpbc_js_print.js' ), array( 'jquery' ) , WP_BK_VERSION_NUM ); //FixIn: 9.8.1 //FixIn: 9.2.1.6 //FixIn: 9.1.2.13
225 - wp_enqueue_script( 'wpbc-admin-main', wpbc_plugin_url( '/js/admin.js'), array( 'wpbc-global-vars' ), WP_BK_VERSION_NUM ); // Admin
226 - if ( wpbc_can_i_load_on_this_page__shortcode_config() ) {
227 - wp_enqueue_script( 'wpbc_shortcode_popup', wpbc_plugin_url( '/includes/ui_modal__shortcodes/_out/wpbc_shortcode_popup.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.6.1
228 - }
229 - wp_enqueue_script( 'wpbc-admin-support', wpbc_plugin_url( '/core/any/js/admin-support.js'), array( 'wpbc-global-vars' ), WP_BK_VERSION_NUM );
230 - wp_enqueue_script( 'wpbc-chosen', wpbc_plugin_url( '/assets/libs/chosen/chosen.jquery.min.js'), array( 'wpbc-global-vars' ), WP_BK_VERSION_NUM ); // Chosen Library
231 - }
232 -}
233 -
234 -
235 -/**
236 - * Remove JS libraries that conflict with Booking Calendar at the pages with booking forms.
237 - *
238 - * You can disable loading of all Booking Calendar JavaScript files at the Booking > Settings General page in "Advanced" section.
239 - * To do so, you can expand the "Show advanced settings of JavaScript loading" option and select the "Load JS and CSS files only on specific pages" checkbox.
240 - * You can then specify a list of pages in a textarea where you want the Booking Calendar to appear.
241 - *
242 - * @return void
243 - */
244 -function wpbc_remove_js_conflicts() {
245 - //if ( wp_script_is( 'script-ID', 'registered' ) ) { }
246 - wp_deregister_script( 'mphb-kbwood-datepick' );
247 -}
248 -
249 -////////////////////////////////////////////////////////////////////////////////
250 -// Support JavaScript functions
251 -////////////////////////////////////////////////////////////////////////////////
252 -
253 -/**
254 - * Get URL Datepicker Localization JS File
255 - *
256 - * @return string - URL to calendar skin
257 - */
258 -function wpbc_get_calendar_localization_url() {
259 - // Datepicker Localization - translation for calendar. Example: $locale = 'fr_FR';
260 - $locale = wpbc_get_maybe_reloaded_booking_locale();
261 -
262 - $calendar_localization_url = false;
263 -
264 - if ( ! empty( $locale ) ) {
265 -
266 - $locale_lang = strtolower( substr( $locale, 0, 2 ) ); // 7.0.1.51
267 - $locale_country = strtolower( substr( $locale, 3 ) );
268 -
269 - if ( ( $locale_lang !== 'en') && ( wpbc_is_file_exist( '/js/datepick/jquery.datepick-' . $locale_lang . '.js' ) ) ) {
270 -
271 - $calendar_localization_url = wpbc_plugin_url( '/js/datepick/jquery.datepick-'. $locale_lang . '.js' );
272 -
273 - } else if ( ( ! in_array( $locale, array( 'en_US', 'en_CA', 'en_GB', 'en_AU' ) ) ) // English Exceptions
274 - && ( wpbc_is_file_exist( '/js/datepick/jquery.datepick-'. $locale_country . '.js' ) )
275 - ) {
276 -
277 - $calendar_localization_url = wpbc_plugin_url( '/js/datepick/jquery.datepick-'. $locale_country . '.js' );
278 - }
279 - }
280 -
281 - return $calendar_localization_url;
282 -}
283 -
284 -
285 -/**
286 - * Check if we activated loading of JS/CSS only on specific pages and then load or no it
287 - *
288 - * @param boolean $is_load_scripts - Default: true
289 - * @return boolean - true | false
290 - */
291 -function wpbc_is_load_css_js_on_client_page( $is_load_scripts ) {
292 -
293 - if ( ! is_admin() ) { // Check on Client side only
294 -
295 - $booking_is_load_js_css_on_specific_pages = get_bk_option( 'booking_is_load_js_css_on_specific_pages' );
296 - if ( $booking_is_load_js_css_on_specific_pages == 'On' ) {
297 -
298 - $booking_pages_for_load_js_css = get_bk_option( 'booking_pages_for_load_js_css' );
299 -
300 - $booking_pages_for_load_js_css = preg_split('/[\r\n]+/', $booking_pages_for_load_js_css, -1, PREG_SPLIT_NO_EMPTY);
301 -
302 - $request_uri = $_SERVER['REQUEST_URI']; //FixIn:5.4.1
303 - //FixIn: 8.4.5.8
304 - if (
305 - ( strpos( $request_uri, 'booking_hash=') !== false )
306 - || ( strpos( $request_uri, 'check_in=') !== false )
307 - ) {
308 - $request_uri = parse_url($request_uri);
309 - if ( ( ! empty($request_uri ) ) && ( isset($request_uri['path'] ) ) ){
310 - $request_uri = $request_uri['path'];
311 - } else {
312 - $request_uri = $_SERVER['REQUEST_URI'];
313 - }
314 - }
315 -
316 - if ( ( ! empty( $booking_pages_for_load_js_css ) ) && ( ! in_array( $request_uri, $booking_pages_for_load_js_css ) ) ) {
317 -
318 - wp_add_inline_script( 'jquery', "console.log( '== WPBC :: Loading of JS/CSS files disabled for this page at WP Booking Calendar > Settings General page in Advanced section ==' );" );
319 - return false;
320 - }
321 - }
322 - }
323 - return true;
324 -}
325 -add_filter( 'wpbc_is_load_script_on_this_page', 'wpbc_is_load_css_js_on_client_page' );
326 -
327 -/**
328 - * Load JS and CSS files for loading modals correctly
329 - *
330 - * @return void
331 - */
332 -function wpbc_load_js__required_for_modals(){
333 -
334 - // JS for opening Modals
335 - wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/assets/libs/ui/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
336 -
337 - // CSS
338 - wp_enqueue_style( 'wpdevelop-bts', wpbc_plugin_url( '/assets/libs/bootstrap-css/css/bootstrap.css' ), array(), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
339 - wp_enqueue_style( 'wpdevelop-bts-theme', wpbc_plugin_url( '/assets/libs/bootstrap-css/css/bootstrap-theme.css' ), array(), WP_BK_VERSION_NUM ); //FixIn: 9.8.1
340 -
341 - wp_enqueue_style( 'wpbc-admin-support', wpbc_plugin_url( '/core/any/css/admin-support.css' ), array(), WP_BK_VERSION_NUM );
342 - wp_enqueue_style( 'wpbc-admin-menu', wpbc_plugin_url( '/core/any/css/admin-menu.css' ), array(), WP_BK_VERSION_NUM );
343 - //wp_enqueue_style( 'wpbc-admin-toolbar', wpbc_plugin_url( '/core/any/css/admin-toolbar.css' ), array(), WP_BK_VERSION_NUM );
344 - wp_enqueue_style( 'wpbc-flex-toolbar', wpbc_plugin_url( '/includes/_toolbar_ui/_src/toolbar_ui.css' ), array(), WP_BK_VERSION_NUM );
345 - wp_enqueue_style( 'wpbc-admin-modal-popups', wpbc_plugin_url( '/css/modal.css' ), array(), WP_BK_VERSION_NUM);
346 - wp_enqueue_style( 'wpbc-admin-pages', wpbc_plugin_url( '/css/admin.css' ), array(), WP_BK_VERSION_NUM);
347 - wp_enqueue_style( 'wpbc-admin-skin', wpbc_plugin_url( '/css/admin-skin.css' ), array( 'wpbc-admin-pages' ), WP_BK_VERSION_NUM); //FixIn: 8.0.2.4
348 - //if ( 'legacy' != get_bk_option( 'booking_admin_panel_skin' ) ) { //FixIn: 9.5.5.7
349 - wp_enqueue_style( 'wpbc-admin-skin-modern_1', wpbc_plugin_url( '/css/admin-skin-modern_1.css' ), array( 'wpbc-admin-skin' ), WP_BK_VERSION_NUM ); //FixIn: 9.5.5.1
350 - //}
351 -}
352 -
353 -
354 -/**
355 - * Load JS and CSS files for opening Media Upload PopUp in Admin Panel
356 - *
357 - * @return void
358 - */
359 -function wpbc_load_js__required_for_media_upload(){
360 -
361 - /**
362 - * Internal WordPress depending on:
363 - * 'wp-util' -> array( 'underscore', 'jquery' )
364 - * 'wp-backbone' -> array( 'backbone', 'wp-util' )
365 - * wp_enqueue_script( 'media-editor' ) -> 'wp-backbone'
366 - */
367 - if ( ! wpbc_is_this_demo() ) {
368 - wp_enqueue_media();
369 - wp_enqueue_script( 'wpbc_ui__media_upload', wpbc_plugin_url( '/includes/_media_upload/_out/wpbc_ui__media_upload.js' ), array(
370 - 'jquery',
371 - 'media-editor'
372 - ), WP_BK_VERSION_NUM );
373 - } else {
374 - $script = "jQuery(document).ready(function() { ";
375 - $script .= " jQuery( '.wpbc_media_upload_button' ).on( 'click', function( event ) { ";
376 - $script .= " alert('Warning! This feature is restricted in the public live demo.' ); ";
377 - $script .= " }); ";
378 - $script .= "}); ";
379 - wp_add_inline_script( 'jquery', $script );
380 - }
381 -}
382 -
383 -
384 -/**
385 - * On jQuery(...).ready function Start
386 - *
387 - * @return string
388 - */
389 -function wpbc_jq_ready_start() {
390 -
391 - return "(function() { var a = setInterval( function() { if ( ( 'undefined' === typeof jQuery ) || ! window.jQuery ) { return; } clearInterval( a ); jQuery( document ).ready( function (){";
392 -
393 - // Help description:
394 - ?><script type="text/javascript">
395 - (function (){
396 - var a = setInterval( function (){
397 - if ( ('undefined' === typeof jQuery) || !window.jQuery ){
398 - return;
399 - }
400 - clearInterval( a );
401 - // Here can be executed jQuery functions
402 - jQuery( document ).ready( function (){
403 - // Here is my code start
404 - } );
405 - }, 500 );
406 - })();
407 - </script><?php
408 -}
409 -
410 -
411 -/**
412 - * On jQuery(...).ready function end
413 - * @return string
414 - */
415 -function wpbc_jq_ready_end() {
416 -
417 - return "} ); }, 500 ); })();";
418 -}
1 +<?php /**
2 + * @version 1.0
3 + * @package Booking Calendar
4 + * @category JavaScript files and varibales
5 + * @author wpdevelop
6 + *
7 + * @web-site https://wpbookingcalendar.com/
8 + * @email info@wpbookingcalendar.com
9 + *
10 + * @modified 19.10.2015
11 + */
12 +
13 +if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
14 +
15 +class WPBC_JS extends WPBC_JS_CSS {
16 +
17 + public function define() {
18 +
19 + $this->setType('js');
20 +
21 + /*
22 + $this->add( array(
23 + 'handle' => 'wpbc-datepick',
24 + 'src' => wpbc_plugin_url( '/js/datepick/jquery.datepick.js'),
25 + 'deps' => array( 'wpbc_all' ),
26 + 'version' => '1.1',
27 + 'where_to_load' => array( 'admin', 'client' ), //Usage: array( 'admin', 'client' )
28 + 'condition' => false
29 + ) );
30 + */
31 + }
32 +
33 + /**
34 + * Enqueue Files and Varibales.
35 + * Useful in case, if we use get_options and current user functions...
36 + *
37 + * @param type $where_to_load
38 + */
39 + public function enqueue( $where_to_load ) {
40 +
41 + wpbc_remove_js_conflicts(); // FixIn: 9.5.4.2.
42 +
43 + wpbc_js_load_vars( $where_to_load );
44 + do_action( 'wpbc_define_js_vars', $where_to_load ); // Define JavaScript variables in all other files
45 +
46 + wpbc_js_load_libs( $where_to_load );
47 + wpbc_js_load_files( $where_to_load );
48 +
49 + if ( wpbc_is_admin_page_with_frontend_booking_preview() ) {
50 + $where_to_load = 'both';
51 + }
52 +
53 + // Load JavaScript files in all other versions
54 + do_action( 'wpbc_enqueue_js_files', $where_to_load );
55 +
56 + /*
57 + * Remove `async` and `defer` ( check more here https://javascript.info/script-async-defer )
58 + * for scripts registered or enqueued, that required for correct working of plugin, like
59 + * jquery and all Booking Calendar scripts
60 + * because inside content of the page can be something like jQuery( document ).ready( function(){ ...} which will
61 + * generate Uncaught ReferenceError: jQuery is not defined
62 + */
63 + add_filter( 'script_loader_tag', array( $this, 'filter_script_loader_tag' ), 9000000000 , 3 );
64 + }
65 +
66 +
67 + /**
68 + * Preserve the required execution order for Booking Calendar scripts.
69 + *
70 + * Removes asynchronous loading attributes and excludes the scripts from
71 + * Cloudflare Rocket Loader. The filter runs at a very late priority so these
72 + * protections remain present after other script-tag optimization filters.
73 + *
74 + * @param string $tag The script tag.
75 + * @param string $handle The registered script handle.
76 + * @param string $src The script source URL.
77 + *
78 + * @return string Filtered script HTML string.
79 + */
80 + public function filter_script_loader_tag( $tag, $handle, $src ) {
81 + $is_required_script = (
82 + ( 'jquery-core' === $handle )
83 + || ( 'jquery-migrate' === $handle )
84 + || ( false !== strpos( $handle, 'wpbc_' ) ) // Booking Calendar script wpbc_all.js // FixIn: 10.1.2.3.
85 + || ( false !== strpos( $handle, 'wpbc-' ) ) // Booking Calendar scripts
86 + || ( false !== strpos( $handle, 'wpdevelop-' ) )
87 + || ( false !== strpos( $handle, 'wpbm-' ) )
88 + );
89 +
90 + if ( $is_required_script ) {
91 + foreach ( array( 'async', 'defer' ) as $attr ) {
92 + // Match only a standalone attribute, not the "async" part of data-cfasync.
93 + $pattern = '/\s+' . $attr . '(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^\s>]+))?/i';
94 + $tag = preg_replace( $pattern, '', $tag );
95 + }
96 +
97 + // Rocket Loader can otherwise execute dependent scripts before wpbc_all.js defines _wpbc.
98 + if ( false === strpos( $tag, 'data-cfasync=' ) ) {
99 + $tag = preg_replace( '/<script\b/i', '<script data-cfasync="false"', $tag, 1 );
100 + }
101 + }
102 +
103 + return $tag;
104 + }
105 +
106 +
107 + /**
108 + * Deregister some conflict scripts from other plugins.
109 + *
110 + * @param type $where_to_load
111 + */
112 + public function remove_conflicts( $where_to_load ) {
113 +
114 + if ( wpbc_is_bookings_page() ) {
115 + if (function_exists('wp_dequeue_script')) {
116 + //wp_dequeue_script( 'jquery.cookie' );
117 + //wp_dequeue_script( 'jquery-interdependencies' );
118 + wp_dequeue_script( 'chosen' );
119 + wp_dequeue_script( 'cs-framework' );
120 + wp_dequeue_script( 'cgmp-jquery-tools-tooltip' ); // Remove this script jquery.tools.tooltip.min.js, which is load by the "Comprehensive Google Map Plugin"
121 + wp_dequeue_script( 'bootstrap-script' );
122 + }
123 + }
124 + }
125 +}
126 +
127 +
128 +/** Define JavaScript Varibales */
129 +function wpbc_js_load_vars( $where_to_load ) {
130 +
131 +
132 +}
133 +
134 +
135 +/** Default JavaScripts Libraries */
136 +function wpbc_js_load_libs( $where_to_load ) {
137 +
138 + wp_enqueue_script( 'jquery' ); // jQuery.
139 +
140 + // $src = '';
141 + // $deps = '';
142 + // $ver = false;
143 + // wp_enqueue_script( 'jquery', $src, $deps, $ver, array( 'in_footer' => WPBC_JS_IN_FOOTER ) );
144 +
145 + // Default Admin Libs
146 + if ( 'admin' == $where_to_load ) {
147 + if ( wpbc_is_settings_page() ) {
148 + wp_enqueue_style( 'thickbox' ); // CSS Thickbox
149 + wp_enqueue_script( 'thickbox' ); // JS Thickbox
150 + wp_enqueue_media();
151 + }
152 + wp_enqueue_style( 'wp-color-picker' ); // Color Picker
153 + wp_enqueue_script( 'wp-color-picker' );
154 + wp_enqueue_script( 'jquery-ui-sortable' ); // UI Sortable
155 + }
156 +
157 + // WP Util, that support wp.template, based on underscore _.template system
158 + wp_enqueue_script( 'wp-util' ); //FixIn: TimeFreeGenerator // FixIn: 9.4.4.11.
159 +}
160 +
161 +
162 +/** Load JavaScript Files */
163 +function wpbc_js_load_files( $where_to_load ) {
164 +
165 + wp_enqueue_script( 'wpbc_all', wpbc_plugin_url( '/_dist/all/_out/wpbc_all.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.6.1.
166 +
167 + /**
168 + * Popover functionality.
169 + * Popover based on Tippy.js ( https://atomiks.github.io/tippyjs/v6/all-props/#allowhtml ), which is based on popper.js ( https://popper.js.org/docs/v2/tutorial/ )
170 + * Install Alt + F12 run
171 + * npm i @popperjs/core
172 + * npm i tippy.js
173 + * Copy ..\node_modules\@popperjs\core\dist\umd to ..\wp-content/plugins/booking/vendors/_custom/popper
174 + * Copy ..\node_modules\tippy.js\{dist && themes} to ..\wp-content/plugins/booking/vendors/_custom/tippy.js
175 + * In popper.js edit global.Popper to global.wpbc_Popper
176 + * In tippy-bundle.umd.js edit global.Popper to global.wpbc_Popper and global.tippy to global.wpbc_tippy
177 + */
178 + wp_enqueue_script( 'wpbc-popper', wpbc_plugin_url( '/vendors/_custom/popper/popper.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.0.1.1.
179 + wp_enqueue_script( 'wpbc-tipcy', wpbc_plugin_url( '/vendors/_custom/tippy.js/dist/tippy-bundle.umd.js' ), array( 'wpbc-popper' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); //FixIn: 9.8.1
180 +
181 + if ( $where_to_load != 'client' ) {
182 + wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/vendors/_custom/dropdown_modal/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); //FixIn: 9.8.1
183 + }
184 +
185 + wp_enqueue_script( 'wpbc-datepick', wpbc_plugin_url( '/js/datepick/jquery.datepick.wpbc.9.0.js'), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); //FixIn: 9.8.1
186 + $calendar_localization_url = wpbc_get_calendar_localization_url(); // Localization
187 + if ( ! empty( $calendar_localization_url ) ) {
188 + wp_enqueue_script( 'wpbc-datepick-localize', $calendar_localization_url, array( 'wpbc-datepick' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); //FixIn: 9.8.1
189 + }
190 +
191 + if ( ( $where_to_load == 'client' ) || wpbc_is_admin_page_with_frontend_booking_preview() ) {
192 +
193 + wp_enqueue_script( 'wpbc-main-client', wpbc_plugin_url( '/js/client.js' ), array( 'wpbc-datepick' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Client
194 + wp_enqueue_script( 'wpbc_capacity', wpbc_plugin_url( '/includes/_capacity/_out/create_booking.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Add new bookings // FixIn: 9.8.0.3.
195 + wp_enqueue_script( 'wpbc-times', wpbc_plugin_url( '/js/wpbc_times.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: TimeFree 2 //UnComment it for Booking Calendar Free version
196 + // if ( ( 'On' === get_bk_option( 'booking_timeslot_picker' ) ) || ( wpbc_is_setup_wizard_page() ) ) {
197 + wp_enqueue_script( 'wpbc-time-selector', wpbc_plugin_url( '/js/wpbc_time-selector.js'), array( 'wpbc-times' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 8.7.11.10.
198 + // }
199 + wp_enqueue_script( 'wpbc-imask', wpbc_plugin_url( '/vendors/imask/dist/imask.js'), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 10.12.4.10.
200 + $booking_is_use_phone_validation = get_bk_option( 'booking_is_use_phone_validation' );
201 + if ( 'On' === $booking_is_use_phone_validation ) {
202 + wp_enqueue_script( 'wpbc-iphone-validator', wpbc_plugin_url( '/js/wpbc_phone_validator.js' ), array( 'wpbc-imask' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 10.12.4.10.
203 + }
204 + }
205 +
206 + if ( 'admin' === $where_to_load ) {
207 + wp_enqueue_script( 'wpbc-js-print', wpbc_plugin_url( '/vendors/_custom/wpbc_js_print/wpbc_js_print.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.1 //FixIn: 9.2.1.6 // FixIn: 9.1.2.13.
208 + wp_enqueue_script( 'wpbc-admin-main', wpbc_plugin_url( '/js/admin.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Admin.
209 + if ( wpbc_can_i_load_on_this_page__shortcode_config() ) {
210 + wp_enqueue_script( 'wpbc_shortcode_popup', wpbc_plugin_url( '/includes/ui_modal__shortcodes/_out/wpbc_shortcode_popup.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.6.1.
211 + }
212 + wp_enqueue_script( 'wpbc-admin-support', wpbc_plugin_url( '/core/any/js/admin-support.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) );
213 + wp_enqueue_script( 'wpbc-chosen', wpbc_plugin_url( '/vendors/chosen/chosen.jquery.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Chosen Library.
214 +
215 + // FixIn: 10.12.2.3. // docs: https://www.npmjs.com/package/simplebar#5-caveats .
216 + wp_enqueue_script( 'wpbc-simplebar', wpbc_plugin_url( '/vendors/simplebar/dist/simplebar.min.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Chosen Library.
217 + wp_enqueue_style( 'wpbc-simplebar', wpbc_plugin_url( '/vendors/simplebar/dist/simplebar.min.css' ), array(), WP_BK_VERSION_NUM );
218 + }
219 + if ( in_array( $where_to_load, array( 'admin', 'both' ), true ) ) {
220 + wp_enqueue_script( 'wpbc_all_admin', wpbc_plugin_url( '/_dist/all/_out/wpbc_all_admin.js' ), array( 'wpbc_all' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) );
221 + }
222 +}
223 +
224 +
225 +/**
226 + * Remove JS libraries that conflict with Booking Calendar at the pages with booking forms.
227 + *
228 + * You can disable loading of all Booking Calendar JavaScript files at the Booking > Settings General page in "Advanced" section.
229 + * To do so, you can expand the "Show advanced settings of JavaScript loading" option and select the "Load JS and CSS files only on specific pages" checkbox.
230 + * You can then specify a list of pages in a textarea where you want the Booking Calendar to appear.
231 + *
232 + * @return void
233 + */
234 +function wpbc_remove_js_conflicts() {
235 + //if ( wp_script_is( 'script-ID', 'registered' ) ) { }
236 + wp_deregister_script( 'mphb-kbwood-datepick' );
237 +}
238 +
239 +////////////////////////////////////////////////////////////////////////////////
240 +// Support JavaScript functions
241 +////////////////////////////////////////////////////////////////////////////////
242 +
243 +/**
244 + * Get URL Datepicker Localization JS File
245 + *
246 + * @return string - URL to calendar skin
247 + */
248 +function wpbc_get_calendar_localization_url() {
249 + // Datepicker Localization - translation for calendar. Example: $locale = 'fr_FR';
250 + $locale = wpbc_get_maybe_reloaded_booking_locale();
251 +
252 + $calendar_localization_url = false;
253 +
254 + if ( ! empty( $locale ) ) {
255 +
256 + $locale_lang = strtolower( substr( $locale, 0, 2 ) ); // 7.0.1.51
257 + $locale_country = strtolower( substr( $locale, 3 ) );
258 +
259 + if ( ( $locale_lang !== 'en') && ( wpbc_is_file_exist( '/js/datepick/jquery.datepick-' . $locale_lang . '.js' ) ) ) {
260 +
261 + $calendar_localization_url = wpbc_plugin_url( '/js/datepick/jquery.datepick-'. $locale_lang . '.js' );
262 +
263 + } else if ( ( ! in_array( $locale, array( 'en_US', 'en_CA', 'en_GB', 'en_AU' ) ) ) // English Exceptions
264 + && ( wpbc_is_file_exist( '/js/datepick/jquery.datepick-'. $locale_country . '.js' ) )
265 + ) {
266 +
267 + $calendar_localization_url = wpbc_plugin_url( '/js/datepick/jquery.datepick-'. $locale_country . '.js' );
268 + }
269 + }
270 +
271 + return $calendar_localization_url;
272 +}
273 +
274 +
275 +/**
276 + * Check if we activated loading of JS/CSS only on specific pages and then load or no it
277 + *
278 + * @param boolean $is_load_scripts - Default: true
279 + * @return boolean - true | false
280 + */
281 +function wpbc_is_load_css_js_on_client_page( $is_load_scripts ) {
282 +
283 + if ( ! is_admin() ) { // Check on Client side only
284 +
285 + $booking_is_load_js_css_on_specific_pages = get_bk_option( 'booking_is_load_js_css_on_specific_pages' );
286 + if ( $booking_is_load_js_css_on_specific_pages == 'On' ) {
287 +
288 + $booking_pages_for_load_js_css = get_bk_option( 'booking_pages_for_load_js_css' );
289 +
290 + $booking_pages_for_load_js_css = preg_split('/[\r\n]+/', $booking_pages_for_load_js_css, -1, PREG_SPLIT_NO_EMPTY);
291 +
292 + $server_request_uri = ( ( isset( $_SERVER['REQUEST_URI'] ) ) ? sanitize_text_field( $_SERVER['REQUEST_URI'] ) : '' ); /* phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash */ /* FixIn: sanitize_unslash */
293 + $request_uri = $server_request_uri; //FixIn:5.4.1
294 + // FixIn: 8.4.5.8.
295 + if (
296 + ( strpos( $request_uri, 'booking_hash=') !== false )
297 + || ( strpos( $request_uri, 'check_in=') !== false )
298 + ) {
299 + $request_uri = wp_parse_url($request_uri);
300 + if ( ( ! empty($request_uri ) ) && ( isset($request_uri['path'] ) ) ){
301 + $request_uri = $request_uri['path'];
302 + } else {
303 + $server_request_uri = ( ( isset( $_SERVER['REQUEST_URI'] ) ) ? sanitize_text_field( $_SERVER['REQUEST_URI'] ) : '' ); /* phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash */ /* FixIn: sanitize_unslash */
304 + $request_uri = $server_request_uri;
305 + }
306 + }
307 +
308 + if ( ( ! empty( $booking_pages_for_load_js_css ) ) && ( ! in_array( $request_uri, $booking_pages_for_load_js_css ) ) ) {
309 +
310 + wp_add_inline_script( 'jquery', "console.log( '== WPBC :: Loading of JS/CSS files disabled for this page at WP Booking Calendar > Settings General page in Advanced section ==' );" );
311 + return false;
312 + }
313 + }
314 + }
315 + return true;
316 +}
317 +add_filter( 'wpbc_is_load_script_on_this_page', 'wpbc_is_load_css_js_on_client_page' );
318 +
319 +/**
320 + * Load JS and CSS files for loading modals correctly
321 + *
322 + * @return void
323 + */
324 +function wpbc_load_js__required_for_modals() {
325 +
326 + // JS for opening Modals.
327 + wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/vendors/_custom/dropdown_modal/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.1.
328 +
329 + // CSS.
330 + wp_enqueue_style( 'wpdevelop-bts', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
331 + wp_enqueue_style( 'wpdevelop-bts-theme', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap-theme.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
332 +
333 + wp_enqueue_style( 'wpbc-admin-support', wpbc_plugin_url( '/core/any/css/admin-support.css' ), array(), WP_BK_VERSION_NUM );
334 + wp_enqueue_style( 'wpbc-admin-menu', wpbc_plugin_url( '/core/any/css/admin-menu.css' ), array(), WP_BK_VERSION_NUM );
335 + // wp_enqueue_style( 'wpbc-admin-toolbar', wpbc_plugin_url( '/core/any/css/admin-toolbar.css' ), array(), WP_BK_VERSION_NUM ); // .
336 + wp_enqueue_style( 'wpbc-flex-toolbar', wpbc_plugin_url( '/includes/_toolbar_ui/_out/toolbar_ui.css' ), array(), WP_BK_VERSION_NUM );
337 + wp_enqueue_style( 'wpbc-admin-modal-popups', wpbc_plugin_url( '/css/modal.css' ), array(), WP_BK_VERSION_NUM );
338 + wp_enqueue_style( 'wpbc-admin-pages', wpbc_plugin_url( '/css/admin.css' ), array(), WP_BK_VERSION_NUM );
339 + wp_enqueue_style( 'wpbc-admin-skin', wpbc_plugin_url( '/css/admin-skin.css' ), array( 'wpbc-admin-pages' ), WP_BK_VERSION_NUM ); // FixIn: 8.0.2.4.
340 +}
341 +
342 +/**
343 + * Load only the modal assets required by front-end popup shortcodes.
344 + *
345 + * This intentionally avoids the broader admin helper above, because front-end
346 + * pages should not receive admin page/menu styles when only a modal booking
347 + * form is needed.
348 + *
349 + * @return void
350 + */
351 +function wpbc_load_js__required_for_front_end_modals() {
352 +
353 + // JS for opening modals.
354 + wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/vendors/_custom/dropdown_modal/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.1.
355 +
356 + // Base Bootstrap CSS is already loaded by Booking Calendar in normal front-end rendering.
357 + if ( ! wp_style_is( 'wpdevelop-bts', 'enqueued' ) && ! wp_style_is( 'wpdevelop-bts', 'done' ) ) {
358 + wp_enqueue_style( 'wpdevelop-bts', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
359 + }
360 + if ( ! wp_style_is( 'wpdevelop-bts-theme', 'enqueued' ) && ! wp_style_is( 'wpdevelop-bts-theme', 'done' ) ) {
361 + wp_enqueue_style( 'wpdevelop-bts-theme', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap-theme.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
362 + }
363 +
364 + wp_enqueue_style( 'wpbc-admin-modal-popups', wpbc_plugin_url( '/css/modal.css' ), array(), WP_BK_VERSION_NUM );
365 +}
366 +
367 +
368 +/**
369 + * Load JS and CSS files for opening Media Upload PopUp in Admin Panel
370 + *
371 + * @return void
372 + */
373 +function wpbc_load_js__required_for_media_upload(){
374 +
375 + /**
376 + * Internal WordPress depending on:
377 + * 'wp-util' -> array( 'underscore', 'jquery' )
378 + * 'wp-backbone' -> array( 'backbone', 'wp-util' )
379 + * wp_enqueue_script( 'media-editor' ) -> 'wp-backbone'
380 + */
381 + if ( ! wpbc_is_this_demo() ) {
382 + wp_enqueue_media();
383 + wp_enqueue_script( 'wpbc_ui__media_upload', wpbc_plugin_url( '/includes/_media_upload/_out/wpbc_ui__media_upload.js' ), array(
384 + 'jquery',
385 + 'media-editor'
386 + ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) );
387 + } else {
388 + $script = "jQuery(document).ready(function() { ";
389 + $script .= " jQuery( '.wpbc_media_upload_button' ).on( 'click', function( event ) { ";
390 + $script .= " alert('Warning! This feature is restricted in the public live demo.' ); ";
391 + $script .= " }); ";
392 + $script .= "}); ";
393 + wp_add_inline_script( 'jquery', $script );
394 + }
395 +}
396 +
397 +
398 +/**
399 + * On jQuery(...).ready function Start
400 + *
401 + * @return string
402 + */
403 +function wpbc_jq_ready_start() {
404 +
405 + return "(function() { var a = setInterval( function() { if ( ( 'undefined' === typeof _wpbc ) || ( 'undefined' === typeof jQuery ) || ! window.jQuery ) { return; } clearInterval( a ); jQuery( document ).ready( function (){";
406 +
407 + // Help description:
408 + ?><script type="text/javascript">
409 + (function (){
410 + var a = setInterval( function (){
411 + if ( ('undefined' === typeof jQuery) || !window.jQuery ){
412 + return;
413 + }
414 + clearInterval( a );
415 + // Here can be executed jQuery functions
416 + jQuery( document ).ready( function (){
417 + // Here is my code start
418 + } );
419 + }, 500 );
420 + })();
421 + </script><?php
422 +}
423 +
424 +
425 +/**
426 + * On jQuery(...).ready function end
427 + * @return string
428 + */
429 +function wpbc_jq_ready_end() {
430 +
431 + return "} ); }, 500 ); })();";
432 +}