1;(function($) { 2 3 var WPForms = { 4 5 /** 6 * Start the engine. 7 * 8 * @since 1.2.3 9 */ 10 init: function() { 11 12 // Set user identifier 13 WPForms.setUserIndentifier(); 14 15 // Document ready 16 $(document).ready(WPForms.ready); 17 18 // Page load 19 $(window).on('load', WPForms.load); 20 21 WPForms.bindUIActions(); 22 }, 23 24 /** 25 * Document ready. 26 * 27 * @since 1.2.3 28 */ 29 ready: function() { 30 31 WPForms.loadValidation(); 32 WPForms.loadDatePicker(); 33 WPForms.loadTimePicker(); 34 WPForms.loadInputMask(); 35 WPForms.loadPayments(); 36 37 $(document).trigger('wpformsReady'); 38 }, 39 40 /** 41 * Page load. 42 * 43 * @since 1.2.3 44 */ 45 load: function() { 46 47 }, 48 49 //--------------------------------------------------------------------// 50 // Initializing 51 //--------------------------------------------------------------------// 52 53 /** 54 * Load jQuery Validation. 55 * 56 * @since 1.2.3 57 */ 58 loadValidation: function() { 59 60 // Only load if jQuery validation library exists 61 if (typeof $.fn.validate !== 'undefined') { 62 63 $.validator.messages.required = wpforms_settings.val_required; 64 $.validator.messages.url = wpforms_settings.val_url; 65 $.validator.messages.email = wpforms_settings.val_email; 66 $.validator.messages.number = wpforms_settings.val_number; 67 68 // Payments: Validate method for Credit Card Number 69 if(typeof $.fn.payment !== 'undefined') { 70 $.validator.addMethod( "creditcard", function(value, element) { 71 //var type = $.payment.cardType(value); 72 var valid = $.payment.validateCardNumber(value); 73 return this.optional(element) || valid; 74 }, wpforms_settings.val_creditcard); 75 // @todo validate CVC and expiration 76 } 77 78 // Validate method for file extensions 79 $.validator.addMethod( "extension", function(value, element, param) { 80 param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif"; 81 return this.optional(element) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) ); 82 }, wpforms_settings.val_fileextension ); 83 84 // Validate method for file size 85 $.validator.addMethod("maxsize", function(value, element, param) { 86 var maxSize = param, 87 optionalValue = this.optional(element), 88 i, len, file; 89 if (optionalValue) { 90 return optionalValue; 91 } 92 if (element.files && element.files.length) { 93 i = 0; 94 len = element.files.length; 95 for (; i < len; i++) { 96 file = element.files[i]; 97 if (file.size > maxSize) { 98 return false; 99 } 100 } 101 } 102 return true; 103 }, wpforms_settings.val_filesize); 104 105 // Validate email addresses 106 $.validator.methods.email = function( value, element ) { 107 return this.optional( element ) || /^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}$/i.test( value ); 108 } 109 110 // Validate confirmations 111 $.validator.addMethod("confirm", function(value, element, param) { 112 return $.validator.methods.equalTo.call(this, value, element, param); 113 }, wpforms_settings.val_confirm); 114 115 // Validate required payments 116 $.validator.addMethod( "required-payment", function( value, element ) { 117 return WPForms.amountSanitize( value ) > 0; 118 }, wpforms_settings.val_requiredpayment ); 119 120 // Validate 12-hour time 121 $.validator.addMethod( "time12h", function( value, element ) { 122 return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value ); 123 }, wpforms_settings.val_time12h ); 124 125 // Validate 24-hour time 126 $.validator.addMethod( "time24h", function( value, element ) { 127 return this.optional(element) || /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(\ ?[AP]M)?$/i.test(value); 128 }, wpforms_settings.val_time24h ); 129 130 // Finally load jQuery Validation library for our forms 131 $('.wpforms-validate').each(function() { 132 var form = $(this), 133 formID = form.data('formid'); 134 135 if (typeof window['wpforms_'+formID] != "undefined" && window['wpforms_'+formID].hasOwnProperty('validate')) { 136 properties = window['wpforms_'+formID].validate; 137 } else if ( typeof wpforms_validate != "undefined") { 138 properties = wpforms_validate; 139 } else { 140 properties = { 141 errorClass: 'wpforms-error', 142 validClass: 'wpforms-valid', 143 errorPlacement: function(error, element) { 144 if (element.attr('type') == 'radio' || element.attr('type') == 'checkbox' ) { 145 element.parent().parent().parent().append(error); 146 } else if (element.is('select') && element.attr('class').match(/date-month|date-day|date-year/)) { 147 if (element.parent().find('label.wpforms-error:visible').length === 0) { 148 element.parent().find('select:last').after(error); 149 } 150 } else { 151 error.insertAfter(element); 152 } 153 }, 154 highlight: function(element, errorClass, validClass) { 155 $(element).addClass(errorClass).removeClass(validClass); 156 $(element).closest('.wpforms-field').addClass('wpforms-has-error'); 157 }, 158 unhighlight: function(element, errorClass, validClass) { 159 $(element).removeClass(errorClass).addClass(validClass); 160 $(element).closest('.wpforms-field').removeClass('wpforms-has-error'); 161 }, 162 submitHandler: function(form) { 163 164 var $form = $(form), 165 $submit = $form.find('.wpforms-submit'), 166 altText = $submit.data('alt-text'); 167 168 if ( WPForms.empty( $submit.get(0).recaptchaID ) && $submit.get(0).recaptchaID !== 0 ) { 169 // Normal form. 170 if (altText) { 171 $submit.text(altText).prop('disabled', true); 172 } 173 form.submit(); 174 } else { 175 // Form contains invisible reCAPTCHA. 176 grecaptcha.execute( $submit.get(0).recaptchaID ); 177 } 178 } 179 } 180 } 181 form.validate( properties ); 182 }); 183 } 184 }, 185 186 /** 187 * Load jQuery Date Picker. 188 * 189 * @since 1.2.3 190 */ 191 loadDatePicker: function() { 192 193 // Only load if jQuery datepicker library exists 194 if (typeof $.fn.flatpickr !== 'undefined') { 195 $('.wpforms-datepicker').each(function() { 196 var element = $(this), 197 form = element.closest('.wpforms-form'), 198 formID = form.data('formid'), 199 fieldID = element.closest('.wpforms-field').data('field-id'); 200 201 if (typeof window['wpforms_'+formID+'_'+fieldID] != 'undefined' && window['wpforms_'+formID+'_'+fieldID].hasOwnProperty('datepicker')) { 202 properties = window['wpforms_'+formID+'_'+fieldID].datepicker; 203 } else if (typeof window['wpforms_'+formID] != 'undefined' && window['wpforms_'+formID].hasOwnProperty('datepicker')) { 204 properties = window['wpforms_'+formID].datepicker; 205 } else if (typeof wpforms_datepicker != 'undefined') { 206 properties = wpforms_datepicker; 207 } else { 208 properties = { 209 disableMobile: true 210 } 211 } 212 element.flatpickr(properties) 213 }); 214 }; 215 }, 216 217 /** 218 * Load jQuery Time Picker. 219 * 220 * @since 1.2.3 221 */ 222 loadTimePicker: function() { 223 224 // Only load if jQuery timepicker library exists 225 if (typeof $.fn.timepicker !== 'undefined') { 226 $('.wpforms-timepicker').each(function() { 227 var element = $(this), 228 form = element.closest('.wpforms-form'), 229 formID = form.data('formid'), 230 fieldID = element.closest('.wpforms-field').data('field-id'); 231 232 if (typeof window['wpforms_'+formID+'_'+fieldID] != 'undefined' && window['wpforms_'+formID+'_'+fieldID].hasOwnProperty('timepicker')) { 233 properties = window['wpforms_'+formID+'_'+fieldID].timepicker; 234 } else if (typeof window['wpforms_'+formID] != "undefined" && window['wpforms_'+formID].hasOwnProperty('timepicker') ) { 235 properties = window['wpforms_'+formID].timepicker; 236 } else if ( typeof wpforms_timepicker != "undefined") { 237 properties = wpforms_timepicker; 238 } else { 239 properties = { 240 scrollDefault: 'now', 241 forceRoundTime: true 242 } 243 } 244 element.timepicker(properties); 245 }); 246 } 247 }, 248 249 /** 250 * Load jQuery input masks. 251 * 252 * @since 1.2.3 253 */ 254 loadInputMask: function() { 255 256 // Only load if jQuery input mask library exists 257 if (typeof $.fn.inputmask !== 'undefined') { 258 $('.wpforms-masked-input').inputmask(); 259 }; 260 }, 261 262 /** 263 * Payments: Do various payment-related tasks on load. 264 * 265 * @since 1.2.6 266 */ 267 loadPayments: function() { 268 269 // Update Total field(s) with latest calculation 270 $('.wpforms-payment-total').each(function(index, el) { 271 WPForms.amountTotal(this); 272 }) 273 274 // Credit card valdation 275 if(typeof $.fn.payment !== 'undefined') { 276 $('.wpforms-field-credit-card-cardnumber').payment('formatCardNumber'); 277 $('.wpforms-field-credit-card-cardcvc').payment('formatCardCVC'); 278 }; 279 }, 280 281 //--------------------------------------------------------------------// 282 // Binds 283 //--------------------------------------------------------------------// 284 285 /** 286 * Element bindings. 287 * 288 * @since 1.2.3 289 */ 290 bindUIActions: function() { 291 292 // Pagebreak navigation 293 $(document).on('click', '.wpforms-page-button', function(event) { 294 event.preventDefault(); 295 WPForms.pagebreakNav($(this)); 296 }); 297 298 // Payments: Update Total field(s) when latest calculation. 299 $(document).on('change input', '.wpforms-payment-price', function(event) { 300 WPForms.amountTotal(this, true); 301 }); 302 303 // Payments: Restrict user input payment fields 304 $(document).on('input', '.wpforms-payment-user-input', function(event) { 305 var $this = $(this), 306 amount = $this.val(); 307 $this.val(amount.replace(/[^0-9.,]/g, '')); 308 }); 309 310 // Payments: Sanitize/format user input amounts 311 $(document).on('focusout', '.wpforms-payment-user-input', function(event) { 312 var $this = $(this), 313 amount = $this.val(), 314 sanitized = WPForms.amountSanitize(amount), 315 formatted = WPForms.amountFormat(sanitized); 316 $this.val(formatted); 317 }); 318 319 // OptinMonster: initialize again after OM is finished. 320 // This is to accomodate moving the form in the DOM. 321 $(document).on('OptinMonsterAfterInject', function(event) { 322 WPForms.ready(); 323 }); 324 }, 325 326 /** 327 * Update Pagebreak navigation. 328 * 329 * @since 1.2.2 330 */ 331 pagebreakNav: function(el) { 332 333 var $this = $(el), 334 valid = true, 335 action = $this.data('action'), 336 page = $this.data('page'), 337 page2 = page; 338 next = page+1, 339 prev = page-1, 340 formID = $this.data('formid'), 341 $form = $this.closest('.wpforms-form'), 342 $page = $form.find('.wpforms-page-'+page), 343 $submit = $form.find('.wpforms-submit-container'), 344 $indicator = $form.find('.wpforms-page-indicator'), 345 $reCAPTCHA = $form.find('.wpforms-recaptcha-container'), 346 pageScroll = false;
347 348 // Page scroll 349 if ( window.wpforms_pageScroll === false ) { 350 pageScroll = false; 351 } else if ( !WPForms.empty( window.wpform_pageScroll ) ) { 352 pageScroll = window.wpform_pageScroll; 353 } else { 354 pageScroll = 75; 355 } 356 357 // Toggling between pages 358 if ( action == 'next' ){ 359 // Validate 360 if (typeof $.fn.validate !== 'undefined') { 361 $page.find('input.wpforms-field-required, select.wpforms-field-required, textarea.wpforms-field-required, .wpforms-field-required input').each(function(index, el) { 362 var field = $(el); 363 if ( field.valid() ) { 364 } else { 365 valid = false; 366 } 367 }); 368 // Scroll to first/top error on page 369 var $topError = $page.find('.wpforms-error').first(); 370 if ($topError.length) { 371 $('html, body').animate({ 372 scrollTop: $topError.offset().top-75 373 }, 750, function() { 374 $topError.focus(); 375 }); 376 } 377 } 378 // Move to next page 379 if (valid) { 380 page2 = next; 381 $page.hide(); 382 var $nextPage = $form.find('.wpforms-page-'+next); 383 $nextPage.show(); 384 if ( $nextPage.hasClass('last') ) { 385 $reCAPTCHA.show(); 386 $submit.show(); 387 } 388 if ( pageScroll ) { 389 // Scroll to top of the form 390 $('html, body').animate({ 391 scrollTop: $form.offset().top-pageScroll 392 }, 1000); 393 } 394 $this.trigger('wpformsPageChange', [ page2, $form ] ); 395 } 396 } else if ( action == 'prev' ) { 397 // Move to prev page 398 page2 = prev; 399 $page.hide(); 400 $form.find('.wpforms-page-'+prev).show(); 401 $reCAPTCHA.hide(); 402 $submit.hide(); 403 if ( pageScroll ) { 404 // Scroll to top of the form 405 $('html, body').animate({ 406 scrollTop: $form.offset().top-pageScroll 407 }, 1000); 408 } 409 $this.trigger('wpformsPageChange', [ page2, $form ] ); 410 } 411 412 if ( $indicator ) { 413 var theme = $indicator.data('indicator'), 414 color = $indicator.data('indicator-color'); 415 if ('connector' === theme || 'circles' === theme) { 416 $indicator.find('.wpforms-page-indicator-page').removeClass('active'); 417 $indicator.find('.wpforms-page-indicator-page-'+page2).addClass('active'); 418 $indicator.find('.wpforms-page-indicator-page-number').removeAttr('style'); 419 $indicator.find('.active .wpforms-page-indicator-page-number').css('background-color', color); 420 if ( 'connector' == theme) { 421 $indicator.find('.wpforms-page-indicator-page-triangle').removeAttr('style'); 422 $indicator.find('.active .wpforms-page-indicator-page-triangle').css('border-top-color', color); 423 } 424 } else if ('progress' === theme) { 425 var $pageTitle = $indicator.find('.wpforms-page-indicator-page-title'), 426 $pageSep = $indicator.find('.wpforms-page-indicator-page-title-sep'), 427 totalPages = ($('.wpforms-page').length), 428 width = (page2/totalPages)*100; 429 $indicator.find('.wpforms-page-indicator-page-progress').css('width', width+'%'); 430 $indicator.find('.wpforms-page-indicator-steps-current').text(page2); 431 if ($pageTitle.data('page-'+page2+'-title')) { 432 $pageTitle.css('display','inline').text($pageTitle.data('page-'+page2+'-title')); 433 $pageSep.css('display','inline'); 434 } else { 435 $pageTitle.css('display','none'); 436 $pageSep.css('display','none'); 437 } 438 } 439 } 440 }, 441 442 //--------------------------------------------------------------------// 443 // Other functions 444 //--------------------------------------------------------------------// 445 446 /** 447 * Payments: Calculate total. 448 * 449 * @since 1.2.3 450 */ 451 amountTotal: function(el, validate) { 452 453 var validate = validate || false, 454 $form = $(el).closest('.wpforms-form'), 455 total = 0, 456 totalFormatted = 0, 457 totalFormattedSymbol = 0, 458 currency = WPForms.getCurrency(); 459 460 $('.wpforms-payment-price').each(function(index, el) { 461 462 var amount = 0, 463 $this = $(this); 464 465 if ($this.attr('type') === 'text' || $this.attr('type') === 'hidden' ) { 466 amount = $this.val(); 467 } else if ($this.attr('type') === 'radio' && $this.is(':checked')) { 468 amount = $this.data('amount'); 469 } else if ($this.is('select') && $this.find('option:selected').length > 0) { 470 amount = $this.find('option:selected').data('amount'); 471 } 472 if (!WPForms.empty(amount)) { 473 amount = WPForms.amountSanitize(amount); 474 total = Number(total)+Number(amount); 475 } 476 }); 477 478 totalFormatted = WPForms.amountFormat(total); 479 480 if ( 'left' == currency.symbol_pos) { 481 totalFormattedSymbol = currency.symbol+' '+totalFormatted; 482 } else { 483 totalFormattedSymbol = totalFormatted+' '+currency.symbol; 484 } 485 486 $form.find('.wpforms-payment-total').each(function(index, el) { 487 if ( 'hidden' === $(this).attr('type') || 'text' === $(this).attr('type') ) { 488 $(this).val(totalFormattedSymbol); 489 if ( 'text' === $(this).attr('type') && validate ) {
490 $(this).valid(); 491 } 492 } else { 493 $(this).text(totalFormattedSymbol); 494 } 495 }); 496 }, 497 498 /** 499 * Sanitize amount and convert to standard format for calculations. 500 * 501 * @since 1.2.6 502 */ 503 amountSanitize: function(amount) { 504 505 var currency = WPForms.getCurrency(); 506 507 amount = amount.toString().replace(/[^0-9.,]/g,''); 508 509 if ( currency.decimal_sep == ',' && ( amount.indexOf(currency.decimal_sep) !== -1 ) ) { 510 if ( currency.thousands_sep == '.' && amount.indexOf(currency.thousands_sep) !== -1 ) {; 511 amount = amount.replace(currency.thousands_sep,''); 512 } else if( currency.thousands_sep == '' && amount.indexOf('.') !== -1 ) { 513 amount = amount.replace('.',''); 514 } 515 amount = amount.replace(currency.decimal_sep,'.'); 516 } else if ( currency.thousands_sep == ',' && ( amount.indexOf(currency.thousands_sep) !== -1 ) ) { 517 amount = amount.replace(currency.thousands_sep,''); 518 } 519 520 return WPForms.numberFormat( amount, 2, '.', '' ); 521 }, 522 523 /** 524 * Format amount. 525 * 526 * @since 1.2.6 527 */ 528 amountFormat: function(amount) { 529 530 var currency = WPForms.getCurrency(); 531 532 amount = String(amount); 533 534 // Format the amount 535 if ( currency.decimal_sep == ',' && ( amount.indexOf(currency.decimal_sep) !== -1 ) ) { 536 var sepFound = amount.indexOf(currency.decimal_sep); 537 whole = amount.substr(0, sepFound); 538 part = amount.substr(sepFound+1, amount.strlen-1); 539 amount = whole + '.' + part; 540 } 541 542 // Strip , from the amount (if set as the thousands separator) 543 if ( currency.thousands_sep == ',' && ( amount.indexOf(currency.thousands_sep) !== -1 ) ) { 544 amount = amount.replace(',',''); 545 } 546 547 if ( WPForms.empty( amount ) ) { 548 amount = 0; 549 } 550 551 return WPForms.numberFormat( amount, 2, currency.decimal_sep, currency.thousands_sep ); 552 }, 553 554 /** 555 * Get site currency settings. 556 * 557 * @since 1.2.6 558 */ 559 getCurrency: function() { 560 561 var currency = { 562 code: 'USD', 563 thousands_sep: ',', 564 decimal_sep: '.', 565 symbol: '$', 566 symbol_pos: 'left' 567 } 568 569 // Backwards compatibility. 570 if ( typeof wpforms_settings.currency_code !== 'undefined' ) { 571 currency.code = wpforms_settings.currency_code; 572 } 573 if ( typeof wpforms_settings.currency_thousands !== 'undefined' ) { 574 currency.thousands_sep = wpforms_settings.currency_thousands; 575 } 576 if ( typeof wpforms_settings.currency_decimal !== 'undefined' ) { 577 currency.decimal_sep = wpforms_settings.currency_decimal; 578 } 579 if ( typeof wpforms_settings.currency_symbol !== 'undefined' ) { 580 currency.symbol = wpforms_settings.currency_symbol; 581 } 582 if ( typeof wpforms_settings.currency_symbol_pos !== 'undefined' ) { 583 currency.symbol_pos = wpforms_settings.currency_symbol_pos; 584 } 585 586 return currency; 587 }, 588 589 /** 590 * Format number. 591 * 592 * @link http://locutus.io/php/number_format/ 593 * @since 1.2.6 594 */ 595 numberFormat: function (number, decimals, decimalSep, thousandsSep) { 596 597 number = (number + '').replace(/[^0-9+\-Ee.]/g, '') 598 var n = !isFinite(+number) ? 0 : +number 599 var prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) 600 var sep = (typeof thousandsSep === 'undefined') ? ',' : thousandsSep 601 var dec = (typeof decimalSep === 'undefined') ? '.' : decimalSep 602 var s = '' 603 604 var toFixedFix = function (n, prec) { 605 var k = Math.pow(10, prec) 606 return '' + (Math.round(n * k) / k).toFixed(prec) 607 } 608 609 // @todo: for IE parseFloat(0.55).toFixed(0) = 0; 610 s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.') 611 if (s[0].length > 3) { 612 s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep) 613 } 614 if ((s[1] || '').length < prec) { 615 s[1] = s[1] || '' 616 s[1] += new Array(prec - s[1].length + 1).join('0') 617 } 618 619 return s.join(dec) 620 }, 621 622 /** 623 * Empty check similar to PHP. 624 * 625 * @link http://locutus.io/php/empty/ 626 * @since 1.2.6 627 */ 628 empty: function(mixedVar) { 629 630 var undef 631 var key 632 var i 633 var len 634 var emptyValues = [undef, null, false, 0, '', '0'] 635 636 for (i = 0, len = emptyValues.length; i < len; i++) { 637 if (mixedVar === emptyValues[i]) { 638 return true 639 } 640 } 641 642 if (typeof mixedVar === 'object') { 643 for (key in mixedVar) { 644 if (mixedVar.hasOwnProperty(key)) { 645 return false 646 } 647 } 648 return true 649 } 650 651 return false 652 }, 653 654 /** 655 * Set cookie container user UUID. 656 * 657 * @since 1.3.3 658 */ 659 setUserIndentifier: function() { 660 661 if ( ! WPForms.getCookie('_wpfuuid') ) { 662 663 // Generate UUID - http://stackoverflow.com/a/873856/1489528 664 var s = new Array(36), 665 hexDigits = '0123456789abcdef', 666 uuid; 667 668 for (var i = 0; i < 36; i++) { 669 s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); 670 }
671 s[14] = "4"; 672 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); 673 s[8] = s[13] = s[18] = s[23] = '-'; 674 675 uuid = s.join(""); 676 677 WPForms.createCookie('_wpfuuid', uuid, 3999); 678 } 679 }, 680 681 /** 682 * Create cookie. 683 * 684 * @since 1.3.3 685 */ 686 createCookie: function(name, value, days) { 687 688 // If we have a days value, set it in the expiry of the cookie. 689 if ( days ) { 690 // If -1 is our value, set a session based cookie instead of a persistent cookie. 691 if ( '-1' == days ) { 692 var expires = ''; 693 } else { 694 var date = new Date(); 695 date.setTime(date.getTime() + (days*24*60*60*1000)); 696 var expires = '; expires=' + date.toGMTString(); 697 } 698 } else { 699 var expires = '; expires=Thu, 01 Jan 1970 00:00:01 GMT'; 700 } 701 702 // Write the cookie. 703 document.cookie = name + '=' + value + expires + '; path=/'; 704 }, 705 706 /** 707 * Retrieve cookie. 708 * 709 * @since 1.3.3 710 */ 711 getCookie: function(name) { 712 713 var nameEQ = name + '=', 714 ca = document.cookie.split(';'); 715 716 for ( var i = 0; i < ca.length; i++ ) { 717 var c = ca[i]; 718 while ( c.charAt(0) == ' ' ) { 719 c = c.substring(1, c.length); 720 } 721 if ( c.indexOf(nameEQ) == 0 ) { 722 return c.substring(nameEQ.length, c.length); 723 } 724 } 725 726 return null; 727 }, 728 729 /** 730 * Delete cookie. 731 */ 732 removeCookie: function(name) { 733 734 WPForms.createCookie(name, '',-1); 735 } 736 } 737 738 WPForms.init(); 739 740 window.wpforms = WPForms; 741 742})(jQuery);
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.