/***********************************************************************************

WEB programming시 일반적으로 쓰일 수 있는 function 모음

NAMING convention
	1. 모든 user-defined function은 prefix 'fn'을 사용한다.
	2. return type을 지칭하는 prefix를 'fn'에 이어서 쓴다
		아무것도 return하지 않으면 아무것도 쓰지 않는다.
		ex) to return string : fnsz, integer : fni, etc
	3. prefix 다음에 '_'를 쓰고 실제 function name을 쓴다.
		ex) fnsz_trim
	4. 기존 function과 같은 기능의 function을 구현할 경우 version number를 붙인다.
		v1일 경우 생략한다.
		ex) fnsz_trim, fnsz_trim_v2

REFERENCE
	1. GNUBOARD

***********************************************************************************/


/****	common=>	****/
if (typeof(COMMON_JS) == 'undefined') { //run only once
	var COMMON_JS = true;

	function openNewWindow(window)
	{
		open(window,"NewWindow","left=0, top=0, toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=670, height=370");
	}

	function doOpenImage(img)
	{
		var obj_openImage = window.open('/common/open_image.asp?img=' + img, 'openImage', 'width=320, height=240, resizable=yes');
		obj_openImage.focus();
	}

	function checkValidText(obj, objName, isNeed, maxLen, allowHan, onlyNum)
	{
		obj.value = fnsz_trim(obj.value);
		if (isNeed == true) {
		if (obj.value == "" ) {
				alert(objName + "을(를) 입력하세요");
				obj.focus();
				return false;
			}
		}
		if (!allowHan)  {
			if (lenHan(obj.value) != obj.value.length) {
				alert(objName + "은(는) 한글을 입력할 수 없습니다");
				return false;
			}
		}
		if (onlyNum) {
			if (!checkOnlyNumber(obj.value)) {
				alert(objName + '은(는) ' + '숫자로만 구성되어야 합니다.');
	 			return false;
			}
		}
		if (maxLen != 0) {
			if (!checkHanLen(objName, obj, maxLen)) {
				return false;
			}
		}
		return true;
	}

	function checkValidNumeric(obj, objName, isNeed, maxLen)
	{
		obj.value = fnsz_trim(obj.value);
		if (isNeed == true) {
			if (obj.value == "") {
				alert(objName + "을(를) 입력하세요");
				obj.focus();
				obj.select();
				return false;
			}
		}
		if (!checkOnlyNumber(obj.value)) {
			alert(objName + '은(는) ' + maxLen +'단위 이내의 숫자이어야 합니다.');
			obj.focus();
			obj.select();
		 	return false;
		}

		if (obj.value.length > maxLen) {
			alert(objName + '은(는) ' + maxLen +'단위 이내의 숫자이어야 합니다.');
			obj.focus();
			obj.select();
			return false;
		}
		return true;
	}

	function checkOnlyNumber(msg)
	{
		for (i=0; i<msg.length; i++) {
			var ch = msg.charAt(i);
			if (!((0 <= ch) && (ch <= 9))) {
				return false;
			}
		}
		return true;
	}

	function checkValidDate(obj, objName, isNeed)
	{
		var a = obj.value;
		obj.value = fnsz_trim(obj.value);
		if (isNeed == true) {
			if (obj.value == "" ) {
				alert(objName + "을(를) 입력하세요");
				obj.focus();
				return false;
			}
		}
		if (obj.value.length != 0) {
			if ((obj.value.length != 10) || (obj.value.substring(4,5) != '-') || (obj.value.substring(7,8) != '-')) {
				alert(objName + "은(는) 올바른 날자가 아닙니다");
				obj.focus();
				return false;
			}

			var a = new Date();
			try {
				a.setYear(obj.value.substring(0,4) * 1);
				a.setMonth(obj.value.substring(5,7) * 1 - 1);
				a.setDate(obj.value.substring(8,10) * 1);
			} catch (E) {
				alert(objName + "은(는) 올바른 날자가 아닙니다");
				obj.focus();
				obj.selectstart=0;
				obj.sellength=obj.value.length;
				return false;
			}
		}
		return true;
	}

	function checkHanLen(objName, obj, maxLen)
	{
		if (lenHan(obj.value) > maxLen) {
			if (isOdd(obj.value.length)) {
				alert(objName + '은(는) 영문 ' + maxLen +'자, 한글 ' + ((maxLen - 1) / 2) + '를 넘을 수 없습니다.');
			} else {
				alert(objName + '은(는) 영문 ' + maxLen +'자, 한글 ' + (maxLen / 2) + '를 넘을 수 없습니다.');
			}
			obj.focus();
			return false;
		}

		return true;
	}

	function lenHan(msg)
	{
		var nbytes = 0;

		for (i=0; i<msg.length; i++) {
			var ch = msg.charAt(i);
			if(escape(ch).length > 4) {
				nbytes += 2;
			} else if (ch == '\n') {
				if (msg.charAt(i-1) != '\r') {
					nbytes += 1;
				}
			} else if (ch == '<' || ch == '>') {
				nbytes += 4;
			} else {
				nbytes += 1;
			}
		}

		return nbytes;
	}

	function leftHan(message, maximum)
	{
		var inc = 0;
		var nbytes = 0;
		var msg = "";
		var msglen = message.length;

		for (i=0; i<msglen; i++) {
			var ch = message.charAt(i);
			if (escape(ch).length > 4) {
				inc = 2;
			} else if (ch == '\n') {
				if (message.charAt(i-1) != '\r') {
					inc = 1;
				}
			} else if (ch == '<' || ch == '>') {
				inc = 4;
			} else {
				inc = 1;
			}
			if ((nbytes + inc) > maximum) {
				break;
			}
			nbytes += inc;
			msg += ch;
		}
		return msg;
	}

	/****	trim=>	****/
	function fnsz_trim(sz_arg)
	{
		var result = "";
		var from_pos = to_pos = 0;

		for (i = 0; i < sz_arg.length; i++) {
			if( sz_arg.charAt(i) == ' ' ) {
				continue;
			} else {
				from_pos = i;
				break;
			}
		}

		for (i = sz_arg.length; i >= 0; i--) {
			if (sz_arg.charAt(i-1) == ' ') {
				continue;
			} else {
				to_pos = i;
				break;
			}
		}

		result = sz_arg.substring(from_pos, to_pos);

		return result;
	}


	function fnsz_trim_v2(sz_arg)
	{
		var pattern = /(^\s*)|(\s*$)/g; //\s 공백 문자
		return sz_arg.replace(pattern, "");
	}
	/****	<=trim	****/


	/****	fnb_isEmailOK=>	****/
	function fnb_isEmailOK(sz_email)
	{
		var OK = false;
		//var pattern = /(\S+)@(\S+)\.(\S+)/; 이메일주소에 한글 사용시
		var pattern = /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/;


		if (sz_email && pattern.test(sz_email)) {
			OK = true;
		}

		return OK;
	}

	function CheckEmail(str)
	{
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if (filter.test(str)) {
			return true;
		} else {
			return false;
		}
	}
	/****	<=fnb_isEmailOK	****/


	/****	fnb_isUserIdOK=>	****/
	function fnb_isUserIdOK(sz_userid, i_lenMin, i_lenMax)
	{
		var OK = false;
		var pattern = /(^([a-z])([a-z0-9_]+$))/;

		if (sz_userid && (sz_userid.length >= i_lenMin && sz_userid.length <= i_lenMax) && pattern.test(sz_userid)) {
			OK = true;
		}

		return OK;
	}
	/****	<=fnb_isUserIdOK	****/


	/****	한글인지 검사, 자음/모음만 있는 한글은 불가=>	****/
	function fnb_isCompleteHangulOK(sz_arg)
	{
		var OK = false;
		var pattern = /([^가-힣\x20])/i;

		if (sz_arg && !pattern.test(sz_arg)) {
			OK = true;
		}

		return OK;
	}
	/****	<=한글인지 검사, 자음/모음만 있는 한글은 불가	****/


	/****	한글인지 검사, 자음/모음만 있는 한글 가능=>	****/
	function fnb_isHangulOK(sz_arg)
	{
		var OK = false;
		var pattern = /([^가-힣ㄱ-ㅎㅏ-ㅣ\x20])/i;

		if (sz_arg && !pattern.test(sz_arg)) {
			OK = true;
		}

		return OK;
	}
	/****	<=한글인지 검사, 자음/모음만 있는 한글 가능	****/


	/****	fnb_isAlpha_	****/
	function fnb_isAlpha(sz_arg)
	{
		var OK = false;
		var pattern = /(^[a-zA-Z]+$)/;

		if (sz_arg && pattern.test(sz_arg)) {
			OK = true;
		}

		return OK;
	}
	/****	<=fnb_isAlpha	****/


	/****	fnb_isNumeric=>	****/
	function fnb_isNumeric(sz_arg)
	{
		var OK = false;
		var i_loop;

		if (sz_arg.length > 0) {
			for (i_loop = 0; i_loop < sz_arg.length; i_loop++) {
				if (sz_arg.charAt(i_loop) < '0' || sz_arg.charAt(i_loop) > '9') {
					break;
				}
			}
			if (i_loop == sz_arg.length) {
				OK = true;
			}
		}

		return OK;
	}
	/****	<=fnb_isNumeric	****/


	/****	fnb_isAlphaNumeric=>	****/
	function fnb_isAlphaNumeric(sz_arg, len_min, len_max)
	{
		var OK = false;
		var pattern = /(^[a-zA-Z0-9]+$)/;

		if (sz_arg && pattern.test(sz_arg)) {
			OK = true;
		}

		if ((len_min != null) && (sz_arg.length < len_min)) {
			OK = false;
		}
		if ((len_max != null) && (sz_arg.length > len_max)) {
			OK = false;
		}

		return OK;
	}
	/****	<=fnb_isAlphaNumeric	****/


	/****	fnb_isAlphaNumericUnderline=>	****/
	function fnb_isAlphaNumericUnderline(sz_arg)
	{
		var OK = false;
		var pattern = /(^[a-zA-Z0-9\_]+$)/;

		if (sz_arg && pattern.test(sz_arg)) {
			OK = true;
		}

		return OK;
	}
	/****	<=fnb_isAlphaNumericUnderline	****/


	/****	fnb_isJuminNum=>	****/
	function fnb_isJuminNum(sz_arg)
	{
		var OK = false;
		var pattern = /(^[0-9]{13}$)/;
		var sum_1 = 0, sum_2 = 0, at = 0;

		if (sz_arg && pattern.test(sz_arg)) {
			sum_1 = (sz_arg.charAt(0) * 2) + (sz_arg.charAt(1) * 3) + (sz_arg.charAt(2) * 4) + (sz_arg.charAt(3) * 5) + (sz_arg.charAt(4) * 6) + (sz_arg.charAt(5) * 7) + (sz_arg.charAt(6) * 8) + (sz_arg.charAt(7) * 9) + (sz_arg.charAt(8) * 2) + (sz_arg.charAt(9) * 3) + (sz_arg.charAt(10) * 4) + (sz_arg.charAt(11) * 5);
			sum_2 = sum_1 % 11;

			if (sum_2 == 0) {
				at = 10;
			} else {
				if (sum_2 == 1) {
					at = 11;
				} else {
					at = sum_2;
				}
			}
			att = 11 - at;

			// 1800 년대에 태어나신 분들은 남자, 여자의 구분이 9, 0 이라는
			// 얘기를 들은적이 있는데 그렇다면 아래의 구문은 오류이다.
			// 하지만... 100살넘은 분들이 주민등록번호를 과연 입력해볼까?
			if (sz_arg.charAt(12) == att && sz_arg.substr(2, 2) >= '01' && sz_arg.substr(2, 2) <= '12' && sz_arg.substr(4, 2) >= '01' && sz_arg.substr(4, 2) <= '31' && sz_arg.charAt(6) <= 4) {
				OK = true;
			}
		}

		return OK;
	}
	/****	<=fnb_isJuminNum	****/


	/****	fnb_isCompanyNum=>	****/
	function fnb_isCompanyNum(fld)
	{
		var OK = false;
		var pattern = /(^[0-9]{10}$)/;
		var sum = 0;
		var at = 0;
		var att = 0;

		if (sz_arg && pattern.test(sz_arg)) {
			sum = (sz_arg.charAt(0) * 1) + (sz_arg.charAt(1) * 3) + (sz_arg.charAt(2) * 7) + (sz_arg.charAt(3) * 1) + (sz_arg.charAt(4) * 3) + (sz_arg.charAt(5) * 7) + (sz_arg.charAt(6) * 1) + (sz_arg.charAt(7) * 3) + (sz_arg.charAt(8) * 5);
			sum += parseInt((sz_arg.charAt(8) * 5) / 10);
			at = sum % 10;
			if (at != 0) {
				att = 10 - at;
			}

			if (sz_arg.charAt(9) == att) {
				OK = true;
			}
		}

		return OK;
	}
	/****	<=fnb_isCompanyNum	****/


	/****	fn_wait=>	****/
	/*
	function wait( flag )
	{
		var windowX = (screen.width / 2) - (60 / 2);
		var windowY = (screen.height / 2) - (45 / 2);

		if (flag == 1) {
			var windowprops = "left=" + windowX + ", top=" + windowY + ", height=50,width=110,location=no,scrollbars=no,menubars=no,toolbars=no,resizable=no";
			window.open("/wait.htm", "eisWait", windowprops);
		} else {
			var windowprops = "left=3000, top=3000, height=50,width=110,location=no,scrollbars=no,menubars=no,toolbars=no,resizable=no";
			var waitWin = window.open("/wait.htm", "eisWait", windowprops);
			waitWin.close();
		}
	}
	*/
	/****	<=fn_wait	****/


	/****	fnsz_formatNumber=>	****/
    //자바스크립트로 PHP의 number_format 흉내를 냄
    //숫자에 ','를 출력
	/*
	function fnsz_formatNumber(data)
	{
		var tmp = '';
		var number = '';
		var cutlen = 3;
		var comma = ',';
		var i;

		len = data.length;
		mod = (len % cutlen);
		k = cutlen - mod;
		for (i=0; i<data.length; i++) {
			number = number + data.charAt(i);

			if (i < data.length - 1) {
				k++;
				if ((k % cutlen) == 0) {
					number = number + comma;
					k = 0;
				}
			}
		}

		return number;
	}
	*/

	function fnsz_formatNumber(num, seplen, separator) // not work
	{
		var i = 0, buf = "", len = 0, res = "";


		buf = num.toString();
		if ((len = buf.length) <= seplen) {
			return buf;
		}

		for (i = len; i - seplen > 0; i -= seplen) {
			res = separator + buf.substring(i - seplen, i) + res;
		}

		res = buf.substring(0, i) + res;

		return res;
	}
	/****	<=fnsz_formatNumber	****/


	/****	fnsz_trimComma=>	****/
    //','를 없앤다.
	function fnsz_trimComma(data)
	{
		var tmp = '';
		var comma = ',';
		var i;

		for (i = 0; i < data.length; i++) {
			if (data.charAt(i) != comma) {
				tmp += data.charAt(i);
			}
		}
		return tmp;
	}
	/****	<=fnsz_trimComma	****/


	/****	fnsz_reverse=>	****/
	function fnsz_strReverse(str)
	{
		var res, i;

		for (res = "", i = str.length - 1; i >= 0; i--) {
			res += str.charAt(i);
		}

		return res;
	}
	/****	<=fnsz_reverse	****/


	/****	fnsz_replace=>	****/
	function fnsz_replace(str, pattern, replace)
	{
		var buf = str;

		while (buf.indexOf(pattern, 0) != -1) {
			buf = buf.replace(pattern, replace);
		}

		return buf;
	}
	/****	<=fnsz_replace	****/


	/****	fnsz_ltrim( str, pattern )=>	****/
	function fnsz_ltrim(str, pattern)
	{
		var buf = str, i;

		for (i = 0; i < buf.length; i++) {
			if (buf.charAt(i) != pattern) {
				break;
			}
		}
		buf = buf.substring(i, buf.length);

		return buf;
	}
	/****	<=fnsz_ltrim( str, pattern )	****/


	/****	fnsz_substring=>	****/
	/* minus argument를 받아 뒤에서부터의 token도 retrieve할 수 있도록 작성할 것 */
	function fnsz_substring(str, start, end)
	{
		var buf = str;

		return buf;
	}
	/****	<=fnsz_substring	****/
}
/****	<=end of common	****/




/****	MD5 module=>	****/
if (typeof(MD5_JS) == 'undefined') { // 한번만 실행
    var MD5_JS = true;


    /* See http://pajhome.org.uk/crypt/md5 for more info  */
    var hexcase = 0;
    var b64pad  = "";
    var chrsz   = 8;

    function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
    function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
    function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
    function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
    function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
    function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

    function core_md5(x, len)
    {
        x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len;
        var a =  1732584193; var b = -271733879; var c = -1732584194; var d =  271733878;
        for(var i = 0; i < x.length; i += 16)
        {
            var olda = a; var oldb = b; var oldc = c; var oldd = d;
            a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
            d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
            c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
            b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
            a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
            d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
            c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
            b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
            a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
            d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
            c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
            b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
            a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
            d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
            c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
            b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

            a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
            d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
            c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
            b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
            a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
            d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
            c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
            b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
            a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
            d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
            c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
            b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
            a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
            d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
            c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
            b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

            a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
            d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
            c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
            b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
            a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
            d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
            c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
            b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
            a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
            d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
            c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
            b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
            a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
            d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
            c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
            b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

            a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
            d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
            c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
            b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
            a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
            d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
            c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
            b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
            a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
            d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
            c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
            b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
            a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
            d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
            c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
            b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

            a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd);
        }
        return Array(a, b, c, d);
    }

    function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); }
    function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); }
    function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); }
    function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); }
    function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); }

    function core_hmac_md5(key, data) {
        var bkey = str2binl(key);
        if(bkey.length > 16)
            bkey = core_md5(bkey, key.length * chrsz);

        var ipad = Array(16), opad = Array(16);
        for(var i = 0; i < 16; i++)
        {
            ipad[i] = bkey[i] ^ 0x36363636;
            opad[i] = bkey[i] ^ 0x5C5C5C5C;
        }

        var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
        return core_md5(opad.concat(hash), 512 + 128);
    }

    function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); }
    function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); }

    function str2binl(str)
    {
        var bin = Array(); var mask = (1 << chrsz) - 1;
        for(var i = 0; i < str.length * chrsz; i += chrsz)
            bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
        return bin;
    }

    function binl2str(bin)
    {
        var str = ""; var mask = (1 << chrsz) - 1;
        for(var i = 0; i < bin.length * 32; i += chrsz)
            str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); return str;
    }


    function binl2hex(binarray)
    {
        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = "";
        for(var i = 0; i < binarray.length * 4; i++)
            str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
        return str;
    }

    function binl2b64(binarray)
    {
        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        var str = "";
        for(var i = 0; i < binarray.length * 4; i += 3)
        {
            var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                        | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                        |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
            for(var j = 0; j < 4; j++)
            {
                if(i * 8 + j * 6 > binarray.length * 32)
                    str += b64pad;
                else
                    str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
            }
        }
        return str;
    }

////////////////////////////////////////////////////////////////////////////////////////////////////
		// 포커스가 가면 모든 내용이 선택되어 있게 하기
		// onFocus="selectAllText(this)"
		function selectAllText( txtField )
		{
			txtField.select();
		}

		// 컴마 넣고 빼기
		// 사용 방법
		// <input type="text" onFocus='Del_Comma(this)' onBlur='Add_Comma(this)'>
		// 관련함수 Reverse, Add_Comma, Del_Comma
		function Add_Comma( txtField )
		{
			var tmp = Reverse(txtField.value);
		    var Acc = "";

		    if (tmp.indexOf(",") > -1) {
		        return;
		    }

		    for(var i = 0; i < tmp.length; i = i + 3) {

		     Acc += tmp.substr(i, 3);
		     if (i + 3 < txtField.value.length)
		      Acc += ",";
		    }

		    txtField.value = Reverse(Acc);
		 return;
		}

		function Reverse( Str )
		{
			var ret = "";

			for (var i = 0; i < Str.length; i++)
				ret = Str.substr(i, 1) + ret;

			return ret;
		}

		function Del_Comma( txtField )
		{
		 var tmp = txtField.value;
		 while (tmp.indexOf(",") > -1)
		     tmp = tmp.replace(",", "");
		    txtField.value = tmp;
		    return;
		}

		// 하이픈 넣고 빼기
		// 사용 방법
		// <input type="text" onFocus='Del_Hyphen(this)' onBlur='Add_Hyphen(this)'>
		// 관련함수 Add_Hyphen, Del_Hyphen
		function Add_Hyphen( txtField )
		{
			var tmp = txtField.value;
			if (tmp.length < 8) 	return;
		    if (tmp == "")	return;
		    if (tmp.indexOf("-") > -1)	return;

		    txtField.value = tmp.substr(0, 4) + "-" + tmp.substr(4, 2) + "-" + tmp.substr(6, 2);
			return;
		}

		function Del_Hyphen( txtField )
		{
			var tmp = txtField.value;
			while (tmp.indexOf("-") > -1)
				tmp = tmp.replace("-", "");

			txtField.value = tmp;
			txtField.select();
			return;
		}

		function Add_HyphenYYYYMM( txtField )
		{
			var tmp = txtField.value;
			if (tmp.length < 6) 	return;
		    if (tmp == "")	return;
		    if (tmp.indexOf("-") > -1)	return;

		    txtField.value = tmp.substr(0, 4) + "-" + tmp.substr(4, 2);
			return;
		}

		function delHyphenValue( strValue )
		{
			var tmp = strValue;
			while (tmp.indexOf("-") > -1)
				tmp = tmp.replace("-", "");

			return tmp;
		}

		// 입력길이에 따라 다음 입력사항으로 커서 이동처리
		// <input name="giin_jumin_no1" type="text" class="inputWhite" onkeypress="return handleEnter(this, event)" onKeyUp="nextKey2(this, document.myForm.giin_jumin_no2, event)" size="6" maxlength="6" >
		// -
		// <input name="giin_jumin_no2" type="text" class="inputWhite" onkeypress="return handleEnter(this, event)" size="7" maxlength="7" ></td>
		function nextKey(original, destination, event){
		  // 브라우저 종류와 버전마다 키보드 이벤트 캡쳐하는 방식이 다르다
			var keyCode = event.keyCode ? event.keyCode :
		                event.which ? event.which : event.charCode;
			var filter = event.keyCode ? [0,8,9,16,17,18,37,38,39,40,46] : [0,8,9];

			if (original.getAttribute && (original.value.length >= original.getAttribute("maxlength")) && !containsElement(filter,keyCode) )
				destination.focus();
		}

		function containsElement(arr, ele) {
		        var found = false, index = 0;
		        while(!found && index < arr.length)
		        if(arr[index] == ele)
		        found = true;
		        else
		        index++;
		        return found;
		}

		// ":" 추가 : 1545(4자리) => 15:45(5자리)
		function Add_TimeColon(time)
		{
			var Time = "";

			if(time.value.length < 4) return;
			if(time.value.length == 4)
			{
				Time = time.value.substring(0,2);
				Time += ":";
				Time += time.value.substring(2,4);
			}
			else{
				//만약 현재 ":"이 있다면
				for(var x=0; x <time.value.length; x++)
				{
					ch=time.value.substring(x,x+1);
					if(ch == ":")
						return;
				}
				Time = time.value.substring(0,2);
		        Time += ":";
		        Time += time.value.substring(2,4);
			}
			time.value = Time;
			return;
		}

		//":" 삭제 : 15:45(5자리) => 1545(4자리)
		function Del_TimeColon(time)
		{
			var x,ch;
			var i=0;
			var newVal="";

			/*if(time.value.length !=10) return;*/

			for(x=0; x<time.value.length; x++){
				ch=time.value.substring(x,x+1);
				if(ch != ":") newVal += ch;
			}
			time.value = newVal;
			return;
		}

		/*
		Text Link Tooltip Script-
		?Dynamic Drive (www.dynamicdrive.com)
		For full source code, installation instructions,
		100's more DHTML scripts, and Terms Of
		Use, visit dynamicdrive.com
		*/
		// 사용 방법
		// div는 꼭 body 안에 있어야 합니다.
		//	<div id="tooltip" style="position:absolute;visibility:hidden"></div>
		//	<a href="#" onClick="ShowPatInfo()" onMouseover="showtip(this,event,'수용자정보를 보여줍니다.')" onMouseout="hidetip()">
		//	 	툴팁테스트
		//	</a>
		// 관련함수 hidetip
		function showtip(current,e,text)
		{
			if (document.all){
				thetitle=text.split('<br>')
				if (thetitle.length>1){
					thetitles='';
					for (i=0;i<thetitle.length;i++)
						thetitles+=thetitle[i];
					current.title=thetitles;
					}
				else current.title=text;
			}
			else if (document.layers){
				document.tooltip.document.write('<layer bgColor="white" style="border:1px solid black;font-size:12px;">'+text+'</layer>');
				document.tooltip.document.close();
				document.tooltip.left=e.pageX+5;
				document.tooltip.top=e.pageY+5;
				document.tooltip.visibility="show";
			}
		}

		function hidetip(){
			if (document.layers)
				document.tooltip.visibility="hidden";
		}

		function funcRadioCheckValue(obj)
		{
			if (obj == null)     return null;

			var len  = obj.length
			if ( len  == null) {
				if  (obj.checked == true )  return obj.value
			} else
			{
				for (var i=0; i< len;i++)
				{
					if  (obj[i].checked == true )  return obj[i].value
				}
			}
			return null;
		}

		function funcCheckBoxCheckValue(obj)
		{
			if (obj == null)     return null;

			if  (obj.checked == true )  return obj.value
			return '';
		}
		/////////////////////////////////////////////////////////////////////
		function isOdd (n) {
			if ((n % 2) == 1) {
				return true;
			}
			return false;
		}
		/////////////////////////////////////////////////////////////////////
		function isEven (n) {
			if ((n % 2) != 1) {
				return true;
			}
			return false;
		}

}
/****	<=end of MD5 module	****/




/****	words filtering=>	****/
if( typeof(FILTER_JS) == 'undefined' ) // 한번만 실행
{
	var FILTER_JS = true;


	// 금지단어 필터링
	function fnsz_wordFilterCheck( sz_v )
	{
		/*
		var filter = g4_cf_filter;
		var s = filter.split(",");

		for( i = 0; i < s.length; i++ )
		{
			if( sz_v.indexOf( s[i] ) != -1 )
			return s[i];
		}

		return "";
		*/
	}
}
/****	<=words filtering	****/




/****	여기저기서 모은 function	****/
if( typeof( ETC_JS ) == 'undefined' )
{
	var ETC_JS = true;


	/****	text field를 argument로 받아 right align과 comman를 적용하는 function=>	****/
	function cnj_comma( cnj_str )
	{
		var t_align = "right"; //텍스트 필드 정렬
		var t_num = cnj_str.value.substring( 0, 1 ); //첫글자 확인 변수
		var num = /^[/,/,0,1,2,3,4,5,6,7,8,9,/]/; //숫자와 ,만 가능
		var cnjValue = "";
		var cnjValue2 = "";
		var i;


		if( !num.test( cnj_str.value ) )
		{
			alert( "숫자만 입력하십시오.\n\n특수문자와 한글/영문은 사용할 수 없습니다." );
			cnj_str.value = "";
			cnj_str.focus();
			return false;
		}

		if( ( t_num < "0" || "9" < t_num ) )
		{
			alert( "숫자만 입력하십시오." );
			cnj_str.value = "";
			cnj_str.focus();
			return false;
		}

		for( i = 0; i < cnj_str.value.length; i++ )
		{
			if( cnj_str.value.charAt( cnj_str.value.length - i - 1 ) != "," )
				cnjValue2 = cnj_str.value.charAt( cnj_str.value.length - i - 1 ) + cnjValue2;
		}

		for( i = 0; i < cnjValue2.length; i++ )
		{
			if( i > 0 && ( i % 3 ) == 0 )
			{
				cnjValue = cnjValue2.charAt( cnjValue2.length - i - 1 ) + "," + cnjValue;
			}
			else
			{
				cnjValue = cnjValue2.charAt( cnjValue2.length - i - 1 ) + cnjValue;
			}
		}

		cnj_str.value = cnjValue.substr( cnjValue.length - cnj_str.maxLength, cnj_str.maxLength );
		cnj_str.style.textAlign = t_align;
	}
	/****	<=text field를 argument로 받아 right align과 comman를 적용하는 function	****/
}
/****	여기저기서 모은 function	****/




/****	function ..	****/
if (typeof(ETC_ETC) == 'undefined') {
	var ETC_ETC = true;


	/****	=>	****/
	function ChangeDate(obj, yyyy, mm, dd, defindex)
	{
		var year = yyyy.options[yyyy.selectedIndex].value;
		if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
			kk = 29;
		} else {
			kk = 28;
		}

		var day = new Array(31,kk,31,30,31,30,31,31,30,31,30,31);

		dd.length = 0;
		dd.length = day[mm.options[mm.selectedIndex].value - 1];
		for (i = 1; i <= dd.length; i++) {
			dd.options[i-1].text = i;
			dd.options[i-1].value = i;
			//dd.options[i-1].text = ('0' + i).substr(('0'+i).length - 2, 2);
			//dd.options[i-1].value = ('0' + i).substr(('0'+i).length - 2, 2);
		}
		if (defindex == 0) {
			dd.selectedIndex = 0;
		} else {
			dd.selectedIndex = dd.length - 1;
		}
	}

	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_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_findObj(n, d) //v4.01
	{
		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 && d.getElementById) {
			x = d.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];
				}
			}
		}
	}
	/****	<=	****/


	function embedswf(swfpath, swfwidth, swfheight)
	{
		document.write("<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0' width='" + swfwidth + "' height='" + swfheight + "'><param name='movie' value='" + swfpath + "'><param name='quality' value='high'><embed src='" + swfpath + "' quality='high' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' width='" + swfwidth + "' height='" + swfheight + "'></embed></object>");
	}


	function createCookie(name, value, days)
	{
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			var expires = "; expires="+date.toGMTString();
		} else {
			var expires = "";
		}
		document.cookie = name+"="+value+expires+"; path=/";
	}

	function readCookie(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') {
				c = c.substring(1,c.length);
			}
			if (c.indexOf(nameEQ) == 0) {
				return c.substring(nameEQ.length,c.length);
			}
		}
		return null;
	}

	function eraseCookie(name)
	{
		createCookie(name,"",-1);
	}


	function disable_character(obj, evt, character)
	{
		//
	}

	function FormatNumber(num, decimalNum, bolLeadingZero, bolParens, bolCommas)
	/**********************************************************************
		IN:
			NUM - the number to format
			decimalNum - the number of decimal places to format the number to
			bolLeadingZero - true / false - display a leading zero for
											numbers between -1 and 1
			bolParens - true / false - use parenthesis around negative numbers
			bolCommas - put commas as number separators.

		RETVAL:
			The formatted number!
	 **********************************************************************/
	{
		if (isNaN(parseInt(num))) return "NaN";

		var tmpNum = num;
		var iSign = num < 0 ? -1 : 1;		// Get sign of number

		// Adjust number so only the specified number of numbers after
		// the decimal point are shown.
		tmpNum *= Math.pow(10,decimalNum);
		tmpNum = Math.round(Math.abs(tmpNum))
		tmpNum /= Math.pow(10,decimalNum);
		tmpNum *= iSign;					// Readjust for sign


		// Create a string object to do our formatting on
		var tmpNumStr = new String(tmpNum);

		// See if we need to strip out the leading zero or not.
		if (!bolLeadingZero && num < 1 && num > -1 && num != 0)
			if (num > 0)
				tmpNumStr = tmpNumStr.substring(1,tmpNumStr.length);
			else
				tmpNumStr = "-" + tmpNumStr.substring(2,tmpNumStr.length);

		// See if we need to put in the commas
		if (bolCommas && (num >= 1000 || num <= -1000)) {
			var iStart = tmpNumStr.indexOf(".");
			if (iStart < 0)
				iStart = tmpNumStr.length;

			iStart -= 3;
			while (iStart >= 1) {
				tmpNumStr = tmpNumStr.substring(0,iStart) + "," + tmpNumStr.substring(iStart,tmpNumStr.length)
				iStart -= 3;
			}
		}

		// See if we need to use parenthesis
		if (bolParens && num < 0)
			tmpNumStr = "(" + tmpNumStr.substring(1,tmpNumStr.length) + ")";

		return tmpNumStr;		// Return our formatted string!
	}


	function imgview(cidx, cnt, wd)
	{
		var src_obj, des_obj;
		src_obj		= document.getElementById("small_" + cidx + "_" + cnt);
		des_obj		= document.getElementById("big_" + cidx);

		des_obj.src = src_obj.src;
		des_obj.width = wd;

		var li_obj = document.getElementsByName("li_" + cidx);
		for (var idx = 0; idx < li_obj.length; idx++) {
			if (idx == cnt) {
				li_obj[idx].className = "on";
			} else {
				li_obj[idx].className = "";
			}
		}
	}
	function flvview(_flv, _flv_dir, _flv_type, _url, _cidx, _cnt)
	{
		var li_obj = document.getElementsByName("li_" + _cidx);
		for (var lp = 0; lp < li_obj.length; lp++) {
			if (lp == _cnt) {
				li_obj[lp].className = "on";
			} else {
				li_obj[lp].className = "";
			}
		}

		var frm					= document._player;
		frm.method				= "post";
		frm.action				= "/player/player.nab";
		frm.target				= "ifr_player_" + _cidx;

		frm._flv.value			= _flv;
		frm._flv_dir.value		= _flv_dir;
		frm._flv_type.value		= _flv_type;
		frm._url.value			= _url;

		frm.submit();
	}
}
/****	function ..	****/


/***********************************************************************************


***********************************************************************************/
