PageSourceSearch

https://www.cenresinjournals.com/wp-content/plugins/easy-registrat…/assets/js/erforms-global.js?ver=2.1.1

js cenresinjournals.com collected 2026-09-30 09:37:49 UTC 75,806 bytes, 1,624 lines download raw bytes

1(function ($) {
2    /*****************************Front Form *******************/
3    $(document).bind('erf_process_form', function (ev, selector, submission) {
4        var erfContainer = selector || $(".erf-container");
5        var formContainer = erfContainer.find('.erf-front-form');
6
7        if (formContainer.length == 0)
8            return;
9
10        /*****************************Parsley configuration *******************/
11        var parsleyConfig = {//Parsley error container configuration
12            errorsContainer: function (pEle) {
13                var $err = pEle.$element.closest('.form-group');
14                return $err;
15            },
16        }
17        // Adding custom parsley validator for Confirm Password field
18        window.Parsley.addValidator('confirmPassword', {
19            validateString: function (value, passwordFieldId) {
20                return $("#" + passwordFieldId).val() == value;
21            },
22            messages: {
23                en: erf_global.parsley.confirmPassword,
24            }
25        });
26        parsleyConfig.excluded = 'input:hidden,select:hidden,textarea:hidden,file:hidden,:disabled,.erf-disabled';
27        /*****************************Parsley configuration ends here *******************/
28
29        if (erf_global.logged_in == 1) {
30            formContainer.find("[user_roles=true]").attr('disabled', true);
31        }
32
33        /****************** Form Layout function ****************/
34        var twoColumnLayout = function (form, selector) {
35            form.find(selector).each(function () {
36                var page = $(this);
37                var pageElements = page.children('div');
38                var twoColumnWrapper = $('<div class="erf-two-columns" />');
39                var row = [];
40                for (i = 0; i < pageElements.length; i++) {
41                    var field = $(pageElements[i]);
42                    var fieldNext = $(pageElements[i + 1]);
43
44                    if (field.hasClass('form-group') && fieldNext.length > 0 && fieldNext.hasClass('form-group')) {
45                        pageElements.filter(':eq(' + i + '),:eq(' + (i + 1) + ')').wrapAll(twoColumnWrapper);
46                        i++;
47                    } else {
48                        field.wrap(twoColumnWrapper);
49                    }
50                }
51
52            });
53        }
54
55        var getFormLayout = function (form) {
56            var formContainer = form.closest('.erf-container');
57            if (formContainer.hasClass('erf-layout-two-column'))
58            {
59                return 2;
60            }
61            return 1;
62        }
63        /****************** Form Layout functions ends here ****************/
64
65        /****************** Ajax Form submission ***************************/
66        submit_form = function (form) {
67            var formData = new FormData(form);
68            $.ajax({
69                url: erf_global.ajax_url,
70                type: 'POST',
71                data: formData,
72                async: true,
73                success: function (response) {
74                    $(document).trigger('erf_sub_response_received', [form, response]);
75                    erf_handle_form_ajax_response(response, selector, form);
76                },
77                cache: false,
78                contentType: false,
79                processData: false
80            });
81        }
82        /****************** Ajax Form submission ends here ***************************/
83
84        /****************** Multipage functions **************************************/
85        var paginateForm = function (form) {
86            var navContainer = form.find('.erf-form-nav'); // It holds previous button
87            var pages = []; // Holds all the pages. Note: There are no HTML sections to hold page elements.
88            var pageBreaks = []; // Elements which defines page break
89            var submitButton = form.find('.erf-submit-button button');
90            var submitButtonTitle = submitButton.html();
91            var nextButton;
92            var prevButton;
93            var hideTabs = false;
94
95            // Adds index to each input element so that Parsley can validate them in individual group.
96            var addElementGroup = function (formElements, index) {
97                formElements.attr('data-parsley-group', 'block-' + index);
98                formElements.find(':input').attr('data-parsley-group', 'block-' + index);
99            }
100
101            // Ads and registers previous button 
102            var addNavButtons = function (index) {
103                navContainer.html('');
104                // Creating nav buttons
105                submitButton.removeClass('erf-nav-next');
106                prevButton = submitButton.clone();
107                prevButton.attr('type', 'button');
108                prevButton.addClass('erf-nav-prev');
109                prevButton.html(erf_global.js_strings.prev);
110                nextButton = submitButton.clone();
111                nextButton.html(erf_global.js_strings.next);
112                nextButton.addClass('erf-nav-next');
113
114                prevButton.click(function () {
115                    var selectedIndex = parseInt(navContainer.attr('current-page-index')) - 1;
116                    goToPage(selectedIndex);
117                });
118                if (index >
118 0)  // Do not add Previous button on first Page
119                    navContainer.append(prevButton);
120                navContainer.append(nextButton);
121                if (index == (pages.length - 1)) {
122                    nextButton.html(submitButtonTitle);
123                }
124                submitButton.remove();
125            }
126
127            // Remove Page Break closest DIV
128            form.find('div[custom-type=page-break]').unwrap();
129
130            // Check if first element is page Break.
131            var firstPageBreak = form.find('.rendered-form div').first().attr('custom-type');
132            if (firstPageBreak != 'page-break')  // First element is not page break. 
133            {
134                form.find('.rendered-form').prepend('<div custom-type="page-break" class="page-break">Page Break</div>');
135                hideTabs = true; // Hides tab system for Page breaks
136            }
137
138            var pageBreaks = form.find('div[custom-type=page-break]');
139            pageBreaks.addClass('page-break');
140            navContainer.attr('current-page-index', 0);   // Assigning current page index    
141            if (pageBreaks.length > 1) {
142                form.find('.erf-external-form-elements').hide(); // Hiding external form elements for multipage forms
143            }
144
145            var goToPage = function (selectedIndex, next) {
146                var currentPageIndex = form.find('.active-page').attr('page-index');
147                var next = next || false;
148                if (next || selectedIndex < currentPageIndex) {
149                    for (i = 0; i < pages.length; i++) {
150                        if (selectedIndex == i)
151                        {
152                            pages[i].show();
153                            navContainer.attr('current-page-index', selectedIndex);
154                            pageBreaks.removeClass('active-page');
155                            $(pageBreaks[selectedIndex]).addClass('active-page');
156                            navContainer.html('');
157                        } else
158                            pages[i].hide();
159                    }
160                    addNavButtons(selectedIndex);
161                }
162
163                if ((selectedIndex + 1) == pageBreaks.length) {
164                    form.find('.erf-external-form-elements').show(); // Showing external form elements at last pagination
165                } else {
166                    form.find('.erf-external-form-elements').hide();
167                }
168                // Scroll on top
169                $('html, body').animate({
170                    scrollTop: form.closest('.erf-container').offset().top
171                }, 300);
172            }
173            if (hideTabs || pageBreaks.length == 1) {
174                pageBreaks.hide();
175            }
176            if (pageBreaks.length > 1) {
177                pageBreaks.each(function (index) {
178                    var formElements = $(this).nextUntil('div[custom-type=page-break]');
179                    if (formElements.length == 0) { // Inserting blank page
180                        formElements = $('<div class="form-group">&nbsp;</div>');
181                    }
182                    formElements.wrapAll('<div class="erf-page erf-page-' + index + '"></div>');
183                    pages.push(formElements);
184                    addElementGroup(formElements, index);
185                    if (index > 0)
186                        formElements.hide(); // Be default hiding all the page elements except initial page
187                });
188            }
189
190
191            if (pages.length > 1) {
192
193
194                form.attr('erf-multipage', 1); // Adding multipage flag
195
196                // By default show first page elements
197                pages[0].show();
198
199                // Adding index properties to each page break, Appends page breaks in form starting
200                for (i = 0; i < pageBreaks.length; i++) {
201                    let span = document.createElement("span");
202                    span.innerHTML = $(pageBreaks[i]).html();
203                    $(pageBreaks[i]).html(span);
204                    $(pageBreaks[i]).attr('page-index', i);
205                    if (i == 0) {
206                        $(pageBreaks[i]).addClass('active-page');
207                    }
208                    form.find('.rendered-form').before(pageBreaks[i]);
209                }
210                pageBreaks.wrapAll("<div class='erf-page-breaks'></div>");
211
212                // Registers click event to allow jumping to previous pages
213                pageBreaks.click(function () {
214                    var selectedIndex = $(this).attr('page-index');
215                    goToPage(selectedIndex);
216                });
217
218                var formLayout = getFormLayout(form);
219                if (formLayout == 2)
220                {
221                    twoColumnLayout(form, '.erf-page');
222                }
223
224
225                /*
226                 * Binds submit button.
227                 * Hides previous page elements and shows new elements (If any)
228                 * Registers parsley validation.
229                 * Sends ajax request on successfull validation.
230                 */
231                $(form).submit(function (event) {
232                    event.preventDefault();
233                    var currentIndex = parseInt(navContainer.attr('current-page-index'));
234                    var nextIndex = currentIndex + 1;
235                    var formInstance = form.parsley(parsleyConfig);
236                    pageBreaks.removeClass('erf-has-errors');
237                    if (pages[nextIndex] !== void 0) {
238                        goToPage(nextIndex, true);
239                    }
240                    formInstance.whenValidate({
241                        group: 'block-' + currentIndex
242                    }).done(function () {  // Triggers for last page.
243                        if (nextIndex == pages.length) {
244                            $(document).trigger('erf_form_submit_pressed', [form]);
245                            // Check if reCaptcha token has to be added
246                            if (form.find('.erf-recaptcha').length > 0 && erf_global.recaptcha_v == 3 && typeof grecaptcha !== 'undefined' && grecaptcha) {
247                                grecaptcha.ready(function () {
248                                    erf_recaptcha.execute('submission', function (token) {
249                                        form.find('[name="g-recaptcha-response"]').remove(); // Removing any existing token
250                                        form.prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
251                                        submit_form(form[0]);
252                                    });
253                                });
254                            } else {
255                                submit_form(form[0]);
256                            }
257                        }
258                    });
259
260                });
261            }
262        }
263        /****************** Multipage functions ends here ****************************/
264
265
266        formContainer.each(function () {
267            var formInstance = $(this).parsley(parsleyConfig);
268            Parsley.addMessages('en', erf_global.parsley);
269
270            // Cloning submit button at last to add any elements externally in Form and delete auto generated button
271            var submitBtnBlock = $(this).find('.erf-submit-button');
272            var genratedButtonBlock = $(this).find('[type=submit]').closest('.form-group ');
273
274            if (genratedButtonBlock.length > 0) {
275                genratedButtonBlock.clone().appendTo(submitBtnBlock);
276                genratedButtonBlock.remove();
277            }
278
279
280            var form = $(this);
281            var formLayout = getFormLayout(form);
282            var formGroups = form.find('.rendered-form');
283
284            /* Change user_email type to email */
285            var userEmailField = form.find('input[type=user_email]');
286            if (userEmailField.length > 0) {
287                userEmailField.attr('data-parsley-type', "email");
288                userEmailField.attr('type', "email");
289            }
290            
291            
292            /**
293             * Check Merge fields in RichText
294             */
295            var rtElements = form.find('.erf-rich-text');
296            rtElements.each(function(){
297               let el = $(this); 
298            });
299            /*
300             * Initialize datepicker for each of the date field.
301             */
302            form.find('.erf-date-field').each(function () {
303                var minDate = $(this).attr('min');
304                var maxDate = $(this).attr('max');
305                var dateFormat = $(this).data('date-format');
306                var dateConfig = {dateFormat: dateFormat, changeMonth: true, changeYear: true, yearRange: '-100:+20', monthNames: erf_global.datepicker_defaults.monthNames,
307                    monthNamesShort: erf_global.datepicker_defaults.monthNamesShort, closeText: erf_global.datepicker_defaults.closeText, currentText: erf_global.datepicker_defaults.currentText,
308                    nextText: erf_global.datepicker_defaults.nextText, prevText: erf_global.datepicker_defaults.prevText, dayNames: erf_global.datepicker_defaults.dayNames, dayNamesShort: erf_global.datepicker_defaults.dayNamesShort,
309                    dayNamesMin: erf_global.datepicker_defaults.dayNamesMin, firstDay: erf_global.datepicker_defaults.firstDay, isRTL: erf_global.datepicker_defaults.isRTL};
310                if (minDate)
311                    dateConfig.minDate = new Date(minDate);
312                if (maxDate)
313                    dateConfig.maxDate = new Date(maxDate);
314                dateConfig.onSelect = function (date) {
315                    $(this).trigger('input');
316                } // Triggering 'input' event on every date select action
317                $(this).datepicker(dateConfig);
318                $(this).removeAttr('min'); // Removing min attribute to disable default field validation
319                $(this).removeAttr('max');  // Removing max attribute to disable default field validation
320            });
321
322
323            // Current URL for after login redirect (Only for registration forms)
324            form.find('#erform_redirect_to').val($(location).attr('href'));
325
326            // Button position
327            form.find('button[data-erf-btn-pos]').each(function () {
328                var positionName = $(this).data('erf-btn-pos');
329                if (positionName) {
330                    $(this).closest('.erf-button').addClass('erf-btn-' + positionName);
331                }
332
333            });
334
335            /* Payment related */
336            var paymentWrapper = form.find('.erf-payment-wrapper');
337            if (paymentWrapper.length > 0) {
338                //formGroups.append(paymentWrapper.clone(true, true).html());
339                //paymentWrapper.remove();
340
341                var getPrice = function (element) {
342                    var priceValue = 0;
343                    var planType = element.data('plan-type');
344                    if (planType == '')
345                        return;
346                    if (planType == 'user') {
347                        priceValue = parseFloat(element.val());
348                        if (isNaN(priceValue)) {
349                            return 0;
350                        }
351                        priceValue = priceValue;
352                    } else if (planType == 'product') {
353                        if (element.is(':checked')) {
354                            priceValue = parseFloat(element.data('erf-price'));
355                            if (isNaN(priceValue)) {
356                                return 0;
357                            }
358                            priceValue = priceValue;
359                        }
360                    }
361
362                    return priceValue;
363                }
364
365                var updatePrieHTML = function (finalPrice) {
366                    var totalPaymentContainer = form.find('.erf-total-payment:first');
367                    totalPaymentContainer.html(finalPrice.round(2));
368                    if (finalPrice <= 0) {
369                        form.find('.erf-payment-methods').slideUp();
370                    } else
371                    {
372                        form.find('.erf-payment-methods').slideDown();
373                    }
374                }
375                form.find('.erf-price').on('input', function () {
376                    var finalPrice = 0;
377                    var tempPrice = 0;
378
379                    $('.erf-price').each(function () { // Calculating price from each plan field
380                        tempPrice = getPrice($(this));
381                        if (tempPrice < 0) {
382                            tempPrice *= -1;
383                        }
384                        finalPrice += tempPrice;
385                    });
386                    updatePrieHTML(finalPrice);
387                });
388
389                form.find('input.erf-price').on('keyup blur', function () {
390                    var finalPrice = 0;
391                    var tempPrice = 0;
392                    $('.erf-price').each(function () { // Calculating price from each plan field
393                        tempPrice = getPrice($(this));
394                        if (tempPrice < 0) {
395                            tempPrice *= -1;
396                        }
397                        finalPrice += tempPrice;
398                    });
399                    updatePrieHTML(finalPrice);
400                });
401
402            }
403            /* Payment ends here */
404
405            paginateForm(form);
406            var is_multipage = form.attr('erf-multipage');
407            if (is_multipage != 1) {
408                if (formLayout == 2) // Check if two column layout
409                {
410                    twoColumnLayout(form, '.rendered-form');
411                }
412
413                $(this).submit(function (event) {
414                    event.preventDefault();
415                    var tempFormInstance = $(this)[0];
416                    $(document).trigger('erf_form_submit_pressed', [$(this)]);
417                    /*
418                     * Generating reCaptcha v3 token before submission (If configured).
419                     */
420                    if (form.find('.erf-recaptcha').length > 0 && erf_global.recaptcha_v == 3 && typeof grecaptcha !== 'undefined' && grecaptcha) {
421                        grecaptcha.ready(function () {
422                            erf_recaptcha.execute('submission', function (token) {
423                                form.find('[name="g-recaptcha-response"]').remove(); // Removing any existing token
424                                form.prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
425                                submit_form(tempFormInstance);
426                            });
427                        });
428                    } else
429                    {
430                        submit_form(tempFormInstance);
431                    }
432                });
433            } else
434            {
435                submitBtnBlock.find('button').html(erf_global.js_strings.next);
436                submitBtnBlock.find('button').addClass('erf-nav-next erf-submit-button');
437            }
438
439            // Procssing hook for each form.
440            var formID = form.data('erf-form-id');
441            var submissionID = form.data('erf-submission-id');
442            var submission = null;
443            var formData = null;
444            var temp = erforms_get_form_from_gs(formID);
445            if (temp) {
446                if (temp.hasOwnProperty('submission')) {
447                    submission = temp.submission;
448                }
449                /*
450                 * Interpolating form fields (File fields excluded) to register "input" event for two way binding.
451                 * It must be done before prefilling the data.
452                 */
453                if (temp.hasOwnProperty('form')) {
454                    formData = temp.form;
455                    $(document).trigger('erf_interpolate_form', [form, formData]);
456                }
457
458                var userMeta;
459                if (temp.hasOwnProperty('user_meta')) {
460                    userMeta = temp.user_meta;
461                }
462                /*
463                 * Interpolating File upload fields  to register "input" event for two way binding.
464                 * It must be done after prefilling the data.
465                 */
466                if (temp.hasOwnProperty('form')) {
467                    $(document).trigger('erf_interpolate_file_fields', [form, formData]);
468                }
469                $(document).trigger('erf_process_form_conditions', [form, submission, formData]);
470                $(document).trigger('erf_process_form_dynamic_fields', [form, submission, formData, userMeta]);
471                $(document).trigger('erf_edit_submission_form', [form, submission, formData]);
472                prefilUsermeta(userMeta, form);  // Prefil user meta.
473            }
474            var validImageTypes = ['image/gif', 'image/jpeg', 'image/png', 'image/jpg'];
475            form.find('.erf-file input[type=file]').each(function () {
476                $(this).on('input', function (event) {
477                    if (event.target.files.length == 0)
478                        return;
479                    if (window.FileReader) {
480                    } else {
481                        return;
482                    }
483                    var imageFile = event.target.files[0];
484                    var fileContainer = $(this).closest('.erf-file');
485                    fileContainer.find('.file_preview').remove();
486                    var fileType = imageFile['type'];
487                    if (!(validImageTypes.indexOf(fileType) > -1)) {
488                        return;
489                    }
490                    var previewContainer = $('<div/>', {class: 'erf_img_preview file_preview'});
491                    var preview = $('<img/>');
492                    fileContainer.append(previewContainer);
493                    previewContainer.append(preview)
494                    var fileReader = new FileReader();
495                    fileReader.onload = function () {
496                        preview.attr('src', fileReader.result);
497                    }
498                    fileReader.readAsDataURL(imageFile);
499                });
500            });
501            // Providing blank value to dropdown options where no value is defined.
502            form.find('.erf-select select option:not([value])').val('');
503            form.find('[type=number]').attr('step', 'any'); // To allow use of decimal in number field
504            form.find('.hide-label').closest('.form-group').find('label:first').hide(); // Hiding labels for indiviual fields on class basis ('hide-label')
505            
506            // Dynamically getting token data
507            $.post(erf_global.ajax_url, { action: 'erf_submission_nonce'} , function (res){
508                if(res.success){
509                    form.find("[name='erform_submission_nonce']").val(res.data.token);
510                }
511            })
512        });
513
514
515        /*
516         * Handling Other Option for Checkbox and Radio Buttons
517         */
518        formContainer.find('.other-val').hide();
519        formContainer.find('.other-val').closest('label').removeAttr('for'); // Removing parent's label's form attribute to disable hiding of textfield on focus.
520        formContainer.find('.other-val').closest('label').contents().filter(function () {
521            return this.nodeType == 3;
522        }).replaceWith(erf_global.js_strings.other);
523        formContainer.find('input.other-option').each(function () {
524            if ($(this).is(':radio')) { // Radio Button handling
525                var radioGroupName = $(this).attr('name');
526                var parentGroup = $(this).closest('.radio-group');
527                var otherElementId = '#' + radioGroupName + '-other
527-value';
528                formContainer.find("[name='" + radioGroupName + "']").on('input', function () {
529                    if ($(this).hasClass('other-option')) {
530                        parentGroup.find(otherElementId).slideDown();
531                        parentGroup.find(otherElementId).keyup(function () {
532                            parentGroup.find('.other-option').val($(this).val());
533                        });
534                    } else {
535                        parentGroup.find(otherElementId).slideUp();
536                    }
537                });
538            } else {
539                $(this).on('input', function () {
540                    var self = $(this);
541                    var otherElement = self.siblings('label').children('.other-val');
542                    if (otherElement.length == 0)
543                        return;
544
545                    if ($(this).is(':checked')) {
546                        otherElement.slideDown();
547                        otherElement.keyup(function () {
548                            self.val(otherElement.val());
549                        });
550                        return;
551                    }
552                    otherElement.slideUp();
553                });
554            }
555
556        });
557        // Other option handling ended. 
558
559        formContainer.find('input[masking]').each(function () {
560            var pattern = $(this).attr('masking');
561            if (pattern) {
562                var target = this;
563                $(target).mask(pattern);
564            }
565        });
566
567        formContainer.find('div[custom-type=spacer]').each(function () {
568            var height = $(this).attr('height');
569            $(this).html('');
570            if (height) {
571                $(this).css('height', height + 'px');
572            }
573        });
574
575
576
577        /*
578         * Used for Front form (For admin only)
579         */
580        var erforms_change_form_layout = function (form) {
581            var formData = new FormData(form);
582            $.ajax({
583                url: erf_global.ajax_url,
584                type: 'POST',
585                data: formData,
586                async: false,
587                success: function (response) {
588                    try {
589                        if (response.success)
590                        {
591                            location.reload();
592                        }
593                    } catch (ex) {
594                    }
595                },
596                cache: false,
597                contentType: false,
598                processData: false
599            });
600        }
601
602    });
603    $(document).bind('erf_form_submit_pressed', function (ev, form) {
604        // Remove all previous errors and error blocks
605        form.find('[custom-type=page-break]').removeClass('erf-has-errors');
606        form.find('.erf-errors').hide();
607        form.find('.erf-errors .erf-errors-body').html('');
608        var formParentBlock = form.closest('.erf-container');
609        formParentBlock.find('.erf-field-error').remove();
610
611        var submitButton = form.find('.erf-submit-button button');
612        if (submitButton.length == 0) { // In case of multipage form
613            submitButton = form.find('.erf-form-nav :submit');
614        }
615        erforms_show_btn_loader(submitButton, true);
616    });
617
618    $(document).bind('erf_sub_response_received', function (ev, form, response) {
619        form = $(form);
620        var submitButton = form.find('[type="submit"]');
621        if (submitButton.length > 0) {
622            submitButton.removeClass('erf-disabled');
623            submitButton.find('.erf-loader').remove();
624        }
625        // Check for reCaptcha elements
626        if (form.find('.erf-recaptcha').length > 0 && erf_global.recaptcha_v == 2 && typeof grecaptcha !== undefined) {
627            grecaptcha.reset();
628        }
629    });
630
631
632    var prefilUsermeta = function (data, form) {
633        if (typeof data === 'undefined')
634            return;
635        if (data.hasOwnProperty('attachments')) {
636            for (var key in data.attachments) {
637                attachFileWithField(form, data.attachments[key], 0, false);
638            }
639            delete data.attachments;
640        }
641
642        for (var key in data) {
643            var metaVal = data[key];
644            var field = $("[name=" + key + "]");
645            if (field.length == 0) {
646                field = $("[name='" + key + "[]']");
647                if (field.length == 0)
648                    continue;
649            }
650            if (field.is(':checkbox')) {
651                if (metaVal instanceof Array) {
652                    field.each(function () {
653                        $(this).prop("checked", ($.inArray($(this).val(), metaVal) != -1));
654                    });
655                }
656            } else if (field.is(':file')) {
657                continue;
658            } else if (field.is(':radio')) {
659                field.filter('[value="' + metaVal + '"]').attr('checked', true);
660            } else {
661                field.val(metaVal);
662            }
663            field.trigger('input');
664        }
665    }
666    $(document).bind('erf_interpolate_form', function (ev, form, formData) {
667        interpolate_form(form, formData);
668    });
669
670    $(document).bind('erf_interpolate_file_fields', function (ev, form, formData) {
671        interpolate_file_fields(form, formData);
672    });
673
674    /*Dynamic Field Population */
675    $(document).bind('erf_process_form_dynamic_fields', function (ev, form, submission, formData, userMeta) {
676        var formId = form.find('[name=erform_id]').val();
677        var applyConfiguration = function (data) {
678            form.find('[type=tel][enable-intl=1]').each(function () {
679                let self = this;
680                setTimeout(function () { // Delaying explicitely 
681                    erforms_set_intl_tel_field(form, $(self));
682                }, 1000);
683            });
684
685            // Password field configuration
686            if (data.hasOwnProperty('pass_config')) {
687                form.find('[type=password]').each(function () {
688                    $(this).password(data.pass_config);
689                });
690            }
691        }
692
693        var fieldCommandsOnLoad = function (field_name) {
694            var temp = erforms_get_form_from_gs(formId);
695            if (temp && temp.hasOwnProperty('load_commands')) {
696                var commands = temp.load_commands;
697                var dynamicFields = [];
698                for (var i = 0; i < commands.length; i++) {
699                    var command = commands[i];
700                    for (var j = 0; j < command.on.length; j++) {
701                        var field_name = command.on[j];
702                        dynamicFields.push(field_name);
703                        if (command.options) {
704                            setDropdownOptions(field_name, command.data);
705                        }
706                        if (typeof (command.default_value) !== 'undefined') {
707                            if (Array.isArray(command.default_value) && command.default_value[i]) {
708                                erforms_set_field_value(form, field_name, command.default_value[j]);
709                            } else {
710                                erforms_set_field_value(form, field_name, command.default_value);
711                            }
712                        }
713                    }
714
715                    if (command.callback) {
716                        if (typeof window[command.callback] === "function")
717                        {
718                            window[command.callback](form, command);
719                        }
720                    }
721                }
722                if (userMeta !== undefined) {
723                    var tempUserMeta = $.extend({}, userMeta);
724                    for (var key in tempUserMeta) {
725                        if (dynamicFields.indexOf(key) == -1) {
726                            delete tempUserMeta[key];
727                        }
728                    }
729                    prefilUsermeta(tempUserMeta, form); // Prefil data after loading dynamic fields
730                }
731                $(document).trigger('erf_edit_submission_field', [form, field_name, submission]);
732            }
733        }
734
735        var getElementValue = function (name) {
736            var fieldInstance = form.find('[name="' + name + '"]');
737            var value = fieldInstance.val();
738            return value;
739        }
740
741        var setElementValue = function (name, value) {
742            var fieldInstance = form.find('[name="' + name + '"]');
743            if (fieldInstance.is(':radio')) {
744                fieldInstance.filter('[value="' + value + '"]').prop('checked', true);
745            } else if (fieldInstance.is(':checkbox')) {
746                if (value) {
747                    if (value.constructor === Array) {
748                        for (var i = 0; i < value.length; i++) {
749                            fieldInstance.filter('[value="' + value[i] + '"]').prop('checked', true);
750                        }
751                    } else
752                    {
753                        fieldInstance.filter('[value="' + value + '"]').prop('checked', true);
754                    }
755                }
756
757            } else {
758                fieldInstance.val(value);
759            }
760            fieldInstance.trigger('input');
761        }
762        var setDropdownOptions = function (name, values) {
763            var fieldInstance = form.find('[name="' + name + '"]');
764            fieldInstance.empty();
765            if (values.length == 0) {
766                fieldInstance.editableSelect();
767            } else
768            {
769                if (fieldInstance.hasClass('es-input')) {
770                    fieldInstance.editableSelect('destroy'); // In case it is an editable select
771                }
772                var fieldInstance = form.find('[name="' + name + '"]');
773                $.each(values, function (val, label) {
774                    fieldInstance.append($('<option>', {
775                        value: val,
776                        text: label
777                    }));
778                });
779            }
780        }
781
782        var fieldCommandOnChange = function (rules) {
783            for (var i = 0; i < rules.length; i++) {
784                var changeRule = rules[i];
785                (function (changeRule) {
786                    var data = {action: 'erforms_field_change_command', change_action: changeRule.action, field_name: changeRule.field_name, form_id: formId};
787                    var fieldInstance = form.find('[name="' + changeRule.field_name + '"]');
788
789                    if (fieldInstance.length == 0)
790                        return;
791
792                    if (fieldInstance.prop('disabled')) {
793                        return;
794                    }
795
796                    fieldInstance.on('input', function () {
797                        if (fieldInstance.changeRequest) {
798                            fieldInstance.changeRequest.abort();
799                        }
800                        data.field_value = getElementValue(changeRule.field_name);
801                        fieldInstance.changeRequest = $.post(erf_global.ajax_url, data, function (res) {
802                            if (res.success) {
803                                var commands = res.data.commands;
804                                var dynamicFields = [];
805                                for (var i = 0; i < commands.length; i++) {
806                                    var command = commands[i];
807                                    for (var j = 0; j < command.on.length; j++) {
808                                        var field_name = command.on[j];
809                                        dynamicFields.push(field_name);
810                                        if (command.options) {
811                                            setDropdownOptions(field_name, command.data)
812                                        }
813                                        if (typeof (command.default_value) !== 'undefined') {
814                                            if (Array.isArray(command.default_value) && command.default_value[j]) {
815                                                erforms_set_field_value(form, field_name, command.default_value[j]);
816                                            } else {
817                                                erforms_set_field_value(form, field_name, command.default_value);
818                                            }
819                                        }
820                                    }
821                                    if (command.callback) {
822                                        if (typeof window[command.callback] === "function")
823                                        {
824                                            window[command.callback](form, fieldInstance, data, command);
825                                        }
826                                    }
827                                    fieldInstance.parsley().removeError(fieldInstance.prop('name'));
828                                    if (command.error) {
829                                        fieldInstance.parsley().addError(fieldInstance.prop('name'), {message: command.error, updateClass: true});
830                                    } else
831                                    {
832                                        fieldInstance.parsley().removeError(fieldInstance.prop('name'));
833                                    }
834
835                                }
836                                if (userMeta !== undefined) {
837                                    var tempUserMeta = $.extend({}, userMeta);
838                                    for (var key in tempUserMeta) {
839                                        if (dynamicFields.indexOf(key) == -1) {
840                                            delete tempUserMeta[key];
841                                        } else
842                                        {
843                                            delete userMeta[key];
844                                        }
845                                    }
846                                    prefilUsermeta(tempUserMeta, form); // Prefil data after loading dynamic fields
847                                }
848                                $(document).trigger('erf_edit_submission_field', [form, field_name, submission]);
849                            }
850                        }).fail(function (xhr, textStatus, e) {
851                            //console.log(xhr.responseText);
852                        });
853                    });
854                })(changeRule)
855            }
856        }
857
858        if (typeof 'form_' + formId !== undefined) {
859            var temp = window['form_' + formId].form_meta;
860            var rules = temp.dynamic_rules;
861            if (rules.load.length > 0) {
862                fieldCommandsOnLoad();
863            }
864
865            if (rules.change.length > 0) {
866                fieldCommandOnChange(rules.change);
867            }
868            applyConfiguration(temp);
869        }
870    });
871
872
873    /** Formula ends here */
874
875    /*****************************Front form ends here*******************/
876
877    /*****************************Edit submissions here ****************/
878    $(document).on('erf_edit_submission_form', function (ev, form, submission, formData)
879    {
880        if (typeof form === "undefined" || !formData || !submission)
881            return;
882        var prepareForm = function () {
883            if (!erf_global.is_admin) {
884                form.find(':input,:radio,:checkbox').not('[type="submit"]').addClass('erf-disabled');  // By default disable all the fields
885                if (formData.hasOwnProperty('en_edit_sub') && formData.hasOwnProperty('edit_fields') && formData.edit_fields.length > 0) {
886                    for (var i = 0; i < formData.edit_fields.length; i++) {
887                        var single = $("[name=" + formData.edit_fields[i] + "]"); // For single fields
888                        var multi = $("[name='" + formData.edit_fields[i] + "[]']"); // For array type of fields
889                        if (single.length > 0) {
890                            single.removeClass('erf-disabled');
891                        }
892
893                        if (multi.length > 0) {
894                            multi.removeClass('erf-disabled');
895                        }
896                    }
897                }
898            }
899            $.each(submission.fields_data, function (key, field_data) {
900                $(document).trigger('erf_edit_submission_field', [form, field_data.f_name, submission]);
901           
901 });
902            $('<input>').attr({style: 'display:none;', type: 'text', name: 'submission_id', value: submission.id}).appendTo(form);
903            if (submission.hasOwnProperty('attachments')) {
904                // Looping through attachment fields to generate preview and add delete action.
905                for (var c = 0; c < submission.attachments.length; c++) {
906                    attachFileWithField(form, submission.attachments[c], submission.id, true);
907                }
908            }
909        }
910        prepareForm();
911    });
912    $(document).on('erf_edit_submission_field', function (ev, form, fieldName, submission) {
913        if (!submission)
914            return;
915        $.each(submission.fields_data, function (key, field_data) {
916            if (fieldName == field_data.f_name) {
917                var field = erforms_set_field_value(form, fieldName, field_data.f_val);
918                if (field !== false) {
919                    field.trigger('input');
920                }
921            }
922        });
923
924    });
925    /*****************************Edit submissions ends here ****************/
926
927    /*****************************Utils ****************/
928
929    var erf_recaptcha = {
930        execute: function (action, callback) {
931            grecaptcha.execute(erf_global.rc_site_key, {'action': action}).then(function (token) {
932                callback(token);
933            });
934        }
935    }
936
937    var attachFileWithField = function (container, attachment, submissionID, allowDeletion) {
938        var allowDeletion = allowDeletion || false;
939        var attachment_field = container.find("[name='" + attachment.f_name + "']");
940        if (attachment_field.length == 0)
941            return;
942        if (attachment_field.hasClass('erf-disabled')) {
943            allowDeletion = false;
944        }
945        attachment_field.find('.file_preview').remove(); // Avoid duplicate file previews
946        var file_exists = false;
947        var deleteFile;
948        // Add <image> tag if field has any image_url.
949        if (attachment.hasOwnProperty('image_url')) {
950            var fileContainer = attachment_field.closest('.erf-file');
951            var previewContainer = $('<div/>', {class: 'erf_img_preview file_preview'});
952            var preview = $('<img/>');
953            previewContainer.append(preview);
954            preview.attr('src', attachment.image_url);
955            if (allowDeletion) {
956                deleteFile = $('<a/>', {class: 'erf_delete_attachment'});
957                deleteFile.html(erf_global.js_strings.delete_file);
958                previewContainer.append(deleteFile);
959            }
960            fileContainer.append(previewContainer);
961            file_exists = true;
962        }
963        // Add <a> tag if file in non image.
964        if (attachment.hasOwnProperty('link_url')) {
965            var fileContainer = attachment_field.closest('.erf-file');
966            var previewContainer = $('<div/>', {class: 'erf_link_preview file_preview'});
967            var preview = $('<a/>');
968            fileContainer.append(previewContainer);
969            previewContainer.append(preview);
970            preview.attr('href', attachment.link_url);
971            preview.html(attachment.link_label);
972            preview.attr('target', '_blank');
973            if (allowDeletion) {
974                deleteFile = $('<a/>', {class: 'erf_delete_attachment'});
975                deleteFile.html('&nbsp;' + erf_global.js_strings.delete_file);
976                previewContainer.append(deleteFile);
977            }
978            file_exists = true;
979        }
980
981        if (file_exists) {
982            var isRequired = attachment_field.prop('required');
983            attachment_field.removeAttr('required');
984            attachment_field.closest('.erf-file').find('.erf-required').hide();
985            if (allowDeletion) {
986                // Registerting delete action to allow existing file removal.
987                deleteFile.click(function (e) {
988                    e.preventDefault();
989                    if (isRequired) { // Adding required attribute if field is required.
990                        attachment_field.attr('required', 'required');
991                        attachment_field.closest('.erf-file').find('.erf-required').show();
992                    }
993                    deleteFile.closest('.file_preview').remove();
994                    $.post(erf_global.ajax_url, {file_id: attachment.f_val, f_name: attachment.f_name, submission_id: submissionID, action: 'erforms_delete_sub_attachment'}, function (res) {
995                        if (res.success) {
996                            $(document).trigger('erf_sub_file_deleted', [attachment.f_val, res]);
997                            attachment_field.trigger('input');
998                        }
999                    }).fail(function (xhr, textStatus, e) {
1000                        alert('Unable to connect to server');
1001                    });
1002                });
1003            }
1004        }
1005    }
1006
1007    /*
1008     * Interpolate form and registers the events to handle two way binding for the 
1009     * fields short tag (__Field'label__) and input field. 
1010     * Note: It do not interpolates File fields.
1011     */
1012    function interpolate_form(form, formData) {
1013        var nonInputFields = ['paragraph', 'button'];
1014        var elems = form.find('.erf_dynamic_ph');
1015        // Looping through all the form input fields to identify span elements with field placeholders
1016        if (elems.length > 0) {
1017            for (var i = 0; i < formData.fields.length; i++) {
1018                let singleField = formData.fields[i];
1019                if (singleField.hasOwnProperty('type') && nonInputFields.indexOf(singleField.type) == -1) {
1020                    singleField.label = singleField.label.toLowerCase();
1021                    let searchLabel = '__' + singleField.label + '__';
1022                    let searchRefLabel = '%' + singleField.dataRefLabel.toLowerCase() + '%';
1023                    elems.each(function () {
1024                        var item = $(this);
1025                        if (item.text().toLowerCase() == searchLabel || item.text().toLowerCase() == searchRefLabel) {
1026                            //item.html('');
1027                            /*************** Closure ******************/
1028                            (function (fieldName) {
1029
1030                                // Handling single input fields
1031                                form.find('[name="' + fieldName + '"]').on('input', function () {
1032                                    item.html($(this).val());
1033                                });
1034
1035                                // Handling multi input fields (Checkbox,Multiselect dropdown)
1036                                form.find('[name="' + fieldName + '[]"]').on('input', function () {
1037                                    var selectedValues = []; // Stores only checked/selected values
1038                                    if ($(this).is(':checkbox')) {
1039                                        form.find('[name="' + fieldName + '[]"]:checked').each(function () {
1040                                            selectedValues.push($(this).val());
1041                                        });
1042                                    } else if ($(this).is('select')) {
1043                                        selectedValues = $(this).val();
1044                                    }
1045                                    item.html(selectedValues.join(','));
1046                                });
1047
1048                                // Checking for file previews
1049                                var fileField = form.find('[name="' + fieldName + '"]:file');
1050                                if (fileField.length > 0) {
1051                                    var parentField = fileField.closest('.form-group');
1052                                    if (parentField.length > 0) {
1053                                        var preview = parentField.find('.erf_img_preview');
1054                                        if (preview.length > 0) {
1055                                            item.html(preview[0].outerHTML);
1056                                            item.find('.erf_delete_attachment').remove();
1057                                        }
1058                                    }
1059                                }
1060
1061                            })(singleField.name);
1062
1063                            /*************** Closure ends here******************/
1064                        }
1065                    });
1066                }
1067            }
1068        }
1069        elems.text('');
1070
1071
1072        // Formula fields processing
1073        var formulaFields = form.find('.formula-field');
1074        if (formulaFields.length == 0)
1075            return;
1076
1077        var refs = [];
1078        // Storing references to each field which are used in formula expressions
1079        formulaFields.each(function () {
1080            var expression = $(this).data('expression');
1081            if (expression) {
1082                const tokenRegex = /%([^[%]+)%/g;
1083                const matches = expression.match(tokenRegex);
1084                if (matches) {
1085                    refs = refs.concat(matches.map(m => m.trim().replace(new RegExp("%", "g"), '')));
1086                }
1087            }
1088        });
1089        refs = Array.from(new Set(refs)); // Eliminating duplicates
1090        refs.forEach(function (ref) { // Watching for any changes
1091            let field = form.find("[data-ref-label='" + ref + "']");
1092            if (field.is(':checkbox')) {
1093                field.on('change', (function () {
1094                    process_formula_fields(form, formulaFields);
1095                }));
1096            } else {
1097                field.on('input', (function () {
1098                    process_formula_fields(form, formulaFields);
1099                }));
1100            }
1101
1102        });
1103        process_formula_fields(form, formulaFields); // Initializing at loading time
1104    }
1105
1106    /*
1107     * Interpolate form and registers the events to handle two way binding between the file upload fields
1108     */
1109    function interpolate_file_fields(form, formData) {
1110        var nonInputFields = ['paragraph', 'button'];
1111        var elems = form.find('.erf_dynamic_ph_file');
1112        // Looping through all the form input fields to identify span elements with field placeholders
1113        if (elems.length > 0) {
1114            for (var i = 0; i < formData.fields.length; i++) {
1115                var singleField = formData.fields[i];
1116                if (singleField.hasOwnProperty('type') && nonInputFields.indexOf(singleField.type) == -1) {
1117                    singleField.label = singleField.label.toLowerCase();
1118                    var searchLabel = '__' + singleField.label + '__';
1119                    let searchRefLabel = '%' + singleField.dataRefLabel.toLowerCase() + '%';
1120                    elems.each(function () {
1121                        var item = $(this);
1122                        if (item.text().toLowerCase() == searchLabel || item.text().toLowerCase() == searchRefLabel) {
1123                            item.html('');
1124                            /*************** Closure ******************/
1125                            (function (fieldName) {
1126                                form.find('[name="' + fieldName + '"]').on('input', function () {
1127                                    if ($(this).is(':file')) { // Handling file type field
1128                                        var file = $(this);
1129                                        setTimeout(function () { // Implementing the preview action after few seconds to make sure preview div is available
1130                                            var filePreview = file.closest('.form-group').find('.erf_img_preview');
1131                                            if (filePreview.length > 0) {
1132                                                item.html(filePreview[0].outerHTML);
1133                                                item.find('.erf_delete_attachment').remove(); // Removing "Delete File" button
1134                                            } else {
1135                                                item.html('');
1136                                            }
1137                                        }, 1500);
1138                                    }
1139                                });
1140
1141                                // Checking for file previews
1142                                var fileField = form.find('[name="' + fieldName + '"]:file');
1143                                if (fileField.length > 0) {
1144                                    var parentField = fileField.closest('.form-group');
1145                                    if (parentField.length > 0) {
1146                                        var preview = parentField.find('.erf_img_preview');
1147                                        if (preview.length > 0) {
1148                                            item.html(preview[0].outerHTML);
1149                                            item.find('.erf_delete_attachment').remove();
1150                                        }
1151                                    }
1152                                }
1153                            })(singleField.name);
1154                            /*************** Closure ends here******************/
1155                        }
1156                    });
1157                }
1158            }
1159        }
1160    }
1161
1162    // Executes expression of all the formula fields available in the form.
1163    function process_formula_fields(form, formulaFields) {
1164        formulaFields.each(function (i, field) {
1165            var expression = $(this).data('expression');
1166            if (expression) {
1167                let output = frml_evaluate(expression,
1168                                function (token) {
1169                                    let temp = form.find("[data-ref-label='" + token + "']");
1170                                    let tokenValue = erforms_get_field_value_by_ref(form, token);
1171                                    if (temp.hasClass('erf-date-field')) { // Check if field is date type
1172                                        tokenValue = temp.datepicker('getDate');
1173                                    }
1174                                    if (temp.attr('enable-intl')) { // Check if field is date type
1175                                        let phoneFieldId = temp.attr('id');
1176                                        tokenValue = form.find("[name='" + phoneFieldId + "-intl']").val();
1177                                    }
1178                                    return tokenValue;
1179                                });
1180                if($(field).is('input')){
1181                    $(field).val(output);
1182                    $(field).trigger('input');
1183                } else{
1184                    $(field).html(output);
1185                }
1186            }
1187        });
1188    }
1189
1190    function frml_evaluate(expression, templateResolverFn, reportErrors) {
1191        let {Parser, ParserRules, setRandomGenerator, ParserStart, setTemplateResolverFn} = erformsFrmlEngine;
1192        const p = new Parser(ParserRules, ParserStart);
1193        setTemplateResolverFn(templateResolverFn);
1194        setRandomGenerator(null);
1195        p.feed(expression);
1196        if (p.results.length > 1 && reportErrors) {
1197            let previousResult = p.results[0];
1198            p.results.forEach(function (result) {
1199                if (previousResult !== result) {
1200                    console.warn(JSON.stringify(p.results, null, 2));
1201                }
1202                previousResult = result;
1203            });
1204        } else if (expression && expression.trim() && p.results.length === 0) {
1205            throw new Error("Unexpected end of expression");
1206        }
1207        let result = p.results[0];
1208        if (typeof result == 'undefined' || Number.isNaN(result) || result === Infinity) {
1209            return null;
1210        }
1211        return result;
1212    }
1213
1214
1215    /*****************************Utils ends here ****************/
1216
1217    /*****************************Login Form ****************************/
1218    $(document).bind('erf_process_login_form', function (ev) {
1219        $(".erf-show-register,.erf-show-login,.erf-show-lost-password").click(function () {
1220            var erfContainer = $(this).closest('.erf-container');
1221            var loginContainer = erfContainer.find('.erf-login-container');
1222            var registrationForm = erfContainer.find('.erf-reg-form-container');
1223            var lostPasswordContainer = erfContainer.find('.erf-password-lost-container');
1224            var otpContainer = erfContainer.find('.erf-otp-container');
1225            var updatePasswordContainer = erfContainer.find('.erf-password-update-container');
1226
1227            if (!erfContainer.hasClass('erf-login-register')) {
1228                if (registrationForm.length > 0)
1229                    registrationForm.slideUp();
1230            }
1231            if (loginContainer.length > 0)
1232                loginContainer.slideUp();
1233
1234            if (lostPasswordContainer.length > 0)
1235                lostPasswordContainer.slideUp();
1236
1237            if (otpContainer.length > 0)
1238                otpContainer.slideUp();
1239
1240            if (updatePasswordContainer.length > 0)
1241                updatePasswordContainer.slideUp();
1242
1243            if ($(this).hasClass('erf-show-register')) {
1244                registrationForm.slideDown();
1245            }
1246
1247            if ($(this).hasClass('erf-show-login')) {
1248                loginContainer.slideDown();
1249            }
1250
1251            if ($(this).hasClass('erf-show-lost-password')) {
1252                ;
1253                lostPasswordContainer.slideDown();
1254            }
1255        });
1256
1257        $('.erf-reset-password').click(function () {
1258            var lostPasswordContainer = $(this).closest('.erf-password-lost-container');
1259            var erfContainer = $(this).closest('.erf-container');
1260            //var loginContainer = erfContainer.find('.erf-login-container');
1261            var otpContainer = erfContainer.find('.erf-otp-container');
1262            lostPasswordContainer.find('.erf-error').html();
1263            submitButton = $(this);
1264            erforms_show_btn_loader(submitButton, true);
1265            $.ajax({
1266                url: erf_global.ajax_url,
1267                type: 'POST',
1268                data: {'user_login': lostPasswordContainer.find('#erf_user_login').val(), 'action': 'erf_reset_password'},
1269                success: function (response) {
1270                    try {
1271                        response = JSON.parse(response);
1272                        if (response.success) {
1273                            lostPasswordContainer.slideUp();
1274                            otpContainer.slideDown();
1275                            otpContainer.find('.erf-message').html(response.msg);
1276                            otpContainer.find('.erf-error').html('');
1277                            lostPasswordContainer.find('.erf-error').html('');
1278                        } else {
1279                            lostPasswordContainer.find('.erf-error').html(response.msg);
1280                        }
1281                        erforms_show_btn_loader(submitButton, false);
1282                    } catch (ex) {
1283                    }
1284                },
1285            });
1286        });
1287
1288        $('.erf-otp').click(function () {
1289            var otpContainer = $(this).closest('.erf-otp-container');
1290            var erfContainer = $(this).closest('.erf-container');
1291            var updatePasswordContainer = erfContainer.find('.erf-password-update-container');
1292            otpContainer.find('.erf-error').html();
1293            submitButton = $(this);
1294            erforms_show_btn_loader(submitButton, true);
1295            $.ajax({
1296                url: erf_global.ajax_url,
1297                type: 'POST',
1298                data: {'user_login': erfContainer.find('#erf_user_login').val(), 'user_otp': otpContainer.find('#erf_user_otp').val(), 'action': 'erf_otp_check'},
1299                success: function (response) {
1300                    try {
1301                        response = JSON.parse(response);
1302                        if (response.success) {
1303                            otpContainer.slideUp();
1304                            updatePasswordContainer.slideDown();
1305                            updatePasswordContainer.find('.erf-error').html('');
1306                            otpContainer.find('.erf-error').html('');
1307                        } else {
1308                            otpContainer.find('.erf-error').html(response.msg);
1309                        }
1310                        erforms_show_btn_loader(submitButton, false);
1311                    } catch (ex) {
1312                    }
1313                },
1314            });
1315        });
1316
1317        $('.erf-update-password').click(function () {
1318            var updatePasswordContainer = $(this).closest('.erf-password-update-container');
1319            var erfContainer = $(this).closest('.erf-container');
1320            var loginContainer = erfContainer.find('.erf-login-container');
1321            updatePasswordContainer.find('.erf-error').html();
1322            submitButton = $(this);
1323            erforms_show_btn_loader(submitButton, true);
1324            $.ajax({
1325                url: erf_global.ajax_url,
1326                type: 'POST',
1327                data: {'password': updatePasswordContainer.find('#erf_user_password').val(), 'cpassword': updatePasswordContainer.find('#erf_user_cpassword').val(), 'user_login': erfContainer.find('#erf_user_login').val(), 'user_otp': erfContainer.find('#erf_user_otp').val(), 'action': 'erf_update_password'},
1328                success: function (response) {
1329                    try {
1330                        response = JSON.parse(response);
1331                        if (response.success) {
1332                            updatePasswordContainer.slideUp();
1333                            loginContainer.slideDown();
1334                            loginContainer.find('.erf-message').html(response.msg);
1335                            loginContainer.find('.erf-error').html('');
1336                            updatePasswordContainer.find('.erf-error').html('');
1337                        } else {
1338                            updatePasswordContainer.find('.erf-error').html(response.msg);
1339                        }
1340                        erforms_show_btn_loader(submitButton, false);
1341                    } catch (ex) {
1342                    }
1343                },
1344            });
1345        });
1346
1347        var sendLoginRequest = function (loginForm, loginContainer, data) {
1348            var submitButton = loginForm.find('.erf-submit-button button');
1349            $.ajax({
1350                url: erf_global.ajax_url,
1351                type: 'POST',
1352                data: data,
1353                async: true,
1354                success: function (response) {
1355                    try {
1356                        erforms_show_btn_loader(submitButton, false);
1357                        response = JSON.parse(response);
1358                        if (response.success) {
1359                            if (response.hasOwnProperty('reload')) {
1360                                loginContainer.find("#erf_login_reload_form").submit();
1361                            } else if (response.hasOwnProperty('redirect')) {
1362                                $(location).attr('href', response.redirect);
1363                            }
1364                        } else {
1365                            if (loginForm.find('.erf-recaptcha').length > 0 && erf_global.recaptcha_v == 2 && typeof grecaptcha !== 'undefined' && grecaptcha) {
1366                                grecaptcha.reset();
1367                            }
1368                            loginContainer.find('.erf-error').html(response.msg);
1369                        }
1370
1371                    } catch (ex) {
1372                        erforms_show_btn_loader(submitButton, false);
1373                    }
1374                },
1375            });
1376        }
1377
1378        $('.erf-login-form').submit(function (e) {
1379            var loginForm = $(this);
1380            var loginContainer = loginForm.closest('.erf-login-container');
1381            var rememberme = '';
1382            if (loginForm.find('#erf_rememberme').is(':checked')) {
1383                rememberme = 'forever';
1384            }
1385
1386            loginContainer.find('.erf-error').html('');
1387            var data = {
1388                'erf_username': loginForm.find('#erf_username').val(),
1389                'erf_password': loginForm.find('#erf_password').val(),
1390                'rememberme': rememberme,
1391                'erf_login_nonce': loginForm.find('#erf_login_nonce').val(),
1392                'action': 'erf_login_user'
1393            };
1394
1395            var submitButton = loginForm.find('.erf-submit-button button');
1396            erforms_show_btn_loader(submitButton, true);
1397
1398            // If reCaptcha enabled
1399            var recap = loginForm.find('.erf-recaptcha');
1400            if (recap.length > 0) {
1401                if (erf_global.recaptcha_v == 2) { // reCaptcha version 2 API integrated
1402                    data['g-recaptcha-response'] = loginForm.find('[name="g-recaptcha-response"]').val();
1403                    sendLoginRequest(loginForm, loginContainer, data);
1404                } else if (erf_global.recaptcha_v == 3 && typeof grecaptcha !== 'undefined' && grecaptcha) { // reCaptcha version 3 API integrated
1405                    grecaptcha.ready(function () {
1406                        erf_recaptcha.execute('login', function (token) {
1407                            data['g-recaptcha-response'] = token;
1408                            sendLoginRequest(loginForm, loginContainer, data);
1409                        });
1410                    });
1411                }
1412            } else {
1413                sendLoginRequest(loginForm, loginContainer, data);
1414            }
1415            e.preventDefault();
1416        });
1417
1418    });
1419    /*****************************Login Form ends here****************************/
1420
1421    /*****************************My Account ****************************/
1422    $(document).bind('erf_process_my_account', function (ev) {
1423        var windowWidth = $(window).width();
1424        var myAccountDiv = $('.erf-my-account');
1425        if (myAccountDiv.length == 0)
1426            return;
1427        var autoResize = function () {
1428            if (windowWidth > 1024) {
1429                if (myAccountDiv.innerWidth() < 700) {
1430                    myAccountDiv.closest('.erf-container').addClass('erf-small-inner');
1431                }
1432            }
1433        };
1434        autoResize();
1435        $(window).resize(function () {
1436            autoResize();
1437        });
1438        $('.erf-load-submission-row').click(function () {
1439            var submissionID = $(this).data('submission-id');
1440            var formID = $(this).data('form-id');
1441            var submissionContainer = $(this).siblings('.erf-modal');
1442            var contentContainer = submissionContainer.find('.erf-modal-body');
1443            submissionContainer.toggle();
1444            contentContainer.html(erf_global.js_strings.loading_submission_info)
1445            // Fetch updated submission info.
1446            $.post(erf_global.ajax_url, {form_id: formID, submission_id: submissionID, action: 'erforms_get_submission_html'}, function (res) {
1447                if (res.success) {
1448                    if (res.data.hasOwnProperty('html')) {
1449                        contentContainer.html(res.data.html);
1450                    }
1451                }
1452            }).fail(function (xhr, textStatus, e) {
1453                contentContainer.html(erf_global.js_strings.edit_form_load_error);
1454            });
1455        });
1456
1457        var registerCloseModal = function () {
1458            $('.erf-modal-close').click(function () {
1459                $(this).closest('.erf-modal').hide();
1460            });
1461        }
1462
1463        registerCloseModal();
1464        /*
1465         * Handles "Edit" action.
1466         * Loads Edit form in a modal window.
1467         */
1468        $('.erf-edit-submission-row').click(function (e) {
1469            e.preventDefault();
1470            var modalContainer = $(this).parent('.erf-my-account-col-edit').find('.erf-modal');
1471            var submissionContainer = modalContainer.find('.erf-modal-body');
1472            var submissionID = $(this).data('submission-id');
1473            var formID = $(this).data('form-id');
1474            modalContainer.show();
1475            submissionContainer.html(erf_global.js_strings.loading_edit_form);
1476            //Fetching Edit form
1477            $.post(erf_global.ajax_url, {form_id: formID, submission_id: submissionID, action: 'erforms_get_form_for_edit'}, function (res) {
1478                if (res.success) {
1479                    if (res.data.hasOwnProperty('form_html')) {
1480                        submissionContainer.html(res.data.form_html);
1481                        erforms_set_form_into_gs(formID, res.data.localize);
1482                        $(document).trigger('erf_process_form', [modalContainer]);
1483                    }
1484                    //$(document).trigger('erf_submission_edit_form', [formID,submissionID,res]);
1485                } else {
1486                    if (res.data.hasOwnProperty('error')) {
1487                        submissionContainer.html(res.data.error);
1488                    }
1489                    //$(document).trigger('erf_submission_edit_error', [formID,submissionID,res]);
1490                }
1491                registerCloseModal();
1492            }).fail(function (xhr, textStatus, e) {
1493                submissionContainer.html(erf_global.js_strings.edit_form_load_error);
1494            });
1495        });
1496
1497        // Delete submission
1498        $('.erf-delete-submission-row').click(function () {
1499            var deletionConfirmed = confirm(erf_global.my_account.sub_del_confirm_msg);
1500            if (!deletionConfirmed)
1501                return;
1502            var submissionID = $(this).data('submission-id');
1503            var formID = $(this).data('form-id');
1504            var row = $(this).closest('.erf-my-account-details');
1505            $.post(erf_global.ajax_url, {form_id: formID, submission_id: submissionID, action: 'erforms_delete_submission'}, function (res) {
1506                if (res.success) {
1507                    row.remove();
1508                    $(document).trigger('erf_submission_deleted', [formID, submissionID, res]);
1509                } else {
1510                    if (res.data.hasOwnProperty('msg')) {
1511                        alert(res.data.msg);
1512                        $(document).trigger('erf_submission_deletion_error', [formID, submissionID, res]);
1513                    }
1514                }
1515            }).fail(function (xhr, textStatus, e) {
1516                alert('Unable to connect to server');
1517            });
1518        });
1519
1520        $('.erf-my-account-nav a').click(function () {
1521            $('.erf-my-account-nav a').parent().removeClass('erf-my-account-navigation-link-active');
1522            $(this).parent().addClass('erf-my-account-navigation-link-active');
1523            var tagid = $(this).data('tag');
1524            $('.erf-my-account-profile-tab').removeClass('active').addClass('erf-hidden');
1525            $('#' + tagid).addClass('active').removeClass('erf-hidden');
1526        });
1527
1528        window.Parsley.addValidator('confirmPassword', {
1529            validateString: function (value, passwordFieldId) {
1530                return $("#" + passwordFieldId).val() == value;
1531            },
1532            messages: {
1533                en: erf_global.parsley.confirmPassword,
1534            }
1535        });
1536
1537
1538        $(".erf-change-password").submit(function (event) {
1539            var form = $(this);
1540            var formContainer = $(form).closest('.erf-my-account-profile-tab');
1541            var formInstance = form.parsley();
1542            var formData = new FormData(form[0]);
1543            var errorContainer = formContainer.find('.erf-errors');
1544            errorContainer.html('');
1545            form.find('button[type="submit"]').append('<span class="erf-loader"></span>');
1546
1547            $.ajax({
1548                url: erf_global.ajax_url,
1549                type: 'POST',
1550                data: formData,
1551                async: true,
1552                success: function (response) {
1553                    if (response.success) {
1554                        var message = response.data.msg;
1555                        form.find('button[type="submit"] .erf-loader').remove();
1556                        formContainer.html(message);
1557
1558                    } else
1559                    {
1560                        form.find('button[type="submit"] .erf-loader').remove();
1561                        if (response.data.hasOwnProperty('errors')) {
1562                            for (var i = 0; i < response.data.errors.length; i++) {
1563                                errorContainer.append('<div class="erf-error-row">' + response.data.errors[i] + '</div><br>');
1564                            }
1565                        }
1566
1567                    }
1568                },
1569                cache: false,
1570                contentType: false,
1571                processData: false
1572            });
1573            event.preventDefault();
1574        });
1575        $('.erf-password').password(erf_global.my_account.pass_config);
1576        $(".erf-print-submission").click(function () {
1577            $(this).closest('.erf-submission-info').find('.erf-modal-body').printThis({
1578                importCSS: true,
1579                loadCSS: "",
1580            });
1581        });
1582    });
1583    $(window).bind("load", function () {
1584        var currentURL = $(location).attr('href');
1585        if (currentURL.indexOf('erf_paged') != -1) {
1586            $('a[data-tag="submissions"]').trigger("click");
1587        }
1588    });
1589    /*****************************My Account ends here ****************************/
1590
1591    /****************************Common*******************************************/
1592    $(document).bind('erf_register_common_scripts', function (ev) {
1593        $(".erf_resend_ver_link").click(function () {
1594            var tar = $(this);
1595            var container = tar.closest('.erf-container');
1596            $.ajax({
1597                url: erf_global.ajax_url,
1598                type: 'POST',
1599                data: {nonce: $(this).data('nonce'), sub: $(this).data('sub'), 'action': 'erf_resend_verification'},
1600                success: function (response) {
1601                    try {
1602                        if (response.success) {
1603                            erf_popup_message({content: response.data.msg}
1603, container);
1604                        } else {
1605                            erf_popup_message({content: response.data.msg}, container);
1606                        }
1607                        ;
1608                    } catch (ex) {
1609                    }
1610                    tar.removeClass('erf-text-spinner');
1611                },
1612                beforeSend: function () {
1613                    tar.addClass('erf-text-spinner');
1614                }
1615            });
1616        });
1617    });
1618})(jQuery);
1619
1620/*Form Ends here*/
1621
1622jQuery(document).ready(function () {
1623    erf_global_triggers();
1624});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.