{"version":3,"file":"kendo.upload.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendoupload","js","this","$","undefined$1","kendo","window","Widget","ui","antiForgeryTokens","logToConsole","rFileExtension","NS","SELECT","UPLOAD","SUCCESS","ERROR","COMPLETE","CANCEL","CLEAR","PAUSE","RESUME","PROGRESS","REMOVE","VALIDATIONERRORS","INVALIDMAXFILESIZE","INVALIDMINFILESIZE","INVALIDFILEEXTENSION","HOVER_STATE","FOCUS_STATE","PROGRESSBAR_CLASS","PROGRESSBAR_SELECTOR","TABINDEX","headerStatusIconName","Upload","extend","init","element","options","that","progressbars","fn","call","name","multiple","directory","localization","activeInput","wrapper","closest","length","_wrapInput","_activeInput","addClass","toggle","enabled","ns","_ns","guid","on","_onParentFormSubmit","bind","_onParentFormReset","_initUploadModule","_toggleDropZone","_onUploadButtonKeydown","_onFileAction","_onClearSelected","e","preventDefault","click","_onUploadSelected","_onKeyDown","_focusout","val","_onInputChange","target","events","showFileList","template","files","async","autoRetryAfter","bufferChunkSize","maxAutoRetries","removeVerb","autoUpload","withCredentials","accept","useArrayBuffer","select","cancel","retry","remove","pause","resume","clearSelectedFiles","uploadSelectedFiles","dropFilesHere","invalidFiles","statusUploading","statusUploaded","statusWarning","statusFailed","headerStatusUploading","headerStatusPaused","headerStatusUploaded","uploadSuccess","uploadFail","invalidMaxFileSize","invalidMinFileSize","invalidFileExtension","validation","allowedExtensions","maxFileSize","minFileSize","dropZone","saveUrl","_module","_supportsFormData","formDataUploadModule","iframeUploadModule","_async","initialFiles","_renderInitialFiles","syncUploadModule","setOptions","off","attr","_supportsMultiple","enable","disable","toggleClass","prop","focus","find","trigger","destroy","customDropZone","document","add","forEach","progressbar","fileEntry","onPause","pauseIcon","htmlEncode","icon","parent","onResume","playIcon","upload","onSaveSelected","getFiles","filesData","allFiles","listItems","i","data","j","push","clearAllFiles","each","index","file","_removeFileByDomElement","removeAllFiles","removeFileByUid","uid","_removeFileByUid","clearFileByUid","shouldSendRemoveRequest","clearFile","callback","_removeFile","removeFile","fileData","hasClass","onCancel","onRemove","_hideHeaderUploadstatus","_updateHeaderUploadStatus","_addInput","sourceInput","nodeType","input","clone","insertAfter","prefix","removeAttr","_adjustFocusState","focusedItem","toFocus","removeClass","_arrowKeyNavigation","key","kendoKeys","keys","DOWN","stopPropagation","first","next","UP","prev","RIGHT","LEFT","_preventFocusRemove","_asyncCommandKeyNavigation","eventArgs","_retryClicked","ESC","_checkAllComplete","SPACEBAR","ENTER","is","chunkSize","concurrent","finish","show","metaData","prepareChunk","onRetry","_commandKeyNavigation","hasValidationErrors","_filesContainValidationErrors","headers","DELETE","TAB","commandKeys","keyCode","indexOf","assignGuidToFiles","_inputFiles","_isAsyncNonBatch","validateFiles","onSelect","last","_readDirectory","item","deferred","Deferred","dirReader","createReader","allFolderFiles","readEntries","entries","concat","resolve","reject","promise","_readFile","fullpath","fullPath","relativePath","slice","droppedFolderFiles","droppedFolderCounter","setTimeout","_proceedDroppedItems","_traverseFileTree","skipCounter","then","items","isFile","isDirectory","_onDrop","dt","originalEvent","dataTransfer","droppedFiles","stopEvent","directoryDrop","webkitGetAsEntry","entry","getAllFileInfo","splice","hasErrors","batch","idx","currentFile","_enqueueFile","fileNames","_supportsRemove","_fileAction","_prepareTemplateData","templateData","totalSize","size","_createProgressbarWapper","_createFileIconWrapper","fileTypeIcon","iconClass","_progressbarInit","kendoProgressBar","animation","showStatus","_prepareDefaultSingleFileEntryTemplate","fileSize","getTotalFilesSizeMessage","fileGroup","getFileGroup","extension","errors","isError","invalidClass","fileDetails","_prepareDefaultMultipleFileEntriesTemplate","filesHaveValidationErrors","totalFileSize","sort","a","b","existingFileEntries","removeEventArgs","isProgressbar","fileUid","fileList","progressbarSelector","appendTo","hide","value","_removeFileEntry","_hideActionButtons","fileElement","actionKey","skipClear","firstActionButton","iconsNameDictionary","actionKeyText","hasOwnProperty","_clearFileAction","firstActionIcon$1","append","firstActionIcon","_renderAction","_fileState","stateKey","currentState","uploading","text","uploaded","failed","iconName","actionText","empty","button","_onFileProgress","percentComplete","progressBar","prepend","getFileEntry","_onUploadSuccess","response","xhr","fileInfo","operation","XMLHttpRequest","_setUploadErrorState","after","_hideUploadProgress","_onUploadError","responseText","_decreasePosition","_autoRetryAfter","retries","performUpload","uploadPercentage","_updateUploadProgress","fileMetaData","totalChunks","Math","round","delay","fadeOut","_showActionButtons","actionsWrapper","uploadButton","clearButton","html","renderButton","themeColor","_showHeaderUploadStatus","isUploading","headerUploadStatus","headerUploadStatusIcon","currentlyUploading","not","currentlyFailed","currentlyPaused","onAbort","windows","_userAgent","support","browser","opera","safari","_supportsDrop","userAgent","toLowerCase","test","navigator","_setupDropZone","dropEffect","bindDragEventWrappers","_bindDocumentDragEventWrappers","_setupCustomDropZone","removeUrl","_submitRemove","onSuccess","onError","removeField","params","jQuery","ajax","type","dataType","dataFilter","normalizeJSON","url","traditional","success","error","xhrFields","hasLabel","selectText","wrap","prependTo","tabindex","inputFiles","prototype","filesContainErrors","relatedInput","getFileName","iframes","_frameId","prepareUpload","iframe","form","saveField","createFrame","registerFrame","createForm","frame","fileValidation","cleanupFrame","unregisterFrame","body","dataInput","one","onIframeLoad","submit","started","isFileUploadStarted","contents","ex","processResponse","fakeXHR","tryParseJSON","jsonResult","statusText","status","stopFrameSubmit","removeUploadedFile","id","action","stop","execCommand","grep","position","cancelled","paused","map","join","$input","slashIndex","lastIndexOf","substr","getFileExtension","rawFiles","fileName","rawFile","matches","match","unique","validationInfo","extensions","ext","substring","parseAllowedExtensions","validateFileExtension","validateFileSize","validationErrors","inArray","toFixed","shouldRemoveFileEntry","textStatus","json","JSON","parse","namespace","onDragEnter","onDragLeave","hideInterval","lastDrag","Date","setInterval","clearInterval","sourceElement","fileEntries","enqueueFiles","filesLength","webkitRelativePath","formData","createFormData","createXHR","removeFileEntry","populateFormData","FileReader","postFormData","reader","onload","fileArrayBuffer","_appendBuffer","result","err","onerror","readAsArrayBuffer","_getCurrentChunk","buffer1","buffer2","tmp","Uint8Array","byteLength","set","buffer","filter","prevEntry","stopUploadRequest","_increaseChunkIndex","addEventListener","onRequestSuccess","onRequestError","onRequestProgress","open","setRequestHeader","send","FormData","chunk","serializedMetaData","stringify","raiseError","cleanupFileEntry","_resetChunkIndex","uploadComplete","isUploadButtonVisible","loaded","total","abort","chunkIndex","contentType","ceil","uploadUid","_decreaseChunkIndex","methodToInvoke","oldPosition","_getChunker","mozSlice","webkitSlice","plugin"],"sources":["kendo.upload.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.core.js'), require('kendo.progressbar.js'), require('kendo.icons.js'), require('kendo.html.button.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.progressbar', 'kendo.icons', 'kendo.html.button'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendoupload = global.kendoupload || {}, global.kendoupload.js = factory()));\n})(this, (function () {\n var __meta__ = {\n id: \"upload\",\n name: \"Upload\",\n category: \"web\",\n description: \"The Upload widget uses progressive enhancement to deliver the best possible uploading experience to users.\",\n depends: [\"core\", \"progressbar\", \"icons\", \"html.button\"]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n antiForgeryTokens = kendo.antiForgeryTokens,\n logToConsole = kendo.logToConsole,\n rFileExtension = /\\.([^\\.]+)$/,\n NS = \".kendoUpload\",\n SELECT = \"select\",\n UPLOAD = \"upload\",\n SUCCESS = \"success\",\n ERROR = \"error\",\n COMPLETE = \"complete\",\n CANCEL = \"cancel\",\n CLEAR = \"clear\",\n PAUSE = \"pause\",\n RESUME = \"resume\",\n PROGRESS = \"progress\",\n REMOVE = \"remove\",\n VALIDATIONERRORS = \"validationErrors\",\n INVALIDMAXFILESIZE = \"invalidMaxFileSize\",\n INVALIDMINFILESIZE = \"invalidMinFileSize\",\n INVALIDFILEEXTENSION = \"invalidFileExtension\",\n PROGRESSHIDEDELAY = 1000,\n PROGRESSHIDEDURATION = 2000,\n HOVER_STATE = \"k-hover\",\n FOCUS_STATE = \"k-focus\",\n PROGRESSBAR_CLASS = \"k-progressbar\",\n PROGRESSBAR_SELECTOR = \".\" + PROGRESSBAR_CLASS,\n PROGRESSBAR_TEMPLATE_SELECTOR = \".k-progress\",\n TABINDEX = \"tabindex\",\n WARNINGICON_SELECTOR = \".k-i-exclamation-circle,.k-svg-i-exclamation-circle\";\n\n var headerStatusIconName = {\n loading: \"upload\",\n warning: \"exclamation-circle\",\n success: \"check\"\n };\n\n var Upload = Widget.extend({\n init: function(element, options) {\n var that = this;\n that.progressbars = [];\n\n Widget.fn.init.call(that, element, options);\n\n that.name = element.name;\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\n that.localization = that.options.localization;\n\n var activeInput = that.element;\n that.wrapper = activeInput.closest(\".k-upload\");\n if (that.wrapper.length === 0) {\n that.wrapper = that._wrapInput(activeInput);\n }\n\n that._activeInput(activeInput);\n that.element.addClass(\"k-hidden\");\n that.toggle(that.options.enabled);\n\n var ns = that._ns = NS + \"-\" + kendo.guid();\n activeInput.closest(\"form\")\n .on(\"submit\" + ns, that._onParentFormSubmit.bind(that))\n .on(\"reset\" + ns, that._onParentFormReset.bind(that));\n\n that._initUploadModule();\n\n that._toggleDropZone();\n\n that.wrapper\n .on(\"keydown\", \".k-upload-button\", that._onUploadButtonKeydown.bind(that))\n .on(\"click\", \".k-upload-action\", that._onFileAction.bind(that))\n .on(\"click\", \".k-clear-selected\", that._onClearSelected.bind(that))\n .on(\"click\", \".k-upload-button\", function(e) {\n e.preventDefault();\n that.element.click();\n })\n .on(\"click\", \".k-upload-selected\", that._onUploadSelected.bind(that))\n .on(\"keydown\", that._onKeyDown.bind(that))\n .on(\"focusout\", that._focusout.bind(that));\n\n if (that.element.val()) {\n that._onInputChange({ target: that.element });\n }\n },\n\n events: [\n SELECT,\n UPLOAD,\n SUCCESS,\n ERROR,\n COMPLETE,\n CANCEL,\n CLEAR,\n PROGRESS,\n REMOVE,\n PAUSE,\n RESUME\n ],\n\n options: {\n name: \"Upload\",\n enabled: true,\n multiple: true,\n directory: false,\n showFileList: true,\n template: \"\",\n files: [],\n async: {\n autoRetryAfter: 0,\n bufferChunkSize: 10000000,\n maxAutoRetries: 1,\n removeVerb: \"POST\",\n autoUpload: true,\n withCredentials: true,\n accept: \"*/*; q=0.5, application/json\",\n useArrayBuffer: false\n },\n localization: {\n \"select\": \"Select files...\",\n \"cancel\": \"Cancel\",\n \"retry\": \"Retry\",\n \"remove\": \"Remove\",\n \"pause\": \"Pause\",\n \"resume\": \"Resume\",\n \"clearSelectedFiles\": \"Clear\",\n \"uploadSelectedFiles\": \"Upload\",\n \"dropFilesHere\": \"Drop files here to upload\",\n \"invalidFiles\": \"Invalid file(s). Please check file upload requirements.\",\n \"statusUploading\": \"uploading\",\n \"statusUploaded\": \"uploaded\",\n \"statusWarning\": \"warning\",\n \"statusFailed\": \"failed\",\n \"headerStatusUploading\": \"Uploading...\",\n \"headerStatusPaused\": \"Paused\",\n \"headerStatusUploaded\": \"Done\",\n \"uploadSuccess\": \"File(s) uploaded successfully.\",\n \"uploadFail\": \"File(s) failed to upload.\",\n \"invalidMaxFileSize\": \"File size too large.\",\n \"invalidMinFileSize\": \"File size too small.\",\n \"invalidFileExtension\": \"File type not allowed.\"\n },\n validation: {\n allowedExtensions: [],\n maxFileSize: 0,\n minFileSize: 0\n },\n dropZone: \"\"\n },\n\n _initUploadModule: function() {\n var that = this,\n options = that.options;\n\n if (options.async.saveUrl) {\n that._module = that._supportsFormData() ?\n new formDataUploadModule(that) :\n new iframeUploadModule(that);\n that._async = true;\n\n var initialFiles = options.files;\n if (initialFiles.length > 0) {\n that._renderInitialFiles(initialFiles);\n }\n\n } else {\n that._module = new syncUploadModule(that);\n }\n },\n\n setOptions: function(options) {\n var that = this,\n activeInput = that.element;\n\n $(that.options.dropZone).off(that._ns);\n\n Widget.fn.setOptions.call(that, options);\n\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\n\n activeInput.attr(\"multiple\", that._supportsMultiple() ? that.multiple : false);\n if (that.directory) {\n activeInput.attr(\"webkitdirectory\", that.directory);\n activeInput.attr(\"directory\", that.directory);\n }\n that.toggle(that.options.enabled);\n\n that._initUploadModule();\n\n that._toggleDropZone();\n },\n\n enable: function(enable) {\n enable = typeof (enable) === \"undefined\" ? true : enable;\n this.toggle(enable);\n },\n\n disable: function() {\n this.toggle(false);\n },\n\n toggle: function(enable) {\n enable = typeof (enable) === \"undefined\" ? enable : !enable;\n this.wrapper.toggleClass(\"k-disabled\", enable);\n this.element.prop(\"disabled\", enable);\n },\n\n focus: function() {\n this.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n },\n\n destroy: function() {\n var that = this;\n var customDropZone = $(that.options.dropZone);\n\n $(document)\n .add($(\".k-dropzone\", that.wrapper))\n .add(that.wrapper.closest(\"form\"))\n .off(that._ns);\n\n if (customDropZone.length > 0) {\n customDropZone.off(that._ns);\n }\n\n $(that.element).off(NS);\n\n if (that.progressbars) {\n that.progressbars.forEach(function (progressbar) {\n progressbar.destroy();\n });\n }\n Widget.fn.destroy.call(that);\n },\n pause: function(fileEntry) {\n this._module.onPause({ target: $(fileEntry, this.wrapper) });\n\n var pauseIcon = fileEntry.find(\".k-i-pause-sm,.k-svg-i-pause-sm\");\n var resume = kendo.htmlEncode(this.localization.resume);\n kendo.ui.icon(pauseIcon, { icon: \"play-sm\" });\n pauseIcon.attr(\"title\", resume);\n $(pauseIcon).parent().attr(\"aria-label\", resume);\n },\n resume: function(fileEntry) {\n this._module.onResume({ target: $(fileEntry, this.wrapper) });\n\n var playIcon = fileEntry.find(\".k-i-play-sm,.k-svg-i-play-sm\");\n var pause = kendo.htmlEncode(this.localization.pause);\n kendo.ui.icon(playIcon, { icon: \"pause-sm\" });\n playIcon.attr(\"title\", pause);\n $(playIcon).parent().attr(\"aria-label\", pause);\n },\n upload: function() {\n var that = this;\n\n that._module.onSaveSelected();\n },\n\n getFiles: function() {\n var that = this;\n var filesData;\n var allFiles = [];\n var listItems = that.wrapper.find(\".k-file\");\n\n for (var i = 0; i < listItems.length; i++) {\n filesData = $(listItems[i]).data(\"fileNames\");\n\n if (filesData) {\n for (var j = 0; j < filesData.length; j++) {\n allFiles.push(filesData[j]);\n }\n }\n }\n\n return allFiles;\n },\n\n clearAllFiles: function() {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n\n files.each(function(index, file) {\n that._removeFileByDomElement(file, false);\n });\n },\n\n removeAllFiles: function() {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n\n files.each(function(index, file) {\n that._removeFileByDomElement(file, true);\n });\n },\n\n removeFileByUid: function(uid) {\n this._removeFileByUid(uid, true);\n },\n\n clearFileByUid: function(uid) {\n this._removeFileByUid(uid, false);\n },\n\n _removeFileByUid: function(uid, shouldSendRemoveRequest) {\n var that = this;\n var fileEntry;\n\n if (typeof uid !== 'string') { return; }\n\n fileEntry = $('.k-file[' + kendo.attr('uid') + '=\"' + uid + '\"]', that.wrapper);\n\n if (fileEntry.length > 0) {\n that._removeFileByDomElement(fileEntry, shouldSendRemoveRequest);\n }\n },\n\n clearFile: function(callback) {\n this._removeFile(callback, false);\n },\n\n removeFile: function(callback) {\n this._removeFile(callback, true);\n },\n\n _removeFile: function(callback, shouldSendRemoveRequest) {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n var fileData;\n\n if (typeof callback === \"function\") {\n files.each(function(index, file) {\n fileData = $(file).data(\"fileNames\");\n\n if (callback(fileData)) {\n that._removeFileByDomElement(file, shouldSendRemoveRequest);\n }\n });\n }\n },\n\n _removeFileByDomElement: function(fileEntry, shouldSendRemoveRequest) {\n var that = this;\n var fileData = {\n target: $(fileEntry, that.wrapper)\n };\n var allFiles;\n\n if (that.options.async.saveUrl) {\n if ($(fileEntry).hasClass(\"k-file-progress\")) {\n that._module.onCancel(fileData);\n } else {\n that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n }\n\n allFiles = $(\".k-file\", that.wrapper);\n\n if (allFiles.length === 0) {\n that._hideHeaderUploadstatus();\n } else {\n that._updateHeaderUploadStatus();\n }\n } else {\n that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n }\n },\n\n _addInput: function(sourceInput) {\n //check if source input is a DOM element. Required for some unit tests\n if (!sourceInput[0].nodeType) {\n return;\n }\n\n var that = this,\n input = sourceInput.clone().val(\"\");\n\n input\n .insertAfter(that.element)\n .data(\"kendo\" + that.options.prefix + that.options.name, that);\n\n $(that.element)\n .attr(TABINDEX, \"-1\")\n .removeAttr(\"id\")\n .off(NS);\n\n that._activeInput(input);\n that.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n },\n\n _activeInput: function(input) {\n var that = this,\n wrapper = that.wrapper;\n\n that.element = input;\n\n if (that.directory) {\n input.attr(\"webkitdirectory\", that.directory);\n input.attr(\"directory\", that.directory);\n }\n\n input\n .attr(\"multiple\", that._supportsMultiple() ? that.multiple : false)\n .attr(\"autocomplete\", \"off\")\n .on(\"click\" + NS, function(e) {\n if (wrapper.hasClass(\"k-disabled\")) {\n e.preventDefault();\n }\n })\n .on(\"change\" + NS, that._onInputChange.bind(that));\n },\n\n _adjustFocusState: function(focusedItem, toFocus) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n toFocus.addClass(FOCUS_STATE);\n toFocus.attr(TABINDEX, 0);\n },\n\n _arrowKeyNavigation: function(e, key, focusedItem) {\n var that = this,\n kendoKeys = kendo.keys,\n toFocus;\n\n if (key === kendoKeys.DOWN) {\n e.preventDefault();\n e.stopPropagation();\n\n toFocus = that.wrapper.find(\".k-upload-files .k-file\").first();\n\n if (focusedItem.length > 0) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem = focusedItem.closest(\".k-file\");\n }\n\n toFocus = focusedItem.next();\n }\n\n that._adjustFocusState(focusedItem, toFocus);\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = that.wrapper.find(\".k-clear-selected\");\n }\n } else if (key === kendoKeys.UP) {\n e.preventDefault();\n e.stopPropagation();\n\n toFocus = that.wrapper.find(\".k-upload-files .k-file:last\");\n\n if (focusedItem.length > 0) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem = focusedItem.closest(\".k-file\");\n }\n\n toFocus = focusedItem.prev();\n }\n\n that._adjustFocusState(focusedItem, toFocus);\n } else if (key === kendoKeys.RIGHT) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n toFocus = focusedItem.next(\".k-upload-action\");\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = focusedItem.parent().find(\".k-upload-action:first\");\n }\n } else if (focusedItem.length > 0) {\n toFocus = focusedItem.find(\".k-upload-action:first\");\n }\n\n if (toFocus && toFocus.length > 0) {\n focusedItem.removeClass(FOCUS_STATE);\n toFocus.addClass(FOCUS_STATE);\n }\n } else if (key === kendoKeys.LEFT) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n toFocus = focusedItem.prev(\".k-upload-action\");\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = focusedItem.parent().find(\".k-upload-action:last\");\n }\n } else if (focusedItem.length > 0) {\n toFocus = focusedItem.find(\".k-upload-action:last\");\n }\n\n if (toFocus && toFocus.length > 0) {\n focusedItem.removeClass(FOCUS_STATE);\n toFocus.addClass(FOCUS_STATE);\n }\n }\n\n if ((!toFocus || toFocus.length === 0) && (key === kendoKeys.UP || key === kendoKeys.DOWN)) {\n toFocus = that.wrapper.find(\".k-upload-button\");\n }\n\n if (toFocus && toFocus.length > 0) {\n that._preventFocusRemove = true;\n toFocus.trigger(\"focus\");\n }\n },\n\n _asyncCommandKeyNavigation: function(key, focusedItem, eventArgs) {\n var that = this,\n kendoKeys = kendo.keys,\n fileEntry = $(focusedItem, that.wrapper);\n\n that._retryClicked = false;\n\n if (key === kendoKeys.ESC && focusedItem.find(\".k-i-cancel,.k-svg-i-cancel\").length > 0) {\n that.trigger(CANCEL, eventArgs);\n that._module.onCancel({ target: fileEntry });\n that._checkAllComplete();\n that._updateHeaderUploadStatus();\n that._preventFocusRemove = true;\n that.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n } else if (key === kendoKeys.SPACEBAR) {\n if (focusedItem.find(\".k-i-pause-sm,.k-svg-i-pause-sm\").length > 0) {\n that.trigger(PAUSE, eventArgs);\n that.pause(focusedItem);\n that._updateHeaderUploadStatus();\n } else if (focusedItem.find(\".k-i-play-sm,.k-svg-i-play-sm\").length > 0) {\n that.trigger(RESUME, eventArgs);\n that.resume(focusedItem);\n }\n } else if (key === kendoKeys.ENTER && !focusedItem.is(\".k-file-progress, .k-file-success, .k-file-invalid\")) {\n if (that.options.async.chunkSize && !that.options.async.concurrent && $('.k-file-progress', that.wrapper).length > 0) {\n return;\n }\n\n $(WARNINGICON_SELECTOR, focusedItem).remove();\n $(PROGRESSBAR_SELECTOR, focusedItem).finish().show();\n\n if (!that._module.metaData[fileEntry.data(\"uid\")]) {\n that._module.prepareChunk(fileEntry);\n }\n\n that._module.onRetry({ target: fileEntry });\n that._retryClicked = true;\n }\n },\n\n _commandKeyNavigation: function(key, focusedItem) {\n var that = this,\n kendoKeys = kendo.keys,\n files = focusedItem.data(\"fileNames\"),\n hasValidationErrors = that._filesContainValidationErrors(files),\n eventArgs = {\n files: files,\n headers: {}\n };\n\n if (key === kendoKeys.DELETE) {\n if (!that.trigger(REMOVE, eventArgs)) {\n that._module.onRemove({ target: $(focusedItem, that.wrapper) }, eventArgs, !hasValidationErrors);\n that._preventFocusRemove = true;\n that.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n }\n } else if (key === kendoKeys.TAB) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n } else if (!!that.options.async.saveUrl) {\n that._asyncCommandKeyNavigation(key, focusedItem, eventArgs);\n }\n },\n\n _focusout: function() {\n var focusedItem = this.wrapper.find(\".k-upload-files .k-file.\" + FOCUS_STATE);\n\n if (!this._preventFocusRemove) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n } else {\n this._preventFocusRemove = false;\n }\n },\n\n _onKeyDown: function(e) {\n var that = this,\n focusedItem = that.wrapper.find(\".k-upload-files .k-file.\" + FOCUS_STATE + \",\" + \".k-upload-action.\" + FOCUS_STATE),\n kendoKeys = kendo.keys,\n commandKeys = [kendoKeys.DELETE, kendoKeys.ESC, kendoKeys.ENTER, kendoKeys.SPACEBAR, kendoKeys.TAB],\n key = e.keyCode;\n\n if (key === kendoKeys.DOWN || key === kendoKeys.UP || key === kendoKeys.LEFT || key === kendoKeys.RIGHT) {\n that._arrowKeyNavigation(e, key, focusedItem);\n } else if (focusedItem.length > 0 && focusedItem.hasClass(\"k-file\") && commandKeys.indexOf(key) > -1 && !that.wrapper.hasClass(\"k-disabled\")) {\n if (key === kendoKeys.SPACEBAR) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n that._commandKeyNavigation(key, focusedItem);\n }\n },\n\n _onInputChange: function(e) {\n var that = this;\n var input = $(e.target);\n var files = assignGuidToFiles(that._inputFiles(input), that._isAsyncNonBatch());\n\n validateFiles(files, that.options.validation);\n\n var prevented = that.trigger(SELECT, { files: files });\n if (prevented) {\n that._addInput(input);\n input.remove();\n } else {\n that._module.onSelect({ target: input }, files);\n }\n that.focus();\n },\n\n _onUploadButtonKeydown: function(e) {\n var key = e.keyCode,\n kendoKeys = kendo.keys;\n\n if (key === kendoKeys.ENTER || key === kendoKeys.SPACEBAR) {\n this.wrapper.find(\".k-upload-button-wrap input\").last().trigger(\"click\");\n }\n },\n\n _readDirectory: function(item) {\n var deferred = new $.Deferred();\n var dirReader = item.createReader();\n var allFolderFiles = [];\n\n var readEntries = function() {\n dirReader.readEntries(function(entries) {\n if (!entries.length) {\n deferred.resolve(allFolderFiles);\n } else {\n allFolderFiles = allFolderFiles.concat(entries);\n readEntries();\n }\n }, deferred.reject);\n };\n\n readEntries();\n\n return deferred.promise();\n },\n\n _readFile: function(item) {\n var that = this;\n var fullpath = item.fullPath;\n\n item.file(function(file) {\n file.relativePath = fullpath.slice(1);\n that.droppedFolderFiles.push(file);\n that.droppedFolderCounter --;\n if (that.droppedFolderCounter === 0) {\n setTimeout(function() {\n if (that.droppedFolderCounter === 0) {\n if (that.droppedFolderFiles.length) {\n that._proceedDroppedItems(that.droppedFolderFiles);\n that.droppedFolderFiles = [];\n }\n }\n },0);\n }\n }, function() {\n logToConsole(\"File error.\");\n });\n },\n\n _traverseFileTree: function(item, skipCounter) {\n var that = this;\n if (!skipCounter) {\n that.droppedFolderCounter--;\n }\n\n this._readDirectory(item).then(function(items) {\n that.droppedFolderCounter += items.length;\n for (var i = 0; i < items.length; i++) {\n if (items[i].isFile) {\n that._readFile(items[i]);\n } else if (items[i].isDirectory) {\n that._traverseFileTree(items[i]);\n }\n }\n });\n },\n\n _onDrop: function(e) {\n var dt = e.originalEvent.dataTransfer;\n var that = this;\n var droppedFiles = dt.files;\n var length;\n\n stopEvent(e);\n if (that.options.directoryDrop && dt.items) {\n length = dt.items.length;\n that.droppedFolderCounter = 0;\n that.droppedFolderFiles = [];\n\n for (var i = 0; i < length; i++) {\n if (dt.items[i].webkitGetAsEntry) {\n var entry = dt.items[i].webkitGetAsEntry();\n\n if (entry.isDirectory) {\n that._traverseFileTree(entry, true);\n } else if (entry.isFile) {\n that.droppedFolderFiles.push(dt.files[i]);\n }\n } else {\n that._proceedDroppedItems(droppedFiles);\n }\n }\n } else {\n that._proceedDroppedItems(droppedFiles);\n }\n },\n\n _proceedDroppedItems: function(droppedFiles) {\n var that = this;\n var files = assignGuidToFiles(getAllFileInfo(droppedFiles), that._isAsyncNonBatch());\n\n if (droppedFiles.length > 0 && !that.wrapper.hasClass(\"k-disabled\")) {\n if (!that.multiple && files.length > 1) {\n files.splice(1, files.length - 1);\n }\n\n validateFiles(files, that.options.validation);\n\n var prevented = that.trigger(SELECT, { files: files });\n if (!prevented) {\n that._module.onSelect({ target: $(\".k-dropzone\", that.wrapper) }, files);\n }\n }\n },\n\n _filesContainValidationErrors: function(files) {\n var hasErrors = false;\n\n $(files).each(function(index, file) {\n if (file[VALIDATIONERRORS] && file[VALIDATIONERRORS].length > 0) {\n hasErrors = true;\n return false;\n }\n });\n\n return hasErrors;\n },\n\n _isAsyncNonBatch: function() {\n return (this._async && !this.options.async.batch) || false;\n },\n\n _renderInitialFiles: function(files) {\n var that = this;\n var idx = 0;\n files = assignGuidToFiles(files, true);\n\n for (idx = 0; idx < files.length; idx++) {\n var currentFile = files[idx];\n\n var fileEntry = that._enqueueFile(currentFile.name, { fileNames: [currentFile] });\n fileEntry.addClass(\"k-file-success\").data(\"files\", [files[idx]]);\n\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n }\n }\n },\n\n _prepareTemplateData: function(name, data) {\n var filesData = data.fileNames,\n templateData = {},\n totalSize = 0,\n idx = 0;\n\n for (idx = 0; idx < filesData.length; idx++) {\n totalSize += filesData[idx].size;\n }\n\n templateData.name = name;\n templateData.size = totalSize;\n templateData.files = data.fileNames;\n\n return templateData;\n },\n\n _createProgressbarWapper: function() {\n return \"
\";\n },\n\n _createFileIconWrapper: function(fileTypeIcon) {\n return \"\" +\n kendo.ui.icon({ icon: fileTypeIcon, iconClass: \"k-file-icon\", size: \"xxlarge\" }) +\n \"\" +\n \"\";\n },\n\n _progressbarInit: function(wrapper) {\n var progressbar = wrapper.kendoProgressBar({\n animation: false,\n showStatus: false\n }).data(\"kendoProgressBar\");\n this.progressbars.push(progressbar);\n },\n\n _prepareDefaultSingleFileEntryTemplate: function(data) {\n var that = this;\n var file = data.fileNames[0];\n var fileSize = getTotalFilesSizeMessage(data.fileNames);\n var fileGroup = kendo.getFileGroup(file.extension, true);\n var errors = file[VALIDATIONERRORS];\n var isError = errors && errors.length > 0;\n var invalidClass = isError ? \" k-file-invalid k-file-error\" : \"\";\n var fileDetails = isError ?\n \"\" + kendo.htmlEncode(that.localization[errors[0]]) + \"\" :\n \"\" + fileSize + \"\";\n var template = \"\";\n\n template += \"
  • \" +\n this._createProgressbarWapper() +\n this._createFileIconWrapper(fileGroup) +\n \"\" +\n \"\" + file.name + \"\" +\n fileDetails +\n \"\";\n\n template += \"\";\n\n return $(template);\n },\n\n _prepareDefaultMultipleFileEntriesTemplate: function(data) {\n var that = this;\n var files = data.fileNames;\n var filesHaveValidationErrors = that._filesContainValidationErrors(files);\n var totalFileSize = getTotalFilesSizeMessage(files);\n var template = \"\";\n var i, currentFile;\n var invalidClass = filesHaveValidationErrors ? \" k-file-invalid k-file-error\" : \"\";\n\n template += \"
  • \" +\n this._createProgressbarWapper() +\n this._createFileIconWrapper(\"copy\");\n\n files.sort(function(a, b) {\n if (a[VALIDATIONERRORS]) { return -1; }\n\n if (b[VALIDATIONERRORS]) { return 1; }\n\n return 0;\n });\n\n template += \"\";\n for (i = 0; i < files.length; i++) {\n currentFile = files[i];\n var fileSize = getTotalFilesSizeMessage([currentFile]);\n\n template += \"\";\n if (currentFile[VALIDATIONERRORS] && currentFile[VALIDATIONERRORS].length > 0) {\n template += \"\" + currentFile.name + \"\";\n } else {\n template += \"\" + currentFile.name + \"\";\n }\n template += \"\" + fileSize + \"\";\n }\n\n if (filesHaveValidationErrors) {\n template += \"\" + kendo.htmlEncode(that.localization.invalidFiles) + \"\";\n } else {\n template += \"Total: \" + files.length + \" files, \" + totalFileSize + \"\";\n }\n\n template += \"\";\n\n return $(template);\n },\n\n _enqueueFile: function(name, data) {\n var that = this;\n var existingFileEntries;\n var fileEntry;\n var fileUid = data.fileNames[0].uid;\n var fileList = $(\".k-upload-files\", that.wrapper);\n var options = that.options;\n var template = options.template;\n var templateData;\n var removeEventArgs;\n var progressbarSelector = template ? PROGRESSBAR_TEMPLATE_SELECTOR : PROGRESSBAR_SELECTOR;\n var progressbar;\n var isProgressbar;\n\n if (fileList.length === 0) {\n fileList = $(\"\").appendTo(that.wrapper);\n if (!that.options.showFileList) {\n fileList.hide();\n }\n\n that.wrapper.removeClass(\"k-upload-empty\");\n }\n\n existingFileEntries = $(\".k-file\", fileList);\n\n if (!template) {\n if (data.fileNames.length === 1) {\n fileEntry = that._prepareDefaultSingleFileEntryTemplate(data);\n } else {\n fileEntry = that._prepareDefaultMultipleFileEntriesTemplate(data);\n }\n } else {\n templateData = that._prepareTemplateData(name, data);\n template = kendo.template(template);\n\n fileEntry = $(\"
  • \" + template(templateData) + \"
  • \");\n fileEntry.find(\".k-upload-action\").addClass(\"k-button k-icon-button k-button-md k-rounded-md k-button-flat k-button-flat-base\");\n }\n\n progressbar = $(progressbarSelector, fileEntry[0]);\n isProgressbar = progressbar.length > 0;\n\n if (isProgressbar) {\n that._progressbarInit(progressbar);\n }\n\n fileEntry\n .attr(kendo.attr(\"uid\"), fileUid)\n .appendTo(fileList)\n .data(data);\n\n if (!that._async && isProgressbar) {\n progressbar.data(\"kendoProgressBar\").value(100);\n }\n\n if (!that.multiple && existingFileEntries.length > 0) {\n removeEventArgs = {\n files: existingFileEntries.data(\"fileNames\"),\n headers: {}\n };\n if (!that.trigger(REMOVE, removeEventArgs)) {\n that._module.onRemove({ target: $(existingFileEntries, that.wrapper) }, removeEventArgs);\n }\n }\n\n return fileEntry;\n },\n\n _removeFileEntry: function(fileEntry) {\n var that = this;\n var fileList = fileEntry.closest(\".k-upload-files\");\n var allFiles, allCompletedFiles, allInvalidFiles;\n\n fileEntry.remove();\n allFiles = $(\".k-file\", fileList);\n allCompletedFiles = $(\".k-file-success, .k-file-error\", fileList);\n\n if (allCompletedFiles.length === allFiles.length) {\n this._hideActionButtons();\n }\n\n if (allFiles.length === 0) {\n fileList.remove();\n that.wrapper.addClass(\"k-upload-empty\");\n that._hideHeaderUploadstatus();\n } else {\n that._updateHeaderUploadStatus();\n }\n },\n\n _fileAction: function(fileElement, actionKey, skipClear) {\n var iconsNameDictionary = { remove: \"x\", cancel: \"cancel\", retry: \"arrow-rotate-cw-small\", pause: \"pause-sm\" };\n var firstActionButton;\n var actionKeyText = kendo.htmlEncode(this.localization[actionKey]);\n\n if (!iconsNameDictionary.hasOwnProperty(actionKey)) {\n return;\n }\n if (!skipClear) {\n this._clearFileAction(fileElement);\n }\n if (!this.options.template) {\n if (!skipClear) {\n fileElement.find(\".k-upload-action\").remove();\n }\n fileElement.find(\".k-upload-actions\").append(\n this._renderAction(iconsNameDictionary[actionKey], actionKeyText, actionKey == \"retry\" ? \"k-i-retry\" : \"\")\n );\n } else {\n firstActionButton = fileElement.find(\".k-upload-action\").first();\n if (!firstActionButton.find(\".k-icon,.k-svg-icon\").length) {\n var firstActionIcon = kendo.ui.icon($((\"\")), {\n icon: iconsNameDictionary[actionKey],\n iconClass: \"k-button-icon\" + (actionKey == \"retry\" ? \" k-i-retry\" : \"\")\n });\n firstActionButton\n .addClass(\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button\")\n .append(firstActionIcon)\n .show();\n } else if (firstActionButton.next(\".k-upload-action\").length) {\n var firstActionIcon$1 = kendo.ui.icon($((\"\")), {\n icon: iconsNameDictionary[actionKey],\n iconClass: \"k-button-icon\" + (actionKey == \"retry\" ? \" k-i-retry\" : \"\")\n });\n firstActionButton.next(\".k-upload-action\")\n .addClass(\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button\")\n .append(firstActionIcon$1)\n .show();\n }\n }\n },\n\n _fileState: function(fileEntry, stateKey) {\n var localization = this.localization,\n states = {\n uploading: {\n text: localization.statusUploading\n },\n uploaded: {\n text: localization.statusUploaded\n },\n failed: {\n text: localization.statusFailed\n }\n },\n currentState = states[stateKey];\n\n if (currentState) {\n $(\"span.k-file-state\", fileEntry).text(kendo.htmlEncode(currentState.text));\n }\n },\n\n _renderAction: function(iconName, actionText, iconClass) {\n if (iconName !== \"\") {\n return $(\n \"\"\n ).on(\"focus\", function() { $(this).addClass(FOCUS_STATE); })\n .on(\"blur\", function() { $(this).removeClass(FOCUS_STATE); });\n }\n else {\n return $(\n \"\"\n );\n }\n },\n\n _clearFileAction: function(fileElement) {\n $(\".k-upload-action\", fileElement).empty().hide();\n },\n\n _onFileAction: function(e) {\n var that = this;\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n var button = $(e.target).closest(\".k-upload-action\");\n var icon = button.find(\".k-icon,.k-svg-icon\");\n var fileEntry = button.closest(\".k-file\");\n var files = fileEntry.data(\"fileNames\");\n var hasValidationErrors = that._filesContainValidationErrors(files);\n var eventArgs = {\n files: files,\n headers: {}\n };\n\n that._retryClicked = false;\n\n if (icon.is(\".k-i-x,.k-svg-i-x\")) {\n if (!that.trigger(REMOVE, eventArgs)) {\n that._module.onRemove({ target: $(fileEntry, that.wrapper) }, eventArgs, !hasValidationErrors);\n that.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n }\n } else if (icon.is(\".k-i-cancel,.k-svg-i-cancel\")) {\n that.trigger(CANCEL, eventArgs);\n that._module.onCancel({ target: $(fileEntry, that.wrapper) });\n that._checkAllComplete();\n that._updateHeaderUploadStatus();\n that.wrapper.find(\".k-upload-button\").trigger(\"focus\");\n } else if (icon.is(\".k-i-pause-sm,.k-svg-i-pause-sm\")) {\n that.trigger(PAUSE, eventArgs);\n that.pause(fileEntry);\n that._updateHeaderUploadStatus();\n } else if (icon.is(\".k-i-play-sm,.k-svg-i-play-sm\")) {\n that.trigger(RESUME, eventArgs);\n that.resume(fileEntry);\n } else if (icon.hasClass(\"k-i-retry\")) {\n $(\".k-i-exclamation-circle\", fileEntry).remove();\n $(PROGRESSBAR_SELECTOR, fileEntry).finish().show();\n that._module.onRetry({ target: $(fileEntry, that.wrapper) });\n that._retryClicked = true;\n }\n\n fileEntry.addClass(FOCUS_STATE);\n }\n\n return false;\n },\n\n _onUploadSelected: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n if (!wrapper.hasClass(\"k-disabled\")) {\n this._module.onSaveSelected();\n }\n\n return false;\n },\n\n _onClearSelected: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n var clearEventArgs = { };\n if (!wrapper.hasClass(\"k-disabled\") && !that.trigger(CLEAR, clearEventArgs)) {\n that.clearAllFiles();\n }\n\n return false;\n },\n\n _onFileProgress: function(e, percentComplete) {\n var progressPct;\n var progressBar = $(PROGRESSBAR_SELECTOR, e.target).data(\"kendoProgressBar\");\n\n if (percentComplete > 100) {\n percentComplete = 100;\n }\n\n $(PROGRESSBAR_SELECTOR, e.target).removeClass('k-hidden');\n\n if (!this.options.template) {\n progressPct = $(\".k-upload-pct\", e.target);\n\n if (progressPct.length === 0) {\n $(\".k-upload-actions\", e.target).prepend(\"\");\n }\n\n if (percentComplete !== 100) {\n $(\".k-upload-pct\", e.target).text(percentComplete + \"%\");\n } else {\n $(\".k-upload-pct\", e.target).remove();\n }\n }\n\n if (progressBar) {\n progressBar.value(percentComplete);\n }\n\n this.trigger(PROGRESS, {\n files: getFileEntry(e).data(\"fileNames\"),\n percentComplete: percentComplete\n });\n },\n\n _onUploadSuccess: function(e, response, xhr) {\n var that = this;\n var fileEntry = getFileEntry(e);\n var files = fileEntry.data(\"fileNames\");\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n var prevented = that.trigger(SUCCESS, {\n files: fileEntry.data(\"fileNames\"),\n response: response,\n operation: \"upload\",\n XMLHttpRequest: xhr\n });\n\n if (prevented) {\n that._setUploadErrorState(fileEntry);\n } else {\n that._fileState(fileEntry, \"uploaded\");\n fileEntry.removeClass('k-file-progress').addClass('k-file-success');\n\n if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden')\n .after('' + files.length + ' ' + kendo.htmlEncode(that.localization.uploadSuccess) + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden')\n .after('' + kendo.htmlEncode(that.localization.uploadSuccess) + '');\n }\n\n that._updateHeaderUploadStatus();\n\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n } else {\n that._clearFileAction(fileEntry);\n }\n }\n\n that._hideUploadProgress(fileEntry);\n\n that._checkAllComplete();\n },\n\n _onUploadError: function(e, xhr) {\n var that = this;\n var module = that._module;\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n\n that._setUploadErrorState(fileEntry);\n\n that.trigger(ERROR, {\n operation: \"upload\",\n files: fileEntry.data(\"fileNames\"),\n XMLHttpRequest: xhr\n });\n\n logToConsole(\"Server response: \" + xhr.responseText);\n\n if (!that.options.async.chunkSize) {\n that._hideUploadProgress(fileEntry);\n } else {\n if (module._decreasePosition) {\n module._decreasePosition(fileUid);\n }\n }\n\n that._checkAllComplete();\n\n if (this.options.async.autoRetryAfter) {\n this._autoRetryAfter(fileEntry);\n }\n },\n _autoRetryAfter: function(fileEntry) {\n var that = this;\n var retries = this._module.retries;\n\n if (!retries) {\n return;\n }\n\n if (!retries[fileEntry.data(\"uid\")]) {\n retries[fileEntry.data(\"uid\")] = 1;\n }\n\n if (retries[fileEntry.data(\"uid\")] <= this.options.async.maxAutoRetries) {\n retries[fileEntry.data(\"uid\")]++;\n setTimeout(function() {\n that._module.performUpload(fileEntry);\n },this.options.async.autoRetryAfter);\n }\n },\n _setUploadErrorState: function(fileEntry) {\n var that = this,\n uploadPercentage,\n files = fileEntry.data(\"fileNames\"),\n fileInfo = fileEntry.find('.k-file-summary'),\n fileSize = fileEntry.find('.k-file-size');\n\n that._fileState(fileEntry, \"failed\");\n fileEntry.removeClass('k-file-progress').addClass('k-file-error');\n\n if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden')\n .after('' + files.length + ' ' + kendo.htmlEncode(that.localization.uploadFail) + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden')\n .after('' + kendo.htmlEncode(that.localization.uploadFail) + '');\n }\n\n that._updateUploadProgress(fileEntry);\n\n uploadPercentage = $('.k-upload-pct', fileEntry);\n\n if (uploadPercentage.length > 0) {\n uploadPercentage.remove();\n }\n\n this._updateHeaderUploadStatus();\n this._fileAction(fileEntry, \"retry\");\n this._fileAction(fileEntry, REMOVE, true);\n\n if (that._retryClicked) {\n fileEntry.trigger(\"focus\");\n }\n },\n\n _updateUploadProgress: function(fileEntry) {\n var that = this;\n var progressbar = $( PROGRESSBAR_SELECTOR, fileEntry);\n var isProgressbar = progressbar.length > 0;\n\n if (!that.options.async.chunkSize && isProgressbar) {\n progressbar.data(\"kendoProgressBar\").value(100);\n } else {\n var fileUid = fileEntry.data(\"uid\");\n if (that._module.metaData) {\n var fileMetaData = that._module.metaData[fileUid];\n\n if (fileMetaData) {\n var percentComplete = fileMetaData.totalChunks ? Math.round(((fileMetaData.chunkIndex) / fileMetaData.totalChunks) * 100) : 100;\n\n that._onFileProgress({ target: $(fileEntry, that.wrapper) }, percentComplete);\n }\n }\n }\n },\n\n _hideUploadProgress: function(fileEntry) {\n $(PROGRESSBAR_SELECTOR, fileEntry)\n .delay(PROGRESSHIDEDELAY)\n .fadeOut(PROGRESSHIDEDURATION, function() {\n if ($(this).data(\"kendoProgressBar\")) {\n $(this).data(\"kendoProgressBar\").value(0);\n }\n });\n },\n\n _showActionButtons: function() {\n var that = this;\n var actionsWrapper = $(\".k-actions\", that.wrapper);\n var uploadButton = $(\".k-upload-selected\", that.wrapper);\n var clearButton = $(\".k-clear-selected\", that.wrapper);\n\n if (uploadButton.length === 0) {\n uploadButton = $(kendo.html.renderButton((\"\"), {\n icon: 'upload',\n themeColor: 'primary'\n }));\n\n clearButton = $(kendo.html.renderButton((\"\"), {\n icon: 'x'\n }));\n\n }\n\n if (!actionsWrapper.length) {\n actionsWrapper = $(\"
    \")\n .addClass(\"k-actions\")\n .append(uploadButton, clearButton);\n }\n\n\n this.wrapper.append(actionsWrapper);\n },\n\n _hideActionButtons: function() {\n $(\".k-actions\", this.wrapper).remove();\n },\n\n _showHeaderUploadStatus: function(isUploading) {\n var that = this;\n var localization = that.localization;\n var dropZone = $(\".k-dropzone\", that.wrapper);\n var headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n\n if (headerUploadStatus.length !== 0) {\n headerUploadStatus.remove();\n }\n\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n\n headerUploadStatus = '';\n\n if (isUploading) {\n headerUploadStatus = $(headerUploadStatus).append(kendo.htmlEncode(localization.headerStatusUploading));\n kendo.ui.icon(headerUploadStatus.find(\".k-icon,.k-svg-icon\"), { icon: headerStatusIconName.loading });\n } else {\n headerUploadStatus = $(headerUploadStatus).append(kendo.htmlEncode(localization.headerStatusUploaded));\n kendo.ui.icon(headerUploadStatus.find(\".k-icon,.k-svg-icon\"), { icon: headerStatusIconName.warning });\n }\n\n if (dropZone.length > 0) {\n dropZone.append(headerUploadStatus);\n } else {\n $('.k-upload-button', that.wrapper).after(headerUploadStatus);\n }\n },\n\n _updateHeaderUploadStatus: function() {\n var that = this;\n var headerUploadStatus = $('.k-upload-status-total', this.wrapper);\n var currentlyUploading = $('.k-file', that.wrapper).not('.k-file-success, .k-file-error');\n var currentlyFailed = $('.k-file-error', that.wrapper);\n var currentlyPaused = $('.k-file', that.wrapper).find(\".k-i-play-sm,.k-svg-i-play-sm\");\n var headerUploadStatusIcon;\n\n if (currentlyPaused.length &&\n (currentlyPaused.length === currentlyUploading.length || !that.options.async.concurrent)) {\n headerUploadStatusIcon = $('.k-icon,.k-svg-icon', headerUploadStatus).removeClass();\n\n if (headerUploadStatusIcon.length) {\n kendo.ui.icon(headerUploadStatusIcon, { icon: \"pause-sm\" });\n\n headerUploadStatus.html(headerUploadStatusIcon)\n .append(kendo.htmlEncode(that.localization.headerStatusPaused));\n }\n } else if (currentlyUploading.length === 0 || currentlyFailed.length > 0) {\n headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n headerUploadStatusIcon = $('.k-icon,.k-svg-icon', headerUploadStatus).removeClass();\n\n if (headerUploadStatusIcon.length) {\n\n kendo.ui.icon(headerUploadStatusIcon, { icon: currentlyFailed.length !== 0 ? headerStatusIconName.warning : headerStatusIconName.success });\n\n headerUploadStatus.html(headerUploadStatusIcon)\n .append(kendo.htmlEncode(that.localization.headerStatusUploaded));\n }\n }\n },\n\n _hideHeaderUploadstatus: function() {\n var that = this,\n dropZone = that.options.dropZone;\n\n $('.k-upload-status-total', this.wrapper).remove();\n\n if (dropZone === \"\") {\n $('.k-dropzone-hint', that.wrapper).removeClass('k-hidden');\n }\n },\n\n _onParentFormSubmit: function() {\n var upload = this,\n element = upload.element;\n\n if (typeof this._module.onAbort !== 'undefined') {\n this._module.onAbort();\n }\n\n if (!element.value) {\n var input = $(element);\n\n // Prevent submitting an empty input\n input.attr(\"disabled\", \"disabled\");\n\n window.setTimeout(function() {\n // Restore the input so the Upload remains functional\n // in case the user cancels the form submit\n input.prop(\"disabled\", false);\n }, 0);\n }\n },\n\n _onParentFormReset: function() {\n $(\".k-upload-files\", this.wrapper).remove();\n },\n\n _supportsFormData: function() {\n return typeof(FormData) != \"undefined\";\n },\n\n _supportsMultiple: function() {\n var windows = this._userAgent().indexOf(\"Windows\") > -1;\n\n return !kendo.support.browser.opera &&\n !(kendo.support.browser.safari && windows);\n },\n\n _supportsDrop: function() {\n var userAgent = this._userAgent().toLowerCase();\n var isChrome = /chrome/.test(userAgent);\n var isSafari = !isChrome && /safari/.test(userAgent);\n var isWindowsSafari = isSafari && /windows/.test(userAgent);\n\n return !isWindowsSafari && this._supportsFormData() && (this.options.async.saveUrl);\n },\n\n _userAgent: function() {\n return navigator.userAgent;\n },\n\n _setupDropZone: function() {\n var that = this;\n\n var ns = that._ns;\n var dropZone = $(\".k-dropzone\", that.wrapper)\n\n .on(\"dragenter\" + ns, stopEvent)\n .on(\"dragover\" + ns, function(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.preventDefault();\n })\n .on(\"drop\" + ns, that._onDrop.bind(that));\n\n if (!dropZone.find(\".k-dropzone-hint\").length) {\n dropZone.append($(\"\" + kendo.htmlEncode(that.localization.dropFilesHere) + \"\"));\n }\n\n bindDragEventWrappers(dropZone, ns,\n function() {\n if (!dropZone.closest('.k-upload').hasClass(\"k-disabled\")) {\n dropZone.addClass(HOVER_STATE);\n }\n },\n function() { dropZone.removeClass(HOVER_STATE); });\n\n that._bindDocumentDragEventWrappers(dropZone);\n },\n\n _setupCustomDropZone: function() {\n var that = this;\n var dropZone = $(that.options.dropZone);\n\n if (!that.wrapper.find(\".k-dropzone-hint\").length) {\n $(\".k-dropzone\", that.wrapper)\n .append($(\"\" + kendo.htmlEncode(that.localization.dropFilesHere) + \"\"));\n } else {\n // Dropzone hint in upload should be hidden if customDropZone is used\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n }\n\n var ns = that._ns;\n dropZone.on(\"dragenter\" + ns, stopEvent)\n .on(\"dragover\" + ns, function(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.preventDefault();\n })\n .on(\"drop\" + ns, that._onDrop.bind(that));\n\n bindDragEventWrappers(dropZone, ns,\n function(e) {\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n dropZone.removeClass(HOVER_STATE);\n dropZone.addClass(HOVER_STATE);\n $(e.target).addClass(HOVER_STATE);\n }\n },\n function() {\n dropZone.removeClass(HOVER_STATE);\n }\n );\n\n that._bindDocumentDragEventWrappers(dropZone);\n },\n\n _bindDocumentDragEventWrappers: function(dropZone) {\n var that = this;\n var ns = that._ns;\n\n bindDragEventWrappers($(document), ns,\n function() {\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n dropZone.addClass(\"k-dropzone-active\");\n dropZone.closest('.k-upload').removeClass('k-upload-empty');\n dropZone.find('.k-dropzone-hint').removeClass('k-hidden');\n }\n },\n function() {\n dropZone.removeClass(\"k-dropzone-active\");\n dropZone.find('.k-dropzone-hint').addClass('k-hidden');\n if ($('li.k-file', dropZone.closest('.k-upload')).length === 0) {\n dropZone.closest('.k-upload').addClass('k-upload-empty');\n }\n }\n );\n },\n\n _toggleDropZone: function() {\n var that = this,\n dropZone = that.options.dropZone;\n\n if (!that._supportsDrop()) {\n return;\n }\n\n $(dropZone).off(that._ns);\n $(\".k-dropzone\", that.wrapper).off(that._ns);\n\n if (dropZone !== \"\") {\n that._setupCustomDropZone();\n } else {\n that._setupDropZone();\n }\n },\n\n _supportsRemove: function() {\n return !!this.options.async.removeUrl;\n },\n\n _submitRemove: function(fileNames, eventArgs, onSuccess, onError) {\n var upload = this,\n removeField = upload.options.async.removeField || \"fileNames\",\n params = $.extend(eventArgs.data, antiForgeryTokens());\n\n params[removeField] = fileNames;\n\n jQuery.ajax({\n type: this.options.async.removeVerb,\n dataType: \"json\",\n dataFilter: normalizeJSON,\n url: this.options.async.removeUrl,\n traditional: true,\n data: params,\n headers: eventArgs.headers,\n success: onSuccess,\n error: onError,\n xhrFields: {\n withCredentials: this.options.async.withCredentials\n }\n });\n },\n\n _wrapInput: function(input) {\n var that = this;\n var options = that.options;\n var hasLabel = !!input.attr(\"id\") && $(\"[for='\" + input.attr(\"id\") + \"']\").length > 0;\n var selectText = kendo.htmlEncode(that.localization.select);\n var uploadButton = $(\"
    \");\n\n uploadButton.find('.k-button-text').text(selectText);\n\n input.wrap(\"
    \");\n uploadButton.prependTo(input.parent());\n\n if (!options.async.saveUrl) {\n input.closest(\".k-upload\").addClass(\"k-upload-sync\");\n } else {\n input.closest(\".k-upload\").addClass(\"k-upload-async\");\n }\n\n input.closest(\".k-upload\").addClass(\"k-upload-empty\");\n\n if (!hasLabel && !input.attr(\"aria-label\")) {\n input.attr(\"aria-label\", selectText);\n }\n\n input.attr({\n tabindex: -1,\n \"aria-hidden\": true\n });\n\n return input.closest(\".k-upload\");\n },\n\n _checkAllComplete: function() {\n if ($(\".k-file.k-file-progress\", this.wrapper).length === 0) {\n this.trigger(COMPLETE);\n }\n },\n\n _inputFiles: function(sourceInput) {\n return inputFiles(sourceInput);\n }\n });\n\n // Synchronous upload module\n var syncUploadModule = function(upload) {\n this.name = \"syncUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.element\n .closest(\"form\")\n .attr(\"enctype\", \"multipart/form-data\")\n .attr(\"encoding\", \"multipart/form-data\");\n };\n\n syncUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var sourceInput = $(e.target);\n var filesContainErrors = upload._filesContainValidationErrors(files);\n\n upload._addInput(sourceInput);\n\n var fileData = { \"fileNames\": files };\n\n if (filesContainErrors) {\n sourceInput.remove();\n } else {\n fileData.relatedInput = sourceInput;\n }\n\n var file = upload._enqueueFile(getFileName(sourceInput), fileData);\n\n if (filesContainErrors) {\n upload._hideUploadProgress(file);\n }\n\n upload._fileAction(file, REMOVE);\n },\n\n onRemove: function(e) {\n var fileEntry = getFileEntry(e);\n var relatedInput = fileEntry.data(\"relatedInput\");\n\n if (relatedInput) {\n relatedInput.remove();\n }\n\n this.upload._removeFileEntry(fileEntry);\n }\n };\n\n var iframeUploadModule = function(upload) {\n this.name = \"iframeUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.iframes = [];\n };\n\n Upload._frameId = 0;\n\n iframeUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var sourceInput = $(e.target);\n var hasValidationErrors = upload._filesContainValidationErrors(files);\n\n var fileEntry = this.prepareUpload(sourceInput, files, hasValidationErrors);\n\n if (upload.options.async.autoUpload) {\n if (!hasValidationErrors) {\n this.performUpload(fileEntry);\n } else {\n upload._fileAction(fileEntry, REMOVE);\n upload._showHeaderUploadStatus(false);\n }\n } else {\n upload._fileAction(fileEntry, REMOVE);\n\n if (!hasValidationErrors) {\n upload._showActionButtons();\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n\n if (hasValidationErrors) {\n upload._hideUploadProgress(fileEntry);\n }\n },\n\n prepareUpload: function(sourceInput, files, hasValidationErrors) {\n var upload = this.upload;\n var activeInput = $(upload.element);\n var name = upload.options.async.saveField || sourceInput.attr(\"name\");\n var fileEntry, fileData, iframe, form;\n\n upload._addInput(sourceInput);\n sourceInput.attr(\"name\", name);\n\n if (!hasValidationErrors) {\n iframe = this.createFrame(upload.name + \"_\" + Upload._frameId++);\n this.registerFrame(iframe);\n\n form = this.createForm(upload.options.async.saveUrl, iframe.attr(\"name\"))\n .append(activeInput);\n\n fileData = { \"frame\": iframe, \"relatedInput\": activeInput, \"fileNames\": files };\n } else {\n sourceInput.remove();\n\n fileData = { \"fileNames\": files };\n }\n\n fileEntry = upload._enqueueFile(getFileName(sourceInput), fileData);\n\n if (iframe) {\n iframe.data({ \"form\": form, \"file\": fileEntry });\n }\n\n return fileEntry;\n },\n\n performUpload: function(fileEntry) {\n var e = { files: fileEntry.data(\"fileNames\") };\n var iframe = fileEntry.data(\"frame\");\n var upload = this.upload;\n var fileValidation = fileEntry.find('.k-file-validation-message');\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n if (!upload.trigger(UPLOAD, e)) {\n upload._hideActionButtons();\n upload._showHeaderUploadStatus(true);\n\n iframe.appendTo(document.body);\n\n var form = iframe.data(\"form\")\n .attr(\"action\", upload.options.async.saveUrl)\n .appendTo(document.body);\n\n e.data = $.extend({ }, e.data, antiForgeryTokens());\n for (var key in e.data) {\n var dataInput = form.find(\"input[name='\" + key + \"']\");\n if (dataInput.length === 0) {\n dataInput = $(\"\", { type: \"hidden\", name: key })\n .prependTo(form);\n }\n dataInput.val(e.data[key]);\n }\n\n upload._fileAction(fileEntry, CANCEL);\n upload._fileState(fileEntry, \"uploading\");\n $(fileEntry).removeClass(\"k-file-error\").addClass(\"k-file-progress\");\n\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\n }\n\n iframe\n .one(\"load\", this.onIframeLoad.bind(this));\n\n form[0].submit();\n } else {\n upload._removeFileEntry(iframe.data(\"file\"));\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n }\n },\n\n onSaveSelected: function() {\n var module = this;\n var upload = module.upload;\n\n $(\".k-file\", this.element).each(function() {\n var fileEntry = $(this);\n var started = isFileUploadStarted(fileEntry);\n var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data(\"fileNames\"));\n\n if (!started && !hasValidationErrors) {\n module.performUpload(fileEntry);\n }\n });\n },\n\n onIframeLoad: function(e) {\n var iframe = $(e.target),\n responseText;\n\n try {\n responseText = iframe.contents().text();\n } catch (ex) {\n responseText = \"Error trying to get server response: \" + ex;\n }\n\n this.processResponse(iframe, responseText);\n },\n\n processResponse: function(iframe, responseText) {\n var fileEntry = iframe.data(\"file\"),\n module = this,\n fakeXHR = {\n responseText: responseText\n };\n tryParseJSON(responseText,\n function(jsonResult) {\n $.extend(fakeXHR, { statusText: \"OK\", status: \"200\" });\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, fakeXHR);\n\n module.cleanupFrame(iframe);\n module.unregisterFrame(iframe);\n },\n function() {\n $.extend(fakeXHR, { statusText: \"error\", status: \"500\" });\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, fakeXHR);\n }\n );\n },\n\n onCancel: function(e) {\n var iframe = $(e.target).data(\"frame\");\n\n this.stopFrameSubmit(iframe);\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n this.upload._removeFileEntry(iframe.data(\"file\"));\n },\n\n onRetry: function(e) {\n var fileEntry = getFileEntry(e);\n this.performUpload(fileEntry);\n },\n\n onRemove: function(e, eventArgs, shouldSendRemoveRequest) {\n var module = this;\n var upload = module.upload;\n var fileEntry = getFileEntry(e);\n var iframe = fileEntry.data(\"frame\");\n\n if (iframe) {\n module.unregisterFrame(iframe);\n upload._removeFileEntry(fileEntry);\n module.cleanupFrame(iframe);\n } else {\n if (fileEntry.hasClass(\"k-file-success\")) {\n removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n } else {\n upload._removeFileEntry(fileEntry);\n }\n }\n },\n\n onAbort: function() {\n var element = this.element,\n module = this;\n\n $.each(this.iframes, function() {\n $(\"input\", this.data(\"form\")).appendTo(element);\n module.stopFrameSubmit(this[0]);\n this.data(\"form\").remove();\n this.remove();\n });\n\n this.iframes = [];\n },\n\n createFrame: function(id) {\n return $(\n \"\"\n ).hide();\n },\n\n createForm: function(action, target) {\n return $(\n \"
    \");\n },\n\n stopFrameSubmit: function(frame) {\n if (typeof(frame.stop) != \"undefined\") {\n frame.stop();\n } else if (frame.document) {\n frame.document.execCommand(\"Stop\");\n }\n },\n\n registerFrame: function(frame) {\n this.iframes.push(frame);\n },\n\n unregisterFrame: function(frame) {\n this.iframes = $.grep(this.iframes, function(value) {\n return value.attr(\"name\") != frame.attr(\"name\");\n });\n },\n\n cleanupFrame: function(frame) {\n var form = frame.data(\"form\");\n\n frame.data(\"file\").data(\"frame\", null);\n\n setTimeout(function() {\n form.remove();\n frame.remove();\n }, 1);\n }\n };\n\n // FormData upload module\n var formDataUploadModule = function(upload) {\n this.name = \"formDataUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.position = {};\n this.metaData = {};\n this.cancelled = {};\n this.resume = {};\n this.paused = {};\n this.retries = {};\n };\n\n formDataUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var module = this;\n var sourceElement = $(e.target);\n var fileEntries = this.prepareUpload(sourceElement, files);\n var hasValidationErrors;\n var prev;\n\n $.each(fileEntries, function(index) {\n hasValidationErrors = upload._filesContainValidationErrors($(this.data(\"fileNames\")));\n\n if (upload.options.async.autoUpload) {\n if (!hasValidationErrors) {\n if (upload.options.async.chunkSize) {\n module.prepareChunk(this);\n prev = this.prev();\n\n if (upload.options.async.concurrent || (index === 0 && !prev.length) ||\n (index === 0 && prev.hasClass(\"k-file-success\"))) {\n module.performUpload(this);\n }\n } else {\n module.performUpload(this);\n }\n } else {\n upload._fileAction(this, REMOVE);\n upload._showHeaderUploadStatus(false);\n }\n } else {\n upload._fileAction(this, REMOVE);\n\n if (!hasValidationErrors) {\n upload._showActionButtons();\n this.addClass(\"k-toupload\");\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n\n if (hasValidationErrors) {\n upload._hideUploadProgress(this);\n }\n });\n },\n\n prepareUpload: function(sourceElement, files) {\n var fileEntries = this.enqueueFiles(files);\n\n if (sourceElement.is(\"input\")) {\n $.each(fileEntries, function() {\n $(this).data(\"relatedInput\", sourceElement);\n });\n sourceElement.data(\"relatedFileEntries\", fileEntries);\n this.upload._addInput(sourceElement);\n }\n\n return fileEntries;\n },\n\n enqueueFiles: function(files) {\n var upload = this.upload;\n var name;\n var i;\n var filesLength = files.length;\n var currentFile;\n var fileEntry;\n var fileEntries = [];\n\n if (upload.options.async.batch === true) {\n name = $.map(files, function(file) { return file.name; }).join(\", \");\n\n if (upload.directory || upload.options.directoryDrop) {\n $(files).each(function() {\n if (this.rawFile.webkitRelativePath || this.rawFile.relativePath) {\n this.name = this.rawFile.webkitRelativePath || this.rawFile.relativePath;\n }\n });\n }\n\n fileEntry = upload._enqueueFile(name, { fileNames: files });\n fileEntry.data(\"files\", files);\n\n fileEntries.push(fileEntry);\n } else {\n for (i = 0; i < filesLength; i++) {\n currentFile = files[i];\n name = currentFile.name;\n if (upload.directory || upload.options.directoryDrop) {\n if (currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath) {\n currentFile.name = currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath;\n }\n }\n fileEntry = upload._enqueueFile(name, { fileNames: [currentFile] });\n fileEntry.data(\"files\", [currentFile]);\n\n fileEntries.push(fileEntry);\n }\n }\n\n return fileEntries;\n },\n\n performUpload: function(fileEntry) {\n var upload = this.upload,\n formData = this.createFormData(),\n xhr = this.createXHR(),\n e = {\n files: fileEntry.data(\"fileNames\"),\n XMLHttpRequest: xhr\n },\n files;\n var fileValidation = fileEntry.find('.k-file-validation-message');\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n if (!upload.trigger(UPLOAD, e)) {\n if (fileEntry.find(\".k-i-cancel,.k-svg-i-cancel\").length === 0) {\n if (upload.options.async.chunkSize) {\n upload._fileAction(fileEntry, PAUSE);\n }\n upload._fileAction(fileEntry, CANCEL, upload.options.async.chunkSize);\n }\n\n if (!upload.wrapper.find(\".k-toupload\").length) {\n upload._hideActionButtons();\n }\n\n upload._showHeaderUploadStatus(true);\n\n if (e.formData) {\n formData = e.formData;\n } else {\n e.data = $.extend({ }, e.data, antiForgeryTokens());\n for (var key in e.data) {\n formData.append(key, e.data[key]);\n }\n\n files = fileEntry.data(\"files\");\n if (files) {\n this.populateFormData(formData, files);\n }\n }\n\n upload._fileState(fileEntry, \"uploading\");\n $(fileEntry).removeClass(\"k-file-error\").addClass(\"k-file-progress\");\n\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\n }\n\n if (upload.options.async.useArrayBuffer && window.FileReader) {\n this._readFile(upload.options.async.saveUrl, formData, fileEntry, xhr);\n } else {\n this.postFormData(upload.options.async.saveUrl, formData, fileEntry, xhr);\n }\n } else {\n this.removeFileEntry(fileEntry);\n }\n },\n\n _readFile: function(saveUrl, formData, fileEntry, xhr) {\n var that = this;\n var upload = that.upload;\n var file = fileEntry.data(\"files\")[0];\n\n var reader = new FileReader();\n reader.onload = function(e) {\n try {\n if (!that.fileArrayBuffer) {\n that.fileArrayBuffer = e.target.result;\n } else {\n that.fileArrayBuffer = that._appendBuffer(that.fileArrayBuffer, e.target.result);\n }\n } catch (err) {\n upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n return;\n }\n\n if (that.position[file.uid] > file.size) {\n that.postFormData(upload.options.async.saveUrl, that.fileArrayBuffer, fileEntry, xhr);\n that.fileArrayBuffer = null;\n } else {\n that._readFile(saveUrl, formData, fileEntry, xhr);\n }\n };\n reader.onerror = function() {\n upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n };\n reader.readAsArrayBuffer(that._getCurrentChunk(file.rawFile, file.uid));\n },\n\n _appendBuffer: function(buffer1, buffer2) {\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n\n return tmp.buffer;\n },\n\n onSaveSelected: function() {\n var module = this;\n var upload = module.upload;\n\n $(\".k-toupload\", this.element).filter(function() {\n var fileEntry = $(this);\n var started = isFileUploadStarted(fileEntry);\n var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data(\"fileNames\"));\n\n return !started && !hasValidationErrors;\n }).each(function(index) {\n var fileEntry = $(this);\n var prevEntry = fileEntry.prev();\n\n fileEntry.removeClass(\"k-toupload\");\n if (upload.options.async.chunkSize) {\n module.prepareChunk(fileEntry);\n\n if (upload.options.async.concurrent || (index === 0 && !prevEntry.length) ||\n (index === 0 && prevEntry.hasClass(\"k-file-success\") || prevEntry.hasClass(\"k-file-error:not(k-file-invalid)\"))) {\n module.performUpload(fileEntry);\n }\n } else {\n module.performUpload(fileEntry);\n }\n });\n },\n\n onCancel: function(e) {\n var fileEntry = getFileEntry(e);\n\n if (this.upload.options.async.chunkSize) {\n this.cancelled[fileEntry.data(\"uid\")] = true;\n }\n this.stopUploadRequest(fileEntry);\n this.removeFileEntry(fileEntry);\n },\n\n onPause: function(e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileUid] = async.maxAutoRetries + 1;\n this.paused[fileUid] = true;\n this.resume[fileUid] = false;\n }\n },\n\n onResume: function(e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n\n if (this.upload.options.async.chunkSize) {\n delete this.paused[fileUid];\n this.resume[fileUid] = true;\n this.retries[fileEntry.data(\"uid\")] = 1;\n this._increaseChunkIndex(fileUid);\n this.performUpload(fileEntry);\n }\n },\n\n onRetry: function(e) {\n var fileEntry = getFileEntry(e);\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileEntry.data(\"uid\")] = async.maxAutoRetries + 1;\n delete this.paused[fileEntry.data(\"uid\")];\n }\n\n this.performUpload(fileEntry);\n },\n\n onRemove: function(e, eventArgs, shouldSendRemoveRequest) {\n var module = this;\n var upload = module.upload;\n var fileEntry = getFileEntry(e);\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileEntry.data(\"uid\")] = async.maxAutoRetries + 1;\n }\n\n if (fileEntry.hasClass(\"k-file-success\")) {\n removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n } else {\n module.removeFileEntry(fileEntry);\n }\n },\n\n createXHR: function() {\n return new XMLHttpRequest();\n },\n\n postFormData: function(url, data, fileEntry, xhr) {\n var module = this;\n\n fileEntry.data(\"request\", xhr);\n\n xhr.addEventListener(\"load\", function(e) {\n module.onRequestSuccess.call(module, e, fileEntry);\n }, false);\n\n xhr.addEventListener(ERROR, function(e) {\n module.onRequestError.call(module, e, fileEntry);\n }, false);\n\n xhr.upload.addEventListener(\"progress\", function(e) {\n module.onRequestProgress.call(module, e, fileEntry);\n }, false);\n\n xhr.open(\"POST\", url, true);\n xhr.withCredentials = this.upload.options.async.withCredentials;\n\n var accept = this.upload.options.async.accept;\n if (accept) {\n xhr.setRequestHeader(\"Accept\", accept);\n }\n\n xhr.send(data);\n },\n\n createFormData: function() {\n return new FormData();\n },\n\n populateFormData: function(data, files) {\n var chunk;\n var i;\n var length = files.length;\n var uid;\n var upload = this.upload;\n\n if (upload.options.async.chunkSize) {\n uid = files[0].uid;\n chunk = this._getCurrentChunk(files[0].rawFile, uid);\n\n data.append(\n upload.options.async.saveField || upload.name,\n chunk\n );\n\n var serializedMetaData = JSON.stringify(this.metaData[uid]);\n data.append(\"metadata\", serializedMetaData);\n } else {\n for (i = 0; i < length; i++) {\n data.append(\n upload.options.async.saveField || upload.name,\n files[i].rawFile\n );\n }\n }\n\n return data;\n },\n\n onRequestSuccess: function(e, fileEntry) {\n var xhr = e.target,\n module = this;\n\n function raiseError() {\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, xhr);\n }\n\n function parseSuccess(jsonResult) {\n var batch = module.upload.options.async.batch;\n var chunkSize = module.upload.options.async.chunkSize;\n var concurrent = module.upload.options.async.concurrent;\n var fileUid = jsonResult.fileUid;\n\n if (module.paused[fileUid] || module.cancelled[fileUid]) {\n return;\n }\n\n delete module.retries[fileUid];\n\n if (chunkSize && !batch && !jsonResult.uploaded) {\n\n module._increaseChunkIndex(fileUid);\n module.performUpload(fileEntry);\n } else if (chunkSize && !batch && !concurrent && fileEntry.next().length && !fileEntry.next().hasClass(\"k-toupload\")) {\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module._resetChunkIndex(fileUid);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n\n module.performUpload(fileEntry.next());\n } else {\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n module.cleanupFileEntry(fileEntry);\n }\n }\n\n if (xhr.status >= 200 && xhr.status <= 299) {\n tryParseJSON(xhr.responseText,\n parseSuccess,\n raiseError\n );\n } else {\n raiseError();\n }\n },\n\n onRequestError: function(e, fileEntry) {\n var xhr = e.target;\n\n this.upload._onUploadError({ target: $(fileEntry, this.upload.wrapper) }, xhr);\n },\n\n cleanupFileEntry: function(fileEntry) {\n var relatedInput = fileEntry.data(\"relatedInput\"),\n uploadComplete = true;\n\n if (relatedInput) {\n $.each(relatedInput.data(\"relatedFileEntries\") || [], function() {\n // Exclude removed file entries and self\n if (this.parent().length > 0 && this[0] != fileEntry[0]) {\n uploadComplete = uploadComplete && this.hasClass(\"k-file-success\");\n }\n });\n\n if (uploadComplete) {\n relatedInput.remove();\n }\n }\n },\n\n removeFileEntry: function(fileEntry) {\n var chunkSize = this.upload.options.async.chunkSize;\n var concurrent = this.upload.options.async.concurrent;\n var isUploadButtonVisible = this.upload.wrapper.find(\".k-upload-selected\").length > 0;\n\n this.cleanupFileEntry(fileEntry);\n if (chunkSize && !concurrent && !isUploadButtonVisible) {\n if (fileEntry.next().length) {\n this.performUpload(fileEntry.next());\n }\n }\n this.upload._removeFileEntry(fileEntry);\n },\n\n onRequestProgress: function(e, fileEntry) {\n var percentComplete = Math.round(e.loaded * 100 / e.total);\n var fileUid = fileEntry.data(\"uid\");\n var fileMetaData;\n\n if (this.upload.options.async.chunkSize) {\n fileMetaData = this.metaData[fileUid];\n percentComplete = fileMetaData && fileMetaData.totalChunks ? Math.round(((fileMetaData.chunkIndex) / fileMetaData.totalChunks) * 100) : 100;\n }\n this.upload._onFileProgress({ target: $(fileEntry, this.upload.wrapper) }, percentComplete);\n },\n\n stopUploadRequest: function(fileEntry) {\n if (fileEntry.data(\"request\")) {\n fileEntry.data(\"request\").abort();\n }\n },\n\n prepareChunk: function(fileEntry) {\n var file = fileEntry.data(\"files\")[0];\n var rawFile = file.rawFile;\n var uid = file.uid;\n var chunkSize = this.upload.options.async.chunkSize;\n this.position[uid] = 0;\n\n this.metaData[uid] = {\n chunkIndex: 0,\n contentType: rawFile.type,\n fileName: rawFile.name,\n relativePath: file.name,\n totalFileSize: rawFile.size,\n totalChunks: Math.ceil(rawFile.size / chunkSize),\n uploadUid: uid\n };\n },\n\n _decreaseChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex--;\n },\n\n _increaseChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex++;\n },\n\n _resetChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex = 0;\n },\n\n _decreasePosition: function(uid) {\n this.position[uid] -= this.upload.options.async.chunkSize;\n },\n\n _getCurrentChunk: function(file, uid) {\n var oldPosition = this.position[uid];\n var methodToInvoke;\n var async = this.upload.options.async;\n var chunkSize = async.chunkSize || async.bufferChunkSize;\n\n if (!this.position[uid]) {\n this.position[uid] = 0;\n }\n this.position[uid] += chunkSize;\n\n if (!!(methodToInvoke = this._getChunker(file))) {\n return file[methodToInvoke](oldPosition, this.position[uid]);\n } else {\n return file;\n }\n },\n\n _getChunker: function(file) {\n if (file.slice) {\n return \"slice\";\n } else if (file.mozSlice) {\n return \"mozSlice\";\n } else if (file.webkitSlice) {\n return \"webkitSlice\";\n } else {\n return null;\n }\n }\n };\n\n // Helper functions\n function getFileName(input) {\n return $.map(inputFiles(input), function(file) {\n return file.name;\n }).join(\", \");\n }\n\n function inputFiles($input) {\n var input = $input[0];\n\n if (input.files) {\n return getAllFileInfo(input.files);\n } else {\n return [{\n name: stripPath(input.value),\n extension: getFileExtension(input.value),\n size: null\n }];\n }\n }\n\n function getAllFileInfo(rawFiles) {\n return $.map(rawFiles, function(file) {\n return getFileInfo(file);\n });\n }\n\n function getFileInfo(rawFile) {\n // Older Firefox versions (before 3.6) use fileName and fileSize\n var fileName = rawFile.name || rawFile.fileName;\n return {\n name: kendo.htmlEncode(fileName),\n extension: getFileExtension(fileName),\n size: typeof rawFile.size == \"number\" ? rawFile.size : rawFile.fileSize, //rawFile.size || rawFile.fileSize,\n rawFile: rawFile\n };\n }\n\n function getFileExtension(fileName) {\n var matches = fileName.match(rFileExtension);\n return matches ? matches[0] : \"\";\n }\n\n function stripPath(name) {\n var slashIndex = name.lastIndexOf(\"\\\\\");\n return (slashIndex != -1) ? name.substr(slashIndex + 1) : name;\n }\n\n function assignGuidToFiles(files, unique) {\n var uid = kendo.guid();\n\n return $.map(files, function(file) {\n file.uid = unique ? kendo.guid() : uid;\n\n return file;\n });\n }\n\n function validateFiles(files, validationInfo) {\n var allowedExtensions = parseAllowedExtensions(validationInfo.allowedExtensions);\n var maxFileSize = validationInfo.maxFileSize;\n var minFileSize = validationInfo.minFileSize;\n\n for (var i = 0; i < files.length; i++) {\n validateFileExtension(files[i], allowedExtensions);\n validateFileSize(files[i], minFileSize, maxFileSize);\n }\n }\n\n function parseAllowedExtensions(extensions) {\n var allowedExtensions = $.map(extensions, function(ext) {\n var parsedExt = (ext.substring(0, 1) === \".\") ? ext : (\".\" + ext);\n return parsedExt.toLowerCase();\n });\n\n return allowedExtensions;\n }\n\n function validateFileExtension(file, allowedExtensions) {\n if (allowedExtensions.length > 0) {\n if (allowedExtensions.indexOf(file.extension.toLowerCase()) < 0) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDFILEEXTENSION, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDFILEEXTENSION);\n }\n }\n }\n }\n\n function validateFileSize(file, minFileSize, maxFileSize) {\n if (minFileSize !== 0 && file.size < minFileSize) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDMINFILESIZE, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDMINFILESIZE);\n }\n }\n\n if (maxFileSize !== 0 && file.size > maxFileSize) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDMAXFILESIZE, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDMAXFILESIZE);\n }\n }\n }\n\n function getTotalFilesSizeMessage(files) {\n var totalSize = 0;\n\n if (typeof files[0].size == \"number\") {\n for (var i = 0; i < files.length; i++) {\n if (files[i].size) {\n totalSize += files[i].size;\n }\n }\n } else {\n return \"\";\n }\n\n totalSize /= 1024;\n\n if (totalSize < 1024) {\n return totalSize.toFixed(2) + \" KB\";\n } else {\n return (totalSize / 1024).toFixed(2) + \" MB\";\n }\n }\n\n function shouldRemoveFileEntry(upload) {\n return !upload.multiple && $(\".k-file\", upload.wrapper).length > 1;\n }\n\n function removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest) {\n if (!upload._supportsRemove()) {\n if (shouldRemoveFileEntry(upload) || !shouldSendRemoveRequest) {\n upload._removeFileEntry(fileEntry);\n }\n\n return;\n }\n\n var files = fileEntry.data(\"fileNames\");\n var fileNames = $.map(files, function(file) { return file.name; });\n\n if (shouldSendRemoveRequest === false) {\n upload._removeFileEntry(fileEntry);\n\n return;\n }\n\n upload._submitRemove(fileNames, eventArgs,\n function onSuccess(data, textStatus, xhr) {\n var prevented = upload.trigger(SUCCESS, {\n operation: \"remove\",\n files: files,\n response: data,\n XMLHttpRequest: xhr\n });\n\n if (!prevented) {\n upload._removeFileEntry(fileEntry);\n }\n },\n\n function onError(xhr) {\n if (shouldRemoveFileEntry(upload)) {\n upload._removeFileEntry(fileEntry);\n }\n\n upload.trigger(ERROR, {\n operation: \"remove\",\n files: files,\n XMLHttpRequest: xhr\n });\n\n logToConsole(\"Server response: \" + xhr.responseText);\n }\n );\n }\n\n function tryParseJSON(input, onSuccess, onError) {\n var success = false,\n json = \"\";\n\n try {\n json = JSON.parse(normalizeJSON(input));\n success = true;\n } catch (e) {\n onError();\n }\n\n if (success) {\n onSuccess(json);\n }\n }\n\n function normalizeJSON(input) {\n if (typeof input === \"undefined\" || input === \"\") {\n input = \"{}\";\n }\n\n return input;\n }\n\n function stopEvent(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.stopPropagation(); e.preventDefault();\n }\n\n function bindDragEventWrappers(element, namespace, onDragEnter, onDragLeave) {\n var hideInterval, lastDrag;\n\n element\n .on(\"dragenter\" + namespace, function(e) {\n onDragEnter(e);\n lastDrag = new Date();\n\n if (!hideInterval) {\n hideInterval = setInterval(function() {\n var sinceLastDrag = new Date() - lastDrag;\n if (sinceLastDrag > 100) {\n onDragLeave();\n\n clearInterval(hideInterval);\n hideInterval = null;\n }\n }, 100);\n }\n })\n .on(\"dragover\" + namespace, function() {\n lastDrag = new Date();\n });\n }\n\n function isFileUploadStarted(fileEntry) {\n return fileEntry.is(\".k-file-progress, .k-file-success, .k-file-error:not(.k-file-invalid)\");\n }\n\n function getFileEntry(e) {\n return $(e.target).closest(\".k-file\");\n }\n\n kendo.ui.plugin(Upload);\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}