Booking Calendar - Version 8.4.5

Version Description

  • Changes in all versions:
    • Translation Slovenian translation [100% completed] by Klemen Gaber
    • Translation. Italian translation [99% completed] by Vittoria Toso
    • Translation. German translation [99% completed] by Vittoria Toso
    • Improvement. Show warning messages only once, near required fields, that was not filled, and do not generate several warning messages, if clicked Send booking form button several times. (8.4.5.7)
    • Improvement. Show label 'Imported' for bookings, that was imported from .ics feeds, at Booking Listing page (8.4.5.10)
    • Fix. Issue during clicking on "import events from google calendar" and getting error "Warning. A non-numeric value encountered in /core/lib/wpbc-cron.php" (8.4.5.2)
    • Fix. Issue of opening popover in timelines at top direction instead of bottom, which in some cases reason of not showing all booking details. (8.4.5.12)
    • Fix. Authenticated SQL Injection Vulnerability (8.4.5.15)
  • Changes in Personal / Business Small / Business Medium / Business Large / MultiUser versions:
    • New. Ability to deactivate by default option "Send email" at Add Booking page. (8.4.5.4) (Personal Business Small/Medium/Large, MultiUser)
    • New. Ability to deactivate by default option "Send email" at Booking Listing page (8.4.5.4) (Personal Business Small/Medium/Large, MultiUser)
    • New. Ability to skip checking availability of new booking resource during changing booking resource of exist booking at Booking Listing page. (8.4.5.5) (Personal Business Small/Medium/Large, MultiUser)
    • Compatibility. Add ability to use URLs in different languages via [lang=LOCALE] shortcode. For example in return URL after successful payment. (8.4.5.1) ( Business Small/Medium/Large, MultiUser)
    • Improvement. Set as unavailable days in calendar after page loaded, if all timeslots was booked for specfic date and if you was used the "conditional seasonal times" logic. Previosly these dates was showing as partially booked dates. (8.4.5.3) ( Business Medium/Large, MultiUser)
    • Fix. Issue of showing warning messages for required fields, when clicked Back button to calendar "step", if was used several steps booking form (wizard form) configuration. (8.4.5.6) (Personal Business Small/Medium/Large, MultiUser)
    • Fix. Issue of not loading JS / CSS files and getting error at the Search Results page, if was activated this option "Load JS and CSS files only on specific pages" at the Booking > Settings General page (8.4.5.8) ( Business Large, MultiUser)
    • Fix. Issue of showing "Duplicate booking" button, during editing booking by visitors, who made the booking at front-end side. (8.4.5.9) (Personal Business Small/Medium/Large, MultiUser)
    • Fix. Warning: Illegal string offset 'booking_hash' (8.4.5.11) (Personal Business Small/Medium/Large, MultiUser)
    • Fix. Issue of in booking customer listing shortcode in timeline during cancellation of booking and going back (8.4.5.13) (Personal Business Small/Medium/Large, MultiUser)
    • Fix. Issue Uncaught TypeError: myURLParams[myParam].split is not a function at setDaySelectionsInCalendar (8.4.5.14) (Business Large, MultiUser)
Download this release

Release Info

Developer wpdevelop
Plugin Icon 128x128 Booking Calendar
Version 8.4.5
Comparing to
See all releases

Code changes from version 8.4.3 to 8.4.5

core/admin/api-settings.php CHANGED
@@ -91,7 +91,7 @@ class WPBC_Settings_API_General extends WPBC_Settings_API {
91
  $this->fields['booking_max_monthes_in_calendar'] = array(
92
  'type' => 'select'
93
  , 'default' => $default_options_values['booking_max_monthes_in_calendar'] // '1y'
94
- , 'title' => __('Number of months', 'booking')
95
  , 'description' => __('Select the maximum number of months to show (scroll)' ,'booking')
96
  , 'options' => $months_options
97
  , 'group' => 'calendar'
91
  $this->fields['booking_max_monthes_in_calendar'] = array(
92
  'type' => 'select'
93
  , 'default' => $default_options_values['booking_max_monthes_in_calendar'] // '1y'
94
+ , 'title' => __('Number of months to scroll', 'booking')
95
  , 'description' => __('Select the maximum number of months to show (scroll)' ,'booking')
96
  , 'options' => $months_options
97
  , 'group' => 'calendar'
core/admin/page-email-approved.php CHANGED
@@ -1042,6 +1042,13 @@ function wpbc__get_replace_shortcodes__email_approved( $booking_id, $bktype, $fo
1042
  $replace[ 'visitorbookingpayurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingpayurl]', $booking_id );
1043
  $replace[ 'bookinghash' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[bookinghash]', $booking_id );
1044
 
 
 
 
 
 
 
 
1045
  ////////////////////////////////////////////////////////////////////////////
1046
  // Get additional replace paramaters to the email shortcodes
1047
  $replace = apply_filters( 'wpbc_replace_params_for_booking', $replace, $booking_id, $bktype, $formdata ); //FixIn: 8.0.1.7
@@ -1110,8 +1117,8 @@ function wpbc_send_email_approved( $approved_id_str, $is_send_emeils, $denyreaso
1110
  $replace[ 'denyreason' ] = $denyreason; //FixIn: 7.0.1.1
1111
  $replace[ 'approvereason' ] = $denyreason; //FixIn: 7.0.1.1
1112
  $replace[ 'reason' ] = $denyreason; //FixIn: 7.0.1.1
1113
- if ( ! empty( $res->remark ) ) //FixIn: 8.1.2.6
1114
- $replace[ 'remark' ] = $res->remark; //FixIn: 7.2.1.19
1115
 
1116
  // Replace shortcodes with custom URL parameter, like: 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl'
1117
  foreach ( array( 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl' , 'visitorbookingslisting' ) as $url_shortcode ) { //FixIn: 7.0.1.8 //FixIn: 8.1.3.5.1
1042
  $replace[ 'visitorbookingpayurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingpayurl]', $booking_id );
1043
  $replace[ 'bookinghash' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[bookinghash]', $booking_id );
1044
 
1045
+ // //FixIn: 7.1.2.5
1046
+ // $booking_data = array( 'form_data' => $booking_form_show_array );
1047
+ // $booking_data[ 'dates_short' ] = array( $my_dates4emeil_check_in_out[ 0 ], '-', $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ] );
1048
+ // $replace[ 'add_to_google_cal_url' ] = htmlspecialchars_decode( esc_url(
1049
+ // wpbc_btn_add_booking_to_google_calendar( $booking_data , array( 'is_only_url' => true ), false )
1050
+ // ) );
1051
+
1052
  ////////////////////////////////////////////////////////////////////////////
1053
  // Get additional replace paramaters to the email shortcodes
1054
  $replace = apply_filters( 'wpbc_replace_params_for_booking', $replace, $booking_id, $bktype, $formdata ); //FixIn: 8.0.1.7
1117
  $replace[ 'denyreason' ] = $denyreason; //FixIn: 7.0.1.1
1118
  $replace[ 'approvereason' ] = $denyreason; //FixIn: 7.0.1.1
1119
  $replace[ 'reason' ] = $denyreason; //FixIn: 7.0.1.1
1120
+ if ( ! empty( $res->remark ) ) //FixIn: 8.1.2.6
1121
+ $replace[ 'remark' ] = $res->remark; //FixIn: 7.2.1.19
1122
 
1123
  // Replace shortcodes with custom URL parameter, like: 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl'
1124
  foreach ( array( 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl' , 'visitorbookingslisting' ) as $url_shortcode ) { //FixIn: 7.0.1.8 //FixIn: 8.1.3.5.1
core/admin/page-email-new-admin.php CHANGED
@@ -546,14 +546,14 @@ class WPBC_Settings_Page_Email_NewAdmin extends WPBC_Page_Structure {
546
  return $tabs;
547
  }
548
 
549
-
550
  /** Show Content of Settings page */
551
  public function content() {
552
  //debuge( 'WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID, get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID )' );
553
  //debuge( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID, get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID ) );
554
  //debuge( 'wpbc_import6_get_old_email_new_admin_data()' );
555
  //debuge( wpbc_import6_get_old_email_new_admin_data() );
556
-
557
  //debuge ( wpbc_import6_email__new_admin__get_fields_array_for_activation() );
558
 
559
  $this->css();
546
  return $tabs;
547
  }
548
 
549
+
550
  /** Show Content of Settings page */
551
  public function content() {
552
  //debuge( 'WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID, get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID )' );
553
  //debuge( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID, get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_NEW_ADMIN_ID ) );
554
  //debuge( 'wpbc_import6_get_old_email_new_admin_data()' );
555
  //debuge( wpbc_import6_get_old_email_new_admin_data() );
556
+
557
  //debuge ( wpbc_import6_email__new_admin__get_fields_array_for_activation() );
558
 
559
  $this->css();
core/admin/wpbc-class-listing.php CHANGED
@@ -162,7 +162,7 @@ class WPBC_Booking_Listing_Table {
162
 
163
  foreach ( $this->bookings as $bk ) {
164
  $bk_key++;
165
-
166
  $bk->form_show = str_replace( "&", '&', $bk->form_show ); //FixIn:7.1.2.12
167
 
168
  $row_data = array();
@@ -188,6 +188,7 @@ class WPBC_Booking_Listing_Table {
188
  $row_data['dates_short'] = $bk->dates_short; // Array ( [0] => 2012-04-16 10:00:01 [1] => - [2] => 2012-04-20 12:00:02 [3] => , [4] => 2012-04-16 10:00:01 ....
189
  $row_data['is_approved'] = ( count( $bk->dates ) > 0 ) ? $bk->dates[0]->approved : 0;
190
 
 
191
  //Is booking in Trash.
192
  $row_data['is_trash'] = $bk->trash ; //FixIn: 6.1.1.10
193
 
@@ -328,7 +329,11 @@ class WPBC_Booking_Listing_Table {
328
  <span class="label label-default label-pending <?php if ($row_data['is_approved']) echo ' hidden_items '; ?> "><?php _e('Pending' ,'booking'); ?></span>
329
  <span class="label label-default label-approved <?php if (! $row_data['is_approved']) echo ' hidden_items '; ?>"><?php _e('Approved' ,'booking'); ?></span>
330
  <?php make_bk_action('wpdev_bk_listing_show_payment_label', $row_data['is_paid'], $row_data['pay_print_status'], $row_data['current_payment_status_titles']); ?>
331
- <span class="label label-trash label-danger <?php if (! $row_data['is_trash']) echo ' hidden_items '; ?> "><?php _e('Trash' ,'booking'); ?></span><?php //FixIn: 6.1.1.10 ?>
 
 
 
 
332
  </div><?php
333
  ?></div>
334
  </div><?php
162
 
163
  foreach ( $this->bookings as $bk ) {
164
  $bk_key++;
165
+
166
  $bk->form_show = str_replace( "&amp;", '&', $bk->form_show ); //FixIn:7.1.2.12
167
 
168
  $row_data = array();
188
  $row_data['dates_short'] = $bk->dates_short; // Array ( [0] => 2012-04-16 10:00:01 [1] => - [2] => 2012-04-20 12:00:02 [3] => , [4] => 2012-04-16 10:00:01 ....
189
  $row_data['is_approved'] = ( count( $bk->dates ) > 0 ) ? $bk->dates[0]->approved : 0;
190
 
191
+ $row_data['sync_gid'] = $bk->sync_gid ; //FixIn: 8.4.5.10
192
  //Is booking in Trash.
193
  $row_data['is_trash'] = $bk->trash ; //FixIn: 6.1.1.10
194
 
329
  <span class="label label-default label-pending <?php if ($row_data['is_approved']) echo ' hidden_items '; ?> "><?php _e('Pending' ,'booking'); ?></span>
330
  <span class="label label-default label-approved <?php if (! $row_data['is_approved']) echo ' hidden_items '; ?>"><?php _e('Approved' ,'booking'); ?></span>
331
  <?php make_bk_action('wpdev_bk_listing_show_payment_label', $row_data['is_paid'], $row_data['pay_print_status'], $row_data['current_payment_status_titles']); ?>
332
+ <span class="label label-trash label-danger <?php if (! $row_data['is_trash']) echo ' hidden_items '; ?> "><?php _e('Trash' ,'booking'); ?></span><?php //FixIn: 6.1.1.10 ?>
333
+ <?php //FixIn: 8.4.5.10
334
+ if ( ! empty ( $row_data['sync_gid'] ) ) {
335
+ ?><span class="label label-imported label-primary"><?php _e( 'Imported', 'booking' ); ?></span><?php
336
+ } ?>
337
  </div><?php
338
  ?></div>
339
  </div><?php
core/admin/wpbc-class-timeline.php CHANGED
@@ -236,11 +236,11 @@ class WPBC_Timeline {
236
  if ( isset( $attr['type'] ) ) {
237
  $attr['wh_booking_type'] = $attr['type']; //Instead of 'wh_booking_type' paramter in shortcode is used 'type' parameter
238
  }
239
-
240
  // Get paramaters from shortcode paramaters
241
  $this->define_request_view_params_from_params( $attr );
242
 
243
-
244
  if ( ! $this->request_args['is_matrix'] ) {
245
 
246
  switch ( $this->request_args['view_days_num'] ) {
@@ -400,6 +400,9 @@ class WPBC_Timeline {
400
 
401
  //Set keyword for showing bookings ony relative to this email
402
  $args['wh_keyword'] = $booking_details_email; // 'jo@wpbookingcalendar.com';
 
 
 
403
  }
404
  }
405
  //FixIn: 8.1.3.5 - End
@@ -2391,7 +2394,7 @@ function wpbc_ajax_timeline() {
2391
  ?><script type="text/javascript">
2392
  if ( jQuery.isFunction( jQuery(".popover_click.popover_bottom" ).popover ) ) { //FixIn: 7.0.1.2 - 2016-12-10
2393
  jQuery('.popover_click.popover_bottom').popover( {
2394
- placement: 'bottom auto'
2395
  , trigger:'manual'
2396
  //, delay: {show: 100, hide: 8}
2397
  , content: ''
236
  if ( isset( $attr['type'] ) ) {
237
  $attr['wh_booking_type'] = $attr['type']; //Instead of 'wh_booking_type' paramter in shortcode is used 'type' parameter
238
  }
239
+ //debuge($this->request_args, $attr);
240
  // Get paramaters from shortcode paramaters
241
  $this->define_request_view_params_from_params( $attr );
242
 
243
+ //debuge($this->request_args);
244
  if ( ! $this->request_args['is_matrix'] ) {
245
 
246
  switch ( $this->request_args['view_days_num'] ) {
400
 
401
  //Set keyword for showing bookings ony relative to this email
402
  $args['wh_keyword'] = $booking_details_email; // 'jo@wpbookingcalendar.com';
403
+ } else { //FixIn: 8.4.5.13
404
+ $this->request_args['only_booked_resources'] = 1;
405
+ $args['wh_keyword'] = '``^`````^^````^`````````';
406
  }
407
  }
408
  //FixIn: 8.1.3.5 - End
2394
  ?><script type="text/javascript">
2395
  if ( jQuery.isFunction( jQuery(".popover_click.popover_bottom" ).popover ) ) { //FixIn: 7.0.1.2 - 2016-12-10
2396
  jQuery('.popover_click.popover_bottom').popover( {
2397
+ placement: 'bottom' //FixIn: 8.4.5.12
2398
  , trigger:'manual'
2399
  //, delay: {show: 100, hide: 8}
2400
  , content: ''
core/admin/wpbc-toolbars.php CHANGED
@@ -367,7 +367,11 @@ function wpbc_toolbar_is_send_emails_btn() {
367
  <fieldset>
368
  <label for="is_send_email_for_pending" style="display: inline-block;" >
369
  <input style="margin:0 4px 2px;"
370
- type="checkbox" checked="CHECKED" id="is_send_email_for_pending" name="is_send_email_for_pending" class="tooltip_top"
 
 
 
 
371
  title="<?php echo esc_js( __( 'Send email notification to customer after approval, cancellation or deletion of bookings', 'booking' ) ); ?>"
372
  /><?php _e( 'Emails sending', 'booking' ) ?>
373
  </label>
@@ -1803,8 +1807,10 @@ function wpbc_toolbar_is_send_emails_btn_duplicated() {
1803
  <fieldset>
1804
  <label for="is_send_email_for_new_booking" style="display: inline-block;" >
1805
  <input onchange="javascript:document.getElementById('is_send_email_for_pending').checked = this.checked;"
1806
- type="checkbox"
 
1807
  checked="CHECKED"
 
1808
  id="is_send_email_for_new_booking"
1809
  name="is_send_email_for_new_booking"
1810
  class="tooltip_top"
@@ -1815,6 +1821,15 @@ function wpbc_toolbar_is_send_emails_btn_duplicated() {
1815
  </fieldset>
1816
  </div>
1817
  <script type="text/javascript">
 
 
 
 
 
 
 
 
 
1818
  jQuery( '#is_send_email_for_pending' ).change(function() {
1819
  if ( jQuery('#is_send_email_for_pending').attr('checked') !== undefined ) {
1820
  document.getElementById('is_send_email_for_new_booking').checked = true;
367
  <fieldset>
368
  <label for="is_send_email_for_pending" style="display: inline-block;" >
369
  <input style="margin:0 4px 2px;"
370
+ type="checkbox"
371
+ <?php if ( get_bk_option('booking_send_emails_off_listing') === 'On' ) { } else { //FixIn: 8.4.5.4 ?>
372
+ checked="CHECKED"
373
+ <?php } ?>
374
+ id="is_send_email_for_pending" name="is_send_email_for_pending" class="tooltip_top"
375
  title="<?php echo esc_js( __( 'Send email notification to customer after approval, cancellation or deletion of bookings', 'booking' ) ); ?>"
376
  /><?php _e( 'Emails sending', 'booking' ) ?>
377
  </label>
1807
  <fieldset>
1808
  <label for="is_send_email_for_new_booking" style="display: inline-block;" >
1809
  <input onchange="javascript:document.getElementById('is_send_email_for_pending').checked = this.checked;"
1810
+ type="checkbox"
1811
+ <?php if ( get_bk_option('booking_send_emails_off_addbooking') === 'On' ) { } else { //FixIn: 8.4.5.4 ?>
1812
  checked="CHECKED"
1813
+ <?php } ?>
1814
  id="is_send_email_for_new_booking"
1815
  name="is_send_email_for_new_booking"
1816
  class="tooltip_top"
1821
  </fieldset>
1822
  </div>
1823
  <script type="text/javascript">
1824
+
1825
+ jQuery(document).ready(function(){
1826
+ <?php if ( get_bk_option('booking_send_emails_off_addbooking') === 'On' ) { //FixIn: 8.4.5.4 ?>
1827
+ document.getElementById('is_send_email_for_pending').checked = false;
1828
+ <?php } else { ?>
1829
+ document.getElementById('is_send_email_for_pending').checked = true;
1830
+ <?php } ?>
1831
+ });
1832
+
1833
  jQuery( '#is_send_email_for_pending' ).change(function() {
1834
  if ( jQuery('#is_send_email_for_pending').attr('checked') !== undefined ) {
1835
  document.getElementById('is_send_email_for_new_booking').checked = true;
core/any/admin-bs-ui.php CHANGED
@@ -1987,7 +1987,7 @@ function wpbc_bs_javascript_popover() {
1987
  });
1988
 
1989
  jQuery('.popover_hover.popover_bottom').popover( {
1990
- placement: 'bottom auto'
1991
  , trigger:'hover'
1992
  , delay: {show: 100, hide: 100}
1993
  , content: ''
@@ -2050,7 +2050,7 @@ function wpbc_bs_javascript_popover() {
2050
  , template: '<div class="wpdevelop popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
2051
  });
2052
  jQuery('.popover_bottom').popover( {
2053
- placement: 'bottom auto'
2054
  , trigger:'manual'
2055
  //, delay: {show: 100, hide: 8}
2056
  , content: ''
1987
  });
1988
 
1989
  jQuery('.popover_hover.popover_bottom').popover( {
1990
+ placement: 'bottom' //FixIn: 8.4.5.12
1991
  , trigger:'hover'
1992
  , delay: {show: 100, hide: 100}
1993
  , content: ''
2050
  , template: '<div class="wpdevelop popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
2051
  });
2052
  jQuery('.popover_bottom').popover( {
2053
+ placement: 'bottom' //FixIn: 8.4.5.12
2054
  , trigger:'manual'
2055
  //, delay: {show: 100, hide: 8}
2056
  , content: ''
core/lib/wpbc-ajax.php CHANGED
@@ -51,29 +51,7 @@ function wpbc_check_nonce_in_admin_panel( $action_check = 'wpbc_ajax_admin_nonce
51
  return wpdev_check_nonce_in_admin_panel( $action_check );
52
  }
53
 
54
-
55
- // Check and (re)Load specific Locale for the Ajax request - based on "admin_init" hook
56
- function wpbc_check_locale_for_ajax() {
57
-
58
- add_bk_filter('wpdev_check_for_active_language', 'wpdev_check_for_active_language'); // Add Hook for ability to check the content for active lanaguges
59
-
60
- if (isset($_POST['wpdev_active_locale'])) { // Reload locale according request parameter
61
- global $l10n;
62
- if (isset($l10n['booking'])) unset($l10n['booking']);
63
-
64
- if(! defined('WPBC_LOCALE_RELOAD') ) define('WPBC_LOCALE_RELOAD', esc_js( $_POST['wpdev_active_locale'] ) );
65
-
66
- // Reload locale settings, its required for the correct dates format
67
- if (isset($l10n['default'])) unset($l10n['default']); // Unload locale
68
- add_filter('locale', 'wpbc_get_booking_locale',999); // Set filter to load the locale of the Booking Calendar
69
- load_default_textdomain(); // Load default locale
70
- global $wp_locale;
71
- $wp_locale = new WP_Locale(); // Reload class
72
-
73
- wpbc_load_locale(WPBC_LOCALE_RELOAD);
74
- }
75
- }
76
-
77
 
78
  ////////////////////////////////////////////////////////////////////////////////
79
  // A j a x H o o k s f o r s p e c i f i c A c t i o n s /////
@@ -118,7 +96,9 @@ function wpbc_ajax_UPDATE_READ_UNREAD () {
118
 
119
  $id_of_new_bookings = $_POST[ "booking_id" ];
120
  $arrayof_bookings_id = explode('|',$id_of_new_bookings);
 
121
  $user_id = $_POST[ "user_id" ];
 
122
 
123
  wpbc_update_number_new_bookings( $arrayof_bookings_id, $is_new , $user_id );
124
 
@@ -161,6 +141,8 @@ function wpbc_ajax_UPDATE_APPROVE() {
161
 
162
  $booking_id = $_POST[ "booking_id" ];
163
  $approved_id = explode('|',$booking_id);
 
 
164
  if (! isset($_POST["denyreason"]))
165
  $_POST["denyreason"] = '';
166
  $denyreason = stripslashes( $_POST["denyreason"] ); //FixIn: 7.0.1.46 - trasnalte words like don\'t to don't
@@ -222,6 +204,7 @@ function wpbc_ajax_TRASH_RESTORE() {
222
  make_bk_action('check_multiuser_params_for_client_side_by_user_id', $_POST['user_id'] );
223
 
224
  $booking_id = $_POST[ "booking_id" ]; // Booking ID
 
225
  if ( ! isset($_POST["denyreason"] ) )
226
  $_POST["denyreason"] = '';
227
  $denyreason = stripslashes( $_POST["denyreason"] ); //FixIn: 7.0.1.46 - trasnalte words like don\'t to don't
@@ -230,7 +213,9 @@ function wpbc_ajax_TRASH_RESTORE() {
230
  || ( $denyreason == 'Reason of cancel here')
231
  ) $denyreason = '';
232
  $is_send_emeils = $_POST["is_send_emeils"];
 
233
  $approved_id = explode('|',$booking_id);
 
234
 
235
  $is_trash = intval( $_POST["is_trash"] );
236
 
@@ -306,6 +291,7 @@ function wpbc_ajax_DELETE_APPROVE() {
306
  ) $denyreason = '';
307
  $is_send_emeils = $_POST["is_send_emeils"];
308
  $approved_id = explode('|',$booking_id);
 
309
 
310
  if ( (count($approved_id)>0) && ($approved_id !=false) && ($approved_id !='')) {
311
 
51
  return wpdev_check_nonce_in_admin_panel( $action_check );
52
  }
53
 
54
+ //FixIn: 8.4.5.1 function wpbc_check_locale_for_ajax() moved to ../wp-content/plugins/booking/core/wpbc-translation.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  ////////////////////////////////////////////////////////////////////////////////
57
  // A j a x H o o k s f o r s p e c i f i c A c t i o n s /////
96
 
97
  $id_of_new_bookings = $_POST[ "booking_id" ];
98
  $arrayof_bookings_id = explode('|',$id_of_new_bookings);
99
+ $arrayof_bookings_id = wpbc_clean_digit_or_csd( $arrayof_bookings_id ); //FixIn: 8.4.5.15
100
  $user_id = $_POST[ "user_id" ];
101
+ $user_id = wpbc_clean_digit_or_csd( $user_id ); //FixIn: 8.4.5.15
102
 
103
  wpbc_update_number_new_bookings( $arrayof_bookings_id, $is_new , $user_id );
104
 
141
 
142
  $booking_id = $_POST[ "booking_id" ];
143
  $approved_id = explode('|',$booking_id);
144
+ $approved_id = wpbc_clean_digit_or_csd( $approved_id ); //FixIn: 8.4.5.15
145
+
146
  if (! isset($_POST["denyreason"]))
147
  $_POST["denyreason"] = '';
148
  $denyreason = stripslashes( $_POST["denyreason"] ); //FixIn: 7.0.1.46 - trasnalte words like don\'t to don't
204
  make_bk_action('check_multiuser_params_for_client_side_by_user_id', $_POST['user_id'] );
205
 
206
  $booking_id = $_POST[ "booking_id" ]; // Booking ID
207
+
208
  if ( ! isset($_POST["denyreason"] ) )
209
  $_POST["denyreason"] = '';
210
  $denyreason = stripslashes( $_POST["denyreason"] ); //FixIn: 7.0.1.46 - trasnalte words like don\'t to don't
213
  || ( $denyreason == 'Reason of cancel here')
214
  ) $denyreason = '';
215
  $is_send_emeils = $_POST["is_send_emeils"];
216
+
217
  $approved_id = explode('|',$booking_id);
218
+ $approved_id = wpbc_clean_digit_or_csd( $approved_id ); //FixIn: 8.4.5.15
219
 
220
  $is_trash = intval( $_POST["is_trash"] );
221
 
291
  ) $denyreason = '';
292
  $is_send_emeils = $_POST["is_send_emeils"];
293
  $approved_id = explode('|',$booking_id);
294
+ $approved_id = wpbc_clean_digit_or_csd( $approved_id ); //FixIn: 8.4.5.15
295
 
296
  if ( (count($approved_id)>0) && ($approved_id !=false) && ($approved_id !='')) {
297
 
core/lib/wpbc-cron.php CHANGED
@@ -93,14 +93,14 @@ class WPBC_Cron {
93
  continue;
94
 
95
  //2. Get and check for next time execution
96
- $next_time_execution = $action['last_execution'] + $action['recurrence'] * 60 * 60; // number of hours
97
 
98
  if ( $next_time_execution > time() )
99
  continue;
100
 
101
 
102
  // Update last time executed time
103
- $action['last_execution'] = time() + $action['recurrence'] * 60 * 60; // number of hours
104
 
105
  $this->update($action_name, $action);
106
 
93
  continue;
94
 
95
  //2. Get and check for next time execution
96
+ $next_time_execution = intval( $action['last_execution'] ) + intval( $action['recurrence'] ) * 60 * 60; // number of hours //FixIn: 8.4.5.2
97
 
98
  if ( $next_time_execution > time() )
99
  continue;
100
 
101
 
102
  // Update last time executed time
103
+ $action['last_execution'] = time() + intval( $action['recurrence'] ) * 60 * 60; // number of hours //FixIn: 8.4.5.2
104
 
105
  $this->update($action_name, $action);
106
 
core/lib/wpdev-booking-class.php CHANGED
@@ -970,11 +970,16 @@ class wpdev_booking {
970
  */
971
  function bookingcustomerlisting_shortcode( $attr ){
972
 
 
 
 
 
973
  if ( ( isset( $_GET['booking_hash'] ) ) || ( isset( $attr['booking_hash'] ) ) ) {
974
 
975
 
976
  if ( isset( $_GET['booking_hash'] ) ) {
977
  $my_booking_id_type = apply_bk_filter( 'wpdev_booking_get_hash_to_id', false, $_GET['booking_hash'] );
 
978
  $attr['booking_hash'] = $_GET['booking_hash'];
979
  } else {
980
  $my_booking_id_type = apply_bk_filter( 'wpdev_booking_get_hash_to_id', false, $attr['booking_hash'] );
970
  */
971
  function bookingcustomerlisting_shortcode( $attr ){
972
 
973
+ //FixIn: 8.4.5.11
974
+ if (! is_array($attr)) {
975
+ $attr = array();
976
+ }
977
  if ( ( isset( $_GET['booking_hash'] ) ) || ( isset( $attr['booking_hash'] ) ) ) {
978
 
979
 
980
  if ( isset( $_GET['booking_hash'] ) ) {
981
  $my_booking_id_type = apply_bk_filter( 'wpdev_booking_get_hash_to_id', false, $_GET['booking_hash'] );
982
+
983
  $attr['booking_hash'] = $_GET['booking_hash'];
984
  } else {
985
  $my_booking_id_type = apply_bk_filter( 'wpdev_booking_get_hash_to_id', false, $attr['booking_hash'] );
core/wpbc-activation.php CHANGED
@@ -1120,8 +1120,19 @@ function wpbc_get_default_options( $option_name = '', $is_get_multiuser_general_
1120
  $mu_option4delete[]='booking_is_show_popover_in_timeline_front_end';
1121
  $default_options['booking_csv_export_separator'] = ';';
1122
  $mu_option4delete[]='booking_csv_export_separator';
1123
- $default_options['booking_listing_show_notes'] = 'Off'; //FixIn: 8.1.3.32
1124
  $mu_option4delete[]='booking_listing_show_notes';
 
 
 
 
 
 
 
 
 
 
 
1125
  }
1126
 
1127
 
1120
  $mu_option4delete[]='booking_is_show_popover_in_timeline_front_end';
1121
  $default_options['booking_csv_export_separator'] = ';';
1122
  $mu_option4delete[]='booking_csv_export_separator';
1123
+ $default_options['booking_listing_show_notes'] = 'Off'; //FixIn: 8.1.3.32
1124
  $mu_option4delete[]='booking_listing_show_notes';
1125
+
1126
+ $default_options['booking_send_emails_off_addbooking'] = 'Off'; //FixIn: 8.4.5.4
1127
+ $mu_option4delete[]='booking_send_emails_off_addbooking';
1128
+
1129
+ $default_options['booking_send_emails_off_listing'] = 'Off'; //FixIn: 8.4.5.4
1130
+ $mu_option4delete[]='booking_send_emails_off_listing';
1131
+
1132
+ $default_options['booking_change_resource_skip_checking'] = 'Off'; //FixIn: 8.4.5.4
1133
+ $mu_option4delete[]='booking_change_resource_skip_checking';
1134
+
1135
+
1136
  }
1137
 
1138
 
core/wpbc-constants.php CHANGED
@@ -26,7 +26,7 @@ if ( ! defined( 'WP_BK_CHECK_OUT_MINUS_DAY_SEARCH' ) ) { define( 'WP_BK_C
26
  ////////////////////////////////////////////////////////////
27
  // SYSTEM CONSTANTS //////////////
28
  ////////////////////////////////////////////////////////////
29
- if ( ! defined( 'WP_BK_VERSION_NUM' ) ) { define( 'WP_BK_VERSION_NUM', '8.4.3' ); }
30
  if ( ! defined( 'WP_BK_MINOR_UPDATE' ) ) { define( 'WP_BK_MINOR_UPDATE', true ); }
31
  if ( ! defined( 'WP_BK_RESPONSE' ) ) { define( 'WP_BK_RESPONSE', false ); }
32
  if ( ! defined( 'WP_BK_BETA_DATA_FILL' ) ) { define( 'WP_BK_BETA_DATA_FILL', 0 ); } // Set 0 for no filling or 2 for 241 bookings or more for more
26
  ////////////////////////////////////////////////////////////
27
  // SYSTEM CONSTANTS //////////////
28
  ////////////////////////////////////////////////////////////
29
+ if ( ! defined( 'WP_BK_VERSION_NUM' ) ) { define( 'WP_BK_VERSION_NUM', '8.4.5' ); }
30
  if ( ! defined( 'WP_BK_MINOR_UPDATE' ) ) { define( 'WP_BK_MINOR_UPDATE', true ); }
31
  if ( ! defined( 'WP_BK_RESPONSE' ) ) { define( 'WP_BK_RESPONSE', false ); }
32
  if ( ! defined( 'WP_BK_BETA_DATA_FILL' ) ) { define( 'WP_BK_BETA_DATA_FILL', 0 ); } // Set 0 for no filling or 2 for 241 bookings or more for more
core/wpbc-functions.php CHANGED
@@ -852,15 +852,17 @@ $is_old = false;
852
 
853
  return $link;
854
  }
855
-
856
  // Get Correct Absolute URL
857
  function wpbc_make_link_absolute( $link ){
858
 
859
- if ( ( $link != home_url() ) && ( strpos($link, 'http') !== 0 ) ) //FixIn: 7.0.1.20
860
- $link = home_url() . '/' . trim( wp_make_link_relative( $link ), '/' ); //FixIn: 7.0.1.20
 
 
861
  return esc_js( $link ) ;
862
  }
863
-
864
 
865
  function wpdev_bk_arraytolower( $array ){
866
  return unserialize( strtolower( serialize( $array ) ) );
@@ -2638,7 +2640,7 @@ function wpbc_is_show_up_news(){
2638
  * @global type $wpbc_Dismiss
2639
  */
2640
  function wpbc_welcome_panel() {
2641
-
2642
  ?>
2643
  <style type="text/css" media="screen">
2644
  /*<![CDATA[*/
@@ -2842,7 +2844,7 @@ function wpbc_is_dismissed( $element_html_id, $params = array() ){
2842
  *
2843
  */
2844
  function wpbc_welcome_panel_content() {
2845
-
2846
  ?>
2847
  <div class="welcome-panel-content">
2848
  <p class="about-description"><?php _e( 'We&#8217;ve assembled some links to get you started:','booking'); ?></p>
@@ -3089,8 +3091,8 @@ function wpbc_system_info() {
3089
  $system_info = array(
3090
  'system_info' => '',
3091
  'php_info' => '',
3092
- 'active_plugins' => '',
3093
- 'inactive_plugins' => ''
3094
  );
3095
 
3096
  $ver_small_name = get_bk_version();
@@ -3176,7 +3178,7 @@ function wpbc_system_info() {
3176
 
3177
  // More here https://docs.woocommerce.com/document/problems-with-large-amounts-of-data-not-saving-variations-rates-etc/
3178
 
3179
-
3180
  foreach ( $all_plugins as $path => $plugin ) {
3181
  if ( is_plugin_active( $path ) )
3182
  $system_info['active_plugins'][$plugin['Name']] = $plugin['Version'];
852
 
853
  return $link;
854
  }
855
+
856
  // Get Correct Absolute URL
857
  function wpbc_make_link_absolute( $link ){
858
 
859
+ if ( ( $link != home_url() ) && ( strpos($link, 'http') !== 0 ) ) {
860
+ $link = apply_bk_filter( 'wpdev_check_for_active_language', $link ); //FixIn: 8.4.5.1
861
+ $link = home_url() . '/' . trim( wp_make_link_relative( $link ), '/' ); //FixIn: 7.0.1.20
862
+ }
863
  return esc_js( $link ) ;
864
  }
865
+
866
 
867
  function wpdev_bk_arraytolower( $array ){
868
  return unserialize( strtolower( serialize( $array ) ) );
2640
  * @global type $wpbc_Dismiss
2641
  */
2642
  function wpbc_welcome_panel() {
2643
+
2644
  ?>
2645
  <style type="text/css" media="screen">
2646
  /*<![CDATA[*/
2844
  *
2845
  */
2846
  function wpbc_welcome_panel_content() {
2847
+
2848
  ?>
2849
  <div class="welcome-panel-content">
2850
  <p class="about-description"><?php _e( 'We&#8217;ve assembled some links to get you started:','booking'); ?></p>
3091
  $system_info = array(
3092
  'system_info' => '',
3093
  'php_info' => '',
3094
+ 'active_plugins' => array(), //FixIn: 8.4.4.1
3095
+ 'inactive_plugins' => array() //FixIn: 8.4.4.1
3096
  );
3097
 
3098
  $ver_small_name = get_bk_version();
3178
 
3179
  // More here https://docs.woocommerce.com/document/problems-with-large-amounts-of-data-not-saving-variations-rates-etc/
3180
 
3181
+
3182
  foreach ( $all_plugins as $path => $plugin ) {
3183
  if ( is_plugin_active( $path ) )
3184
  $system_info['active_plugins'][$plugin['Name']] = $plugin['Version'];
core/wpbc-js.php CHANGED
@@ -343,7 +343,11 @@ function wpbc_is_load_css_js_on_client_page( $is_load_scripts ) {
343
  $booking_pages_for_load_js_css = preg_split('/[\r\n]+/', $booking_pages_for_load_js_css, -1, PREG_SPLIT_NO_EMPTY);
344
 
345
  $request_uri = $_SERVER['REQUEST_URI']; //FixIn:5.4.1
346
- if ( strpos( $request_uri, 'booking_hash=') !== false ) {
 
 
 
 
347
  $request_uri = parse_url($request_uri);
348
  if ( ( ! empty($request_uri ) ) && ( isset($request_uri['path'] ) ) ){
349
  $request_uri = $request_uri['path'];
343
  $booking_pages_for_load_js_css = preg_split('/[\r\n]+/', $booking_pages_for_load_js_css, -1, PREG_SPLIT_NO_EMPTY);
344
 
345
  $request_uri = $_SERVER['REQUEST_URI']; //FixIn:5.4.1
346
+ //FixIn: 8.4.5.8
347
+ if (
348
+ ( strpos( $request_uri, 'booking_hash=') !== false )
349
+ || ( strpos( $request_uri, 'check_in=') !== false )
350
+ ) {
351
  $request_uri = parse_url($request_uri);
352
  if ( ( ! empty($request_uri ) ) && ( isset($request_uri['path'] ) ) ){
353
  $request_uri = $request_uri['path'];
core/wpbc-translation.php CHANGED
@@ -250,7 +250,7 @@ function wpbc_get_booking_locale() {
250
  }
251
 
252
 
253
- function wpbc_recheck_plugin_locale( $locale, $plugin_domain ) {
254
 
255
  if ( $plugin_domain == 'booking' )
256
  if ( defined('WPBC_LOCALE_RELOAD') )
@@ -277,3 +277,25 @@ function wpbc_get_help_rows_about_config_in_several_languges() {
277
  }
278
 
279
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  }
251
 
252
 
253
+ function wpbc_recheck_plugin_locale( $locale, $plugin_domain = '' ) { //FixIn: 8.4.4.2
254
 
255
  if ( $plugin_domain == 'booking' )
256
  if ( defined('WPBC_LOCALE_RELOAD') )
277
  }
278
 
279
 
280
+ //FixIn: 8.4.5.1
281
+ // Check and (re)Load specific Locale for the Ajax request - based on "admin_init" hook
282
+ function wpbc_check_locale_for_ajax() {
283
+
284
+ add_bk_filter('wpdev_check_for_active_language', 'wpdev_check_for_active_language'); // Add Hook for ability to check the content for active lanaguges
285
+
286
+ if (isset($_REQUEST['wpdev_active_locale'])) { // Reload locale according request parameter
287
+ global $l10n;
288
+ if (isset($l10n['booking'])) unset($l10n['booking']);
289
+
290
+ if(! defined('WPBC_LOCALE_RELOAD') ) define('WPBC_LOCALE_RELOAD', esc_js( $_REQUEST['wpdev_active_locale'] ) );
291
+
292
+ // Reload locale settings, its required for the correct dates format
293
+ if (isset($l10n['default'])) unset($l10n['default']); // Unload locale
294
+ add_filter('locale', 'wpbc_get_booking_locale',999); // Set filter to load the locale of the Booking Calendar
295
+ load_default_textdomain(); // Load default locale
296
+ global $wp_locale;
297
+ $wp_locale = new WP_Locale(); // Reload class
298
+
299
+ wpbc_load_locale(WPBC_LOCALE_RELOAD);
300
+ }
301
+ }
js/client.js CHANGED
@@ -983,16 +983,40 @@ function showErrorMessage( element , errorMessage) {
983
  .animate( {opacity: 1}, 4000 )
984
  ; // mark red border
985
  if (jQuery("[name='"+ element.name +"']").attr('type') == "radio") {
986
- jQuery("[name='"+ element.name +"']").parent().parent().parent()
987
- .after('<span class="wpdev-help-message alert alert-warning">'+ errorMessage +'</span>'); // Show message
 
 
 
 
 
 
 
 
988
 
989
  } else if (jQuery("[name='"+ element.name +"']").attr('type') == "checkbox") {
990
- jQuery("[name='"+ element.name +"']").parent()
991
- .after('<span class="wpdev-help-message alert alert-warning">'+ errorMessage +'</span>'); // Show message
 
 
 
 
 
 
 
 
992
 
993
  } else {
994
- jQuery("[name='"+ element.name +"']")
995
- .after('<span class="wpdev-help-message alert alert-warning">'+ errorMessage +'</span>'); // Show message
 
 
 
 
 
 
 
 
996
  }
997
  jQuery(".wpdev-help-message")
998
  .css( {'padding' : '5px 5px 4px', 'margin' : '2px 2px 2px 10px', 'vertical-align': 'top', 'line-height': '32px' } );
@@ -1026,16 +1050,37 @@ function showMessageUnderElement( element , errorMessage , message_type) {
1026
  makeScroll( element );
1027
 
1028
  if ( jQuery( element ).attr('type') == "radio" ) {
1029
- jQuery( element ).parent().parent().parent()
1030
- .after('<span class="wpdev-help-message wpdev-element-message alert alert-warning '+ message_type +'">'+ errorMessage +'</span>'); // Show message
1031
 
 
 
 
 
 
 
 
 
 
1032
  } else if (jQuery( element ).attr('type') == "checkbox") {
1033
- jQuery( element ).parent()
1034
- .after('<span class="wpdev-help-message wpdev-element-message alert alert-warning '+ message_type +'">'+ errorMessage +'</span>'); // Show message
1035
 
 
 
 
 
 
 
 
 
 
1036
  } else {
1037
- jQuery( element )
1038
- .after('<span class="wpdev-help-message wpdev-element-message alert alert-warning '+ message_type +'">'+ errorMessage +'</span>'); // Show message
 
 
 
 
 
 
 
1039
  }
1040
  // jQuery(".wpdev-help-message")
1041
  // .css( {'padding' : '5px 5px 4px', 'margin' : '10px 2px', 'vertical-align': 'middle' } );
@@ -1202,7 +1247,7 @@ function wpbc_check_errors_in_booking_form( bk_type ) {
1202
  if ( ( 'date_booking' + bk_type ) == jQuery( el ).attr( 'name' ) ) {
1203
 
1204
  // Show Warning only if the calendar visible ( we are at step with calendar)
1205
- if ( ( jQuery( '#calendar_booking4' ).is( ':visible' ) ) && ( '' == jQuery( el ).val() ) ) {
1206
  showMessageUnderElement( '#date_booking' + bk_type, message_verif_selectdts, '' );
1207
  is_error_in_field = true; // Error
1208
  }
@@ -1332,4 +1377,32 @@ function wpbc_check_errors_in_booking_form( bk_type ) {
1332
 
1333
  }
1334
  return is_error_in_field;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1335
  }
983
  .animate( {opacity: 1}, 4000 )
984
  ; // mark red border
985
  if (jQuery("[name='"+ element.name +"']").attr('type') == "radio") {
986
+
987
+ if ( ( ! jQuery( "[name='" + element.name + "']" ).parent().parent().parent().next().hasClass( 'alert-warning' ))
988
+ || (
989
+ ( jQuery( "[name='" + element.name + "']" ).parent().parent().parent().next().hasClass( 'alert-warning' ))
990
+ && ( ! jQuery( "[name='" + element.name + "']" ).parent().parent().parent().next().is( ':visible' ) )
991
+ )
992
+ ){ //FixIn: 8.4.5.7
993
+ jQuery( "[name='" + element.name + "']" ).parent().parent().parent()
994
+ .after( '<span class="wpdev-help-message alert alert-warning">' + errorMessage + '</span>' ); // Show message
995
+ }
996
 
997
  } else if (jQuery("[name='"+ element.name +"']").attr('type') == "checkbox") {
998
+
999
+ if ( ( ! jQuery( "[name='" + element.name + "']" ).parent().next().hasClass( 'alert-warning' ))
1000
+ || (
1001
+ ( jQuery( "[name='" + element.name + "']" ).parent().next().hasClass( 'alert-warning' ))
1002
+ && ( ! jQuery( "[name='" + element.name + "']" ).parent().next().is( ':visible' ) )
1003
+ )
1004
+ ){ //FixIn: 8.4.5.7
1005
+ jQuery( "[name='" + element.name + "']" ).parent()
1006
+ .after( '<span class="wpdev-help-message alert alert-warning">' + errorMessage + '</span>' ); // Show message
1007
+ }
1008
 
1009
  } else {
1010
+
1011
+ if ( ( ! jQuery( "[name='" + element.name + "']" ).next().hasClass( 'alert-warning' ))
1012
+ || (
1013
+ ( jQuery( "[name='" + element.name + "']" ).next().hasClass( 'alert-warning' ))
1014
+ && ( ! jQuery( "[name='" + element.name + "']" ).next().is( ':visible' ) )
1015
+ )
1016
+ ){ //FixIn: 8.4.5.7
1017
+ jQuery( "[name='" + element.name + "']" )
1018
+ .after( '<span class="wpdev-help-message alert alert-warning">' + errorMessage + '</span>' ); // Show message
1019
+ }
1020
  }
1021
  jQuery(".wpdev-help-message")
1022
  .css( {'padding' : '5px 5px 4px', 'margin' : '2px 2px 2px 10px', 'vertical-align': 'top', 'line-height': '32px' } );
1050
  makeScroll( element );
1051
 
1052
  if ( jQuery( element ).attr('type') == "radio" ) {
 
 
1053
 
1054
+ if ( ( ! jQuery( element ).parent().parent().parent().next().hasClass( 'alert-warning' ))
1055
+ || (
1056
+ ( jQuery( element ).parent().parent().parent().next().hasClass( 'alert-warning' ))
1057
+ && ( ! jQuery( element ).parent().parent().parent().next().is( ':visible' ) )
1058
+ )
1059
+ ){ //FixIn: 8.4.5.7
1060
+ jQuery( element ).parent().parent().parent()
1061
+ .after( '<span class="wpdev-help-message wpdev-element-message alert alert-warning ' + message_type + '">' + errorMessage + '</span>' ); // Show message
1062
+ }
1063
  } else if (jQuery( element ).attr('type') == "checkbox") {
 
 
1064
 
1065
+ if ( ( ! jQuery( element ).parent().next().hasClass( 'alert-warning' ))
1066
+ || (
1067
+ ( jQuery( element ).parent().next().hasClass( 'alert-warning' ))
1068
+ && ( ! jQuery( element ).parent().next().is( ':visible' ) )
1069
+ )
1070
+ ){ //FixIn: 8.4.5.7
1071
+ jQuery( element ).parent()
1072
+ .after( '<span class="wpdev-help-message wpdev-element-message alert alert-warning ' + message_type + '">' + errorMessage + '</span>' ); // Show message
1073
+ }
1074
  } else {
1075
+ if ( ( ! jQuery( element ).next().hasClass( 'alert-warning' ))
1076
+ || (
1077
+ ( jQuery( element ).next().hasClass( 'alert-warning' ))
1078
+ && ( ! jQuery( element ).next().is( ':visible' ) )
1079
+ )
1080
+ ){ //FixIn: 8.4.5.7
1081
+ jQuery( element )
1082
+ .after( '<span class="wpdev-help-message wpdev-element-message alert alert-warning ' + message_type + '">' + errorMessage + '</span>' ); // Show message
1083
+ }
1084
  }
1085
  // jQuery(".wpdev-help-message")
1086
  // .css( {'padding' : '5px 5px 4px', 'margin' : '10px 2px', 'vertical-align': 'middle' } );
1247
  if ( ( 'date_booking' + bk_type ) == jQuery( el ).attr( 'name' ) ) {
1248
 
1249
  // Show Warning only if the calendar visible ( we are at step with calendar)
1250
+ if ( ( jQuery( '#calendar_booking' + bk_type ).is( ':visible' ) ) && ( '' == jQuery( el ).val() ) ) { //FixIn: 8.4.4.5
1251
  showMessageUnderElement( '#date_booking' + bk_type, message_verif_selectdts, '' );
1252
  is_error_in_field = true; // Error
1253
  }
1377
 
1378
  }
1379
  return is_error_in_field;
1380
+ }
1381
+
1382
+
1383
+ //FixIn: 8.4.4.4
1384
+ function bk_calendar_step_click( el ){
1385
+ var br_id = jQuery( el ).closest( 'form' ).find( 'input[name^="bk_type"]' ).val();
1386
+ var is_error = wpbc_check_errors_in_booking_form( br_id );
1387
+ if ( is_error ) { return false; }
1388
+ if ( br_id != undefined ) {
1389
+ jQuery( "#booking_form" + br_id + " .bk_calendar_step" ).css({"display":"none"});
1390
+ jQuery( "#booking_form" + br_id + " .bk_form_step" ).css({"display":"block"});
1391
+ } else {
1392
+ jQuery(".bk_calendar_step" ).css({"display":"none"});
1393
+ jQuery(".bk_form_step" ).css({"display":"block"});
1394
+ }
1395
+ }
1396
+ function bk_form_step_click( el ){
1397
+ var br_id = jQuery( el ).closest( 'form' ).find( 'input[name^="bk_type"]' ).val();
1398
+ var is_error = false; // wpbc_check_errors_in_booking_form( br_id ); //FixIn: 8.4.5.6
1399
+ if ( is_error ) { return false; }
1400
+ if ( br_id != undefined ) {
1401
+ jQuery( "#booking_form" + br_id + " .bk_calendar_step" ).css({"display":"block"});
1402
+ jQuery( "#booking_form" + br_id + " .bk_form_step" ).css({"display":"none"});
1403
+ makeScroll( "#bklnk" + br_id );
1404
+ } else {
1405
+ jQuery(".bk_calendar_step" ).css({"display":"block"});
1406
+ jQuery(".bk_form_step" ).css({"display":"none"});
1407
+ }
1408
  }
js/wpbc_times.js CHANGED
@@ -1137,7 +1137,7 @@ function wpbc_is_time_field_in_booking_form( resource_id, form_elements ){
1137
  var time_slot_field_name = 'select[name="rangetime' + bk_type + '"]';
1138
  var time_slot_field_name2 = 'select[name="rangetime' + bk_type + '[]"]';
1139
 
1140
- // Get rangetime element from possible conditional section //FixIn: 5.4.5.2
1141
  if( typeof( wpbc_get_conditional_section_id_for_weekday ) == 'function' ) {
1142
  var conditional_field_element_id = wpbc_get_conditional_section_id_for_weekday( td_class, bk_type );
1143
  if ( conditional_field_element_id !== false ) {
@@ -1146,7 +1146,17 @@ function wpbc_is_time_field_in_booking_form( resource_id, form_elements ){
1146
  }
1147
  }
1148
 
1149
- //console.log( time_slot_field_name, time_slot_field_name2 );
 
 
 
 
 
 
 
 
 
 
1150
 
1151
  // Get dates and time from aproved dates
1152
  if(typeof(date_approved[ bk_type ]) !== 'undefined')
1137
  var time_slot_field_name = 'select[name="rangetime' + bk_type + '"]';
1138
  var time_slot_field_name2 = 'select[name="rangetime' + bk_type + '[]"]';
1139
 
1140
+ // Get rangetime element from possible conditional Weekdays section //FixIn: 5.4.5.2
1141
  if( typeof( wpbc_get_conditional_section_id_for_weekday ) == 'function' ) {
1142
  var conditional_field_element_id = wpbc_get_conditional_section_id_for_weekday( td_class, bk_type );
1143
  if ( conditional_field_element_id !== false ) {
1146
  }
1147
  }
1148
 
1149
+ // Get rangetime element from possible conditional Seasonal section //FixIn: 8.4.5.3
1150
+ if ( typeof(wpbc_get_conditional_section_id_for_seasons) == 'function' ){
1151
+ var conditional_field_element_id2 = wpbc_get_conditional_section_id_for_seasons( td_class, bk_type );
1152
+
1153
+ if ( conditional_field_element_id2 !== false ){
1154
+ time_slot_field_name = conditional_field_element_id2 + ' ' + 'select[name="rangetime' + bk_type + '"]';
1155
+ time_slot_field_name2 = conditional_field_element_id2 + ' ' + 'select[name="rangetime' + bk_type + '[]"]';
1156
+ }
1157
+ }
1158
+
1159
+ //console.log( time_slot_field_name, time_slot_field_name2 );
1160
 
1161
  // Get dates and time from aproved dates
1162
  if(typeof(date_approved[ bk_type ]) !== 'undefined')
languages/booking-de_DE.mo CHANGED
Binary file
languages/booking-it_IT.mo CHANGED
Binary file
languages/booking-sl_SI.mo CHANGED
Binary file
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: booking calendar, booking system, availability calendar, events calendar,
5
  Requires at least: 4.0
6
  Requires PHP: 5.2.4
7
  Tested up to: 5.1
8
- Stable tag: 8.4.3
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -168,6 +168,8 @@ Please see [FAQ](https://wpbookingcalendar.com/faq/).
168
 
169
  - English
170
  - Dutch [100% Completed]
 
 
171
  - German [99% Completed]
172
  - Finnish [99% Completed]
173
  - Danish [97% Completed]
@@ -176,13 +178,11 @@ Please see [FAQ](https://wpbookingcalendar.com/faq/).
176
  - Hungarian [97% Completed]
177
  - Polish [97% Completed]
178
  - Turkish [97% Completed]
179
- - Italian [96% Completed]
180
  - Swedish [96% Completed]
181
  - Spanish [94% Completed]
182
  - Russian [93% Completed]
183
  - Portugal [92% Completed]
184
  - Galician (Spanish) [92% Completed]
185
- - Slovenian [92% Completed]
186
  - Thai [92% Completed]
187
  - Norwegian [89% Completed]
188
  - Brazilian Portuguese [89% Completed]
@@ -225,10 +225,47 @@ Please see [Video Guides](https://wpbookingcalendar.com/help/).
225
  13. **Time Slots**. Simple configuration of **time slots** selection in booking form.
226
 
227
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  = 8.4.3 =
229
  - Changes in **all** versions:
230
  * **Translation** Dutch translation [100% completed] by Boris Hoekmeijer
231
- * **Fix** issue of not ability to add Booking Calendar blocks, because of error: "TypeError: wp.editor is undefined" in WordPress 5.0 or in WordPress 4.9.9 together with Gutenberg Version 4.5.1, during adding new Booking Calendar blocks in post/page. (8.4.3.1)
232
  * **Fix** CSS loyout in WordPress 5.0 for new blocks editor in Chrome browser (8.4.3.2)
233
 
234
  = 8.4.2 =
@@ -241,7 +278,7 @@ Please see [Video Guides](https://wpbookingcalendar.com/help/).
241
  * **Fix** issue of not ability to save time-slots in Booking Calendar Free version or during using Simple mode for booking form, when clicking on "+Add New Field" nothing was happend.(8.4.2.7)
242
  - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
243
  * **New**. **Duplicate Booking**, when clicking on "Edit booking" button in Booking Listing page. Its useful, in case of creation of new booking from returning customer. So you can edit exist booking, and just reselect dates in calendar, for creation new booking with all filled details. (8.4.2.9) *( Personal, Business Small/Medium/Large, MultiUser)*
244
- * **New**. Shortcode [estimate_day_cost_hint] for booking form at Booking > Settings > Form page, which is show estimate cost per day, using this formula: [cost_hint] / [days_number_hint] (8.4.2.1) *( Business Small/Medium/Large, MultiUser)*
245
  * **Improvement** Show timeslots in AM/PM format in Booking Listing and in email template (shortcode [content}), if was configured used AM/PM time format at the Booking > Settings General page. (8.4.2.7)
246
  * **Improvement** Add Notes section of booking to print layout during printing. (8.4.2.2) *( Business Small/Medium/Large, MultiUser)*
247
  * **Improvement** During cancellation of booking by visitor, disable all booking form fields for showing only cancel booking button. (8.4.2.5) *(Personal Business Small/Medium/Large, MultiUser)*
5
  Requires at least: 4.0
6
  Requires PHP: 5.2.4
7
  Tested up to: 5.1
8
+ Stable tag: 8.4.5
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
168
 
169
  - English
170
  - Dutch [100% Completed]
171
+ - Slovenian [100% Completed]
172
+ - Italian [99% Completed]
173
  - German [99% Completed]
174
  - Finnish [99% Completed]
175
  - Danish [97% Completed]
178
  - Hungarian [97% Completed]
179
  - Polish [97% Completed]
180
  - Turkish [97% Completed]
 
181
  - Swedish [96% Completed]
182
  - Spanish [94% Completed]
183
  - Russian [93% Completed]
184
  - Portugal [92% Completed]
185
  - Galician (Spanish) [92% Completed]
 
186
  - Thai [92% Completed]
187
  - Norwegian [89% Completed]
188
  - Brazilian Portuguese [89% Completed]
225
  13. **Time Slots**. Simple configuration of **time slots** selection in booking form.
226
 
227
  == Changelog ==
228
+
229
+ = 8.4.5 =
230
+ - Changes in **all** versions:
231
+ * **Translation** Slovenian translation [100% completed] by Klemen Gaber
232
+ * **Translation**. Italian translation [99% completed] by Vittoria Toso
233
+ * **Translation**. German translation [99% completed] by Vittoria Toso
234
+ * **Improvement**. Show warning messages only once, near required fields, that was not filled, and do not generate several warning messages, if clicked Send booking form button several times. (8.4.5.7)
235
+ * **Improvement**. Show label 'Imported' for bookings, that was imported from .ics feeds, at Booking Listing page (8.4.5.10)
236
+ * **Fix**. Issue during clicking on "import events from google calendar" and getting error "Warning. A non-numeric value encountered in /core/lib/wpbc-cron.php" (8.4.5.2)
237
+ * **Fix**. Issue of opening popover in timelines at top direction instead of bottom, which in some cases reason of not showing all booking details. (8.4.5.12)
238
+ * **Fix**. Authenticated SQL Injection Vulnerability (8.4.5.15)
239
+ - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
240
+ * **New**. Ability to deactivate by default option "Send email" at Add Booking page. (8.4.5.4) *(Personal Business Small/Medium/Large, MultiUser)*
241
+ * **New**. Ability to deactivate by default option "Send email" at Booking Listing page (8.4.5.4) *(Personal Business Small/Medium/Large, MultiUser)*
242
+ * **New**. Ability to skip checking availability of new booking resource during changing booking resource of exist booking at Booking Listing page. (8.4.5.5) *(Personal Business Small/Medium/Large, MultiUser)*
243
+ * **Compatibility**. Add ability to use URLs in different languages via [lang=LOCALE] shortcode. For example in return URL after successful payment. (8.4.5.1) *( Business Small/Medium/Large, MultiUser)*
244
+ * **Improvement**. Set as unavailable days in calendar after page loaded, if all timeslots was booked for specfic date and if you was used the "conditional seasonal times" logic. Previosly these dates was showing as partially booked dates. (8.4.5.3) *( Business Medium/Large, MultiUser)*
245
+ * **Fix**. Issue of showing warning messages for required fields, when clicked Back button to calendar "step", if was used several steps booking form (wizard form) configuration. (8.4.5.6) *(Personal Business Small/Medium/Large, MultiUser)*
246
+ * **Fix**. Issue of not loading JS / CSS files and getting error at the Search Results page, if was activated this option "Load JS and CSS files only on specific pages" at the Booking > Settings General page (8.4.5.8) *( Business Large, MultiUser)*
247
+ * **Fix**. Issue of showing "Duplicate booking" button, during editing booking by visitors, who made the booking at front-end side. (8.4.5.9) *(Personal Business Small/Medium/Large, MultiUser)*
248
+ * **Fix**. Warning: Illegal string offset 'booking_hash' (8.4.5.11) *(Personal Business Small/Medium/Large, MultiUser)*
249
+ * **Fix**. Issue of in booking customer listing shortcode in timeline during cancellation of booking and going back (8.4.5.13) *(Personal Business Small/Medium/Large, MultiUser)*
250
+ * **Fix**. Issue Uncaught TypeError: myURLParams[myParam].split is not a function at setDaySelectionsInCalendar (8.4.5.14) *(Business Large, MultiUser)*
251
+
252
+ = 8.4.4 =
253
+ - Changes in **all** versions:
254
+ * **Fix** Showing warning in PHP 7.1 during clicking on Booking System Info button at Booking > Settings General page (8.4.4.1)
255
+ * **Fix** Showing error warning in PHP 7.2: "PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function wpbm_recheck_plugin_locale(), 1 passed and exactly 2 expected in .." (8.4.4.2)
256
+ - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
257
+ * **Compatibility**. Authorize.Net is phasing out the MD5 based transHash element in favor of the SHA-512 based transHashSHA2 (at end of January 2019). That's why previous "Transaction Key" and "MD5 Hash value" for "Relay Response" functionality is not valid anymore in Authorize.Net. Instead of that you need to generate new "Signature Key" at Authorize.Net, and save it to Booking Calendar settings at Booking > Settings > Payment > Authorize.Net page. (8.4.4.8) *( Business Small/Medium/Large, MultiUser)*
258
+ * **New**. Shortcode [estimate_night_cost_hint] for booking form at Booking > Settings > Form page, which is show estimate cost per day, using this formula: [cost_hint] / [nights_number_hint] (8.4.4.7) *( Business Medium/Large, MultiUser)*
259
+ * **Fix**. Warning: number_format() expects at most 4 parameters, 5 given in ../inc/gateways/page-gateways.php on line 1299. This issue was existing in updates: 8.3.2 - 8.4.3 *(Business Small/Medium/Large, MultiUser)* (8.4.4.3)
260
+ * **Fix**. Replace JavaScript code, which exist in the "Wizard (several steps)" form template at the Booking > Settings > Form page from inline code to the ../js/client.js file. Its prevent from some issues of inserting Google Ads. (8.4.4.4)
261
+ * **Fix**. Issue of not showing warning message, if was not selected date(s) in calendar, if was used several steps booking form (wizard form) configuration. (8.4.4.5)
262
+ * **Fix**. Issue of not ability to use conditional days selection (which is defined in option paramater of plugin shortcode) for "range days selection mode using 1 mouse click", if in condition for weekdays was set selection for 1 day only. (8.4.4.8) *( Business Medium/Large, MultiUser)*
263
+ * **Improvement**. Add one additional date, during booking editing, if activated option "Set check out date as available" (8.4.4.6)
264
+
265
  = 8.4.3 =
266
  - Changes in **all** versions:
267
  * **Translation** Dutch translation [100% completed] by Boris Hoekmeijer
268
+ * **Fix** issue of not ability to add Booking Calendar blocks, because of error: "TypeError: wp.editor is undefined" in WordPress 5.0 or in WordPress 4.9.9 together with Gutenberg Version 4.5.1, during adding new Booking Calendar blocks in post/page. (8.4.3.1)
269
  * **Fix** CSS loyout in WordPress 5.0 for new blocks editor in Chrome browser (8.4.3.2)
270
 
271
  = 8.4.2 =
278
  * **Fix** issue of not ability to save time-slots in Booking Calendar Free version or during using Simple mode for booking form, when clicking on "+Add New Field" nothing was happend.(8.4.2.7)
279
  - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
280
  * **New**. **Duplicate Booking**, when clicking on "Edit booking" button in Booking Listing page. Its useful, in case of creation of new booking from returning customer. So you can edit exist booking, and just reselect dates in calendar, for creation new booking with all filled details. (8.4.2.9) *( Personal, Business Small/Medium/Large, MultiUser)*
281
+ * **New**. Shortcode [estimate_day_cost_hint] for booking form at Booking > Settings > Form page, which is show estimate cost per day, using this formula: [cost_hint] / [days_number_hint] (8.4.2.1) *( Business Medium/Large, MultiUser)*
282
  * **Improvement** Show timeslots in AM/PM format in Booking Listing and in email template (shortcode [content}), if was configured used AM/PM time format at the Booking > Settings General page. (8.4.2.7)
283
  * **Improvement** Add Notes section of booking to print layout during printing. (8.4.2.2) *( Business Small/Medium/Large, MultiUser)*
284
  * **Improvement** During cancellation of booking by visitor, disable all booking form fields for showing only cancel booking button. (8.4.2.5) *(Personal Business Small/Medium/Large, MultiUser)*
wpdev-booking.php CHANGED
@@ -7,10 +7,10 @@ Author: wpdevelop, oplugins
7
  Author URI: https://wpbookingcalendar.com/
8
  Text Domain: booking
9
  Domain Path: /languages/
10
- Version: 8.4.3
11
  */
12
 
13
- /* Copyright 2009 - 2018 www.wpbookingcalendar.com (email: info@wpbookingcalendar.com),
14
 
15
  This program is free software: you can redistribute it and/or modify
16
  it under the terms of the GNU General Public License as published by
@@ -49,4 +49,8 @@ if ( ! defined('WPBC_PLUGIN_URL' ) ) define('WPBC_PLUGIN_URL', untrailing
49
 
50
  if ( ! defined('WP_BK_MIN_WP_VERSION' ) ) define('WP_BK_MIN_WP_VERSION', '4.0'); //Minimum required WP version //FixIn: 7.0.1.6
51
 
52
- require_once WPBC_PLUGIN_DIR . '/core/wpbc.php';
 
 
 
 
7
  Author URI: https://wpbookingcalendar.com/
8
  Text Domain: booking
9
  Domain Path: /languages/
10
+ Version: 8.4.5
11
  */
12
 
13
+ /* Copyright 2009 - 2019 www.wpbookingcalendar.com (email: info@wpbookingcalendar.com),
14
 
15
  This program is free software: you can redistribute it and/or modify
16
  it under the terms of the GNU General Public License as published by
49
 
50
  if ( ! defined('WP_BK_MIN_WP_VERSION' ) ) define('WP_BK_MIN_WP_VERSION', '4.0'); //Minimum required WP version //FixIn: 7.0.1.6
51
 
52
+ require_once WPBC_PLUGIN_DIR . '/core/wpbc.php';
53
+
54
+ /* TODO:
55
+ 1. Auto populate booking info from exist customers into the booking form at Booking > Add booking page.
56
+ */