git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2327 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-08-12 03:59:52 +00:00
commit 8326004cb2
2773 changed files with 91485 additions and 0 deletions

614
common/js/common.js Normal file
View file

@ -0,0 +1,614 @@
/**
* @file common.js
* @author zero (zero@nzeo.com)
* @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음
**/
/**
* @brief location.href에서 특정 key의 값을 return
**/
String.prototype.getQuery = function(key) {
var idx = this.indexOf('?');
if(idx == -1) return null;
var query_string = this.substr(idx+1, this.length);
var args = {}
query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; });
var q = args[key];
if(typeof(q)=="undefined") q = "";
return q;
}
/**
* @brief location.href에서 특정 key의 값을 return
**/
String.prototype.setQuery = function(key, val) {
var idx = this.indexOf('?');
var uri = this;
uri = uri.replace(/#$/,'');
if(idx != -1) {
uri = this.substr(0, idx);
var query_string = this.substr(idx+1, this.length);
var args = new Array();
query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; });
args[key] = val;
var q_list = new Array();
for(var i in args) {
var arg = args[i];
if(!arg.toString().trim()) continue;
q_list[q_list.length] = i+'='+arg;
}
return uri+"?"+q_list.join("&");
} else {
if(val.toString().trim()) return uri+"?"+key+"="+val;
else return uri;
}
}
/**
* @brief string prototype으로 trim 함수 추가
**/
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
/**
* @brief 주어진 인자가 하나라도 defined되어 있지 않으면 false return
**/
function isDef() {
for(var i=0; i<arguments.length; ++i) {
if(typeof(arguments[i])=="undefined") return false;
}
return true;
}
/**
* @brief 윈도우 오픈
* 열려진 윈도우의 관리를 통해 window.focus()등을 FF에서도 비슷하게 구현함
**/
var winopen_list = new Array();
function winopen(url, target, attribute) {
try {
if(target != "_blank" && winopen_list[target]) {
winopen_list[target].close();
winopen_list[target] = null;
}
} catch(e) {
}
if(typeof(target)=='undefined') target = '_blank';
if(typeof(attribute)=='undefined') attribute = '';
var win = window.open(url, target, attribute);
win.focus();
if(target != "_blank") winopen_list[target] = win;
}
/**
* @brief 팝업으로만 띄우기
* common/tpl/popup_layout.html이 요청되는 제로보드 XE내의 팝업일 경우에 사용
**/
function popopen(url, target) {
if(typeof(target)=="undefined") target = "_blank";
winopen(url, target, "left=10,top=10,width=10,height=10,scrollbars=no,resizable=no,toolbars=no");
}
/**
* @brief 메일 보내기용
**/
function sendMailTo(to) {
location.href="mailto:"+to;
}
/**
* @brief url이동 (open_window 값이 N 아니면 새창으로 띄움)
**/
function move_url(url, open_wnidow) {
if(!url) return false;
if(typeof(open_wnidow)=='undefined') open_wnidow = 'N';
if(open_wnidow=='N') open_wnidow = false;
else open_wnidow = true;
if(/^\./.test(url)) url = request_uri+url;
if(open_wnidow) {
winopen(url);
} else {
location.href=url;
}
return false;
}
/**
* @brief 특정 div(or span...) display옵션 토글
**/
function toggleDisplay(obj, opt) {
obj = xGetElementById(obj);
if(typeof(opt)=="undefined") opt = "inline";
if(obj.style.display == "none") obj.style.display = opt;
else obj.style.display = "none";
}
/**
* @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용)
**/
function displayMultimedia(src, width, height, auto_start) {
if(src.indexOf('files')==0) src = request_uri+src;
if(auto_start) auto_start = "true";
else auto_start = "false";
var clsid = "";
var codebase = "";
var html = "";
if(/\.swf/i.test(src)) {
clsid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";
html = ""+
"<object classid=\""+clsid+"\" codebase=\""+codebase+"\" width=\""+width+"\" height=\""+height+"\" >"+
"<param name=\"wmode\" value=\"transparent\" />"+
"<param name=\"allowScriptAccess\" value=\"always\" />"+
"<param name=\"movie\" value=\""+src+"\" />"+
"<param name=\"quality\" value=\"high\" />"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\"></embed>"+
"<\/object>";
} else if(/\.flv/i.test(src)) {
html = "<embed src=\""+request_uri+"common/tpl/images/flvplayer.swf?autoStart="+auto_start+"&file="+src+"\" width=\""+width+"\" height=\""+height+"\" type=\"application/x-shockwave-flash\"></embed>";
} else {
html = "<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\"></embed>";
}
document.writeln(html);
}
/**
* @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경
**/
function resizeImageContents() {
var objs = xGetElementsByTagName("IMG");
for(var i in objs) {
var obj = objs[i];
var parent = obj.parentNode;
if(!obj||!parent) continue;
while(parent.parentNode && parent.nodeName != "TD" && parent.nodeName != "DIV") {
parent = parent.parentNode;
}
if(parent.nodeName != "TD" && parent.nodeName != "DIV") continue;
if(obj.parentNode.nodeName =='A') continue;
if(/\/modules\//i.test(obj.src)) continue;
if(/\/layouts\//i.test(obj.src)) continue;
if(/\/widgets\//i.test(obj.src)) continue;
if(/\/classes\//i.test(obj.src)) continue;
if(/\/common\/tpl\//i.test(obj.src)) continue;
if(/\/member_extra_info\//i.test(obj.src)) continue;
var parent_width = xWidth(parent);
var obj_width = xWidth(obj);
var orig_img = new Image();
orig_img.src = obj.src;
if(parent_width<1 || obj_width <1) continue;
if(parent_width>=obj_width && orig_img.width <= obj_width) continue;
obj.style.cursor = "pointer";
obj.source_width = orig_img.width;
obj.source_height = orig_img.height;
if(obj_width >= parent_width) {
var per = parent_width/obj_width;
xWidth(obj, xWidth(parent)-1);
xHeight(obj, xHeight(obj)*per);
}
xAddEventListener(obj,"click", showOriginalImage);
}
}
xAddEventListener(window, "load", resizeImageContents);
/**
* @brief 에디터에서 사용되는 내용 여닫는 코드 (고정, zbxe용)
**/
function zbxe_folder_open(id) {
var open_text_obj = xGetElementById("folder_open_"+id);
var close_text_obj = xGetElementById("folder_close_"+id);
var folder_obj = xGetElementById("folder_"+id);
open_text_obj.style.display = "none";
close_text_obj.style.display = "block";
folder_obj.style.display = "block";
}
function zbxe_folder_close(id) {
var open_text_obj = xGetElementById("folder_open_"+id);
var close_text_obj = xGetElementById("folder_close_"+id);
var folder_obj = xGetElementById("folder_"+id);
open_text_obj.style.display = "block";
close_text_obj.style.display = "none";
folder_obj.style.display = "none";
}
/**
* @brief 에디터에서 사용하되 내용 여닫는 코드 (zb5beta beta 호환용으로 남겨 놓음)
**/
function svc_folder_open(id) {
var open_text_obj = xGetElementById("_folder_open_"+id);
var close_text_obj = xGetElementById("_folder_close_"+id);
var folder_obj = xGetElementById("_folder_"+id);
open_text_obj.style.display = "none";
close_text_obj.style.display = "block";
folder_obj.style.display = "block";
}
function svc_folder_close(id) {
var open_text_obj = xGetElementById("_folder_open_"+id);
var close_text_obj = xGetElementById("_folder_close_"+id);
var folder_obj = xGetElementById("_folder_"+id);
open_text_obj.style.display = "block";
close_text_obj.style.display = "none";
folder_obj.style.display = "none";
}
/**
* @brief 팝업의 경우 내용에 맞춰 윈도우의 크기를 조절해줌
* 팝업의 내용에 맞게 크기를 늘리는 것은... 쉽게 되지는 않음.. .
* popup_layout 에서 window.onload 자동 요청됨.
**/
function setFixedPopupSize() {
if(xGetElementById('popBody')) {
if(xHeight('popBody')>600) {
xGetElementById('popBody').style.overflowY = 'scroll';
xGetElementById('popBody').style.overflowX = 'hidden';
xHeight('popBody', 600);
}
}
var w = xWidth("popup_content");
var h = xHeight("popup_content");
var obj_list = xGetElementsByTagName('div');
for(i=0;i<obj_list.length;i++) {
var ww = xWidth(obj_list[i]);
var id = obj_list[i].id;
if(id == 'waitingforserverresponse' || id == 'fororiginalimagearea' || id == 'fororiginalimageareabg') continue;
if(ww>w) w = ww;
}
// 윈도우에서는 브라우저 상관없이 가로 픽셀이 조금 더 늘어나야 한다.
if(xUA.indexOf('windows')>0) {
if(xOp7Up) w += 10;
else if(xIE4Up) w += 10;
else w += 6;
}
window.resizeTo(w,h);
var h1 = xHeight(window.document.body);
window.resizeBy(0,h-h1);
window.scrollTo(0,0);
}
/**
* @brief 본문내에서 컨텐츠 영역보다 이미지의 경우 원본 크기를 보여줌
**/
function showOriginalImage(evt) {
var e = new xEvent(evt);
var obj = e.target;
var src = obj.src;
var orig_image = xGetElementById("fororiginalimage");
var tmp_image = new Image();
tmp_image.src = src;
var image_width = tmp_image.width;
var image_height = tmp_image.height;
orig_image.style.margin = "0px 0px 0px 0px";
orig_image.style.cursor = "move";
orig_image.src = src;
var areabg = xGetElementById("fororiginalimageareabg");
xWidth(areabg, image_width+36);
xHeight(areabg, image_height+46);
var area = xGetElementById("fororiginalimagearea");
xLeft(area, xScrollLeft());
xTop(area, xScrollTop());
xWidth(area, xWidth(document));
xHeight(area, xHeight(document));
area.style.visibility = "visible";
var area_width = xWidth(area);
var area_height = xHeight(area);
var x = parseInt((area_width-image_width)/2,10);
var y = parseInt((area_height-image_height)/2,10);
if(x<0) x = 0;
if(y<0) y = 0;
xLeft(areabg, x);
xTop(areabg, y);
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "hidden";
xAddEventListener(orig_image, "mousedown", origImageDragEnable);
xAddEventListener(orig_image, "dblclick", closeOriginalImage);
xAddEventListener(window, "scroll", closeOriginalImage);
xAddEventListener(window, "resize", closeOriginalImage);
areabg.style.visibility = 'visible';
}
/**
* @brief 원본 이미지 보여준 닫는 함수
**/
function closeOriginalImage(evt) {
var area = xGetElementById("fororiginalimagearea");
if(area.style.visibility != "visible") return;
area.style.visibility = "hidden";
xGetElementById("fororiginalimageareabg").style.visibility = "hidden";
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "visible";
xRemoveEventListener(area, "mousedown", closeOriginalImage);
xRemoveEventListener(window, "scroll", closeOriginalImage);
xRemoveEventListener(window, "resize", closeOriginalImage);
}
/**
* @brief 원본 이미지 드래그
**/
var origDragManager = {obj:null, isDrag:false}
function origImageDragEnable(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage") return;
obj.draggable = true;
obj.startX = e.pageX;
obj.startY = e.pageY;
if(!origDragManager.isDrag) {
origDragManager.isDrag = true;
xAddEventListener(document, "mousemove", origImageDragMouseMove, false);
}
xAddEventListener(document, "mousedown", origImageDragMouseDown, false);
}
function origImageDrag(obj, px, py) {
var x = px - obj.startX;
var y = py - obj.startY;
var areabg = xGetElementById("fororiginalimageareabg");
xLeft(areabg, xLeft(areabg)+x);
xTop(areabg, xTop(areabg)+y);
obj.startX = px;
obj.startY = py;
}
function origImageDragMouseDown(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage" || !obj.draggable) return;
if(obj) {
xPreventDefault(evt);
obj.startX = e.pageX;
obj.startY = e.pageY;
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}
}
function origImageDragMouseUp(evt) {
if(origDragManager.obj) {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
}
}
function origImageDragMouseMove(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(!obj) return;
if(obj.id != "fororiginalimage") {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
return;
}
xPreventDefault(evt);
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}
/**
* @brief 이름을 클릭하였을 경우 메뉴를 보여주는 함수
* 이름 클릭시 MemberModel::getMemberMenu 호출하여 결과를 보여줌 (사용자의 속성에 따라 메뉴가 달라지고 애드온의 연결을 하기 위해서임)
**/
xAddEventListener(document, 'click', chkMemberMenu);
xAddEventListener(window, 'load', function() { setMemberMenuObjCursor(xGetElementsByTagName("div")); xGetElementsByTagName("span"); } );
var loaded_member_menu_list = new Array();
// className = "member_*" 일 경우의 object가 클릭되면 해당 회원의 메뉴를 출력함
function chkMemberMenu(evt) {
var area = xGetElementById("membermenuarea");
if(!area) return;
if(area.style.visibility!="hidden") area.style.visibility="hidden";
var e = new xEvent(evt);
if(!e) return;
var obj = e.target;
while(obj) {
if(obj && obj.className && obj.className.search("member_")!=-1) break;
obj = obj.parentNode;
}
if(!obj || !obj.className || obj.className.search("member_")==-1) return;
if(obj.className.indexOf('member_-1')>=0) return;
var member_srl = parseInt(obj.className.replace(/member_([0-9]+)/ig,'$1').replace(/([^0-9]*)/ig,''),10);
if(!member_srl) return;
// 현재 글의 mid, module를 구함
var mid = current_mid;
// 서버에 메뉴를 요청
var params = new Array();
params["member_srl"] = member_srl;
params["cur_mid"] = mid;
params["cur_act"] = current_url.getQuery('act');
params["page_x"] = e.pageX;
params["page_y"] = e.pageY;
var response_tags = new Array("error","message","menu_list");
if(loaded_member_menu_list[member_srl]) {
params["menu_list"] = loaded_member_menu_list[member_srl];
displayMemberMenu(params, response_tags, params);
return;
}
show_waiting_message = false;
exec_xml("member", "getMemberMenu", params, displayMemberMenu, response_tags, params);
show_waiting_message = true;
}
function displayMemberMenu(ret_obj, response_tags, params) {
var area = xGetElementById("membermenuarea");
var menu_list = ret_obj['menu_list'];
var member_srl = params["member_srl"];
var html = "";
if(loaded_member_menu_list[member_srl]) {
html = loaded_member_menu_list[member_srl];
} else {
var infos = menu_list.split("\n");
if(infos.length) {
for(var i=0;i<infos.length;i++) {
var info_str = infos[i];
var pos = info_str.indexOf(",");
var icon = info_str.substr(0,pos).trim();
info_str = info_str.substr(pos+1, info_str.length).trim();
var pos = info_str.indexOf(",");
var str = info_str.substr(0,pos).trim();
var func = info_str.substr(pos+1, info_str.length).trim();
var className = "item";
//if(i==infos.length-1) className = "item";
if(!str || !func) continue;
html += "<span class=\""+className+"\" onmouseover=\"this.className='"+className+"_on'\" onmouseout=\"this.className='"+className+"'\" style=\"background:url("+icon+") no-repeat left center;\" onclick=\""+func+"\">"+str+"</span><br />";
}
}
loaded_member_menu_list[member_srl] = html;
}
if(html) {
xInnerHtml('membermenuarea', "<div class=\"box\">"+html+"</div>");
xWidth(area, xWidth(area));
xLeft(area, params["page_x"]);
xTop(area, params["page_y"]);
if(xWidth(area)+xLeft(area)>xClientWidth()+xScrollLeft()) xLeft(area, xClientWidth()-xWidth(area)+xScrollLeft());
if(xHeight(area)+xTop(area)>xClientHeight()+xScrollTop()) xTop(area, xClientHeight()-xHeight(area)+xScrollTop());
area.style.visibility = "visible";
}
}
// className = "member_*" 의 object의 cursor를 pointer로 본경
function setMemberMenuObjCursor(obj) {
for (var i = 0; i < obj.length; ++i) {
var node = obj[i];
if(node.className && node.className.search(/member_([0-9]+)/ig)!=-1) {
var member_srl = parseInt(node.className.replace(/member_([0-9]+)/ig,'$1').replace(/([^0-9]*)/ig,''),10);
if(member_srl<1) continue;
node.style.cursor = "pointer";
}
}
}
// 날짜 선택 (달력 열기)
function open_calendar(fo_id, day_str, callback_func) {
if(typeof(day_str)=="undefined") day_str = "";
var url = "./common/tpl/calendar.php?";
if(fo_id) url+="fo_id="+fo_id;
if(day_str) url+="&day_str="+day_str;
if(callback_func) url+="&callback_func="+callback_func;
popopen(url, 'Calendar');
}
// 언어코드 (lang_type) 쿠키값 변경
function doChangeLangType(obj) {
if(typeof(obj)=="string") {
setLangType(obj);
} else {
var val = obj.options[obj.selectedIndex].value;
setLangType(val);
}
location.reload();
}
function setLangType(lang_type) {
var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('lang_type', lang_type, expire);
}
/* 미리보기 */
function doDocumentPreview(obj) {
var fo_obj = obj;
while(fo_obj.nodeName != "FORM") {
fo_obj = fo_obj.parentNode;
}
if(fo_obj.nodeName != "FORM") return;
var content = fo_obj.content.value;
var win = window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes");
var dummy_obj = xGetElementById("previewDocument");
if(!dummy_obj) {
var fo_code = '<form id="previewDocument" target="previewDocument" method="post" action="'+request_uri+'">'+
'<input type="hidden" name="module" value="document" />'+
'<input type="hidden" name="act" value="dispDocumentPreview" />'+
'<input type="hidden" name="content" />'+
'</form>';
var dummy = xCreateElement("DIV");
xInnerHtml(dummy, fo_code);
window.document.body.insertBefore(dummy,window.document.body.lastChild);
dummy_obj = xGetElementById("previewDocument");
}
if(dummy_obj) {
dummy_obj.content.value = content;
dummy_obj.submit();
}
}
/* 스킨 정보 */
function viewSkinInfo(module, skin) {
popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin, 'SkinInfo');
}

64
common/js/iePngFix.htc Normal file
View file

@ -0,0 +1,64 @@
<public:component>
<public:attach event="onpropertychange" onevent="doFix()" />
<script type="text/javascript">
// IE5.5+ PNG Alpha Fix v1.0RC4
// (c) 2004-2005 Angus Turnbull http://www.twinhelix.com
// This is licensed under the CC-GNU LGPL, version 2.1 or later.
// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
// This must be a path to a blank image. That's all the configuration you need.
if (typeof blankImg == 'undefined') var blankImg = './common/tpl/images/blank.gif'; // 1x1px 짜리 투명 이미지(blank.gif)의 경로를 변경.
var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
function filt(s, m)
{
if (filters[f])
{
filters[f].enabled = s ? true : false;
if (s) with (filters[f]) { src = s; sizingMethod = m }
}
else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
}
function doFix()
{
// Assume IE7 is OK.
if (!/MSIE (5\.5|6\.)/.test(navigator.userAgent) ||
(event && !/(background|src)/.test(event.propertyName))) return;
var bgImg = currentStyle.backgroundImage || style.backgroundImage;
if (tagName == 'IMG')
{
if ((/\.png$/i).test(src))
{
if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
style.width = offsetWidth + 'px';
filt(src, 'image');
// 'scale' 을 'image' 으로 변경하면 padding 적용시 나타나는 이미지 크기의 변화(잘못된 렌더링)를 방지할 수 있다. 하지만 border 표현에 문제가 생긴다.
src = blankImg;
}
else if (src.indexOf(blankImg) < 0) filt();
}
else if (bgImg && bgImg != 'none')
{
if (bgImg.match(/^url[("']+(.*\.png)[)"']+$/i))
{
var s = RegExp.$1;
if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
style.width = offsetWidth + 'px';
style.backgroundImage = 'none';
filt(s, 'crop');
// IE link fix.
for (var n = 0; n < childNodes.length; n++)
if (childNodes[n].style) childNodes[n].style.position = 'relative';
}
else filt();
}
}
doFix();
</script>
</public:component>

636
common/js/tree_menu.js Normal file
View file

@ -0,0 +1,636 @@
/**
* @file tree_menu.js
* @author zero (zero@nzeo.com)
* @brief xml파일을 읽어서 트리 메뉴를 그려줌
*
* 일단 이것 저것 꽁수가 들어간 것이긴 한데 속도나 기타 면에서 쓸만함...\n
* 다만 제로보드에 특화되어 있어서....\n
* GPL License 따릅니당~~~\n
* 언제나 그렇듯 필요하신 분은 가져가서 쓰세요.\n
* 좋게 개량하시면 공유해주세요~\n
**/
// 트리메뉴에서 사용될 아이콘의 위치
var tree_menu_icon_path = "./common/tpl/images/";
// 아이콘을 미리 생성해 놓음
var tree_folder_icon = new Image();
tree_folder_icon.src = tree_menu_icon_path+"page.gif";
var tree_open_folder_icon = new Image();
tree_open_folder_icon.src = tree_menu_icon_path+"page.gif";
var tree_minus_icon = new Image();
tree_minus_icon.src = tree_menu_icon_path+"minus.gif";
var tree_minus_bottom_icon = new Image();
tree_minus_bottom_icon.src = tree_menu_icon_path+"minusbottom.gif";
var tree_plus_icon = new Image();
tree_plus_icon.src = tree_menu_icon_path+"plus.gif";
var tree_plus_bottom_icon = new Image();
tree_plus_bottom_icon.src = tree_menu_icon_path+"plusbottom.gif";
// 폴더를 모두 열고/닫기 위한 변수 설정
var tree_menu_folder_list = new Array();
// 노드의 정보를 가지고 있을 변수
var node_info_list = new Array();
// menu_id별로 요청된 클릭시 실행 될 callback_func
var node_callback_func = new Array();
// menu_id별로 요청된 드래그시 실행될 callback_func
var node_move_callback_func = new Array();
// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수
function loadTreeMenu(url, menu_id, zone_id, title, index_url , callback_func, manual_select_node_srl, callback_move_func) {
// 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함)
var zone = xGetElementById(zone_id);
if(typeof(zone)=="undefined") return;
// 관리가 아닌 사용일경우는 menu_id를 변경
if(typeof(callback_func)=='undefined') menu_id = 'display_'+menu_id;
// 노드 정보들을 담을 변수 세팅
node_info_list[menu_id] = new Array();
if(typeof(title)=='undefined') title = '';
// 사용자 정의 함수가 없다면 moveTreeMenu()라는 기본적인 동작을 하는 함수를 대입
if(typeof(callback_func)=='undefined') {
callback_func = moveTreeMenu;
}
if(typeof(callback_move_func)=='undefined') {
callback_move_func = null;
}
// 한 페이지에 다수의 menu_id가 있을 수 있으므로 menu_id별로 함수를 저장
node_callback_func[menu_id] = callback_func;
node_move_callback_func[menu_id] = callback_move_func;
// 직접 선택시키려는 메뉴 인자값이 없으면 초기화
if(typeof(manual_select_node_srl)=='undefined') manual_select_node_srl = '';
// xml_handler를 이용해서 직접 메뉴 xml파일(layout module에서 생성)을 읽음
if(!url) return;
var oXml = new xml_handler();
oXml.reset();
oXml.xml_path = url;
if(!index_url) index_url= "#";
// menu_id, zone_id는 계속 달고 다녀야함
var param = {"menu_id":menu_id, "zone_id":zone_id, "title":title, "index_url":index_url, "manual_select_node_srl":manual_select_node_srl}
// 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용)
oXml.request(drawTreeMenu, oXml, null, null, null, param);
}
// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력
var manual_select_node_srl = '';
function drawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) {
// 그리기 위한 object를 찾아 놓음
var menu_id = param.menu_id;
var zone_id = param.zone_id;
var title = param.title;
var index_url = param.index_url;
if(param.manual_select_node_srl) manual_select_node_srl = param.manual_select_node_srl;
var zone = xGetElementById(zone_id);
var html = "";
if(title) html = '<div style="cursor:pointer;padding-left:18px;margin-bottom:5px;background:url('+tree_menu_icon_path+'folder.gif) no-repeat left;" onclick="location.href=\''+index_url+'\';return false;" >'+title+'</div>';
var xmlDoc = oXml.getResponseXml();
if(!xmlDoc) {
xInnerHtml(zone, html);
return null;
}
tree_menu_folder_list[menu_id] = new Array();
// node 태그에 해당하는 값들을 가져와서 html을 작성
var node_list = xmlDoc.getElementsByTagName("node");
if(node_list.length>0) {
var root = xmlDoc.getElementsByTagName("root")[0];
var output = drawNode(root, menu_id);
html += output.html;
}
// 출력하려는 zone이 없다면 load후에 출력하도록 함
if(!zone) {
xAddEventListener(window, 'load', function() { drawTeeMenu(zone_id, menu_id, html); });
// 출력하려는 zone을 찾아졌다면 바로 출력
} else {
xInnerHtml(zone, html);
if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl);
}
return null;
}
// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수
function drawTeeMenu(zone_id, menu_id, html) {
xInnerHtml(zone_id, html);
if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl);
}
// root부터 시작해서 recursive하게 노드를 표혐
function drawNode(parent_node, menu_id) {
var output = {html:"", expand:"N"}
for (var i=0; i< parent_node.childNodes.length; i++) {
var html = "";
// nodeName이 node가 아니면 패스~
var node = parent_node.childNodes.item(i);
if(node.nodeName!="node") continue;
// node의 기본 변수들 체크
var node_srl = node.getAttribute("node_srl");
var text = node.getAttribute("text");
var url = node.getAttribute("url");
var expand = node.getAttribute("expand");
if(!text) continue;
// 자식 노드가 있는지 확인
var hasChild = false;
if(node.hasChildNodes()) hasChild = true;
// nextSibling가 있는지 확인
var hasNextSibling = false;
if(i==parent_node.childNodes.length-1) hasNextSibling = true;
// 후에 사용하기 위해 node_info_list에 node_srl을 값으로 하여 node object 추가
node_info_list[menu_id][node_srl] = node;
// zone_id 값을 세팅
var zone_id = "menu_"+menu_id+"_"+node_srl;
tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = zone_id;
// url을 확인하여 현재의 url과 동일하다고 판단되면 manual_select_node_srl 에 값을 추가 (관리자페이지일 경우는 무시함)
if(node_callback_func[menu_id] == moveTreeMenu && url && current_url.getQuery('mid') == url) manual_select_node_srl = node_srl;
// manual_select_node_srl이 node_srl과 같으면 펼침으로 처리
if(manual_select_node_srl == node_srl) expand = "Y";
// 아이콘 설정
var line_icon = null;
var folder_icon = null;
// 자식 노드가 있을 경우 자식 노드의 html을 구해옴
var child_output = null;
var child_html = "";
if(hasChild) {
// 자식 노드의 zone id를 세팅
var child_zone_id = zone_id+"_child";
tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = child_zone_id;
// html을 받아옴
child_output = drawNode(node, menu_id);
var chtml = child_output.html;
var cexpand = child_output.expand;
if(cexpand == "Y") expand = "Y";
// 무조건 펼침이 아닐 경우
if(expand!="Y") {
if(!hasNextSibling) child_html += '<div id="'+child_zone_id+'"style="display:none;padding-left:16px;background:url('+tree_menu_icon_path+'line.gif) repeat-y left;">'+chtml+'</div>';
else child_html += '<div id="'+child_zone_id+'" style="display:none;padding-left:16px;">'+chtml+'</div>';
// 무조건 펼침일 경우
} else {
if(!hasNextSibling) child_html += '<div id="'+child_zone_id+'"style="display:block;padding-left:16px;background:url('+tree_menu_icon_path+'line.gif) repeat-y left;">'+chtml+'</div>';
else child_html += '<div id="'+child_zone_id+'" style="display:block;padding-left:16px;">'+chtml+'</div>';
}
}
// 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈
if(hasChild) {
// 무조건 펼침이 아닐 경우
if(expand != "Y") {
if(!hasNextSibling) {
line_icon = "plus";
folder_icon = "page";
} else {
line_icon = "plusbottom";
folder_icon = "page";
}
// 무조건 펼침일 경우
} else {
if(!hasNextSibling) {
line_icon = "minus";
folder_icon = "page";
} else {
line_icon = "minusbottom";
folder_icon = "page";
}
}
// 자식 노드가 없을 경우
} else {
if(hasNextSibling) {
line_icon = "joinbottom";
folder_icon = "page";
} else {
line_icon = "join";
folder_icon = "page";
}
}
// html 작성
html += '<div id="'+zone_id+'" style="margin:0px;font-size:9pt;">';
if(hasChild) html+= '<span style="cursor:pointer;" onclick="toggleFolder(\''+zone_id+'\');return false;">';
else html+= '<span>';
html += '<img id="'+zone_id+'_line_icon" src="'+tree_menu_icon_path+line_icon+'.gif" alt="line" align="top" /><img id="'+zone_id+'_folder_icon" src="'+tree_menu_icon_path+folder_icon+'.gif" alt="folder" align="top" /></span>';
var chk_enable = xGetElementById(menu_id+"_enable_move");
if(chk_enable) {
html += '<span><span id="'+zone_id+'_node" style="cursor:move;padding:1px 2px 1px 2px;margin-top:1px;cursor:pointer;" onmousedown="doNodeFunc(this, \''+menu_id+'\','+node_srl+',\''+zone_id+'\');">';
} else {
html += '<span><span id="'+zone_id+'_node" style="cursor:move;padding:1px 2px 1px 2px;margin-top:1px;cursor:pointer;" onclick="selectNode(\''+menu_id+'\','+node_srl+',\''+zone_id+'\')" ondblclick="toggleFolder(\''+zone_id+'\')">';
}
html += text+'</span></span>';
html += child_html;
html += '</div>';
output.html += html;
if(expand=="Y") output.expand = "Y";
}
return output;
}
// 관리자 모드일 경우 *_enable_move 의 값에 따라 메뉴 이동을 시키거나 정보를 보여주도록 변경
function doNodeFunc(obj, menu_id, node_srl, zone_id) {
var chk_enable = xGetElementById(menu_id+"_enable_move");
if(!chk_enable || chk_enable.checked!=true || !obj) {
selectNode(menu_id,node_srl,zone_id);
return;
}
deSelectNode();
tree_drag_enable(obj,tree_drag_start,tree_drag,tree_drag_end);
}
// 수동으로 메뉴를 선택하도록 함
function manualSelectNode(menu_id, node_srl) {
var zone_id = "menu_"+menu_id+"_"+node_srl;
selectNode(menu_id,node_srl,zone_id,false);
return;
}
// 노드의 폴더 아이콘 클릭시
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');
var height = 0;
// 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기
if(child_zone.style.display == "block") {
height = xHeight(child_zone)*-1;
child_zone.style.display = "none";
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_folder_icon.src;
} else {
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_open_folder_icon.src;
child_zone.style.display = "block";
height = xHeight(child_zone);
}
if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter( height );
}
// 노드의 글자 선택시
var prev_selected_node = null;
function selectNode(menu_id, node_srl, zone_id, move_url) {
// 선택된 노드를 찾아봄
var node_zone = xGetElementById(zone_id+'_node');
if(!node_zone) return;
// 이전에 선택된 노드가 있었다면 원래데로 돌림
if(prev_selected_node) {
var prev_zone = xGetElementById(prev_selected_node.id);
if(prev_zone) {
prev_zone.style.backgroundColor = "#ffffff";
prev_zone.style.fontWeight = "normal";
prev_zone.style.color = "#000000";
}
}
// 선택된 노드의 글자를 변경
prev_selected_node = node_zone;
node_zone.style.backgroundColor = "#0e078f";
node_zone.style.fontWeight = "bold";
node_zone.style.color = "#FFFFFF";
// 함수 실행
if(typeof(move_url)=="undefined"||move_url==true) {
var func = node_callback_func[menu_id];
func(menu_id, node_info_list[menu_id][node_srl]);
//toggleFolder(zone_id);
}
}
// 선택된 노드의 표시를 없앰
function deSelectNode() {
// 이전에 선택된 노드가 있었다면 원래데로 돌림
if(!prev_selected_node) return;
prev_selected_node.style.backgroundColor = "#ffffff";
prev_selected_node.style.fontWeight = "normal";
prev_selected_node.style.color = "#000000";
}
// 모두 닫기
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);
}
}
// 메뉴 클릭시 기본으로 동작할 함수 (사용자 임의 함수로 대체될 수 있음)
function moveTreeMenu(menu_id, node) {
// url과 open_window값을 구함
var node_srl = node.getAttribute("node_srl");
var url = node.getAttribute("url");
var open_window = node.getAttribute("open_window");
var hasChild = false;
if(node.hasChildNodes()) hasChild = true;
// url이 없고 child가 있으면 해당 폴더 토글한다
if(!url && hasChild) {
var zone_id = "menu_"+menu_id+"_"+node_srl;
toggleFolder(zone_id);
return;
}
// url이 있으면 url을 분석한다 (제로보드 특화된 부분. url이 http나 ftp등으로 시작하면 그냥 해당 url 열기)
if(url) {
// http, ftp등의 연결이 아닌 경우 제로보드용으로 처리
if(url.indexOf('://')==-1) url = "./?"+url;
// open_window에 따라서 처리
if(open_window != "Y") location.href=url;
else {
var win = window.open(url);
win.focus();
}
}
}
// 메뉴 드래그 중이라는 상황을 간직할 변수
var tree_drag_manager = {obj:null, isDrag:false}
var tree_tmp_object = new Array();
var tree_disappear = 0;
/**
* 메뉴 드래깅을 위한 함수들
**/
// 드래깅시 보여줄 임시 object를 생성하는 함수
function tree_create_tmp_object(obj) {
var tmp_obj = tree_tmp_object[obj.id];
if(tmp_obj) return tmp_obj;
tmp_obj = xCreateElement('DIV');
tmp_obj.id = obj.id + '_tmp';
tmp_obj.style.display = 'none';
tmp_obj.style.position = 'absolute';
tmp_obj.style.backgroundColor = obj.style.backgroundColor;
tmp_obj.style.fontSize = obj.style.fontSize;
tmp_obj.style.fontFamlily = obj.style.fontFamlily;
tmp_obj.style.color = "#5277ff";
tmp_obj.style.opacity = 1;
tmp_obj.style.filter = 'alpha(opacity=100)';
document.body.appendChild(tmp_obj);
tree_tmp_object[obj.id] = tmp_obj;
return tmp_obj;
}
// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return
function tree_get_tmp_object(obj) {
var tmp_obj = tree_tmp_object[obj.id];
if(!tmp_obj) tmp_obj = tree_create_tmp_object(obj);
return tmp_obj;
}
// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정)
function tree_drag_enable(child_obj, funcDragStart, funcDrag, funcDragEnd) {
// 클릭이 일어난 메뉴의 상위 object를 찾음
var obj = child_obj.parentNode.parentNode;
// 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정
obj.draggable = true;
obj.drag_start = funcDragStart;
obj.drag = funcDrag;
obj.drag_end = funcDragEnd;
obj.target_id = null;
// 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록
if (!tree_drag_manager.isDrag) {
tree_drag_manager.isDrag = true;
xAddEventListener(document, 'mousemove', tree_drag_mouse_move, false);
}
// mousedown이벤트 값을 지정
xAddEventListener(obj, 'mousedown', tree_mouse_down, false);
}
// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함)
function tree_drag_start(tobj, px, py) {
var obj = tree_get_tmp_object(tobj);
xInnerHtml(obj, xInnerHtml(tobj));
tobj.source_color = tobj.style.color;
tobj.style.color = "#BBBBBB";
xLeft(obj, xPageX(tobj));
xTop(obj, xPageY(tobj));
xWidth(obj, xWidth(tobj));
xHeight(obj, xHeight(tobj));
xDisplay(obj, 'block');
}
// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수
function tree_drag(tobj, dx, dy) {
var obj = tree_get_tmp_object(tobj);
xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10));
xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10));
var menu_id = tobj.id.replace(/menu_/,'');
menu_id = menu_id.replace(/_([0-9]+)$/,'');
if(!menu_id) return;
for(var node_srl in node_info_list[menu_id]) {
var zone_id = "menu_"+menu_id+"_"+node_srl;
var target_obj = xGetElementById(zone_id);
var hh = parseInt(xHeight(target_obj),10);
var h = parseInt(parseInt(xHeight(target_obj),10)/2,10);
var l = xPageX(target_obj);
var t = xPageY(target_obj);
var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10);
var tt = parseInt(t,10) + hh;
if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll) {
if(tobj.xDPY >= t && tobj.xDPY < tt-h) {
try {
target_obj.parentNode.insertBefore(tobj, target_obj);
tobj.target_id = target_obj.id;
} catch(e) {
}
}
}
}
}
// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과)
function tree_drag_end(tobj, px, py) {
var obj = tree_get_tmp_object(tobj);
tree_disappear = tree_disapear_object(obj, tobj);
tree_drag_disable(tobj.id);
}
// 스르르 사라지게 함;;
function tree_disapear_object(obj, tobj) {
var it = 150;
var ib = 15;
var x = parseInt(xPageX(obj),10);
var y = parseInt(xPageY(obj),10);
var ldt = (x - parseInt(xPageX(tobj),10)) / ib;
var tdt = (y - parseInt(xPageY(tobj),10)) / ib;
return setInterval(function() {
if(ib < 1) {
clearInterval(tree_disappear);
xInnerHtml(tobj,xInnerHtml(obj));
xInnerHtml(obj,'');
xDisplay(obj, 'none');
return;
}
ib -= 5;
x-=ldt;
y-=tdt;
xLeft(obj, x);
xTop(obj, y);
}, it/ib);
}
// 마우스다운 이벤트 발생시 호출됨
function tree_mouse_down(e) {
var evt = new xEvent(e);
var obj = evt.target;
while(obj && !obj.draggable) {
obj = xParent(obj, true);
}
if(obj) {
xPreventDefault(e);
obj.xDPX = evt.pageX;
obj.xDPY = evt.pageY;
tree_drag_manager.obj = obj;
xAddEventListener(document, 'mouseup', tree_mouse_up, false);
if (obj.drag_start) obj.drag_start(obj, evt.pageX, evt.pageY);
}
}
// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화)
function tree_mouse_up(e) {
if (tree_drag_manager.obj) {
xPreventDefault(e);
xRemoveEventListener(document, 'mouseup', tree_mouse_up, false);
if (tree_drag_manager.obj.drag_end) {
var evt = new xEvent(e);
tree_drag_manager.obj.drag_end(tree_drag_manager.obj, evt.pageX, evt.pageY);
}
tree_drag_manager.obj = null;
tree_drag_manager.isDrag = false;
}
}
// 드래그할때의 object이동등을 담당
function tree_drag_mouse_move(e) {
var evt = new xEvent(e);
if (tree_drag_manager.obj) {
xPreventDefault(e);
var obj = tree_drag_manager.obj;
var dx = evt.pageX - obj.xDPX;
var dy = evt.pageY - obj.xDPY;
obj.xDPX = evt.pageX;
obj.xDPY = evt.pageY;
if (obj.drag) {
obj.drag(obj, dx, dy);
} else {
xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy);
}
}
}
// 해당 object 에 더 이상 drag가 되지 않도록 설정
function tree_drag_disable(id) {
if (!tree_drag_manager) return;
var obj = xGetElementById(id);
obj.draggable = false;
obj.drag_start = null;
obj.drag = null;
obj.drag_end = null;
obj.style.color = obj.source_color;
xRemoveEventListener(obj, 'mousedown', tree_mouse_down, false);
if(obj.id && obj.target_id && obj.id!=obj.target_id) {
var menu_id = obj.id.replace(/menu_/,'');
menu_id = menu_id.replace(/_([0-9]+)$/,'');
if(menu_id) {
var callback_move_func = node_move_callback_func[menu_id];
if(callback_move_func) callback_move_func(menu_id, obj.id, obj.target_id);
}
}
obj.target_id = null;
}

621
common/js/x.js Normal file
View file

@ -0,0 +1,621 @@
/**
* x.js compiled from X 4.0 with XC 0.27b.
* Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com
* Copyright 2001-2005 Michael Foster (Cross-Browser.com)
**/
var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase();
if(window.opera){
var i=xUA.indexOf('opera');
if(i!=-1){
var v=parseInt(xUA.charAt(i+6));
xOp7Up=v>=7;
xOp6Dn=v<7;
}
}
else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){
xIE4Up=parseFloat(navigator.appVersion)>=4;
xIE4=xUA.indexOf('msie 4')!=-1;
xIE5=xUA.indexOf('msie 5')!=-1;
xIE6=xUA.indexOf('msie 6')!=-1;
}
else if(document.layers){xNN4=true;}
var xMac=xUA.indexOf('mac')!=-1;
// (element, event(without 'on'), event listener(function name)[, caption])
function xAddEventListener(e,eT,eL,cap)
{
if(!(e=xGetElementById(e))) return;
eT=eT.toLowerCase();
if((!xIE4Up && !xOp7Up) && e==window) {
if(eT=='resize') { window.xPCW=xClientWidth(); window.xPCH=xClientHeight(); window.xREL=eL; xResizeEvent(); return; }
if(eT=='scroll') { window.xPSL=xScrollLeft(); window.xPST=xScrollTop(); window.xSEL=eL; xScrollEvent(); return; }
}
var eh='e.on'+eT+'=eL';
if(e.addEventListener) e.addEventListener(eT,eL,cap);
else if(e.attachEvent) e.attachEvent('on'+eT,eL);
else eval(eh);
}
// called only from the above
function xResizeEvent()
{
if (window.xREL) setTimeout('xResizeEvent()', 250);
var cw = xClientWidth(), ch = xClientHeight();
if (window.xPCW != cw || window.xPCH != ch) { window.xPCW = cw; window.xPCH = ch; if (window.xREL) window.xREL(); }
}
function xScrollEvent()
{
if (window.xSEL) setTimeout('xScrollEvent()', 250);
var sl = xScrollLeft(), st = xScrollTop();
if (window.xPSL != sl || window.xPST != st) { window.xPSL = sl; window.xPST = st; if (window.xSEL) window.xSEL(); }
}
function xAppendChild(oParent, oChild)
{
if (oParent.appendChild) return oParent.appendChild(oChild);
else return null;
}
function xClientHeight()
{
var h=0;
if(xOp6Dn) h=window.innerHeight;
else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientHeight)
h=document.documentElement.clientHeight;
else if(document.body && document.body.clientHeight)
h=document.body.clientHeight;
else if(xDef(window.innerWidth,window.innerHeight,document.width)) {
h=window.innerHeight;
if(document.width>window.innerWidth) h-=16;
}
return h;
}
function xClientWidth()
{
var w=0;
if(xOp6Dn) w=window.innerWidth;
else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth)
w=document.documentElement.clientWidth;
else if(document.body && document.body.clientWidth)
w=document.body.clientWidth;
else if(xDef(window.innerWidth,window.innerHeight,document.height)) {
w=window.innerWidth;
if(document.height>window.innerHeight) w-=16;
}
return w;
}
function xCreateElement(sTag)
{
if (document.createElement) return document.createElement(sTag);
else return null;
}
function xDef()
{
for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
return true;
}
function xDeleteCookie(name, path)
{
if (xGetCookie(name)) {
document.cookie = name + "=" +
"; path=" + ((!path) ? "/" : path) +
"; expires=" + new Date(0).toGMTString();
}
}
function xDisplay(e,s)
{
if(!(e=xGetElementById(e))) return null;
if(e.style && xDef(e.style.display)) {
if (xStr(s)) e.style.display = s;
return e.style.display;
}
return null;
}
function xEvent(evt) // object prototype
{
var e = evt || window.event;
if(!e) return;
if(e.type) this.type = e.type;
if(e.target) this.target = e.target;
else if(e.srcElement) this.target = e.srcElement;
// Section B
if (e.relatedTarget) this.relatedTarget = e.relatedTarget;
else if (e.type == 'mouseover' && e.fromElement) this.relatedTarget = e.fromElement;
else if (e.type == 'mouseout') this.relatedTarget = e.toElement;
// End Section B
if(xOp6Dn) { this.pageX = e.clientX; this.pageY = e.clientY; }
else if(xDef(e.pageX,e.pageY)) { this.pageX = e.pageX; this.pageY = e.pageY; }
else if(xDef(e.clientX,e.clientY)) { this.pageX = e.clientX + xScrollLeft(); this.pageY = e.clientY + xScrollTop(); }
// Section A
if (xDef(e.offsetX,e.offsetY)) {
this.offsetX = e.offsetX;
this.offsetY = e.offsetY;
}
else if (xDef(e.layerX,e.layerY)) {
this.offsetX = e.layerX;
this.offsetY = e.layerY;
}
else {
this.offsetX = this.pageX - xPageX(this.target);
this.offsetY = this.pageY - xPageY(this.target);
}
// End Section A
if (e.keyCode) { this.keyCode = e.keyCode; } // for moz/fb, if keyCode==0 use which
else if (xDef(e.which) && e.type.indexOf('key')!=-1) { this.keyCode = e.which; }
this.shiftKey = e.shiftKey;
this.ctrlKey = e.ctrlKey;
this.altKey = e.altKey;
}
function xFirstChild(e, t)
{
var c = e ? e.firstChild : null;
if (t) while (c && c.nodeName != t) { c = c.nextSibling; }
else while (c && c.nodeType != 1) { c = c.nextSibling; }
return c;
}
function xGetBodyWidth() {
var cw = xClientWidth();
var sw = window.document.body.scrollWidth;
return cw>sw?cw:sw;
}
function xGetBodyHeight() {
var cw = xClientHeight();
var sw = window.document.body.scrollHeight;
return cw>sw?cw:sw;
}
function xGetComputedStyle(oEle, sProp, bInt)
{
var s, p = 'undefined';
var dv = document.defaultView;
if(dv && dv.getComputedStyle){
s = dv.getComputedStyle(oEle,'');
if (s) p = s.getPropertyValue(sProp);
}
else if(oEle.currentStyle) {
// convert css property name to object property name for IE
var a = sProp.split('-');
sProp = a[0];
for (var i=1; i<a.length; ++i) {
c = a[i].charAt(0);
sProp += a[i].replace(c, c.toUpperCase());
}
p = oEle.currentStyle[sProp];
}
else return null;
return bInt ? (parseInt(p) || 0) : p;
}
function xGetCookie(name)
{
var value=null, search=name+"=";
if (document.cookie.length > 0) {
var offset = document.cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
var end = document.cookie.indexOf(";", offset);
if (end == -1) end = document.cookie.length;
value = unescape(document.cookie.substring(offset, end));
}
}
return value;
}
function xGetElementById(e)
{
if(typeof(e)!='string') return e;
if(document.getElementById) e=document.getElementById(e);
else if(document.all) e=document.all[e];
else e=null;
return e;
}
function xGetElementsByAttribute(sTag, sAtt, sRE, fn)
{
var a, list, found = new Array(), re = new RegExp(sRE, 'i');
list = xGetElementsByTagName(sTag);
for (var i = 0; i < list.length; ++i) {
a = list[i].getAttribute(sAtt);
if (!a) {a = list[i][sAtt];}
if (typeof(a)=='string' && a.search(re) != -1) {
found[found.length] = list[i];
if (fn) fn(list[i]);
}
}
return found;
}
function xGetElementsByClassName(c,p,t,f)
{
var found = new Array();
var re = new RegExp('\\b'+c+'\\b', 'i');
var list = xGetElementsByTagName(t, p);
for (var i = 0; i < list.length; ++i) {
if (list[i].className && list[i].className.search(re) != -1) {
found[found.length] = list[i];
if (f) f(list[i]);
}
}
return found;
}
function xGetElementsByTagName(t,p)
{
var list = null;
t = t || '*';
p = p || document;
if (xIE4 || xIE5) {
if (t == '*') list = p.all;
else list = p.all.tags(t);
}
else if (p.getElementsByTagName) list = p.getElementsByTagName(t);
return list || new Array();
}
function xGetURLArguments()
{
var idx = location.href.indexOf('?');
var params = new Array();
if (idx != -1) {
var pairs = location.href.substring(idx+1, location.href.length).split('&');
for (var i=0; i<pairs.length; i++) {
nameVal = pairs[i].split('=');
params[i] = nameVal[1];
params[nameVal[0]] = nameVal[1];
}
}
return params;
}
function xHeight(e,h)
{
if(!(e=xGetElementById(e))) return 0;
if (xNum(h)) {
if (h<0) h = 0;
else h=Math.round(h);
}
else h=-1;
var css=xDef(e.style);
if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
h = xClientHeight();
}
else if(css && xDef(e.offsetHeight) && xStr(e.style.height)) {
if(h>=0) {
var pt=0,pb=0,bt=0,bb=0;
if (document.compatMode=='CSS1Compat') {
var gcs = xGetComputedStyle;
pt=gcs(e,'padding-top',1);
if (pt !== null) {
pb=gcs(e,'padding-bottom',1);
bt=gcs(e,'border-top-width',1);
bb=gcs(e,'border-bottom-width',1);
}
// Should we try this as a last resort?
// At this point getComputedStyle and currentStyle do not exist.
else if(xDef(e.offsetHeight,e.style.height)){
e.style.height=h+'px';
pt=e.offsetHeight-h;
}
}
h-=(pt+pb+bt+bb);
if(isNaN(h)||h<0) return null;
else e.style.height=h+'px';
}
h=e.offsetHeight;
}
else if(css && xDef(e.style.pixelHeight)) {
if(h>=0) e.style.pixelHeight=h;
h=e.style.pixelHeight;
}
return h;
}
function xHex(sn, digits, prefix)
{
var p = '';
var n = Math.ceil(sn);
if (prefix) p = prefix;
n = n.toString(16);
for (var i=0; i < digits - n.length; ++i) {
p += '0';
}
return p + n;
}
function xHide(e){return xVisibility(e,0);}
function xInnerHtml(e,h)
{
if(!(e=xGetElementById(e)) || !xStr(e.innerHTML)) return null;
var s = e.innerHTML;
if (xStr(h)) {e.innerHTML = h;}
return s;
}
function xLeft(e, iX)
{
if(!(e=xGetElementById(e))) return 0;
var css=xDef(e.style);
if (css && xStr(e.style.left)) {
if(xNum(iX)) e.style.left=iX+'px';
else {
iX=parseInt(e.style.left);
if(isNaN(iX)) iX=0;
}
}
else if(css && xDef(e.style.pixelLeft)) {
if(xNum(iX)) e.style.pixelLeft=iX;
else iX=e.style.pixelLeft;
}
return iX;
}
function xMoveTo(e,x,y)
{
xLeft(e,x);
xTop(e,y);
}
function xName(e)
{
if (!e) return e;
else if (e.id && e.id != "") return e.id;
else if (e.name && e.name != "") return e.name;
else if (e.nodeName && e.nodeName != "") return e.nodeName;
else if (e.tagName && e.tagName != "") return e.tagName;
else return e;
}
function xNextSib(e,t)
{
var s = e ? e.nextSibling : null;
if (t) while (s && s.nodeName != t) { s = s.nextSibling; }
else while (s && s.nodeType != 1) { s = s.nextSibling; }
return s;
}
function xNum()
{
for(var i=0; i<arguments.length; ++i){if(isNaN(arguments[i]) || typeof(arguments[i])!='number') return false;}
return true;
}
function xOffsetLeft(e)
{
if (!(e=xGetElementById(e))) return 0;
if (xDef(e.offsetLeft)) return e.offsetLeft;
else return 0;
}
function xOffsetTop(e)
{
if (!(e=xGetElementById(e))) return 0;
if (xDef(e.offsetTop)) return e.offsetTop;
else return 0;
}
function xPad(s,len,c,left)
{
if(typeof s != 'string') s=s+'';
if(left) {for(var i=s.length; i<len; ++i) s=c+s;}
else {for (i=s.length; i<len; ++i) s+=c;}
return s;
}
function xPageX(e)
{
if (!(e=xGetElementById(e))) return 0;
var x = 0;
while (e) {
if (xDef(e.offsetLeft)) x += e.offsetLeft;
e = xDef(e.offsetParent) ? e.offsetParent : null;
}
return x;
}
function xPageY(e)
{
if (!(e=xGetElementById(e))) return 0;
var y = 0;
while (e) {
if (xDef(e.offsetTop)) y += e.offsetTop;
e = xDef(e.offsetParent) ? e.offsetParent : null;
}
// if (xOp7Up) return y - document.body.offsetTop; // v3.14, temporary hack for opera bug 130324 (reported 1nov03)
return y;
}
function xParent(e, bNode)
{
if (!(e=xGetElementById(e))) return null;
var p=null;
if (!bNode && xDef(e.offsetParent)) p=e.offsetParent;
else if (xDef(e.parentNode)) p=e.parentNode;
else if (xDef(e.parentElement)) p=e.parentElement;
return p;
}
function xPreventDefault(e)
{
if (e && e.preventDefault) e.preventDefault()
else if (window.event) window.event.returnValue = false;
}
function xPrevSib(e,t)
{
var s = e ? e.previousSibling : null;
if (t) while(s && s.nodeName != t) {s=s.previousSibling;}
else while(s && s.nodeType != 1) {s=s.previousSibling;}
return s;
}
function xRemoveEventListener(e,eT,eL,cap)
{
if(!(e=xGetElementById(e))) return;
eT=eT.toLowerCase();
if((!xIE4Up && !xOp7Up) && e==window) {
if(eT=='resize') { window.xREL=null; return; }
if(eT=='scroll') { window.xSEL=null; return; }
}
var eh='e.on'+eT+'=null';
if(e.removeEventListener) e.removeEventListener(eT,eL,cap);
else if(e.detachEvent) e.detachEvent('on'+eT,eL);
else eval(eh);
}
function xResizeTo(e,w,h)
{
xWidth(e,w);
xHeight(e,h);
}
function xScrollLeft(e, bWin)
{
var offset=0;
if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
var w = window;
if (bWin && e) w = e;
if(w.document.documentElement && w.document.documentElement.scrollLeft) offset=w.document.documentElement.scrollLeft;
else if(w.document.body && xDef(w.document.body.scrollLeft)) offset=w.document.body.scrollLeft;
}
else {
e = xGetElementById(e);
if (e && xNum(e.scrollLeft)) offset = e.scrollLeft;
}
return offset;
}
function xScrollTop(e, bWin)
{
var offset=0;
if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
var w = window;
if (bWin && e) w = e;
if(w.document.documentElement && w.document.documentElement.scrollTop) offset=w.document.documentElement.scrollTop;
else if(w.document.body && xDef(w.document.body.scrollTop)) offset=w.document.body.scrollTop;
}
else {
e = xGetElementById(e);
if (e && xNum(e.scrollTop)) offset = e.scrollTop;
}
return offset;
}
function xSetCookie(name, value, expire, path)
{
document.cookie = name + "=" + escape(value) +
((!expire) ? "" : ("; expires=" + expire.toGMTString())) +
"; path=" + ((!path) ? "/" : path);
}
function xShow(e) {return xVisibility(e,1);}
function xStr(s)
{
for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}
return true;
}
function xTop(e, iY)
{
if(!(e=xGetElementById(e))) return 0;
var css=xDef(e.style);
if(css && xStr(e.style.top)) {
if(xNum(iY)) e.style.top=iY+'px';
else {
iY=parseInt(e.style.top);
if(isNaN(iY)) iY=0;
}
}
else if(css && xDef(e.style.pixelTop)) {
if(xNum(iY)) e.style.pixelTop=iY;
else iY=e.style.pixelTop;
}
return iY;
}
function xVisibility(e, bShow)
{
if(!(e=xGetElementById(e))) return null;
if(e.style && xDef(e.style.visibility)) {
if (xDef(bShow)) e.style.visibility = bShow ? 'visible' : 'hidden';
return e.style.visibility;
}
return null;
}
function xWidth(e,w)
{
if(!(e=xGetElementById(e))) return 0;
if (xNum(w)) {
if (w<0) w = 0;
else w=Math.round(w);
}
else w=-1;
var css=xDef(e.style);
if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
w = xClientWidth();
}
else if(css && xDef(e.offsetWidth) && xStr(e.style.width)) {
if(w>=0) {
var pl=0,pr=0,bl=0,br=0;
if (document.compatMode=='CSS1Compat') {
var gcs = xGetComputedStyle;
pl=gcs(e,'padding-left',1);
if (pl !== null) {
pr=gcs(e,'padding-right',1);
bl=gcs(e,'border-left-width',1);
br=gcs(e,'border-right-width',1);
}
// Should we try this as a last resort?
// At this point getComputedStyle and currentStyle do not exist.
else if(xDef(e.offsetWidth,e.style.width)){
e.style.width=w+'px';
pl=e.offsetWidth-w;
}
}
w-=(pl+pr+bl+br);
if(isNaN(w)||w<0) return null;
else e.style.width=w+'px';
}
w=e.offsetWidth;
}
else if(css && xDef(e.style.pixelWidth)) {
if(w>=0) e.style.pixelWidth=w;
w=e.style.pixelWidth;
}
return w;
}
function xZIndex(e,uZ)
{
if(!(e=xGetElementById(e))) return 0;
if(e.style && xDef(e.style.zIndex)) {
if(xNum(uZ)) e.style.zIndex=uZ;
uZ=parseInt(e.style.zIndex);
}
return uZ;
}
function xStopPropagation(evt)
{
if (evt && evt.stopPropagation) evt.stopPropagation();
else if (window.event) window.event.cancelBubble = true;
}

147
common/js/xml_handler.js Normal file
View file

@ -0,0 +1,147 @@
/**
* @file common/js/xml_handler.js
* @author zero <zero@nzeo.com>
* @brief zbxe내에서 ajax기능을 이용함에 있어 module, act를 사용하기 위한 자바스크립트
**/
// xml handler을 이용하는 user function
var show_waiting_message = true;
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);
if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = new Array('error','message');
var waiting_obj = xGetElementById("waitingforserverresponse");
if(show_waiting_message && waiting_obj) {
xInnerHtml(waiting_obj, wating_message);
xTop(waiting_obj, xScrollTop()+20);
xLeft(waiting_obj, xScrollLeft()+20);
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 null;
var waiting_obj = xGetElementById("waitingforserverresponse");
waiting_obj.style.visibility = "hidden";
xInnerHtml(waiting_obj, '');
var ret_obj = oXml.toZMsgObject(xmlDoc, response_tags);
if(ret_obj["error"]!=0) {
alert(ret_obj["message"]);
return null;
}
if(!callback_func) return null;
callback_func(ret_obj, response_tags, callback_func_arg, fo_obj);
return null;
}
// xml handler
function xml_handler() {
this.obj_xmlHttp = null;
this.method_name = null;
this.xml_path = request_uri+"index.php";
this.params = new Array();
this.reset = xml_handlerReset;
this.getXmlHttp = zGetXmlHttp;
this.request = xml_handlerRequest;
this.setPath = xml_handlerSetPath;
this.addParam = xml_handlerAddParam;
this.getResponseXml = xml_handlerGetResponseXML;
this.toZMsgObject = xml_handlerToZMsgObject;
this.obj_xmlHttp = this.getXmlHttp();
}
function zGetXmlHttp() {
if (window.XMLHttpRequest) return new XMLHttpRequest();
else if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
return null;
}
function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj) {
var rd = "";
rd += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
+ "<methodCall>\n"
+ "<params>\n"
for (var key in this.params) {
var val = this.params[key];
rd += "<"+key+"><![CDATA["+val+"]]></"+key+">\n";
}
rd += "</params>\n"
+ "</methodCall>\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.send(rd);
}
function xml_handlerSetPath(path) {
this.xml_path = "./"+path;
}
function xml_handlerReset() {
this.obj_xmlHttp = this.getXmlHttp();
this.params = new Array();
}
function xml_handlerAddParam(key, val) {
this.params[key] = val;
}
function xml_handlerGetResponseXML() {
if(this.obj_xmlHttp && this.obj_xmlHttp.readyState == 4 && isDef(this.obj_xmlHttp.responseXML)) {
var xmlDoc = this.obj_xmlHttp.responseXML;
this.reset();
return xmlDoc;
}
return null;
}
function xml_handlerToZMsgObject(xmlDoc, tags) {
if(!xmlDoc) return null;
if(!tags) tags = new Array("error","message");
tags[tags.length] = "redirect_url";
tags[tags.length] = "act";
var obj_ret = new Array();
for(var i=0; i<tags.length; i++) {
var key = tags[i];
if(obj_ret[key]) continue;
try {
obj_ret[key] = xmlDoc.getElementsByTagName(tags[i])[0].firstChild.nodeValue;
} catch(e) {
obj_ret[key] = "";
}
}
return obj_ret;
}

305
common/js/xml_js_filter.js Normal file
View file

@ -0,0 +1,305 @@
/**
* @file common/js/xml_js_filter.js
* @author zero (zero@nzeo.com)
* @brief xml filter에서 사용될 js
*
* zbxe 에서 form의 동작시 필수입력 여부등을 선처리하고 xml_handler.js의 exec_xml() 통해서
* 특정 모듈과의 ajax 통신을 통해 process를 진행시킴
**/
var alertMsg = new Array();
var target_type_list = new Array();
var notnull_list = new Array();
var extra_vars = new Array();
/**
* @function filterAlertMessage
* @brief ajax로 서버에 요청후 결과를 처리할 callback_function을 지정하지 않았을 호출되는 기본 함수
**/
function filterAlertMessage(ret_obj) {
var error = ret_obj["error"];
var message = ret_obj["message"];
var act = ret_obj["act"];
var redirect_url = ret_obj["redirect_url"];
var url = location.href;
if(url.substr(-1)=="#") url = url.substr(0,url.length-1);
if(typeof(message)!="undefined"&&message&&message!="success") alert(message);
if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act);
else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url;
location.href = url;
}
/**
* @class XmlJsFilter
* @authro zero (zero@nzeo.com)
* @brief form elements, module/act, callback_user_func을 이용하여 서버에 ajax로 form 데이터를 넘기고 결과를 받아오는 js class
**/
function XmlJsFilter(form_object, module, act, callback_user_func) {
this.field = new Array();
this.parameter = new Array();
this.response = new Array();
this.fo_obj = form_object;
this.module = module;
this.act = act;
this.user_func = callback_user_func;
this.setFocus = XmlJsFilterSetFocus;
this.addFieldItem = XmlJsFilterAddFieldItem;
this.addParameterItem = XmlJsFilterAddParameterItem;
this.addResponseItem = XmlJsFilterAddResponseItem;
this.getValue = XmlJsFilterGetValue;
this.executeFilter = XmlJsFilterExecuteFilter;
this.checkFieldItem = XmlJsFilterCheckFieldItem;
this.getParameterParam = XmlJsFilterGetParameterParam;
this.alertMsg = XmlJsFilterAlertMsg;
this.proc = XmlJsFilterProc;
}
function XmlJsFilterSetFocus(target_name) {
var obj = this.fo_obj[target_name];
if(typeof(obj)=='undefined' || !obj) return;
var length = obj.length;
try {
if(typeof(length)!='undefined') {
obj[0].focus();
} else {
obj.focus();
}
} catch(e) {
}
}
function XmlJsFilterAddFieldItem(target, required, minlength, maxlength, equalto, filter) {
var obj = new Array(target, required, minlength, maxlength, equalto, filter);
this.field[this.field.length] = obj;
}
function XmlJsFilterAddParameterItem(param, target) {
var obj = new Array(param, target);
this.parameter[this.parameter.length] = obj;
}
function XmlJsFilterAddResponseItem(name) {
this.response[this.response.length] = name;
}
function XmlJsFilterGetValue(target_name) {
var obj = this.fo_obj[target_name];
if(typeof(obj)=='undefined' || !obj) return '';
var value = '';
var length = obj.length;
var type = obj.type;
if((typeof(type)=='undefined'||!type) && typeof(length)!='undefined' && typeof(obj[0])!='undefined' && length>0) type = obj[0].type;
else length = 0;
switch(type) {
case 'checkbox' :
if(length>0) {
var value_list = new Array();
for(var i=0;i<length;i++) {
if(obj[i].checked) value_list[value_list.length] = obj[i].value;
}
value = value_list.join('|@|');
} else {
if(obj.checked) value = obj.value;
else value = '';
}
break;
case 'radio' :
if(length>0) {
for(var i=0;i<length;i++) {
if(obj[i].checked) value = obj[i].value;
}
} else {
if(obj.checked) value = obj.value;
else value = '';
}
break;
case 'select' :
case 'select-one' :
if(obj.selectedIndex>=0) value = obj.options[obj.selectedIndex].value;
break;
default :
if(length>0 && target_type_list[target_name]) {
switch(target_type_list[target_name]) {
case 'kr_zip' :
var val1 = obj[0].value;
var val2 = obj[1].value;
if(val1&&val2) {
value = val1+'|@|'+val2;
}
break;
case 'tel' :
var val1 = obj[0].value;
var val2 = obj[1].value;
var val3 = obj[2].value;
if(val1&&val2&&val3) {
value = val1+'|@|'+val2+'|@|'+val3;
}
break;
}
} else {
value = obj.value;
}
break;
}
if(typeof(value)=='undefined'||!value) return '';
return value.trim();
}
function XmlJsFilterExecuteFilter(filter, value) {
switch(filter) {
case "email" :
case "email_address" :
var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
return regx.test(value);
break;
case "userid" :
case "user_id" :
var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
return regx.test(value);
break;
case "homepage" :
var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
return regx.test(value);
break;
case "korean" :
var regx = /^[가-힣]*$/;
return regx.test(value);
break;
case "korean_number" :
var regx = /^[가-힣0-9]*$/;
return regx.test(value);
break;
case "alpha" :
var regx = /^[a-zA-Z]*$/;
return regx.test(value);
break;
case "alpha_number" :
var regx = /^[a-zA-Z0-9\_]*$/;
return regx.test(value);
break;
case "number" :
return !isNaN(value);
break;
}
return null;
}
function XmlJsFilterAlertMsg(target, msg_code, minlength, maxlength) {
var target_msg = "";
if(alertMsg[target]!='undefined') target_msg = alertMsg[target];
else target_msg = target;
var msg = "";
if(typeof(alertMsg[msg_code])!='undefined') {
if(alertMsg[msg_code].indexOf('%s')>=0) msg = alertMsg[msg_code].replace('%s',target_msg);
else msg = target_msg+alertMsg[msg_code];
} else {
msg = msg_code;
}
if(typeof(minlength)!='undefined' && typeof(maxlength)!='undefined') msg += "("+minlength+"~"+maxlength+")";
alert(msg);
this.setFocus(target);
return false;
}
function XmlJsFilterCheckFieldItem() {
for(var i=0; i<extra_vars.length;i++) {
var name = extra_vars[i];
this.addFieldItem(name, false, 0, 0, "", "");
}
for(var i=0; i<this.field.length;i++) {
var item = this.field[i];
var target = item[0];
var required = item[1];
var minlength = item[2];
var maxlength = item[3];
var equalto = item[4];
var filter = item[5].split(",");
for(var j=0; j<notnull_list.length; j++) {
if(notnull_list[j]==target) required = true;
}
var value = this.getValue(target);
if(!required && !value) continue;
if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');
if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);
if(equalto) {
var equalto_value = this.getValue(equalto);
if(equalto_value != value) return this.alertMsg(target, 'equalto');
}
if(filter.length && filter[0]) {
for(var j=0;j<filter.length;j++) {
var filter_item = filter[j];
if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
}
}
}
return true;
}
function XmlJsFilterGetParameterParam() {
if(!this.fo_obj) return new Array();
var prev_name = '';
if(this.parameter.length<1) {
for(var i=0;i<this.fo_obj.length;i++) {
var name = this.fo_obj[i].name;
if(typeof(name)=='undefined'||!name||name==prev_name) continue;
this.addParameterItem(name, name);
prev_name = name;
}
}
var params = new Array();
for(var i=0; i<this.parameter.length;i++) {
var item = this.parameter[i];
var param = item[0];
var target = item[1];
var value = this.getValue(target);
params[param] = value;
}
return params;
}
function XmlJsFilterProc(confirm_msg) {
var result = this.checkFieldItem();
if(!result) return false;
if(typeof(confirm_msg)=='undefined') confirm_msg = '';
var params = this.getParameterParam();
var response = this.response;
if(confirm_msg && !confirm(confirm_msg)) return false;
if(!this.act) {
this.user_func(this.fo_obj, params);
return true;
}
exec_xml(this.module, this.act, params, this.user_func, response, params, this.fo_obj);
return null;
}
// form proc
function procFilter(fo_obj, filter_func) {
filter_func(fo_obj);
return false;
}