/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.upload', ['kendo.core'], f);
}(function () {
var __meta__ = {
id: 'upload',
name: 'Upload',
category: 'web',
description: 'The Upload widget uses progressive enhancement to deliver the best possible uploading experience to users.',
depends: ['core']
};
(function ($, undefined) {
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', PROGRESS = 'progress', REMOVE = 'remove';
var Upload = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
that.name = element.name;
that.multiple = that.options.multiple;
that.localization = that.options.localization;
var activeInput = that.element;
that.wrapper = activeInput.closest('.k-upload');
if (that.wrapper.length === 0) {
that.wrapper = that._wrapInput(activeInput);
}
that._activeInput(activeInput);
that.toggle(that.options.enabled);
var ns = that._ns = NS + '-' + kendo.guid();
activeInput.closest('form').on('submit' + ns, $.proxy(that._onParentFormSubmit, that)).on('reset' + ns, $.proxy(that._onParentFormReset, that));
if (that.options.async.saveUrl) {
that._module = that._supportsFormData() ? new formDataUploadModule(that) : new iframeUploadModule(that);
that._async = true;
var initialFiles = that.options.files;
if (initialFiles.length > 0) {
that._renderInitialFiles(initialFiles);
}
} else {
that._module = new syncUploadModule(that);
}
if (that._supportsDrop()) {
that._setupDropZone();
}
that.wrapper.on('click', '.k-upload-action', $.proxy(that._onFileAction, that)).on('click', '.k-upload-selected', $.proxy(that._onUploadSelected, that));
if (that.element.val()) {
that._onInputChange({ target: that.element });
}
},
events: [
SELECT,
UPLOAD,
SUCCESS,
ERROR,
COMPLETE,
CANCEL,
PROGRESS,
REMOVE
],
options: {
name: 'Upload',
enabled: true,
multiple: true,
showFileList: true,
template: '',
files: [],
async: {
removeVerb: 'POST',
autoUpload: true,
withCredentials: true
},
localization: {
'select': 'Select files...',
'cancel': 'Cancel',
'retry': 'Retry',
'remove': 'Remove',
'uploadSelectedFiles': 'Upload files',
'dropFilesHere': 'drop files here to upload',
'statusUploading': 'uploading',
'statusUploaded': 'uploaded',
'statusWarning': 'warning',
'statusFailed': 'failed',
'headerStatusUploading': 'Uploading...',
'headerStatusUploaded': 'Done'
}
},
setOptions: function (options) {
var that = this, activeInput = that.element;
Widget.fn.setOptions.call(that, options);
that.multiple = that.options.multiple;
activeInput.attr('multiple', that._supportsMultiple() ? that.multiple : false);
that.toggle(that.options.enabled);
},
enable: function (enable) {
enable = typeof enable === 'undefined' ? true : enable;
this.toggle(enable);
},
disable: function () {
this.toggle(false);
},
toggle: function (enable) {
enable = typeof enable === 'undefined' ? enable : !enable;
this.wrapper.toggleClass('k-state-disabled', enable);
this.element.prop('disabled', enable);
},
destroy: function () {
var that = this;
$(document).add($('.k-dropzone', that.wrapper)).add(that.wrapper.closest('form')).off(that._ns);
$(that.element).off(NS);
Widget.fn.destroy.call(that);
},
_addInput: function (sourceInput) {
if (!sourceInput[0].nodeType) {
return;
}
var that = this, input = sourceInput.clone().val('');
input.insertAfter(that.element).data('kendoUpload', that);
$(that.element).hide().attr('tabindex', '-1').removeAttr('id').off(NS);
that._activeInput(input);
that.element.focus();
},
_activeInput: function (input) {
var that = this, wrapper = that.wrapper;
that.element = input;
input.attr('multiple', that._supportsMultiple() ? that.multiple : false).attr('autocomplete', 'off').on('click' + NS, function (e) {
if (wrapper.hasClass('k-state-disabled')) {
e.preventDefault();
}
}).on('focus' + NS, function () {
$(this).parent().addClass('k-state-focused');
}).on('blur' + NS, function () {
$(this).parent().removeClass('k-state-focused');
}).on('change' + NS, $.proxy(that._onInputChange, that)).on('keydown' + NS, $.proxy(that._onInputKeyDown, that));
},
_onInputKeyDown: function (e) {
var that = this;
var firstButton = that.wrapper.find('.k-upload-action:first');
if (e.keyCode === kendo.keys.TAB && firstButton.length > 0) {
e.preventDefault();
firstButton.focus();
}
},
_onInputChange: function (e) {
var that = this;
var input = $(e.target);
var files = assignGuidToFiles(that._inputFiles(input), that._isAsyncNonBatch());
var prevented = that.trigger(SELECT, { files: files });
if (prevented) {
that._addInput(input);
input.remove();
} else {
that._module.onSelect({ target: input }, files);
}
},
_onDrop: function (e) {
var dt = e.originalEvent.dataTransfer;
var that = this;
var droppedFiles = dt.files;
var files = assignGuidToFiles(getAllFileInfo(droppedFiles), that._isAsyncNonBatch());
stopEvent(e);
if (droppedFiles.length > 0 && !that.wrapper.hasClass('k-state-disabled')) {
if (!that.multiple && files.length > 1) {
files.splice(1, files.length - 1);
}
var prevented = that.trigger(SELECT, { files: files });
if (!prevented) {
that._module.onSelect({ target: $('.k-dropzone', that.wrapper) }, files);
}
}
},
_isAsyncNonBatch: function () {
return this._async && !this.options.async.batch || false;
},
_renderInitialFiles: function (files) {
var that = this;
var idx = 0;
files = assignGuidToFiles(files, true);
for (idx = 0; idx < files.length; idx++) {
var currentFile = files[idx];
var fileEntry = that._enqueueFile(currentFile.name, { fileNames: [currentFile] });
fileEntry.addClass('k-file-success').data('files', [files[idx]]);
$('.k-progress', fileEntry).width('100%');
if (!that.options.template) {
$('.k-upload-status', fileEntry).prepend('100% ');
}
if (that._supportsRemove()) {
that._fileAction(fileEntry, REMOVE);
}
}
},
_prepareTemplateData: function (name, data) {
var filesData = data.fileNames, templateData = {}, totalSize = 0, idx = 0;
for (idx = 0; idx < filesData.length; idx++) {
totalSize += filesData[idx].size;
}
templateData.name = name;
templateData.size = totalSize;
templateData.files = data.fileNames;
return templateData;
},
_prepareDefaultFileEntryTemplate: function (name, data) {
var extension = '';
var defaultTemplate = $('
' + ' ' + ' ' + '' + name + ' ' + ' ' + ' ');
if (data.fileNames.length == 1 && !!data.fileNames[0].extension) {
extension = data.fileNames[0].extension.substring(1);
$('.k-icon', defaultTemplate).addClass('k-i-' + extension);
}
return defaultTemplate;
},
_enqueueFile: function (name, data) {
var that = this;
var existingFileEntries;
var fileEntry;
var fileUid = data.fileNames[0].uid;
var fileList = $('.k-upload-files', that.wrapper);
var options = that.options;
var template = options.template;
var templateData;
var removeEventArgs;
if (fileList.length === 0) {
fileList = $('').appendTo(that.wrapper);
if (!that.options.showFileList) {
fileList.hide();
}
that.wrapper.removeClass('k-upload-empty');
}
existingFileEntries = $('.k-file', fileList);
if (!template) {
fileEntry = that._prepareDefaultFileEntryTemplate(name, data);
} else {
templateData = that._prepareTemplateData(name, data);
template = kendo.template(template);
fileEntry = $('' + template(templateData) + ' ');
fileEntry.find('.k-upload-action').addClass('k-button k-button-bare');
that.angular('compile', function () {
return {
elements: fileEntry,
data: [templateData]
};
});
}
fileEntry.attr(kendo.attr('uid'), fileUid).appendTo(fileList).data(data);
if (!that._async) {
$('.k-progress', fileEntry).width('100%');
}
if (!that.multiple && existingFileEntries.length > 0) {
removeEventArgs = { files: existingFileEntries.data('fileNames') };
if (!that.trigger(REMOVE, removeEventArgs)) {
that._module.onRemove({ target: $(existingFileEntries, that.wrapper) }, removeEventArgs.data);
}
}
return fileEntry;
},
_removeFileEntry: function (fileEntry) {
var that = this;
var fileList = fileEntry.closest('.k-upload-files');
var allFiles;
var allCompletedFiles;
fileEntry.remove();
allFiles = $('.k-file', fileList);
allCompletedFiles = $('.k-file-success, .k-file-error', fileList);
if (allCompletedFiles.length === allFiles.length) {
this._hideUploadButton();
}
if (allFiles.length === 0) {
fileList.remove();
that.wrapper.addClass('k-upload-empty');
that._hideHeaderUploadstatus();
}
},
_fileAction: function (fileElement, actionKey) {
var classDictionary = {
remove: 'k-delete',
cancel: 'k-cancel',
retry: 'k-retry'
};
var iconsClassDictionary = {
remove: 'k-i-close',
cancel: 'k-i-close',
retry: 'k-i-refresh'
};
if (!classDictionary.hasOwnProperty(actionKey)) {
return;
}
this._clearFileAction(fileElement);
if (!this.options.template) {
fileElement.find('.k-upload-status .k-upload-action').remove();
fileElement.find('.k-upload-status').append(this._renderAction(classDictionary[actionKey], this.localization[actionKey], iconsClassDictionary[actionKey]));
} else {
fileElement.find('.k-upload-action').addClass('k-button k-button-bare').append(' ').show();
}
},
_fileState: function (fileEntry, stateKey) {
var localization = this.localization, states = {
uploading: { text: localization.statusUploading },
uploaded: { text: localization.statusUploaded },
failed: { text: localization.statusFailed }
}, currentState = states[stateKey];
if (currentState) {
$('.k-icon:not(.k-delete, .k-cancel, .k-retry)', fileEntry).text(currentState.text);
}
},
_renderAction: function (actionClass, actionText, iconClass) {
if (actionClass !== '') {
return $('' + ' ' + ' ');
} else {
return $('' + actionText + ' ');
}
},
_clearFileAction: function (fileElement) {
$('.k-upload-action', fileElement).empty().hide();
},
_onFileAction: function (e) {
var that = this;
if (!that.wrapper.hasClass('k-state-disabled')) {
var button = $(e.target).closest('.k-upload-action'), icon = button.find('.k-icon'), fileEntry = button.closest('.k-file'), eventArgs = { files: fileEntry.data('fileNames') };
if (icon.hasClass('k-delete')) {
if (!that.trigger(REMOVE, eventArgs)) {
that._module.onRemove({ target: $(fileEntry, that.wrapper) }, eventArgs.data);
}
} else if (icon.hasClass('k-cancel')) {
that.trigger(CANCEL, eventArgs);
that._module.onCancel({ target: $(fileEntry, that.wrapper) });
this._checkAllComplete();
that._updateHeaderUploadStatus();
} else if (icon.hasClass('k-retry')) {
$('.k-warning', fileEntry).remove();
that._module.onRetry({ target: $(fileEntry, that.wrapper) });
}
}
return false;
},
_onUploadSelected: function () {
var that = this;
var wrapper = that.wrapper;
if (!wrapper.hasClass('k-state-disabled')) {
this._module.onSaveSelected();
}
return false;
},
_onFileProgress: function (e, percentComplete) {
var progressPct;
if (percentComplete > 100) {
percentComplete = 100;
}
if (!this.options.template) {
progressPct = $('.k-upload-pct', e.target);
if (progressPct.length === 0) {
$('.k-upload-status', e.target).prepend(' ');
}
$('.k-upload-pct', e.target).text(percentComplete + '%');
$('.k-progress', e.target).width(percentComplete + '%');
} else {
$('.k-progress', e.target).width(percentComplete + '%');
}
this.trigger(PROGRESS, {
files: getFileEntry(e).data('fileNames'),
percentComplete: percentComplete
});
},
_onUploadSuccess: function (e, response, xhr) {
var fileEntry = getFileEntry(e);
this._fileState(fileEntry, 'uploaded');
fileEntry.removeClass('k-file-progress').addClass('k-file-success');
this._updateHeaderUploadStatus();
this.trigger(SUCCESS, {
files: fileEntry.data('fileNames'),
response: response,
operation: 'upload',
XMLHttpRequest: xhr
});
if (this._supportsRemove()) {
this._fileAction(fileEntry, REMOVE);
} else {
this._clearFileAction(fileEntry);
}
this._checkAllComplete();
},
_onUploadError: function (e, xhr) {
var fileEntry = getFileEntry(e);
var uploadPercentage = $('.k-upload-pct', fileEntry);
this._fileState(fileEntry, 'failed');
fileEntry.removeClass('k-file-progress').addClass('k-file-error');
$('.k-progress', fileEntry).width('100%');
if (uploadPercentage.length > 0) {
uploadPercentage.empty().removeClass('k-upload-pct').addClass('k-icon k-warning');
} else {
$('.k-upload-status', fileEntry).prepend(' ');
}
this._updateHeaderUploadStatus();
this._fileAction(fileEntry, 'retry');
this.trigger(ERROR, {
operation: 'upload',
files: fileEntry.data('fileNames'),
XMLHttpRequest: xhr
});
logToConsole('Server response: ' + xhr.responseText);
this._checkAllComplete();
},
_showUploadButton: function () {
var uploadButton = $('.k-upload-selected', this.wrapper);
if (uploadButton.length === 0) {
uploadButton = this._renderAction('', this.localization.uploadSelectedFiles).addClass('k-upload-selected');
}
this.wrapper.append(uploadButton);
},
_hideUploadButton: function () {
$('.k-upload-selected', this.wrapper).remove();
},
_showHeaderUploadStatus: function () {
var localization = this.localization;
var dropZone = $('.k-dropzone', this.wrapper);
var headerUploadStatus = $('.k-upload-status-total', this.wrapper);
if (headerUploadStatus.length !== 0) {
headerUploadStatus.remove();
}
headerUploadStatus = '' + localization.headerStatusUploading + '' + localization.statusUploading + ' ' + ' ';
if (dropZone.length > 0) {
dropZone.append(headerUploadStatus);
} else {
$('.k-upload-button', this.wrapper).after(headerUploadStatus);
}
},
_updateHeaderUploadStatus: function () {
var that = this;
var localization = that.localization;
var currentlyUploading = $('.k-file', that.wrapper).not('.k-file-success, .k-file-error');
var failedUploads;
var headerUploadStatus;
var headerUploadStatusIcon;
if (currentlyUploading.length === 0) {
failedUploads = $('.k-file.k-file-error', that.wrapper);
headerUploadStatus = $('.k-upload-status-total', that.wrapper);
headerUploadStatusIcon = $('.k-icon', headerUploadStatus).removeClass('k-loading').addClass(failedUploads.length !== 0 ? 'k-warning' : 'k-i-tick').text(failedUploads.length !== 0 ? localization.statusWarning : localization.statusUploaded);
headerUploadStatus.text(that.localization.headerStatusUploaded).append(headerUploadStatusIcon);
}
},
_hideHeaderUploadstatus: function () {
$('.k-upload-status-total', this.wrapper).remove();
},
_onParentFormSubmit: function () {
var upload = this, element = upload.element;
if (typeof this._module.onAbort !== 'undefined') {
this._module.onAbort();
}
if (!element.value) {
var input = $(element);
input.attr('disabled', 'disabled');
window.setTimeout(function () {
input.removeAttr('disabled');
}, 0);
}
},
_onParentFormReset: function () {
$('.k-upload-files', this.wrapper).remove();
},
_supportsFormData: function () {
return typeof FormData != 'undefined';
},
_supportsMultiple: function () {
var windows = this._userAgent().indexOf('Windows') > -1;
return !kendo.support.browser.opera && !(kendo.support.browser.safari && windows);
},
_supportsDrop: function () {
var userAgent = this._userAgent().toLowerCase(), isChrome = /chrome/.test(userAgent), isSafari = !isChrome && /safari/.test(userAgent), isWindowsSafari = isSafari && /windows/.test(userAgent);
return !isWindowsSafari && this._supportsFormData() && this.options.async.saveUrl;
},
_userAgent: function () {
return navigator.userAgent;
},
_setupDropZone: function () {
var that = this;
$('.k-upload-button', this.wrapper).wrap('
');
var ns = that._ns;
var dropZone = $('.k-dropzone', that.wrapper).append($('' + that.localization.dropFilesHere + ' ')).on('dragenter' + ns, stopEvent).on('dragover' + ns, function (e) {
e.preventDefault();
}).on('drop' + ns, $.proxy(this._onDrop, this));
bindDragEventWrappers(dropZone, ns, function () {
if (!dropZone.closest('.k-upload').hasClass('k-state-disabled')) {
dropZone.addClass('k-dropzone-hovered');
}
}, function () {
dropZone.removeClass('k-dropzone-hovered');
});
bindDragEventWrappers($(document), ns, function () {
if (!dropZone.closest('.k-upload').hasClass('k-state-disabled')) {
dropZone.addClass('k-dropzone-active');
dropZone.closest('.k-upload').removeClass('k-upload-empty');
}
}, function () {
dropZone.removeClass('k-dropzone-active');
if ($('li.k-file', dropZone.closest('.k-upload')).length === 0) {
dropZone.closest('.k-upload').addClass('k-upload-empty');
}
});
},
_supportsRemove: function () {
return !!this.options.async.removeUrl;
},
_submitRemove: function (fileNames, data, onSuccess, onError) {
var upload = this, removeField = upload.options.async.removeField || 'fileNames', params = $.extend(data, antiForgeryTokens());
params[removeField] = fileNames;
jQuery.ajax({
type: this.options.async.removeVerb,
dataType: 'json',
dataFilter: normalizeJSON,
url: this.options.async.removeUrl,
traditional: true,
data: params,
success: onSuccess,
error: onError,
xhrFields: { withCredentials: this.options.async.withCredentials }
});
},
_wrapInput: function (input) {
var that = this;
var options = that.options;
input.wrap('');
if (!options.async.saveUrl) {
input.closest('.k-upload').addClass('k-upload-sync');
}
input.closest('.k-upload').addClass('k-upload-empty');
input.closest('.k-button').append('' + this.localization.select + ' ');
return input.closest('.k-upload');
},
_checkAllComplete: function () {
if ($('.k-file.k-file-progress', this.wrapper).length === 0) {
this.trigger(COMPLETE);
}
},
_inputFiles: function (sourceInput) {
return inputFiles(sourceInput);
}
});
var syncUploadModule = function (upload) {
this.name = 'syncUploadModule';
this.element = upload.wrapper;
this.upload = upload;
this.element.closest('form').attr('enctype', 'multipart/form-data').attr('encoding', 'multipart/form-data');
};
syncUploadModule.prototype = {
onSelect: function (e, files) {
var upload = this.upload;
var sourceInput = $(e.target);
upload._addInput(sourceInput);
var file = upload._enqueueFile(getFileName(sourceInput), {
'relatedInput': sourceInput,
'fileNames': files
});
upload._fileAction(file, REMOVE);
},
onRemove: function (e) {
var fileEntry = getFileEntry(e);
fileEntry.data('relatedInput').remove();
this.upload._removeFileEntry(fileEntry);
}
};
var iframeUploadModule = function (upload) {
this.name = 'iframeUploadModule';
this.element = upload.wrapper;
this.upload = upload;
this.iframes = [];
};
Upload._frameId = 0;
iframeUploadModule.prototype = {
onSelect: function (e, files) {
var upload = this.upload, sourceInput = $(e.target);
var fileEntry = this.prepareUpload(sourceInput, files);
if (upload.options.async.autoUpload) {
this.performUpload(fileEntry);
} else {
if (upload._supportsRemove()) {
this.upload._fileAction(fileEntry, REMOVE);
}
upload._showUploadButton();
}
},
prepareUpload: function (sourceInput, files) {
var upload = this.upload;
var activeInput = $(upload.element);
var name = upload.options.async.saveField || sourceInput.attr('name');
upload._addInput(sourceInput);
sourceInput.attr('name', name);
var iframe = this.createFrame(upload.name + '_' + Upload._frameId++);
this.registerFrame(iframe);
var form = this.createForm(upload.options.async.saveUrl, iframe.attr('name')).append(activeInput);
var fileEntry = upload._enqueueFile(getFileName(sourceInput), {
'frame': iframe,
'relatedInput': activeInput,
'fileNames': files
});
iframe.data({
'form': form,
'file': fileEntry
});
return fileEntry;
},
performUpload: function (fileEntry) {
var e = { files: fileEntry.data('fileNames') }, iframe = fileEntry.data('frame'), upload = this.upload;
if (!upload.trigger(UPLOAD, e)) {
upload._hideUploadButton();
upload._showHeaderUploadStatus();
iframe.appendTo(document.body);
var form = iframe.data('form').attr('action', upload.options.async.saveUrl).appendTo(document.body);
e.data = $.extend({}, e.data, antiForgeryTokens());
for (var key in e.data) {
var dataInput = form.find('input[name=\'' + key + '\']');
if (dataInput.length === 0) {
dataInput = $(' ', {
type: 'hidden',
name: key
}).prependTo(form);
}
dataInput.val(e.data[key]);
}
upload._fileAction(fileEntry, CANCEL);
upload._fileState(fileEntry, 'uploading');
$(fileEntry).removeClass('k-file-error').addClass('k-file-progress');
iframe.one('load', $.proxy(this.onIframeLoad, this));
form[0].submit();
} else {
upload._removeFileEntry(iframe.data('file'));
this.cleanupFrame(iframe);
this.unregisterFrame(iframe);
}
},
onSaveSelected: function () {
var module = this;
$('.k-file', this.element).each(function () {
var fileEntry = $(this), started = isFileUploadStarted(fileEntry);
if (!started) {
module.performUpload(fileEntry);
}
});
},
onIframeLoad: function (e) {
var iframe = $(e.target), responseText;
try {
responseText = iframe.contents().text();
} catch (ex) {
responseText = 'Error trying to get server response: ' + ex;
}
this.processResponse(iframe, responseText);
},
processResponse: function (iframe, responseText) {
var fileEntry = iframe.data('file'), module = this, fakeXHR = { responseText: responseText };
tryParseJSON(responseText, function (jsonResult) {
$.extend(fakeXHR, {
statusText: 'OK',
status: '200'
});
module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);
module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, fakeXHR);
module.cleanupFrame(iframe);
module.unregisterFrame(iframe);
}, function () {
$.extend(fakeXHR, {
statusText: 'error',
status: '500'
});
module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, fakeXHR);
});
},
onCancel: function (e) {
var iframe = $(e.target).data('frame');
this.stopFrameSubmit(iframe);
this.cleanupFrame(iframe);
this.unregisterFrame(iframe);
this.upload._removeFileEntry(iframe.data('file'));
},
onRetry: function (e) {
var fileEntry = getFileEntry(e);
this.performUpload(fileEntry);
},
onRemove: function (e, data) {
var fileEntry = getFileEntry(e);
var iframe = fileEntry.data('frame');
if (iframe) {
this.unregisterFrame(iframe);
this.upload._removeFileEntry(fileEntry);
this.cleanupFrame(iframe);
} else {
removeUploadedFile(fileEntry, this.upload, data);
}
},
onAbort: function () {
var element = this.element, module = this;
$.each(this.iframes, function () {
$('input', this.data('form')).appendTo(element);
module.stopFrameSubmit(this[0]);
this.data('form').remove();
this.remove();
});
this.iframes = [];
},
createFrame: function (id) {
return $('');
},
createForm: function (action, target) {
return $('');
},
stopFrameSubmit: function (frame) {
if (typeof frame.stop != 'undefined') {
frame.stop();
} else if (frame.document) {
frame.document.execCommand('Stop');
}
},
registerFrame: function (frame) {
this.iframes.push(frame);
},
unregisterFrame: function (frame) {
this.iframes = $.grep(this.iframes, function (value) {
return value.attr('name') != frame.attr('name');
});
},
cleanupFrame: function (frame) {
var form = frame.data('form');
frame.data('file').data('frame', null);
setTimeout(function () {
form.remove();
frame.remove();
}, 1);
}
};
var formDataUploadModule = function (upload) {
this.name = 'formDataUploadModule';
this.element = upload.wrapper;
this.upload = upload;
};
formDataUploadModule.prototype = {
onSelect: function (e, files) {
var upload = this.upload, module = this, sourceElement = $(e.target), fileEntries = this.prepareUpload(sourceElement, files);
$.each(fileEntries, function () {
if (upload.options.async.autoUpload) {
module.performUpload(this);
} else {
if (upload._supportsRemove()) {
upload._fileAction(this, REMOVE);
}
upload._showUploadButton();
}
});
},
prepareUpload: function (sourceElement, files) {
var fileEntries = this.enqueueFiles(files);
if (sourceElement.is('input')) {
$.each(fileEntries, function () {
$(this).data('relatedInput', sourceElement);
});
sourceElement.data('relatedFileEntries', fileEntries);
this.upload._addInput(sourceElement);
}
return fileEntries;
},
enqueueFiles: function (files) {
var upload = this.upload, name, i, filesLength = files.length, currentFile, fileEntry, fileEntries = [];
if (upload.options.async.batch === true) {
name = $.map(files, function (file) {
return file.name;
}).join(', ');
fileEntry = upload._enqueueFile(name, { fileNames: files });
fileEntry.data('files', files);
fileEntries.push(fileEntry);
} else {
for (i = 0; i < filesLength; i++) {
currentFile = files[i];
name = currentFile.name;
fileEntry = upload._enqueueFile(name, { fileNames: [currentFile] });
fileEntry.data('files', [currentFile]);
fileEntries.push(fileEntry);
}
}
return fileEntries;
},
performUpload: function (fileEntry) {
var upload = this.upload, formData = this.createFormData(), xhr = this.createXHR(), e = {
files: fileEntry.data('fileNames'),
XMLHttpRequest: xhr
};
if (!upload.trigger(UPLOAD, e)) {
upload._fileAction(fileEntry, CANCEL);
upload._hideUploadButton();
upload._showHeaderUploadStatus();
if (e.formData) {
formData = e.formData;
} else {
e.data = $.extend({}, e.data, antiForgeryTokens());
for (var key in e.data) {
formData.append(key, e.data[key]);
}
this.populateFormData(formData, fileEntry.data('files'));
}
upload._fileState(fileEntry, 'uploading');
$(fileEntry).removeClass('k-file-error').addClass('k-file-progress');
this.postFormData(upload.options.async.saveUrl, formData, fileEntry, xhr);
} else {
this.removeFileEntry(fileEntry);
}
},
onSaveSelected: function () {
var module = this;
$('.k-file', this.element).each(function () {
var fileEntry = $(this), started = isFileUploadStarted(fileEntry);
if (!started) {
module.performUpload(fileEntry);
}
});
},
onCancel: function (e) {
var fileEntry = getFileEntry(e);
this.stopUploadRequest(fileEntry);
this.removeFileEntry(fileEntry);
},
onRetry: function (e) {
var fileEntry = getFileEntry(e);
this.performUpload(fileEntry);
},
onRemove: function (e, data) {
var fileEntry = getFileEntry(e);
if (fileEntry.hasClass('k-file-success')) {
removeUploadedFile(fileEntry, this.upload, data);
} else {
this.removeFileEntry(fileEntry);
}
},
createXHR: function () {
return new XMLHttpRequest();
},
postFormData: function (url, data, fileEntry, xhr) {
var module = this;
fileEntry.data('request', xhr);
xhr.addEventListener('load', function (e) {
module.onRequestSuccess.call(module, e, fileEntry);
}, false);
xhr.addEventListener(ERROR, function (e) {
module.onRequestError.call(module, e, fileEntry);
}, false);
xhr.upload.addEventListener('progress', function (e) {
module.onRequestProgress.call(module, e, fileEntry);
}, false);
xhr.open('POST', url, true);
xhr.withCredentials = this.upload.options.async.withCredentials;
xhr.send(data);
},
createFormData: function () {
return new FormData();
},
populateFormData: function (data, files) {
var upload = this.upload, i, length = files.length;
for (i = 0; i < length; i++) {
data.append(upload.options.async.saveField || upload.name, files[i].rawFile);
}
return data;
},
onRequestSuccess: function (e, fileEntry) {
var xhr = e.target, module = this;
function raiseError() {
module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, xhr);
}
if (xhr.status >= 200 && xhr.status <= 299) {
tryParseJSON(xhr.responseText, function (jsonResult) {
module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);
module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);
module.cleanupFileEntry(fileEntry);
}, raiseError);
} else {
raiseError();
}
},
onRequestError: function (e, fileEntry) {
var xhr = e.target;
this.upload._onUploadError({ target: $(fileEntry, this.upload.wrapper) }, xhr);
},
cleanupFileEntry: function (fileEntry) {
var relatedInput = fileEntry.data('relatedInput'), uploadComplete = true;
if (relatedInput) {
$.each(relatedInput.data('relatedFileEntries') || [], function () {
if (this.parent().length > 0 && this[0] != fileEntry[0]) {
uploadComplete = uploadComplete && this.hasClass('k-file-success');
}
});
if (uploadComplete) {
relatedInput.remove();
}
}
},
removeFileEntry: function (fileEntry) {
this.cleanupFileEntry(fileEntry);
this.upload._removeFileEntry(fileEntry);
},
onRequestProgress: function (e, fileEntry) {
var percentComplete = Math.round(e.loaded * 100 / e.total);
this.upload._onFileProgress({ target: $(fileEntry, this.upload.wrapper) }, percentComplete);
},
stopUploadRequest: function (fileEntry) {
fileEntry.data('request').abort();
}
};
function getFileName(input) {
return $.map(inputFiles(input), function (file) {
return file.name;
}).join(', ');
}
function inputFiles($input) {
var input = $input[0];
if (input.files) {
return getAllFileInfo(input.files);
} else {
return [{
name: stripPath(input.value),
extension: getFileExtension(input.value),
size: null
}];
}
}
function getAllFileInfo(rawFiles) {
return $.map(rawFiles, function (file) {
return getFileInfo(file);
});
}
function getFileInfo(rawFile) {
var fileName = rawFile.name || rawFile.fileName;
return {
name: kendo.htmlEncode(fileName),
extension: getFileExtension(fileName),
size: rawFile.size || rawFile.fileSize,
rawFile: rawFile
};
}
function getFileExtension(fileName) {
var matches = fileName.match(rFileExtension);
return matches ? matches[0] : '';
}
function stripPath(name) {
var slashIndex = name.lastIndexOf('\\');
return slashIndex != -1 ? name.substr(slashIndex + 1) : name;
}
function assignGuidToFiles(files, unique) {
var uid = kendo.guid();
return $.map(files, function (file) {
file.uid = unique ? kendo.guid() : uid;
return file;
});
}
function shouldRemoveFileEntry(upload) {
return !upload.multiple && $('.k-file', upload.wrapper).length > 1;
}
function removeUploadedFile(fileEntry, upload, data) {
if (!upload._supportsRemove()) {
if (shouldRemoveFileEntry(upload)) {
upload._removeFileEntry(fileEntry);
}
return;
}
var files = fileEntry.data('fileNames');
var fileNames = $.map(files, function (file) {
return file.name;
});
upload._submitRemove(fileNames, data, function onSuccess(data, textStatus, xhr) {
upload._removeFileEntry(fileEntry);
upload.trigger(SUCCESS, {
operation: 'remove',
files: files,
response: data,
XMLHttpRequest: xhr
});
}, function onError(xhr) {
if (shouldRemoveFileEntry(upload)) {
upload._removeFileEntry(fileEntry);
}
upload.trigger(ERROR, {
operation: 'remove',
files: files,
XMLHttpRequest: xhr
});
logToConsole('Server response: ' + xhr.responseText);
});
}
function tryParseJSON(input, onSuccess, onError) {
var success = false, json = '';
try {
json = $.parseJSON(normalizeJSON(input));
success = true;
} catch (e) {
onError();
}
if (success) {
onSuccess(json);
}
}
function normalizeJSON(input) {
if (typeof input === 'undefined' || input === '') {
input = '{}';
}
return input;
}
function stopEvent(e) {
e.stopPropagation();
e.preventDefault();
}
function bindDragEventWrappers(element, namespace, onDragEnter, onDragLeave) {
var hideInterval, lastDrag;
element.on('dragenter' + namespace, function () {
onDragEnter();
lastDrag = new Date();
if (!hideInterval) {
hideInterval = setInterval(function () {
var sinceLastDrag = new Date() - lastDrag;
if (sinceLastDrag > 100) {
onDragLeave();
clearInterval(hideInterval);
hideInterval = null;
}
}, 100);
}
}).on('dragover' + namespace, function () {
lastDrag = new Date();
});
}
function isFileUploadStarted(fileEntry) {
return fileEntry.is('.k-file-progress, .k-file-success, .k-file-error');
}
function getFileEntry(e) {
return $(e.target).closest('.k-file');
}
kendo.ui.plugin(Upload);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));