function frmFrontFormJS(){
'use strict';
/*global jQuery:false, frm_js */
var action = '';
var jsErrors = [];
function maybeShowLabel(){
/*jshint validthis:true */
var $field = jQuery(this);
var $label = $field.closest('.frm_inside_container').find('.frm_primary_label');
if ( $field.val().length > 0 ) {
$label.addClass('frm_visible');
} else {
$label.removeClass('frm_visible');
}
}
/* Get the ID of the field that changed*/
function getFieldId( field, fullID ) {
var fieldName = '';
if ( field instanceof jQuery ) {
fieldName = field.attr('name');
} else {
fieldName = field.name;
}
if ( typeof fieldName === 'undefined' ) {
fieldName = '';
}
if ( fieldName === '' ) {
if ( field instanceof jQuery ) {
fieldName = field.data('name');
} else {
fieldName = field.getAttribute('data-name');
}
if ( typeof fieldName === 'undefined' ) {
fieldName = '';
}
if ( fieldName !== '' && fieldName ) {
return fieldName;
}
return 0;
}
var nameParts = fieldName.replace('item_meta[', '').replace('[]', '').split(']');
//TODO: Fix this for checkboxes and address fields
if ( nameParts.length < 1 ) {
return 0;
}
nameParts = nameParts.filter(function(n){ return n !== ''; });
var field_id = nameParts[0];
var isRepeating = false;
if ( nameParts.length === 1 ) {
return field_id;
}
if ( nameParts[1] === '[form' || nameParts[1] === '[row_ids' ) {
return 0;
}
// Check if 'this' is in a repeating section
if ( jQuery('input[name="item_meta['+ field_id +'][form]"]').length ) {
// this is a repeatable section with name: item_meta[repeating-section-id][row-id][field-id]
field_id = nameParts[2].replace('[', '');
isRepeating = true;
}
// Check if 'this' is an other text field and get field ID for it
if ( 'other' === field_id ) {
if ( isRepeating ) {
// name for other fields: item_meta[370][0][other][414]
field_id = nameParts[3].replace('[', '');
} else {
// Other field name: item_meta[other][370]
field_id = nameParts[1].replace('[', '');
}
}
if ( fullID === true ) {
// For use in the container div id
if ( field_id === nameParts[0] ) {
field_id = field_id +'-'+ nameParts[1].replace('[', '');
} else {
field_id = field_id +'-'+ nameParts[0] +'-'+ nameParts[1].replace('[', '');
}
}
return field_id;
}
/**
* Disable the submit button for a given jQuery form object
*
* @since 2.03.02
*
* @param {object} $form
*/
function disableSubmitButton( $form ) {
$form.find('input[type="submit"], input[type="button"], button[type="submit"]').attr('disabled','disabled');
}
/**
* Enable the submit button for a given jQuery form object
*
* @since 2.03.02
*
* @param {object} $form
*/
function enableSubmitButton( $form ) {
$form.find( 'input[type="submit"], input[type="button"], button[type="submit"]' ).removeAttr( 'disabled' );
}
function validateForm( object ) {
var errors = [];
// Make sure required text field is filled in
var requiredFields = jQuery(object).find(
'.frm_required_field:visible input, .frm_required_field:visible select, .frm_required_field:visible textarea'
).filter(':not(.frm_optional)');
if ( requiredFields.length ) {
for ( var r = 0, rl = requiredFields.length; r < rl; r++ ) {
errors = checkRequiredField( requiredFields[r], errors );
}
}
var emailFields = jQuery(object).find('input[type=email]').filter(':visible');
var fields = jQuery(object).find('input,select,textarea');
if ( fields.length ) {
for ( var n = 0, nl = fields.length; n < nl; n++ ) {
var field = fields[n];
var value = field.value;
if ( value !== '' ) {
if ( field.type === 'hidden' ) {
// don't validate
} else if ( field.type === 'number' ) {
errors = checkNumberField( field, errors );
} else if ( field.type === 'email' ) {
errors = checkEmailField( field, errors, emailFields );
} else if ( field.pattern !== null ) {
errors = checkPatternField( field, errors );
}
}
}
}
errors = validateRecaptcha( object, errors );
return errors;
}
function maybeValidateChange( field_id, field ) {
if ( field.type === 'url' ) {
maybeAddHttpToUrl( field );
}
if ( jQuery(field).closest('form').hasClass('frm_js_validate') ) {
validateField( field_id, field );
}
}
function maybeAddHttpToUrl( field ) {
var url = field.value;
var matches = url.match( /^(https?|ftps?|mailto|news|feed|telnet):/ );
if ( field.value !== '' && matches === null ) {
field.value = 'http://' + url;
}
}
function validateField( fieldId, field ) {
var errors = [];
var $fieldCont = jQuery(field).closest('.frm_form_field');
if ( $fieldCont.hasClass('frm_required_field') && ! jQuery(field).hasClass('frm_optional') ) {
errors = checkRequiredField( field, errors );
}
if ( errors.length < 1 ) {
if ( field.type === 'email' ) {
var emailFields = jQuery(field).closest('form').find('input[type=email]');
errors = checkEmailField( field, errors, emailFields );
} else if ( field.type === 'number' ) {
errors = checkNumberField( field, errors );
} else if ( field.pattern !== null ) {
errors = checkPatternField( field, errors );
}
}
removeFieldError( $fieldCont );
if ( Object.keys(errors).length > 0 ) {
for ( var key in errors ) {
addFieldError( $fieldCont, key, errors );
}
}
}
function checkRequiredField( field, errors ) {
var fileID = field.getAttribute('data-frmfile');
if ( field.type === 'hidden' && fileID === null ) {
return errors;
}
var val = '';
var fieldID = '';
if ( field.type === 'checkbox' || field.type === 'radio' ) {
var checkGroup = jQuery('input[name="'+field.name+'"]').closest('.frm_required_field').find('input:checked');
jQuery(checkGroup).each(function() {
val = this.value;
});
} else if ( field.type === 'file' || fileID ) {
if ( typeof fileID === 'undefined' ) {
fileID = getFieldId( field, true );
fileID = fileID.replace('file', '');
}
if ( typeof errors[ fileID ] === 'undefined' ) {
val = getFileVals( fileID );
}
fieldID = fileID;
} else {
var fieldClasses = field.className;
if ( fieldClasses.indexOf('frm_pos_none') !== -1 ) {
// skip hidden other fields
return errors;
}
val = jQuery(field).val();
if ( val === null ) {
val = '';
} else if ( typeof val !== 'string' ) {
var tempVal = val;
val = '';
for ( var i = 0; i < tempVal.length; i++ ) {
if ( tempVal[i] !== '' ) {
val = tempVal[i];
}
}
}
if ( fieldClasses.indexOf('frm_other_input') === -1 ) {
fieldID = getFieldId( field, true );
} else {
fieldID = getFieldId( field, false );
}
if ( fieldClasses.indexOf('frm_time_select') !== -1 ) {
// set id for time field
fieldID = fieldID.replace('-H', '').replace('-m', '');
}
var placeholder = field.getAttribute('data-frmplaceholder');
if ( placeholder !== null && val === placeholder ) {
val = '';
}
}
if ( val === '' ) {
if ( fieldID === '' ) {
fieldID = getFieldId( field, true );
}
if ( !(fieldID in errors) ) {
errors[ fieldID ] = getFieldValidationMessage( field, 'data-reqmsg' );
}
}
return errors;
}
function getFileVals( fileID ) {
var val = '';
var fileFields = jQuery('input[name="file'+ fileID +'"], input[name="file'+ fileID +'[]"], input[name^="item_meta['+ fileID +']"]');
fileFields.each(function(){
if ( val === '' ) {
val = this.value;
}
});
return val;
}
function checkEmailField( field, errors, emailFields ) {
var emailAddress = field.value;
var fieldID = getFieldId( field, true );
if ( fieldID in errors ) {
return errors;
}
var isConf = (fieldID.indexOf('conf_') === 0);
if ( emailAddress !== '' || isConf ) {
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i;
var invalidMsg = getFieldValidationMessage( field, 'data-invmsg' );
if ( emailAddress !== '' && re.test( emailAddress ) === false ) {
errors[ fieldID ] = invalidMsg;
if ( isConf ) {
errors[ fieldID.replace('conf_', '') ] = '';
}
} else if ( isConf ) {
var confName = field.name.replace('conf_', '');
var match = emailFields.filter('[name="'+ confName +'"]').val();
if ( match !== emailAddress ) {
errors[ fieldID ] = '';
errors[ fieldID.replace('conf_', '') ] = '';
}
}
}
return errors;
}
function checkNumberField( field, errors ) {
var number = field.value;
if ( number !== '' && isNaN(number / 1) !== false ) {
var fieldID = getFieldId( field, true );
if ( !(fieldID in errors) ) {
errors[ fieldID ] = getFieldValidationMessage( field, 'data-invmsg' );
}
}
return errors;
}
function checkPatternField( field, errors ) {
var text = field.value;
var format = getFieldValidationMessage( field, 'pattern' );
if ( format !== '' && text !== '' ) {
var fieldID = getFieldId( field, true );
if ( !(fieldID in errors) ) {
format = new RegExp( '^'+ format +'$', 'i' );
if ( format.test( text ) === false ) {
errors[ fieldID ] = getFieldValidationMessage( field, 'data-invmsg' );
}
}
}
return errors;
}
function hasInvisibleRecaptcha( object ) {
if ( isGoingToPrevPage( object ) ) {
return false;
}
var recaptcha = jQuery(object).find('.frm-g-recaptcha[data-size="invisible"], .g-recaptcha[data-size="invisible"]');
if ( recaptcha.length ) {
var recaptchaID = recaptcha.data('rid');
var alreadyChecked = grecaptcha.getResponse( recaptchaID );
if ( alreadyChecked.length === 0 ) {
return recaptcha;
} else {
return false;
}
} else {
return false;
}
}
function executeInvisibleRecaptcha( invisibleRecaptcha ) {
var recaptchaID = invisibleRecaptcha.data('rid');
grecaptcha.reset( recaptchaID );
grecaptcha.execute( recaptchaID );
}
function validateRecaptcha( form, errors ) {
var $recaptcha = jQuery(form).find('.frm-g-recaptcha');
if ( $recaptcha.length ) {
var recaptchaID = $recaptcha.data('rid');
var response = grecaptcha.getResponse( recaptchaID );
if ( response.length === 0 ) {
var fieldContainer = $recaptcha.closest('.frm_form_field');
var fieldID = fieldContainer.attr('id').replace('frm_field_', '').replace('_container', '');
errors[ fieldID ] = '';
}
}
return errors;
}
function getFieldValidationMessage( field, messageType ) {
var msg = field.getAttribute(messageType);
if ( msg === null ) {
msg = '';
}
return msg;
}
function shouldJSValidate( object ) {
var validate = jQuery(object).hasClass('frm_js_validate');
if ( validate && typeof frmProForm !== 'undefined' && ( frmProForm.savingDraft( object ) || frmProForm.goingToPreviousPage( object ) ) ) {
validate = false;
}
return validate;
}
function getFormErrors(object, action){
if(typeof action === 'undefined'){
jQuery(object).find('input[name="frm_action"]').val();
}
var fieldset = jQuery(object).find('.frm_form_field');
fieldset.addClass('frm_doing_ajax');
jQuery.ajax({
type:'POST',url:frm_js.ajax_url,
data:jQuery(object).serialize() +'&action=frm_entries_'+ action +'&nonce='+frm_js.nonce,
success:function(response){
var defaultResponse = {'content':'', 'errors':{}, 'pass':false };
if ( response === null ) {
response = defaultResponse;
}
response = response.replace(/^\s+|\s+$/g,'');
if ( response.indexOf('{') === 0 ) {
response = jQuery.parseJSON(response);
}else{
response = defaultResponse;
}
if ( typeof response.redirect !== 'undefined' ) {
jQuery(document).trigger( 'frmBeforeFormRedirect', [ object, response ] );
window.location = response.redirect;
} else if ( response.content !== '' ) {
// the form or success message was returned
removeSubmitLoading( jQuery(object) );
if ( frm_js.offset != -1 ) {
frmFrontForm.scrollMsg( jQuery(object), false );
}
var formID = jQuery(object).find('input[name="form_id"]').val();
response.content = response.content.replace(/ frm_pro_form /g, ' frm_pro_form frm_no_hide ');
var replaceContent = jQuery( object ).closest( '.frm_forms' );
removeAddedScripts( replaceContent, formID );
replaceContent.replaceWith( response.content );
addUrlParam(response);
if(typeof(frmThemeOverride_frmAfterSubmit) === 'function'){
var pageOrder = jQuery('input[name="frm_page_order_'+ formID +'"]').val();
var formReturned = jQuery(response.content).find('input[name="form_id"]').val();
frmThemeOverride_frmAfterSubmit(formReturned, pageOrder, response.content, object);
}
afterFormSubmitted( object, response );
} else if ( Object.keys(response.errors).length ) {
// errors were returned
removeSubmitLoading( jQuery(object), 'enable' );
//show errors
var cont_submit = true;
removeAllErrors();
var show_captcha = false;
var $fieldCont = null;
for ( var key in response.errors ) {
$fieldCont = jQuery(object).find('#frm_field_'+key+'_container');
if ( $fieldCont.length ) {
if ( ! $fieldCont.is(':visible') ) {
var inCollapsedSection = $fieldCont.closest('.frm_toggle_container');
if ( inCollapsedSection.length ) {
var frmTrigger = inCollapsedSection.prev();
if ( ! frmTrigger.hasClass('frm_trigger') ) {
// If the frmTrigger object is the section description, check to see if the previous element is the trigger
frmTrigger = frmTrigger.prev('.frm_trigger');
}
frmTrigger.click();
}
}
if ( $fieldCont.is(':visible') ) {
addFieldError( $fieldCont, key, response.errors );
cont_submit = false;
var $recaptcha = jQuery(object).find('#frm_field_'+key+'_container .frm-g-recaptcha, #frm_field_'+key+'_container .g-recaptcha');
if ( $recaptcha.length ) {
show_captcha = true;
var recaptchaID = $recaptcha.data('rid');
if ( jQuery().grecaptcha ) {
if ( recaptchaID ) {
grecaptcha.reset( recaptchaID );
} else {
grecaptcha.reset();
}
}
}
}
}
}
jQuery(document).trigger( 'frmFormErrors', [ object, response ] );
fieldset.removeClass('frm_doing_ajax');
scrollToFirstField( object );
if(show_captcha !== true){
replaceCheckedRecaptcha( object, false );
}
if(cont_submit){
object.submit();
}else{
jQuery(object).prepend(response.error_message);
}
} else {
// there may have been a plugin conflict, or the form is not set to submit with ajax
showFileLoading( object );
replaceCheckedRecaptcha( object, true );
object.submit();
}
},
error:function(){
jQuery(object).find('input[type="submit"], input[type="button"]').removeAttr('disabled');
object.submit();
}
});
}
function afterFormSubmitted( object, response ) {
var formCompleted = jQuery(response.content).find('.frm_message');
if ( formCompleted.length ) {
jQuery(document).trigger( 'frmFormComplete', [ object, response ] );
} else {
jQuery(document).trigger( 'frmPageChanged', [ object, response ] );
}
}
function removeAddedScripts( formContainer, formID ) {
var endReplace = jQuery( '.frm_end_ajax_' + formID );
if ( endReplace.length ) {
formContainer.nextUntil( '.frm_end_ajax_' + formID ).remove();
endReplace.remove();
}
}
function addUrlParam(response){
if ( history.pushState && typeof response.page !== 'undefined' ) {
var url = addQueryVar('frm_page', response.page);
window.history.pushState({"html":response.html}, '', '?'+ url);
}
}
function addQueryVar(key, value) {
key = encodeURI(key);
value = encodeURI(value);
var kvp = document.location.search.substr(1).split('&');
var i=kvp.length; var x; while(i--) {
x = kvp[i].split('=');
if (x[0]==key) {
x[1] = value;
kvp[i] = x.join('=');
break;
}
}
if (i<0) {
kvp[kvp.length] = [key,value].join('=');
}
return kvp.join('&');
}
function addFieldError( $fieldCont, key, jsErrors ) {
if ( $fieldCont.length && $fieldCont.is(':visible') ) {
$fieldCont.addClass('frm_blank_field');
var input = $fieldCont.find( 'input, select, textarea' ),
id = 'frm_error_field_' + key,
describedBy = input.attr( 'aria-describedby' );
if ( typeof frmThemeOverride_frmPlaceError === 'function' ) {
frmThemeOverride_frmPlaceError( key, jsErrors );
} else {
$fieldCont.append( '
'+ jsErrors[key] +'
' );
if ( typeof describedBy === 'undefined' ) {
describedBy = id;
} else if ( describedBy.indexOf( id ) === -1 ) {
describedBy = describedBy + ' ' + id;
}
input.attr( 'aria-describedby', describedBy );
}
input.attr( 'aria-invalid', true );
jQuery(document).trigger('frmAddFieldError', [ $fieldCont, key, jsErrors ] );
}
}
function removeFieldError( $fieldCont ) {
var errorMessage = $fieldCont.find('.frm_error'),
errorId = errorMessage.attr('id'),
input = $fieldCont.find( 'input, select, textarea' ),
describedBy = input.attr( 'aria-describedby' );
$fieldCont.removeClass('frm_blank_field has-error');
errorMessage.remove();
input.attr( 'aria-invalid', false );
if ( typeof describedBy !== 'undefined' ) {
describedBy = describedBy.replace( errorId, '' );
input.attr( 'aria-describedby', describedBy );
}
}
function removeAllErrors() {
jQuery('.form-field').removeClass('frm_blank_field has-error');
jQuery('.form-field .frm_error').replaceWith('');
jQuery('.frm_error_style').remove();
}
function scrollToFirstField( object ) {
var field = jQuery(object).find('.frm_blank_field:first');
if ( field.length ) {
frmFrontForm.scrollMsg( field, object, true );
}
}
function showSubmitLoading( $object ) {
showLoadingIndicator( $object );
disableSubmitButton( $object );
}
function showLoadingIndicator( $object ) {
if ( ! $object.hasClass( 'frm_loading_form' ) && ! $object.hasClass( 'frm_loading_prev' ) ) {
addLoadingClass( $object );
$object.trigger( 'frmStartFormLoading' );
}
}
function addLoadingClass( $object ) {
var loading_class = isGoingToPrevPage( $object ) ? 'frm_loading_prev' : 'frm_loading_form';
$object.addClass( loading_class );
}
function isGoingToPrevPage( $object ) {
return ( typeof frmProForm !== 'undefined' && frmProForm.goingToPreviousPage( $object ) );
}
function removeSubmitLoading( $object, enable, processesRunning ) {
if ( processesRunning > 0 ) {
return;
}
var loadingForm = jQuery( '.frm_loading_form' );
loadingForm.removeClass('frm_loading_form');
loadingForm.removeClass( 'frm_loading_prev' );
loadingForm.trigger( 'frmEndFormLoading' );
if ( enable === 'enable' ) {
enableSubmitButton( loadingForm );
}
}
function showFileLoading( object ) {
var loading = document.getElementById('frm_loading');
if ( loading !== null ) {
var file_val = jQuery(object).find('input[type=file]').val();
if ( typeof file_val !== 'undefined' && file_val !== '' ) {
setTimeout(function(){
jQuery(loading).fadeIn('slow');
},2000);
}
}
}
function replaceCheckedRecaptcha( object, checkPage ) {
var $recapField = jQuery(object).find('.frm-g-recaptcha, .g-recaptcha');
if($recapField.length ){
if ( checkPage ) {
var morePages = jQuery(object).find('.frm_next_page').length < 1 || jQuery(object).find('.frm_next_page').val() < 1;
if ( ! morePages ) {
return;
}
}
$recapField.closest('.frm_form_field').replaceWith('');
}
}
function clearDefault(){
/*jshint validthis:true */
toggleDefault(jQuery(this), 'clear');
}
function replaceDefault(){
/*jshint validthis:true */
toggleDefault(jQuery(this), 'replace');
}
function toggleDefault($thisField, e){
// TODO: Fix this for a default value that is a number or array
var v = $thisField.data('frmval').replace(/(\n|\r\n)/g, '\r');
if ( v === '' || typeof v === 'undefined' ) {
return false;
}
var thisVal = $thisField.val().replace(/(\n|\r\n)/g, '\r');
if ( 'replace' == e ) {
if ( thisVal === '' ) {
$thisField.addClass('frm_default').val(v);
}
} else if ( thisVal == v ) {
$thisField.removeClass('frm_default').val('');
}
}
function resendEmail(){
/*jshint validthis:true */
var $link = jQuery(this),
entry_id = this.getAttribute( 'data-eid' ),
form_id = this.getAttribute( 'data-fid' ),
label = $link.find( '.frm_link_label' );
if ( label.length < 1 ) {
label = $link;
}
label.append('');
jQuery.ajax({
type:'POST',
url:frm_js.ajax_url,
data:{
action:'frm_entries_send_email',
entry_id:entry_id,
form_id:form_id,
nonce:frm_js.nonce
},
success:function(msg){
label.html(msg);
}
});
return false;
}
/**********************************************
* General Helpers
*********************************************/
function confirmClick() {
/*jshint validthis:true */
var message = jQuery(this).data('frmconfirm');
return confirm(message);
}
function toggleDiv(){
/*jshint validthis:true */
var div = jQuery( this ).data( 'frmtoggle' );
if ( jQuery( div ).is( ':visible' ) ) {
jQuery( div ).slideUp( 'fast' );
} else {
jQuery( div ).slideDown( 'fast' );
}
return false;
}
/**********************************************
* Fallback functions
*********************************************/
function addIndexOfFallbackForIE8() {
if ( !Array.prototype.indexOf ) {
Array.prototype.indexOf = function(elt /*, from*/) {
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if (from < 0) {
from += len;
}
for (; from < len; from++) {
if ( from in this && this[from] === elt ) {
return from;
}
}
return -1;
};
}
}
function addTrimFallbackForIE8(){
if ( typeof String.prototype.trim !== 'function' ) {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};
}
}
function addFilterFallbackForIE8(){
if ( !Array.prototype.filter ) {
Array.prototype.filter = function(fun /*, thisp */) {
if ( this === void 0 || this === null ) {
throw new TypeError();
}
var t = Object( this );
var len = t.length >>> 0;
if ( typeof fun !== 'function' ) {
throw new TypeError();
}
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if ( i in t ) {
var val = t[i]; // in case fun mutates this
if (fun.call(thisp, val, i, t))
res.push(val);
}
}
return res;
};
}
}
function addKeysFallbackForIE8(){
if ( !Object.keys ) {
Object.keys = function(obj) {
var keys = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
keys.push(i);
}
}
return keys;
};
}
}
return{
init: function(){
jQuery(document).off('submit.formidable','.frm-show-form');
jQuery(document).on('submit.formidable','.frm-show-form', frmFrontForm.submitForm);
jQuery( '.frm-show-form input[onblur], .frm-show-form textarea[onblur]' ).each( function() {
if ( jQuery( this ).val() === '' ) {
jQuery( this ).blur();
}
} );
jQuery(document).on('focus', '.frm_toggle_default', clearDefault);
jQuery(document).on('blur', '.frm_toggle_default', replaceDefault);
jQuery('.frm_toggle_default').blur();
jQuery(document.getElementById('frm_resend_email')).click(resendEmail);
jQuery(document).on('change', '.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]', frmFrontForm.fieldValueChanged );
jQuery(document).on('change keyup', '.frm-show-form .frm_inside_container input, .frm-show-form .frm_inside_container select, .frm-show-form .frm_inside_container textarea', maybeShowLabel);
jQuery(document).on('click', 'a[data-frmconfirm]', confirmClick);
jQuery('a[data-frmtoggle]').click(toggleDiv);
// Add fallbacks for the beloved IE8
addIndexOfFallbackForIE8();
addTrimFallbackForIE8();
addFilterFallbackForIE8();
addKeysFallbackForIE8();
},
getFieldId: function( field, fullID ) {
return getFieldId( field, fullID );
},
renderRecaptcha: function( captcha ) {
var size = captcha.getAttribute('data-size'),
rendered = captcha.getAttribute('data-rid') !== null,
params = {
'sitekey': captcha.getAttribute('data-sitekey'),
'size': size,
'theme': captcha.getAttribute('data-theme')
};
if ( rendered ) {
return;
}
if ( size === 'invisible' ) {
var formID = jQuery(captcha).closest('form').find('input[name="form_id"]').val();
jQuery(captcha).closest('.frm_form_field .frm_primary_label').hide();
params.callback = function(token) {
frmFrontForm.afterRecaptcha(token, formID);
};
}
var recaptchaID = grecaptcha.render( captcha.id, params );
captcha.setAttribute('data-rid', recaptchaID);
},
afterSingleRecaptcha: function(token){
var object = jQuery('.frm-show-form .g-recaptcha').closest('form')[0];
frmFrontForm.submitFormNow( object );
},
afterRecaptcha: function(token, formID){
var object = jQuery('#frm_form_'+ formID +'_container form')[0];
frmFrontForm.submitFormNow( object );
},
submitForm: function(e){
frmFrontForm.submitFormManual( e, this );
},
submitFormManual: function(e, object){
var invisibleRecaptcha = hasInvisibleRecaptcha(object);
var classList = object.className.trim().split(/\s+/gi);
if ( classList && invisibleRecaptcha.length < 1 ) {
var isPro = classList.indexOf('frm_pro_form') > -1;
if ( ! isPro ) {
return;
}
}
if ( jQuery('body').hasClass('wp-admin') && jQuery(object).closest('.frmapi-form').length < 1 ) {
return;
}
e.preventDefault();
if ( typeof frmProForm !== 'undefined' && typeof frmProForm.submitAllowed === 'function' ) {
if ( ! frmProForm.submitAllowed( object ) ) {
return;
}
}
if ( invisibleRecaptcha.length ) {
showLoadingIndicator( jQuery(object) );
executeInvisibleRecaptcha( invisibleRecaptcha );
} else {
var errors = frmFrontForm.validateFormSubmit( object );
if ( Object.keys(errors).length === 0 ) {
showSubmitLoading( jQuery(object) );
frmFrontForm.submitFormNow( object, classList );
}
}
},
submitFormNow: function(object) {
var classList = object.className.trim().split(/\s+/gi);
if ( classList.indexOf('frm_ajax_submit') > -1 ) {
var hasFileFields = jQuery(object).find('input[type="file"]').filter(function () {
return !!this.value;
}).length;
if ( hasFileFields < 1 ) {
action = jQuery(object).find('input[name="frm_action"]').val();
frmFrontForm.checkFormErrors( object, action );
} else {
object.submit();
}
} else {
object.submit();
}
},
validateFormSubmit: function( object ){
if ( typeof tinyMCE !== 'undefined' && jQuery(object).find('.wp-editor-wrap').length ) {
tinyMCE.triggerSave();
}
jsErrors = [];
if ( shouldJSValidate( object ) ) {
frmFrontForm.getAjaxFormErrors( object );
if ( Object.keys(jsErrors).length ) {
frmFrontForm.addAjaxFormErrors( object );
}
}
return jsErrors;
},
getAjaxFormErrors: function( object ) {
jsErrors = validateForm( object );
if ( typeof frmThemeOverride_jsErrors === 'function' ) {
action = jQuery(object).find('input[name="frm_action"]').val();
var customErrors = frmThemeOverride_jsErrors( action, object );
if ( Object.keys(customErrors).length ) {
for ( var key in customErrors ) {
jsErrors[ key ] = customErrors[ key ];
}
}
}
return jsErrors;
},
addAjaxFormErrors: function( object ) {
removeAllErrors();
for ( var key in jsErrors ) {
var $fieldCont = jQuery(object).find('#frm_field_'+key+'_container');
if ( $fieldCont.length ) {
addFieldError( $fieldCont, key, jsErrors );
} else {
// we are unable to show the error, so remove it
delete jsErrors[ key ];
}
}
scrollToFirstField( object );
},
checkFormErrors: function(object, action){
getFormErrors( object, action );
},
checkRequiredField: function( field, errors ){
return checkRequiredField( field, errors );
},
showSubmitLoading: function( $object ){
showSubmitLoading( $object );
},
removeSubmitLoading: function( $object, enable, processesRunning ){
removeSubmitLoading( $object, enable, processesRunning );
},
scrollToID: function(id){
var object = jQuery(document.getElementById(id));
frmFrontForm.scrollMsg( object, false );
},
scrollMsg: function( id, object, animate ) {
var scrollObj = '';
if(typeof(object) === 'undefined'){
scrollObj = jQuery(document.getElementById('frm_form_'+id+'_container'));
if(scrollObj.length < 1 ){
return;
}
} else if ( typeof id === 'string' ) {
scrollObj = jQuery(object).find('#frm_field_'+id+'_container');
} else {
scrollObj = id;
}
var newPos = scrollObj.offset().top;
if ( !newPos ){
return;
}
newPos = newPos-frm_js.offset;
var m=jQuery('html').css('margin-top');
var b=jQuery('body').css('margin-top');
if(m || b){
newPos = newPos - parseInt(m) - parseInt(b);
}
if ( newPos && window.innerHeight ) {
var screenTop = document.documentElement.scrollTop || document.body.scrollTop;
var screenBottom = screenTop + window.innerHeight;
if( newPos > screenBottom || newPos < screenTop ) {
// Not in view
if ( typeof animate === 'undefined' ) {
jQuery(window).scrollTop(newPos);
}else{
jQuery('html,body').animate({scrollTop: newPos}, 500);
}
return false;
}
}
},
fieldValueChanged: function(e){
/*jshint validthis:true */
var field_id = frmFrontForm.getFieldId( this, false );
if ( ! field_id || typeof field_id === 'undefined' ) {
return;
}
if ( e.frmTriggered && e.frmTriggered == field_id ) {
return;
}
jQuery(document).trigger( 'frmFieldChanged', [ this, field_id, e ] );
if ( e.selfTriggered !== true ) {
maybeValidateChange( field_id, this );
}
},
savingDraft: function(object){
console.warn('DEPRECATED: function frmFrontForm.savingDraft in v3.0 use frmProForm.savingDraft');
if ( typeof frmProForm !== 'undefined' ) {
return frmProForm.savingDraft(object);
}
},
goingToPreviousPage: function(object){
console.warn('DEPRECATED: function frmFrontForm.goingToPreviousPage in v3.0 use frmProForm.goingToPreviousPage');
if ( typeof frmProForm !== 'undefined' ) {
return frmProForm.goingToPreviousPage(object);
}
},
hideOrShowFields: function(ids, event ){
console.warn('DEPRECATED: function frmFrontForm.hideOrShowFields in v3.0 use frmProForm.hideOrShowFields');
if ( typeof frmProForm !== 'undefined' ) {
frmProForm.hideOrShowFields();
}
},
hidePreviouslyHiddenFields: function(){
console.warn('DEPRECATED: function frmFrontForm.hidePreviouslyHiddenFields in v3.0 use frmProForm.hidePreviouslyHiddenFields');
if ( typeof frmProForm !== 'undefined' ) {
frmProForm.hidePreviouslyHiddenFields();
}
},
checkDependentDynamicFields: function(ids){
console.warn('DEPRECATED: function frmFrontForm.checkDependentDynamicFields in v3.0 use frmProForm.checkDependentDynamicFields');
if ( typeof frmProForm !== 'undefined' ) {
frmProForm.checkDependentDynamicFields(ids);
}
},
checkDependentLookupFields: function(ids){
console.warn('DEPRECATED: function frmFrontForm.checkDependentLookupFields in v3.0 use frmProForm.checkDependentLookupFields');
if ( typeof frmProForm !== 'undefined' ) {
frmProForm.checkDependentLookupFields(ids);
}
},
loadGoogle: function(){
console.warn('DEPRECATED: function frmFrontForm.loadGoogle in v3.0 use frmProForm.loadGoogle');
frmProForm.loadGoogle();
},
removeUsedTimes: function( obj, timeField ) {
console.warn('DEPRECATED: function frmFrontForm.removeUsedTimes in v3.0 use frmProForm.removeUsedTimes');
if ( typeof frmProForm !== 'undefined' ) {
frmProForm.removeUsedTimes();
}
},
escapeHtml: function(text){
return text
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
invisible: function(classes) {
jQuery(classes).css('visibility', 'hidden');
},
visible: function(classes) {
jQuery(classes).css('visibility', 'visible');
}
};
}
var frmFrontForm = frmFrontFormJS();
jQuery(document).ready(function($){
frmFrontForm.init();
});
function frmRecaptcha() {
var captchas = jQuery('.frm-g-recaptcha');
for ( var c = 0, cl = captchas.length; c < cl; c++ ) {
frmFrontForm.renderRecaptcha( captchas[c] );
}
}
function frmAfterRecaptcha(token){
frmFrontForm.afterSingleRecaptcha(token);
}
function frmUpdateField(entry_id,field_id,value,message,num){
jQuery(document.getElementById('frm_update_field_'+entry_id+'_'+field_id+'_'+num)).html('');
jQuery.ajax({
type:'POST',url:frm_js.ajax_url,
data:{action:'frm_entries_update_field_ajax', entry_id:entry_id, field_id:field_id, value:value, nonce:frm_js.nonce},
success:function(){
if(message.replace(/^\s+|\s+$/g,'') === ''){
jQuery(document.getElementById('frm_update_field_'+entry_id+'_'+field_id+'_'+num)).fadeOut('slow');
}else{
jQuery(document.getElementById('frm_update_field_'+entry_id+'_'+field_id+'_'+num)).replaceWith(message);
}
}
});
}
function frmDeleteEntry(entry_id,prefix){
console.warn('DEPRECATED: function frmDeleteEntry in v2.0.13 use frmFrontForm.deleteEntry');
jQuery(document.getElementById('frm_delete_'+entry_id)).replaceWith('');
jQuery.ajax({
type:'POST',url:frm_js.ajax_url,
data:{action:'frm_entries_destroy', entry:entry_id, nonce:frm_js.nonce},
success:function(html){
if(html.replace(/^\s+|\s+$/g,'') === 'success')
jQuery(document.getElementById(prefix+entry_id)).fadeOut('slow');
else
jQuery(document.getElementById('frm_delete_'+entry_id)).replaceWith(html);
}
});
}
function frmOnSubmit(e){
console.warn('DEPRECATED: function frmOnSubmit in v2.0 use frmFrontForm.submitForm');
frmFrontForm.submitForm(e, this);
}
function frm_resend_email(entry_id,form_id){
console.warn('DEPRECATED: function frm_resend_email in v2.0');
var $link = jQuery(document.getElementById('frm_resend_email'));
$link.append('');
jQuery.ajax({
type:'POST',url:frm_js.ajax_url,
data:{action:'frm_entries_send_email', entry_id:entry_id, form_id:form_id, nonce:frm_js.nonce},
success:function(msg){
$link.replaceWith(msg);
}
});
}