📄 widget.js
字号:
/** * @file modules/widget/js/widget.js * @author zero (zero@nzeo.com) * @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) { var style = obj.getAttribute("style"); if(typeof(style)=="object") style = style["cssText"]; return style;}// float: 값을 구하는게 IE랑 그외가 다름function getFloat(obj) { var cssFloat = xIE4Up?obj.style.styleFloat:obj.style.cssFloat; if(!cssFloat) cssFloat = 'left'; return cssFloat;}function setFloat(obj, fl) { if(xIE4Up) obj.style.styleFloat = fl; else obj.style.cssFloat = fl;}// padding값을 구하는 함수 (없을 경우 0으로 세팅), zbxe의 위젯에서만 사용function getPadding(obj, direct) { var padding = obj.getAttribute("widget_padding_"+direct); if(!padding || padding == null) padding = 0; return padding;}/* 위젯 핸들링 시작 */var zonePageObj = null;var zoneModuleSrl = 0;function doStartPageModify(zoneID, module_srl) { zonePageObj = xGetElementById(zoneID); zoneModuleSrl = module_srl; // 위젯 크기/여백 조절 레이어를 가장 밖으로 뺌 var obj = xGetElementById("tmpPageSizeLayer"); var dummy = xCreateElement("div"); xInnerHtml(dummy, xInnerHtml(obj)); dummy.id="pageSizeLayer"; dummy.style.visibility = "hidden"; dummy.style.position = "absolute"; dummy.style.left = 0; dummy.style.top = 0; document.body.appendChild(dummy); obj.parentNode.removeChild(obj); // 모든 위젯들의 크기를 정해진 크기로 맞춤 doFitBorderSize(); // 드래그와 리사이즈와 관련된 이벤트 리스너 생성 xAddEventListener(document,"click",doCheckWidget); xAddEventListener(document,"mousedown",doCheckWidgetDrag);}// 내용 모두 삭제function removeAllWidget() { xInnerHtml(zonePageObj, '');}/** * 특정 영역에 편집된 위젯들을 약속된 태그로 변환하여 return **/function getWidgetContent(obj) { var html = ""; if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; var childObj = obj.firstChild; while(childObj) { if(childObj.nodeName == "DIV" && childObj.getAttribute("widget")) { var widget = childObj.getAttribute("widget"); if(widget) { switch(widget) { case 'widgetBox' : html += getWidgetBoxCode(childObj, widget); break; case 'widgetContent' : html += getContentWidgetCode(childObj, widget); break; default : html += getWidgetCode(childObj, widget); break; } } } childObj = childObj.nextSibling; } return html;}// 컨텐츠 위젯 코드 구함function getContentWidgetCode(childObj, widget) { var cobj = childObj.firstChild; while(cobj) { if(cobj.nodeName == "DIV" && cobj.className == "widgetContent") { var body = xInnerHtml(cobj); return '<img src="./common/tpl/images/widget_bg.jpg" class="zbxe_widget_output" widget="widgetContent" style="'+getStyle(childObj)+'" body="'+body+'" widget_padding_left="'+getPadding(childObj,'left')+'" widget_padding_right="'+getPadding(childObj, 'right')+'" widget_padding_top="'+getPadding(childObj, 'top')+'" widget_padding_bottom="'+getPadding(childObj,'bottom')+'" />'; } cobj = cobj.nextSibling; }}// 위젯 박스 컨텐츠 코드 구함function getWidgetBoxCode(childObj, widget) { var cobj = childObj.firstChild; while(cobj) { if(cobj.className == "widgetBorder" || cobj.className == "widgetBoxBorder") { var c2obj = cobj.firstChild; while(c2obj) { if(c2obj.className == "nullWidget") { var body = getWidgetContent(c2obj); return '<div widget="widgetBox" style="'+getStyle(childObj)+'" widget_padding_left="'+getPadding(childObj,'left')+'" widget_padding_right="'+getPadding(childObj,'right')+'" widget_padding_top="'+getPadding(childObj, 'top')+'" widget_padding_bottom="'+getPadding(childObj, 'bottom')+'"><div><div>'+body+'<div class="clear"></div></div></div></div>'; } c2obj = c2obj.nextSibling; } } cobj = cobj.nextSibling; }}// 일반 위젯 컨텐츠 코드 구함function getWidgetCode(childObj, widget) { var attrs = ""; var code = ""; for(var i=0;i<childObj.attributes.length;i++) { if(!childObj.attributes[i].nodeName || !childObj.attributes[i].nodeValue) continue; var name = childObj.attributes[i].nodeName.toLowerCase(); if(name == "contenteditable" || name == "id" || name=="style" || name=="src" || name=="widget" || name == "body" || name == "class" || name == "widget_width" || name == "widget_width_type" || name == "xdpx" || name == "xdpy" || name == "height") continue; var value = childObj.attributes[i].nodeValue; if(!value) continue; attrs += name+'="'+escape(value)+'" '; } var style = childObj.getAttribute("style"); return '<img class="zbxe_widget_output" style="'+getStyle(childObj)+'" widget="'+widget+'" '+attrs+' />';}/** * 직접 내용을 입력하는 위젯을 추가 **/// 팝업 띄움function doAddContent() { popopen("./?module=widget&act=dispWidgetAdminAddContent&module_srl="+zoneModuleSrl, "addContent");}// 직접 내용을 입력하기 위한 에디터 활성화 작업 및 form 데이터 입력function doSyncPageContent() { if(opener && opener.selectedWidget) { var fo_obj = xGetElementById("content_fo"); var sel_obj = opener.selectedWidget; fo_obj.style.value = getStyle(opener.selectedWidget); fo_obj.widget_padding_left.value = getPadding(sel_obj, 'left'); fo_obj.widget_padding_right.value = getPadding(sel_obj,'right'); fo_obj.widget_padding_bottom.value = getPadding(sel_obj,'bottom'); fo_obj.widget_padding_top.value = getPadding(sel_obj,'top'); var obj = sel_obj.firstChild; while(obj && obj.className != "widgetContent") obj = obj.nextSibling; if(obj && obj.className == "widgetContent") { var content = Base64.decode(xInnerHtml(obj)); xGetElementById("content_fo").content.value = content; } } editorStart(1, "module_srl", "content", false, 400 ); //editor_upload_start(1); setFixedPopupSize();}// 부모창에 위젯을 추가function completeAddContent(fo_obj) { var editor_sequence = fo_obj.getAttribute('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+'" widget="widgetContent">'+ '<div class="widgetSetup"></div>'+ '<div class="widgetCopy"></div>'+ '<div class="widgetSize"></div>'+ '<div class="widgetRemove"></div>'+ '<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">'+ content+ '</div><div class="clear"></div>'+ '</div>'+ '<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">'+Base64.encode(content)+'</div>'+ '</div>'; opener.doAddWidgetCode(tpl); window.close();}/* 박스 위젯 추가 */function doAddWidgetBox() { var tpl = ''+ '<div class="widgetOutput" style="float:left;width:100%;height:12px;" widget="widgetBox" >'+ '<div class="widgetBoxCopy"></div>'+ '<div class="widgetBoxSize"></div>'+ '<div class="widgetBoxRemove"></div>'+ '<div class="widgetBoxResize"></div>'+ '<div class="widgetBoxResizeLeft"></div>'+ '<div class="widgetBoxBorder">'+ '<div class="nullWidget" style="width:100%;height:100px;"></div>'+ '<div class="clear"></div>'+ '</div>'+ '</div>'; xInnerHtml(zonePageObj, xInnerHtml(zonePageObj)+tpl); doFitBorderSize();}/* 일반 위젯을 추가하기 위해 위젯 팝업창을 띄움 */function doAddWidget(fo) { var sel = fo.widget_list; var idx = sel.selectedIndex; var val = sel.options[idx].value; var module_srl = fo.module_srl.value; var url = current_url.setQuery('module','widget').setQuery('act','dispWidgetGenerateCodeInPage').setQuery('selected_widget', val).setQuery('module_srl', module_srl); popopen(url,'GenerateWidgetCode');}// widgetBorder에 height를 widgetOutput와 맞춰줌function doFitBorderSize() { var obj_list = xGetElementsByClassName('widgetBorder', zonePageObj); for(var i=0;i<obj_list.length;i++) { var obj = obj_list[i]; xHeight(obj, xHeight(obj.parentNode)); obj.parentNode.style.clear = ''; } var obj_list = xGetElementsByClassName('widgetBoxBorder', zonePageObj); for(var i=0;i<obj_list.length;i++) { var obj = obj_list[i]; xHeight(obj, xHeight(obj.parentNode)); obj.parentNode.style.clear = ''; }}var selectedWidget = null;// 위젯 추가function doAddWidgetCode(widget_code) { var dummy = xCreateElement('div'); xInnerHtml(dummy, widget_code); var nodes = dummy.childNodes; var zoneObj = xGetElementById('zonePageContent'); //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(); var fo_obj = xGetElementById('pageFo'); fo_obj.content.value = tpl; fo_obj.submit();}// 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리function doCheckWidget(e) { var evt = new xEvent(e); if(!evt.target) return; var obj = evt.target; selectedWidget = null; var pObj = obj.parentNode; while(pObj) { if(pObj.id == "pageSizeLayer") return; pObj = pObj.parentNode; } doHideWidgetSizeSetup(); // 위젯 설정 if(obj.className == 'widgetSetup') { var p_obj = obj.parentNode; var widget = p_obj.getAttribute("widget"); if(!widget) return; selectedWidget = p_obj; if(widget == 'widgetContent') popopen("./?module=widget&act=dispWidgetAdminAddContent&module_srl="+zoneModuleSrl, "addContent"); else popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget,'GenerateCodeInPage'); return; // 위젯 복사 } else if(obj.className == 'widgetCopy' || obj.className == 'widgetBoxCopy') { var p_obj = obj.parentNode; if(p_obj.className == 'widgetOutput') { var dummy = xCreateElement("DIV"); xInnerHtml(dummy,xInnerHtml(p_obj)); dummy.widget_sequence = ''; dummy.className = "widgetOutput"; for(var i=0;i<p_obj.attributes.length;i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -