Index: branches/5.3.x/core/admin_templates/js/uploader/uploader.js =================================================================== diff -u -N -r15483 -r15902 --- branches/5.3.x/core/admin_templates/js/uploader/uploader.js (.../uploader.js) (revision 15483) +++ branches/5.3.x/core/admin_templates/js/uploader/uploader.js (.../uploader.js) (revision 15902) @@ -7,7 +7,7 @@ // normalize params if (isNaN(parseInt(params.multiple))) { - // ensure that maximal file number is greather then zero + // ensure that maximal file number is greater then zero params.multiple = 1; } @@ -21,22 +21,46 @@ this.params = params; this._ensureDefaultValues(); + this.files = []; this.files_count = 0; - this.files = new Array(); - this.deleted = new Array(); + this.deleted = []; - this.uploadURL = params.uploadURL; + // because used outside this class this.deleteURL = params.deleteURL; this.enableUploadButton(); + this._attachEventHandler(); + + var $me = this; + + if ( this.params.ajax ) { + $(document).bind('FormManager.WindowManager.Ready', function ($e) { + $me.init(); + }); + } + else { + $(document).ready(function() { + $me.init(); + }); + } } /* ==== Private methods ==== */ +Uploader.prototype._attachEventHandler = function() { + var $me = this; + + $(document).bind('UploadsManager.Uploader.' + crc32(this.id), function ($e, $method) { + $me[$method].apply($me, Array.prototype.slice.call(arguments, 2)); + }); +}; + Uploader.prototype._ensureDefaultValues = function() { // Upload backend settings var $defaults = { - baseUrl: '', + baseUrl : '', uploadURL : '', + deleteURL : '', + previewURL : '', useQueryString : false, requeueOnError : false, httpSuccess : '', @@ -45,10 +69,11 @@ allowedFiletypesDescription : 'All Files', allowedFilesize : 0, // Default zero means "unlimited" multiple : 0, - field: '', + field : '', thumb_format: '', - json: '', - previewURL: '', + urls : '', + names : '', + sizes : '', fileQueueLimit : 0, buttonImageURL : '', buttonWidth : 1, @@ -61,16 +86,17 @@ buttonDisabled : true, //false, buttonCursor : -1, // ARROW : -1, HAND : -2 wmode : 'transparent', // "window", "transparent", "opaque" - buttonPlaceholderId: false - } + buttonPlaceholderId: false, + ajax: false + }; for (var $param_name in $defaults) { if (this.params[$param_name] == null) { // console.log('setting default value [', $defaults[$param_name], '] for missing parameter [', $param_name, '] instead of [', this.params[$param_name], ']'); this.params[$param_name] = $defaults[$param_name]; } } -} +}; Uploader.prototype._normalizeFilesize = function($file_size) { var $normalize_size = parseInt($file_size); @@ -80,40 +106,30 @@ // in kilobytes (flash doesn't recognize numbers, that are longer, then 9 digits) return $normalize_size / 1024; -} +}; Uploader.prototype._prepareFiles = function() { - var $files_json = [], $raw_file_info, $file_info; + var ids = ''; + var names = ''; // process uploaded files for (var f = 0; f < this.files.length; f++) { - $raw_file_info = this.files[f]; + if (isset(this.files[f].uploaded) && !isset(this.files[f].temp)) { + continue; + } - $file_info = { - id: $raw_file_info.id, - name: $raw_file_info.name, - size: $raw_file_info.size, - deleted: 0, - temp: $raw_file_info.temp, - order: $raw_file_info.order - }; - - $files_json.push(JSON.stringify($file_info)); + ids += this.files[f].id + '|'; + names += this.files[f].name + '|'; } - // process deleted files; - for (var $i = 0; $i < this.deleted.length; $i++) { - $file_info = { - name: this.deleted[$i], - deleted: 1 - }; + ids = ids.replace(/\|$/, '', ids); + names = names.replace(/\|$/, '', names); - $files_json.push(JSON.stringify($file_info)); - } + document.getElementById(this.id+'[tmp_ids]').value = ids; + document.getElementById(this.id+'[tmp_names]').value = names; + document.getElementById(this.id+'[tmp_deleted]').value = this.deleted.join('|'); +}; - document.getElementById(this.id+'[json]').value = $files_json.join('|'); -} - Uploader.prototype._formatSize = function (bytes) { var kb = Math.round(bytes / 1024); @@ -124,7 +140,7 @@ var mb = Math.round(kb / 1024 * 100) / 100; return mb + ' MB'; -} +}; Uploader.prototype._executeNextEvent = function () { var f = this._eventQueue ? this._eventQueue.shift() : null; @@ -192,40 +208,75 @@ } ) - if (this.params.json != '') { - var $json_decoded = this.params.json.split('|'), $file, $preview_url; + this.refreshQueue(); +}; - for (var $i = 0; $i < $json_decoded.length; $i++) { - $file = JSON.parse($json_decoded[$i]); +Uploader.prototype.refreshQueue = function($params) { + if ( $params !== undefined ) { + $.extend(true, this.params, $params); - if ( $file.deleted ) { - this.deleted.push($file.name); - continue; - } + document.getElementById(this.id+'[upload]').value = this.params.names; + document.getElementById(this.id+'[order]').value = this.params.names; + } - $file.url = this.getUrl($file, 'previewURL'); - $file.uploaded = 1; - $file.progress = 100; + // 1. remove queue DIVs for files, that doesn't exist after upload was made + var $new_file_ids = this.getFileIds(this.params.names); - this.files.push($file); + for (var $i = 0; $i < this.files.length; $i++) { + if ( !in_array(this.files[$i].id, $new_file_ids) ) { + this.updateQueueFile($i, true); + } + } + + this.files = []; + this.files_count = 0; + this.deleted = []; + + if (this.params.urls != '') { + var urls = this.params.urls.split('|'), + names = this.params.names.split('|'), + sizes = this.params.sizes.split('|'); + + for (var i = 0; i < urls.length; i++) { + var a_file = { + id : this.getUploadedFileId(names[i]), + name : names[i], + url : urls[i], + size: sizes[i], + uploaded : 1, + progress: 100 + }; + this.files_count++; + this.files.push(a_file); } this.updateInfo(); } -} +}; -Uploader.prototype.getUrl = function($file, $param_name) { - var $url = this.params[$param_name]; +Uploader.prototype.getFileIds = function($file_names) { + var $ret = []; - $url = $url.replace('#TMP#', $file.temp); - $url = $url.replace('#ID#', $file.id); - $url = $url.replace('#FILE#', encodeURIComponent($file.name)); - $url = $url.replace('#FIELD#', this.params.field); + if ( !$file_names.length ) { + return $ret; + } - return $url; -} + if ( !$.isArray($file_names) ) { + $file_names = $file_names.split('|'); + } + for (var i = 0; i < $file_names.length; i++) { + $ret.push(this.getUploadedFileId($file_names[i])) + } + + return $ret; +}; + +Uploader.prototype.getUploadedFileId = function($file_name) { + return 'uploaded_' + crc32($file_name); +}; + Uploader.prototype.enableUploadButton = function() { var $me = this; @@ -239,14 +290,14 @@ ) } ); -} +}; Uploader.prototype.renderBrowseButton = function() { var holder = document.getElementById(this.params.buttonPlaceholderId); this.swf.write(holder); this.flash = document.getElementById(this.flash_id); -} +}; Uploader.prototype.remove = function() { var id = this.params.buttonPlaceholderId; @@ -274,7 +325,7 @@ obj.parentNode.removeChild(obj); } } -} +}; Uploader.prototype.removeObjectInIE = function(id) { var obj = document.getElementById(id); @@ -286,27 +337,51 @@ } obj.parentNode.removeChild(obj); } -} +}; Uploader.prototype.isImage = function($filename) { - $filename.match(/\.([^.]*)$/); + this.removeTempExtension($filename).match(/\.([^.]*)$/); + var $ext = RegExp.$1.toLowerCase(); return $ext.match(/^(bmp|gif|jpg|jpeg|png)$/); -} +}; Uploader.prototype.getFileIcon = function($filename) { - $filename.match(/\.([^.]*)$/); - var ext = RegExp.$1.toLowerCase(); + this.removeTempExtension($filename).match(/\.([^.]*)$/); - $icon = ext.match(/^(ai|avi|bmp|cs|dll|doc|dot|exe|fla|gif|htm|html|jpg|js|mdb|mp3|pdf|ppt|rdp|swf|swt|txt|vsd|xls|xml|zip)$/) ? ext : 'default.icon'; + var $ext = RegExp.$1.toLowerCase(), + $ext_overrides = { + 'doc': '^(docx|dotx|docm|dotm)$', + 'xls': '^(xlsx|xltx|xlsm|xltm|xlam|xlsb)$', + 'ppt': '^(pptx|potx|ppsx|ppam|pptm|potm|ppsm)$' + }; + + $.each($ext_overrides, function ($new_ext, $expression) { + var $regexp = new RegExp($expression); + + if ( $ext.match($regexp) ) { + $ext = $new_ext; + + return false; + } + + return true; + }); + + var $icon = $ext.match(/^(ai|avi|bmp|cs|dll|doc|dot|exe|fla|gif|htm|html|jpg|js|mdb|mp3|pdf|ppt|rdp|swf|swt|txt|vsd|xls|xml|zip)$/) ? $ext : 'default.icon'; + return this.IconPath + '/' + $icon + '.gif'; -} +}; +Uploader.prototype.removeTempExtension = function ($file) { + return $file.replace(/(_[\d]+)?\.tmp$/, ''); +}; + Uploader.prototype.getQueueElement = function($file) { var $ret = ''; var $icon_image = this.getFileIcon($file.name); - var $file_label = $file.name + ' (' + this._formatSize($file.size) + ')'; + var $file_label = this.removeTempExtension($file.name) + ' (' + this._formatSize($file.size) + ')'; var $need_preview = false; if (isset($file.uploaded)) { @@ -318,13 +393,13 @@ $ret += '
'; if ($need_preview) { - $ret += ''; + $ret += ''; } else { $ret += ''; } - $ret += '
' + $ret += ''; // add filename + preview link $ret += '
' + $file_label + '
'; @@ -351,7 +426,7 @@ $('.delete-file-btn', $ret).click( function ($e) { - $(this).attr('checked', UploadsManager.DeleteFile($me.id, $file) ? '' : 'checked'); + $(this).prop('checked', !UploadsManager.DeleteFile($me.id, $file.name)); } ); @@ -377,21 +452,23 @@ } return $ret; -} +}; -Uploader.prototype.sortFiles = function($ordered_queue) { - var $file_id, $file_index; +Uploader.prototype.getSortedFiles = function($ordered_queue) { + var $me = this; - for (var $i = 0; $i < $ordered_queue.length; $i++) { - $file_id = $ordered_queue[$i].replace(/_queue_row$/, ''); - $file_index = this.getFileIndex({id: $file_id}); + var $ret = $.map($me.files, function ($elem, $index) { + var $file_id = $ordered_queue[$index].replace(/_queue_row$/, ''), + $file_index = $me.getFileIndex({id: $file_id}); - this.files[$file_index].order = $i; - } -} + return $me.files[$file_index].name; + }); + return $ret; +}; + Uploader.prototype.updateQueueFile = function($file_index, $delete_file) { - $queue_container = $( jq('#' + this.id + '_queueinfo') ); + var $queue_container = $( jq('#' + this.id + '_queueinfo') ); if ($delete_file !== undefined && $delete_file) { $( jq('#' + this.files[$file_index].id + '_queue_row') ).remove(); @@ -402,8 +479,8 @@ return ; } - $ret = this.getQueueElement( this.files[$file_index] ); - var $row = $( jq('#' + this.files[$file_index].id + '_queue_row') ); + var $ret = this.getQueueElement(this.files[$file_index]), + $row = $(jq('#' + this.files[$file_index].id + '_queue_row')); if ($row.length > 0) { // file round -> replace @@ -414,7 +491,7 @@ $( jq('#' + this.id + '_queueinfo') ).append($ret); $queue_container.css('margin-top', '8px'); } -} +}; Uploader.prototype.updateInfo = function($file_index, $prepare_only) { if ($prepare_only === undefined || !$prepare_only) { @@ -429,20 +506,19 @@ } this._prepareFiles(); -} +}; Uploader.prototype.updateProgressOnly = function ($file_index) { var $progress_code = '
'; $('#' + this.files[$file_index].id + '_progress').html($progress_code); -} +}; -Uploader.prototype.removeFile = function (file, $mark_deleted) { - var count = 0; - var n_files = new Array(); +Uploader.prototype.removeFile = function (file) { + var count = 0, + n_files = [], + $to_delete = []; - var $to_delete = []; - for (var f = 0; f < this.files.length; f++) { if (this.files[f].id != file.id && this.files[f].name != file.id) { n_files.push(this.files[f]); @@ -460,26 +536,8 @@ this.files = n_files; this.files_count = count; this.updateInfo(undefined, true); +}; - if ( $mark_deleted !== undefined && $mark_deleted === true ) { - this.markDeleted(file.id); - } -} - -Uploader.prototype.markDeleted = function ($file_name) { - if ( !in_array($file_name, this.deleted) ) { - this.deleted.push($file_name); - } -} - -Uploader.prototype.unMarkDeleted = function ($file_name) { - var $file_index = array_search($file_name, this.deleted); - - if ( $file_index !== -1 ) { - this.deleted.splice($file_index, 1); - } -} - Uploader.prototype.hasQueue = function() { for (var f = 0; f < this.files.length; f++) { if (isset(this.files[f].uploaded)) { @@ -490,7 +548,7 @@ } return false; -} +}; Uploader.prototype.startUpload = function() { this.uploadCancelled = false; @@ -500,7 +558,7 @@ } this.callFlash('StartUpload'); -} +}; Uploader.prototype.cancelUpload = function() { this.callFlash('StopUpload'); @@ -512,7 +570,7 @@ } this.uploadCancelled = true; -} +}; Uploader.prototype.UploadFileStart = function(file) { var $file_index = this.getFileIndex(file); @@ -525,13 +583,13 @@ // we can prevent user from adding any files here :) this.callFlash('ReturnUploadStart', [true]); -} +}; Uploader.prototype.UploadProgress = function(file, bytesLoaded, bytesTotal) { var $file_index = this.getFileIndex(file); this.files[$file_index].progress = Math.round(bytesLoaded / bytesTotal * 100); this.updateProgressOnly($file_index); -} +}; Uploader.prototype.UploadSuccess = function(file, serverData, receivedResponse) { if (!receivedResponse) { @@ -544,21 +602,18 @@ this.files[f].name = serverData; } } -} +}; Uploader.prototype.UploadFileComplete = function(file) { // file was uploaded OR file upload was cancelled var $file_index = this.getFileIndex(file); - this.unMarkDeleted(file.name); - if ($file_index !== false) { // in case if file upload was cancelled, then no info here this.files[$file_index].uploaded = 1; this.files[$file_index].progress = 100; this.files[$file_index].temp = 1; - this.files[$file_index].url = this.getUrl(this.files[$file_index], 'previewURL'); - this.files[$file_index].order = $file_index; + this.files[$file_index].url = this.getUrl(this.files[$file_index]); this.updateInfo($file_index); } @@ -571,8 +626,22 @@ else { UploadsManager.UploadQueueComplete(this); } -} +}; +Uploader.prototype.getUrl = function($file, $preview) { + var $url = this.params.previewURL.replace('#FILE#', encodeURIComponent($file.name)).replace('#FIELD#', this.params.field); + + if ( $file.temp !== undefined && $file.temp ) { + $url += '&tmp=1&id=' + $file.id; + } + + if ( $preview !== undefined && $preview === true ) { + $url += '&thumb=1'; + } + + return $url; +}; + Uploader.prototype.getFileIndex = function(file) { for (var f = 0; f < this.files.length; f++) { if (this.files[f].id == file.id) { @@ -581,7 +650,7 @@ } return false; -} +}; Uploader.prototype.queueEvent = function (function_body) { // Warning: Don't call this.debug inside here or you'll create an infinite loop @@ -616,7 +685,7 @@ }, 0 ); -} +}; // Private: callFlash handles function calls made to the Flash element. // Calls are made with a setTimeout for some functions to work around @@ -684,4 +753,4 @@ // process events, queued before flash load this._executeQueuedEvents(); -} \ No newline at end of file +}; \ No newline at end of file