PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 2.0.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v2.0.3
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / assets / js / frontend / everest-forms.js
everest-forms / assets / js / frontend Last commit date
ajax-submission.js 2 years ago ajax-submission.min.js 2 years ago everest-forms.js 2 years ago everest-forms.min.js 2 years ago text-limit.js 6 years ago text-limit.min.js 4 years ago
everest-forms.js
784 lines
1 /* eslint-disable max-len */
2 /* global everest_forms_params */
3 jQuery( function ( $ ) {
4 'use strict';
5
6 // everest_forms_params is required to continue, ensure the object exists.
7 if ( typeof everest_forms_params === 'undefined' ) {
8 return false;
9 }
10
11 var getEnhancedSelectFormatString = function() {
12 return {
13 'language': {
14 noResults: function() {
15 return everest_forms_params.i18n_no_matches;
16 }
17 }
18 };
19 };
20
21 var everest_forms = {
22 $everest_form: $( 'form.everest-form' ),
23 init: function() {
24 this.init_inputMask();
25 this.init_mailcheck();
26 this.init_datepicker();
27 this.init_datedropdown();
28 this.load_validation();
29 this.submission_scroll();
30 this.randomize_elements();
31 this.init_enhanced_select();
32 this.checkUncheckAllcheckbox();
33 this.validateMinimumWordLength();
34
35 // Inline validation.
36 this.$everest_form.on( 'input validate change', '.input-text, select, input:checkbox, input:radio', this.validate_field );
37
38 // Notify plugins that the core was loaded.
39 $( document.body ).trigger( 'everest_forms_loaded' );
40 },
41 init_inputMask: function() {
42 // Only load if jQuery inputMask library exists.
43 if ( typeof $.fn.inputmask !== 'undefined' ) {
44 $( '.evf-masked-input' ).inputmask();
45 }
46 },
47 init_mailcheck: function() {
48 // Only load if Mailcheck library exists and enabled.
49 if ( typeof $.fn.mailcheck === 'undefined' || ! everest_forms_params.mailcheck_enabled ) {
50 return;
51 }
52
53 // Setup default domains for Mailcheck.
54 if ( everest_forms_params.mailcheck_domains.length > 0 ) {
55 Mailcheck.defaultDomains = Mailcheck.defaultDomains.concat( everest_forms_params.mailcheck_domains );
56 }
57
58 // Setup default top level domains for Mailcheck.
59 if ( everest_forms_params.mailcheck_toplevel_domains.length > 0 ) {
60 Mailcheck.defaultTopLevelDomains = Mailcheck.defaultTopLevelDomains.concat( everest_forms_params.mailcheck_toplevel_domains );
61 }
62
63 // Mailcheck suggestion.
64 $( document ).on( 'blur', '.evf-field-email input', function() {
65 var $el = $( this ),
66 id = $el.attr( 'id' );
67
68 $el.mailcheck( {
69 suggested: function( el, suggestion ) {
70 $( '#' + id + '_suggestion' ).remove();
71 var suggestion_msg = everest_forms_params.i18n_messages_email_suggestion.replace( '{suggestion}', '<a href="#" class="mailcheck-suggestion" data-id="' + id + '" title="' + everest_forms_params.i18n_messages_email_suggestion_title + '">' + suggestion.full + '</a>' );
72 if( el.parents( 'span.input-wrapper' ).length ) {
73 $( el ).parents( 'span.input-wrapper' ).after( '<label class="evf-error mailcheck-error" id="' + id + '_suggestion">' + suggestion_msg + '</label>' );
74 }else {
75 $( el ).after( '<label class="evf-error mailcheck-error" id="' + id + '_suggestion">' + suggestion_msg + '</label>' );
76 }
77 },
78 empty: function() {
79 $( '#' + id + '_suggestion' ).remove();
80 },
81 } );
82 } );
83
84 // Apply Mailcheck suggestion.
85 $( document ).on( 'click', '.evf-field-email .mailcheck-suggestion', function( e ) {
86 var $el = $( this ),
87 id = $el.attr( 'data-id' );
88 e.preventDefault();
89 $( '#' + id ).val( $el.text() );
90 $el.parent().remove();
91 } );
92 },
93 init_datepicker: function () {
94 var evfDateField = $( '.evf-field-date-time' );
95 if ( evfDateField.length && evfDateField.find( '.flatpickr-field' ).length ) {
96 evfDateField.find( '.flatpickr-field' ).each( function () {
97 var timeInterval = 5,
98 inputData = $( this ).data(),
99 disableDates = [];
100
101 var minDateRange = '';
102 if( inputData.minDateRange ) {
103 minDateRange = 'today';
104 if( 'today' === inputData.minDateRange ) {
105 minDateRange = minDateRange
106 } else if ( /^\s*[-+]?\d+\s*d/i.test( inputData.minDateRange ) ) {
107 minDateRange = inputData.minDateRange.match( /^\s*[-+]?\d+\s*d/i )[0].replace( 'd', '' );
108 minDateRange = new Date().fp_incr( minDateRange );
109 } else {
110 minDateRange = 'today';
111 }
112 }
113
114 var maxDateRange = '';
115 if( inputData.maxDateRange ) {
116 maxDateRange = 'today';
117 if( 'today' === inputData.maxDateRange ) {
118 maxDateRange = maxDateRange
119 } else if ( /^\s*[-+]?\d+\s*d/i.test( inputData.maxDateRange ) ) {
120 maxDateRange = inputData.maxDateRange.match( /^\s*[-+]?\d+\s*d/i )[0].replace( 'd', '' );
121 maxDateRange = new Date().fp_incr( maxDateRange );
122 } else {
123 maxDateRange = '';
124 }
125 }
126
127 // Extract list of disabled dates.
128 if ( inputData.disableDates ) {
129 disableDates = inputData.disableDates.split( ',' );
130 }
131
132 if(inputData.pastDisableDate){
133 var pastDisableDate = inputData.pastDisableDate;
134 } else {
135 var pastDisableDate = '';
136 }
137
138 switch( inputData.dateTime ) {
139 case 'date':
140 // Apply flatpicker to field.
141 $( this ).flatpickr({
142 disableMobile : true,
143 mode : inputData.mode,
144 minDate : minDateRange ? minDateRange : ( inputData.minDate ? inputData.minDate : pastDisableDate ),
145 maxDate : maxDateRange ? maxDateRange : inputData.maxDate,
146 dateFormat : inputData.dateFormat,
147 disable : disableDates,
148 });
149 break;
150 case 'time':
151 if ( undefined !== inputData.timeInterval ) {
152 timeInterval = parseInt( inputData.timeInterval, 10 );
153 }
154
155 // Apply flatpicker to field.
156 $( this ).flatpickr({
157 enableTime : true,
158 noCalendar : true,
159 minuteIncrement : timeInterval,
160 dateFormat : inputData.dateFormat,
161 disableMobile : true,
162 time_24hr : inputData.dateFormat.includes('H:i')
163 });
164 break;
165 case 'date-time':
166 if ( undefined !== inputData.timeInterval ) {
167 timeInterval = parseInt( inputData.timeInterval, 10 );
168 }
169
170 // Apply flatpicker to field.
171 $( this ).flatpickr({
172 enableTime : true,
173 noCalendar : false,
174 disableMobile : true,
175 mode : inputData.mode,
176 minDate : minDateRange ? minDateRange : ( inputData.minDate ? inputData.minDate : pastDisableDate ),
177 maxDate : maxDateRange ? maxDateRange : inputData.maxDate,
178 minuteIncrement : timeInterval,
179 dateFormat : inputData.dateFormat,
180 time_24hr : inputData.dateFormat.includes( 'H:i' ),
181 disable : disableDates,
182 });
183 break;
184 default:
185 }
186 } );
187 }
188 $(document).find(".evf-field-date-time input").on('change', function (event) {
189 var slotBooking = $(this).data('slot-booking'),
190 targetLabel = $(this).parent(),
191 errorLabel = $(this).parent().find('label.evf-error');
192 if(slotBooking === 1) {
193 var dataTimeValue = $(this).val(),
194 dateFormat = $(this).data('date-format'),
195 dateTimeFormat = $(this).data('date-time'),
196 mode = $(this).data('mode'),
197 form_id = $(this).data('form-id'),
198 time_interval = $(this).data('time-interval'),
199 data = {'action':'everest_forms_slot_booking', 'data-time-value':dataTimeValue, 'data-format': dateFormat, 'data-time-format': dateTimeFormat, 'mode': mode, 'form-id': form_id, 'time-interval':time_interval, 'security': everest_forms_params.everest_forms_slot_booking};
200
201 $.ajax({
202 url:everest_forms_params.ajax_url,
203 data: data,
204 type: 'POST',
205 beforeSend: function () {
206 var submitButton = $(document).find('.evf-submit-container button');
207 $(submitButton).prop('disabled', true);
208 },
209 success: function (res) {
210 if($(errorLabel).length) {
211 $(errorLabel).remove();
212 }
213 if(res.success === true) {
214 var message = res.data.message;
215 $(targetLabel).append('<label class="evf-error">'+message+'</label>');
216 var submitButton = $(document).find('.evf-submit-container button');
217 $(submitButton).prop('disabled', true);
218 } else {
219 var submitButton = $(document).find('.evf-submit-container button');
220 $(submitButton).prop('disabled', false);
221 }
222 }
223 });
224 }
225 })
226
227 },
228 init_datedropdown: function () {
229 //Dropdown logic here
230 $( '.date-dropdown-field' ).each( function() {
231 var $this = $ (this );
232 $this.hide();
233 everest_forms.change_minutes( $this );
234 });
235
236 $( 'body' ).on( 'change', '.date-time-container [id*=hour-select]', function() {
237 var $this = $( this ).siblings( 'input.date-dropdown-field' );
238 everest_forms.change_minutes( $this );
239 })
240
241 $( 'body' ).on( 'change', '.date-time-container [id*=-select]', function() {
242 var $this = $( this ).siblings( 'input.date-dropdown-field' );
243 $this.val( everest_forms.format_dropdown_date( $this ) );
244 })
245 },
246 change_minutes: function( $this ) {
247 //Changes minutes as per hours selected, Time limit option.
248 var id = $this.attr( 'id' );
249 if( typeof( $this.siblings( '#minute-select-' + id ).attr( 'id' ) ) != 'undefined' ) {
250 var max_hour = $this.attr( 'data-max-hour' );
251 var min_hour = $this.attr( 'data-min-hour' );
252 var max_minute = $this.attr( 'data-max-minute' );
253 var min_minute = $this.attr( 'data-min-minute' );
254 if( typeof( min_hour ) == 'undefined' || min_hour == '' ) {
255 min_hour = 0;
256 }
257 if( typeof (max_hour ) == 'undefined' || max_hour == '' ) {
258 min_hour = 23;
259 }
260 if( typeof( min_minute ) == 'undefined' || min_minute == '' ) {
261 min_minute = 0;
262 }
263 if( typeof( max_minute ) == 'undefined' || max_minute == '' ) {
264 max_minute = 59;
265 }
266 var options = '';
267 for( var i = 0; i<= 59; i++ ) {
268 if( $this.siblings( '#hour-select-' + id ).val() == min_hour && i < min_minute ) {
269 continue;
270 }
271 if( $this.siblings( '#hour-select-' + id ).val() == max_hour && i > max_minute ) {
272 break;
273 }
274 options += '<option value = "' + i + '"> ' + ( ( i< 10 ) ? '0' + i : i ) + '</option>';
275 }
276
277 $this.siblings( '#minute-select-'+id ).html( options );
278 $this.siblings( '#minute-select-'+id ).attr('value', $this.siblings( '#minute-select-'+id ).find('option:first').val());
279 }
280 $this.val( everest_forms.format_dropdown_date( $this ) );
281 },
282 format_dropdown_date: function ( $this ) {
283 var id = $this.attr( 'id' );
284 var selectd_date = {
285 selected_year: $this.siblings( '#year-select-' + id ).val(),
286 selected_month: $this.siblings( '#month-select-' + id ).val(),
287 selected_day: $this.siblings( '#day-select-' + id ).val(),
288 selected_hour: $this.siblings( '#hour-select-' + id ).val(),
289 selected_minute: $this.siblings( '#minute-select-' + id ).val()
290 }
291 var setting = {
292 date_format: $this.attr( 'data-date-format' ),
293 date_time: $this.attr( 'data-date-time' )
294 }
295 var list_months = [
296 'January',
297 'Febuary',
298 'March',
299 'April',
300 'May',
301 'June',
302 'July',
303 'August',
304 'September',
305 'October',
306 'November',
307 'December'
308 ];
309 var formatted_date = '';
310 if( setting.date_time == 'date' || setting.date_time == 'date-time' ) {
311 selectd_date.selected_day = (selectd_date.selected_day < 10 ) ? '0' + selectd_date.selected_day : selectd_date.selected_day;
312 if ( setting.date_format.match( /F j, Y/ ) ) {
313 formatted_date = list_months[ parseInt( selectd_date.selected_month ) - 1 ] + ' ' + selectd_date.selected_day + ', ' + selectd_date.selected_year;
314 } else {
315 selectd_date.selected_month = (selectd_date.selected_month < 10 ) ? '0' + selectd_date.selected_month : selectd_date.selected_month;
316 if(setting.date_format.match( /Y-m-d/ ) ) {
317 formatted_date = selectd_date.selected_year + '-' + selectd_date.selected_month + '-' + selectd_date.selected_day;
318 } else if ( setting.date_format.match( /m\/d\/Y/ ) ) {
319 formatted_date = selectd_date.selected_month + '/' + selectd_date.selected_day + '/' + selectd_date.selected_year;
320 } else {
321 formatted_date = selectd_date.selected_day + '/' + selectd_date.selected_month + '/' + selectd_date.selected_year;
322 }
323 }
324 }
325 if( setting.date_time == 'time' || setting.date_time == 'date-time' ) {
326 selectd_date.selected_minute = ( selectd_date.selected_minute < 10) ? '0' + selectd_date.selected_minute : selectd_date.selected_minute;
327 if( setting.date_format.match( /H:i/ ) ) {
328 selectd_date.selected_hour = ( selectd_date.selected_hour < 10 ) ? '0' + selectd_date.selected_hour : selectd_date.selected_hour;
329 formatted_date += ' ' + selectd_date.selected_hour + ":" + selectd_date.selected_minute;
330 } else {
331 var period = 'PM';
332 if( selectd_date.selected_hour < 12 ) {
333 period = 'AM'
334 if( selectd_date.selected_hour == 0 ){
335 selectd_date.selected_hour = 12;
336 }
337 } else if ( selectd_date.selected_hour > 12 ) {
338 selectd_date.selected_hour = selectd_date.selected_hour - 12;
339 }
340
341 formatted_date += ' ' + selectd_date.selected_hour + ":" + selectd_date.selected_minute + ' ' + period;
342 }
343 }
344 return formatted_date.trim();
345 },
346 load_validation: function() {
347 if ( typeof $.fn.validate === 'undefined' ) {
348 return false;
349 }
350
351 // Prepend URL field contents with http:// if user input doesn't contain a schema.
352 $( '.evf-field-url input[type=url]' ).on( 'change', function () {
353 var url = $( this ).val();
354 if ( ! url ) {
355 return false;
356 }
357 if ( url.substr( 0, 7 ) !== 'http://' && url.substr( 0, 8 ) !== 'https://' ) {
358 $( this ).val( 'http://' + url );
359 }
360 });
361
362 // Validator messages.
363 $.extend( $.validator.messages, {
364 required: everest_forms_params.i18n_messages_required,
365 url: everest_forms_params.i18n_messages_url,
366 email: everest_forms_params.i18n_messages_email,
367 number: everest_forms_params.i18n_messages_number
368 });
369
370 // Validate email addresses.
371 $.validator.methods.email = function( value, element ) {
372 /* https://stackoverflow.com/questions/2855865/jquery-validate-e-mail-address-regex */
373 var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
374 return this.optional( element ) || pattern.test( value );
375 };
376
377 // Validate confirmations.
378 $.validator.addMethod( 'confirm', function( value, element, param ) {
379 return $.validator.methods.equalTo.call( this, value, element, param );
380 }, everest_forms_params.i18n_messages_confirm );
381
382 // Validate checkbox choice limit.
383 $.validator.addMethod( 'check-limit', function( value, element ) {
384 var $ul = $( element ).closest( 'ul' ),
385 $checked = $ul.find( 'input[type="checkbox"]:checked' ),
386 choiceLimit = parseInt( $ul.attr( 'data-choice-limit' ) || 0, 10 );
387
388 if ( 0 === choiceLimit ) {
389 return true;
390 }
391
392 return $checked.length <= choiceLimit;
393 }, function( params, element ) {
394 var choiceLimit = parseInt( $( element ).closest( 'ul' ).attr( 'data-choice-limit' ) || 0, 10 );
395 return everest_forms_params.i18n_messages_check_limit.replace( '{#}', choiceLimit );
396 } );
397
398 this.$everest_form.each( function() {
399 var $this = $( this );
400
401 // List messages to show for required fields. Use name of the field as key.
402 var error_messages = {};
403 $( '.evf-field' ).each( function() {
404 var form_id = $( this ).closest( 'form' ).data( 'formid' );
405 var field_id = $( this ).data( 'field-id' );
406 var error_message = $( this ).data( 'required-field-message' );
407 var key = 'everest_forms[form_fields][' + field_id + ']'; // Name of the input field is used as a key.
408
409 if ( $( this ).is( '.evf-field-payment-single' ) ) {
410 if ( ! $( this ).find('.evf-payment-price').is( '.evf-payment-user-input' ) ) {
411 $( this ).find('.evf-payment-price').attr( 'required', false );
412 error_message = null;
413 }
414 } else if ( $( this ).is( '.evf-field-checkbox, .evf-field-payment-checkbox' ) ) {
415 key = key + '[]';
416 } else if ( $( this ).is( '.evf-field-image-upload' ) ) {
417 key = 'evf_' + form_id + '_' + field_id;
418 } else if ( $( this ).is( '.evf-field-signature' ) ) {
419 key = 'everest_forms[form_fields][' + field_id + '][signature_image]';
420 } else if ( $( this ).is( '.evf-field-phone' ) ) {
421 key = key + '[phone_field]';
422 } else if ( $( this ).is( '.evf-field-email' ) || $( this ).is( '.evf-field-password' ) ) {
423 // For when the confirm is disabled.
424 key = 'everest_forms[form_fields][' + field_id + ']';
425 error_messages[ key ] = {
426 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
427 };
428
429 // For when the confirm is enabled.
430 key = 'everest_forms[form_fields][' + field_id + '][primary]';
431 error_messages[ key ] = {
432 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
433 };
434 key = 'everest_forms[form_fields][' + field_id + '][secondary]';
435 error_messages[ key ] = {
436 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
437 };
438 error_message = null;
439 } else if ( $( this ).is( '.evf-field-address' ) ) {
440 var sub_field_error_messages = {
441 'address1': $( this ).data( 'required-field-message-address1' ),
442 'city' : $( this ).data( 'required-field-message-city' ),
443 'state' : $( this ).data( 'required-field-message-state' ),
444 'postal' : $( this ).data( 'required-field-message-postal' ),
445 'country' : $( this ).data( 'required-field-message-country' ),
446 }
447
448 var sub_field_types = Object.keys( sub_field_error_messages );
449 for ( var i = 0; i < sub_field_types.length; i++ ) {
450 var sub_field_type = sub_field_types[i],
451 error_message = sub_field_error_messages[ sub_field_types[i] ];
452
453 key = 'everest_forms[form_fields][' + field_id + '][' + sub_field_type + ']';
454 error_messages[ key ] = {
455 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
456 };
457 }
458 error_message = null;
459 } else if ( $( this ).is( '.evf-field-likert' ) ) {
460 var row_keys = $( this ).data( 'row-keys' );
461 var sub_field_error_messages = {};
462
463 if ( row_keys && Array.isArray( row_keys ) ) {
464 for ( var i = 0; i < row_keys.length; i++ ) {
465 var row_key = row_keys[i];
466 sub_field_error_messages[ row_key ] = $( this ).data( 'required-field-message-' + row_key );
467 }
468 for ( var i = 0; i < row_keys.length; i++ ) {
469 error_message = sub_field_error_messages[ row_keys[i] ];
470 key = 'everest_forms[form_fields][' + field_id + '][' + row_keys[i] + ']';
471 error_messages[ key ] = {
472 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
473 };
474 }
475 }
476 error_message = null;
477 } else if ( $( this ).is( '.evf-field-file-upload' ) ) {
478 key = 'everest_forms_' + form_id + '_' + field_id;
479 }
480
481 /**
482 * Check if the error message has been already set (null value in error_message variable
483 * should indicate that the message has already been set).
484 */
485 if ( error_message ) {
486 error_messages[ key ] = {
487 required: error_message, // Set message using 'required' key to avoid conflicts with other validations.
488 };
489 }
490 });
491
492 $this.validate({
493 messages: error_messages,
494 ignore: '',
495 errorClass: 'evf-error',
496 validClass: 'evf-valid',
497 errorPlacement: function( error, element ) {
498 if ( element.closest( '.evf-field' ).is( '.evf-field-privacy-policy' ) ) {
499 element.closest( '.evf-field' ).append( error );
500 } else if ( element.closest( '.evf-field' ).is( '.evf-field-range-slider' ) ) {
501 if ( element.closest( '.evf-field' ).find( '.evf-field-description' ).length ) {
502 element.closest( '.evf-field' ).find( '.evf-field-description' ).before( error );
503 } else {
504 element.closest( '.evf-field' ).append( error );
505 }
506 } else if ( element.closest( '.evf-field' ).is( '.evf-field-scale-rating' ) ) {
507 element.closest( '.evf-field' ).find( '.everest-forms-field-scale-rating' ).after( error );
508 } else if ( 'radio' === element.attr( 'type' ) || 'checkbox' === element.attr( 'type' ) ) {
509 if ( element.hasClass( 'everest-forms-likert-field-option' ) ) {
510 element.closest( 'tr' ).children( 'th' ).append( error );
511 } else {
512 element.closest( '.evf-field-checkbox' ).find( 'label.evf-error' ).remove();
513 element.parent().parent().parent().append( error );
514 }
515 } else if ( element.is( 'select' ) && element.attr( 'class' ).match( /date-month|date-day|date-year/ ) ) {
516 if ( element.parent().find( 'label.evf-error:visible' ).length === 0 ) {
517 element.parent().find( 'select:last' ).after( error );
518 }
519 } else if ( element.is( 'select' ) && element.hasClass( 'evf-enhanced-select' ) ) {
520 if ( element.parent().find( 'label.evf-error:visible' ).length === 0 ) {
521 element.parent().find( '.select2' ).after( error );
522 }
523 } else if ( element.hasClass( 'evf-smart-phone-field' ) || element.hasClass( 'everest-forms-field-password-primary' ) || element.hasClass( 'everest-forms-field-password-secondary' ) ) {
524 if( element.parents('span.input-wrapper').length ) {
525 element.parents('span.input-wrapper').after( error );
526 } else {
527 element.parent().after( error );
528 }
529 } else {
530 if( element.parents('span.input-wrapper').length ) {
531 element.parents('span.input-wrapper').after( error );
532 } else {
533 error.insertAfter( element );
534 }
535 }
536 },
537 highlight: function( element, errorClass, validClass ) {
538 var $element = $( element ),
539 $parent = $element.closest( '.form-row' ),
540 inputName = $element.attr( 'name' );
541
542 if ( $element.attr( 'type' ) === 'radio' || $element.attr( 'type' ) === 'checkbox' ) {
543 $parent.find( 'input[name="' + inputName + '"]' ).addClass( errorClass ).removeClass( validClass );
544 } else {
545 $element.addClass( errorClass ).removeClass( validClass );
546 }
547
548 $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid evf-has-error' );
549 },
550 unhighlight: function( element, errorClass, validClass ) {
551 var $element = $( element ),
552 $parent = $element.closest( '.form-row' ),
553 inputName = $element.attr( 'name' );
554
555 if ( $element.attr( 'type' ) === 'radio' || $element.attr( 'type' ) === 'checkbox' ) {
556 $parent.find( 'input[name="' + inputName + '"]' ).addClass( validClass ).removeClass( errorClass );
557 } else {
558 $element.addClass( validClass ).removeClass( errorClass );
559 }
560
561 $parent.removeClass( 'evf-has-error' );
562 },
563 submitHandler: function( form ) {
564 var $form = $( form ),
565 $submit = $form.find( '.evf-submit' ),
566 processText = $submit.data( 'process-text' );
567 var recaptchaID = $submit.get( 0 ).recaptchaID;
568 var razorpayForms = $form.find( "[data-gateway='razorpay']" );
569 var stripeForms = $form.find( "[data-gateway*='stripe']" );
570 // Process form.
571 if ( processText ) {
572 $submit.text( processText ).prop( 'disabled', true );
573 }
574
575 if ( recaptchaID === 0 ) {
576 grecaptcha.execute( recaptchaID );
577 return false;
578 }
579
580 if( razorpayForms.length > 0 ){
581 return;
582 }
583
584 if ( 1 !== $form.data( 'ajax_submission' ) || (stripeForms.length < 0 && 0 !== stripeForms.children.length) ) {
585 form.submit();
586 } else {
587 return;
588 }
589 },
590 onkeyup: function( element, event ) {
591 // This code is copied from JQuery Validate 'onkeyup' method with only one change: 'everest-forms-novalidate-onkeyup' class check.
592 var excludedKeys = [ 16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225 ];
593
594 // Disable onkeyup validation for some elements (e.g. remote calls).
595 if ( $( element ).hasClass( 'everest-forms-novalidate-onkeyup' ) ) {
596 return;
597 }
598
599 if ( 9 === event.which && '' === this.elementValue( element ) || -1 !== $.inArray( event.keyCode, excludedKeys ) ) {
600 return;
601 } else if ( element.name in this.submitted || element.name in this.invalid ) {
602 this.element( element );
603 }
604 },
605 onfocusout: function( element ) {
606 // This code is copied from JQuery Validate 'onfocusout' method with only one change: 'everest-forms-novalidate-onkeyup' class check.
607 var validate = false;
608
609 // Empty value error handling for elements with onkeyup validation disabled.
610 if ( $( element ).hasClass( 'everest-forms-novalidate-onkeyup' ) && ! element.value ) {
611 validate = true;
612 }
613
614 if ( ! this.checkable( element ) && ( element.name in this.submitted || ! this.optional( element ) ) ) {
615 validate = true;
616 }
617
618 if ( validate ) {
619 this.element( element );
620 }
621 },
622 onclick: function( element ) {
623 var validate = false,
624 type = ( element || {} ).type,
625 $el = $( element );
626
627 if ( 'checkbox' === type ) {
628 $el.closest( '.evf-field-checkbox' ).find( 'label.evf-error' ).remove();
629 validate = true;
630 } else if ( ! 'select-multiple' === type ) {
631 $( element ).valid();
632 }
633
634 if ( validate ) {
635 this.element( element );
636 }
637 }
638 });
639 });
640 },
641 validate_field: function ( e ) {
642 var $this = $( this ),
643 $body = $( 'body' ),
644 $parent = $this.closest( '.form-row' ),
645 validated = true,
646 validate_required = $parent.is( '.validate-required' ),
647 validate_email = $parent.is( '.validate-email' ),
648 event_type = e.type;
649
650 if ( $body.hasClass( 'everest-forms-is-offline' ) ) {
651 $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email everest-forms-validated' );
652 } else if ( $parent.hasClass( 'evf-field-address' ) || $parent.hasClass( 'evf-field-payment-single' ) || $( 'body' ).hasClass( 'everest-forms-is-offline' ) ) {
653 if ( 0 === $parent.find( 'input.evf-error' ).length ) {
654 $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email' ).addClass( 'everest-forms-validated' );
655 }
656 } else {
657 if ( 'input' === event_type ) {
658 $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email everest-forms-validated' );
659 }
660
661 if ( 'validate' === event_type || 'change' === event_type ) {
662 if ( validate_required ) {
663 if ( $this.hasClass( 'everest-forms-likert-field-option' ) ) {
664 if ( $parent.find( 'input.evf-error' ).length > 0 ) {
665 $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' );
666 validated = false;
667 }
668 } else if ( 'checkbox' === $this.attr( 'type' ) && 0 === $parent.find( 'input:checked' ).length ) {
669 $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' );
670 validated = false;
671 } else if ( '' === $this.val() ) {
672 $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' );
673 validated = false;
674 }
675 }
676
677 if ( validate_email ) {
678 if ( $this.val() ) {
679 /* https://stackoverflow.com/questions/2855865/jquery-validate-e-mail-address-regex */
680 var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i); // eslint-disable-line max-len
681
682 if ( ! pattern.test( $this.val() ) ) {
683 $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-email' );
684 validated = false;
685 }
686 }
687 }
688 if ( validated ) {
689 $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email' ).addClass( 'everest-forms-validated' );
690 }
691 }
692 }
693 },
694 submission_scroll: function(){
695 if ( $( 'div.everest-forms-submission-scroll' ).length ) {
696 $( 'html,body' ).animate( {
697 scrollTop: ( $( 'div.everest-forms-submission-scroll' ).offset().top ) - 100
698 }, 1000 );
699 }
700 },
701 randomize_elements: function() {
702 $( '.everest-forms-randomize' ).each( function() {
703 var $list = $( this ),
704 $listItems = $list.children();
705
706 while ( $listItems.length ) {
707 $list.append( $listItems.splice( Math.floor( Math.random() * $listItems.length ), 1 )[0] );
708 }
709 } );
710 },
711 init_enhanced_select: function() {
712 // Only continue if SelectWoo library exists.
713 try {
714 $( document.body ).on( 'evf-frontend-enhanced-select-init', function() {
715 if ( 'undefined' !== typeof $.fn.selectWoo ) {
716 $( 'select.evf-enhanced-select:visible' ).filter( ':not(.evf-enhanced)' ).each( function() {
717 var select2_args = $.extend({
718 minimumResultsForSearch: 10 < $( this ).find( 'option' ).length ? 10 : null,
719 placeholder: $( this ).attr( 'placeholder' ) || '',
720 allowClear: $( this ).prop( 'multiple' ) ? false : true,
721 }, getEnhancedSelectFormatString() );
722
723 $( this ).selectWoo( select2_args ).addClass( 'evf-enhanced' );
724 });
725 }
726 }).trigger( 'evf-frontend-enhanced-select-init' );
727 } catch( err ) {
728 // If select2 failed (conflict?) log the error but don't stop other scripts breaking.
729 window.console.log( err );
730 }
731 },
732 checkUncheckAllcheckbox: function () {
733 // To check and uncheck all the option in checkbox.
734 var all_select_all_chk = $('form.everest-form').find('.evf-field, .evf-field-checkbox, .form-row').find('ul').find('li.evf-select-all-checkbox-li').find('#evfCheckAll');
735 if (all_select_all_chk.length){
736
737 all_select_all_chk.each(function () {
738 var $this = $(this);
739
740 $this.on('click', function () {
741 if($(this).prop("checked") == true){
742 $this.parent().parent().find('li').find('input:checkbox').not($this).prop('checked', true);
743 }else if($(this).prop("checked") == false){
744 $this.parent().parent().find('li').find('input:checkbox').not($this).prop('checked', false);
745 }
746 });
747
748 $this.parent().parent().find('li').find('input:checkbox').not($this).on('change', function () {
749 var checked = ($this.parent().parent().find('li').find('input:checkbox:checked').not($this)).length;
750 var chck_len = ($this.parent().parent().find('li').find('input:checkbox').not($this)).length;
751
752 if (checked === chck_len) {
753 $this.prop('checked', true);
754 } else if (checked < chck_len) {
755 $this.prop('checked', false);
756 }
757 });
758 });
759 }
760 },
761 validateMinimumWordLength: function() {
762 Array.prototype.slice.call( document.querySelectorAll( '.everest-forms-min-words-length-enabled' ) ).map( function( event ) {
763 var minWords = parseInt( event.dataset.textMinLength, 10 ) || 0;
764
765 // Add the custom validation method.
766 jQuery.validator.addMethod( 'minWordLength',
767 function(value, element, params) {
768 var wordsCount = value.trim().split( /\s+/ ).length;
769 return wordsCount >= params[0];
770 }, everest_forms_params.il8n_min_word_length_err_msg
771 );
772
773 jQuery( '#'+event.id ).each( function() {
774 jQuery( this ).rules( 'add', { minWordLength: [minWords] });
775 });
776
777 } );
778 },
779 };
780
781 everest_forms.init();
782
783 });
784