PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.6.0
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.6.0
3.6.0 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 week ago ajax-submission.min.js 1 week ago everest-forms-file-upload.js 5 months ago everest-forms-file-upload.min.js 5 months ago everest-forms-survey-polls-quiz.js 1 year ago everest-forms-survey-polls-quiz.min.js 2 years ago everest-forms.js 1 week ago everest-forms.min.js 1 week 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
583 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( '.evf-container' );
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. The
401 // container's own background image (a v1 direct background-image, or v2's
402 // ::before layer) isn't a child of the form and can't be hidden by hiding rows,
403 // so it needs its own class-driven CSS rule (everest-forms.scss).
404 if ( 'hide' === form_state_type ) {
405 formContainer.addClass( 'everest-forms-form-hidden' );
406 if ( 'hide' !== message_location ) {
407 formTuple.find( '.evf-frontend-row, .evf-submit-container, .everest-forms-multi-part-indicator' ).hide();
408 }
409 }
410
411 if ( 'hide' === message_location ) {
412 formContainer.html(
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 ( 'top' === message_location) {
418 formContainer.prepend(
419 '<div class="everest-forms-notice everest-forms-notice--success" role="alert">' +
420 xhr.data.message + pdf_download_message +
421 '</div>' + quiz_reporting + preview_confirmation
422 ).focus();
423 } else if ( 'bottom' === message_location ) {
424 formContainer.append(
425 preview_confirmation + '<div class="everest-forms-notice everest-forms-notice--success" role="alert">' +
426 xhr.data.message + pdf_download_message +
427 '</div>' + quiz_reporting
428 ).focus();
429 }else if ( 'popup' === message_location ) {
430 $('body').css('overflow', 'hidden');
431
432 var popupHTML = `
433 <div class="everest-forms-popup-overlay">
434 <div class="everest-forms-popup">
435 <div class="everest-forms-popup-close">
436 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
437 <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"/>
438 </svg>
439 </div>
440 <img src="${ everest_forms_ajax_submission_params.evf_checked_image_url }" alt="Checked Logo" class="everest-forms-popup-success-logo">
441 <p class="everest-forms-popup-success-text">${ everest_forms_ajax_submission_params.i18n_evf_success_text }</p>
442 <p class="everest-forms-notice everest-forms-notice--success">${ xhr.data.message }</p>
443 </div>
444 </div>
445 `;
446
447 formContainer.append(popupHTML);
448
449 $('.everest-forms-popup-close').on('click', function() {
450 $('.everest-forms-popup-overlay').fadeOut(200, function() {
451 $(this).remove();
452 $('body').css('overflow', '');
453 });
454 });
455
456 formContainer.append(
457 preview_confirmation + quiz_reporting
458 ).focus();
459 }
460
461 btn.attr('disabled', false).html(everest_forms_ajax_submission_params.submit);
462 paymentDebugLog( formTuple, 'payment_completed_success_notice', {
463 messageLocation: message_location,
464 formStateType: form_state_type
465 } );
466
467 // Trigger for form submission success.
468 var event = new CustomEvent("everest_forms_ajax_submission_success", {
469 detail: {
470 formId: 'evf-form-' + xhr.data.form_id,
471 }
472 });
473 document.dispatchEvent(event);
474 } else {
475 var form_id = formTuple.data( 'formid' );
476 var err = JSON.parse( errorThrown.responseText );
477 if( 'undefined' !== typeof err.data[form_id] ) {
478 var error = err.data[form_id].header;
479 } else{
480 var error = everest_forms_ajax_submission_params.error;
481 }
482 var fields = err.data.error;
483
484 if ( 'string' === typeof err.data.message ) {
485 error = err.data.message;
486 }
487
488 formTuple.closest( '.everest-forms' ).find( '.everest-forms-notice' ).remove();
489 formTuple.closest( '.everest-forms' ).prepend( '<div class="everest-forms-notice everest-forms-notice--error" role="alert">'+ error +'</div>' ).focus();
490
491 // Begin fixing the tamper.
492 $( fields ).each( function( index, fieldTuple ) {
493 var err_msg = Object.values(fieldTuple)[0],
494 fld_id = Object.keys(fieldTuple)[0],
495 err_field, fid, lbl = true;
496
497 var fld_container_id = 'evf'-+ form_id +'-field_' + fld_id +'-container';
498
499 if($('#'+fld_container_id).hasClass('evf-field-signature')) { //When field type is signature
500 fid = 'evf-signature-img-input-' + fld_id;
501 err_field = $( '#' + fid );
502 } else if ($('#'+fld_container_id).hasClass('evf-field-likert')) { //When field type is likert
503 fid = 'everest_forms-' + form_id + '-field_' + fld_id + '_';
504 err_field = $( '[id^="' + fid + '"]' );
505 lbl = false;
506
507 err_field.each( function( index, element ) {
508 var tbl_header = $( element ).closest( 'tr.evf-' + form_id +'-field_' + fld_id ).find( 'th' ),
509 id = 'everest_forms[form_fields][' + fld_id + '][' + ( parseInt( tbl_header.closest( 'tr' ).index() ) + 1 ) + ']';
510
511 if ( ! tbl_header.children().is( 'label' ) ) {
512 if( tbl_header.parents( 'span.input-wrapper' ).length ) {
513 tbl_header.parents( 'span.input-wrapper' ).append( '<label id="' + id + '" for="' + id + '" class="evf-error">' + everest_forms_ajax_submission_params.required + '</label>' );
514 } else {
515 tbl_header.append( '<label id="' + id + '" for="' + id + '" class="evf-error">' + everest_forms_ajax_submission_params.required + '</label>' );
516 }
517 } else {
518 tbl_header.children().find( '#' + id ).show();
519 }
520 });
521 } else if ($('#'+fld_container_id).hasClass('evf-field-address')) { //When field type is address
522 fid = 'evf-' + form_id + '-field_' + fld_id;
523 err_field = $( '[id^="' + fid + '"]' );
524
525 err_field.each( function ( index, element ) {
526 var fieldId = String( $( element ).attr( 'id' ) );
527
528 if ( fieldId.includes( '-container' ) || fieldId.includes( '-address2' ) ) {
529 err_field.splice( index, 1 );
530 } else {
531 if ( 'undefined' !== typeof $( element ).val() ) {
532 err_field.splice( index, 1 );
533 };
534 }
535 });
536 } else {
537 fid = 'evf-' + form_id + '-field_' + fld_id;
538 err_field = $( '#' + fid );
539 }
540
541 err_field.addClass( 'evf-error' );
542 err_field.attr( 'aria-invalid', true );
543 err_field.first().closest( '.evf-field' ).addClass( 'everest-forms-invalid evf-has-error' );
544
545 if ( true === lbl && ! err_field.is( 'label' ) ) {
546 if( err_field.parents( 'span.input-wrapper' ).length ){
547 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();
548 } else {
549 err_field.after( '<label id="' + err_field.attr( 'id' ) + '-error" class="evf-error" for="' + err_field.attr( 'id' ) + '">' + err_msg + '</label>' ).show();
550 }
551 }
552 });
553
554 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
555 }
556
557 })
558 .fail( function () {
559 paymentDebugLog( formTuple, 'ajax_failed', {} );
560 btn.attr( 'disabled', false ).html( everest_forms_ajax_submission_params.submit );
561 formTuple.trigger( 'focusout' ).trigger( 'change' );
562 formTuple.closest( '.everest-forms' ).find( '.everest-forms-notice' ).remove();
563 formTuple.closest( '.everest-forms' ).prepend( '<div class="everest-forms-notice everest-forms-notice--error" role="alert">'+ everest_forms_ajax_submission_params.error +'</div>' ).focus();
564 })
565 .always( function( xhr ) {
566 var redirect_url = ( xhr.data && xhr.data.redirect_url ) ? xhr.data.redirect_url : '';
567 paymentDebugLog( formTuple, 'ajax_always', {
568 redirectUrl: redirect_url
569 } );
570 if ( ! redirect_url && $( '.everest-forms-notice' ).length && xhr.data.submission_message_scroll === "1" ) {
571 $( [document.documentElement, document.body] ).animate({
572 scrollTop: $( '.everest-forms-notice' ).offset().top
573 }, 800 );
574 }
575 });
576 });
577 });
578 });
579 };
580
581 evf_ajax_submission_init();
582 });
583