PageSourceSearch

https://xn--2026-f4d0b3bw.xn--p1ai/local/templates/svoi/components…/main.file.input/drag_and_drop/script.js

js xn--2026-f4d0b3bw.xn--p1ai collected 2026-10-09 22:48:54 UTC 20,605 bytes, 727 lines download raw bytes

1(function() {
2if (window.BlogBFileDialog)
3	return;
4window.BlogBFileDialogUniqueID = [];
5window.BlogBFileDialog = function(arParams)
6{
7	this.dialogName = 'AttachmentsDialog';
8	this.agent = false;
9	this.uploadFileUrl = arParams.upload_path; // from file.input php
10
11	this.id = (!!arParams["id"] ? arParams["id"] : this.getID());
12	this.controlID = arParams["id"];
13	this.enabled = true;
14
15	this.controller = (!! arParams.controller ) ? arParams.controller : null;
16	this.fileInput = arParams.fileInput;
17	arParams.hAttachEvents = BX.delegate(this.InitAgent, this);
18
19	this.msg = arParams.msg;
20	this.dropAutoUpload = arParams.dropAutoUpload;
21	this.CID = arParams.CID;
22	this.multiple = !!arParams.multiple;
23
24	arParams.caller = this;
25	arParams.classes = {
26		'uploaderParent' : 'file-uploader',
27		'uploader' : 'file-fileUploader',
28		'tpl_simple' : 'file-simple',
29		'tpl_extended' : 'file-extended',
30		'selector' : 'file-selector',
31		'selector_active' : 'file-selector-active'
32	};
33	arParams.doc_prefix = 'wd-doc';
34	arParams.placeholder = BX.findChild(this.controller, {'className': 'file-placeholder-tbody'}, true);
35	this.doc_prefix = arParams.doc_prefix;
36	this.values = (arParams["values"] || []);
37
38	if (!!BX.FileUploadAgent) {
39		this.agent = new BX.FileUploadAgent(arParams);
40		BX.addCustomEvent(this, 'ShowUploadedFile', BX.delegate(this.ShowUploadedFile, this));
41		BX.addCustomEvent(this, 'StopUpload', this.StopUpload.bind(this));
42		BX.onCustomEvent(BX(this.controller.parentNode), "BFileDLoadFormControllerInit", [this]);
43	} else {
44		BX.debug('/bitrix/components/bitrix/main.file.input/templates/drag_n_drop/script.js: BX.FileUploadAgent is not defined.' +
45			' You need to load /bitrix/js/main/file_upload_agent.js');
46	}
47}
48
49window.BlogBFileDialog.prototype.getID = function() {
50	return '' + new Date().getTime();
51}
52
53window.BlogBFileDialog.prototype.InitAgent = function(agent)
54{
55	if (this.controller) {
56		agent.placeholder = BX.findChild(this.controller, {'className': 'file-placeholder-tbody'}, true);
57	}
58}
59
60window.BlogBFileDialog.prototype.ShowUploadedFile = function(agent) // event
61{
62	this.agent = agent;
63	var uploadResult = agent.uploadResult;
64	if (uploadResult && (uploadResult.element_id > 0)) {
65		var node = this.CreateFileRow(uploadResult);
66		if (!!agent.inputName && agent.inputName.length > 0) {
67			var hidden = BX.create('INPUT', {
68				props: {
69					'id': 'file-doc'+uploadResult.element_id,
70					'type': 'hidden',
71					'name': agent.inputName + (this.multiple ? '[]' : ''),
72					'value': uploadResult.element_id
73				}
74			});
75			node.appendChild(hidden);
76		}
77		this.values.push(node);
78		agent._clearPlace();
79
80		if (this.controller && this.controller.parentNode)
81		{
82			const securityNode = (this.controller.closest('form') || this.controller.parentNode).querySelector('#upload-cid');
83			if (securityNode)
84			{
85				securityNode.value = this.CID;
86			}
87			BX.onCustomEvent(this.controller.parentNode, 'OnFileUploadSuccess', [uploadResult, this]);
88		}
89
90	} else {
91		var text = (uploadResult && uploadResult["error"] ? uploadResult["error"] : this.msg.upload_error);
92		agent.ShowUploadError(text);
93
94		if (this.controller && this.controller.parentNode)
95			BX.onCustomEvent(this.controller.parentNode, 'OnFileUploadFail');
96	}
97}
98
99window.BlogBFileDialog.prototype.CreateFileRow = function(result)
100{
101	var res = result;
102	var mode = 'file';
103	if (!! res.element_content_type && (res.element_content_type.indexOf('image/') == 0) &&
104		!!res.element_image && (res.element_image.length > 0) &&
105		!!res.element_thumbnail && (res.element_thumbnail.length > 0) ) {
106		mode = 'image';
107	}
108
109	var newNode = BX.clone(BX("file-" + mode + "-template"));
110
111	BX.template(newNode, BX.delegate(function(node) {
112		this.tplFileRow(node, res);
113	}, this));
114
115	if (mode == 'image') {
116		var span = null;
117		for (i=0;i<newNode.children.length;i++)
118		{
119			span = newNode.children[i];
120			if (span.nodeType == 1)
121				break;
122		}
123
124		span.setAttribute('id', this.doc_prefix + result.element_id);
125		var closeControl = BX.findChild(span, {'className': 'feed-add-post-del-but'}, true);
126		BX.bind(closeControl, 'click', BX.delegate(
127			function() {
128				var control = closeControl;
129				var parent = control.parentNode;
130				this.agent.StopUpload(parent);
131				BX.cleanNode(parent, true);
132			}, this));
133		this.agent.AddNodeToPlaceholder(span);
134		newNode = span;
135	} else {
136		newNode.setAttribute('id', this.doc_prefix + result.element_id);
137		this.agent.AddRowToPlaceholder(newNode);
138		newNode = this.agent.placeholder.querySelector('#' + this.doc_prefix + result.element_id);
139	}
140	return newNode;
141}
142
143window.BlogBFileDialog.prototype.GetUploadDialog = function(agent)
144{
145	return new BlogBFileDialogUploader(this, agent);
146}
147
148window.BlogBFileDialog.prototype.tplFileRow = function(nodes, res)
149{
150	for (id in nodes)
151	{
152		if (! nodes.hasOwnProperty(id))
153			continue;
154
155		var node = nodes[id];
156
157		if ((id == 'image') &&
158			!!res.element_image && (res.element_image.length > 0) &&
159			!!res.element_thumbnail && (res.element_thumbnail.length > 0))
160		{
161			node.setAttribute('src', res.element_image);
162			node.setAttribute('rel', res.element_thumbnail);
163		}
164		else
165		{
166			if (!! res['element_'+id])
167				node.innerHTML = res['element_'+id];
168		}
169	}
170}
171
172window.BlogBFileDialog.prototype._addUrlParam = function(url, param)
173{
174	if (!url)
175		return null;
176	if (url.indexOf(param) == -1)
177		url += ((url.indexOf('?') == -1) ? '?' : '&') + param ;
178	return url;
179}
180
181window.BlogBFileDialog.prototype.LoadDialogs = function(dialogs)
182{
183	if (!!this.agent)
184		this.agent.LoadDialogs(dialogs);
185	else {
186		var dlgs = dialogs;
187		setTimeout(BX.delegate(function() {this.LoadDialogs(dlgs);}, this), 100);
188	}
189}
190
191window.BlogBFileDialog.prototype.StopUpload = function(agent, parent)
192{
193	this.agent = agent;
194	var id = 0;
195	var regExp = new RegExp(this.doc_prefix + '(\\d+)');
196	if (regExp.test(parent.id))
197	{
198		var buf = parent.id.match(regExp);
199		id = buf[1];
200	}
201	if (this.controller && this.controller.parentNode)
202	{
203		BX.onCustomEvent(this.controller.parentNode, 'OnFileUploadRemove', [id, this]);
204	}
205
206	var data = {
207		fileID : id,
208		sessid : BX.bitrix_sessid(),
209		cid : this.CID,
210		controlID : this.controlID,
211		mfi_mode : "delete",
212	};
213
214	BX.ajax({
215		'method': 'POST',
216		'dataType': 'html',
217		'url': this.uploadFileUrl,
218		'processData': false,
219		'data': BX.ajax.prepareData(data),
220		'onsuccess': function() {}
221	});
222}
223
224window.BlogBFileDialogDispatcher = function(controller)
225{
226	this.id = this.getID();
227	this.controller = controller;
228	BX.loadScript('/bitrix/js/main/core/core_dd.js', BX.delegate(function() {
229		if (BX.type.isElementNode(this.controller) && this.controller.parentNode && this.controller.parentNode.parentNode)
230		{
231			var target = this.controller.parentNode.parentNode;
232			this.dropbox = new BX.DD.dropFiles(target);
233			if (this.dropbox && this.dropbox.supported() && BX.ajax.FormData.isSupported()) {
234				this.hExpandUploader = BX.proxy(this.ExpandUploader, this);
235				BX.addCustomEvent(this.dropbox, 'dragEnter', this.hExpandUploader);
236				BX.addCustomEvent(target, "UnbindDndDispatcher", BX.delegate(this.Unbind, this));
237			}
238		}
239	}, this));
240}
241
242window.BlogBFileDialogDispatcher.prototype.getID = function() {
243	return '' + new Date().getTime();
244}
245
246window.BlogBFileDialogDispatcher.prototype.ExpandUploader = function()
247{
248	BX.onCustomEvent(BX(this.controller.parentNode), "BFileDLoadFormController", ['show']);
249//	this.Unbind();
250}
251
252window.BlogBFileDialogDispatcher.prototype.Unbind = function()
253{
254	BX.removeCustomEvent(this.dropbox, 'dragEnter', this.hExpandUploader);
255}
256
257// upoader section
258window.BlogBFileDialogUploader = function(arParams, agent)
259{
260	this.WDUploaded = false;
261	this.WDUploadInProgress = false;
262	this.documentExists = false;
263	this.fileDropped = false;
264
265	this.caller = arParams;
266	this.agent = agent;
267	this.parentID = this.agent.id;
268	this.id = this.caller.getID();
269
270	this.msg = arParams.msg;
271	this.dropAutoUpload = arParams.dropAutoUpload;
272	this.uploadFileUrl = arParams.uploadFileUrl; // from file.input php
273	this.CID = arParams.CID;
274	this.controlID = arParams.controlID;
275
276	this.CreateElements();
277	this.fileInput = (!!agent.fileInput ? agent.fileInput : ((BX.type.isDomNode(agent.fileInputID)) ? agent.fileInputID : BX(arParams.fileInput)));
278	if (BX.type.isDomNode(this.fileInput)) {
279		this.fileInput.name = 'mfi_files[]';
280	}
281	this.fileList = this.__form;
282
283	BX.loadScript('/bitrix/js/main/core/core_dd.js', BX.delegate(
284		function() {
285			var dropbox = new BX.DD.dropFiles();
286			if (dropbox && dropbox.supported() && BX.ajax.FormData.isSupported())
287			{
288				this.dropbox = dropbox;
289			}
290			this.agent.BindUploadEvents(this);
291		}, this));
292}
293
294window.BlogBFileDialogUploader.prototype.CreateElements = function()
295{
296	var uniqueID;
297	do {
298		uniqueID = Math.floor(Math.random() * 99999);
299	} while(BX("iframe-" + uniqueID));
300
301	var iframeName = "iframe-" + this.id;
302	var iframe = BX.create("IFRAME", {
303		props: {name: iframeName, id: iframeName},
304		style: {display: "none"}
305	});
306	document.body.appendChild(iframe);
307	this.iframeUpload = iframe;
308
309	var form = BX.create("FORM", {
310		props: {
311			id: "form-" + uniqueID,
312			method: "POST",
313			action: this.uploadFileUrl,
314			enctype: "multipart/form-data",
315			encoding: "multipart/form-data",
316			target: iframeName
317		},
318		style: {display: "none"},
319		children: [
320			BX.create("INPUT", {
321				props: {
322					type: "hidden",
323					name: "sessid",
324					value: BX.bitrix_sessid()
325				}
326			}),
327			BX.create("INPUT", {
328				props: {
329					type: "hidden",
330					name: "uniqueID",
331					value: uniqueID
332				}
333			}),
334			BX.create("INPUT", {
335				props: {
336					type: "hidden",
337					name: "cid",
338					value: this.CID
339				}
340			}),
341			BX.create("INPUT", {
342				props: {
343					type: "hidden",
344					name: "controlID",
345					value: (!!this.controlID ? this.controlID : '')
346				}
347			}),
348			BX.create("INPUT", {
349				props: {
350					type: "hidden",
351					name: "mfi_mode",
352					value: "upload"
353				}
354			})
355		]
356	});
357	document.body.appendChild(form);
358	this.__form = form;
359
360	window['FILE_UPLOADER_CALLBACK_' + uniqueID] = BX.proxy(this.Callback, this);
361}
362
363window.BlogBFileDialogUploader.prototype.GetUploadFileName = function()
364{
365	var fileName = '';
366	if (this.fileInput && (this.fileInput.value.length > 0)) {
367		var fileName = this.fileInput.value;
368		if (fileName.indexOf('\\') > -1) // deal with Chrome fakepath
369			fileName = fileName.substr(fileName.lastIndexOf('\\')+1);
370	} else {
371		var fileNode = this.fileList;
372		if (fileNode.file)
373			fileName = fileNode.file.fileName || fileNode.file.name;
374	}
375	return fileName;
376}
377
378window.BlogBFileDialogUploader.prototype.Callback = function(files, uniqueID)
379{
380	if (BX.type.isArray(files))
381	{
382		files.forEach((function(file) {
383			var result = {
384				success: true,
385				storage: 'bfile',
386				element_id: file.fileID,
387				element_name: file.fileName,
388				element_size: file.fileSize,
389				element_url: file.fileURL,
390				element_content_type: file.content_type || file.fileContentType,
391				element_image: file.img_thumb_src || file.fileSrc,
392				element_thumbnail: file.img_source_src || file.fileSrc,
393			};
394			if (!!result.element_image)
395				result.element_image = result.element_image.replace(/\/([^\/]+)$/, function(str, name) { return "/" + BX.util.urlencode(name); } );
396			if (!!result.element_thumbnail)
397				result.element_thumbnail = result.element_thumbnail.replace(/\/([^\/]+)$/, function(str, name) { return "/" + BX.util.urlencode(name); } );
398
399			if (file['error'] || file['status'] === 'error')
400			{
401				result['error'] = file['error'] || file['message'];
402			}
403
404			BX.onCustomEvent(this, 'uploadFinish', [result]);
405		}).bind(this));
406	} else {
407		BX.onCustomEvent(this, 'uploadFinish', [{
408			success: false,
409			messages: BX.type.isNotEmptyString(files) ? files : this.msg.upload_error
410		}]);
411	}
412	window['FILE_UPLOADER_CALLBACK_' + uniqueID] = BX.DoNothing;
413	BX.cleanNode(BX("iframe-" + uniqueID), true);
414	BX.cleanNode(BX("form-" + uniqueID), true);
415	this.agent.uploadDialog = null;
416}
417
418window.BlogBFileDialogUploader.prototype.UploadResponse = function(evt, responseJSONStr)
419{
420	this.WDUploadInProgress = false;
421	BX.unbind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
422
423	if (!  responseJSONStr
424		|| responseJSONStr.length <= 0)
425	{
426		this.onError();
427	}
428}
429
430window.BlogBFileDialogUploader.prototype.UploadResponseIframe = function(evt, responseJSONStr)
431{
432	this.WDUploadInProgress = false;
433	BX.unbind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
434}
435
436window.BlogBFileDialogUploader.prototype.UploadLeave = function(e)
437{
438	var e = e || window.event;
439	var msg = '';
440	if (this.WDUploadInProgress)
441		msg = this.msg.UploadInterrupt;
442	else if (((!this.WDUploaded) && this.fileInput && (this.fileInput.value.length > 0)))
443		msg = this.msg.UploadNotDone;
444	if (msg != '')
445	{
446		if (e)
447			e.returnValue = msg;
448		return msg; // safari & chrome
449	}
450	return;
451}
452
453window.BlogBFileDialogUploader.prototype.UpdateListFiles = function(files)
454{
455	if (this && files)
456	{
457		if (files.length < 1)
458			return;
459		var fileNode = this.fileList;
460		fileNode.file = files[0];
461
462		this.WDUploadInProgress = true;
463		this.fileDropped = true;
464		this.CallSubmit();
465	}
466}
467
468window.BlogBFileDialogUploader.prototype.GetInputData = function(parentNode)
469{
470	var elements = [];
471	var data = {};
472	elements = elements.concat(
473		BX.findChildren(parentNode, {'tag': 'input'}, true),
474		BX.findChildren(parentNode, {'tag': 'textarea'}, true),
475		BX.findChildren(parentNode, {'tag': 'select'}, true));
476
477	for(var i=0; i<elements.length; i++)
478	{
479		var el = elements[i];
480		if (!el || el.disabled || el.name.length < 1)
481			continue;
482		switch(el.type.toLowerCase())
483		{
484			case 'text':
485			case 'textarea':
486			case 'password':
487			case 'hidden':
488			case 'select-one':
489				data[el.name] = el.value;
490				break;
491			case 'radio':
492				if(el.checked)
493					data[el.name] = el.value;
494				break;
495			case 'checkbox':
496				data[el.name] = (el.checked ? 'Y':'N');
497				break;
498			case 'select-multiple':
499				var l = el.options.length;
500				if (l > 0) data[el.name] = new Array();
501				for (j=0; j<l; j++)
502					if (el.options[j].selected)
503						data[el.name].push(el.options[j].value);
504				break;
505			default:
506				break;
507		}
508	}
509	return data;
510}
511
512window.BlogBFileDialogUploader.prototype.SetFileInput = function(fileInput)
513{
514	if (!! this.__form.mfi_save)
515		return;
516	if (this.fileInput && this.fileInput != fileInput)
517		BX.remove(this.fileInput);
518	this.__form.appendChild(fileInput);
519	this.fileInput = fileInput;
520}
521
522window.BlogBFileDialogUploader.prototype.CallSubmit = function()
523{
524	if (!! this.__form.mfi_save)
525		return;
526	BX.onCustomEvent(this, 'uploadStart', [this]);
527
528	BX.bind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
529	BX.bind(this.iframeUpload, 'load', BX.delegate(this.UploadResponseIframe, this));
530
531	if (this.dropbox) {
532		this.onProgress(0.15);
533		if (this.fileInput && (this.fileInput.files.length > 0)) {
534			var fileNode = this.fileList;
535			fileNode.file = this.fileInput.files[0];
536		}
537
538		var arConstParams = this.GetInputData(this.__form);
539		this.fileNodes = [this.fileList];
540		for (i in this.fileNodes) {
541			if (this.fileNodes[i].file) {
542				var fd = new BX.ajax.FormData();
543
544				for (item in this.fileNodes[i].data)
545				{
546					fd.append(item, this.fileNodes[i].data[item]);
547				}
548
549				if (!! Object && !! Object.keys) // for IE 10 ....
550				{
551					var keys = Object.keys(arConstParams);
552					for (var k in keys)
553					{
554						var key = keys[k]
555						var cons = arConstParams[key]
556						fd.append(key, cons);
557					}
558				}
559				else
560				{
561					for (item in arConstParams)
562					{
563						fd.append(item, arConstParams[item]);
564					}
565				}
566
567				fd.append('mfi_files[]', this.fileNodes[i].file);
568
569				fd.send(
570					this.uploadFileUrl,
571					BX.delegate(function(ajaxdata) {
572						this.UploadResponse(null, ajaxdata);
573					}, this),
574					BX.delegate(this.onProgress, this)
575				);
576			}
577		}
578	} else {
579		this.onProgress(0.15);
580		this.WDUploadInProgress = true;
581		var fid = this.__form.id;
582		BX.submit(this.__form, 'mfi_save', 'Y');
583	}
584}
585
586window.BlogBFileDialogUploader.prototype.onProgress = function(percent)
587{
588	if (isNaN(percent))
589		return;
590	BX.onCustomEvent(this, 'progress', [percent]);
591}
592
593window.BlogBFileDialogUploader.prototype.onError = function()
594{
595	BX.onCustomEvent(this, 'uploadFinish', [{success: false, messages: this.msg.upload_error}]);
596}
597
598top.BlogBFileDialog = window.BlogBFileDialog;
599top.BlogBFileDialogUploader = window.BlogBFileDialogUploader;
600top.BlogBFileDialogDispatcher = window.BlogBFileDialogDispatcher;
601
602window.MFIDD = function(params){
603	BX.loadCSS('/bitrix/components/bitrix/main.file.input/templates/drag_n_drop/style.css');
604
605	var status = (params["status"] === 'show' ? 'show' : (params["status"] === 'hide' ? 'hide' : 'switch'));
606	if (status == 'switch')
607		status = (params['controller'].style.display != 'none' ? 'hide' : 'show');
608	var showControl = function(status)
609	{
610		if (status == "show")
611		{
612			BX.fx.show(params['controller'], 'fade', {time:0.2});
613			if (params['switcher'] && params['switcher'].style.display != 'none')
614				BX.fx.hide(params['switcher'], 'fade', {time:0.1});
615			if (!! window['BfileUnbindDispatcher' + params['uid']])
616				window['BfileUnbindDispatcher' + params['uid']]();
617		}
618		else if (params['controller'].style.display !== "none")
619		{
620			BX.fx.hide(params['controller'], 'fade', {time:0.2});
621		}
622	};
623	if (! params['controller'].loaded)
624	{
625		params['controller'].loaded = true;
626		var dropbox = new BX.DD.dropFiles(),
627			variant = (dropbox && dropbox.supported() && BX.ajax.FormData.isSupported() ? 'extended' : 'simple');
628
629		top['BfileFD' + params['uid']] = window['BfileFD' + params['uid']] = new BlogBFileDialog({
630			'mode' : variant,
631			'CID' : params['CID'],
632			'id' : params['id'],
633			'upload_path' : params['upload_path'],
634			'multiple' : params['multiple'],
635			'controller':  params['controller'],
636			'inputName' : params['inputName'],
637			'fileInput' :  ("file-fileUploader-" + params['uid']),
638			'fileInputName' : "mfi_files[]",
639			'values' : BX.findChildren(BX('file-selectdialog-' + params['uid']), {"className" : "file-inline-file"}, true),
640			'msg' : {
641				'loading' : BX.message('loading'),
642				'file_exists' : BX.message('file_exists'),
643				'upload_error' : BX.message('upload_error'),
644				'access_denied' : BX.message('access_denied')
645			}
646		});
647		showControl(status);
648		window['BfileFD' + params['uid']].LoadDialogs('DropInterface');
649		BX.onCustomEvent('BFileDSelectFileDialogLoaded', [window['BfileFD' + params['uid']]]);
650	}
651	else
652		showControl(status);
653}
654window.BlogBFileJustDialog = function(arParams)
655{
656	this.dialogName = 'AttachmentsDialog';
657	this.agent = false;
658
659	this.id = (!!arParams["id"] ? arParams["id"] : this.getID());
660	this.controlID = arParams["id"];
661	this.enabled = true;
662	this.uploadFileUrl = arParams.upload_path; // from file.input php
663
664	this.controller = (!! arParams.controller ) ? arParams.controller : null;
665	this.CID = arParams.CID;
666
667	arParams.caller = this;
668	arParams.doc_prefix = 'wd-doc';
669	arParams._mkFileInput = BX.DoNothing
670	arParams.mode = 'extended';
671	arParams.classes = {
672		'tpl_simple' : 'file-simple',
673		'tpl_extended' : 'file-extended'
674	};
675
676	this.doc_prefix = arParams.doc_prefix;
677
678	if (!!BX.FileUploadAgent) {
679		this.agent = new BX.FileUploadAgent(arParams);
680		BX.addCustomEvent(this, 'StopUpload', BX.delegate(this.StopUpload, this));
681		BX.onCustomEvent(BX(this.controller.parentNode), "BFileDLoadFormControllerInit", [this]);
682	} else {
683		BX.debug('/bitrix/components/bitrix/main.file.input/templates/drag_n_drop/script.
683js: BX.FileUploadAgent is not defined.' +
684			' You need to load /bitrix/js/main/file_upload_agent.js');
685	}
686}
687window.BlogBFileJustDialog.prototype.StopUpload = function(agent, parent)
688{
689	this.agent = agent;
690	id = false;
691	mID = parent.id.match(new RegExp(this.doc_prefix + '(\\d+)'));
692	if (!!mID) {
693		id = mID[1];
694	}
695
696	if (this.controller && this.controller.parentNode)
697		BX.onCustomEvent(this.controller.parentNode, 'OnFileUploadRemove', [id, this]);
698
699	var data = {
700		fileID : id,
701		sessid : BX.bitrix_sessid(),
702		cid : this.CID,
703		controlID : this.controlID,
704		mfi_mode : "delete"
705	};
706	BX.ajax.post(this.uploadFileUrl, data);
707}
708
709
710window.MFIS = function(params)
711{
712	if (! params['controller'].loaded)
713	{
714		params['controller'].loaded = true;
715		top['BfileFD' + params['uid']] = window['BfileFD' + params['uid']] = new BlogBFileJustDialog({
716			'CID' : params['CID'],
717			'id' : params['id'],
718			'upload_path' : params['upload_path'],
719			'controller':  params['controller'],
720			'values' : BX.findChildren(BX('file-selectdialog-' + params['uid']), {"className" : "file-inline-file"}, true)
721		});
722		BX.fx.show(params['controller'], 'fade', {time:0.2});
723		BX.onCustomEvent('BFileDSelectFileDialogLoaded', [window['BfileFD' + params['uid']]]);
724	}
725}
726
727})(window);

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.