/*!
* bootstrap-fileinput v5.2.4
* http://plugins.krajee.com/file-input
*
* Author: Kartik Visweswaran
* Copyright: 2014 - 2021, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD-3-Clause
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
*/
(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else {
if (typeof module === 'object' && module.exports) {
//noinspection NpmUsedModulesInstalled
module.exports = factory(require('jquery'));
} else {
factory(window.jQuery);
}
}
}(function ($) {
'use strict';
$.fn.fileinputLocales = {};
$.fn.fileinputThemes = {};
if (!$.fn.fileinputBsVersion) {
$.fn.fileinputBsVersion = (window.Alert && window.Alert.VERSION) ||
(window.bootstrap && window.bootstrap.Alert && bootstrap.Alert.VERSION) || '3.x.x';
}
String.prototype.setTokens = function (replacePairs) {
var str = this.toString(), key, re;
for (key in replacePairs) {
if (replacePairs.hasOwnProperty(key)) {
re = new RegExp('\{' + key + '\}', 'g');
str = str.replace(re, replacePairs[key]);
}
}
return str;
};
if (!Array.prototype.flatMap) { // polyfill flatMap
Array.prototype.flatMap = function (lambda) {
return [].concat(this.map(lambda));
};
}
if (!document.currentScript) {
document.currentScript = function() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}();
}
var $h, FileInput, getLoadingUrl = function () {
var src = document.currentScript.src, srcPath = src.substring(0, src.lastIndexOf("/"));
return srcPath + '/loading.gif'
};
// fileinput helper object for all global variables and internal helper methods
$h = {
FRAMES: '.kv-preview-thumb',
SORT_CSS: 'file-sortable',
INIT_FLAG: 'init-',
ZOOM_VAR: getLoadingUrl() + '?kvTemp__2873389129__=', // used to prevent 404 errors in URL parsing
OBJECT_PARAMS: '\n' +
'\n' +
'\n' +
'\n' +
'\n' +
'\n',
DEFAULT_PREVIEW: '
\n' +
'{previewFileIcon}\n' +
'
',
MODAL_ID: 'kvFileinputModal',
MODAL_EVENTS: ['show', 'shown', 'hide', 'hidden', 'loaded'],
logMessages: {
ajaxError: '{status}: {error}. Error Details: {text}.',
badDroppedFiles: 'Error scanning dropped files!',
badExifParser: 'Error loading the piexif.js library. {details}',
badInputType: 'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.',
exifWarning: 'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded ' +
'the "piexif.js" library correctly on your page before the "fileinput.js" script.',
invalidChunkSize: 'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.',
invalidThumb: 'Invalid thumb frame with id: "{id}".',
noResumableSupport: 'The browser does not support resumable or chunk uploads.',
noUploadUrl: 'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.',
retryStatus: 'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.',
chunkQueueError: 'Could not push task to ajax pool for chunk index # {index}.',
resumableMaxRetriesReached: 'Maximum resumable ajax retries ({n}) reached.',
resumableRetryError: 'Could not retry the resumable request (try # {n})... aborting.',
resumableAborting: 'Aborting / cancelling the resumable request.',
resumableRequestError: 'Error processing resumable request. {msg}'
},
objUrl: window.URL || window.webkitURL,
isBs: function (ver) {
var chk = $.trim(($.fn.fileinputBsVersion || '') + '');
ver = parseInt(ver, 10);
if (!chk) {
return ver === 4;
}
return ver === parseInt(chk.charAt(0), 10);
},
defaultButtonCss: function (fill) {
return 'btn-default btn-' + (fill ? '' : 'outline-') + 'secondary';
},
now: function () {
return new Date().getTime();
},
round: function (num) {
num = parseFloat(num);
return isNaN(num) ? 0 : Math.floor(Math.round(num));
},
getArray: function (obj) {
var i, arr = [], len = obj && obj.length || 0;
for (i = 0; i < len; i++) {
arr.push(obj[i]);
}
return arr;
},
getFileRelativePath: function (file) {
/** @namespace file.relativePath */
/** @namespace file.webkitRelativePath */
return String(file.newPath || file.relativePath || file.webkitRelativePath || $h.getFileName(file) || null);
},
getFileId: function (file, generateFileId) {
var relativePath = $h.getFileRelativePath(file);
if (typeof generateFileId === 'function') {
return generateFileId(file);
}
if (!file) {
return null;
}
if (!relativePath) {
return null;
}
return (file.size + '_' + encodeURIComponent(relativePath).replace(/%/g, '_'));
},
getFrameSelector: function (id, selector) {
selector = selector || '';
return '[id="' + id + '"]' + selector;
},
getZoomSelector: function (id, selector) {
return $h.getFrameSelector('zoom-' + id, selector);
},
getFrameElement: function ($element, id, selector) {
return $element.find($h.getFrameSelector(id, selector));
},
getZoomElement: function ($element, id, selector) {
return $element.find($h.getZoomSelector(id, selector));
},
getElapsed: function (seconds) {
var delta = seconds, out = '', result = {}, structure = {
year: 31536000,
month: 2592000,
week: 604800, // uncomment row to ignore
day: 86400, // feel free to add your own row
hour: 3600,
minute: 60,
second: 1
};
$h.getObjectKeys(structure).forEach(function (key) {
result[key] = Math.floor(delta / structure[key]);
delta -= result[key] * structure[key];
});
$.each(result, function (key, value) {
if (value > 0) {
out += (out ? ' ' : '') + value + key.substring(0, 1);
}
});
return out;
},
debounce: function (func, delay) {
var inDebounce;
return function () {
var args = arguments, context = this;
clearTimeout(inDebounce);
inDebounce = setTimeout(function () {
func.apply(context, args);
}, delay);
};
},
stopEvent: function (e) {
e.stopPropagation();
e.preventDefault();
},
getFileName: function (file) {
/** @namespace file.fileName */
return file ? (file.fileName || file.name || '') : ''; // some confusion in different versions of Firefox
},
createObjectURL: function (data) {
if ($h.objUrl && $h.objUrl.createObjectURL && data) {
return $h.objUrl.createObjectURL(data);
}
return '';
},
revokeObjectURL: function (data) {
if ($h.objUrl && $h.objUrl.revokeObjectURL && data) {
$h.objUrl.revokeObjectURL(data);
}
},
compare: function (input, str, exact) {
return input !== undefined && (exact ? input === str : input.match(str));
},
isIE: function (ver) {
var div, status;
// check for IE versions < 11
if (navigator.appName !== 'Microsoft Internet Explorer') {
return false;
}
if (ver === 10) {
return new RegExp('msie\\s' + ver, 'i').test(navigator.userAgent);
}
div = document.createElement('div');
div.innerHTML = '';
status = div.getElementsByTagName('i').length;
document.body.appendChild(div);
div.parentNode.removeChild(div);
return status;
},
canOrientImage: function ($el) {
var $img = $(document.createElement('img')).css({width: '1px', height: '1px'}).insertAfter($el),
flag = $img.css('image-orientation');
$img.remove();
return !!flag;
},
canAssignFilesToInput: function () {
var input = document.createElement('input');
try {
input.type = 'file';
input.files = null;
return true;
} catch (err) {
return false;
}
},
getDragDropFolders: function (items) {
var i, item, len = items ? items.length : 0, folders = 0;
if (len > 0 && items[0].webkitGetAsEntry()) {
for (i = 0; i < len; i++) {
item = items[i].webkitGetAsEntry();
if (item && item.isDirectory) {
folders++;
}
}
}
return folders;
},
initModal: function ($modal) {
var $body = $('body');
if ($body.length) {
$modal.appendTo($body);
}
},
isFunction: function (v) {
return typeof v === 'function';
},
isEmpty: function (value, trim) {
if (value === undefined || value === null || value === '') {
return true;
}
if ($h.isString(value) && trim) {
return $.trim(value) === '';
}
if ($h.isArray(value)) {
return value.length === 0;
}
if ($.isPlainObject(value) && $.isEmptyObject(value)) {
return true
}
return false;
},
isArray: function (a) {
return Array.isArray(a) || Object.prototype.toString.call(a) === '[object Array]';
},
isString: function (a) {
return Object.prototype.toString.call(a) === '[object String]';
},
ifSet: function (needle, haystack, def) {
def = def || '';
return (haystack && typeof haystack === 'object' && needle in haystack) ? haystack[needle] : def;
},
cleanArray: function (arr) {
if (!(arr instanceof Array)) {
arr = [];
}
return arr.filter(function (e) {
return (e !== undefined && e !== null);
});
},
spliceArray: function (arr, index, reverseOrder) {
var i, j = 0, out = [], newArr;
if (!(arr instanceof Array)) {
return [];
}
newArr = $.extend(true, [], arr);
if (reverseOrder) {
newArr.reverse();
}
for (i = 0; i < newArr.length; i++) {
if (i !== index) {
out[j] = newArr[i];
j++;
}
}
if (reverseOrder) {
out.reverse();
}
return out;
},
getNum: function (num, def) {
def = def || 0;
if (typeof num === 'number') {
return num;
}
if (typeof num === 'string') {
num = parseFloat(num);
}
return isNaN(num) ? def : num;
},
hasFileAPISupport: function () {
return !!(window.File && window.FileReader);
},
hasDragDropSupport: function () {
var div = document.createElement('div');
/** @namespace div.draggable */
/** @namespace div.ondragstart */
/** @namespace div.ondrop */
return !$h.isIE(9) &&
(div.draggable !== undefined || (div.ondragstart !== undefined && div.ondrop !== undefined));
},
hasFileUploadSupport: function () {
return $h.hasFileAPISupport() && window.FormData;
},
hasBlobSupport: function () {
try {
return !!window.Blob && Boolean(new Blob());
} catch (e) {
return false;
}
},
hasArrayBufferViewSupport: function () {
try {
return new Blob([new Uint8Array(100)]).size === 100;
} catch (e) {
return false;
}
},
hasResumableUploadSupport: function () {
/** @namespace Blob.prototype.webkitSlice */
/** @namespace Blob.prototype.mozSlice */
return $h.hasFileUploadSupport() && $h.hasBlobSupport() && $h.hasArrayBufferViewSupport() &&
(!!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice || !!Blob.prototype.slice || false);
},
dataURI2Blob: function (dataURI) {
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder ||
window.MSBlobBuilder, canBlob = $h.hasBlobSupport(), byteStr, arrayBuffer, intArray, i, mimeStr, bb,
canProceed = (canBlob || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array;
if (!canProceed) {
return null;
}
if (dataURI.split(',')[0].indexOf('base64') >= 0) {
byteStr = atob(dataURI.split(',')[1]);
} else {
byteStr = decodeURIComponent(dataURI.split(',')[1]);
}
arrayBuffer = new ArrayBuffer(byteStr.length);
intArray = new Uint8Array(arrayBuffer);
for (i = 0; i < byteStr.length; i += 1) {
intArray[i] = byteStr.charCodeAt(i);
}
mimeStr = dataURI.split(',')[0].split(':')[1].split(';')[0];
if (canBlob) {
return new Blob([$h.hasArrayBufferViewSupport() ? intArray : arrayBuffer], {type: mimeStr});
}
bb = new BlobBuilder();
bb.append(arrayBuffer);
return bb.getBlob(mimeStr);
},
arrayBuffer2String: function (buffer) {
if (window.TextDecoder) {
return new TextDecoder('utf-8').decode(buffer);
}
var array = Array.prototype.slice.apply(new Uint8Array(buffer)), out = '', i = 0, len, c, char2, char3;
len = array.length;
while (i < len) {
c = array[i++];
switch (c >> 4) { // jshint ignore:line
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); // jshint ignore:line
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) | // jshint ignore:line
((char2 & 0x3F) << 6) | // jshint ignore:line
((char3 & 0x3F) << 0)); // jshint ignore:line
break;
}
}
return out;
},
isHtml: function (str) {
var a = document.createElement('div');
a.innerHTML = str;
for (var c = a.childNodes, i = c.length; i--;) {
if (c[i].nodeType === 1) {
return true;
}
}
return false;
},
isSvg: function (str) {
return str.match(/^\s*<\?xml/i) && (str.match(/' + str + '' + tag + '>'));
},
uniqId: function () {
return (new Date().getTime() + Math.floor(Math.random() * Math.pow(10, 15))).toString(36);
},
cspBuffer: {
CSP_ATTRIB: 'data-csp-01928735', // a randomly named temporary attribute to store the CSP elem id
domElementsStyles: {},
stash: function (htmlString) {
var self = this, outerDom = $.parseHTML('' + htmlString + '
'), $el = $(outerDom);
$el.find('[style]').each(function (key, elem) {
var $elem = $(elem), styleDeclaration = $elem[0].style, id = $h.uniqId(), styles = {};
if (styleDeclaration && styleDeclaration.length) {
$(styleDeclaration).each(function () {
styles[this] = styleDeclaration[this];
});
self.domElementsStyles[id] = styles;
$elem.removeAttr('style').attr(self.CSP_ATTRIB, id);
}
});
$el.filter('*').removeAttr('style'); // make sure all style attr are removed
var values = Object.values ? Object.values(outerDom) : Object.keys(outerDom).map(function (itm) {
return outerDom[itm];
});
return values.flatMap(function (elem) {
return elem.innerHTML;
}).join('');
},
apply: function (domElement) {
var self = this, $el = $(domElement);
$el.find('[' + self.CSP_ATTRIB + ']').each(function (key, elem) {
var $elem = $(elem), id = $elem.attr(self.CSP_ATTRIB), styles = self.domElementsStyles[id];
if (styles) {
$elem.css(styles);
}
$elem.removeAttr(self.CSP_ATTRIB);
});
self.domElementsStyles = {};
}
},
setHtml: function ($elem, htmlString) {
var buf = $h.cspBuffer;
$elem.html(buf.stash(htmlString));
buf.apply($elem);
return $elem;
},
htmlEncode: function (str, undefVal) {
if (str === undefined) {
return undefVal || null;
}
return str.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
replaceTags: function (str, tags) {
var out = str;
if (!tags) {
return out;
}
$.each(tags, function (key, value) {
if (typeof value === 'function') {
value = value();
}
out = out.split(key).join(value);
});
return out;
},
cleanMemory: function ($thumb) {
var data = $thumb.is('img') ? $thumb.attr('src') : $thumb.find('source').attr('src');
$h.revokeObjectURL(data);
},
findFileName: function (filePath) {
var sepIndex = filePath.lastIndexOf('/');
if (sepIndex === -1) {
sepIndex = filePath.lastIndexOf('\\');
}
return filePath.split(filePath.substring(sepIndex, sepIndex + 1)).pop();
},
checkFullScreen: function () {
return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement ||
document.msFullscreenElement;
},
toggleFullScreen: function (maximize) {
var doc = document, de = doc.documentElement, isFullScreen = $h.checkFullScreen();
if (de && maximize && !isFullScreen) {
if (de.requestFullscreen) {
de.requestFullscreen();
} else {
if (de.msRequestFullscreen) {
de.msRequestFullscreen();
} else {
if (de.mozRequestFullScreen) {
de.mozRequestFullScreen();
} else {
if (de.webkitRequestFullscreen) {
de.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
}
}
}
}
} else {
if (isFullScreen) {
if (doc.exitFullscreen) {
doc.exitFullscreen();
} else {
if (doc.msExitFullscreen) {
doc.msExitFullscreen();
} else {
if (doc.mozCancelFullScreen) {
doc.mozCancelFullScreen();
} else {
if (doc.webkitExitFullscreen) {
doc.webkitExitFullscreen();
}
}
}
}
}
}
},
moveArray: function (arr, oldIndex, newIndex, reverseOrder) {
var newArr = $.extend(true, [], arr);
if (reverseOrder) {
newArr.reverse();
}
if (newIndex >= newArr.length) {
var k = newIndex - newArr.length;
while ((k--) + 1) {
newArr.push(undefined);
}
}
newArr.splice(newIndex, 0, newArr.splice(oldIndex, 1)[0]);
if (reverseOrder) {
newArr.reverse();
}
return newArr;
},
closeButton: function (css) {
css = ($h.isBs(5) ? 'btn-close' : 'close') + (css ? ' ' + css : '');
return '';
},
getRotation: function (value) {
switch (value) {
case 2:
return 'rotateY(180deg)';
case 3:
return 'rotate(180deg)';
case 4:
return 'rotate(180deg) rotateY(180deg)';
case 5:
return 'rotate(270deg) rotateY(180deg)';
case 6:
return 'rotate(90deg)';
case 7:
return 'rotate(90deg) rotateY(180deg)';
case 8:
return 'rotate(270deg)';
default:
return '';
}
},
setTransform: function (el, val) {
if (!el) {
return;
}
el.style.transform = val;
el.style.webkitTransform = val;
el.style['-moz-transform'] = val;
el.style['-ms-transform'] = val;
el.style['-o-transform'] = val;
},
getObjectKeys: function (obj) {
var keys = [];
if (obj) {
$.each(obj, function (key) {
keys.push(key);
});
}
return keys;
},
getObjectSize: function (obj) {
return $h.getObjectKeys(obj).length;
},
/**
* Small dependency injection for the task manager
* https://gist.github.com/fearphage/4341799
*/
whenAll: function (array) {
var s = [].slice, resolveValues = arguments.length === 1 && $h.isArray(array) ? array : s.call(arguments),
deferred = $.Deferred(), i, failed = 0, value, length = resolveValues.length,
remaining = length, rejectContexts, rejectValues, resolveContexts, updateFunc;
rejectContexts = rejectValues = resolveContexts = Array(length);
updateFunc = function (index, contexts, values) {
return function () {
if (values !== resolveValues) {
failed++;
}
deferred.notifyWith(contexts[index] = this, values[index] = s.call(arguments));
if (!(--remaining)) {
deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);
}
};
};
for (i = 0; i < length; i++) {
if ((value = resolveValues[i]) && $.isFunction(value.promise)) {
value.promise()
.done(updateFunc(i, resolveContexts, resolveValues))
.fail(updateFunc(i, rejectContexts, rejectValues));
} else {
deferred.notifyWith(this, value);
--remaining;
}
}
if (!remaining) {
deferred.resolveWith(resolveContexts, resolveValues);
}
return deferred.promise();
}
};
FileInput = function (element, options) {
var self = this;
self.$element = $(element);
self.$parent = self.$element.parent();
if (!self._validate()) {
return;
}
self.isPreviewable = $h.hasFileAPISupport();
self.isIE9 = $h.isIE(9);
self.isIE10 = $h.isIE(10);
if (self.isPreviewable || self.isIE9) {
self._init(options);
self._listen();
}
self.$element.removeClass('file-loading');
};
FileInput.prototype = {
constructor: FileInput,
_cleanup: function () {
var self = this;
self.reader = null;
self.clearFileStack();
self.fileBatchCompleted = true;
self.isError = false;
self.isDuplicateError = false;
self.isPersistentError = false;
self.cancelling = false;
self.paused = false;
self.lastProgress = 0;
self._initAjax();
},
_isAborted: function () {
var self = this;
return self.cancelling || self.paused;
},
_initAjax: function () {
var self = this, tm = self.taskManager = {
pool: {},
addPool: function (id) {
return (tm.pool[id] = new tm.TasksPool(id));
},
getPool: function (id) {
return tm.pool[id];
},
addTask: function (id, logic) { // add standalone task directly from task manager
return new tm.Task(id, logic);
},
TasksPool: function (id) {
var tp = this;
tp.id = id;
tp.cancelled = false;
tp.cancelledDeferrer = $.Deferred();
tp.tasks = {};
tp.addTask = function (id, logic) {
return (tp.tasks[id] = new tm.Task(id, logic));
};
tp.size = function () {
return $h.getObjectSize(tp.tasks);
};
tp.run = function (maxThreads) {
var i = 0, failed = false, task, tasksList = $h.getObjectKeys(tp.tasks).map(function (key) {
return tp.tasks[key];
}), tasksDone = [], deferred = $.Deferred(), enqueue, callback;
if (tp.cancelled) {
tp.cancelledDeferrer.resolve();
return deferred.reject();
}
// if run all at once
if (!maxThreads) {
var tasksDeferredList = $h.getObjectKeys(tp.tasks).map(function (key) {
return tp.tasks[key].deferred;
});
// when all are done
$h.whenAll(tasksDeferredList).done(function () {
var argv = $h.getArray(arguments);
if (!tp.cancelled) {
deferred.resolve.apply(null, argv);
tp.cancelledDeferrer.reject();
} else {
deferred.reject.apply(null, argv);
tp.cancelledDeferrer.resolve();
}
}).fail(function () {
var argv = $h.getArray(arguments);
deferred.reject.apply(null, argv);
if (!tp.cancelled) {
tp.cancelledDeferrer.reject();
} else {
tp.cancelledDeferrer.resolve();
}
});
// run all tasks
$.each(tp.tasks, function (id) {
task = tp.tasks[id];
task.run();
});
return deferred;
}
enqueue = function (task) {
$.when(task.deferred)
.fail(function () {
failed = true;
callback.apply(null, arguments);
})
.always(callback);
};
callback = function () {
var argv = $h.getArray(arguments);
// notify a task just ended
deferred.notify(argv);
tasksDone.push(argv);
if (tp.cancelled) {
deferred.reject.apply(null, tasksDone);
tp.cancelledDeferrer.resolve();
return;
}
if (tasksDone.length === tp.size()) {
if (failed) {
deferred.reject.apply(null, tasksDone);
} else {
deferred.resolve.apply(null, tasksDone);
}
}
// if there are any tasks remaining
if (tasksList.length) {
task = tasksList.shift();
enqueue(task);
task.run();
}
};
// run the first "maxThreads" tasks
while (tasksList.length && i++ < maxThreads) {
task = tasksList.shift();
enqueue(task);
task.run();
}
return deferred;
};
tp.cancel = function () {
tp.cancelled = true;
return tp.cancelledDeferrer;
};
},
Task: function (id, logic) {
var tk = this;
tk.id = id;
tk.deferred = $.Deferred();
tk.logic = logic;
tk.context = null;
tk.run = function () {
var argv = $h.getArray(arguments);
argv.unshift(tk.deferred); // add deferrer as first argument
logic.apply(tk.context, argv); // run task
return tk.deferred; // return deferrer
};
tk.runWithContext = function (context) {
tk.context = context;
return tk.run();
};
}
};
self.ajaxQueue = [];
self.ajaxRequests = [];
self.ajaxAborted = false;
},
_init: function (options, refreshMode) {
var self = this, f, $el = self.$element, $cont, t, tmp;
self.options = options;
self.canOrientImage = $h.canOrientImage($el);
$.each(options, function (key, value) {
switch (key) {
case 'minFileCount':
case 'maxFileCount':
case 'maxTotalFileCount':
case 'minFileSize':
case 'maxFileSize':
case 'maxFilePreviewSize':
case 'resizeQuality':
case 'resizeIfSizeMoreThan':
case 'progressUploadThreshold':
case 'initialPreviewCount':
case 'zoomModalHeight':
case 'minImageHeight':
case 'maxImageHeight':
case 'minImageWidth':
case 'maxImageWidth':
case 'bytesToKB':
self[key] = $h.getNum(value);
break;
default:
self[key] = value;
break;
}
});
if (!self.bytesToKB || self.bytesToKB <= 0) {
self.bytesToKB = 1024;
}
if (self.errorCloseButton === undefined) {
self.errorCloseButton = $h.closeButton('kv-error-close' + ($h.isBs(5) ? ' float-end' : ''));
}
if (self.maxTotalFileCount > 0 && self.maxTotalFileCount < self.maxFileCount) {
self.maxTotalFileCount = self.maxFileCount;
}
if (self.rtl) { // swap buttons for rtl
tmp = self.previewZoomButtonIcons.prev;
self.previewZoomButtonIcons.prev = self.previewZoomButtonIcons.next;
self.previewZoomButtonIcons.next = tmp;
}
// validate chunk threads to not exceed maxAjaxThreads
if (!isNaN(self.maxAjaxThreads) && self.maxAjaxThreads < self.resumableUploadOptions.maxThreads) {
self.resumableUploadOptions.maxThreads = self.maxAjaxThreads;
}
self._initFileManager();
if (typeof self.autoOrientImage === 'function') {
self.autoOrientImage = self.autoOrientImage();
}
if (typeof self.autoOrientImageInitial === 'function') {
self.autoOrientImageInitial = self.autoOrientImageInitial();
}
if (!refreshMode) {
self._cleanup();
}
self.duplicateErrors = [];
self.$form = $el.closest('form');
self._initTemplateDefaults();
self.uploadFileAttr = !$h.isEmpty($el.attr('name')) ? $el.attr('name') : 'file_data';
t = self._getLayoutTemplate('progress');
self.progressTemplate = t.replace('{class}', self.progressClass);
self.progressInfoTemplate = t.replace('{class}', self.progressInfoClass);
self.progressPauseTemplate = t.replace('{class}', self.progressPauseClass);
self.progressCompleteTemplate = t.replace('{class}', self.progressCompleteClass);
self.progressErrorTemplate = t.replace('{class}', self.progressErrorClass);
self.isDisabled = $el.attr('disabled') || $el.attr('readonly');
if (self.isDisabled) {
$el.attr('disabled', true);
}
self.isClickable = self.browseOnZoneClick && self.showPreview &&
(self.dropZoneEnabled || !$h.isEmpty(self.defaultPreviewContent));
self.isAjaxUpload = $h.hasFileUploadSupport() && !$h.isEmpty(self.uploadUrl);
self.dropZoneEnabled = $h.hasDragDropSupport() && self.dropZoneEnabled;
if (!self.isAjaxUpload) {
self.dropZoneEnabled = self.dropZoneEnabled && $h.canAssignFilesToInput();
}
self.slug = typeof options.slugCallback === 'function' ? options.slugCallback : self._slugDefault;
self.mainTemplate = self.showCaption ? self._getLayoutTemplate('main1') : self._getLayoutTemplate('main2');
self.captionTemplate = self._getLayoutTemplate('caption');
self.previewGenericTemplate = self._getPreviewTemplate('generic');
if (!self.imageCanvas && self.resizeImage && (self.maxImageWidth || self.maxImageHeight)) {
self.imageCanvas = document.createElement('canvas');
self.imageCanvasContext = self.imageCanvas.getContext('2d');
}
if ($h.isEmpty($el.attr('id'))) {
$el.attr('id', $h.uniqId());
}
self.namespace = '.fileinput_' + $el.attr('id').replace(/-/g, '_');
if (self.$container === undefined) {
self.$container = self._createContainer();
} else {
self._refreshContainer();
}
$cont = self.$container;
self.$dropZone = $cont.find('.file-drop-zone');
self.$progress = $cont.find('.kv-upload-progress');
self.$btnUpload = $cont.find('.fileinput-upload');
self.$captionContainer = $h.getElement(options, 'elCaptionContainer', $cont.find('.file-caption'));
self.$caption = $h.getElement(options, 'elCaptionText', $cont.find('.file-caption-name'));
if (!$h.isEmpty(self.msgPlaceholder)) {
f = $el.attr('multiple') ? self.filePlural : self.fileSingle;
self.$caption.attr('placeholder', self.msgPlaceholder.replace('{files}', f));
}
self.$captionIcon = self.$captionContainer.find('.file-caption-icon');
self.$previewContainer = $h.getElement(options, 'elPreviewContainer', $cont.find('.file-preview'));
self.$preview = $h.getElement(options, 'elPreviewImage', $cont.find('.file-preview-thumbnails'));
self.$previewStatus = $h.getElement(options, 'elPreviewStatus', $cont.find('.file-preview-status'));
self.$errorContainer = $h.getElement(options, 'elErrorContainer',
self.$previewContainer.find('.kv-fileinput-error'));
self._validateDisabled();
if (!$h.isEmpty(self.msgErrorClass)) {
$h.addCss(self.$errorContainer, self.msgErrorClass);
}
if (!refreshMode) {
self._resetErrors();
self.$errorContainer.hide();
self.previewInitId = 'thumb-' + $el.attr('id');
self._initPreviewCache();
self._initPreview(true);
self._initPreviewActions();
if (self.$parent.hasClass('file-loading')) {
self.$container.insertBefore(self.$parent);
self.$parent.remove();
}
} else {
if (!self._errorsExist()) {
self.$errorContainer.hide();
}
}
self._setFileDropZoneTitle();
if ($el.attr('disabled')) {
self.disable();
}
self._initZoom();
if (self.hideThumbnailContent) {
$h.addCss(self.$preview, 'hide-content');
}
},
_initFileManager: function () {
var self = this;
self.uploadStartTime = $h.now();
self.fileManager = {
stack: {},
filesProcessed: [],
errors: [],
loadedImages: {},
totalImages: 0,
totalFiles: null,
totalSize: null,
uploadedSize: 0,
stats: {},
bpsLog: [],
bps: 0,
initStats: function (id) {
var data = {started: $h.now()};
if (id) {
self.fileManager.stats[id] = data;
} else {
self.fileManager.stats = data;
}
},
getUploadStats: function (id, loaded, total) {
var fm = self.fileManager,
started = id ? fm.stats[id] && fm.stats[id].started || $h.now() : self.uploadStartTime,
elapsed = ($h.now() - started) / 1000, bps = Math.ceil(elapsed ? loaded / elapsed : 0),
pendingBytes = total - loaded, out, delay = fm.bpsLog.length ? self.bitrateUpdateDelay : 0;
setTimeout(function () {
var i, j = 0, n = 0, len, beg;
fm.bpsLog.push(bps);
fm.bpsLog.sort(function (a, b) {
return a - b;
});
len = fm.bpsLog.length;
beg = len > 10 ? len - 10 : Math.ceil(len / 2);
for (i = len; i > beg; i--) {
n = parseFloat(fm.bpsLog[i]);
j++;
}
fm.bps = (j > 0 ? n / j : 0) * 64;
}, delay);
out = {
fileId: id,
started: started,
elapsed: elapsed,
loaded: loaded,
total: total,
bps: fm.bps,
bitrate: self._getSize(fm.bps, self.bitRateUnits),
pendingBytes: pendingBytes
};
if (id) {
fm.stats[id] = out;
} else {
fm.stats = out;
}
return out;
},
exists: function (id) {
return $.inArray(id, self.fileManager.getIdList()) !== -1;
},
count: function () {
return self.fileManager.getIdList().length;
},
total: function () {
var fm = self.fileManager;
if (!fm.totalFiles) {
fm.totalFiles = fm.count();
}
return fm.totalFiles;
},
getTotalSize: function () {
var fm = self.fileManager;
if (fm.totalSize) {
return fm.totalSize;
}
fm.totalSize = 0;
$.each(self.getFileStack(), function (id, f) {
var size = parseFloat(f.size);
fm.totalSize += isNaN(size) ? 0 : size;
});
return fm.totalSize;
},
add: function (file, id) {
if (!id) {
id = self.fileManager.getId(file);
}
if (!id) {
return;
}
self.fileManager.stack[id] = {
file: file,
name: $h.getFileName(file),
relativePath: $h.getFileRelativePath(file),
size: file.size,
nameFmt: self._getFileName(file, ''),
sizeFmt: self._getSize(file.size)
};
},
remove: function ($thumb) {
var id = self._getThumbFileId($thumb);
self.fileManager.removeFile(id);
},
removeFile: function (id) {
var fm = self.fileManager;
if (!id) {
return;
}
delete fm.stack[id];
delete fm.loadedImages[id];
},
move: function (idFrom, idTo) {
var result = {}, stack = self.fileManager.stack;
if (!idFrom && !idTo || idFrom === idTo) {
return;
}
$.each(stack, function (k, v) {
if (k !== idFrom) {
result[k] = v;
}
if (k === idTo) {
result[idFrom] = stack[idFrom];
}
});
self.fileManager.stack = result;
},
list: function () {
var files = [];
$.each(self.getFileStack(), function (k, v) {
if (v && v.file) {
files.push(v.file);
}
});
return files;
},
isPending: function (id) {
return $.inArray(id, self.fileManager.filesProcessed) === -1 && self.fileManager.exists(id);
},
isProcessed: function () {
var filesProcessed = true, fm = self.fileManager;
$.each(self.getFileStack(), function (id) {
if (fm.isPending(id)) {
filesProcessed = false;
}
});
return filesProcessed;
},
clear: function () {
var fm = self.fileManager;
self.isDuplicateError = false;
self.isPersistentError = false;
fm.totalFiles = null;
fm.totalSize = null;
fm.uploadedSize = 0;
fm.stack = {};
fm.errors = [];
fm.filesProcessed = [];
fm.stats = {};
fm.bpsLog = [];
fm.bps = 0;
fm.clearImages();
},
clearImages: function () {
self.fileManager.loadedImages = {};
self.fileManager.totalImages = 0;
},
addImage: function (id, config) {
self.fileManager.loadedImages[id] = config;
},
removeImage: function (id) {
delete self.fileManager.loadedImages[id];
},
getImageIdList: function () {
return $h.getObjectKeys(self.fileManager.loadedImages);
},
getImageCount: function () {
return self.fileManager.getImageIdList().length;
},
getId: function (file) {
return self._getFileId(file);
},
getIndex: function (id) {
return self.fileManager.getIdList().indexOf(id);
},
getThumb: function (id) {
var $thumb = null;
self._getThumbs().each(function () {
var $t = $(this);
if (self._getThumbFileId($t) === id) {
$thumb = $t;
}
});
return $thumb;
},
getThumbIndex: function ($thumb) {
var id = self._getThumbFileId($thumb);
return self.fileManager.getIndex(id);
},
getIdList: function () {
return $h.getObjectKeys(self.fileManager.stack);
},
getFile: function (id) {
return self.fileManager.stack[id] || null;
},
getFileName: function (id, fmt) {
var file = self.fileManager.getFile(id);
if (!file) {
return '';
}
return fmt ? (file.nameFmt || '') : file.name || '';
},
getFirstFile: function () {
var ids = self.fileManager.getIdList(), id = ids && ids.length ? ids[0] : null;
return self.fileManager.getFile(id);
},
setFile: function (id, file) {
if (self.fileManager.getFile(id)) {
self.fileManager.stack[id].file = file;
} else {
self.fileManager.add(file, id);
}
},
setProcessed: function (id) {
self.fileManager.filesProcessed.push(id);
},
getProgress: function () {
var total = self.fileManager.total(), filesProcessed = self.fileManager.filesProcessed.length;
if (!total) {
return 0;
}
return Math.ceil(filesProcessed / total * 100);
},
setProgress: function (id, pct) {
var f = self.fileManager.getFile(id);
if (!isNaN(pct) && f) {
f.progress = pct;
}
}
};
},
_setUploadData: function (fd, config) {
var self = this;
$.each(config, function (key, value) {
var param = self.uploadParamNames[key] || key;
if ($h.isArray(value)) {
fd.append(param, value[0], value[1]);
} else {
fd.append(param, value);
}
});
},
_initResumableUpload: function () {
var self = this, opts = self.resumableUploadOptions, logs = $h.logMessages, rm, fm = self.fileManager;
if (!self.enableResumableUpload) {
return;
}
if (opts.fallback !== false && typeof opts.fallback !== 'function') {
opts.fallback = function (s) {
s._log(logs.noResumableSupport);
s.enableResumableUpload = false;
};
}
if (!$h.hasResumableUploadSupport() && opts.fallback !== false) {
opts.fallback(self);
return;
}
if (!self.uploadUrl && self.enableResumableUpload) {
self._log(logs.noUploadUrl);
self.enableResumableUpload = false;
return;
}
opts.chunkSize = parseFloat(opts.chunkSize);
if (opts.chunkSize <= 0 || isNaN(opts.chunkSize)) {
self._log(logs.invalidChunkSize, {chunkSize: opts.chunkSize});
self.enableResumableUpload = false;
return;
}
rm = self.resumableManager = {
init: function (id, f, index) {
rm.logs = [];
rm.stack = [];
rm.error = '';
rm.id = id;
rm.file = f.file;
rm.fileName = f.name;
rm.fileIndex = index;
rm.completed = false;
rm.lastProgress = 0;
if (self.showPreview) {
rm.$thumb = fm.getThumb(id) || null;
rm.$progress = rm.$btnDelete = null;
if (rm.$thumb && rm.$thumb.length) {
rm.$progress = rm.$thumb.find('.file-thumb-progress');
rm.$btnDelete = rm.$thumb.find('.kv-file-remove');
}
}
rm.chunkSize = opts.chunkSize * self.bytesToKB;
rm.chunkCount = rm.getTotalChunks();
},
setAjaxError: function (jqXHR, textStatus, errorThrown, isTest) {
if (jqXHR.responseJSON && jqXHR.responseJSON.error) {
errorThrown = jqXHR.responseJSON.error.toString();
}
if (!isTest) {
rm.error = errorThrown;
}
if (opts.showErrorLog) {
self._log(logs.ajaxError, {
status: jqXHR.status,
error: errorThrown,
text: jqXHR.responseText || ''
});
}
},
reset: function () {
rm.stack = [];
rm.chunksProcessed = {};
},
setProcessed: function (status) {
var id = rm.id, msg, $thumb = rm.$thumb, $prog = rm.$progress, hasThumb = $thumb && $thumb.length,
params = {id: hasThumb ? $thumb.attr('id') : '', index: fm.getIndex(id), fileId: id}, tokens,
skipErrorsAndProceed = self.resumableUploadOptions.skipErrorsAndProceed;
rm.completed = true;
rm.lastProgress = 0;
if (hasThumb) {
$thumb.removeClass('file-uploading');
}
if (status === 'success') {
fm.uploadedSize += rm.file.size;
if (self.showPreview) {
self._setProgress(101, $prog);
self._setThumbStatus($thumb, 'Success');
self._initUploadSuccess(rm.chunksProcessed[id].data, $thumb);
}
fm.removeFile(id);
delete rm.chunksProcessed[id];
self._raise('fileuploaded', [params.id, params.index, params.fileId]);
if (fm.isProcessed()) {
self._setProgress(101);
}
} else {
if (status !== 'cancel') {
if (self.showPreview) {
self._setThumbStatus($thumb, 'Error');
self._setPreviewError($thumb, true);
self._setProgress(101, $prog, self.msgProgressError);
self._setProgress(101, self.$progress, self.msgProgressError);
self.cancelling = !skipErrorsAndProceed;
}
if (!self.$errorContainer.find('li[data-file-id="' + params.fileId + '"]').length) {
tokens = {file: rm.fileName, max: opts.maxRetries, error: rm.error};
msg = self.msgResumableUploadRetriesExceeded.setTokens(tokens);
$.extend(params, tokens);
self._showFileError(msg, params, 'filemaxretries');
if (skipErrorsAndProceed) {
fm.removeFile(id);
delete rm.chunksProcessed[id];
if (fm.isProcessed()) {
self._setProgress(101);
}
}
}
}
}
if (fm.isProcessed()) {
rm.reset();
}
},
check: function () {
var status = true;
$.each(rm.logs, function (index, value) {
if (!value) {
status = false;
return false;
}
});
},
processedResumables: function () {
var logs = rm.logs, i, count = 0;
if (!logs || !logs.length) {
return 0;
}
for (i = 0; i < logs.length; i++) {
if (logs[i] === true) {
count++;
}
}
return count;
},
getUploadedSize: function () {
var size = rm.processedResumables() * rm.chunkSize;
return size > rm.file.size ? rm.file.size : size;
},
getTotalChunks: function () {
var chunkSize = parseFloat(rm.chunkSize);
if (!isNaN(chunkSize) && chunkSize > 0) {
return Math.ceil(rm.file.size / chunkSize);
}
return 0;
},
getProgress: function () {
var chunksProcessed = rm.processedResumables(), total = rm.chunkCount;
if (total === 0) {
return 0;
}
return Math.ceil(chunksProcessed / total * 100);
},
checkAborted: function (intervalId) {
if (self._isAborted()) {
clearInterval(intervalId);
self.unlock();
}
},
upload: function () {
var ids = fm.getIdList(), flag = 'new', intervalId;
intervalId = setInterval(function () {
var id;
rm.checkAborted(intervalId);
if (flag === 'new') {
self.lock();
flag = 'processing';
id = ids.shift();
fm.initStats(id);
if (fm.stack[id]) {
rm.init(id, fm.stack[id], fm.getIndex(id));
rm.processUpload();
}
}
if (!fm.isPending(id) && rm.completed) {
flag = 'new';
}
if (fm.isProcessed()) {
var $initThumbs = self.$preview.find('.file-preview-initial');
if ($initThumbs.length) {
$h.addCss($initThumbs, $h.SORT_CSS);
self._initSortable();
}
clearInterval(intervalId);
self._clearFileInput();
self.unlock();
setTimeout(function () {
var data = self.previewCache.data;
if (data) {
self.initialPreview = data.content;
self.initialPreviewConfig = data.config;
self.initialPreviewThumbTags = data.tags;
}
self._raise('filebatchuploadcomplete', [
self.initialPreview,
self.initialPreviewConfig,
self.initialPreviewThumbTags,
self._getExtraData()
]);
}, self.processDelay);
}
}, self.processDelay);
},
uploadResumable: function () {
var i, pool, tm = self.taskManager, total = rm.chunkCount;
pool = tm.addPool(rm.id);
for (i = 0; i < total; i++) {
rm.logs[i] = !!(rm.chunksProcessed[rm.id] && rm.chunksProcessed[rm.id][i]);
if (!rm.logs[i]) {
rm.pushAjax(i, 0);
}
}
pool.run(opts.maxThreads)
.done(function () {
rm.setProcessed('success');
})
.fail(function () {
rm.setProcessed(pool.cancelled ? 'cancel' : 'error');
});
},
processUpload: function () {
var fd, f, id = rm.id, fnBefore, fnSuccess, fnError, fnComplete, outData;
if (!opts.testUrl) {
rm.uploadResumable();
return;
}
fd = new FormData();
f = fm.stack[id];
self._setUploadData(fd, {
fileId: id,
fileName: f.fileName,
fileSize: f.size,
fileRelativePath: f.relativePath,
chunkSize: rm.chunkSize,
chunkCount: rm.chunkCount
});
fnBefore = function (jqXHR) {
outData = self._getOutData(fd, jqXHR);
self._raise('filetestbeforesend', [id, fm, rm, outData]);
};
fnSuccess = function (data, textStatus, jqXHR) {
outData = self._getOutData(fd, jqXHR, data);
var pNames = self.uploadParamNames, chunksUploaded = pNames.chunksUploaded || 'chunksUploaded',
params = [id, fm, rm, outData];
if (!data[chunksUploaded] || !$h.isArray(data[chunksUploaded])) {
self._raise('filetesterror', params);
} else {
if (!rm.chunksProcessed[id]) {
rm.chunksProcessed[id] = {};
}
$.each(data[chunksUploaded], function (key, index) {
rm.logs[index] = true;
rm.chunksProcessed[id][index] = true;
});
rm.chunksProcessed[id].data = data;
self._raise('filetestsuccess', params);
}
rm.uploadResumable();
};
fnError = function (jqXHR, textStatus, errorThrown) {
outData = self._getOutData(fd, jqXHR);
self._raise('filetestajaxerror', [id, fm, rm, outData]);
rm.setAjaxError(jqXHR, textStatus, errorThrown, true);
rm.uploadResumable();
};
fnComplete = function () {
self._raise('filetestcomplete', [id, fm, rm, self._getOutData(fd)]);
};
self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex, opts.testUrl);
},
pushAjax: function (index, retry) {
var tm = self.taskManager, pool = tm.getPool(rm.id);
pool.addTask(pool.size() + 1, function (deferrer) {
// use fifo chunk stack
var arr = rm.stack.shift(), index;
index = arr[0];
if (!rm.chunksProcessed[rm.id] || !rm.chunksProcessed[rm.id][index]) {
rm.sendAjax(index, arr[1], deferrer);
} else {
self._log(logs.chunkQueueError, {index: index});
}
});
rm.stack.push([index, retry]);
},
sendAjax: function (index, retry, deferrer) {
var f, chunkSize = rm.chunkSize, id = rm.id, file = rm.file, $thumb = rm.$thumb,
msgs = $h.logMessages, $btnDelete = rm.$btnDelete, logError = function (msg, tokens) {
if (tokens) {
msg = msg.setTokens(tokens);
}
msg = msgs.resumableRequestError.setTokens({msg: msg});
self._log(msg);
deferrer.reject(msg);
};
if (rm.chunksProcessed[id] && rm.chunksProcessed[id][index]) {
return;
}
if (retry > opts.maxRetries) {
logError(msgs.resumableMaxRetriesReached, {n: opts.maxRetries});
rm.setProcessed('error');
return;
}
var fd, outData, fnBefore, fnSuccess, fnError, fnComplete, slice = file.slice ? 'slice' :
(file.mozSlice ? 'mozSlice' : (file.webkitSlice ? 'webkitSlice' : 'slice')),
blob = file[slice](chunkSize * index, chunkSize * (index + 1));
fd = new FormData();
f = fm.stack[id];
self._setUploadData(fd, {
chunkCount: rm.chunkCount,
chunkIndex: index,
chunkSize: chunkSize,
chunkSizeStart: chunkSize * index,
fileBlob: [blob, rm.fileName],
fileId: id,
fileName: rm.fileName,
fileRelativePath: f.relativePath,
fileSize: file.size,
retryCount: retry
});
if (rm.$progress && rm.$progress.length) {
rm.$progress.show();
}
fnBefore = function (jqXHR) {
outData = self._getOutData(fd, jqXHR);
if (self.showPreview) {
if (!$thumb.hasClass('file-preview-success')) {
self._setThumbStatus($thumb, 'Loading');
$h.addCss($thumb, 'file-uploading');
}
$btnDelete.attr('disabled', true);
}
self._raise('filechunkbeforesend', [id, index, retry, fm, rm, outData]);
};
fnSuccess = function (data, textStatus, jqXHR) {
if (self._isAborted()) {
logError(msgs.resumableAborting);
return;
}
outData = self._getOutData(fd, jqXHR, data);
var paramNames = self.uploadParamNames, chunkIndex = paramNames.chunkIndex || 'chunkIndex',
params = [id, index, retry, fm, rm, outData];
if (data.error) {
if (opts.showErrorLog) {
self._log(logs.retryStatus, {
retry: retry + 1,
filename: rm.fileName,
chunk: index
});
}
self._raise('filechunkerror', params);
rm.pushAjax(index, retry + 1);
rm.error = data.error;
logError(data.error);
} else {
rm.logs[data[chunkIndex]] = true;
if (!rm.chunksProcessed[id]) {
rm.chunksProcessed[id] = {};
}
rm.chunksProcessed[id][data[chunkIndex]] = true;
rm.chunksProcessed[id].data = data;
deferrer.resolve.call(null, data);
self._raise('filechunksuccess', params);
rm.check();
}
};
fnError = function (jqXHR, textStatus, errorThrown) {
if (self._isAborted()) {
logError(msgs.resumableAborting);
return;
}
outData = self._getOutData(fd, jqXHR);
rm.setAjaxError(jqXHR, textStatus, errorThrown);
self._raise('filechunkajaxerror', [id, index, retry, fm, rm, outData]);
rm.pushAjax(index, retry + 1); // push another task
logError(msgs.resumableRetryError, {n: retry - 1}); // resolve the current task
};
fnComplete = function () {
if (!self._isAborted()) {
self._raise('filechunkcomplete', [id, index, retry, fm, rm, self._getOutData(fd)]);
}
};
self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex);
}
};
rm.reset();
},
_initTemplateDefaults: function () {
var self = this, tMain1, tMain2, tPreview, tFileIcon, tClose, tCaption, tBtnDefault, tBtnLink, tBtnBrowse,
tModalMain, tModal, tProgress, tSize, tFooter, tActions, tActionDelete, tActionUpload, tActionDownload,
tActionZoom, tActionDrag, tIndicator, tTagBef, tTagBef1, tTagBef2, tTagAft, tGeneric, tHtml, tImage,
tText, tOffice, tGdocs, tVideo, tAudio, tFlash, tObject, tPdf, tOther, tStyle, tZoomCache, vDefaultDim,
tStats, tModalLabel, tDescClose, renderObject = function (type, mime) {
return '\n';
}, defBtnCss1 = 'btn btn-sm btn-kv ' + $h.defaultButtonCss();
tMain1 = '{preview}\n' +
'\n' +
'';
tMain2 = '{preview}\n\n\n' +
'{remove}\n{cancel}\n{upload}\n{browse}\n';
tPreview = '\n' +
' {close}' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
'
';
tClose = $h.closeButton('fileinput-remove');
tFileIcon = '';
// noinspection HtmlUnknownAttribute
tCaption = '\n';
//noinspection HtmlUnknownAttribute
tBtnDefault = '';
//noinspection HtmlUnknownTarget,HtmlUnknownAttribute
tBtnLink = '{icon} {label}';
//noinspection HtmlUnknownAttribute
tBtnBrowse = '{icon} {label}
';
tModalLabel = $h.MODAL_ID + 'Label';
tModalMain = '';
tModal = '\n' +
'
\n' +
' \n' +
'
\n' +
'
\n' + '{prev} {next}\n' +
'
\n' +
'
\n' +
'
\n';
tDescClose = '';
tProgress = '\n' +
'
\n' +
' {status}\n' +
'
\n' +
'
{stats}';
tStats = '' +
'{pendingTime} ' +
'{uploadSpeed}' +
'
';
tSize = ' ({sizeText})';
tFooter = '';
tActions = '\n' +
' \n' +
'
\n' +
'{drag}\n' +
'';
//noinspection HtmlUnknownAttribute
tActionDelete = '\n';
tActionUpload = '';
tActionDownload = '{downloadIcon}';
tActionZoom = '';
tActionDrag = '{dragIcon}';
tIndicator = '{indicator}
';
tTagBef = '\n';
tTagBef2 = tTagBef + ' title="{caption}">
\n';
tTagAft = '
{footer}\n{zoomCache}
\n';
tGeneric = '{content}\n';
tStyle = ' {style}';
tHtml = renderObject('html', 'text/html');
tText = renderObject('text', 'text/plain;charset=UTF-8');
tPdf = renderObject('pdf', 'application/pdf');
tImage = '

\n';
tOffice = '
';
tGdocs = '
';
tVideo = '
\n';
tAudio = '
\n';
tFlash = '