PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.5.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.5.3
3.5.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 / ajax-submission.js
everest-forms / assets / js / frontend Last commit date
ajax-submission.js 1 month ago ajax-submission.min.js 1 month ago everest-forms-file-upload.js 4 months ago everest-forms-file-upload.min.js 4 months ago everest-forms-survey-polls-quiz.js 1 year ago everest-forms-survey-polls-quiz.min.js 2 years ago everest-forms.js 4 months ago everest-forms.min.js 4 months ago evf-form-preview.js 1 year ago evf-form-preview.min.js 1 year ago text-limit.js 1 year ago text-limit.min.js 1 year ago
ajax-submission.js
577 lines
1 /* global everest_forms_ajax_submission_params */
2 jQuery( function( $ ) {
3 'use strict';
4
5 var isPaymentDebugEnabled = function() {
6 try {
7 return (
8 window.everest_forms_ajax_submission_params &&
9 '1' === String( window.everest_forms_ajax_submission_params.payment_debug || '' )
10 );
11 } catch ( e ) {
12 return false;
13 }
14 };
15
16 var getSafePaymentDebugErrorMessage = function( error ) {
17 if ( ! error ) {
18 return '';
19 }
20 if ( 'string' === typeof error ) {
21 return error;
22 }
23 if ( error.messages && error.messages.message ) {
24 var messages = error.messages.message;
25 if ( Array.isArray( messages ) && messages.length && messages[ 0 ].text ) {
26 return String( messages[ 0 ].text );
27 }
28 }
29 if ( error.message ) {
30 return String( error.message );
31 }
32 return 'Payment request failed.';
33 };
34
35 var sanitizePaymentDebugPayload = function( payload ) {
36 if ( null === payload || undefined === payload ) {
37 return {};
38 }
39 if ( 'object' !== typeof payload || Array.isArray( payload ) ) {
40 return payload;
41 }
42
43 var safe = {};
44 Object.keys( payload ).forEach( function( key ) {
45 if ( 'error' === key ) {
46 safe.error = getSafePaymentDebugErrorMessage( payload.error );
47 return;
48 }
49 if ( 'response' === key ) {
50 safe.response =
51 'string' === typeof payload.response
52 ? payload.response
53 : payload.response
54 ? '[redacted]'
55 : undefined;
56 return;
57 }
58 safe[ key ] = payload[ key ];
59 } );
60 return safe;
61 };
62
63 var paymentDebugLog = function( formTuple, stage, payload ) {
64 if ( ! isPaymentDebugEnabled() ) {
65 return;
66 }
67
68 try {
69 // eslint-disable-next-line no-console
70 console.log(
71 '[EVF Payment Debug] ' + String( stage || '' ),
72 sanitizePaymentDebugPayload( payload )
73 );
74 } catch ( e ) {
75 // no-op
76 }
77 };
78
79 /**
80 * Selected gateway slug from posted radio value (not data-evf-gateway / CSS alone).
81 *
82 * @param {jQuery} formTuple Form wrapper.
83 * @return {string|undefined}
84 */
85 function getSelectedPaymentGatewayFromForm( formTuple ) {
86 var $checked = formTuple.find( '.evf-payment-gateway-radio:checked' );
87 if ( ! $checked.length ) {
88 return undefined;
89 }
90 var value = $checked.val();
91 return value ? String( value ) : undefined;
92 }
93
94 var evf_ajax_submission_init = function(){
95 var form = $( 'form[data-ajax_submission="1"]' );
96 form.each( function( i, v ) {
97 $( document ).ready( function() {
98 var formTuple = $( v ),
99 btn = formTuple.find( '.evf-submit' ),
100 razorpayForms = formTuple.find( "[data-gateway='razorpay']" );
101
102 btn.on( 'click', async function( e ) {
103 var selectedGatewayFromSelector = getSelectedPaymentGatewayFromForm( formTuple );
104 var paymentMethod = selectedGatewayFromSelector;
105 if(undefined === paymentMethod) {
106 paymentMethod = formTuple.find( ".everest-forms-stripe-gateways-tabs .evf-tab" ).has( 'a.active' ).data( 'gateway' );
107 }
108 if(undefined === paymentMethod) {
109 paymentMethod = formTuple.find( ".everest-forms-gateway[data-gateway='stripe']" ).data( 'gateway' );
110 }
111 paymentDebugLog( formTuple, 'submit_click_start', {
112 formId: formTuple.data( 'formid' ),
113 paymentMethod: paymentMethod
114 } );
115
116 if (formTuple.find( ".everest-forms-gateway[data-gateway='stripe']").hasClass('StripeElement--empty') && formTuple.find( '.evf-field-credit-card' ).is(':visible') ){
117 $(document).ready(function() {
118 $('#card-errors').html('This field is required').show();
119 $('.evf-submit').text('Submit');
120 $('.evf-submit').attr('disabled', false);
121
122 });
123 formTuple.trigger( 'focusout' ).trigger( 'change' ).trigger( 'submit' );
124 return false;
125 }
126
127 var hasPaymentGatewaySelector = formTuple.find( '.evf-payment-gateway-radio' ).length > 0;
128
129 // For square payment credit card validation.
130 var squareSelectedGateway = getSelectedPaymentGatewayFromForm( formTuple );
131 var squareIsSelected = hasPaymentGatewaySelector
132 ? 'square' === squareSelectedGateway
133 : 'square' === squareSelectedGateway || ( undefined === squareSelectedGateway && 'none' !== formTuple.find( ".everest-forms-gateway[data-gateway='square']" ).closest( '.evf-field' ).css( 'display' ) );
134 paymentDebugLog( formTuple, 'square_selection_check', {
135 hasPaymentGatewaySelector: hasPaymentGatewaySelector,
136 squareSelectedGateway: squareSelectedGateway,
137 squareIsSelected: squareIsSelected
138 } );
139 if ( squareIsSelected ) {
140 var squareMsgContainer = formTuple.find(".everest-forms-gateway[data-gateway='square']").find('.sq-card-message-error');
141 if ( squareMsgContainer.length > 0 ) {
142 var squareErrorMsg = squareMsgContainer.text();
143 paymentDebugLog( formTuple, 'square_validation_error', {
144 squareErrorMsg: squareErrorMsg
145 } );
146 $( document ).ready( function() {
147 $( '#card-errors' ).html( squareErrorMsg ).show();
148 $( '.evf-submit' ).text( 'Submit' );
149 $( '.evf-submit' ).attr( 'disabled', false);
150 });
151 formTuple.trigger( 'focusout' ).trigger( 'change' ).trigger( 'submit' );
152 return false;
153 }
154 }
155
156 if ( typeof tinyMCE !== 'undefined' ) {
157 tinyMCE.triggerSave();
158 }
159
160 var recaptchaID = btn.get( 0 ).recaptchaID;
161
162 if ( recaptchaID === 0 ) {
163 grecaptcha.execute( recaptchaID );
164 return false;
165 }
166
167 var selectedPayGateway = getSelectedPaymentGatewayFromForm( formTuple );
168 var hasRazorpayGatewayMarker = formTuple.find( "[data-gateway='razorpay']" ).length > 0;
169 var shouldBypassAjaxForRazorpay = hasRazorpayGatewayMarker && ( 'razorpay' === selectedPayGateway || ! hasPaymentGatewaySelector );
170 paymentDebugLog( formTuple, 'payment_gateway_pre_ajax', {
171 selectedPayGateway: selectedPayGateway,
172 hasRazorpayGatewayMarker: hasRazorpayGatewayMarker,
173 shouldBypassAjaxForRazorpay: shouldBypassAjaxForRazorpay
174 } );
175
176 if ( shouldBypassAjaxForRazorpay ) {
177 return true;
178 }
179
180 var data = formTuple.serializeArray();
181 e.preventDefault();
182 // We let the bubbling events in form play itself out.
183 formTuple.trigger( 'focusout' ).trigger( 'change' ).trigger( 'submit' );
184
185 var errors = formTuple.find( '.evf-error:visible' );
186
187 var authorizeNetHidden = formTuple.find( ".everest-forms-authorize_net[data-gateway='authorize-net']" );
188 var legacyAuthorizeFieldVisible = ! hasPaymentGatewaySelector && formTuple.find( '.evf-field-authorize-net' ).is( ':visible' );
189 var shouldTokenizeAuthorizeNet = authorizeNetHidden.length &&
190 window.EverestFormsAuthorizeNet &&
191 typeof window.EverestFormsAuthorizeNet.getCardData === 'function' &&
192 typeof window.EverestFormsAuthorizeNet.authorizeNetAjaxSubmitHandler === 'function' &&
193 ( 'authorize_net' === selectedPayGateway || ( ! hasPaymentGatewaySelector && legacyAuthorizeFieldVisible ) );
194 paymentDebugLog( formTuple, 'authorize_net_check', {
195 authorizeNetHiddenCount: authorizeNetHidden.length,
196 legacyAuthorizeFieldVisible: legacyAuthorizeFieldVisible,
197 shouldTokenizeAuthorizeNet: shouldTokenizeAuthorizeNet
198 } );
199
200 if ( shouldTokenizeAuthorizeNet ) {
201 const cardData = window.EverestFormsAuthorizeNet.getCardData( formTuple );
202 paymentDebugLog( formTuple, 'authorize_net_card_fields_presence', {
203 hasAllFields: ! Object.values( cardData ).some( function( value ) { return ! value; } )
204 } );
205
206 if( ! Object.values(cardData).some(value => !value ) ) {
207
208 // Define the Promise.
209 const authorizeNetAjaxSubmitHandlerPromise = new Promise(function (resolve, reject) {
210 window.EverestFormsAuthorizeNet.authorizeNetAjaxSubmitHandler(v).then(resolve).catch(reject);
211 });
212
213 try {
214 const response = await authorizeNetAjaxSubmitHandlerPromise;
215 paymentDebugLog( formTuple, 'authorize_net_tokenized', {
216 resultCode: response && response.messages ? response.messages.resultCode : ''
217 } );
218
219 if( "Ok" === response.messages.resultCode ) {
220 data.push(
221 { name: 'everest_forms[authorize_net][opaque_data][descriptor]', value: response.opaqueData.dataDescriptor },
222 { name: 'everest_forms[authorize_net][opaque_data][value]', value: response.opaqueData.dataValue }
223 );
224 paymentDebugLog( formTuple, 'authorize_net_opaque_data_attached', {} );
225 }
226 } catch (error) {
227 paymentDebugLog( formTuple, 'authorize_net_tokenization_failed', {
228 errorMessage: getSafePaymentDebugErrorMessage( error )
229 } );
230 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
231 return;
232 }
233
234 }
235
236 if (errors.length < 1) {
237 errors = formTuple.parents('div.everest-forms').find('.everest-forms-notice.everest-forms-notice--error .evf-error');
238 }
239 }
240
241 if ( errors.length > 0 ) {
242 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
243 $( [document.documentElement, document.body] ).animate({
244 scrollTop: errors.last().offset().top
245 }, 800 );
246 return;
247 }
248
249 // Change the text to user defined property.
250 $( this ).html( formTuple.data( 'process-text' ) );
251
252 // Add action intend for ajax_form_submission endpoint.
253 data.push({
254 name: 'action',
255 value: 'everest_forms_ajax_form_submission'
256 });
257
258 data.push({
259 name: 'security',
260 value: everest_forms_ajax_submission_params.evf_ajax_submission
261 });
262 paymentDebugLog( formTuple, 'ajax_submission_dispatched', {
263 selectedPayGateway: selectedPayGateway,
264 payloadLength: data.length
265 } );
266
267 // Fire the ajax request.
268 $.ajax({
269 url: everest_forms_ajax_submission_params.ajax_url,
270 type: 'POST',
271 data: data
272 })
273 .done( function ( xhr, textStatus, errorThrown ) {
274 var redirect_url = ( xhr.data && xhr.data.redirect_url ) ? xhr.data.redirect_url : '';
275 var selectedGateway = getSelectedPaymentGatewayFromForm( formTuple );
276 var hasPaymentGatewayField = formTuple.find( '.evf-payment-gateway-radio' ).length > 0;
277 paymentDebugLog( formTuple, 'ajax_done', {
278 textStatus: textStatus,
279 success: xhr ? xhr.success : undefined,
280 response: xhr && xhr.data ? xhr.data.response : undefined,
281 selectedGateway: selectedGateway,
282 redirectUrl: redirect_url
283 } );
284 if ( undefined === selectedGateway && ! hasPaymentGatewayField ) {
285 var $squareClosest = formTuple.find( ".everest-forms-gateway[data-gateway='square']" ).closest( '.evf-field' );
286 var $stripeClosest = formTuple.find( ".everest-forms-gateway[data-gateway='stripe']" ).closest( '.evf-field' );
287 if ( $squareClosest.length && 'none' !== $squareClosest.css( 'display' ) ) {
288 selectedGateway = 'square';
289 } else if ( $stripeClosest.length && 'none' !== $stripeClosest.css( 'display' ) ) {
290 selectedGateway = 'stripe';
291 }
292 }
293 if (
294 redirect_url &&
295 'undefined' !== redirect_url &&
296 (
297 'paypal' === selectedGateway ||
298 ( 'stripe' !== selectedGateway && 'square' !== selectedGateway )
299 )
300 ) {
301 paymentDebugLog( formTuple, 'gateway_redirect_url', {
302 redirectUrl: redirect_url,
303 selectedGateway: selectedGateway,
304 } );
305 formTuple.trigger( 'reset' );
306 var new_tab = xhr.data.enable_redirect_in_new_tab ? xhr.data.enable_redirect_in_new_tab : false;
307
308 if (new_tab) {
309 var newWindow = window.open(redirect_url, '_blank');
310 if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
311 window.location.href = redirect_url;
312 }
313 } else {
314 window.location.href = redirect_url;
315 return;
316 }
317 }
318 var paypalRedirect =
319 ( xhr && xhr.redirect ) ||
320 ( xhr && xhr.data && xhr.data.redirect );
321 var isPayPalRedirect =
322 ( xhr && 'paypal' === xhr.payment_method ) ||
323 ( xhr && xhr.data && 'paypal' === xhr.data.payment_method ) ||
324 'paypal' === selectedGateway;
325
326 if ( paypalRedirect && isPayPalRedirect ) {
327 paymentDebugLog( formTuple, 'paypal_redirect', {
328 redirectUrl: paypalRedirect,
329 selectedGateway: selectedGateway,
330 } );
331 window.location.href = paypalRedirect;
332 return;
333 }
334
335 if ( 'success' === xhr.data.response || true === xhr.success ) {
336 let pdf_download_message = '';
337 let quiz_reporting = '';
338 let preview_confirmation = '';
339 let message_location = '';
340 let form_state_type = '';
341
342 if(xhr.data.form_id !== undefined && xhr.data.entry_id !== undefined && xhr.data.pdf_download == true){
343 pdf_download_message = '<br><small><a href="/?page=evf-entries-pdf&form_id='+ xhr.data.form_id+'&entry_id='+xhr.data.entry_id+'">' + xhr.data.pdf_download_message + '</a></small>';
344 }
345 if( xhr.data.quiz_result_shown == true){
346 quiz_reporting = xhr.data.quiz_reporting;
347 }
348
349 if( xhr.data.is_preview_confirmation == '1'){
350 preview_confirmation = xhr.data.preview_confirmation;
351 }
352
353 if ( xhr.data.message_display_location !== undefined && xhr.data.message_display_location !== '' ) {
354 message_location = xhr.data.message_display_location;
355 }
356
357 if ( xhr.data.form_state_type !== undefined && xhr.data.form_state_type !== '' ) {
358 form_state_type = xhr.data.form_state_type;
359 }
360
361 var paymentMethod = hasPaymentGatewayField ? selectedGateway : formTuple.find( ".everest-forms-stripe-gateways-tabs .evf-tab" ).has( 'a.active' ).data( 'gateway' );
362
363 if(undefined === paymentMethod && ! hasPaymentGatewayField) {
364 paymentMethod = formTuple.find( ".everest-forms-gateway[data-gateway='ideal']" ).data( 'gateway' );
365 if ('ideal' === paymentMethod ) {
366 paymentMethod = 'ideal';
367 } else {
368 paymentMethod = formTuple.find( ".everest-forms-gateway[data-gateway='stripe']" ).data( 'gateway' );
369 }
370 }
371
372 if( 'stripe' === paymentMethod && 'none' !== formTuple.find( ".everest-forms-gateway[data-gateway='stripe']" ).closest( '.evf-field' ).css( 'display' ) ) {
373 paymentDebugLog( formTuple, 'trigger_stripe_payment_flow', {} );
374 formTuple.trigger( 'everest_forms_frontend_before_ajax_complete_success_message', xhr.data );
375 return;
376 }
377
378 if(undefined === paymentMethod) {
379 paymentMethod = formTuple.find( ".everest-forms-gateway[data-gateway='ideal']" ).data( 'gateway' );
380 }
381
382
383 if( 'ideal' === paymentMethod && 'none' !== formTuple.find( ".everest-forms-gateway[data-gateway='ideal']" ).closest( '.evf-field' ).css( 'display' ) ) {
384 paymentDebugLog( formTuple, 'trigger_ideal_payment_flow', {} );
385 formTuple.trigger( 'evf_process_payment', xhr.data );
386 return;
387 }
388 if( 'square' === selectedGateway ){
389 paymentDebugLog( formTuple, 'trigger_square_payment_flow', {} );
390
391 formTuple.trigger( 'everest_forms_frontend_payment_before_success_message', xhr.data );
392 return;
393 }
394
395 var formContainer = formTuple.closest( '.everest-forms' );
396
397 formTuple.trigger( 'reset' );
398 formContainer.find( '.everest-forms-notice' ).remove();
399
400 // If the form state is hidden, scope the hide to this submitted form only.
401 if ( 'hide' === form_state_type && 'hide' !== message_location ) {
402 formTuple.find( '.evf-frontend-row, .evf-submit-container' ).hide();
403 }
404
405 if ( 'hide' === message_location ) {
406 formContainer.html(
407 '<div class="everest-forms-notice everest-forms-notice--success" role="alert">' +
408 xhr.data.message + pdf_download_message +
409 '</div>' + quiz_reporting + preview_confirmation
410 ).focus();
411 } else if ( 'top' === message_location) {
412 formContainer.prepend(
413 '<div class="everest-forms-notice everest-forms-notice--success" role="alert">' +
414 xhr.data.message + pdf_download_message +
415 '</div>' + quiz_reporting + preview_confirmation
416 ).focus();
417 } else if ( 'bottom' === message_location ) {
418 formContainer.append(
419 preview_confirmation + '<div class="everest-forms-notice everest-forms-notice--success" role="alert">' +
420 xhr.data.message + pdf_download_message +
421 '</div>' + quiz_reporting
422 ).focus();
423 }else if ( 'popup' === message_location ) {
424 $('body').css('overflow', 'hidden');
425
426 var popupHTML = `
427 <div class="everest-forms-popup-overlay">
428 <div class="everest-forms-popup">
429 <div class="everest-forms-popup-close">
430 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
431 <path d="M7 6.06668L1.26666 0.333344L0.333328 1.20001L6.06666 6.93334L0.333328 12.6L1.26666 13.5333L7 7.86668L12.6667 13.5333L13.6 12.6L7.93333 6.93334L13.6667 1.33334L12.7333 0.466677L7 6.06668Z" fill="#383838"/>
432 </svg>
433 </div>
434 <img src="${ everest_forms_ajax_submission_params.evf_checked_image_url }" alt="Checked Logo" class="everest-forms-popup-success-logo">
435 <p class="everest-forms-popup-success-text">${ everest_forms_ajax_submission_params.i18n_evf_success_text }</p>
436 <p>${ xhr.data.message }</p>
437 </div>
438 </div>
439 `;
440
441 $('body').append(popupHTML);
442
443 $('.everest-forms-popup-close').on('click', function() {
444 $('.everest-forms-popup-overlay').fadeOut(200, function() {
445 $(this).remove();
446 $('body').css('overflow', '');
447 });
448 });
449
450 formContainer.append(
451 preview_confirmation + quiz_reporting
452 ).focus();
453 }
454
455 btn.attr('disabled', false).html(everest_forms_ajax_submission_params.submit);
456 paymentDebugLog( formTuple, 'payment_completed_success_notice', {
457 messageLocation: message_location,
458 formStateType: form_state_type
459 } );
460
461 // Trigger for form submission success.
462 var event = new CustomEvent("everest_forms_ajax_submission_success", {
463 detail: {
464 formId: 'evf-form-' + xhr.data.form_id,
465 }
466 });
467 document.dispatchEvent(event);
468 } else {
469 var form_id = formTuple.data( 'formid' );
470 var err = JSON.parse( errorThrown.responseText );
471 if( 'undefined' !== typeof err.data[form_id] ) {
472 var error = err.data[form_id].header;
473 } else{
474 var error = everest_forms_ajax_submission_params.error;
475 }
476 var fields = err.data.error;
477
478 if ( 'string' === typeof err.data.message ) {
479 error = err.data.message;
480 }
481
482 formTuple.closest( '.everest-forms' ).find( '.everest-forms-notice' ).remove();
483 formTuple.closest( '.everest-forms' ).prepend( '<div class="everest-forms-notice everest-forms-notice--error" role="alert">'+ error +'</div>' ).focus();
484
485 // Begin fixing the tamper.
486 $( fields ).each( function( index, fieldTuple ) {
487 var err_msg = Object.values(fieldTuple)[0],
488 fld_id = Object.keys(fieldTuple)[0],
489 err_field, fid, lbl = true;
490
491 var fld_container_id = 'evf'-+ form_id +'-field_' + fld_id +'-container';
492
493 if($('#'+fld_container_id).hasClass('evf-field-signature')) { //When field type is signature
494 fid = 'evf-signature-img-input-' + fld_id;
495 err_field = $( '#' + fid );
496 } else if ($('#'+fld_container_id).hasClass('evf-field-likert')) { //When field type is likert
497 fid = 'everest_forms-' + form_id + '-field_' + fld_id + '_';
498 err_field = $( '[id^="' + fid + '"]' );
499 lbl = false;
500
501 err_field.each( function( index, element ) {
502 var tbl_header = $( element ).closest( 'tr.evf-' + form_id +'-field_' + fld_id ).find( 'th' ),
503 id = 'everest_forms[form_fields][' + fld_id + '][' + ( parseInt( tbl_header.closest( 'tr' ).index() ) + 1 ) + ']';
504
505 if ( ! tbl_header.children().is( 'label' ) ) {
506 if( tbl_header.parents( 'span.input-wrapper' ).length ) {
507 tbl_header.parents( 'span.input-wrapper' ).append( '<label id="' + id + '" for="' + id + '" class="evf-error">' + everest_forms_ajax_submission_params.required + '</label>' );
508 } else {
509 tbl_header.append( '<label id="' + id + '" for="' + id + '" class="evf-error">' + everest_forms_ajax_submission_params.required + '</label>' );
510 }
511 } else {
512 tbl_header.children().find( '#' + id ).show();
513 }
514 });
515 } else if ($('#'+fld_container_id).hasClass('evf-field-address')) { //When field type is address
516 fid = 'evf-' + form_id + '-field_' + fld_id;
517 err_field = $( '[id^="' + fid + '"]' );
518
519 err_field.each( function ( index, element ) {
520 var fieldId = String( $( element ).attr( 'id' ) );
521
522 if ( fieldId.includes( '-container' ) || fieldId.includes( '-address2' ) ) {
523 err_field.splice( index, 1 );
524 } else {
525 if ( 'undefined' !== typeof $( element ).val() ) {
526 err_field.splice( index, 1 );
527 };
528 }
529 });
530 } else {
531 fid = 'evf-' + form_id + '-field_' + fld_id;
532 err_field = $( '#' + fid );
533 }
534
535 err_field.addClass( 'evf-error' );
536 err_field.attr( 'aria-invalid', true );
537 err_field.first().closest( '.evf-field' ).addClass( 'everest-forms-invalid evf-has-error' );
538
539 if ( true === lbl && ! err_field.is( 'label' ) ) {
540 if( err_field.parents( 'span.input-wrapper' ).length ){
541 err_field.parents( 'span.input-wrapper' ).after( '<label id="' + err_field.attr( 'id' ) + '-error" class="evf-error" for="' + err_field.attr( 'id' ) + '">' + err_msg + '</label>' ).show();
542 } else {
543 err_field.after( '<label id="' + err_field.attr( 'id' ) + '-error" class="evf-error" for="' + err_field.attr( 'id' ) + '">' + err_msg + '</label>' ).show();
544 }
545 }
546 });
547
548 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
549 }
550
551 })
552 .fail( function () {
553 paymentDebugLog( formTuple, 'ajax_failed', {} );
554 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
555 formTuple.trigger( 'focusout' ).trigger( 'change' );
556 formTuple.closest( '.everest-forms' ).find( '.everest-forms-notice' ).remove();
557 formTuple.closest( '.everest-forms' ).prepend( '<div class="everest-forms-notice everest-forms-notice--error" role="alert">'+ everest_forms_ajax_submission_params.error +'</div>' ).focus();
558 })
559 .always( function( xhr ) {
560 var redirect_url = ( xhr.data && xhr.data.redirect_url ) ? xhr.data.redirect_url : '';
561 paymentDebugLog( formTuple, 'ajax_always', {
562 redirectUrl: redirect_url
563 } );
564 if ( ! redirect_url && $( '.everest-forms-notice' ).length && xhr.data.submission_message_scroll === "1" ) {
565 $( [document.documentElement, document.body] ).animate({
566 scrollTop: $( '.everest-forms-notice' ).offset().top
567 }, 800 );
568 }
569 });
570 });
571 });
572 });
573 };
574
575 evf_ajax_submission_init();
576 });
577