// source --> https://cathydou.com/wp-content/plugins/wp-analytify-pro/inc/modules/wp-analytify-forms/assets/js/tracking.js?ver=dae28406e26b5ff7d4a4bbbaed27c0ba 
// Get values localized.
const {ANALYTIFY_TRACKING_MODE} = FORMS_TRACKING_OBJECT;
const {ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS} = FORMS_TRACKING_OBJECT;
const {custom_form} = FORMS_TRACKING_OBJECT;
const {track_cf7} = FORMS_TRACKING_OBJECT;
const {track_wpforms} = FORMS_TRACKING_OBJECT;
const {track_gravityforms} = FORMS_TRACKING_OBJECT;
const {track_formidable} = FORMS_TRACKING_OBJECT;
const {track_ninjaforms} = FORMS_TRACKING_OBJECT;
const {track_fluentforms} = FORMS_TRACKING_OBJECT;
const {track_wsforms} = FORMS_TRACKING_OBJECT;
const {property_tracking_mode} = FORMS_TRACKING_OBJECT;
const {track_elementor} = FORMS_TRACKING_OBJECT;
const {track_hubspot} = FORMS_TRACKING_OBJECT;
const {track_jotform} = FORMS_TRACKING_OBJECT;
const {track_mailpoet} = FORMS_TRACKING_OBJECT;
const {custom_form_default_label} = FORMS_TRACKING_OBJECT;

const FORM_SELECTORS = {
	wpcf7: '.wpcf7-form',
	wpforms: '.wpforms-form',
	gform: '.gform_wrapper',
	formidable: '.frm-show-form',
	fluent: '.frm-fluent-form',
	ninja: '.nf-form-cont',
};

const tracked_forms_selector = `${FORM_SELECTORS.wpcf7}, ${FORM_SELECTORS.wpforms}, ${FORM_SELECTORS.gform}, ${FORM_SELECTORS.formidable}, ${FORM_SELECTORS.fluent}, ${FORM_SELECTORS.ninja}, .${ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS}`;

/** Per-form UI state (current_step is 1-based page index; step_complete GA events still send the completed step as page - 1). */
const formState = new Map();

function formStateKey( category, id ) {
	return `${category  }\x01${  String( id )}`;
}

function ensureFormState( category, id ) {
	const k = formStateKey( category, id );
	if ( ! formState.has( k ) ) {
		formState.set( k, { current_step: 1, has_interacted: false, is_transitioning: false } );
	}
	return formState.get( k );
}

function sessionFormState() {
	const c = sessionStorage.getItem( 'analytify_forms_category' );
	const i = sessionStorage.getItem( 'analytify_forms_id' );
	return ( c && i ) ? ensureFormState( c, i ) : null;
}

/**
 * @param {JQuery|Element} el Form or element inside a form.
 * @return {{category: string, id: string}|null}
 */
function getFormCategory( el ) {
	const $el = ( el && el.jquery ) ? el : jQuery( el );
	if ( ! $el.length ) {
		return null;
	}
	const $form = $el.is( 'form' ) ? $el : $el.closest( 'form' );
	if ( ! $form.length ) {
		return null;
	}
	if ( $form.hasClass( 'wpcf7-form' ) ) {
		return { category: 'analytify_form_wpcf7', id: $form.find( 'input[name="_wpcf7"]' ).val() };
	}
	if ( $form.hasClass( 'wpforms-form' ) ) {
		return { category: 'analytify_form_wpforms', id: $form.attr( 'data-formid' ) };
	}
	if ( $form.parent().hasClass( 'gform_wrapper' ) ) {
		const parts = $form.attr( 'id' ) ? $form.attr( 'id' ).split( '_' ) : '';
		const [, gfId] = parts;
		return gfId ? { category: 'analytify_form_gf', id: gfId } : null;
	}
	if ( $form.hasClass( 'frm-show-form' ) ) {
		return { category: 'analytify_form_formidable', id: $form.find( 'input[name="form_id"]' ).val() };
	}
	if ( $form.hasClass( 'frm-fluent-form' ) ) {
		return { category: 'analytify_form_fluentforms', id: $form.attr( 'data-form_id' ) };
	}
	return null;
}

function waitForGtag() {
	return new Promise( ( resolve ) => {
		const i = setInterval( () => {
			if ( 'function' === typeof gtag ) {
				clearInterval( i );
				resolve();
			}
		}, 100 );
	} );
}

function analytifyFormsIsDevHost() {
	try {
		const h = window.location.hostname;
		return 'localhost' === h || '127.0.0.1' === h || /\.local$/.test( h );
	} catch ( e ) {
		return false;
	}
}

function analytifyFormsWarnStorage( err ) {
	if ( ! analytifyFormsIsDevHost() ) {
		return;
	}
	const c = window.console;
	if ( ! c || 'function' !== typeof c.warn ) {
		return;
	}
	c.warn( 'SessionStorage error', err );
}

jQuery(document).ready(() => {

	// simple function that checks if attr is available
	jQuery.fn.hasAttr = function (name) {
		return undefined !== this.attr(name);
	};

	analytify_forms_load( ANALYTIFY_TRACKING_MODE );

	// 1. Instantly retrieve session data into per-form state.
	const stored_step        = sessionStorage.getItem( 'analytify_forms_current_step' );
	const stored_interaction = sessionStorage.getItem( 'analytify_forms_has_interacted' );
	const stored_category    = sessionStorage.getItem( 'analytify_forms_category' );
	const stored_id          = sessionStorage.getItem( 'analytify_forms_id' );

	if ( stored_category && stored_id ) {
		const s0 = ensureFormState( stored_category, stored_id );
		s0.current_step = ( stored_step && ! isNaN( parseInt( stored_step, 10 ) ) ) ? parseInt( stored_step, 10 ) : 1;
		s0.has_interacted = 'true' === stored_interaction;
	}

	// Update current_step (1-based) from visible Gravity Form on load.
	const update_current_step_from_visible_form = () => {
		const $gform = jQuery( `${FORM_SELECTORS.gform} form` );
		if ( 0 < $gform.length ) {

			// Try hidden input first.
			let page = $gform.find( 'input[name^="gform_source_page_number_"]' ).val();

			// Fallback: Check progress bar text if hidden input is missing (based on user screenshot).
			if ( ! page ) {
				const $currentPageSpan = $gform.find( '.gf_step_current_page' );
				if ( 0 < $currentPageSpan.length ) {
					page = $currentPageSpan.text().trim();
				}
			}

			if ( page ) {
				const meta = getFormCategory( $gform );
				if ( meta && meta.id ) {
					const s = ensureFormState( meta.category, meta.id );
					s.current_step = parseInt( page, 10 );
					sessionStorage.setItem( 'analytify_forms_current_step', s.current_step );
				}
			}
		}
	};

	update_current_step_from_visible_form();

	// 2. Abandonment Check: If we have interaction but NO tracked form on this page, trigger abandonment.
	const check_immediate_abandonment = () => {
		const $visible_forms = jQuery( tracked_forms_selector ).filter( ':visible' );
		const s = sessionFormState();

		if ( s && s.has_interacted && 0 === $visible_forms.length ) {
			const cat = sessionStorage.getItem( 'analytify_forms_category' );
			const sid = sessionStorage.getItem( 'analytify_forms_id' );
			if ( cat && sid ) {
				analytify_forms_send_event( cat, sid, 'abandonment', s.current_step );

				// Wipe session immediately after sending to prevent multiple triggers.
				analytify_forms_clear_session( cat, sid );
				s.has_interacted = false;
			}
		}
	};

	// Trigger abandonment check as soon as possible if we have an active session.
	if ( sessionFormState() && sessionFormState().has_interacted ) {

		// Run once immediately.
		check_immediate_abandonment();

		// Re-check once gtag exists (no arbitrary cut-off).
		waitForGtag().then( () => {
			const s = sessionFormState();
			if ( s && s.has_interacted ) {
				check_immediate_abandonment();
			}
		} );
	}

	// Mark as transitioning when clicking Next/Previous to avoid false abandonment.
	jQuery( document ).on( 'click', '.gform_next_button, .gform_previous_button, .wpforms-page-button, .ff-btn-next, .ff-btn-prev, .frm_next_page, .frm_prev_page', function () {
		const meta = getFormCategory( jQuery( this ).closest( 'form' ) );
		if ( meta && meta.id ) {
			ensureFormState( meta.category, meta.id ).is_transitioning = true;
		}
	} );

	// Track form interaction and update step if needed.
	jQuery( document ).on( 'focus change', 'input, textarea, select', function() {
		const $form = jQuery( this ).closest( 'form' );
		const meta = getFormCategory( $form );
		if ( ! meta || ! meta.id ) {
			return;
		}
		const s = ensureFormState( meta.category, meta.id );

		// If this form was already marked interacted, persist its current step only.
		if ( s.has_interacted ) {
			sessionStorage.setItem( 'analytify_forms_current_step', s.current_step );
			return;
		}

		s.has_interacted = true;
		sessionStorage.setItem( 'analytify_forms_has_interacted', 'true' );
		sessionStorage.setItem( 'analytify_forms_category', meta.category );
		sessionStorage.setItem( 'analytify_forms_id', meta.id );
		sessionStorage.setItem( 'analytify_forms_current_step', s.current_step );
	} );

	// Send abandonment event when user leaves.
	window.addEventListener( 'visibilitychange', () => {
		if ( 'hidden' !== document.visibilityState ) {
			return;
		}
		const $form = jQuery( tracked_forms_selector ).filter( ':visible' ).first();
		let category = '';
		let id       = '';

		if ( 0 < $form.length ) {
			const vis = getFormCategory( $form );
			if ( vis && vis.id ) {
				( { category, id } = vis );
			}
		} else {

			// Fallback to stored values if no form is visible (cross-page abandonment).
			category = sessionStorage.getItem( 'analytify_forms_category' );
			id       = sessionStorage.getItem( 'analytify_forms_id' );
		}

		if ( ! category || ! id ) {
			return;
		}
		const s = ensureFormState( category, id );
		if ( ! s.has_interacted || s.is_transitioning ) {
			return;
		}

		analytify_forms_send_event( category, id, 'abandonment', s.current_step );

		// Reset interaction and clear storage after abandonment.
		s.has_interacted = false;
		analytify_forms_clear_session( category, id );
	} );

	// Multi-step: current_step stays 1-based; step_complete passes completed index (page - 1).
	jQuery( document ).on( 'gform_page_loaded', ( event, form_id, page ) => {
		const s = ensureFormState( 'analytify_form_gf', String( form_id ) );
		s.current_step = page;
		s.has_interacted = true;
		sessionStorage.setItem( 'analytify_forms_current_step', String( page ) );
		sessionStorage.setItem( 'analytify_forms_has_interacted', 'true' );
		s.is_transitioning = false;
		if ( 'on' === track_gravityforms ) {
			analytify_forms_send_event( 'analytify_form_gf', form_id, 'step_complete', page - 1 );
		}
	} );

	jQuery( document ).on( 'wpformsPageChange', ( event, page, $form ) => {
		const form_id = $form.attr( 'data-formid' );
		if ( ! form_id ) {
			return;
		}
		const s = ensureFormState( 'analytify_form_wpforms', form_id );
		s.current_step = page;
		sessionStorage.setItem( 'analytify_forms_current_step', String( page ) );
		s.is_transitioning = false;
		if ( 'on' === track_wpforms ) {
			analytify_forms_send_event( 'analytify_form_wpforms', form_id, 'step_complete', page - 1 );
		}
	} );

	jQuery( document ).on( 'fluentform_step_completed', ( event, data ) => {
		if ( ! data || ! data.form_id ) {
			return;
		}
		const s = ensureFormState( 'analytify_form_fluentforms', String( data.form_id ) );
		s.current_step = data.step + 1;
		sessionStorage.setItem( 'analytify_forms_current_step', String( s.current_step ) );
		s.is_transitioning = false;
		if ( 'on' === track_fluentforms ) {
			analytify_forms_send_event( 'analytify_form_fluentforms', data.form_id, 'step_complete', data.step );
		}
	} );

	// Reset interaction and clear storage on submission.
	jQuery( document ).on( 'submit', 'form', function() {
		const meta = getFormCategory( jQuery( this ) );
		if ( meta && meta.id ) {
			ensureFormState( meta.category, meta.id ).has_interacted = false;
		}
		analytify_forms_clear_session( meta ? meta.category : '', meta ? meta.id : '' );
	} );

	// submission event for custom forms
	if ( 'on' === custom_form ) {

		// Custom class added in form container.
		jQuery( `.${ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS} form, form.${ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS}` ).on( 'submit', function () {
			custom_form_submission( this );
		} );
	}

} );

function custom_form_submission( thisElement ) {

	// Get form name from name attribute, or id attribute, or generate from URL
	let analytify_form_name = '';
	if ( jQuery( thisElement ).hasAttr( 'name' ) ) {
		analytify_form_name = jQuery( thisElement ).attr( 'name' );
	} else if ( jQuery( thisElement ).hasAttr( 'id' ) ) {
		analytify_form_name = jQuery( thisElement ).attr( 'id' );
	} else {
		const defaultLabel = ( 'undefined' !== typeof custom_form_default_label && custom_form_default_label ) ? custom_form_default_label : 'Custom Form on';
		analytify_form_name = `${defaultLabel} ${window.location.href}`;
	}

	if ( 'gtag' === ANALYTIFY_TRACKING_MODE && 'ga4' === property_tracking_mode ) {
		waitForGtag().then( () => {
			gtag( 'event', 'analytify_form', {
				'wpa_link_action': 'submission',
				'wpa_category': 'analytify_form_custom',
				'wpa_link_label': analytify_form_name,
			} );
		} );
	}
}

// tell Google Analytics that a form has been loaded
function analytify_forms_check_impression() {

	// loop through all the forms on the page
	jQuery( 'form' ).each( function () {

		if ( 'on' === custom_form && ( jQuery( this ).hasClass( ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS ) || jQuery( this ).parents( `.${ANALYTIFY_FORMS_ADDON_CUSTOM_FORM_CLASS}` ).length ) ) {

			// Custom Form - now send impression event
			let analytify_form_name = '';
			if (jQuery(this).hasAttr('name')) {
				analytify_form_name = jQuery(this).attr('name');
			} else if (jQuery(this).hasAttr('id')) {
				analytify_form_name = jQuery(this).attr('id');
			} else {
				const defaultLabel = ( 'undefined' !== typeof custom_form_default_label && custom_form_default_label ) ? custom_form_default_label : 'Custom Form on';
				analytify_form_name = `${defaultLabel} ${window.location.href}`;
			}
			analytify_forms_send_impression( 'analytify_form_custom', analytify_form_name );
		} else if ( 'on' === track_cf7 && jQuery( this ).hasClass( 'wpcf7-form' ) ) {

			// Contact Form 7
			const analytify_form_id = jQuery( this ).find( 'input[name="_wpcf7"]' ).length ? jQuery( this ).find( 'input[name="_wpcf7"]' ).val() : '';
			if ( analytify_form_id && ! analytify_forms_has_session_event( 'analytify_form_wpcf7', analytify_form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_wpcf7', analytify_form_id );
				analytify_forms_set_session_event( 'analytify_form_wpcf7', analytify_form_id, 'impression' );
			}

		} else if ( 'on' === track_wpforms && jQuery( this ).hasClass( 'wpforms-form' ) ) {

			// WPForms
			const analytify_form_id = jQuery( this ).hasAttr( 'data-formid' ) ? jQuery( this ).attr( 'data-formid' ) : '';
			if ( analytify_form_id && ! analytify_forms_has_session_event( 'analytify_form_wpforms', analytify_form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_wpforms', analytify_form_id );
				analytify_forms_set_session_event( 'analytify_form_wpforms', analytify_form_id, 'impression' );
			}

		} else if ( 'on' === track_gravityforms && jQuery( this ).parent().hasClass( 'gform_wrapper' ) ) {

			// Gravity Forms
			const __analytify_form_id = jQuery( this ).hasAttr( 'id' ) ? jQuery( this ).attr( 'id' ).split( '_' ) : '';
			const [, analytify_form_id = ''] = __analytify_form_id;
			if ( analytify_form_id && ! analytify_forms_has_session_event( 'analytify_form_gf', analytify_form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_gf', analytify_form_id );
				analytify_forms_set_session_event( 'analytify_form_gf', analytify_form_id, 'impression' );
			}

		} else if ( 'on' === track_formidable && jQuery( this ).hasClass( 'frm-show-form' ) ) {

			// Formidable Forms
			const analytify_form_id = ( jQuery( this ).find( 'input[name="form_id"]' ).length ) ? jQuery( this ).find( 'input[name="form_id"]' ).val() : '';
			if ( analytify_form_id && ! analytify_forms_has_session_event( 'analytify_form_formidable', analytify_form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_formidable', analytify_form_id );
				analytify_forms_set_session_event( 'analytify_form_formidable', analytify_form_id, 'impression' );
			}

		} else if ( 'on' === track_fluentforms && jQuery( this ).hasClass( 'frm-fluent-form' ) ) {

			// Fluent Forms
			const analytify_form_id = jQuery( this ).hasAttr( 'data-form_id' ) ? jQuery( this ).attr( 'data-form_id' ) : '';
			if ( analytify_form_id && ! analytify_forms_has_session_event( 'analytify_form_fluentforms', analytify_form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_fluentforms', analytify_form_id );
				analytify_forms_set_session_event( 'analytify_form_fluentforms', analytify_form_id, 'impression' );
			}

		} else if ('on' == track_elementor && jQuery(this).hasClass('elementor-form')) {

			// Elementor Forms
			const analytify_form_id = jQuery(this).hasAttr('data-id') ? jQuery(this).attr('data-id') : '';
			analytify_forms_send_impression('analytify_form_elementor', analytify_form_id);

		} else if ('on' == track_mailpoet && jQuery(this).hasClass('mailpoet_form')) {

			// MailPoet Forms
			let analytify_form_id = jQuery(this).hasAttr('data-id') ? jQuery(this).attr('data-id') : '';
			if (!analytify_form_id) {
				analytify_form_id = jQuery(this).find('input[name="data[form_id]"]').val() || '';
			}
			analytify_forms_send_impression('analytify_form_mailpoet', analytify_form_id);
		
		} else if ('on' === track_wsforms && (jQuery(this).hasClass('wsf-form') || 0 < jQuery(this).closest('.wsf-form').length)) {

			// WS Forms
			const $wsForm = jQuery(this).hasClass('wsf-form') ? jQuery(this) : jQuery(this).closest('.wsf-form');
			const analytify_form_id = $wsForm.attr('data-id') ? $wsForm.attr('data-id') : '';
			if (analytify_form_id) {
				analytify_forms_send_impression('analytify_form_wsforms', analytify_form_id);
			}

		}

	} );

}

function analytify_forms_send_impression( category, id ) {
	analytify_forms_send_event( category, id, 'impression' );
}

/**
 * Sends an event to Google Analytics.
 *
 * @param {string} category The event category.
 * @param {string} id       The form ID.
 * @param {string} action   The action (impression, submission, start, step_complete).
 * @param {number} step     Optional step number for multi-step forms.
 */
function analytify_forms_send_event( category, id, action, step = null ) {

	if ( 'gtag' !== ANALYTIFY_TRACKING_MODE || 'ga4' !== property_tracking_mode ) {
		return;
	}

	waitForGtag().then( () => {
		const event_params = {
			'wpa_link_action': action,
			'wpa_category': category,
			'wpa_link_label': id.toString(),
		};

		if ( 'abandonment' === action ) {
			event_params.transport_type = 'beacon';
		}

		gtag( 'event', 'analytify_form', event_params );

		// If we have a step number, send it as a separate 'step' action inside wpa_link_action.
		if ( null !== step ) {
			const step_params = {
				'wpa_link_action': `step ${parseInt( step, 10 )}`,
				'wpa_category': category,
				'wpa_link_label': id.toString(),
			};
			if ( 'abandonment' === action ) {
				step_params.transport_type = 'beacon';
			}
			gtag( 'event', 'analytify_form', step_params );
		}
	} );
}

if ( 'on' === track_ninjaforms ) {

	// check impression for Ninja Forms
	if ( window.jQuery ) {
		jQuery( document ).on( 'nfFormReady', ( e, layoutView ) => {
			const njform_label = layoutView.el.split( '-' );
			const [, , form_id]      = njform_label;

			if ( form_id && ! analytify_forms_has_session_event( 'analytify_form_ninja_forms', form_id, 'impression' ) ) {
				analytify_forms_send_impression( 'analytify_form_ninja_forms', form_id );
				analytify_forms_set_session_event( 'analytify_form_ninja_forms', form_id, 'impression' );
			}
		} );
	}
}

/**
 * Clears all Analytify session storage for a specific form.
 *
 * @param {string} category The form category.
 * @param {string} id       The form ID.
 */
function analytify_forms_clear_session( category = '', id = '' ) {
	sessionStorage.removeItem( 'analytify_forms_has_interacted' );
	sessionStorage.removeItem( 'analytify_forms_current_step' );
	sessionStorage.removeItem( 'analytify_forms_category' );
	sessionStorage.removeItem( 'analytify_forms_id' );

	if ( category && id ) {
		sessionStorage.removeItem( `analytify_form_impression_${category}_${id}` );
		sessionStorage.removeItem( `analytify_form_start_${category}_${id}` );
	}
}

function checkHubspotIframes() {
	jQuery( 'iframe[src*="hsforms.net"]' ).each( function () {
		const src = jQuery( this ).attr( 'src' );
		if ( ! src ) {
			return;
		}
		const match = src.match( /_hsFormId=([^&]+)/ );
		if ( ! match ) {
			return;
		}
		const [, formId] = match;
		if ( ! formId ) {
			return;
		}
		if ( analytify_forms_has_session_event( 'analytify_form_hubspot', formId, 'impression' ) ) {
			return;
		}
		analytify_forms_send_impression( 'analytify_form_hubspot', formId );
		analytify_forms_set_session_event( 'analytify_form_hubspot', formId, 'impression' );
	} );
}

function trackJotFormImpressions() {
    jQuery('iframe[src*="jotform.com"]').each(function () {
        const jotFormIframe = jQuery(this);
        const formId = jotFormIframe.attr('id') || jotFormIframe.attr('name') || 'unknown';

        // Impression tracked immediately
        analytify_forms_send_impression('analytify_form_jotform', formId);

        // Track when iframe finishes loading (first load)
        jotFormIframe.on('load', () => {
            analytify_forms_send_impression('analytify_form_jotform', formId);
        });
    });
}


// Run on initial load
jQuery(window).on('load', () => {
    if ('on' == track_hubspot) {
        checkHubspotIframes();

        // Also watch for dynamically loaded iframes
		const observer = new MutationObserver( ( mutations ) => {
			mutations.forEach( ( mutation ) => {
				mutation.addedNodes.forEach( ( node ) => {
					if ( 'IFRAME' !== node.nodeName || ! node.src || ! node.src.includes( 'hsforms.net' ) ) {
						return;
					}
					const match = node.src.match( /_hsFormId=([^&]+)/ );
					if ( ! match ) {
						return;
					}
					const [, formId] = match;
					if ( ! formId ) {
						return;
					}
					if ( analytify_forms_has_session_event( 'analytify_form_hubspot', formId, 'impression' ) ) {
						return;
					}
					analytify_forms_send_impression( 'analytify_form_hubspot', formId );
					analytify_forms_set_session_event( 'analytify_form_hubspot', formId, 'impression' );
				} );
			} );
		} );

        observer.observe(document.body, { childList: true, subtree: true });
    }
});

if ('on' === track_jotform) {
    jQuery(window).on('load', () => {
        trackJotFormImpressions();
    });
}

/**
 * Check if an action has already been performed for a form in this session.
 *
 * @param {string} category The form category.
 * @param {string} id       The form ID.
 * @param {string} action   The action (start, impression).
 * @return {boolean} True if already performed.
 */
function analytify_forms_has_session_event( category, id, action ) {
	const key = `analytify_form_${action}_${category}_${id}`;
	try {
		return !! sessionStorage.getItem( key );
	} catch ( e ) {
		analytifyFormsWarnStorage( e );
		return false;
	}
}

/**
 * Mark an action as performed for a form in this session.
 *
 * @param {string} category The form category.
 * @param {string} id       The form ID.
 * @param {string} action   The action (start, impression).
 */
function analytify_forms_set_session_event( category, id, action ) {
	const key = `analytify_form_${action}_${category}_${id}`;
	try {
		sessionStorage.setItem( key, 'true' );
	} catch ( e ) {
		analytifyFormsWarnStorage( e );
	}
}

// Elementor Forms submission (delegated: runs on actual form submit)
if ('on' == track_elementor) {
	jQuery(document).on('submit', 'form.elementor-form', function () {
		const $form = jQuery(this);
		const analytify_form_id = $form.hasAttr('data-id') ? $form.attr('data-id') : '';
		if ('gtag' === ANALYTIFY_TRACKING_MODE && 'ga4' === property_tracking_mode) {
			gtag('event', 'analytify_form', {
				'wpa_link_action': 'submission',
				'wpa_category': 'analytify_form_elementor',
				'wpa_link_label': (analytify_form_id || '').toString(),
			});
		}
	});
}

// MailPoet: no gtag on submit here — MailPoet stops submit from reaching document; submissions use PHP + GA4 MP (analytify-forms-tracking.php).
if ('on' === track_wsforms) {

	// Track WS Forms submission via JavaScript on success (so it persists in GA4 like impression).
	// wsf-submit-success fires after a successful submit; client-side gtag ensures the event
	// is stored in standard reports. Server-side (Measurement Protocol) submissions often
	// show in real-time only and do not persist in event parameter breakdowns.
	if (window.jQuery) {
		// eslint-disable-next-line no-unused-vars
		jQuery(document).on('wsf-submit-success', (event, form_object, form_id, instance_id, form_el, form_canvas_el) => {
			if ('function' === typeof gtag && 'gtag' === ANALYTIFY_TRACKING_MODE && 'ga4' === property_tracking_mode && form_id !== undefined && null !== form_id && '' !== form_id) {
				gtag('event', 'analytify_form', {
					'wpa_link_action': 'submission',
					'wpa_category': 'analytify_form_wsforms',
					'wpa_link_label': String(form_id),
				});
			}
		});
	}
}

/**
 * Poll until the analytics hook is ready, then run impressions (retry cap avoids infinite loop).
 *
 * @param {string} trackingMode The current tracking script used.
 * @param {number} [retries]    Internal retry counter.
 * @return {void}
 */
function analytify_forms_load( trackingMode, retries = 0 ) {
	if ( 50 < retries ) {
		return;
	}
	let repeat = true;

	if ( 'gtag' === trackingMode ) {
		if ( 'undefined' !== typeof gtag && gtag ) {
			repeat = false;
		}
	} else if ( 'undefined' !== typeof ga && ga && Object.prototype.hasOwnProperty.call( ga, 'loaded' ) && true === ga.loaded ) {
		repeat = false;
	}

	if ( repeat ) {
		setTimeout( () => analytify_forms_load( trackingMode, retries + 1 ), 200 );
	} else {
		analytify_forms_check_impression();
	}
};