mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-04-29 15:22:15 +09:00
삭제
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2327 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
commit
8326004cb2
2773 changed files with 91485 additions and 0 deletions
614
common/js/common.js
Normal file
614
common/js/common.js
Normal 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
64
common/js/iePngFix.htc
Normal 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
636
common/js/tree_menu.js
Normal 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
621
common/js/x.js
Normal 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
147
common/js/xml_handler.js
Normal 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
305
common/js/xml_js_filter.js
Normal 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue