(function($) {

	window.onLoadFLReCaptcha = function() {
		var reCaptchaFields = $( '.fl-grecaptcha' ),
			widgetID;

		if ( reCaptchaFields.length > 0 ) {
			reCaptchaFields.each( function( i ){
				var self 		= $( this ),
				 	attrWidget 	= self.attr('data-widgetid'),
					newID       = $(this).attr('id') + '-' + i;

				// Avoid re-rendering as it's throwing API error
				if ( (typeof attrWidget !== typeof undefined && attrWidget !== false) ) {
					return;
				}
				else {
					// Increment ID to avoid conflict with the same form.
					self.attr( 'id', newID );

					widgetID = grecaptcha.render( newID, {
						sitekey : self.data( 'sitekey' ),
						theme	: self.data( 'theme' ),
						size    : self.data( 'validate' ),
						callback: function( response ){
							if ( response != '' ) {
								self.attr( 'data-fl-grecaptcha-response', response );

								// Re-submitting the form after a successful invisible validation.
								if ( 'invisible' == self.data( 'validate' ) ) {
									self.closest( '.fl-contact-form' ).find( 'a.fl-button' ).trigger( 'click' );
								}
							}
						}
					});

					self.attr( 'data-widgetid', widgetID );
				}
			});
		}
	};

	FLBuilderContactForm = function( settings )
	{
		this.settings	= settings;
		this.nodeClass	= '.fl-node-' + settings.id;
		this._init();
	};

	FLBuilderContactForm.prototype = {

		settings	: {},
		nodeClass	: '',

		_init: function()
		{
			$( this.nodeClass + ' .fl-button' ).click( $.proxy( this._submit, this ) );
			$( this.nodeClass + ' .fl-button' ).on( 'keydown, keyup', $.proxy( this._keyupdown, this ) );
		},

		_keyupdown: function(e) {
			if( e.keyCode === 13 || e.keyCode === 32 ) {
				e.preventDefault();
				this._submit(e);
			}
		},

		_submit: function( e )
		{
			var theForm	  		= $(this.nodeClass + ' .fl-contact-form'),
				submit	  		= $(this.nodeClass + ' .fl-button'),
				name	  		= $(this.nodeClass + ' .fl-name input'),
				email			= $(this.nodeClass + ' .fl-email input'),
				phone			= $(this.nodeClass + ' .fl-phone input'),
				subject	  		= $(this.nodeClass + ' .fl-subject input'),
				message	  		= $(this.nodeClass + ' .fl-message textarea'),
				termsCheckbox   = $(this.nodeClass + ' .fl-terms-checkbox input'),
				reCaptchaField	= $(this.nodeClass + ' .fl-grecaptcha'),
				reCaptchaValue	= reCaptchaField.data( 'fl-grecaptcha-response' ),
				ajaxData 		= null,
				ajaxurl	  		= FLBuilderLayoutConfig.paths.wpAjaxUrl,
				email_regex 	= /\S+@\S+\.\S+/,
				isValid	  		= true,
				postId      	= theForm.closest( '.fl-builder-content' ).data( 'post-id' ),
				layoutId      	= theForm.find( 'input[name=fl-layout-id]' ).val(),
				templateId		= theForm.data( 'template-id' ),
				templateNodeId	= theForm.data( 'template-node-id' ),
				nodeId      	= theForm.closest( '.fl-module' ).data( 'node' ),
				nonce         = theForm.find('#fl-contact-form-nonce').val();

			e.preventDefault();

			// End if button is disabled (sent already)
			if (submit.hasClass('fl-disabled')) {
				return;
			}

			// validate the name
			if(name.length) {
				if (name.val() === '') {
					isValid = false;
					name.parent().addClass('fl-error');
					name.attr('aria-invalid', true);
				}
				else if (name.parent().hasClass('fl-error')) {
					name.parent().removeClass('fl-error');
					name.attr('aria-invalid', false);
				}
			}

			// validate the email
			if(email.length) {
				if (email.val() === '' || !email_regex.test(email.val())) {
					isValid = false;
					email.parent().addClass('fl-error');
					email.attr('aria-invalid', true);
				}
				else if (email.parent().hasClass('fl-error')) {
					email.parent().removeClass('fl-error');
					email.attr('aria-invalid', false);
				}
			}

			// validate the subject..just make sure it's there
			if(subject.length) {
				if (subject.val() === '') {
					isValid = false;
					subject.parent().addClass('fl-error');
					subject.attr('aria-invalid', true);
				}
				else if (subject.parent().hasClass('fl-error')) {
					subject.parent().removeClass('fl-error');
					subject.attr('aria-invalid', false);
				}
			}

			// validate the phone..just make sure it's there
			if(phone.length) {
				if (phone.val() === '') {
					isValid = false;
					phone.parent().addClass('fl-error');
					phone.attr('aria-invalid', true);
				}
				else if (phone.parent().hasClass('fl-error')) {
					phone.parent().removeClass('fl-error');
					phone.attr('aria-invalid', false);
				}
			}

			// validate the message..just make sure it's there
			if (message.val() === '') {
				isValid = false;
				message.parent().addClass('fl-error');
				message.attr('aria-invalid', true);
			}
			else if (message.parent().hasClass('fl-error')) {
				message.parent().removeClass('fl-error');
				message.attr('aria-invalid', false);
			}

			// validate the terms and conditions checkbox if enabled
			if ( termsCheckbox.length ) {
				if ( ! termsCheckbox.is(':checked') ) {
					isValid = false;
					termsCheckbox.closest('.fl-terms-checkbox').addClass('fl-error');
				}
				else if (termsCheckbox.parent().hasClass('fl-error')) {
					termsCheckbox.parent().removeClass('fl-error');
				}
			}

			// validate if reCAPTCHA is enabled and checked
			if ( reCaptchaField.length > 0 && isValid ) {
				if ( 'undefined' === typeof reCaptchaValue || reCaptchaValue === false ) {
					if ( 'normal' == reCaptchaField.data( 'validate' ) ) {
						reCaptchaField.parent().addClass( 'fl-error' );
					} else if ( 'invisible' == reCaptchaField.data( 'validate' ) ) {

						// Invoke the reCAPTCHA check.
						if ( 'undefined' !== typeof reCaptchaField.data( 'action' ) ) {
							// V3
							grecaptcha.execute( reCaptchaField.data( 'widgetid' ), {action: reCaptchaField.data( 'action' )} );
						}
						else {
							// V2
							grecaptcha.execute( reCaptchaField.data( 'widgetid' ) );
						}
					}

 					isValid = false;
				} else {
					reCaptchaField.parent().removeClass('fl-error');
				}
			}

			// end if we're invalid, otherwise go on..
			if (!isValid) {
				return false;
			}
			else {

				// disable send button
				submit.addClass('fl-disabled');

				ajaxData = {
					action				: 'fl_builder_email',
					name				: name.val(),
					subject				: subject.val(),
					email				: email.val(),
					phone				: phone.val(),
					message				: message.val(),
					terms_checked		: termsCheckbox.is(':checked') ? '1' : '0',
					post_id 			: postId,
					layout_id			: layoutId,
					template_id 		: templateId,
					template_node_id 	: templateNodeId,
					node_id 			: nodeId,
					nonce         : nonce
				}

				if ( reCaptchaValue ) {
					ajaxData.recaptcha_response	= reCaptchaValue;
				}

				// post the form data
				$.post( ajaxurl, ajaxData, $.proxy( this._submitComplete, this ) );
			}
		},

		_submitComplete: function( response )
		{
			var urlField 	= $( this.nodeClass + ' .fl-success-url' ),
				noMessage 	= $( this.nodeClass + ' .fl-success-none' );

			// On success show the success message
			if (typeof response.error !== 'undefined' && response.error === false) {

				$( this.nodeClass + ' .fl-send-error' ).fadeOut();

				if ( urlField.length > 0 ) {
					window.location.href = urlField.val();
				}
				else if ( noMessage.length > 0 ) {
					noMessage.fadeIn();
				}
				else {
					$( this.nodeClass + ' .fl-contact-form' ).hide();
					$( this.nodeClass + ' .fl-success-msg' ).fadeIn();
				}
			}
			// On failure show fail message and re-enable the send button
			else {
				$(this.nodeClass + ' .fl-button').removeClass('fl-disabled');
				if ( typeof response.message !== 'undefined' ) {
					$(this.nodeClass + ' .fl-send-error').html(response.message);
				}
				$(this.nodeClass + ' .fl-send-error').fadeIn();
				if ( typeof response.errorInfo !== 'undefined' ) {
					console.log('Contact Form:',response.errorInfo);
				}
				return false;
			}
		}
	};

})(jQuery);
