From 8064d65e670d75cfe9709a5de5cc779b24524b5c Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 21 Jun 2011 14:06:17 +0000 Subject: [PATCH] issue 55 : Refactoring flash uploader script git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8528 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/tpl/js/uploader.js | 650 +++++++++++++++--------------- 1 file changed, 329 insertions(+), 321 deletions(-) diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js index 830fbebb2..daed62405 100755 --- a/modules/editor/tpl/js/uploader.js +++ b/modules/editor/tpl/js/uploader.js @@ -3,11 +3,11 @@ * @version 0.1.1 * @brief 파일 업로드 관련 **/ -var uploadedFiles = new Array(); -var uploaderSettings = new Array(); -var loaded_images = new Array(); -var swfUploadObjs = new Array(); -var uploadSettingObj = new Array(); +var uploadedFiles = []; +var uploaderSettings = []; +var loaded_images = []; +var swfUploadObjs = []; +var uploadSettingObj = []; var uploadAutosaveChecker = false; /** @@ -15,374 +15,382 @@ var uploadAutosaveChecker = false; * 이 함수는 editor.html 에서 파일 업로드 가능할 경우 호출됨 **/ // window.load 이벤트일 경우 && 문서 번호가 가상의 번호가 아니면 기존에 저장되어 있을지도 모르는 파일 목록을 가져옴 -function editorUploadInit(obj, exe) { - if(typeof(obj["editorSequence"])=="undefined") return; - if(typeof(obj["sessionName"])=="undefined") obj["sessionName"]= "PHPSESSID"; - if(typeof(obj["allowedFileSize"])=="undefined") obj["allowedFileSize"]= 2*1024*1024; - if(typeof(obj["allowedFileTypes"])=="undefined") obj["allowedFileTypes"]= "*.*"; - if(typeof(obj["allowedFileTypesDescription"])=="undefined") obj["allowedFileTypesDescription"]= "All Files"; - if(typeof(obj["replaceButtonID"])=="undefined") obj["replaceButtonID"] = "swfUploadButton"+obj["editorSequence"]; - if(typeof(obj["insertedFiles"])=="undefined") obj["insertedFiles"] = 0; - if(exe) XEUploaderStart(obj); - if(!exe) xAddEventListener(window,"load",function() { XEUploaderStart(obj) }); - uploadSettingObj[obj["editorSequence"]] = obj; +(function($){ + +var defaultHandlers; + +function init(cfg, exe) { + var seq = cfg.editorSequence; + + if(!is_def(seq)) return; + + cfg = $.extend({ + sessionName : 'PHPSESSID', + allowedFileSize : 2*1024*1024, + allowedFileTypes : '*.*', + allowedFileTypesDescription : 'All Files', + replaceButtonID : 'swfUploadButton'+cfg.editorSequence, + insertedFiles : 0 + }, cfg); + + uploadSettingObj[seq] = cfg; + $(function(){ start(cfg) }); + } -// 파일 업로드를 위한 기본 준비를 함 -function XEUploaderStart(obj) { - try { document.execCommand('BackgroundImageCache',false,true); } catch(e) { } +function start(cfg) { + var $button, width, height, $span, seq, id, settings, handlers, name, fn, swfu, $swf; - var btnObj = xGetElementById(obj["replaceButtonID"]); - var btnWidth = xWidth(btnObj); - var btnHeight = xHeight(btnObj); - btnObj.style.position = "relative"; + seq = cfg.editorSequence; + id = cfg.replaceButtonID; + $button = $('#'+id).css('position', 'relative'); + width = $button.width(); + height = $button.height(); + $span = $('').appendTo($button); - var dummy = xCreateElement("span"); - dummy.id = "dummy"+obj["replaceButtonID"]; - btnObj.appendChild(dummy); + settings = { + flash_url : request_uri + 'modules/editor/tpl/images/SWFUpload.swf', + upload_url : request_uri.replace(/^https/i, 'http')+'index.php', + post_params : { + mid : current_mid, + act : 'procFileUpload', + editor_sequence : seq, + uploadTargetSrl : editorRelKeys[seq].primary.value + }, + http_success : [302], + file_size_limit : Math.floor( (parseInt(cfg.allowedFileSize,10)||1024) / 1024 ), + file_queue_limit : 0, + file_upload_limit : 0, + file_types : cfg.allowedFileTypes, + file_types_description : cfg.allowedFileTypesDescription, + custom_settings : { + progressTarget : null, + cancelButtonId : null + }, + debug : false, - var settings = { - flash_url : request_uri+"modules/editor/tpl/images/SWFUpload.swf", - upload_url: request_uri.replace(/^https/i,'http'), - post_params: { - "mid" : current_mid, - "act" : "procFileUpload", - "editor_sequence" : obj["editorSequence"], - "uploadTargetSrl" : editorRelKeys[obj["editorSequence"]]["primary"].value - }, - file_size_limit : parseInt(parseInt(obj["allowedFileSize"],10)/1024,10), - file_queue_limit : 0, - file_upload_limit : 0, - file_types : obj["allowedFileTypes"], - file_types_description : obj["allowedFileTypesDescription"], - custom_settings : { - progressTarget : null, - cancelButtonId : null - }, - debug: false, + // Button settings + button_window_mode : 'transparent', + button_placeholder : $span.get(0), + button_text : null, + button_image_url : '', + button_width : width, + button_height : height, + button_text_style : null, + button_text_left_padding : 0, + button_text_top_padding : 0, + button_cursor : -2, - // Button settings - button_window_mode: 'transparent', - button_placeholder_id: dummy.id, - button_text: null, - button_image_url: "", - button_width: btnWidth, - button_height: btnHeight, - button_text_style: null, - button_text_left_padding: 0, - button_text_top_padding: 0, - button_cursor:-2, + editorSequence : seq, + uploadTargetSrl : editorRelKeys[seq].primary.value, + fileListAreaID : cfg.fileListAreaID, + previewAreaID : cfg.previewAreaID, + uploaderStatusID : cfg.uploaderStatusID + }; - // The event handler functions are defined in handlers.js - file_queued_handler : fileQueued, - file_queue_error_handler : fileQueueError, - file_dialog_complete_handler : fileDialogComplete, - upload_start_handler : uploadStart, - upload_progress_handler : uploadProgress, - upload_error_handler : uploadError, - upload_success_handler : uploadSuccess, - upload_complete_handler : uploadComplete, - queue_complete_handler :queueComplete - }; - if(typeof(xeVid)!='undefined') settings["post_params"]["vid"] = xeVid; - settings["post_params"][obj["sessionName"]] = xGetCookie(obj["sessionName"]); - settings["editorSequence"] = obj["editorSequence"]; - settings["uploadTargetSrl"] = editorRelKeys[obj["editorSequence"]]["primary"].value; - settings["fileListAreaID"] = obj["fileListAreaID"]; - settings["previewAreaID"] = obj["previewAreaID"]; - settings["uploaderStatusID"] = obj["uploaderStatusID"]; + // preview + $('#'+cfg.fileListAreaID).click(previewFiles); - uploaderSettings[obj["editorSequence"]] = settings; + // The event handler functions are defined in handlers.js + handlers = { + file_queued : 'FileQueued', + file_queue_error : 'FileQueueError', + file_dialog_complete : 'FileDialogComplete', + upload_start : 'UploadStart', + upload_progress : 'UploadProgress', + upload_error : 'UploadError', + upload_success : 'UploadSuccess', + upload_complete : 'UploadComplete', + queue_complete : 'QueueComplete' + }; - var swfu = new SWFUpload(settings); - var swfObj = xGetElementById(swfu.movieName); - swfUploadObjs[obj["editorSequence"]] = swfu.movieName; - if(!swfObj) return; + for(name in handlers) { + if(!handlers.hasOwnProperty(name)) continue; + fn = 'on'+handlers[name]; + settings[name+'_handler'] = cfg['on'+fn] || defaultHandlers[fn]; + } - swfObj.style.display = "block"; - swfObj.style.cursor = "pointer"; - swfObj.style.position = "absolute"; - swfObj.style.left = 0; - swfObj.style.top = "-3px"; - swfObj.style.width = btnWidth+"px"; - swfObj.style.height = btnHeight+"px"; + if(is_def(window.xeVid)) settings.post_params.vid = xeVid; + settings.post_params[cfg.sessionName] = getCookie(cfg.sessionName); - if(obj["insertedFiles"]>0 || editorRelKeys[obj["editorSequence"]]["primary"].value > 0) reloadFileList(settings); + uploaderSettings[seq] = settings; + + swfu = new SWFUpload(settings); + $swf = $('#'+swfu.movieName); + swfUploadObjs[seq] = swfu.movieName; + if(!$swf.length) return; + + $swf.css({ + display : 'block', + cursor : 'pointer', + position : 'absolute', + left : 0, + top : '-3px', + width : width + 'px', + height : height + 'px' + }); + + if(cfg.insertedFiles || editorRelKeys[seq].primary.value) reloadFileList(cfg); } -function fileQueued(file) { -} +function _true(){ return true }; -function fileQueueError(file, errorCode, message) { - try { - switch(errorCode) { - case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED : - alert("You have attempted to queue too many files.\n" + (message === 0 ? "You have reached the upload limit." : "You may select " + (message > 1 ? "up to " + message + " files." : "one file."))); - break; - case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT: - alert("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); - break; - case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: - alert("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); - break; - case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE: - alert("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); - break; - default: - alert("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message); - break; - } - } catch(ex) { - this.debug(ex); - } -} +defaultHandlers = { + onFileQueued : _true, + onFileQueueError : function(flie, errorCode, message) { + try { + switch(errorCode) { + case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED : + alert("You have attempted to queue too many files.\n" + (message === 0 ? "You have reached the upload limit." : "You may select " + (message > 1 ? "up to " + message + " files." : "one file."))); + break; + case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT: + alert("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); + break; + case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: + alert("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); + break; + case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE: + alert("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message); + break; + default: + alert("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message); + break; + } + } catch(e) { + this.debug(e); + } + }, + onFileDialogComplete : function(numFilesSelected, numFilesQueued) { + try { + this.startUpload(); + } catch (e) { + this.debug(e); + } + }, + onUploadStart : _true, + onUploadProgress : function(file, bytesLoaded, bytesTotal) { + try { + var $list, $lastopt, percent, filename; -function fileDialogComplete(numFilesSelected, numFilesQueued) { - try { - this.startUpload(); - } catch (ex) { - this.debug(ex); - } -} + $list = $('#'+this.settings.fileListAreaID); + percent = Math.ceil((bytesLoaded / bytesTotal) * 100); + filename = file.name; + $lastopt = $list.find('>option:last'); -function uploadStart(file) { - return true; -} + if(filename.length>20) filename = filename.substr(0,20)+'...'; + if(!$lastopt.length || $lastopt.attr('value') != file.id) { + $lastopt = $('