PageSourceSearch

https://palyabea.hu/wp-content/plugins/cartflows/assets/js/checkout-template.js?ver=3.2.0

js palyabea.hu collected 2026-10-02 12:46:09 UTC 22,937 bytes, 914 lines download raw bytes

1( function ( $ ) {
2	const wcf_update_checkout_on_return = function () {
3		const vis = ( function () {
4			let stateKey, eventKey;
5			const keys = {
6				hidden: 'visibilitychange',
7				webkitHidden: 'webkitvisibilitychange',
8				mozHidden: 'mozvisibilitychange',
9				msHidden: 'msvisibilitychange',
10			};
11			for ( stateKey in keys ) {
12				if ( stateKey in document ) {
13					eventKey = keys[ stateKey ];
14					break;
15				}
16			}
17
18			return function ( c ) {
19				if ( c ) {
20					document.addEventListener( eventKey, c );
21				}
22				return ! document[ stateKey ];
23			};
24		} )();
25
26		function getCookie( name ) {
27			const cookieArr = document.cookie.split( ';' );
28			for ( let i = 0; i < cookieArr.length; i++ ) {
29				const cookiePair = cookieArr[ i ].split( '=' );
30
31				if ( name === cookiePair[ 0 ].trim() ) {
32					return decodeURIComponent( cookiePair[ 1 ] );
33				}
34			}
35			return null;
36		}
37
38		vis( function () {
39			const active_checkout_cookie = getCookie(
40				cartflows.active_checkout_cookie
41			);
42
43			if ( active_checkout_cookie && vis() ) {
44				if (
45					parseInt( cartflows.current_step ) !==
46					parseInt( active_checkout_cookie )
47				) {
48					// Add loader.
49					$(
50						'.woocommerce-checkout-payment, .woocommerce-checkout-review-order-table'
51					).block( {
52						message: null,
53						overlayCSS: {
54							background: '#fff',
55							opacity: 0.6,
56						},
57					} );
58
59					console.log( 'Multiple checkouts are open.' );
60
61					$( document.body ).trigger( 'update_checkout' );
62
63					$( document ).ajaxComplete( function ( event, xhr ) {
64						if ( ! xhr.hasOwnProperty( 'responseJSON' ) ) {
65							return;
66						}
67						const fragmants = xhr.responseJSON.hasOwnProperty(
68							'fragments'
69						)
70							? xhr.responseJSON.fragments
71							: null;
72
73						if (
74							fragmants &&
75							fragmants.hasOwnProperty( 'wcf_cart_data' )
76						) {
77							$( document.body ).trigger(
78								'wcf_cart_data_restored',
79								[ fragmants.wcf_cart_data ]
80							);
81						}
82					} );
83				}
84			}
85		} );
86	};
87
88	/**
89	 * Checkout Custom Field Validations
90	 * This will collect all the present fields in the woocommerce form and adds an class if the field
91	 * is blank
92	 */
93	const wcf_custom_field_validation = function () {
94		/**
95		 * Controls the display of the error message on the basis of backend setting.
96		 *
97		 * @param {boolean} field_required
98		 * @param {string}  field_row
99		 * @param {string}  field_wrap
100		 */
101		const add_validation_msg = function (
102			field_required = false,
103			field_row,
104			field_wrap
105		) {
106			field_row.find( '.wcf-field-required-error' ).remove();
107
108			if (
109				field_required &&
110				'yes' === cartflows.field_validation.is_enabled
111			) {
112				const label_text = field_row.find( 'label' ).text();
113				field_wrap.after(
114					'<span class="wcf-field-required-error">' +
115						label_text.replace( /\*/g, '' ).trim() +
116						' ' +
117						cartflows.field_validation.error_msg +
118						'</span>'
119				);
120			} else {
121				field_row.find( '.wcf-field-required-error' ).remove();
122			}
123		};
124
125		const custom_field_add_class = function (
126			field_value,
127			field_row,
128			field_wrap,
129			field_type
130		) {
131			let isError = false;
132
133			if (
134				field_value === '' ||
135				( 'select' === field_type && field_value === ' ' )
136			) {
137				if ( field_row.hasClass( 'validate-required' ) ) {
138					field_wrap.addClass( 'field-required' );
139					isError = true;
140				}
141			} else {
142				field_wrap.removeClass( 'field-required' );
143			}
144
145			add_validation_msg( isError, field_row, field_wrap );
146		};
147
148		const numberFieldValidation = function (
149			field_value,
150			field_row,
151			field_wrap,
152			minValue,
153			maxValue
154		) {
155			if (
156				field_value === '' ||
157				field_value < minValue ||
158				field_value > maxValue
159			) {
160				field_wrap.addClass( 'field-required' );
161				field_wrap.after(
162					'<span class="wcf-field-required-error">' +
163						cartflows.field_validation_msgs.number_field +
164						minValue +
165						' & ' +
166						maxValue +
167						'</span>'
168				);
169			} else {
170				field_wrap.removeClass( 'field-required' );
171				field_row.find( '.wcf-field-required-error' ).remove();
172			}
173		};
174
175		const fields_wrapper = $( 'form.woocommerce-checkout' ),
176			$all_fields = fields_wrapper.find( 'input, textarea' ),
177			$selects = fields_wrapper.find( 'select' );
178
179		$all_fields.on( 'blur', function () {
180			const $this = $( this ),
181				field_type = $this.attr( 'type' ),
182				field_row = $this.closest( 'p.form-row' ),
183				field_value = $this.val();
184
185			custom_field_add_class( field_value, field_row, $this, field_type );
186			if ( 'number' === field_type ) {
187				const minValue = $this.attr( 'min' );
188				const maxValue = $this.attr( 'max' );
189				numberFieldValidation(
190					Number( field_value ),
191					field_row,
192					$this,
193					Number( minValue ),
194					Number( maxValue )
195				);
196			}
197		} );
198
199		$selects.on( 'blur', function () {
200			const $this = $( this ),
201				field_row = $this.closest( 'p.form-row' ),
202				field_type = 'select',
203				field_wrap = field_row.find( '.select2-container--default' ),
204				field_value = field_row.find( 'select' ).val();
205
206			custom_field_add_class(
207				field_value,
208				field_row,
209				field_wrap,
210				field_type
211			);
212		} );
213	};
214
215	const wcf_check_is_local_storage = function () {
216		const test = 'test';
217		try {
218			localStorage.setItem( test, test );
219			localStorage.removeItem( test );
220			return true;
221		} catch ( e ) {
222			return false;
223		}
224	};
225
226	const wcf_persistent_data = function () {
227		if ( 'yes' !== cartflows.allow_persistence ) {
228			return;
229		}
230
231		if ( false === wcf_check_is_local_storage() ) {
232			return;
233		}
234
235		const checkout_cust_form =
236			'form.woocommerce-checkout #customer_details';
237
238		const wcf_form_data = {
239			set() {
240				const checkout_data = [];
241				const checkout_form = $(
242					'form.woocommerce-checkout #customer_details'
243				);
244
245				localStorage.removeItem( 'cartflows_checkout_form' );
246
247				checkout_form
248					.find(
249						'input[type=text], select, input[type=email], input[type=tel]'
250					)
251					.each( function () {
252						checkout_data.push( {
253							name: this.name,
254							value: this.value,
255						} );
256					} );
257
258				// Fix the dutch address order.
259				fixDutchAddressOrder();
260
261				cartflows_checkout_form = JSON.stringify( checkout_data );
262				localStorage.setItem(
263					'cartflows_checkout_form',
264					cartflows_checkout_form
265				);
266			},
267			get() {
268				// If the URL carries checkout pre-fill params (billing_* / shipping_*),
269				// let the PHP-rendered values stand — do not overwrite with stale
270				// localStorage data from a previous visit.
271				const urlSearch = new URLSearchParams( window.location.search );
272				const hasPrefillParams = Array.from( urlSearch.keys() ).some(
273					( k ) =>
274						k.startsWith( 'billing_' ) ||
275						k.startsWith( 'shipping_' )
276				);
277				if ( hasPrefillParams ) {
278					return;
279				}
280
281				if (
282					localStorage.getItem( 'cartflows_checkout_form' ) !== null
283				) {
284					checkout_data = JSON.parse(
285						localStorage.getItem( 'cartflows_checkout_form' )
286					);
287
288					for ( let i = 0; i < checkout_data.length; i++ ) {
289						if (
290							$(
291								'form.woocommerce-checkout [name=' +
292									checkout_data[ i ].name +
293									']'
294							).hasClass( 'select2-hidden-accessible' )
295						) {
296							$(
297								'form.woocommerce-checkout [name=' +
298									checkout_data[ i ].name +
299									']'
300							).selectWoo( 'val', [ checkout_data[ i ].value ] );
301						} else {
302							$(
303								'form.woocommerce-checkout [name=' +
304									checkout_data[ i ].name +
305									']'
306							).val( checkout_data[ i ].value );
307						}
308					}
309				}
310			},
311		};
312
313		const fixDutchAddressOrder = function () {
314			const billing_country = $( '#billing_country' ).val();
315			const billing_address = $( '#billing_address_1' ).val();
316
317			if ( billing_country === 'NL' && billing_address ) {
318				const match_billing =
319					billing_address.match( /^(\d+\S*)\s+(.+)$/ );
320				if ( match_billing ) {
321					$( '#billing_address_1' ).val(
322						match_billing[ 2 ] + ' ' + match_billing[ 1 ]
323					);
324				}
325			}
326
327			const shipping_country = $( '#shipping_country' ).val();
328			const shipping_address = $( '#shipping_address_1' ).val();
329
330			if ( shipping_country === 'NL' && shipping_address ) {
331				const match_shipping =
332					shipping_address.match( /^(\d+\S*)\s+(.+)$/ );
333				if ( match_shipping ) {
334					$( '#shipping_address_1' ).val(
335						match_shipping[ 2 ] + ' ' + match_shipping[ 1 ]
336					);
337				}
338			}
339		};
340
341		wcf_form_data.get();
342
343		$(
344			checkout_cust_form + ' input, ' + checkout_cust_form + ' select'
345		).on( 'change', function () {
346			wcf_form_data.set();
347		} );
348	};
349
350	const wcf_checkout_coupons = {
351		init() {
352			$( document.body ).on(
353				'click',
354				'.wcf-submit-coupon',
355				this.submit_coupon
356			);
357			$( document.body ).on(
358				'click',
359				'.wcf-remove-coupon',
360				this.remove_coupon
361			);
362		},
363
364		submit_coupon( e ) {
365			e.preventDefault();
366			const coupon_wrapper_class = $( '.wcf-custom-coupon-field' ),
367				coupon_wrapper = $( this ).closest( coupon_wrapper_class ),
368				coupon_field = coupon_wrapper.find( '.wcf-coupon-code-input' ),
369				coupon_value = coupon_field.val();
370
371			if ( '' === coupon_value ) {
372				coupon_field.addClass( 'field-required' );
373				return false;
374			}
375			coupon_field.removeClass( 'field-required' );
376
377			const billing_email = $(
378				'.wcf-embed-checkout-form #billing_email'
379			).val();
380
381			const data = {
382				coupon_code: coupon_value,
383				action: 'wcf_woo_apply_coupon',
384				security: cartflows.wcf_validate_coupon_nonce,
385				billing_email,
386			};
387
388			$.ajax( {
389				type: 'POST',
390				url: cartflows.ajax_url,
391				data,
392
393				success( code_data ) {
394					const coupon_message = $( '.wcf-custom-coupon-field' );
395					coupon_message
396						.find( '.woocommerce-error, .woocommerce-message' )
397						.remove();
398
399					if ( code_data && code_data.status === true ) {
400						$( document.body ).trigger( 'update_checkout', {
401							update_shipping_method: false,
402						} );
403						coupon_message.prepend( code_data.msg );
404						coupon_wrapper_class.addClass( 'wcf-coupon-applied' );
405					} else if ( code_data && code_data.msg ) {
406						coupon_message.prepend( code_data.msg );
407						coupon_wrapper_class.removeClass(
408							'wcf-coupon-applied'
409						);
410					} else {
411						console.log(
412							'Error: Error while applying the coupon. Response: ' +
413								code_data.data && code_data.data.error
414								? code_data.data.error
415								: code_data
416						);
417					}
418				},
419			} );
420		},
421
422		remove_coupon( e ) {
423			e.preventDefault();
424			const data = {
425				coupon_code: $( this ).attr( 'data-coupon' ),
426				action: 'wcf_woo_remove_coupon',
427				security: cartflows.wcf_validate_remove_coupon_nonce,
428			};
429
430			$.ajax( {
431				type: 'POST',
432				url: cartflows.ajax_url,
433				data,
434
435				success( code ) {
436					const coupon_message = $( '.wcf-custom-coupon-field' );
437					coupon_message
438						.find( '.woocommerce-error, .woocommerce-message' )
439						.hide();
440
441					$( '.wcf-custom-coupon-field' ).removeClass(
442						'wcf-coupon-applied'
443					);
444
445					if ( code ) {
446						$( document.body ).trigger( 'update_checkout', {
447							update_shipping_method: false,
448						} );
449						coupon_message.prepend( code );
450					}
451				},
452			} );
453		},
454	};
455
456	const wcf_remove_cart_products = function () {
457		$( document.body ).on(
458			'click',
459			'#wcf-embed-checkout-form .wcf-remove-product',
460			function ( e ) {
461				e.preventDefault();
462				const p_id = $( this ).attr( 'data-id' );
463				const data = {
464					p_key: $( this ).attr( 'data-item-key' ),
465					p_id,
466					action: 'wcf_woo_remove_cart_product',
467					security: cartflows.wcf_validate_remove_cart_product_nonce,
468				};
469
470				$.ajax( {
471					type: 'POST',
472					url: cartflows.ajax_url,
473					data,
474
475					success( response ) {
476						const res_data = JSON.parse( response );
477
478						if ( res_data.need_shipping === false ) {
479							// $('#wcf-embed-checkout-form').find('#ship-to-different-address-checkbox').hide();
480							$( '#wcf-embed-checkout-form' )
481								.find( '#ship-to-different-address-checkbox' )
482								.attr( 'checked', false );
483						}
484
485						// Handle order bump checkbox state when product is removed.
486						if (
487							typeof res_data.is_order_bump !== 'undefined' &&
488							res_data.is_order_bump &&
489							res_data.order_bump_id
490						) {
491							$(
492								'input[name="wcf-bump-order-cb-' +
493									res_data.order_bump_id +
494									'"]'
495							).prop( 'checked', false );
496						}
497
498						$( '#wcf-embed-checkout-form' )
499							.find( '.woocommerce-notices-wrapper' )
500							.first()
501							.html( res_data.msg );
502						$( document ).trigger( 'cartflows_remove_product', [
503							p_id,
504						] );
505						$( '#wcf-embed-checkout-form' ).trigger(
506							'update_checkout'
507						);
508					},
509				} );
510			}
511		);
512	};
513
514	const wcf_toggle_optimized_fields = function () {
515		jQuery.each(
516			cartflows_checkout_optimized_fields,
517			function ( field, cartflows_optimized_field ) {
518				if ( cartflows_optimized_field.is_optimized ) {
519					jQuery( '#' + field ).prepend(
520						'<a href="#" id="wcf_optimized_' +
521							field +
522							'">' +
523							cartflows_optimized_field.field_label +
524							'</a>'
525					);
526					jQuery( '#wcf_optimized_' + field ).on(
527						'click',
528						function ( e ) {
529							e.preventDefault();
530							jQuery( '#' + field ).removeClass(
531								'wcf-hide-field'
532							);
533							// jQuery("#" + field).removeClass('mt20')
534							const field_id = field.replace( /_field/g, '' );
535							$( '#' + field_id ).trigger( 'focus' );
536							jQuery( this ).remove();
537						}
538					);
539				}
540			}
541		);
542	};
543
544	const wcf_instant_checkout_coupon_field = function () {
545		$( document.body ).on(
546			'click',
547			'.coupon-field .wcf-custom-coupon-field .wcf-optimized-coupon-field',
548			function ( e ) {
549				e.preventDefault();
550
551				$( '.wcf-custom-coupon-field' ).removeClass( 'wcf-hide-field' );
552				$( this ).remove();
553			}
554		);
555	};
556
557	const wcf_anim_field_style_two = function () {
558		const $inputs = $(
559			'.wcf-field-modern-label .woocommerce input, .wcf-field-modern-label .woocommerce select, .wcf-field-modern-label .woocommerce textarea'
560		);
561
562		/**
563		 * Add wcf-anim-label class when floating label option is enabled.
564		 * The class will be added only when the info is started to type in the checkout fields.
565		 *
566		 * @param {Object} $this the object of current checkout field
567		 */
568		const _add_anim_class = function ( $this ) {
569			const field_row = $this.closest( '.form-row' ),
570				is_select =
571					$this.is( 'select' ) ||
572					$this.hasClass( 'select2-hidden-accessible' ),
573				field_value = is_select
574					? $this.find( ':selected' ).text()
575					: $this.val(),
576				field_type = $this.attr( 'type' );
577
578			if ( '' === field_value ) {
579				field_row.removeClass( 'wcf-anim-label' );
580			} else if ( 'hidden' === field_type ) {
581				field_row.addClass( 'wcf-anim-hidden-label' );
582			} else {
583				field_row.addClass( 'wcf-anim-label' );
584			}
585		};
586
587		// Trigger the addition of anim class when focused or info is inputed on the field.
588		$inputs.on( 'focusout input', function () {
589			const $this = $( this );
590			_add_anim_class( $this );
591		} );
592
593		// Load the anim class on the page ready.
594		$( $inputs ).each( function () {
595			_add_anim_class( $( this ) );
596		} );
597	};
598
599	const validateEmail = function ( email ) {
600		const email_reg =
601			/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
602		return email_reg.test( email );
603	};
604
605	let xhrCountEmail = 0;
606	let delayTimerEmail;
607
608	const inline_email_address_validation = function () {
609		const email = $( '.wcf-customer-info #billing_email' ).val();
610
611		if ( 'undefined' === typeof email || cartflows.is_logged_in ) {
612			return;
613		}
614
615		if ( '' !== email ) {
616			const email_field = $( '#billing_email' );
617			const validation_msg_wrap = $( '.wcf-email-validation-block' ),
618				customer_login_wrap = $( '.wcf-customer-login-section' );
619
620			validation_msg_wrap.remove();
621
622			if ( ! validateEmail( email ) ) {
623				email_field.after(
624					'<span class="wcf-email-validation-block error">' +
625						cartflows.email_validation_msgs.error_msg +
626						'</span>'
627				);
628				customer_login_wrap.removeClass( 'wcf-show' );
629				return false;
630			}
631
632			clearTimeout( delayTimerEmail );
633
634			const seqNumber = ++xhrCountEmail;
635
636			delayTimerEmail = setTimeout( function () {
637				$.ajax( {
638					url: cartflows.ajax_url,
639					type: 'POST',
640					data: {
641						action: 'wcf_check_email_exists',
642						email_address: email,
643						security: cartflows.check_email_exist_nonce,
644					},
645					success( resp ) {
646						if ( seqNumber !== xhrCountEmail ) {
647							return;
648						}
649
650						validation_msg_wrap.remove();
651
652						if (
653							resp.data &&
654							resp.data.success &&
655							customer_login_wrap.hasClass( 'wcf-show' )
656						) {
657							email_field.after(
658								'<span class="wcf-email-validation-block success">' +
659									cartflows.email_validation_msgs
660										.success_msg +
661									'</span>'
662							);
663							return;
664						}
665
666						if ( resp.data && resp.data.success ) {
667							if ( resp.data.is_login_allowed ) {
668								email_field.after(
669									'<span class="wcf-email-validation-block success">' +
670										cartflows.email_validation_msgs
671											.success_msg +
672										'</span>'
673								);
674
675								customer_login_wrap
676									.slideDown( 400 )
677									.addClass( 'wcf-show' );
678							}
679
680							$( '.wcf-create-account-section' ).hide();
681							$(
682								'.woocommerce-billing-fields__customer-login-label'
683							).show();
684						} else {
685							customer_login_wrap
686								.slideUp( 400 )
687								.removeClass( 'wcf-show' );
688
689							//Learndash Woo integration plugin hides the create aacount checkbox.So need to show it again.
690							$(
691								'.wcf-create-account-section .create-account label.checkbox'
692							).show();
693
694							$( '.wcf-create-account-section' ).show();
695
696							$(
697								'.woocommerce-billing-fields__customer-login-label'
698							).hide();
699						}
700					},
701				} );
702			}, 300 );
703		} else {
704			$( '.wcf-create-account-section' ).hide();
705			$( '.wcf-customer-login-section' ).hide();
706			$( '.wcf-email-validation-block' ).hide();
707			$( '.woocommerce-billing-fields__customer-login-label' ).show();
708		}
709
710		return false;
711	};
712
713	const woocommerce_user_login = function () {
714		$( '.wcf-customer-login-url' ).on( 'click', function login_form( e ) {
715			e.preventDefault();
716			const customer_login_wrap = $( '.wcf-customer-login-section' );
717
718			if ( customer_login_wrap.hasClass( 'wcf-show' ) ) {
719				customer_login_wrap.slideUp( 400 );
720				customer_login_wrap.removeClass( 'wcf-show' );
721			} else {
722				customer_login_wrap.slideDown( 400 );
723				customer_login_wrap.addClass( 'wcf-show' );
724			}
725		} );
726
727		$( '.wcf-customer-login-section__login-button' ).on(
728			'click',
729			function name() {
730				const email = $( '#billing_email' ).val();
731				const password = $( '#billing_password' ).val();
732
733				$.ajax( {
734					url: cartflows.ajax_url,
735					type: 'POST',
736					data: {
737						action: 'wcf_woocommerce_login',
738						email,
739						password,
740						security: cartflows.woocommerce_login_nonce,
741					},
742					success( resp ) {
743						if ( resp.data && resp.data.success ) {
744							location.reload();
745						} else {
746							$( '.wcf-customer-info__notice' )
747								.addClass( 'wcf-notice' )
748								.html( resp.data.error );
749						}
750					},
751				} );
752			}
753		);
754	};
755
756	const wcf_instant_checkout_relocate_notices = function () {
757		if ( $( 'body' ).hasClass( 'cartflows-instant-checkout' ) ) {
758			$( '.woocommerce-NoticeGroup' ).prependTo(
759				'.woocommerce-notices-wrapper'
760			);
761		}
762	};
763
764	const wcf_file_upload = {
765		init() {
766			$( document.body ).on(
767				'change',
768				'.wcf-checkout-file-input',
769				this.handle_file_change
770			);
771		},
772
773		handle_file_change() {
774			const $input = $( this ),
775				fieldKey = $input.data( 'field-key' ),
776				$hiddenField = $( '#' + fieldKey ),
777				$error = $( '#' + fieldKey + '_error' ),
778				maxSize = parseInt( $input.data( 'max-size' ) ) || 5;
779
780			// Clear previous errors.
781			$error.empty();
782
783			if ( ! this.files.length ) {
784				$hiddenField.val( '' );
785				return;
786			}
787
788			const file = this.files[ 0 ];
789
790			// Client-side file size validation.
791			if ( file.size > maxSize * 1024 * 1024 ) {
792				$error.html( 'File size exceeds ' + maxSize + 'MB limit.' );
793				$input.val( '' );
794				return;
795			}
796
797			// Client-side file type validation.
798			const ext = file.name.split( '.' ).pop().toLowerCase();
799
800			let allowed = [];
801
802			const allowedTypes = (
803				$input.data( 'allowed-types' ) || ''
804			).toString();
805			if ( allowedTypes ) {
806				allowed = allowedTypes.split( ',' ).map( function ( t ) {
807					return t.trim().toLowerCase();
808				} );
809			} else {
810				// Fallback to master allowlist.
811				allowed = [
812					'jpg',
813					'jpeg',
814					'png',
815					'webp',
816					'gif',
817					'pdf',
818					'mp3',
819					'm4a',
820					'wav',
821					'mp4',
822					'mov',
823				];
824			}
825
826			if ( allowed.length && ! allowed.includes( ext ) ) {
827				$error.html( 'File type not allowed.' );
828				$input.val( '' );
829				return;
830			}
831
832			const $wrapper = $input.closest( '.wcf-file-input-wrapper' );
833			// Show uploading state.
834			$wrapper.addClass( 'wcf-file-uploading' );
835
836			const formData = new FormData();
837			formData.append( 'wcf_checkout_file', file );
838			formData.append( 'action', 'wcf_upload_checkout_file' );
839			formData.append( 'security', cartflows.wcf_file_upload_nonce );
840			formData.append( 'field_key', fieldKey );
841			formData.append(
842				'checkout_id',
843				$( '._wcf_checkout_id' ).val() || ''
844			);
845
846			$.ajax( {
847				url: cartflows.ajax_url,
848				type: 'POST',
849				data: formData,
850				contentType: false,
851				processData: false,
852				success( response ) {
853					$wrapper.removeClass( 'wcf-file-uploading' );
854
855					if ( response.success && response.data ) {
856						$hiddenField.val( response.data.url );
857					} else {
858						const errorMsg =
859							response.data && response.data.error
860								? response.data.error
861								: 'Upload failed';
862						$error.html( errorMsg );
863						$hiddenField.val( '' );
864						$input.val( '' );
865					}
866				},
867				error() {
868					$wrapper.removeClass( 'wcf-file-uploading' );
869					$error.html( 'Upload failed. Please try again.' );
870					$hiddenField.val( '' );
871					$input.val( '' );
872				},
873			} );
874		},
875	};
876
877	$( function () {
878		wcf_persistent_data();
879
880		wcf_update_checkout_on_return();
881
882		wcf_custom_field_validation();
883
884		wcf_remove_cart_products();
885
886		wcf_checkout_coupons.init();
887
888		wcf_toggle_optimized_fields();
889		wcf_instant_checkout_coupon_field();
890
891		$( document.body ).on(
892			'checkout_error updated_checkout',
893			wcf_instant_checkout_relocate_notices
894		);
895
896		wcf_anim_field_style_two();
897
898		if ( cartflows.has_file_field ) {
899			wcf_file_upload.init();
900		}
901
902		// On email input field change.
903		$( '.wcf-customer-info #billing_email' ).on( 'input', function () {
904			inline_email_address_validation();
905		} );
906
907		// On page load as we saves the checkout fields values.
908		if ( $( '.wcf-customer-info #billing_email' ).length > 0 ) {
909			inline_email_address_validation();
910		}
911
912		woocommerce_user_login();
913	} );
914} )( 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.