PageSourceSearch

https://www.hotel-ribno.si/wp-content/plugins/jet-engine/assets/js/frontend-forms.js?ver=3.8.14.3

js hotel-ribno.si collected 2026-09-29 21:01:22 UTC 34,884 bytes, 1,408 lines download raw bytes

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.