/*
 * basic.js
 *
 * 이 파일에는 사이트 전역에 공통으로 사용되는 자바스크립트 코드들을 모아 놓았다.
 *
 * v3.2
 *
 * v3.2 (07/10/12)	_addEventHandler() 추가 및 몇몇가지 warning 제거
 *
 */

/*============================================================================================================
 *** 일반 함수들 *********************************************************************************************
 *==========================================================================================================*/

/*
 * MS IE 여부
 * 브라우저의 버전은 확인하지 않음
 *
 */
var _bMSIE = (navigator.userAgent.toLowerCase().indexOf("msie") >= 0);


/*
 * 이벤트 객체
 *
 * FFox에서는 자동으로 전달되지 않아서 전역화 하였다.
 *
 */
var objEvent = null;

/*
 * 실행 콤포넌트
 *
 * v2.0 (08/01/06)	키 '`'를 누름으로써 winExe가 토글된다. 단, <body onkeypress="__eventBodyKeypress()">가 등록되어 있어야 함
 *
 */
function __eventBodyKeypress(){
	if(window.event.keyCode == 96)	_toggleObject("winExe");
}
if(_getRequestValue("call").substring(0,1) != "_"){
	document.write("<iframe id='winExe' name='winExe' style='display:none;'></iframe>");
	//_addEventHandler("body", "onkeypress", __eventBodyKeypress);	//-- 처리안됨
}

/*
 * document.getElementById()의 축약형
 *
 * v1.0 (09/02/08)	최초작성
 *
 */
function _e(id)
{
	return(document.getElementById(id));
}

/*
 * 새창을 띄우고 url 문서를 올린다.
 * 이때 option 가 있으면 적용한다.
 * 기본 창의 모양은 스크롤바도 없고 크기도 조절할 수 없는 민자 윈도이다.
 * ret 값이 참이면 리턴값으로 윈도 아이디를 돌린다(A, FORM 태그들에 사용할 수 있다.)
 *
 * v1.4 (07/06/21)	기본 옵션을 조절했다.
 * v1.3 (04/07/18)	retobj가 명시되면 생성 객체를 리턴한다.(document를 사용할 수 있음)
 * v1.2	윈도피쳐값을 사이즈와 옵션으로 분리했다.
 *
 * v1.4
 */
var _winID = parseInt(Math.random()*10000);
function _openPopup(url, size, option, ret, retobj){
	if(typeof(size) == "undefined")
		features = "width=850,height=600";
	else	features = size;
	if(typeof(option) == "undefined")
		features += ",toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0";
	else	features = features + "," + option;
	winID = "win" + _winID++;
	popup = window.open(url, winID, features);
	popup.focus();
	if(typeof(ret) != "undefined"){
		if(typeof(retobj) != "undefined")	if(retobj)	return(popup);
		if(ret)	return(winID);
	}
}
/*
 * img 로 지정된 이미지 파일을 새창을 띄워 출력한다.
 * img는 <img src="">에 명시되는 이미지 소스 경로이다.
 * 이미지를 보여주는 실제 페이지는 /imgview.html 이며, 따로 존재하여야 한다.
 *
 * v1.1
 */
function _viewImage(file){
	_openPopup("?call=imgview&file=" + file, "width=200,height=200", "resizable=1");
}
/*
 * 이미지소스변환 파일
 *
 * 본 함수는 이미지 롤오버에 사용된다.
 *
 * 예) <img src='orginal.gif' onmouseover="_imgMouseOver(this,'new.gif')" onmouseout="_imgMouseOut()">
 *
 * v2.0 (09/01/25)	obj를 인수로 넘겨받음, 모듈 내부 전역변수 변경
 * v1.1 (07/10/24)	FFox에서의 event 객체 오류를 비켜감
 *
 * v1.1
 *
 */
var __BASIC_IMG_SRC_ = "";
var __BASIC_IMG_OBJ_ = null;
function _imgMouseOver(obj,newsrc){
	if(obj.tagName != "IMG")	return;
	__BASIC_IMG_SRC_ = obj.src;
	__BASIC_IMG_OBJ_ = obj;
	obj.src = newsrc;
}
function _imgMouseOut(){
	if(!__BASIC_IMG_OBJ_)	return;
	__BASIC_IMG_OBJ_.src = __BASIC_IMG_SRC_;
	__BASIC_IMG_OBJ_ = null;
}
/*
 * obj의 크기(스타일)를 변경한다.
 *
 * v1.0
 */
function _objectResize(obj, dw, dh){
	if(dw > 0)	obj.style.pixelWidth += dw;
	if(dw < 0 && obj.style.pixelWidth > -dw)	obj.style.pixelWidth += dw;
	if(dh > 0)	obj.style.pixelHeight += dh;
	if(dh < 0 && obj.style.pixelHeight > -dh)	obj.style.pixelHeight += dh;
}
/*
 * obj를 Fade In/Out 시킨다.
 * obj는 임의의 문서요소이며, mode값이 +1이면 FadeOut, -1(default)이면 FadeIn작동을 하며, speed값은 1~10(default 5)의 값이다.
 * 본 함수는 obj 내부의 텍스트에만 적용(흰색<->검정색)된다. 즉, 이미지나, 별도의 내부 객제에 포함된 요소는 적용되지 않아 특별한 효과를 주고 있다.
 * (작동예는 www.orkut.com을 보면 된다)
 *
 * v1.0 (orkut에서 힌트를 얻었다)
 */
var _fade = 0;			//증감수치
var _fadeObj = null;	//대상객체
var _fadeValue = 0;		//현재값
function _fadeInOut(obj, mode, speed){
	if(typeof(mode) == "undefined")		mode = -1;
	if(typeof(speed) == "undefined")	speed = 5;
	if(speed < 1 || speed >10)	speed = 5;
	if(mode >= 0){
		_fade = speed;
		_fadeValue = 0;
	}
	else{
		_fade = -1*speed;
		_fadeValue = 255;
	}
	_fadeObj = obj;
	__fadeInOut();
}
function __fadeInOut(){
	_fadeObj.style.color = "rgb(" + _fadeValue + "," + _fadeValue + "," + _fadeValue + ")";
	_fadeValue += _fade;
	if(_fadeValue > 0 && _fadeValue < 255) setTimeout("__fadeInOut()", 10);
	if(_fadeValue < 0)		_fadeObj.style.color = "black";
	if(_fadeValue > 255)	_fadeObj.style.color = "white";
}

/*
 * name으로 명시된 스타일값 value를 설정/삭제한다.
 *
 * 본 함수는 문서의 마지막 스타일시트 파일의 끝에 "name { value }" 형식의 스타일을 추가한다.
 *
 * 사용예)
 *		onclick="_toggleStyle('.date', 'display:none;')"
 *		onmouseover="_toggleStyle('#subject', 'color:red;background:#eee;')"
 *
 * 설명)
 *		위 첫째 코드는 onclick 이벤트 발생시 class명이 'date'인 객체를 감추거나/보이거나 한다.
 *		실제로 CSS에 추가/삭제되는 값은 아래와 같다.
 *			.date { display:none; }
 *			#subject { color:red; background:#eee; }
 *
 *
 * v1.0 (06/01/05)	최초작성
 *
 */
var _aToggleStyleIndex = Array();	//-- 스타일시트의 인덱스를 저장
var _aToggleStyleName = Array();	//-- 인덱스 참조용 텍스트명을 저장
function _toggleStyle(name, value){
	//-- 상태변수 초기화
	if(_aToggleStyleIndex[name] == null){
		_aToggleStyleIndex[name] = -1;
		_aToggleStyleName[_aToggleStyleName.length] = name;
	}
	//-- CSS 적용
	var stylesheet = document.styleSheets[document.styleSheets.length-1];
	if(_aToggleStyleIndex[name]<0){
		if(_bMSIE){
			_aToggleStyleIndex[name] = stylesheet.rules.length;
			stylesheet.addRule(name, value, _aToggleStyleIndex[name]);
		}
		else{
			_aToggleStyleIndex[name] = stylesheet.cssRules.length;
			stylesheet.insertRule(name + " {" + value + "}", _aToggleStyleIndex[name]);
		}
	}
	//-- CSS 제거
	else{
		if(_bMSIE)
			stylesheet.removeRule(_aToggleStyleIndex[name]);
		else	stylesheet.deleteRule(_aToggleStyleIndex[name]);
		//-- CSS 인덱스 조절
		for(i = 0 ; i < _aToggleStyleName.length ; i++){
			if(_aToggleStyleIndex[_aToggleStyleName[i]] > _aToggleStyleIndex[name])
				_aToggleStyleIndex[_aToggleStyleName[i]]--;
		}
		_aToggleStyleIndex[name] = -1;
	}
}
function _cssAdd(name, value){
	var stylesheet = document.styleSheets[document.styleSheets.length-1];
	if(_bMSIE)
		stylesheet.addRule(name, value, stylesheet.rules.length);
	else	stylesheet.insertRule(name + " {" + value + "}", stylesheet.cssRules.length);
}
function _cssDelete(name, value){
	value = value.replace(/[\s;]/, "").toLowerCase();
	for(j = document.styleSheets.length-1 ; j >= 0 ; j--){
		var stylesheet = document.styleSheets[j];
		if(_bMSIE){
			for(i = stylesheet.rules.length-1 ; i >= 0  ; i--){
				if(name == stylesheet.rules(i).selectorText){
					csstext = stylesheet.rules(i).style.cssText.replace(/[\s;]/, "").toLowerCase();
					if(csstext == value)
						stylesheet.removeRule(i);
				}
			}
		}//if MSIE
	}

}

/*
 * 이벤트 헨들러 추가
 *
 * obj 객체의 evnt 이벤트에 이벤트 헨들러 func를 추가한다.
 * IE와 FF에서 작동된다.
 * 이벤트명은 on으로 시작해야 한다.
 *
 * 사용예)
 *		_addEventHandler('body', 'onload', initPage);
 *
 * v1.0
 *
 * v1.0 (07/10/12)	최초작성
 *
 */
function _addEventHandler(obj, evnt, func){
	if(!_bMSIE){
		evnt = evnt.replace("on", "");
		obj.addEventListener(evnt, func, false);
	}else	obj.attachEvent(evnt, func);
}

/*
 * 빈함수
 *
 * 보통 <A href="javascript:_null()" onclick="clickIt()">과 같이 동작을 하지 않고자 할때 사용한다.
 *
 * v1.0
 */
function _null(){
}

/*
 * Embed 컨트롤 삽입
 *
 * 수정된 인터넷 익스플로러에서 상호작용 ActiveX 컨트롤 활성화 가이드
 * (http://www.microsoft.com/korea/windows/ie/activex/activate/default.mspx)에
 * 명시된 내용을 바탕으로 플레시나 동영상을 문서에 삽입시켜 자동으로 컨트롤 활성화한다.
 * 다만, 본 함수로는 <EMBED> 형태로 삽입되므로, <object> 컨트롤로 삽입할 경우는 차후 논의토록 한다.
 *
 * 사용예)
 *		<script>_embed('music.mp3');</script>
 *		<script>_flash('/flash/menu.swf', 800, 60, 'white', 'wmode=transparent align=left allowscriptaccess=samedomain');</script>
 *
 * v1.3 (07/11/27)	<object> 태그 argv 추가 - id등 지정 가능
 * v1.2 (07/05/11)	옵션 수정적용
 * v1.1 (07/02/02)	플래시 전용 <object>를 사용함 - 옵션부분은 수정이 필요할 것임
 * v1.0 (06/05/07)	최초작성
 */
function _embed(src, option/*=""*/){
	if(typeof(option) == "undefined")	option = "";
	document.write("<EMBED SRC=\"" + src + "\" " + option + "></EMBED>");
}
function _flash(src, width, height, bgcolor/*=white*/, option/*=""*/, argv/*=""*/){
	if(typeof(bgcolor) == "undefined")	bgcolor = "white";
	if(typeof(option) == "undefined")	option = "wmode=transparent";
	if(typeof(argv) == "undefined")		argv = "";
	var aOption = option.split(",");
	var html = "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0' width='" + width + "' height='" + height + "' " + argv + ">\n";
	html += "<param name=movie value='" + src + "'>\n";
	html += "<param name=quality value=high>\n";
	html += "<param name=allowScriptAccess value=always>\n";
	html += "<param name=swliveconnect value=true>\n";
	html += "<param name=menu value=true>\n";
	html += "<param name=bgcolor value='" + bgcolor + "'>\n";
	for(var i = 0 ; i < aOption.length ; i++){
		aTmp = aOption[i].split("=");
		if(aTmp.length != 2)	continue;
		html += "<param name=" + aTmp[0] + " value='" + aTmp[1] + "'>\n";
	}
	html += "<embed src='" + src + "' quality=high pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' width='" + width + "' height='" + height + "' BGCOLOR='" + bgcolor + "' " + option + " " + argv + "></embed>\n";
	html += "</object>\n";
	document.write(html);
}


/*============================================================================================================
 *** 탭 컨트롤 관련 함수들 ***********************************************************************************
 *==========================================================================================================*/
/*
 * 제목이 title인 단일탭 컨트롤을 그린다.
 *
 * active가 명시되지 않으면, url 여부에 따라 활성/비활성 탭을 판단한다.
 * url이 명시되면 비활성화탭에 링크를 달며,
 * id가 명시되면 활성화탭에 _toggleObject()를 포함시킨다.
 *
 * 예)	_drawTab("탭1");			# 활성탭
 *		_drawTab("탭2", "mylink");	# 비활성탭
 *		_drawTab("탭3", "", false);	# 비활성탭 (링크없음)
 *
 * v1.4 (07/04/20)	FF에서 제대로 표시되지 않던 오류 수정
 * v1.3 (07/01/02)	활성/비활성 탭을 하나의 함수로 통합함
 *
 * v1.4
 *
 */
function _drawTab(title, url/*=""*/, active/*=false*/, id/*=""*/){
	//-- 인수초기화
	if(typeof(url) == "undefined")		url = "";
	if(typeof(id) == "undefined")		id = "";
	if(typeof(active) == "undefined")	active = (url == "");
	//-- 링크추가
	if(url != "")			title = "<a href=\"" + url + "\">" + title + "</a>";
	//-- 토글스크립트추가
	if(active && id != "")	title = "<a href=\"javascript:_toggleObject('" + id + "')\">" + title + "</a>";
	//-- MSIE?
	if(_bMSIE){
		var alpha = (active) ? "" : " style='filter:alpha(opacity=20);'";
		var span = "<span class='tabh'>";
		var xspan = "</span>";
	}else{
		var alpha = " class='tabh' align='left'" + ((active) ? "" : " style='opacity:0.2;'");		//-- 비활성탭 처리
		var span = "";
		var xspan = "";
	}
	//-- 출력
	document.write(span + "<table border=0 cellpadding=0 cellspacing=0" + alpha + "><tr><td width=5 height=20><img src='/images/_common/tabl.gif' border=0></td><td class=tab><nobr>" + title + "</nobr></td><td width=5><img src='/images/_common/tabr.gif' border=0></td></tr></table>" + xspan);
}
/*
 * idObj의 표시 여부를 전환한다(view 값이 없는경우)
 * 이때 view 값이 명시되어 있으면 직접 display:view;값을 대응시킨다.
 * 본 함수는 이벤트(onclick같은)로 부터 호출되어야 한다.
 * (<a href='javascript:'로 부터 호출되는 경우는 event 객체가 생성되지 않는다)
 *
 * v2.2 (08/06/23)	style변수를 지역변수로 변경하였음.
 * v2.1 (05/12/26)	objEvent 전역 객체를 이용토록 수정함(FFox 대응)
 * v2.0 (02/04/23)	movable을 참으로 하면, obj는 마우스 좌표+(x,y)로 이동한다.
 *
 * v2.2
 */
function _toggleObject(idObj, view/*=don't care*/, movable/*=false*/, x/*=5*/, y/*=5*/){
	//인수확인
	if(typeof(movable) == "undefined")	movable = false;
	else	movable = true;
	if(typeof(x) == "undefined")	x = 5;
	else	x = parseInt(x);
	if(typeof(y) == "undefined")	y = 5;
	else	y = parseInt(y);
	//객체확인
	var style = document.getElementById(idObj).style;
	//이동
	if(movable){
		style.position = "absolute";
		if(typeof(event) == "undefined")	event = objEvent;
		if(event){
			style.left = event.clientX + document.body.scrollLeft + x;
			style.top = event.clientY + document.body.scrollTop + y;
		}
		else{
			style.left = document.body.scrollLeft + x;
			style.top = document.body.scrollTop + y;
		}
	}
	//토글
	if(typeof(view)=="undefined" || view=="")
		style.display = (style.display == "none") ? "inline" : "none";
	else	style.display = view;
}


/*============================================================================================================
 *** 폼 컨트롤 관련 함수들 ***********************************************************************************
 *==========================================================================================================*/
/*
 * obj 컨트롤의 정수입력값 유효범위를 체크한다.
 * 입력값이 유효하지 않으면 msg를 출력하고 obj에 포커스를 둔다.
 * msg 끝에(줄을 바꿔서) 유효범위를 표시해준다.
 *
 * v1.5 (07/10/24)	유효하지 않은 값인 경우를 초기값으로 min을 설정한다.
 * v1.4 (07/02/02)	커서 이동 등 오류를 정정하였다.
 * v1.3 (04/10/12)	nofocus가 명시되면 에러시 포커스를 이동하지 않는다.
 * v1.2 (02/04/21)	msg가 명시되지 않으면 메시지를 출력하지 않는다.
 *
 * v1.5	by byongdol
 */
function _frmCheckInteger(obj, min, max, msg, nofocus){
	val = parseInt(obj.value);
	if(isNaN(val))	val = 0;
	if(obj.value != val.toString())	obj.value = val;
	if(val < min || val > max){
		if(msg)	alert(msg + "\n\nValid Range : " + _addCommas(min) + " ~ " + _addCommas(max));
		if(typeof(nofocus) == "undefined")	obj.focus();
		obj.value = min;
		return(false);
	}
	return(true);
}
/* obj 컨트롤의 최소 문자열 길이를 체크한다.
 * 입력된 문자열이 최수문자열길이보다 작으면 msg를 출력한다.
 *
 * v1.3 (04/10/12)	nofocus가 명시되면 에러시 포커스를 이동하지 않는다.
 * v1.2 (02/04/21)	msg가 명시되지 않으면 메시지를 출력하지 않는다.
 *
 * v1.3
 */
function _frmCheckString(obj, n, msg, nofocus){
	if(obj.value.length < n){
		if(msg)	alert(msg);
		if(typeof(nofocus) == "undefined")	obj.focus();
		return(false);
	}
	return(true);
}
/*
 * obj 컨트롤이 pattern 형식에 부합되는지 체크한다.
 * pattern은 정규표현식이다.
 *
 * v1.4 (05/11/30)	대소문자 구분은 pattern 정의에서 수행하도록 수정함
 * v1.3 (04/10/12)	nofocus가 명시되면 에러시 포커스를 이동하지 않는다.
 * v1.2 (02/04/21)	msg가 명시되지 않으면 메시지를 출력하지 않는다.
 * v1.1				원본문자열을 소문자로 변환하여 체크한다.
 *
 * v1.4
 */
function _frmCheckPattern(obj, pattern, msg, nofocus){
	if(!pattern.test(obj.value)){
		if(msg)	alert(msg);
		if(typeof(nofocus) == "undefined")	obj.focus();
		return(false);
	}
	return(true);
}
/*
 * 표준 정규표현식 모음
 *
 * v1.8 (09/02/28)	국제전화번호(+82-11-1234-1234)를 수용할 수 있는 느슨한 _regPhoneFull 추가됨
 * v1.7 (08/03/18)	전화번호에서 '-'가 빠진 형식 _regPhone2가 추가됨
 * v1.6 (07/11/10)	날짜 형식 오류 수정
 * v1.5 (05/08/13)	IP 형식 추가
 * v1.4 (04/07/10)	일부표현식의 대소문자 구분무시(i옵션) 적용
 * v1.3	(04/02/22)	_regExtHtml 형식 수정
 * v1.2				이메일형식 수정(1글자 ID 허용)
 * v1.1				파일확장자 추가
 *
 * v1.8
 */
var _regDate = /^((?:19|20)?[0-9]{2})-(0?[1-9]|10|11|12)-([0-2]?[1-9]|10|20|30|31)$/;
var _regTime = /^(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/;
var _regDatetime = /^((?:19|20)?[0-9]{2})-(0?[1-9]|10|11|12)-([0-2]?[1-9]|10|20|30|31)(?:\s+([01]?[0-9]|2[0-3]):([0-5]?[0-9])(?::([0-5]?[0-9]))?)?$/;
var _regPhone = /^0[0-9]{1,2}-[1-9][0-9]{2,3}-[0-9]{4}$/;
var _regPhone2 = /^0[0-9]{1,2}-?[1-9][0-9]{2,3}-?[0-9]{4}$/;
var _regMobile2 = /^01[016789]-?[1-9][0-9]{2,3}-?[0-9]{4}$/;
var _regPhoneFull = /^\+?[-0-9]{7,17}$/;
var _regEmail = /^\w[-.\w]*\@[-\w]+(?:\.[-\w]+)*\.[a-zA-Z]{2,5}$/;
var _regUrl = /^\bhttp:\/\/[-\w]+(?:\.[-\w]+)*\.[a-zA-Z]{2,5}\b(\/[^\s<>{}()]*)?/;
var _regID = /^[_a-zA-Z][_a-zA-Z0-9]{3,15}$/;
var _regPW = /^[_a-zA-Z0-9]{4,16}$/;
var	_regExtImage = /\.(gif|jpe?g|png)$/i;
var	_regExtHtml = /\.(p?html?|php\d?|asp|cgi|jsp)$/i;
var	_regExtText = /\.(txt|bat)$/i;
var _regIP = /^[12]?[0-9]{1,2}\.[12]?[0-9]{1,2}\.[12]?[0-9]{1,2}\.[12]?[0-9]{1,2}$/;

/*
 * val 숫자를 문자열로 변환한 후 3자리마다 콤마(,)를 삽입한다.
 *
 * v1.1
 *
 * v1.1 (06/11/01)	함수명을 '_'로 시작토록 변경함
 *
 */
function _addCommas(val){
	strValue = val + "";
	var objRegExp = /(-?[0-9]+)([0-9]{3})/
	while(objRegExp.test(strValue))
		strValue = strValue.replace(objRegExp, '$1,$2');
	return strValue;
}

/*
 * obj_c 컨트롤로 입력받은 숫자를
 * obj_c에는 천단위 콤마를 포함하고,
 * obj에는 정확한 숫자만을 기록하고,
 * obj_s에는 숫자를 읽은 문장을 기록한다.
 *
 * 컨트롤 이름의 규칙이 명확해야 하며, 실제 사용예는 다음과 같다.
 *
 *		<input type="text" id="money_c" onkeyup="_readMoney(this)"> <!-- 사용자로 부터 입력받는 컨트롤 -->
 *		<span class="hint" id="money_s"></span> <!-- 입력금액을 문자열로 표현하기 위한 컨트롤 -->
 *		<input type="hidden" name="money" id="money"> <!-- 입력값 전송을 위한 숨겨진 컨트롤, 전송을 위해 name속성이 필요함 -->
 *
 * v1.1
 *
 * v1.1 (07/11/16)	컨트롤의 id를 사용토록 변경함
 *
 */
function _readMoney(obj_c, s_pre/*='('*/, s_post/*='원)'*/){
	var id = obj_c.id.substring(0, obj_c.id.length-2);/* 폼 전송 컨트롤 이름 확인 */
	var obj = document.getElementById(id);				/* 폼 전송 컨트롤 */
	var obj_s = document.getElementById(id + "_s");		/* 문장표현 컨트롤 */
	//-- 비숫자문자제거
	var str = "";
	var ch = "";
	for(var i = 0 ; i < obj_c.value.length ; i++){
		ch = obj_c.value.substring(i, i+1);
		if((ch >= "0" && ch <= "9") || ch == "-")
			str += ch;
	}
	var val = parseInt(str);
	if(isNaN(val))	val = 0;
	obj.value = val;
	//-- 콤마표시출력
	str = _addCommas(obj.value);
	if(str != obj_c.value)	obj_c.value = str;
	//-- 문자표시출력
	if(typeof(s_pre) == "undefined")	s_pre = "(";
	if(typeof(s_post) == "undefined")	s_post = "원)";
	obj_s.innerHTML = s_pre + _readDigit(obj.value) + s_post;
}

/*
 * obj에 입력된 숫자를 사람이 읽는 식으로 읽어 리턴한다. (어딘가 은행사이트에서 가져왔다)
 *
 * 예) digit="1234" ==> RETRUN "천2백3십4"
 *
 * v1.0
 *
 */
function _readDigit(digit){
	var hanNumber = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
	var fourFour = new Array("일", "만", "억", "조");
	var fourDigit = new Array("일", "십", "백", "천");
	num = digit + "";
	sign = num.substring(0, 1);
	if(sign != "-")		sign = "";
	else	num = num.substring(1, 100);
	//-- 기본값 확인
	if(isNaN(parseInt(num)))	return("--");
	if(num.length == 1)			return(sign+num);
	//-- 띄어쓰기
	delimiter = " ";
	//-- 변수초기화
	bPos = 0; // 만, 억, 조
	sPos = 0; // 십, 백, 천
	digit = 0;
	szDigit = "";
	is_start = false;
	appendFF = false;
	len = num.length;
	szHan = "";
	//-- digit의 모든 문자를 탐색
	for(i = len-1 ; i >= 0 ; i--){
		szDigit = num.substring(i,i+1);
		digit = parseInt(szDigit);
		if(digit != 0){
			if(bPos!=0 && sPos==0) {
				if(is_start == true)	szHan += delimiter;
				szHan += fourFour[bPos]; // 만, 억
				appendFF = false;
			}
			if(bPos!=0 && appendFF==true){
				if(is_start == true)	szHan += delimiter;
				szHan += fourFour[bPos]; // 만, 억
				appendFF=false;
			}
			if(sPos!=0)	szHan += fourDigit[sPos]; // 십, 백, 천
			szHan += hanNumber[digit]; // 일, 이, 삼
			is_start=true;
		}
		else if(sPos==0 && bPos!=0)	appendFF=true;
		sPos++;
		if(sPos%4 == 0){
			sPos = 0;
			bPos++;
			if(bPos >= 4)	return "너무큰수";
		}
	}
	if(is_start == false)	szHan += "0";
	rslt = "";
	for(i = szHan.length - 1; i >= 0; i--)
		rslt += szHan.substring(i, i + 1);
	return(sign+rslt);
}

/*
 * 입력받은 날짜문자(yyyy-mm-dd)를 유닉스 타임스템프 값으로 변환한다.
 *
 * v2.1
 *
 * v2.1 (06/11/01)	함수명을 '_'로 시작토록 변경함
 * v2.0 (06/01/18)	'Y-m-d H:i:s'의 형식을 같는 정규식 _regDatetime을 이용토록 변경함
 *
 */
function _str2time(str){
	if(!_regDatetime.test(str)){alert('error');	return(0);}
	var y = parseInt(RegExp.$1, 10);
	var m = parseInt(RegExp.$2, 10) -1;
	var d = parseInt(RegExp.$3, 10);
	var h = parseInt(RegExp.$4, 10);
	var i = parseInt(RegExp.$5, 10);
	var s = parseInt(RegExp.$6, 10);
	if(y < 100)		y += ((y >= 90) ? 1900 : 2000);
	if(isNaN(h))	h = 0;
	if(isNaN(i))	i = 0;
	if(isNaN(s))	s = 0;
	objDate = new Date(y, m, d, h, i, s);
	return(objDate.getTime() /1000);
}

/*
 * 일련번호 min~max가 붙은 id 체크박스를 탐색하여 선택된 체크박스의 values들을 리턴한다.
 * 각 values들은 delimiter로 구분되며, 명시되지 않으면 ','가 사용된다.
 *
 * 이 함수는 여러개의 체크박스로 구성된 그룹을 대상으로 사용자 선택값을 추출하는데 사용된다.
 * 체크박스는 이런 모양일 것이다.
 *    <input type="checkbox" id="color0" value="빨강">
 *    <input type="checkbox" id="color1" value="노랑">
 *    <input type="checkbox" id="color2" value="파랑">
 * 위 예의 color 그룹에 대하여 선택값을 추출하기 위해서는
 *    var colors = getCheckboxValues("color", 0, 2);
 * 하면되며, 리턴 값 colors는 "노랑,파랑"과 같은 형식일 것이다.
 *
 * v1.0 (07/05/23) by byongdol
 *
 */
function _getCheckboxValues(id, min, max, delimiter/*=","*/){
	var val = "";
	var obj = null;
	if(typeof(delimiter) == "undefined")	delimiter = ",";
	for(var i = min ; i <= max ; i++){
		obj = document.getElementById(id + i);
		if(obj.checked)
			val += delimiter + obj.value;
	}
	return(val.substring(delimiter.length, 255));
}

/*
 * <input type="text">와 <select>를 이용하여 콤보박스를 운영한다.
 *
 * obj는 실제로 값을 전송할 <input> 컨트롤이며,
 * obj_s는 콤보박스로 운영될 <select> 컨트롤이다.
 * 두 컨트롤의 이름/아이디는 접미어 '_s'로 연결되어 진다.
 *
 * obj_s의	onfocus, onactivate 이벤트에는 on=true로 호출하여 콤보박스를 활성화시키며,
 *			onchange, onblur 이벤트에는 on=false로 호출하여 콤보박스를 닫는다.
 *
 * 실제 사용예는 다음과 같다.
 *
 *		<input type="text" name="status" id="status" style="width:100px;display:;">		<!-- 초기스타일이 적용되어야 함 -->
 *		<select name="stauts_s" style="width:22px;" onchange="_clickCombobox(this,false)" onblur="_clickCombobox(this,false)"
 *			onfocus="_clickCombobox(this,true)" onactivate="_clickCombobox(this,true)">	<!-- 콤보박스는 버튼만 표시함 -->
 *			<option value="aaa">aaa
 *			<option value="bbbb">bbbb
 *			<option value="">
 *		</select>
 *
 * v1.0 (07/11/13)	최초작성
 *
 */
function _clickCombobox(obj_s, on){
	var name = obj_s.name.substring(0, obj_s.name.length-2);
	var obj = _e(name);
	obj.value = obj_s.value;
	if(on){
		if(obj.style.display == "none")	return;
		obj_s.style.width = parseInt(obj.style.width) + parseInt(obj_s.style.width);
		obj_s.value = obj.value;
		obj.style.display = "none";
		obj_s.focus();
	}else{
		if(obj.style.display == "")	return;
		obj_s.style.width = parseInt(obj_s.style.width) - parseInt(obj.style.width);
		obj.style.display = "";
		obj.focus();
	}
}



/*============================================================================================================
 *** 쿠키 컨트롤 관련 함수들 *********************************************************************************
 *==========================================================================================================*/
/*
 * 쿠키값을 설정한다.
 *
 * v1.1
 *
 * v1.1	(04/07/12)	expire(초) 설정가능
 *
 */
function _setCookie(name, value, expire)
{
	if(typeof(expire) != "undefined"){
		var expireDate = new Date();
		expireDate.setSeconds(expireDate.getSeconds() + expire);
		document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + expireDate.toGMTString() + ";";
	}
	else	document.cookie = name + "=" + escape( value ) + "; path=/;";
}
/*
 * 쿠키값을 읽어온다.
 *
 * v1.1
 *
 * v1.1 (08/06/26)	예외처리 추가
 *
 */
function _getCookie(Name){
	var search = Name + "=";
	try {
		if(document.cookie.length > 0){ // if there are any cookies
			var offset = document.cookie.indexOf(search);
			if (offset != -1) { // if cookie exists
				offset += search.length;   // set index of beginning of value
				var end = document.cookie.indexOf(";", offset);     // set index of end of cookie value
				if(end == -1)
					end = document.cookie.length;
				var value = unescape(document.cookie.substring(offset, end));
				return((value == "undefined") ? "" : value);
			}
		}
	}catch(e){
		return("");
	}
}


/*============================================================================================================
 *** URL 관련 함수들 *****************************************************************************************
 *==========================================================================================================*/
/*
 * Request 값을 해석한다.
 *
 * 예:	/test.html?aaa=11&bbb=22 인 경우
 *		bbb = _getRequestValue("bbb");	(bbb는 '22'가 됨)
 *
 * v1.0
 */
function _getRequestValue(name){
	name = name + '=';
	var start0 = location.search.indexOf(name);
	if(start0 < 0)	return("");
	var start = start0 + name.length;
	var end = location.search.indexOf('&', start);
	if(end < 0)	end = location.search.length;
	return(location.search.substring(start, end));
}

/*
 * url에 포함된 특수문자(?&=+)를 urlencode()에 대응하여 인코딩한다.
 *
 * 제대로된 urlencode()는 아니지만, 그런대로 쓸만하지 않을까 한다.
 *
 * v1.0 (07/10/13)
 */
function _urlencode(url){
	var encoded = "";
	var charEsc = Array("?", "&", "=", "+", " ");
	var strEsc = Array("%3F", "%26", "%3D", "%2B", "+");
	var i, j;
	for(i = 0 ; i < url.length ; i++){
		var ch = url.charAt(i);
		for(j = 0 ; j < charEsc.length ; j++){
			if(ch == charEsc[j]){
				encoded += strEsc[j];
				break;
			}
		}
		if(j >= charEsc.length)	encoded += ch;
	}
	return(encoded);
}


/*============================================================================================================
 *** 드림위버 기본 함수들 ************************************************************************************
 *==========================================================================================================*/

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}


/*============================================================================================================
 *** 사이트 로컬 함수들 **************************************************************************************
 *==========================================================================================================*/

/*
 * 아래 코드로 대체되었음
 *
 * <script language="JavaScript" type="text/javascript" src="include/function.js"></script>
 *
 */