diff --git a/common/js/common.js b/common/js/common.js index 745a450c4..0ccd57c43 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -10,7 +10,7 @@ String.prototype.trim = function() { // 주어진 인자가 하나라도 defined되어 있지 않으면 false return function isDef() { for(var i=0; i"+ - ""+ - ""+ - ""+ + ""+ + ""+ + ""+ + ""+ "<\/object>"; break; default : html = ""+ - ""; + ""; break; } @@ -51,7 +51,7 @@ function displayMultimedia(type, src, style) { // 화면내에서 이미지 리사이즈 및 클릭할 수 있도록 function resizeImageContents() { - var objs = xGetElementsByTagName('img'); + var objs = xGetElementsByTagName("img"); for(var i in objs) { var obj = objs[i]; var parent = xParent(obj); @@ -61,15 +61,15 @@ function resizeImageContents() { var obj_width = xWidth(obj); if(parent_width>=obj_width) continue; - obj.style.cursor = 'pointer'; + obj.style.cursor = "pointer"; obj.source_width = obj_width; obj.source_height = xHeight(obj); xWidth(obj, xWidth(parent)-1); - xAddEventListener(obj,'click', resizeImagePopup); + xAddEventListener(obj,"click", resizeImagePopup); } } -xAddEventListener(window, 'load', resizeImageContents); +xAddEventListener(window, "load", resizeImageContents); function resizeImagePopup(evt) { var e = new xEvent(evt); @@ -129,7 +129,7 @@ function setFixedPopupSize() { if(xIE4Up) { var i=0; while(i<2) { - var height = xHeight(xGetElementById('popup_content')); + var height = xHeight(xGetElementById("popup_content")); if(xGetBodyHeight()!=height) window.resizeBy(0, height-xGetBodyHeight()); i++; } diff --git a/common/js/tree_menu.js b/common/js/tree_menu.js new file mode 100644 index 000000000..1e8577642 --- /dev/null +++ b/common/js/tree_menu.js @@ -0,0 +1,231 @@ +/** + * @file tree_menu.js + * @author zero (zero@nzeo.com) + * @brief xml파일을 읽어서 트리 메뉴를 그려줌 + * + * 일단 이것 저것 꽁수가 좀 들어간 것이긴 한데 속도나 기타 면에서 쓸만함... + * 언제나 그렇듯 필요하신 분은 가져가서 쓰세요. + * 다만 제로보드에 좀 특화되어 있어서.... + **/ + +// 아이콘을 미리 생성해 놓음 +var tree_folder_icon = new Image(); +tree_folder_icon.src = "./common/tpl/images/folder.gif"; +var tree_open_folder_icon = new Image(); +tree_open_folder_icon.src = "./common/tpl/images/imgfolder.gif"; + +var tree_minus_icon = new Image(); +tree_minus_icon.src = "./common/tpl/images/minus.gif"; +var tree_minus_bottom_icon = new Image(); +tree_minus_bottom_icon.src = "./common/tpl/images/minusbottom.gif"; +var tree_plus_icon = new Image(); +tree_plus_icon.src = "./common/tpl/images/plus.gif"; +var tree_plus_bottom_icon = new Image(); +tree_plus_bottom_icon.src = "./common/tpl/images/plusbottom.gif"; + +// 폴더를 모두 열고/닫기 위한 변수 설정 +var tree_menu_folder_list = new Array(); + +// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 +function loadTreeMenu(url, menu_id, zone_id, title) { + // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) + var zone = xGetElementById(zone_id); + if(typeof(zone)=="undefined") return; + + // 노드 추가를 위한 빈 div하나 입력해 넣음 + xInnerHtml(zone, ""); + + // xml_handler를 이용해서 직접 메뉴 xml파일(layout module에서 생성)을 읽음 + var oXml = new xml_handler(); + oXml.reset(); + oXml.xml_path = url; + + // menu_id, zone_id는 계속 달고 다녀야함 + var param = {menu_id:menu_id, zone_id:zone_id, title:title} + + // 요청후 drawTreeMenu()함수를 호출 + oXml.request(drawTreeMenu, oXml, null, null, param); +} + +// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 +function drawTreeMenu(oXml, callback_func, resopnse_tags, param) { + // 그리기 위한 object를 찾아 놓음 + var menu_id = param.menu_id; + var zone_id = param.zone_id; + var title = param.title; + var zone = xGetElementById(zone_id); + var html = ""; + html = '
root'+title+'
'; + + tree_menu_folder_list[menu_id] = new Array(); + + + // xml 정보가 들어올때까지 대기 (async) + var xmlDoc = oXml.getResponseXml(); + if(xmlDoc) { + + // node 태그에 해당하는 값들을 가져옴 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + html += drawNode(root, menu_id); + } + } + + xInnerHtml(zone, html); +} + +// root부터 시작해서 recursive하게 노트를 표혐 +function drawNode(parent_node, menu_id) { + var html = ''; + for (var i=0; i< parent_node.childNodes.length; i++) { + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 아이콘 설정 + var line_icon = null; + var folder_icon = null; + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + if(!hasNextSibling) { + line_icon = "minus"; + folder_icon = "folder"; + } else { + line_icon = "minusbottom"; + folder_icon = "folder"; + } + } else { + if(hasNextSibling) { + line_icon = "joinbottom"; + folder_icon = "page"; + } else { + line_icon = "join"; + folder_icon = "page"; + } + } + + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + + var zone_id = "menu_"+menu_id+"_"+node_srl; + tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = zone_id; + + html += ''+ + '
'+ + ''; + if(hasChild) + html+= ''+ + ''+ + ''; + else + html+= ''+ + ''+ + ''; + + html += ''+ + 'line'+ + 'folder'+ + ''+ + ''+ + text+ + ''+ + ''; + + if(node.childNodes.length) { + zone_id = zone_id+"_child"; + tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = zone_id; + if(!hasNextSibling) html += ''; + else html += ''; + } + + html += ''+ + '
' + ''; + + + } + return html; +} + +// 노드의 폴더 아이콘 클릭시 +function toggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + // 대상의 아이콘들 찾음 + var line_icon = xGetElementById(zone_id+'_line_icon'); + var folder_icon = xGetElementById(zone_id+'_folder_icon'); + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(child_zone.style.display == "block") { + child_zone.style.display = "none"; + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_minus_bottom_icon.src; + else line_icon.src = tree_minus_icon.src; + + folder_icon.src = tree_folder_icon.src; + } else { + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_plus_bottom_icon.src; + else line_icon.src = tree_plus_icon.src; + folder_icon.src = tree_open_folder_icon.src; + child_zone.style.display = "block"; + } +} + +// 노드의 글자 선택시 +var prev_selected_node = null; +function selectNode(zone_id) { + // 이전에 선택된 노드가 있었다면 원래데로 돌림 + if(prev_selected_node) { + prev_selected_node.style.backgroundColor = "#ffffff"; + prev_selected_node.style.fontWeight = "normal"; + prev_selected_node.style.color = "#000000"; + } + + // 선택된 노드를 찾아봄 + var node_zone = xGetElementById(zone_id+'_node'); + if(!node_zone) return; + + // 선택된 노드의 글자를 변경 + node_zone.style.backgroundColor = "#000000"; + node_zone.style.fontWeight = "bold"; + node_zone.style.color = "#FFFFFF"; + prev_selected_node = node_zone; +} + +// 모두 닫기 +function closeAllTreeMenu(menu_id) { + for(var i in tree_menu_folder_list[menu_id]) { + var zone_id = tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "block"; + toggleFolder(zone_id); + } +} + +// 모두 열기 +function openAllTreeMenu(menu_id) { + for(var i in tree_menu_folder_list[menu_id]) { + var zone_id = tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "none"; + toggleFolder(zone_id); + } +} diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index 21e53c872..a82e19728 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -1,49 +1,49 @@ /** - * @file : common/js/xml_handler.js - * @author : zero - * @desc : ajax 사용을 위한 기본 js + * @file common/js/xml_handler.js + * @author zero + * @brief ajax 사용을 위한 기본 js **/ // xml handler을 이용하는 user function function exec_xml(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) { - var oXml = new xml_handler(); - oXml.reset(); - for(var key in params) { - var val = params[key]; - oXml.addParam(key, val); - } - oXml.addParam('module', module); - oXml.addParam('act', act); + var oXml = new xml_handler(); + oXml.reset(); + for(var key in params) { + var val = params[key]; + oXml.addParam(key, val); + } + oXml.addParam("module", module); + oXml.addParam("act", act); - response_tags[response_tags.length] = 'redirect_url'; + response_tags[response_tags.length] = "redirect_url"; - var waiting_obj = document.getElementById('waitingforserverresponse'); - waiting_obj.style.visibility = 'visible'; - oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg, fo_obj); + var waiting_obj = document.getElementById("waitingforserverresponse"); + waiting_obj.style.visibility = "visible"; + oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg, fo_obj); } // 결과 처리 후 callback_func에 넘겨줌 function xml_response_filter(oXml, callback_func, response_tags, callback_func_arg, fo_obj) { - var xmlDoc = oXml.getResponseXml(); - if(!xmlDoc) return; + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) return null; - var waiting_obj = document.getElementById('waitingforserverresponse'); - waiting_obj.style.visibility = 'hidden'; - var ret_obj = oXml.toZMsgObject(xmlDoc, response_tags); - if(ret_obj['error']!=0) { - alert(ret_obj['message']); - return; - } + var waiting_obj = document.getElementById("waitingforserverresponse"); + waiting_obj.style.visibility = "hidden"; - callback_func(ret_obj, response_tags, callback_func_arg, fo_obj); + var ret_obj = oXml.toZMsgObject(xmlDoc, response_tags); + if(ret_obj["error"]!=0) { + alert(ret_obj["message"]); + return; + } + + callback_func(ret_obj, response_tags, callback_func_arg, fo_obj); } // xml handler function xml_handler() { this.obj_xmlHttp = null; this.method_name = null; - if(location.href.indexOf('admin.php')>0) this.xml_path = "./admin.php"; - else this.xml_path = "./index.php"; + this.xml_path = "./index.php"; this.params = new Array(); @@ -71,25 +71,25 @@ function zGetXmlHttp() { } function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj) { - var rd = ""; rd += "\n" - + "\n" - + "\n" + + "\n" + + "\n" for (var key in this.params) { var val = this.params[key]; rd += "<"+key+">\n"; } - + rd += "\n" - + "\n"; + + "\n"; + if(this.obj_xmlHttp.readyState!=0) { this.obj_xmlHttp.abort(); this.obj_xmlHttp = this.getXmlHttp(); } this.obj_xmlHttp.onreadystatechange = function () {callBackFunc(xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj)}; - this.obj_xmlHttp.open('POST', this.xml_path, true); + this.obj_xmlHttp.open("POST", this.xml_path, true); this.obj_xmlHttp.send(rd); } @@ -119,14 +119,14 @@ function xml_handlerGetResponseXML() { function xml_handlerToZMsgObject(xmlDoc, tags) { if(!xmlDoc) return null; if(!tags) { - tags = new Array('error','message'); + tags = new Array("error","message"); } var obj_ret = new Array(); for(var i=0; icmd_select = "선택"; $lang->cmd_select_all = "모두선택"; $lang->cmd_unselect_all = "모두해제"; + $lang->cmd_close_all = "모두닫기"; + $lang->cmd_open_all = "모두열기"; $lang->enable = '가능'; $lang->disable = '불가능'; diff --git a/common/tpl/common_header.html b/common/tpl/common_header.html index 51846c504..04bfc969d 100644 --- a/common/tpl/common_header.html +++ b/common/tpl/common_header.html @@ -3,16 +3,17 @@ {Context::getBrowserTitle()} - - - - + + + + + - + - + - + {Context::getHtmlHeader()} diff --git a/common/tpl/images/folder.gif b/common/tpl/images/folder.gif new file mode 100644 index 000000000..eb129763d Binary files /dev/null and b/common/tpl/images/folder.gif differ diff --git a/common/tpl/images/imgfolder.gif b/common/tpl/images/imgfolder.gif new file mode 100644 index 000000000..e6d880347 Binary files /dev/null and b/common/tpl/images/imgfolder.gif differ diff --git a/common/tpl/images/join.gif b/common/tpl/images/join.gif new file mode 100644 index 000000000..34dd47610 Binary files /dev/null and b/common/tpl/images/join.gif differ diff --git a/common/tpl/images/joinbottom.gif b/common/tpl/images/joinbottom.gif new file mode 100644 index 000000000..48b81c80a Binary files /dev/null and b/common/tpl/images/joinbottom.gif differ diff --git a/common/tpl/images/line.gif b/common/tpl/images/line.gif new file mode 100644 index 000000000..1a259eea0 Binary files /dev/null and b/common/tpl/images/line.gif differ diff --git a/common/tpl/images/minus.gif b/common/tpl/images/minus.gif new file mode 100644 index 000000000..3d212a97a Binary files /dev/null and b/common/tpl/images/minus.gif differ diff --git a/common/tpl/images/minusbottom.gif b/common/tpl/images/minusbottom.gif new file mode 100644 index 000000000..dc3198be2 Binary files /dev/null and b/common/tpl/images/minusbottom.gif differ diff --git a/common/tpl/images/page.gif b/common/tpl/images/page.gif new file mode 100644 index 000000000..42d7318c5 Binary files /dev/null and b/common/tpl/images/page.gif differ diff --git a/common/tpl/images/plus.gif b/common/tpl/images/plus.gif new file mode 100644 index 000000000..b2c997233 Binary files /dev/null and b/common/tpl/images/plus.gif differ diff --git a/common/tpl/images/plusbottom.gif b/common/tpl/images/plusbottom.gif new file mode 100644 index 000000000..b5671d891 Binary files /dev/null and b/common/tpl/images/plusbottom.gif differ diff --git a/modules/layout/tpl.admin/insert_layout2.html b/modules/layout/tpl.admin/insert_layout2.html index a70d22ad0..9f505531d 100644 --- a/modules/layout/tpl.admin/insert_layout2.html +++ b/modules/layout/tpl.admin/insert_layout2.html @@ -41,21 +41,15 @@ ({$val->maxdepth} {$lang->depth}) -
- +
- - -
-
- - - - - + +
+ diff --git a/modules/layout/tpl.admin/js/admin.js b/modules/layout/tpl.admin/js/admin.js index 6bce2580a..e69de29bb 100644 --- a/modules/layout/tpl.admin/js/admin.js +++ b/modules/layout/tpl.admin/js/admin.js @@ -1,140 +0,0 @@ -function doEditMenuInfo(sel_obj) { - var idx = sel_obj.selectedIndex; - var obj = sel_obj.options[idx]; - if(typeof(obj)=='undefined'||!obj) return; - - var menu_srl = obj.value; - - var url = "./?module=layout&act=dispLayoutMenuInfo&menu_srl="+menu_srl; - var win = window.open(url,"_LayoutMenu","toolbars=no,status=no,resizable=no,width=10,height=10"); - win.focus(); -} - -function completeGetLayoutMenuSrl(ret_obj, response_tags) { - var menu_srl = ret_obj['menu_srl']; - var menu_id = ret_obj['menu_id']; - doEditInsertMenu(menu_id, menu_srl); -} - -function doEditInsertMenu(menu_id, menu_srl) { - var item_obj = xGetElementById('default_value_item_'+menu_id); - var listup_obj = xGetElementById('default_value_listup_'+menu_id); - - var text = item_obj.value; - if(!text) return; - - if(typeof(menu_srl)=='undefined'||!menu_srl) { - var params = new Array(); - params['text'] = text; - params['menu_id'] = menu_id; - var response_tags = new Array('error','message','menu_id','menu_srl'); - exec_xml('layout', 'getLayoutMenuSrl', params, completeGetLayoutMenuSrl, response_tags); - return; - } - - var opt = new Option(text, menu_srl, false, true); - listup_obj.options[listup_obj.length] = opt; - - setDepth(listup_obj.options[listup_obj.length-1],0); - - item_obj.value = ''; - item_obj.focus(); -} - -function doEditMenu(cmd, menu_id, max_depth) { - var listup_obj = xGetElementById('default_value_listup_'+menu_id); - var idx = listup_obj.selectedIndex; - var lng = listup_obj.options.length; - switch(cmd) { - case 'up' : - if(lng < 2 || idx<1) return; - - var value1 = listup_obj.options[idx].value; - var text1 = listup_obj.options[idx].text; - var depth1 = getDepth(listup_obj.options[idx]); - - var value2 = listup_obj.options[idx-1].value; - var text2 = listup_obj.options[idx-1].text; - var depth2 = getDepth(listup_obj.options[idx-1]); - - listup_obj.options[idx] = new Option(text2,value2,false,false); - setDepth(listup_obj.options[idx], depth1); - - listup_obj.options[idx-1] = new Option(text1,value1,false,true); - setDepth(listup_obj.options[idx-1], depth2); - break; - case 'down' : - if(lng < 2 || idx == lng-1) return; - - var value1 = listup_obj.options[idx].value; - var text1 = listup_obj.options[idx].text; - var depth1 = getDepth(listup_obj.options[idx]); - - var value2 = listup_obj.options[idx+1].value; - var text2 = listup_obj.options[idx+1].text; - var depth2 = getDepth(listup_obj.options[idx+1]); - - listup_obj.options[idx] = new Option(text2,value2,false,false); - setDepth(listup_obj.options[idx], depth1); - - listup_obj.options[idx+1] = new Option(text1,value1,false,true); - setDepth(listup_obj.options[idx+1], depth2); - break; - case 'delete' : - if(idxcur_depth) return; - } - - listup_obj.remove(idx); - if(idx==0) listup_obj.selectedIndex = 0; - else listup_obj.selectedIndex = idx-1; - break; - case 'add_indent' : - if(lng<2||idx<1) return; - - var opt_cur = listup_obj.options[idx]; - var opt_up = listup_obj.options[idx-1]; - - var cur_depth = getDepth(opt_cur); - var up_depth = getDepth(opt_up); - - if(up_depth >= cur_depth) addDepth(opt_cur, max_depth); - break; - case 'remove_indent' : - var opt_cur = listup_obj.options[idx]; - removeDepth(opt_cur); - break; - } - - var value_list = new Array(); - for(var i=0;i=max_depth) return; - obj.style.paddingLeft = (depth*20)+'px'; -} - -function removeDepth(obj) { - var depth = getDepth(obj); - var depth = depth - 1; - if(depth<0) return; - obj.style.paddingLeft = (depth*20)+'px'; -}