PageSourceSearch

http://zavzon.ru/bitrix/templates/sotbit_b2c/components/bitrix/mai…/drag_n_drop/script.js?178101378620597

js zavzon.ru collected 2026-10-08 02:15:50 UTC 20,597 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		this.fileInput.accept = agent.parent?.accept || '';
281	}
282	this.fileList = this.__form;
283
284	BX.loadScript('/bitrix/js/main/core/core_dd.js', BX.delegate(
285		function() {
286			var dropbox = new BX.DD.dropFiles();
287			if (dropbox && dropbox.supported() && BX.ajax.FormData.isSupported())
288			{
289				this.dropbox = dropbox;
290			}
291			this.agent.BindUploadEvents(this);
292		}, this));
293}
294
295window.BlogBFileDialogUploader.prototype.CreateElements = function()
296{
297	var uniqueID;
298	do {
299		uniqueID = Math.floor(Math.random() * 99999);
300	} while(BX("iframe-" + uniqueID));
301
302	var iframeName = "iframe-" + this.id;
303	var iframe = BX.create("IFRAME", {
304		props: {name: iframeName, id: iframeName},
305		style: {display: "none"}
306	});
307	document.body.appendChild(iframe);
308	this.iframeUpload = iframe;
309
310	var form = BX.create("FORM", {
311		props: {
312			id: "form-" + uniqueID,
313			method: "POST",
314			action: this.uploadFileUrl,
315			enctype: "multipart/form-data",
316			encoding: "multipart/form-data",
317			target: iframeName
318		},
319		style: {display: "none"},
320		children: [
321			BX.create("INPUT", {
322				props: {
323					type: "hidden",
324					name: "sessid",
325					value: BX.bitrix_sessid()
326				}
327			}),
328			BX.create("INPUT", {
329				props: {
330					type: "hidden",
331					name: "uniqueID",
332					value: uniqueID
333				}
334			}),
335			BX.create("INPUT", {
336				props: {
337					type: "hidden",
338					name: "cid",
339					value: this.CID
340				}
341			}),
342			BX.create("INPUT", {
343				props: {
344					type: "hidden",
345					name: "controlID",
346					value: (!!this.controlID ? this.controlID : '')
347				}
348			}),
349			BX.create("INPUT", {
350				props: {
351					type: "hidden",
352					name: "mfi_mode",
353					value: "upload"
354				}
355			})
356		]
357	});
358	document.body.appendChild(form);
359	this.__form = form;
360
361	window['FILE_UPLOADER_CALLBACK_' + uniqueID] = BX.proxy(this.Callback, this);
362}
363
364window.BlogBFileDialogUploader.prototype.GetUploadFileName = function()
365{
366	var fileName = '';
367	if (this.fileInput && (this.fileInput.value.length > 0)) {
368		var fileName = this.fileInput.value;
369		if (fileName.indexOf('\\') > -1) // deal with Chrome fakepath
370			fileName = fileName.substr(fileName.lastIndexOf('\\')+1);
371	} else {
372		var fileNode = this.fileList;
373		if (fileNode.file)
374			fileName = fileNode.file.fileName || fileNode.file.name;
375	}
376	return fileName;
377}
378
379window.BlogBFileDialogUploader.prototype.Callback = function(files, uniqueID)
380{
381	if (BX.type.isArray(files))
382	{
383		files.forEach((function(file) {
384			var result = {
385				success: true,
386				storage: 'bfile',
387				element_id: file.fileID,
388				element_name: file.fileName,
389				element_size: file.fileSize,
390				element_url: file.fileURL,
391				element_content_type: file.content_type || file.fileContentType,
392				element_image: file.img_thumb_src || file.fileSrc,
393				element_thumbnail: file.img_source_src || file.fileSrc,
394			};
395			if (!!result.element_image)
396				result.element_image = result.element_image.replace(/\/([^\/]+)$/, function(str, name) { return "/" + BX.util.urlencode(name); } );
397			if (!!result.element_thumbnail)
398				result.element_thumbnail = result.element_thumbnail.replace(/\/([^\/]+)$/, function(str, name) { return "/" + BX.util.urlencode(name); } );
399
400			if (file['error'] || file['status'] === 'error')
401			{
402				result['error'] = file['error'] || file['message'];
403			}
404
405			BX.onCustomEvent(this, 'uploadFinish', [result]);
406		}).bind(this));
407	} else {
408		BX.onCustomEvent(this, 'uploadFinish', [{
409			success: false,
410			messages: BX.type.isNotEmptyString(files) ? files : this.msg.upload_error
411		}]);
412	}
413	window['FILE_UPLOADER_CALLBACK_' + uniqueID] = BX.DoNothing;
414	BX.cleanNode(BX("iframe-" + uniqueID), true);
415	BX.cleanNode(BX("form-" + uniqueID), true);
416	this.agent.uploadDialog = null;
417}
418
419window.BlogBFileDialogUploader.prototype.UploadResponse = function(evt, responseJSONStr)
420{
421	this.WDUploadInProgress = false;
422	BX.unbind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
423
424	if (!  responseJSONStr
425		|| responseJSONStr.length <= 0)
426	{
427		this.onError();
428	}
429}
430
431window.BlogBFileDialogUploader.prototype.UploadResponseIframe = function(evt, responseJSONStr)
432{
433	this.WDUploadInProgress = false;
434	BX.unbind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
435}
436
437window.BlogBFileDialogUploader.prototype.UploadLeave = function(e)
438{
439	var e = e || window.event;
440	var msg = '';
441	if (this.WDUploadInProgress)
442		msg = this.msg.UploadInterrupt;
443	else if (((!this.WDUploaded) && this.fileInput && (this.fileInput.value.length > 0)))
444		msg = this.msg.UploadNotDone;
445	if (msg != '')
446	{
447		if (e)
448			e.returnValue = msg;
449		return msg; // safari & chrome
450	}
451	return;
452}
453
454window.BlogBFileDialogUploader.prototype.UpdateListFiles = function(files)
455{
456	if (this && files)
457	{
458		if (files.length < 1)
459			return;
460		var fileNode = this.fileList;
461		fileNode.file = files[0];
462
463		this.WDUploadInProgress = true;
464		this.fileDropped = true;
465		this.CallSubmit();
466	}
467}
468
469window.BlogBFileDialogUploader.prototype.GetInputData = function(parentNode)
470{
471	var elements = [];
472	var data = {};
473	elements = elements.concat(
474		BX.findChildren(parentNode, {'tag': 'input'}, true),
475		BX.findChildren(parentNode, {'tag': 'textarea'}, true),
476		BX.findChildren(parentNode, {'tag': 'select'}, true));
477
478	for(var i=0; i<elements.length; i++)
479	{
480		var el = elements[i];
481		if (!el || el.disabled || el.name.length < 1)
482			continue;
483		switch(el.type.toLowerCase())
484		{
485			case 'text':
486			case 'textarea':
487			case 'password':
488			case 'hidden':
489			case 'select-one':
490				data[el.name] = el.value;
491				break;
492			case 'radio':
493				if(el.checked)
494					data[el.name] = el.value;
495				break;
496			case 'checkbox':
497				data[el.name] = (el.checked ? 'Y':'N');
498				break;
499			case 'select-multiple':
500				var l = el.options.length;
501				if (l > 0) data[el.name] = new Array();
502				for (j=0; j<l; j++)
503					if (el.options[j].selected)
504						data[el.name].push(el.options[j].value);
505				break;
506			default:
507				break;
508		}
509	}
510	return data;
511}
512
513window.BlogBFileDialogUploader.prototype.SetFileInput = function(fileInput)
514{
515	if (!! this.__form.mfi_save)
516		return;
517	if (this.fileInput && this.fileInput != fileInput)
518		BX.remove(this.fileInput);
519	this.__form.appendChild(fileInput);
520	this.fileInput = fileInput;
521}
522
523window.BlogBFileDialogUploader.prototype.CallSubmit = function()
524{
525	if (!! this.__form.mfi_save)
526		return;
527	BX.onCustomEvent(this, 'uploadStart', [this]);
528
529	BX.bind(window, 'beforeunload', BX.proxy(this.UploadLeave, this));
530	BX.bind(this.iframeUpload, 'load', BX.delegate(this.UploadResponseIframe, this));
531
532	if (this.dropbox) {
533		this.onProgress(0.15);
534		if (this.fileInput && (this.fileInput.files.length > 0)) {
535			var fileNode = this.fileList;
536			fileNode.file = this.fileInput.files[0];
537		}
538
539		var arConstParams = this.GetInputData(this.__form);
540		this.fileNodes = [this.fileList];
541		for (i in this.fileNodes) {
542			if (this.fileNodes[i].file) {
543				var fd = new BX.ajax.FormData();
544
545				for (item in this.fileNodes[i].data)
546				{
547					fd.append(item, this.fileNodes[i].data[item]);
548				}
549
550				if (!! Object && !! Object.keys) // for IE 10 ....
551				{
552					var keys = Object.keys(arConstParams);
553					for (var k in keys)
554					{
555						var key = keys[k]
556						var cons = arConstParams[key]
557						fd.append(key, cons);
558					}
559				}
560				else
561				{
562					for (item in arConstParams)
563					{
564						fd.append(item, arConstParams[item]);
565					}
566				}
567
568				fd.append('mfi_files[]', this.fileNodes[i].file);
569
570				fd.send(
571					this.uploadFileUrl,
572					BX.delegate(function(ajaxdata) {
573						this.UploadResponse(null, ajaxdata);
574					}, this),
575					BX.delegate(this.onProgress, this)
576				);
577			}
578		}
579	} else {
580		this.onProgress(0.15);
581		this.WDUploadInProgress = true;
582		var fid = this.__form.id;
583		BX.submit(this.__form, 'mfi_save', 'Y');
584	}
585}
586
587window.BlogBFileDialogUploader.prototype.onProgress = function(percent)
588{
589	if (isNaN(percent))
590		return;
591	BX.onCustomEvent(this, 'progress', [percent]);
592}
593
594window.BlogBFileDialogUploader.prototype.onError = function()
595{
596	BX.onCustomEvent(this, 'uploadFinish', [{success: false, messages: this.msg.upload_error}]);
597}
598
599top.BlogBFileDialog = window.BlogBFileDialog;
600top.BlogBFileDialogUploader = window.BlogBFileDialogUploader;
601top.BlogBFileDialogDispatcher = window.BlogBFileDialogDispatcher;
602
603window.MFIDD = function(params){
604	var status = (params["status"] === 'show' ? 'show' : (params["status"] === 'hide' ? 'hide' : 'switch'));
605	if (status == 'switch')
606		status = (params['controller'].style.display != 'none' ? 'hide' : 'show');
607	var showControl = function(status)
608	{
609		if (status == "show")
610		{
611			BX.fx.show(params['controller'], 'fade', {time:0.2});
612			if (params['switcher'] && params['switcher'].style.display != 'none')
613				BX.fx.hide(params['switcher'], 'fade', {time:0.1});
614			if (!! window['BfileUnbindDispatcher' + params['uid']])
615				window['BfileUnbindDispatcher' + params['uid']]();
616		}
617		else if (params['controller'].style.display !== "none")
618		{
619			BX.fx.hide(params['controller'], 'fade', {time:0.2});
620		}
621	};
622	if (! params['controller'].loaded)
623	{
624		params['controller'].loaded = true;
625		var dropbox = new BX.DD.dropFiles(),
626			variant = (dropbox && dropbox.supported() && BX.ajax.FormData.isSupported() ? 'extended' : 'simple');
627
628		top['BfileFD' + params['uid']] = window['BfileFD' + params['uid']] = new BlogBFileDialog({
629			'mode' : variant,
630			'CID' : params['CID'],
631			'id' : params['id'],
632			'upload_path' : params['upload_path'],
633			'multiple' : params['multiple'],
634			'controller':  params['controller'],
635			'inputName' : params['inputName'],
636			'fileInput' :  ("file-fileUploader-" + params['uid']),
637			'fileInputName' : "mfi_files[]",
638			'accept': params.accept,
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.