PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` /*! * bootstrap-fileinput v4.5.1 * http://plugins.krajee.com/file-input * * Author: Kartik Visweswaran * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com * * Licensed under the BSD 3-Clause * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md */ !function (e) { "use strict"; "function" == typeof define && define.amd ? define(["jquery"], e) : "object" == typeof module && module.exports ? module.exports = e(require("jquery")) : e(window.jQuery) }(function (e) { "use strict"; var t, i; e.fn.fileinputLocales = {}, e.fn.fileinputThemes = {}, String.prototype.setTokens = function (e) { var t, i, a = this.toString(); for (t in e) e.hasOwnProperty(t) && (i = new RegExp("{" + t + "}", "g"), a = a.replace(i, e[t])); return a }, t = { FRAMES: ".kv-preview-thumb", SORT_CSS: "file-sortable", OBJECT_PARAMS: '\n\n\n\n\n\n', DEFAULT_PREVIEW: '
\n{previewFileIcon}\n
', MODAL_ID: "kvFileinputModal", MODAL_EVENTS: ["show", "shown", "hide", "hidden", "loaded"], objUrl: window.URL || window.webkitURL, compare: function (e, t, i) { return void 0 !== e && (i ? e === t : e.match(t)) }, isIE: function (e) { if ("Microsoft Internet Explorer" !== navigator.appName) return !1; if (10 === e) return new RegExp("msie\\s" + e, "i").test(navigator.userAgent); var t, i = document.createElement("div"); return i.innerHTML = "\x3c!--[if IE " + e + "]> 0 && e[0].webkitGetAsEntry()) for (t = 0; t < a; t++) (i = e[t].webkitGetAsEntry()) && i.isDirectory && r++; return r }, initModal: function (t) { var i = e("body"); i.length && t.appendTo(i) }, isEmpty: function (t, i) { return null == t || 0 === t.length || i && "" === e.trim(t) }, isArray: function (e) { return Array.isArray(e) || "[object Array]" === Object.prototype.toString.call(e) }, ifSet: function (e, t, i) { return i = i || "", t && "object" == typeof t && e in t ? t[e] : i }, cleanArray: function (e) { return e instanceof Array || (e = []), e.filter(function (e) { return null != e }) }, spliceArray: function (t, i, a) { var r, n, s = 0, o = []; if (!(t instanceof Array)) return []; for (n = e.extend(!0, [], t), a && n.reverse(), r = 0; r < n.length; r++) r !== i && (o[s] = n[r], s++); return a && o.reverse(), o }, getNum: function (e, t) { return t = t || 0, "number" == typeof e ? e : ("string" == typeof e && (e = parseFloat(e)), isNaN(e) ? t : e) }, hasFileAPISupport: function () { return !(!window.File || !window.FileReader) }, hasDragDropSupport: function () { var e = document.createElement("div"); return !t.isIE(9) && (void 0 !== e.draggable || void 0 !== e.ondragstart && void 0 !== e.ondrop) }, hasFileUploadSupport: function () { return t.hasFileAPISupport() && window.FormData }, hasBlobSupport: function () { try { return !!window.Blob && Boolean(new Blob) } catch (e) { return !1 } }, hasArrayBufferViewSupport: function () { try { return 100 === new Blob([new Uint8Array(100)]).size } catch (e) { return !1 } }, dataURI2Blob: function (e) { var i, a, r, n, s, o, l = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, d = t.hasBlobSupport(); if (!((d || l) && window.atob && window.ArrayBuffer && window.Uint8Array)) return null; for (i = e.split(",")[0].indexOf("base64") >= 0 ? atob(e.split(",")[1]) : decodeURIComponent(e.split(",")[1]), a = new ArrayBuffer(i.length), r = new Uint8Array(a), n = 0; n < i.length; n += 1) r[n] = i.charCodeAt(n); return s = e.split(",")[0].split(":")[1].split(";")[0], d ? new Blob([t.hasArrayBufferViewSupport() ? r : a], {type: s}) : ((o = new l).append(a), o.getBlob(s)) }, arrayBuffer2String: function (e) { if (window.TextDecoder) return new TextDecoder("utf-8").decode(e); var t, i, a, r, n = Array.prototype.slice.apply(new Uint8Array(e)), s = "", o = 0; for (t = n.length; o < t;) switch ((i = n[o++]) >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: s += String.fromCharCode(i); break; case 12: case 13: a = n[o++], s += String.fromCharCode((31 & i) << 6 | 63 & a); break; case 14: a = n[o++], r = n[o++], s += String.fromCharCode((15 & i) << 12 | (63 & a) << 6 | (63 & r) << 0) } return s }, isHtml: function (e) { var t = document.createElement("div"); t.innerHTML = e; for (var i = t.childNodes, a = i.length; a--;) if (1 === i[a].nodeType) return !0; return !1 }, isSvg: function (e) { return e.match(/^\s*<\?xml/i) && (e.match(//g, ">").replace(/"/g, """).replace(/'/g, "'") }, replaceTags: function (t, i) { var a = t; return i ? (e.each(i, function (e, t) { "function" == typeof t && (t = t()), a = a.split(e).join(t) }), a) : a }, cleanMemory: function (e) { var i = e.is("img") ? e.attr("src") : e.find("source").attr("src"); t.objUrl.revokeObjectURL(i) }, findFileName: function (e) { var t = e.lastIndexOf("/"); return -1 === t && (t = e.lastIndexOf("\\")), e.split(e.substring(t, t + 1)).pop() }, checkFullScreen: function () { return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement }, toggleFullScreen: function (e) { var i = document, a = i.documentElement; a && e && !t.checkFullScreen() ? a.requestFullscreen ? a.requestFullscreen() : a.msRequestFullscreen ? a.msRequestFullscreen() : a.mozRequestFullScreen ? a.mozRequestFullScreen() : a.webkitRequestFullscreen && a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) : i.exitFullscreen ? i.exitFullscreen() : i.msExitFullscreen ? i.msExitFullscreen() : i.mozCancelFullScreen ? i.mozCancelFullScreen() : i.webkitExitFullscreen && i.webkitExitFullscreen() }, moveArray: function (t, i, a, r) { var n = e.extend(!0, [], t); if (r && n.reverse(), a >= n.length) for (var s = a - n.length; 1 + s--;) n.push(void 0); return n.splice(a, 0, n.splice(i, 1)[0]), r && n.reverse(), n }, cleanZoomCache: function (e) { var t = e.closest(".kv-zoom-cache-theme"); t.length || (t = e.closest(".kv-zoom-cache")), t.remove() }, closeButton: function (e) { return '' }, getRotation: function (e) { switch (e) { 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 (e, t) { e && (e.style.transform = t, e.style.webkitTransform = t, e.style["-moz-transform"] = t, e.style["-ms-transform"] = t, e.style["-o-transform"] = t) }, setImageOrientation: function (e, i, a) { if (e && e.length) { var r = "load.fileinputimageorient"; e.off(r).on(r, function () { var r = e.get(0), n = i && i.length ? i.get(0) : null, s = r.offsetHeight, o = r.offsetWidth, l = t.getRotation(a); if (e.data("orientation", a), n && i.data("orientation", a), a < 5) return t.setTransform(r, l), void t.setTransform(n, l); var d = Math.atan(o / s), c = Math.sqrt(Math.pow(s, 2) + Math.pow(o, 2)), h = c ? s / Math.cos(Math.PI / 2 + d) / c : 1, p = " scale(" + Math.abs(h) + ")"; t.setTransform(r, l + p), t.setTransform(n, l + p) }) } } }, (i = function (i, a) { this.$element = e(i), this.$parent = this.$element.parent(), this._validate() && (this.isPreviewable = t.hasFileAPISupport(), this.isIE9 = t.isIE(9), this.isIE10 = t.isIE(10), (this.isPreviewable || this.isIE9) && (this._init(a), this._listen()), this.$element.removeClass("file-loading")) }).prototype = { constructor: i, _cleanup: function () { this.reader = null, this.formdata = {}, this.uploadCount = 0, this.uploadStatus = {}, this.uploadLog = [], this.uploadAsyncCount = 0, this.loadedImages = [], this.totalImagesCount = 0, this.ajaxRequests = [], this.clearStack(), this.fileBatchCompleted = !0, this.isPreviewable || (this.showPreview = !1), this.isError = !1, this.ajaxAborted = !1, this.cancelling = !1 }, _init: function (i, a) { var r, n, s, o, l = this, d = l.$element; l.options = i, e.each(i, function (e, i) { switch (e) { case"minFileCount": case"maxFileCount": case"minFileSize": case"maxFileSize": case"maxFilePreviewSize": case"resizeImageQuality": case"resizeIfSizeMoreThan": case"progressUploadThreshold": case"initialPreviewCount": case"zoomModalHeight": case"minImageHeight": case"maxImageHeight": case"minImageWidth": case"maxImageWidth": l[e] = t.getNum(i); break; default: l[e] = i } }), l.rtl && (o = l.previewZoomButtonIcons.prev, l.previewZoomButtonIcons.prev = l.previewZoomButtonIcons.next, l.previewZoomButtonIcons.next = o), a || l._cleanup(), l.$form = d.closest("form"), l._initTemplateDefaults(), l.uploadFileAttr = t.isEmpty(d.attr("name")) ? "file_data" : d.attr("name"), s = l._getLayoutTemplate("progress"), l.progressTemplate = s.replace("{class}", l.progressClass), l.progressCompleteTemplate = s.replace("{class}", l.progressCompleteClass), l.progressErrorTemplate = s.replace("{class}", l.progressErrorClass), l.isDisabled = d.attr("disabled") || d.attr("readonly"), l.isDisabled && d.attr("disabled", !0), l.isClickable = l.browseOnZoneClick && l.showPreview && (l.dropZoneEnabled || !t.isEmpty(l.defaultPreviewContent)), l.isAjaxUpload = t.hasFileUploadSupport() && !t.isEmpty(l.uploadUrl), l.dropZoneEnabled = t.hasDragDropSupport() && l.dropZoneEnabled, l.isAjaxUpload || (l.dropZoneEnabled = l.dropZoneEnabled && t.canAssignFilesToInput()), l.slug = "function" == typeof i.slugCallback ? i.slugCallback : l._slugDefault, l.mainTemplate = l.showCaption ? l._getLayoutTemplate("main1") : l._getLayoutTemplate("main2"), l.captionTemplate = l._getLayoutTemplate("caption"), l.previewGenericTemplate = l._getPreviewTemplate("generic"), !l.imageCanvas && l.resizeImage && (l.maxImageWidth || l.maxImageHeight) && (l.imageCanvas = document.createElement("canvas"), l.imageCanvasContext = l.imageCanvas.getContext("2d")), t.isEmpty(d.attr("id")) && d.attr("id", t.uniqId()), l.namespace = ".fileinput_" + d.attr("id").replace(/-/g, "_"), void 0 === l.$container ? l.$container = l._createContainer() : l._refreshContainer(), n = l.$container, l.$dropZone = n.find(".file-drop-zone"), l.$progress = n.find(".kv-upload-progress"), l.$btnUpload = n.find(".fileinput-upload"), l.$captionContainer = t.getElement(i, "elCaptionContainer", n.find(".file-caption")), l.$caption = t.getElement(i, "elCaptionText", n.find(".file-caption-name")), t.isEmpty(l.msgPlaceholder) || (r = d.attr("multiple") ? l.filePlural : l.fileSingle, l.$caption.attr("placeholder", l.msgPlaceholder.replace("{files}", r))), l.$captionIcon = l.$captionContainer.find(".file-caption-icon"), l.$previewContainer = t.getElement(i, "elPreviewContainer", n.find(".file-preview")), l.$preview = t.getElement(i, "elPreviewImage", n.find(".file-preview-thumbnails")), l.$previewStatus = t.getElement(i, "elPreviewStatus", n.find(".file-preview-status")), l.$errorContainer = t.getElement(i, "elErrorContainer", l.$previewContainer.find(".kv-fileinput-error")), l._validateDisabled(), t.isEmpty(l.msgErrorClass) || t.addCss(l.$errorContainer, l.msgErrorClass), a ? l._errorsExist() || l.$errorContainer.hide() : (l.$errorContainer.hide(), l.previewInitId = "preview-" + t.uniqId(), l._initPreviewCache(), l._initPreview(!0), l._initPreviewActions(), l.$parent.hasClass("file-loading") && (l.$container.insertBefore(l.$parent), l.$parent.remove())), l._setFileDropZoneTitle(), d.attr("disabled") && l.disable(), l._initZoom(), l.hideThumbnailContent && t.addCss(l.$preview, "hide-content") }, _initTemplateDefaults: function () { var i, a, r, n, s, o, l, d, c, h = this; i = t.closeButton("fileinput-remove"), a = '', r = '
\n", s = '\x3c!--suppress ALL --\x3e\n", l = '\n', o = '\n\n' + t.OBJECT_PARAMS + " " + t.DEFAULT_PREVIEW + "\n\n", d = '
\n' + t.DEFAULT_PREVIEW + "\n
\n", c = { width: "100%", height: "100%", "min-height": "480px" }, h._isPdfRendered() && (l = h.pdfRendererTemplate.replace("{renderer}", h.pdfRendererUrl)), h.defaults = { layoutTemplates: { main1: '{preview}\n
\n
\n {caption}\n
\n {remove}\n {cancel}\n {upload}\n {browse}\n
\n
', main2: '{preview}\n
\n
\n{remove}\n{cancel}\n{upload}\n{browse}\n', preview: '
\n {close}
\n
\n
\n
\n
\n
\n
', close: i, fileIcon: '', caption: '
\n \n \n
', modalMain: a, modal: '\n', progress: '
\n
\n {status}\n
\n
', size: " ({sizeText})", footer: '', indicator: '
{indicator}
', actions: '
\n \n
\n{drag}\n
', actionDelete: '\n', actionUpload: '', actionDownload: '{downloadIcon}', actionZoom: '', actionDrag: '{dragIcon}', btnDefault: '', btnLink: '{icon} {label}', btnBrowse: '
{icon} {label}
', zoomCache: '' }, previewMarkupTags: { tagBefore1: '
\n', tagBefore2: '
\n', tagAfter: "
{footer}\n
\n" }, previewContentTemplates: { generic: "{content}\n", html: '
{data}
\n', image: '{caption}\n', text: '\n', office: '', gdocs: '', video: n, audio: s, flash: '\n', object: o, pdf: l, other: d }, allowedPreviewTypes: ["image", "html", "text", "video", "audio", "flash", "pdf", "object"], previewTemplates: {}, previewSettings: { image: {width: "auto", height: "auto", "max-width": "100%", "max-height": "100%"}, html: {width: "213px", height: "160px"}, text: {width: "213px", height: "160px"}, office: {width: "213px", height: "160px"}, gdocs: {width: "213px", height: "160px"}, video: {width: "213px", height: "160px"}, audio: {width: "100%", height: "30px"}, flash: {width: "213px", height: "160px"}, object: {width: "213px", height: "160px"}, pdf: {width: "100%", height: "160px"}, other: {width: "213px", height: "160px"} }, previewSettingsSmall: { image: { width: "auto", height: "auto", "max-width": "100%", "max-height": "100%" }, html: {width: "100%", height: "160px"}, text: {width: "100%", height: "160px"}, office: {width: "100%", height: "160px"}, gdocs: {width: "100%", height: "160px"}, video: {width: "100%", height: "auto"}, audio: {width: "100%", height: "30px"}, flash: {width: "100%", height: "auto"}, object: {width: "100%", height: "auto"}, pdf: {width: "100%", height: "160px"}, other: {width: "100%", height: "160px"} }, previewZoomSettings: { image: {width: "auto", height: "auto", "max-width": "100%", "max-height": "100%"}, html: c, text: c, office: {width: "100%", height: "100%", "max-width": "100%", "min-height": "480px"}, gdocs: {width: "100%", height: "100%", "max-width": "100%", "min-height": "480px"}, video: {width: "auto", height: "100%", "max-width": "100%"}, audio: {width: "100%", height: "30px"}, flash: {width: "auto", height: "480px"}, object: {width: "auto", height: "100%", "max-width": "100%", "min-height": "480px"}, pdf: c, other: {width: "auto", height: "100%", "min-height": "480px"} }, fileTypeSettings: { image: function (e, i) { return t.compare(e, "image.*") && !t.compare(e, /(tiff?|wmf)$/i) || t.compare(i, /\.(gif|png|jpe?g)$/i) }, html: function (e, i) { return t.compare(e, "text/html") || t.compare(i, /\.(htm|html)$/i) }, office: function (e, i) { return t.compare(e, /(word|excel|powerpoint|office)$/i) || t.compare(i, /\.(docx?|xlsx?|pptx?|pps|potx?)$/i) }, gdocs: function (e, i) { return t.compare(e, /(word|excel|powerpoint|office|iwork-pages|tiff?)$/i) || t.compare(i, /\.(docx?|xlsx?|pptx?|pps|potx?|rtf|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i) }, text: function (e, i) { return t.compare(e, "text.*") || t.compare(i, /\.(xml|javascript)$/i) || t.compare(i, /\.(txt|md|csv|nfo|ini|json|php|js|css)$/i) }, video: function (e, i) { return t.compare(e, "video.*") && (t.compare(e, /(ogg|mp4|mp?g|mov|webm|3gp)$/i) || t.compare(i, /\.(og?|mp4|webm|mp?g|mov|3gp)$/i)) }, audio: function (e, i) { return t.compare(e, "audio.*") && (t.compare(i, /(ogg|mp3|mp?g|wav)$/i) || t.compare(i, /\.(og?|mp3|mp?g|wav)$/i)) }, flash: function (e, i) { return t.compare(e, "application/x-shockwave-flash", !0) || t.compare(i, /\.(swf)$/i) }, pdf: function (e, i) { return t.compare(e, "application/pdf", !0) || t.compare(i, /\.(pdf)$/i) }, object: function () { return !0 }, other: function () { return !0 } }, fileActionSettings: { showRemove: !0, showUpload: !0, showDownload: !0, showZoom: !0, showDrag: !0, removeIcon: '', removeClass: "btn btn-sm btn-kv btn-default btn-outline-secondary", removeErrorClass: "btn btn-sm btn-kv btn-danger", removeTitle: "Remove file", uploadIcon: '', uploadClass: "btn btn-sm btn-kv btn-default btn-outline-secondary", uploadTitle: "Upload file", uploadRetryIcon: '', uploadRetryTitle: "Retry upload", downloadIcon: '', downloadClass: "btn btn-sm btn-kv btn-default btn-outline-secondary", downloadTitle: "Download file", zoomIcon: '', zoomClass: "btn btn-sm btn-kv btn-default btn-outline-secondary", zoomTitle: "View Details", dragIcon: '', dragClass: "text-info", dragTitle: "Move / Rearrange", dragSettings: {}, indicatorNew: '', indicatorSuccess: '', indicatorError: '', indicatorLoading: '', indicatorNewTitle: "Not uploaded yet", indicatorSuccessTitle: "Uploaded", indicatorErrorTitle: "Upload Error", indicatorLoadingTitle: "Uploading ..." } }, e.each(h.defaults, function (t, i) { "allowedPreviewTypes" !== t ? h[t] = e.extend(!0, {}, i, h[t]) : void 0 === h.allowedPreviewTypes && (h.allowedPreviewTypes = i) }), h._initPreviewTemplates() }, _initPreviewTemplates: function () { var i, a = this, r = a.previewMarkupTags, n = r.tagAfter; e.each(a.previewContentTemplates, function (e, s) { t.isEmpty(a.previewTemplates[e]) && (i = r.tagBefore2, "generic" !== e && "image" !== e && "html" !== e && "text" !== e || (i = r.tagBefore1), a._isPdfRendered() && "pdf" === e && (i = i.replace("kv-file-content", "kv-file-content kv-pdf-rendered")), a.previewTemplates[e] = i + s + n) }) }, _initPreviewCache: function () { var i = this; i.previewCache = { data: {}, init: function () { var e = i.initialPreview; e.length > 0 && !t.isArray(e) && (e = e.split(i.initialPreviewDelimiter)), i.previewCache.data = { content: e, config: i.initialPreviewConfig, tags: i.initialPreviewThumbTags } }, count: function () { return i.previewCache.data && i.previewCache.data.content ? i.previewCache.data.content.length : 0 }, get: function (a, r) { var n, s, o, l, d, c, h, p = "init_" + a, u = i.previewCache.data, f = u.config[a], m = u.content[a], g = i.previewInitId + "-" + p, v = t.ifSet("previewAsData", f, i.initialPreviewAsData), w = function (e, a, r, n, s, o, l, d, c) { return d = " file-preview-initial " + t.SORT_CSS + (d ? " " + d : ""), i._generatePreviewTemplate(e, a, r, n, s, !1, null, d, o, l, c) }; return m ? (r = void 0 === r || r, o = t.ifSet("type", f, i.initialPreviewFileType || "generic"), d = t.ifSet("filename", f, t.ifSet("caption", f)), c = t.ifSet("filetype", f, o), l = i.previewCache.footer(a, r, f && f.size || null), h = t.ifSet("frameClass", f), n = v ? w(o, m, d, c, g, l, p, h) : w("generic", m, d, c, g, l, p, h, o).setTokens({content: u.content[a]}), u.tags.length && u.tags[a] && (n = t.replaceTags(n, u.tags[a])), t.isEmpty(f) || t.isEmpty(f.frameAttr) || ((s = e(document.createElement("div")).html(n)).find(".file-preview-initial").attr(f.frameAttr), n = s.html(), s.remove()), n) : "" }, add: function (e, a, r, n) { var s, o = i.previewCache.data; return t.isArray(e) || (e = e.split(i.initialPreviewDelimiter)), n ? (s = o.content.push(e) - 1, o.config[s] = a, o.tags[s] = r) : (s = e.length - 1, o.content = e, o.config = a, o.tags = r), i.previewCache.data = o, s }, set: function (e, a, r, n) { var s, o = i.previewCache.data; if (e && e.length && (t.isArray(e) || (e = e.split(i.initialPreviewDelimiter)), e.filter(function (e) { return null !== e }).length)) { if (void 0 === o.content && (o.content = []), void 0 === o.config && (o.config = []), void 0 === o.tags && (o.tags = []), n) { for (s = 0; s < e.length; s++) e[s] && o.content.push(e[s]); for (s = 0; s < a.length; s++) a[s] && o.config.push(a[s]); for (s = 0; s < r.length; s++) r[s] && o.tags.push(r[s]) } else o.content = e, o.config = a, o.tags = r; i.previewCache.data = o } }, unset: function (e) { var a = i.previewCache.count(), r = i.reversePreviewOrder; if (a) { if (1 === a) return i.previewCache.data.content = [], i.previewCache.data.config = [], i.previewCache.data.tags = [], i.initialPreview = [], i.initialPreviewConfig = [], void (i.initialPreviewThumbTags = []); i.previewCache.data.content = t.spliceArray(i.previewCache.data.content, e, r), i.previewCache.data.config = t.spliceArray(i.previewCache.data.config, e, r), i.previewCache.data.tags = t.spliceArray(i.previewCache.data.tags, e, r) } }, out: function () { var e, t, a = "", r = i.previewCache.count(); if (0 === r) return {content: "", caption: ""}; for (e = 0; e < r; e++) t = i.previewCache.get(e), a = i.reversePreviewOrder ? t + a : a + t; return {content: a, caption: i._getMsgSelected(r)} }, footer: function (e, a, r) { var n = i.previewCache.data || {}; if (t.isEmpty(n.content)) return ""; (t.isEmpty(n.config) || t.isEmpty(n.config[e])) && (n.config[e] = {}), a = void 0 === a || a; var s, o = n.config[e], l = t.ifSet("caption", o), d = t.ifSet("width", o, "auto"), c = t.ifSet("url", o, !1), h = t.ifSet("key", o, null), p = i.fileActionSettings, u = i.initialPreviewShowDelete || !1, f = o.downloadUrl || i.initialPreviewDownloadUrl || "", m = o.filename || o.caption || "", g = !!f, v = t.ifSet("showRemove", o, t.ifSet("showRemove", p, u)), w = t.ifSet("showDownload", o, t.ifSet("showDownload", p, g)), _ = t.ifSet("showZoom", o, t.ifSet("showZoom", p, !0)), b = t.ifSet("showDrag", o, t.ifSet("showDrag", p, !0)), C = !1 === c && a; return w = w && !1 !== o.downloadUrl && !!f, s = i._renderFileActions(!1, w, v, _, b, C, c, h, !0, f, m), i._getLayoutTemplate("footer").setTokens({ progress: i._renderThumbProgress(), actions: s, caption: l, size: i._getSize(r), width: d, indicator: "" }) } }, i.previewCache.init() }, _isPdfRendered: function () { var e = this.usePdfRenderer; return ("function" == typeof e ? e() : !!e) && this.pdfRendererUrl }, _handler: function (e, t, i) { var a = this.namespace, r = t.split(" ").join(a + " ") + a; e && e.length && e.off(r).on(r, i) }, _log: function (e) { var t = this.$element.attr("id"); t && (e = '"' + t + '": ' + e), e = "bootstrap-fileinput: " + e, void 0 !== window.console.log ? window.console.log(e) : window.alert(e) }, _validate: function () { var e = "file" === this.$element.attr("type"); return e || this._log('The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.'), e }, _errorsExist: function () { var t; return !!this.$errorContainer.find("li").length || ((t = e(document.createElement("div")).html(this.$errorContainer.html())).find(".kv-error-close").remove(), t.find("ul").remove(), !!e.trim(t.text()).length) }, _errorHandler: function (e, t) { var i = this, a = e.target.error, r = function (e) { i._showError(e.replace("{name}", t)) }; a.code === a.NOT_FOUND_ERR ? r(i.msgFileNotFound) : a.code === a.SECURITY_ERR ? r(i.msgFileSecured) : a.code === a.NOT_READABLE_ERR ? r(i.msgFileNotReadable) : a.code === a.ABORT_ERR ? r(i.msgFilePreviewAborted) : r(i.msgFilePreviewError) }, _addError: function (e) { var t = this, i = t.$errorContainer; e && i.length && (i.html(t.errorCloseButton + e), t._handler(i.find(".kv-error-close"), "click", function () { setTimeout(function () { t.showPreview && !t.getFrames().length && t.clear(), i.fadeOut("slow") }, 10) })) }, _setValidationError: function (e) { e = (e ? e + " " : "") + "has-error", this.$container.removeClass(e).addClass("has-error"), t.addCss(this.$captionContainer, "is-invalid") }, _resetErrors: function (e) { var t = this.$errorContainer; this.isError = !1, this.$container.removeClass("has-error"), this.$captionContainer.removeClass("is-invalid"), t.html(""), e ? t.fadeOut("slow") : t.hide() }, _showFolderError: function (e) { var t, i = this.$errorContainer; e && (this.isAjaxUpload || this._clearFileInput(), t = this.msgFoldersNotAllowed.replace("{n}", e), this._addError(t), this._setValidationError(), i.fadeIn(800), this._raise("filefoldererror", [e, t])) }, _showUploadError: function (e, t, i) { var a = this.$errorContainer, r = i || "fileuploaderror", n = t && t.id ? '
  • ' + e + "
  • " : "
  • " + e + "
  • "; return 0 === a.find("ul").length ? this._addError("
      " + n + "
    ") : a.find("ul").append(n), a.fadeIn(800), this._raise(r, [t, e]), this._setValidationError("file-input-new"), !0 }, _showError: function (e, t, i) { var a = this.$errorContainer, r = i || "fileerror"; return (t = t || {}).reader = this.reader, this._addError(e), a.fadeIn(800), this._raise(r, [t, e]), this.isAjaxUpload || this._clearFileInput(), this._setValidationError("file-input-new"), this.$btnUpload.attr("disabled", !0), !0 }, _noFilesError: function (e) { var t = this.minFileCount > 1 ? this.filePlural : this.fileSingle, i = this.msgFilesTooLess.replace("{n}", this.minFileCount).replace("{files}", t), a = this.$errorContainer; this._addError(i), this.isError = !0, this._updateFileDetails(0), a.fadeIn(800), this._raise("fileerror", [e, i]), this._clearFileInput(), this._setValidationError() }, _parseError: function (t, i, a, r) { var n, s = e.trim(a + ""), o = void 0 !== i.responseJSON && void 0 !== i.responseJSON.error ? i.responseJSON.error : i.responseText; return this.cancelling && this.msgUploadAborted && (s = this.msgUploadAborted), this.showAjaxErrorDetails && o && (n = (o = e.trim(o.replace(/\n\s*\n/g, "\n"))).length ? "
    " + o + "
    " : "", s += s ? n : o), s || (s = this.msgAjaxError.replace("{operation}", t)), this.cancelling = !1, r ? "" + r + ": " + s : s }, _parseFileType: function (e, i) { var a, r, n, s = this.allowedPreviewTypes || []; if ("application/text-plain" === e) return "text"; for (n = 0; n < s.length; n++) if (r = s[n], a = (0, this.fileTypeSettings[r])(e, i) ? r : "", !t.isEmpty(a)) return a; return "other" }, _getPreviewIcon: function (t) { var i, a = this, r = null; return t && t.indexOf(".") > -1 && (i = t.split(".").pop(), a.previewFileIconSettings && (r = a.previewFileIconSettings[i] || a.previewFileIconSettings[i.toLowerCase()] || null), a.previewFileExtSettings && e.each(a.previewFileExtSettings, function (e, t) { a.previewFileIconSettings[e] && t(i) && (r = a.previewFileIconSettings[e]) })), r }, _parseFilePreviewIcon: function (e, t) { var i = this._getPreviewIcon(t) || this.previewFileIcon, a = e; return a.indexOf("{previewFileIcon}") > -1 && (a = a.setTokens({ previewFileIconClass: this.previewFileIconClass, previewFileIcon: i })), a }, _raise: function (t, i) { var a = e.Event(t); if (void 0 !== i ? this.$element.trigger(a, i) : this.$element.trigger(a), a.isDefaultPrevented() || !1 === a.result) return !1; switch (t) { case"filebatchuploadcomplete": case"filebatchuploadsuccess": case"fileuploaded": case"fileclear": case"filecleared": case"filereset": case"fileerror": case"filefoldererror": case"fileuploaderror": case"filebatchuploaderror": case"filedeleteerror": case"filecustomerror": case"filesuccessremove": break; default: this.ajaxAborted || (this.ajaxAborted = a.result) } return !0 }, _listenFullScreen: function (e) { var t, i, a = this.$modal; a && a.length && (t = a && a.find(".btn-fullscreen"), i = a && a.find(".btn-borderless"), t.length && i.length && (t.removeClass("active").attr("aria-pressed", "false"), i.removeClass("active").attr("aria-pressed", "false"), e ? t.addClass("active").attr("aria-pressed", "true") : i.addClass("active").attr("aria-pressed", "true"), a.hasClass("file-zoom-fullscreen") ? this._maximizeZoomDialog() : e ? this._maximizeZoomDialog() : i.removeClass("active").attr("aria-pressed", "false"))) }, _listen: function () { var i = this, a = i.$element, r = i.$form, n = i.$container; i._handler(a, "click", function (e) { a.hasClass("file-no-browse") && (a.data("zoneClicked") ? a.data("zoneClicked", !1) : e.preventDefault()) }), i._handler(a, "change", e.proxy(i._change, i)), i.showBrowse && i._handler(i.$btnFile, "click", e.proxy(i._browse, i)), i._handler(n.find(".fileinput-remove:not([disabled])"), "click", e.proxy(i.clear, i)), i._handler(n.find(".fileinput-cancel"), "click", e.proxy(i.cancel, i)), i._initDragDrop(), i._handler(r, "reset", e.proxy(i.clear, i)), i.isAjaxUpload || i._handler(r, "submit", e.proxy(i._submitForm, i)), i._handler(i.$container.find(".fileinput-upload"), "click", e.proxy(i._uploadClick, i)), i._handler(e(window), "resize", function () { i._listenFullScreen(screen.width === window.innerWidth && screen.height === window.innerHeight) }), i._handler(e(document), "webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange", function () { i._listenFullScreen(t.checkFullScreen()) }), i._autoFitContent(), i._initClickable(), i._refreshPreview() }, _autoFitContent: function () { var t, i = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, a = this, r = i < 400 ? a.previewSettingsSmall || a.defaults.previewSettingsSmall : a.previewSettings || a.defaults.previewSettings; e.each(r, function (e, i) { t = ".file-preview-frame .file-preview-" + e, a.$preview.find(t + ".kv-preview-data," + t + " .kv-preview-data").css(i) }) }, _scanDroppedItems: function (e, t, i) { i = i || ""; var a, r, n, s = this, o = function (e) { s._log("Error scanning dropped files!"), s._log(e) }; e.isFile ? e.file(function (e) { t.push(e) }, o) : e.isDirectory && (r = e.createReader(), (n = function () { r.readEntries(function (r) { if (r && r.length > 0) { for (a = 0; a < r.length; a++) s._scanDroppedItems(r[a], t, i + e.name + "/"); n() } return null }, o) })()) }, _initDragDrop: function () { var t = this.$dropZone; this.dropZoneEnabled && this.showPreview && (this._handler(t, "dragenter dragover", e.proxy(this._zoneDragEnter, this)), this._handler(t, "dragleave", e.proxy(this._zoneDragLeave, this)), this._handler(t, "drop", e.proxy(this._zoneDrop, this)), this._handler(e(document), "dragenter dragover drop", this._zoneDragDropInit)) }, _zoneDragDropInit: function (e) { e.stopPropagation(), e.preventDefault() }, _zoneDragEnter: function (i) { var a = e.inArray("Files", i.originalEvent.dataTransfer.types) > -1; if (this._zoneDragDropInit(i), this.isDisabled || !a) return i.originalEvent.dataTransfer.effectAllowed = "none", void (i.originalEvent.dataTransfer.dropEffect = "none"); t.addCss(this.$dropZone, "file-highlighted") }, _zoneDragLeave: function (e) { this._zoneDragDropInit(e), this.isDisabled || this.$dropZone.removeClass("file-highlighted") }, _zoneDrop: function (e) { var i, a = this, r = a.$element, n = e.originalEvent.dataTransfer, s = n.files, o = n.items, l = t.getDragDropFolders(o), d = function () { a.isAjaxUpload ? a._change(e, s) : (a.changeTriggered = !0, r.get(0).files = s, setTimeout(function () { a.changeTriggered = !1, r.trigger("change" + a.namespace) }, 10)), a.$dropZone.removeClass("file-highlighted") }; if (e.preventDefault(), !a.isDisabled && !t.isEmpty(s)) if (l > 0) { if (!a.isAjaxUpload) return void a._showFolderError(l); for (s = [], i = 0; i < o.length; i++) { var c = o[i].webkitGetAsEntry(); c && a._scanDroppedItems(c, s) } setTimeout(function () { d() }, 500) } else d() }, _uploadClick: function (e) { var i, a = this.$container.find(".fileinput-upload"), r = !a.hasClass("disabled") && t.isEmpty(a.attr("disabled")); e && e.isDefaultPrevented() || (this.isAjaxUpload ? (e.preventDefault(), r && this.upload()) : r && "submit" !== a.attr("type") && ((i = a.closest("form")).length && i.trigger("submit"), e.preventDefault())) }, _submitForm: function () { return this._isFileSelectionValid() && !this._abort({}) }, _clearPreview: function () { var i = this.$preview; (this.showUploadedThumbs ? this.getFrames(":not(.file-preview-success)") : this.getFrames()).each(function () { var a = e(this); a.remove(), t.cleanZoomCache(i.find("#zoom-" + a.attr("id"))) }), this.getFrames().length && this.showPreview || this._resetUpload(), this._validateDefaultPreview() }, _initSortable: function () { var i, a = this, r = a.$preview, n = "." + t.SORT_CSS, s = a.reversePreviewOrder; window.KvSortable && 0 !== r.find(n).length && (i = { handle: ".drag-handle-init", dataIdAttr: "data-preview-id", scroll: !1, draggable: n, onSort: function (i) { var r = i.oldIndex, n = i.newIndex, o = 0; a.initialPreview = t.moveArray(a.initialPreview, r, n, s), a.initialPreviewConfig = t.moveArray(a.initialPreviewConfig, r, n, s), a.previewCache.init(), a.getFrames(".file-preview-initial").each(function () { e(this).attr("data-fileindex", "init_" + o), o++ }), a._raise("filesorted", { previewId: e(i.item).attr("id"), oldIndex: r, newIndex: n, stack: a.initialPreviewConfig }) } }, r.data("kvsortable") && r.kvsortable("destroy"), e.extend(!0, i, a.fileActionSettings.dragSettings), r.kvsortable(i)) }, _setPreviewContent: function (e) { this.$preview.html(e), this._autoFitContent() }, _initPreview: function (e) { var i, a = this.initialCaption || ""; if (!this.previewCache.count()) return this._clearPreview(), void (e ? this._setCaption(a) : this._initCaption()); i = this.previewCache.out(), a = e && this.initialCaption ? this.initialCaption : i.caption, this._setPreviewContent(i.content), this._setInitThumbAttr(), this._setCaption(a), this._initSortable(), t.isEmpty(i.content) || this.$container.removeClass("file-input-new") }, _getZoomButton: function (e) { var t = this.previewZoomButtonIcons[e], i = this.previewZoomButtonClasses[e], a = ' title="' + (this.previewZoomButtonTitles[e] || "") + '" ' + ("close" === e ? ' data-dismiss="modal" aria-hidden="true"' : ""); return "fullscreen" !== e && "borderless" !== e && "toggleheader" !== e || (a += ' data-toggle="button" aria-pressed="false" autocomplete="off"'), '" }, _getModalContent: function () { return this._getLayoutTemplate("modal").setTokens({ rtl: this.rtl ? " kv-rtl" : "", zoomFrameClass: this.frameClass, heading: this.msgZoomModalHeading, prev: this._getZoomButton("prev"), next: this._getZoomButton("next"), toggleheader: this._getZoomButton("toggleheader"), fullscreen: this._getZoomButton("fullscreen"), borderless: this._getZoomButton("borderless"), close: this._getZoomButton("close") }) }, _listenModalEvent: function (e) { var i = this, a = i.$modal; a.on(e + ".bs.modal", function (r) { var n = a.find(".btn-fullscreen"), s = a.find(".btn-borderless"); i._raise("filezoom" + e, function (e) { return {sourceEvent: e, previewId: a.data("previewId"), modal: a} }(r)), "shown" === e && (s.removeClass("active").attr("aria-pressed", "false"), n.removeClass("active").attr("aria-pressed", "false"), a.hasClass("file-zoom-fullscreen") && (i._maximizeZoomDialog(), t.checkFullScreen() ? n.addClass("active").attr("aria-pressed", "true") : s.addClass("active").attr("aria-pressed", "true"))) }) }, _initZoom: function () { var i, a = this, r = a._getLayoutTemplate("modalMain"), n = "#" + t.MODAL_ID; a.showPreview && (a.$modal = e(n), a.$modal && a.$modal.length || (i = e(document.createElement("div")).html(r).insertAfter(a.$container), a.$modal = e(n).insertBefore(i), i.remove()), t.initModal(a.$modal), a.$modal.html(a._getModalContent()), e.each(t.MODAL_EVENTS, function (e, t) { a._listenModalEvent(t) })) }, _initZoomButtons: function () { var t, i, a = this.$modal.data("previewId") || "", r = this.getFrames().toArray(), n = r.length, s = this.$modal.find(".btn-prev"), o = this.$modal.find(".btn-next"); if (r.length < 2) return s.hide(), void o.hide(); s.show(), o.show(), n && (t = e(r[0]), i = e(r[n - 1]), s.removeAttr("disabled"), o.removeAttr("disabled"), t.length && t.attr("id") === a && s.attr("disabled", !0), i.length && i.attr("id") === a && o.attr("disabled", !0)) }, _maximizeZoomDialog: function () { var t = this.$modal, i = t.find(".modal-header:visible"), a = t.find(".modal-footer:visible"), r = t.find(".modal-body"), n = e(window).height(); t.addClass("file-zoom-fullscreen"), i && i.length && (n -= i.outerHeight(!0)), a && a.length && (n -= a.outerHeight(!0)), r && r.length && (n -= r.outerHeight(!0) - r.height()), t.find(".kv-zoom-body").height(n) }, _resizeZoomDialog: function (e) { var i = this.$modal, a = i.find(".btn-fullscreen"), r = i.find(".btn-borderless"); if (i.hasClass("file-zoom-fullscreen")) t.toggleFullScreen(!1), e ? a.hasClass("active") || (i.removeClass("file-zoom-fullscreen"), this._resizeZoomDialog(!0), r.hasClass("active") && r.removeClass("active").attr("aria-pressed", "false")) : a.hasClass("active") ? a.removeClass("active").attr("aria-pressed", "false") : (i.removeClass("file-zoom-fullscreen"), this.$modal.find(".kv-zoom-body").css("height", this.zoomModalHeight)); else { if (!e) return void this._maximizeZoomDialog(); t.toggleFullScreen(!0) } i.focus() }, _setZoomContent: function (i, a) { var r, n, s, o, l, d, c, h, p = this, u = i.attr("id"), f = p.$modal, m = f.find(".btn-prev"), g = f.find(".btn-next"), v = f.find(".btn-fullscreen"), w = f.find(".btn-borderless"), _ = f.find(".btn-toggleheader"), b = p.$preview.find("#zoom-" + u); n = b.attr("data-template") || "generic", s = (r = b.find(".kv-file-content")).length ? r.html() : "", o = (i.data("caption") || "") + " " + (i.data("size") || ""), f.find(".kv-zoom-title").attr("title", e("
    ").html(o).text()).html(o), l = f.find(".kv-zoom-body"), f.removeClass("kv-single-content"), a ? (h = l.addClass("file-thumb-loading").clone().insertAfter(l), l.html(s).hide(), h.fadeOut("fast", function () { l.fadeIn("fast", function () { l.removeClass("file-thumb-loading") }), h.remove() })) : l.html(s), (c = p.previewZoomSettings[n]) && (d = l.find(".kv-preview-data"), t.addCss(d, "file-zoom-detail"), e.each(c, function (e, t) { d.css(e, t), (d.attr("width") && "width" === e || d.attr("height") && "height" === e) && d.removeAttr(e) })), f.data("previewId", u), p._handler(m, "click", function () { p._zoomSlideShow("prev", u) }), p._handler(g, "click", function () { p._zoomSlideShow("next", u) }), p._handler(v, "click", function () { p._resizeZoomDialog(!0) }), p._handler(w, "click", function () { p._resizeZoomDialog(!1) }), p._handler(_, "click", function () { var e, t = f.find(".modal-header"), i = f.find(".modal-body .floating-buttons"), a = t.find(".kv-zoom-actions"), r = function (e) { var i = p.$modal.find(".kv-zoom-body"), a = p.zoomModalHeight; f.hasClass("file-zoom-fullscreen") && (a = i.outerHeight(!0), e || (a -= t.outerHeight(!0))), i.css("height", e ? a + e : a) }; t.is(":visible") ? (e = t.outerHeight(!0), t.slideUp("slow", function () { a.find(".btn").appendTo(i), r(e) })) : (i.find(".btn").appendTo(a), t.slideDown("slow", function () { r() })), f.focus() }), p._handler(f, "keydown", function (e) { var t = e.which || e.keyCode; 37 !== t || m.attr("disabled") || p._zoomSlideShow("prev", u), 39 !== t || g.attr("disabled") || p._zoomSlideShow("next", u) }) }, _zoomPreview: function (e) { var i, a = this.$modal; if (!e.length) throw"Cannot zoom to detailed preview!"; t.initModal(a), a.html(this._getModalContent()), i = e.closest(t.FRAMES), this._setZoomContent(i), a.modal("show"), this._initZoomButtons() }, _zoomSlideShow: function (t, i) { var a, r, n, s = this.$modal.find(".kv-zoom-actions .btn-" + t), o = this.getFrames().toArray(), l = o.length; if (!s.attr("disabled")) { for (r = 0; r < l; r++) if (e(o[r]).attr("id") === i) { n = "prev" === t ? r - 1 : r + 1; break } n < 0 || n >= l || !o[n] || ((a = e(o[n])).length && this._setZoomContent(a, !0), this._initZoomButtons(), this._raise("filezoom" + t, { previewId: i, modal: this.$modal })) } }, _initZoomButton: function () { var t = this; t.$preview.find(".kv-file-zoom").each(function () { var i = e(this); t._handler(i, "click", function () { t._zoomPreview(i) }) }) }, _inputFileCount: function () { return this.$element.get(0).files.length }, _refreshPreview: function () { var e; this._inputFileCount() && this.showPreview && this.isPreviewable && (this.isAjaxUpload ? (e = this.getFileStack(), this.filestack = [], e.length ? this._clearFileInput() : e = this.$element.get(0).files) : e = this.$element.get(0).files, e && e.length && (this.readFiles(e), this._setFileDropZoneTitle())) }, _clearObjects: function (t) { t.find("video audio").each(function () { this.pause(), e(this).remove() }), t.find("img object div").each(function () { e(this).remove() }) }, _clearFileInput: function () { var t, i, a, r = this.$element; this._inputFileCount() && (t = r.closest("form"), i = e(document.createElement("form")), a = e(document.createElement("div")), r.before(a), t.length ? t.after(i) : a.after(i), i.append(r).trigger("reset"), a.before(r).remove(), i.remove()) }, _resetUpload: function () { this.uploadCache = { content: [], config: [], tags: [], append: !0 }, this.uploadCount = 0, this.uploadStatus = {}, this.uploadLog = [], this.uploadAsyncCount = 0, this.loadedImages = [], this.totalImagesCount = 0, this.$btnUpload.removeAttr("disabled"), this._setProgress(0), this.$progress.hide(), this._resetErrors(!1), this.ajaxAborted = !1, this.ajaxRequests = [], this._resetCanvas(), this.cacheInitialPreview = {}, this.overwriteInitial && (this.initialPreview = [], this.initialPreviewConfig = [], this.initialPreviewThumbTags = [], this.previewCache.data = { content: [], config: [], tags: [] }) }, _resetCanvas: function () { this.canvas && this.imageCanvasContext && this.imageCanvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height) }, _hasInitialPreview: function () { return !this.overwriteInitial && this.previewCache.count() }, _resetPreview: function () { var e, t; this.previewCache.count() ? (e = this.previewCache.out(), this._setPreviewContent(e.content), this._setInitThumbAttr(), t = this.initialCaption ? this.initialCaption : e.caption, this._setCaption(t)) : (this._clearPreview(), this._initCaption()), this.showPreview && (this._initZoom(), this._initSortable()) }, _clearDefaultPreview: function () { this.$preview.find(".file-default-preview").remove() }, _validateDefaultPreview: function () { this.showPreview && !t.isEmpty(this.defaultPreviewContent) && (this._setPreviewContent('
    ' + this.defaultPreviewContent + "
    "), this.$container.removeClass("file-input-new"), this._initClickable()) }, _resetPreviewThumbs: function (e) { var t; if (e) return this._clearPreview(), void this.clearStack(); this._hasInitialPreview() ? (t = this.previewCache.out(), this._setPreviewContent(t.content), this._setInitThumbAttr(), this._setCaption(t.caption), this._initPreviewActions()) : this._clearPreview() }, _getLayoutTemplate: function (e) { var i = this.layoutTemplates[e]; return t.isEmpty(this.customLayoutTags) ? i : t.replaceTags(i, this.customLayoutTags) }, _getPreviewTemplate: function (e) { var i = this.previewTemplates[e]; return t.isEmpty(this.customPreviewTags) ? i : t.replaceTags(i, this.customPreviewTags) }, _getOutData: function (e, t, i) { return e = e || {}, t = t || {}, i = i || this.filestack.slice(0) || {}, { form: this.formdata, files: i, filenames: this.filenames, filescount: this.getFilesCount(), extra: this._getExtraData(), response: t, reader: this.reader, jqXHR: e } }, _getMsgSelected: function (e) { var t = 1 === e ? this.fileSingle : this.filePlural; return e > 0 ? this.msgSelected.replace("{n}", e).replace("{files}", t) : this.msgNoFilesSelected }, _getFrame: function (t) { var i = e("#" + t); return i.length ? i : (this._log('Invalid thumb frame with id: "' + t + '".'), null) }, _getThumbs: function (e) { return e = e || "", this.getFrames(":not(.file-preview-initial)" + e) }, _getExtraData: function (e, t) { var i = this.uploadExtraData; return "function" == typeof this.uploadExtraData && (i = this.uploadExtraData(e, t)), i }, _initXhr: function (e, t, i) { var a = this; return e.upload && e.upload.addEventListener("progress", function (e) { var r = 0, n = e.total, s = e.loaded || e.position; e.lengthComputable && (r = Math.floor(s / n * 100)), t ? a._setAsyncUploadStatus(t, r, i) : a._setProgress(r) }, !1), e }, _initAjaxSettings: function () { this._ajaxSettings = e.extend(!0, {}, this.ajaxSettings), this._ajaxDeleteSettings = e.extend(!0, {}, this.ajaxDeleteSettings) }, _mergeAjaxCallback: function (e, t, i) { var a, r = this._ajaxSettings, n = this.mergeAjaxCallbacks; "delete" === i && (r = this._ajaxDeleteSettings, n = this.mergeAjaxDeleteCallbacks), a = r[e], r[e] = n && "function" == typeof a ? "before" === n ? function () { a.apply(this, arguments), t.apply(this, arguments) } : function () { t.apply(this, arguments), a.apply(this, arguments) } : t }, _ajaxSubmit: function (t, i, a, r, n, s) { var o, l = this; l._raise("filepreajax", [n, s]) && (l._uploadExtra(n, s), l._initAjaxSettings(), l._mergeAjaxCallback("beforeSend", t), l._mergeAjaxCallback("success", i), l._mergeAjaxCallback("complete", a), l._mergeAjaxCallback("error", r), o = e.extend(!0, {}, { xhr: function () { var t = e.ajaxSettings.xhr(); return l._initXhr(t, n, l.getFileStack().length) }, url: s && l.uploadUrlThumb ? l.uploadUrlThumb : l.uploadUrl, type: "POST", dataType: "json", data: l.formdata, cache: !1, processData: !1, contentType: !1 }, l._ajaxSettings), l.ajaxRequests.push(e.ajax(o))) }, _mergeArray: function (e, i) { var a = t.cleanArray(this[e]), r = t.cleanArray(i); this[e] = a.concat(r) }, _initUploadSuccess: function (i, a, r) { var n, s, o, l, d, c, h, p, u, f = this; f.showPreview && "object" == typeof i && !e.isEmptyObject(i) && void 0 !== i.initialPreview && i.initialPreview.length > 0 && (f.hasInitData = !0, c = i.initialPreview || [], h = i.initialPreviewConfig || [], p = i.initialPreviewThumbTags || [], n = void 0 === i.append || i.append, c.length > 0 && !t.isArray(c) && (c = c.split(f.initialPreviewDelimiter)), f._mergeArray("initialPreview", c), f._mergeArray("initialPreviewConfig", h), f._mergeArray("initialPreviewThumbTags", p), void 0 !== a ? r ? (u = a.attr("data-fileindex"), f.uploadCache.content[u] = c[0], f.uploadCache.config[u] = h[0] || [], f.uploadCache.tags[u] = p[0] || [], f.uploadCache.append = n) : (o = f.previewCache.add(c, h[0], p[0], n), s = f.previewCache.get(o, !1), (d = (l = e(document.createElement("div")).html(s).hide().insertAfter(a)).find(".kv-zoom-cache")) && d.length && d.insertAfter(a), a.fadeOut("slow", function () { var e = l.find(".file-preview-frame"); e && e.length && e.insertBefore(a).fadeIn("slow").css("display:inline-block"), f._initPreviewActions(), f._clearFileInput(), t.cleanZoomCache(f.$preview.find("#zoom-" + a.attr("id"))), a.remove(), l.remove(), f._initSortable() })) : (f.previewCache.set(c, h, p, n), f._initPreview(), f._initPreviewActions())) }, _initSuccessThumbs: function () { var i = this; i.showPreview && i._getThumbs(t.FRAMES + ".file-preview-success").each(function () { var a = e(this), r = i.$preview, n = a.find(".kv-file-remove"); n.removeAttr("disabled"), i._handler(n, "click", function () { var e = a.attr("id"), n = i._raise("filesuccessremove", [e, a.attr("data-fileindex")]); t.cleanMemory(a), !1 !== n && a.fadeOut("slow", function () { t.cleanZoomCache(r.find("#zoom-" + e)), a.remove(), i.getFrames().length || i.reset() }) }) }) }, _checkAsyncComplete: function () { var t, i; for (i = 0; i < this.filestack.length; i++) if (this.filestack[i] && (t = this.previewInitId + "-" + i, -1 === e.inArray(t, this.uploadLog))) return !1; return this.uploadAsyncCount === this.uploadLog.length }, _uploadExtra: function (t, i) { var a = this, r = a._getExtraData(t, i); 0 !== r.length && e.each(r, function (e, t) { a.formdata.append(e, t) }) }, _uploadSingle: function (i, a) { var r, n, s, o, l, d, c, h, p, u, f, m = this, g = m.getFileStack().length, v = new FormData, w = m.previewInitId + "-" + i, _ = m.filestack.length > 0 || !e.isEmptyObject(m.uploadExtraData), b = e("#" + w).find(".file-thumb-progress"), C = {id: w, index: i}; m.formdata = v, m.showPreview && (n = e("#" + w + ":not(.file-preview-initial)"), o = n.find(".kv-file-upload"), l = n.find(".kv-file-remove"), b.show()), 0 === g || !_ || o && o.hasClass("disabled") || m._abort(C) || (f = function (e, t) { d || m.updateStack(e, void 0), m.uploadLog.push(t), m._checkAsyncComplete() && (m.fileBatchCompleted = !0) }, s = function () { var e, i, a, r = m.uploadCache, n = 0, s = m.cacheInitialPreview; m.fileBatchCompleted && (s && s.content && (n = s.content.length), setTimeout(function () { var o = 0 === m.getFileStack(!0).length; if (m.showPreview) { if (m.previewCache.set(r.content, r.config, r.tags, r.append), n) { for (i = 0; i < r.content.length; i++) a = i + n, s.content[a] = r.content[i], s.config.length && (s.config[a] = r.config[i]), s.tags.length && (s.tags[a] = r.tags[i]); m.initialPreview = t.cleanArray(s.content), m.initialPreviewConfig = t.cleanArray(s.config), m.initialPreviewThumbTags = t.cleanArray(s.tags) } else m.initialPreview = r.content, m.initialPreviewConfig = r.config, m.initialPreviewThumbTags = r.tags; m.cacheInitialPreview = {}, m.hasInitData && (m._initPreview(), m._initPreviewActions()) } m.unlock(o), o && m._clearFileInput(), e = m.$preview.find(".file-preview-initial"), m.uploadAsync && e.length && (t.addCss(e, t.SORT_CSS), m._initSortable()), m._raise("filebatchuploadcomplete", [m.filestack, m._getExtraData()]), m.uploadCount = 0, m.uploadStatus = {}, m.uploadLog = [], m._setProgress(101), m.ajaxAborted = !1 }, 100)) }, c = function (s) { r = m._getOutData(s), m.fileBatchCompleted = !1, a || (m.ajaxAborted = !1), m.showPreview && (n.hasClass("file-preview-success") || (m._setThumbStatus(n, "Loading"), t.addCss(n, "file-uploading")), o.attr("disabled", !0), l.attr("disabled", !0)), a || m.lock(), m._raise("filepreupload", [r, w, i]), e.extend(!0, C, r), m._abort(C) && (s.abort(), a || (m._setThumbStatus(n, "New"), n.removeClass("file-uploading"), o.removeAttr("disabled"), l.removeAttr("disabled"), m.unlock()), m._setProgressCancelled()) }, h = function (s, l, c) { var h = m.showPreview && n.attr("id") ? n.attr("id") : w; r = m._getOutData(c, s), e.extend(!0, C, r), setTimeout(function () { t.isEmpty(s) || t.isEmpty(s.error) ? (m.showPreview && (m._setThumbStatus(n, "Success"), o.hide(), m._initUploadSuccess(s, n, a), m._setProgress(101, b)), m._raise("fileuploaded", [r, h, i]), a ? f(i, h) : m.updateStack(i, void 0)) : (d = !0, m._showUploadError(s.error, C), m._setPreviewError(n, i, m.filestack[i], m.retryErrorUploads), m.retryErrorUploads || o.hide(), a && f(i, h), m._setProgress(101, e("#" + h).find(".file-thumb-progress"), m.msgUploadError)) }, 100) }, p = function () { setTimeout(function () { m.showPreview && (o.removeAttr("disabled"), l.removeAttr("disabled"), n.removeClass("file-uploading")), a ? s() : (m.unlock(!1), m._clearFileInput()), m._initSuccessThumbs() }, 100) }, u = function (t, r, s) { var l = m.ajaxOperations.uploadThumb, c = m._parseError(l, t, s, a && m.filestack[i].name ? m.filestack[i].name : null); d = !0, setTimeout(function () { a && f(i, w), m.uploadStatus[w] = 100, m._setPreviewError(n, i, m.filestack[i], m.retryErrorUploads), m.retryErrorUploads || o.hide(), e.extend(!0, C, m._getOutData(t)), m._setProgress(101, b, m.msgAjaxProgressError.replace("{operation}", l)), m._setProgress(101, e("#" + w).find(".file-thumb-progress"), m.msgUploadError), m._showUploadError(c, C) }, 100) }, v.append(m.uploadFileAttr, m.filestack[i], m.filenames[i]), v.append("file_id", i), m._ajaxSubmit(c, h, p, u, w, i)) }, _uploadBatch: function () { var i, a, r, n, s, o = this, l = o.filestack, d = l.length, c = o.filestack.length > 0 || !e.isEmptyObject(o.uploadExtraData); o.formdata = new FormData, 0 !== d && c && !o._abort({}) && (s = function () { e.each(l, function (e) { o.updateStack(e, void 0) }), o._clearFileInput() }, i = function (i) { o.lock(); var a = o._getOutData(i); o.ajaxAborted = !1, o.showPreview && o._getThumbs().each(function () { var i = e(this), a = i.find(".kv-file-upload"), r = i.find(".kv-file-remove"); i.hasClass("file-preview-success") || (o._setThumbStatus(i, "Loading"), t.addCss(i, "file-uploading")), a.attr("disabled", !0), r.attr("disabled", !0) }), o._raise("filebatchpreupload", [a]), o._abort(a) && (i.abort(), o._getThumbs().each(function () { var t = e(this), i = t.find(".kv-file-upload"), a = t.find(".kv-file-remove"); t.hasClass("file-preview-loading") && (o._setThumbStatus(t, "New"), t.removeClass("file-uploading")), i.removeAttr("disabled"), a.removeAttr("disabled") }), o._setProgressCancelled()) }, a = function (i, a, r) { var n = o._getOutData(r, i), l = 0, d = o._getThumbs(":not(.file-preview-success)"), c = t.isEmpty(i) || t.isEmpty(i.errorkeys) ? [] : i.errorkeys; t.isEmpty(i) || t.isEmpty(i.error) ? (o._raise("filebatchuploadsuccess", [n]), s(), o.showPreview ? (d.each(function () { var t = e(this); o._setThumbStatus(t, "Success"), t.removeClass("file-uploading"), t.find(".kv-file-upload").hide().removeAttr("disabled") }), o._initUploadSuccess(i)) : o.reset(), o._setProgress(101)) : (o.showPreview && (d.each(function () { var t = e(this), i = t.attr("data-fileindex"); t.removeClass("file-uploading"), t.find(".kv-file-upload").removeAttr("disabled"), t.find(".kv-file-remove").removeAttr("disabled"), 0 === c.length || -1 !== e.inArray(l, c) ? (o._setPreviewError(t, i, o.filestack[i], o.retryErrorUploads), o.retryErrorUploads || (t.find(".kv-file-upload").hide(), o.updateStack(i, void 0))) : (t.find(".kv-file-upload").hide(), o._setThumbStatus(t, "Success"), o.updateStack(i, void 0)), t.hasClass("file-preview-error") && !o.retryErrorUploads || l++ }), o._initUploadSuccess(i)), o._showUploadError(i.error, n, "filebatchuploaderror"), o._setProgress(101, o.$progress, o.msgUploadError)) }, n = function () { o.unlock(), o._initSuccessThumbs(), o._clearFileInput(), o._raise("filebatchuploadcomplete", [o.filestack, o._getExtraData()]) }, r = function (t, i, a) { var r = o._getOutData(t), n = o.ajaxOperations.uploadBatch, s = o._parseError(n, t, a); o._showUploadError(s, r, "filebatchuploaderror"), o.uploadFileCount = d - 1, o.showPreview && (o._getThumbs().each(function () { var t = e(this), i = t.attr("data-fileindex"); t.removeClass("file-uploading"), void 0 !== o.filestack[i] && o._setPreviewError(t) }), o._getThumbs().removeClass("file-uploading"), o._getThumbs(" .kv-file-upload").removeAttr("disabled"), o._getThumbs(" .kv-file-delete").removeAttr("disabled"), o._setProgress(101, o.$progress, o.msgAjaxProgressError.replace("{operation}", n))) }, e.each(l, function (e, i) { t.isEmpty(l[e]) || o.formdata.append(o.uploadFileAttr, i, o.filenames[e]) }), o._ajaxSubmit(i, a, n, r)) }, _uploadExtraOnly: function () { var e, i, a, r, n = this, s = {}; n.formdata = new FormData, n._abort(s) || (e = function (e) { n.lock(); var t = n._getOutData(e); n._raise("filebatchpreupload", [t]), n._setProgress(50), s.data = t, s.xhr = e, n._abort(s) && (e.abort(), n._setProgressCancelled()) }, i = function (e, i, a) { var r = n._getOutData(a, e); t.isEmpty(e) || t.isEmpty(e.error) ? (n._raise("filebatchuploadsuccess", [r]), n._clearFileInput(), n._initUploadSuccess(e), n._setProgress(101)) : n._showUploadError(e.error, r, "filebatchuploaderror") }, a = function () { n.unlock(), n._clearFileInput(), n._raise("filebatchuploadcomplete", [n.filestack, n._getExtraData()]) }, r = function (e, t, i) { var a = n._getOutData(e), r = n.ajaxOperations.uploadExtra, o = n._parseError(r, e, i); s.data = a, n._showUploadError(o, a, "filebatchuploaderror"), n._setProgress(101, n.$progress, n.msgAjaxProgressError.replace("{operation}", r)) }, n._ajaxSubmit(e, i, a, r)) }, _deleteFileIndex: function (i) { var a = i.attr("data-fileindex"), r = this.reversePreviewOrder; "init_" === a.substring(0, 5) && (a = parseInt(a.replace("init_", "")), this.initialPreview = t.spliceArray(this.initialPreview, a, r), this.initialPreviewConfig = t.spliceArray(this.initialPreviewConfig, a, r), this.initialPreviewThumbTags = t.spliceArray(this.initialPreviewThumbTags, a, r), this.getFrames().each(function () { var t = e(this), i = t.attr("data-fileindex"); "init_" === i.substring(0, 5) && (i = parseInt(i.replace("init_", ""))) > a && (i--, t.attr("data-fileindex", "init_" + i)) }), this.uploadAsync && (this.cacheInitialPreview = this.getPreview())) }, _initFileActions: function () { var i = this, a = i.$preview; i.showPreview && (i._initZoomButton(), i.getFrames(" .kv-file-remove").each(function () { var r, n, s, o = e(this), l = o.closest(t.FRAMES), d = l.attr("id"), c = l.attr("data-fileindex"); i._handler(o, "click", function () { if (!1 === i._raise("filepreremove", [d, c]) || !i._validateMinCount()) return !1; r = l.hasClass("file-preview-error"), t.cleanMemory(l), l.fadeOut("slow", function () { t.cleanZoomCache(a.find("#zoom-" + d)), i.updateStack(c, void 0), i._clearObjects(l), l.remove(), d && r && i.$errorContainer.find('li[data-file-id="' + d + '"]').fadeOut("fast", function () { e(this).remove(), i._errorsExist() || i._resetErrors() }), i._clearFileInput(); var o = i.getFileStack(!0), h = i.previewCache.count(), p = o.length, u = i.showPreview && i.getFrames().length; 0 !== p || 0 !== h || u ? (s = (n = h + p) > 1 ? i._getMsgSelected(n) : o[0] ? i._getFileNames()[0] : "", i._setCaption(s)) : i.reset(), i._raise("fileremoved", [d, c]) }) }) }), i.getFrames(" .kv-file-upload").each(function () { var a = e(this); i._handler(a, "click", function () { var e = a.closest(t.FRAMES), r = e.attr("data-fileindex"); i.$progress.hide(), e.hasClass("file-preview-error") && !i.retryErrorUploads || i._uploadSingle(r, !1) }) })) }, _initPreviewActions: function () { var i = this, a = i.$preview, r = i.deleteExtraData || {}, n = t.FRAMES + " .kv-file-remove", s = i.fileActionSettings, o = s.removeClass, l = s.removeErrorClass, d = function () { var e = i.isAjaxUpload ? i.previewCache.count() : i._inputFileCount(); a.find(t.FRAMES).length || e || (i._setCaption(""), i.reset(), i.initialCaption = "") }; i._initZoomButton(), a.find(n).each(function () { var n, s, c, h = e(this), p = h.data("url") || i.deleteUrl, u = h.data("key"); if (!t.isEmpty(p) && void 0 !== u) { var f, m, g, v, w = h.closest(t.FRAMES), _ = i.previewCache.data, b = w.attr("data-fileindex"); b = parseInt(b.replace("init_", "")), g = t.isEmpty(_.config) && t.isEmpty(_.config[b]) ? null : _.config[b], "function" == typeof (v = t.isEmpty(g) || t.isEmpty(g.extra) ? r : g.extra) && (v = v()), m = { id: h.attr("id"), key: u, extra: v }, n = function (e) { i.ajaxAborted = !1, i._raise("filepredelete", [u, e, v]), i._abort() ? e.abort() : (h.removeClass(l), t.addCss(w, "file-uploading"), t.addCss(h, "disabled " + o)) }, s = function (e, r, n) { var s, c; if (!t.isEmpty(e) && !t.isEmpty(e.error)) return m.jqXHR = n, m.response = e, i._showError(e.error, m, "filedeleteerror"), w.removeClass("file-uploading"), h.removeClass("disabled " + o).addClass(l), void d(); w.removeClass("file-uploading").addClass("file-deleted"), w.fadeOut("slow", function () { b = parseInt(w.attr("data-fileindex").replace("init_", "")), i.previewCache.unset(b), i._deleteFileIndex(w), s = i.previewCache.count(), c = s > 0 ? i._getMsgSelected(s) : "", i._setCaption(c), i._raise("filedeleted", [u, n, v]), t.cleanZoomCache(a.find("#zoom-" + w.attr("id"))), i._clearObjects(w), w.remove(), d() }) }, c = function (e, t, a) { var r = i.ajaxOperations.deleteThumb, n = i._parseError(r, e, a); m.jqXHR = e, m.response = {}, i._showError(n, m, "filedeleteerror"), w.removeClass("file-uploading"), h.removeClass("disabled " + o).addClass(l), d() }, i._initAjaxSettings(), i._mergeAjaxCallback("beforeSend", n, "delete"), i._mergeAjaxCallback("success", s, "delete"), i._mergeAjaxCallback("error", c, "delete"), f = e.extend(!0, {}, { url: p, type: "POST", dataType: "json", data: e.extend(!0, {}, {key: u}, v) }, i._ajaxDeleteSettings), i._handler(h, "click", function () { if (!i._validateMinCount()) return !1; i.ajaxAborted = !1, i._raise("filebeforedelete", [u, v]), i.ajaxAborted instanceof Promise ? i.ajaxAborted.then(function (t) { t || e.ajax(f) }) : i.ajaxAborted || e.ajax(f) }) } }) }, _hideFileIcon: function () { this.overwriteInitial && this.$captionContainer.removeClass("icon-visible") }, _showFileIcon: function () { t.addCss(this.$captionContainer, "icon-visible") }, _getSize: function (t) { var i, a, r, n = parseFloat(t), s = this.fileSizeGetter; return e.isNumeric(t) && e.isNumeric(n) ? ("function" == typeof s ? r = s(n) : 0 === n ? r = "0.00 B" : (i = Math.floor(Math.log(n) / Math.log(1024)), a = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], r = 1 * (n / Math.pow(1024, i)).toFixed(2) + " " + a[i]), this._getLayoutTemplate("size").replace("{sizeText}", r)) : "" }, _generatePreviewTemplate: function (i, a, r, n, s, o, l, d, c, h, p) { var u, f = this, m = f.slug(r), g = "", v = "", w = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) < 400 ? f.previewSettingsSmall[i] || f.defaults.previewSettingsSmall[i] : f.previewSettings[i] || f.defaults.previewSettings[i], _ = c || f._renderFileFooter(m, l, "auto", o), b = f._getPreviewIcon(r), C = "type-default", y = b && f.preferIconicPreview, x = b && f.preferIconicZoomPreview; return w && e.each(w, function (e, t) { v += e + ":" + t + ";" }), u = function (a, o, l, c) { var u = l ? "zoom-" + s : s, g = f._getPreviewTemplate(a), w = (d || "") + " " + c; return f.frameClass && (w = f.frameClass + " " + w), l && (w = w.replace(" " + t.SORT_CSS, "")), g = f._parseFilePreviewIcon(g, r), "text" === a && (o = t.htmlEncode(o)), "object" !== i || n || e.each(f.defaults.fileTypeSettings, function (e, t) { "object" !== e && "other" !== e && t(r, n) && (C = "type-" + e) }), g.setTokens({ previewId: u, caption: m, frameClass: w, type: n, fileindex: h, typeCss: C, footer: _, data: o, template: p || i, style: v ? 'style="' + v + '"' : "" }) }, h = h || s.slice(s.lastIndexOf("-") + 1), f.fileActionSettings.showZoom && (g = u(x ? "other" : i, a, !0, "kv-zoom-thumb")), g = "\n" + f._getLayoutTemplate("zoomCache").replace("{zoomContent}", g), u(y ? "other" : i, a, !1, "kv-preview-thumb") + g }, _addToPreview: function (e, t) { return this.reversePreviewOrder ? e.prepend(t) : e.append(t) }, _previewDefault: function (i, a, r) { var n = this.$preview; if (this.showPreview) { var s, o = i ? i.name : "", l = i ? i.type : "", d = i.size || 0, c = this.slug(o), h = !0 === r && !this.isAjaxUpload, p = t.objUrl.createObjectURL(i); this._clearDefaultPreview(), s = this._generatePreviewTemplate("other", p, o, l, a, h, d), this._addToPreview(n, s), this._setThumbAttr(a, c, d), !0 === r && this.isAjaxUpload && this._setThumbStatus(e("#" + a), "Error") } }, _previewFile: function (e, t, i, a, r, n) { if (this.showPreview) { var s, o = t ? t.name : "", l = n.type, d = n.name, c = this._parseFileType(l, o), h = this.allowedPreviewTypes, p = this.allowedPreviewMimeTypes, u = this.$preview, f = t.size || 0, m = h && h.indexOf(c) >= 0, g = p && -1 !== p.indexOf(l), v = "text" === c || "html" === c || "image" === c ? i.target.result : r; if ("html" === c && this.purifyHtml && window.DOMPurify && (v = window.DOMPurify.sanitize(v)), m || g) { s = this._generatePreviewTemplate(c, v, o, l, a, !1, f), this._clearDefaultPreview(), this._addToPreview(u, s); var w = u.find("#" + a + " img"); this._validateImageOrientation(w, t, a, d, l, f, v) } else this._previewDefault(t, a); this._setThumbAttr(a, d, f), this._initSortable() } }, _setThumbAttr: function (t, i, a) { var r = e("#" + t); r.length && (a = a && a > 0 ? this._getSize(a) : "", r.data({caption: i, size: a})) }, _setInitThumbAttr: function () { var e, i, a, r, n = this.previewCache.data, s = this.previewCache.count(); if (0 !== s) for (var o = 0; o < s; o++) e = n.config[o], r = this.previewInitId + "-init_" + o, i = t.ifSet("caption", e, t.ifSet("filename", e)), a = t.ifSet("size", e), this._setThumbAttr(r, i, a) }, _slugDefault: function (e) { return t.isEmpty(e) ? "" : String(e).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g, "_") }, _updateFileDetails: function (e) { var i = this.$element, a = this.getFileStack(), r = t.isIE(9) && t.findFileName(i.val()) || i[0].files[0] && i[0].files[0].name || a.length && a[0].name || "", n = this.slug(r), s = this.isAjaxUpload ? a.length : e, o = this.previewCache.count() + s, l = 1 === s ? n : this._getMsgSelected(o); this.isError ? (this.$previewContainer.removeClass("file-thumb-loading"), this.$previewStatus.html(""), this.$captionContainer.removeClass("icon-visible")) : this._showFileIcon(), this._setCaption(l, this.isError), this.$container.removeClass("file-input-new file-input-ajax-new"), 1 === arguments.length && this._raise("fileselect", [e, n]), this.previewCache.count() && this._initPreviewActions() }, _setThumbStatus: function (e, t) { if (this.showPreview) { var i = "indicator" + t, a = i + "Title", r = "file-preview-" + t.toLowerCase(), n = e.find(".file-upload-indicator"), s = this.fileActionSettings; e.removeClass("file-preview-success file-preview-error file-preview-loading"), "Success" === t && e.find(".file-drag-handle").remove(), n.html(s[i]), n.attr("title", s[a]), e.addClass(r), "Error" !== t || this.retryErrorUploads || e.find(".kv-file-upload").attr("disabled", !0) } }, _setProgressCancelled: function () { this._setProgress(101, this.$progress, this.msgCancelled) }, _setProgress: function (e, i, a) { var r, n = Math.min(e, 100), s = this.progressUploadThreshold, o = e <= 100 ? this.progressTemplate : this.progressCompleteTemplate, l = n < 100 ? this.progressTemplate : a ? this.progressErrorTemplate : o; i = i || this.$progress, t.isEmpty(l) || (r = s && n > s && e <= 100 ? l.setTokens({ percent: s, status: this.msgUploadThreshold }) : l.setTokens({ percent: n, status: e > 100 ? this.msgUploadEnd : n + "%" }), i.html(r), a && i.find('[role="progressbar"]').html(a)) }, _setFileDropZoneTitle: function () { var e, i = this.$container.find(".file-drop-zone"), a = this.dropZoneTitle; this.isClickable && (e = t.isEmpty(this.$element.attr("multiple")) ? this.fileSingle : this.filePlural, a += this.dropZoneClickTitle.replace("{files}", e)), i.find("." + this.dropZoneTitleClass).remove(), !this.showPreview || 0 === i.length || this.getFileStack().length > 0 || !this.dropZoneEnabled || !this.isAjaxUpload && this.$element.files || (0 === i.find(t.FRAMES).length && t.isEmpty(this.defaultPreviewContent) && i.prepend('
    ' + a + "
    "), this.$container.removeClass("file-input-new"), t.addCss(this.$container, "file-input-ajax-new")) }, _setAsyncUploadStatus: function (t, i, a) { var r = 0; this._setProgress(i, e("#" + t).find(".file-thumb-progress")), this.uploadStatus[t] = i, e.each(this.uploadStatus, function (e, t) { r += t }), this._setProgress(Math.floor(r / a)) }, _validateMinCount: function () { var e = this.isAjaxUpload ? this.getFileStack().length : this._inputFileCount(); return !(this.validateInitialCount && this.minFileCount > 0 && this._getFileCount(e - 1) < this.minFileCount) || (this._noFilesError({}), !1) }, _getFileCount: function (e) { return this.validateInitialCount && !this.overwriteInitial && (e += this.previewCache.count()), e }, _getFileId: function (e) { var t, i = this.generateFileId; return "function" == typeof i ? i(e, event) : e && (t = String(e.webkitRelativePath || e.fileName || e.name || null)) ? e.size + "-" + t.replace(/[^0-9a-zA-Z_-]/gim, "") : null }, _getFileName: function (e) { return e && e.name ? this.slug(e.name) : void 0 }, _getFileIds: function (e) { return this.fileids.filter(function (t) { return e ? void 0 !== t : null != t }) }, _getFileNames: function (e) { return this.filenames.filter(function (t) { return e ? void 0 !== t : null != t }) }, _setPreviewError: function (e, t, i, a) { void 0 !== t && this.updateStack(t, i), this.showPreview && (!this.removeFromPreviewOnError || a ? (this._setThumbStatus(e, "Error"), this._refreshUploadButton(e, a)) : e.remove()) }, _refreshUploadButton: function (e, t) { var i = e.find(".kv-file-upload"), a = this.fileActionSettings, r = a.uploadIcon, n = a.uploadTitle; i.length && (t && (r = a.uploadRetryIcon, n = a.uploadRetryTitle), i.attr("title", n).html(r)) }, _checkDimensions: function (e, i, a, r, n, s, o) { var l, d, c, h = this[("Small" === i ? "min" : "max") + "Image" + s]; !t.isEmpty(h) && a.length && (c = a[0], d = "Width" === s ? c.naturalWidth || c.width : c.naturalHeight || c.height, ("Small" === i ? d >= h : d <= h) || (l = this["msgImage" + s + i].setTokens({ name: n, size: h }), this._showUploadError(l, o), this._setPreviewError(r, e, null))) }, _getExifObj: function (e) { var t = null; try { t = window.piexif ? window.piexif.load(e) : null } catch (e) { t = null } return t || this._log("Error loading the piexif.js library."), t }, _validateImageOrientation: function (e, i, a, r, n, s, o) { var l, d; (d = (l = e.length && this.autoOrientImage ? this._getExifObj(o) : null) ? l["0th"][piexif.ImageIFD.Orientation] : null) ? (t.setImageOrientation(e, this.$preview.find("#zoom-" + a + " img"), d), this._raise("fileimageoriented", { $img: e, file: i }), this._validateImage(a, r, n, s, o, l)) : this._validateImage(a, r, n, s, o, l) }, _validateImage: function (t, i, a, r, n, s) { var o, l, d, c = this, h = c.$preview, p = h.find("#" + t), u = p.attr("data-fileindex"), f = p.find("img"); i = i || "Untitled", f.one("load", function () { l = p.width(), d = h.width(), l > d && f.css("width", "100%"), o = { ind: u, id: t }, c._checkDimensions(u, "Small", f, p, i, "Width", o), c._checkDimensions(u, "Small", f, p, i, "Height", o), c.resizeImage || (c._checkDimensions(u, "Large", f, p, i, "Width", o), c._checkDimensions(u, "Large", f, p, i, "Height", o)), c._raise("fileimageloaded", [t]), c.loadedImages.push({ ind: u, img: f, thumb: p, pid: t, typ: a, siz: r, validated: !1, imgData: n, exifObj: s }), p.data("exif", s), c._validateAllImages() }).one("error", function () { c._raise("fileimageloaderror", [t]) }).each(function () { this.complete ? e(this).trigger("load") : this.error && e(this).trigger("error") }) }, _validateAllImages: function () { var e, t, i, a = {val: 0}, r = this.loadedImages.length, n = this.resizeIfSizeMoreThan; if (r === this.totalImagesCount && (this._raise("fileimagesloaded"), this.resizeImage)) for (e = 0; e < this.loadedImages.length; e++) (t = this.loadedImages[e]).validated || ((i = t.siz) && i > 1e3 * n && this._getResizedImage(t, a, r), this.loadedImages[e].validated = !0) }, _getResizedImage: function (i, a, r) { var n, s, o, l, d, c, h = this, p = e(i.img)[0], u = p.naturalWidth, f = p.naturalHeight, m = 1, g = h.maxImageWidth || u, v = h.maxImageHeight || f, w = !(!u || !f), _ = h.imageCanvas, b = h.imageCanvasContext, C = i.typ, y = i.pid, x = i.ind, T = i.thumb, E = i.exifObj; if (d = function (e, t, i) { h.isAjaxUpload ? h._showUploadError(e, t, i) : h._showError(e, t, i), h._setPreviewError(T, x) }, h.filestack[x] && w && !(u <= g && f <= v) || (w && h.filestack[x] && h._raise("fileimageresized", [y, x]), a.val++, a.val === r && h._raise("fileimagesresized"), w)) { C = C || h.resizeDefaultImageType, s = u > g, o = f > v, m = "width" === h.resizePreference ? s ? g / u : o ? v / f : 1 : o ? v / f : s ? g / u : 1, h._resetCanvas(), u *= m, f *= m, _.width = u, _.height = f; try { b.drawImage(p, 0, 0, u, f), l = _.toDataURL(C, h.resizeQuality), E && (c = window.piexif.dump(E), l = window.piexif.insert(c, l)), n = t.dataURI2Blob(l), h.filestack[x] = n, h._raise("fileimageresized", [y, x]), a.val++, a.val === r && h._raise("fileimagesresized", [void 0, void 0]), n instanceof Blob || d(h.msgImageResizeError, { id: y, index: x }, "fileimageresizeerror") } catch (e) { a.val++, a.val === r && h._raise("fileimagesresized", [void 0, void 0]), d(h.msgImageResizeException.replace("{errors}", e.message), { id: y, index: x }, "fileimageresizeexception") } } else d(h.msgImageResizeError, {id: y, index: x}, "fileimageresizeerror") }, _initBrowse: function (e) { var i = this.$element; this.showBrowse ? this.$btnFile = e.find(".btn-file").append(i) : (i.appendTo(e).attr("tabindex", -1), t.addCss(i, "file-no-browse")) }, _initClickable: function () { var i, a, r = this; r.isClickable && (i = r.$dropZone, r.isAjaxUpload || (a = r.$preview.find(".file-default-preview")).length && (i = a), t.addCss(i, "clickable"), i.attr("tabindex", -1), r._handler(i, "click", function (t) { var a = e(t.target); e(r.elErrorContainer + ":visible").length || a.parents(".file-preview-thumbnails").length && !a.parents(".file-default-preview").length || (r.$element.data("zoneClicked", !0).trigger("click"), i.blur()) })) }, _initCaption: function () { var e = this.initialCaption || ""; return this.overwriteInitial || t.isEmpty(e) ? (this.$caption.val(""), !1) : (this._setCaption(e), !0) }, _setCaption: function (i, a) { var r, n, s, o, l, d = this.getFileStack(); if (this.$caption.length) { if (this.$captionContainer.removeClass("icon-visible"), a) r = e("
    " + this.msgValidationError + "
    ").text(), l = (o = d.length) ? 1 === o && d[0] ? this._getFileNames()[0] : this._getMsgSelected(o) : this._getMsgSelected(this.msgNo), n = t.isEmpty(i) ? l : i, s = '' + this.msgValidationErrorIcon + ""; else { if (t.isEmpty(i)) return; n = r = e("
    " + i + "
    ").text(), s = this._getLayoutTemplate("fileIcon") } this.$captionContainer.addClass("icon-visible"), this.$caption.attr("title", r).val(n), this.$captionIcon.html(s) } }, _createContainer: function () { var t = {class: "file-input file-input-new" + (this.rtl ? " kv-rtl" : "")}, i = e(document.createElement("div")).attr(t).html(this._renderMain()); return i.insertBefore(this.$element), this._initBrowse(i), this.theme && i.addClass("theme-" + this.theme), i }, _refreshContainer: function () { var e = this.$container; this.$element.insertAfter(e), e.html(this._renderMain()), this._initBrowse(e), this._validateDisabled() }, _validateDisabled: function () { this.$caption.attr({readonly: this.isDisabled}) }, _renderMain: function () { var e = this.dropZoneEnabled ? " file-drop-zone" : "file-drop-disabled", t = this.showClose ? this._getLayoutTemplate("close") : "", i = this.showPreview ? this._getLayoutTemplate("preview").setTokens({ class: this.previewClass, dropClass: e }) : "", a = this.isDisabled ? this.captionClass + " file-caption-disabled" : this.captionClass, r = this.captionTemplate.setTokens({class: a + " kv-fileinput-caption"}); return this.mainTemplate.setTokens({ class: this.mainClass + (!this.showBrowse && this.showCaption ? " no-browse" : ""), preview: i, close: t, caption: r, upload: this._renderButton("upload"), remove: this._renderButton("remove"), cancel: this._renderButton("cancel"), browse: this._renderButton("browse") }) }, _renderButton: function (e) { var i = this._getLayoutTemplate("btnDefault"), a = this[e + "Class"], r = this[e + "Title"], n = this[e + "Icon"], s = this[e + "Label"], o = this.isDisabled ? " disabled" : "", l = "button"; switch (e) { case"remove": if (!this.showRemove) return ""; break; case"cancel": if (!this.showCancel) return ""; a += " kv-hidden"; break; case"upload": if (!this.showUpload) return ""; this.isAjaxUpload && !this.isDisabled ? i = this._getLayoutTemplate("btnLink").replace("{href}", this.uploadUrl) : l = "submit"; break; case"browse": if (!this.showBrowse) return ""; i = this._getLayoutTemplate("btnBrowse"); break; default: return "" } return a += "browse" === e ? " btn-file" : " fileinput-" + e + " fileinput-" + e + "-button", t.isEmpty(s) || (s = ' ' + s + ""), i.setTokens({ type: l, css: a, title: r, status: o, icon: n, label: s }) }, _renderThumbProgress: function () { return '
    ' + this.progressTemplate.setTokens({ percent: "0", status: this.msgUploadBegin }) + "
    " }, _renderFileFooter: function (e, i, a, r) { var n, s = this.fileActionSettings, o = s.showRemove, l = s.showDrag, d = s.showUpload, c = s.showZoom, h = this._getLayoutTemplate("footer"), p = this._getLayoutTemplate("indicator"), u = r ? s.indicatorError : s.indicatorNew, f = r ? s.indicatorErrorTitle : s.indicatorNewTitle, m = p.setTokens({indicator: u, indicatorTitle: f}); return i = this._getSize(i), n = this.isAjaxUpload ? h.setTokens({ actions: this._renderFileActions(d, !1, o, c, l, !1, !1, !1), caption: e, size: i, width: a, progress: this._renderThumbProgress(), indicator: m }) : h.setTokens({ actions: this._renderFileActions(!1, !1, !1, c, l, !1, !1, !1), caption: e, size: i, width: a, progress: "", indicator: m }), n = t.replaceTags(n, this.previewThumbTags) }, _renderFileActions: function (e, t, i, a, r, n, s, o, l, d, c) { if (!(e || t || i || a || r)) return ""; var h, p = !1 === s ? "" : ' data-url="' + s + '"', u = !1 === o ? "" : ' data-key="' + o + '"', f = "", m = "", g = "", v = "", w = "", _ = this._getLayoutTemplate("actions"), b = this.fileActionSettings, C = this.otherActionButtons.setTokens({dataKey: u, key: o}), y = n ? b.removeClass + " disabled" : b.removeClass; return i && (f = this._getLayoutTemplate("actionDelete").setTokens({ removeClass: y, removeIcon: b.removeIcon, removeTitle: b.removeTitle, dataUrl: p, dataKey: u, key: o })), e && (m = this._getLayoutTemplate("actionUpload").setTokens({ uploadClass: b.uploadClass, uploadIcon: b.uploadIcon, uploadTitle: b.uploadTitle })), t && (g = (g = this._getLayoutTemplate("actionDownload").setTokens({ downloadClass: b.downloadClass, downloadIcon: b.downloadIcon, downloadTitle: b.downloadTitle, downloadUrl: d || this.initialPreviewDownloadUrl })).setTokens({ filename: c, key: o })), a && (v = this._getLayoutTemplate("actionZoom").setTokens({ zoomClass: b.zoomClass, zoomIcon: b.zoomIcon, zoomTitle: b.zoomTitle })), r && l && (h = "drag-handle-init " + b.dragClass, w = this._getLayoutTemplate("actionDrag").setTokens({ dragClass: h, dragTitle: b.dragTitle, dragIcon: b.dragIcon })), _.setTokens({delete: f, upload: m, download: g, zoom: v, drag: w, other: C}) }, _browse: function (e) { e && e.isDefaultPrevented() || !this._raise("filebrowse") || (this.isError && !this.isAjaxUpload && this.clear(), this.$captionContainer.focus()) }, _filterDuplicate: function (e, t, i) { var a = this._getFileId(e); a && i && i.indexOf(a) > -1 || (i || (i = []), t.push(e), i.push(a)) }, _change: function (i) { var a = this; if (!a.changeTriggered) { var r, n, s, o, l, d, c, h, p, u, f, m = a.$element, g = arguments.length > 1, v = a.isAjaxUpload, w = [], _ = g ? arguments[1] : m.get(0).files, b = !v && t.isEmpty(m.attr("multiple")) ? 1 : a.maxFileCount, C = a.filestack.length, y = t.isEmpty(m.attr("multiple")) && C > 0, x = a._getFileIds(); if (a.reader = null, a._resetUpload(), a._hideFileIcon(), a.dropZoneEnabled && a.$container.find(".file-drop-zone ." + a.dropZoneTitleClass).remove(), v ? e.each(_, function (e, t) { a._filterDuplicate(t, w, x) }) : (_ = i.target && void 0 === i.target.files ? i.target.value ? [{name: i.target.value.replace(/^.+\\/, "")}] : [] : i.target.files || {}, w = _), t.isEmpty(w) || 0 === w.length) return v || a.clear(), void a._raise("fileselectnone"); if (a._resetErrors(), n = w.length, r = a._getFileCount(v ? a.getFileStack().length + n : n), b > 0 && r > b) { if (!a.autoReplace || n > b) return s = a.autoReplace && n > b ? n : r, o = b, f = a.msgFilesTooMany.replace("{m}", o).replace("{n}", s), a.isError = (l = f, d = null, c = null, h = null, p = e.extend(!0, {}, a._getOutData({}, {}, _), { id: c, index: h }), u = { id: c, index: h, file: d, files: _ }, v ? a._showUploadError(l, p) : a._showError(l, u)), a.$captionContainer.removeClass("icon-visible"), a._setCaption("", !0), void a.$container.removeClass("file-input-new file-input-ajax-new"); r > b && a._resetPreviewThumbs(v) } else !v || y ? (a._resetPreviewThumbs(!1), y && a.clearStack()) : !v || 0 !== C || a.previewCache.count() && !a.overwriteInitial || a._resetPreviewThumbs(!0); a.isPreviewable ? a.readFiles(w) : a._updateFileDetails(1) } }, _abort: function (t) { var i; return this.ajaxAborted && "object" == typeof this.ajaxAborted && void 0 !== this.ajaxAborted.message ? ((i = e.extend(!0, {}, this._getOutData(), t)).abortData = this.ajaxAborted.data || {}, i.abortMessage = this.ajaxAborted.message, this._setProgress(101, this.$progress, this.msgCancelled), this._showUploadError(this.ajaxAborted.message, i, "filecustomerror"), this.cancel(), !0) : !!this.ajaxAborted }, _resetFileStack: function () { var i = this, a = 0, r = [], n = [], s = []; i._getThumbs().each(function () { var o = e(this), l = o.attr("data-fileindex"), d = i.filestack[l], c = o.attr("id"); "-1" !== l && -1 !== l && (void 0 !== d ? (r[a] = d, n[a] = i._getFileName(d), s[a] = i._getFileId(d), o.attr({ id: i.previewInitId + "-" + a, "data-fileindex": a }), a++) : o.attr({ id: "uploaded-" + t.uniqId(), "data-fileindex": "-1" }), i.$preview.find("#zoom-" + c).attr({ id: "zoom-" + o.attr("id"), "data-fileindex": o.attr("data-fileindex") })) }), i.filestack = r, i.filenames = n, i.fileids = s }, _isFileSelectionValid: function (e) { return e = e || 0, this.required && !this.getFilesCount() ? (this.$errorContainer.html(""), this._showUploadError(this.msgFileRequired), !1) : !(this.minFileCount > 0 && this._getFileCount(e) < this.minFileCount) || (this._noFilesError({}), !1) }, clearStack: function () { return this.filestack = [], this.filenames = [], this.fileids = [], this.$element }, updateStack: function (e, t) { return this.filestack[e] = t, this.filenames[e] = this._getFileName(t), this.fileids[e] = t && this._getFileId(t) || null, this.$element }, addToStack: function (e) { return this.filestack.push(e), this.filenames.push(this._getFileName(e)), this.fileids.push(this._getFileId(e)), this.$element }, getFileStack: function (e) { return this.filestack.filter(function (t) { return e ? void 0 !== t : null != t }) }, getFilesCount: function () { var e = this.isAjaxUpload ? this.getFileStack().length : this._inputFileCount(); return this._getFileCount(e) }, readFiles: function (i) { this.reader = new FileReader; var a, r = this, n = r.$element, s = r.$preview, o = r.reader, l = r.$previewContainer, d = r.$previewStatus, c = r.msgLoading, h = r.msgProgress, p = r.previewInitId, u = i.length, f = r.fileTypeSettings, m = r.filestack.length, g = r.allowedFileTypes, v = g ? g.length : 0, w = r.allowedFileExtensions, _ = t.isEmpty(w) ? "" : w.join(", "), b = r.maxFilePreviewSize && parseFloat(r.maxFilePreviewSize), C = s.length && (!b || isNaN(b)), y = function (t, n, s, o) { var l, d = e.extend(!0, {}, r._getOutData({}, {}, i), {id: s, index: o}), c = {id: s, index: o, file: n, files: i}; r._previewDefault(n, s, !0), r.isAjaxUpload ? (r.addToStack(void 0), setTimeout(function () { a(o + 1) }, 100)) : u = 0, r._initFileActions(), (l = e("#" + s)).find(".kv-file-upload").hide(), r.removeFromPreviewOnError && l.remove(), r.isError = r.isAjaxUpload ? r._showUploadError(t, d) : r._showError(t, c), r._updateFileDetails(u) }; r.loadedImages = [], r.totalImagesCount = 0, e.each(i, function (e, t) { var i = r.fileTypeSettings.image; i && i(t.type) && r.totalImagesCount++ }), (a = function (x) { if (t.isEmpty(n.attr("multiple")) && (u = 1), x >= u) return r.isAjaxUpload && r.filestack.length > 0 ? r._raise("filebatchselected", [r.getFileStack()]) : r._raise("filebatchselected", [i]), l.removeClass("file-thumb-loading"), void d.html(""); var T, E, S, k, F, P, I, A, D, z, $, j, U = p + "-" + (m + x), B = i[x], R = f.text, O = f.image, L = f.html, M = B && B.name ? r.slug(B.name) : "", Z = (B && B.size || 0) / 1e3, N = "", H = B ? t.objUrl.createObjectURL(B) : null, W = 0, q = "", V = 0, K = function () { var e = h.setTokens({index: x + 1, files: u, percent: 50, name: M}); setTimeout(function () { d.html(e), r._updateFileDetails(u), a(x + 1) }, 100), r._raise("fileloaded", [B, U, x, o]) }; if (B) { if (v > 0) for (E = 0; E < v; E++) P = g[E], I = r.msgFileTypes[P] || P, q += 0 === E ? I : ", " + I; if (!1 !== M) { if (0 === M.length) return S = r.msgInvalidFileName.replace("{name}", t.htmlEncode(B.name, "[unknown]")), void y(S, B, U, x); if (t.isEmpty(w) || (N = new RegExp("\\.(" + w.join("|") + ")$", "i")), T = Z.toFixed(2), r.maxFileSize > 0 && Z > r.maxFileSize) return S = r.msgSizeTooLarge.setTokens({ name: M, size: T, maxSize: r.maxFileSize }), void y(S, B, U, x); if (null !== r.minFileSize && Z <= t.getNum(r.minFileSize)) return S = r.msgSizeTooSmall.setTokens({ name: M, size: T, minSize: r.minFileSize }), void y(S, B, U, x); if (!t.isEmpty(g) && t.isArray(g)) { for (E = 0; E < g.length; E += 1) k = g[E], W += (A = f[k]) && "function" == typeof A && A(B.type, B.name) ? 1 : 0; if (0 === W) return S = r.msgInvalidFileType.setTokens({ name: M, types: q }), void y(S, B, U, x) } if (0 === W && !t.isEmpty(w) && t.isArray(w) && !t.isEmpty(N) && (F = t.compare(M, N), 0 === (W += t.isEmpty(F) ? 0 : F.length))) return S = r.msgInvalidFileExtension.setTokens({ name: M, extensions: _ }), void y(S, B, U, x); if (!r.showPreview) return r.isAjaxUpload && r.addToStack(B), setTimeout(function () { a(x + 1), r._updateFileDetails(u) }, 100), void r._raise("fileloaded", [B, U, x, o]); if (!C && Z > b) return r.addToStack(B), l.addClass("file-thumb-loading"), r._previewDefault(B, U), r._initFileActions(), r._updateFileDetails(u), void a(x + 1); s.length && void 0 !== FileReader ? (D = R(B.type, M), z = L(B.type, M), $ = O(B.type, M), d.html(c.replace("{index}", x + 1).replace("{files}", u)), l.addClass("file-thumb-loading"), o.onerror = function (e) { r._errorHandler(e, M) }, o.onload = function (i) { var a, n, s, l, d, c, h, p, u = []; if (n = {name: M, type: B.type}, e.each(f, function (e, t) { "object" !== e && "other" !== e && t(B.type, M) && V++ }), 0 === V) { for (s = new Uint8Array(i.target.result), E = 0; E < s.length; E++) l = s[E].toString(16), u.push(l); if (a = u.join("").toLowerCase().substring(0, 8), c = t.getMimeType(a, "", ""), t.isEmpty(c) && (d = t.arrayBuffer2String(o.result), c = t.isSvg(d) ? "image/svg+xml" : t.getMimeType(a, d, B.type)), n = { name: M, type: c }, D = R(c, ""), z = L(c, ""), $ = O(c, ""), (j = D || z) || $) return h = j, (p = new FileReader).onerror = function (e) { r._errorHandler(e, M) }, p.onload = function (e) { r._previewFile(x, B, e, U, H, n), r._initFileActions(), K() }, void (h ? p.readAsText(B, r.textEncoding) : p.readAsDataURL(B)) } r._previewFile(x, B, i, U, H, n), r._initFileActions(), K() }, o.onprogress = function (e) { if (e.lengthComputable) { var t = e.loaded / e.total * 100, i = Math.ceil(t); S = h.setTokens({index: x + 1, files: u, percent: i, name: M}), setTimeout(function () { d.html(S) }, 100) } }, D || z ? o.readAsText(B, r.textEncoding) : $ ? o.readAsDataURL(B) : o.readAsArrayBuffer(B)) : (r._previewDefault(B, U), setTimeout(function () { a(x + 1), r._updateFileDetails(u) }, 100), r._raise("fileloaded", [B, U, x, o])), r.addToStack(B) } else a(x + 1) } })(0), r._updateFileDetails(u, !1) }, lock: function () { return this._resetErrors(), this.disable(), this.showRemove && this.$container.find(".fileinput-remove").hide(), this.showCancel && this.$container.find(".fileinput-cancel").show(), this._raise("filelock", [this.filestack, this._getExtraData()]), this.$element }, unlock: function (e) { return void 0 === e && (e = !0), this.enable(), this.showCancel && this.$container.find(".fileinput-cancel").hide(), this.showRemove && this.$container.find(".fileinput-remove").show(), e && this._resetFileStack(), this._raise("fileunlock", [this.filestack, this._getExtraData()]), this.$element }, cancel: function () { var t, i = this, a = i.ajaxRequests, r = a.length; if (r > 0) for (t = 0; t < r; t += 1) i.cancelling = !0, a[t].abort(); return i._setProgressCancelled(), i._getThumbs().each(function () { var t = e(this), a = t.attr("data-fileindex"); t.removeClass("file-uploading"), void 0 !== i.filestack[a] && (t.find(".kv-file-upload").removeClass("disabled").removeAttr("disabled"), t.find(".kv-file-remove").removeClass("disabled").removeAttr("disabled")), i.unlock() }), i.$element }, clear: function () { var i, a = this; if (a._raise("fileclear")) return a.$btnUpload.removeAttr("disabled"), a._getThumbs().find("video,audio,img").each(function () { t.cleanMemory(e(this)) }), a._clearFileInput(), a._resetUpload(), a.clearStack(), a._resetErrors(!0), a._hasInitialPreview() ? (a._showFileIcon(), a._resetPreview(), a._initPreviewActions(), a.$container.removeClass("file-input-new")) : (a._getThumbs().each(function () { a._clearObjects(e(this)) }), a.isAjaxUpload && (a.previewCache.data = {}), a.$preview.html(""), i = !a.overwriteInitial && a.initialCaption.length > 0 ? a.initialCaption : "", a.$caption.attr("title", "").val(i), t.addCss(a.$container, "file-input-new"), a._validateDefaultPreview()), 0 === a.$container.find(t.FRAMES).length && (a._initCaption() || a.$captionContainer.removeClass("icon-visible")), a._hideFileIcon(), a._raise("filecleared"), a.$captionContainer.focus(), a._setFileDropZoneTitle(), a.$element }, reset: function () { if (this._raise("filereset")) return this._resetPreview(), this.$container.find(".fileinput-filename").text(""), t.addCss(this.$container, "file-input-new"), (this.getFrames().length || this.dropZoneEnabled) && this.$container.removeClass("file-input-new"), this.clearStack(), this.formdata = {}, this._setFileDropZoneTitle(), this.$element }, disable: function () { return this.isDisabled = !0, this._raise("filedisabled"), this.$element.attr("disabled", "disabled"), this.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled"), this.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").attr("disabled", !0), t.addCss(this.$container.find(".btn-file"), "disabled"), this._initDragDrop(), this.$element }, enable: function () { return this.isDisabled = !1, this._raise("fileenabled"), this.$element.removeAttr("disabled"), this.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled"), this.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled"), this.$container.find(".btn-file").removeClass("disabled"), this._initDragDrop(), this.$element }, upload: function () { var i, a, r, n = this.getFileStack().length, s = !e.isEmptyObject(this._getExtraData()); if (this.isAjaxUpload && !this.isDisabled && this._isFileSelectionValid(n)) if (this._resetUpload(), 0 !== n || s) if (this.$progress.show(), this.uploadCount = 0, this.uploadStatus = {}, this.uploadLog = [], this.lock(), this._setProgress(2), 0 === n && s) this._uploadExtraOnly(); else { if (r = this.filestack.length, this.hasInitData = !1, !this.uploadAsync) return this._uploadBatch(), this.$element; for (a = this._getOutData(), this._raise("filebatchpreupload", [a]), this.fileBatchCompleted = !1, this.uploadCache = { content: [], config: [], tags: [], append: !0 }, this.uploadAsyncCount = this.getFileStack().length, i = 0; i < r; i++) this.uploadCache.content[i] = null, this.uploadCache.config[i] = null, this.uploadCache.tags[i] = null; for (this.$preview.find(".file-preview-initial").removeClass(t.SORT_CSS), this._initSortable(), this.cacheInitialPreview = this.getPreview(), i = 0; i < r; i++) this.filestack[i] && this._uploadSingle(i, !0) } else this._showUploadError(this.msgUploadEmpty) }, destroy: function () { var t = this.$form, i = this.$container, a = this.$element, r = this.namespace; return e(document).off(r), e(window).off(r), t && t.length && t.off(r), this.isAjaxUpload && this._clearFileInput(), this._cleanup(), this._initPreviewCache(), a.insertBefore(i).off(r).removeData(), i.off().remove(), a }, refresh: function (i) { var a = this.$element; return i = "object" != typeof i || t.isEmpty(i) ? this.options : e.extend(!0, {}, this.options, i), this._init(i, !0), this._listen(), a }, zoom: function (e) { var i = this._getFrame(e), a = this.$modal; i && (t.initModal(a), a.html(this._getModalContent()), this._setZoomContent(i), a.modal("show"), this._initZoomButtons()) }, getExif: function (e) { var t = this._getFrame(e); return t && t.data("exif") || null }, getFrames: function (i) { var a; return i = i || "", a = this.$preview.find(t.FRAMES + i), this.reversePreviewOrder && (a = e(a.get().reverse())), a }, getPreview: function () { return {content: this.initialPreview, config: this.initialPreviewConfig, tags: this.initialPreviewThumbTags} } }, e.fn.fileinput = function (a) { if (t.hasFileAPISupport() || t.isIE(9)) { var r = Array.apply(null, arguments), n = []; switch (r.shift(), this.each(function () { var s, o = e(this), l = o.data("fileinput"), d = "object" == typeof a && a, c = d.theme || o.data("theme"), h = {}, p = {}, u = d.language || o.data("language") || e.fn.fileinput.defaults.language || "en"; l || (c && (p = e.fn.fileinputThemes[c] || {}), "en" === u || t.isEmpty(e.fn.fileinputLocales[u]) || (h = e.fn.fileinputLocales[u] || {}), s = e.extend(!0, {}, e.fn.fileinput.defaults, p, e.fn.fileinputLocales.en, h, d, o.data()), l = new i(this, s), o.data("fileinput", l)), "string" == typeof a && n.push(l[a].apply(l, r)) }), n.length) { case 0: return this; case 1: return n[0]; default: return n } } }, e.fn.fileinput.defaults = { language: "en", showCaption: !0, showBrowse: !0, showPreview: !0, showRemove: !0, showUpload: !0, showCancel: !0, showClose: !0, showUploadedThumbs: !0, browseOnZoneClick: !1, autoReplace: !1, autoOrientImage: !1, required: !1, rtl: !1, hideThumbnailContent: !1, generateFileId: null, previewClass: "", captionClass: "", frameClass: "krajee-default", mainClass: "file-caption-main", mainTemplate: null, purifyHtml: !0, fileSizeGetter: null, initialCaption: "", initialPreview: [], initialPreviewDelimiter: "*$$*", initialPreviewAsData: !1, initialPreviewFileType: "image", initialPreviewConfig: [], initialPreviewThumbTags: [], previewThumbTags: {}, initialPreviewShowDelete: !0, initialPreviewDownloadUrl: "", removeFromPreviewOnError: !1, deleteUrl: "", deleteExtraData: {}, overwriteInitial: !0, previewZoomButtonIcons: { prev: '', next: '', toggleheader: '', fullscreen: '', borderless: '', close: '' }, previewZoomButtonClasses: { prev: "btn btn-navigate", next: "btn btn-navigate", toggleheader: "btn btn-sm btn-kv btn-default btn-outline-secondary", fullscreen: "btn btn-sm btn-kv btn-default btn-outline-secondary", borderless: "btn btn-sm btn-kv btn-default btn-outline-secondary", close: "btn btn-sm btn-kv btn-default btn-outline-secondary" }, previewTemplates: {}, previewContentTemplates: {}, preferIconicPreview: !1, preferIconicZoomPreview: !1, allowedPreviewTypes: void 0, allowedPreviewMimeTypes: null, allowedFileTypes: null, allowedFileExtensions: null, defaultPreviewContent: null, customLayoutTags: {}, customPreviewTags: {}, previewFileIcon: '', previewFileIconClass: "file-other-icon", previewFileIconSettings: {}, previewFileExtSettings: {}, buttonLabelClass: "hidden-xs", browseIcon: ' ', browseClass: "btn btn-primary", removeIcon: '', removeClass: "btn btn-default btn-secondary", cancelIcon: '', cancelClass: "btn btn-default btn-secondary", uploadIcon: '', uploadClass: "btn btn-default btn-secondary", uploadUrl: null, uploadUrlThumb: null, uploadAsync: !0, uploadExtraData: {}, zoomModalHeight: 480, minImageWidth: null, minImageHeight: null, maxImageWidth: null, maxImageHeight: null, resizeImage: !1, resizePreference: "width", resizeQuality: .92, resizeDefaultImageType: "image/jpeg", resizeIfSizeMoreThan: 0, minFileSize: 0, maxFileSize: 0, maxFilePreviewSize: 25600, minFileCount: 0, maxFileCount: 0, validateInitialCount: !1, msgValidationErrorClass: "text-danger", msgValidationErrorIcon: ' ', msgErrorClass: "file-error-message", progressThumbClass: "progress-bar bg-success progress-bar-success progress-bar-striped active", progressClass: "progress-bar bg-success progress-bar-success progress-bar-striped active", progressCompleteClass: "progress-bar bg-success progress-bar-success", progressErrorClass: "progress-bar bg-danger progress-bar-danger", progressUploadThreshold: 99, previewFileType: "image", elCaptionContainer: null, elCaptionText: null, elPreviewContainer: null, elPreviewImage: null, elPreviewStatus: null, elErrorContainer: null, errorCloseButton: t.closeButton("kv-error-close"), slugCallback: null, dropZoneEnabled: !0, dropZoneTitleClass: "file-drop-zone-title", fileActionSettings: {}, otherActionButtons: "", textEncoding: "UTF-8", ajaxSettings: {}, ajaxDeleteSettings: {}, showAjaxErrorDetails: !0, mergeAjaxCallbacks: !1, mergeAjaxDeleteCallbacks: !1, retryErrorUploads: !0, reversePreviewOrder: !1 }, e.fn.fileinputLocales.en = { fileSingle: "file", filePlural: "files", browseLabel: "Browse …", removeLabel: "Remove", removeTitle: "Clear selected files", cancelLabel: "Cancel", cancelTitle: "Abort ongoing upload", uploadLabel: "Upload", uploadTitle: "Upload selected files", msgNo: "No", msgNoFilesSelected: "No files selected", msgCancelled: "Cancelled", msgPlaceholder: "Select {files}...", msgZoomModalHeading: "Detailed Preview", msgFileRequired: "You must select a file to upload.", msgSizeTooSmall: 'File "{name}" ({size} KB) is too small and must be larger than {minSize} KB.', msgSizeTooLarge: 'File "{name}" ({size} KB) exceeds maximum allowed upload size of {maxSize} KB.', msgFilesTooLess: "You must select at least {n} {files} to upload.", msgFilesTooMany: "Number of files selected for upload ({n}) exceeds maximum allowed limit of {m}.", msgFileNotFound: 'File "{name}" not found!', msgFileSecured: 'Security restrictions prevent reading the file "{name}".', msgFileNotReadable: 'File "{name}" is not readable.', msgFilePreviewAborted: 'File preview aborted for "{name}".', msgFilePreviewError: 'An error occurred while reading the file "{name}".', msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".', msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.', msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.', msgFileTypes: { image: "image", html: "HTML", text: "text", video: "video", audio: "audio", flash: "flash", pdf: "PDF", object: "object" }, msgUploadAborted: "The file upload was aborted", msgUploadThreshold: "Processing...", msgUploadBegin: "Initializing...", msgUploadEnd: "Done", msgUploadEmpty: "No valid data available for upload.", msgUploadError: "Error", msgValidationError: "Validation Error", msgLoading: "Loading file {index} of {files} …", msgProgress: "Loading file {index} of {files} - {name} - {percent}% completed.", msgSelected: "{n} {files} selected", msgFoldersNotAllowed: "Drag & drop files only! {n} folder(s) dropped were skipped.", msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px.', msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px.', msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.', msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.', msgImageResizeError: "Could not get the image dimensions to resize.", msgImageResizeException: "Error while resizing the image.
    {errors}
    ", msgAjaxError: "Something went wrong with the {operation} operation. Please try again later!", msgAjaxProgressError: "{operation} failed", ajaxOperations: { deleteThumb: "file delete", uploadThumb: "file upload", uploadBatch: "batch file upload", uploadExtra: "form data upload" }, dropZoneTitle: "Drag & drop files here …", dropZoneClickTitle: "
    (or click to select {files})", previewZoomButtonTitles: { prev: "View previous file", next: "View next file", toggleheader: "Toggle header", fullscreen: "Toggle full screen", borderless: "Toggle borderless mode", close: "Close detailed preview" }, usePdfRenderer: function () { return !!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i) }, pdfRendererUrl: "", pdfRendererTemplate: '' }, e.fn.fileinput.Constructor = i, e(document).ready(function () { var t = e("input.file[type=file]"); t.length && t.fileinput() }) });