NOISSUE editor 구성파일 minify

This commit is contained in:
bnu 2014-01-21 19:50:39 +09:00
parent 5f1fc942ca
commit 6c5e8fadd0
10 changed files with 734 additions and 728 deletions

View file

@ -60,6 +60,9 @@ module.exports = function(grunt) {
'modules/editor/skins/xpresseditor/js/xpresseditor.min.js': ['modules/editor/skins/xpresseditor/js/xpresseditor.js'], 'modules/editor/skins/xpresseditor/js/xpresseditor.min.js': ['modules/editor/skins/xpresseditor/js/xpresseditor.js'],
'modules/editor/skins/xpresseditor/js/xe_textarea.min.js': ['modules/editor/skins/xpresseditor/js/xe_textarea.js'], 'modules/editor/skins/xpresseditor/js/xe_textarea.min.js': ['modules/editor/skins/xpresseditor/js/xe_textarea.js'],
'modules/editor/tpl/js/editor_common.min.js': ['modules/editor/tpl/js/editor_common.js'], 'modules/editor/tpl/js/editor_common.min.js': ['modules/editor/tpl/js/editor_common.js'],
'modules/editor/tpl/js/swfupload.min.js': ['modules/editor/tpl/js/swfupload.js'],
'modules/editor/tpl/js/uploader.min.js': ['modules/editor/tpl/js/uploader.js'],
'modules/editor/tpl/js/editor.min.js': ['modules/editor/tpl/js/editor.js'],
// module/admin // module/admin
'modules/admin/tpl/js/admin.min.js': ['modules/admin/tpl/js/admin.js'], 'modules/admin/tpl/js/admin.min.js': ['modules/admin/tpl/js/admin.js'],
'modules/admin/tpl/js/config.min.js': ['modules/admin/tpl/js/config.js'], 'modules/admin/tpl/js/config.min.js': ['modules/admin/tpl/js/config.js'],

View file

@ -14,52 +14,52 @@
// editor_sequence값에 해당하는 textarea object를 return // editor_sequence값에 해당하는 textarea object를 return
function editorGetTextArea(editor_sequence) { function editorGetTextArea(editor_sequence) {
return jQuery('#editor_textarea_' + editor_sequence)[0]; return jQuery('#editor_textarea_' + editor_sequence)[0];
} }
function editorGetPreviewArea(editor_sequence) { function editorGetPreviewArea(editor_sequence) {
return jQuery( '#editor_preview_' + editor_sequence )[0]; return jQuery( '#editor_preview_' + editor_sequence )[0];
} }
// editor_sequence에 해당하는 form문 구함 // editor_sequence에 해당하는 form문 구함
function editorGetForm(editor_sequence) { function editorGetForm(editor_sequence) {
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
var fo_obj = iframe_obj.parentNode; var fo_obj = iframe_obj.parentNode;
while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; }
if(fo_obj.nodeName == 'FORM') return fo_obj; if(fo_obj.nodeName == 'FORM') return fo_obj;
return; return;
} }
// 에디터의 전체 내용 return // 에디터의 전체 내용 return
function editorGetContent_xe(editor_sequence) { function editorGetContent_xe(editor_sequence) {
var html = ""; var html = "";
if(editorMode[editor_sequence]=='html') { if(editorMode[editor_sequence]=='html') {
var textarea_obj = editorGetTextArea(editor_sequence); var textarea_obj = editorGetTextArea(editor_sequence);
if(!textarea_obj) return ""; if(!textarea_obj) return "";
html = textarea_obj.value; html = textarea_obj.value;
} else { } else {
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return ""; if(!iframe_obj) return "";
html = jQuery(iframe_obj.contentWindow.document.body).html().replace(/^<br([^>]*)>$/i,''); html = jQuery(iframe_obj.contentWindow.document.body).html().replace(/^<br([^>]*)>$/i,'');
} }
return html; return html;
} }
// 에디터 내의 선택된 부분의 NODE를 return // 에디터 내의 선택된 부분의 NODE를 return
function editorGetSelectedNode(editor_sequence) { function editorGetSelectedNode(editor_sequence) {
var iframe_obj = editorGetIFrame(editor_sequence), w, range; var iframe_obj = editorGetIFrame(editor_sequence), w, range;
w = iframe_obj.contentWindow; w = iframe_obj.contentWindow;
if(w.document.selection) { if(w.document.selection) {
range = w.document.selection.createRange(); range = w.document.selection.createRange();
return jQuery('<div />').html(range.htmlText)[0].firstChild; return jQuery('<div />').html(range.htmlText)[0].firstChild;
} else { } else {
range = w.getSelection().getRangeAt(0); range = w.getSelection().getRangeAt(0);
return jQuery('<div />').append(range.cloneContents())[0].firstChild; return jQuery('<div />').append(range.cloneContents())[0].firstChild;
} }
} }
/** /**
@ -68,136 +68,136 @@ function editorGetSelectedNode(editor_sequence) {
var _editorFontColor = new Array(); var _editorFontColor = new Array();
function editorStart(editor_sequence, primary_key, content_key, editor_height, font_color) { function editorStart(editor_sequence, primary_key, content_key, editor_height, font_color) {
if(typeof(font_color)=='undefined') font_color = '#000'; if(typeof(font_color)=='undefined') font_color = '#000';
_editorFontColor[editor_sequence] = font_color; _editorFontColor[editor_sequence] = font_color;
// iframe obj를 찾음 // iframe obj를 찾음
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
jQuery(iframe_obj).css('width', '100%').parent().css('width', '100%'); jQuery(iframe_obj).css('width', '100%').parent().css('width', '100%');
// 현 에디터를 감싸고 있는 form문을 찾음 // 현 에디터를 감싸고 있는 form문을 찾음
var fo_obj = editorGetForm(editor_sequence); var fo_obj = editorGetForm(editor_sequence);
if(!fo_obj) return; if(!fo_obj) return;
// fo_obj에 editor_sequence 값 지정 // fo_obj에 editor_sequence 값 지정
fo_obj.setAttribute('editor_sequence', editor_sequence); fo_obj.setAttribute('editor_sequence', editor_sequence);
// 모듈 연관 키 값을 세팅 // 모듈 연관 키 값을 세팅
editorRelKeys[editor_sequence] = new Array(); editorRelKeys[editor_sequence] = new Array();
editorRelKeys[editor_sequence]["primary"] = fo_obj[primary_key]; editorRelKeys[editor_sequence]["primary"] = fo_obj[primary_key];
editorRelKeys[editor_sequence]["content"] = fo_obj[content_key]; editorRelKeys[editor_sequence]["content"] = fo_obj[content_key];
editorRelKeys[editor_sequence]["func"] = editorGetContent_xe; editorRelKeys[editor_sequence]["func"] = editorGetContent_xe;
// saved document(자동저장 문서)에 대한 확인 // saved document(자동저장 문서)에 대한 확인
if(typeof(fo_obj._saved_doc_title)!="undefined" ) { ///<< _saved_doc_title field가 없으면 자동저장 하지 않음 if(typeof(fo_obj._saved_doc_title)!="undefined" ) { ///<< _saved_doc_title field가 없으면 자동저장 하지 않음
var saved_title = fo_obj._saved_doc_title.value; var saved_title = fo_obj._saved_doc_title.value;
var saved_content = fo_obj._saved_doc_content.value; var saved_content = fo_obj._saved_doc_content.value;
if(saved_title || saved_content) { if(saved_title || saved_content) {
// 자동저장된 문서 활용여부를 물은 후 사용하지 않는다면 자동저장된 문서 삭제 // 자동저장된 문서 활용여부를 물은 후 사용하지 않는다면 자동저장된 문서 삭제
if(confirm(fo_obj._saved_doc_message.value)) { if(confirm(fo_obj._saved_doc_message.value)) {
if(typeof(fo_obj.title)!='undefined') fo_obj.title.value = saved_title; if(typeof(fo_obj.title)!='undefined') fo_obj.title.value = saved_title;
editorRelKeys[editor_sequence]['content'].value = saved_content; editorRelKeys[editor_sequence]['content'].value = saved_content;
var param = new Array(); var param = new Array();
param['editor_sequence'] = editor_sequence; param['editor_sequence'] = editor_sequence;
param['primary_key'] = primary_key; param['primary_key'] = primary_key;
param['mid'] = current_mid; param['mid'] = current_mid;
var response_tags = new Array("error","message","editor_sequence","key","title","content","document_srl"); var response_tags = new Array("error","message","editor_sequence","key","title","content","document_srl");
exec_xml('editor',"procEditorLoadSavedDocument", param, getAutoSavedSrl, response_tags); exec_xml('editor',"procEditorLoadSavedDocument", param, getAutoSavedSrl, response_tags);
} else { } else {
editorRemoveSavedDoc(); editorRemoveSavedDoc();
} }
} }
} }
// 대상 form의 content element에서 데이터를 구함 // 대상 form의 content element에서 데이터를 구함
var content = editorRelKeys[editor_sequence]['content'].value; var content = editorRelKeys[editor_sequence]['content'].value;
// IE가 아니고 내용이 없으면 <br /> 추가 (FF등에서 iframe 선택시 focus를 주기 위한 꽁수) // IE가 아니고 내용이 없으면 <br /> 추가 (FF등에서 iframe 선택시 focus를 주기 위한 꽁수)
if(!content && !xIE4Up) content = "<br />"; if(!content && !xIE4Up) content = "<br />";
// IE일 경우 ctrl-Enter 안내 문구를 노출 // IE일 경우 ctrl-Enter 안내 문구를 노출
var ieHelpObj = xGetElementById("for_ie_help_"+editor_sequence); var ieHelpObj = xGetElementById("for_ie_help_"+editor_sequence);
if(xIE4Up && ieHelpObj) { if(xIE4Up && ieHelpObj) {
ieHelpObj.style.display = "block"; ieHelpObj.style.display = "block";
} }
// content 생성 // content 생성
editor_path = editor_path.replace(/^\.\//ig, ''); editor_path = editor_path.replace(/^\.\//ig, '');
var contentHtml = ''+ var contentHtml = ''+
'<!DOCTYPE html>'+ '<!DOCTYPE html>'+
'<html><head><meta charset="utf-8"/>'+ '<html><head><meta charset="utf-8"/>'+
'<style>'+ '<style>'+
'body{font-size:.75em;line-height:1.6;font-family:Sans-serif;height:'+editor_height+'px;padding:0;margin:0;background-color:transparent;color:'+font_color+';}'+ 'body{font-size:.75em;line-height:1.6;font-family:Sans-serif;height:'+editor_height+'px;padding:0;margin:0;background-color:transparent;color:'+font_color+';}'+
'</style>'+ '</style>'+
'</head><body editor_sequence="'+editor_sequence+'">'+ '</head><body editor_sequence="'+editor_sequence+'">'+
content+ content+
'</body></html>'+ '</body></html>'+
''; '';
iframe_obj.contentWindow.document.open("text/html","replace"); iframe_obj.contentWindow.document.open("text/html","replace");
iframe_obj.contentWindow.document.write(contentHtml); iframe_obj.contentWindow.document.write(contentHtml);
iframe_obj.contentWindow.document.close(); iframe_obj.contentWindow.document.close();
// editorMode를 기본으로 설정 // editorMode를 기본으로 설정
editorMode[editor_sequence] = null; editorMode[editor_sequence] = null;
// 에디터를 시작 시킴 // 에디터를 시작 시킴
try { try {
iframe_obj.contentWindow.document.designMode = 'On'; iframe_obj.contentWindow.document.designMode = 'On';
} catch(e) { } catch(e) {
} }
try { try {
iframe_obj.contentWindow.document.execCommand("undo", false, null); iframe_obj.contentWindow.document.execCommand("undo", false, null);
iframe_obj.contentWindow.document.execCommand("useCSS", false, true); iframe_obj.contentWindow.document.execCommand("useCSS", false, true);
} catch (e) { } catch (e) {
} }
/** /**
* 더블클릭이나 키눌림등의 각종 이벤트에 대해 listener 추가 * 더블클릭이나 키눌림등의 각종 이벤트에 대해 listener 추가
* 작성시 필요한 이벤트 체크 * 작성시 필요한 이벤트 체크
* 이벤트의 경우 윈도우 sp1 (NT or xp sp1) 에서 iframe_obj.contentWindow.document에 대한 권한이 없기에 try 문으로 감싸서 * 이벤트의 경우 윈도우 sp1 (NT or xp sp1) 에서 iframe_obj.contentWindow.document에 대한 권한이 없기에 try 문으로 감싸서
* 에러를 무시하도록 해야 . * 에러를 무시하도록 해야 .
**/ **/
// 위젯 감시를 위한 더블클릭 이벤트 걸기 // 위젯 감시를 위한 더블클릭 이벤트 걸기
try { try {
jQuery(iframe_obj.contentWindow.document) jQuery(iframe_obj.contentWindow.document)
.unbind('dblclick.widget') .unbind('dblclick.widget')
.bind('dblclick.widget', editorSearchComponent); .bind('dblclick.widget', editorSearchComponent);
} catch(e) { } catch(e) {
} }
// 에디터에서 키가 눌러질때마다 이벤트를 체크함 (enter키의 처리나 FF에서 alt-s등을 처리) // 에디터에서 키가 눌러질때마다 이벤트를 체크함 (enter키의 처리나 FF에서 alt-s등을 처리)
try { try {
if(xIE4Up) xAddEventListener(iframe_obj.contentWindow.document, 'keydown',editorKeyPress); if(xIE4Up) xAddEventListener(iframe_obj.contentWindow.document, 'keydown',editorKeyPress);
else xAddEventListener(iframe_obj.contentWindow.document, 'keypress',editorKeyPress); else xAddEventListener(iframe_obj.contentWindow.document, 'keypress',editorKeyPress);
} catch(e) { } catch(e) {
} }
// 자동저장 필드가 있다면 자동 저장 기능 활성화 // 자동저장 필드가 있다면 자동 저장 기능 활성화
if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, editor_sequence); if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, editor_sequence);
// 좋지는 않으나;; 스타일 변형을 막기 위해 start 할때 html이면 바꿔주자 // 좋지는 않으나;; 스타일 변형을 막기 위해 start 할때 html이면 바꿔주자
if (xGetCookie('editor_mode') == 'html'){ if (xGetCookie('editor_mode') == 'html'){
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block'; if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block';
textarea_obj = editorGetTextArea(editor_sequence); textarea_obj = editorGetTextArea(editor_sequence);
textarea_obj.value = content; textarea_obj.value = content;
xWidth(textarea_obj, xWidth(iframe_obj.parentNode)); xWidth(textarea_obj, xWidth(iframe_obj.parentNode));
xHeight(textarea_obj, xHeight(iframe_obj.parentNode)); xHeight(textarea_obj, xHeight(iframe_obj.parentNode));
editorMode[editor_sequence] = 'html'; editorMode[editor_sequence] = 'html';
if(xGetElementById('xeEditor_'+editor_sequence)) { if(xGetElementById('xeEditor_'+editor_sequence)) {
xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor html'; xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor html';
xGetElementById('use_rich_'+editor_sequence).className = ''; xGetElementById('use_rich_'+editor_sequence).className = '';
xGetElementById('preview_html_'+editor_sequence).className = ''; xGetElementById('preview_html_'+editor_sequence).className = '';
xGetElementById('use_html_'+editor_sequence).className = 'active'; xGetElementById('use_html_'+editor_sequence).className = 'active';
} }
} }
} }
@ -213,211 +213,211 @@ function editorStart(editor_sequence, primary_key, content_key, editor_height, f
// 입력 키에 대한 이벤트 체크 // 입력 키에 대한 이벤트 체크
function editorKeyPress(evt) { function editorKeyPress(evt) {
var e = new xEvent(evt); var e = new xEvent(evt);
// 대상을 구함 // 대상을 구함
var obj = e.target; var obj = e.target;
var body_obj = null; var body_obj = null;
if(obj.nodeName == "BODY") body_obj = obj; if(obj.nodeName == "BODY") body_obj = obj;
else body_obj = obj.firstChild.nextSibling; else body_obj = obj.firstChild.nextSibling;
if(!body_obj) return; if(!body_obj) return;
// editor_sequence는 에디터의 body에 attribute로 정의되어 있음 // editor_sequence는 에디터의 body에 attribute로 정의되어 있음
var editor_sequence = body_obj.getAttribute("editor_sequence"); var editor_sequence = body_obj.getAttribute("editor_sequence");
if(!editor_sequence) return; if(!editor_sequence) return;
// IE에서 enter키를 눌렀을때 P 태그 대신 BR 태그 입력 // IE에서 enter키를 눌렀을때 P 태그 대신 BR 태그 입력
if (xIE4Up && !e.ctrlKey && !e.shiftKey && e.keyCode == 13 && !editorMode[editor_sequence]) { if (xIE4Up && !e.ctrlKey && !e.shiftKey && e.keyCode == 13 && !editorMode[editor_sequence]) {
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
var contentDocument = iframe_obj.contentWindow.document; var contentDocument = iframe_obj.contentWindow.document;
var obj = contentDocument.selection.createRange(); var obj = contentDocument.selection.createRange();
var pTag = obj.parentElement().tagName.toLowerCase(); var pTag = obj.parentElement().tagName.toLowerCase();
switch(pTag) { switch(pTag) {
case 'li' : case 'li' :
return; return;
break; break;
default : default :
obj.pasteHTML("<br />"); obj.pasteHTML("<br />");
break; break;
} }
obj.select(); obj.select();
evt.cancelBubble = true; evt.cancelBubble = true;
evt.returnValue = false; evt.returnValue = false;
return; return;
} }
// ctrl-S, alt-S 클릭시 submit하기 // ctrl-S, alt-S 클릭시 submit하기
if( e.keyCode == 115 && (e.altKey || e.ctrlKey) ) { if( e.keyCode == 115 && (e.altKey || e.ctrlKey) ) {
// iframe 에디터를 찾음 // iframe 에디터를 찾음
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
// 대상 form을 찾음 // 대상 form을 찾음
var fo_obj = editorGetForm(editor_sequence); var fo_obj = editorGetForm(editor_sequence);
if(!fo_obj) return; if(!fo_obj) return;
// 데이터 동기화 // 데이터 동기화
editorRelKeys[editor_sequence]['content'].value = editorGetContent(editor_sequence); editorRelKeys[editor_sequence]['content'].value = editorGetContent(editor_sequence);
// form문 전송 // form문 전송
if(fo_obj.onsubmit) fo_obj.onsubmit(); if(fo_obj.onsubmit) fo_obj.onsubmit();
// 이벤트 중단 // 이벤트 중단
evt.cancelBubble = true; evt.cancelBubble = true;
evt.returnValue = false; evt.returnValue = false;
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
return; return;
} }
// ctrl-b, i, u, s 키에 대한 처리 (파이어폭스에서도 에디터 상태에서 단축키 쓰도록) // ctrl-b, i, u, s 키에 대한 처리 (파이어폭스에서도 에디터 상태에서 단축키 쓰도록)
if (e.ctrlKey) { if (e.ctrlKey) {
// iframe 에디터를 찾음 // iframe 에디터를 찾음
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
// html 에디터 모드일 경우 이벤트 취소 시킴 // html 에디터 모드일 경우 이벤트 취소 시킴
if(editorMode[editor_sequence]) { if(editorMode[editor_sequence]) {
evt.cancelBubble = true; evt.cancelBubble = true;
evt.returnValue = false; evt.returnValue = false;
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
return; return;
} }
switch(e.keyCode) { switch(e.keyCode) {
// ctrl+1~6 // ctrl+1~6
case 49 : case 49 :
case 50 : case 50 :
case 51 : case 51 :
case 52 : case 52 :
case 53 : case 53 :
case 54 : case 54 :
editorDo('formatblock',"<H"+(e.keyCode-48)+">",e.target); editorDo('formatblock',"<H"+(e.keyCode-48)+">",e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
// ctrl+7 // ctrl+7
case 55 : case 55 :
editorDo('formatblock',"<P>",e.target); editorDo('formatblock',"<P>",e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
// ie에서 ctrlKey + enter일 경우 P 태그 입력 // ie에서 ctrlKey + enter일 경우 P 태그 입력
case 13 : case 13 :
if(xIE4Up) { if(xIE4Up) {
if(e.target.parentElement.document.designMode!="On") return; if(e.target.parentElement.document.designMode!="On") return;
var obj = e.target.parentElement.document.selection.createRange(); var obj = e.target.parentElement.document.selection.createRange();
obj.pasteHTML('<P>'); obj.pasteHTML('<P>');
obj.select(); obj.select();
evt.cancelBubble = true; evt.cancelBubble = true;
evt.returnValue = false; evt.returnValue = false;
return; return;
} }
// bold // bold
case 98 : case 98 :
editorDo('Bold',null,e.target); editorDo('Bold',null,e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
// italic // italic
case 105 : case 105 :
editorDo('Italic',null,e.target); editorDo('Italic',null,e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
// underline // underline
case 117 : case 117 :
editorDo('Underline',null,e.target); editorDo('Underline',null,e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
//RemoveFormat //RemoveFormat
case 100 : case 100 :
editorDo('RemoveFormat',null,e.target); editorDo('RemoveFormat',null,e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
// strike // strike
/* /*
case 83 : case 83 :
case 115 : case 115 :
editorDo('StrikeThrough',null,e.target); editorDo('StrikeThrough',null,e.target);
xPreventDefault(evt); xPreventDefault(evt);
xStopPropagation(evt); xStopPropagation(evt);
break; break;
*/ */
} }
} }
} }
// 편집 기능 실행 // 편집 기능 실행
function editorDo(command, value, target) { function editorDo(command, value, target) {
var doc = null; var doc = null;
// target이 object인지 editor_sequence인지에 따라 document를 구함 // target이 object인지 editor_sequence인지에 따라 document를 구함
if(typeof(target)=="object") { if(typeof(target)=="object") {
if(xIE4Up) doc = target.parentElement.document; if(xIE4Up) doc = target.parentElement.document;
else doc = target.parentNode; else doc = target.parentNode;
} else { } else {
var iframe_obj = editorGetIFrame(target); var iframe_obj = editorGetIFrame(target);
doc = iframe_obj.contentWindow.document; doc = iframe_obj.contentWindow.document;
} }
var editor_sequence = doc.body.getAttribute('editor_sequence'); var editor_sequence = doc.body.getAttribute('editor_sequence');
if(editorMode[editor_sequence]) return; if(editorMode[editor_sequence]) return;
// 포커스 // 포커스
if(typeof(target)=="object") target.focus(); if(typeof(target)=="object") target.focus();
else editorFocus(target); else editorFocus(target);
// 실행 // 실행
doc.execCommand(command, false, value); doc.execCommand(command, false, value);
// 포커스 // 포커스
if(typeof(target)=="object") target.focus(); if(typeof(target)=="object") target.focus();
else editorFocus(target); else editorFocus(target);
} }
// 폰트를 변경 // 폰트를 변경
function editorChangeFontName(obj,srl) { function editorChangeFontName(obj,srl) {
var value = obj.options[obj.selectedIndex].value; var value = obj.options[obj.selectedIndex].value;
if(!value) return; if(!value) return;
editorDo('FontName',value,srl); editorDo('FontName',value,srl);
obj.selectedIndex = 0; obj.selectedIndex = 0;
} }
function editorChangeFontSize(obj,srl) { function editorChangeFontSize(obj,srl) {
var value = obj.options[obj.selectedIndex].value; var value = obj.options[obj.selectedIndex].value;
if(!value) return; if(!value) return;
editorDo('FontSize',value,srl); editorDo('FontSize',value,srl);
obj.selectedIndex = 0; obj.selectedIndex = 0;
} }
function editorUnDo(obj,srl) { function editorUnDo(obj,srl) {
editorDo('undo','',srl); editorDo('undo','',srl);
obj.selectedIndex = 0; obj.selectedIndex = 0;
} }
function editorReDo(obj,srl) { function editorReDo(obj,srl) {
editorDo('redo','',srl); editorDo('redo','',srl);
obj.selectedIndex = 0; obj.selectedIndex = 0;
} }
function editorChangeHeader(obj,srl) { function editorChangeHeader(obj,srl) {
var value = obj.options[obj.selectedIndex].value; var value = obj.options[obj.selectedIndex].value;
if(!value) return; if(!value) return;
value = "<"+value+">"; value = "<"+value+">";
editorDo('formatblock',value,srl); editorDo('formatblock',value,srl);
obj.selectedIndex = 0; obj.selectedIndex = 0;
} }
/** /**
@ -426,100 +426,100 @@ function editorChangeHeader(obj,srl) {
function editorChangeMode(mode, editor_sequence) { function editorChangeMode(mode, editor_sequence) {
if(mode == 'html' || mode ==''){ if(mode == 'html' || mode ==''){
var expire = new Date(); var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('editor_mode', mode, expire); xSetCookie('editor_mode', mode, expire);
} }
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return; if(!iframe_obj) return;
var textarea_obj = editorGetTextArea(editor_sequence); var textarea_obj = editorGetTextArea(editor_sequence);
var preview_obj = editorGetPreviewArea(editor_sequence); var preview_obj = editorGetPreviewArea(editor_sequence);
var contentDocument = iframe_obj.contentWindow.document; var contentDocument = iframe_obj.contentWindow.document;
var html = null; var html = null;
if(editorMode[editor_sequence]=='html') { if(editorMode[editor_sequence]=='html') {
html = textarea_obj.value; html = textarea_obj.value;
contentDocument.body.innerHTML = textarea_obj.value; contentDocument.body.innerHTML = textarea_obj.value;
} else if (editorMode[editor_sequence]=='preview') { } else if (editorMode[editor_sequence]=='preview') {
// html = xInnerHtml(preview_obj); // html = xInnerHtml(preview_obj);
html = textarea_obj.value; html = textarea_obj.value;
preview_obj.contentWindow.document.body.innerHTML = ''; preview_obj.contentWindow.document.body.innerHTML = '';
// xAddEventListener(xGetElementById('editor_preview_'+editor_sequence), 'load', function(){setPreviewHeight(editor_sequence)}); // xAddEventListener(xGetElementById('editor_preview_'+editor_sequence), 'load', function(){setPreviewHeight(editor_sequence)});
} else { } else {
html = contentDocument.body.innerHTML; html = contentDocument.body.innerHTML;
textarea_obj.value = html textarea_obj.value = html
html = html.replace(/<br>/ig,"<br />\n"); html = html.replace(/<br>/ig,"<br />\n");
html = html.replace(/<br \/>\n\n/ig,"<br />\n"); html = html.replace(/<br \/>\n\n/ig,"<br />\n");
} }
// html 편집 사용시 // html 편집 사용시
if(mode == 'html' && textarea_obj) { if(mode == 'html' && textarea_obj) {
preview_obj.style.display='none'; preview_obj.style.display='none';
if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block'; if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block';
textarea_obj.value = html; textarea_obj.value = html;
xWidth(textarea_obj, xWidth(iframe_obj.parentNode)); xWidth(textarea_obj, xWidth(iframe_obj.parentNode));
xHeight(textarea_obj, xHeight(iframe_obj.parentNode)); xHeight(textarea_obj, xHeight(iframe_obj.parentNode));
editorMode[editor_sequence] = 'html'; editorMode[editor_sequence] = 'html';
if(xGetElementById('xeEditor_'+editor_sequence)) { if(xGetElementById('xeEditor_'+editor_sequence)) {
xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor html'; xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor html';
xGetElementById('use_rich_'+editor_sequence).className = ''; xGetElementById('use_rich_'+editor_sequence).className = '';
xGetElementById('preview_html_'+editor_sequence).className = ''; xGetElementById('preview_html_'+editor_sequence).className = '';
xGetElementById('use_html_'+editor_sequence).className = 'active'; xGetElementById('use_html_'+editor_sequence).className = 'active';
} }
// 미리보기 // 미리보기
} else if(mode == 'preview' && preview_obj) { } else if(mode == 'preview' && preview_obj) {
preview_obj.style.display=''; preview_obj.style.display='';
if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='none'; if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='none';
var fo_obj = xGetElementById("preview_form"); var fo_obj = xGetElementById("preview_form");
if(!fo_obj) { if(!fo_obj) {
fo_obj = xCreateElement('form'); fo_obj = xCreateElement('form');
fo_obj.id = "preview_form"; fo_obj.id = "preview_form";
fo_obj.method = "post"; fo_obj.method = "post";
fo_obj.action = request_uri; fo_obj.action = request_uri;
fo_obj.target = "editor_preview_"+editor_sequence; fo_obj.target = "editor_preview_"+editor_sequence;
xInnerHtml(fo_obj,'<input type="hidden" name="module" value="editor" /><input type="hidden" name="editor_sequence" value="'+editor_sequence+'" /><input type="hidden" name="act" value="dispEditorPreview" /><input type="hidden" name="content" />'); xInnerHtml(fo_obj,'<input type="hidden" name="module" value="editor" /><input type="hidden" name="editor_sequence" value="'+editor_sequence+'" /><input type="hidden" name="act" value="dispEditorPreview" /><input type="hidden" name="content" />');
document.body.appendChild(fo_obj); document.body.appendChild(fo_obj);
} }
fo_obj.content.value = html; fo_obj.content.value = html;
fo_obj.submit(); fo_obj.submit();
xWidth(preview_obj, xWidth(iframe_obj.parentNode)); xWidth(preview_obj, xWidth(iframe_obj.parentNode));
editorMode[editor_sequence] = 'preview'; editorMode[editor_sequence] = 'preview';
if(xGetElementById('xeEditor_'+editor_sequence)) { if(xGetElementById('xeEditor_'+editor_sequence)) {
xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor preview'; xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor preview';
xGetElementById('use_rich_'+editor_sequence).className = ''; xGetElementById('use_rich_'+editor_sequence).className = '';
xGetElementById('preview_html_'+editor_sequence).className = 'active'; xGetElementById('preview_html_'+editor_sequence).className = 'active';
if(xGetElementById('use_html_'+editor_sequence)) xGetElementById('use_html_'+editor_sequence).className = ''; if(xGetElementById('use_html_'+editor_sequence)) xGetElementById('use_html_'+editor_sequence).className = '';
} }
// 위지윅 모드 사용시 // 위지윅 모드 사용시
} else { } else {
preview_obj.style.display='none'; preview_obj.style.display='none';
if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block'; if(xGetElementById('fileUploader_'+editor_sequence)) xGetElementById('fileUploader_'+editor_sequence).style.display='block';
contentDocument.body.innerHTML = html; contentDocument.body.innerHTML = html;
editorMode[editor_sequence] = null; editorMode[editor_sequence] = null;
if(xGetElementById('xeEditor_'+editor_sequence)) { if(xGetElementById('xeEditor_'+editor_sequence)) {
xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor rich'; xGetElementById('xeEditor_'+editor_sequence).className = 'xeEditor rich';
xGetElementById('use_rich_'+editor_sequence).className = 'active'; xGetElementById('use_rich_'+editor_sequence).className = 'active';
xGetElementById('preview_html_'+editor_sequence).className = ''; xGetElementById('preview_html_'+editor_sequence).className = '';
if(xGetElementById('use_html_'+editor_sequence)) xGetElementById('use_html_'+editor_sequence).className = ''; if(xGetElementById('use_html_'+editor_sequence)) xGetElementById('use_html_'+editor_sequence).className = '';
} }
} }
} }
// Editor Info Close // Editor Info Close
function closeEditorInfo(editor_sequence) { function closeEditorInfo(editor_sequence) {
xGetElementById('editorInfo_'+editor_sequence).style.display='none'; xGetElementById('editorInfo_'+editor_sequence).style.display='none';
var expire = new Date(); var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('EditorInfo', '1', expire); xSetCookie('EditorInfo', '1', expire);
} }
@ -528,39 +528,39 @@ function showEditorHelp(e,editor_sequence){
} }
function showEditorExtension(evt,editor_sequence){ function showEditorExtension(evt,editor_sequence){
var oid = '#editorExtension_'+editor_sequence; var oid = '#editorExtension_'+editor_sequence;
var e = new xEvent(evt); var e = new xEvent(evt);
if(jQuery(oid).hasClass('extension2')){ if(jQuery(oid).hasClass('extension2')){
jQuery(oid).addClass('open'); jQuery(oid).addClass('open');
if(e.pageX <= xWidth('editor_component_'+editor_sequence)){ if(e.pageX <= xWidth('editor_component_'+editor_sequence)){
jQuery('#editor_component_'+editor_sequence).css('right','auto').css('left', 0); jQuery('#editor_component_'+editor_sequence).css('right','auto').css('left', 0);
}else{ }else{
jQuery('#editor_component_'+editor_sequence).css('right', 0).css('left', 'auto'); jQuery('#editor_component_'+editor_sequence).css('right', 0).css('left', 'auto');
} }
}else{ }else{
jQuery(oid).attr('class', 'extension2'); jQuery(oid).attr('class', 'extension2');
} }
} }
function showPreviewContent(editor_sequence) { function showPreviewContent(editor_sequence) {
if(typeof(editor_sequence)=='undefined') return; if(typeof(editor_sequence)=='undefined') return;
if(typeof(_editorFontColor[editor_sequence])=='undefined') return; if(typeof(_editorFontColor[editor_sequence])=='undefined') return;
var preview_obj = editorGetPreviewArea(editor_sequence); var preview_obj = editorGetPreviewArea(editor_sequence);
preview_obj.contentWindow.document.body.style.color = _editorFontColor[editor_sequence]; preview_obj.contentWindow.document.body.style.color = _editorFontColor[editor_sequence];
} }
function setPreviewHeight(editor_sequence){ function setPreviewHeight(editor_sequence){
var h = xGetElementById('editor_preview_'+editor_sequence).contentWindow.document.body.scrollHeight; var h = xGetElementById('editor_preview_'+editor_sequence).contentWindow.document.body.scrollHeight;
if(h < 400) h=400; if(h < 400) h=400;
xHeight('editor_preview_'+editor_sequence,h+20); xHeight('editor_preview_'+editor_sequence,h+20);
} }
function getAutoSavedSrl(ret_obj, response_tags, c) { function getAutoSavedSrl(ret_obj, response_tags, c) {
var editor_sequence = ret_obj['editor_sequence']; var editor_sequence = ret_obj['editor_sequence'];
var primary_key = ret_obj['key']; var primary_key = ret_obj['key'];
var fo_obj = editorGetForm(editor_sequence); var fo_obj = editorGetForm(editor_sequence);
fo_obj[primary_key].value = ret_obj['document_srl']; fo_obj[primary_key].value = ret_obj['document_srl'];
if(uploadSettingObj[editor_sequence]) editorUploadInit(uploadSettingObj[editor_sequence], true); if(uploadSettingObj[editor_sequence]) editorUploadInit(uploadSettingObj[editor_sequence], true);
} }

1
modules/editor/tpl/js/editor.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,17 +1,17 @@
/** /**
* @author NAVER (developers@xpressengine.com) * @author NAVER (developers@xpressengine.com)
* @version 0.1 * @version 0.1
* @brief 에디터 관리자 페이지용 스크립트 * @brief 에디터 관리자 페이지용 스크립트
**/ **/
function doSetupComponent(component_name) { function doSetupComponent(component_name) {
popopen(request_uri.setQuery('module','editor').setQuery('act','dispEditorAdminSetupComponent').setQuery('component_name',component_name), 'SetupComponent'); popopen(request_uri.setQuery('module','editor').setQuery('act','dispEditorAdminSetupComponent').setQuery('component_name',component_name), 'SetupComponent');
} }
function toggleSectionCheckBox(obj, id) { function toggleSectionCheckBox(obj, id) {
var box_list = xGetElementsByTagName('input', xGetElementById(id)); var box_list = xGetElementsByTagName('input', xGetElementById(id));
if(typeof(box_list.length)=='undefined') return; if(typeof(box_list.length)=='undefined') return;
for(var i in box_list) { for(var i in box_list) {
box_list[i].checked = obj.checked; box_list[i].checked = obj.checked;
} }
} }

View file

@ -7,12 +7,12 @@ var editorRelKeys = new Array(); ///< 에디터와 각 모듈과의 연동을
var editorDragObj = {isDrag:false, y:0, obj:null, id:'', det:0, source_height:0} var editorDragObj = {isDrag:false, y:0, obj:null, id:'', det:0, source_height:0}
function editorGetContent(editor_sequence) { function editorGetContent(editor_sequence) {
// 입력된 내용을 받아옴 // 입력된 내용을 받아옴
var content = editorRelKeys[editor_sequence]["func"](editor_sequence); var content = editorRelKeys[editor_sequence]["func"](editor_sequence);
// 첨부파일 링크시 url을 변경 // 첨부파일 링크시 url을 변경
var reg_pattern = new RegExp( request_uri.replace(/\//g,'\\/')+"(files|common|modules|layouts|widgets)", 'ig' ); var reg_pattern = new RegExp( request_uri.replace(/\//g,'\\/')+"(files|common|modules|layouts|widgets)", 'ig' );
return content.replace(reg_pattern, "$1"); return content.replace(reg_pattern, "$1");
} }
// 에디터에 포커스를 줌 // 에디터에 포커스를 줌
@ -32,83 +32,83 @@ function editorFocus(editor_sequence) {
**/ **/
// 자동 저장 활성화 시키는 함수 (50초마다 자동저장) // 자동 저장 활성화 시키는 함수 (50초마다 자동저장)
function editorEnableAutoSave(fo_obj, editor_sequence, callback) { function editorEnableAutoSave(fo_obj, editor_sequence, callback) {
var title = fo_obj.title.value; var title = fo_obj.title.value;
var content = editorRelKeys[editor_sequence]['content'].value; var content = editorRelKeys[editor_sequence]['content'].value;
editorAutoSaveObj = {"fo_obj":fo_obj, "editor_sequence":editor_sequence, "title":title, "content":content, locked:false}; editorAutoSaveObj = {"fo_obj":fo_obj, "editor_sequence":editor_sequence, "title":title, "content":content, locked:false};
clearTimeout(editorEnableAutoSave.timer); clearTimeout(editorEnableAutoSave.timer);
editorEnableAutoSave.timer = setTimeout(function(){_editorAutoSave(false, callback)}, 50000); editorEnableAutoSave.timer = setTimeout(function(){_editorAutoSave(false, callback)}, 50000);
} }
editorEnableAutoSave.timer = null; editorEnableAutoSave.timer = null;
// ajax를 이용하여 editor.procEditorSaveDoc 호출하여 자동 저장시킴 exe는 강제 코드 // ajax를 이용하여 editor.procEditorSaveDoc 호출하여 자동 저장시킴 exe는 강제 코드
function _editorAutoSave(exe, callback) { function _editorAutoSave(exe, callback) {
var fo_obj = editorAutoSaveObj.fo_obj; var fo_obj = editorAutoSaveObj.fo_obj;
var editor_sequence = editorAutoSaveObj.editor_sequence; var editor_sequence = editorAutoSaveObj.editor_sequence;
// 50초마다 동기화를 시킴 강제 실행은 제외 // 50초마다 동기화를 시킴 강제 실행은 제외
if(!exe) { if(!exe) {
clearTimeout(editorEnableAutoSave.timer); clearTimeout(editorEnableAutoSave.timer);
editorEnableAutoSave.timer = setTimeout(function(){ _editorAutoSave(exe, callback) }, 50000); editorEnableAutoSave.timer = setTimeout(function(){ _editorAutoSave(exe, callback) }, 50000);
} }
// 현재 자동저장중이면 중지 // 현재 자동저장중이면 중지
if(editorAutoSaveObj.locked == true) return; if(editorAutoSaveObj.locked == true) return;
// 대상이 없으면 자동저장 시키는 기능 자체를 중지 // 대상이 없으면 자동저장 시키는 기능 자체를 중지
if(!fo_obj || typeof(fo_obj.title)=='undefined' || !editor_sequence) return; if(!fo_obj || typeof(fo_obj.title)=='undefined' || !editor_sequence) return;
// 자동저장을 위한 준비 // 자동저장을 위한 준비
var title = fo_obj.title.value; var title = fo_obj.title.value;
var content = ''; var content = '';
try{ try{
content = editorGetContent(editor_sequence); content = editorGetContent(editor_sequence);
}catch(e){ }catch(e){
} }
// 내용이 이전에 저장하였던 것과 다르면 자동 저장을 함 또는 강제 저장 설정시 자동 저장 // 내용이 이전에 저장하였던 것과 다르면 자동 저장을 함 또는 강제 저장 설정시 자동 저장
if(title != editorAutoSaveObj.title || content != editorAutoSaveObj.content || exe) { if(title != editorAutoSaveObj.title || content != editorAutoSaveObj.content || exe) {
var params, oDate = new Date(); var params, oDate = new Date();
params = { params = {
title : title, title : title,
content : content, content : content,
mid : current_mid, mid : current_mid,
document_srl : editorRelKeys[editor_sequence]['primary'].value document_srl : editorRelKeys[editor_sequence]['primary'].value
}; };
editorAutoSaveObj.title = title; editorAutoSaveObj.title = title;
editorAutoSaveObj.content = content; editorAutoSaveObj.content = content;
// 메시지 만들어서 보여줌 // 메시지 만들어서 보여줌
jQuery("#editor_autosaved_message_"+editor_sequence).text(oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg).show(300); jQuery("#editor_autosaved_message_"+editor_sequence).text(oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg).show(300);
// 현재 자동저장중임을 설정 // 현재 자동저장중임을 설정
editorAutoSaveObj.locked = true; editorAutoSaveObj.locked = true;
// 서버 호출 (서버와 교신중이라는 메세지를 보이지 않도록 함) // 서버 호출 (서버와 교신중이라는 메세지를 보이지 않도록 함)
show_waiting_message = false; show_waiting_message = false;
exec_xml( exec_xml(
"editor", "editor",
"procEditorSaveDoc", "procEditorSaveDoc",
params, params,
function() { function() {
var arg = jQuery.extend({}, params, {auto_saved_msg:auto_saved_msg}); var arg = jQuery.extend({}, params, {auto_saved_msg:auto_saved_msg});
editorAutoSaveObj.locked = false; editorAutoSaveObj.locked = false;
if(jQuery.isFunction(callback)) callback(arg); if(jQuery.isFunction(callback)) callback(arg);
} }
); );
show_waiting_message = true; show_waiting_message = true;
} }
} }
// 자동저장된 모든 메세지를 삭제하는 루틴 // 자동저장된 모든 메세지를 삭제하는 루틴
function editorRemoveSavedDoc() { function editorRemoveSavedDoc() {
var param = new Array(); var param = new Array();
param['mid'] = current_mid; param['mid'] = current_mid;
exec_xml("editor","procEditorRemoveSavedDoc", param); exec_xml("editor","procEditorRemoveSavedDoc", param);
} }
/** /**
@ -117,26 +117,26 @@ function editorRemoveSavedDoc() {
// editor_sequence값에 해당하는 iframe의 object를 return // editor_sequence값에 해당하는 iframe의 object를 return
function editorGetIFrame(editor_sequence) { function editorGetIFrame(editor_sequence) {
if(editorRelKeys != undefined && editorRelKeys[editor_sequence] != undefined && editorRelKeys[editor_sequence]['editor'] != undefined) if(editorRelKeys != undefined && editorRelKeys[editor_sequence] != undefined && editorRelKeys[editor_sequence]['editor'] != undefined)
return editorRelKeys[editor_sequence]['editor'].getFrame(editor_sequence); return editorRelKeys[editor_sequence]['editor'].getFrame(editor_sequence);
return document.getElementById( 'editor_iframe_'+ editor_sequence ); return document.getElementById( 'editor_iframe_'+ editor_sequence );
} }
function editorGetTextarea(editor_sequence) { function editorGetTextarea(editor_sequence) {
return document.getElementById( 'editor_textarea_'+ editor_sequence ); return document.getElementById( 'editor_textarea_'+ editor_sequence );
} }
// Editor Option Button // Editor Option Button
function eOptionOver(obj) { function eOptionOver(obj) {
obj.style.marginTop='-21px'; obj.style.marginTop='-21px';
obj.style.zIndex='99'; obj.style.zIndex='99';
} }
function eOptionOut(obj) { function eOptionOut(obj) {
obj.style.marginTop='0'; obj.style.marginTop='0';
obj.style.zIndex='1'; obj.style.zIndex='1';
} }
function eOptionClick(obj) { function eOptionClick(obj) {
obj.style.marginTop='-42px'; obj.style.marginTop='-42px';
obj.style.zIndex='99'; obj.style.zIndex='99';
} }
/** /**
@ -146,201 +146,201 @@ function eOptionClick(obj) {
// 에디터 상단의 컴포넌트 버튼 클릭시 action 처리 (마우스다운 이벤트 발생시마다 요청이 됨) // 에디터 상단의 컴포넌트 버튼 클릭시 action 처리 (마우스다운 이벤트 발생시마다 요청이 됨)
var editorPrevSrl = null; var editorPrevSrl = null;
function editorEventCheck(e) { function editorEventCheck(e) {
editorPrevNode = null; editorPrevNode = null;
// 이벤트가 발생한 object의 ID를 구함 // 이벤트가 발생한 object의 ID를 구함
var target_id = e.target.id; var target_id = e.target.id;
if(!target_id) return; if(!target_id) return;
// editor_sequence와 component name을 구함 (id가 포맷과 다르면 return) // editor_sequence와 component name을 구함 (id가 포맷과 다르면 return)
var info = target_id.split('_'); var info = target_id.split('_');
if(info[0]!="component") return; if(info[0]!="component") return;
var editor_sequence = info[1]; var editor_sequence = info[1];
var component_name = target_id.replace(/^component_[0-9]+_/,''); var component_name = target_id.replace(/^component_[0-9]+_/,'');
if(!editor_sequence || !component_name) return; if(!editor_sequence || !component_name) return;
if(editorMode[editor_sequence]=='html') return; if(editorMode[editor_sequence]=='html') return;
switch(component_name) { switch(component_name) {
// 기본 기능에 대한 동작 (바로 실행) // 기본 기능에 대한 동작 (바로 실행)
case 'Bold' : case 'Bold' :
case 'Italic' : case 'Italic' :
case 'Underline' : case 'Underline' :
case 'StrikeThrough' : case 'StrikeThrough' :
case 'undo' : case 'undo' :
case 'redo' : case 'redo' :
case 'JustifyLeft' : case 'JustifyLeft' :
case 'JustifyCenter' : case 'JustifyCenter' :
case 'JustifyRight' : case 'JustifyRight' :
case 'JustifyFull' : case 'JustifyFull' :
case 'Indent' : case 'Indent' :
case 'Outdent' : case 'Outdent' :
case 'InsertOrderedList' : case 'InsertOrderedList' :
case 'InsertUnorderedList' : case 'InsertUnorderedList' :
case 'SaveAs' : case 'SaveAs' :
case 'Print' : case 'Print' :
case 'Copy' : case 'Copy' :
case 'Cut' : case 'Cut' :
case 'Paste' : case 'Paste' :
case 'RemoveFormat' : case 'RemoveFormat' :
case 'Subscript' : case 'Subscript' :
case 'Superscript' : case 'Superscript' :
editorDo(component_name, '', editor_sequence); editorDo(component_name, '', editor_sequence);
break; break;
// 추가 컴포넌트의 경우 서버에 요청을 시도 // 추가 컴포넌트의 경우 서버에 요청을 시도
default : default :
openComponent(component_name, editor_sequence); openComponent(component_name, editor_sequence);
return false; return false;
} }
return; return;
} }
jQuery(document).click(editorEventCheck); jQuery(document).click(editorEventCheck);
// 컴포넌트 팝업 열기 // 컴포넌트 팝업 열기
function openComponent(component_name, editor_sequence, manual_url) { function openComponent(component_name, editor_sequence, manual_url) {
editorPrevSrl = editor_sequence; editorPrevSrl = editor_sequence;
if(editorMode[editor_sequence]=='html') return; if(editorMode[editor_sequence]=='html') return;
var popup_url = request_uri+"?module=editor&act=dispEditorPopup&editor_sequence="+editor_sequence+"&component="+component_name; var popup_url = request_uri+"?module=editor&act=dispEditorPopup&editor_sequence="+editor_sequence+"&component="+component_name;
if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url); if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url);
popopen(popup_url, 'editorComponent'); popopen(popup_url, 'editorComponent');
} }
// 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수 // 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수
var editorPrevNode = null; var editorPrevNode = null;
function editorSearchComponent(evt) { function editorSearchComponent(evt) {
var e = new xEvent(evt); var e = new xEvent(evt);
editorPrevNode = null; editorPrevNode = null;
var obj = e.target; var obj = e.target;
// 위젯인지 일단 체크 // 위젯인지 일단 체크
if(obj.getAttribute("widget")) { if(obj.getAttribute("widget")) {
// editor_sequence을 찾음 // editor_sequence을 찾음
var tobj = obj; var tobj = obj;
while(tobj && tobj.nodeName != "BODY") { while(tobj && tobj.nodeName != "BODY") {
tobj = xParent(tobj); tobj = xParent(tobj);
} }
if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) {
editorPrevNode = null; editorPrevNode = null;
return; return;
} }
var editor_sequence = tobj.getAttribute("editor_sequence"); var editor_sequence = tobj.getAttribute("editor_sequence");
var widget = obj.getAttribute("widget"); var widget = obj.getAttribute("widget");
editorPrevNode = obj; editorPrevNode = obj;
if(editorMode[editor_sequence]=='html') return; if(editorMode[editor_sequence]=='html') return;
popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence,'GenerateCodeInPage'); popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence,'GenerateCodeInPage');
return; return;
} }
// 선택되어진 object부터 상단으로 이동하면서 editor_component attribute가 있는지 검사 // 선택되어진 object부터 상단으로 이동하면서 editor_component attribute가 있는지 검사
if(!obj.getAttribute("editor_component")) { if(!obj.getAttribute("editor_component")) {
while(obj && !obj.getAttribute("editor_component")) { while(obj && !obj.getAttribute("editor_component")) {
if(obj.parentElement) obj = obj.parentElement; if(obj.parentElement) obj = obj.parentElement;
else obj = xParent(obj); else obj = xParent(obj);
} }
} }
if(!obj) obj = e.target; if(!obj) obj = e.target;
var editor_component = obj.getAttribute("editor_component"); var editor_component = obj.getAttribute("editor_component");
// editor_component를 찾지 못했을 경우에 이미지/텍스트/링크의 경우 기본 컴포넌트와 연결 // editor_component를 찾지 못했을 경우에 이미지/텍스트/링크의 경우 기본 컴포넌트와 연결
if(!editor_component) { if(!editor_component) {
// 이미지일 경우 // 이미지일 경우
if(obj.nodeName == "IMG" && !obj.getAttribute("widget")) { if(obj.nodeName == "IMG" && !obj.getAttribute("widget")) {
editor_component = "image_link"; editor_component = "image_link";
editorPrevNode = obj; editorPrevNode = obj;
} }
} else { } else {
editorPrevNode = obj; editorPrevNode = obj;
} }
// 아무런 editor_component가 없다면 return // 아무런 editor_component가 없다면 return
if(!editor_component) { if(!editor_component) {
editorPrevNode = null; editorPrevNode = null;
return; return;
} }
// editor_sequence을 찾음 // editor_sequence을 찾음
var tobj = obj; var tobj = obj;
while(tobj && tobj.nodeName != "BODY") { while(tobj && tobj.nodeName != "BODY") {
tobj = xParent(tobj); tobj = xParent(tobj);
} }
if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) {
editorPrevNode = null; editorPrevNode = null;
return; return;
} }
var editor_sequence = tobj.getAttribute("editor_sequence"); var editor_sequence = tobj.getAttribute("editor_sequence");
// 해당 컴포넌트를 찾아서 실행 // 해당 컴포넌트를 찾아서 실행
openComponent(editor_component, editor_sequence); openComponent(editor_component, editor_sequence);
} }
// 에디터 내의 선택된 부분의 html코드를 변경 // 에디터 내의 선택된 부분의 html코드를 변경
function editorReplaceHTML(iframe_obj, html) { function editorReplaceHTML(iframe_obj, html) {
// 이미지 경로 재지정 (rewrite mod) // 이미지 경로 재지정 (rewrite mod)
var srcPathRegx = /src=("|\'){1}(\.\/)?(files\/attach|files\/cache|files\/faceOff|files\/member_extra_info|modules|common|widgets|widgetstyle|layouts|addons)\/([^"\']+)\.(jpg|jpeg|png|gif)("|\'){1}/g; var srcPathRegx = /src=("|\'){1}(\.\/)?(files\/attach|files\/cache|files\/faceOff|files\/member_extra_info|modules|common|widgets|widgetstyle|layouts|addons)\/([^"\']+)\.(jpg|jpeg|png|gif)("|\'){1}/g;
html = html.replace(srcPathRegx, 'src="'+request_uri+'$3/$4.$5"'); html = html.replace(srcPathRegx, 'src="'+request_uri+'$3/$4.$5"');
// href 경로 재지정 (rewrite mod) // href 경로 재지정 (rewrite mod)
var hrefPathRegx = /href=("|\'){1}(\.\/)?\?([^"\']+)("|\'){1}/g; var hrefPathRegx = /href=("|\'){1}(\.\/)?\?([^"\']+)("|\'){1}/g;
html = html.replace(hrefPathRegx, 'href="'+request_uri+'?$3"'); html = html.replace(hrefPathRegx, 'href="'+request_uri+'?$3"');
// 에디터가 활성화 되어 있는지 확인 후 비활성화시 활성화 // 에디터가 활성화 되어 있는지 확인 후 비활성화시 활성화
var editor_sequence = iframe_obj.editor_sequence || iframe_obj.contentWindow.document.body.getAttribute("editor_sequence"); var editor_sequence = iframe_obj.editor_sequence || iframe_obj.contentWindow.document.body.getAttribute("editor_sequence");
// iframe 에디터에 포커스를 둠 // iframe 에디터에 포커스를 둠
try { iframe_obj.contentWindow.focus(); }catch(e){}; try { iframe_obj.contentWindow.focus(); }catch(e){};
if (jQuery.isFunction(iframe_obj.replaceHTML)) { if (jQuery.isFunction(iframe_obj.replaceHTML)) {
iframe_obj.replaceHTML(html); iframe_obj.replaceHTML(html);
} else if(xIE4Up) { } else if(xIE4Up) {
var range = iframe_obj.contentWindow.document.selection.createRange(); var range = iframe_obj.contentWindow.document.selection.createRange();
if(range.pasteHTML) { if(range.pasteHTML) {
range.pasteHTML(html); range.pasteHTML(html);
} else if(editorPrevNode) { } else if(editorPrevNode) {
editorPrevNode.outerHTML = html; editorPrevNode.outerHTML = html;
} }
} else { } else {
try { try {
if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") { if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") {
var range = iframe_obj.contentDocument.createRange(); var range = iframe_obj.contentDocument.createRange();
range.setStart(iframe_obj.contentDocument.body,0); range.setStart(iframe_obj.contentDocument.body,0);
range.setEnd(iframe_obj.contentDocument.body,0); range.setEnd(iframe_obj.contentDocument.body,0);
range.insertNode(range.createContextualFragment(html)); range.insertNode(range.createContextualFragment(html));
} else { } else {
var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); var range = iframe_obj.contentWindow.getSelection().getRangeAt(0);
range.deleteContents(); range.deleteContents();
range.insertNode(range.createContextualFragment(html)); range.insertNode(range.createContextualFragment(html));
} }
} catch(e) { } catch(e) {
xInnerHtml(iframe_obj.contentWindow.document.body, html+xInnerHtml(iframe_obj.contentWindow.document.body)); xInnerHtml(iframe_obj.contentWindow.document.body, html+xInnerHtml(iframe_obj.contentWindow.document.body));
} }
} }
} }
// 에디터 내의 선택된 부분의 html 코드를 return // 에디터 내의 선택된 부분의 html 코드를 return
function editorGetSelectedHtml(editor_sequence) { function editorGetSelectedHtml(editor_sequence) {
var iframe_obj = editorGetIFrame(editor_sequence); var iframe_obj = editorGetIFrame(editor_sequence);
if (jQuery.isFunction(iframe_obj.getSelectedHTML)) { if (jQuery.isFunction(iframe_obj.getSelectedHTML)) {
return iframe_obj.getSelectedHTML(); return iframe_obj.getSelectedHTML();
} else if(xIE4Up) { } else if(xIE4Up) {
var range = iframe_obj.contentWindow.document.selection.createRange(); var range = iframe_obj.contentWindow.document.selection.createRange();
var html = range.htmlText; var html = range.htmlText;
return html; return html;
} else { } else {
var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); var range = iframe_obj.contentWindow.getSelection().getRangeAt(0);
var dummy = xCreateElement('div'); var dummy = xCreateElement('div');
dummy.appendChild(range.cloneContents()); dummy.appendChild(range.cloneContents());
var html = xInnerHtml(dummy); var html = xInnerHtml(dummy);
return html; return html;
} }
} }
@ -355,19 +355,19 @@ var eventObj = null; // event target object
var targetObj = null; // elements to be resized var targetObj = null; // elements to be resized
function editorDragStart(e) { function editorDragStart(e) {
var obj = $(e.target); var obj = $(e.target);
var id = obj.attr('id'); var id = obj.attr('id');
if(!id || !/^editor_drag_bar_(.+)$/.test(id)) return; if(!id || !/^editor_drag_bar_(.+)$/.test(id)) return;
dragging = true; dragging = true;
startY = e.pageY; startY = e.pageY;
eventObj = obj; eventObj = obj;
editorId = RegExp.$1; editorId = RegExp.$1;
var iframe_obj = $( editorGetIFrame(editorId) ); var iframe_obj = $( editorGetIFrame(editorId) );
var textarea_obj = $( editorGetTextarea(editorId) ); var textarea_obj = $( editorGetTextarea(editorId) );
var preview_obj = $('#editor_preview_'+editorId); var preview_obj = $('#editor_preview_'+editorId);
var visible_obj = iframe_obj.is(':visible')?iframe_obj:textarea_obj; var visible_obj = iframe_obj.is(':visible')?iframe_obj:textarea_obj;
startH = parseInt(visible_obj.css('height')); startH = parseInt(visible_obj.css('height'));
@ -391,12 +391,12 @@ function editorDragStart(e) {
} }
function editorDragMove(e) { function editorDragMove(e) {
if(!dragging) { if(!dragging) {
$('#xeEditorMask_' + editorId).hide(); $('#xeEditorMask_' + editorId).hide();
return; return;
} }
var diff = e.pageY - startY; var diff = e.pageY - startY;
targetObj.css('height', (startH + diff)+'px'); targetObj.css('height', (startH + diff)+'px');
return false; return false;
@ -404,7 +404,7 @@ function editorDragMove(e) {
function editorDragStop(e) { function editorDragStop(e) {
$('#xeEditorMask_' + editorId).hide(); $('#xeEditorMask_' + editorId).hide();
if(!dragging) return; if(!dragging) return;
$(document).unbind('mousemove', editorDragMove); $(document).unbind('mousemove', editorDragMove);
@ -414,9 +414,9 @@ function editorDragStop(e) {
fixAdminLayoutFooter( diff ); fixAdminLayoutFooter( diff );
} }
dragging = false; dragging = false;
startY = 0; startY = 0;
eventObj = null; eventObj = null;
targetObj = null; targetObj = null;
editorId = ''; editorId = '';

View file

@ -1,13 +1,13 @@
function getEditorSkinColorList(skin_name,selected_colorset,type,testid){ function getEditorSkinColorList(skin_name,selected_colorset,type,testid){
if(skin_name.length>0){ if(skin_name.length>0){
type = type || 'document'; type = type || 'document';
var response_tags = new Array('error','message','colorset'); var response_tags = new Array('error','message','colorset');
exec_xml('editor','dispEditorSkinColorset',{skin:skin_name},resultGetEditorSkinColorList,response_tags,{'selected_colorset':selected_colorset,'type':type,'testid':testid}); exec_xml('editor','dispEditorSkinColorset',{skin:skin_name},resultGetEditorSkinColorList,response_tags,{'selected_colorset':selected_colorset,'type':type,'testid':testid});
} }
} }
function resultGetEditorSkinColorList(ret_obj,response_tags, params) { function resultGetEditorSkinColorList(ret_obj,response_tags, params) {
var selectbox = null; var selectbox = null;
jQuery(function($){ jQuery(function($){
if(params.testid){ if(params.testid){
selectbox = $("#"+params.testid).next('label').children('select'); selectbox = $("#"+params.testid).next('label').children('select');
@ -19,21 +19,21 @@ function resultGetEditorSkinColorList(ret_obj,response_tags, params) {
if(params.type == 'document'){ if(params.type == 'document'){
$("select[name=sel_editor_colorset]").hide() $("select[name=sel_editor_colorset]").hide()
.removeAttr('name'); .removeAttr('name');
selectbox.attr('name','sel_editor_colorset'); selectbox.attr('name','sel_editor_colorset');
}else{ }else{
$("select[name=sel_comment_editor_colorset]").hide() $("select[name=sel_comment_editor_colorset]").hide()
.removeAttr('name'); .removeAttr('name');
selectbox.attr('name','sel_comment_editor_colorset'); selectbox.attr('name','sel_comment_editor_colorset');
} }
if(ret_obj['error'] == 0 && ret_obj.colorset){ if(ret_obj['error'] == 0 && ret_obj.colorset){
var it = new Array(); var it = new Array();
var items = ret_obj['colorset']['item']; var items = ret_obj['colorset']['item'];
if(typeof(items[0]) == 'undefined'){ if(typeof(items[0]) == 'undefined'){
it[0] = items; it[0] = items;
}else{ }else{
it = items; it = items;
} }
var selectAttr = ""; var selectAttr = "";
for(var i=0;i<it.length;i++){ for(var i=0;i<it.length;i++){
var $options = $('<option value="'+it[i].name+'" >'+it[i].title+'</option>'); var $options = $('<option value="'+it[i].name+'" >'+it[i].title+'</option>');
@ -42,7 +42,7 @@ function resultGetEditorSkinColorList(ret_obj,response_tags, params) {
$options.attr('selected', 'selected'); $options.attr('selected', 'selected');
} }
selectbox.append($options); selectbox.append($options);
} }
selectbox.show(); selectbox.show();
}else{ }else{

View file

@ -97,18 +97,18 @@ SWFUpload.completeURL = function(url) {
if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) { if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
return url; return url;
} }
var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : ""); var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
var indexSlash = window.location.pathname.lastIndexOf("/"); var indexSlash = window.location.pathname.lastIndexOf("/");
if (indexSlash <= 0) { if (indexSlash <= 0) {
path = "/"; path = "/";
} else { } else {
path = window.location.pathname.substr(0, indexSlash) + "/"; path = window.location.pathname.substr(0, indexSlash) + "/";
} }
return /*currentURL +*/ path + url; return /*currentURL +*/ path + url;
}; };
@ -122,7 +122,7 @@ SWFUpload.prototype.initSettings = function () {
this.ensureDefault = function (settingName, defaultValue) { this.ensureDefault = function (settingName, defaultValue) {
this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
}; };
// Upload backend settings // Upload backend settings
this.ensureDefault("upload_url", ""); this.ensureDefault("upload_url", "");
this.ensureDefault("preserve_relative_urls", false); this.ensureDefault("preserve_relative_urls", false);
@ -132,7 +132,7 @@ SWFUpload.prototype.initSettings = function () {
this.ensureDefault("requeue_on_error", false); this.ensureDefault("requeue_on_error", false);
this.ensureDefault("http_success", []); this.ensureDefault("http_success", []);
this.ensureDefault("assume_success_timeout", 0); this.ensureDefault("assume_success_timeout", 0);
// File Settings // File Settings
this.ensureDefault("file_types", "*.*"); this.ensureDefault("file_types", "*.*");
this.ensureDefault("file_types_description", "All Files"); this.ensureDefault("file_types_description", "All Files");
@ -143,7 +143,7 @@ SWFUpload.prototype.initSettings = function () {
// Flash Settings // Flash Settings
this.ensureDefault("flash_url", "swfupload.swf"); this.ensureDefault("flash_url", "swfupload.swf");
this.ensureDefault("prevent_swf_caching", true); this.ensureDefault("prevent_swf_caching", true);
// Button Settings // Button Settings
this.ensureDefault("button_image_url", ""); this.ensureDefault("button_image_url", "");
this.ensureDefault("button_width", 1); this.ensureDefault("button_width", 1);
@ -158,11 +158,11 @@ SWFUpload.prototype.initSettings = function () {
this.ensureDefault("button_placeholder", null); this.ensureDefault("button_placeholder", null);
this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW); this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW); this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
// Debug Settings // Debug Settings
this.ensureDefault("debug", false); this.ensureDefault("debug", false);
this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API
// Event Handlers // Event Handlers
this.settings.return_upload_start_handler = this.returnUploadStart; this.settings.return_upload_start_handler = this.returnUploadStart;
this.ensureDefault("swfupload_loaded_handler", null); this.ensureDefault("swfupload_loaded_handler", null);
@ -170,31 +170,31 @@ SWFUpload.prototype.initSettings = function () {
this.ensureDefault("file_queued_handler", null); this.ensureDefault("file_queued_handler", null);
this.ensureDefault("file_queue_error_handler", null); this.ensureDefault("file_queue_error_handler", null);
this.ensureDefault("file_dialog_complete_handler", null); this.ensureDefault("file_dialog_complete_handler", null);
this.ensureDefault("upload_start_handler", null); this.ensureDefault("upload_start_handler", null);
this.ensureDefault("upload_progress_handler", null); this.ensureDefault("upload_progress_handler", null);
this.ensureDefault("upload_error_handler", null); this.ensureDefault("upload_error_handler", null);
this.ensureDefault("upload_success_handler", null); this.ensureDefault("upload_success_handler", null);
this.ensureDefault("upload_complete_handler", null); this.ensureDefault("upload_complete_handler", null);
this.ensureDefault("debug_handler", this.debugMessage); this.ensureDefault("debug_handler", this.debugMessage);
this.ensureDefault("custom_settings", {}); this.ensureDefault("custom_settings", {});
// Other settings // Other settings
this.customSettings = this.settings.custom_settings; this.customSettings = this.settings.custom_settings;
// Update the flash url if needed // Update the flash url if needed
if (!!this.settings.prevent_swf_caching) { if (!!this.settings.prevent_swf_caching) {
this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime(); this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
} }
if (!this.settings.preserve_relative_urls) { if (!this.settings.preserve_relative_urls) {
//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it //this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it
this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url); this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url); this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
} }
delete this.ensureDefault; delete this.ensureDefault;
}; };
@ -223,7 +223,7 @@ SWFUpload.prototype.loadFlash = function () {
if (window[this.movieName] == undefined) { if (window[this.movieName] == undefined) {
window[this.movieName] = this.getMovieElement(); window[this.movieName] = this.getMovieElement();
} }
}; };
// Private: getFlashHTML generates the object tag needed to embed the flash in to the document // Private: getFlashHTML generates the object tag needed to embed the flash in to the document
@ -245,7 +245,7 @@ SWFUpload.prototype.getFlashVars = function () {
// Build a string from the post param object // Build a string from the post param object
var paramString = this.buildParamString(); var paramString = this.buildParamString();
var httpSuccessString = this.settings.http_success.join(","); var httpSuccessString = this.settings.http_success.join(",");
// Build the parameter string // Build the parameter string
return ["movieName=", encodeURIComponent(this.movieName), return ["movieName=", encodeURIComponent(this.movieName),
"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url), "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
@ -284,14 +284,14 @@ SWFUpload.prototype.getMovieElement = function () {
if (this.movieElement === null) { if (this.movieElement === null) {
throw "Could not find Flash element"; throw "Could not find Flash element";
} }
return this.movieElement; return this.movieElement;
}; };
// Private: buildParamString takes the name/value pairs in the post_params setting object // Private: buildParamString takes the name/value pairs in the post_params setting object
// and joins them up in to a string formatted "name=value&amp;name=value" // and joins them up in to a string formatted "name=value&amp;name=value"
SWFUpload.prototype.buildParamString = function () { SWFUpload.prototype.buildParamString = function () {
var postParams = this.settings.post_params; var postParams = this.settings.post_params;
var paramStringPairs = []; var paramStringPairs = [];
if (typeof(postParams) === "object") { if (typeof(postParams) === "object") {
@ -313,12 +313,12 @@ SWFUpload.prototype.destroy = function () {
try { try {
// Make sure Flash is done before we try to remove it // Make sure Flash is done before we try to remove it
this.cancelUpload(null, false); this.cancelUpload(null, false);
// Remove the SWFUpload DOM nodes // Remove the SWFUpload DOM nodes
var movieElement = null; var movieElement = null;
movieElement = this.getMovieElement(); movieElement = this.getMovieElement();
if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround) // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
for (var i in movieElement) { for (var i in movieElement) {
@ -334,7 +334,7 @@ SWFUpload.prototype.destroy = function () {
movieElement.parentNode.removeChild(movieElement); movieElement.parentNode.removeChild(movieElement);
} catch (ex) {} } catch (ex) {}
} }
// Remove IE form fix reference // Remove IE form fix reference
window[this.movieName] = null; window[this.movieName] = null;
@ -347,8 +347,8 @@ SWFUpload.prototype.destroy = function () {
this.customSettings = null; this.customSettings = null;
this.eventQueue = null; this.eventQueue = null;
this.movieName = null; this.movieName = null;
return true; return true;
} catch (ex2) { } catch (ex2) {
return false; return false;
@ -417,20 +417,20 @@ SWFUpload.prototype.displayDebugInfo = function () {
*/ */
// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used. // Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
SWFUpload.prototype.addSetting = function (name, value, default_value) { SWFUpload.prototype.addSetting = function (name, value, default_value) {
if (value == undefined) { if (value == undefined) {
return (this.settings[name] = default_value); return (this.settings[name] = default_value);
} else { } else {
return (this.settings[name] = value); return (this.settings[name] = value);
} }
}; };
// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found. // Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
SWFUpload.prototype.getSetting = function (name) { SWFUpload.prototype.getSetting = function (name) {
if (this.settings[name] != undefined) { if (this.settings[name] != undefined) {
return this.settings[name]; return this.settings[name];
} }
return ""; return "";
}; };
@ -440,7 +440,7 @@ SWFUpload.prototype.getSetting = function (name) {
// bugs in the ExternalInterface library. // bugs in the ExternalInterface library.
SWFUpload.prototype.callFlash = function (functionName, argumentArray) { SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
argumentArray = argumentArray || []; argumentArray = argumentArray || [];
var movieElement = this.getMovieElement(); var movieElement = this.getMovieElement();
var returnValue, returnString; var returnValue, returnString;
@ -451,7 +451,7 @@ SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
} catch (ex) { } catch (ex) {
throw "Call to " + functionName + " failed"; throw "Call to " + functionName + " failed";
} }
// Unescape file post param values // Unescape file post param values
if (returnValue != undefined && typeof returnValue.post === "object") { if (returnValue != undefined && typeof returnValue.post === "object") {
returnValue = this.unescapeFilePostParams(returnValue); returnValue = this.unescapeFilePostParams(returnValue);
@ -485,7 +485,7 @@ SWFUpload.prototype.selectFiles = function () {
// Public: startUpload starts uploading the first file in the queue unless // Public: startUpload starts uploading the first file in the queue unless
// the optional parameter 'fileID' specifies the ID // the optional parameter 'fileID' specifies the ID
SWFUpload.prototype.startUpload = function (fileID) { SWFUpload.prototype.startUpload = function (fileID) {
this.callFlash("StartUpload", [fileID]); this.callFlash("StartUpload", [fileID]);
}; };
@ -519,7 +519,7 @@ SWFUpload.prototype.getStats = function () {
return this.callFlash("GetStats"); return this.callFlash("GetStats");
}; };
// Public: setStats changes the SWFUpload statistics. You shouldn't need to // Public: setStats changes the SWFUpload statistics. You shouldn't need to
// change the statistics but you can. Changing the statistics does not // change the statistics but you can. Changing the statistics does not
// affect SWFUpload accept for the successful_uploads count which is used // affect SWFUpload accept for the successful_uploads count which is used
// by the upload_limit setting to determine how many files the user may upload. // by the upload_limit setting to determine how many files the user may upload.
@ -622,7 +622,7 @@ SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
if (typeof http_status_codes === "string") { if (typeof http_status_codes === "string") {
http_status_codes = http_status_codes.replace(" ", "").split(","); http_status_codes = http_status_codes.replace(" ", "").split(",");
} }
this.settings.http_success = http_status_codes; this.settings.http_success = http_status_codes;
this.callFlash("SetHTTPSuccess", [http_status_codes]); this.callFlash("SetHTTPSuccess", [http_status_codes]);
}; };
@ -644,7 +644,7 @@ SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
if (buttonImageURL == undefined) { if (buttonImageURL == undefined) {
buttonImageURL = ""; buttonImageURL = "";
} }
this.settings.button_image_url = buttonImageURL; this.settings.button_image_url = buttonImageURL;
this.callFlash("SetButtonImageURL", [buttonImageURL]); this.callFlash("SetButtonImageURL", [buttonImageURL]);
}; };
@ -653,13 +653,13 @@ SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
SWFUpload.prototype.setButtonDimensions = function (width, height) { SWFUpload.prototype.setButtonDimensions = function (width, height) {
this.settings.button_width = width; this.settings.button_width = width;
this.settings.button_height = height; this.settings.button_height = height;
var movie = this.getMovieElement(); var movie = this.getMovieElement();
if (movie != undefined) { if (movie != undefined) {
movie.style.width = width + "px"; movie.style.width = width + "px";
movie.style.height = height + "px"; movie.style.height = height + "px";
} }
this.callFlash("SetButtonDimensions", [width, height]); this.callFlash("SetButtonDimensions", [width, height]);
}; };
// Public: setButtonText Changes the text overlaid on the button // Public: setButtonText Changes the text overlaid on the button
@ -700,9 +700,9 @@ SWFUpload.prototype.setButtonCursor = function (cursor) {
Flash Event Interfaces Flash Event Interfaces
These functions are used by Flash to trigger the various These functions are used by Flash to trigger the various
events. events.
All these functions a Private. All these functions a Private.
Because the ExternalInterface library is buggy the event calls Because the ExternalInterface library is buggy the event calls
are added to a queue and the queue then executed by a setTimeout. are added to a queue and the queue then executed by a setTimeout.
This ensures that events are executed in a determinate order and that This ensures that events are executed in a determinate order and that
@ -711,25 +711,25 @@ SWFUpload.prototype.setButtonCursor = function (cursor) {
SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) { SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
// Warning: Don't call this.debug inside here or you'll create an infinite loop // Warning: Don't call this.debug inside here or you'll create an infinite loop
if (argumentArray == undefined) { if (argumentArray == undefined) {
argumentArray = []; argumentArray = [];
} else if (!(argumentArray instanceof Array)) { } else if (!(argumentArray instanceof Array)) {
argumentArray = [argumentArray]; argumentArray = [argumentArray];
} }
var self = this; var self = this;
if (typeof this.settings[handlerName] === "function") { if (typeof this.settings[handlerName] === "function") {
// Queue the event // Queue the event
this.eventQueue.push(function () { this.eventQueue.push(function () {
this.settings[handlerName].apply(this, argumentArray); this.settings[handlerName].apply(this, argumentArray);
}); });
// Execute the next queued event // Execute the next queued event
setTimeout(function () { setTimeout(function () {
self.executeNextEvent(); self.executeNextEvent();
}, 0); }, 0);
} else if (this.settings[handlerName] !== null) { } else if (this.settings[handlerName] !== null) {
throw "Event handler " + handlerName + " is unknown or is not a function"; throw "Event handler " + handlerName + " is unknown or is not a function";
} }
@ -793,7 +793,7 @@ SWFUpload.prototype.flashReady = function () {
} }
this.cleanUp(movieElement); this.cleanUp(movieElement);
this.queueEvent("swfupload_loaded_handler"); this.queueEvent("swfupload_loaded_handler");
}; };
@ -814,7 +814,7 @@ SWFUpload.prototype.cleanUp = function (movieElement) {
} }
} }
} catch (ex1) { } catch (ex1) {
} }
// Fix Flashes own cleanup code so if the SWFMovie was removed from the page // Fix Flashes own cleanup code so if the SWFMovie was removed from the page
@ -825,7 +825,7 @@ SWFUpload.prototype.cleanUp = function (movieElement) {
instance[name] = null; instance[name] = null;
} }
} catch (flashEx) { } catch (flashEx) {
} }
}; };
@ -876,9 +876,9 @@ SWFUpload.prototype.returnUploadStart = function (file) {
if (returnValue === undefined) { if (returnValue === undefined) {
returnValue = true; returnValue = true;
} }
returnValue = !!returnValue; returnValue = !!returnValue;
this.callFlash("ReturnUploadStart", [returnValue]); this.callFlash("ReturnUploadStart", [returnValue]);
}; };
@ -918,12 +918,12 @@ SWFUpload.prototype.debug = function (message) {
itself to the body if necessary. itself to the body if necessary.
The console is automatically scrolled as messages appear. The console is automatically scrolled as messages appear.
If you are using your own debug handler or when you deploy to production and If you are using your own debug handler or when you deploy to production and
have debug disabled you can remove these functions to reduce the file size have debug disabled you can remove these functions to reduce the file size
and complexity. and complexity.
********************************** */ ********************************** */
// Private: debugMessage is the default debug_handler. If you want to print debug messages // Private: debugMessage is the default debug_handler. If you want to print debug messages
// call the debug() function. When overriding the function your own function should // call the debug() function. When overriding the function your own function should
// check to see if the debug setting is true before outputting debug information. // check to see if the debug setting is true before outputting debug information.

File diff suppressed because one or more lines are too long

View file

@ -33,7 +33,7 @@ function init(cfg, exe) {
insertedFiles : 0 insertedFiles : 0
}, cfg); }, cfg);
uploadSettingObj[seq] = cfg; uploadSettingObj[seq] = cfg;
$(function(){ start(cfg) }); $(function(){ start(cfg) });
} }
@ -352,7 +352,7 @@ function previewFiles(event, file_srl) {
if(fileinfo.direct_download != 'Y' || !match) { if(fileinfo.direct_download != 'Y' || !match) {
html = '<img src="'+request_uri+'modules/editor/tpl/images/files.gif" border="0" width="100%" height="100%" />'; html = '<img src="'+request_uri+'modules/editor/tpl/images/files.gif" border="0" width="100%" height="100%" />';
} else if(match[1]) { // flash video file } else if(match[1]) { // flash video file
html = '<embed src="'+request_uri+'common/img/flvplayer.swf?autoStart=false&file='+uploaded_filename+'" width="100%" height="100%" type="application/x-shockwave-flash" />'; html = '<embed src="'+request_uri+'common/img/flvplayer.swf?autoStart=false&file='+uploaded_filename+'" width="100%" height="100%" type="application/x-shockwave-flash" />';
} else if(match[2]) { // shockwave flash file } else if(match[2]) { // shockwave flash file
html = '<embed src="'+request_uri+filename+'" width="100%" height="100%" type="application/x-shockwave-flash" />'; html = '<embed src="'+request_uri+filename+'" width="100%" height="100%" type="application/x-shockwave-flash" />';
} else if(match[3]) { // movie file } else if(match[3]) { // movie file
@ -392,60 +392,60 @@ function removeUploadedFile(editorSequence) {
function insertUploadedFile(editorSequence) { function insertUploadedFile(editorSequence) {
var settings = uploaderSettings[editorSequence]; var settings = uploaderSettings[editorSequence];
var fileListAreaID = settings["fileListAreaID"]; var fileListAreaID = settings["fileListAreaID"];
var fileListObj = get_by_id(fileListAreaID); var fileListObj = get_by_id(fileListAreaID);
if(!fileListObj) return; if(!fileListObj) return;
if(editorMode[editorSequence]=='preview') return; if(editorMode[editorSequence]=='preview') return;
var text = new Array(); var text = new Array();
for(var i=0;i<fileListObj.options.length;i++) { for(var i=0;i<fileListObj.options.length;i++) {
if(!fileListObj.options[i].selected) continue; if(!fileListObj.options[i].selected) continue;
var file_srl = fileListObj.options[i].value; var file_srl = fileListObj.options[i].value;
if(!file_srl) continue; if(!file_srl) continue;
var file = uploadedFiles[file_srl]; var file = uploadedFiles[file_srl];
editorFocus(editorSequence); editorFocus(editorSequence);
// 바로 링크 가능한 파일의 경우 (이미지, 플래쉬, 동영상 등..) // 바로 링크 가능한 파일의 경우 (이미지, 플래쉬, 동영상 등..)
if(file.direct_download == 'Y') { if(file.direct_download == 'Y') {
// 이미지 파일의 경우 image_link 컴포넌트 열결 // 이미지 파일의 경우 image_link 컴포넌트 열결
if(/\.(jpg|jpeg|png|gif)$/i.test(file.download_url)) { if(/\.(jpg|jpeg|png|gif)$/i.test(file.download_url)) {
if(loaded_images[file_srl]) { if(loaded_images[file_srl]) {
var obj = loaded_images[file_srl]; var obj = loaded_images[file_srl];
} }
else { else {
var obj = new Image(); var obj = new Image();
obj.src = file.download_url; obj.src = file.download_url;
} }
temp_code = ''; temp_code = '';
temp_code += "<img src=\""+file.download_url+"\" alt=\""+file.source_filename+"\""; temp_code += "<img src=\""+file.download_url+"\" alt=\""+file.source_filename+"\"";
if(obj.complete == true) { temp_code += " width=\""+obj.width+"\" height=\""+obj.height+"\""; } if(obj.complete == true) { temp_code += " width=\""+obj.width+"\" height=\""+obj.height+"\""; }
temp_code += " />\r\n"; temp_code += " />\r\n";
text.push(temp_code); text.push(temp_code);
// 이미지외의 경우는 multimedia_link 컴포넌트 연결 } else {
} else { // 이미지외의 경우는 multimedia_link 컴포넌트 연결
text.push("<img src=\"common/img/blank.gif\" editor_component=\"multimedia_link\" multimedia_src=\""+file.download_url+"\" width=\"400\" height=\"320\" style=\"display:block;width:400px;height:320px;border:2px dotted #4371B9;background:url(./modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif) no-repeat center;\" auto_start=\"false\" alt=\"\" />"); text.push("<img src=\"common/img/blank.gif\" editor_component=\"multimedia_link\" multimedia_src=\""+file.download_url+"\" width=\"400\" height=\"320\" style=\"display:block;width:400px;height:320px;border:2px dotted #4371B9;background:url(./modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif) no-repeat center;\" auto_start=\"false\" alt=\"\" />");
} }
// binary파일의 경우 url_link 컴포넌트 연결 } else {
} else { // binary파일의 경우 url_link 컴포넌트 연결
text.push("<a href=\""+file.download_url+"\">"+file.source_filename+"</a>\n"); text.push("<a href=\""+file.download_url+"\">"+file.source_filename+"</a>\n");
} }
} }
// html 모드 // html 모드
if(editorMode[editorSequence]=='html'){ if(editorMode[editorSequence]=='html'){
if(text.length>0 && get_by_id('editor_textarea_'+editorSequence)) if(text.length>0 && get_by_id('editor_textarea_'+editorSequence))
{ {
get_by_id('editor_textarea_'+editorSequence).value += text.join(''); get_by_id('editor_textarea_'+editorSequence).value += text.join('');
} }
// 위지윅 모드 // 위지윅 모드
}else{ }else{
var iframe_obj = editorGetIFrame(editorSequence); var iframe_obj = editorGetIFrame(editorSequence);
if(!iframe_obj) return; if(!iframe_obj) return;
if(text.length>0) editorReplaceHTML(iframe_obj, text.join('')); if(text.length>0) editorReplaceHTML(iframe_obj, text.join(''));
} }
} }

1
modules/editor/tpl/js/uploader.min.js vendored Normal file

File diff suppressed because one or more lines are too long