PageSourceSearch

https://sleeps.ru/bitrix/js/main/core/core_uf.js

js sleeps.ru collected 2026-09-26 05:05:52 UTC 18,713 bytes, 837 lines download raw bytes

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.