HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/CMS/CMSScripts/CMSModules/AdminControls/MultiFileUploader.js
cmsdefine(['CMS/EventHub'], function (EventHub) {
    'use strict';


    var MultiFileUploader = function (data) {
        if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
            document.getElementById(data.overlayClientID).style.display = 'none';
            return;
        }

        var BYTES_PER_CHUNK = 4194304; // Default chunk size is 4 MB

        var uploader = document.getElementById(data.uploaderClientID),
            maxNumberToUpload = data.maxNumberToUpload,
            maximumTotalUpload = data.maximumTotalUpload,
            maximumUploadSize = data.maximumUploadSize,
            uploadChunkSize = data.uploadChunkSize,
            onUploadBegin = data.onUploadBegin,
            onUploadCompleted = data.onUploadCompleted,
            onUploadProgressChanged = data.onUploadProgressChanged,
            containerId = data.containerID,
            filesCount = 0,
            currentFileIndex = 0,
            totalUploadSize = 0,
            currentUploadedSize = 0,
            filesLeft = 0,
            files,
            canceling = false,
            canceled = false,
            allowedExtensions = data.allowedExtensions.split('|')[0];

        // Set chunk size.
        if (uploadChunkSize === 0) {
            uploadChunkSize = BYTES_PER_CHUNK;
        }

        // Calculates total size of all uploaded files
        var calculateTotalUploadSize = function () {
            var size = 0;
            for (var i = 0, l = files.length; i < l; i++) {
                size += files[i].size;
            }
            return size;
        };

        // Returns size of the largest file
        var getMaxFileSize = function () {
            var size = 0;
            for (var i = 0, l = files.length; i < l; i++) {
                size += files[i].size;
            }
            return size;
        };

        // Check if all files have allowed extension. If no, the function returns first wrong extension
        var checkAllowedExtensions = function () {
            if (data.allowedExtensions) {
                var extensionsString = data.allowedExtensions.split('|');
                var extensions = extensionsString[0].split(';');
                var fileName,
                    fileAllowed,
                    extension;

                for (var i = 0; i < files.length; i++) {
                    fileAllowed = false;
                    fileName = files[i].name.toLowerCase();

                    for (var j = 0; j < extensions.length; j++) {
                        extension = extensions[j].toLowerCase();
                        if (fileName.match(extension + '$')) {
                            fileAllowed = true;
                        }
                    }
                    if (!fileAllowed) {
                        return fileName.substr(fileName.lastIndexOf('.') + 1);
                    }
                }
            }
            return "";
        };

        // Cancel running upload
        var cancelUpload = function () {
            canceling = true;
        };

        EventHub.subscribe('UploadCanceled', function (senderContainerId) {
            if (senderContainerId === containerId) {
                cancelUpload();
            }
        });

        // Checks on server if file can be uploaded and uploads it
        var uploadFile = function (file) {
            var xhr = new XMLHttpRequest();

            xhr.open('post', data.uploadPage +
                '?InstanceGuid=' + data.instanceGuid +
                '&filename=' + encodeURIComponent(file.name) +
                '&FilesCount=' + filesCount +
                '&ResizeArgs=' + data.resizeArgs +
                '&GetBytes=true' +
                '&' + data.modeParameters +
                '&' + data.aditionalParameters +
                '&CurrentFileIndex=' + (currentFileIndex + 1) +
                '&AllowedExtensions=' + data.allowedExtensions, true);

            xhr.onloadend = function (e) {
                var onAfterUpload = xhr.responseText;
                var parts = onAfterUpload.split('|');
                if (parts.length == 2) {
                    // Show error message
                    alert(parts[1]);
                    if (onUploadCompleted) {
                        executeFunctionByName(onUploadCompleted, window, containerId);
                    }
                } else {
                    // Upload file
                    uploadChunks(file);
                }
            };

            // Send request
            xhr.send();
        };

        var uploadChunks = function (file, start) {
            if (!canceled) {
                start = start || 0;

                var chunkSize = 0,
                    nextChunkStart = start + uploadChunkSize,
                    xhr = new XMLHttpRequest();

                xhr.open('post', data.uploadPage +
                    '?InstanceGuid=' + data.instanceGuid +
                    '&filename=' + encodeURIComponent(file.name) +
                    '&FilesCount=' + filesCount +
                    '&ResizeArgs=' + data.resizeArgs +
                    '&complete=' + (nextChunkStart >= file.size).toString() +
                    '&StartByte=' + start +
                    '&' + data.modeParameters +
                    '&' + data.aditionalParameters +
                    '&CurrentFileIndex=' + (currentFileIndex + 1) +
                    '&AllowedExtensions=' + data.allowedExtensions +
                    (canceling ? '&canceled=1' : ''), true);

                xhr.upload.onprogress = function (e) {
                    if (e.lengthComputable && onUploadProgressChanged) {
                        executeFunctionByName(onUploadProgressChanged, window, containerId, totalUploadSize, (currentUploadedSize + e.loaded), 0);
                    }
                };

                xhr.onloadend = function (e) {
                    // Check error
                    var onAfterUpload = xhr.responseText;
                    if (onAfterUpload) {
                        if (onAfterUpload.lastIndexOf("0|", 0) === 0) {
                            // Response contains error message, so display it
                            var parts = onAfterUpload.split('|');
                            alert(parts[1]);
                            cancelUpload();
                            if (onUploadCompleted) {
                                executeFunctionByName(onUploadCompleted, window, containerId);
                            }
                            return;
                        }
                    }

                    currentUploadedSize += chunkSize;
                    if (nextChunkStart < file.size) {
                        // Upload next chunk of file
                        uploadChunks(file, nextChunkStart);
                    } else {
                        filesLeft--;

                        if (filesLeft > 0) {
                            //Upload next file
                            currentFileIndex++;
                            uploadFile(files[currentFileIndex]);
                        } else {
                            // All files uploaded, do after upload actions
                            if (onAfterUpload) {
                                new Function(onAfterUpload)();
                            }
                            if (onUploadCompleted) {
                                executeFunctionByName(onUploadCompleted, window, containerId);
                            }
                        }
                    }
                };

                if (canceling) {
                    canceled = true;
                }

                // Set appropriate headers
                xhr.setRequestHeader('Content-Type', 'application/octet-stream');

                var chunk = file.slice(start, nextChunkStart);
                chunkSize = chunk.size;

                // Send the chunk
                xhr.send(chunk);
            } else {

                if (onUploadCompleted) {
                    executeFunctionByName(onUploadCompleted, window, containerId);
                }
            }
        };

        uploader.onchange = function (e) {
            filesCount = this.files.length;
            if (!filesCount) {
                return;
            }

            currentUploadedSize = 0;
            files = this.files;
            totalUploadSize = calculateTotalUploadSize();
            filesLeft = filesCount;
            currentFileIndex = 0;
            canceling = false;
            canceled = false;

            // Check extensions
            var extension = checkAllowedExtensions();
            if (extension) {
                alert(formatString(window.MFUResources['multifileuploader.extensionnotallowed'], extension, allowedExtensions.replace(/;/g, ', ')));
                return;
            }

            // Check maximum files count
            if (maxNumberToUpload && (filesCount > maxNumberToUpload)) {
                alert(window.MFUResources['multifileuploader.maxnumbertoupload']);
                return;
            }

            // Check max size of single file
            if (maximumUploadSize && (getMaxFileSize() > maximumUploadSize)) {
                alert(formatString(window.MFUResources['multifileuploader.maxuploadsize'], maximumUploadSize));
                return;
            }

            // Check maximum total size of all uploaded files
            if (maximumTotalUpload && (totalUploadSize > maximumTotalUpload)) {
                alert(formatString(window.MFUResources['multifileuploader.maxuploadamount'], maximumTotalUpload));
                return;
            }

            if (onUploadBegin) {
                executeFunctionByName(onUploadBegin, window, containerId);
            }

            uploadFile(files[0]);
        };

        // Executes javascript function with given name
        var executeFunctionByName = function (functionName, context) {
            var args = [].slice.call(arguments).splice(2),
                namespaces = functionName.split("."),
                func = namespaces.pop();

            for (var i = 0; i < namespaces.length; i++) {
                context = context[namespaces[i]];
            }

            return context[func].apply(this, args);
        };

        // Formats string with parameters
        var formatString = function () {
            var theString = arguments[0];

            for (var i = 1; i < arguments.length; i++) {
                var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
                theString = theString.replace(regEx, arguments[i]);
            }

            return theString;
        };
    };

    return MultiFileUploader;
});