1/* NOTIFY START */ 2(function($) { 3 4 var Notify = function(element, options) { 5 6 this.$element = $(element); 7 this.options = $.extend(false, $.fn.notify.defaults, options); 8 9 if(this.options.closePrevious) { 10 11 this.$element.children().each(function() { 12 $(this).data('notify').close(); 13 }); 14 15 } else if(this.$element.children().length >= this.options.maxNotes) { 16 this.$element.children().first().data('notify').close(); 17 } 18 19 this.$note = $('<div />', { 20 'class': 'rchr-notify-'+this.options.type+' '+this.options.types[this.options.type] 21 }).append('<div class="rchr-notify-message-overlay"></div>').append('<p>'+this.options.text+'</p>'); 22 23 if(this.options.closeAble) { 24 $('<a class="rchr-notify-close" />').appendTo(this.$note).on('click', $.proxy(this.close, this)); 25 } 26 27 this.$note.data('notify', this).appendTo(this.$element); 28 29 if(this.options.modal) { 30 $('.rchr-notify-overlay').fadeIn(400); 31 } 32 33 this.show(); 34 35 }; 36 37 Notify.onClose = function() { 38 39 this.options.onClose(); 40 this.$note.remove(); 41 42 if(this.options.modal) { 43 $('.rchr-notify-overlay').fadeOut(400); 44 } 45 }; 46 47 Notify.prototype = { 48 show: function() { 49 50 var self = this; 51 52 if(window.oldIE) { 53 self.$note.show(); 54 if(!self.options.permanent) { 55 setTimeout(function() { self.close(); }, self.options.time); 56 } 57 58 self.options.onShow.call(self); 59 } else { 60 61 self.$note.slideDown(400, function() { 62 63 if(!self.options.permanent) { 64 setTimeout(function() { self.close(); }, self.options.time); 65 } 66 67 self.options.onShow.call(self); 68 69 }); 70 } 71 72 }, 73 74 close: function() { 75 if(window.oldIE) { 76 this.$note.hide(); 77 } else { 78 this.$note.slideUp(400, $.proxy(Notify.onClose, this)); 79 } 80 } 81 }; 82 83 $.fn.notify = function(options) { 84 return this.each(function() { new Notify(this, options); }); 85 }; 86 87 $.fn.notify.defaults = { 88 text: '', 89 type: 'notice', 90 types: { 91 notice: '', 92 success: '', 93 warning: '', 94 error: '' 95 }, 96 time: 10000, 97 maxNotes: 5, 98 modal: false, 99 permanent: false, 100 closeAble: true, 101 closePrevious: false, 102 onShow: function() {}, 103 onClose: function() {}, 104 target: 'body' 105 }; 106 107 $.notify = { 108 setup: function(options) { 109 110 options = $.extend(false, $.fn.notify.defaults, options); 111 if(!this.notifyContainer) {
112 this.notifyContainer = $('<div></div>').addClass('rchr-notify-top rchr-notify').prependTo(options.target) 113 } 114 }, 115 116 show: function(options) { 117 options = $.extend(false, $.fn.notify.defaults, options); 118 this.notifyContainer.notify(options); 119 120 }, 121 122 showSuccess: function(text) { 123 124 this.show({ 125 text: text, 126 type: 'success' 127 }); 128 129 }, 130 131 showNotice: function(text) { 132 133 this.show({ 134 text: text, 135 type: 'notice' 136 }); 137 138 }, 139 140 showWarning: function(text) { 141 142 this.show({ 143 text: text, 144 type: 'warning' 145 }); 146 147 }, 148 149 showError: function(text) { 150 151 this.show({ 152 text: text, 153 type: 'error' 154 }); 155 156 }, 157 158 checkMessages: function(xhr) { 159 160 try { 161 if(xhr != null) { 162 163 var notifyJson = xhr.getResponseHeader('Notify-Messages'); 164 165 if(notifyJson != null) { 166 $.each($.parseJSON(notifyJson), function(i, params) { $.notify.show(params) }); 167 } 168 169 } else { 170 171 var notifyMsgs = $('.rchr-notify-messages').data('messages'); 172 173 if(typeof notifyMsgs != 'undefined') { 174 $.each(notifyMsgs, function(i, params) { $.notify.show(params) }); 175 } 176 177 } 178 179 } catch(e) {} 180 181 } 182 183 }; 184 185})(window.jQuery); 186 187jQuery( document ).ready( function( $ ) { 188 jQuery.notify.setup(); 189 190 jQuery.notify.checkMessages(); 191}) 192/* NOTIFY END */ 193 194/* RCHR ONE CLICK REGISTRATION START */ 195jQuery.fn.serializeObject = function() { 196 var o = {}; 197 var a = this.serializeArray(); 198 jQuery.each( a, function() { 199 if ( o[this.name] !== undefined ) { 200 if ( ! o[this.name].push ) { 201 o[this.name] = [o[this.name]]; 202 } 203 o[this.name].push(this.value || ''); 204 } else { 205 o[this.name] = this.value || ''; 206 } 207 }); 208 return o; 209}; 210 211function findAncestorByTagName (el, elType) { 212 elType = elType.toUpperCase(); 213 while (el.tagName != elType) { 214 el = el.parentElement; 215 } 216 return el; 217} 218 219var validateDomain = function( domainName ) { 220 221 var rs = {}, 222 re = /^([A-Za-z0-9])+[A-Za-z0-9-]*([A-Za-z0-9]){2,63}$/; 223 224 if ( domainName.length < 1 ) { 225 226 rs = { 227 hasError: true, 228 cssclass: 'has-error', 229 msg: errorMsg.domainNameEmpty 230 }; 231 232 } else if ( domainName.length < 3 || domainName.length > 63 ) { 233 234 rs = { 235 hasError: true, 236 cssclass: 'has-error', 237 msg: errorMsg.domainNameTooShort 238 }; 239 240 } else if ( domainName[0] === '-' || domainName[domainName.length - 1] === '-' ) { 241 242 rs = { 243 hasError: true, 244 cssclass: 'has-error', 245 msg: errorMsg.domainNameWithHyphen 246 }; 247 248 } else if ( re.test( domainName ) === false ) { 249 250 rs = { 251 hasError: true, 252 cssclass: 'has-error', 253 msg: errorMsg.domainNameInvalidChars 254 }; 255 256 } else { 257 258 rs = { 259 hasError: false, 260 cssclass: 'has-success', 261 msg: null 262 }; 263 264 } 265 266 return rs; 267}; 268 269function onloadCallback() { 270 if(document.getElementById('rchp-one-click-registration-submit')) { 271 var captcha = grecaptcha.render('rchp-one-click-registration-submit', { 272 273 'sitekey' : reCaptcha.siteKey, 274 'callback' : function(token) { 275 276 var loadingEl = document.getElementById('loading-element'); 277 278 loadingEl.style.display = 'block'; 279 280 window.quickSearch( 281 { 282 'action': 'rchr_one_click_registration', 283 'step': 'checkrecaptchaguess', 284 'userGuess': token, 285 286 }, 287 function( data ) { 288 289 var rs = JSON.parse( data ); 290 var errorsWrapper = document.getElementsByClassName('registration-msg')[0]; 291 292 loadingEl.style.display = 'none'; 293 294 successInput = document.createElement('input'); 295 successInput.setAttribute( 'type', 'hidden' );
296 successInput.setAttribute( 'name', 'reCaptchaResult' ); 297 successInput.setAttribute( 'value', 1 ); 298 299 var wrapObj = document.getElementsByClassName( 'register-wrapper' )[0]; 300 wrapObj.appendChild( successInput ); 301 302 jQuery(findAncestorByTagName(wrapObj, 'form')).trigger('submit'); 303 } 304 ); 305 306 } 307 } ); 308 } 309}; 310 311window.quickSearch = ( function() { 312 313 var timer = 0, 314 oldParams = '', 315 xhr = null; 316 317 return function ( params, callback ) { 318 319 if ( params == oldParams ) { 320 return; 321 } else { 322 oldParams = params; 323 } 324 325 clearTimeout( timer ); 326 327 timer = setTimeout( function() { 328 329 xhr = jQuery.ajax({ 330 type: 'POST', 331 url: ajax_object.handler_url, 332 data: params, 333 async: true, 334 success: function( rs ) { 335 callback( rs ); 336 return; 337 } 338 }); 339 340 }, 200); 341 342 }; 343 344})(); 345 346jQuery( document ).ready( function( $ ) { 347 348 // Reset form fields 349 if( $( '.rchr-one-click-registration-form form').length > 0 ) { 350 351 $( '.rchr-one-click-registration-form form')[0].reset(); 352 $( '#rchr-one-click-domain').val(''); 353 354 } 355 356 $( '.rchr-one-click-check-domain input' ).on( 'keyup', function() { 357 358 var $input, $errors, target, rs; 359 360 $input = $( this ); 361 $errors = $( '.rchr-one-click-check-domain').find( '.domain-msg' ); 362 target = $input.parent('.input-group'); 363 364 // Validate user input for domain name 365 rs = validateDomain( $input.val() ); 366 367 $errors.removeClass('error').text( '' ); 368 target.removeClass('has-error').removeClass('has-success').addClass(rs.cssclass); 369 370 if ( typeof rs.msg === 'string' ) { 371 $errors.addClass('error').text( rs.msg ); 372 } 373 374 } ); 375 376 $( '#rchr-one-click-domain, .rchr-one-click-registration-form input' ).on( 'keypress', function(e) { 377 378 if ( e.keyCode === 13 ) { 379 $( this ).parent().parent().find( 'button' ).trigger( 'click' ); 380 } 381 382 } ); 383 384 $( '#rchr-one-click-check-availability' ).on( 'click', function(e) { 385 386 e.preventDefault(); 387 388 var $checkDomainBtn = $( this ), 389 $usrDomainWrapper = $checkDomainBtn.closest('div'), 390 $inputGroup = $usrDomainWrapper.find('.input-group'), 391 usrDomainInput = $usrDomainWrapper.find('#rchr-one-click-domain').val(), 392 $loading = $usrDomainWrapper.find('.loading'), 393 $errorHolder = $usrDomainWrapper.find('.domain-msg'), 394 rs, idString, objToSend = {}; 395 396 $errorHolder.text(''); 397 398 // check if user input can be a valid domain 399 rs = validateDomain( usrDomainInput ); 400 401 // Check if hasError make an ajax request to handle the messages properly 402 if ( !rs.hasError ) { 403 404 objToSend.step = 'checkdomainavailability'; 405 objToSend.action = 'rchr_one_click_registration'; 406 objToSend.domainName = usrDomainInput; 407 408 $checkDomainBtn.hide(); 409 $loading.show(); 410 411 // make ajax request to check if the domain is available 412 window.quickSearch( objToSend, function( rs ) { 413 414 var response = JSON.parse( rs ); 415 416 if( 1 === parseInt( response.error ) ) { 417 418 // display error in the specified error span provided 419 $errorHolder.addClass('error').text( response.msg ); 420 $inputGroup.removeClass('has-success').addClass('has-error'); 421 422 } else { 423 424 $( '.rchr-one-click-registration-form form' ).data('domainName', usrDomainInput); 425 426 // display message in the specified span provided 427 $( '.rchr-one-click-registration-form h1' ).text( response.msg ); 428 429 idString = $usrDomainWrapper.attr( 'id').replace( 'domain-search', 'registration' ); 430 431 $usrDomainWrapper.hide( 'slow' ); 432 433 $( '.rchr-one-click-registration' ).show( 'slow', function() { 434 //jQuery('html,body').animate({ 435 // scrollTop: jQuery( '.et_pb_slide_description' ).offset().top 436 //}, 600); 437 }); 438 439 } 440 441 $loading.hide(); 442 $checkDomainBtn.show(); 443 444 } ); 445 446 } else { 447 448 // display domain validation error 449 $errorHolder.addClass('error').text( rs.msg ); 450 451 } 452 453 $( '#check-another-domain').on( 'click', function(e) { 454 455 e.preventDefault(); 456 457 $( '.rchr-one-click-registration' ).hide( 'slow' ); 458 $usrDomainWrapper.show( 'slow' ); 459 460 } ); 461 462 } ); 463 464 $( '.rchr-one-click-registration-form form input' ).on( 'keyup', function() { 465 466 var $self = $(this), 467 rs, 468 $errors = $( '.rchr-one-click-registration-form .registration-msg'), 469 $regForm = $('.rchr-one-click-registration-form form'), 470 inputType = $self.attr( 'name' ), 471 nameTimer = 0, 472 emailTimer = 0, 473 passwordTimer = 0; 474 475 $self.closest('.input-group').removeClass('rchr-shake'); 476 477 switch ( inputType ) { 478 479 case 'name': 480 481 var name = $.trim( $self.val() ), 482 nameRgx = /^([A-Za-z]+([- ]?[A-Za-z])*){4,32}$/; 483 484 485 if ( 4 < name.length && 0 <= name.indexOf( ' ' ) ) { 486 487 rs = { 488 cssclass: 'has-success', 489 msg: null 490 }; 491 492 if( name.match( nameRgx ) ) { 493 494 rs = { 495 cssclass: 'has-success', 496 msg: null 497 }; 498 499 } else { 500 rs = { 501 cssclass: 'has-error', 502 msg: errorMsg.nameInvalidChars 503 }; 504 505 } 506 507 } else { 508 rs = { 509 cssclass: 'has-error', 510 msg: errorMsg.nameTooShort 511 }; 512 513 } 514 515 break; 516 517 case 'email': 518 519 var re = /^([a-zA-Z0-9]+(([.])|([-])|([_]{0,2}))?)+[a-zA-Z0-9]*@(([a-zA-Z0-9]+([\-])?)+([a-zA-Z0-9]+)(\.)+){1,3}[a-zA-Z]{2,10}/; 520 521 if ( re.test( $self.val() ) ) { 522 523 rs = { 524 cssclass: 'has-success', 525 msg: null 526 527 }; 528 529 } else { 530 rs = { 531 cssclass: 'has-error',
532 msg: errorMsg.invalidEmail 533 534 }; 535 536 } 537 538 break; 539 540 case 'password': 541 542 var password = $self.val(); 543 544 if(password.length < 1) { 545 546 rs = { 547 cssclass: 'has-error', 548 msg: errorMsg.noPass 549 550 }; 551 552 break; 553 554 } 555 556 var strong_regex = /^(?=.{10,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[_!@#%&\/(){}[\]=?+*^~\-.:,;]).*$/g; 557 var medium_regex = /^(?=.{9,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$/g; 558 var valid_regex = /^[A-Za-z0-9_!@#%&\/(){}[\]=?+*^~\-.:,;]{8,32}$/; 559 var valid_characters = /^[A-Za-z0-9_!@#%&\/(){}[\]=?+*^~\-.:,;]*$/; 560 561 if ( ! password.match( valid_characters ) ) { 562 563 rs = { 564 cssclass: 'has-error', 565 msg: errorMsg.invalidPass 566 567 }; 568 break; 569 570 } 571 572 if ( ! password.match( /\d/g ) ) { 573 rs = { 574 cssclass: 'has-error', 575 msg: errorMsg.passNeedsNum 576 577 }; 578 break; 579 } 580 581 if ( ! password.match( /[a-z]/ig ) ) { 582 rs = { 583 cssclass: 'has-error', 584 msg: errorMsg.passNeedsLetter 585 586 }; 587 break; 588 } 589 590 if ( password.length < 8 ) { 591 rs = { 592 cssclass: 'has-error', 593 msg: errorMsg.passTooShort 594 595 }; 596 break; 597 } 598 599 if ( password.length > 32 ) { 600 rs = { 601 cssclass: 'has-error', 602 msg: errorMsg.passTooLong 603 604 }; 605 break; 606 } 607 608 609 if ( password.match( strong_regex ) ) { 610 rs = { 611 cssclass: 'has-success', 612 msg: null 613 614 }; 615 break; 616 } 617 618 if ( password.match( medium_regex ) ) { 619 rs = { 620 cssclass: 'has-success', 621 msg: null 622 623 }; 624 break; 625 } 626 627 if ( password.match( valid_regex ) ) { 628 629 rs = { 630 cssclass: 'has-success', 631 msg: null 632 633 }; 634 break; 635 } 636 637 rs = { 638 cssclass: 'has-error', 639 msg: errorMsg.invalidPass 640 641 }; 642 break; 643 644 } 645 646 var target = $self.parent('.input-group'); 647 648 $errors.removeClass('error').text( '' ); 649 target.removeClass('has-error').removeClass('has-success').addClass(rs.cssclass); 650 $regForm.find('#err-msg-' + inputType).text( '' ); 651 652 if ( rs.cssclass === 'has-error' && typeof rs.msg === 'string' ) { 653 $regForm.find('#err-msg-' + inputType).text(rs.msg); 654 } 655 656 657 } ); 658 659 $( '.rchr-one-click-registration-form form' ).on( 'submit', function( e ) { 660 661 e.preventDefault(); 662 663 var $form = $( this ); 664 665 // check for empty fields 666 $form.find('.input-group').map( function(){ 667 668 if( ! Boolean( $(this).children('input').val() ) ) { 669 $(this).addClass('has-error'); 670 $(this).find( '.rchr-msg-wrappers').text( errorMsg.fillField ); 671 } 672 673 }); 674
675 var $inputsWithErrors = $form.find('.input-group').filter('.has-error'); 676 $inputsWithErrors.map(function() { 677 return $(this).removeClass('rchr-shake'); 678 }); 679 680 var $register_loader = $( '#loading-element' ); 681 var $errors = $( '.rchr-one-click-registration-form .registration-msg'); 682 var $register_btn_wrapper = $( '.register-button-box .register-wrapper' ); 683 var $checkAnotherDomain = $form.find( '#check-another-domain' ); 684 685 // Check if the google reCaptcha site key is entered 686 if ( reCaptcha.isSiteKeyAvailable && reCaptcha.isSiteSecretAvailable ) { 687 688 if ( $( 'input[name=reCaptchaResult]').length === 0 ) { 689 $errors.addClass('error').text( errorMsg.reCaptchaNotSolved ); 690 return; 691 } 692 693 } 694 695 // Check whether there are any errors in the input fields to prevent 696 // unnecessary server calls 697 if( $inputsWithErrors.length > 0 ) { 698 $.each($inputsWithErrors, function() { $(this).addClass('rchr-shake').width(); }); 699 grecaptcha.reset(); 700 return; 701 } 702 703 $errors.removeClass('error').text( '' ); 704 705 var data = $form.serializeObject(); 706 707 $register_loader.show(); 708 $register_btn_wrapper.hide(); 709 if ( $checkAnotherDomain !== undefined ) { 710 $checkAnotherDomain.hide(); 711 } 712 713 data.step = 'registerfreeclient'; 714 715 data.action = 'rchr_one_click_registration'; 716 717 data.domainName = $form.data('domainName'); 718 719 window.quickSearch( data, function( rs ) { 720 721 var response = JSON.parse( rs ); 722 723 if( 1 === parseInt( response.error ) ) { 724 725 $errors.addClass('error').text( response.msg ).show(); 726 727 $register_loader.hide(); 728 $register_btn_wrapper.show(); 729 730 if ( $checkAnotherDomain !== undefined ) { 731 $checkAnotherDomain.show(); 732 } 733 grecaptcha.reset(); 734 735 } else { 736 737 // clear form fields 738 $form[0].reset(); 739 $( '#rchr-one-click-domain').val(''); 740 741 $( '.rchr-one-click-registration-form' ).parent().html( response.data ); 742 743 $( 'button.rchr-one-click-registration-resend-mail' ).on( 'click', function( e ) { 744 745 e.preventDefault(); 746 747 var $btn = $( this ); 748 var $resend_loader = $( '.rchr-one-click-registration-success .loading' ); 749 var $resend_status = $( '.rchr-one-click-registration-success .status' ); 750 751 var client_id = $(this).parent().data( 'client-id' ); 752 753 var data = { 754 action: 'rchr_one_click_registration', 755 step: 'resendactivation', 756 client_id: client_id 757 } 758 759 $btn.hide(); 760 $resend_loader.show(); 761 $resend_status.hide(); 762 763 window.quickSearch( data, function( rs ) { 764 765 var result = JSON.parse( rs ); 766 $btn.show(); 767 $resend_loader.hide(); 768 $resend_status.html( result.msg ); 769 $resend_status.show(); 770 }); 771 772 773 } ); 774 775 } 776 777 } ); 778 779 } ); 780 781} ); 782 783/* RCHR ONE CLICK REGISTRATION END */ 784 785/* FB LOGIN BUTTON START */ 786// window.fbAsyncInit = function() { 787// var $buttons = jQuery('.rchr-fb-login-button').prop('disabled', true).addClass('rchr-login-button-loading'); 788// FB.init({ 789// appId: FBAppData.appId, 790// version: 'v2.9' 791// }); 792// FB.getLoginStatus(function(response){ 793// $buttons.removeAttr('disabled').removeClass('rchr-login-button-loading') 794// }); 795// } 796 797// jQuery(document).on('click', '.rchr-fb-login-button', function(e) { 798// e.preventDefault(); 799// var $button = jQuery(this); 800// try { 801// FB.login(function(response) { 802// if(response.authResponse) { 803// $button.prop('disabled', true).addClass('rchr-login-button-loading'); 804// var $form = jQuery('<form method="POST" action="'+FBAppData.authUrl+'">'+ 805// '<input type="hidden" name="rchr_social_network_access_token" value="'+response.authResponse.accessToken+'">'+ 806// '<input type="hidden" name="rchr_social_network_type" value="fb">'+ 807// '<input type="hidden" name="action" value="rchr_one_click_registration">'+ 808// '<input type="hidden" name="step" value="registerfreeclientsocial">'+ 809// '</form>'); 810// $form.appendTo('body'); 811// jQuery.ajax({ 812// url: $form.attr('action'), 813// dataType: 'html', 814// type: $form.attr('method'), 815// data: $form.serialize(), 816// success: function(json) { 817// try { 818// json = JSON.parse(json); 819// if(json.error) { 820// jQuery.notify.showError(json.msg) 821// } else { 822// jQuery.notify.showSuccess(json.msg); 823// window.location.href = json.redirect; 824// } 825// } catch(e) { 826// jQuery.notify.showError('Network Error'); 827// } 828// }, 829// complete: function() { $button.removeAttr('disabled').removeClass('rchr-login-button-loading') } 830// }); 831// $form.remove(); 832// } 833// }, 834// {scope: 'email,public_profile'} 835// ); 836// } catch (err) { 837// jQuery.notify.showError(err) 838// } 839// }); 840/* FB LOGIN BUTTON END */ 841 842/* GPLUS LOGIN BUTTON START */ 843// jQuery(document).ready(function() { 844// window.rchrGPlusSigninCallback = function(response) { 845// if(response.access_token && response.status.signed_in) { 846// var $buttons = jQuery('.rchr-gplus-login-button').prop('disabled', true).addClass('rchr-login-button-loading'); 847// var $form = jQuery('<form method="POST" action="'+GPlusAppData.authUrl+'">'+ 848// '<input type="hidden" name="rchr_social_network_access_token" value="'+response.access_token+'">'+ 849// '<input type="hidden" name="rchr_social_network_type" value="gplus">'+ 850// '<input type="hidden" name="action" value="rchr_one_click_registration">'+ 851// '<input type="hidden" name="step" value="registerfreeclientsocial">'+ 852// '</form>'); 853// $form.appendTo('body'); 854// jQuery.ajax({ 855// url: $form.attr('action'), 856// dataType: 'html', 857// type: $form.attr('method'), 858// data: $form.serialize(), 859// success: function(json) { 860// try { 861// json = JSON.parse(json); 862// if(json.error) { 863// jQuery.notify.showError(json.msg) 864// } else { 865// jQuery.notify.showSuccess(json.msg); 866// window.location.href = json.redirect; 867// } 868// } catch(e) { 869// jQuery.notify.showError('Network Error'); 870// } 871// }, 872// complete: function() { $buttons.removeAttr('disabled').removeClass('rchr-login-button-loading') } 873// }); 874// $form.remove(); 875// } 876// } 877// }) 878 879// jQuery(document).on('click', '.rchr-gplus-login-button', function(e) { 880// e.preventDefault(); 881// try { 882// gapi.auth.signIn({ 883// clientid: GPlusAppData.clientId, 884// cookiepolicy : 'single_host_origin', 885// callback : 'rchrGPlusSigninCallback', 886// scope: 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile', 887// prompt: 'select_account' 888// }) 889// } catch (err){ 890// jQuery.notify.showError(err) 891// } 892// }) 893/* GPLUS LOGIN BUTTON END */
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.