Booking Calendar - Version 8.4.2

Version Description

  • Changes in all versions:
    • Translation. Finnish translation [99% completed] by Tero Janhunen
    • Translation. German translation [99% completed] by Martin Klewer
    • Support Fix compatibility with Gutenberg 4.1- 4.3( or newer ). Before this having JavaScript error " ReferenceError: jQuery is not defined" at edit post page, because of weird behavior with 'edit_form_advanced' hook, while activated Gutenberg. (8.4.2.10)
    • Support Additional help info about import .ics feed by set up CRON script at your server for "pseudo" automatic import of events. (8.4.2.12)
    • Fix issue of checkboxes and radio buttons height in new Firefox updates in admin panel, otherwise sometimes, there exist weird artefact (8.4.2.6)
    • 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)
  • Changes in Personal / Business Small / Business Medium / Business Large / MultiUser versions:
    • 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)
    • 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 ( Business Small/Medium/Large, MultiUser)
    • 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)
    • Improvement Add Notes section of booking to print layout during printing. (8.4.2.2) ( Business Small/Medium/Large, MultiUser)
    • 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)
    • Fix issue of not changing booking HASH during deleting booking by user, who made the booking. (8.4.2.4) (Personal Business Small/Medium/Large, MultiUser)
    • Fix issue of showing times popover hint in some themes in widgetes (8.4.2.3) (Business Small/Medium/Large, MultiUser)
    • Fix issue of showing currency symbols in booking pipeline in Timeline and in Calendar Overview pages, for example, while showing additional cost hints or booking cost in booking pipeline (8.4.2.8) (Business Small/Medium/Large, MultiUser)
    • Fix issue of not ability to add additional cost for the rangetime, if times format was set as AM/PM (8.4.2.11) (Business Medium/Large, MultiUser)
    • Under Hood Ability to ncustomize of showing cost/days hints, just after first click on days, if activated "range days selection mode using 2 mouse clicks". You can customiaze it at ../inc/js/biz_m.js file / by replacing is_show_cost_after_first_click
Download this release

Release Info

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

Code changes from version 8.4 to 8.4.2

Files changed (46) hide show
  1. core/admin/page-form-timeslots.php +3 -3
  2. core/admin/page-ics-import.php +32 -3
  3. core/admin/wpbc-class-listing.php +2 -1
  4. core/admin/wpbc-class-timeline.php +8 -2
  5. core/admin/wpbc-toolbar-tiny.php +2 -1
  6. core/any/css/admin-support.css +2 -2
  7. core/lib/wpbc-booking-new.php +28 -7
  8. core/lib/wpbc_all_translations.php +40 -2
  9. core/lib/wpdev-booking-widget.php +1 -1
  10. core/wpbc-constants.php +2 -2
  11. core/wpbc-dates.php +25 -1
  12. core/wpbc-functions.php +32 -9
  13. js/client.js +172 -8
  14. js/wpbc-gutenberg.js +3 -2
  15. languages/booking-ar_SA.mo +0 -0
  16. languages/booking-be_BY.mo +0 -0
  17. languages/booking-bg_BG.mo +0 -0
  18. languages/booking-ca.mo +0 -0
  19. languages/booking-cs_CZ.mo +0 -0
  20. languages/booking-da_DK.mo +0 -0
  21. languages/booking-de_DE.mo +0 -0
  22. languages/booking-el.mo +0 -0
  23. languages/booking-es_ES.mo +0 -0
  24. languages/booking-fi.mo +0 -0
  25. languages/booking-fr_FR.mo +0 -0
  26. languages/booking-gl_ES.mo +0 -0
  27. languages/booking-he_IL.mo +0 -0
  28. languages/booking-hr.mo +0 -0
  29. languages/booking-hu_HU.mo +0 -0
  30. languages/booking-it_IT.mo +0 -0
  31. languages/booking-nb_NO.mo +0 -0
  32. languages/booking-nl_NL.mo +0 -0
  33. languages/booking-pl_PL.mo +0 -0
  34. languages/booking-pt_BR.mo +0 -0
  35. languages/booking-pt_PT.mo +0 -0
  36. languages/booking-ru_RU.mo +0 -0
  37. languages/booking-sk_SK.mo +0 -0
  38. languages/booking-sl_SI.mo +0 -0
  39. languages/booking-sv_SE.mo +0 -0
  40. languages/booking-th_TH.mo +0 -0
  41. languages/booking-tr_TR.mo +0 -0
  42. languages/booking-uk_UK.mo +0 -0
  43. languages/booking-zh_CN.mo +0 -0
  44. languages/booking-zh_TW.mo +0 -0
  45. readme.txt +36 -8
  46. wpdev-booking.php +1 -1
core/admin/page-form-timeslots.php CHANGED
@@ -504,9 +504,9 @@ function wpbc_timeslots_table_config_js() {
504
 
505
  // Get parsed time-slots rows with labels, if exist
506
  for ( var i = 0; i < size; i++ ){
507
- time_s = jQuery( "select[name='timeslotS[" + i + "]'" ).val();
508
- time_e = jQuery( "select[name='timeslotE[" + i + "]'" ).val();
509
- time_label = jQuery( "input[name='form_field_timeslot_label[" + i + "]'" ).val();
510
  time_label = time_label.trim();
511
 
512
  if ( time_label.length > 0 ){
504
 
505
  // Get parsed time-slots rows with labels, if exist
506
  for ( var i = 0; i < size; i++ ){
507
+ time_s = jQuery( "select[name='timeslotS[" + i + "]']" ).val(); //FixIn: 8.4.2.7
508
+ time_e = jQuery( "select[name='timeslotE[" + i + "]']" ).val(); //FixIn: 8.4.2.7
509
+ time_label = jQuery( "input[name='form_field_timeslot_label[" + i + "]']" ).val(); //FixIn: 8.4.2.7
510
  time_label = time_label.trim();
511
 
512
  if ( time_label.length > 0 ){
core/admin/page-ics-import.php CHANGED
@@ -543,8 +543,37 @@ function wpbc_ics_import_export__show_help_info( $is_import = true ) {
543
  echo $message_ics;
544
  ?>
545
  </div>
546
- <div style="height:30px;" class="clear"></div>
547
  <?php if ( $is_import ) { ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
548
  <h4 style="font-size:1.1em;">
549
  <?php
550
  $message_ics = sprintf( __( 'How to start import of .ics feeds (files)?', 'booking' ) );
@@ -570,7 +599,7 @@ function wpbc_ics_import_export__show_help_info( $is_import = true ) {
570
  $message_ics = sprintf( __( 'Using such shortcodes in pages give a great flexibility to import from different .ics feeds (sources) into the same resource.%sAlso its possible to define different CRON parameters for accessing such different pages with different time intervals.', 'booking' )
571
  , '<br/>'
572
  );
573
- $message_ics = str_replace( array( '.ics', 'CRON' ), array( '<strong>.ics</strong>', '<a target="_blank" href="https://wpbookingcalendar.com/faq/cron/"><strong>CRON</strong></a>' ), $message_ics );
574
  echo $message_ics;
575
  ?>
576
  </div>
@@ -586,7 +615,7 @@ function wpbc_ics_import_export__show_help_info( $is_import = true ) {
586
  $message_ics = sprintf( __( 'If you have inserted import shortcodes from %s, then you can configure your CRON for periodically access these pages and import .ics feeds.', 'booking' )
587
  , '<a target="_blank" href="https://wordpress.org/plugins/booking-manager/"><strong>Booking Manager</strong></a> <code>[booking-manager-import ...]</code>'
588
  );
589
- $message_ics = str_replace( array( '.ics', 'CRON' ), array( '<strong>.ics</strong>', '<a target="_blank" href="https://wpbookingcalendar.com/faq/cron/"><strong>CRON</strong></a>' ), $message_ics );
590
  echo $message_ics;
591
  ?>
592
  </li>
543
  echo $message_ics;
544
  ?>
545
  </div>
 
546
  <?php if ( $is_import ) { ?>
547
+ <h4 style="font-size:1.1em;">
548
+ <?php
549
+ // FixIn: 8.4.2.12
550
+ $message_ics = sprintf( __( 'Is it automatic process?', 'booking' ) );
551
+ $message_ics = str_replace( array( '.ics', 'iCalendar' ), array( '<strong>.ics</strong>', '<strong>iCalendar</strong>' ), $message_ics );
552
+ echo $message_ics;
553
+ ?>
554
+ </h4>
555
+ <div class="wpbc-settings-notice notice-warning"
556
+ style="text-align:left;border-top:1px solid #f0f0f0;border-right:1px solid #f0f0f0; line-height: 2em;padding: 5px 20px;"
557
+ >
558
+ <?php
559
+ $message_ics = sprintf(
560
+ __( 'By default .ics import is not automatic process. You need to set up CRON script on your server to periodically access front-end page(s) with import .ics feeds shortcodes.', 'booking' )
561
+ , '<br/>' /*
562
+ '<br/><em>(<strong><a href="https://www.airbnb.com/help/article/99/how-do-i-sync-my-airbnb-calendar-with-another-calendar" target="_blank">Airbnb</a></strong>, '
563
+ . '<strong><a href="https://partnersupport.booking.com/hc/en-us/articles/213424709-How-do-I-export-my-calendar-" target="_blank">Booking.com</a></strong>, '
564
+ . '<strong><a href="https://help.homeaway.com/articles/How-do-I-export-my-calendar-data-to-a-Google-calendar" target="_blank">HomeAway</a></strong>, '
565
+ . '<strong><a href="https://rentalsupport.tripadvisor.com/articles/FAQ/noc-How-does-calendar-sync-work" target="_blank">TripAdvisor</a></strong>, '
566
+ . '<strong><a href="https://help.vrbo.com/articles/How-do-I-export-my-calendar-data-to-a-Google-calendar" target="_blank">VRBO</a></strong>, '
567
+ . '<strong><a href="https://helpcenter.flipkey.com/articles/FAQ/noc-How-does-calendar-sync-work" target="_blank">FlipKey</a></strong> '
568
+ . str_replace( array( '.ics', 'iCalendar' ), array( '<strong>.ics</strong>', '<strong>iCalendar</strong>' ),
569
+ __( 'and any other calendar that uses .ics format', 'booking' )
570
+ )
571
+ . ')</em>.<br/>' */
572
+ );
573
+ $message_ics = str_replace( array( '.ics', 'iCalendar' , 'CRON'), array( '<strong>.ics</strong>', '<strong>iCalendar</strong>' , '<a target="_blank" href="https://wpbookingcalendar.com/faq/cron-script/"><strong>CRON</strong></a>' ), $message_ics );
574
+ echo $message_ics;
575
+ ?>
576
+ </div>
577
  <h4 style="font-size:1.1em;">
578
  <?php
579
  $message_ics = sprintf( __( 'How to start import of .ics feeds (files)?', 'booking' ) );
599
  $message_ics = sprintf( __( 'Using such shortcodes in pages give a great flexibility to import from different .ics feeds (sources) into the same resource.%sAlso its possible to define different CRON parameters for accessing such different pages with different time intervals.', 'booking' )
600
  , '<br/>'
601
  );
602
+ $message_ics = str_replace( array( '.ics', 'CRON' ), array( '<strong>.ics</strong>', '<a target="_blank" href="https://wpbookingcalendar.com/faq/cron-script/"><strong>CRON</strong></a>' ), $message_ics );
603
  echo $message_ics;
604
  ?>
605
  </div>
615
  $message_ics = sprintf( __( 'If you have inserted import shortcodes from %s, then you can configure your CRON for periodically access these pages and import .ics feeds.', 'booking' )
616
  , '<a target="_blank" href="https://wordpress.org/plugins/booking-manager/"><strong>Booking Manager</strong></a> <code>[booking-manager-import ...]</code>'
617
  );
618
+ $message_ics = str_replace( array( '.ics', 'CRON' ), array( '<strong>.ics</strong>', '<a target="_blank" href="https://wpbookingcalendar.com/faq/cron-script/"><strong>CRON</strong></a>' ), $message_ics );
619
  echo $message_ics;
620
  ?>
621
  </li>
core/admin/wpbc-class-listing.php CHANGED
@@ -259,7 +259,7 @@ class WPBC_Booking_Listing_Table {
259
  , array()
260
  , $row_data['id']
261
  , $row_data['is_approved']
262
- , $row_data['form_show']
263
  , $row_data['resource_name']
264
  , $row_data['is_paid']
265
  , $row_data['pay_print_status']
@@ -336,6 +336,7 @@ class WPBC_Booking_Listing_Table {
336
  // Data
337
  ?><div class="wpbc-listing-collumn col-sm-<?php echo ( $is_free ) ? '5' : '6'; ?> col-xs-12 wpbc-text-justify field-content wpbc_column_4"> <?php //FixIn: 7.1.2.5 ?>
338
  <?php echo $row_data['form_show']; ?>
 
339
  </div><?php
340
 
341
  //Dates
259
  , array()
260
  , $row_data['id']
261
  , $row_data['is_approved']
262
+ , $row_data['form_show'] . ( ! empty($row_data['remark'] ) ? ( "<br/>" . $row_data['remark'] ) : '' ) //FixIn: 8.4.2.2
263
  , $row_data['resource_name']
264
  , $row_data['is_paid']
265
  , $row_data['pay_print_status']
336
  // Data
337
  ?><div class="wpbc-listing-collumn col-sm-<?php echo ( $is_free ) ? '5' : '6'; ?> col-xs-12 wpbc-text-justify field-content wpbc_column_4"> <?php //FixIn: 7.1.2.5 ?>
338
  <?php echo $row_data['form_show']; ?>
339
+ <?php // echo ( ! empty($row_data['remark'] ) ? ( "<br/>" . $row_data['remark'] ) : '' ); //FixIn: 8.4.2.2 // Its will add the Notes section to the listing at Booking Listing page?>
340
  </div><?php
341
 
342
  //Dates
core/admin/wpbc-class-timeline.php CHANGED
@@ -1491,7 +1491,7 @@ class WPBC_Timeline {
1491
  // if the booking take for the several days, so then do not show title in the other days
1492
  $my_bk_info = $this->wpbc_get_booking_info_4_tooltip( $bk_id, $bookings, $booking_types, $title_in_day, $title, $title_hint );
1493
 
1494
- $title_in_day = $my_bk_info[0];
1495
  $title = $my_bk_info[1];
1496
  $title_hint = $my_bk_info[2];
1497
  $is_approved = $my_bk_info[3];
@@ -1604,7 +1604,7 @@ class WPBC_Timeline {
1604
 
1605
  $my_bk_info = $this->wpbc_get_booking_info_4_tooltip( $bk_id, $bookings, $booking_types, $title_in_day, $title, $title_hint );
1606
 
1607
- $title_in_day = $my_bk_info[0];
1608
  $title = $my_bk_info[1];
1609
  $title_hint = $my_bk_info[2];
1610
  $is_approved = $my_bk_info[3];
@@ -2157,6 +2157,12 @@ class WPBC_Timeline {
2157
  }
2158
  $header_title .= '<div class=\'popover-title-id\' > ID: ' . $bk_id . '</div>'; // ID
2159
 
 
 
 
 
 
 
2160
  // Buttons
2161
  $header_title .= '<div class=\'control-group timeline_info_bk_actionsbar_' . $bk_id . '\' >';
2162
  $is_can = true; //current_user_can( 'edit_posts' );
1491
  // if the booking take for the several days, so then do not show title in the other days
1492
  $my_bk_info = $this->wpbc_get_booking_info_4_tooltip( $bk_id, $bookings, $booking_types, $title_in_day, $title, $title_hint );
1493
 
1494
+ $title_in_day = htmlspecialchars_decode( $my_bk_info[0] ); //FixIn: 8.4.2.8
1495
  $title = $my_bk_info[1];
1496
  $title_hint = $my_bk_info[2];
1497
  $is_approved = $my_bk_info[3];
1604
 
1605
  $my_bk_info = $this->wpbc_get_booking_info_4_tooltip( $bk_id, $bookings, $booking_types, $title_in_day, $title, $title_hint );
1606
 
1607
+ $title_in_day = htmlspecialchars_decode( $my_bk_info[0] ); //FixIn: 8.4.2.8
1608
  $title = $my_bk_info[1];
1609
  $title_hint = $my_bk_info[2];
1610
  $is_approved = $my_bk_info[3];
2157
  }
2158
  $header_title .= '<div class=\'popover-title-id\' > ID: ' . $bk_id . '</div>'; // ID
2159
 
2160
+ //$header_title .= '<div class=\'popover-title-id\' > ' .
2161
+ //(! empty($bookings[$bk_id]->form_data['_all_fields_']['name']) ? $bookings[$bk_id]->form_data['_all_fields_']['name'] : '' ) . ' '
2162
+ //. (! empty($bookings[$bk_id]->form_data['_all_fields_']['secondname']) ? $bookings[$bk_id]->form_data['_all_fields_']['secondname'] : '' )
2163
+ //. '</div>'; // ID
2164
+
2165
+
2166
  // Buttons
2167
  $header_title .= '<div class=\'control-group timeline_info_bk_actionsbar_' . $bk_id . '\' >';
2168
  $is_can = true; //current_user_can( 'edit_posts' );
core/admin/wpbc-toolbar-tiny.php CHANGED
@@ -68,7 +68,8 @@ class WPBC_TinyMCE_Buttons {
68
  else add_filter( 'mce_buttons_' . $this->settings['tiny_btn_row'] , array( $this, 'add_tiny_button' ) );
69
 
70
  // Add the old style button to the non-TinyMCE editor views
71
- add_action( 'edit_form_advanced', array( $this, 'add_html_button' ) ); // Fires after 'normal' context meta boxes have been output
 
72
  add_action( 'edit_page_form', array( $this, 'add_html_button' ) );
73
 
74
  add_action( 'admin_head', array( $this, 'insert_button') );
68
  else add_filter( 'mce_buttons_' . $this->settings['tiny_btn_row'] , array( $this, 'add_tiny_button' ) );
69
 
70
  // Add the old style button to the non-TinyMCE editor views
71
+ //Fix: 8.4.2.10 - compatibility with Gutenberg 4.1- 4.3 ( or newer ) at edit post page.
72
+ //add_action( 'edit_form_advanced', array( $this, 'add_html_button' ) ); // Fires after 'normal' context meta boxes have been output
73
  add_action( 'edit_page_form', array( $this, 'add_html_button' ) );
74
 
75
  add_action( 'admin_head', array( $this, 'insert_button') );
core/any/css/admin-support.css CHANGED
@@ -436,10 +436,10 @@ html[xmlns] .clearfix-height.hidden_items {
436
  /* Hack to fix checkbox height in Firefox, otherwise sometimes, there exist weird artefact */
437
  @-moz-document url-prefix() {
438
  .wpbc_page input[type='checkbox'] {
439
- height: auto;
440
  }
441
  .wpbc_page input[type='radio'] {
442
- height: auto;
443
  /*height: 32px;*/
444
  }
445
  }
436
  /* Hack to fix checkbox height in Firefox, otherwise sometimes, there exist weird artefact */
437
  @-moz-document url-prefix() {
438
  .wpbc_page input[type='checkbox'] {
439
+ /*height: auto;*/ /* FixIn: 8.4.2.6 */
440
  }
441
  .wpbc_page input[type='radio'] {
442
+ /*height: auto;*/ /* FixIn: 8.4.2.6 */
443
  /*height: 32px;*/
444
  }
445
  }
core/lib/wpbc-booking-new.php CHANGED
@@ -238,12 +238,14 @@ function wpdev_bk_insert_new_booking() {
238
  // )
239
  //
240
  function wpbc_add_new_booking( $params , $is_edit_booking = false ){
241
-
 
 
242
  if ( $is_edit_booking !== false ) { // Edit booking
243
 
244
  $booking_id = $is_edit_booking['booking_id'];
245
  $bktype = $is_edit_booking['booking_type'];
246
-
247
  } else { // New booking
248
  if (! isset($params[ "bktype" ]))
249
  return false; // Error: Unknown booking resources
@@ -260,8 +262,21 @@ function wpbc_add_new_booking( $params , $is_edit_booking = false ){
260
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
261
  global $wpdb;
262
 
263
- $formdata = escape_any_xss( $params[ "form" ] );
 
 
 
264
 
 
 
 
 
 
 
 
 
 
 
265
  $my_modification_date = "'" . date_i18n( 'Y-m-d H:i:s' ) ."'" ; // Localize booking modification date
266
 
267
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -334,8 +349,11 @@ function wpbc_add_new_booking( $params , $is_edit_booking = false ){
334
  $additional_fields = ", sync_gid" ;
335
  $additional_fields_vlaues = ", '" . wpbc_clean_parameter($params["sync_gid"]) . "'" ;
336
  }
337
-
338
- if ( $is_edit_booking === false ) {
 
 
 
339
 
340
  ////////////////////////////////////////////////////////////////////////////
341
  // Add new booking
@@ -367,7 +385,7 @@ function wpbc_add_new_booking( $params , $is_edit_booking = false ){
367
  if ( count($slct_sql_results) > 0 ) {
368
  $is_approved_dates = $slct_sql_results[0]->approved;
369
  }
370
-
371
  $delete_sql = "DELETE FROM {$wpdb->prefix}bookingdates WHERE booking_id IN ({$booking_id})";
372
  if ( false === $wpdb->query( $delete_sql ) ){
373
  ?> <script type="text/javascript"> if ( jQuery('#submiting<?php echo $bktype; ?>' ).length ) { document.getElementById('submiting<?php echo $bktype; ?>').innerHTML = '<div style=&quot;height:20px;width:100%;text-align:center;margin:15px auto;&quot;><?php debuge_error('Error during updating exist booking for deleting dates in DB' ,__FILE__,__LINE__); ?></div>'; }</script> <?php
@@ -398,7 +416,10 @@ function wpbc_add_new_booking( $params , $is_edit_booking = false ){
398
  else $is_send_emeils = 1;
399
 
400
 
401
- if ( $is_edit_booking === false ) {
 
 
 
402
 
403
  if ( $is_send_emeils != 0 ) {
404
  // wpbc_send_email_new_REPLACED( $booking_id, $bktype, $formdata ) ; // Old Sending emails.
238
  // )
239
  //
240
  function wpbc_add_new_booking( $params , $is_edit_booking = false ){
241
+
242
+ $is_duplicate_booking = false; //FixIn: 8.4.2.9
243
+
244
  if ( $is_edit_booking !== false ) { // Edit booking
245
 
246
  $booking_id = $is_edit_booking['booking_id'];
247
  $bktype = $is_edit_booking['booking_type'];
248
+
249
  } else { // New booking
250
  if (! isset($params[ "bktype" ]))
251
  return false; // Error: Unknown booking resources
262
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
263
  global $wpdb;
264
 
265
+ $formdata = escape_any_xss( $params[ "form" ] );
266
+
267
+ //FixIn: 8.4.2.9
268
+ if ( $is_edit_booking ) {
269
 
270
+ $formdata_array = explode( '~', $formdata );
271
+ $formdata_array_count = count( $formdata_array );
272
+ for ( $i = 0; $i < $formdata_array_count; $i ++ ) {
273
+ $elemnts = explode( '^', $formdata_array[ $i ] );
274
+ if ( ( 'wpbc_other_action' == $elemnts[1] ) && ( 'duplicate_booking' == $elemnts[2] ) ) {
275
+ $is_duplicate_booking = true;
276
+ break;
277
+ }
278
+ }
279
+ }
280
  $my_modification_date = "'" . date_i18n( 'Y-m-d H:i:s' ) ."'" ; // Localize booking modification date
281
 
282
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
349
  $additional_fields = ", sync_gid" ;
350
  $additional_fields_vlaues = ", '" . wpbc_clean_parameter($params["sync_gid"]) . "'" ;
351
  }
352
+
353
+ //FixIn: 8.4.2.9
354
+ if ( ( $is_edit_booking === false )
355
+ || ( true === $is_duplicate_booking )
356
+ ) {
357
 
358
  ////////////////////////////////////////////////////////////////////////////
359
  // Add new booking
385
  if ( count($slct_sql_results) > 0 ) {
386
  $is_approved_dates = $slct_sql_results[0]->approved;
387
  }
388
+ //$is_approved_dates = '0';
389
  $delete_sql = "DELETE FROM {$wpdb->prefix}bookingdates WHERE booking_id IN ({$booking_id})";
390
  if ( false === $wpdb->query( $delete_sql ) ){
391
  ?> <script type="text/javascript"> if ( jQuery('#submiting<?php echo $bktype; ?>' ).length ) { document.getElementById('submiting<?php echo $bktype; ?>').innerHTML = '<div style=&quot;height:20px;width:100%;text-align:center;margin:15px auto;&quot;><?php debuge_error('Error during updating exist booking for deleting dates in DB' ,__FILE__,__LINE__); ?></div>'; }</script> <?php
416
  else $is_send_emeils = 1;
417
 
418
 
419
+ //FixIn: 8.4.2.9
420
+ if ( ( $is_edit_booking === false )
421
+ || ( true === $is_duplicate_booking )
422
+ ) {
423
 
424
  if ( $is_send_emeils != 0 ) {
425
  // wpbc_send_email_new_REPLACED( $booking_id, $bktype, $formdata ) ; // Old Sending emails.
core/lib/wpbc_all_translations.php CHANGED
@@ -99,6 +99,8 @@
99
  $wpbc_all_translations[] = __('Check this box if you want to show help hints on the admin panel.', 'booking');
100
  $wpbc_all_translations[] = __('Allow unlimited bookings per same day(s)', 'booking');
101
  $wpbc_all_translations[] = __('Check this box, if you want to %sset any days as available%s in calendar. Your visitors will be able to make %sunlimited bookings per same date(s) in calendar and do not see any booked date(s)%s of other visitors.', 'booking');
 
 
102
  $wpbc_all_translations[] = __('Checking to prevent double booking, during submitting booking', 'booking');
103
  $wpbc_all_translations[] = __('Check this box, if you want to %sre-check if the selected dates available during submitting booking%s.', 'booking');
104
  $wpbc_all_translations[] = __('This feature useful to prevent double booking of the same date(s) or time(s), if several visitors try to book the same date(s) in same calendar during the same time.', 'booking');
@@ -759,8 +761,6 @@
759
  $wpbc_all_translations[] = __('Check this box to display the available number of booking resources with a tooltip, when mouse hovers over each day on the calendar(s).', 'booking');
760
  $wpbc_all_translations[] = __('Availability Title', 'booking');
761
  $wpbc_all_translations[] = __('Type your %savailability%s description', 'booking');
762
- $wpbc_all_translations[] = __('Use pending days as available', 'booking');
763
- $wpbc_all_translations[] = __('Check this box if you want to show the pending days as available in calendars', 'booking');
764
  $wpbc_all_translations[] = __('Auto-cancel bookings', 'booking');
765
  $wpbc_all_translations[] = __('Auto Cancel all pending bookings for the specific date(s), if some booking is approved for these date(s)', 'booking');
766
  $wpbc_all_translations[] = __('Warning!!! After you approved the specific booking(s), all your pending bookings of the same booking resource as an approved booking for the dates, which are intersect with dates of approved booking, will be automatically canceled!', 'booking');
@@ -1719,4 +1719,42 @@
1719
  $wpbc_all_translations[] = __('Set Early / Late Booking Amount', 'booking');
1720
  $wpbc_all_translations[] = __('Set Early / Late booking discount', 'booking');
1721
  $wpbc_all_translations[] = __('Early / Late', 'booking');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1722
  }
99
  $wpbc_all_translations[] = __('Check this box if you want to show help hints on the admin panel.', 'booking');
100
  $wpbc_all_translations[] = __('Allow unlimited bookings per same day(s)', 'booking');
101
  $wpbc_all_translations[] = __('Check this box, if you want to %sset any days as available%s in calendar. Your visitors will be able to make %sunlimited bookings per same date(s) in calendar and do not see any booked date(s)%s of other visitors.', 'booking');
102
+ $wpbc_all_translations[] = __('Use pending days as available', 'booking');
103
+ $wpbc_all_translations[] = __('Check this box if you want to show the pending days as available in calendars', 'booking');
104
  $wpbc_all_translations[] = __('Checking to prevent double booking, during submitting booking', 'booking');
105
  $wpbc_all_translations[] = __('Check this box, if you want to %sre-check if the selected dates available during submitting booking%s.', 'booking');
106
  $wpbc_all_translations[] = __('This feature useful to prevent double booking of the same date(s) or time(s), if several visitors try to book the same date(s) in same calendar during the same time.', 'booking');
761
  $wpbc_all_translations[] = __('Check this box to display the available number of booking resources with a tooltip, when mouse hovers over each day on the calendar(s).', 'booking');
762
  $wpbc_all_translations[] = __('Availability Title', 'booking');
763
  $wpbc_all_translations[] = __('Type your %savailability%s description', 'booking');
 
 
764
  $wpbc_all_translations[] = __('Auto-cancel bookings', 'booking');
765
  $wpbc_all_translations[] = __('Auto Cancel all pending bookings for the specific date(s), if some booking is approved for these date(s)', 'booking');
766
  $wpbc_all_translations[] = __('Warning!!! After you approved the specific booking(s), all your pending bookings of the same booking resource as an approved booking for the dates, which are intersect with dates of approved booking, will be automatically canceled!', 'booking');
1719
  $wpbc_all_translations[] = __('Set Early / Late Booking Amount', 'booking');
1720
  $wpbc_all_translations[] = __('Set Early / Late booking discount', 'booking');
1721
  $wpbc_all_translations[] = __('Early / Late', 'booking');
1722
+ $wpbc_all_translations[] = __('Show a booking form, availability calendar or other elements from Booking Calendar plugin.', 'booking');
1723
+ $wpbc_all_translations[] = __('Configure Booking Calendar Block', 'booking');
1724
+ $wpbc_all_translations[] = __('Click to Preview Block', 'booking');
1725
+ $wpbc_all_translations[] = __('Visible months number', 'booking');
1726
+ $wpbc_all_translations[] = __('Start month', 'booking');
1727
+ $wpbc_all_translations[] = __('Custom booking form', 'booking');
1728
+ $wpbc_all_translations[] = __('Unavailable dates from other booking resources', 'booking');
1729
+ $wpbc_all_translations[] = __('Availability Calendar', 'booking');
1730
+ $wpbc_all_translations[] = __('Timeline', 'booking');
1731
+ $wpbc_all_translations[] = __('Booking resource(s)', 'booking');
1732
+ $wpbc_all_translations[] = __('Show from/to', 'booking');
1733
+ $wpbc_all_translations[] = __('All booking resources', 'booking');
1734
+ $wpbc_all_translations[] = __('Selection of Resources', 'booking');
1735
+ $wpbc_all_translations[] = __('Selected booking resource (by default)', 'booking');
1736
+ $wpbc_all_translations[] = __('Title of first option in list', 'booking');
1737
+ $wpbc_all_translations[] = __('Custom booking form for all booking resources', 'booking');
1738
+ $wpbc_all_translations[] = __('Booking Form (without calendar)', 'booking');
1739
+ $wpbc_all_translations[] = __('Date for submit booking', 'booking');
1740
+ $wpbc_all_translations[] = __('Search Availability form', 'booking');
1741
+ $wpbc_all_translations[] = __('Show search results on other page', 'booking');
1742
+ $wpbc_all_translations[] = __('Search results page must have this shortcode', 'booking');
1743
+ $wpbc_all_translations[] = __('Show search results in the same page', 'booking');
1744
+ $wpbc_all_translations[] = __('Search Results Title', 'booking');
1745
+ $wpbc_all_translations[] = __('Title, if no search results', 'booking');
1746
+ $wpbc_all_translations[] = __('Search in booking resources of WP users', 'booking');
1747
+ $wpbc_all_translations[] = __('Show search results on this page, after redirection from search form at other page.', 'booking');
1748
+ $wpbc_all_translations[] = __('System Block', 'booking');
1749
+ $wpbc_all_translations[] = __('Booking Calendar Editing', 'booking');
1750
+ $wpbc_all_translations[] = __('This block required for ability to edit, cancel the booking by visitor, who made the booking, or for ability to show payment form, after sending payment request.', 'booking');
1751
+ $wpbc_all_translations[] = __('Link to this page must be defined', 'booking');
1752
+ $wpbc_all_translations[] = __('at this option', 'booking');
1753
+ $wpbc_all_translations[] = __('You can not open this page directly. Please, use links in ', 'booking');
1754
+ $wpbc_all_translations[] = __('If you open this page directly, then you will see this error', 'booking');
1755
+ $wpbc_all_translations[] = __('Customer Bookings Listing', 'booking');
1756
+ $wpbc_all_translations[] = __('Visitors of your website, can view previous (own) bookings, by clicking on secret link in email, which is sending after booking created.', 'booking');
1757
+ $wpbc_all_translations[] = __('Show Info of Booking Resource', 'booking');
1758
+ $wpbc_all_translations[] = __('Click to edit', 'booking');
1759
+ $wpbc_all_translations[] = __('This is not real preview. Its configuration block of "Booking Calendar".', 'booking');
1760
  }
core/lib/wpdev-booking-widget.php CHANGED
@@ -44,7 +44,7 @@ class BookingWidget extends WP_Widget {
44
 
45
  if ($booking_widget_title != '') echo $before_title . htmlspecialchars_decode($booking_widget_title) . $after_title;
46
 
47
- echo "<div class='widget_wpdev_booking months_num_in_row_1'>";
48
  if ($booking_widget_show == 'booking_form') {
49
  // do_action('wpdev_bk_add_form', $booking_widget_type , $booking_widget_calendar_count);
50
  $my_booking_form_name = apply_bk_filter('wpbc_get_default_custom_form', 'standard', $booking_widget_type);
44
 
45
  if ($booking_widget_title != '') echo $before_title . htmlspecialchars_decode($booking_widget_title) . $after_title;
46
 
47
+ echo "<div class='widget_wpdev_booking wpdevelop months_num_in_row_1'>"; //FixIn: 8.4.2.3
48
  if ($booking_widget_show == 'booking_form') {
49
  // do_action('wpdev_bk_add_form', $booking_widget_type , $booking_widget_calendar_count);
50
  $my_booking_form_name = apply_bk_filter('wpbc_get_default_custom_form', 'standard', $booking_widget_type);
core/wpbc-constants.php CHANGED
@@ -26,8 +26,8 @@ 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' ); }
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
33
 
26
  ////////////////////////////////////////////////////////////
27
  // SYSTEM CONSTANTS //////////////
28
  ////////////////////////////////////////////////////////////
29
+ if ( ! defined( 'WP_BK_VERSION_NUM' ) ) { define( 'WP_BK_VERSION_NUM', '8.4.2' ); }
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
33
 
core/wpbc-dates.php CHANGED
@@ -298,7 +298,7 @@ if ( false ) //2018-04-21 - if use times in paid so comment it
298
 
299
 
300
  /**
301
- * Change Dates format from SQL Dates to predefined settings Date/Time format
302
  *
303
  * @param string $dates_in_sql_format - '2015-02-29 00:00:00, 2015-02-30 00:00:00'
304
  * @return string - Formated Dates to show for visitor
@@ -373,6 +373,30 @@ function wpbc_time_slot_in_format( $timeslot, $time_format = false ){
373
  }
374
 
375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
376
  /**
377
  * Get dates from DB of specific booking
378
  *
298
 
299
 
300
  /**
301
+ * Change Dates format from SQL Dates to predefined settings Date/Time format
302
  *
303
  * @param string $dates_in_sql_format - '2015-02-29 00:00:00, 2015-02-30 00:00:00'
304
  * @return string - Formated Dates to show for visitor
373
  }
374
 
375
 
376
+ //FixIn: 8.4.2.11
377
+ /**
378
+ * Convert timeslot "10:00" to specfic timeformat, like "10:00 AM"
379
+ * @param string $timeslot - "10:00"
380
+ * @param string $time_format = "g:i A"
381
+ */
382
+ function wpbc_time_in_format( $timeslot, $time_format = false ){
383
+
384
+ if ( empty( $time_format ) ) {
385
+ $time_format = get_bk_option( 'booking_time_format' ); // get from Booking Calendar
386
+ if ( empty( $time_format ) ) {
387
+ $time_format = get_option( 'time_format' ); // Get WordPress default
388
+ }
389
+ }
390
+
391
+ $timeslot = trim( $timeslot );
392
+ $s_tm = explode( ':', $timeslot );
393
+
394
+ $s_tm = date_i18n( $time_format, mktime( intval( $s_tm[0] ), intval( $s_tm[1] ) ) );
395
+
396
+ return $s_tm;
397
+ }
398
+
399
+
400
  /**
401
  * Get dates from DB of specific booking
402
  *
core/wpbc-functions.php CHANGED
@@ -434,6 +434,18 @@ function wpbc_replace_params_for_booking_func( $replace, $booking_id, $bktype, $
434
  if ( ! isset( $replace['modification_seconds'] ) ) {
435
  $replace['modification_seconds'] = date_i18n( 's', strtotime( $modification_date ) );
436
  }
 
 
 
 
 
 
 
 
 
 
 
 
437
  // $booking_id
438
 
439
  //FixIn: 8.2.1.25
@@ -446,7 +458,7 @@ function wpbc_replace_params_for_booking_func( $replace, $booking_id, $bktype, $
446
  }
447
  }
448
  }
449
-
450
  return $replace;
451
  }
452
  add_filter( 'wpbc_replace_params_for_booking', 'wpbc_replace_params_for_booking_func', 10, 4 );
@@ -990,11 +1002,11 @@ $is_old = false;
990
  if ( ($type_name == 'visitors') || ($type == 'visitors') ) $visitors_count = $value;
991
 
992
  //FixIn: TimeFreeGenerator //FixIn: 8.2.1.26 - only for Booking Calendar Free version show times in AM/PM fomrat or other depend from time format at the WordPress > Settings > General page.
993
- if ( ! class_exists('wpdev_bk_personal') ) {
994
- if ( ( $type_name == 'rangetime' ) || ( $type == 'rangetime' ) ) {
995
- $value = wpbc_time_slot_in_format( $value );
996
- }
997
- }
998
 
999
  if ($type == 'checkbox') {
1000
  //debuge($type_name , $type, $element_name, $value);
@@ -1040,8 +1052,19 @@ $is_old = false;
1040
 
1041
  $check_box_selected_items[$type_name] = $current_checkbox_value;
1042
  } else {
1043
- $all_fields_array[ str_replace('[]','',(string) $element_name) ] = $value;
1044
- $all_fields_array_without_types[ substr( str_replace('[]','',(string) $element_name), 0 , -1*strlen( $bktype ) ) ] = $value;
 
 
 
 
 
 
 
 
 
 
 
1045
  }
1046
  $is_skip_replace = false; //FixIn: 7.0.1.45
1047
  if ( ( $type == 'radio' ) && empty( $value ) )
@@ -1050,7 +1073,7 @@ $is_old = false;
1050
  $booking_form_show = str_replace( '['. $type_name .']', $value ,$booking_form_show);
1051
  }
1052
 
1053
-
1054
  if (! isset($all_fields_array_without_types[ 'booking_resource_id' ])) $all_fields_array_without_types[ 'booking_resource_id' ] = $bktype;
1055
  if (! isset($all_fields_array_without_types[ 'resource_id' ])) $all_fields_array_without_types[ 'resource_id' ] = $bktype;
1056
  if (! isset($all_fields_array_without_types[ 'type_id' ])) $all_fields_array_without_types[ 'type_id' ] = $bktype;
434
  if ( ! isset( $replace['modification_seconds'] ) ) {
435
  $replace['modification_seconds'] = date_i18n( 's', strtotime( $modification_date ) );
436
  }
437
+
438
+ //FixIn: 8.4.2.11
439
+ if ( isset( $replace['rangetime'] ) ) {
440
+ $replace['rangetime'] = wpbc_time_slot_in_format( $replace['rangetime'] );
441
+ }
442
+ if ( isset( $replace['starttime'] ) ) {
443
+ $replace['starttime'] = wpbc_time_in_format( $replace['starttime'] );
444
+ }
445
+ if ( isset( $replace['endtime'] ) ) {
446
+ $replace['endtime'] = wpbc_time_in_format( $replace['endtime'] );
447
+ }
448
+
449
  // $booking_id
450
 
451
  //FixIn: 8.2.1.25
458
  }
459
  }
460
  }
461
+ //debuge($replace);
462
  return $replace;
463
  }
464
  add_filter( 'wpbc_replace_params_for_booking', 'wpbc_replace_params_for_booking_func', 10, 4 );
1002
  if ( ($type_name == 'visitors') || ($type == 'visitors') ) $visitors_count = $value;
1003
 
1004
  //FixIn: TimeFreeGenerator //FixIn: 8.2.1.26 - only for Booking Calendar Free version show times in AM/PM fomrat or other depend from time format at the WordPress > Settings > General page.
1005
+ // if ( ! class_exists('wpdev_bk_personal') ) { //FixIn: 8.4.2.7
1006
+ // if ( ( $type_name == 'rangetime' ) || ( $type == 'rangetime' ) ) { //FixIn: 8.4.2.11
1007
+ // $value = wpbc_time_slot_in_format( $value );
1008
+ // }
1009
+ // }
1010
 
1011
  if ($type == 'checkbox') {
1012
  //debuge($type_name , $type, $element_name, $value);
1052
 
1053
  $check_box_selected_items[$type_name] = $current_checkbox_value;
1054
  } else {
1055
+
1056
+ //FixIn: 8.4.2.11
1057
+ $all_fields_array_without_types[ substr( str_replace('[]','',(string) $element_name), 0 , -1*strlen( $bktype ) ) ] = $value;
1058
+ /**
1059
+ ['_all_'] => $all_fields_array, CONVERT to " AM/PM "
1060
+ ['_all_fields_'] => $all_fields_array_without_types => in " 24 hour " format - for ability correct calculate Booking > Resources > Advanced cost page.
1061
+ */
1062
+ if ( ( $type_name == 'rangetime' ) || ( $type == 'rangetime' ) ) {
1063
+ $value = wpbc_time_slot_in_format( $value );
1064
+ }
1065
+ $all_fields_array[ str_replace('[]','',(string) $element_name) ] = $value;
1066
+ //FixIn: 8.4.2.11
1067
+
1068
  }
1069
  $is_skip_replace = false; //FixIn: 7.0.1.45
1070
  if ( ( $type == 'radio' ) && empty( $value ) )
1073
  $booking_form_show = str_replace( '['. $type_name .']', $value ,$booking_form_show);
1074
  }
1075
 
1076
+ //debuge($all_fields_array,$all_fields_array_without_types);
1077
  if (! isset($all_fields_array_without_types[ 'booking_resource_id' ])) $all_fields_array_without_types[ 'booking_resource_id' ] = $bktype;
1078
  if (! isset($all_fields_array_without_types[ 'resource_id' ])) $all_fields_array_without_types[ 'resource_id' ] = $bktype;
1079
  if (! isset($all_fields_array_without_types[ 'type_id' ])) $all_fields_array_without_types[ 'type_id' ] = $bktype;
js/client.js CHANGED
@@ -578,6 +578,9 @@ function setReservedSelectedDates( bk_type ){
578
  // Check fields at form and then send request
579
  function mybooking_submit( submit_form , bk_type, wpdev_active_locale){
580
 
 
 
 
581
 
582
  //Show message if no selected days
583
  if (document.getElementById('date_booking' + bk_type).value == '') {
@@ -965,10 +968,10 @@ function send_ajax_submit(bk_type,formdata,captcha_chalange,user_captcha,is_send
965
 
966
  // Show Error Message in Booking Form at Front End
967
  function showErrorMessage( element , errorMessage) {
968
-
969
- if(typeof( bk_form_step_click ) == 'function') {
970
- bk_form_step_click(); // rollback to 1st step, if system will show warning and booking form is using this customization: in the Exmaple #2 here: https://wpbookingcalendar.com/faq/customize-booking-form-for-having-several-steps-of-reservation/
971
- }
972
 
973
  makeScroll( element );
974
 
@@ -1015,10 +1018,10 @@ function showErrorMessage( element , errorMessage) {
1015
  * @param {type} message_type "" | "alert-danger" | "alert-success" | "alert-info"
1016
  */
1017
  function showMessageUnderElement( element , errorMessage , message_type) {
1018
-
1019
- if(typeof( bk_form_step_click ) == 'function') {
1020
- bk_form_step_click(); // rollback to 1st step, if system will show warning and booking form is using this customization: in the Exmaple #2 here: https://wpbookingcalendar.com/faq/customize-booking-form-for-having-several-steps-of-reservation/
1021
- }
1022
 
1023
  makeScroll( element );
1024
 
@@ -1169,3 +1172,164 @@ function wpbc_unselect_all_days( bk_type ){ //FixIn: 8.0.1.2
1169
  jQuery.datepick._updateDatepick( inst );
1170
  }
1171
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
578
  // Check fields at form and then send request
579
  function mybooking_submit( submit_form , bk_type, wpdev_active_locale){
580
 
581
+ //FixIn: 8.4.0.2
582
+ var is_error = wpbc_check_errors_in_booking_form( bk_type );
583
+ if ( is_error ) { return false; }
584
 
585
  //Show message if no selected days
586
  if (document.getElementById('date_booking' + bk_type).value == '') {
968
 
969
  // Show Error Message in Booking Form at Front End
970
  function showErrorMessage( element , errorMessage) {
971
+ //FixIn: 8.4.0.2
972
+ // if(typeof( bk_form_step_click ) == 'function') {
973
+ // bk_form_step_click(); // rollback to 1st step, if system will show warning and booking form is using this customization: in the Exmaple #2 here: https://wpbookingcalendar.com/faq/customize-booking-form-for-having-several-steps-of-reservation/
974
+ // }
975
 
976
  makeScroll( element );
977
 
1018
  * @param {type} message_type "" | "alert-danger" | "alert-success" | "alert-info"
1019
  */
1020
  function showMessageUnderElement( element , errorMessage , message_type) {
1021
+ //FixIn: 8.4.0.2
1022
+ // if(typeof( bk_form_step_click ) == 'function') {
1023
+ // bk_form_step_click(); // rollback to 1st step, if system will show warning and booking form is using this customization: in the Exmaple #2 here: https://wpbookingcalendar.com/faq/customize-booking-form-for-having-several-steps-of-reservation/
1024
+ // }
1025
 
1026
  makeScroll( element );
1027
 
1172
  jQuery.datepick._updateDatepick( inst );
1173
  }
1174
  }
1175
+
1176
+
1177
+
1178
+ //FixIn: 8.4.0.2
1179
+ /**
1180
+ * Check errors in booking form fields, and show warnings if some errors exist.
1181
+ * Check errors, like not selected dates or not filled requred form fields, or not correct entering email or phone fields, etc...
1182
+ *
1183
+ * @param bk_type int (ID of booking resource)
1184
+ */
1185
+ function wpbc_check_errors_in_booking_form( bk_type ) {
1186
+
1187
+ var is_error_in_field = false; // By default all is good - no error
1188
+
1189
+ var my_form = jQuery( '#booking_form' + bk_type );
1190
+
1191
+ if ( my_form.length ) {
1192
+
1193
+ // Pseudo-selector that get form elements <input , <textarea , <select, <button...
1194
+ my_form.find( ':input' ).each( function( index, el ) {
1195
+
1196
+ // Skip some elements
1197
+ var skip_elements = [ 'hidden', 'button' ];
1198
+
1199
+ if ( -1 == skip_elements.indexOf( jQuery( el ).attr( 'type' ) ) ){
1200
+
1201
+ // Check Calendar Dates Selection
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
+ }
1209
+ }
1210
+
1211
+ // Check only visible elements at this step
1212
+ if ( jQuery( el ).is( ':visible' ) ){
1213
+ // console.log( '|id, type, val, visible|::', jQuery( el ).attr( 'name' ), '|' + jQuery( el ).attr( 'type' ) + '|', jQuery( el ).val(), jQuery( el ).is( ':visible' ) );
1214
+
1215
+ // Is Required
1216
+ if ( jQuery( el ).hasClass( 'wpdev-validates-as-required' ) ){
1217
+
1218
+ // Checkboxes
1219
+ if ( 'checkbox' == jQuery( el ).attr( 'type' ) ){
1220
+
1221
+ if ( !jQuery( el ).is( ':checked' ) ){
1222
+ showErrorMessage( el, message_verif_requred_for_check_box );
1223
+ is_error_in_field = true; // Error
1224
+ }
1225
+
1226
+ // Radio boxes
1227
+ } else if ( 'radio' == jQuery( el ).attr( 'type' ) ){
1228
+
1229
+ if ( !jQuery( ':radio[name="' + jQuery( el ).attr( 'name' ) + '"]', my_form ).is( ':checked' ) ){
1230
+ showErrorMessage( el, message_verif_requred_for_radio_box );
1231
+ is_error_in_field = true; // Error
1232
+ }
1233
+
1234
+ // Other elements
1235
+ } else {
1236
+
1237
+ var inp_value = jQuery( el ).val();
1238
+
1239
+ if ( '' === jQuery.trim( inp_value ) ){
1240
+ showErrorMessage( el, message_verif_requred );
1241
+ is_error_in_field = true; // Error
1242
+ }
1243
+ }
1244
+ }
1245
+
1246
+ // Validate Email
1247
+ if ( jQuery( el ).hasClass( 'wpdev-validates-as-email' ) ){
1248
+ var inp_value = jQuery( el ).val();
1249
+ inp_value = inp_value.replace( /^\s+|\s+$/gm, '' ); // Trim white space //FixIn: 5.4.5
1250
+ var reg = /^([A-Za-z0-9_\-\.\+])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,})$/;
1251
+ if ( (inp_value != '') && (reg.test( inp_value ) == false) ){
1252
+ showErrorMessage( el, message_verif_emeil );
1253
+ is_error_in_field = true; // Error
1254
+ }
1255
+ }
1256
+
1257
+ // Validate For digit entering - for example for - Phone
1258
+ // <p>Digit Field:<br />[text* dig_field class:validate_as_digit] </p>
1259
+ // <p>Phone:<br />[text* phone class:validate_digit_8] </p>
1260
+
1261
+ var classList = jQuery( el ).attr( 'class' );
1262
+
1263
+ if ( classList ){
1264
+
1265
+ classList = classList.split( /\s+/ );
1266
+
1267
+ jQuery.each( classList, function ( cl_index, cl_item ){
1268
+
1269
+ ////////////////////////////////////////////////////////////////////////////////////////////
1270
+
1271
+ // Validate field value as "Date" [CSS class - 'validate_as_digit']
1272
+ if ( 'validate_as_date' === cl_item ) {
1273
+
1274
+ // Valid values: 09-25-2018, 09/25/2018, 09-25-2018, 31-9-1918 --- m/d/Y, m.d.Y, m-d-Y, d/m/Y, d.m.Y, d-m-Y
1275
+ var regex = new RegExp( '^[0-3]?\\d{1}[\\/\\.\\-]+[0-3]?\\d{1}[\\/\\.\\-]+[0-2]+\\d{3}$' ); // Check for Date 09/25/2018
1276
+ var message_verif_phone = 'This field must be valid date like this ' + '09/25/2018';
1277
+ var inp_value = jQuery( el ).val();
1278
+
1279
+ if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
1280
+ showErrorMessage( el, message_verif_phone );
1281
+ is_error_in_field = true; // Error
1282
+ }
1283
+ }
1284
+
1285
+ ////////////////////////////////////////////////////////////////////////////////////////////
1286
+
1287
+ // Validate field value as "DIGIT" [CSS class - 'validate_as_digit']
1288
+ if ( 'validate_as_digit' === cl_item ) {
1289
+
1290
+ var regex = new RegExp( '^[0-9]+\\.?[0-9]*$' ); // Check for digits
1291
+ var message_verif_phone = 'This field must contain only digits';
1292
+ var inp_value = jQuery( el ).val();
1293
+
1294
+ if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
1295
+ showErrorMessage( el, message_verif_phone );
1296
+ is_error_in_field = true; // Error
1297
+ }
1298
+ }
1299
+
1300
+ ////////////////////////////////////////////////////////////////////////////////////////////
1301
+
1302
+ // Validate field value as "Phone" number or any other valid number wth specific number of digits [CSS class - 'validate_digit_8' || 'validate_digit_10' ]
1303
+ var is_validate_digit = cl_item.substring( 0, 15 );
1304
+
1305
+ // Check if class start with 'validate_digit_'
1306
+ if ( 'validate_digit_' === is_validate_digit ){
1307
+
1308
+ // Get number of digit in class: validate_digit_8 => 8 or validate_digit_10 => 10
1309
+ var digits_to_check = parseInt( cl_item.substring( 15 ) );
1310
+
1311
+ // Check about any errors in
1312
+ if ( !isNaN( digits_to_check ) ){
1313
+
1314
+ var regex = new RegExp( '^\\d{' + digits_to_check + '}$' ); // We was valid it as parseInt - only integer variable - digits_to_check
1315
+ var message_verif_phone = 'This field must contain ' + digits_to_check + ' digits';
1316
+ var inp_value = jQuery( el ).val();
1317
+
1318
+ if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
1319
+ showErrorMessage( el, message_verif_phone );
1320
+ is_error_in_field = true; // Error
1321
+ }
1322
+ }
1323
+ }
1324
+
1325
+ ////////////////////////////////////////////////////////////////////////////////////////////
1326
+
1327
+ });
1328
+ }
1329
+ }
1330
+ }
1331
+ } );
1332
+
1333
+ }
1334
+ return is_error_in_field;
1335
+ }
js/wpbc-gutenberg.js CHANGED
@@ -281,8 +281,9 @@ console.log( 'WPBC-Gb :: wpbc_send_text_to_gutenberg' , shortcode_text, block_se
281
  //Its does not work for automatic generating "Edit" event :((( , so we make some workarround in Edit block event
282
  jQuery( 'div[data-block="' + block_section_id + '"] .wpbc_gb_text_shortcode' ).focus().trigger( 'change' );
283
 
284
- jQuery( 'div[data-block="' + block_section_id + '"]' ).parent().before(
285
- '<div class="editor-block-list__block wpbc-gutenberg-update-view" style="cursor: pointer;">' +
 
286
  '<a href="javascript:void" class="button wpbc-gutenberg-update-preview-btn" ' +
287
  '>' + wp.i18n.__( 'Click to Preview Block' ) + '</a></div>'
288
  );
281
  //Its does not work for automatic generating "Edit" event :((( , so we make some workarround in Edit block event
282
  jQuery( 'div[data-block="' + block_section_id + '"] .wpbc_gb_text_shortcode' ).focus().trigger( 'change' );
283
 
284
+ //FixIn: 8.4.2.10
285
+ jQuery( 'div[data-block="' + block_section_id + '"]' ).parent().parent().before(
286
+ '<div class="editor-block-list__block wpbc-gutenberg-update-view" style="cursor: pointer;text-align: center;">' +
287
  '<a href="javascript:void" class="button wpbc-gutenberg-update-preview-btn" ' +
288
  '>' + wp.i18n.__( 'Click to Preview Block' ) + '</a></div>'
289
  );
languages/booking-ar_SA.mo CHANGED
Binary file
languages/booking-be_BY.mo CHANGED
Binary file
languages/booking-bg_BG.mo CHANGED
Binary file
languages/booking-ca.mo CHANGED
Binary file
languages/booking-cs_CZ.mo CHANGED
Binary file
languages/booking-da_DK.mo CHANGED
Binary file
languages/booking-de_DE.mo CHANGED
Binary file
languages/booking-el.mo CHANGED
Binary file
languages/booking-es_ES.mo CHANGED
Binary file
languages/booking-fi.mo CHANGED
Binary file
languages/booking-fr_FR.mo CHANGED
Binary file
languages/booking-gl_ES.mo CHANGED
Binary file
languages/booking-he_IL.mo CHANGED
Binary file
languages/booking-hr.mo CHANGED
Binary file
languages/booking-hu_HU.mo CHANGED
Binary file
languages/booking-it_IT.mo CHANGED
Binary file
languages/booking-nb_NO.mo CHANGED
Binary file
languages/booking-nl_NL.mo CHANGED
Binary file
languages/booking-pl_PL.mo CHANGED
Binary file
languages/booking-pt_BR.mo CHANGED
Binary file
languages/booking-pt_PT.mo CHANGED
Binary file
languages/booking-ru_RU.mo CHANGED
Binary file
languages/booking-sk_SK.mo CHANGED
Binary file
languages/booking-sl_SI.mo CHANGED
Binary file
languages/booking-sv_SE.mo CHANGED
Binary file
languages/booking-th_TH.mo CHANGED
Binary file
languages/booking-tr_TR.mo CHANGED
Binary file
languages/booking-uk_UK.mo CHANGED
Binary file
languages/booking-zh_CN.mo CHANGED
Binary file
languages/booking-zh_TW.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.0
8
- Stable tag: 8.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -167,7 +167,8 @@ Please see [FAQ](https://wpbookingcalendar.com/faq/).
167
  = Support Languages =
168
 
169
  - English
170
- - German [97% Completed]
 
171
  - Dutch [97% Completed]
172
  - Danish [97% Completed]
173
  - Greek [97% Completed]
@@ -175,7 +176,6 @@ Please see [FAQ](https://wpbookingcalendar.com/faq/).
175
  - Hungarian [97% Completed]
176
  - Polish [97% Completed]
177
  - Turkish [97% Completed]
178
- - Finnish [97% Completed]
179
  - Italian [96% Completed]
180
  - Swedish [96% Completed]
181
  - Spanish [94% Completed]
@@ -187,12 +187,12 @@ Please see [FAQ](https://wpbookingcalendar.com/faq/).
187
  - Norwegian [89% Completed]
188
  - Brazilian Portuguese [89% Completed]
189
  - Hebrew [89% Completed]
190
- - Ukrainian [89% Completed]
191
  - Chinese [88% Completed]
192
  - Chinese (Taiwan) [89% Completed]
193
  - French [89% Completed]
194
- - Czech [76% Completed]
195
- - Slovak [76% Completed]
196
  - Croatian [76% Completed]
197
  - Catalan [75% Completed]
198
  - Arabic [75% Completed]
@@ -225,6 +225,34 @@ 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 =
229
  - Changes in **all** versions:
230
  * **New**. Support Gutenberg editor. New Booking Calendar blocks for integration with new Gutenberg editor in posts and pages. ( 8.3.3.99 )
@@ -465,5 +493,5 @@ Please see [Video Guides](https://wpbookingcalendar.com/help/).
465
  For more information, see the [full release notes](https://wpbookingcalendar.com/changelog/).
466
 
467
  == Upgrade Notice ==
468
- = 8.3 =
469
- Free version: Timeslots bookings. Simple configuration of timeslots selection in booking form. Set pending days as available in booking form. Paid versions: Early booking / Last minute bookings. Apply discount, if difference between "today" and "check in" day MORE / LESS than X days. Many other improvements.
5
  Requires at least: 4.0
6
  Requires PHP: 5.2.4
7
  Tested up to: 5.0
8
+ Stable tag: 8.4.2
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
167
  = Support Languages =
168
 
169
  - English
170
+ - German [99% Completed]
171
+ - Finnish [99% Completed]
172
  - Dutch [97% Completed]
173
  - Danish [97% Completed]
174
  - Greek [97% Completed]
176
  - Hungarian [97% Completed]
177
  - Polish [97% Completed]
178
  - Turkish [97% Completed]
 
179
  - Italian [96% Completed]
180
  - Swedish [96% Completed]
181
  - Spanish [94% Completed]
187
  - Norwegian [89% Completed]
188
  - Brazilian Portuguese [89% Completed]
189
  - Hebrew [89% Completed]
190
+ - Ukrainian [88% Completed]
191
  - Chinese [88% Completed]
192
  - Chinese (Taiwan) [89% Completed]
193
  - French [89% Completed]
194
+ - Czech [75% Completed]
195
+ - Slovak [75% Completed]
196
  - Croatian [76% Completed]
197
  - Catalan [75% Completed]
198
  - Arabic [75% Completed]
225
  13. **Time Slots**. Simple configuration of **time slots** selection in booking form.
226
 
227
  == Changelog ==
228
+ = 8.4.2 =
229
+ - Changes in **all** versions:
230
+ * **Translation**. Finnish translation [99% completed] by Tero Janhunen
231
+ * **Translation**. German translation [99% completed] by Martin Klewer
232
+ * **Support** Fix compatibility with Gutenberg 4.1- 4.3( or newer ). Before this having JavaScript error " ReferenceError: jQuery is not defined" at edit post page, because of weird behavior with 'edit_form_advanced' hook, while activated Gutenberg. (8.4.2.10)
233
+ * **Support** Additional help info about import .ics feed by set up CRON script at your server for "pseudo" automatic import of events. (8.4.2.12)
234
+ * **Fix** issue of checkboxes and radio buttons height in new Firefox updates in admin panel, otherwise sometimes, there exist weird artefact (8.4.2.6)
235
+ * **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)
236
+ - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
237
+ * **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)*
238
+ * **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)*
239
+ * **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)
240
+ * **Improvement** Add Notes section of booking to print layout during printing. (8.4.2.2) *( Business Small/Medium/Large, MultiUser)*
241
+ * **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)*
242
+ * **Fix** issue of not changing booking HASH during deleting booking by user, who made the booking. (8.4.2.4) *(Personal Business Small/Medium/Large, MultiUser)*
243
+ * **Fix** issue of showing times popover hint in some themes in widgetes (8.4.2.3) *(Business Small/Medium/Large, MultiUser)*
244
+ * **Fix** issue of showing currency symbols in booking pipeline in Timeline and in Calendar Overview pages, for example, while showing additional cost hints or booking cost in booking pipeline (8.4.2.8) *(Business Small/Medium/Large, MultiUser)*
245
+ * **Fix** issue of not ability to add additional cost for the rangetime, if times format was set as AM/PM (8.4.2.11) *(Business Medium/Large, MultiUser)*
246
+ * **Under Hood** Ability to ncustomize of showing cost/days hints, just after first click on days, if activated "range days selection mode using 2 mouse clicks". You can customiaze it at ../inc/js/biz_m.js file / by replacing is_show_cost_after_first_click = ! true; to is_show_cost_after_first_click = true; / (8.4.2.6)
247
+
248
+ = 8.4.1 =
249
+ - Changes in **Personal / Business Small / Business Medium / Business Large / MultiUser** versions:
250
+ * **New**. Ability to validate booking field as Phone number, or even any Digit number field that support only specific number of digits to enter. Its require to configure shortcode in booking form field with CSS class like validate_digit_8 or validate_digit_10 Example: [text phone class:validate_digit_8] (8.4.0.2) *(Personal Business Small/Medium/Large, MultiUser)*
251
+ * **New**. Ability to validate field as Digit number. Configuration at Booking > Settings > Form page require CSS class for field shortcode: validate_as_digit Example: [text dignum class:validate_as_digit] (8.4.0.2) *(Personal Business Small/Medium/Large, MultiUser)*
252
+ * **New**. Ability to validate field as Date. Configuration at Booking > Settings > Form page require CSS class for field shortcode: validate_as_date Example: [text mydate class:validate_as_date] Valid values: 09-25-2018, 09/25/2018, 09-25-2018, 31-9-1918 e.g: m/d/Y, m.d.Y, m-d-Y, d/m/Y, d.m.Y, d-m-Y (8.4.0.2) *(Personal Business Small/Medium/Large, MultiUser)*
253
+ * **Improvement** More clever workflow of checking required fields and other form fields validation, if using "Wizard (several steps)" form template. Showing warning messages, just after clicking Next or Previous step buttons, instead of showing theme at Submit of booking form. (8.4.0.2) *(Personal Business Small/Medium/Large, MultiUser)*
254
+ * **Fix**. Showing Stripe payment form during payment request. (Update 8.4 had issue of not ability to show Stripe payment form during payment request) (8.4.0.3) *( Business Small/Medium/Large, MultiUser)*
255
+
256
  = 8.4 =
257
  - Changes in **all** versions:
258
  * **New**. Support Gutenberg editor. New Booking Calendar blocks for integration with new Gutenberg editor in posts and pages. ( 8.3.3.99 )
493
  For more information, see the [full release notes](https://wpbookingcalendar.com/changelog/).
494
 
495
  == Upgrade Notice ==
496
+ = 8.4 =
497
+ Support Gutenberg editor. New Booking Calendar blocks for integration with new Gutenberg editor in posts and pages.
wpdev-booking.php CHANGED
@@ -7,7 +7,7 @@ Author: wpdevelop, oplugins
7
  Author URI: https://wpbookingcalendar.com/
8
  Text Domain: booking
9
  Domain Path: /languages/
10
- Version: 8.4
11
  */
12
 
13
  /* Copyright 2009 - 2018 www.wpbookingcalendar.com (email: info@wpbookingcalendar.com),
7
  Author URI: https://wpbookingcalendar.com/
8
  Text Domain: booking
9
  Domain Path: /languages/
10
+ Version: 8.4.2
11
  */
12
 
13
  /* Copyright 2009 - 2018 www.wpbookingcalendar.com (email: info@wpbookingcalendar.com),