( function() {
	
	let recaptchaWidgets = [];
	recaptchaCallback = function() {
		
		let forms = document.getElementsByTagName( 'form' );
		let pattern = /(^|\s)g-recaptcha(\s|$)/;

		for ( let i = 0; i < forms.length; i++ ) {
			let recaptchas = forms[ i ].getElementsByClassName( 'wpcf7-recaptcha' );
			
			for ( let j = 0; j < recaptchas.length; j++ ) {
				let sitekey = recaptchas[ j ].getAttribute( 'data-sitekey' );

				if ( recaptchas[ j ].className && recaptchas[ j ].className.match( pattern ) && sitekey ) {
					let params = {
						'sitekey': sitekey,
						'type': recaptchas[ j ].getAttribute( 'data-type' ),
						'size': recaptchas[ j ].getAttribute( 'data-size' ),
						'theme': recaptchas[ j ].getAttribute( 'data-theme' ),
						'align': recaptchas[ j ].getAttribute( 'data-align' ),
						'badge': recaptchas[ j ].getAttribute( 'data-badge' ),
						'tabindex': recaptchas[ j ].getAttribute( 'data-tabindex' )
					};

					let callback = recaptchas[ j ].getAttribute( 'data-callback' );

					if ( callback && 'function' == typeof window[ callback ] ) {
						params[ 'callback' ] = window[ callback ];
					}

					let expired_callback = recaptchas[ j ].getAttribute( 'data-expired-callback' );

					if ( expired_callback && 'function' == typeof window[ expired_callback ] ) {
						params[ 'expired-callback' ] = window[ expired_callback ];
					}

					let widget_id = grecaptcha.render( recaptchas[ j ], params );
					recaptchaWidgets.push( widget_id );
					break;
				}
			}
		}
	};

	/**
	 * Reset the reCaptcha when Contact Form 7 gives us:
	 *  - Spam
	 *  - Success
	 *  - Fail
	 * 
	 * @return void
	 */
	document.addEventListener( 'wpcf7submit', function( event ) {
		switch ( event.detail.status ) {
			case 'spam':
			case 'mail_sent':
			case 'mail_failed':
				for ( let i = 0; i < recaptchaWidgets.length; i++ ) {
					grecaptcha.reset( recaptchaWidgets[ i ] );
				}
		}
	}, false );
	
} )();