/** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE_AFL.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magento.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magento.com for more information. * * @category Mage * @package Mage_Adminhtml * @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ if(!window.Flex) { alert('Flex library not loaded'); } else { Flex.Uploader = Class.create(); Flex.Uploader.prototype = { flex: null, uploader:null, filters:null, containerId:null, flexContainerId:null, container:null, files:null, fileRowTemplate:null, fileProgressTemplate:null, templatesPattern: /(^|.|\r|\n)(\{\{(.*?)\}\})/, onFilesComplete: false, onFileProgress: true, onFileRemove: false, onContainerHideBefore:null, initialize: function(containerId, uploaderSrc, config) { this.containerId = containerId; this.container = $(containerId); this.container.controller = this; this.config = config; this.flexContainerId = this.containerId + '-flash'; Element.insert( // window.document.body, this.containerId, {'before':'
'} ); flexWidth = 230; if (this.config.width) { flexWidth = this.config.width; } this.flex = new Flex.Object({ left: 100, top: 300, width: flexWidth, height: 20, src: uploaderSrc, wmode: 'transparent' }); // this.getInnerElement('browse').disabled = true; // this.getInnerElement('upload').disabled = true; this.fileRowTemplate = new Template( this.getInnerElement('template').innerHTML, this.templatesPattern ); this.fileProgressTemplate = new Template( this.getInnerElement('template-progress').innerHTML, this.templatesPattern ); this.flex.onBridgeInit = this.handleBridgeInit.bind(this); if (this.flex.detectFlashVersion(9, 0, 28)) { this.flex.apply(this.flexContainerId); } else { // this.getInnerElement('browse').hide(); // this.getInnerElement('upload').hide(); this.getInnerElement('install-flash').show(); } this.onContainerHideBefore = this.handleContainerHideBefore.bind(this); }, getInnerElement: function(elementName) { return $(this.containerId + '-' + elementName); }, getFileId: function(file) { var id; if(typeof file == 'object') { id = file.id; } else { id = file; } return this.containerId + '-file-' + id; }, getDeleteButton: function(file) { return $(this.getFileId(file) + '-delete'); }, handleBridgeInit: function() { this.uploader = this.flex.getBridge().getUpload(); if (this.config.filters) { $H(this.config.filters).each(function(pair) { this.uploader.addTypeFilter(pair.key, pair.value.label, pair.value.files); }.bind(this)); delete(this.config.filters); this.uploader.setUseTypeFilter(true); } this.uploader.setConfig(this.config); this.uploader.addEventListener('select', this.handleSelect.bind(this)); this.uploader.addEventListener('complete', this.handleComplete.bind(this)); this.uploader.addEventListener('progress', this.handleProgress.bind(this)); this.uploader.addEventListener('error', this.handleError.bind(this)); this.uploader.addEventListener('removeall', this.handleRemoveAll.bind(this)); // this.getInnerElement('browse').disabled = false; // this.getInnerElement('upload').disabled = false; }, browse: function() { this.uploader.browse(); }, upload: function() { this.uploader.upload(); this.files = this.uploader.getFilesInfo(); this.updateFiles(); }, removeFile: function(id) { this.uploader.removeFile(id); $(this.getFileId(id)).remove(); if (this.onFileRemove) { this.onFileRemove(id); } this.files = this.uploader.getFilesInfo(); this.updateFiles(); }, removeAllFiles: function() { this.files.each(function(file) { this.removeFile(file.id); }.bind(this)); this.files = this.uploader.getFilesInfo(); this.updateFiles(); }, handleSelect: function (event) { this.files = event.getData().files; this.checkFileSize(); this.updateFiles(); this.getInnerElement('upload').show(); if (this.onFileSelect) { this.onFileSelect(); } }, handleProgress: function (event) { var file = event.getData().file; this.updateFile(file); if (this.onFileProgress) { this.onFileProgress(file); } }, handleError: function (event) { this.updateFile(event.getData().file); }, handleComplete: function (event) { this.files = event.getData().files; this.updateFiles(); if (this.onFilesComplete) { this.onFilesComplete(this.files); } }, handleRemoveAll: function (event) { this.files.each(function(file) { $(this.getFileId(file.id)).remove(); }.bind(this)); if (this.onFileRemoveAll) { this.onFileRemoveAll(); } this.files = this.uploader.getFilesInfo(); this.updateFiles(); }, handleRemove: function (event) { this.files = this.uploader.getFilesInfo(); this.updateFiles(); }, updateFiles: function () { this.files.each(function(file) { this.updateFile(file); }.bind(this)); }, updateFile: function (file) { if (!$(this.getFileId(file))) { if (this.config.replace_browse_with_remove) { $(this.containerId+'-new').show(); $(this.containerId+'-new').innerHTML = this.fileRowTemplate.evaluate(this.getFileVars(file)); $(this.containerId+'-old').hide(); this.flex.getBridge().hideBrowseButton(); } else { Element.insert(this.container, {bottom: this.fileRowTemplate.evaluate(this.getFileVars(file))}); } } if (file.status == 'full_complete' && file.response.isJSON()) { var response = file.response.evalJSON(); if (typeof response == 'object') { if (typeof response.cookie == 'object') { var date = new Date(); date.setTime(date.getTime()+(parseInt(response.cookie.lifetime)*1000)); document.cookie = escape(response.cookie.name) + "=" + escape(response.cookie.value) + "; expires=" + date.toGMTString() + (response.cookie.path.blank() ? "" : "; path=" + response.cookie.path) + (response.cookie.domain.blank() ? "" : "; domain=" + response.cookie.domain); } if (typeof response.error != 'undefined' && response.error != 0) { file.status = 'error'; file.errorText = response.error; } } } if (file.status == 'full_complete' && !file.response.isJSON()) { file.status = 'error'; } var progress = $(this.getFileId(file)).getElementsByClassName('progress-text')[0]; if ((file.status=='progress') || (file.status=='complete')) { $(this.getFileId(file)).addClassName('progress'); $(this.getFileId(file)).removeClassName('new'); $(this.getFileId(file)).removeClassName('error'); if (file.progress && file.progress.total) { progress.update(this.fileProgressTemplate.evaluate(this.getFileProgressVars(file))); } else { progress.update(''); } if (! this.config.replace_browse_with_remove) { this.getDeleteButton(file).hide(); } } else if (file.status=='error') { $(this.getFileId(file)).addClassName('error'); $(this.getFileId(file)).removeClassName('progress'); $(this.getFileId(file)).removeClassName('new'); var errorText = file.errorText ? file.errorText : this.errorText(file); if (this.config.replace_browse_with_remove) { this.flex.getBridge().hideBrowseButton(); } else { this.getDeleteButton(file).show(); } progress.update(errorText); } else if (file.status=='full_complete') { $(this.getFileId(file)).addClassName('complete'); $(this.getFileId(file)).removeClassName('progress'); $(this.getFileId(file)).removeClassName('error'); if (this.config.replace_browse_with_remove) { this.flex.getBridge().hideRemoveButton(); } progress.update(this.translate('Complete')); } }, getDebugStr: function(obj) { return Object.toJSON(obj).replace('&', '&').replace('>', '>').replace('<', '<'); }, getFileVars: function(file) { return { id : this.getFileId(file), fileId : file.id, name : file.name, size : this.formatSize(file.size) }; }, getFileProgressVars: function(file) { return { total : this.formatSize(file.progress.total), uploaded : this.formatSize(file.progress.loaded), percent : this.round((file.progress.loaded/file.progress.total)*100) }; }, formatSize: function(size) { if (size > 1024 * 1024 * 1024 * 1024) { return this.round(size / (1024 * 1024 * 1024 * 1024)) + ' ' + this.translate('TB'); } else if (size > 1024 * 1024 * 1024) { return this.round(size / (1024 * 1024 * 1024)) + ' ' + this.translate('GB'); } else if (size > 1024 * 1024) { return this.round(size / (1024 * 1024)) + ' ' + this.translate('MB'); } else if (size > 1024) { return this.round(size / (1024)) + ' ' + this.translate('kB'); } return size + ' ' + this.translate('B'); }, round: function(number) { return Math.round(number*100)/100; }, checkFileSize: function() { newFiles = []; hasTooBigFiles = false; this.files.each(function(file){ if (file.size > maxUploadFileSizeInBytes) { hasTooBigFiles = true; this.uploader.removeFile(file.id) } else { newFiles.push(file) } }.bind(this)); this.files = newFiles; if (hasTooBigFiles) { alert( this.translate('Maximum allowed file size for upload is')+' '+maxUploadFileSize+".\n"+this.translate('Please check your server PHP settings.') ); } }, translate: function(text) { try { if(Translator){ return Translator.translate(text); } } catch(e){} return text; }, errorText: function(file) { var error = ''; switch(file.errorCode) { case 1: // Size 0 error = 'File size should be more than 0 bytes'; break; case 2: // Http error error = 'Upload HTTP Error'; break; case 3: // I/O error error = 'Upload I/O Error'; break; case 4: // Security error error = 'Upload Security Error'; break; case 5: // SSL self-signed certificate error = 'SSL Error: Invalid or self-signed certificate'; break; } if(error) { return this.translate(error); } return error; }, handleContainerHideBefore: function(container) { if (container && Element.descendantOf(this.container, container) && !this.checkAllComplete()) { if (! confirm('There are files that were selected but not uploaded yet. After switching to another tab your selections will be lost. Do you wish to continue ?')) { return 'cannotchange'; } else { this.removeAllFiles(); } } }, checkAllComplete: function() { if (this.files) { return !this.files.any(function(file) { return (file.status !== 'full_complete') }); } return true; } } }