: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
app.dateTimeErrorPlacement( element, error );
} else if ( app.isFieldInColumn( element ) ) {
element.parent().append( error );
} else if ( app.isFieldHasHint( element ) ) {
element.parent().append( error );
} else if ( app.isLeadFormsSelect( element ) ) {
element.parent().parent().append( error );
} else if ( element.hasClass( 'wp-editor-area' ) ) {
element.parent().parent().parent().append( error );
error.insertAfter( element );
if ( app.isModernMarkupEnabled() ) {
'aria-label': wpforms_settings.errorMessagePrefix,
highlight( element, errorClass, validClass ) { // eslint-disable-line complexity
const $element = $( element ),
$field = $element.closest( '.wpforms-field' ),
inputName = $element.attr( 'name' );
if ( 'radio' === $element.attr( 'type' ) || 'checkbox' === $element.attr( 'type' ) ) {
$field.find( 'input[name="' + inputName + '"]' ).addClass( errorClass ).removeClass( validClass );
$element.addClass( errorClass ).removeClass( validClass );
// Remove password strength container for empty required password field.
$element.attr( 'type' ) === 'password' &&
$element.val().trim() === '' &&
window.WPFormsPasswordField &&
$element.data( 'rule-password-strength' ) &&
$element.hasClass( 'wpforms-field-required' )
WPFormsPasswordField.passwordStrength( '', element );
$field.addClass( 'wpforms-has-error' );
unhighlight( element, errorClass, validClass ) {
const $element = $( element ),
$field = $element.closest( '.wpforms-field' ),
inputName = $element.attr( 'name' );
if ( 'radio' === $element.attr( 'type' ) || 'checkbox' === $element.attr( 'type' ) ) {
$field.find( 'input[name="' + inputName + '"]' ).addClass( validClass ).removeClass( errorClass );
$element.addClass( validClass ).removeClass( errorClass );
// Remove the error class from the field container if there are no subfield errors.
if ( ! $field.find( ':input.wpforms-error,[data-dz-errormessage]:not(:empty)' ).length ) {
$field.removeClass( 'wpforms-has-error' );
// Remove an error message to be sure the next time the `errorPlacement` method will be executed.
if ( app.isModernMarkupEnabled() ) {
$element.parent().find( 'em.wpforms-error' ).remove();
* @param {jQuery} $form current form element.
* @param {jQuery} $container current form container.
const captchaErrorDisplay = function( $form, $container ) {
if ( app.isModernMarkupEnabled() ) {
errorRole = 'role="alert"';
const error = `<${ errorTag } id="wpforms-field_recaptcha-error" class="wpforms-error" ${ errorRole }> ${ wpforms_settings.val_recaptcha_fail_msg }</${ errorTag }>`;
$form.find( '.wpforms-recaptcha-container' ).append( error );
app.restoreSubmitButton( $form, $container );
* Submit handler routine.
* @return {boolean|void} False if form won't submit.
const submitHandlerRoutine = function() { // eslint-disable-line complexity
$container = $form.closest( '.wpforms-container' ),
$submit = $form.find( '.wpforms-submit' ),
isCaptchaInvalid = $submit.data( 'captchaInvalid' ),
altText = $submit.data( 'alt-text' ),
recaptchaID = $submit.get( 0 ).recaptchaID;
if ( $form.data( 'token' ) && 0 === $( '.wpforms-token', $form ).length ) {
$( '<input type="hidden" class="wpforms-token" name="wpforms[token]" />' )
.val( $form.data( 'token' ) )
$form.find( '#wpforms-field_recaptcha-error' ).remove();
$submit.prop( 'disabled', true );
WPFormsUtils.triggerEvent( $form, 'wpformsFormSubmitButtonDisable', [ $form, $submit ] );
// Display processing text.
if ( isCaptchaInvalid ) {
return captchaErrorDisplay( $form, $container );
if ( ! app.empty( recaptchaID ) || recaptchaID === 0 ) {
// The Form contains invisible reCAPTCHA.
grecaptcha.execute( recaptchaID ).then( null, function() {
if ( grecaptcha.getResponse() ) {
captchaErrorDisplay( $form, $container );
// Remove name attributes if needed.
$( '.wpforms-input-temp-name' ).removeAttr( 'name' );
// In the case of active Google reCAPTCHA v3, first, we should call `grecaptcha.execute`.
// This is needed to get a proper grecaptcha token before submitting the form.
if ( typeof wpformsRecaptchaV3Execute === 'function' ) {
return wpformsRecaptchaV3Execute( submitHandlerRoutine );
return submitHandlerRoutine();
invalidHandler( event, validator ) {
if ( typeof validator.errorList[ 0 ] !== 'undefined' ) {
app.scrollToError( $( validator.errorList[ 0 ].element ) );
onkeyup: WPFormsUtils.debounce( // eslint-disable-next-line complexity
function( element, event ) {
// This code is copied from JQuery Validate 'onkeyup' method with only one change: 'wpforms-novalidate-onkeyup' class check.
const excludedKeys = [ 16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225 ];
if ( $( element ).hasClass( 'wpforms-novalidate-onkeyup' ) ) {
return; // Disable onkeyup validation for some elements (e.g. remote calls).
// eslint-disable-next-line no-mixed-operators
if ( event.which === 9 && this.elementValue( element ) === '' || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
} else if ( element.name in this.submitted || element.name in this.invalid ) {
onfocusout: function( element ) { // eslint-disable-line complexity, object-shorthand
// This code is copied from JQuery Validate 'onfocusout' method with only one change: 'wpforms-novalidate-onkeyup' class check.
if ( $( element ).hasClass( 'wpforms-novalidate-onkeyup' ) && ! element.value ) {
validate = true; // Empty value error handling for elements with onkeyup validation disabled.
if ( ! this.checkable( element ) && ( element.name in this.submitted || ! this.optional( element ) ) ) {
// If the error comes from server validation, we don't need to validate it again,
// because it will clean the error message too early.
if ( $( element ).data( 'server-error' ) ) {
const type = ( element || {} ).type;
if ( [ 'checkbox', 'radio' ].indexOf( type ) > -1 ) {
if ( $el.hasClass( 'wpforms-likert-scale-option' ) ) {
$el = $el.closest( 'tr' );
$el = $el.closest( '.wpforms-field' );
$el.find( 'label.wpforms-error, em.wpforms-error' ).remove();
form.validate( properties );
* Request to check if email is restricted.
* @param {Element} element Email input field.
* @param {string} value Field value.
restrictedEmailRequest( element, value ) {
const $el = $( element );
const $form = $el.closest( 'form' );
const validator = $form.data( 'validator' );
const formId = $form.data( 'formid' );
const $field = $el.closest( '.wpforms-field' );
const fieldId = $field.data( 'field-id' );
app.cache[ formId ] = app.cache[ formId ] || {};
validator.startRequest( element );
url: wpforms_settings.ajaxurl,
action: 'wpforms_restricted_email',
form_id: formId, // eslint-disable-line camelcase
field_id: fieldId, // eslint-disable-line camelcase
const isValid = response.success && response.data;
errors[ element.name ] = wpforms_settings.val_email_restricted;
validator.showErrors( errors );
app.cache[ formId ].restrictedEmailValidation = app.cache[ formId ].restrictedEmailValidation || [];
if ( ! Object.prototype.hasOwnProperty.call( app.cache[ formId ].restrictedEmailValidation, value ) ) {
app.cache[ formId ].restrictedEmailValidation[ value ] = isValid;
validator.stopRequest( element, isValid );
* Is field inside column.
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isFieldInColumn( element ) {
return element.parent().hasClass( 'wpforms-one-half' ) ||
element.parent().hasClass( 'wpforms-two-fifths' ) ||
element.parent().hasClass( 'wpforms-one-fifth' );
* Is field has hint (sublabel, description, limit text hint, etc.).
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isFieldHasHint( element ) {
.nextAll( '.wpforms-field-sublabel, .wpforms-field-description, .wpforms-field-limit-text, .wpforms-pass-strength-result' )
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isDateTimeField( element ) {
return element.hasClass( 'wpforms-timepicker' ) ||
element.hasClass( 'wpforms-datepicker' ) ||
( element.is( 'select' ) && element.attr( 'class' ).match( /date-month|date-day|date-year/ ) );
* Is a field wrapped in some container.
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isWrappedField( element ) { // eslint-disable-line complexity
return 'checkbox' === element.attr( 'type' ) ||
'radio' === element.attr( 'type' ) ||
'range' === element.attr( 'type' ) ||
'select' === element.is( 'select' ) ||
1 === element.data( 'is-wrapped-field' ) ||
element.parent().hasClass( 'iti' ) ||
element.hasClass( 'wpforms-validation-group-member' ) ||
element.hasClass( 'choicesjs-select' ) ||
element.hasClass( 'wpforms-net-promoter-score-option' ) ||
element.hasClass( 'wpforms-field-payment-coupon-input' );
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isLikertScaleField( element ) {
return element.hasClass( 'wpforms-likert-scale-option' );
* Is Lead Forms select field.
* @param {jQuery} element current form element.
* @return {boolean} true/false.
isLeadFormsSelect( element ) {
return element.parent().hasClass( 'wpforms-lead-forms-select' );
* @deprecated 1.8.4 Deprecated.
* @param {jQuery} element current form element.
* @return {boolean} true/false.
// eslint-disable-next-line no-console
console.warn( 'WARNING! Function "wpforms.isCoupon( element )" has been deprecated' );
return element.closest( '.wpforms-field' ).hasClass( 'wpforms-field-payment-coupon' );
* Print error message into date time fields.
* @param {jQuery} element current form element.
* @param {string} error Error message.
dateTimeErrorPlacement( element, error ) {
const $wrapper = element.closest( '.wpforms-field-row-block, .wpforms-field-date-time' );
if ( ! $wrapper.find( 'label.wpforms-error, em.wpforms-error' ).length ) {
$wrapper.append( error );
element.closest( '.wpforms-field' ).append( error );
* Load jQuery Date Picker.
* @since 1.8.9 Added the `$context` parameter.
* @param {jQuery} $context Container to search for datepicker elements.
loadDatePicker( $context ) { // eslint-disable-line max-lines-per-function
// Only load if jQuery datepicker library exists.
if ( typeof $.fn.flatpickr === 'undefined' ) {
$context = $context?.length ? $context : $( document );
$context.find( '.wpforms-datepicker-wrap' ).each( function() { // eslint-disable-line complexity, max-lines-per-function
const element = $( this ),
$input = element.find( 'input' ),
form = element.closest( '.wpforms-form' ),
formID = form.data( 'formid' ),
fieldID = element.closest( '.wpforms-field' ).data( 'field-id' );
if ( typeof window[ 'wpforms_' + formID + '_' + fieldID ] !== 'undefined' && window[ 'wpforms_' + formID + '_' + fieldID ].hasOwnProperty( 'datepicker' ) ) {
properties = window[ 'wpforms_' + formID + '_' + fieldID ].datepicker;
} else if ( typeof window[ 'wpforms_' + formID ] !== 'undefined' && window[ 'wpforms_' + formID ].hasOwnProperty( 'datepicker' ) ) {
properties = window[ 'wpforms_' + formID ].datepicker;
} else if ( typeof wpforms_datepicker !== 'undefined' ) {
properties = wpforms_datepicker;
// Redefine locale only if user doesn't do that manually, and we have the locale.
! properties.hasOwnProperty( 'locale' ) &&
typeof wpforms_settings !== 'undefined' &&
wpforms_settings.hasOwnProperty( 'locale' )
properties.locale = wpforms_settings.locale;
properties.dateFormat = $input.data( 'date-format' );
if ( $input.data( 'disable-past-dates' ) === 1 ) {
properties.minDate = 'today';
if ( $input.data( 'disable-todays-date' ) === 1 ) {
properties.minDate = date.setDate( date.getDate() + 1 );
let limitDays = $input.data( 'limit-days' );
const weekDays = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
if ( limitDays && limitDays !== '' ) {
limitDays = limitDays.split( ',' );
properties.disable = [ function( date ) {
for ( const i in limitDays ) {
limitDay = weekDays.indexOf( limitDays[ i ] );
if ( limitDay === date.getDay() ) {
// Toggle clear date icon.
properties.onChange = function( selectedDates, dateStr, instance ) { // eslint-disable-line no-unused-vars
element.find( '.wpforms-datepicker-clear' )
.css( 'display', dateStr === '' ? 'none' : 'block' );
element.flatpickr( properties );
* Load jQuery Time Picker.
* @since 1.8.9 Added the `$context` parameter.
* @param {jQuery} $context Container to search for datepicker elements.
loadTimePicker( $context ) {
// Only load if jQuery timepicker library exists.