{"version":3,"sources":["kendo.upload.js"],"names":["f","define","$","undefined","getFileName","input","map","inputFiles","file","name","join","$input","files","getAllFileInfo","stripPath","value","extension","getFileExtension","size","rawFiles","getFileInfo","rawFile","fileName","kendo","htmlEncode","fileSize","matches","match","rFileExtension","slashIndex","lastIndexOf","substr","assignGuidToFiles","unique","uid","guid","validateFiles","validationInfo","i","allowedExtensions","parseAllowedExtensions","maxFileSize","minFileSize","length","validateFileExtension","validateFileSize","extensions","ext","parsedExt","substring","toLowerCase","indexOf","validationErrors","inArray","INVALIDFILEEXTENSION","push","INVALIDMINFILESIZE","INVALIDMAXFILESIZE","getTotalFilesSizeMessage","totalSize","toFixed","shouldRemoveFileEntry","upload","multiple","wrapper","removeUploadedFile","fileEntry","eventArgs","shouldSendRemoveRequest","fileNames","_supportsRemove","data","_removeFileEntry","_submitRemove","textStatus","xhr","prevented","trigger","SUCCESS","operation","response","XMLHttpRequest","ERROR","logToConsole","responseText","tryParseJSON","onSuccess","onError","success","json","parseJSON","normalizeJSON","e","stopEvent","originalEvent","dataTransfer","dropEffect","stopPropagation","preventDefault","bindDragEventWrappers","element","namespace","onDragEnter","onDragLeave","hideInterval","lastDrag","on","Date","setInterval","sinceLastDrag","clearInterval","isFileUploadStarted","is","getFileEntry","target","closest","iframeUploadModule","formDataUploadModule","window","Widget","ui","antiForgeryTokens","NS","SELECT","UPLOAD","COMPLETE","CANCEL","CLEAR","PAUSE","RESUME","PROGRESS","REMOVE","VALIDATIONERRORS","PROGRESSHIDEDELAY","PROGRESSHIDEDURATION","FOCUS_STATE","TABINDEX","headerStatusIcon","loading","warning","Upload","extend","init","options","activeInput","ns","that","this","fn","call","directory","localization","_wrapInput","_activeInput","toggle","enabled","_ns","proxy","_onParentFormSubmit","_onParentFormReset","_initUploadModule","_toggleDropZone","_onFileAction","_onClearSelected","_onUploadSelected","_onKeyDown","_focusout","val","_onInputChange","events","showFileList","template","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","dropZone","initialFiles","saveUrl","_module","_supportsFormData","_async","_renderInitialFiles","syncUploadModule","setOptions","off","attr","_supportsMultiple","enable","disable","toggleClass","prop","focus","destroy","customDropZone","document","add","onPause","pauseIcon","find","removeClass","addClass","parent","onResume","playIcon","onSaveSelected","getFiles","filesData","j","allFiles","listItems","clearAllFiles","each","index","_removeFileByDomElement","removeAllFiles","removeFileByUid","_removeFileByUid","clearFileByUid","clearFile","callback","_removeFile","removeFile","fileData","hasClass","onCancel","onRemove","_hideHeaderUploadstatus","_updateHeaderUploadStatus","_addInput","sourceInput","nodeType","clone","insertAfter","prefix","hide","removeAttr","_adjustFocusState","focusedItem","toFocus","_arrowKeyNavigation","key","kendoKeys","keys","DOWN","next","UP","prev","RIGHT","LEFT","_preventFocusRemove","_asyncCommandKeyNavigation","_retryClicked","ESC","_checkAllComplete","SPACEBAR","ENTER","chunkSize","concurrent","finish","show","metaData","prepareChunk","onRetry","_commandKeyNavigation","hasValidationErrors","_filesContainValidationErrors","headers","DELETE","TAB","commandKeys","keyCode","_inputFiles","_isAsyncNonBatch","onSelect","_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","entry","dt","droppedFiles","directoryDrop","webkitGetAsEntry","splice","hasErrors","batch","currentFile","idx","_enqueueFile","_fileAction","_prepareTemplateData","templateData","_prepareDefaultSingleFileEntryTemplate","fileGroup","getFileGroup","errors","_prepareDefaultMultipleFileEntriesTemplate","filesHaveValidationErrors","totalFileSize","sort","a","b","existingFileEntries","removeEventArgs","fileUid","fileList","appendTo","angular","elements","width","allCompletedFiles","allInvalidFiles","_hideActionButtons","fileElement","actionKey","skipClear","firstActionButton","classDictionary","iconsClassDictionary","hasOwnProperty","_clearFileAction","first","append","_renderAction","_fileState","stateKey","states","uploading","text","uploaded","failed","currentState","actionClass","actionText","iconClass","empty","button","icon","clearEventArgs","_onFileProgress","percentComplete","progressPct","prepend","_onUploadSuccess","fileInfo","_setUploadErrorState","after","_hideUploadProgress","_onUploadError","module","_decreasePosition","_autoRetryAfter","retries","performUpload","uploadPercentage","_updateUploadProgress","fileMetaData","totalChunks","Math","round","chunkIndex","delay","fadeOut","css","_showActionButtons","actionsWrapper","uploadButton","clearButton","_showHeaderUploadStatus","isUploading","headerUploadStatus","failedUploads","headerUploadStatusIcon","currentlyUploading","not","currentlyInvalid","currentlyFailed","currentlyPaused","html","onAbort","FormData","windows","_userAgent","support","browser","opera","safari","_supportsDrop","userAgent","isChrome","test","isSafari","isWindowsSafari","navigator","_setupDropZone","_bindDocumentDragEventWrappers","_setupCustomDropZone","removeUrl","removeField","params","jQuery","ajax","type","dataType","dataFilter","url","traditional","error","xhrFields","hasLabel","wrap","prototype","filesContainErrors","relatedInput","iframes","_frameId","prepareUpload","iframe","form","saveField","createFrame","registerFrame","createForm","frame","dataInput","fileValidation","cleanupFrame","unregisterFrame","body","prependTo","one","onIframeLoad","submit","started","contents","ex","processResponse","fakeXHR","jsonResult","statusText","status","stopFrameSubmit","id","action","stop","execCommand","grep","position","cancelled","paused","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","chunk","serializedMetaData","JSON","stringify","raiseError","parseSuccess","cleanupFileEntry","_resetChunkIndex","uploadComplete","isUploadButtonVisible","loaded","total","abort","contentType","ceil","uploadUid","_decreaseChunkIndex","methodToInvoke","oldPosition","_getChunker","mozSlice","webkitSlice","plugin","amd","a1","a2","a3"],"mappings":"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","file":"kendo.upload.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('kendo.upload', ['kendo.core'], f);\n}(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']\n };\n (function ($, undefined) {\n var kendo = window.kendo, Widget = kendo.ui.Widget, antiForgeryTokens = kendo.antiForgeryTokens, logToConsole = kendo.logToConsole, rFileExtension = /\\.([^\\.]+)$/, NS = '.kendoUpload', SELECT = 'select', UPLOAD = 'upload', SUCCESS = 'success', ERROR = 'error', COMPLETE = 'complete', CANCEL = 'cancel', CLEAR = 'clear', PAUSE = 'pause', RESUME = 'resume', PROGRESS = 'progress', REMOVE = 'remove', VALIDATIONERRORS = 'validationErrors', INVALIDMAXFILESIZE = 'invalidMaxFileSize', INVALIDMINFILESIZE = 'invalidMinFileSize', INVALIDFILEEXTENSION = 'invalidFileExtension', PROGRESSHIDEDELAY = 1000, PROGRESSHIDEDURATION = 2000, FOCUS_STATE = 'k-state-focused', TABINDEX = 'tabindex';\n var headerStatusIcon = {\n loading: 'k-i-upload',\n warning: 'k-i-warning',\n success: 'k-i-check'\n };\n var Upload = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.name = element.name;\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\n that.localization = that.options.localization;\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 that._activeInput(activeInput);\n that.toggle(that.options.enabled);\n var ns = that._ns = NS + '-' + kendo.guid();\n activeInput.closest('form').on('submit' + ns, $.proxy(that._onParentFormSubmit, that)).on('reset' + ns, $.proxy(that._onParentFormReset, that));\n that._initUploadModule();\n that._toggleDropZone();\n that.wrapper.on('click', '.k-upload-action', $.proxy(that._onFileAction, that)).on('click', '.k-clear-selected', $.proxy(that._onClearSelected, that)).on('click', '.k-upload-selected', $.proxy(that._onUploadSelected, that)).on('keydown', $.proxy(that._onKeyDown, that)).on('focusout', $.proxy(that._focusout, that));\n if (that.element.val()) {\n that._onInputChange({ target: that.element });\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 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 _initUploadModule: function () {\n var that = this, options = that.options;\n if (options.async.saveUrl) {\n that._module = that._supportsFormData() ? new formDataUploadModule(that) : new iframeUploadModule(that);\n that._async = true;\n var initialFiles = options.files;\n if (initialFiles.length > 0) {\n that._renderInitialFiles(initialFiles);\n }\n } else {\n that._module = new syncUploadModule(that);\n }\n },\n setOptions: function (options) {\n var that = this, activeInput = that.element;\n $(that.options.dropZone).off(that._ns);\n Widget.fn.setOptions.call(that, options);\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\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 that._initUploadModule();\n that._toggleDropZone();\n },\n enable: function (enable) {\n enable = typeof enable === 'undefined' ? true : enable;\n this.toggle(enable);\n },\n disable: function () {\n this.toggle(false);\n },\n toggle: function (enable) {\n enable = typeof enable === 'undefined' ? enable : !enable;\n this.wrapper.toggleClass('k-state-disabled', enable);\n this.element.prop('disabled', enable);\n },\n focus: function () {\n this.element.focus();\n },\n destroy: function () {\n var that = this;\n var customDropZone = $(that.options.dropZone);\n $(document).add($('.k-dropzone', that.wrapper)).add(that.wrapper.closest('form')).off(that._ns);\n if (customDropZone.length > 0) {\n customDropZone.off(that._ns);\n }\n $(that.element).off(NS);\n Widget.fn.destroy.call(that);\n },\n pause: function (fileEntry) {\n this._module.onPause({ target: $(fileEntry, this.wrapper) });\n var pauseIcon = fileEntry.find('.k-i-pause-sm');\n pauseIcon.removeClass('k-i-pause-sm').addClass('k-i-play-sm').attr('title', this.localization.resume);\n $(pauseIcon).parent().attr('aria-label', this.localization.resume);\n },\n resume: function (fileEntry) {\n this._module.onResume({ target: $(fileEntry, this.wrapper) });\n var playIcon = fileEntry.find('.k-i-play-sm');\n playIcon.removeClass('k-i-play-sm').addClass('k-i-pause-sm').attr('title', this.localization.pause);\n $(playIcon).parent().attr('aria-label', this.localization.pause);\n },\n upload: function () {\n var that = this;\n that._module.onSaveSelected();\n },\n getFiles: function () {\n var that = this;\n var filesData;\n var allFiles = [];\n var listItems = that.wrapper.find('.k-file');\n for (var i = 0; i < listItems.length; i++) {\n filesData = $(listItems[i]).data('fileNames');\n if (filesData) {\n for (var j = 0; j < filesData.length; j++) {\n allFiles.push(filesData[j]);\n }\n }\n }\n return allFiles;\n },\n clearAllFiles: function () {\n var that = this;\n var files = that.wrapper.find('.k-file');\n files.each(function (index, file) {\n that._removeFileByDomElement(file, false);\n });\n },\n removeAllFiles: function () {\n var that = this;\n var files = that.wrapper.find('.k-file');\n files.each(function (index, file) {\n that._removeFileByDomElement(file, true);\n });\n },\n removeFileByUid: function (uid) {\n this._removeFileByUid(uid, true);\n },\n clearFileByUid: function (uid) {\n this._removeFileByUid(uid, false);\n },\n _removeFileByUid: function (uid, shouldSendRemoveRequest) {\n var that = this;\n var fileEntry;\n if (typeof uid !== 'string') {\n return;\n }\n fileEntry = $('.k-file[' + kendo.attr('uid') + '=\"' + uid + '\"]', that.wrapper);\n if (fileEntry.length > 0) {\n that._removeFileByDomElement(fileEntry, shouldSendRemoveRequest);\n }\n },\n clearFile: function (callback) {\n this._removeFile(callback, false);\n },\n removeFile: function (callback) {\n this._removeFile(callback, true);\n },\n _removeFile: function (callback, shouldSendRemoveRequest) {\n var that = this;\n var files = that.wrapper.find('.k-file');\n var fileData;\n if (typeof callback === 'function') {\n files.each(function (index, file) {\n fileData = $(file).data('fileNames');\n if (callback(fileData)) {\n that._removeFileByDomElement(file, shouldSendRemoveRequest);\n }\n });\n }\n },\n _removeFileByDomElement: function (fileEntry, shouldSendRemoveRequest) {\n var that = this;\n var fileData = { target: $(fileEntry, that.wrapper) };\n var allFiles;\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 allFiles = $('.k-file', that.wrapper);\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 _addInput: function (sourceInput) {\n if (!sourceInput[0].nodeType) {\n return;\n }\n var that = this, input = sourceInput.clone().val('');\n input.insertAfter(that.element).data('kendo' + that.options.prefix + that.options.name, that);\n $(that.element).hide().attr(TABINDEX, '-1').removeAttr('id').off(NS);\n that._activeInput(input);\n that.element.focus();\n },\n _activeInput: function (input) {\n var that = this, wrapper = that.wrapper;\n that.element = input;\n if (that.directory) {\n input.attr('webkitdirectory', that.directory);\n input.attr('directory', that.directory);\n }\n input.attr('multiple', that._supportsMultiple() ? that.multiple : false).attr('autocomplete', 'off').on('click' + NS, function (e) {\n if (wrapper.hasClass('k-state-disabled')) {\n e.preventDefault();\n }\n }).on('focus' + NS, function () {\n $(this).parent().addClass(FOCUS_STATE);\n }).on('blur' + NS, function () {\n $(this).parent().removeClass(FOCUS_STATE);\n }).on('change' + NS, $.proxy(that._onInputChange, that));\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 _arrowKeyNavigation: function (key, focusedItem) {\n var that = this, kendoKeys = kendo.keys, toFocus;\n if (key === kendoKeys.DOWN) {\n toFocus = that.wrapper.find('.k-upload-files .k-file:first');\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 toFocus = focusedItem.next();\n }\n that._adjustFocusState(focusedItem, toFocus);\n if (!toFocus || toFocus.length === 0) {\n toFocus = that.wrapper.find('.k-clear-selected');\n }\n } else if (key === kendoKeys.UP) {\n toFocus = that.wrapper.find('.k-upload-files .k-file:last');\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 toFocus = focusedItem.prev();\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 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 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 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 if (toFocus && toFocus.length > 0) {\n focusedItem.removeClass(FOCUS_STATE);\n toFocus.addClass(FOCUS_STATE);\n }\n }\n if ((!toFocus || toFocus.length === 0) && (key === kendoKeys.UP || key === kendoKeys.DOWN)) {\n toFocus = that.element;\n }\n if (toFocus && toFocus.length > 0) {\n that._preventFocusRemove = true;\n toFocus.focus();\n }\n },\n _asyncCommandKeyNavigation: function (key, focusedItem, eventArgs) {\n var that = this, kendoKeys = kendo.keys, fileEntry = $(focusedItem, that.wrapper);\n that._retryClicked = false;\n if (key === kendoKeys.ESC && focusedItem.find('.k-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.element.focus();\n } else if (key === kendoKeys.SPACEBAR) {\n if (focusedItem.find('.k-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').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 $('.k-i-warning', focusedItem).remove();\n $('.k-progressbar', focusedItem).finish().show();\n if (!that._module.metaData[fileEntry.data('uid')]) {\n that._module.prepareChunk(fileEntry);\n }\n that._module.onRetry({ target: fileEntry });\n that._retryClicked = true;\n }\n },\n _commandKeyNavigation: function (key, focusedItem) {\n var that = this, kendoKeys = kendo.keys, files = focusedItem.data('fileNames'), hasValidationErrors = that._filesContainValidationErrors(files), eventArgs = {\n files: files,\n headers: {}\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.element.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 _focusout: function () {\n var focusedItem = this.wrapper.find('.k-upload-files .k-file.' + FOCUS_STATE);\n if (!this._preventFocusRemove) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n } else {\n this._preventFocusRemove = false;\n }\n },\n _onKeyDown: function (e) {\n var that = this, focusedItem = that.wrapper.find('.k-upload-files .k-file.' + FOCUS_STATE + ',' + '.k-upload-action.' + FOCUS_STATE), kendoKeys = kendo.keys, commandKeys = [\n kendoKeys.DELETE,\n kendoKeys.ESC,\n kendoKeys.ENTER,\n kendoKeys.SPACEBAR,\n kendoKeys.TAB\n ], key = e.keyCode;\n if (key === kendoKeys.DOWN || key === kendoKeys.UP || key === kendoKeys.LEFT || key === kendoKeys.RIGHT) {\n e.preventDefault();\n e.stopPropagation();\n that._arrowKeyNavigation(key, focusedItem);\n } else if (focusedItem.length > 0 && focusedItem.hasClass('k-file') && commandKeys.indexOf(key) > -1 && !that.wrapper.hasClass('k-state-disabled')) {\n if (key === kendoKeys.SPACEBAR) {\n e.preventDefault();\n e.stopPropagation();\n }\n that._commandKeyNavigation(key, focusedItem);\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 validateFiles(files, that.options.validation);\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 },\n _readDirectory: function (item) {\n var deferred = new $.Deferred();\n var dirReader = item.createReader();\n var allFolderFiles = [];\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 readEntries();\n return deferred.promise();\n },\n _readFile: function (item) {\n var that = this;\n var fullpath = item.fullPath;\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 _traverseFileTree: function (item, skipCounter) {\n var that = this;\n if (!skipCounter) {\n that.droppedFolderCounter--;\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 _onDrop: function (e) {\n var dt = e.originalEvent.dataTransfer;\n var that = this;\n var droppedFiles = dt.files;\n var length;\n stopEvent(e);\n if (that.options.directoryDrop && dt.items) {\n length = dt.items.length;\n that.droppedFolderCounter = 0;\n that.droppedFolderFiles = [];\n for (var i = 0; i < length; i++) {\n if (dt.items[i].webkitGetAsEntry) {\n var entry = dt.items[i].webkitGetAsEntry();\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 _proceedDroppedItems: function (droppedFiles) {\n var that = this;\n var files = assignGuidToFiles(getAllFileInfo(droppedFiles), that._isAsyncNonBatch());\n if (droppedFiles.length > 0 && !that.wrapper.hasClass('k-state-disabled')) {\n if (!that.multiple && files.length > 1) {\n files.splice(1, files.length - 1);\n }\n validateFiles(files, that.options.validation);\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 _filesContainValidationErrors: function (files) {\n var hasErrors = false;\n $(files).each(function (index, file) {\n if (file[VALIDATIONERRORS] && file[VALIDATIONERRORS].length > 0) {\n hasErrors = true;\n return false;\n }\n });\n return hasErrors;\n },\n _isAsyncNonBatch: function () {\n return this._async && !this.options.async.batch || false;\n },\n _renderInitialFiles: function (files) {\n var that = this;\n var idx = 0;\n files = assignGuidToFiles(files, true);\n for (idx = 0; idx < files.length; idx++) {\n var currentFile = files[idx];\n var fileEntry = that._enqueueFile(currentFile.name, { fileNames: [currentFile] });\n fileEntry.addClass('k-file-success').data('files', [files[idx]]);\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n }\n }\n },\n _prepareTemplateData: function (name, data) {\n var filesData = data.fileNames, templateData = {}, totalSize = 0, idx = 0;\n for (idx = 0; idx < filesData.length; idx++) {\n totalSize += filesData[idx].size;\n }\n templateData.name = name;\n templateData.size = totalSize;\n templateData.files = data.fileNames;\n return templateData;\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 template = '';\n if (errors && errors.length > 0) {\n template += '
  • ' + '' + '' + '' + '' + '' + '' + file.name + '' + '' + that.localization[errors[0]] + '' + '';\n } else {\n template += '
  • ' + '' + '' + '' + '' + '' + file.name + '' + '' + fileSize + '';\n }\n template += '';\n return $(template);\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 if (filesHaveValidationErrors) {\n template += '
  • ' + '' + '';\n } else {\n template += '
  • ' + '' + '';\n }\n template += '';\n files.sort(function (a, b) {\n if (a[VALIDATIONERRORS]) {\n return -1;\n }\n if (b[VALIDATIONERRORS]) {\n return 1;\n }\n return 0;\n });\n template += '';\n for (i = 0; i < files.length; i++) {\n currentFile = files[i];\n var fileSize = getTotalFilesSizeMessage([currentFile]);\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 if (filesHaveValidationErrors) {\n template += '' + that.localization.invalidFiles + '';\n } else {\n template += 'Total: ' + files.length + ' files, ' + totalFileSize + '';\n }\n template += '';\n return $(template);\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 if (fileList.length === 0) {\n fileList = $('').appendTo(that.wrapper);\n if (!that.options.showFileList) {\n fileList.hide();\n }\n that.wrapper.removeClass('k-upload-empty');\n }\n existingFileEntries = $('.k-file', fileList);\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 fileEntry = $('
  • ' + template(templateData) + '
  • ');\n fileEntry.find('.k-upload-action').addClass('k-button k-button-icon k-flat');\n that.angular('compile', function () {\n return {\n elements: fileEntry,\n data: [templateData]\n };\n });\n }\n fileEntry.attr(kendo.attr('uid'), fileUid).appendTo(fileList).data(data);\n if (!that._async) {\n $('.k-progress', fileEntry).width('100%');\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 return fileEntry;\n },\n _removeFileEntry: function (fileEntry) {\n var that = this;\n var fileList = fileEntry.closest('.k-upload-files');\n var allFiles, allCompletedFiles, allInvalidFiles;\n fileEntry.remove();\n allFiles = $('.k-file', fileList);\n allCompletedFiles = $('.k-file-success, .k-file-error', fileList);\n allInvalidFiles = $('.k-file-invalid', fileList);\n if (allCompletedFiles.length === allFiles.length || allInvalidFiles.length === allFiles.length) {\n this._hideActionButtons();\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 _fileAction: function (fileElement, actionKey, skipClear) {\n var classDictionary = {\n remove: 'k-i-x',\n cancel: 'k-i-cancel',\n retry: 'k-i-retry',\n pause: 'k-i-pause-sm'\n };\n var iconsClassDictionary = {\n remove: 'k-i-close',\n cancel: 'k-i-cancel',\n retry: 'k-i-reload-sm',\n pause: 'k-i-pause-sm'\n };\n var firstActionButton;\n if (!classDictionary.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-status .k-upload-action').remove();\n }\n fileElement.find('.k-upload-status').append(this._renderAction(classDictionary[actionKey], this.localization[actionKey], iconsClassDictionary[actionKey]));\n } else {\n firstActionButton = fileElement.find('.k-upload-action').first();\n if (!firstActionButton.find('.k-icon').length) {\n firstActionButton.addClass('k-button').append('').show();\n } else if (firstActionButton.next('.k-upload-action').length) {\n firstActionButton.next('.k-upload-action').addClass('k-button').append('').show();\n }\n }\n },\n _fileState: function (fileEntry, stateKey) {\n var localization = this.localization, states = {\n uploading: { text: localization.statusUploading },\n uploaded: { text: localization.statusUploaded },\n failed: { text: localization.statusFailed }\n }, currentState = states[stateKey];\n if (currentState) {\n $('span.k-file-state', fileEntry).text(currentState.text);\n }\n },\n _renderAction: function (actionClass, actionText, iconClass) {\n if (actionClass !== '') {\n return $('').on('focus', function () {\n $(this).addClass(FOCUS_STATE);\n }).on('blur', function () {\n $(this).removeClass(FOCUS_STATE);\n });\n } else {\n return $('');\n }\n },\n _clearFileAction: function (fileElement) {\n $('.k-upload-action', fileElement).empty().hide();\n },\n _onFileAction: function (e) {\n var that = this;\n if (!that.wrapper.hasClass('k-state-disabled')) {\n var button = $(e.target).closest('.k-upload-action');\n var icon = button.find('.k-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 that._retryClicked = false;\n if (icon.hasClass('k-i-x')) {\n if (!that.trigger(REMOVE, eventArgs)) {\n that._module.onRemove({ target: $(fileEntry, that.wrapper) }, eventArgs, !hasValidationErrors);\n that.element.focus();\n }\n } else if (icon.hasClass('k-i-cancel')) {\n that.trigger(CANCEL, eventArgs);\n that._module.onCancel({ target: $(fileEntry, that.wrapper) });\n that._checkAllComplete();\n that._updateHeaderUploadStatus();\n that.element.focus();\n } else if (icon.hasClass('k-i-pause-sm')) {\n that.trigger(PAUSE, eventArgs);\n that.pause(fileEntry);\n that._updateHeaderUploadStatus();\n } else if (icon.hasClass('k-i-play-sm')) {\n that.trigger(RESUME, eventArgs);\n that.resume(fileEntry);\n } else if (icon.hasClass('k-i-retry')) {\n $('.k-i-warning', fileEntry).remove();\n $('.k-progressbar', fileEntry).finish().show();\n that._module.onRetry({ target: $(fileEntry, that.wrapper) });\n that._retryClicked = true;\n }\n fileEntry.addClass(FOCUS_STATE);\n }\n return false;\n },\n _onUploadSelected: function () {\n var that = this;\n var wrapper = that.wrapper;\n if (!wrapper.hasClass('k-state-disabled')) {\n this._module.onSaveSelected();\n }\n return false;\n },\n _onClearSelected: function () {\n var that = this;\n var wrapper = that.wrapper;\n var clearEventArgs = {};\n if (!wrapper.hasClass('k-state-disabled') && !that.trigger(CLEAR, clearEventArgs)) {\n that.clearAllFiles();\n }\n return false;\n },\n _onFileProgress: function (e, percentComplete) {\n var progressPct;\n if (percentComplete > 100) {\n percentComplete = 100;\n }\n $('.k-progressbar', e.target).removeClass('k-hidden');\n if (!this.options.template) {\n progressPct = $('.k-upload-pct', e.target);\n if (progressPct.length === 0) {\n $('.k-upload-status', e.target).prepend('');\n }\n if (percentComplete !== 100) {\n $('.k-upload-pct', e.target).text(percentComplete + '%');\n } else {\n $('.k-upload-pct', e.target).remove();\n }\n $('.k-progress', e.target).width(percentComplete + '%');\n } else {\n $('.k-progress', e.target).width(percentComplete + '%');\n }\n this.trigger(PROGRESS, {\n files: getFileEntry(e).data('fileNames'),\n percentComplete: percentComplete\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-information');\n var fileSize = fileEntry.find('.k-file-size');\n var prevented = that.trigger(SUCCESS, {\n files: fileEntry.data('fileNames'),\n response: response,\n operation: 'upload',\n XMLHttpRequest: xhr\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 if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden').after('' + files.length + ' ' + that.localization.uploadSuccess + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden').after('' + that.localization.uploadSuccess + '');\n }\n that._updateHeaderUploadStatus();\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n } else {\n that._clearFileAction(fileEntry);\n }\n }\n that._hideUploadProgress(fileEntry);\n that._checkAllComplete();\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 that._setUploadErrorState(fileEntry);\n that.trigger(ERROR, {\n operation: 'upload',\n files: fileEntry.data('fileNames'),\n XMLHttpRequest: xhr\n });\n logToConsole('Server response: ' + xhr.responseText);\n if (!that.options.async.chunkSize) {\n that._hideUploadProgress(fileEntry);\n } else {\n if (module._decreasePosition) {\n module._decreasePosition(fileUid);\n }\n }\n that._checkAllComplete();\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 if (!retries) {\n return;\n }\n if (!retries[fileEntry.data('uid')]) {\n retries[fileEntry.data('uid')] = 1;\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, uploadPercentage, files = fileEntry.data('fileNames'), fileInfo = fileEntry.find('.k-file-information'), fileSize = fileEntry.find('.k-file-size');\n that._fileState(fileEntry, 'failed');\n fileEntry.removeClass('k-file-progress').addClass('k-file-error');\n if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden').after('' + files.length + ' ' + that.localization.uploadFail + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden').after('' + that.localization.uploadFail + '');\n }\n that._updateUploadProgress(fileEntry);\n uploadPercentage = $('.k-upload-pct', fileEntry);\n if (uploadPercentage.length > 0) {\n uploadPercentage.remove();\n }\n this._updateHeaderUploadStatus();\n this._fileAction(fileEntry, 'retry');\n this._fileAction(fileEntry, REMOVE, true);\n if (that._retryClicked) {\n fileEntry.focus();\n }\n },\n _updateUploadProgress: function (fileEntry) {\n var that = this;\n if (!that.options.async.chunkSize) {\n $('.k-progress', fileEntry).width('100%');\n } else {\n var fileUid = fileEntry.data('uid');\n if (that._module.metaData) {\n var fileMetaData = that._module.metaData[fileUid];\n if (fileMetaData) {\n var percentComplete = fileMetaData.totalChunks ? Math.round(fileMetaData.chunkIndex / fileMetaData.totalChunks * 100) : 100;\n that._onFileProgress({ target: $(fileEntry, that.wrapper) }, percentComplete);\n }\n }\n }\n },\n _hideUploadProgress: function (fileEntry) {\n $('.k-progressbar', fileEntry).delay(PROGRESSHIDEDELAY).fadeOut(PROGRESSHIDEDURATION, function () {\n $(this).find('.k-progress').css('width', '0%');\n });\n },\n _showActionButtons: function () {\n var that = this;\n var actionsWrapper = $('.k-action-buttons', that.wrapper);\n var uploadButton = $('.k-upload-selected', that.wrapper);\n var clearButton = $('.k-clear-selected', that.wrapper);\n if (uploadButton.length === 0) {\n uploadButton = that._renderAction('', this.localization.uploadSelectedFiles).addClass('k-upload-selected').addClass('k-primary');\n clearButton = that._renderAction('', this.localization.clearSelectedFiles).addClass('k-clear-selected');\n }\n if (!actionsWrapper.length) {\n actionsWrapper = $('
    ').addClass('k-action-buttons').append(clearButton, uploadButton);\n }\n this.wrapper.append(actionsWrapper);\n },\n _hideActionButtons: function () {\n $('.k-action-buttons', this.wrapper).remove();\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 if (headerUploadStatus.length !== 0) {\n headerUploadStatus.remove();\n }\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n headerUploadStatus = '';\n if (isUploading) {\n headerUploadStatus = $(headerUploadStatus).append(localization.headerStatusUploading);\n headerUploadStatus.find('.k-icon').addClass(headerStatusIcon.loading);\n } else {\n headerUploadStatus = $(headerUploadStatus).append(localization.headerStatusUploaded);\n headerUploadStatus.find('.k-icon').addClass(headerStatusIcon.warning);\n }\n if (dropZone.length > 0) {\n dropZone.append(headerUploadStatus);\n } else {\n $('.k-upload-button', that.wrapper).after(headerUploadStatus);\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, .k-file-invalid');\n var currentlyInvalid = $('.k-file-invalid', that.wrapper);\n var currentlyFailed = $('.k-file-error', that.wrapper);\n var currentlyPaused = $('.k-file', that.wrapper).find('.k-i-play-sm');\n var failedUploads, headerUploadStatusIcon;\n if (currentlyPaused.length && (currentlyPaused.length === currentlyUploading.length || !that.options.async.concurrent)) {\n headerUploadStatusIcon = $('.k-icon', headerUploadStatus).removeClass().addClass('k-icon').addClass('k-i-pause-sm');\n headerUploadStatus.html(headerUploadStatusIcon).append(that.localization.headerStatusPaused);\n } else if (currentlyUploading.length === 0 || currentlyInvalid.length > 0 || currentlyFailed.length > 0) {\n failedUploads = $('.k-file.k-file-error, .k-file.k-file-invalid', that.wrapper);\n headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n headerUploadStatusIcon = $('.k-icon', headerUploadStatus).removeClass().addClass('k-icon').addClass(failedUploads.length !== 0 ? headerStatusIcon.warning : headerStatusIcon.success);\n headerUploadStatus.html(headerUploadStatusIcon).append(that.localization.headerStatusUploaded);\n }\n },\n _hideHeaderUploadstatus: function () {\n var that = this, dropZone = that.options.dropZone;\n $('.k-upload-status-total', this.wrapper).remove();\n if (dropZone === '') {\n $('.k-dropzone-hint', that.wrapper).removeClass('k-hidden');\n }\n },\n _onParentFormSubmit: function () {\n var upload = this, element = upload.element;\n if (typeof this._module.onAbort !== 'undefined') {\n this._module.onAbort();\n }\n if (!element.value) {\n var input = $(element);\n input.attr('disabled', 'disabled');\n window.setTimeout(function () {\n input.removeAttr('disabled');\n }, 0);\n }\n },\n _onParentFormReset: function () {\n $('.k-upload-files', this.wrapper).remove();\n },\n _supportsFormData: function () {\n return typeof FormData != 'undefined';\n },\n _supportsMultiple: function () {\n var windows = this._userAgent().indexOf('Windows') > -1;\n return !kendo.support.browser.opera && !(kendo.support.browser.safari && windows);\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 return !isWindowsSafari && this._supportsFormData() && this.options.async.saveUrl;\n },\n _userAgent: function () {\n return navigator.userAgent;\n },\n _setupDropZone: function () {\n var that = this;\n var ns = that._ns;\n var dropZone = $('.k-dropzone', that.wrapper).on('dragenter' + ns, stopEvent).on('dragover' + ns, function (e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n }\n e.preventDefault();\n }).on('drop' + ns, $.proxy(that._onDrop, that));\n if (!dropZone.find('.k-dropzone-hint').length) {\n dropZone.append($('' + that.localization.dropFilesHere + ''));\n }\n bindDragEventWrappers(dropZone, ns, function () {\n if (!dropZone.closest('.k-upload').hasClass('k-state-disabled')) {\n dropZone.addClass('k-dropzone-hovered');\n }\n }, function () {\n dropZone.removeClass('k-dropzone-hovered');\n });\n that._bindDocumentDragEventWrappers(dropZone);\n },\n _setupCustomDropZone: function () {\n var that = this;\n var dropZone = $(that.options.dropZone);\n if (!that.wrapper.find('.k-dropzone-hint').length) {\n $('.k-dropzone', that.wrapper).append($('' + that.localization.dropFilesHere + ''));\n } else {\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n }\n var ns = that._ns;\n dropZone.on('dragenter' + ns, stopEvent).on('dragover' + ns, function (e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n }\n e.preventDefault();\n }).on('drop' + ns, $.proxy(that._onDrop, that));\n bindDragEventWrappers(dropZone, ns, function (e) {\n if (!that.wrapper.hasClass('k-state-disabled')) {\n dropZone.removeClass('k-dropzone-hovered');\n dropZone.addClass('k-dropzone-hovered');\n $(e.target).addClass('k-dropzone-hovered');\n }\n }, function () {\n dropZone.removeClass('k-dropzone-hovered');\n dropZone.find('.k-dropzone-hovered').removeClass('k-dropzone-hovered');\n });\n that._bindDocumentDragEventWrappers(dropZone);\n },\n _bindDocumentDragEventWrappers: function (dropZone) {\n var that = this;\n var ns = that._ns;\n bindDragEventWrappers($(document), ns, function () {\n if (!that.wrapper.hasClass('k-state-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 }, 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 _toggleDropZone: function () {\n var that = this, dropZone = that.options.dropZone;\n if (!that._supportsDrop()) {\n return;\n }\n $(dropZone).off(that._ns);\n $('.k-dropzone', that.wrapper).off(that._ns);\n if (dropZone !== '') {\n that._setupCustomDropZone();\n } else {\n that._setupDropZone();\n }\n },\n _supportsRemove: function () {\n return !!this.options.async.removeUrl;\n },\n _submitRemove: function (fileNames, eventArgs, onSuccess, onError) {\n var upload = this, removeField = upload.options.async.removeField || 'fileNames', params = $.extend(eventArgs.data, antiForgeryTokens());\n params[removeField] = fileNames;\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: { withCredentials: this.options.async.withCredentials }\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 input.wrap('
    ');\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 input.closest('.k-upload').addClass('k-upload-empty');\n input.closest('.k-button').append('' + that.localization.select + '');\n if (!hasLabel && !input.attr('aria-label')) {\n input.attr('aria-label', that.localization.select);\n }\n return input.closest('.k-upload');\n },\n _checkAllComplete: function () {\n if ($('.k-file.k-file-progress', this.wrapper).length === 0) {\n this.trigger(COMPLETE);\n }\n },\n _inputFiles: function (sourceInput) {\n return inputFiles(sourceInput);\n }\n });\n var syncUploadModule = function (upload) {\n this.name = 'syncUploadModule';\n this.element = upload.wrapper;\n this.upload = upload;\n this.element.closest('form').attr('enctype', 'multipart/form-data').attr('encoding', 'multipart/form-data');\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 upload._addInput(sourceInput);\n var fileData = { 'fileNames': files };\n if (filesContainErrors) {\n sourceInput.remove();\n } else {\n fileData.relatedInput = sourceInput;\n }\n var file = upload._enqueueFile(getFileName(sourceInput), fileData);\n if (filesContainErrors) {\n upload._hideUploadProgress(file);\n }\n upload._fileAction(file, REMOVE);\n },\n onRemove: function (e) {\n var fileEntry = getFileEntry(e);\n var relatedInput = fileEntry.data('relatedInput');\n if (relatedInput) {\n relatedInput.remove();\n }\n this.upload._removeFileEntry(fileEntry);\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 Upload._frameId = 0;\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 var fileEntry = this.prepareUpload(sourceInput, files, hasValidationErrors);\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 if (!hasValidationErrors) {\n upload._showActionButtons();\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n if (hasValidationErrors) {\n upload._hideUploadProgress(fileEntry);\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 upload._addInput(sourceInput);\n sourceInput.attr('name', name);\n if (!hasValidationErrors) {\n iframe = this.createFrame(upload.name + '_' + Upload._frameId++);\n this.registerFrame(iframe);\n form = this.createForm(upload.options.async.saveUrl, iframe.attr('name')).append(activeInput);\n fileData = {\n 'frame': iframe,\n 'relatedInput': activeInput,\n 'fileNames': files\n };\n } else {\n sourceInput.remove();\n fileData = { 'fileNames': files };\n }\n fileEntry = upload._enqueueFile(getFileName(sourceInput), fileData);\n if (iframe) {\n iframe.data({\n 'form': form,\n 'file': fileEntry\n });\n }\n return fileEntry;\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-information');\n var fileSize = fileEntry.find('.k-file-size');\n if (!upload.trigger(UPLOAD, e)) {\n upload._hideActionButtons();\n upload._showHeaderUploadStatus(true);\n iframe.appendTo(document.body);\n var form = iframe.data('form').attr('action', upload.options.async.saveUrl).appendTo(document.body);\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 = $('', {\n type: 'hidden',\n name: key\n }).prependTo(form);\n }\n dataInput.val(e.data[key]);\n }\n upload._fileAction(fileEntry, CANCEL);\n upload._fileState(fileEntry, 'uploading');\n $(fileEntry).removeClass('k-file-error').addClass('k-file-progress');\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\n }\n iframe.one('load', $.proxy(this.onIframeLoad, this));\n form[0].submit();\n } else {\n upload._removeFileEntry(iframe.data('file'));\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n }\n },\n onSaveSelected: function () {\n var module = this;\n var upload = module.upload;\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 if (!started && !hasValidationErrors) {\n module.performUpload(fileEntry);\n }\n });\n },\n onIframeLoad: function (e) {\n var iframe = $(e.target), responseText;\n try {\n responseText = iframe.contents().text();\n } catch (ex) {\n responseText = 'Error trying to get server response: ' + ex;\n }\n this.processResponse(iframe, responseText);\n },\n processResponse: function (iframe, responseText) {\n var fileEntry = iframe.data('file'), module = this, fakeXHR = { responseText: responseText };\n tryParseJSON(responseText, function (jsonResult) {\n $.extend(fakeXHR, {\n statusText: 'OK',\n status: '200'\n });\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, fakeXHR);\n module.cleanupFrame(iframe);\n module.unregisterFrame(iframe);\n }, function () {\n $.extend(fakeXHR, {\n statusText: 'error',\n status: '500'\n });\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, fakeXHR);\n });\n },\n onCancel: function (e) {\n var iframe = $(e.target).data('frame');\n this.stopFrameSubmit(iframe);\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n this.upload._removeFileEntry(iframe.data('file'));\n },\n onRetry: function (e) {\n var fileEntry = getFileEntry(e);\n this.performUpload(fileEntry);\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 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 onAbort: function () {\n var element = this.element, module = this;\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 this.iframes = [];\n },\n createFrame: function (id) {\n return $('');\n },\n createForm: function (action, target) {\n return $('
    ');\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 registerFrame: function (frame) {\n this.iframes.push(frame);\n },\n unregisterFrame: function (frame) {\n this.iframes = $.grep(this.iframes, function (value) {\n return value.attr('name') != frame.attr('name');\n });\n },\n cleanupFrame: function (frame) {\n var form = frame.data('form');\n frame.data('file').data('frame', null);\n setTimeout(function () {\n form.remove();\n frame.remove();\n }, 1);\n }\n };\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 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 $.each(fileEntries, function (index) {\n hasValidationErrors = upload._filesContainValidationErrors($(this.data('fileNames')));\n if (upload.options.async.autoUpload) {\n if (!hasValidationErrors) {\n if (upload.options.async.chunkSize) {\n module.prepareChunk(this);\n prev = this.prev();\n if (upload.options.async.concurrent || index === 0 && !prev.length || 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 if (!hasValidationErrors) {\n upload._showActionButtons();\n this.addClass('k-toupload');\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n if (hasValidationErrors) {\n upload._hideUploadProgress(this);\n }\n });\n },\n prepareUpload: function (sourceElement, files) {\n var fileEntries = this.enqueueFiles(files);\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 return fileEntries;\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 if (upload.options.async.batch === true) {\n name = $.map(files, function (file) {\n return file.name;\n }).join(', ');\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 fileEntry = upload._enqueueFile(name, { fileNames: files });\n fileEntry.data('files', files);\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 fileEntries.push(fileEntry);\n }\n }\n return fileEntries;\n },\n performUpload: function (fileEntry) {\n var upload = this.upload, formData = this.createFormData(), xhr = this.createXHR(), e = {\n files: fileEntry.data('fileNames'),\n XMLHttpRequest: xhr\n }, files;\n var fileValidation = fileEntry.find('.k-file-validation-message');\n var fileInfo = fileEntry.find('.k-file-information');\n var fileSize = fileEntry.find('.k-file-size');\n if (!upload.trigger(UPLOAD, e)) {\n if (fileEntry.find('.k-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 if (!upload.wrapper.find('.k-toupload').length) {\n upload._hideActionButtons();\n }\n upload._showHeaderUploadStatus(true);\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 files = fileEntry.data('files');\n if (files) {\n this.populateFormData(formData, files);\n }\n }\n upload._fileState(fileEntry, 'uploading');\n $(fileEntry).removeClass('k-file-error').addClass('k-file-progress');\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\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 _readFile: function (saveUrl, formData, fileEntry, xhr) {\n var that = this;\n var upload = that.upload;\n var file = fileEntry.data('files')[0];\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 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 _appendBuffer: function (buffer1, buffer2) {\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n },\n onSaveSelected: function () {\n var module = this;\n var upload = module.upload;\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 return !started && !hasValidationErrors;\n }).each(function (index) {\n var fileEntry = $(this);\n var prevEntry = fileEntry.prev();\n fileEntry.removeClass('k-toupload');\n if (upload.options.async.chunkSize) {\n module.prepareChunk(fileEntry);\n if (upload.options.async.concurrent || index === 0 && !prevEntry.length || (index === 0 && prevEntry.hasClass('k-file-success') || prevEntry.hasClass('k-file-error'))) {\n module.performUpload(fileEntry);\n }\n } else {\n module.performUpload(fileEntry);\n }\n });\n },\n onCancel: function (e) {\n var fileEntry = getFileEntry(e);\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 onPause: function (e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data('uid');\n var async = this.upload.options.async;\n if (async.chunkSize) {\n this.retries[fileUid] = async.maxAutoRetries + 1;\n this.paused[fileUid] = true;\n this.resume[fileUid] = false;\n }\n },\n onResume: function (e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data('uid');\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 onRetry: function (e) {\n var fileEntry = getFileEntry(e);\n var async = this.upload.options.async;\n if (async.chunkSize) {\n this.retries[fileEntry.data('uid')] = async.maxAutoRetries + 1;\n delete this.paused[fileEntry.data('uid')];\n }\n this.performUpload(fileEntry);\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 if (async.chunkSize) {\n this.retries[fileEntry.data('uid')] = async.maxAutoRetries + 1;\n }\n if (fileEntry.hasClass('k-file-success')) {\n removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n } else {\n module.removeFileEntry(fileEntry);\n }\n },\n createXHR: function () {\n return new XMLHttpRequest();\n },\n postFormData: function (url, data, fileEntry, xhr) {\n var module = this;\n fileEntry.data('request', xhr);\n xhr.addEventListener('load', function (e) {\n module.onRequestSuccess.call(module, e, fileEntry);\n }, false);\n xhr.addEventListener(ERROR, function (e) {\n module.onRequestError.call(module, e, fileEntry);\n }, false);\n xhr.upload.addEventListener('progress', function (e) {\n module.onRequestProgress.call(module, e, fileEntry);\n }, false);\n xhr.open('POST', url, true);\n xhr.withCredentials = this.upload.options.async.withCredentials;\n var accept = this.upload.options.async.accept;\n if (accept) {\n xhr.setRequestHeader('Accept', accept);\n }\n xhr.send(data);\n },\n createFormData: function () {\n return new FormData();\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 if (upload.options.async.chunkSize) {\n uid = files[0].uid;\n chunk = this._getCurrentChunk(files[0].rawFile, uid);\n data.append(upload.options.async.saveField || upload.name, chunk);\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(upload.options.async.saveField || upload.name, files[i].rawFile);\n }\n }\n return data;\n },\n onRequestSuccess: function (e, fileEntry) {\n var xhr = e.target, module = this;\n function raiseError() {\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, xhr);\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 if (module.paused[fileUid] || module.cancelled[fileUid]) {\n return;\n }\n delete module.retries[fileUid];\n if (chunkSize && !batch && !jsonResult.uploaded) {\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 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 if (xhr.status >= 200 && xhr.status <= 299) {\n tryParseJSON(xhr.responseText, parseSuccess, raiseError);\n } else {\n raiseError();\n }\n },\n onRequestError: function (e, fileEntry) {\n var xhr = e.target;\n this.upload._onUploadError({ target: $(fileEntry, this.upload.wrapper) }, xhr);\n },\n cleanupFileEntry: function (fileEntry) {\n var relatedInput = fileEntry.data('relatedInput'), uploadComplete = true;\n if (relatedInput) {\n $.each(relatedInput.data('relatedFileEntries') || [], function () {\n if (this.parent().length > 0 && this[0] != fileEntry[0]) {\n uploadComplete = uploadComplete && this.hasClass('k-file-success');\n }\n });\n if (uploadComplete) {\n relatedInput.remove();\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 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 onRequestProgress: function (e, fileEntry) {\n var percentComplete = Math.round(e.loaded * 100 / e.total);\n var fileUid = fileEntry.data('uid');\n var fileMetaData;\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 stopUploadRequest: function (fileEntry) {\n if (fileEntry.data('request')) {\n fileEntry.data('request').abort();\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 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 _decreaseChunkIndex: function (uid) {\n this.metaData[uid].chunkIndex--;\n },\n _increaseChunkIndex: function (uid) {\n this.metaData[uid].chunkIndex++;\n },\n _resetChunkIndex: function (uid) {\n this.metaData[uid].chunkIndex = 0;\n },\n _decreasePosition: function (uid) {\n this.position[uid] -= this.upload.options.async.chunkSize;\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 if (!this.position[uid]) {\n this.position[uid] = 0;\n }\n this.position[uid] += chunkSize;\n if (!!(methodToInvoke = this._getChunker(file))) {\n return file[methodToInvoke](oldPosition, this.position[uid]);\n } else {\n return file;\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 function getFileName(input) {\n return $.map(inputFiles(input), function (file) {\n return file.name;\n }).join(', ');\n }\n function inputFiles($input) {\n var input = $input[0];\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 function getAllFileInfo(rawFiles) {\n return $.map(rawFiles, function (file) {\n return getFileInfo(file);\n });\n }\n function getFileInfo(rawFile) {\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,\n rawFile: rawFile\n };\n }\n function getFileExtension(fileName) {\n var matches = fileName.match(rFileExtension);\n return matches ? matches[0] : '';\n }\n function stripPath(name) {\n var slashIndex = name.lastIndexOf('\\\\');\n return slashIndex != -1 ? name.substr(slashIndex + 1) : name;\n }\n function assignGuidToFiles(files, unique) {\n var uid = kendo.guid();\n return $.map(files, function (file) {\n file.uid = unique ? kendo.guid() : uid;\n return file;\n });\n }\n function validateFiles(files, validationInfo) {\n var allowedExtensions = parseAllowedExtensions(validationInfo.allowedExtensions);\n var maxFileSize = validationInfo.maxFileSize;\n var minFileSize = validationInfo.minFileSize;\n for (var i = 0; i < files.length; i++) {\n validateFileExtension(files[i], allowedExtensions);\n validateFileSize(files[i], minFileSize, maxFileSize);\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 return allowedExtensions;\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 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 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 function getTotalFilesSizeMessage(files) {\n var totalSize = 0;\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 totalSize /= 1024;\n if (totalSize < 1024) {\n return totalSize.toFixed(2) + ' KB';\n } else {\n return (totalSize / 1024).toFixed(2) + ' MB';\n }\n }\n function shouldRemoveFileEntry(upload) {\n return !upload.multiple && $('.k-file', upload.wrapper).length > 1;\n }\n function removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest) {\n if (!upload._supportsRemove()) {\n if (shouldRemoveFileEntry(upload) || !shouldSendRemoveRequest) {\n upload._removeFileEntry(fileEntry);\n }\n return;\n }\n var files = fileEntry.data('fileNames');\n var fileNames = $.map(files, function (file) {\n return file.name;\n });\n if (shouldSendRemoveRequest === false) {\n upload._removeFileEntry(fileEntry);\n return;\n }\n upload._submitRemove(fileNames, eventArgs, 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 if (!prevented) {\n upload._removeFileEntry(fileEntry);\n }\n }, function onError(xhr) {\n if (shouldRemoveFileEntry(upload)) {\n upload._removeFileEntry(fileEntry);\n }\n upload.trigger(ERROR, {\n operation: 'remove',\n files: files,\n XMLHttpRequest: xhr\n });\n logToConsole('Server response: ' + xhr.responseText);\n });\n }\n function tryParseJSON(input, onSuccess, onError) {\n var success = false, json = '';\n try {\n json = $.parseJSON(normalizeJSON(input));\n success = true;\n } catch (e) {\n onError();\n }\n if (success) {\n onSuccess(json);\n }\n }\n function normalizeJSON(input) {\n if (typeof input === 'undefined' || input === '') {\n input = '{}';\n }\n return input;\n }\n function stopEvent(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n }\n e.stopPropagation();\n e.preventDefault();\n }\n function bindDragEventWrappers(element, namespace, onDragEnter, onDragLeave) {\n var hideInterval, lastDrag;\n element.on('dragenter' + namespace, function (e) {\n onDragEnter(e);\n lastDrag = new Date();\n if (!hideInterval) {\n hideInterval = setInterval(function () {\n var sinceLastDrag = new Date() - lastDrag;\n if (sinceLastDrag > 100) {\n onDragLeave();\n clearInterval(hideInterval);\n hideInterval = null;\n }\n }, 100);\n }\n }).on('dragover' + namespace, function () {\n lastDrag = new Date();\n });\n }\n function isFileUploadStarted(fileEntry) {\n return fileEntry.is('.k-file-progress, .k-file-success, .k-file-error');\n }\n function getFileEntry(e) {\n return $(e.target).closest('.k-file');\n }\n kendo.ui.plugin(Upload);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"]}