PageSourceSearch

https://aeroscreen.ru/bitrix/js/main/core/core_uploader/uploader.js

js aeroscreen.ru collected 2026-10-08 23:50:56 UTC 100,786 bytes, 2,930 lines download raw bytes

1(function (exports,main_core,main_core_events) {
2	'use strict';
3
4	function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
5
6	function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
7
8	function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
9
10	function _classCheckPrivateStaticFieldDescriptor(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } }
11
12	function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } }
13
14	function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
15
16	var Options = /*#__PURE__*/function () {
17	  function Options() {
18	    babelHelpers.classCallCheck(this, Options);
19	  }
20
21	  babelHelpers.createClass(Options, null, [{
22	    key: "getEventName",
23	    value: function getEventName(eventName) {
24	      return [this.getEventNamespace()].concat(babelHelpers.toConsumableArray(eventName)).join(':');
25	    }
26	  }, {
27	    key: "getEventNamespace",
28	    value: function getEventNamespace() {
29	      return 'BX:Main:Uploader:';
30	    }
31	  }, {
32	    key: "calibratePostSize",
33	    value: function calibratePostSize(deltaTime, size) {
34	      if (deltaTime <= 0) {
35	        return;
36	      }
37
38	      if (deltaTime < this.defaultSettings['estimatedTimeForUploadFile']) {
39	        var sizes = [this.defaultSettings['currentPostSize'] * 2, this.defaultSettings["phpPostMaxSize"]];
40
41	        if (size > 0) {
42	          sizes.push(Math.ceil(size * this.defaultSettings['estimatedTimeForUploadFile'] * 1000 / deltaTime));
43	        }
44
45	        this.defaultSettings['currentPostSize'] = Math.min.apply(Math, sizes);
46	      } else {
47	        this.defaultSettings['currentPostSize'] = Math.max(Math.ceil(this.defaultSettings['currentPostSize'] / 2), this.defaultSettings['phpPostMinSize']);
48	      }
49
50	      this.defaultSettings['currentPostSize'] = Math.max(this.defaultSettings['currentPostSize'], this.defaultSettings['phpPostMinSize']);
51	    }
52	  }, {
53	    key: "getUploadLimits",
54	    value: function getUploadLimits(key) {
55	      if (!this.defaultSettings) {
56	        this.defaultSettings = {
57	          currentPostSize: 5.5 * 1024 * 1024,
58	          phpPostMinSize: 5.5 * 1024 * 1024,
59	          // Bytes
60	          phpUploadMaxFilesize: Math.min(/^d+$/.test(main_core.Loc.getMessage('phpUploadMaxFilesize')) ? main_core.Loc.getMessage('phpUploadMaxFilesize') : 5 * 1024 * 1024, 5 * 1024 * 1024),
61	          // Bytes 5MB because of Cloud
62	          phpMaxFileUploads: Math.max(/^d+$/.test(main_core.Loc.getMessage('phpMaxFileUploads')) ? main_core.Loc.getMessage('phpMaxFileUploads') : 20, 20),
63	          phpPostMaxSize: /^d+$/.test(main_core.Loc.getMessage('phpPostMaxSize')) ? main_core.Loc.getMessage('phpPostMaxSize') : 11 * 1024 * 1024,
64	          // Bytes
65	          estimatedTimeForUploadFile: 10 * 60,
66	          // in sec
67	          maxSize: this.getMaxSize()
68	        };
69	      }
70
71	      if (key) {
72	        return this.defaultSettings[key];
73	      }
74
75	      return this.defaultSettings;
76	    }
77	  }, {
78	    key: "getFileTypes",
79	    value: function getFileTypes() {
80	      return ['A', //'A'll files
81	      'I', //'I'mages
82	      'F' //'F'iles with selected extensions
83	      ];
84	    }
85	  }, {
86	    key: "getImageExtensions",
87	    value: function getImageExtensions() {
88	      return ["jpg", "bmp", "jpeg", "jpe", "gif", "png", "webp"];
89	    }
90	  }, {
91	    key: "getMaxSize",
92	    value: function getMaxSize() {
93	      if (_classStaticPrivateFieldSpecGet(this, Options, _quota) !== null && !_classStaticPrivateFieldSpecGet(this, Options, _quota)) {
94	        if (/^\d+$/.test(main_core.Loc.getMessage("bxQuota"))) {
95	          _classStaticPrivateFieldSpecSet(this, Options, _quota, parseInt(main_core.Loc.getMessage("bxQuota")));
96	        } else {
97	          _classStaticPrivateFieldSpecSet(this, Options, _quota, null);
98	        }
99	      }
100
101	      return _classStaticPrivateFieldSpecGet(this, Options, _quota);
102	    }
103	  }, {
104	    key: "decrementMaxSize",
105	    value: function decrementMaxSize(size) {
106	      if (this.getMaxSize() !== null) {
107	        _classStaticPrivateFieldSpecSet(this, Options, _quota, _classStaticPrivateFieldSpecGet(this, Options, _quota) - size);
108	      }
109
110	      return _classStaticPrivateFieldSpecGet(this, Options, _quota);
111	    }
112	  }, {
113	    key: "getMaxTimeToUploading",
114	    value: function getMaxTimeToUploading() {
115	      return 900;
116	    }
117	  }, {
118	    key: "getVersion",
119	    value: function getVersion() {
120	      return '1';
121	    }
122	  }]);
123	  return Options;
124	}();
125
126	babelHelpers.defineProperty(Options, "defaultSettings", null);
127	var _quota = {
128	  writable: true,
129	  value: void 0
130	};
131	babelHelpers.defineProperty(Options, "uploadStatus", {
132	  ready: 'upload is ready',
133	  preparing: 'upload is not started, but preparing',
134	  inProgress: 'upload is in active streaming',
135	  done: 'upload is in successfully done',
136	  error: 'upload is in finished with errors',
137	  stopped: 'PAUSE'
138	});
139	babelHelpers.defineProperty(Options, "fileStatus", {
140	  ready: 'fileIsReady',
141	  removed: 'fileIsRemoved',
142	  restored: 'fileIsRestored',
143	  errored: 'fileIsBad'
144	});
145
146	var DropZone = /*#__PURE__*/function () {
147	  function DropZone(dropZoneNode) {
148	    babelHelpers.classCallCheck(this, DropZone);
149
150	    if (main_core.Type.isStringFilled(dropZoneNode)) {
151	      dropZoneNode = document.getElementById(dropZoneNode);
152	    }
153
154	    if (main_core.Type.isDomNode(dropZoneNode) && BX.DD && BX.ajax.FormData.isSupported()) {
155	      this.initialize(dropZoneNode);
156	    }
157	  }
158
159	  babelHelpers.createClass(DropZone, [{
160	    key: "initialize",
161	    value: function initialize(dropZoneNode) {
162	      var _this = this;
163
164	      this.dndObject = new BX.DD.dropFiles(dropZoneNode);
165
166	      if (!this.dndObject || !this.dndObject.supported()) {
167	        return;
168	      }
169
170	      var handlers = {
171	        dropFiles: function dropFiles(_ref) {
172	          var _ref$compatData = babelHelpers.slicedToArray(_ref.compatData, 2),
173	              files = _ref$compatData[0],
174	              e = _ref$compatData[1];
175
176	          if (e && e["dataTransfer"] && e["dataTransfer"]["items"] && e["dataTransfer"]["items"].length > 0) {
177	            var replaceFileArray = false;
178	            var fileCopies = [];
179	            var item;
180
181	            for (var i = 0; i < e["dataTransfer"]["items"].length; i++) {
182	              item = e["dataTransfer"]["items"][i];
183
184	              if (item["webkitGetAsEntry"] && item["getAsFile"]) {
185	                replaceFileArray = true;
186	                var entry = item["webkitGetAsEntry"]();
187
188	                if (entry && entry.isFile) {
189	                  fileCopies.push(item["getAsFile"]());
190	                }
191	              }
192	            }
193
194	            if (replaceFileArray) files = fileCopies;
195	          }
196
197	          main_core_events.EventEmitter.emit(_this, Options.getEventName('caught'), {
198	            files: files
199	          });
200	        },
201	        dragEnter: function dragEnter(_ref2) {
202	          var _ref2$compatData = babelHelpers.slicedToArray(_ref2.compatData, 1),
203	              e = _ref2$compatData[0];
204
205	          var isFileTransfer = false;
206
207	          if (e && e["dataTransfer"] && e["dataTransfer"]["types"]) {
208	            for (var i = 0; i < e["dataTransfer"]["types"].length; i++) {
209	              if (e["dataTransfer"]["types"][i] === "Files") {
210	                isFileTransfer = true;
211	                break;
212	              }
213	            }
214	          }
215
216	          if (isFileTransfer) {
217	            _this.dndObject.DIV.classList.add('bxu-file-input-over');
218
219	            BX.onCustomEvent(_this, 'dragEnter', [e]); // compatibility event
220	          }
221	        },
222	        dragLeave: function dragLeave(_ref3) {
223	          var _ref3$compatData = babelHelpers.slicedToArray(_ref3.compatData, 1),
224	              e = _ref3$compatData[0];
225
226	          _this.dndObject.DIV.classList.remove('bxu-file-input-over');
227
228	          BX.onCustomEvent(_this, 'dragLeave', [e]); // compatibility event
229	        }
230	      };
231	      main_core_events.EventEmitter.subscribe(this.dndObject, 'dropFiles', handlers.dropFiles);
232	      main_core_events.EventEmitter.subscribe(this.dndObject, 'dragEnter', handlers.dragEnter);
233	      main_core_events.EventEmitter.subscribe(this.dndObject, 'dragLeave', handlers.dragLeave);
234	    }
235	  }, {
236	    key: "destroy",
237	    value: function destroy() {
238	      main_core_events.EventEmitter.unsubscribeAll(this.dndObject);
239	      delete this.dndObject.DIV;
240	      delete this.dndObject;
241	    }
242	  }]);
243	  return DropZone;
244	}();
245
246	var buildAjaxPromiseToRestoreCsrf = function buildAjaxPromiseToRestoreCsrf(config, withoutRestoringCsrf) {
247	  withoutRestoringCsrf = withoutRestoringCsrf || false;
248	  var originalConfig = Object.assign({}, config);
249	  var request = null;
250
251	  config.onrequeststart = function (xhr) {
252	    request = xhr;
253	  };
254
255	  var promise = BX.ajax.promise(config);
256	  return promise.then(function (response) {
257	    if (!withoutRestoringCsrf && main_core.Type.isPlainObject(response) && response['errors']) {
258	      var csrfProblem = false;
259	      response.errors.forEach(function (error) {
260	        if (error.code === 'invalid_csrf' && error.customData.csrf) {
261	          BX.message({
262	            'bitrix_sessid': error.customData.csrf
263	          });
264	          originalConfig.headers = originalConfig.headers || [];
265	          originalConfig.headers = originalConfig.headers.filter(function (header) {
266	            return header && header.name !== 'X-Bitrix-Csrf-Token';
267	          });
268	          originalConfig.headers.push({
269	            name: 'X-Bitrix-Csrf-Token',
270	            value: BX.bitrix_sessid()
271	          });
272	          csrfProblem = true;
273	        }
274	      });
275
276	      if (csrfProblem) {
277	        return buildAjaxPromiseToRestoreCsrf(originalConfig, true);
278	      }
279	    }
280
281	    return response;
282	  }).then(function (response) {
283	    var assetsLoaded = new BX.Promise();
284	    assetsLoaded.fulfill(response);
285	    return assetsLoaded;
286	  }).catch(function (_ref) {
287	    var reason = _ref.reason,
288	        data = _ref.data;
289
290	    if (reason === 'status' && data && (String(data).indexOf('503') >= 0 || String(data).indexOf('504') >= 0)) {
291	      originalConfig['50xCounter'] = (originalConfig['50xCounter'] || 0) + 1;
292
293	      if (originalConfig['50xCounter'] <= 2) {
294	        var headers = request.getAllResponseHeaders().trim().split(/[\r\n]+/);
295	        var headerMap = {};
296	        headers.forEach(function (line) {
297	          var parts = line.split(': ');
298	          var header = parts.shift().toLowerCase();
299	          headerMap[header] = parts.join(': ');
300	        });
301	        var timeoutSec = null;
302
303	        if (headerMap['retry-after'] && /\d+/.test(headerMap['retry-after'])) {
304	          timeoutSec = parseInt(headerMap['retry-after']);
305	        }
306
307	        var p = new BX.Promise();
308	        setTimeout(function () {
309	          p.fulfill();
310	        }, (timeoutSec || 20) * 1000);
311	        return p.then(function () {
312	          return buildAjaxPromiseToRestoreCsrf(originalConfig);
313	        });
314	      }
315	    }
316
317	    var ajaxReject = new BX.Promise();
318
319	    if (main_core.Type.isPlainObject(data) && data.status && data.hasOwnProperty('data')) {
320	      ajaxReject.reject(data);
321	    } else {
322	      ajaxReject.reject({
323	        status: 'error',
324	        data: {
325	          ajaxRejectData: data
326	        },
327	        errors: [{
328	          code: 'NETWORK_ERROR',
329	          message: 'Network error'
330	        }]
331	      });
332	    }
333
334	    return ajaxReject;
335	  });
336	};
337
338	var Stream = /*#__PURE__*/function (_EventEmitter) {
339	  babelHelpers.inherits(Stream, _EventEmitter);
340
341	  function Stream() {
342	    var _this;
343
344	    babelHelpers.classCallCheck(this, Stream);
345	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Stream).call(this));
346
347	    _this.setEventNamespace(Options.getEventNamespace());
348
349	    _this.onprogress = _this.onprogress.bind(babelHelpers.assertThisInitialized(_this));
350	    _this.onprogressupload = _this.onprogressupload.bind(babelHelpers.assertThisInitialized(_this));
351	    return _this;
352	  }
353
354	  babelHelpers.createClass(Stream, [{
355	    key: "send",
356	    value: function send(url, formData) {
357	      var _this2 = this;
358
359	      this.deltaTime = -1 * new Date().getTime();
360	      this.totalSize = null;
361	      buildAjaxPromiseToRestoreCsrf({
362	        method: 'POST',
363	        dataType: 'json',
364	        url: url,
365	        data: formData,
366	        timeout: Options.getMaxTimeToUploading(),
367	        preparePost: false,
368	        headers: [{
369	          name: 'X-Bitrix-Csrf-Token',
370	          value: BX.bitrix_sessid()
371	        }, {
372	          name: 'X-Bitrix-Site-Id',
373	          value: BX.message.SITE_ID || ''
374	        }],
375	        onprogress: this.onprogress,
376	        onprogressupload: this.onprogressupload
377	      }).then(function (response) {
378	        _this2.done({
379	          status: 'success',
380	          data: response
381	        });
382	      }).catch(function (_ref2) {
383	        var errors = _ref2.errors,
384	            data = _ref2.data;
385
386	        _this2.done({
387	          status: 'failed',
388	          errors: errors.map(function (_ref3) {
389	            var code = _ref3.code,
390	                message = _ref3.message;
391	            return message;
392	          }),
393	          data: data
394	        });
395	      }).catch(function (response) {
396	        _this2.done({
397	          status: 'failed',
398	          errors: ['Unexpected server response.'],
399	          data: response
400	        });
401	      });
402	    }
403	  }, {
404	    key: "onprogress",
405	    value: function onprogress(e) {}
406	  }, {
407	    key: "onprogressupload",
408	    value: function onprogressupload(e) {
409	      var procent = 5;
410
411	      if (babelHelpers.typeof(e) == "object" && e.lengthComputable) {
412	        procent = e.loaded * 100 / (e["total"] || e["totalSize"]);
413	        this.totalSize = e["total"] || e["totalSize"];
414	      } else if (e > procent) procent = e;
415
416	      procent = procent > 5 ? procent : 5;
417	      this.emit('progress', procent);
418	    }
419	  }, {
420	    key: "done",
421	    value: function done(response) {
422	      this.deltaTime += new Date().getTime();
423	      Options.calibratePostSize(this.deltaTime, this.totalSize);
424	      this.emit('done', response);
425	    }
426	  }, {
427	    key: "destroy",
428	    value: function destroy() {
429	      console.log('Clear all from stream');
430	    }
431	  }]);
432	  return Stream;
433	}(main_core_events.EventEmitter);
434
435	function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
436
437	function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
438
439	var _currentFileToUpload = /*#__PURE__*/new WeakMap();
440
441	var PackageFile = /*#__PURE__*/function (_EventEmitter) {
442	  babelHelpers.inherits(PackageFile, _EventEmitter);
443
444	  //null|ready
445	  //null|inprogress|done|errored
446	  function PackageFile(item, pack) {
447	    var _this;
448
449	    babelHelpers.classCallCheck(this, PackageFile);
450	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(PackageFile).call(this));
451	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "isReadyToPack", true);
452	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "packStatus", null);
453	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "packPercent", 0);
454	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "uploadStatus", null);
455
456	    _classPrivateFieldInitSpec(babelHelpers.assertThisInitialized(_this), _currentFileToUpload, {
457	      writable: true,
458	      value: null
459	    });
460
461	    _this.setEventNamespace(Options.getEventNamespace());
462
463	    _this.item = item; // item with a node
464
465	    _this.id = item.getId();
466	    _this.name = item.name;
467	    _this.fileStatus = Options.fileStatus.ready; // ready|remove|restore
468
469	    _this.isReadyToPack = item.preparationStatus === _this.constructor.preparationStatusIsDone;
470	    _this.copiesCount = item.getThumbs("getCount") + 1;
471	    main_core_events.EventEmitter.subscribeOnce(item, 'onFileIsDeleted', function () {
472	      _this.fileStatus = Options.fileStatus.removed;
473	    });
474
475	    if (!_this.isReadyToPack) {
476	      main_core_events.EventEmitter.subscribeOnce(item, 'onFileIsPrepared', function () {
477	        _this.isReadyToPack = true;
478
479	        _this.emit('onReady');
480	      });
481	      main_core_events.EventEmitter.emit(item, 'onFileHasToBePrepared', new main_core_events.BaseEvent({
482	        compatData: [item.getId(), item]
483	      }));
484	    }
485
486	    return _this;
487	  }
488
489	  babelHelpers.createClass(PackageFile, [{
490	    key: "isReady",
491	    value: function isReady() {
492	      return this.isReadyToPack;
493	    }
494	  }, {
495	    key: "isRemoved",
496	    value: function isRemoved() {
497	      return this.fileStatus === Options.fileStatus.removed;
498	    }
499	  }, {
500	    key: "isPacked",
501	    value: function isPacked() {
502	      return this.packStatus === Options.uploadStatus.done;
503	    }
504	  }, {
505	    key: "getId",
506	    value: function getId() {
507	      return this.id;
508	    }
509	  }, {
510	    key: "markAsPacked",
511	    value: function markAsPacked(percentToIncrement) {
512	      if (percentToIncrement === true) {
513	        this.packStatus = Options.uploadStatus.done;
514	        this.packPercent = 100;
515	      } else {
516	        this.packPercent += percentToIncrement / this.copiesCount;
517	        this.packPercent = this.packPercent > 100 ? 100 : this.packPercent;
518	      }
519	    }
520	  }, {
521	    key: "packFile",
522	    value: function packFile() {
523	      var result = {
524	        error: false,
525	        done: true,
526	        data: null
527	      };
528
529	      if (this.isRemoved()) {
530	        result.data = {
531	          removed: 'Y',
532	          name: this.name
533	        };
534	        this.markAsPacked(true);
535	      }
536
537	      if (this.isPacked()) {
538	        return result;
539	      }
540
541	      var currentBlob;
542	      var copyName = 'default';
543
544	      if (this.packStatus === null) {
545	        result.data = this.item.getProps() || {
546	          name: this.name
547	        };
548
549	        if (this.item['restored']) {
550	          result.data['restored'] = this.item['restored'];
551	          delete this.item['restored'];
552	        }
553
554	        this.packStatus = Options.uploadStatus.inProgress;
555	        currentBlob = this.item["file"];
556	      } else if (babelHelpers.classPrivateFieldGet(this, _currentFileToUpload) instanceof Blob) {
557	        currentBlob = babelHelpers.classPrivateFieldGet(this, _currentFileToUpload);
558	        babelHelpers.classPrivateFieldSet(this, _currentFileToUpload, null);
559	      } else {
560	        currentBlob = this.item.getThumbs(null);
561
562	        if (currentBlob === null) {
563	          this.markAsPacked(true);
564	          return result;
565	        }
566
567	        copyName = currentBlob['thumb'];
568	      }
569
570	      var packingPercent = 100;
571
572	      if (currentBlob instanceof Blob) // Regular behaviour
573	        {
574	          var blob = BX.UploaderUtils.getFilePart(currentBlob, Options.getUploadLimits('phpUploadMaxFilesize'));
575
576	          if (blob && blob !== currentBlob) {
577	            if (blob.packages - blob.package > 1) {
578	              babelHelpers.classPrivateFieldSet(this, _currentFileToUpload, currentBlob);
579	            }
580
581	            packingPercent = blob.size / currentBlob.size * 100;
582	            copyName = [copyName, '.ch', blob.package, '.', (blob.start > 0 ? blob.start : "0") + '.chs' + blob.packages].join('');
583	            blob.name = copyName;
584	          }
585
586	          currentBlob = blob;
587	        }
588
589	      if (currentBlob) {
590	        result.data = result.data || {
591	          name: this.name
592	        };
593
594	        if (currentBlob instanceof Blob) {
595	          result.data[copyName] = currentBlob;
596	        } else {
597	          result.data['files'] = result.data['files'] || {};
598	          result.data['files'][copyName] = currentBlob;
599	        }
600	      }
601
602	      if (result.data) {
603	        result.done = false;
604	        this.markAsPacked(packingPercent);
605	      } else {
606	        this.markAsPacked(true);
607	      }
608
609	      return result;
610	    }
611	  }, {
612	    key: "parseResponse",
613	    value: function parseResponse(_ref) {// console.log('parseResponse: ', this.getId(), file);
614
615	      var file = _ref.file,
616	          hash = _ref.hash,
617	          status = _ref.status;
618	    }
619	  }, {
620	    key: "size",
621	    get: function get() {
622	      return this.item ? this.item.size || 0 : 0;
623	    }
624	  }]);
625	  return PackageFile;
626	}(main_core_events.EventEmitter);
627
628	babelHelpers.defineProperty(PackageFile, "preparationStatusIsDone", 4);
629
630	var getFormDataSize = function getFormDataSize(formData) {
631	  var entries = formData.entries();
632	  var entry,
633	      filesCount = 0,
634	      formSize = 0;
635
636	  while ((entry = entries.next()) && entry.done === false) {
637	    var _entry$value = babelHelpers.slicedToArray(entry.value, 2),
638	        name = _entry$value[0],
639	        value = _entry$value[1];
640
641	    if (value instanceof Blob) {
642	      filesCount++;
643	      formSize += value.size;
644	    } else {
645	      formSize += value.toString().length;
646	    }
647
648	    formSize += name.toString().length;
649	  }
650
651	  return [formSize, filesCount];
652	};
653
654	var convertFormDataToObject = function convertFormDataToObject(formData) {
655	  var entries = formData.entries();
656	  var entry;
657	  var data = {};
658
659	  while ((entry = entries.next()) && entry.done === false) {
660	    var _entry$value2 = babelHelpers.slicedToArray(entry.value, 2),
661	        name = _entry$value2[0],
662	        value = _entry$value2[1];
663
664	    if (name.indexOf('[') <= 0) {
665	      data[name] = value;
666	    } else {
667	      (function () {
668	        var names = [name.substring(0, name.indexOf('['))];
669	        name.replace(/\[(.*?)\]/gi, function (n, nn) {
670	          names.push(nn.length > 0 ? nn : '');
671	        });
672	        var n = void 0;
673	        var pointer = data;
674
675	        while (n = names.shift()) {
676	          if (n === '') {
677	            pointer.push(value);
678	            break;
679	          } else if (names.length <= 0) {
680	            pointer[n] = value;
681	            break;
682	          } else if (names[0] === '') {
683	            pointer[n] = pointer[n] || [];
684	            pointer = pointer[n];
685	          } else {
686	            pointer[n] = pointer[n] || {};
687	            pointer = pointer[n];
688	          }
689	        }
690	      })();
691	    }
692	  }
693
694	  return data;
695	};
696
697	var copyFormToForm = function copyFormToForm(fromData1, formData2) {
698	  var entries = fromData1.entries();
699	  var entry;
700
701	  while ((entry = entries.next()) && entry.done === false) {
702	    var _entry$value3 = babelHelpers.slicedToArray(entry.value, 2),
703	        name = _entry$value3[0],
704	        value = _entry$value3[1];
705
706	    if (value instanceof Blob) {
707	      formData2.append(name, value, value.name);
708	    } else {
709	      formData2.append(name, value);
710	    }
711	  }
712	};
713
714	var appendToForm = function appendToForm(formData, ob, prefix) {
715	  for (var ii in ob) {
716	    if (ob.hasOwnProperty(ii)) {
717	      var name = (prefix ? prefix + '[#name#]' : '#name#').replace('#name#', ii);
718
719	      if (main_core.Type.isPlainObject(ob[ii])) {
720	        appendToForm(formData, ob[ii], name);
721	      } else {
722	        if (ob[ii] instanceof Blob) {
723	          formData.append(name, ob[ii], ob[ii]['name'] || ii);
724	        } else {
725	          formData.append(name, ob[ii]);
726	        }
727	      }
728	    }
729	  }
730	};
731
732	function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); }
733
734	function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
735
736	var _formDataFilesCount = /*#__PURE__*/new WeakMap();
737
738	var _formDataSize = /*#__PURE__*/new WeakMap();
739
740	var Package = /*#__PURE__*/function (_EventEmitter) {
741	  babelHelpers.inherits(Package, _EventEmitter);
742
743	  function Package(_ref) {
744	    var _this;
745
746	    var id = _ref.id,
747	        formData = _ref.formData,
748	        files = _ref.files,
749	        uploadFileUrl = _ref.uploadFileUrl,
750	        uploadInputName = _ref.uploadInputName;
751	    babelHelpers.classCallCheck(this, Package);
752	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Package).call(this));
753	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "length", 0);
754	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "filesVirgin", new Set());
755	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "filesInprogress", new Set());
756	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "files", new Map());
757
758	    _classPrivateFieldInitSpec$1(babelHelpers.assertThisInitialized(_this), _formDataFilesCount, {
759	      writable: true,
760	      value: 0
761	    });
762
763	    _classPrivateFieldInitSpec$1(babelHelpers.assertThisInitialized(_this), _formDataSize, {
764	      writable: true,
765	      value: 0
766	    });
767
768	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "makeAPackTimeout", 0);
769	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "uploadStatus", Options.uploadStatus.ready);
770	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "errors", []);
771	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "response", {
772	      status: 'start'
773	    });
774
775	    _this.setEventNamespace(Options.getEventNamespace());
776
777	    _this.id = id;
778	    _this.formData = formData;
779	    _this.uploadFileUrl = uploadFileUrl;
780	    _this.uploadInputName = uploadInputName;
781
782	    _this.initFiles(files);
783
784	    console.log('2. Package is created with ', _this.filesVirgin.size, ' files.');
785	    _this.doneStreaming = _this.doneStreaming.bind(babelHelpers.assertThisInitialized(_this));
786	    _this.progressStreaming = _this.progressStreaming.bind(babelHelpers.assertThisInitialized(_this));
787	    return _this;
788	  }
789
790	  babelHelpers.createClass(Package, [{
791	    key: "getId",
792	    value: function getId() {
793	      return this.id;
794	    }
795	  }, {
796	    key: "initFiles",
797	    value: function initFiles(files) {
798	      var _this2 = this;
799
800	      files.forEach(function (fileItem) {
801	        var uploadFile = new PackageFile(fileItem);
802
803	        _this2.filesVirgin.add(uploadFile.getId());
804
805	        _this2.files.set(uploadFile.getId(), uploadFile);
806	      });
807	    }
808	  }, {
809	    key: "prepare",
810	    value: function prepare() {
811	      var _getFormDataSize = getFormDataSize(this.formData),
812	          _getFormDataSize2 = babelHelpers.slicedToArray(_getFormDataSize, 2),
813	          formSize = _getFormDataSize2[0],
814	          filesCount = _getFormDataSize2[1];
815
816	      console.log('2.1 Prepare form with files: ', filesCount, ' and formSize: ', parseInt(formSize), 'B');
817
818	      if (Options.getUploadLimits('phpMaxFileUploads') <= filesCount) {
819	        this.error('Too many files in your form. ');
820	        return false;
821	      }
822
823	      if (Options.getUploadLimits('phpPostMaxSize') - formSize < Options.getUploadLimits('phpPostMinSize')) {
824	        this.error('Too much data in your form. ');
825	        return false;
826	      }
827
828	      var packSize = 0;
829	      this.files.forEach(function (file) {
830	        packSize += file.size;
831	      });
832
833	      if (Options.getMaxSize() !== null && Options.getMaxSize() < packSize) {
834	        this.error('There is not enough space on your server.');
835	        return false;
836	      }
837
838	      Options.decrementMaxSize(packSize);
839	      babelHelpers.classPrivateFieldSet(this, _formDataSize, formSize);
840	      babelHelpers.classPrivateFieldSet(this, _formDataFilesCount, filesCount);
841	      return true;
842	    }
843	  }, {
844	    key: "run",
845	    value: function run(stream) {
846	      if (this.uploadStatus !== Options.uploadStatus.ready) {
847	        return;
848	      }
849
850	      console.log('4. Package is running with a stream: ', stream);
851	      this.uploadStatus = Options.uploadStatus.preparing;
852	      return this.startStreaming(stream);
853	    }
854	  }, {
855	    key: "bindStream",
856	    value: function bindStream(stream) {
857	      if (stream === this.stream) {
858	        return;
859	      }
860
861	      this.stream = stream;
862	      stream.subscribe('done', this.doneStreaming);
863	      stream.subscribe('progress', this.progressStreaming);
864	    }
865	  }, {
866	    key: "unbindStream",
867	    value: function unbindStream(stream) {
868	      if (stream || this.stream) {
869	        (stream || this.stream).unsubscribe('done', this.doneStreaming);
870	        (stream || this.stream).unsubscribe('progress', this.progressStreaming);
871
872	        if (stream === this.stream) {
873	          delete this.stream;
874	        }
875	      }
876	    }
877	  }, {
878	    key: "makeAPack",
879	    value: function makeAPack(formSize, filesCount, formData) {
880	      var _this3 = this;
881
882	      while (formSize - Options.getUploadLimits('phpUploadMaxFilesize') > 0 && filesCount > 0) {
883	        if (this.filesVirgin.size <= 0) {
884	          break;
885	        }
886
887	        var entry = this.filesVirgin.entries().next();
888
889	        if (entry.done === true) {
890	          break;
891	        }
892	        /*@var uploadItem: PackageFile */
893
894
895	        var _entry$value = babelHelpers.slicedToArray(entry.value, 1),
896	            uploadItemId = _entry$value[0];
897
898	        var uploadItem = this.files.get(uploadItemId);
899
900	        if (!uploadItem.isReady()) {
901	          return uploadItem.subscribeOnce('onReady', function () {
902	            _this3.makeAPack(formSize, filesCount, formData);
903	          });
904	        }
905
906	        var result = uploadItem.packFile();
907
908	        if (result.data) {
909	          var name = "".concat(this.uploadInputName, "[").concat(uploadItem.getId(), "]");
910	          var tmpFormData = new FormData();
911	          appendToForm(tmpFormData, result.data, name);
912
913	          var _getFormDataSize3 = getFormDataSize(tmpFormData),
914	              _getFormDataSize4 = babelHelpers.slicedToArray(_getFormDataSize3, 2),
915	              tmpFormSize = _getFormDataSize4[0],
916	              tmpFilesCount = _getFormDataSize4[1];
917
918	          copyFormToForm(tmpFormData, formData);
919	          formSize -= tmpFormSize;
920	          filesCount -= tmpFilesCount;
921	          this.filesInprogress.add(uploadItemId);
922	        }
923
924	        if (result.done === true) {
925	          this.filesVirgin.delete(uploadItemId);
926	        }
927	      }
928
929	      return this.emit('onPackIsReady', formData);
930	    }
931	  }, {
932	    key: "startStreaming",
933	    value: function startStreaming(stream) {
934	      this.bindStream(stream);
935	      this.doStreaming(stream);
936	    }
937	  }, {
938	    key: "doStreaming",
939	    value: function doStreaming(stream) {
940	      var _this4 = this;
941
942	      this.subscribeOnce('onPackIsReady', function (_ref2) {
943	        var data = _ref2.data;
944	        console.log('onPackIsReady: ', data);
945	        console.groupEnd('Make a pack.');
946	        clearTimeout(_this4.makeAPackTimeout);
947	        _this4.makeAPackTimeout = 0;
948
949	        if (data instanceof FormData) {
950	          var firstValue = data.entries().next();
951
952	          if (firstValue.done === true && !firstValue.value) {
953	            return _this4.checkAndDone(stream);
954	          }
955
956	          copyFormToForm(_this4.formData, data);
957	          console.log('4.1. Start streaming');
958	          return stream.send(_this4.uploadFileUrl, data);
959	        }
960
961	        _this4.error('Package: error in packing');
962	      });
963	      var formSize = Math.min(Options.getUploadLimits('currentPostSize'), Options.getUploadLimits('phpPostMaxSize') - babelHelpers.classPrivateFieldGet(this, _formDataSize));
964	      var filesCount = Options.getUploadLimits('phpMaxFileUploads') - babelHelpers.classPrivateFieldGet(this, _formDataFilesCount);
965	      var fromData = new FormData();
966	      console.group('Make a pack.');
967	      this.makeAPack(formSize, filesCount, fromData);
968	      this.makeAPackTimeout = setTimeout(function () {
969	        _this4.emit('onPackIsReady', null);
970	      }, Options.getUploadLimits('estimatedTimeForUploadFile') * 1000);
971	    }
972	  }, {
973	    key: "doneStreaming",
974	    value: function doneStreaming(_ref3) {
975	      var stream = _ref3.target,
976	          _ref3$data = _ref3.data,
977	          status = _ref3$data.status,
978	          data = _ref3$data.data,
979	          errors = _ref3$data.errors;
980	      console.log('4.2. Done streaming');
981
982	      if (status === 'success') {
983	        this.parseResponse(data);
984
985	        if (this.errors.length <= 0) {
986	          this.doStreaming(stream);
987	        }
988	      } else {
989	        this.error(errors.join('. '));
990	      }
991	    }
992	  }, {
993	    key: "progressStreaming",
994	    value: function progressStreaming(_ref4) {
995	      var _this5 = this;
996
997	      var percent = _ref4.data;
998	      this.filesInprogress.forEach(function (itemId) {
999	        var item = _this5.files.get(itemId);
1000
1001	        var currentPercent = percent * (item.packPercent || 0);
1002
1003	        if (!item['previousPackPercent']) {
1004	          item['previousPackPercent'] = currentPercent;
1005	        }
1006
1007	        _this5.emit('fileIsInProgress', {
1008	          itemId: itemId,
1009	          item: item.item,
1010	          percent: Math.ceil(Math.max(item['previousPackPercent'], currentPercent) / 100)
1011	        });
1012
1013	        item['previousPackPercent'] = currentPercent;
1014	      });
1015	    }
1016	  }, {
1017	    key: "parseResponse",
1018	    value: function parseResponse(data) {
1019	      var _this6 = this;
1020
1021	      var merge = function merge(ar1, ar2) {
1022	        for (var jj in ar2) {
1023	          if (ar2.hasOwnProperty(jj)) {
1024	            ar1[jj] = main_core.Type.isPlainObject(ar2[jj]) && main_core.Type.isPlainObject(ar1[jj]) ? merge(ar1[jj], ar2[jj]) : ar2[jj];
1025	          }
1026	        }
1027
1028	        return ar1;
1029	      };
1030
1031	      this.response = merge(this.response, data);
1032
1033	      if (data.status === 'error') {
1034	        this.error('Error in a uploading');
1035	      } else if (!data['files']) {
1036	        this.error('Unexpected server response.');
1037	      } else {
1038	        this.filesInprogress.forEach(function (itemId) {
1039	          var fileResponse = data['files'][itemId] || {
1040	            status: 'error',
1041	            errors: ['File data is not found']
1042	          };
1043
1044	          if (fileResponse.status === 'error' || fileResponse.status === 'uploaded') {
1045	            _this6.filesVirgin.delete(itemId);
1046
1047	            _this6.emit(fileResponse.status === 'error' ? 'fileIsErrored' : 'fileIsUploaded', {
1048	              itemId: itemId,
1049	              item: _this6.files.get(itemId).item,
1050	              response: fileResponse
1051	            });
1052	          }
1053
1054	          _this6.files.get(itemId).parseResponse(fileResponse);
1055	        });
1056	        this.filesInprogress.clear();
1057	      }
1058	    }
1059	  }, {
1060	    key: "checkAndDone",
1061	    value: function checkAndDone(stream) {
1062	      console.log('5. Form has been sent.');
1063
1064	      if (this.response['status'] === 'done') {
1065	        this.done(stream);
1066	      } else if (this.response['status'] === 'start') {
1067	        this.error('Error with starting package.');
1068	      } else if (this.response['status'] !== 'continue') {
1069	        this.error('Unknown response');
1070	      }
1071	    }
1072	  }, {
1073	    key: "done",
1074	    value: function done(stream) {
1075	      console.log('5.1 Release the stream');
1076	      this.unbindStream(stream);
1077	      this.emit('done', {
1078	        status: this.errors.length <= 0 ? 'success' : 'failed'
1079	      });
1080	    }
1081	  }, {
1082	    key: "error",
1083	    value: function error(errorText) {
1084	      var _this7 = this;
1085
1086	      var handler = function handler(itemId) {
1087	        _this7.emit('fileIsErrored', {
1088	          itemId: itemId,
1089	          item: _this7.files.get(itemId).item,
1090	          response: {
1091	            error: errorText,
1092	            status: 'failed'
1093	          },
1094	          serverResponse: Object.assign({}, _this7.response)
1095	        });
1096	      };
1097
1098	      this.filesVirgin.forEach(handler);
1099	      this.filesVirgin.clear();
1100	      this.filesInprogress.forEach(handler);
1101	      this.filesInprogress.clear();
1102	      this.errors.push(errorText);
1103	      console.log('5. Form has been sent with errors: ', this.errors);
1104	      this.done(this.stream);
1105	    }
1106	  }, {
1107	    key: "getServerResponse",
1108	    value: function getServerResponse() {
1109	      return this.response;
1110	    }
1111	  }, {
1112	    key: "filesCount",
1113	    get: function get() {
1114	      return this.filesVirgin.size + this.filesInprogress.size;
1115	    }
1116	  }, {
1117	    key: "data",
1118	    get: function get() {
1119	      return convertFormDataToObject(this.formData);
1120	    }
1121	  }]);
1122	  return Package;
1123	}(main_core_events.EventEmitter);
1124
1125	function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess$1(receiver, classConstructor); return method; }
1126
1127	function _classStaticPrivateFieldSpecGet$1(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess$1(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor$1(descriptor, "get"); return _classApplyDescriptorGet$1(receiver, descriptor); }
1128
1129	function _classCheckPrivateStaticFieldDescriptor$1(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } }
1130
1131	function _classCheckPrivateStaticAccess$1(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } }
1132
1133	function _classApplyDescriptorGet$1(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
1134
1135	var Streams = /*#__PURE__*/function (_EventEmitter) {
1136	  babelHelpers.inherits(Streams, _EventEmitter);
1137
1138	  function Streams() {
1139	    babelHelpers.classCallCheck(this, Streams);
1140	    return babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Streams).apply(this, arguments));
1141	  }
1142
1143	  babelHelpers.createClass(Streams, null, [{
1144	    key: "addPackage",
1145	    value: function addPackage(pack) {
1146	      console.log('3. Add to a stream queue.');
1147
1148	      if (this.maxInstances > 0 && _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).size > this.maxInstances) {
1149	        _classStaticPrivateFieldSpecGet$1(this, Streams, _packages).set(pack);
1150	      } else {
1151	        _classStaticPrivateFieldSpecGet$1(this, Streams, _packages).delete(pack);
1152
1153	        _classStaticPrivateMethodGet(this, Streams, _runPackage).call(this, pack);
1154	      }
1155
1156	      if (!window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)]) {
1157	        window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)] = _classStaticPrivateMethodGet(this, Streams, _catchWindow).bind(this);
1158	        main_core.Event.bind(window, 'beforeunload', window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)]);
1159	      }
1160	    }
1161	  }]);
1162	  return Streams;
1163	}(main_core_events.EventEmitter);
1164
1165	function _catchWindow(event) {
1166	  if (_classStaticPrivateFieldSpecGet$1(this, Streams, _packages).size > 0 || _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).size > 0) {
1167	    var confirmationMessage = main_core.Loc.getMessage('UPLOADER_UPLOADING_ONBEFOREUNLOAD');
1168	    (event || window.event).returnValue = confirmationMessage;
1169	    return confirmationMessage;
1170	  }
1171	}
1172
1173	function _runPackage(pack) {
1174	  var _this = this;
1175
1176	  var stream = new Stream();
1177
1178	  _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).set(stream);
1179
1180	  console.log('3.1. Run package in a stream.');
1181	  pack.subscribeOnce('done', function () {
1182	    console.log('6. Package is done so release the stream.');
1183
1184	    _classStaticPrivateFieldSpecGet$1(_this, Streams, _instance).delete(stream);
1185
1186	    stream.destroy();
1187
1188	    if (_classStaticPrivateFieldSpecGet$1(_this, Streams, _packages).size > 0) {
1189	      var _classStaticPrivateFi = babelHelpers.slicedToArray(_classStaticPrivateFieldSpecGet$1(_this, Streams, _packages).entries().next().value, 1),
1190	          newPack = _classStaticPrivateFi[0];
1191
1192	      _this.addPackage(newPack);
1193	    } else if (_classStaticPrivateFieldSpecGet$1(_this, Streams, _instance).size <= 0) {
1194	      main_core.Event.unbind(window, 'beforeunload', window[_classStaticPrivateFieldSpecGet$1(_this, Streams, _hiddenTag)]);
1195	      delete window[_classStaticPrivateFieldSpecGet$1(_this, Streams, _hiddenTag)];
1196	    }
1197	  });
1198	  pack.run(stream);
1199	}
1200
1201	babelHelpers.defineProperty(Streams, "maxInstances", 3);
1202	var _instance = {
1203	  writable: true,
1204	  value: new Map()
1205	};
1206	var _packages = {
1207	  writable: true,
1208	  value: new Map()
1209	};
1210	var _hiddenTag = {
1211	  writable: true,
1212	  value: Symbol('streams descriptor')
1213	};
1214
1215	(function (window) {
1216	  window.BX = window['BX'] || {};
1217	  if (window.BX["UploaderQueue"]) return false;
1218	  var BX = window.BX,
1219	      statuses = {
1220	    "new": 0,
1221	    ready: 1,
1222	    preparing: 2,
1223	    inprogress: 3,
1224	    done: 4,
1225	    failed: 5,
1226	    stopped: 6,
1227	    changed: 7,
1228	    uploaded: 8
1229	  };
1230	  /**
1231	   * @return {BX.UploaderQueue}
1232	   * @params array
1233	   * @params[placeHolder] - DOM node to append files /OL or UL/
1234	   */
1235
1236	  BX.UploaderQueue = function (params, limits, caller) {
1237	    this.dialogName = "BX.UploaderQueue";
1238	    limits = !!limits ? limits : {};
1239	    this.limits = {
1240	      phpPostMaxSize: limits["phpPostMaxSize"],
1241	      phpUploadMaxFilesize: limits["phpUploadMaxFilesize"],
1242	      uploadMaxFilesize: limits["uploadMaxFilesize"] > 0 ? limits["uploadMaxFilesize"] : 0,
1243	      uploadFileWidth: limits["uploadFileWidth"] > 0 ? limits["uploadFileWidth"] : 0,
1244	      uploadFileHeight: limits["uploadFileHeight"] > 0 ? limits["uploadFileHeight"] : 0
1245	    };
1246	    this.placeHolder = BX(params["placeHolder"]);
1247	    this.showImage = params["showImage"] !== false && params["showImage"] !== 'N';
1248	    this.sortItems = params["sortItems"] !== false && params["sortItems"] !== 'N';
1249	    this.fileCopies = params["copies"];
1250	    this.fileFields = params["fields"];
1251	    this.uploader = caller;
1252	    this.itForUpload = new BX.UploaderUtils.Hash();
1253	    this.items = new BX.UploaderUtils.Hash();
1254	    this.itUploaded = new BX.UploaderUtils.Hash();
1255	    this.itFailed = new BX.UploaderUtils.Hash();
1256	    this.thumb = {
1257	      tagName: "LI",
1258	      className: "bx-bxu-thumb-thumb"
1259	    };
1260
1261	    if (!!params["thumb"]) {
1262	      for (var ii in params["thumb"]) {
1263	        if (params["thumb"].hasOwnProperty(ii) && this.thumb.hasOwnProperty(ii)) {
1264	          this.thumb[ii] = params["thumb"][ii];
1265	        }
1266	      }
1267	    }
1268
1269	    BX.addCustomEvent(caller, "onItemIsAdded", BX.delegate(this.addItem, this));
1270	    BX.addCustomEvent(caller, "onFileIsDeleted", BX.delegate(this.deleteItem, this));
1271	    BX.addCustomEvent(caller, "onFileIsReinited", BX.delegate(this.reinitItem, this));
1272	    this.log('Initialized');
1273	    return this;
1274	  };
1275
1276	  BX.UploaderQueue.prototype = {
1277	    showError: function showError(text) {
1278	      this.log('Error! ' + text);
1279	    },
1280	    log: function log(text) {
1281	      BX.UploaderUtils.log('queue', text);
1282	    },
1283	    addItem: function addItem(file, being) {
1284	      var isImage;
1285	      if (!this.showImage) isImage = false;else if (BX.type.isDomNode(file)) isImage = BX.UploaderUtils.isImage(file.value, null, null);else isImage = BX.UploaderUtils.isImage(file["name"], file["type"], file["size"]);
1286	      BX.onCustomEvent(this.uploader, "onFileIsBeforeCreated", [file, being, isImage, this.uploader]);
1287	      var params = {
1288	        copies: this.fileCopies,
1289	        fields: this.fileFields
1290	      },
1291	          res = isImage ? new BX.UploaderImage(file, params, this.limits, this.uploader) : new BX.UploaderFile(file, params, this.limits, this.uploader),
1292	          children,
1293	          node,
1294	          itemStatus = {
1295	        status: statuses.ready
1296	      };
1297	      BX.onCustomEvent(res, "onFileIsAfterCreated", [res, being, itemStatus, this.uploader]);
1298	      BX.onCustomEvent(this.uploader, "onFileIsAfterCreated", [res, being, itemStatus, this.uploader]);
1299	      this.items.setItem(res.id, res);
1300
1301	      if (being || itemStatus["status"] !== statuses.ready) {
1302	        this.itUploaded.setItem(res.id, res);
1303	      } else {
1304	        this.itForUpload.setItem(res.id, res);
1305	      }
1306
1307	      if (!!this.placeHolder) {
1308	        if (BX(being)) {
1309	          res.thumbNode = node = BX(being);
1310	          node.setAttribute("bx-bxu-item-id", res.id);
1311	        } else {
1312	          children = res.makeThumb();
1313	          node = BX.create(this.thumb.tagName, {
1314	            attrs: {
1315	              id: res.id + 'Item',
1316	              'bx-bxu-item-id': res.id,
1317	              className: this.thumb.className
1318	            }
1319	          });
1320
1321	          if (BX.type.isNotEmptyString(children)) {
1322	            if (this.thumb.tagName == 'TR') {
1323	              children = children.replace(/[\n\t]/gi, "").replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1");
1324	              if (!!children["trim"]) children = children.trim();
1325
1326	              var replaceFunction = function replaceFunction(str, tdParams, tdInnerHTML) {
1327	                var td = node.insertCell(-1),
1328	                    attrs = {
1329	                  colspan: true,
1330	                  headers: true,
1331	                  accesskey: true,
1332	                  "class": true,
1333	                  contenteditable: true,
1334	                  contextmenu: true,
1335	                  dir: true,
1336	                  hidden: true,
1337	                  id: true,
1338	                  lang: true,
1339	                  spellcheck: true,
1340	                  style: true,
1341	                  tabindex: true,
1342	                  title: true,
1343	                  translate: true
1344	                },
1345	                    param;
1346	                td.innerHTML = tdInnerHTML;
1347	                tdParams = tdParams.split(" ");
1348
1349	                while ((param = tdParams.pop()) && param) {
1350	                  param = param.split("=");
1351
1352	                  if (param.length == 2) {
1353	                    param[0] = param[0].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1");
1354	                    param[1] = param[1].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1");
1355	                    if (attrs[param[0]] === true) td.setAttribute(param[0], param[1]);else td[param[0]] = param[1];
1356	                  }
1357	                }
1358
1359	                return "";
1360	              },
1361	                  regex = /^<td(.*?)>(.*?)<\/td>/i;
1362
1363	              window.data1 = children;
1364
1365	              while (regex.test(children)) {
1366	                children = children.replace(regex, replaceFunction);
1367	              }
1368	            } else {
1369	              node.innerHTML = children;
1370	            }
1371	          } else if (BX.type.isDomNode(children)) {
1372	            BX.adjust(node, {
1373	              children: [children]
1374	            });
1375	          }
1376	        }
1377
1378	        if (!!window["jsDD"] && this.sortItems) {
1379	          if (!this._onbxdragstart) {
1380	            this._onbxdragstart = BX.delegate(this.onbxdragstart, this);
1381	            this._onbxdragstop = BX.delegate(this.onbxdragstop, this);
1382	            this._onbxdrag = BX.delegate(this.onbxdrag, this);
1383	            this._onbxdraghout = BX.delegate(this.onbxdraghout, this);
1384	            this._onbxdestdraghover = BX.delegate(this.onbxdestdraghover, this);
1385	            this._onbxdestdraghout = BX.delegate(this.onbxdestdraghout, this);
1386	            this._onbxdestdragfinish = BX.delegate(this.onbxdestdragfinish, this);
1387	          }
1388
1389	          BX.addClass(node, "bx-drag-draggable");
1390	          node.onbxdragstart = this._onbxdragstart;
1391	          node.onbxdragstop = this._onbxdragstop;
1392	          node.onbxdrag = this._onbxdrag;
1393	          node.onbxdraghout = this._onbxdraghout;
1394	          window.jsDD.registerObject(node);
1395	          node.onbxdestdraghover = this._onbxdestdraghover;
1396	          node.onbxdestdraghout = this._onbxdestdraghout;
1397	          node.onbxdestdragfinish = this._onbxdestdragfinish;
1398	          window.jsDD.registerDest(node);
1399	          var inputs = BX.findChild(node, {
1400	            tagName: "INPUT",
1401	            props: {
1402	              "type": "text"
1403	            }
1404	          }, true, true);
1405
1406	          for (var ii = 0; ii <= inputs.length; ii++) {
1407	            BX.bind(inputs[ii], "mousedown", BX.eventCancelBubble);
1408	          }
1409	        }
1410
1411	        node.setAttribute("bx-item-id", res.id);
1412
1413	        if (BX(being)) {
1414	          BX.onCustomEvent(this.uploader, "onFileIsBound", [res.id, res, this.caller, being]);
1415	          BX.onCustomEvent(res, "onFileIsBound", [res.id, res, this.caller, being]);
1416	        } else if (!!being) {
1417	          this.placeHolder.appendChild(node);
1418	          BX.onCustomEvent(this.uploader, "onFileIsAttached", [res.id, res, this.caller, being]);
1419	          BX.onCustomEvent(res, "onFileIsAttached", [res.id, res, this.caller, being]);
1420	        } else {
1421	          this.placeHolder.appendChild(node);
1422	          BX.onCustomEvent(this.uploader, "onFileIsAppended", [res.id, res, this.caller]);
1423	          BX.onCustomEvent(res, "onFileIsAppended", [res.id, res, this.caller]);
1424	        }
1425	      }
1426
1427	      BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "add", res.id, res]);
1428	    },
1429	    getItem: function getItem(id) {
1430	      var item = this.items.getItem(id);
1431	      if (item) return {
1432	        item: item,
1433	        node: item.thumbNode || BX(id + 'Item')
1434	      };
1435	      return null;
1436	    },
1437	    onbxdragstart: function onbxdragstart() {
1438	      var item = BX.proxy_context,
1439	          id = item && item.getAttribute("bx-item-id");
1440
1441	      if (id) {
1442	        var template = item.innerHTML.replace(new RegExp(id, "gi"), "DragCopy");
1443	        item.__dragCopyDiv = BX.create('DIV', {
1444	          attrs: {
1445	            className: "bx-drag-object " + item.className
1446	          },
1447	          style: {
1448	            position: "absolute",
1449	            zIndex: 10,
1450	            width: item.clientWidth + 'px'
1451	          },
1452	          html: template
1453	        });
1454	        item.__dragCopyPos = BX.pos(item);
1455	        BX.onCustomEvent(this.uploader, "onBxDragStart", [item, item.__dragCopyDiv]);
1456	        document.body.appendChild(item.__dragCopyDiv);
1457	        BX.addClass(item, "bx-drag-source");
1458	        var c = BX('DragCopyProperCanvas'),
1459	            c1,
1460	            it = this.items.getItem(id);
1461
1462	        if (c && it && BX(it.canvas)) {
1463	          c1 = it.canvas.cloneNode(true);
1464	          c.parentNode.replaceChild(c1, c);
1465	          c1.getContext("2d").drawImage(it.canvas, 0, 0);
1466	        }
1467	      }
1468
1469	      return true;
1470	    },
1471	    onbxdragstop: function onbxdragstop() {
1472	      var item = BX.proxy_context;
1473
1474	      if (item.__dragCopyDiv) {
1475	        BX.removeClass(item, "bx-drag-source");
1476
1477	        item.__dragCopyDiv.parentNode.removeChild(item.__dragCopyDiv);
1478
1479	        item.__dragCopyDiv = null;
1480	        delete item['__dragCopyDiv'];
1481	        delete item['__dragCopyPos'];
1482	      }
1483
1484	      return true;
1485	    },
1486	    onbxdrag: function onbxdrag(x, y) {
1487	      var item = BX.proxy_context,
1488	          div = item.__dragCopyDiv;
1489
1490	      if (div) {
1491	        if (item.__dragCopyPos) {
1492	          if (!item.__dragCopyPos.deltaX) item.__dragCopyPos.deltaX = item.__dragCopyPos.left - x;
1493	          if (!item.__dragCopyPos.deltaY) item.__dragCopyPos.deltaY = item.__dragCopyPos.top - y;
1494	          x += item.__dragCopyPos.deltaX;
1495	          y += item.__dragCopyPos.deltaY;
1496	        }
1497
1498	        div.style.left = x + 'px';
1499	        div.style.top = y + 'px';
1500	      }
1501	    },
1502	    onbxdraghout: function onbxdraghout(currentNode, x, y) {},
1503	    onbxdestdraghover: function onbxdestdraghover(currentNode) {
1504	      if (!currentNode || !currentNode.hasAttribute("bx-bxu-item-id") || !this.items.hasItem(currentNode.getAttribute("bx-bxu-item-id"))) return;
1505	      var item = BX.proxy_context;
1506	      BX.addClass(item, "bx-drag-over");
1507	      return true;
1508	    },
1509	    onbxdestdraghout: function onbxdestdraghout() {
1510	      var item = BX.proxy_context;
1511	      BX.removeClass(item, "bx-drag-over");
1512	      return true;
1513	    },
1514	    onbxdestdragfinish: function onbxdestdragfinish(currentNode) {
1515	      var item = BX.proxy_context;
1516	      BX.removeClass(item, "bx-drag-over");
1517	      if (item == currentNode || !BX.hasClass(currentNode, "bx-drag-draggable")) return true;
1518	      var id = currentNode.getAttribute("bx-bxu-item-id");
1519	      if (!this.items.hasItem(id)) return;
1520	      var obj = item.parentNode,
1521	          n = obj.childNodes.length,
1522	          act,
1523	          it,
1524	          buff,
1525	          j;
1526
1527	      for (j = 0; j < n; j++) {
1528	        if (obj.childNodes[j] == item) item.number = j;else if (obj.childNodes[j] == currentNode) currentNode.number = j;
1529	        if (currentNode.number > 0 && item.number > 0) break;
1530	      }
1531
1532	      if (this.itForUpload.hasItem(id)) {
1533	        act = item.number <= currentNode.number ? "beforeItem" : item.nextSibling ? "afterItem" : "inTheEnd";
1534	        it = null;
1535
1536	        if (act != "inTheEnd") {
1537	          for (j = item.number + (act == "beforeItem" ? 0 : 1); j < n; j++) {
1538	            if (this.itForUpload.hasItem(obj.childNodes[j].getAttribute("bx-bxu-item-id"))) {
1539	              it = obj.childNodes[j].getAttribute("bx-bxu-item-id");
1540	              break;
1541	            }
1542	          }
1543
1544	          if (it === null) act = "inTheEnd";
1545	        }
1546
1547	        buff = this.itForUpload.removeItem(currentNode.getAttribute("bx-bxu-item-id"));
1548	        if (act != "inTheEnd") this.itForUpload.insertBeforeItem(buff.id, buff, it);else this.itForUpload.setItem(buff.id, buff);
1549	      }
1550
1551	      act = item.number <= currentNode.number ? "beforeItem" : item.nextSibling ? "afterItem" : "inTheEnd";
1552	      it = null;
1553
1554	      if (act != "inTheEnd") {
1555	        for (j = item.number + (act == "beforeItem" ? 0 : 1); j < n; j++) {
1556	          if (this.items.hasItem(obj.childNodes[j].getAttribute("bx-bxu-item-id"))) {
1557	            it = obj.childNodes[j].getAttribute("bx-bxu-item-id");
1558	            break;
1559	          }
1560	        }
1561
1562	        if (it === null) act = "inTheEnd";
1563	      }
1564
1565	      buff = this.items.removeItem(currentNode.getAttribute("bx-bxu-item-id"));
1566	      if (act != "inTheEnd") this.items.insertBeforeItem(buff.id, buff, it);else this.items.setItem(buff.id, buff);
1567	      currentNode.parentNode.removeChild(currentNode);
1568
1569	      if (item.number <= currentNode.number) {
1570	        item.parentNode.insertBefore(currentNode, item);
1571	      } else if (item.nextSibling) {
1572	        item.parentNode.insertBefore(currentNode, item.nextSibling);
1573	      } else {
1574	        for (j = 0; j < n; j++) {
1575	          if (obj.childNodes[j] == item) item.number = j;else if (obj.childNodes[j] == currentNode) currentNode.number = j;
1576	        }
1577
1578	        if (item.number <= currentNode.number) {
1579	          item.parentNode.insertBefore(currentNode, item);
1580	        } else {
1581	          item.parentNode.appendChild(currentNode);
1582	        }
1583	      }
1584
1585	      BX.onCustomEvent(item, "onFileOrderIsChanged", [item.id, item, this.caller]);
1586	      BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "sort", item.id, item]);
1587	      return true;
1588	    },
1589	    deleteItem: function deleteItem(id, item) {
1590	      var pointer = this.getItem(id),
1591	          node;
1592
1593	      if (pointer && (!this.placeHolder || (node = pointer.node) && node)) {
1594	        if (!!node) {
1595	          if (!!window["jsDD"]) {
1596	            node.onmousedown = null;
1597	            node.onbxdragstart = null;
1598	            node.onbxdragstop = null;
1599	            node.onbxdrag = null;
1600	            node.onbxdraghout = null;
1601	            node.onbxdestdraghover = null;
1602	            node.onbxdestdraghout = null;
1603	            node.onbxdestdragfinish = null;
1604	            node.__bxpos = null;
1605	            window.jsDD.arObjects[node.__bxddid] = null;
1606	            delete window.jsDD.arObjects[node.__bxddid];
1607	            window.jsDD.arDestinations[node.__bxddeid] = null;
1608	            delete window.jsDD.arDestinations[node.__bxddeid];
1609	          }
1610
1611	          BX.unbindAll(node);
1612	          if (item["replaced"] !== true) node.parentNode.removeChild(node);
1613	        }
1614
1615	        this.items.removeItem(id);
1616	        this.itUploaded.removeItem(id);
1617	        this.itFailed.removeItem(id);
1618	        this.itForUpload.removeItem(id);
1619	        BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "delete", id, item]);
1620	        return true;
1621	      }
1622
1623	      return false;
1624	    },
1625	    reinitItem: function reinitItem(id, item) {
1626	      var node, children;
1627
1628	      if (!!this.placeHolder && this.items.hasItem(id) && (node = BX(id + 'Item')) && node) {
1629	        children = item.makeThumb();
1630
1631	        if (BX.type.isNotEmptyString(children)) {
1632	          if (this.thumb.tagName == 'TR') {
1633	            children = children.replace(/[\n\t]/gi, "").replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1");
1634	            if (!!children["trim"]) children = children.trim();
1635
1636	            var replaceFunction = function replaceFunction(str, tdParams, tdInnerHTML) {
1637	              var td = node.insertCell(-1),
1638	                  attrs = {
1639	                colspan: true,
1640	                headers: true,
1641	                accesskey: true,
1642	                "class": true,
1643	                contenteditable: true,
1644	                contextmenu: true,
1645	                dir: true,
1646	                hidden: true,
1647	                id: true,
1648	                lang: true,
1649	                spellcheck: true,
1650	                style: true,
1651	                tabindex: true,
1652	                title: true,
1653	                translate: true
1654	              },
1655	                  param;
1656	              td.innerHTML = tdInnerHTML;
1657	              tdParams = tdParams.split(" ");
1658
1659	              while ((param = tdParams.pop()) && param) {
1660	                param = param.split("=");
1661
1662	                if (param.length == 2) {
1663	                  param[0] = param[0].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1");
1664	                  param[1] = param[1].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1");
1665	                  if (attrs[param[0]] === true) td.setAttribute(param[0], param[1]);else td[param[0]] = param[1];
1666	                }
1667	              }
1668
1669	              return "";
1670	            },
1671	                regex = /^<td(.*?)>(.*?)<\/td>/i;
1672
1673	            window.data1 = children;
1674
1675	            while (regex.test(children)) {
1676	              children = children.replace(regex, replaceFunction);
1677	            }
1678	          } else {
1679	            node.innerHTML = children;
1680	          }
1681	        } else if (BX.type.isDomNode(children)) {
1682	          while (BX(node.firstChild)) {
1683	            BX.remove(node.firstChild);
1684	          }
1685
1686	          BX.adjust(node, {
1687	            children: [children]
1688	          });
1689	        }
1690
1691	        BX.onCustomEvent(this.uploader, "onFileIsAppended", [item.id, item, this.caller]);
1692	        BX.onCustomEvent(item, "onFileIsAppended", [item.id, item, this.caller]);
1693	      }
1694	    },
1695	    clear: function clear() {
1696	      var item;
1697
1698	      while ((item = this.items.getFirst()) && !!item) {
1699	        this.deleteItem(item.id, item);
1700	      }
1701	    },
1702	    restoreFiles: function restoreFiles(data, restoreErrored, startAgain) {
1703	      data.reset();
1704	      var item, copy, erroredFile;
1705
1706	      while ((item = data.getNext()) && item) {
1707	        erroredFile = this.itFailed.hasItem(item.id);
1708
1709	        if (restoreErrored === true) {
1710	          this.itFailed.removeItem(item.id);
1711	        }
1712
1713	        if (!this.items.hasItem(item.id) || this.itFailed.hasItem(item.id)) {
1714	          continue;
1715	        }
1716
1717	        if (startAgain === true || startAgain !== false && erroredFile) // for compatibility
1718	          {
1719	            delete item["uploadStatus"];
1720	            delete item.file["uploadStatus"];
1721	            delete item.file["firstChunk"];
1722	            delete item.file["package"];
1723	            delete item.file["packages"];
1724
1725	            if (item.file["copies"]) {
1726	              item.file["copies"].reset();
1727
1728	              while ((copy = item.file["copies"].getNext()) && copy) {
1729	                delete copy["uploadStatus"];
1730	                delete copy["firstChunk"];
1731	                delete copy["package"];
1732	                delete copy["packages"];
1733	              }
1734
1735	              item.file["copies"].reset();
1736	            }
1737
1738	            item["restored"] = startAgain === true ? "Y" : "C"; // Start again or continue
1739	          } else {
1740	          if (erroredFile) // If a error was occurred on the last step we should send this piece again
1741	            {
1742	              if (item.file["package"]) {
1743	                item.file["package"]--;
1744	              }
1745
1746	              if (item.file["copies"]) {
1747	                item.file["copies"].reset();
1748
1749	                while ((copy = item.file["copies"].getNext()) && copy) {
1750	                  delete copy["uploadStatus"];
1751	                  delete copy["firstChunk"];
1752	                  delete copy["package"];
1753	                  delete copy["packages"];
1754	                }
1755
1756	                item.file["copies"].reset();
1757	              }
1758	            }
1759
1760	          item["restored"] = "C"; // Continue
1761	        }
1762
1763	        this.itUploaded.removeItem(item.id);
1764	        this.itForUpload.setItem(item.id, item);
1765	        BX.onCustomEvent(item, "onUploadRestore", [item]);
1766	      }
1767	    }
1768	  };
1769	  return statuses;
1770	})(window);
1771
1772	(function (window) {
1773	  window.BX = window['BX'] || {};
1774	  if (window.BX["UploaderUtils"]) return false;
1775	  var BX = window.BX;
1776	  BX.UploaderLog = [];
1777	  BX.UploaderDebug = false;
1778	  var statuses = {
1779	    "new": 0,
1780	    ready: 1,
1781	    preparing: 2,
1782	    inprogress: 3,
1783	    done: 4,
1784	    failed: 5,
1785	    stopped: 6,
1786	    changed: 7,
1787	    uploaded: 8
1788	  };
1789	  BX.UploaderUtils = {
1790	    statuses: statuses,
1791	    getId: function getId() {
1792	      return new Date().valueOf() + Math.round(Math.random() * 1000000);
1793	    },
1794	    log: function log() {
1795	      if (BX.UploaderDebug === true) {
1796	        console.log(arguments);
1797	      } else {
1798	        BX.UploaderLog.push(arguments);
1799	      }
1800	    },
1801	    Hash: function () {
1802	      var d = function d() {
1803	        this.length = 0;
1804	        this.items = {};
1805	        this.order = [];
1806	        var i;
1807
1808	        if (arguments.length == 1 && BX.type.isArray(arguments[0]) && arguments[0].length > 0) {
1809	          var data = arguments[0];
1810
1811	          for (i = 0; i < data.length; i++) {
1812	            if (data[i] && babelHelpers.typeof(data[i]) == "object" && data[i]["id"]) {
1813	              this.setItem(data[i]["id"], data[i]);
1814	            }
1815	          }
1816	        } else {
1817	          for (i = 0; i < arguments.length; i += 2) {
1818	            this.setItem(arguments[i], arguments[i + 1]);
1819	          }
1820	        }
1821	      };
1822
1823	      d.prototype = {
1824	        getIds: function getIds() {
1825	          return this.order;
1826	        },
1827	        getQueue: function getQueue(id) {
1828	          id += '';
1829	          return BX.util.array_search(id, this.order);
1830	        },
1831	        getByOrder: function getByOrder(order) {
1832	          return this.getItem(this.order[order]);
1833	        },
1834	        removeItem: function removeItem(in_key) {
1835	          in_key += '';
1836	          var tmp_value, number;
1837
1838	          if (typeof this.items[in_key] != 'undefined') {
1839	            tmp_value = this.items[in_key];
1840	            number = this.getQueue(in_key);
1841	            this.pointer -= this.pointer >= number ? 1 : 0;
1842	            delete this.items[in_key];
1843	            this.order = BX.util.deleteFromArray(this.order, number);
1844	            this.length = this.order.length;
1845	          }
1846
1847	          return tmp_value;
1848	        },
1849	        getItem: function getItem(in_key) {
1850	          in_key += '';
1851	          return this.items[in_key];
1852	        },
1853	        unshiftItem: function unshiftItem(in_key, in_value) {
1854	          in_key += '';
1855
1856	          if (typeof in_value != 'undefined') {
1857	            if (typeof this.items[in_key] == 'undefined') {
1858	              this.order.unshift(in_key);
1859	              this.length = this.order.length;
1860	            }
1861
1862	            this.items[in_key] = in_value;
1863	          }
1864
1865	          return in_value;
1866	        },
1867	        setItem: function setItem(in_key, in_value) {
1868	          in_key += '';
1869
1870	          if (typeof in_value != 'undefined') {
1871	            if (typeof this.items[in_key] == 'undefined') {
1872	              this.order.push(in_key);
1873	              this.length = this.order.length;
1874	            }
1875
1876	            this.items[in_key] = in_value;
1877	          }
1878
1879	          return in_value;
1880	        },
1881	        hasItem: function hasItem(in_key) {
1882	          in_key += '';
1883	          return typeof this.items[in_key] != 'undefined';
1884	        },
1885	        insertBeforeItem: function insertBeforeItem(in_key, in_value, after_key) {
1886	          in_key += '';
1887
1888	          if (typeof in_value != 'undefined') {
1889	            if (typeof this.items[in_key] == 'undefined') {
1890	              this.order.splice(this.getQueue(after_key), 0, in_key);
1891	              this.length = this.order.length;
1892	            }
1893
1894	            this.items[in_key] = in_value;
1895	          }
1896
1897	          return in_value;
1898	        },
1899	        getFirst: function getFirst() {
1900	          var in_key,
1901	              item = null;
1902
1903	          for (var ii = 0; ii < this.order.length; ii++) {
1904	            in_key = this.order[ii];
1905
1906	            if (!!in_key && this.hasItem(in_key)) {
1907	              item = this.getItem(in_key);
1908	              break;
1909	            }
1910	          }
1911
1912	          return item;
1913	        },
1914	        getNext: function getNext() {
1915	          this.pointer = 0 <= this.pointer && this.pointer < this.order.length ? this.pointer : -1;
1916	          var res = this.getItem(this.order[this.pointer + 1]);
1917	          if (!!res) this.pointer++;else this.pointer = -1;
1918	          return res;
1919	        },
1920	        getPrev: function getPrev() {
1921	          this.pointer = 0 <= this.pointer && this.pointer < this.order.length ? this.pointer : 0;
1922	          var res = this.getItem(this.order[this.pointer - 1]);
1923	          if (!!res) this.pointer--;
1924	          return res;
1925	        },
1926	        reset: function reset() {
1927	          this.pointer = -1;
1928	        },
1929	        setPointer: function setPointer(in_key) {
1930	          this.pointer = this.getQueue(in_key);
1931	          return this.pointer;
1932	        },
1933	        getLast: function getLast() {
1934	          var in_key,
1935	              item = null;
1936
1937	          for (var ii = this.order.length; ii >= 0; ii--) {
1938	            in_key = this.order[ii];
1939
1940	            if (!!in_key && this.hasItem(in_key)) {
1941	              item = this.getItem(in_key);
1942	              break;
1943	            }
1944	          }
1945
1946	          return item;
1947	        }
1948	      };
1949	      return d;
1950	    }(),
1951	    getFileNameOnly: function getFileNameOnly(name) {
1952	      var delimiter = "\\",
1953	          start = name.lastIndexOf(delimiter),
1954	          finish = name.length;
1955
1956	      if (start == -1) {
1957	        delimiter = "/";
1958	        start = name.lastIndexOf(delimiter);
1959	      }
1960
1961	      if (start + 1 == name.length) {
1962	        finish = start;
1963	        start = name.substring(0, finish).lastIndexOf(delimiter);
1964	      }
1965
1966	      name = name.substring(start + 1, finish);
1967
1968	      if (delimiter == "/" && name.indexOf("?") > 0) {
1969	        name = name.substring(0, name.indexOf("?"));
1970	      }
1971
1972	      if (name == '') name = 'noname';
1973	      return name;
1974	    },
1975	    isImageExt: function isImageExt(ext) {
1976	      return BX.message('bxImageExtensions') && BX.type.isNotEmptyString(ext) ? new RegExp('(?:^|\\W)(' + ext + ')(?:\\W|$)', 'gi').test(BX.message('bxImageExtensions')) : false;
1977	    },
1978	    isImage: function isImage(name, type, size) {
1979	      size = BX.type.isNumber(size) ? size : BX.type.isNotEmptyString(size) && !/[\D]+/gi.test(size) ? parseInt(size) : null;
1980	      return (type === null || (type || '').indexOf("image/") === 0) && (size === null || size < 20 * 1024 * 1024) && BX.UploaderUtils.isImageExt((name || '').lastIndexOf('.') > 0 ? name.substr(name.lastIndexOf('.') + 1).toLowerCase() : '');
1981	    },
1982	    scaleImage: function scaleImage(arSourceSize, arSize, resizeType) {
1983	      var sourceImageWidth = parseInt(arSourceSize["width"]),
1984	          sourceImageHeight = parseInt(arSourceSize["height"]);
1985	      resizeType = !resizeType && !!arSize["type"] ? arSize["type"] : resizeType;
1986	      arSize = !!arSize ? arSize : {};
1987	      arSize.width = parseInt(!!arSize.width ? arSize.width : 0);
1988	      arSize.height = parseInt(!!arSize.height ? arSize.height : 0);
1989	      var res = {
1990	        bNeedCreatePicture: false,
1991	        source: {
1992	          x: 0,
1993	          y: 0,
1994	          width: 0,
1995	          height: 0
1996	        },
1997	        destin: {
1998	          x: 0,
1999	          y: 0,
2000	          width: 0,
2001	          height: 0
2002	        }
2003	      },
2004	          width,
2005	          height;
2006
2007	      if (!(sourceImageWidth > 0 || sourceImageHeight > 0)) {
2008	        BX.DoNothing();
2009	      } else {
2010	        if (!BX.type.isNotEmptyString(resizeType)) {
2011	          resizeType = "inscribed";
2012	        }
2013
2014	        var ResizeCoeff, iResizeCoeff;
2015
2016	        if (resizeType.indexOf("proportional") >= 0) {
2017	          width = Math.max(sourceImageWidth, sourceImageHeight);
2018	          height = Math.min(sourceImageWidth, sourceImageHeight);
2019	        } else {
2020	          width = sourceImageWidth;
2021	          height = sourceImageHeight;
2022	        }
2023
2024	        if (resizeType == "exact") {
2025	          var ratio = sourceImageWidth / sourceImageHeight < arSize["width"] / arSize["height"] ? arSize["width"] / sourceImageWidth : arSize["height"] / sourceImageHeight,
2026	              x = Math.max(0, Math.round(sourceImageWidth / 2 - arSize["width"] / 2 / ratio)),
2027	              y = Math.max(0, Math.round(sourceImageHeight / 2 - arSize["height"] / 2 / ratio));
2028	          res.bNeedCreatePicture = true;
2029	          res.coeff = ratio;
2030	          res.destin["width"] = arSize["width"];
2031	          res.destin["height"] = arSize["height"];
2032	          res.source["x"] = x;
2033	          res.source["y"] = y;
2034	          res.source["width"] = Math.round(arSize["width"] / ratio, 0);
2035	          res.source["height"] = Math.round(arSize["height"] / ratio, 0);
2036	        } else {
2037	          if (resizeType == "circumscribed") {
2038	            ResizeCoeff = {
2039	              width: width > 0 ? arSize["width"] / width : 1,
2040	              height: height > 0 ? arSize["height"] / height : 1
2041	            };
2042	            iResizeCoeff = Math.max(ResizeCoeff["width"], ResizeCoeff["height"], 1);
2043	          } else {
2044	            ResizeCoeff = {
2045	              width: width > 0 ? arSize["width"] / width : 1,
2046	              height: height > 0 ? arSize["height"] / height : 1
2047	            };
2048	            iResizeCoeff = Math.min(ResizeCoeff["width"], ResizeCoeff["height"], 1);
2049	            iResizeCoeff = 0 < iResizeCoeff ? iResizeCoeff : 1;
2050	          }
2051
2052	          res.bNeedCreatePicture = iResizeCoeff != 1;
2053	          res.coeff = iResizeCoeff;
2054	          res.destin["width"] = Math.max(1, parseInt(iResizeCoeff * sourceImageWidth));
2055	          res.destin["height"] = Math.max(1, parseInt(iResizeCoeff * sourceImageHeight));
2056	          res.source["x"] = 0;
2057	          res.source["y"] = 0;
2058	          res.source["width"] = sourceImageWidth;
2059	          res.source["height"] = sourceImageHeight;
2060	        }
2061	      }
2062
2063	      return res;
2064	    },
2065	    dataURLToBlob: function dataURLToBlob(dataURL) {
2066	      var marker = ';base64,',
2067	          parts,
2068	          contentType,
2069	          raw,
2070	          rawLength;
2071
2072	      if (dataURL.indexOf(marker) == -1) {
2073	        parts = dataURL.split(',');
2074	        contentType = parts[0].split(':')[1];
2075	        raw = parts[1];
2076	        return new Blob([raw], {
2077	          type: contentType
2078	        });
2079	      }
2080
2081	      parts = dataURL.split(marker);
2082	      contentType = parts[0].split(':')[1];
2083	      raw = window.atob(parts[1]);
2084	      rawLength = raw.length;
2085	      var uInt8Array = new Uint8Array(rawLength);
2086
2087	      for (var i = 0; i < rawLength; ++i) {
2088	        uInt8Array[i] = raw.charCodeAt(i);
2089	      }
2090
2091	      return new Blob([uInt8Array], {
2092	        type: contentType
2093	      });
2094	    },
2095	    sizeof: function sizeof(obj) {
2096	      var size = 0,
2097	          key;
2098
2099	      for (key in obj) {
2100	        if (obj.hasOwnProperty(key)) {
2101	          size += key.length;
2102
2103	          if (babelHelpers.typeof(obj[key]) == "object") {
2104	            if (obj[key] === null) BX.DoNothing();else if (obj[key]["size"] > 0) size += obj[key].size;else size += BX.UploaderUtils.sizeof(obj[key]);
2105	          } else if (typeof obj[key] == "number") {
2106	            size += obj[key].toString().length;
2107	          } else if (!!obj[key] && obj[key].length > 0) {
2108	            size += obj[key].length;
2109	          }
2110	        }
2111	      }
2112
2113	      return size;
2114	    },
2115	    FormToArray: function FormToArray(form, data) {
2116	      return BX.ajax.prepareForm(form, data);
2117	    },
2118	    getFormattedSize: function getFormattedSize(size, precision) {
2119	      var a = ["b", "Kb", "Mb", "Gb", "Tb"],
2120	          pos = 0;
2121
2122	      while (size >= 1024 && pos < 4) {
2123	        size /= 1024;
2124	        pos++;
2125	      }
2126
2127	      return Math.round(size * (precision > 0 ? precision * 10 : 1)) / (precision > 0 ? precision * 10 : 1) + " " + BX.message("FILE_SIZE_" + a[pos]);
2128	    },
2129	    bindEvents: function bindEvents(obj, event, func) {
2130	      var funcs = [],
2131	          ii;
2132
2133	      if (typeof func == "string") {
2134	        eval('funcs.push(' + func + ');');
2135	      } else if (!!func["length"] && func["length"] > 0) {
2136	        for (ii = 0; ii < func.length; ii++) {
2137	          if (typeof func[ii] == "string") eval('funcs.push(' + func[ii] + ');');else funcs.push(func[ii]);
2138	        }
2139	      } else funcs.push(func);
2140
2141	      if (funcs.length > 0) {
2142	        for (ii = 0; ii < funcs.length; ii++) {
2143	          BX.addCustomEvent(obj, event, funcs[ii]);
2144	        }
2145	      }
2146	    },
2147	    applyFilePart: function applyFilePart(file, blob) {
2148	      if (BX.type.isDomNode(file)) {
2149	        file.uploadStatus = statuses.done;
2150	      } else if (file == blob) {
2151	        file.uploadStatus = statuses.done;
2152	      } else if (file.blobed === true) {
2153	        file.uploadStatus = file.package + 1 >= file.packages ? statuses.done : statuses.inprogress;
2154	        if (file.uploadStatus == statuses.inprogress) file.package++;
2155	      }
2156
2157	      return true;
2158	    },
2159	    getFilePart: function getFilePart(file, MaxFilesize) {
2160	      var blob,
2161	          chunkSize = MaxFilesize,
2162	          start,
2163	          end;
2164
2165	      if (BX.type.isDomNode(file)) {
2166	        blob = file;
2167	      } else if (MaxFilesize <= 0 || file.size <= MaxFilesize) {
2168	        blob = file;
2169	      } else if (file['packages'] && file['packages'] <= file['package']) {
2170	        blob = null;
2171	      } else if (window.Blob || window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder) {
2172	        if (file['packages']) {
2173	          file.package++;
2174	          start = file.package * chunkSize;
2175	          end = start + chunkSize;
2176	        } else {
2177	          file.packages = Math.ceil(file.size / chunkSize);
2178	          file.package = 0;
2179	          start = 0;
2180	          end = chunkSize;
2181	        }
2182
2183	        if ('mozSlice' in file) blob = file.mozSlice(start, end, file.type);else if ('webkitSlice' in file) blob = file.webkitSlice(start, end, file.type);else if ('slice' in file) blob = file.slice(start, end, file.type);else blob = file.Slice(start, end, file.type);
2184
2185	        for (var ii in file) {
2186	          if (file.hasOwnProperty(ii)) {
2187	            blob[ii] = file[ii];
2188	          }
2189	        }
2190
2191	        blob["name"] = file["name"];
2192	        blob["start"] = start;
2193	        blob["package"] = file.package;
2194	        blob["packages"] = file.packages;
2195	      }
2196
2197	      return blob;
2198	    },
2199	    makeAnArray: function makeAnArray(file, data) {
2200	      file = !!file ? file : {
2201	        files: [],
2202	        props: {}
2203	      };
2204	      var ii;
2205
2206	      for (var jj in data) {
2207	        if (data.hasOwnProperty(jj)) {
2208	          if (babelHelpers.typeof(data[jj]) == "object" && data[jj].length > 0) {
2209	            file[jj] = !!file[jj] ? file[jj] : [];
2210
2211	            for (ii = 0; ii < data[jj].length; ii++) {
2212	              file[jj].push(data[jj][ii]);
2213	            }
2214	          } else {
2215	            for (ii in data[jj]) {
2216	              if (data[jj].hasOwnProperty(ii)) {
2217	                file[jj] = !!file[jj] ? file[jj] : {};
2218	                file[jj][ii] = data[jj][ii];
2219	              }
2220	            }
2221	          }
2222	        }
2223	      }
2224
2225	      return file;
2226	    },
2227	    appendToForm: function appendToForm(fd, key, val) {
2228	      if (!!val && babelHelpers.typeof(val) == "object") {
2229	        for (var ii in val) {
2230	          if (val.hasOwnProperty(ii)) {
2231	            BX.UploaderUtils.appendToForm(fd, key + '[' + ii + ']', val[ii]);
2232	          }
2233	        }
2234	      } else {
2235	        fd.append(key, !!val ? val : '');
2236	      }
2237	    },
2238	    FormData: function FormData() {
2239	      return new (BX.Uploader.getInstanceName() == "BX.UploaderSimple" ? FormDataLocal : window.FormData)();
2240	    },
2241	    prepareData: function prepareData(arData) {
2242	      var data = {};
2243
2244	      if (null != arData) {
2245	        if (babelHelpers.typeof(arData) == 'object') {
2246	          for (var i in arData) {
2247	            if (arData.hasOwnProperty(i)) {
2248	              var name = BX.util.urlencode(i);
2249	              if (babelHelpers.typeof(arData[i]) == 'object') data[name] = BX.UploaderUtils.prepareData(arData[i]);else data[name] = BX.util.urlencode(arData[i]);
2250	            }
2251	          }
2252	        } else data = BX.util.urlencode(arData);
2253	      }
2254
2255	      return data;
2256	    }
2257	  };
2258
2259	  var FormDataLocal = function FormDataLocal() {
2260	    var uniqueID;
2261
2262	    do {
2263	      uniqueID = Math.floor(Math.random() * 99999);
2264	    } while (BX("form-" + uniqueID));
2265
2266	    this.local = true;
2267	    this.form = BX.create("FORM", {
2268	      props: {
2269	        id: "form-" + uniqueID,
2270	        method: "POST",
2271	        enctype: "multipart/form-data",
2272	        encoding: "multipart/form-data"
2273	      },
2274	      style: {
2275	        display: "none"
2276	      }
2277	    });
2278	    document.body.appendChild(this.form);
2279	  };
2280
2281	  FormDataLocal.prototype = {
2282	    append: function append(name, val) {
2283	      if (BX.type.isDomNode(val)) {
2284	        this.form.appendChild(val);
2285	      } else {
2286	        this.form.appendChild(BX.create("INPUT", {
2287	          props: {
2288	            type: "hidden",
2289	            name: name,
2290	            value: val
2291	          }
2292	        }));
2293	      }
2294	    }
2295	  };
2296
2297	  BX.UploaderUtils.slice = function (file, start, end) {
2298	    var blob = null;
2299	    if ('mozSlice' in file) blob = file.mozSlice(start, end);else if ('webkitSlice' in file) blob = file.webkitSlice(start, end);else if ('slice' in file) blob = file.slice(start, end);else blob = file.Slice(start, end, file.type);
2300	    return blob;
2301	  };
2302
2303	  BX.UploaderUtils.readFile = function (file, callback, method) {
2304	    if (window["FileReader"]) {
2305	      var fileReader = new FileReader();
2306	      fileReader.onload = fileReader.onerror = callback;
2307	      method = method || 'readAsDataURL';
2308
2309	      if (fileReader[method]) {
2310	        fileReader[method](file);
2311	        return fileReader;
2312	      }
2313	    }
2314
2315	    return false;
2316	  };
2317	})(window);
2318
2319	var UploaderQueue = window.BX["UploaderQueue"];
2320	var UploaderUtils = window.BX["UploaderUtils"];
2321
2322	var Uploader = /*#__PURE__*/function () {
2323	  function Uploader(params) {
2324	    babelHelpers.classCallCheck(this, Uploader);
2325	    babelHelpers.defineProperty(this, "fileInput", null);
2326	    babelHelpers.defineProperty(this, "form", null);
2327	    babelHelpers.defineProperty(this, "limits", {});
2328	    babelHelpers.defineProperty(this, "packages", new Map());
2329	    var input = params.input,
2330	        uploadFileUrl = params.uploadFileUrl,
2331	        id = params.id,
2332	        CID = params.CID,
2333	        controlId = params.controlId,
2334	        dropZone = params.dropZone,
2335	        placeHolder = params.placeHolder,
2336	        events = params.events;
2337
2338	    if (main_core.Type.isStringFilled(uploadFileUrl)) {
2339	      this.uploadFileUrl = uploadFileUrl;
2340	    }
2341
2342	    input = main_core.Type.isStringFilled(input) ? document.getElementById(input) : input;
2343
2344	    if (main_core.Type.isDomNode(input)) {
2345	      this.fileInput = input;
2346	      this.form = input.form;
2347	      this.uploadFileUrl = this.uploadFileUrl || this.form.getAttribute('action');
2348	    } else if (input !== null) {
2349	      main_core.Runtime.debug(main_core.Loc.getMessage('UPLOADER_INPUT_IS_NOT_DEFINED'));
2350	      return;
2351	    }
2352
2353	    if (!this.uploadFileUrl) {
2354	      main_core.Runtime.debug(main_core.Loc.getMessage('UPLOADER_ACTION_URL_NOT_DEFINED'));
2355	      return;
2356	    }
2357
2358	    this.constructor.justCounter++;
2359	    var uniqueId = UploaderUtils.getId();
2360	    this.id = main_core.Type.isStringFilled(id) ? id : ['bitrixUploaderID', uniqueId].join('');
2361	    this.CID = main_core.Type.isStringFilled(CID) ? CID : 'CID' + uniqueId; // this is a security id
2362
2363	    this.controlId = controlId || 'bitrixUploader'; // this is a control id can be lice control name
2364
2365	    this.onChange = this.onChange.bind(this);
2366	    this.setLimits(params);
2367	    this.initParams(params);
2368	    this.init(this.fileInput);
2369	    this.dropZone = this.initDropZone(dropZone);
2370	    this.bindUserEvents(events);
2371	    this.initFilesQueue(params);
2372	    BX.onCustomEvent(window, 'onUploaderIsInited', [this.id, this]);
2373	    Uploader.repo.set(this.id, this);
2374	  }
2375
2376	  babelHelpers.createClass(Uploader, [{
2377	    key: "setLimits",
2378	    value: function setLimits(_ref) {
2379	      var uploadMaxFilesize = _ref.uploadMaxFilesize,
2380	          uploadFileWidth = _ref.uploadFileWidth,
2381	          uploadFileHeight = _ref.uploadFileHeight,
2382	          allowUpload = _ref.allowUpload,
2383	          allowUploadExt = _ref.allowUploadExt;
2384	      this.limits = {
2385	        uploadMaxFilesize: uploadMaxFilesize || 0,
2386	        uploadFileWidth: uploadFileWidth || 0,
2387	        uploadFileHeight: uploadFileHeight || 0,
2388	        uploadFileExt: '',
2389	        uploadFile: this.fileInput ? this.fileInput.getAttribute('accept') : '',
2390	        allowUpload: allowUpload,
2391	        //compatibility
2392	        allowUploadExt: allowUploadExt //compatibility
2393
2394	      };
2395	      var acceptAttribute = [];
2396
2397	      if (main_core.Type.isStringFilled(this.limits['uploadFile'])) {
2398	        acceptAttribute.push(this.limits['uploadFile']);
2399	      }
2400
2401	      if (allowUpload === 'I') {
2402	        acceptAttribute.push('image/*');
2403	      }
2404
2405	      if (main_core.Type.isStringFilled(allowUploadExt)) {
2406	        var separator = allowUploadExt.indexOf(',') >= 0 ? ',' : ' ';
2407	        var extensions = [];
2408	        allowUploadExt.split(separator).forEach(function (extension) {
2409	          extensions.push(extension.trim().replace('.', ''));
2410	          acceptAttribute.push('.' + extension.trim().replace('.', ''));
2411	        });
2412
2413	        if (extensions) {
2414	          this.limits["uploadFileExt"] = extensions;
2415	        }
2416	      }
2417
2418	      this.limits['uploadFile'] = acceptAttribute.join(', ');
2419	    }
2420	  }, {
2421	    key: "initParams",
2422	    value: function initParams(_ref2) {
2423	      var uploadMethod = _ref2.uploadMethod,
2424	          uploadFormData = _ref2.uploadFormData,
2425	          filesInputMultiple = _ref2.filesInputMultiple,
2426	          uploadInputName = _ref2.uploadInputName,
2427	          uploadInputInfoName = _ref2.uploadInputInfoName,
2428	          deleteFileOnServer = _ref2.deleteFileOnServer,
2429	          pasteFileHashInForm = _ref2.pasteFileHashInForm;
2430	      // Limits
2431	      this.params = {
2432	        filesInputMultiple: this.fileInput && this.fileInput["multiple"] || filesInputMultiple ? "multiple" : false,
2433	        uploadFormData: uploadFormData === "N" ? "N" : "Y",
2434	        uploadMethod: uploadMethod === "immediate" ? "immediate" : "deferred",
2435	        uploadInputName: main_core.Type.isStringFilled(uploadInputName) ? uploadInputName : 'bxu_files',
2436	        uploadInputInfoName: main_core.Type.isStringFilled(uploadInputInfoName) ? uploadInputInfoName : 'bxu_info',
2437	        deleteFileOnServer: !(deleteFileOnServer === false || deleteFileOnServer === "N"),
2438	        //to insert hash into the form
2439	        filesInputName: this.fileInput && this.fileInput["name"] ? this.fileInput["name"] : "FILES",
2440	        pasteFileHashInForm: !(pasteFileHashInForm === false || pasteFileHashInForm === "N")
2441	      };
2442	    }
2443	  }, {
2444	    key: "init",
2445	    value: function init(fileInput) {
2446	      if (fileInput === null) {
2447	        return true;
2448	      }
2449
2450	      if (main_core.Type.isDomNode(fileInput)) {
2451	        var newFileInput = this.makeFileInput(fileInput);
2452
2453	        if (fileInput === this.fileInput) {
2454	          this.fileInput = newFileInput;
2455	        }
2456
2457	        if (newFileInput) {
2458	          return true;
2459	        }
2460	      }
2461
2462	      return false;
2463	    }
2464	  }, {
2465	    key: "initDropZone",
2466	    value: function initDropZone(dropZoneNode) {
2467	      var _this = this;
2468
2469	      var dropZone = new DropZone(dropZoneNode);
2470	      main_core_events.EventEmitter.subscribe(dropZone, Options.getEventName('caught'), function (_ref3) {
2471	        var data = _ref3.data;
2472
2473	        _this.onChange(data);
2474	      });
2475	      main_core_events.EventEmitter.subscribe(this, Options.getEventName('destroy'), function () {
2476	        main_core_events.EventEmitter.unsubscribeAll(dropZone, Options.getEventName('caught'));
2477	        dropZone.destroy();
2478	      });
2479	      return dropZone;
2480	    }
2481	  }, {
2482	    key: "initFilesQueue",
2483	    value: function initFilesQueue(_ref4) {
2484	      var fields = _ref4.fields,
2485	          copies = _ref4.copies,
2486	          placeHolder = _ref4.placeHolder,
2487	          showImage = _ref4.showImage,
2488	          sortItems = _ref4.sortItems,
2489	          thumb = _ref4.thumb,
2490	          queueFields = _ref4.queueFields;
2491	      var params = {
2492	        fields: queueFields && queueFields['fields'] ? queueFields['fields'] : fields,
2493	        copies: queueFields && queueFields['copies'] ? queueFields['copies'] : copies,
2494	        placeHolder: queueFields && queueFields['placeHolder'] ? queueFields['placeHolder'] : placeHolder,
2495	        showImage: queueFields && queueFields['showImage'] ? queueFields['showImage'] : showImage,
2496	        sortItems: queueFields && queueFields['sortItems'] ? queueFields['sortItems'] : sortItems,
2497	        thumb: queueFields && queueFields['thumb'] ? queueFields['thumb'] : thumb
2498	      };
2499	      this.queue = new UploaderQueue(params, this.limits, this);
2500	    }
2501	  }, {
2502	    key: "bindUserEvents",
2503	    value: function bindUserEvents(events) {
2504	      if (!main_core.Type.isPlainObject(events)) {
2505	        return;
2506	      }
2507
2508	      for (var eventName in events) {
2509	        if (events.hasOwnProperty(eventName)) {
2510	          main_core_events.EventEmitter.subscribe(this, eventName, events[eventName]);
2511	        }
2512	      }
2513	    }
2514	  }, {
2515	    key: "makeFileInput",
2516	    value: function makeFileInput(oldFileInput) {
2517	      if (!main_core.Type.isDomNode(oldFileInput)) {
2518	        return false;
2519	      }
2520
2521	      main_core.Event.unbindAll(oldFileInput, 'change');
2522	      var newFileInput = oldFileInput.cloneNode(true);
2523	      newFileInput.value = '';
2524	      newFileInput.setAttribute('name', this.params["uploadInputName"] + '[]');
2525	      newFileInput.setAttribute('multiple', this.params["filesInputMultiple"]);
2526	      newFileInput.setAttribute('accept', this.limits["uploadFile"]);
2527	      oldFileInput.parentNode.replaceChild(newFileInput, oldFileInput);
2528	      BX.onCustomEvent(this, "onFileinputIsReinited", [newFileInput, this]);
2529	      main_core.Event.bind(newFileInput, "change", this.onChange);
2530	      return newFileInput;
2531	    }
2532	  }, {
2533	    key: "onChange",
2534	    value: function onChange(event) {
2535	      if (!event) {
2536	        return;
2537	      }
2538
2539	      if (event['preventDefault']) {
2540	        event.preventDefault();
2541	      }
2542
2543	      if (event['stopPropagation']) {
2544	        event.stopPropagation();
2545	      }
2546
2547	      var files = [];
2548
2549	      if (main_core.Type.isArray(event)) {
2550	        files = event;
2551	      } else if (main_core.Type.isObject(event)) {
2552	        if (event['target']) {
2553	          var fileInput = event['target'];
2554	          files = fileInput.files;
2555
2556	          if (!fileInput || fileInput.disabled) {
2557	            return false;
2558	          }
2559
2560	          BX.onCustomEvent(this, "onFileinputIsChanged", [fileInput, this]);
2561	          this.init(fileInput);
2562	        } else if (event['files']) {
2563	          files = event['files'];
2564	        }
2565	      }
2566
2567	      this.onAttach(files);
2568	      return false;
2569	    }
2570	  }, {
2571	    key: "onAttach",
2572	    value: function onAttach(files, nodes, check) {
2573	      var _this2 = this;
2574
2575	      if (!files || !files['length']) {
2576	        return false;
2577	      }
2578
2579	      check = check !== false;
2580	      files = babelHelpers.toConsumableArray(files);
2581	      nodes = nodes && main_core.Type.isArray(nodes) ? babelHelpers.toConsumableArray(nodes) : [];
2582	      BX.onCustomEvent(this, "onAttachFiles", [files, nodes, this]);
2583	      var added = false;
2584	      babelHelpers.toConsumableArray(files).forEach(function (file, index) {
2585	        var ext = '';
2586	        var type = (file['type'] || '').toLowerCase();
2587
2588	        if (main_core.Type.isDomNode(file) && file.value) {
2589	          ext = (file.value.name || '').split('.').pop();
2590	        } else {
2591	          ext = (file['name'] || file['tmp_url'] || '').split('.').pop();
2592
2593	          if (ext.indexOf('?') > 0) {
2594	            ext = ext.substr(0, ext.indexOf('?'));
2595	          }
2596	        }
2597
2598	        ext = ext.toLowerCase();
2599
2600	        if (check) {
2601	          var errors = [];
2602
2603	          if (_this2.limits['uploadFile'].indexOf('image/') >= 0 && type.indexOf('image/') < 0 && Options.getImageExtensions().indexOf(ext) < 0) {
2604	            errors.push('File type is not an image like.');
2605	          }
2606
2607	          if (_this2.limits['uploadFileExt'].length > 0) {
2608	            if (_this2.limits['uploadFileExt'].indexOf(ext) < 0) {
2609	              errors.push("File extension ".concat(ext, " is in ").concat(_this2.limits['uploadFileExt']));
2610	            } else {
2611	              errors.pop();
2612	            }
2613	          }
2614
2615	          if (_this2.limits['uploadMaxFilesize'] > 0 && file.size > _this2.limits['uploadMaxFilesize']) {
2616	            errors.push("File size ".concat(file.size, " is bigger than ").concat(_this2.limits['uploadMaxFilesize']));
2617	          }
2618
2619	          if (errors.length > 0) {
2620	            return;
2621	          }
2622	        }
2623
2624	        if (String['normalize']) {
2625	          file.name = String(file.name).normalize();
2626	        }
2627
2628	        BX.onCustomEvent(_this2, "onItemIsAdded", [file, nodes[index] || null, _this2]);
2629	        added = true;
2630	      });
2631
2632	      if (added && this.params["uploadMethod"] === "immediate") {
2633	        this.submit();
2634	      }
2635
2636	      return false;
2637	    }
2638	  }, {
2639	    key: "getFormData",
2640	    value: function getFormData() {
2641	      var formData = new FormData(this.params["uploadFormData"] === "Y" && this.form ? this.form : undefined);
2642	      var entries = formData.entries();
2643	      var entry;
2644
2645	      while ((entry = entries.next()) && entry.done === false) {
2646	        var _entry$value = babelHelpers.slicedToArray(entry.value, 1),
2647	            name = _entry$value[0];
2648
2649	        if (name.indexOf(this.params["filesInputName"]) === 0 || name.indexOf(this.params["uploadInputInfoName"]) === 0 || name.indexOf(this.params["uploadInputName"]) === 0) {
2650	          formData.delete(name);
2651	        }
2652	      }
2653
2654	      formData.append('AJAX_POST', 'Y');
2655	      formData.append('USER_ID', main_core.Loc.getMessage('USER_ID'));
2656	      formData.append('sessid', BX.bitrix_sessid());
2657
2658	      if (BX.message.SITE_ID) {
2659	        formData.append('SITE_ID', BX.message.SITE_ID);
2660	      }
2661
2662	      formData.append(this.params["uploadInputInfoName"] + '[controlId]', this.controlId);
2663	      formData.append(this.params["uploadInputInfoName"] + '[CID]', this.CID);
2664	      formData.append(this.params["uploadInputInfoName"] + '[uploadInputName]', this.params["uploadInputName"]);
2665	      formData.append(this.params["uploadInputInfoName"] + '[version]', Options.getVersion());
2666	      return formData;
2667	    }
2668	  }, {
2669	    key: "submit",
2670	    value: function submit() {
2671	      var _this3 = this;
2672
2673	      //region Compatibility
2674	      if (this.queue.itForUpload.length <= 0) {
2675	        BX.onCustomEvent(this, 'onStart', [null, {
2676	          filesCount: 0
2677	        }, this]);
2678	        BX.onCustomEvent(this, 'onDone', [null, null, {
2679	          filesCount: 0
2680	        }]);
2681	        BX.onCustomEvent(this, 'onFinish', [null, null, {
2682	          filesCount: 0
2683	        }]);
2684	        return;
2685	      } //endregion
2686
2687
2688	      var files = Object.values(this.queue.itForUpload.items);
2689	      var formData = this.getFormData(); //region Here we can change formData
2690
2691	      var changedData = {};
2692	      var buffer1 = {
2693	        post: {
2694	          data: changedData,
2695	          size: 0,
2696	          filesCount: files.length
2697	        },
2698	        //compatibility field
2699	        filesCount: files.length
2700	      };
2701	      var eventOnPackageIsInitialized = new main_core_events.BaseEvent();
2702	      eventOnPackageIsInitialized.setCompatData([buffer1, this.queue.itForUpload]);
2703	      eventOnPackageIsInitialized.setData({
2704	        formData: formData,
2705	        data: changedData,
2706	        files: files
2707	      });
2708	      main_core_events.EventEmitter.emit(this, 'onPackageIsInitialized', eventOnPackageIsInitialized);
2709	      appendToForm(formData, buffer1.post.data);
2710
2711	      if (buffer1.post.data !== changedData) {
2712	        appendToForm(formData, changedData);
2713	      } //endregion
2714
2715
2716	      var packageId = 'pIndex' + (new Date().valueOf() + Math.round(Math.random() * 1000000));
2717	      formData.append(this.params["uploadInputInfoName"] + '[packageIndex]', packageId);
2718	      formData.append(this.params["uploadInputInfoName"] + '[mode]', 'upload');
2719	      formData.append(this.params["uploadInputInfoName"] + '[filesCount]', files.length);
2720
2721	      if (this.packages.size <= 0) {
2722	        console.group('Upload');
2723	      }
2724
2725	      console.log('1. Create a new Package');
2726	      var packItem = new Package({
2727	        id: packageId,
2728	        formData: formData,
2729	        files: files,
2730	        uploadFileUrl: this.uploadFileUrl,
2731	        uploadInputName: this.params["uploadInputName"]
2732	      });
2733	      this.queue.itForUpload = new UploaderUtils.Hash();
2734	      var eventOnStart = new main_core_events.BaseEvent();
2735	      eventOnStart.setCompatData([packageId, Object.assign({
2736	        post: {
2737	          data: packItem.data,
2738	          filesCount: files.length
2739	        }
2740	      }, packItem), this]);
2741	      eventOnStart.setData({
2742	        package: packItem
2743	      });
2744	      main_core_events.EventEmitter.emit(this, 'onStart', eventOnStart);
2745	      this.packages.set(packItem.getId(), packItem);
2746	      main_core_events.EventEmitter.emit(this, 'onBusy');
2747	      packItem.subscribeOnce('done', function (_ref5) {
2748	        var p = _ref5.target,
2749	            status = _ref5.data.status;
2750	        var evDone = new main_core_events.BaseEvent();
2751	        evDone.setCompatData([{}, packageId, packItem, packItem.getServerResponse()]);
2752	        evDone.setData({
2753	          package: packItem,
2754	          response: packItem.getServerResponse()
2755	        });
2756	        main_core_events.EventEmitter.emit(_this3, 'onDone', evDone); // region Compatibility
2757
2758	        if (status === 'failed') {
2759	          main_core_events.EventEmitter.emit(_this3, 'onError', new main_core_events.BaseEvent({
2760	            compatData: [{}, packageId, packItem.getServerResponse()]
2761	          }));
2762	        } // endregion Compatibility
2763
2764
2765	        _this3.packages.delete(p.getId());
2766
2767	        if (_this3.packages.size <= 0) {
2768	          setTimeout(function () {
2769	            var ev = new main_core_events.BaseEvent();
2770	            ev.setCompatData([{}, packageId, packItem, packItem.getServerResponse()]);
2771	            ev.setData({
2772	              package: packItem,
2773	              response: packItem.getServerResponse()
2774	            });
2775	            main_core_events.EventEmitter.emit(_this3, 'onFinish', ev);
2776	            console.groupEnd('Upload');
2777	          });
2778	        }
2779	      });
2780	      packItem.subscribe('fileIsUploaded', function (_ref6) {
2781	        var _ref6$data = _ref6.data,
2782	            itemId = _ref6$data.itemId,
2783	            item = _ref6$data.item,
2784	            response = _ref6$data.response;
2785
2786	        _this3.queue.itUploaded.setItem(itemId, item);
2787
2788	        BX.onCustomEvent(_this3, 'onFileIsUploaded', [itemId, item, response]);
2789	        BX.onCustomEvent(item, 'onUploadDone', [item, response, _this3, packItem.getId()]);
2790	      });
2791	      packItem.subscribe('fileIsErrored', function (_ref7) {
2792	        var _ref7$data = _ref7.data,
2793	            itemId = _ref7$data.itemId,
2794	            item = _ref7$data.item,
2795	            response = _ref7$data.response;
2796
2797	        _this3.queue.itFailed.setItem(itemId, item);
2798
2799	        BX.onCustomEvent(_this3, 'onFileIsUploadedWithError', [itemId, item, response, _this3, packItem.getId()]);
2800	        BX.onCustomEvent(item, 'onUploadError', [item, response, _this3, packItem.getId()]);
2801	      });
2802	      packItem.subscribe('fileIsInProgress', function (_ref8) {
2803	        var _ref8$data = _ref8.data,
2804	            item = _ref8$data.item,
2805	            percent = _ref8$data.percent;
2806	        BX.onCustomEvent(item, 'onUploadProgress', [item, percent, _this3, packItem.getId()]);
2807	      });
2808
2809	      if (packItem.prepare()) {
2810	        files.forEach(function (item) {
2811	          BX.onCustomEvent(item, 'onUploadStart', [item, 0, _this3, packItem.getId()]);
2812	        });
2813	        Streams.addPackage(packItem);
2814	      }
2815	    }
2816	  }, {
2817	    key: "log",
2818	    value: function log(text) {}
2819	  }, {
2820	    key: "destruct",
2821	    value: function destruct() {
2822	      main_core_events.EventEmitter.emit(this, Options.getEventName('destroy'));
2823	      delete this.dropZone;
2824	    }
2825	    /*region Compatbility */
2826
2827	  }, {
2828	    key: "getItem",
2829
2830	    /*endregion*/
2831	    value: function getItem(id) {
2832	      return this.queue.getItem(id);
2833	    }
2834	  }, {
2835	    key: "getItems",
2836	    value: function getItems() {
2837	      return this.queue.items;
2838	    }
2839	  }, {
2840	    key: "restoreItems",
2841	    value: function restoreItems() {
2842	      //Todo check it
2843	      this.queue.restoreFiles.apply(this.queue, arguments);
2844	    }
2845	  }, {
2846	    key: "clear",
2847	    value: function clear() {
2848	      var item;
2849
2850	      while ((item = this.queue.items.getFirst()) && item) {
2851	        item.deleteFile();
2852	      }
2853	    }
2854	  }, {
2855	    key: "controlID",
2856	    get: function get() {
2857	      return this.controlId;
2858	    }
2859	  }, {
2860	    key: "dialogName",
2861	    get: function get() {
2862	      return "BX.Uploader";
2863	    }
2864	  }, {
2865	    key: "length",
2866	    get: function get() {
2867	      return this.queue.itForUpload.length;
2868	    }
2869	  }, {
2870	    key: "streams",
2871	    get: function get() {
2872	      var _this4 = this;
2873
2874	      if (!this['#_streams']) {
2875	        this['#_streams'] = {
2876	          packages: {
2877	            getItem: function getItem(id) {
2878	              return _this4.packages.get(id);
2879	            }
2880	          }
2881	        };
2882	      }
2883
2884	      return this['#_streams'];
2885	    }
2886	  }], [{
2887	    key: "getById",
2888	    value: function getById(id) {
2889	      return this.repo.get(id);
2890	    }
2891	  }, {
2892	    key: "getInstanceById",
2893	    value: function getInstanceById(id) {
2894	      return this.repo.get(id);
2895	    }
2896	  }, {
2897	    key: "getInstanceName",
2898	    value: function getInstanceName() {
2899	      return 'BX.Uploader';
2900	    }
2901	  }]);
2902	  return Uploader;
2903	}();
2904
2905	babelHelpers.defineProperty(Uploader, "repo", new Map());
2906	babelHelpers.defineProperty(Uploader, "justCounter", 0);
2907	babelHelpers.defineProperty(Uploader, "getInstance", function (params) {
2908	  BX.onCustomEvent(window, "onUploaderIsAlmostInited", ['BX.Uploader', params]);
2909	  return new this(params);
2910	});
2911
2912	var Manager = /*#__PURE__*/function () {
2913	  function Manager() {
2914	    babelHelpers.classCallCheck(this, Manager);
2915	  }
2916
2917	  babelHelpers.createClass(Manager, null, [{
2918	    key: "getById",
2919	    value: function getById(id) {
2920	      return Uploader.getById(id);
2921	    }
2922	  }]);
2923	  return Manager;
2924	}();
2925
2926	exports.UploaderManager = Manager;
2927	exports.Uploader = Uploader;
2928
2929}((this.BX = this.BX || {}),BX,BX.Event));
2930//# sourceMappingURL=uploader.js.map

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.