1( function( $ ) { 2 3 "use strict"; 4 5 $.fn.jetFormConditional = function( options ) { 6 7 var settings = $.extend( { 8 hideJS: true 9 }, options ); 10 11 var checkValue = function( $listenTo, listenFor, operator ) { 12 13 var val = ''; 14 var checkResult = false; 15 var controlType = 'plain'; 16 17 operator = operator || 'equal'; 18 19 if ( $listenTo.is( 'input[type=checkbox]' ) ) { 20 controlType = 'checkbox'; 21 } else if ( $listenTo.is( 'input[type=radio]' ) ) { 22 controlType = 'radio'; 23 } 24 25 if ( 'checkbox' === controlType ) { 26 val = []; 27 } 28 29 if ( 'plain' === controlType ) { 30 val = $listenTo.val(); 31 } else { 32 33 $listenTo.each( function() { 34 35 var $control = $( this ); 36 37 if ( $control.is( ':checked' ) ) { 38 if ( 'checkbox' === controlType ) { 39 val.push( $control.val() ); 40 } else { 41 val = $control.val(); 42 } 43 } 44 45 } ); 46 } 47 48 if ( 'is-hidden' === val ) { 49 val = ''; 50 } 51 52 switch ( operator ) { 53 case 'equal': 54 if ( val && val.constructor === Array ) { 55 checkResult = false;
56 } else { 57 checkResult = ( val == listenFor ); 58 } 59 break; 60 61 case 'greater': 62 if ( val && val.constructor === Array ) { 63 checkResult = false; 64 } else { 65 checkResult = ( parseFloat( val ) > parseFloat( listenFor ) ); 66 } 67 break; 68 69 case 'less': 70 if ( val && val.constructor === Array ) { 71 checkResult = false; 72 } else { 73 checkResult = ( parseFloat( val ) < parseFloat( listenFor ) ); 74 } 75 break; 76 77 case 'between': 78 79 if ( val && val.constructor === Array ) { 80 checkResult = false; 81 } else { 82 if ( 2 <= listenFor.length ) { 83 let from = parseFloat( listenFor[0] ); 84 let to = parseFloat( listenFor[1] ); 85 val = parseFloat( val ); 86 checkResult = ( from <= val && val <= to ); 87 } else { 88 checkResult = false; 89 } 90 } 91 92 break; 93 94 case 'one_of': 95 if ( val && val.constructor === Array ) { 96 97 var intersect = listenFor.filter( function( n ) { 98 return val.indexOf( n ) !== -1; 99 } ); 100 101 checkResult = 0 < intersect.length; 102 103 } else if ( ! val ) { 104 checkResult = false;
105 } else { 106 if ( listenFor.length ) { 107 checkResult = 0 <= listenFor.indexOf( val ); 108 } else { 109 checkResult = false; 110 } 111 } 112 113 break; 114 115 case 'contain': 116 117 if ( val && val.constructor === Array ) { 118 119 var intersect = val.filter( function( n ) { 120 return n.indexOf( listenFor ) !== -1; 121 } ); 122 123 checkResult = 0 < intersect.length; 124 125 } else if ( ! val ) { 126 checkResult = false; 127 } else { 128 checkResult = 0 <= val.indexOf( listenFor ); 129 } 130 131 break; 132 } 133 134 return checkResult; 135 }; 136 137 var checkVisibilityCond = function( listenTo, listenFor, $section, operator, type ) { 138 139 var checked = $section.data( 'checked' ); 140 var $listenTo = $( listenTo ); 141 var checkResult = checkValue( $listenTo, listenFor, operator ); 142 143 type = type || 'show'; 144 145 if ( ! checked ) { 146 checked = {}; 147 } 148 149 if ( 'show' === type ) { 150 checked[ listenTo ] = checkResult; 151 } else { 152 checked[ listenTo ] = ! checkResult; 153 } 154 155 $section.data( 'checked', checked ); 156 157 }; 158 159 var checkSetValueCond = function( listenTo, listenFor, $section, operator, value, type ) { 160 161 var currentVal = $section.data( 'result_' + type ); 162 var $listenTo = $( listenTo ); 163 var checkResult = checkValue( $listenTo, listenFor, operator ); 164 165 if ( checkResult ) { 166 currentVal = value; 167 } 168 169 $section.data( 'result_' + type, currentVal ); 170 171 }; 172 173 var setValue = function( $section ) { 174 175 var setVal = false; 176 var setCalcVal = false;
177 var $field; 178 var triggered = false; 179 180 if ( $section.data( 'result_set_value' ) ) { 181 setVal = $section.data( 'result_set_value' ); 182 } 183 184 if ( $section.data( 'result_set_calculated_value' ) ) { 185 setCalcVal = $section.data( 'result_set_calculated_value' ); 186 } 187 188 if ( ! setVal && ! setCalcVal ) { 189 return; 190 } 191 192 $field = $section.find( '.jet-form__field' ); 193 194 if ( ! $field.length ) { 195 return; 196 } 197 198 if ( $field.is( 'select' ) ) { 199 200 $field.find( ':selected' ).removeAttr( 'selected' ); 201 202 if ( setVal ) { 203 $field.find( 'option[value="' + setVal + '"]' ).attr( 'selected', 'selected' ).trigger( 'change.JetEngine' ); 204 triggered = true; 205 } 206 207 if ( setCalcVal ) { 208 $field.find( 'option[data-calculate="' + setCalcVal + '"]' ).attr( 'selected', 'selected' ); 209 if ( ! triggered ) { 210 $field.trigger( 'change.JetEngine' ); 211 triggered = true; 212 } 213 } 214 215 } else if ( $field.is( ':not( input[type=checkbox], input[type=radio] )' ) ) { 216 217 if ( setVal ) { 218 $field.val( setVal ).trigger( 'change.JetEngine' ); 219 triggered = true; 220 } 221 222 if ( setCalcVal ) { 223 $field.data( 'calculate', setCalcVal ); 224 if ( ! triggered ) { 225 $field.trigger( 'change.JetEngine' ); 226 triggered = true; 227 } 228 } 229 230 } else { 231 232 $field.each( function() { 233 234 var $this = $( this ); 235 236 if ( $this.is( ':checked' ) ) { 237 $this.removeAttr( 'checked' ); 238 } 239 240 if ( setVal && setVal == $this.val() ) { 241 $this.attr( 'checked', 'checked' ).trigger( 'change.JetEngine' ); 242 triggered = true; 243 } 244 245 if ( setCalcVal && setCalcVal == $this.data( 'calculate' ) ) { 246 $this.attr( 'checked', 'checked' ); 247 if ( ! triggered ) { 248 $this.trigger( 'change.JetEngine' ); 249 triggered = true; 250 } 251 } 252 253 } ); 254 255 } 256 257 }; 258 259 var setVisibility = function( $section ) { 260 261 var checked = $section.data( 'checked' ); 262 var $row = $section.closest( '.jet-form-row' ); 263 var res = true; 264 265 if ( ! checked ) { 266 return; 267 } 268 269 for ( var check in checked ) { 270 if ( ! checked[ check ] ) { 271 res = false; 272 } 273 } 274 275 if ( res ) { 276 277 $section.show(); 278 $row.show(); 279 280 $section.find( '*[data-initial-type]' ).each( function() { 281 var $this = $( this ); 282 283 $this.attr( 'type', $this.data( 'initial-type' ) ); 284 } ); 285 286 $section.find( 'select option[data-is-hidden="1"]' ).remove(); 287 $section.find( '.jet-form__fields-group input[data-is-hidden="1"]' ).remove(); 288 289 //$section.find( '*[data-required="1"]:not(.checkradio-field)' ).val( '' ); 290 291 $section.find( '.jet-form__field[data-value]' ).each( function() { 292 var $this = $( this ); 293 294 $this.val( $this.attr( 'data-value' ) ); 295 $this.removeAttr( 'data-value' ); 296 } ); 297 298 $section.find( '*[data-required="1"]' ) 299 .removeAttr( 'data-required' ) 300 .attr( 'required', true ); 301 302 } else { 303 304 $section.hide(); 305 306 $section.find( '*[type="date"],*[type="time"],*[type="email"],*[type="url"],*[type="number"]' ).each( function() { 307 var $this = $( this ), 308 type = $this.attr( 'type' ); 309 310 $this.attr( 'data-initial-type', type ); 311 $this.attr( 'type', 'text' ); 312 } ); 313 314 var $select = $section.find( 'select' ); 315 var val = 'is-hidden'; 316 317 if ( $select.length ) { 318 319 var defaultVal = $select.data( 'default-val' ); 320 321 if ( defaultVal || 0 === defaultVal ) { 322 val = defaultVal; 323 } 324 325 $select.append( '<option value="' + val + '" data-is-hidden="1"></option>' ); 326 327 } 328 329 var $checkradio = $section.find( '.jet-form__field.checkradio-field' ); 330 331 if ( $checkradio.length ) { 332 var $group = $checkradio.closest( '.jet-form__fields-group' ); 333 334 if ( ! $group.find( 'input[data-is-hidden="1"]' ).length ) { 335 $group.append( '<input type="hidden" name="' + $checkradio.attr( 'name' ).replace( '[]', '' ) + '" value="' + val + '" data-is-hidden="1">' ); 336 } 337 338 } 339 340 //$section.find( '*[required="required"]:not(.checkradio-field)' ).val( val ); 341 342 $section.find( '.jet-form__field:not(.checkradio-field):not(.file-field)' ).each( function() { 343 var $this = $( this ); 344 345 if ( val === $this.val() ) { 346 return; 347 } 348 349 $this.attr( 'data-value', $this.val() ); 350 $this.val( val ); 351 } ); 352 353 $section.find( '*[required="required"]' ) 354 .removeAttr( 'required' ) 355 .attr( 'data-required', 1 ); 356 357 // Maybe hide parent row. 358 var $hiddenItems = $row.find( '>*' ).filter( function() { 359 return $( this ).css( 'display' ) === 'none'; 360 } ); 361 362 if ( $row.find( '>*' ).length === $hiddenItems.length ) { 363 $row.hide(); 364 } 365 } 366 367 }; 368 369 return this.each( function() { 370 371 var $section = $( this ); 372 var conditions = $section.data( 'conditional' ); 373 374 if ( ! conditions || ! conditions.length ) { 375 return; 376 } 377 378 for ( var i = 0; i < conditions.length; i++ ) { 379 380 let condition = conditions[ i ]; 381 382 if ( ! condition.field ) { 383 continue; 384 } 385 386 let listenTo = ".jet-form__field[name=" + condition.field + "], .jet-form__field [name=" + condition.field + "], .jet-form__field[name=" + condition.field + "\\[\\]]"; 387 let listenFor = condition.value; 388 let operator = condition.operator; 389 let type = condition.type; 390 let valueToSet = condition.set_value; 391 392 //Set up event listener 393 $( document ).on( 'change.JetEngine', listenTo, function() { 394 395 if ( 'show' === type || 'hide' === type ) { 396 checkVisibilityCond( listenTo, listenFor, $section, operator, type ); 397 } else { 398 checkSetValueCond( listenTo, listenFor, $section, operator, valueToSet, type ); 399 } 400 401 setValue( $section ); 402 setVisibility( $section ); 403 404 } ); 405 406 //If setting was chosen, hide everything first... 407 if ( settings.hideJS && ( 'show' === type || 'hide' === type ) ) { 408 $section.hide(); 409 } 410 411 //Show based on current value on page load 412 if ( 'show' === type || 'hide' === type ) { 413 checkVisibilityCond( listenTo, listenFor, $section, operator, type ); 414 } else { 415 checkSetValueCond( listenTo, listenFor, $section, operator, valueToSet, type ); 416 } 417 418 } 419 420 setValue( $section ); 421 setVisibility( $section ); 422 423 } ); 424 }; 425 426 var JetEngineForms = { 427 428 calcFields: {}, 429 repeaterCalcFields: {}, 430 childrenCalcFields: {}, 431 432 pages: {}, 433 434 init: function() { 435 436 var widgets = { 437 'jet-engine-booking-form.default': JetEngineForms.widgetBookingForm, 438 }; 439 440 $.each( widgets, function( widget, callback ) { 441 window.elementorFrontend.hooks.addAction( 'frontend/element_ready/' + widget, callback ); 442 } ); 443 444 }, 445 446 commonInit: function() { 447 var self = JetEngineForms; 448 449 $( document ) 450 .on( 'click.JetEngine', '.jet-form__submit.submit-type-ajax', self.ajaxSubmitForm ) 451 .on( 'submit.JetEngine', 'form.jet-form.submit-type-reload', self.reloadSubmitForm ) 452 .on( 'click.JetEngine', '.jet-form__next-page', self.nextFormPage ) 453 .on( 'click.JetEngine', '.jet-form__prev-page', self.prevFormPage ) 454 .on( 'focus.JetEngine', '.jet-form__field', self.clearFieldErrors ) 455 .on( 'click.JetEngine', '.jet-form__field-template', self.simLabelClick ) 456 .on( 'change.JetEngine', '.jet-form__field', self.recalcFields ) 457 .on( 'jet-engine/form/repeater-changed', '.jet-form-repeater', self.recalcFields ) 458 .on( 'change.JetEngine', '.jet-form__field.checkboxes-group-required', self.requiredCheckboxGroup ) 459 .on( 'change.JetEngine', '.checkradio-field', self.changeActiveTemplateClass ) 460 .on( 'input.JetEngine/range', '.jet-form__field.range-field', self.updateRangeField ) 461 .on( 'click.JetEngine', '.jet-form-repeater__new', self.newRepeaterItem ) 462 .on( 'click.JetEngine', '.jet-form-repeater__remove', self.removeRepeaterItem ) 463 .on( 'input.JetEngine', '.jet-form__field.text-field, .jet-form__field.textarea-field', self.inputTextFields ) 464 .on( 'jet-engine/form/page/field-changed', self.maybeSwitchPage ); 465 466 }, 467 468 initBlocks: function( $scope ) { 469 470 $scope = $scope || $( 'body' ); 471 472 window.JetPlugins.init( $scope, [ 473 { 474 block: 'jet-engine/booking-form', 475 callback: JetEngineForms.widgetBookingForm 476 } 477 ] ); 478 479 }, 480 481 removeRepeaterItem: function() { 482 483 var $this = $( this ), 484 $repeater = $this.closest( '.jet-form-repeater' ), 485 $repeaterItem = $this.closest( '.jet-form-repeater__row' ), 486 $editor = $repeaterItem.find( '.wp-editor-area' ); 487 488 $this.trigger( 'jet-engine/form/on-remove-repeater-item' ); 489 490 if ( $editor.length && window.wp && window.wp.editor ) { 491 $editor.each( function() { 492 window.wp.editor.remove( $( this ).attr( 'id' ) ); 493 } ); 494 } 495 496 $repeaterItem.remove(); 497 $repeater.trigger( 'jet-engine/form/repeater-changed' ); 498 499 }, 500 501 newRepeaterItem: function() { 502 503 var $this = $( this ), 504 $repeater = $this.closest( '.jet-form-repeater' ), 505 $initial = $repeater.find( '.jet-form-repeater__initial' ), 506 $items = $repeater.find( '.jet-form-repeater__items' ), 507 $newVal = $initial.html(), 508 index = 0; 509 510 if ( $items.find( '.jet-form-repeater__row' ).length ) { 511 $items.find( '.jet-form-repeater__row' ).each( function() { 512 var $this = $( this ), 513 currentIndex = parseInt( $this.data( 'index' ), 10 ); 514 515 if ( currentIndex > index ) { 516 index = currentIndex; 517 } 518 } ); 519 index++; 520 } 521 522 $newVal = $newVal.replace( /__i__/g, index ); 523 $newVal = $( $newVal ); 524 $newVal.data( 'index', index ); 525 $newVal.attr( 'data-index', index ); 526 527 JetEngineForms.initRangeFields( $newVal ); 528 529 $items.append( $newVal ); 530 531 var $editor = $newVal.find( '.wp-editor-area' ); 532 533 if ( $editor.length && window.wp && window.wp.editor ) { 534 $editor.each( function() { 535 JetEngineForms.wysiwygInitWithTriggers( this ); 536 } ); 537 } 538 539 if ( $.fn.inputmask ) { 540 $newVal.find( '.jet-form__masked-field' ).inputmask(); 541 } 542 543 JetEngineForms.initConditions( $newVal ); 544 545 $repeater.trigger( 'jet-engine/form/repeater-changed' ); 546 $this.trigger( 'jet-engine/form/repeater-add-new', [ index ] ); 547 548 JetEngineForms.calculateRowValue( $newVal ); 549 550 }, 551 552 updateRepeaterItems: function( $repeater, $field ) { 553 554 var val = JetEngineForms.getFieldValue( $field ); 555 556 if ( ! val ) { 557 return; 558 } 559 560 for ( var i = 0; i < val; i++ ) { 561 562 var $item = $repeater.find( '.jet-form-repeater__row[data-index="' + i + '"]' ); 563 564 if ( ! $item.length ) { 565 JetEngineForms.newRepeaterItem.call( $repeater ); 566 } 567 568 } 569 570 var $rows = $repeater.find( '.jet-form-repeater__row' ); 571 572 if ( $rows.length ) { 573 $rows.each( function() { 574 var $row = $( this ), 575 index = parseInt( $row.data( 'index' ), 10 ); 576 577 index++; 578 579 if ( index > val ) { 580 $row.remove(); 581 $repeater.trigger( 'jet-engine/form/repeater-changed' ); 582 } 583 584 } ); 585 } 586 587 $repeater.trigger( 'change' ); 588 589 }, 590 591 calculateRowValue: function( $row ) { 592 593 var val = JetEngineForms.calculateValue( $row ); 594 595 $row.data( 'value', val ); 596 JetEngineForms.calculateFieldsInRow( $row ); 597 598 }, 599 600 calculateFieldsInRow: function( $row ) { 601 602 $row.find( '.jet-form__calculated-field--child' ).each( function() { 603 604 var $childCalculatedField = $( this ), 605 val = JetEngineForms.calculateValue( $childCalculatedField ) 606 607 if ( ! val ) { 608 val = 0; 609 } 610 611 $childCalculatedField.find( '.jet-form__calculated-field-val' ).text( val.toFixed( $childCalculatedField.data( 'precision' ) ) ); 612 $childCalculatedField.find( '.jet-form__calculated-field-input' ).val( val.toFixed( $childCalculatedField.data( 'precision' ) ) ).trigger( 'change.JetEngine' ); 613 614 } ); 615 616 }, 617 618 initRepeaterListener: function( $scope ) { 619 620 var $repeater = $scope.find( '.jet-form-repeater' ); 621 622 if ( ! $repeater.length ) { 623 return; 624 } 625 626 $repeater.each( function() { 627 628 var $this = $( this ), 629 settings = $this.data( 'settings' ); 630 631 if ( 'dynamically' === settings.manageItems && settings.itemsField ) { 632 var $itemsField = $scope.find( '[data-field-name="' + settings.itemsField + '"]' ); 633 634 JetEngineForms.updateRepeaterItems( $this, $itemsField ); 635 636 $itemsField.on( 'change', function() { 637 JetEngineForms.updateRepeaterItems( $this, $itemsField ); 638 } ); 639 } 640 641 if ( 'custom' === settings.calcType ) { 642 643 var calculated = null; 644 645 JetEngineForms.repeaterCalcFields[ $this.data( 'field-name' ) ] = { 646 'el': $this, 647 'listenTo': $this.data( 'listen_fields' ), 648 }; 649 650 calculated = JetEngineForms.calculateValue( $this ); 651 652 $this.data( 'value', calculated.toFixed( 0 ) ); 653 654 } 655 656 var $initial = $this.find( '.jet-form-repeater__initial' ); 657 $initial = $( $initial.html() ); 658 659 var $calcFields = $initial.find( '.jet-form__calculated-field--child' ); 660 661 if ( $calcFields.length ) { 662 663 $calcFields.each( function() { 664 665 var $childField = $( this ); 666 667 JetEngineForms.childrenCalcFields[ $childField.data( 'name' ) ] = { 668 'el': $childField, 669 'parentEl': $this, 670 'listenTo': $childField.data( 'listen_to' ), 671 }; 672 673 $this.find( '.jet-form-repeater__row' ).each( function() { 674 JetEngineForms.calculateRowValue( $( this ), $childField.data( 'precision' ) ); 675 } ); 676 677 } ); 678 } 679 680 } ); 681 682 }, 683 684 simLabelClick: function( event ) { 685 $( this ).next( '.jet-form__field-label' ).trigger( 'click' ); 686 }, 687 688 maybeSwitchPage: function( event, $field, $page, disabled ) { 689 690 var $item = $field[ 0 ], 691 isSwitch = $field.data( 'switch' ), 692 value = null, 693 $toPage = null; 694 695 if ( ! isSwitch ) { 696 return; 697 } 698 699 if ( disabled ) { 700 return; 701 } 702 703 value = $item.value; 704 705 if ( ! value ) { 706 return; 707 } 708 709 $toPage = $page.next(); 710 711 if ( ! $page || ! $page.length ) { 712 return; 713 } 714 715 if ( ! $toPage || ! $toPage.length ) { 716 return; 717 } 718 719 JetEngineForms.switchFormPage( $page, $toPage ); 720 721 }, 722 723 changeActiveTemplateClass: function( event ) { 724 725 var $this = $( this ), 726 $template = $this.closest( '.jet-form__field-wrap' ).find( '.jet-form__field-template' ); 727 728 if ( ! $template.length ) { 729 return; 730 } 731 732 if ( 'radio' === $this[ 0 ].type ) { 733 $template 734 .closest( '.jet-form__fields-group' ) 735 .find( '.jet-form__field-template--checked' ) 736 .removeClass( 'jet-form__field-template--checked' ); 737 } 738 739 $template.toggleClass( 'jet-form__field-template--checked', $this[ 0 ].checked ); 740 741 }, 742 743 initConditions: function( $scope ) { 744 $scope.find( '.jet-form-col' ).jetFormConditional(); 745 }, 746 747 widgetBookingForm: function( $scope ) { 748 749 var $calcFields = $scope.find( '.jet-form__calculated-field' ); 750 751 var $editor = $scope.find( '.jet-form__field .wp-editor-area' ); 752 753 if ( $editor.length && window.wp && window.wp.editor ) { 754 $editor.each( function() { 755 JetEngineForms.wysiwygInitWithTriggers( this, true ); 756 } ); 757 } 758 JetEngineForms.initRequiredCheckboxGroup( $scope ); 759 760 $( document ).trigger( 'jet-engine/booking-form/init', [ $scope ] ); 761 762 JetEngineForms.initFormPager( $scope ); 763 JetEngineForms.initRangeFields( $scope ); 764 JetEngineForms.initRepeaterListener( $scope ); 765 JetEngineForms.initConditions( $scope ); 766 767 if ( $.fn.inputmask ) { 768 $scope.find( '.jet-form__masked-field' ).inputmask(); 769 } 770 771 if ( ! $calcFields.length ) { 772 return; 773 } 774 775 $calcFields.each( function() { 776 777 var $this = $( this ), 778 calculated = null; 779 780 JetEngineForms.calcFields[ $this.data( 'name' ) ] = { 781 'el': $this, 782 'listenTo': $this.data( 'listen_to' ), 783 }; 784
785 calculated = JetEngineForms.calculateValue( $this ); 786 787 $this.find( '.jet-form__calculated-field-val' ).text( calculated.toFixed( $this.data( 'precision' ) ) ); 788 $this.find( '.jet-form__calculated-field-input' ).val( calculated.toFixed( $this.data( 'precision' ) ) ).trigger( 'change.JetEngine' ); 789 790 } ); 791 }, 792 793 initFormPager: function( $scope ) { 794 var $pages = $scope.find( '.jet-form-page' ), 795 $form = $scope.find( '.jet-form' ); 796 797 if ( ! $pages.length ) { 798 return; 799 } 800 801 $pages.each( function() { 802 803 var $page = $( this ); 804 805 if ( ! $page.hasClass( '.jet-form-page--hidden' ) ) { 806 JetEngineForms.initSingleFormPage( $page, $form, false ); 807 } 808 809 } ); 810 811 }, 812 813 initSingleFormPage: function( $page, $form, $changedField ) { 814 815 var $button = $page.find( '.jet-form__next-page' ), 816 $msg = $page.find( '.jet-form__next-page-msg' ), 817 requiredFields = $page[ 0 ].querySelectorAll( '.jet-form__field[required]' ), 818 pageNum = parseInt( $page.data( 'page' ), 10 ), 819 disabled = false, 820 radioFields = {}; 821 822 $changedField = $changedField || false; 823 824 if ( requiredFields.length ) { 825 for ( var i = 0; i < requiredFields.length; i++ ) { 826 827 var $field = $( requiredFields[ i ] ); 828 var val = null; 829 var isRadio = false; 830 831 if ( 'INPUT' === $field[ 0 ].nodeName ) { 832 833 if ( $field.length > 1 ) { 834 for ( var j = 0; j < $field.length; j++ ) { 835 if ( $field[ j ].checked ) { 836 val = $field[ j ].value; 837 } 838 } 839 } else if ( 'radio' === $field[ 0 ].type ) { 840 841 isRadio = true; 842 843 if ( $field[ 0 ].checked ) { 844 radioFields[ $field[ 0 ].name ] = $field[ 0 ].value; 845 } 846 847 } else { 848 val = $field.val(); 849 } 850 } 851 852 if ( 'TEXTAREA' === $field[ 0 ].nodeName ) { 853 val = $field.val(); 854 } 855 856 if ( 'SELECT' === $field[ 0 ].nodeName ) { 857 val = $field.find( 'option:selected' ).val(); 858 } 859 860 if ( ! val ) { 861 disabled = true; 862 } 863 864 if ( isRadio && radioFields[ $field[ 0 ].name ] ) { 865 disabled = false; 866 } 867 868 } 869 } 870 871 if ( disabled ) { 872 873 if ( $msg.length ) { 874 $msg.addClass( 'jet-form__next-page-msg--visible' ); 875 } 876 877 $button.attr( 'disabled', true ); 878 } else { 879 880 if ( $msg.length ) { 881 $msg.removeClass( 'jet-form__next-page-msg--visible' ); 882 } 883 884 $button.attr( 'disabled', false ); 885 } 886 887 if ( ! JetEngineForms.pages[ pageNum ] ) { 888 JetEngineForms.pages[ pageNum ] = { 889 page: $page, 890 disabled: disabled, 891 }; 892 } else { 893 JetEngineForms.pages[ pageNum ].disabled = disabled; 894 } 895 896 if ( $changedField ) { 897 $( document ).trigger( 'jet-engine/form/page/field-changed', [ $changedField, $page, disabled ] ); 898 } 899 900 if ( $page.hasClass( 'jet-form-page--initialized' ) ) { 901 return; 902 } 903 904 $page.on( 'change.JetEngine', '.jet-form__field', function() { 905 JetEngineForms.initSingleFormPage( $page, $form, $( this ) ); 906 } ); 907 908 $page.addClass( 'jet-form-page--initialized' ); 909 910 }, 911 912 nextFormPage: function() { 913 914 var $button = $( this ), 915 $fromPage = $button.closest( '.jet-form-page' ), 916 $pageFields = $fromPage.find( '.jet-form__field' ).filter( ':input' ), 917 $toPage = $fromPage.next(); 918 919 if ( ! JetEngineForms.isFieldsValid( $pageFields ) ) { 920 return; 921 } 922 923 JetEngineForms.switchFormPage( $fromPage, $toPage ); 924 925 }, 926 927 prevFormPage: function() { 928 929 var $button = $( this ), 930 $fromPage = $button.closest( '.jet-form-page' ), 931 $toPage = $fromPage.prev(); 932 933 JetEngineForms.switchFormPage( $fromPage, $toPage ); 934 }, 935 936 isFieldsValid: function( $fields ) { 937 var isValid = true; 938 939 $fields.each( function( ind, field ) { 940 if ( ! field.checkValidity() ) { 941 field.reportValidity(); 942 isValid = false; 943 return false; 944 } 945 } ); 946 947 return isValid; 948 }, 949 950 switchFormPage: function( $fromPage, $toPage ) { 951 952 var $form = $fromPage.closest( '.jet-form' ); 953 954 $fromPage.addClass( 'jet-form-page--hidden' ); 955 $toPage.removeClass( 'jet-form-page--hidden' ); 956 957 JetEngineForms.initSingleFormPage( $toPage, $form, false ); 958 959 $( document ).trigger( 'jet-engine/form/switch-page', [ $fromPage, $toPage ] ) 960 961 $( '.jet-form-messages-wrap[data-form-id="' + $form.data( 'form-id' ) + '"]' ).html( '' ); 962 963 }, 964 965 getFieldValue: function( $field ) { 966 967 var val = 0; 968 969 if ( $field.length ) { 970 971 if ( 'INPUT' === $field[ 0 ].nodeName ) { 972 if ( $field.length > 1 ) { 973 974 for ( var i = 0; i < $field.length; i++ ) { 975 if ( $field[ i ].checked ) { 976 977 var itemVal = 0; 978 979 if ( undefined !== $field[ i ].dataset.calculate ) { 980 itemVal = $field[ i ].dataset.calculate; 981 } else { 982 itemVal = $field[ i ].value; 983 } 984 985 if ( 'checkbox' === $field[ i ].type ) { 986 val += parseInt( itemVal, 10 ); 987 } else { 988 val = itemVal; 989 } 990 991 } 992 } 993 994 } else { 995 if ( 'checkbox' === $field[ 0 ].type ) { 996 if ( $field[ 0 ].checked ) { 997 if ( undefined !== $field[ 0 ].dataset.calculate ) { 998 val = $field[ 0 ].dataset.calculate; 999 } else { 1000 val = $field[ 0 ].value; 1001 } 1002 } 1003 } else { 1004 val = $field.val(); 1005 } 1006 } 1007 } 1008 1009 if ( 'SELECT' === $field[ 0 ].nodeName ) { 1010 1011 var selectedOption = $field.find( 'option:selected' ), 1012 calcValue = selectedOption.data( 'calculate' ); 1013 1014 if ( undefined !== calcValue ) { 1015 val = calcValue; 1016 } else { 1017 val = $field.find( 'option:selected' ).val(); 1018 } 1019 1020 } 1021 1022 if ( 'DIV' === $field[ 0 ].nodeName ) { 1023 1024 if ( $field.hasClass( 'jet-form-repeater' ) ) { 1025 var repeaterSettings = $field.data( 'settings' ); 1026 if ( repeaterSettings && 'custom' === repeaterSettings.calcType ) { 1027 $field.find( '.jet-form-repeater__row' ).each( function() { 1028 var $row = $( this ), 1029 rowVal = JetEngineForms.calculateValue( $row ); 1030 1031 $row.data( 'value', rowVal ); 1032 1033 val += rowVal; 1034 } ); 1035 1036 } else { 1037 val = $field.find( '.jet-form-repeater__row' ).length; 1038 } 1039 } 1040 1041 } 1042 1043 } 1044 1045 if ( ! val ) { 1046 val = '0'; 1047 } 1048 1049 val = JetEngine.filters.applyFilters( 'forms/calculated-field-value', val, $field ); 1050 1051 return val; 1052 1053 }, 1054 1055 getCalculatedFieldNumericValue: function( $field ) { 1056 1057 // Field values can be controlled by form visitors. Only inject numeric literals into formulas. 1058 var value = JetEngineForms.getFieldValue( $field ), 1059 numericValue = 0, 1060 radixValue = null; 1061 1062 if ( 'number' === typeof value ) { 1063 numericValue = value; 1064 } else if ( 'string' === typeof value ) { 1065 1066 value = value.trim(); 1067 1068 if ( ! value ) { 1069 return '0'; 1070 } 1071 1072 radixValue = value.match( /^([+-]?)(0[xX][0-9a-fA-F]+|0[bB][01]+|0[oO][0-7]+)$/ ); 1073 1074 if ( radixValue ) { 1075 numericValue = Number( radixValue[2] ); 1076 1077 if ( '-' === radixValue[1] ) { 1078 numericValue = -numericValue; 1079 } 1080 } else { 1081 numericValue = Number( value ); 1082 } 1083 } else { 1084 return '0'; 1085 } 1086 1087 if ( ! isFinite( numericValue ) ) { 1088 return '0'; 1089 } 1090 1091 if ( 0 === numericValue && -Infinity === ( 1 / numericValue ) ) { 1092 return '-0'; 1093 } 1094 1095 return String( numericValue ); 1096 1097 }, 1098 1099 calculateValue: function( $scope ) { 1100 1101 var formula = String( $scope.data( 'formula' ) ), 1102 listenTo = $( '[name^="' + $scope.data( 'listen_to' ) + '"]', $scope.closest( 'form' ) ), 1103 regexp = /%([a-zA-Z0-9-_]+)%/g, 1104 func = null; 1105 1106 if ( ! formula ) { 1107 return null; 1108 } 1109 1110 formula = JetEngine.filters.applyFilters( 'forms/calculated-formula-before-value', formula, $scope ); 1111 1112 formula = formula.replace( regexp, function( match1, match2 ) { 1113 1114 var object = null; 1115 1116 if ( $scope.data( 'repeater' ) ) {
1117 object = $scope; 1118 } else if ( $scope.hasClass( 'jet-form__calculated-field--child' ) ) { 1119 object = $scope.closest( '.jet-form-repeater__row' ).find( '[data-field-name="' + match2 + '"]' ); 1120 } else if ( $scope.data( 'repeater-row' ) ) { 1121 object = $scope.find( '[data-field-name="' + match2 + '"]' ); 1122 } else { 1123 object = $scope.closest( 'form' ).find( '[name="' + match2 + '"], [name="' + match2 + '[]"]' ); 1124 } 1125 1126 return JetEngineForms.getCalculatedFieldNumericValue( object ); 1127 1128 } ); 1129 1130 formula = JetEngine.filters.applyFilters( 'forms/calculated-formula-after-value', formula, $scope ); 1131 1132 func = new Function( 'return ' + formula ); 1133 1134 return func(); 1135 1136 }, 1137 1138 recalcFields: function( event ) { 1139 1140 var $this = $( this ), 1141 fieldName = $this.attr( 'name' ), 1142 fieldPrecision = 2, 1143 calculated = null, 1144 done = false; 1145 1146 if ( $this.data( 'field-name' ) ) { 1147 fieldName = $this.data( 'field-name' ); 1148 } 1149 1150 if ( ! fieldName ) { 1151 return; 1152 } 1153 1154 $.each( JetEngineForms.calcFields, function( calcFieldName, field ) { 1155 1156 fieldName = fieldName.replace( '[]', '' ); 1157 1158 if ( 0 <= $.inArray( fieldName, field.listenTo ) ) { 1159 1160 calculated = JetEngineForms.calculateValue( field.el ); 1161 fieldPrecision = field.el.data( 'precision' ); 1162 1163 field.el.find( '.jet-form__calculated-field-val' ).text( calculated.toFixed( fieldPrecision ) ); 1164 field.el.find( '.jet-form__calculated-field-input' ).val( calculated.toFixed( fieldPrecision ) ).trigger( 'change.JetEngine' ); 1165 1166 } 1167 1168 } ); 1169 1170 if ( 'jet-engine/form/repeater-changed' !== event.type ) { 1171 1172 $.each( JetEngineForms.repeaterCalcFields, function( calcFieldName, field ) { 1173 1174 fieldName = fieldName.replace( '[]', '' ); 1175 1176 if ( 0 <= $.inArray( fieldName, field.listenTo ) ) { 1177 1178 field.el.trigger( 'jet-engine/form/repeater-changed' ); 1179 1180 } 1181 1182 } ); 1183 1184 } 1185 1186 $.each( JetEngineForms.childrenCalcFields, function( calcFieldName, field ) { 1187 1188 fieldName = fieldName.replace( '[]', '' ); 1189 1190 if ( 0 <= $.inArray( fieldName, field.listenTo ) ) { 1191 var $row = $this.closest( '.jet-form-repeater__row' ); 1192 JetEngineForms.calculateFieldsInRow( $row ); 1193 } 1194 1195 } ); 1196 1197 }, 1198 1199 initRequiredCheckboxGroup: function( $scope ) { 1200 var $group = $scope.find( '.jet-form__fields-group' ); 1201 1202 $group.each( function() { 1203 var $this = $( this ), 1204 $checkboxes = $( '.checkboxes-group-required', $this ); 1205 1206 if ( $checkboxes.length ) { 1207 var isChecked = $checkboxes.is( ':checked' ); 1208 1209 $checkboxes.attr( 'required', ! isChecked ); 1210 } 1211 } ); 1212 }, 1213 1214 requiredCheckboxGroup: function( event ) { 1215 var $this = $( event.target ), 1216 $group = $this.closest( '.jet-form__fields-group' ), 1217 $checkboxes = $( '.checkboxes-field', $group ); 1218 1219 if ( $checkboxes.length < 2 ) { 1220 return; 1221 } 1222 1223 var isChecked = $checkboxes.is( ':checked' ); 1224 1225 $checkboxes.attr( 'required', ! isChecked ); 1226 }, 1227 1228 initRangeFields: function( $scope ) { 1229 var $rangeFields = $scope.find( '.jet-form__field.range-field' ); 1230 1231 if ( ! $rangeFields.length ) { 1232 return; 1233 } 1234 1235 $rangeFields.each( function() { 1236 JetEngineForms.updateRangeField( { target: $( this ), firstInit: true } ); 1237 } ); 1238 }, 1239 1240 updateRangeField: function( event ) { 1241 var $target = $( event.target ), 1242 $wrap = $target.closest( '.jet-form__field-wrap' ), 1243 $number = $wrap.find( '.jet-form__field-value-number' ), 1244 max = $target.attr( 'max' ) || 100, 1245 val = $target.val(), 1246 isElemEditMode = window.elementorFrontend ? window.elementorFrontend.isEditMode() : false; 1247 1248 if ( event.firstInit && ! isElemEditMode ) { 1249 $number.text( max ).css( 'min-width', $number.width() ); 1250 } 1251 1252 $number.text( val ); 1253 }, 1254 1255 inputTextFields: function() { 1256 $( this ).trigger( 'change.JetEngine' ); 1257 }, 1258 1259 reloadSubmitForm: function( event ) { 1260 1261 var $maskedFields = $( event.target ).find( '.jet-form__masked-field' ); 1262 1263 if ( $maskedFields.length ) { 1264 $maskedFields.each( function() { 1265 var $maskedField = $( this ); 1266 1267 // Remove mask if empty value 1268 if ( !$maskedField.val() && $maskedField.inputmask ) { 1269 $maskedField.inputmask( 'remove' ); 1270 } 1271 } ); 1272 } 1273 1274 $( this ).find( '.jet-form__submit' ).attr( 'disabled', true ); 1275 }, 1276
1277 ajaxSubmitForm: function() { 1278 1279 var $this = $( this ), 1280 $form = $this.closest( '.jet-form' ), 1281 formID = $form.data( 'form-id' ), 1282 data = { 1283 action: 'jet_engine_form_booking_submit', 1284 }; 1285 1286 if ( 'undefined' !== typeof $form[ 0 ].checkValidity && 'undefined' !== typeof $form[ 0 ].reportValidity && ! $form[ 0 ].checkValidity() ) { 1287 $form[ 0 ].reportValidity(); 1288 return; 1289 } 1290 1291 if ( window.tinyMCE ) { 1292 window.tinyMCE.triggerSave(); 1293 } 1294 1295 data.values = $form.serializeArray(); 1296 data._jet_engine_booking_form_id = formID; 1297 1298 $form.addClass( 'is-loading' ); 1299 $this.attr( 'disabled', true ); 1300 1301 $( '.jet-form-messages-wrap[data-form-id="' + formID + '"]' ).html( '' ); 1302 $form.find( '.jet-form__field-error' ).remove(); 1303 1304 $.ajax( { 1305 url: JetEngineSettings.ajaxurl, 1306 type: 'POST', 1307 dataType: 'json', 1308 data: data, 1309 } ).done( function( response ) { 1310 1311 $form.removeClass( 'is-loading' ); 1312 $this.attr( 'disabled', false ); 1313 1314 switch ( response.status ) { 1315 1316 case 'validation_failed': 1317 1318 $.each( response.fields, function( index, fieldName ) { 1319 var $field = $form.find( '.jet-form__field[name="' + fieldName + '"]:last' ); 1320 1321 if ( $field.hasClass( 'checkradio-field' ) ) { 1322 $field.closest( '.jet-form__field-wrap' ).after( response.field_message ); 1323 } else { 1324 $field.after( response.field_message ); 1325 } 1326 1327 } ); 1328 1329 break; 1330 1331 case 'success': 1332 $( document ).trigger( 'jet-engine/form/ajax/on-success', [ response, $form, data ] ); 1333 break; 1334 } 1335 if ( response.redirect ) { 1336 window.location = response.redirect; 1337 } else if ( response.reload ) { 1338 window.location.reload(); 1339 } 1340 1341 $( '.jet-form-messages-wrap[data-form-id="' + formID + '"]' ).html( response.message ); 1342 1343 } ); 1344 1345 }, 1346 1347 clearFieldErrors: function() { 1348 1349 var $this = $( this ), 1350 formID = $this.closest( '.jet-form' ).data( 'form-id' ); 1351 $this.closest( '.jet-form-col' ).find( '.jet-form__field-error' ).remove(); 1352 $( '.jet-form-messages-wrap[data-form-id="' + formID + '"]' ).html( '' ); 1353 1354 }, 1355 1356 addTriggersWysiwyg: function( field, editorId ) { 1357 const callable = function( e ) { 1358 this.save(); 1359 field.trigger( 'change.JetEngine', [ this ] ); 1360 }; 1361 1362 setTimeout( function() { 1363 const editor = tinymce.get( editorId ); 1364 1365 if ( ! editor ) { 1366 return; 1367 } 1368 1369 editor 1370 .on( 'input', callable ) 1371 .on( 'change', callable ); 1372 } ); 1373 }, 1374 wysiwygInit: function( closure, replace = false ) { 1375 const self = $( closure ), 1376 editorID = self.attr( 'id' ), 1377 field = self.closest( '.jet-form__field' ); 1378 1379 if ( replace && window.tinymce && window.tinymce.get( editorID ) ) { 1380 window.tinymce.get( editorID ).remove(); 1381 } 1382 1383 window.wp.editor.initialize( 1384 editorID, 1385 field.data( 'editor' ), 1386 ); 1387 1388 return { editorID, field: self }; 1389 }, 1390 wysiwygInitWithTriggers: function( closure, replace = false ) { 1391 const { editorID, field } = JetEngineForms.wysiwygInit( closure, replace ); 1392 1393 JetEngineForms.addTriggersWysiwyg( field, editorID ); 1394 }, 1395 1396 }; 1397 1398 $( window ).on( 'elementor/frontend/init', JetEngineForms.init ); 1399 1400 window.addEventListener( 'DOMContentLoaded', function() { 1401 JetEngineForms.initBlocks(); 1402 } ); 1403 1404 window.JetEngineForms = JetEngineForms; 1405 1406 JetEngineForms.commonInit(); 1407 1408}( jQuery ) );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.