1;(function () 2{ 3 'use strict'; 4 5 BX.namespace('BX.Main.UF'); 6 7 if (typeof BX.Main.UF.Manager !== 'undefined') 8 { 9 return; 10 } 11 12 var fieldStack = {}; 13 14 /** 15 * Dynamic form manager. Initilized as singleton below 16 * 17 * @constructor 18 */ 19 20 BX.Main.UF.Manager = function () 21 { 22 this.mode = this.mode || ''; 23 this.ajaxUrl = '/bitrix/tools/uf.php'; 24 }; 25 26 27 BX.Main.UF.Manager.getEdit = function (param, callback) 28 { 29 return BX.Main.UF.EditManager.get(param, callback); 30 }; 31 32 BX.Main.UF.Manager.getView = function (param, callback) 33 { 34 return BX.Main.UF.ViewManager.get(param, callback); 35 }; 36 37 BX.Main.UF.Manager.prototype.get = function (param, callback) 38 { 39 if (!this.mode) 40 { 41 this.displayError([ 42 'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager' 43 ]); 44 45 return; 46 } 47 48 return this.query(this.mode, { 49 FIELDS: param.FIELDS, 50 FORM: param.FORM || '', 51 CONTEXT: param.CONTEXT || '', 52 MEDIA_TYPE: param.MEDIA_TYPE || '' 53 }, callback); 54 }; 55 56 BX.Main.UF.Manager.prototype.add = function (param, callback) 57 { 58 if (!this.mode) 59 { 60 this.displayError([ 61 'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager' 62 ]); 63 64 return; 65 } 66 67 return this.query(this.mode, { 68 action: 'add', 69 FIELDS: param.FIELDS, 70 FORM: param.FORM || '' 71 }, callback); 72 }; 73 74 BX.Main.UF.Manager.prototype.update = function (param, callback) 75 { 76 if (!this.mode) 77 { 78 this.displayError([ 79 'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager' 80 ]); 81 82 return; 83 } 84 85 return this.query(this.mode, { 86 action: 'update', 87 FIELDS: param.FIELDS, 88 FORM: param.FORM || '' 89 }, callback); 90 }; 91 92 BX.Main.UF.Manager.prototype.delete = function (param, callback) 93 { 94 if (!this.mode) 95 { 96 this.displayError([ 97 'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager' 98 ]); 99 100 return; 101 } 102 103 return this.query(this.mode, { 104 action: 'delete', 105 FIELDS: param.FIELDS, 106 FORM: param.FORM || '' 107 }, callback); 108 }; 109 110 BX.Main.UF.Manager.prototype.query = function (mode, param, callback) 111 { 112 BX.ajax({ 113 dataType: 'json', 114 url: this.ajaxUrl, 115 method: 'POST', 116 data: this.prepareQuery(mode, param), 117 onsuccess: this.queryCallback(callback) 118 }); 119 }; 120 121 BX.Main.UF.Manager.prototype.prepareQuery = function (mode, param) 122 { 123 var p = param || {}; 124 125 p.mode = mode; 126 p.lang = BX.message('LANGUAGE_ID') || ''; 127 p.tpl = BX.message('UF_SITE_TPL') || ''; 128 p.tpls = BX.message('UF_SITE_TPL_SIGN') || ''; 129 p.sessid = BX.bitrix_sessid(); 130 131 return p; 132 }; 133 134 BX.Main.UF.Manager.prototype.queryCallback = function (callback) 135 { 136 var processResult = BX.proxy(this.processResult, this); 137 return function (result) 138 { 139 processResult(result, callback); 140 } 141 }; 142 143 BX.Main.UF.Manager.prototype.processResult = function (result, callback) 144 { 145 var asset = ''; 146 if (BX.type.isArray(result.ASSET)) 147 { 148 asset += result.ASSET.join('\n'); 149 } 150 151 if (!!result.ERROR) 152 { 153 this.displayError(result.ERROR); 154 } 155 156 return BX.html(null, asset).then(function () 157 { 158 if (!!callback) 159 { 160 callback(result.FIELD); 161 } 162 }); 163 }; 164 165 BX.Main.UF.Manager.prototype.displayError = function (errorList) 166 { 167 for (var i in errorList) 168 { 169 if (errorList.hasOwnProperty(i)) 170 { 171 console.error(errorList[i]); 172 } 173 } 174 }; 175 176 BX.Main.UF.Manager.prototype.registerField = function (field, fieldDescription, node) 177 { 178 fieldStack[field] = { 179 FIELD: fieldDescription, 180 NODE: node 181 }; 182 }; 183 184 BX.Main.UF.Manager.prototype.unRegisterField = function (field) 185 { 186 if (!!fieldStack[field]) 187 { 188 delete fieldStack[field]; 189 } 190 }; 191 192 193 BX.Main.UF.ViewManager = function () 194 { 195 BX.Main.UF.ViewManager.superclass.constructor.apply(this, arguments); 196 197 this.mode = 'main.view'; 198 }; 199 BX.extend(BX.Main.UF.ViewManager, BX.Main.UF.Manager); 200 201 BX.Main.UF.EditManager = function () 202 { 203 BX.Main.UF.EditManager.superclass.constructor.apply(this, arguments); 204 205 this.mode = 'main.edit'; 206 }; 207 BX.extend(BX.Main.UF.EditManager, BX.Main.UF.Manager); 208 209 BX.Main.UF.EditManager.prototype.validate = function (fieldList, callback) 210 { 211 if (fieldList.length > 0) 212 { 213 var request = []; 214 for (var i = 0; i < fieldList.length; i++) 215 { 216 var value = BX.Main.UF.Factory.getValue(fieldList[i]); 217 if (value !== null) 218 { 219 request.push({
220 'ENTITY_ID': fieldStack[fieldList[i]].FIELD.ENTITY_ID, 221 'FIELD': fieldStack[fieldList[i]].FIELD.FIELD, 222 'ENTITY_VALUE_ID': fieldStack[fieldList[i]].FIELD.ENTITY_VALUE_ID, 223 'VALUE': value 224 }); 225 } 226 } 227 228 return this.query(this.mode, { 229 action: 'validate', 230 FIELDS: request 231 }, callback); 232 } 233 else 234 { 235 this.queryCallback(callback)({'FIELD': []}); 236 } 237 }; 238 239 /** 240 * Base type handler class. Will be initialized in Factory. 241 * 242 * @constructor 243 */ 244 245 BX.Main.UF.BaseType = function () 246 { 247 }; 248 249 BX.Main.UF.BaseType.prototype.addRow = function (fieldName, thisButton) 250 { 251 var element = thisButton.parentNode.getElementsByTagName('span'); 252 if (element && element.length > 0 && element[0]) 253 { 254 var parentElement = element[0].parentNode; // parent 255 var newNode = this.getClone(element[element.length - 1], fieldName); 256 257 if (parentElement === thisButton.parentNode) 258 { 259 parentElement.insertBefore(newNode, thisButton); 260 } 261 else 262 { 263 parentElement.appendChild(newNode); 264 } 265 } 266 }; 267 268 /** 269 * @deprecated 270 * @param fieldName 271 * @param thisButton 272 */ 273 BX.Main.UF.BaseType.prototype.addMobileRow = function (fieldName, thisButton) 274 { 275 var element = thisButton.parentNode.getElementsByTagName('span'); 276 if (element && element.length && element[0]) 277 { 278 var parentElement = element[0].parentNode; // parent 279 var newNode = this.getClone(element[element.length - 1], fieldName); 280 var firstChildren = newNode.firstElementChild; 281 var name = firstChildren.getAttribute('name'); 282 var re = /\[(\d)]/; 283 var newName = name.replace(re, function (match, index) 284 { 285 index = parseInt(index) + 1; 286 return '[' + index + ']'; 287 }); 288 var newItemId = false; 289 var prevItemName = false; 290 var userFieldTypeName = null; 291 292 firstChildren.setAttribute('name', newName); 293 294 if (firstChildren.hasChildNodes()) 295 { 296 firstChildren.childNodes.forEach( 297 function (item, index, array) 298 { 299 if (!prevItemName && item.attributes !== undefined && item.tagName === 'INPUT') 300 { 301 item.setAttribute('name', newName); 302 prevItemName = item.getAttribute('id'); 303 newItemId = prevItemName + '_1'; 304 userFieldTypeName = item.getAttribute('data-user-field-type-name'); 305 } 306 307 if (prevItemName && item.attributes !== undefined && item.id !== undefined) 308 { 309 var id = item.getAttribute('id'); 310 311 if (id !== prevItemName) 312 { 313 item.setAttribute('id', id.replace(prevItemName, newItemId)); 314 } 315 else 316 { 317 item.setAttribute('id', newItemId); 318 } 319 } 320 } 321 ); 322 } 323 324 if (parentElement === thisButton.parentNode) 325 { 326 parentElement.insertBefore(newNode, thisButton); 327 } 328 else 329 { 330 parentElement.appendChild(newNode); 331 } 332 333 if (newItemId) 334 { 335 BX.onCustomEvent( 336 'onAddMobileUfField', 337 [newItemId, userFieldTypeName] 338 ); 339 } 340 341 } 342 }; 343 344 BX.Main.UF.BaseType.prototype.getClone = function (node, fieldName) 345 { 346 var newNode = node.cloneNode(true); 347 348 var inputList = this.findInput(newNode, fieldName); 349 for (var i = 0; i < inputList.length; i++) 350 { 351 inputList[i].value = ''; 352 } 353 354 return newNode; 355 }; 356 357 BX.Main.UF.BaseType.prototype.findInput = function (node, fieldName) 358 { 359 return BX.findChildren(node, { 360 tagName: /INPUT|TEXTAREA|SELECT/i, 361 attribute: { 362 name: fieldName 363 } 364 }, true); 365 }; 366 367 BX.Main.UF.BaseType.prototype.isEmpty = function (field) 368 { 369 var node = this.getNode(field), 370 fieldName = field + ( 371 fieldStack[field].FIELD.MULTIPLE === 'Y' 372 ? '[]' 373 : '' 374 ); 375 376 if (!BX.isNodeInDom(node)) 377 { 378 console.error('Node for field ' + field + ' is already removed from DOM'); 379 } 380 381 var nodeList = this.findInput(node, fieldName); 382 383 if (nodeList.length <= 0) 384 { 385 console.error('Unable to find field ' + field + ' in the registered node'); 386 } 387 else 388 { 389 for (var i = 0; i < nodeList.length; i++) 390 { 391 if (nodeList[i].value !== '') 392 { 393 return false; 394 } 395 } 396 } 397 398 return true; 399 }; 400 401 BX.Main.UF.BaseType.prototype.getValue = function (field) 402 { 403 var node = this.getNode(field), 404 fieldName = field + ( 405 fieldStack[field].FIELD.MULTIPLE === 'Y' 406 ? '[]' 407 : '' 408 ), 409 value = fieldStack[field].FIELD.MULTIPLE === 'Y' ? [] : ''; 410 411 if (!BX.isNodeInDom(node)) 412 {
413 console.error('Node for field ' + field + ' is already removed from DOM'); 414 } 415 var nodeList = this.findInput(node, fieldName); 416 417 if (nodeList.length <= 0) 418 { 419 var nodeChildren = (node.children.length ? node.children[0] : false); 420 /** 421 * @todo remove !BX.util.in_array(fieldStack[field].FIELD.USER_TYPE_ID, ['crm', 'employee']) 422 * after deploy new Crm and Employee types 423 */ 424 if ( 425 !BX.util.in_array(fieldStack[field].FIELD.USER_TYPE_ID, ['crm', 'employee']) 426 && 427 ( 428 !nodeChildren 429 || 430 nodeChildren.getAttribute('data-has-input') !== 'no' 431 ) 432 ) 433 { 434 console.error('Unable to find field ' + field + ' in the registered node'); 435 } 436 } 437 else 438 { 439 for (var i = 0; i < nodeList.length; i++) 440 { 441 if ( 442 nodeList[i].tagName === 'INPUT' 443 && (nodeList[i].type === 'radio' || nodeList[i].type === 'checkbox') 444 && !nodeList[i].checked 445 ) 446 { 447 continue; 448 } 449 450 if (fieldStack[field].FIELD.MULTIPLE === 'Y') 451 { 452 value.push(nodeList[i].value); 453 } 454 else 455 { 456 value = nodeList[i].value; 457 break; 458 } 459 } 460 } 461 462 return value; 463 }; 464 465 BX.Main.UF.BaseType.prototype.focus = function (field) 466 { 467 var node = this.getNode(field), 468 fieldName = field + ( 469 fieldStack[field].FIELD.MULTIPLE === 'Y' 470 ? '[]' 471 : '' 472 ); 473 474 if (!BX.isNodeInDom(node)) 475 { 476 console.error('Node for field ' + field + ' is already removed from DOM'); 477 } 478 var nodeList = this.findInput(node, fieldName); 479 480 if (nodeList.length > 0) 481 { 482 BX.focus(nodeList[0]); 483 } 484 }; 485 486 BX.Main.UF.BaseType.prototype.getNode = function (field) 487 { 488 return fieldStack[field].NODE; 489 }; 490 491 /** 492 * Integer type handler class. Will be initialized in Factory. 493 * 494 * @constructor 495 */ 496 BX.Main.UF.TypeBoolean = function () 497 { 498 }; 499 BX.extend(BX.Main.UF.TypeBoolean, BX.Main.UF.BaseType); 500 501 BX.Main.UF.TypeBoolean.USER_TYPE_ID = 'boolean'; 502 503 BX.Main.UF.TypeBoolean.prototype.isEmpty = function (field) 504 { 505 return false; 506 }; 507 508 /** 509 * Integer type handler class. Will be initialized in Factory. 510 * 511 * @constructor 512 */ 513 BX.Main.UF.TypeInteger = function () 514 { 515 }; 516 BX.extend(BX.Main.UF.TypeInteger, BX.Main.UF.BaseType); 517 518 BX.Main.UF.TypeInteger.USER_TYPE_ID = 'integer'; 519 520 /** 521 * Double type handler class. Will be initialized in Factory. 522 * 523 * @constructor 524 */ 525 BX.Main.UF.TypeDouble = function () 526 { 527 }; 528 BX.extend(BX.Main.UF.TypeDouble, BX.Main.UF.BaseType); 529 530 BX.Main.UF.TypeDouble.USER_TYPE_ID = 'double'; 531 532 /** 533 * String type handler class. Will be initialized in Factory. 534 * 535 * @constructor 536 */ 537 BX.Main.UF.TypeSting = function () 538 { 539 }; 540 BX.extend(BX.Main.UF.TypeSting, BX.Main.UF.BaseType); 541 542 BX.Main.UF.TypeSting.USER_TYPE_ID = 'string'; 543 544 /** 545 * URL type handler class. Will be initialized in Factory. 546 * 547 * @constructor 548 */ 549 BX.Main.UF.TypeUrl = function () 550 { 551 }; 552 BX.extend(BX.Main.UF.TypeUrl, BX.Main.UF.BaseType); 553 554 BX.Main.UF.TypeUrl.USER_TYPE_ID = 'url'; 555 556 /** 557 * Formatted string type handler class. Will be initialized in Factory. 558 * 559 * @constructor 560 */ 561 BX.Main.UF.TypeStingFormatted = function () 562 { 563 }; 564 BX.extend(BX.Main.UF.TypeStingFormatted, BX.Main.UF.TypeSting); 565 566 BX.Main.UF.TypeStingFormatted.USER_TYPE_ID = 'string_formatted'; 567 568 569 /** 570 * Enumeration type handler class. Will be initialized in Factory. 571 * 572 * @constructor 573 */ 574 BX.Main.UF.TypeEnumeration = function () 575 { 576 }; 577 BX.extend(BX.Main.UF.TypeEnumeration, BX.Main.UF.BaseType); 578 579 BX.Main.UF.TypeEnumeration.USER_TYPE_ID = 'enumeration'; 580 581 BX.Main.UF.TypeEnumeration.prototype.findInput = function (node, fieldName) 582 { 583 var inputList = BX.Main.UF.TypeEnumeration.superclass.findInput.apply(this, arguments); 584 585 if (inputList.length > 0) 586 { 587 for (var i = 0; i < inputList.length; i++) 588 { 589 if (inputList[i].tagName === 'INPUT' && inputList[i].type === 'hidden' && inputList.length > 1) 590 { 591 delete inputList[i]; 592 break; 593 } 594 } 595 } 596 597 return BX.util.array_values(inputList); 598 }; 599 600 BX.Main.UF.TypeEnumeration.prototype.focus = function (field) 601 { 602 if (fieldStack[field] 603 && fieldStack[field].FIELD.SETTINGS.DISPLAY === 'UI' 604 && BX.type.isElementNode(fieldStack[field].NODE) 605 ) 606 { 607 BX.fireEvent(fieldStack[field].NODE, 'focus'); 608 } 609 else 610 { 611 BX.Main.UF.TypeEnumeration.superclass.focus.apply(this, arguments); 612 } 613 }; 614 615 /** 616 * Date type handler class. Will be initialized in Factory. 617 * 618 * @constructor 619 */ 620 BX.Main.UF.TypeDate = function () 621 { 622 }; 623 BX.extend(BX.Main.UF.TypeDate, BX.Main.UF.BaseType); 624 625 BX.Main.UF.TypeDate.USER_TYPE_ID = 'date'; 626
627 BX.Main.UF.TypeDate.prototype.focus = function (field) 628 { 629 var fieldName = field + ( 630 fieldStack[field].FIELD.MULTIPLE === 'Y' 631 ? '[]' 632 : '' 633 ); 634 var inputList = this.findInput(this.getNode(field), fieldName); 635 636 if (inputList.length > 0) 637 { 638 BX.fireEvent(inputList[0], 'click'); 639 } 640 641 BX.Main.UF.TypeDate.superclass.focus.apply(this, arguments); 642 }; 643 644 /** 645 * Datetime type handler class. Will be initialized in Factory. 646 * 647 * @constructor 648 */ 649 BX.Main.UF.TypeDateTime = function () 650 { 651 }; 652 BX.extend(BX.Main.UF.TypeDateTime, BX.Main.UF.TypeDate); 653 654 BX.Main.UF.TypeDateTime.USER_TYPE_ID = 'datetime'; 655 656 /** 657 * Datetime type handler class. Will be initialized in Factory. 658 * 659 * @constructor 660 */ 661 BX.Main.UF.TypeFile = function () 662 { 663 }; 664 BX.extend(BX.Main.UF.TypeFile, BX.Main.UF.BaseType); 665 666 BX.Main.UF.TypeFile.USER_TYPE_ID = 'file'; 667 668 BX.Main.UF.TypeFile.prototype.findInput = function (node, fieldName) 669 { 670 var inputList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, arguments); 671 672 if (inputList.length <= 0) 673 { 674 inputList = BX.findChildren(node, { 675 tagName: /INPUT/i, 676 attribute: { 677 type: 'file', 678 name: /^bxu_files/ 679 } 680 }, true); 681 } 682 683 return inputList; 684 }; 685 686 BX.Main.UF.TypeFile.prototype.getValue = function (field) 687 { 688 var 689 baseValue = BX.Main.UF.TypeFile.superclass.getValue.apply(this, arguments), 690 node = fieldStack[field].NODE, 691 deletedNodeList = [], 692 i; 693 694 if (fieldStack[field].FIELD.MULTIPLE === 'Y') 695 { 696 var deletedFieldName = field + '_del[]'; 697 698 if (BX.type.isArray(baseValue) && baseValue.length > 0) 699 { 700 deletedNodeList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, [node, deletedFieldName]); 701 702 for (i = 0; i < deletedNodeList.length; i++) 703 { 704 var pos = BX.util.array_search(deletedNodeList[i].value, baseValue); 705 if (pos >= 0) 706 { 707 baseValue[pos] = {'old_id': deletedNodeList[i].value, 'del': 'Y', 'tmp_name': ''}; 708 } 709 } 710 } 711 712 return BX.util.array_values(baseValue); 713 } 714 715 if (baseValue > 0) 716 { 717 var deletedFieldName = field + '_del'; 718 719 deletedNodeList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, [node, deletedFieldName]); 720 721 for (i = 0; i < deletedNodeList.length; i++) 722 { 723 if (baseValue == deletedNodeList[i].value) 724 { 725 baseValue = {'old_id': baseValue, 'del': 'Y', 'tmp_name': ''}; 726 break; 727 } 728 } 729 730 return baseValue; 731 } 732 733 return null; 734 }; 735 736 737 /** 738 * Type handler Factory singleton. Will be initialized below. 739 * 740 * @constructor 741 */ 742 BX.Main.UF.Factory = function () 743 { 744 this.defaultTypeHandler = BX.Main.UF.BaseType; 745 746 this.typeHandlerList = {}; 747 this.objectCollection = {}; 748 }; 749 750 BX.Main.UF.Factory.prototype.setTypeHandler = function (type, handlerClass) 751 { 752 this.typeHandlerList[type] = handlerClass; 753 if (typeof this.objectCollection[type] !== 'undefined') 754 { 755 delete this.objectCollection[type]; 756 } 757 }; 758 759 BX.Main.UF.Factory.prototype.get = function (type) 760 { 761 if (typeof this.objectCollection[type] === 'undefined') 762 { 763 this.objectCollection[type] = this.getObject(type); 764 } 765 766 return this.objectCollection[type]; 767 }; 768 769 BX.Main.UF.Factory.prototype.getObject = function (type) 770 { 771 return new (this.typeHandlerList[type] || this.defaultTypeHandler); 772 }; 773 774 BX.Main.UF.Factory.prototype.getFieldObject = function (field) 775 { 776 if (typeof fieldStack[field] === 'undefined') 777 { 778 console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register'); 779 780 return null; 781 } 782 783 return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']); 784 }; 785 786 BX.Main.UF.Factory.prototype.isEmpty = function (field) 787 { 788 if (typeof fieldStack[field] === 'undefined') 789 { 790 console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register'); 791 792 return true; 793 } 794 795 return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).isEmpty(field); 796 }; 797 798 BX.Main.UF.Factory.prototype.getValue = function (field) 799 { 800 if (typeof fieldStack[field] === 'undefined') 801 { 802 console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register'); 803 804 return null; 805 } 806 807 return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).getValue(field); 808 }; 809
810 BX.Main.UF.Factory.prototype.focus = function (field) 811 { 812 if (typeof fieldStack[field] === 'undefined') 813 { 814 console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register'); 815 } 816 817 return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).focus(field); 818 }; 819 820 /** 821 * Singletons initialization 822 */ 823 824 BX.Main.UF.EditManager = new BX.Main.UF.EditManager(); 825 BX.Main.UF.ViewManager = new BX.Main.UF.ViewManager(); 826 BX.Main.UF.Factory = new BX.Main.UF.Factory(); 827 828 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeBoolean.USER_TYPE_ID, BX.Main.UF.TypeBoolean); 829 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeInteger.USER_TYPE_ID, BX.Main.UF.TypeInteger); 830 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDouble.USER_TYPE_ID, BX.Main.UF.TypeDouble); 831 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeSting.USER_TYPE_ID, BX.Main.UF.TypeSting); 832 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeStingFormatted.USER_TYPE_ID, BX.Main.UF.TypeStingFormatted); 833 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeEnumeration.USER_TYPE_ID, BX.Main.UF.TypeEnumeration); 834 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeFile.USER_TYPE_ID, BX.Main.UF.TypeFile); 835 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDate.USER_TYPE_ID, BX.Main.UF.TypeDate); 836 BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDateTime.USER_TYPE_ID, BX.Main.UF.TypeDateTime); 837})();
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.