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"> </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(' ' + 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.