위젯 편집 기능 개선

- 위젯 추가/복사등을 할 때 페이지 리로드 없이 바로 적용되도록 변경
- 위젯 스타일 수정 또는 추가시 위젯의 스타일값이 변경되는 오류 수정


git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5917 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2009-03-19 09:46:15 +00:00
parent 00e3010739
commit f013cc68cf
8 changed files with 105 additions and 49 deletions

View file

@ -4,24 +4,6 @@
* @brief 위젯 관리용 자바스크립트
**/
/* document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수 */
document.write = document.writeln = function(str){
if ( str.match(/^<\//) ) return;
if ( !window.opera ) str = str.replace(/&(?![#a-z0-9]+;)/g, "&");
str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'");
var div = null;
if(document.createElementNS) div = document.createElementNS("http://www.w3.org/1999/xhtml","div");
else div = xCreateElement('div');
xInnerHtml(div, str);
var pos;
pos = document.getElementsByTagName("*");
pos = pos[pos.length - 1];
var nodes = div.childNodes;
while ( nodes.length ) {
pos.parentNode.appendChild( nodes[0] );
}
};
/* DOM 속성을 구하기 위한 몇가지 함수들.. */
// style의 값을 구하는게 IE랑 그외가 다름.
function getStyle(obj) {
@ -267,12 +249,15 @@ function completeAddContent(ret_obj, response_tags, params, fo_obj) {
attr = contentWidget.get(0).attributes;
}
var editor_sequence = params['editor_sequence'];
var content = editorGetContent(editor_sequence);
var tpl = ''+
'<div class="widgetOutput" style="'+fo_obj.style.value+'" widget_padding_left="'+fo_obj.widget_padding_left.value+'" widget_padding_right="'+fo_obj.widget_padding_right.value+'" widget_padding_top="'+fo_obj.widget_padding_top.value+'" widget_padding_bottom="'+fo_obj.widget_padding_bottom.value+'" document_srl="'+document_srl+'" widget="widgetContent">'+
'<div class="widgetResize"></div>'+
'<div class="widgetResizeLeft"></div>'+
'<div class="widgetBorder">'+
'<div style="padding:'+fo_obj.widget_padding_top.value+'px '+fo_obj.widget_padding_right.value+'px'+fo_obj.widget_padding_bottom.value+'px'+fo_obj.widget_padding_left.value+'px"></div><div class="clear"></div>'+
'<div style="padding:'+fo_obj.widget_padding_top.value+'px '+fo_obj.widget_padding_right.value+'px'+fo_obj.widget_padding_bottom.value+'px'+fo_obj.widget_padding_left.value+'px"></div>'+content+'<div class="clear"></div>'+
'</div>'+
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;"></div>'+
'</div>';
@ -340,34 +325,95 @@ function doFitBorderSize() {
}
var selectedWidget = null;
var writedText = null;
var checkDocumentWrite = false;
// document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수
// 아래 함수는 str 내용을 단지 전역 변수에 보관 후 doAddWidgetCode 에서 재사용하기 위해 사용됨.
window.document.write = window.document.writeln = function(str){
if(checkDocumentWrite) {
writedText = str;
return;
}
if ( str.match(/^<\//) ) return;
if ( !window.opera ) str = str.replace(/&(?![#a-z0-9]+;)/g, "&");
str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'");
var div = xCreateElement("DIV");
xInnerHtml(div, str);
var pos;
pos = document.getElementsByTagName("*");
pos = pos[pos.length - 1];
var nodes = div.childNodes;
while ( nodes.length ) {
pos.parentNode.appendChild( nodes[0] );
}
}
// 위젯 추가
function doAddWidgetCode(widget_code) {
restoreWidgetButtons();
// css 추가
var tmp = widget_code;
while(tmp.indexOf("<!--Meta:")>-1) {
var pos = tmp.indexOf("<!--Meta:");
tmp = tmp.substr(pos);
var eos = tmp.indexOf("-->");
var cssfile = tmp.substr(9,eos-9);
if(!cssfile) break;
tmp = tmp.substr(eos);
var cssfile = request_uri+'/'+cssfile;
var css ='<style type="text/css"> @import url("'+cssfile+'"); </style>';
var dummy = xCreateElement("DIV");
xInnerHtml(dummy , css);
document.body.appendChild(dummy);
}
// widget 코드에서 javascript 부분을 빼서 eval후 결과값을 대체함
checkDocumentWrite = true; ///< document.write(ln)등의 함수값을 바로 사용하기 위한 check flag
// widget_code의 javascript 부분 수정
var tmp = widget_code.toLowerCase();
while(tmp.indexOf("<script")>-1) {
var pos = tmp.indexOf("<script");
tmp = tmp.substr(pos);
var length = tmp.indexOf("</script>")+9;
var script = widget_code.substr(pos,length);
script = script.replace(/^<script([^>]*)>/i,'').replace(/<\/script>$/i,'');
writedText = null;
eval(script);
widget_code = widget_code.substr(0,pos)+writedText+widget_code.substr(pos+length);
tmp = widget_code.toLowerCase();
}
checkDocumentWrite = false;
// html 추가
var dummy = xCreateElement('div');
xInnerHtml(dummy, widget_code);
var obj = dummy.childNodes[0];
var nodes = dummy.childNodes;
if(selectedWidget && selectedWidget.getAttribute("widget")) {
selectedWidget.parentNode.insertBefore(obj, selectedWidget);
selectedWidget.parentNode.removeChild(selectedWidget);
} else {
xGetElementById('zonePageContent').appendChild(obj);
}
var zoneObj = xGetElementById('zonePageContent');
selectedWidget = null;
/*
//zoneObj.style.visibility = 'hidden';
zoneObj.style.opacity = 0.2;
zoneObj.style.filter = "alpha(opacity=20)";
if(selectedWidget && selectedWidget.getAttribute("widget")) {
while ( nodes.length ) {
if(nodes[0].className == 'widgetClass') zoneObj.parentNode.insertBefore(nodes[0], zoneObj);
else selectedWidget.parentNode.insertBefore(nodes[0], selectedWidget);
}
selectedWidget.parentNode.removeChild(selectedWidget);
} else {
while ( nodes.length ) {
if(nodes[0].className == 'widgetClass') zoneObj.parentNode.insertBefore(nodes[0], zoneObj);
else zoneObj.appendChild(nodes[0]);
}
}
// 위젯 추가후 페이지 리로딩
var tpl = getWidgetContent();
@ -375,6 +421,7 @@ function doAddWidgetCode(widget_code) {
fo_obj.content.value = tpl;
fo_obj.mid.value = current_mid;
fo_obj.submit();
*/
}
// 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리