/* globals sowb, jQuery */

window.sowb = window.sowb || {};

sowb.SiteOriginContactForm = {
	init: function ($, useRecaptcha) {
		var $contactForms = $('form.sow-contact-form,.sow-contact-form-success');
		$contactForms.each( function() {
			var $el = $( this );
			var formSubmitSuccess = $el.is( '.sow-contact-form-success' );
			var formSubmitted = $el.is( '.sow-contact-submitted' );
			if ( formSubmitted || formSubmitSuccess ) {
				// The form was submitted. Let's try to scroll to it so the user can see the result.
				if ( sowContact.scrollto ) {
					var formPosition = $el.offset().top;
					if ( $el.is( ':hidden' ) ) {
						// The form is hidden, so scroll to it's closest visible ancestor.
						var $container = $el.closest( ':visible' );
						formPosition = $container.offset().top;
						// If the closest visible ancestor is either SOWB Accordion or Tabs widget, try to open the panel.
						if ( $container.is( '.sow-accordion-panel' ) ) {
							$container.find( '> .sow-accordion-panel-header-container > .sow-accordion-panel-header' ).trigger( 'click' );
						} else if ( $container.is( '.sow-tabs-panel-container' ) ) {
							var tabIndex = $el.closest( '.sow-tabs-panel' ).index();
							$container.siblings( '.sow-tabs-tab-container' ).find( '> .sow-tabs-tab' ).eq( tabIndex ).trigger( 'click' );
						}
					}
					formPosition += parseInt( sowContact.scrollto_offset );
					$( 'html, body' ).scrollTop( formPosition );
				}

				if ( formSubmitSuccess ) {
					// The form was submitted successfully, so we don't need to do anything else.
					return;
				}
			}
			var $submitButton = $( this ).find( '.sow-submit-wrapper > .sow-submit' );

			if ( useRecaptcha && sowb.SiteOriginContactFormV2 ) {
				// Render recaptcha
				var $recaptchaDiv = $el.find('.sow-recaptcha');
				if ($recaptchaDiv.length) {
					var config = $recaptchaDiv.data('config');
					$submitButton.prop('disabled', true);
					grecaptcha.render($recaptchaDiv.get(0),
						{
							'sitekey': config.sitekey,
							'theme': config.theme,
							'type': config.type,
							'size': config.size,
							'callback': function (response) {
								// Enable the submit button once we have a response from recaptcha.
								$submitButton.prop('disabled', false);
							},
						}
					);
				}
			}

			// Disable the submit button on click to avoid multiple submits.
			$contactForms.on( 'submit', function() {
				$submitButton.prop( 'disabled', true );

				if ( $submitButton.data( 'js-key' ) ) {
					const js_key = $submitButton.data( 'js-key' );
					$( this ).append( `<input type="hidden" name="sow-js" value="${js_key}">` );
				}
			} );

			if ( typeof $.fn.select2 == 'function' ) {
				$( '.sow-form-field-select select[multiple]' ).select2();
			}
		} );
	},
};

function soContactFormInitialize() {
	sowb.SiteOriginContactForm.init(window.jQuery, true);
}

// reCAPTCHA v3 form submission.
function soContactFormSubmit( token, e ) {
	sowb.SiteOriginContactFormV3.parent().parent().trigger( 'submit' );
}

jQuery( function ( $ ) {
	const recaptcha = $( 'form.sow-contact-form .sow-recaptcha' );
	// Check if reCAPTCHA is being used.
	if ( ! recaptcha.length ) {
		sowb.SiteOriginContactForm.init( $, recaptcha );
		return;
	}

	let apiUrl = 'https://www.google.com/recaptcha/api.js?onload=soContactFormInitialize';
	// v2 requires a specific render type.
	if ( recaptcha.first().data( 'config' ) != undefined ) {
		sowb.SiteOriginContactFormV2 = true;
		apiUrl += '&render=explicit';
	} else {
		// v3 requires a click event for submission.
		$( 'button.sow-submit ' ).on( 'click', function( e ) {
			e.preventDefault();
			sowb.SiteOriginContactFormV3 = $( this );
		} );
	}

	$( 'body' ).append(
		'<script type="text/javascript" src="' + apiUrl + '" async defer>'
	);


	if ( typeof $.fn.select2 == 'function' ) {
		// We need to adjust the dropdown position, or it'll cover the field.
		$( document ).on( 'click', '.sow-form-field-select .select2-selection--multiple', function() {
			$( '.select2-container--open .select2-dropdown' ).css( 'top', '32px' );
		} );
	}
} );
