PluginProbe
Booking Calendar / 11.4.1
Booking Calendar v11.4.1
11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 All 204 releases
booking / js / client.js

client.js in Booking Calendar 11.4.1, at js/client.js

525 lines 20.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1
2 // Hint labels inside of input boxes.
3 jQuery( document ).ready(
4 function () {
5
6 jQuery( 'div.inside_hint' ).on(
7 'click',
8 function () {
9 jQuery( this ).css( 'visibility', 'hidden' ).siblings( '.has-inside-hint' ).trigger( 'focus' ); // FixIn: 8.7.11.12.
10 }
11 );
12
13 jQuery( 'input.has-inside-hint' ).on(
14 'blur',
15 function () {
16 if ( '' === this.value ) {
17 jQuery( this ).siblings( '.inside_hint' ).css( 'visibility', '' ); // FixIn: 8.7.11.12.
18 }
19 }
20 ).on(
21 'focus',
22 function () {
23 jQuery( this ).siblings( '.inside_hint' ).css( 'visibility', 'hidden' ); // FixIn: 8.7.11.12.
24 }
25 );
26
27 jQuery( '.booking_form_div input[type=button]' ).prop( "disabled", false );
28 }
29 );
30
31
32 // FixIn: 8.4.0.2.
33 /**
34 * Check errors in booking form fields, and show warnings if some errors exist.
35 * Check errors, like not selected dates or not filled requred form fields, or not correct entering email or phone
36 * fields, etc...
37 *
38 * @param bk_type int (ID of booking resource)
39 */
40 function wpbc_check_errors_in_booking_form( bk_type ) {
41
42 var is_error_in_field = false; // By default, all is good - no error.
43
44 var my_form = jQuery( '#booking_form' + bk_type );
45
46 if ( my_form.length ) {
47
48 var fields_with_errors_arr = [];
49
50 // Pseudo-selector that get form elements <input , <textarea , <select, <button...
51 my_form.find( ':input' ).each( function( index, el ) {
52
53 // Skip some elements
54 var skip_elements = [ 'hidden', 'button' ];
55
56 if ( -1 == skip_elements.indexOf( jQuery( el ).attr( 'type' ) ) ){
57
58 if ( '1' === String( jQuery( el ).attr( 'data-wpbc-booking-submit-ignore' ) || '' ) ) {
59 return true;
60 }
61
62 // Check Calendar Dates Selection
63 if ( ( 'date_booking' + bk_type ) == jQuery( el ).attr( 'name' ) ) {
64
65 // Show Warning only if the calendar visible ( we are at step with calendar)
66 if (
67 ( ( jQuery( '#calendar_booking' + bk_type ).is( ':visible' ) ) && ( '' == jQuery( el ).val() ) )
68 && ( wpbc_get_arr_of_selected_additional_calendars( bk_type ).length == 0 ) // FixIn: 8.5.2.26.
69 ){ // FixIn: 8.4.4.5.
70
71 var notice_message_id = wpbc_front_end__show_message__warning( '#booking_form_div' + bk_type + ' .bk_calendar_frame', _wpbc.get_message( 'message_check_no_selected_dates' ), 'text' );
72
73 //wpbc_do_scroll('#calendar_booking' + bk_type); // Scroll to the calendar // FixIn: 8.5.1.3.
74 is_error_in_field = true; // Error
75 }
76 }
77
78 // Check only visible elements at this step
79 if ( jQuery( el ).is( ':visible' ) ){
80 // console.log( '|id, type, val, visible|::', jQuery( el ).attr( 'name' ), '|' + jQuery( el ).attr( 'type' ) + '|', jQuery( el ).val(), jQuery( el ).is( ':visible' ) );
81
82 // Is Required
83 if ( jQuery( el ).hasClass( 'wpdev-validates-as-required' ) ){
84
85 // Checkboxes
86 if ( 'checkbox' == jQuery( el ).attr( 'type' ) ){
87
88 if (
89 ( ! jQuery( el ).is( ':checked' ))
90 && ( ! jQuery( ':checkbox[name="' + el.name + '"]', my_form ).is( ":checked" ) ) // FixIn: 8.5.2.12.
91 ){
92 var checkbox_parent_element;
93
94 if ( jQuery( el ).parents( '.wpdev-form-control-wrap' ).length > 0 ){
95
96 checkbox_parent_element = jQuery( el ).parents( '.wpdev-form-control-wrap' );
97
98 } else if ( jQuery( el ).parents( '.controls' ).length > 0 ){
99
100 checkbox_parent_element = jQuery( el ).parents( '.controls' );
101
102 } else {
103
104 checkbox_parent_element = jQuery( el );
105 }
106 var notice_message_id = wpbc_front_end__show_message__warning( checkbox_parent_element, _wpbc.get_message( 'message_check_required_for_check_box' ), 'text' );
107
108 fields_with_errors_arr.push( el );
109 is_error_in_field = true; // Error
110 }
111
112 // Radio boxes
113 } else if ( 'radio' == jQuery( el ).attr( 'type' ) ){
114
115 if ( !jQuery( ':radio[name="' + jQuery( el ).attr( 'name' ) + '"]', my_form ).is( ':checked' ) ){
116 var notice_message_id = wpbc_front_end__show_message__warning( jQuery( el ).parents('.wpdev-form-control-wrap'), _wpbc.get_message( 'message_check_required_for_radio_box' ), 'text' );
117 fields_with_errors_arr.push( el );
118 is_error_in_field = true; // Error
119 }
120
121 // Other elements
122 } else {
123
124 var inp_value = jQuery( el ).val();
125
126 if ( '' === wpbc_trim( inp_value ) ){ //FixIn: 8.8.1.3 // FixIn: 8.7.11.12.
127
128 var notice_message_id = wpbc_front_end__show_message__warning( el, _wpbc.get_message( 'message_check_required' ), 'text' );
129
130 fields_with_errors_arr.push( el );
131 is_error_in_field = true; // Error
132 }
133 }
134 }
135
136 // Validate Email
137 if ( jQuery( el ).hasClass( 'wpdev-validates-as-email' ) ){
138 var inp_value = jQuery( el ).val();
139 inp_value = inp_value.replace( /^\s+|\s+$/gm, '' ); // Trim white space //FixIn: 5.4.5
140 var reg = /^([A-Za-z0-9_\-\.\+])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,})$/;
141 if ( (inp_value != '') && (reg.test( inp_value ) == false) ){
142
143 var notice_message_id = wpbc_front_end__show_message__warning( el, _wpbc.get_message( 'message_check_email' ), 'text' );
144 fields_with_errors_arr.push( el );
145 is_error_in_field = true; // Error
146 }
147 }
148
149
150 // Validation Check --- Same Email Field. // FixIn: 11.4.1.1.
151 if ( jQuery( el ).hasClass( 'wpdev-validates-as-email' ) && (jQuery( el )[0].className.indexOf( 'same_as_' ) !== -1) ) {
152
153 // Get the name of Primary Email field from the "same_as_NAME" class.
154 var primary_email_name = jQuery( el )[0].className.match( /same_as_([^\s])+/gi );
155 if ( primary_email_name != null ) { // We found.
156 primary_email_name = primary_email_name[0].substr( 8 );
157
158 // Recehck if such primary email field exist in the booking form.
159 if ( jQuery( '[name="' + primary_email_name + bk_type + '"]' ).length > 0 ) {
160
161 // Recheck the values of the both emails, if they do not equla show warning.
162 if ( jQuery( '[name="' + primary_email_name + bk_type + '"]' ).val() !== inp_value ) {
163 var notice_message_id = wpbc_front_end__show_message__warning( el, _wpbc.get_message( 'message_check_same_email' ), 'text' );
164 fields_with_errors_arr.push( el );
165 is_error_in_field = true; // Error.
166 }
167 }
168 }
169 }
170
171
172 // Validate For digit entering - for example for - Phone
173 // <p>Digit Field:<br />[text* dig_field class:validate_as_digit] </p>
174 // <p>Phone:<br />[text* phone class:validate_digit_8] </p>
175
176 var classList = jQuery( el ).attr( 'class' );
177
178 if ( classList ){
179
180 classList = classList.split( /\s+/ );
181
182 jQuery.each( classList, function ( cl_index, cl_item ){
183
184 ////////////////////////////////////////////////////////////////////////////////////////////
185
186 // Validate field value as "Date" [CSS class - 'validate_as_digit']
187 if ( 'validate_as_date' === cl_item ) {
188
189 // 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
190 var regex = new RegExp( '^[0-3]?\\d{1}[\\/\\.\\-]+[0-3]?\\d{1}[\\/\\.\\-]+[0-2]+\\d{3}$' ); // Check for Date 09/25/2018
191 var message_verif_phone = _wpbc.get_message( 'message_check_valid_date' ).replace( '{date_example}', '09/25/2018' );
192 var inp_value = jQuery( el ).val();
193
194 if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
195 wpbc_front_end__show_message__warning( el, message_verif_phone, 'text' );
196 fields_with_errors_arr.push( el );
197 is_error_in_field = true; // Error
198 }
199 }
200
201 ////////////////////////////////////////////////////////////////////////////////////////////
202
203 // Validate field value as "DIGIT" [CSS class - 'validate_as_digit']
204 if ( 'validate_as_digit' === cl_item ) {
205
206 var regex = new RegExp( '^[0-9]+\\.?[0-9]*$' ); // Check for digits
207 var message_verif_phone = _wpbc.get_message( 'message_check_digits_only' );
208 var inp_value = jQuery( el ).val();
209
210 if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
211 wpbc_front_end__show_message__warning( el, message_verif_phone, 'text' );
212 fields_with_errors_arr.push( el );
213 is_error_in_field = true; // Error
214 }
215 }
216
217 ////////////////////////////////////////////////////////////////////////////////////////////
218
219 // Validate field value as "Phone" number or any other valid number wth specific number of digits [CSS class - 'validate_digit_8' || 'validate_digit_10' ]
220 var is_validate_digit = cl_item.substring( 0, 15 );
221
222 // Check if class start with 'validate_digit_'
223 if ( 'validate_digit_' === is_validate_digit ){
224
225 // Get number of digit in class: validate_digit_8 => 8 or validate_digit_10 => 10
226 var digits_to_check = parseInt( cl_item.substring( 15 ) );
227
228 // Check about any errors in
229 if ( !isNaN( digits_to_check ) ){
230
231 var regex = new RegExp( '^\\d{' + digits_to_check + '}$' ); // We was valid it as parseInt - only integer variable - digits_to_check
232 var message_verif_phone = _wpbc.get_message( 'message_check_digits_count' ).replace( '{digits}', digits_to_check );
233 var inp_value = jQuery( el ).val();
234
235 if ( ( inp_value != '' ) && ( regex.test( inp_value ) == false ) ){
236 wpbc_front_end__show_message__warning( el, message_verif_phone, 'text' );
237 fields_with_errors_arr.push( el );
238 is_error_in_field = true; // Error
239 }
240 }
241 }
242
243 ////////////////////////////////////////////////////////////////////////////////////////////
244
245 });
246 }
247 }
248 }
249 } );
250
251 if ( fields_with_errors_arr.length > 0 ){
252 jQuery( fields_with_errors_arr[ 0 ] ).trigger( 'focus' ); // FixIn: 9.3.1.9.
253 }
254 }
255
256 return is_error_in_field;
257 }
258
259
260 // FixIn: 8.6.1.15.
261 /**
262 * Go to next specific step in Wizard style booking form, with
263 * check all required elements specific step, otherwise show warning message!
264 *
265 * @param el
266 * @param step_num
267 * @returns {boolean}
268 */
269 function wpbc_wizard_step(el, step_num, step_from) {
270 var br_id = jQuery( el ).closest( 'form' ).find( 'input[name^="bk_type"]' ).val();
271
272 // FixIn: 8.8.1.5.
273 if ( (undefined == step_from) || (step_num > step_from) ) {
274 if ( 1 != step_num ) { // FixIn: 8.7.7.8.
275 var is_error = wpbc_check_errors_in_booking_form( br_id );
276 if ( is_error ) {
277 return false;
278 }
279 }
280 }
281
282 if ( wpbc_is_some_elements_visible( br_id, [ 'rangetime', 'durationtime', 'starttime', 'endtime' ] ) ) {
283 if ( wpbc_is_this_time_selection_not_available( br_id, document.getElementById( 'booking_form' + br_id ) ) ) {
284 return false;
285 }
286 }
287
288 if ( br_id != undefined ) {
289 jQuery( "#booking_form" + br_id + " .wpbc_wizard_step" ).css( { "display": "none" } ).removeClass( 'wpbc_wizard_step_hidden' );
290 jQuery( "#booking_form" + br_id + " .wpbc_wizard_step" + step_num ).css( { "display": "block" } );
291 return jQuery( "#booking_form" + br_id + " .wpbc_wizard_step" + step_num );
292 }
293 }
294
295
296 /**
297 * Init Buttons in Booking form Wizard
298 */
299 function wpbc_hook__init_booking_form_wizard_buttons() {
300
301 // CSS classes in Wizard Next / Prior links can be like this: <a class="wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_1">Step 1</a> | <a class="wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_2">Step 2</a> .
302
303 jQuery( '.wpbc_wizard_step_button' ).attr(
304 {
305 href: 'javascript:void(0)',
306 }
307 );
308
309 jQuery( '.wpbc_wizard_step_button' ).off( 'click.wpbc_booking_form_wizard' ).on(
310 'click.wpbc_booking_form_wizard',
311 function (event) {
312 var found_steps_arr = jQuery( this ).attr( 'class' ).match( /wpbc\_wizard\_step\_([\d]+)([\s'"]+|$)/ );
313
314 if ( (null !== found_steps_arr) && (found_steps_arr.length > 2) ) {
315 var step = parseInt( found_steps_arr[1] );
316 if ( step > 0 ) {
317 var jq_step_element;
318 // Check actual step in booking form for getting step_from number.
319 var this_formsteps_arr = jQuery( this ).parents( '.wpbc_wizard_step' ).attr( 'class' ).match( /wpbc\_wizard\_step([\d]+)([\s'"]+|$)/ );
320 if ( (null !== this_formsteps_arr) && (this_formsteps_arr.length > 2) ) {
321 var step_from = parseInt( this_formsteps_arr[1] );
322 jq_step_element = wpbc_wizard_step( this, step, step_from );
323 } else {
324 jq_step_element = wpbc_wizard_step( this, step );
325 }
326 // Do Scroll.
327 if ( false !== jq_step_element ) {
328 wpbc_do_scroll( jq_step_element ); // wpbc_do_scroll( jQuery('.wpbc_wizard_step:visible') );.
329 }
330 }
331 }
332 }
333 );
334 }
335
336 // FixIn: 10.1.3.2.
337 jQuery( document ).ready( function (){
338 wpbc_hook__init_booking_form_wizard_buttons();
339 } );
340
341
342 // FixIn: 8.6.1.15.
343 /**
344 * Check if at least one element from array of elements names in booking form visible or not.
345 * Usage Example: if ( wpbc_is_some_elements_visible( br_id, ['rangetime', 'durationtime', 'starttime', 'endtime'] )
346 * ){ ... }
347 *
348 * @param bk_type
349 * @param elements_names
350 * @returns {boolean}
351 */
352 function wpbc_is_some_elements_visible( bk_type, elements_names ){
353
354 var is_some_elements_visible = false;
355
356 var my_form = jQuery( '#booking_form' + bk_type );
357
358 if ( my_form.length ){
359
360 // Pseudo-selector that get form elements <input , <textarea , <select, <button...
361 my_form.find( ':input' ).each( function ( index, el ){
362
363 // Skip some elements
364 var skip_elements = ['hidden', 'button'];
365
366 if ( -1 == skip_elements.indexOf( jQuery( el ).attr( 'type' ) ) ){
367
368 for ( var ei = 0; ei < ( elements_names.length - 1) ; ei++ ){
369
370 // Check Calendar Dates Selection
371 if ( (elements_names[ ei ] + bk_type) == jQuery( el ).attr( 'name' ) ){
372
373 if ( jQuery( el ).is( ':visible' ) ){
374 is_some_elements_visible = true;
375 }
376 }
377 }
378 }
379 } );
380 }
381 return is_some_elements_visible;
382 }
383
384 // == Days Selections - support functions ==============================================================================
385
386 /**
387 * Get first day of selection
388 *
389 * @param dates
390 * @returns {string|*}
391 */
392 function get_first_day_of_selection(dates) {
393
394 // Multiple days selections
395 if ( dates.indexOf( ',' ) != -1 ){
396 var dates_array = dates.split( /,\s*/ );
397 var length = dates_array.length;
398 var element = null;
399 var new_dates_array = [];
400
401 for ( var i = 0; i < length; i++ ){
402
403 element = dates_array[ i ].split( /\./ );
404
405 new_dates_array[ new_dates_array.length ] = element[ 2 ] + '.' + element[ 1 ] + '.' + element[ 0 ]; //2013.12.20
406 }
407 new_dates_array.sort();
408
409 element = new_dates_array[ 0 ].split( /\./ );
410
411 return element[ 2 ] + '.' + element[ 1 ] + '.' + element[ 0 ]; //20.12.2013
412 }
413
414 // Range days selection
415 if ( dates.indexOf( ' - ' ) != -1 ){
416 var start_end_date = dates.split( " - " );
417 return start_end_date[ 0 ];
418 }
419
420 // Single day selection
421 return dates; //20.12.2013
422 }
423
424 // Get last day of selection
425 function get_last_day_of_selection(dates) {
426
427 // Multiple days selections
428 if ( dates.indexOf(',') != -1 ){
429 var dates_array =dates.split(/,\s*/);
430 var length = dates_array.length;
431 var element = null;
432 var new_dates_array = [];
433
434 for (var i = 0; i < length; i++) {
435
436 element = dates_array[i].split(/\./);
437
438 new_dates_array[new_dates_array.length] = element[2]+'.' + element[1]+'.' + element[0]; //2013.12.20
439 }
440 new_dates_array.sort();
441
442 element = new_dates_array[(new_dates_array.length-1)].split(/\./);
443
444 return element[2]+'.' + element[1]+'.' + element[0]; //20.12.2013
445 }
446
447 // Range days selection
448 if ( dates.indexOf(' - ') != -1 ){
449 var start_end_date = dates.split(" - ");
450 return start_end_date[(start_end_date.length-1)];
451 }
452
453 // Single day selection
454 return dates; //20.12.2013
455 }
456
457
458 /**
459 * Check ID of selected additional calendars
460 *
461 * @param int bk_type
462 * @returns array
463 */
464 function wpbc_get_arr_of_selected_additional_calendars( bk_type ){ // FixIn: 8.5.2.26.
465
466 var selected_additionl_calendars = [];
467
468 // Checking according additional calendars
469 if ( document.getElementById( 'additional_calendars' + bk_type ) != null ){
470
471 var id_additional_str = document.getElementById( 'additional_calendars' + bk_type ).value;
472 var id_additional_arr = id_additional_str.split( ',' );
473
474 var is_all_additional_days_unselected = true;
475
476 for ( var ia = 0; ia < id_additional_arr.length; ia++ ){
477 if ( document.getElementById( 'date_booking' + id_additional_arr[ ia ] ).value != '' ){
478 selected_additionl_calendars.push( id_additional_arr[ ia ] );
479 }
480 }
481 }
482 return selected_additionl_calendars;
483 }
484
485 // ---------------------------------------------------------------------------------------------------------------------
486 // Elementor Ready Widget Update.
487 // ---------------------------------------------------------------------------------------------------------------------
488 jQuery( function ($) {
489 // FixIn: 10.14.15.1.
490 if ( (window.elementorFrontend) && ('undefined' !== typeof (elementorFrontend.hooks)) ) {
491
492 elementorFrontend.hooks.addAction( 'frontend/element_ready/wpbc_widget_booking_form_1.default', function ($scope) {
493 // Simulate DOM ready, after updating Elementor Widget.
494 jQuery( document ).trigger( 'wpbc_elementor_ready' );
495 } );
496
497 // Catch all widget re-renders.
498 // elementorFrontend.hooks.addAction( 'frontend/element_ready/global', function ($scope) {
499 // console.log( 'Some widget was re-rendered:', $scope );
500 // } );
501 }
502 } );
503
504 // Elementor widget reinit. So we need to reinit all "jQuery( document ).ready( ...) " again with custom 'wpbc_elementor_ready' event.
505 jQuery( document ).on( 'wpbc_elementor_ready', function () {
506
507 wpbc_hook__init_booking_form_wizard_buttons();
508
509 if ( 'function' === typeof (wpbc_hook__init_timeselector) ) {
510 wpbc_hook__init_timeselector();
511 }
512
513 if ( 'function' === typeof (wpbc_update_capacity_hint) ) {
514 jQuery( '.booking_form_div' ).on( 'wpbc_booking_date_or_option_selected', function (event, resource_id) {
515 wpbc_update_capacity_hint( resource_id );
516 } );
517 }
518
519 // TODO:
520 // <?php if ('wpbc_theme_dark_1' === get_bk_option( 'booking_form_theme' ) ){ ?>
521 // jQuery( '.wpbc_widget_preview_booking_form .wpbc_center_preview,.wpbc_widget_preview_booking_form .wpbc_container.wpbc_container_booking_form,.wpbc_widget_preview_booking_form .wpbc_widget_content' ).addClass( 'wpbc_theme_dark_1' );
522 // <?php } ?>
523
524 } );
525