//var _CF_ALERT_AFTERFN_ = "";		// alert 확인 후 처리함수 저장 변수
//var _CF_CONFIRM_YN_ = "";			// confirm 확인 취소 버튼 처리 여부 YN 저장 변수 Y-확인, N-취소
var _CF_CONFIRM_AFTERYESFN_ = "";	// confirm 확인 후 처리함수 저장변수
var _CF_CONFIRM_AFTERNOFN_ = "";	// confirm 취소 후 처리함수 저장변수
var _CF_ERROR_AFTERFN_ = "";		// confirm 확인 후 처리함수 저장변수

var _SELF_POPUP_SVCID_ = "";		// SELF팝업 ID를 가지고 있는다.
var _ONLY_PAGE_PRINT_ = false;		// 그리드가 있어도 일반출력해야하는 경우 true

var _today = new Date();
var _dateFormat = {};
_dateFormat.month = "yyyy-MM";
_dateFormat.date = "yyyy-MM-dd";
_dateFormat.date1 = "yyyyMMdd";
_dateFormat.time = "hh:mm:ss";
_dateFormat.dtm = "yyyy-MM-dd hh:mm:ss";



// explorer console 오류 방지
(function() {
	var methods = ["error", "log", "info"];
	var length = methods.length;
	var console = (window.console = window.console || {});
	var method;
	var noop = function(){};
	while(length--) {
		method = methods[length];
		if(!console[method]) {
			console[method] = noop;
		}
	}
})();

/*****************************************************************
 * 
 * jexjs
 * 
 *****************************************************************/
jexjs.setDebug(false);

/**
 * 씨티 공통 전용 jexjs 객체 생성 
 */
jexjs.extend(jexjs, 'comm', {});
jexjs.addAjaxBeforeExecute(function(){cf_toJexURL("");});

var indicator_loading = jexjs.plugin('indicator', {
	fn : {
		show : function( $indicator ){
			cf_showloading();
		},
		hide : function( $indicator ){
			cf_hideloading();
		}
	}
});

/**
 * global ajax 설정 값 세팅
 **/
jexjs.ajaxSetup({
	headers: {
		PRJ_ID:"GIB"
	}, 
	'async'	:	 true, 
	//'async': false,	// indicator error		
	//'contextPath' : '/jexjs',
	//'prefix' : '/plugin',
	'suffix':   '.jct',
	'errtrx':	false,
	'indicator':	false
	//'indicator':indicator_loading
});


/**
 * 다국어 관련 함수 (시작)
 */
// 다국어 Instance 생성
var jexMl = jexjs.plugin(
		"ml", {
	'isUseHeader' : false,
	'isUseBody' : true,
	'codeManager' : jexjs.plugin("code_manager"),
	'isTranslateLocal' : true,
	'isTranslateServer' : true
});

function jexComMl(seq, msg, paramRef){
	var strViewID = seq.substring(0, seq.lastIndexOf("_"));

	if(paramRef == "undefined" || paramRef == null || typeof paramRef != "object"){
		paramRef = null;
	}
	
	//jexMl.get("ml_dst_0001_01_J0007", "안녕하세요", null, {"VIEW_ID" : "ml_dst_0001_01"});
	return jexMl.get(seq, msg, paramRef, {"VIEW_ID" : strViewID});
}

// 다국어 변환 후 이벤트
jexMl.addFunction("afterChange", function(){
	var userLang = jexjs.getLang();
	cf_setLocaleCode(userLang);
});

/**
 * 다국어 객체 생성 및 다국어 key 자동 등록 여부 커스터마이징
 */
jexjs.loader.addBeforeOnload(function(){
	
	//다국어 key를 추가해주기위한 case를 커스터마이징 해줄 수 있습니다.
	jexMl.addFunction('isInsertMlKey', function( mlInfo ){
		//mlInfo.ML_ID
//		return true;
		return false;
	});
	
	//다국어 key를 자동으로 추가해주는 경우 이벤트
    jexMl.addFunction('setInsertViewId', function( INFO ){
    	if ( -1 != INFO.ML_ID.lastIndexOf("_"))
    	{
    		return INFO.ML_ID.substring(0, INFO.ML_ID.lastIndexOf("_"));
    	}
    	
    	return null;
    });
	 
});


/**
 * 다국어 관련 함수 (끝)
 */

/**
 * 다국어 적용 event
 */
/** header uf함수로 이동 20161202 */
$(function(){

});
/**/

/** 
 * global Ajax filter Add 
 **/
jexjs.ajaxFilter(function (dat) {
//	jexjs.plugin("indicator").hide();
	
	// dat는 ajax 호출 후 성공적으로 내려온 값이다.
	function isError(dat) {
		if (!jexjs.isNull(dat) && !jexjs.isNull(dat['COMMON_HEAD'])) {
			if (!jexjs.isNull(dat['COMMON_HEAD']['ERROR'])
					&& dat['COMMON_HEAD']['ERROR']) {
				if ( jexjs.comm.getAjaxErrTrx() )
				{
//					jexjs.comm.setAjaxErrTrx(false);
					return false;
				}
				return true;
			}
		}
		return false;
	}
	
	
//    console.log("ERROR -> " + JSON.stringify(dat));
	
	if (isError(dat)) {
		var code = dat['COMMON_HEAD']['CODE'];
		var msg = dat['COMMON_HEAD']['MESSAGE'];

		//alert('[' + code + ']' + msg);
		//console.error('[' + code + ']' + msg);	// TODO live 시 주석예정
		
		// 업무별 오류처리
		//if (!!uf_error) uf_error(code, msg);
		//if (!!uf_error) alert(code + ":" + msg);
		//alert(code + ":" + msg);
		// 여기에 오류 함수 관련하여 오류 함수를 받아서 오류 함수로 처리하던지
		// 아니면 공통 오류 팝업을 만들던지 해야함.
		if ( jexjs.isNull(msg) )
		{
			msg = jexComMl("common_J0023" ,"코드 메세지가 반출 중 혹은 없습니다. 스튜디오의 코드관리에서 해당 코드가 없는 경우 추가 혹은 젝스 팀으로 문의부탁드립니다.");
		}
		
		if( "" != msg &&  msg.indexOf("<@") > -1 && msg.indexOf("@>") > -1  ){
			var startIdx   = msg.indexOf("<@") + 2;
			var endIdx     = msg.indexOf("@>");			
	        var HOST_PRGM_CD = msg.substring(startIdx, endIdx);
	        msg = msg.replace("<@"+HOST_PRGM_CD+"@>", ""); //에러메시지에서  '<@프로그램코드@>'는 제거하고 순수 오류메시지만 추출
	        
	        //순수 오류메시지가 없을 경우( '<@프로그램코드@>' 만 존재할 경우 )
	        if(null == msg || msg == ''){
	        	 //다시한번 코드에서 메시지값 추출한다.
	        	msg = dat['COMMON_HEAD']['MESSAGE'];
	        	
	        	 //코드에서 가져온 후에도 에러메시지가 없을 경우, (WebCodeUtil.getCodeValue의 경우 key에 대한 value값 없으면 key문자열을 그대로 리턴해준다.)
		         if(null == msg || msg == ''){

		        	 if(code == "9999999" || code.indexOf("JEX") > -1){
		        		 msg = jexComMl("common_J0024" ,"씨티폰으로 연락바랍니다.<br>인터넷뱅킹 02-3704-7700  <br>카드 1566-1000");
			         }else{
			        	 msg = jexComMl("common_J0025" ,"시스템오류가 발생하였습니다.");
			         }

		         }	        	
	        	
	        }
		}
		
		//cf_alert("[" + code + "] " + msg);
		
		if(code == "SMB0075") {
			cf_alert("[" + code + "] " + msg, "cf_location('ComLognLogn0100.act');");
		}if(code == "6002") { //OTP오차보정
			cf_alert("[" + code + "] " + msg, "cf_location('CmlOtpeCorr0100.act');");
		} else {
			cf_alert("[" + code + "] " + msg);
		}
		
		return false;
	}
	
	jexjs.comm.setAjaxErrTrx(false);
	
	return true;
	
});

/**
 * Ajax의 설정 중 errtrx 값을 세팅합니다.
 */
jexjs.comm.setAjaxErrTrx = function( trx ) {
	if ( typeof trx == 'boolean' )
	{
		jexjs.global.plugins['ajax']['settings']['errtrx'] = trx;
	}
};

/**
 * Ajax의 설정 중 errtrx 값을 가져옵니다.
 */
jexjs.comm.getAjaxErrTrx = function() {
	return jexjs.global.plugins['ajax']['settings']['errtrx'];
};
		


var monthNames = [jexComMl("common_J0001" ,"1월"),jexComMl("common_J0002" ,"2월"),jexComMl("common_J0003" ,"3월"),jexComMl("common_J0004" ,"4월"),jexComMl("common_J0005" ,"5월"),jexComMl("common_J0006" ,"6월"),jexComMl("common_J0007" ,"7월"),jexComMl("common_J0008" ,"8월"),jexComMl("common_J0009" ,"9월"),jexComMl("common_J0010" ,"10월"),jexComMl("common_J0011" ,"11월"),jexComMl("common_J0012" ,"12월")];
var dayNames = [jexComMl("common_J0013" ,"일"),jexComMl("common_J0014" ,"월"),jexComMl("common_J0015" ,"화"),jexComMl("common_J0016" ,"수"),jexComMl("common_J0017" ,"목"),jexComMl("common_J0018" ,"금"),jexComMl("common_J0019" ,"토")];
var dateFormatters = {
	s	: function(d)	{ return d.getSeconds(); },
	ss	: function(d)	{ return zeroPad(d.getSeconds()); },
	m	: function(d)	{ return d.getMinutes(); },
	mm	: function(d)	{ return zeroPad(d.getMinutes()); },
	h	: function(d)	{ return d.getHours(); },
	hh12: function(d)	{ return zeroPad(d.getHours() % 12 || 12); },
	hh	: function(d)	{ return zeroPad(d.getHours()); },
	d	: function(d)	{ return d.getDate(); },
	d1	: function(d)	{ return d.getDate()+jexComMl("common_J0020" ,"일"); },
	dd	: function(d)	{ return zeroPad(d.getDate()); },
	dddd: function(d)	{ return dayNames[d.getDay()]; },
	ddddd: function(d)	{ return dayNames[d.getDay()]+jexComMl("common_J0021" ,"요일"); },
	M	: function(d)	{ return d.getMonth() + 1; },
	MM	: function(d)	{ return zeroPad(d.getMonth() + 1); },
	MMMM: function(d)	{ return monthNames[d.getMonth()]; },
	yy	: function(d)	{ return (d.getFullYear()+'').substring(2); },
	yyyy: function(d)	{ return d.getFullYear(); },
	yyyyy: function(d)	{ return d.getFullYear()+jexComMl("common_J0022" ,"년"); },
	ap	: function(d)	{ return d.getHours() < 12 ? 'am' : 'pm'; },
	AP	: function(d)	{ return d.getHours() < 12 ? 'AM' : 'PM'; }
};


/**
 * 설명 : bypass 거래 ajax call
 * 예제 : cf_executeBypass('6962001382', function (data) {})
 *        cf_executeBypass('6962001382', {'key1':'val1'}, function (data) {})
 * @param imo_id : IMO ID
 * @param json_data : JSON data (생략가능)
 * @param callback_func : callback function
 */
var cf_executeBypass = function () {

	var executeBypass = function (imo_id, json_data, callback_func) {

		// params
		var param = {};
		param.IMO_ID = imo_id;
		if (!!json_data) {
			param.JSON_DATA = JSON.stringify(json_data);
		}

		// service call
		var jexAjax = jexjs.createAjaxUtil('Bypass');
		jexAjax.set(param);
		jexAjax.execute(function (data) {
			var json_data = "";
//			if(!cf_isEmpty(data.JSON_DATA)) json_data = JSON.parse(data.JSON_DATA);
			if(!cf_isError(data)) {
				json_data = JSON.parse(data.JSON_DATA);
			}else{
				json_data = {"COMMON_HEAD":{"ERROR":true, "CODE":data['COMMON_HEAD']['CODE'], "MESSAGE":data['COMMON_HEAD']['MESSAGE']}};
			}
			if (!!callback_func) {
				callback_func(json_data);
			}
		});
		
	}

	if (arguments.length == 2) {
		executeBypass(arguments[0], '', arguments[1])	
	}
	else if (arguments.length == 3) {
		executeBypass(arguments[0], arguments[1], arguments[2])	
	}
	else {
	}
	
};


/*****************************************************************
 * 
 * JS 공통
 * 
 *****************************************************************/

/**
 * 
 * @param n
 * @returns
 */
function zeroPad(n) {
	return (n < 10 ? '0' : '') + n;
}

/**
 * 날짜 자동세팅
 * @param dft : 날짜
 * @param perio	d : 기간(예 : 3D,1W,1M,3M,6M,1Y,5Y)
 * @param pos : 시작기준일자(일(day)기준 숫자 - 예)조회기준일이 내일이면 1, 어제면 -1
 */
function cf_setDefaultDate(dft, period, pos) {

	var tt, sdt;
	var $sel = $('#' + dft);

	period = (typeof(period)!="undefined")?period.toUpperCase():"";
	
	if(cf_isValidData(pos)){
		tt = cf_shiftTime(cf_getFormatDate(_today, _dateFormat.date1), 0, 0, pos);
		
	}else{
		tt = _today;
	}
	
	if(period.indexOf("Y")>-1){
		period = (period.substr(0,period.indexOf("Y"))*12)+"m";
	}
	else if(period.indexOf("W")>-1){
		period = (period.substr(0,period.indexOf("W"))*7)+"d";
	}

	sdt = cf_getPrevDate(cf_getFormatDate(tt, _dateFormat.date1), period.toLowerCase());

	$sel.val(sdt);
}

/**
 * 날짜 자동세팅
 * @param fdt : 시작일
 * @param tdt : 종료일
 * @param perio	d : 기간
 * @param pos : 시작기준일자(일(day)기준 숫자 - 예)조회기준일이 내일이면 1, 어제면 -1
 */
function cf_setFromToDate(fdt, tdt, period, pos) {
	
	var tt, sdt;
	var $sel = $('#' + fdt);
	var $eel = $('#' + tdt);

	period = (typeof(period)!="undefined")?period.toUpperCase():"";
	
	if(cf_isValidData(pos)){
		tt = cf_shiftTime(cf_getFormatDate(_today, _dateFormat.date1), 0, 0, pos);
	}else{
		tt = _today;
	}
	
	if(period.indexOf("Y")>-1){
		period = (period.substr(0,period.indexOf("Y"))*12)+"m";
	}
	else if(period.indexOf("W")>-1){
		period = ((period.substr(0,period.indexOf("W"))*7)+1)+"d";		// 20170118 CSJ : 주 단위로 넘어올 경우 1주 = 8일, 2주 = 15일, 3주 = 22일 로 처리하도록 조정	
	}
	else if(period.indexOf("T")>-1){
		$sel.val(cf_getFormatDate(tt, _dateFormat.date));
		$eel.val(cf_getFormatDate(tt, _dateFormat.date));	
		return;
	}

	$eel.val(cf_getFormatDate(tt, _dateFormat.date));
	sdt = cf_getPrevDate(cf_getFormatDate(tt, _dateFormat.date1), period.toLowerCase()); 
	$sel.val(sdt);
}

/**
 * 포맷된 날짜 가져오기
 * @param date
 * @param formatstr
 * @returns
 */
function cf_getFormatDate(date, formatstr){
	var today;
	
	if(date=='undefined' || date==null || date==""){
		today = new Date();
	}else{
		today = date;
	}
	
	if(formatstr=='undefined' || formatstr==null || formatstr==""){
		formatstr = 'yyyy-MM-dd';
	}
	var strtoday = cf_formatDate(today, formatstr);
	return strtoday;
}


/**
 * 현재일을 기준으로 이전 날짜를 구해서 문자열로 반환한다.
 * @param yyyymmdd
 * @param term
 * @returns {String}
 */
function cf_getPrevDate(yyyymmdd, term) {
	var yyyy = yyyymmdd.substring(0, 4);
	var mm = yyyymmdd.substring(4, 6);
	var dd = yyyymmdd.substring(6, 8);

	myDate = new Date();
	myDate.setFullYear(yyyy);
	myDate.setMonth(mm-1);
	myDate.setDate(dd);

	if(term.charAt(term.length-1) == 'd') {
		term = term.substring(0, term.length-1);
		if(Number(term) > 0)
			myDate.setDate(dd - eval(term) +1);
		else
			myDate.setDate(dd - eval(term) -1);
	}

	if(term.charAt(term.length-1) == 'm') {
		term = term.substring(0, term.length-1);

		if(cf_getLastDay(yyyy,mm) == dd) {
			myDate.setMonth(mm - eval(term));
			myDate.setDate('01');
		} else {
			myDate.setMonth(mm - eval(term) -1);
			if(Number(term) > 0)
				myDate.setDate(myDate.getDate() + 1);
			else
				myDate.setDate(myDate.getDate() - 1);
		}
	}

	yyyy = myDate.getFullYear();
	mm = myDate.getMonth()+1;
	dd = myDate.getDate();

	dd = (dd<10)?'0'+dd:dd;
	mm = (mm<10)?'0'+mm:mm;

	return yyyy + '-' + mm + '-' + dd;
}

/**
 * 해당년월의 마지막 날짜를 구한다.
 * @param year
 * @param month
 * @returns
 */
function cf_getLastDay(year, month) {
	var lastDay;

	if(month == 1
		|| month == 3
		|| month == 5
		|| month == 7
		|| month == 8
		|| month == 10
		|| month == 12
	)
		lastDay = 31;
	else if(month == 4
		|| month == 6
		|| month == 9
		|| month == 11
	)
		lastDay = 30;
	else {
		if((year % 400) == 0)
			lastDay = 29;
		else if((year % 100) == 0)
			lastDay = 28;
		else if((year % 4) == 0)
			lastDay = 29;
		else
			lastDay = 28;
	}
	return lastDay;
}

/**
 * 날짜 포맷팅 : default YYYY-MM-DD
 * @param str
 * @param gbn
 * @returns {String}
 */
function cf_dateformat(str, gbn){
	if(str == null || str == "undefined" || str == "" || str == "00000000"){
		return "";
	}else{
		
		if(gbn==null || gbn == "undefined" || gbn == ""){
			gbn = ".";
		}
		
		if(str.length == 8){
			var yy = str.substr(0,4);
			var mm = str.substr(4,2);
			var dd = str.substr(6,2);
			return yy + gbn +  mm + gbn + dd;
		}else if(str.length == 6){
			var yy = str.substr(0,4);
			var mm = str.substr(4,2);
			return yy + gbn +  mm ;
		}else if(str.length == 14){
			var yy = str.substr(0,4);
			var mm = str.substr(4,2);
			var dd = str.substr(6,2);
			return yy + gbn +  mm + gbn + dd;
		}
	}
}

/**
 * 
 * @param date - Date()
 * @param format
 * @returns
 */
function cf_formatDate(date1, format) {
	if(format==null || typeof(format)=="undefined" || format=="")
		format = _dateFormat.date;
		
	var date = date1,
	i, len = format.length, c,
	i2, formatter,
	res = '';
	for (i=0; i<len; i++) {
		c = format.charAt(i);
		if (c == "'") {
			for (i2=i+1; i2<len; i2++) {
				if (format.charAt(i2) == "'") {
					if (date) {
						if (i2 == i+1) {
							res += "'";
						}else{
							res += format.substring(i+1, i2);
						}
						i = i2;
					}
					break;
				}
			}
		}
		else {
			for (i2=len; i2>i; i2--) {
				if (formatter = dateFormatters[format.substring(i, i2)]) {
					if (date) {
						res += formatter(date);
					}
					i = i2 - 1;
					break;
				}
			}
			if (i2 == i) {
				if (date) {
					res += c;
				}
			}
		}
	}
	return res;
};

/**
 * 날짜시간 포맷팅
 * @param str
 * @option fmt
 */
function cf_dtmformat(str, fmt){
	if(str == null || str == "undefined" || str == "" || str == "00000000"){
		return "";
	}
	if(str.indexOf(".")>-1){
		str = cf_replaceAll(str, ".", "");
	}else if(str.indexOf("-")>-1){
		str = cf_replaceAll(str, "-", "");
	}
	var d = toDateTimeObj(str);
	return cf_formatDate(d, fmt);
}

/**
 * 시간 포맷팅
 * @param str
 * @param gbn
 * @returns
 */
function cf_fmtTime(str, gbn) {
	if(!cf_isValidData(gbn)) gbn = ":";
	str = cf_trim(str);
	if(str.length==6) {
		str = str.substr(0,2)+gbn+str.substr(2,2)+gbn+str.substr(4); 
	}else if(str.length==4) {
		str = str.substr(0,2)+gbn+str.substr(2,2);
	}
	return str;
}

/**
 * 
 * @param time
 * @param y
 * @param m
 * @param d
 * @returns
 */
function cf_shiftTime(time,y,m,d) { 
    var date = toDateTimeObj(time);
    date.setFullYear(date.getFullYear() + y); //y년을 더함
    date.setMonth(date.getMonth() + m);       //m월을 더함
    date.setDate(date.getDate() + d);         //d일을 더함
    return date;
}

/**
 * 날짜 string을 Date객체로 리턴
 * @param str
 * @returns {Date}
 */
function toDateTimeObj(str) {
	var len = str.length;
	var d, y, m, d, h, mi, s;
	y = str.substr(0, 4);
	m = str.substr(4, 2) - 1;
	d = str.substr(6, 2);
	h = str.substr(8, 2);
	mi = str.substr(10, 2);
	s = str.substr(12);
	
	return new Date(y, m, d, h, mi, s);
}

/**
 * 인자 데이터가 유효한 데이터인지 확인하는 함수 
 * @param data
 * @returns {Boolean}
 */
function cf_isValidData(data) {
	if (typeof data == "undefined") {
		return false;
	}
//	data = cf_trim(data);
	if(data != null && data != "" && data != "undefined") {
		return true;
	} else {
		return false;
	}	 
}

/**
 * 데이타가 null undefined이면 "" 리턴
 * @param data
 */
function cf_isEmptyToVoid(data) {
	if(!cf_isValidData(data)){
		return "";
	}else{
		return data;
	}
}

/**
 * form.name명에 해당하는 데이타가 null undefined이면 "" 리턴
 * @param form 객체명
 * @param name 객체명
 */
function cf_getFormNameVal($frm, idNm){
	return cf_isEmptyToVoid( $frm.find("input[name='"+idNm+"']").val() );
}

/**
 * name명에 해당하는 데이타가 null undefined이면 "" 리턴
 * @param name 객체명
 */
function cf_getNameVal(idNm){
	return cf_isEmptyToVoid( $("input[name='"+idNm+"']").val() );
}

/**
 * id명에 해당하는 데이타가 null undefined이면 "" 리턴
 * @param id 객체명
 */
function cf_getIdVal(idNm){
	return cf_isEmptyToVoid( $("#"+idNm).val() );
}

/**
 * @설명 : 공통 alert, confirm, error 메세지 함수 처리 리셋
 */
function cf_resetAferFn() {

//	_CF_ALERT_AFTERFN_ = "";
//	_CF_CONFIRM_YN_ = "";
	_CF_CONFIRM_AFTERYESFN_ = "";
	_CF_CONFIRM_AFTERNOFN_ = "";
	_CF_ERROR_AFTERFN_ = "";

}

/**
 * @설명 :다국어 설정 메세지.
 */
function cf_setLocaleCode(localeCode) {
	var jexAjax = jexjs.createAjaxUtil('ComLognLocaleCode');
		jexjs.comm.setAjaxErrTrx(true);
		jexAjax.set('LOCALE_CODE', localeCode);
		jexAjax.execute(function (data) {
			if(cf_isError(data)) {
				var errCode = cf_getErrorCode(data);
				var errMsg  = cf_getErrorMsg(data);
				cf_alert("["+errCode+"] : "+ errMsg);
			}
		});
}

/**
 * @설명 : Jex 결과 오류여부를 리턴한다
 * @param data - Jex에서 전달된 JSon Data
 * @returns : true, false.
 * @예제 : cf_isError(data);
 */
function cf_isError(data) {
	if(!jexjs.isNull(data) && !jexjs.isNull(data['COMMON_HEAD'])) {
		if (!jexjs.isNull(data['COMMON_HEAD']['ERROR']) && data['COMMON_HEAD']['ERROR']) {
			return true;
		}
	}
	return false;
}

/**
 * @설명 : Jex 결과 오류코드를 리턴한다
 * @param data - Jex에서 전달된 JSon Data
 * @returns : 오류코드
 * @예제 : cf_getErrorCode(data);
 */
function cf_getErrorCode(data) {
	var rtnCode = "";
	if(cf_isError(data)) {
		rtnCode = data['COMMON_HEAD']['CODE'];
	}
	return rtnCode;
}


/**
 * @설명 : Jex 결과 오류메시지를 리턴한다
 * @param data - Jex에서 전달된 JSon Data
 * @returns : true, false.
 * @예제 : cf_getErrorMsg(data);
 */
function cf_getErrorMsg(data) {
	var rtnMsg = "";
	if(cf_isError(data)) {
		rtnMsg = data['COMMON_HEAD']['MESSAGE'];
	}
	
	//에러메시지의  Host 에러메시지중 '프로그램코드'는 메시지에서 제거 ex) <@프로그램코드@> , 2016-11-30
	if( !cf_isEmpty(rtnMsg)  &&  rtnMsg.indexOf("<@") != -1 &&  rtnMsg.indexOf("@>") != -1  ){

		var startIdx   = rtnMsg.indexOf("<@") + 2;
		var endIdx     = rtnMsg.indexOf("@>");
		
        var _HOST_PRGM_CD_ = rtnMsg.substring(startIdx, endIdx);
        rtnMsg    =   cf_replaceAll(rtnMsg, "<@"+_HOST_PRGM_CD_+"@>", "");   
	}
	
	return rtnMsg;
}

/**
 * @설명 : 공통 형식 system message 팝업 띄움.
 * @param msg - 내용 메세지
 * @param afterfn - 후처리 함수
 * @returns : 없음.
 * @예제 : cf_alert("이체 가능한 시간이 아닙니다","uf_close(data)");
 */
function cf_alert(msg, afterFnY) {
	var callback = "";
	if(!cf_isEmpty(afterFnY)) {
		callback = afterFnY;
	}

//	layerPopup("alert", msg, callback);
	layerPopup("alert", msg, callback,callback);
	
}

/**
 * @설명 : 공통 layer형식 confirm 팝업 띄움.
 * @param msg - 내용 메세지
 * @param afterFnY - 확인버튼시 지정 처리함수명
 * @param afterFnN - 확인버튼시 지정 처리함수명
 * @returns : 없음.
 * @예제 : cf_confirm("확인하시겠습니까?","uf_next(data)","uf_back(data)");
 */
function cf_confirm(msg, afterFnY, afterFnN) {
	var callback1 = "";
	var callback2 = "";
	if(!cf_isEmpty(afterFnY)) callback1 = afterFnY;
	if(!cf_isEmpty(afterFnN)) callback2 = afterFnN;

	layerPopup("confirm", msg, callback1, callback2);
}

/**
 * 공통에서 사용하기 위해 만든 function.
 * 일반 개발자 사용 금지 
 */
function alertTemplete() {
	var strDiv = "";
//	strDiv += "<div class='popWrap mAlert'>";
	strDiv += "    <div class='popContain'>";
	strDiv += "        <div class='popup '>";
	strDiv += "            <div class='popCont col_4'>";
	strDiv += "                <h1 class='titH2' id='alertTit'>"+ jexComMl("common_J0026" ,"알림 메시지") +"</h1>";
	strDiv += "                <p class='msg' id='alertMsg'>"+ jexComMl("common_J0027" ,"알림 메시지") +"</p>";
	strDiv += "                <div class='btnArea'>";
	strDiv += "                    <button type='button' class='btnType1 layerPopupOkBtn' id='layerPopupOkBtn' >"+ jexComMl("common_J0035" ,"확인") +"</button>";
	strDiv += "                </div>";
	strDiv += "                <button type='button' class='popBtnClose layerPopupCloseBtn'>";
	strDiv += "                    <i class='blind' >"+ jexComMl("common_J0028" ,"닫기") +"</i>";
	strDiv += "                </button>";
	strDiv += "            </div>";
	strDiv += "        </div>";
	strDiv += "    </div>";
//	strDiv += "</div>";
	return strDiv;
}

/**
 * 공통에서 사용하기 위해 만든 function.
 * 일반 개발자 사용 금지 
 */
function confirmTemplete() {
	var strDiv = "";
	strDiv += "    <div class='popContain'>";
	strDiv += "        <div class='popup '>";
	strDiv += "            <div class='popCont col_7'>";
	strDiv += "                <h1 class='titH2' data-jex-ml='' id='alertTit'>"+ jexComMl("common_J0029" ,"확인 메시지") +"</h1>";
	strDiv += "                <p class='msg' data-jex-ml='' id='alertMsg'>"+ jexComMl("common_J0030" ,"확인 메시지") +"</p>";
	strDiv += "                <div class='btnArea'>";
	strDiv += "                    <button type='button' class='btnType1 layerPopupOkBtn' data-jex-ml='' >"+ jexComMl("common_J0031" ,"확인") +"</button>";
	strDiv += "                    <button type='button' class='btnType2 layerPopupCloseBtn' data-jex-ml=''  >"+ jexComMl("common_J0032" ,"닫기") +"</button>";
	strDiv += "                </div>";
	strDiv += "                <button type='button' class='popBtnClose layerPopupCloseBtn'>";
	strDiv += "                    <i class='blind' data-jex-ml=''>"+ jexComMl("common_J0033" ,"닫기") +"</i>";
	strDiv += "                </button>";
	strDiv += "            </div>";
	strDiv += "        </div>";
	strDiv += "    </div>";
	
	return strDiv;
}

/**
 * 공통에서 사용하기 위해 만든 function.
 * 일반 개발자 사용 금지 
 */
function layerPopup(popupType, msg, afterFnY, afterFnN){
//	cf_popupClose(); // 팝업이 있으면 초기화 한다.
	
	var strTemplete = "";
	if(popupType=="confirm") {
		strTemplete = confirmTemplete();
	}else{
		strTemplete = alertTemplete();
	}
	
	$('#alertLayer').remove();
	$("body").append('<div class="popWrap mAlert" id="alertLayer" style="z-index:9999;"></div>');
	$('#alertLayer').hide();
	$('#alertLayer').html(strTemplete);
	
	
	$("#alertMsg").html(msg);

	$(".layerPopupOkBtn").unbind('click');
	$(".layerPopupOkBtn").click(function(){
		
		$("#alertLayer").fadeOut(300, function(){
			common.alertClose();
//			$('#alertLayer').remove();
			//$('body').removeClass('popOn');
			try {
				if (!!afterFnY) {
					if( afterFnY.indexOf("(")!=-1 && afterFnY.indexOf(")")!=-1 && afterFnY.indexOf("$")==-1  ){
						eval(afterFnY+";");
					}else {
						eval(afterFnY+"();");
					}
				}
			} catch (e) {
				console.log(e);
				common.alertClose();
			}
		});
	});
	$(".layerPopupCloseBtn").unbind('click');
	$(".layerPopupCloseBtn").click(function(){
		
		$("#alertLayer").fadeOut(300, function(){
			common.alertClose();
//			$('#alertLayer').remove();
			//$('body').removeClass('popOn');
			if (!!afterFnN) {
				if( afterFnN.indexOf("(")!=-1 && afterFnN.indexOf(")")!=-1 && afterFnN.indexOf("$")==-1  ){
					eval(afterFnN+";");
				}else {
					eval(afterFnN+"();");
				}
			}
		});
	});
	
	common.popAlert("#alertLayer");

} 

/**
 * @설명 : 공통 layer형식 팝업 띄움.
 * @param .act 가 포함된 wsvc명 또는 div id 
 * @param 상단고정 여부.
 * @returns : 없음.
 * @예제 : cf_popup("ComCpop11.act"); 또는 cf_popup("samplePopup1");
 */
function cf_popup_backup(str, topYn) {
	cf_popupClose(); // 팝업이 있으면 초기화 한다.
	
	if(cf_isEmpty(str)) return false;
	if(cf_isEmpty(topYn)) topYn = "N";
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		var popId = "popWrap_" + str;
		var newId = "";
		newId = "new_" + str;
		rtnId = "#" + newId;
		$("#" + newId).remove();
		
		if($("#popWrap").length==0) {
			$("body").append("<div class='popWrap' id='"+popId+"'></div>");
		}
		
		$("#" + str).clone().appendTo($("#" + popId));
		$("#" + popId).children().attr('id', newId);
		$("#" + popId).children().show();
		if(topYn == "Y") {
			$("#" + popId).children().attr('class', 'popup');
		}else{
			$("#" + popId).children().attr('class', 'popup fixed');
		}
	}
	common.popupOpen(rtnId);
}

/**
 * @설명 : 공통 layer형식 팝업 띄움.
 * @param .act 가 포함된 wsvc명 또는 div id 
 * @returns : 없음.
 * @예제 : cf_popup("ComCpop11.act"); 또는 cf_popup("samplePopup1");
 */
function cf_popup(str) {
	cf_popupClose(); // 팝업이 있으면 초기화 한다.
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		rtnId = "#" + str;
	}
	
	jexMl.addLoadView(  cf_replace(str, ".act", "")    ); //다국어처리
	
	common.popupOpen(rtnId);
	/*
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + str;
	}else{
		var popId = "new_" + str;
		var subId = "";
		subId = "sub_" + str;
		rtnId = "#" + subId;
		$("#" + popId).remove();
		//접근성 문제해결을 위해 Wrapper 밖에 생성
		$("body").append("<div class='popWrap' id='"+popId+"'></div>");
		
		$("#" + str).clone().appendTo($("#" + popId));
		$("#" + popId).children().attr('id', subId);
		
	}
	common.popupOpen(rtnId);
	*/
}

/**
 * @설명 : 공통 layer형식 팝업 띄움.
 * @param .act 가 포함된 wsvc명 또는 div id 
 * @returns : 없음.
 * @예제 : cf_popup("ComCpop11.act"); 또는 cf_popup("samplePopup1");
 */
function cf_popup2(str) {
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
		
		$('body').addClass('popOn');
//		var str = url + " .popContain";
		$('body .loadData').remove();
		$("body").append('<div class="loadData"></div>');
		$('.loadData').hide();			
		
		$("body .loadData").load(rtnId,function(){
			console.log("subLoad~");
			$("body").append('<div class="popWrap nowOpen ajaxPop"></div>');
			$('.ajaxPop').hide();

			$("body .ajaxPop").html($("body .popContain").html());

			$("body .popContain").remove();
			
			$('.ajaxPop').fadeIn('fast');
			popupResize('.ajaxPop.nowOpen');
			uiBind();
			$('.wrapper').attr('aria-hidden','true');
			$('.ajaxPop').attr("tabindex", -1).focus();
		});
		
	}else{
		rtnId = "#" + str;
	}
//	common.popupOpen(rtnId);
	/*
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + str;
	}else{
		var popId = "new_" + str;
		var subId = "";
		subId = "sub_" + str;
		rtnId = "#" + subId;
		$("#" + popId).remove();
		//접근성 문제해결을 위해 Wrapper 밖에 생성
		$("body").append("<div class='popWrap' id='"+popId+"'></div>");
		
		$("#" + str).clone().appendTo($("#" + popId));
		$("#" + popId).children().attr('id', subId);
		
	}
	common.popupOpen(rtnId);
	 */
}

/**
 * @설명 : 공통 layer형식 팝업 띄움.
 * @param .act 가 포함된 wsvc명 또는 div id 
 * @returns : 없음.
 * @예제 : cf_popupOpen(action명, act파라미터, js명, callback())
 */

function cf_popupOpen(str,objParam,jsUrl,fnObj ) {
	cf_popupClose(); // 팝업이 있으면 초기화 한다.
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		rtnId = "#" + str;
	}
	
	objParam["_IS_POPUP_REQUEST_PARAM"] = "TRUE";
	
	
	
	jexMl.addLoadView(  cf_replace(str, ".act", "")    ); //다국어처리
	
	common.popupOpen(rtnId,objParam,fnObj,"/js/jex/gib_pt/"+jsUrl);
	//common.setCallback(fnObj);
}


//
function cf_autoLogoutPopOpen(str,objParam,jsUrl,fnObj ) {
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		rtnId = "#" + str;
	}
	
	objParam["_IS_POPUP_REQUEST_PARAM"] = "TRUE";
	
	
	jexMl.addLoadView(  cf_replace(str, ".act", "")    ); //다국어처리
	
	common.popupOpen(rtnId,objParam,fnObj,"/js/jex/gib_pt/"+jsUrl);
	//common.setCallback(fnObj);
}


function cf_popupOpenNoClosePrepop(str,objParam,jsUrl,fnObj ) {
	//cf_popupClose(); // 팝업이 있으면 초기화 한다.
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		rtnId = "#" + str;
	}
	
	objParam["_IS_POPUP_REQUEST_PARAM"] = "TRUE";
	
	
	jexMl.addLoadView(  cf_replace(str, ".act", "")    ); //다국어처리
	
	common.popupOpen(rtnId,objParam,fnObj,"/js/jex/gib_pt/"+jsUrl);
	//common.setCallback(fnObj);
}

/**
 * @설명 : layer형식 팝업 to layer형식 팝업 이동.
 * @param .act 가 포함된 wsvc명 또는 div id 
 * @returns : 없음.
 * @예제 : cf_popupChange(action명, act파라미터, js명, 이전팝업 삭제여부)
 */
function cf_popupChange(str,objParam,jsUrl, isDelPrePopup) { //,fnObj) {
	

	//보안입력view에서 예외발생시 페이지이동 20170721
	if(!cf_isEmpty( $("#_SECU_PAGE_ERROR_YN").val()) &&  $("#_SECU_PAGE_ERROR_YN").val() == "Y"  ){
		
		var errMsg  =  !cf_isEmpty( $("#_SECU_PAGE_ERROR_MSG").val())?$("#_SECU_PAGE_ERROR_MSG").val():"보안입력매체오류발생";
		_SECU_PAGE_ERROR_PAGE =  !cf_isEmpty( $("#_SECU_PAGE_ERROR_PAGE").val())?$("#_SECU_PAGE_ERROR_PAGE").val():"ComMainCnts0100.act";  
		cf_alert(errMsg, "cf_secuPageErrorPage" );
		return;
	}
	
	
	var fnObj = ''; // return function을 없앰.(2016.08.05) 
	
	//팝업의 팝업이 열린경우 이전팝업 삭제여부
	var delPrepopup = true;  //default 이전팝업삭제
	if( !cf_isEmpty(isDelPrePopup)) delPrepopup = isDelPrePopup;
	
	if(cf_isEmpty(str)) return false;
	var rtnId = "";
	if(str.indexOf('.') > -1) {
		rtnId = "/" + cf_toJexURL(str);
	}else{
		rtnId = "#" + str;
	}
	
	objParam["_IS_POPUP_REQUEST_PARAM"] = "TRUE";
	console.log("str="+str);
	jexMl.addLoadView(  cf_replace(str, ".act", "")    ); //다국어처리
	console.log("rtnId="+rtnId);
	//common.popupChange(rtnId,objParam,fnObj,"/js/jex/gib_pt/"+jsUrl,true);
	common.popupChange(rtnId,objParam,fnObj,"/js/jex/gib_pt/"+jsUrl,delPrepopup);
	
	//common.setCallback(fnObj);
}


/**
 * @설명 : layer형식 팝업 to layer형식 팝업 닫기.
 * @param : 없음.
 * @returns : 없음.
 * @예제 : cf_popupClose()
 */
function cf_popupClose(mTime) {
	common.popupClose(mTime);
	return;
}

/**
 * @설명 : layer형식 팝업 to layer형식 팝업 닫기(callBack(null) 호출).
 * @param : 없음.
 * @returns : 없음.
 * @예제 : cf_callBackNullClose()
 */
function cf_callBackNullClose(mTime) {
	common.callBackNullClose(mTime);
	return false;
}

/**
 * @설명 : layer형식 팝업 to layer형식 팝업 닫기(callBack(null) 호출).
 * @param : 없음.
 * @returns : 없음.
 * @예제 : cf_callBack()
 */
function cf_callBack(data) {
	common.callBack(data);
	return false;
}

/**
 * @설명 : layer형식 팝업 스크립트 추가 후 callback
 * @param : 없음.
 * @returns : 없음.
 * @예제 : cf_popfooter()
 */
function cf_popfooter() {
	
	//alert($("body .ajaxPop.nowOpen").html().length);

	if($("body .ajaxPop.nowOpen").html().length < 1) {
		//console.log("Layer Popup : false");
		//cf_callBackNullClose();
		//cf_alert('서비스 오류가 발생하였습니다.');
	} else {
		//console.log("Layer Popup : true");
		
		/* 팝업 form 객체 초기 설정. */
		initializeHtmlPage(true);
		
		///* 팝업 보안키패드 객체 초기화.  */
		//TK_Rescan();
		//initTranskey();
		
		/* 팝업 onunload()시 키보드, 키패드 암호화 객체 제거 추가. */
		var node = document.createElement('script');
		node.type= "text/javascript";
		node.text= '$("#common_Popup_script_check_id").on("remove", function(){removeTranskey(); });';
		//document.body.appendChild(node);
		if( document.getElementById("common_Popup_script_check_id")  != undefined ){  //20170320,sy81905
			document.getElementById("common_Popup_script_check_id").appendChild(node);
		}
	}
}

/**
 * 숫자형식의 값을 시:분:초로 보여준다.
 * @param strtime - 시간형식 문자열
 * @param type - 0:기본형식, 1-초값으로
 * @returns : 시:분:초
 * @예제 : cf_timeFormat("180229");
 */
function cf_timeFormat(strtime, type) {
	var sectime = strtime;
	var hour = parseInt(sectime / 3600);
	var num = sectime - (3600 * hour);
	var min = parseInt(num / 60);
	var sec = parseInt(num - (min * 60));
	if (type == null || type == undefined || type == "0") {
		if (hour == 0) {
			return cf_lpad(min, 2, '0') + ":" + cf_lpad(sec, 2, '0');
		} else {
			return cf_lpad(hour, 2, '0') + ":" + cf_lpad(min, 2, '0') + ":" + cf_lpad(sec, 2, '0');
		}
	} else {
		return num;
	}
}

/**
 * Left 빈자리 만큼 str 을 붙인다.
 * @param src : Right에 붙을 원본 데이터
 * @param len : str붙힐 데이터 길이
 * @param str : 대상 데이터
 * @returns : str과 src가 붙은 데이터
 * @예제 : cf_lpad(src, len, str)
 */
function cf_lpad(src, len, str) {
	var retStr = "";
	var padCnt = Number(len) - String(src).length;
	for ( var i = 0; i < padCnt; i++)
		retStr += String(str);
	return retStr + src;
}

/**
 * Right 빈자리 만큼 str 을 붙인다.
 * @param src : Left에 붙을 원본 데이터
 * @param len : str붙힐 데이터 길이
 * @param str : 대상 데이터
 * @returns : str과 src가 붙은 데이터
 * @예제 : cf_rpad(src, len, str)
 */
function cf_rpad(src, len, str) {
	var retStr = "";
	var padCnt = Number(len) - String(src).length;
	for ( var i = 0; i < padCnt; i++)
		retStr += String(str);
	return src + retStr;
}



/**
 * XSS관련 특정 문자 기호변환
 * @param str : 변환할 문자열
 * @returns : 변환된 문자열
 * @예제 : cf_replace4XSS("<script>") -> &lt;script&gt;
 */
function cf_replace4XSS(str) {
	try {
		if (str != null) {
			str = str.replace(/\</g, "&lt;");
			str = str.replace(/\>/g, "&gt;");
			str = str.replace(/\"/g, "&quot;");
			str = str.replace(/\'/g, "&squot;");
			str = str.replace(/\&#39/g, "&squot;");
		}
	} catch (e) {
	}
	return str;
}

/**
 * XSS관련 변환 문자 정상 복호화
 * @param str : 변환된 문자열
 * @returns : 복호화된 문자열
 * @예제 : cf_restore4XSS("&lt;script&gt;") -><script>
 */
function cf_restore4XSS(str) {
	if (str != null) {
		str = str.replace("&lt;", "<");
		str = str.replace("&gt;", ">");
		str = str.replace("&quot;", "\"");
		str = str.replace("&squot;", "'");
	}
	return str;
}

/**
 * 데이터값 변경
 * @param targetStr : 변경할 대상
 * @param searchStr : 변경 원본 값
 * @param replaceStr : 변경 후 값
 * @예제 : cf_replace("aaa12aa", "12", "bb")
 */
function cf_replace(targetStr, searchStr, replaceStr){
	
    var i=0,j=0;
    if (targetStr == null || searchStr == null || replaceStr == null) return "";
    var tmpStr = "";
    var tlen = targetStr.length;
    var slen = searchStr.length;
    var i=0;
    var j=0;
    while (i < tlen - slen+1)
    {
        j = i + slen;
        if (targetStr.substring(i,j) == searchStr){
            tmpStr += replaceStr;
            i += slen;
        }else{
            tmpStr += targetStr.substring(i, i + 1);
            i++;
        }
    }
    //tmpStr += targetStr.substring(i);
    
    var endStr=targetStr.substring(i);
    if(endStr != null && endStr !="")
    {
    	tmpStr += endStr;
    }
    
    return tmpStr;
}

/**
 * 데이터값 변경[정규식]
 * @param strValue1 : 변경 원본 값
 * @param strValue2 : 변경 후 값
 * @예제 : "TESTAAA".replaceAll("AAA", "BBB")
 */
String.prototype.replaceAll = replaceAll;
function replaceAll(strValue1, strValue2) {
	var strTemp = this;
	strTemp = strTemp.replace(new RegExp(strValue1, "g"), strValue2);
	return strTemp;
}

/**
 * 텍스트 리플레이스
 * @param str
 * @param orgStr
 * @param repStr
 * @returns
 */
function cf_replaceAll(str,orgStr,repStr){
    if(str == "" || str == undefined || str == null){
		return "";
	}else{
		return str.split(orgStr).join(repStr);
	}
}

/**
 * 빈값 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_isEmpty(pValue)
 */
function cf_isEmpty(pValue) {
	if (pValue == undefined) {
		return true;
	}

	if (pValue == null) {
		return true;
	}
	if (typeof (pValue) == "string") {
		if (cf_replace(pValue, / /gi, "") == "") {
			return true;
		}
	}

	if (pValue == "null") {
		return true;
	}
	
	

	return false;
}

/**
 * 숫자만 있는지 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_isNum(pValue)
 */
function cf_isNum(pValue) {
	if (cf_isEmpty(pValue))
		return false;
	for ( var idx = 0; idx < pValue.length; idx++) {
		if (pValue.charAt(idx) < '0' || pValue.charAt(idx) > '9') {
			return false;
		}
	}
	return true;
}


/**
 * 숫자의 포함 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_includeNum(pValue)
 */
function cf_includeNum(pValue) {
	if (cf_isEmpty(pValue))
		return false;
	for ( var idx = 0; idx < pValue.length; idx++) {
		if (pValue.charAt(idx) >= '0' && pValue.charAt(idx) <= '9') {
			return true;
		}
	}
	return false;
}


/**
 * 영문만 있는지 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_isAlpha(pValue)
 */
function cf_isAlpha(pValue) {
	if (cf_isEmpty(pValue))
		return false;
	for ( var idx = 0; idx < pValue.length; idx++) {
		if (!((pValue.charAt(idx) >= 'a' && pValue.charAt(idx) <= 'z') || (pValue.charAt(idx) >= 'A' && pValue.charAt(idx) <= 'Z'))) {
			return false;
		}
	}
	return true;
}

/**
 * 영문이 포함되어 있는지 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_includeAlpha(pValue)
 */
function cf_includeAlpha(pValue) {
	var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for ( var idx = 0; idx < pValue.length; idx++) {
		if (chars.indexOf(pValue.charAt(idx)) != -1) {
			return true;
		}
	}
	return false;
}

/**
 * 한글만 있는지 여부를 리턴한다
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_isHangul(pValue)
 */
function cf_isHangul(pValue) {
	if (cf_isEmpty(pValue))
		return false;
	for ( var idx = 0; idx < pValue.length; idx++) {
		var c = escape(pValue.charAt(idx));
		if (c.indexOf("%u") == -1) {
			return false;
		}
	}

	return true;
}

/**
 * 한글이 포함되어 있는지 여부를 리턴한다.
 * @param pValue : 확인할 값
 * @returns : true, false
 * @예제 : cf_isHan(pValue)
 */
function cf_isHan(pValue) {
	var rtnData = false;
	if (cf_isEmpty(pValue))
		rtnData = false;
	for ( var idx = 0; idx < pValue.length; idx++) {
		var c = escape(pValue.charAt(idx));
		if ((!rtnData && c.indexOf("%u") > -1)) {
			rtnData = true;
			break;
		}
	}
	return rtnData;
}

/**
 * 입력값에 특정 문자(chars)가 있는지 체크(특정 문자를 허용하지 않으려 할 때 사용)
 * @param input : 확인할 객체명(jQuery형식)
 * @param chars : 체크할 문자
 * @returns : true, false
 * @예제 : if(cf_isContainsChars($("#input"),"!,*&^%$#@~;")) cf_alert("이름 필드에는 특수
 *     문자를 사용할 수 없습니다.");
 */
function cf_isContainsChars($input, chars) {
	var input = $input.val();
	for ( var inx = 0; inx < input.length; inx++) {
		if (chars.indexOf(input.charAt(inx)) != -1) {
			return true;
		}
	}
	return false;
}

/**
 * 입력값에 알파벳 대문자가 있는지 체크
 * @param input : 체크할 객체명
 * @returns : true, false
 * @예제 : cf_isUpperCase($("#input"))
 */
function cf_isUpperCase($input) {
	var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	return cf_isContainsChars($input, chars);
}

/**
 * 입력값이 알파벳 소문자가 있는지 체크
 * @param input : 체크할 객체명
 * @returns : true, false
 * @예제 : cf_isLowerCase($("#input"))
 */
function cf_isLowerCase($input) {
	var chars = "abcdefghijklmnopqrstuvwxyz";
	return cf_isContainsChars($input, chars);
}

/**
 * 데이터 길이 반환(한글 2Byte로 계산함)
 * @param str : 확인 데이터
 * @returns : 데이터 length
 * @예제 : cf_getByteLength(str)
 */
function cf_getByteLength(str) {
	var len = 0;
	if (str == null)
		return 0;
	for ( var i = 0; i < str.length; i++) {
		var c = escape(str.charAt(i));
		if (c.length == 1)
			len++;
		else if (c.indexOf("%u") != -1)
			len += 2;
		else if (c.indexOf("%") != -1)
			len += c.length / 3;
	}
	return len;
}

/**
 * 대문자로 변환
 * @param str : 변환할 데이터
 * @returns : 대문자 데이터
 * @예제 : cf_toUpperCase(str)
 */
function cf_toUpperCase(str) {
	if (cf_isEmpty(str)) {
		return str;
	}
	return str.toUpperCase();
}

/**
 * 소문자로 변환
 * @param str : 변환할 데이터
 * @returns : 소문자 데이터
 * @예제 : cf_toLowerCase(str)
 */
function cf_toLowerCase(str){
    if(cf_isEmpty(str)) return str;
    return str.toLowerCase();
}

/**
 * 오늘날짜 반환
 * @param 없음
 * @returns : yyyymmdd : 오늘날짜
 * @예제 : cf_getToday();
 */
function cf_getToday() {
	return cf_getDateTime("yyyymmdd");
//	return _TODAY_;
}

/**
 * 오늘로 부터 입력된 년월일을 계산하여 "yyyymmdd"로 리턴
 * @param Number : 년
 * @param Number : 월
 * @param Number : 일
 * @param setday : 기준년월일
 * @returns : yyyymmdd
 * @예제 : cf_getBoundDate( 1, 0, 0); // 1년후
 * @예제 : cf_getBoundDate(-1, 0, 0); // 1년전
 * @예제 : cf_getBoundDate( 0, 1, 0); // 1달후
 * @예제 : cf_getBoundDate( 0, -1, 0); // 1달전
 * @예제 : cf_getBoundDate( 0, 0, 1); // 1일후
 * @예제 : cf_getBoundDate( 0, 0, -1); // 1일전
 */
function cf_getBoundDate(yy, mm, dd, setday) {
	var today = cf_getToday();

	if (setday != null && setday != undefined && setday != "") {
		today = setday;
	}

	var date = new Date(today.substring(0, 4), Number(today.substring(4, 6)) - 1, today.substring(6, 8));
	t_yy = cf_lpad(new String(date.getFullYear()), 4, '0');
	t_mm = cf_lpad(new String(date.getMonth() + 1), 2, '0');
	t_dd = cf_lpad(new String(date.getDate()), 2, '0');

	yy = Number(yy);
	mm = Number(mm);
	dd = Number(dd);
	if (yy != 0) {
		from = date.getFullYear() + yy;
		date.setYear(from);
		
		from=date.getDate()+1;
        date.setDate(from);
	}
	if (mm != 0) {
		var lastDate = "";
		var day = new Date(date.getFullYear(), date.getMonth(), date.getDate());
		for ( var i = 0; i < 12; i++) {
			day.setMonth(i, 1);// modified on 2009.10.26
			if (date.getMonth() == day.getMonth()) {
				lastDate = cf_getLastDay(day.getFullYear(), (day.getMonth() + 1), day.getDate());
			}
		}
		if (date.getDate() == lastDate) {
			t_yy = date.getFullYear();
			t_mm = (date.getMonth());
			t_dd = date.getDate();

			t_mm = t_mm + mm;

			if (t_mm > 12) {
				t_yy = t_yy + 1;
				t_mm = t_mm - 12;
			} else if (t_mm < 0) {
				t_yy = t_yy - 1;
				t_mm = t_mm + 12;
			} else {
				t_yy = t_yy;
			}
			var lastDate2 = "";

			var day2 = new Date(t_yy, t_mm, 1);
			for ( var i = 0; i < 12; i++) {
				day2.setMonth(i, 1);// modified on 2009.10.26
				if (i == (t_mm)) {
					lastDate2 = cf_getLastDay(day2.getFullYear(), (day2.getMonth() + 1), day2.getDate());
				}
			}
			t_dd = lastDate2;
			date = new Date(t_yy, t_mm, lastDate2);

		} else {
			from = date.getMonth() + mm;
			date.setMonth(from);
		}
		from=date.getDate()+1;
        date.setDate(from);
	}
	if (dd != 0) {
		from = date.getDate() + dd;
		date.setDate(from);
	}
	return cf_lpad(new String(date.getFullYear()), 4, '0') + cf_lpad(new String(date.getMonth() + 1), 2, '0') + cf_lpad(new String(date.getDate()), 2, '0');
}

/**
 *  시작일과 종료일이 있고, 종료일을 기준으로 시작일을 해당 interval만큼 계산해서 세팅한다.
 *  0 : 당일
 *  1 : 1주일 전
 *  2 : 2주일 전
 *  3 : 1개월 전
 *  4 : 3개월 전
 *  5 : 6개월 전
 *  6 : 9개월 전
 *  7 : 1년전
 *  8 : 18개월
 *  9 : 2년전
 *  10: 3년전
 *  11: 5년전
 *  21: 30일 전
 *  22: 90일 전
 *  23: 180일 전
 *  24: 3일 전
 *  25: 15일 전
 *  99: 전체
 */
 function cf_changeDate(frmName, objName1,objName2, i) {

	if(i==undefined || i=="") {
		i="0";
	} else {
		if (typeof(i) == "string") {
			i = parseInt(i);
		}
	}

	var f_date      = eval("document."+frmName+"."+objName1);
	var t_date      = eval("document."+frmName+"."+objName2);
	var f_yy, f_mm, f_dd, thisDate = "";

	thisDate = cf_getToday();
	f_yy = f_date.value.substring(0,4);
	f_mm = f_date.value.substring(4,6);
	f_dd = f_date.value.substring(6,8);

	var date=new Date();

	switch(i){
    	case 1:
        	f_date.value = cf_getBoundDate(0, 0, -7);
        break;
		case 2:
		    f_date.value = cf_getBoundDate(0, 0, -14);
		   break;
		case 3:
		  f_date.value = cf_getBoundDate(0, -1, 0);
		  break;
		case 4:
		    f_date.value = cf_getBoundDate(0, -3, 0);
		    break;
		case 5:
		    f_date.value = cf_getBoundDate(0, -6, 0);
		    break;
		case 6:
		    f_date.value = cf_getBoundDate(0, -9, 0);
		    break;
		case 7:
		    f_date.value = cf_getBoundDate(-1, 0, 0);
		    break;
		case 8:
		    f_date.value = cf_getBoundDate(0, -18, 0);
		    break;
		case 9:
		    f_date.value = cf_getBoundDate(-2, 0, 0);
		    break;
		case 10:
		    f_date.value = cf_getBoundDate(-3, 0, 0);
		    break;
		case 11:
		    f_date.value = cf_getBoundDate(-5, 0, 0);
		    break;
		case 21:
		    f_date.value = cf_getBoundDate(0, 0, -30);
		    break;
		case 22:
		    f_date.value = cf_getBoundDate(0, 0, -60);
		    break;
		case 23:
		    f_date.value = cf_getBoundDate(0, 0, -90);
		    break;
		case 24:
		    f_date.value = cf_getBoundDate(0, 0, -3);
		    break;
		case 25:
		    f_date.value = cf_getBoundDate(0, 0, -15);
		    break;
		default:
		    f_date.value = thisDate;
		    break;
	}
	f_date.value = cf_getDateTime("yyyy-mm-dd", f_date.value);
	t_date.value = cf_getDateTime("yyyy-mm-dd", thisDate);

}
 
/**
 * 입력받은 대분류코드와 소분류코드에 대한 소분류명 return
 * @param code1 : 대분류코드
 * @param code2 : 소분류코드
 * @returns : 소분류명
 * @예제 : cf_getCode("TEST","test1");
 */
function cf_getCode(code1, code2) {
	if (cf_isEmpty(code1) || cf_isEmpty(code2)) return "";
	
	var codeManager = jexjs.plugin("code_manager");              
	var val = codeManager.getCode(code1, code2);
	if(cf_isEmpty(val)) val = "";
	return val;
}

/**
 * 입력받은 날에 해당하는 달의 말일이 몇일인지 알려줌. 아래의 예제를 실행하면 1월이 31일까지 있기 때문에 31을 return
 * @param yy : 년
 * @param mm : 월
 * @param dd : 일
 * @returns : 해당월의 마지막 날짜
 * @예제 : cf_getLastDay("2012","01","27");
 */
function cf_getLastDay(yy, mm, dd) {
	var lastDay = new Date(yy, mm - 1, dd);
	lastDay.setMonth(lastDay.getMonth() + 1, 0);
	return lastDay.getDate();
}

/**
 * 유효하는(존재하는) Date 인지 체크
 * @param strDate : 검증할 string형식의 날짜(날짜형식"20090101") yyyymmdd
 * @returns : true, false
 * @예제 : if (!cf_isValidDate(strDate)) cf_alert("올바른 날짜가 아닙니다.");
 */
function cf_isValidDate(strDate) {
	var year = "";
	var month = "";
	var day = "";
	if (strDate == "")
		return false;
	if (strDate.length == 8) {
		year = strDate.substring(0, 4);
		month = strDate.substring(4, 6);
		day = strDate.substring(6, 8);
		if (parseInt(year, 10) >= 1900 && cf_isValidMonth(month) && cf_isValidDay(year, month, day)) {
			return true;
		}
	} else if (strDate.length == 6) {
		year = strDate.substring(0, 4);
		month = strDate.substring(4, 6);
		if (parseInt(year, 10) >= 1900 && cf_isValidMonth(month)) {
			return true;
		}
	}
	return false;
}

/**
 * 유효한(존재하는) 월(月)인지 체크
 * @param mm : 검증할 월(형식"01" ~ "12")
 * @returns : true, false
 * @예제 : cf_isValidMonth(mm)
 */
function cf_isValidMonth(mm) {
	var m = parseInt(mm,10);
	return (m >= 1 && m <= 12);
}

/**
 * 유효한(존재하는) 일(日)인지 체크
 * @param yyyy : 검증할 년(형식"2009")
 * @param mm :v검증할 월(형식"01" ~ "12")
 * @param dd :v검증할 일(형식"01" ~ "31")
 * @returns : true, false
 * @예제 : cf_isValidDay(yyyy, mm, dd)
 */
function cf_isValidDay(yyyy, mm, dd) {
	var m = parseInt(mm, 10) - 1;
	var d = parseInt(dd, 10);
	var end = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	if ((yyyy % 4 == 0 && yyyy % 100 != 0) || yyyy % 400 == 0) {
		end[1] = 29;
	}
	return (d >= 1 && d <= end[m]);
}

/**
 * 유효한(존재하는) 시(時)인지 체크
 * @param hh : 검증할 시(형식"0" ~ "23")
 * @returns : true, false
 * @예제 : cf_isValidHour(hh)
 */
function cf_isValidHour(hh) {
	var h = parseInt(hh,10);
	return (h >= 0 && h <= 23);
}

/**
 * 유효한(존재하는) 분(分)인지 체크
 * @param mi : 검증할 분(형식"00" ~ "59")
 * @returns : true, false
 * @예제 : cf_isValidMin(mi)
 */
function cf_isValidMin(mi) {
	var m = parseInt(mi,10);
	return (m >= 0 && m <= 59);
}

/**
 * 유효시간초 검증
 * @param hh24miss : 검증시간분초[6자리여야함.]
 * @returns : true, false
 * @예제 : cf_isValidTime(hh24miss)
 */
function cf_isValidTime(hh24miss) {
	if (cf_isValidHour(hh24miss.substring(0, 2)) && cf_isValidMin(hh24miss.substring(2, 4)) && cf_isValidMin(hh24miss.substring(4, 6))) {
		return true;
	} else {
		return false;
	}
}

/**
 * 유효하는(존재하는) 날짜와시간 인지 체크
 * @param strDateTime : 검증할 날짜와시간(형식"200102310000") yyyymmddhhmi
 * @returns : true, false
 * @예제 : if (!cf_isValidDateTime(strDateTime)) cf_alert("올바른 날짜/시간 형식이 아닙니다.")
 */
function cf_isValidDateTime(strDateTime) {
	var year = strDateTime.substring(0, 4);
	var month = strDateTime.substring(4, 6);
	var day = strDateTime.substring(6, 8);
	var hour = strDateTime.substring(8, 10);
	var min = strDateTime.substring(10, 12);
	if (parseInt(year, 10) >= 1900 && cf_isValidMonth(month) && cf_isValidDay(year, month, day) && cf_isValidHour(hour) && cf_isValidMin(min)) {
		return true;
	}
	return false;
}

/**
 * DateTime 스트링을 자바스크립트 Date 객체로 변환
 * @param strDateTime : 검증할 (형식"200102310000") yyyymmddhhmi
 * @returns : true, false
 * @예제 : if (!cf_toDateObject(strDateTime)) cf_alert("올바른 날짜/시간 형식이 아닙니다.")
 */
function cf_toDateObject(strDateTime) {
	var year = strDateTime.substr(0, 4);
	var month = strDateTime.substr(4, 2) - 1; // 1월=0,12월=11
	var day = strDateTime.substr(6, 2);
	var hour = strDateTime.substr(8, 2);
	var min = strDateTime.substr(10, 2);
	return new Date(year, month, day, hour, min);
}

/**
 * 특정날짜의 요일을 구한다.
 * @param strDate : 요일을 구할 날짜(형식"20010231")
 * @returns : 요일명 (월,화,수,목,금,토)
 * @예제 : cf_getDayOfWeek(strDate)
 */
function cf_getDayOfWeek(strDate) {
	var now = cf_toDateObject(strDate);
	var day = now.getDay(); // 일요일=0,월요일=1,...,토요일=6
	var week = new Array(COMMON_SCRIPT_00024, COMMON_SCRIPT_00025, COMMON_SCRIPT_00026, COMMON_SCRIPT_00027, COMMON_SCRIPT_00028, COMMON_SCRIPT_00029, COMMON_SCRIPT_00030);
	return week[day];
}

/**
 * 두 날짜사이의 일 수를 계산해 준다.
 * @param fromDay : 시작날짜 (형식"20010101")
 * @param toDay : 종료날(형식"20011231")
 * @returns : 날짜차이 수치
 * @예제 : cf_numberOfDays(fromDay, toDay)
 */
function cf_numberOfDays(fromDay, toDay) {
	var fromD = new Date(fromDay.substring(0, 4), fromDay.substring(4, 6) - 1, fromDay.substring(6, 8));
	var toD = new Date(toDay.substring(0, 4), toDay.substring(4, 6) - 1, toDay.substring(6, 8));
	var totD = toD.getTime() - fromD.getTime();
	totD = totD / 1000 / 60 / 60 / 24;

	return totD;
}

/**
 * 월의 끝 일자 얻기
 * @param str : yyyymm(형식 "200910")
 * @returns : dd 끝날짜 ex) 31
 * @예제 : cf_getEndDate(str)
 */
function cf_getEndDate(str) {
	// 널인지?
	if (cf_isEmpty(str)) {
		return null;
	}
	// 숫자인지?
	if (!cf_isNum(str)) {
		return null;
	}
	// 길이가 8자리?
	if (str.length != 6) {
		return null;
	}
	var yy = Number(str.substring(0, 4));
	var mm = Number(str.substring(4, 6));

	// 윤년 검증
	var boundDay = "";

	if (mm != 2) {
		var mon = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		boundDay = mon[mm - 1];
	} else {
		if (yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0) {
			boundDay = 29;
		} else {
			boundDay = 28;
		}
	}
	return boundDay;
}

/**
 * 숫자아닌 문자삭제
 * @param str : 대상 데이터
 * @returns : 숫자 제외한 데이터
 * @예제 : cf_onlyNum(str)
 */
function cf_onlyNum(str) {
	var retStr = "";
	if (cf_isEmpty(str))
		return false;
	for ( var idx = 0; idx < str.length; idx++) {
		if ((str.charAt(idx) < '0' || str.charAt(idx) > '9')
				&& str.charAt(idx) != ',') {
		} else {
			retStr += str.charAt(idx) + "";
		}
	}
	return retStr;
}

/**
 * 문자열 공백제거
 * @param str : 대상 데이터
 * @returns : 공백 제거된 데이터
 * @예제 : cf_trim(str)
 */
function cf_trim(str) {
	return $.trim(str);
}

/**
 * 전화번호 국번검증
 * @param ddd : 국번데이터
 * @returns : true, false
 * @예제 : cf_isValidDDDPhoneNum(ddd)
 */
function cf_isValidDDDPhoneNum(ddd) {
	// 널인가?
	if (cf_isEmpty(ddd)) {
		return null;
	}
	if (ddd != "02" && ddd != "031" && ddd != "032" && ddd != "033"
			&& ddd != "041" && ddd != "042" && ddd != "043" && ddd != "051"
			&& ddd != "052" && ddd != "053" && ddd != "054" && ddd != "055"
			&& ddd != "061" && ddd != "062" && ddd != "063" && ddd != "064"
			&& ddd != "011" && ddd != "016" && ddd != "017" && ddd != "018"
			&& ddd != "019" && ddd != "010") {
		return false;
	}
	return true;
}

/**
 * 문자형을 숫자형으로 변경
 * @param str : 변경시킬 String형 데이터
 * @returns : int형 데이터
 * @예제 : cf_strToInt(str)
 */
function cf_strToInt(str) {
	var num = parseInt(str, 10);
	if (isNaN(num)) {
		return 0;
	} else {
		return num;
	}
}

/**
 * 객체 초기화
 * @param input : 초기화할 객체
 * @예제 : cf_clearData($("#input"))
 */
function cf_clearData($input) {
	if ($input != null && $input != undefined) {
		$input.val("");
	}
}

/**
 * 이메일 주소체크
 * 2020.05.15 SMR#777057
 * @param str : 메일주소값
 * @returns : true, false
 * @예제 : cf_isValidEmail(str)
 */
function cf_isValidEmail(str) {
	//if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,10})+$/.test(str)) {
	if (/^\w+([\.-]?\w+)*[-_]*@\w+([\.-]?\w+)*(\.\w{2,10})+$/.test(str)) {		
		return true;
	} else {
		return false;
	}
}

/**
 * 두 날짜가 몇 개월 차이나는지 구함 time1이 time2보다 크면(미래면) minus(-)
 * @param fromDate : 시작날짜(yyyymmdd)
 * @param toDate : 끝날짜(yyyymmmdd)
 * @returns : int형 데이터
 * @예제 : cf_getMonthInterval(fromDate, toDate)
 * 
 */
function cf_getMonthInterval(fromDate, toDate) {
	var date1 = cf_toDateObject(fromDate);
	var date2 = cf_toDateObject(toDate);
	var years = date2.getFullYear() - date1.getFullYear();
	var months = date2.getMonth() - date1.getMonth();
	var days = date2.getDate() - date1.getDate();
	return (years * 12 + months + (days >= 0 ? 0 : -1));
}

/**
 * form객체 하위에 hidden객체 생성하여 값 셋팅[hidden객체 있는경우 값 재설정]
 * @param $form : form $객체
 * @param nm : hidden 객체 id/name
 * @param val : 셋팅 값
 * @param attr : attribute 이름
 * @param attrval : attribute값
 * @returns : 없음
 * @예제 : cf_putHiddenVal($("#form1"), "test","test value");
 */
function cf_putHiddenVal($form, nm, val, attr, attrval) {

	var opt = "";
	if (attr != null && attr != undefined && attr != "") {
		opt = "" + attr + "='" + attrval + "'";
	}

	if ($form.find($("#" + nm)).attr("type") == undefined) {
		$form.append("<input    type='hidden' id='" + nm + "' name='" + nm
				+ "' value='' " + opt + " />");
		if (val != null && val != undefined) {
			$("input[id=" + nm + "]").val(val);
		}

	} else {
		if ($form.find($("#" + nm)).attr("type") != "password") {
			if (val != null && val != undefined) {
				$("#" + nm).val(val);
			} else {
				$("#" + nm).val("");
			}
		}
	}
}

/**
 * form객체 하위에 id 객체 삭제
 * @param $form : form $객체
 * @param nm : hidden 객체 id/name
 * @returns : 없음
 * @예제 : cf_removeHiddenVal($("#form1"), "test");
 */
function cf_removeHiddenVal($form, nm) {
	if ($("#" + nm).attr("type") == undefined) {
	} else {
		$("#" + nm).remove();
	}
}


/**
 * form객체 하위에 hidden 객체 삭제
 * @returns : 없음
 * @예제 : cf_removeHiddenVal();
 */
function cf_removeAllHidden() {

	var objs = document.all.tags('INPUT');
	for ( var idx = 0; idx < objs.length; idx++) {
		try {
			var obj = objs[idx];
			if (obj.type == "hidden") {
				$("#" + obj.name).remove();
			}
		} catch (e) {
		}
	}
}


/**
 * input객체안에 데이터 지우고 focus 유지
 * @param input : $ 형식의 문자
 * @returns : 없음
 * @예제 : cf_resetFocusField("#USRID");
 */
function cf_resetFocusField(input) {
	$(input).val("");
	cf_setFocusField(input);
}

/**
 * input객체 focus 유지
 * @param input : $ 형식의 문자
 * @returns : 없음
 * @예제 : cf_setFocusField("#form1");
 */
function cf_setFocusField(input) {
	$(input).focus();
}

/**
 * input객체 focus 유지
 * @param input : input name
 * @returns : 없음
 * @예제 : cf_setFocusFieldName("userid");
 */
function cf_setFocusFieldName(input) {
	try {
		//eval("document.all." + input + ".focus()");
		$("[name=" + input + "]")[0].focus();
	} catch (e) {
		try {
			eval("document.all._E2E123_" + input + ".focus()");
		} catch (e) {
		}
	}

}

/**
 * @설명 : 배열 형태의 input[select]객체를 반복부 json형식의 문자열 데이터로 return [주의사항] 여러개의 input을 같이 하는경우 객체 건수가 동일해야 함.
 * @param $form : $form객체
 * @param datanames : | 구분자를 가지는 name 객체명
 * @param datanames : chk박스사용해서 check된것만 가져올경우 checkbox name 필드명
 * @returns : 없음
 * @예제 : cf_dataToJsonRec($("#form1"),"PRC_DS|CHG_CNTN");
 */
function cf_dataToJsonRec($form, datanames, checkboxnm) {
	var blchk = false;
	if (checkboxnm != null && checkboxnm != undefined && checkboxnm != "") {
		blchk = true;
	}
	if (datanames == undefined || cf_trim(datanames) == "") {
		return;
	}
	var splitdata = datanames.split("|");
	var jsonunit = "";
	var jsonstring = "";

	for ( var j = 0; j < $form.find('[name="' + splitdata[0] + '"]').length; j++) {
		if (blchk) {
			if ("checked" == $form.find('[name="' + checkboxnm + '"]').eq(j).attr("checked")) {
				jsonstring += ",{";
				jsonunit = "";
				for ( var i = 0; i < splitdata.length; i++) {
					jsonunit += ",\"" + cf_trim(splitdata[i]) + "\":\"" + cf_trim($form.find('[name="' + splitdata[i] + '"]').eq(j).val()) + "\"";
				}
				jsonunit = jsonunit.substring(1);
				jsonstring += jsonunit + "}";
			}
		} else {
			jsonstring += ",{";
			jsonunit = "";
			for ( var i = 0; i < splitdata.length; i++) {
				jsonunit += ",\"" + cf_trim(splitdata[i]) + "\":\"" + cf_trim($form.find('[name="' + splitdata[i] + '"]').eq(j).val()) + "\"";
			}
			jsonunit = jsonunit.substring(1);
			jsonstring += jsonunit + "}";
		}
	}
	jsonstring = jsonstring.substring(1);
	jsonstring = "[" + jsonstring + "]";
	return jsonstring;
}

/**
 * 날짜시간포멧 리턴 함수
 * @param format: yyyymmdd or hh24miss or hh12miss 를 이용
 * @param datetime 임시 용도
 * @returns : 포멧된 날짜 시간
 * @예제 : cf_getDateTime("yyyy-mm-dd",""); or cf_getDateTime("yyyy-mm-dd","20160526");
 *     cf_getDateTime("yyyy-mm-dd hh24:mi:ss","20120302111658")
 */
function cf_getDateTime(format, datetime) {

	var yyyy = "";
	var mm = "";
	var dd = "";

	var hh24 = "";
	var mi = "";
	var ss = "";

	if (datetime == undefined || cf_trim(datetime) == "") {
		
		var jexAjax = jexjs.createAjaxUtil('ComDateTime10');
		jexAjax.setting({async:false});
		jexAjax.execute(function (data) {
			var today = data.DATE_TIME;
			yyyy = today.substring(0, 4);
			mm = today.substring(4, 6);
			dd = today.substring(6, 8);
			hh24 = today.substring(8, 10);
			mi = today.substring(10, 12);
			ss = today.substring(12, 14);
		});
		
	} else {
		if (datetime.length == 6) {
			hh24 = cf_lpad(datetime.substring(0, 2), 2, "0");
			mi = cf_lpad(datetime.substring(2, 4), 2, "0");
			ss = cf_lpad(datetime.substring(4, 6), 2, "0");
		} else if (datetime.length == 8) {
			yyyy = datetime.substring(0, 4);
			mm = cf_lpad(datetime.substring(4, 6), 2, "0");
			dd = cf_lpad(datetime.substring(6, 8), 2, "0");
		} else if (datetime.length == 14) {
			yyyy = datetime.substring(0, 4);
			mm = cf_lpad(datetime.substring(4, 6), 2, "0");
			dd = cf_lpad(datetime.substring(6, 8), 2, "0");
			hh24 = cf_lpad(datetime.substring(8, 10), 2, "0");
			mi = cf_lpad(datetime.substring(10, 12), 2, "0");
			ss = cf_lpad(datetime.substring(12, 14), 2, "0");
		}
	}
	if (format.indexOf("yyyy") > -1) {
		format = cf_replace(format, "yyyy", yyyy);
	}
	if (format.indexOf("mm") > -1) {
		format = cf_replace(format, "mm", mm);
	}
	if (format.indexOf("dd") > -1) {
		format = cf_replace(format, "dd", dd);
	}
	if (format.indexOf("hh24") > -1) {
		format = cf_replace(format, "hh24", hh24);
	}
	if (format.indexOf("hh12") > -1) {
		if (hh24 > 12) {
			hh24 = hh24 - 12;
			hh24 = cf_lpad(hh24, 2, "0");
		}
		format = cf_replace(format, "hh12", hh24);
	}
	if (format.indexOf("mi") > -1) {
		format = cf_replace(format, "mi", mi);
	}
	if (format.indexOf("ss") > -1) {
		format = cf_replace(format, "ss", ss);
	}
	return format;
}
/**
 * 선택일 기준으로 날짜를 더하거나 빼준다.
 * @param thisday : 기준일자
 * @param gubun : 년월일 구분 'Y,M,D'
 * @param i : 가감일자 [3개월전이면 3]
 * @param type : + - 여부
 * @리턴 가감된 일자
 * @예제 cf_setDate("20120101","M",3,"-"); //기준일 부터 3개월전
 */
function cf_setDate(thisday, gubun, i, type) {
	t_yy = thisday.substring(0, 4);
	t_mm = thisday.substring(4, 6);
	t_dd = thisday.substring(6, 8);
	var dminus = 0;
	var mminus = 0;
	var from;
	var date = new Date();

	date.setFullYear(t_yy);
	date.setMonth(t_mm - 1);
	date.setDate(t_dd);

	if (type == "-") {
		from = date.getDate() - Number(i);
	} else {
		from = date.getDate() + Number(i);
	}

	if (gubun == "D") {
		if (type == "-") {
			from = date.getDate() - Number(i);
		} else {
			from = date.getDate() + Number(i);
		}
		date.setDate(from);
	} else if (gubun == "M") {
		if (type == "-") {
			from = date.getMonth() - Number(i);
		} else {
			from = date.getMonth() + Number(i);
		}
		date.setMonth(from);
		date.setDate(date.getDate() + 1);
	} else if (gubun == "Y") {
		if (type == "-") {
			from = date.getFullYear() - Number(i);
			date.setDate(date.getDate() + 1);
		} else {
			from = date.getFullYear() + Number(i);
		}

		date.setYear(from);
	}
	return date.getFullYear() + "" + cf_lpad((date.getMonth() + 1), 2, '0') + "" + cf_lpad(date.getDate(), 2, '0');
}

/**
 * Cookie Set
 * @param cookieName : 쿠키 key
 * @param cookieValue : 쿠키 셋팅 value
 * @param expiredays : 기간
 * @returns : 없음
 * @예제 : cf_setCookie("TEST","Y",365)
 */
function cf_setCookie(cookieName, cookieValue, expiredays) {
	var todayDate = new Date();
	var cookieDay;
	if (expiredays == undefined) {
		cookieDay = "1";
	} else {
		cookieDay = expiredays;
	}
	todayDate.setDate(todayDate.getDate() + cookieDay);
	document.cookie = cookieName + "=" + encodeURIComponent(cookieValue) + "; path=/; expires=" + todayDate.toGMTString() + ";";
}

/**
 * Cookie Get
 * @param cookieName : 쿠키 key
 * @returns : 쿠키 value
 * @예제 : cf_getCookie("TEST")
 */
function cf_getCookie(uName) {
	var flag = document.cookie.indexOf(uName + '=');
	if (flag != -1) {
		flag += uName.length + 1;
		end = document.cookie.indexOf(';', flag);

		if (end == -1)
			end = document.cookie.length;
		return unescape(document.cookie.substring(flag, end));
	}
}

/**
 * 쿠키 삭제
 * @param cf_deleteCookie
 */
function cf_deleteCookie(cookieName) {
	var todayDate = new Date();

	// 어제 날짜를 쿠키 소멸 날짜로 설정한다.
	todayDate.setDate(todayDate.getDate() - 1);
	document.cookie = cookieName + "=; path=/; expires=" + todayDate.toGMTString() + ";";
}


/**
 * 영문대문자, 소문자 각 1자이상 포함 여부 특수문자 포함(가능) 숫자 포함
 * @param field : 체크 데이터
 * @returns "yes", "no"
 */
function cf_pass_validate(field) {
	var valid = "abcdefghijklmnopqrstuvwxyz"; // 소문자
	var valid1 = "0123456789!@#$%^&*<>?{}[]:;"; // 숫자 및 특수문자
	var valid2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 대문자
	// var valid3 = ""; // 특수문자
	var ok = "yes";
	var temp;
	var eng = 0;
	var num = 0;
	var big = 0;
	var ok_temp = "yes";
	for ( var i = 0; i < field.length; i++) {
		temp = "" + field.substring(i, i + 1);
		if (valid.indexOf(temp) == "-1") {// 영문 체크
			if (valid1.indexOf(temp) == "-1") { // 숫자체크
				if (valid2.indexOf(temp) == "-1") { // 대문자 체크
					ok = "no";
					break;
				} else {
					big++;
					ok = "yes";
				}

			} else {
				num++;
				ok = "yes";
			}
		} else {
			// 영문이 있다.
			eng++;
		}
		// alert(ok);
	}
	if (num <= 0 || eng <= 0 || big <= 0 || ok == "no") {
		ok = "no";

	}

	return ok;
}


/**
 * 사업자번호 체크
 * @param $$obj1 사업자번호 input 필드 첫번째
 * @param $$obj2 사업자번호 input 필드 두번째
 * @param $$obj3 사업자번호 input 필드 세번째
 * @returns true, false
 * @예제 if(cf_saupck($("#saupa1"),$("#saupa2"),$("#saupa3"))){ }
 */
function cf_saupck($obj1, $obj2, $obj3) {
	if (!($obj1.val()) || !($obj2.val()) || !($obj3.val())) {
		cf_alert(COMMON_SCRIPT_00037, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");
		return false;
	}

	li_value = new Array(10);
	if (cf_getByteLength($obj1.val()) == 3
			&& cf_getByteLength($obj2.val()) == 2
			&& cf_getByteLength($obj3.val()) == 5) {
		if ((cf_isNum($obj1.val())) && (cf_isNum($obj2.val()))
				&& (cf_isNum($obj3.val()))) {
			li_value[0] = (parseFloat($obj1.val().substring(0, 1)) * 1) % 10;
			li_value[1] = (parseFloat($obj1.val().substring(1, 2)) * 3) % 10;
			li_value[2] = (parseFloat($obj1.val().substring(2, 3)) * 7) % 10;
			li_value[3] = (parseFloat($obj2.val().substring(0, 1)) * 1) % 10;
			li_value[4] = (parseFloat($obj2.val().substring(1, 2)) * 3) % 10;
			li_value[5] = (parseFloat($obj3.val().substring(0, 1)) * 7) % 10;
			li_value[6] = (parseFloat($obj3.val().substring(1, 2)) * 1) % 10;
			li_value[7] = (parseFloat($obj3.val().substring(2, 3)) * 3) % 10;
			li_temp = parseFloat($obj3.val().substring(3, 4)) * 5 + "0";
			li_value[8] = parseFloat(li_temp.substring(0, 1))
					+ parseFloat(li_temp.substring(1, 2));
			li_value[9] = parseFloat($obj3.val().substring(4, 5));
			li_lastid = (10 - ((li_value[0] + li_value[1] + li_value[2]
					+ li_value[3] + li_value[4] + li_value[5] + li_value[6]
					+ li_value[7] + li_value[8]) % 10)) % 10;

			if (li_value[9] != li_lastid) {
				cf_alert(COMMON_SCRIPT_00038, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");

				return false;
			} else {
				return true;
			}
		} else {
			cf_alert(COMMON_SCRIPT_00039, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");

			return false;
		}
	} else {
		cf_alert(COMMON_SCRIPT_00039, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");

		return false;
	}

	return true;
}


/**
 * @설명 : 사업자번호 체크
 * @param $form : form $객체
 * @param corpno 사업자번호
 * @returns true, false
 * @예제 if(cf_saupck($("#form1"), "2148548751")){ }
 */
function cf_saupnock($form, corpno) {
	if (corpno.length != 10) {
		return false;
	}

	cf_putHiddenVal($form, "corp_no_temp1", corpno.substring(0, 3));
	cf_putHiddenVal($form, "corp_no_temp2", corpno.substring(3, 5));
	cf_putHiddenVal($form, "corp_no_temp3", corpno.substring(5));

	return cf_saupck($("#corp_no_temp1"), $("#corp_no_temp2"), $("#corp_no_temp3"));

}


/**
 * 법인번호 체크
 * @param $$obj1 법인번호 input 필드 첫번째
 * @param $$obj2 법인번호 input 필드 두번째
 * @returns true, false
 * @예제 if(cf_corpnock($("#saupa1"),$("#saupa2"))){ }
 */
function cf_corpnock($obj1, $obj2) {
	if (!($obj1.val()) || !($obj2.val())) {
		cf_alert(COMMON_SCRIPT_00040, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");
		return false;
	}
	li_value = new Array(13);
	if (cf_getByteLength($obj1.val()) == 6
			&& cf_getByteLength($obj2.val()) == 7) {
		if ((cf_isNum($obj1.val())) && (cf_isNum($obj2.val()))) {
			li_value[0] = parseFloat($obj1.val().substring(0, 1)) * 1;
			li_value[1] = parseFloat($obj1.val().substring(1, 2)) * 2;
			li_value[2] = parseFloat($obj1.val().substring(2, 3)) * 1;
			li_value[3] = parseFloat($obj1.val().substring(3, 4)) * 2;
			li_value[4] = parseFloat($obj1.val().substring(4, 5)) * 1;
			li_value[5] = parseFloat($obj1.val().substring(5, 6)) * 2;
			li_value[6] = parseFloat($obj2.val().substring(0, 1)) * 1;
			li_value[7] = parseFloat($obj2.val().substring(1, 2)) * 2;
			li_value[8] = parseFloat($obj2.val().substring(2, 3)) * 1;
			li_value[9] = parseFloat($obj2.val().substring(3, 4)) * 2;
			li_value[10] = parseFloat($obj2.val().substring(4, 5)) * 1;
			li_value[11] = parseFloat($obj2.val().substring(5, 6)) * 2;
			li_value[12] = parseFloat($obj2.val().substring(6, 7));
			li_lastid = 10 - ((li_value[0] + li_value[1] + li_value[2]
					+ li_value[3] + li_value[4] + li_value[5] + li_value[6]
					+ li_value[7] + li_value[8] + li_value[9] + li_value[10] + li_value[11]) % 10);
			if (li_lastid == 10)
				li_lastid = 0;
			if (li_value[12] != li_lastid) {
				cf_alert(COMMON_SCRIPT_00041, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");
				return false;
			} else
				return true;
		} else
			cf_alert(COMMON_SCRIPT_00042, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");

		return false;
	} else {
		cf_alert(COMMON_SCRIPT_00042, "cf_setFocusField(\"#" + $obj1.attr("id") + "\")");

		return false;
	}

	return true;
}


/**
 * 문자열 byte형식으로 substring
 * @param str - 문자열
 * @param slen - 시작위치
 * @param elen - 끝위치
 */
function cf_bytesubstring(str, slen, elen) {
	var l = 0;
	var rslen = 0;
	var relen = 0;
	for ( var i = 0; i < str.length; i++) {
		l += (str.charCodeAt(i) > 128) ? 2 : 1;
		if (l > slen) {
			rslen = i;
			break;
		}
	}
	l = 0;
	for ( var k = 0; k < str.length; k++) {
		l += (str.charCodeAt(k) > 128) ? 2 : 1;
		if (l > elen) {
			relen = k;
			break;
		} else if (l == elen) {
			relen = k + 1;
			break;
		}
	}
	return str.substring(rslen, relen);
}


/**
 * 전각문자 반각문자로 변환
 * @param x_char - 문자열
 */
function cf_byteChar2Convert(x_char) {

	var x_2byteChar = new String;
	var len = x_char.length;
	for ( var i = 0; i < len; i++) {
		var c = x_char.charCodeAt(i);

		if (c >= 65281 && c <= 65374 && c != 65340) {
			x_2byteChar += String.fromCharCode(c - 65248);
		} else if (c == 8217) {
			x_2byteChar += String.fromCharCode(39);
		} else if (c == 8221) {
			x_2byteChar += String.fromCharCode(34);
		} else if (c == 12288) {
			x_2byteChar += String.fromCharCode(32);
		} else if (c == 65507) {
			x_2byteChar += String.fromCharCode(126);
		} else if (c == 65509) {
			x_2byteChar += String.fromCharCode(92);
		} else if (c == 65532) {
			x_2byteChar += String.fromCharCode(32);
		} else {
			x_2byteChar += x_char.charAt(i);
		}
	}
	return x_2byteChar;
}

/**
 * 전각문자 반각문자로 변환[스페이스만 처리]
 * @param x_char - 문자열
 */
function cf_byteChar2ConvertSpace(x_char) {

	var x_2byteChar = new String;
	var len = null;
	try {
		len = x_char.length;
		for ( var i = 0; i < len; i++) {
			var c = x_char.charCodeAt(i);

			if (c == 65532) {
				x_2byteChar += String.fromCharCode(32);
			} else if (c == 12288) {
				x_2byteChar += String.fromCharCode(32);
			} else {
				x_2byteChar += x_char.charAt(i);
			}
		}
	} catch (e) {
		x_2byteChar = x_char;
	}

	return x_2byteChar;
}

/**
 * 반각문자 전각문자로 변환
 * @param x_char - 문자열
 */
function cf_Convert2ByteChar(x_char) {
	var x_2byteChar = ""; // 컨버트된 문자
	var len = x_char.length;
	for ( var i = 0; i < len; i++) {
		var c = x_char.charCodeAt(i);

		if (32 <= c && c <= 126) { // 전각으로 변환될수 있는 문자의 범위
			if (c == 32) { // 스페이스인경우 ascii 코드 32
				/* 아래와 같이 변환시 깨짐. */
	            /* x_2byteChar = unescape("%uFFFC"); */
				x_2byteChar += unescape("%u"+cf_DecToHex(12288));
			} else {
				x_2byteChar += unescape("%u" + (c + 65248).toString(16));
			}
		} else {
			x_2byteChar += x_char.substring(i, i + 1);
		}
	}
	return x_2byteChar;
}

function cf_DecToHex(dec) {
    return dec.toString(16);
}


/**
 * @설명 : 전각 반각 포함 여부 리턴. 전각이면 True, 반각이면 false
 * @param x_char - 문자열
 */
function cf_byteChar2Check(x_char) {

	var x_2byteChar = new String;
	var len = x_char.length;
	var bTrue = true;
	for ( var i = 0; i < len; i++) {
		var c = x_char.charCodeAt(i);
		if (c >= 65281 && c <= 65374 && c != 65340) {
			bTrue = false;
		} else if (c == 8217) {
			bTrue = false;
		} else if (c == 8221) {
			bTrue = false;
		} else if (c == 12288) {
			bTrue = false;
		} else if (c == 65507) {
			bTrue = false;
		} else if (c == 65509) {
			bTrue = false;
		} else if (c == 65532) {
			bTrue = false;
		} else {
		}
	}
	return bTrue;
}


/**
 * 문자열 반각으로 변환 후 byte형식으로 substring
 * @param str - 문자열
 * @param slen - 시작위치
 * @param elen - 끝위치
 */
function cf_convertByteSubstring(str, slen, elen) {
	var l = 0;
	var rslen = 0;
	var relen = 0;
	str = cf_byteChar2Convert(str);
	var rtndata = str;
	for ( var i = 0; i < str.length; i++) {
		l += (str.charCodeAt(i) > 128) ? 2 : 1;
		if (l > slen) {
			rslen = i;
			break;
		}
	}
	l = 0;
	for ( var k = 0; k < str.length; k++) {
		l += (str.charCodeAt(k) > 128) ? 2 : 1;
		if (l > elen) {
			relen = k;
			break;
		} else if (l == elen) {
			relen = k + 1;
			break;
		} else {
			relen = elen;
		}
	}
	rtndata = str.substring(rslen, relen);
	return rtndata;
}


/**
 * 전자어음용 replace 함수
 * @param src : 붙을 원본 데이터
 * @param pad : 정렬방향
 * @param len : str붙일 데이터 길이
 * @param str : 대상 데이터
 * @returns : str과 src가 붙은 데이터
 * @예제 : cf_enoteReplace(REQ_JSON_DATA.RCVR_COPNM,"R",40," ");
 */
function cf_enoteReplace(obj, pad, len, char) {
	if (obj == '') {
		obj = ' ';
	}
	if (obj != undefined && obj != '') {
		obj = cf_replace(obj, "  ", " ");
		if (Number(cf_getByteLength(obj)) < Number(len)) {
			if (cf_toUpperCase(pad) == "R") {
				obj = cf_rpadByte(obj, len, char);
				obj = enoteHalf2Full(obj);
				obj = obj.substring(0, len / 2);
			} else {
				obj = cf_lpadByte(obj, len, char);
			}
		}
		return obj;
	} else {
		return obj;
	}
}


/**
 * Left 빈자리 만큼 str 을 붙인다.
 * @param src : Right에 붙을 원본 데이터
 * @param len : str붙일 데이터 길이
 * @param str : 대상 데이터
 * @returns : str과 src가 붙은 데이터
 * @예제 : cf_lpadByte(src, len, str)
 */
function cf_lpadByte(src, len, str) {
	var retStr = "";
	var padCnt = Number(len) - cf_getByteLength(String(src));
	for ( var i = 0; i < padCnt; i++)
		retStr += String(str);
	return retStr + src;
}

/**
 * Right 빈자리 만큼 str 을 붙인다.
 * @param src : Left에 붙을 원본 데이터
 * @param len : str붙일 데이터 길이
 * @param str : 대상 데이터
 * @returns : str과 src가 붙은 데이터
 * @예제 : cf_rpadByte(src, len, str)
 */
function cf_rpadByte(src, len, str) {
	var retStr = "";
	var padCnt = Number(len) - cf_getByteLength(String(src));
	for ( var i = 0; i < padCnt; i++)
		retStr += String(str);
	return src + retStr;
}


function enoteHalf2Full(HalfVal) {
	var FullChar = [ "　", "！", "＂", "＃", "＄", "％", "＆", "＇", "（", // 33~
	"）", "＊", "＋", "，", "－", "．", "／", "０", "１", "２", // 41~
	"３", "４", "５", "６", "７", "８", "９", "：", "；", "＜", // 51~
	"＝", "＞", "？", "＠", "Ａ", "Ｂ", "Ｃ", "Ｄ", "Ｅ", "Ｆ", // 61~
	"Ｇ", "Ｈ", "Ｉ", "Ｊ", "Ｋ", "Ｌ", "Ｍ", "Ｎ", "Ｏ", "Ｐ", // 71~
	"Ｑ", "Ｒ", "Ｓ", "Ｔ", "Ｕ", "Ｖ", "Ｗ", "Ｘ", "Ｙ", "Ｚ", // 81~
	"［", "￦", "］", "＾", "＿", "｀", "Ａ", "Ｂ", "Ｃ", "Ｄ", // 91~
	"Ｅ", "Ｆ", "Ｇ", "Ｈ", "Ｉ", "Ｊ", "Ｋ", "Ｌ", "Ｍ", "Ｎ", // 101~
	"Ｏ", "Ｐ", "Ｑ", "Ｒ", "Ｓ", "Ｔ", "Ｕ", "Ｖ", "Ｗ", "Ｘ", // 111~
	"Ｙ", "Ｚ", "｛", "｜", "｝", "～" // 121~
	];
	var stFinal = "";
	var ascii;
	for (i = 0; i < HalfVal.length; i++) {
		ascii = HalfVal.charCodeAt(i);
		if ((31 < ascii && ascii < 128)) {
			stFinal += FullChar[ascii - 32];
		} else {
			stFinal += HalfVal.charAt(i);
		}
	}
	return stFinal;
}

/**
 * 반복부를 받아서 앞에 인자recObj에 add하는 기능
 * @param recObj : add할 대상 객체
 * @param recdata : add할 데이터 객체
 * @returns : 없음
 * @예제 : cf_recadd(rec, cf_reboundToRec(data.REC1,"REC1_1"));
 */
function cf_recadd(recObj, recdata) {
	if (recdata != null && recdata != undefined) {
		for ( var i = 0; i < recdata.length; i++) {
			recObj.push(recdata[i]);
		}
	}
}

/**
 * 날짜 마스킹
 * @param $this : 날짜입력 객체
 * @returns : 없음
 * @예제 : cf_resetMaskDate($("#ST_DATE"));
 */
function cf_resetMaskDate($this) {
	if ($this.val() == "")
		return;

	var mask = "";
	/* var mask = this.maskform; */
	if (8 == $this.val().length) {
		mask = "####-##-##";
	} else if (10 == $this.val().length) {
		$this.val(cf_replace($this.val(), "-", ""));
		mask = "####-##-##";
	} else {
		$this.val("");
	}

	var inputV = getOnlyNumberFormat($this.val());

	for ( var i = 0; i < mask.length; i++) {
		if (mask.substring(i, i + 1) != "#")
			inputV = inputV.substring(0, i) + mask.substring(i, i + 1) + inputV.substring(i);
	}
	$this.val(inputV);
}


/**
 * 문자열 값이 없는 경우 default 값으로 대체
 * @param str - 문자열
 * @param defVal - default 값
 */
function cf_nvlString(str, defVal) {

	var rtndata = "";
	if(cf_isEmpty(str)) {
		rtndata = defVal;
	}else{
		rtndata = str;
	}
	return rtndata; 
}

/**
 * 데이터 mask 포멧팅 - 데이터자릿수만큼 '*'를 표시
 * @param str - 문자열
 * @param intCut - 입력받은 값만큼 제외하고 '*'을 표시
 * @param option - 1: 앞에서부터 intCut 만큼 제외하고 '*'를 표시
 * 				   2: 뒤에서부터 intCut 만큼 제외하고 '*'를 표시
 * @returns 마스킹된 문자열
 * @예제 : cf_dataMask("123456789012345", 12, 1); => 123456789012***
 */
function cf_dataMask(str, intCut, option) {
	var maskValue  = "";
	var i = 0;
	
	if(intCut==undefined ||  intCut==null){
		intCut = 0;
	}
	
	if(typeof dat != "number") {
		data = cf_trim(str);
	}
	
	if (intCut > str.length || 0 == intCut) {
		for(i=0;i < str.length; i++){
			maskValue+="*";
		}	
			
	}else if (1 == option) {
		maskValue = str.substring(0,intCut);
		for(i=0;i < (str.length - intCut); i++){
			maskValue+="*";
		}
	}else{
		for(i=0;i < (str.length - intCut); i++){
			maskValue+="*";
		}
		maskValue+=str.substring(str.length-intCut);
	}
	
	return maskValue;
	
}


/**
 * 금액 콤마 추가 - 금액에 ',' 표시
 * @param str - 문자열
 * @returns ',' 추가된 문자열
 * @예제 : cf_putComma("1234567890"); => 1,234,567,890
 */
function cf_putComma(str) {
	var num = str;

	if (num < 0) {
		num *= -1;
		var minus = true;
	} else {
		var minus = false;
	}

	var dotPos = (num + "").split(".");
	var dotU = dotPos[0];
	var dotD = dotPos[1];
	var commaFlag = dotU.length % 3;

	if (commaFlag) {
		var out = dotU.substring(0, commaFlag);
		if (dotU.length > 3)
			out += ",";
	} else
		var out = "";

	for ( var i = commaFlag; i < dotU.length; i += 3) {
		out += dotU.substring(i, i + 3);
		if (i < dotU.length - 3)
			out += ",";
	}

	if (minus)
		out = "-" + out;
	if (dotD)
		return out + "." + dotD;
	else
		return out;
}


/**
 * 입력값에서 콤마 제거 - 금액에서 ',' 제거
 * @param str - ',' 추가된 문자열
 * @returns ',' 제거된 문자열
 * @예제 : cf_removeComma("1,234,567,890"); => 1234567890
 */
function cf_removeComma(str) {
   return cf_replace(str, ",", "");
}

/**
 * 
 */
function cf_getKrwMoney(str, curr){
	if(curr=="KRW"){
		if(!!str){
			if(str.length > 2){
				str = str.substring(0,str.length-2);
			}else{
				str ="0";
			}			
		}
	}
	return cf_isValidData(str)?cf_putComma(str):"0";
}

/**
 * 은행명을 반환
 * @param str - 은행코드
 * @returns 은행명
 * @예제 : cf_getBankName("011"); => "농협중앙"
 */

////예전방식주석처리 20161216
//function cf_getBankName(str) {
//
//	var strBaNm = "";
//	if(cf_isEmpty(str)) {
//		return strBaNm;
//	}else{
//		var jexAjax = jexjs.createAjaxUtil('ComGetBankName');
//		jexAjax.setting({async:false});
//		jexjs.comm.setAjaxErrTrx(true);
//		jexAjax.set('BNCD', str);
//		jexAjax.execute(function (data) {
//			if(!cf_isError(data)) {
//				strBaNm = data.BANM;
//			}
//		});
//	}
//	return strBaNm;
//
//}

function cf_getBankName(bncd, dscd)
{
	var isLangKo = ("KO" == jexjs.getLang()) ? true : false;	

	
	if(cf_isEmpty(bncd))
		return "";

	var bninfo = "";
	var bank = new Object();
	var bnnm = "";
	
	switch(dscd)
	{
	case "1":
		bninfo = _bankCdMap1[ cf_lpad(bncd, 3, "0") ];     
		break;
	case "2":
		bninfo = _bankCdMap2[ cf_lpad(bncd, 3, "0") ];   
		break;
	default:
		(cf_isEmpty(bninfo)) ? bninfo = _bankCdMap1[ cf_lpad(bncd, 3, "0") ] : null;
		(cf_isEmpty(bninfo)) ? bninfo = _bankCdMap2[ cf_lpad(bncd, 3, "0") ] : null;
		(cf_isEmpty(bninfo)) ? bninfo = _bankCdMapAll[ cf_lpad(bncd, 3, "0") ] : null;
		break;
	}

	//console.log("cf_getBankName.bnInfo:"+bninfo);
	
	if(cf_isEmpty(bninfo))
		return "";
	
	bank = JSON.parse(bninfo);
	var bank_name  = isLangKo ? bank.BANM : bank.BANK_ENSN_NM;
	(cf_isEmpty(bank)) ? bnnm = "" : bnnm = bank_name;
	
	return bnnm;
	
}

/**
 * 현재 브라우저를 알기 위한 함수 MSIE/Chrome/Firefox/Mozilla/Opera/Safari/Mac
 * 
 * @returns 브라우저 이름 or ""
 * @예제 cf_getUserBrowser();
 */
function cf_getUserBrowser(){
	if(navigator.userAgent.indexOf("MSIE") != -1){
		 return "MSIE";
	 }else if(navigator.userAgent.indexOf("Chrome") != -1){
		 return "Chrome";
	 }else if(navigator.userAgent.indexOf("Firefox") != -1){
		 return "Firefox";
	 }else  if(navigator.userAgent.indexOf("Mozilla") != -1){
		 return "Mozilla";
	 }else if(navigator.userAgent.indexOf("Opera") != -1){
		 return "Opera";
	 }else if(navigator.userAgent.indexOf("Safari") != -1){
		 return "Safari";
	 }else if(navigator.userAgent.indexOf("Mac") != -1){
		 return "Mac";
	 }else{
		 return "";
	 }
}

/**
 * @설명 Trident 버전을 가져옴
 * @returns Trident ex) 6.0
 * @예제 cf_getUserBrowserTrident();
 */
function cf_getUserBrowserTrident(){
	var _trident = navigator.userAgent.match(/Trident\/(\d.\d)/i); 
	if(null != _trident && "6.0" == _trident[1]){
		return "6.0";
	}else if(null != _trident && "5.0" == _trident[1]){
		return "5.0";
	}else if(null != _trident && "4.0" == _trident[1]){
		return "4.0";
	}else{
		return "";
	}
}


/**
 * @설명 브라우저 버전을 가져옴 -(브라우저 호환성버전 체크추가)
 * @returns version 브라우저 버전 ex) 8.0
 * @예제 cf_getBrowserVersion();
 */
function cf_getBrowserVersion(){
	var version = -1; // Return value assumes failure.
	var ua = navigator.userAgent;  
	// ua = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0;
	// Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR
	// 3.5.30729)';
	// var _ua = ua;
	var re = null;
	var ver = cf_getUserBrowser();
	
	if("MSIE" == ver){
		 re = new RegExp(ver+" ([0-9]{1,}[\.0-9]{0,})");
	}else{
		 re = new RegExp(ver+"/([0-9]{1,}[\.0-9]{0,})");
	}
	if (null != re.exec(ua)){
		version = parseFloat(RegExp.$1);
		
		/* 호환성보기가 아닌경우 */
		if("" == cf_getUserBrowserTrident()){
			if("6.0" == version){ 
				version = "6.0";
			}else if("7.0" == version){// 추후 처리 - 브라우저 버전이 7.0으로 나오지만 실제는
										// 6.0인경우 35개처리하기 (trident없음)
				version = "7.0";
			}else if("8.0" == version){
				version = "8.0";
			}else if("9.0" == version){
				version = "9.0";
			}else if("10.0" == version){
				version = "10.0";
			}
		}
		
		/* 호환성 보기인 경우 */
		
		// Trident 레이아웃 엔진 4.0버전으로 구현되었을 때
		else if("4.0" == cf_getUserBrowserTrident()){
			if("9.0" == version){// 버전9-실제9 6개 //trident4.0 일때 버전9.0==실제9.0
				version = "9.0";
			}else if("8.0" == version){// 버전8-실제6 15개 경우
				if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; Tablet PC 2.0)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB6.5; QQDownload 534; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 6.1; FDM; .NET CLR 1.1.4322; Windows NT 6.1; Trident/4.0; Mozilla/4.0; MSIE 6.0; Windows NT 5.1; SV1 ; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 6.1; .NET CLR 1.1.4322; Windows NT 6.1; Trident/4.0; Mozilla/4.0; MSIE 6.0; Windows NT 5.1; SV1 ; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; QQDownload 590; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30729; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E; OfficeLiveConnector')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; .NET CLR 3.5.21022)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; .NET CLR 1.1.4322; .NET CLR 3.5.21022; InfoPath.2)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.2; AskTbMYC-ST/5.9.1.14019)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Embedded Web Browser from: http://bsalsa.com/; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; QQWubi 87; QQDownload 665; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) )')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; FDM)')>=0 ){
					version = "6.0";
				}else if( ua.indexOf('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; FBSMTWB; QQDownload 627; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; AskTbPSI/5.9.1.14019)')>=0 ){
					version = "6.0";
				// IE8.0 600여개
				}else{
					version = "8.0";
				}
			}else if("7.0" == version){
				// 7-6 버전7.0-실제6.0인경우 5개
				if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)')>=0){
					version = "6.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729; InfoPath.3)')>=0){
					version = "6.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322)')>=0){
					version = "6.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)')>=0){
					version = "6.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; chromeframe/22.0.1229.94; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.3')>=0){
					version = "6.0";
				// 7-7 버전7.0-실제7.0으로 나오는 경우 4개
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; InfoPath.2)')>=0){
					version = "7.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB5; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)')>=0){
					version = "7.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)')>=0){
					version = "7.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SLCC2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.5.30729; Tablet PC 2.0)')>=0){
					version = "7.0";
				// 7-8 버전7.0-실제8.0인경우 160개
				}else{
					version = "8.0";
				}
			}else if("6.0" == version){// 버전6.0-실제6.0 인경우 21개
				version = "6.0";
			}	
		}
		
		else if("5.0" == cf_getUserBrowserTrident()){
			if ("9.0" == version){// 버전9.0-실제9.0 - 19개
				version = "9.0";
			}else if("8.0" == version){// 경우가 없음
			}else if("7.0" == version){
				// 버전7.0-실제8.0 - 2개
				if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; .NET4.0E) chromeframe/8.0.552.237')>=0 ){
					version = "8.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/5.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)')>=0 ){
					version = "8.0";
				// 버전7.0-실제9.0 - 9개
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 7.1; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTB5.5)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; .NET4.0C; .NET4.0E)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET4.0C; .NET4.0E; InfoPath.3)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET4.0C)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; FDM; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E; Tablet PC 2.0)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; Tablet PC 2.0; InfoPath.3; .NET4.0E)')>=0 ){
					version = "9.0";
				}else if(ua.indexOf('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; FDM; .NET4.0C; .NET4.0E; chromeframe/11.0.696.57)')>=0 ){
					version = "9.0";
				}else{
					version ="7.0";
				}
			}else if ("6.0" == version){// 경우가 없음
			}
			// 실제 7.0으로 나오는 경우는 없다.
			// 실제 6.0으로 나오는 경우는 없다.
		}
		
		else if("6.0" == cf_getUserBrowserTrident()){
			if("7.0" == version){// 버전7.0-실제7.0 2개
				version = "7.0";
			}else{// 10.0인경우
				version = "10.0";
			}
			// 실제버전 6.0인경우 없음
		}
		// alert("ua:" + _ua + " \n version : " + version + " \n typeof version:
		// " + typeof version);
		
		return version;
	// return "8.0";
	}// close if(null != re.exec(ua)){
}// close funtion


/**
 * 처음방문이세요 각 링크들
 * @param $form : form $객체
 * @param nm : hidden 객체 id/name
 * @param val : 셋팅 값
 * @param attr : attribute 이름
 * @param attrval : attribute값
 * @returns : 없음
 * @예제 : cf_firstVisitFunc('', '9');
 */
function cf_firstVisitFunc(p1,p2){
    if(p2=="1"){
        ccf_location('/jsp/mal/mnd/mnd10/MND100000_p1.jsp');
    }else if(p2=="2"){
        ccf_location('/jsp/mal/lon/lon10/LON100000_p1.jsp');
    }else if(p2=="3"){
        ccf_location('/jsp/mal/fnd/fnd10/FND100000_p1.jsp');
    }else if(p2=="4"){
        ccf_location('/jsp/crd/apl/apl00/APL000000_m1.jsp');
    }else if(p2=="5"){
        ccf_goCertCenter();
    }else if(p2=="6"){
        ccf_location('/jsp/login/login15/chkMyPc.jsp');
    }else if(p2=="7"){
        ccf_location('/jsp/fni/efs/efs00/efs0010/EFS001000_p.jsp');
    }else if(p2=="8"){
        ccf_location('/jsp/fxg/glb/glb1010/GLB101000_p.jsp');
    }else if(p2=="9"){
        cf_newWin('/3rdParty/chzero/design_html/atm/atm10/atm1010/ATM101000_m.jsp','BRANCH',780,730,'yes', '', '', 'toolbar=no, menubar=no, location=yes, scrollbars=no, status=no, resizable=no');
    }else if(p2=="10"){
        window.open('/jsp/demo/main.jsp','productNEvent3_0','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=854,height=735,top=0,left=0');
    }else if(p2=="11"){
        ccf_location('/jsp/ibs/mya/mya10/mya1010/mya101010/MYA101010_p.jsp?gnb=&menu_url=MYA401000_p.jsp');
    }else if(p2=="12"){
        ccf_location('/jsp/ibs/trn/trn10/trn1010/TRN101000_i.jsp?gnb=');
    }else if(p2=="13"){
        ccf_location('/jsp/crd/mcr/mcr15/mcr1520/MCR152010_p.jsp?gnb=');
    }else if(p2=="14"){
        ccf_location('/jsp/crd/fsr/fsr10/fsr1010/FSR101010_i.jsp?gnb=');
    }else if(p2=="15"){
        ccf_location('/jsp/ibs/mya/mya25/mya2515/MYA251510_i.jsp?gnb=');
    }else if(p2=="16"){
    	cf_location("ComCertMdbl0100.act");
    }else if(p2=="17"){
    	cf_location("ComIniqSelf0100.act");
    }else if(p2=="18"){
    	cf_popup2("ComStplCnts0100p.act");
    }else if(p2=="19"){
    	cf_location("CusIvinCnts0100.act");
    }else if(p2=="20"){
    	cf_location("CusPdbrCnts0100.act");
    }else if(p2=="21"){
    	cf_location("MndPtpdMain0100.act");
    }else if(p2=="22"){
        ccf_location('/jsp/ibs/tax/tax15/tax1510/tax151010/TAX151010_i.jsp?gnb=');
    }else if(p2=="23"){
        ccf_location('/jsp/css/onc/onc10/onc1010/ONC101000_i1.jsp');
    }else if(p2=="24"){
    	cf_location("MndTrimGnrl0100.act");
    }else if(p2=="25"){
    	cf_popup("ComItbkCnts0100p.act");
    }else if(p2=="26"){
    	cf_popup("ComItbkCnts0200p.act");
    }else if(p2=="27"){
        ccf_location('/jsp/crd/mcr/mcr15/mcr1520/MCR152010_p.jsp?gnb=');
    }else if(p2=="28"){
        ccf_location('/jsp/crd/mcr/mcr15/mcr1510/MCR151045_p.jsp?gnb=');
    }else if(p2=="29"){
        ccf_location('/jsp/crd/mcr/mcr10/mcr1010/MCR101015_p.jsp?gnb=');
    }else if(p2=="30"){
        cf_newWin('/jsp/mal/cal/cal10/cal1010/cal101010/CAL101010_u1.jsp','CALCULATOR',780,630,'yes');
    }else if(p2=="31"){
        cf_newWin('/jsp/mal/cal/cal10/cal1010/cal101010/CAL101010_u_2.jsp','CALCULATOR',780,630,'yes');
    }else if(p2=="32"){
        cf_newWin('/jsp/mal/cal/cal10/cal1010/cal101010/CAL101010_u_5.jsp','CALCULATOR',780,630,'yes');
    }else if(p2=="33"){
    	cf_popLayer(680,400,'/jsp/mal/cal/cal30/cal3010/CAL301000_u.jsp', true);
    }else if(p2=="34"){
    	cf_popLayer(680,400,'/jsp/mal/cal/cal35/cal3510/CAL351000_u.jsp', true);
    }else if(p2=="35"){
    	cf_popLayer(680,400,'/jsp/mal/cal/cal30/cal3020/CAL302000_u.jsp', true);
    }else if(p2=="36"){
    	cf_newWin('/jsp/mal/fnd/fnd15/fnd1510/FND151000_u5.jsp','STDPR_RTRN',792,560,true);
    }else if(p2=="37"){
    	cf_popLayer(680,400,'/jsp/mal/cal/cal30/cal3020/CAL302000_u.jsp', true);
    }else if(p2=="38"){
        ccf_location('/jsp/crd/mcr/mcr10/mcr1010/MCR101015_p.jsp');
    }else if(p2=="39"){
        cf_newWin('/3rdParty/chzero/design_html/atm/atm10/atm1010/ATM101000_m.jsp','CALCULATOR',780,630,'yes');
    }else if(p2=="40"){
        ccf_location('/jsp/ras/ras25/ras2510/RAS251000_p.jsp');
    }else if(p2=="41"){
        ccf_location('/jsp/prv/PRV300000_i.jsp');
    }

    if(p1.toUpperCase()=="TAB_SUB_1_1"){
        ccf_location('/jsp/ibs/cer/cer10/CER101000_i.jsp');
    }else if(p1.toUpperCase()=="TAB_SUB_1_2"){
        ccf_location('/jsp/ibs/cer/cer15/CER151000_i.jsp');
    }else if(p1.toUpperCase()=="TAB_SUB_3_1"){
        ccf_location('/jsp/prv/prv100000_i.jsp');
    }
}

/**
 *  공통 일반 location
 * @param url - url정보
 * @returns : 없음
 * @예제 : cf_location("/SMP001001i.act");
 */
/*function cf_location(url, procLogin){
	
	// CATI: DB로 연결. 메뉴 SEQ 받아서 이동하기 위해 Ajax 사용.
	// 현재 DB연결 없으므로 바로 이동
	
	var menuUrl = "";
	var jexAjax = jex.createAjaxUtil("FWK001025v1");
	jexAjax.set("MENU_URL", url);
	jexAjax.setAsync(false);
	jexAjax.execute(function(data){
		if(!cf_isEmpty(data.MENU_C_SQNO)){
			ccf_menulink( data.MENU_C_SQNO, true ,procLogin);
		}else{
			location.href=url;
		}
	});
	
	location.href = url;
}*/

/**
 *  공인인증서 관리창 실행
 * @param : 없음
 * @returns : 없음
 * @예제 : cf_manageCert();
 */
function cf_manageCert() {
	Delfino.manageCertificate();
}

/**
 *  공인인증서 관리창 실행
 * @param : 없음
 * @returns : 없음
 * @예제 : cf_manageCert();
 */
function cf_searcdUserId($frm, otherYn) {
	
	var jexAjax = jexjs.createAjaxUtil('CerComIdSrch');
	jexjs.comm.setAjaxErrTrx(true);
	
	jexAjax.set("RRNO", 	$frm.find("#RRNO").val());
	jexAjax.set("RRNO1", 	$frm.find("#RRNO1").val());
	jexAjax.set("RBNO1", 	$frm.find("#RBNO1").val());
	jexAjax.set("RBNO2", 	$frm.find("#RBNO2").val());
	jexAjax.set("RBNO3", 	$frm.find("#RBNO3").val());
	jexAjax.set("ACNO", 	$frm.find("#ACNO").val());
	jexAjax.set("OTHER_YN",	otherYn);
	
	if(cf_isEmpty($frm.find("#RRNO1").val())) {
		if(otherYn == "Y") {
			cf_setSecuKey( jexAjax, $frm, "ACNT_PWD" ); 
		}else{
			cf_setSecuKey( jexAjax, $frm, "RRNO|ACNT_PWD" ); 
		}
	}else{
		cf_setSecuKey( jexAjax, $frm, "RRNO2|ACNT_PWD" ); 
	}
	
	jexAjax.execute(function (data) {
		if(cf_isError(data)){
			var errCode = cf_getErrorCode(data);
    		var errMsg  = cf_getErrorMsg(data);
    		cf_alert("["+errCode+"] " + errMsg);
    		return false;

		}else{
			cf_alert(jexComMl("common_J0036","고객님의 아이디는 #{USER_ID} 입니다.", {"USER_ID":data.USER_ID}) );
		}
		
	});
}



/*********************************************************************************************************
 ********************************* 아래부터 사용여부 확인 후 수정 및 가이드 필요*******************************
 *********************************************************************************************************/


/**
 * 팝업창 띄우기(레이어 형태) LOCATION
 * @param width : 넓이
 * @param height : 높이
 * @param divname : div명
 * @param src : 메세지 소스파일 경로+파일명
 * @returns : 없음
 * @예제 : cf_popLayer(width, height,name, src) 레이어를 직접 생성한다. proDiv
 */
function cf_popLayer(width, height, divname, src) {
	cf_renewLoginSession(); // 세션자동연장
	cf_resetAferFn(); // 처리후 함수 초기화
	if ($("#" + divname).length == 0) {
		$("body").append(
				"<div id=\"" + divname + "\" style=\"display:none\"></div>");
	}
	if (width == null || width == "")
		width = 1;
	if (height == null || height == "")
		height = 1;
	var common_iframe = '<iframe id="ifrm_' + divname + '" title="내용없음" name="ifrm_'
			+ divname + '" src="' + src + '" width="' + width + '" height="'
			+ height
			+ '" border="0" frameBorder="0" frameSpacing="0" scrolling="no">';
	common_iframe += '</iframe>';
	var obj = $("#" + divname + "");
	obj.attr("width", width + 'px');
	obj.attr("height", height + 'px');
	obj.html("");
	obj.attr("style", "display:none");
	obj.text(common_iframe);
	$.openIfrmPopupLayer({
		name : divname,
		target : divname
	});
}

/**
 * 팝업창 띄우기(레이어 형태) [submit 처리]
 * @param form : form객체
 * @param width : 넓이
 * @param height : 높이
 * @param divname : div명
 * @param src : 메세지 소스파일 경로+파일명
 * @param isinputjson : JSON데이터 만들지 여부
 * @returns : 없음
 * @예제 : cf_popLayerSubmit($("#form1"), width, height,name, src) 레이어를 직접 생성한다. proDiv
 */
function cf_popLayerSubmit($form, width, height, divname, src,isinputjson) {
	//cf_renewLoginSession();	// 세션 자동연장
	
	//cf_resetAferFn();	// 처리후 함수 초기화
	
    if($("#"+divname).length==0){
        $("body").append("<div id=\""+divname+"\" style=\"display:none\"></div>");
    }
    if(width == null || width == "") {
    	width = 1;
    }
    if(height == null || height == ""){
    	height = 1;
    }
    if((isinputjson==null || isinputjson==undefined || isinputjson=="") && isinputjson!=false){
    	isinputjson = true;
    }
    var common_iframe = '<iframe id="ifrm_'+divname+'" name="ifrm_'+divname+'" src="" width="' + width + '" height="' + height + '" border="0" frameBorder="0" frameSpacing="0" title="내용없음" scrolling="no">';
    common_iframe += '</iframe>';
    var obj = $("#"+divname+"");
    obj.attr("width",width+'px');
    obj.attr("height",height+'px');
    obj.html("");
    obj.attr("style","display:none");
    obj.text(common_iframe);
    $.openIfrmPopupLayer({ name: divname, target: divname });
    $form.attr("target","ifrm_"+divname);
    $form.attr("action",src);
    $form.attr("method","post");
    if(isinputjson==true){
    	cf_inputToJson($form);
    }
    $form.submit();
    $form.attr("target","_self");
}


/**
 * 바닥페이지의 내용그대로를 POPUP을 띄워 보여줍니다.
 * @param form : form객체
 * @param width : 넓이
 * @param height : 높이
 * @param divname : div명
 * @param src : 메세지 소스파일 경로+파일명
 * @param isinputjson : JSON데이터 만들지 여부
 * @returns : 없음
 */
function cf_popLayerSelfSubmit($form, width, height, divname, src,isinputjson) {
	_SELF_POPUP_SVCID_ = divname;
	cf_putHiddenVal($form, "isSelf", "Y");
	// allowtransparency="true"
	cf_popLayerSubmit($form, width, height, divname, src,isinputjson);
	$('iframe[id^="ifrm_"]').attr("allowTransparency",true);
	$("#isSelf").val("N");
}

/**
 * DIV ID clear
 * @param delim : data
 * @returns : 없음
 * @예제 : cf_clearId("AAAA|BBBBB|CCCC|DDDDD")
 */
function cf_clearId(delim) {
	if (delim == undefined || cf_trim(delim) == "") {
		return;
	}
	var splitdata = delim.split("|");
	for ( var i = 0; i < splitdata.length; i++) {
		$("#" + splitdata[i]).html("");
	}
}


/**
 * object(태그)의 값을 지우는 함수
 * @param $startObject 기준이 되는 object. startObject의 하위 object들의 값을 지움
 * @param $delObject data를 삭제할 object 명
 * @return 없음
 * @예제 cf_del_notValueObject($("body"), $(".AAA")); body 태그 하위에 있는 AAA class 의 값을 모두 지움
 */

function cf_del_notValueObject($startObject, $delObject) {
	$startObject.find($delObject).each(function(index) {
		var tag = $(this)[0];
		var tagname = tag.tagName.toLowerCase();
		if (tagname == "input" || tagname == "textarea") {
			$(this).val("");
		} else if (tagname == "select") {
			alert(COMMON_SCRIPT_00036);
		} else {
			$(this).text("");
		}
	});
}

var com_zoomRate 	= 20;
var com_maxRate 	= 200;
var com_minRate 	= 100;
var com_curRate 	= 100;
var com_fSize 		= 12;

/**
 * 글자크기 크게/작게
 * @param how in/out/def
 * @returns 없음
 * @예제 cf_zoomInOut("in")
 */
function cf_zoomInOut(how) {

	var bIE = false;
	if (bIE
			&& (((how == "in") && (com_curRate >= com_maxRate)) || ((how == "out") && (com_curRate <= com_minRate)))) {
		return;
	}
	if (how == "in") {
		if (bIE) {
			com_curRate = com_curRate + com_zoomRate;
			document.body.style.zoom = com_curRate + '%';
		} else {
			cf_scaleFont(+1);
		}
	} else if (how == "def") {
		if (bIE) {
			document.body.style.zoom = 1;
			com_curRate = 100;
		} else {
			cf_scaleFont(0);
		}
	} else {
		if (bIE) {
			com_curRate = com_curRate + (-1) * com_zoomRate;
			document.body.style.zoom = com_curRate + '%';
		} else {
			cf_scaleFont(-1);
		}
	}
}

/**
 * 글자크기 조절
 * @param n : 글자 크게 또는 작게 수치
 * @returns 없음
 * @예제
 */
function cf_scaleFont(n) {
	if (n == 0)
		com_fSize = 12;
	else
		com_fSize = com_fSize + n;
	if (com_fSize > 14) {
		com_fSize = 14;
		return;
	}
	if (com_fSize < 12) {
		com_fSize = 12;
		return;
	}
	var objTh = document.getElementsByTagName("th");
	var objTd = document.getElementsByTagName("td");
	var objSpan = document.getElementsByTagName("span");
	var objA = document.getElementsByTagName("a");
	var objP = document.getElementsByTagName("p");
	var objDl = document.getElementsByTagName("dl");
	var objUl = document.getElementsByTagName("ul");

	for (i = 0; i < objTh.length; i++) {
		if (objTh[i].notzoom == null || objTh[i].notzoom == undefined) {
			objTh[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objTh[i].style.lineHeight = "1.5";
		}
	}
	for (i = 0; i < objTd.length; i++) {
		if (objTd[i].notzoom == null || objTd[i].notzoom == undefined) {
			objTd[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objTd[i].style.lineHeight = "1.5";
		}
	}
	for (i = 0; i < objSpan.length; i++) {
		if (objSpan[i].notzoom == null || objSpan[i].notzoom == undefined) {
			objSpan[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objSpan[i].style.lineHeight = "1.5";
		}
	}
	for (i = 0; i < objA.length; i++) {
		if (objA[i].notzoom == null || objA[i].notzoom == undefined) {
			objA[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objA[i].style.lineHeight = "1.5";
		}
	}
	for (i = 0; i < objP.length; i++) {
		if (objP[i].notzoom == null || objP[i].notzoom == undefined) {
			objP[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objP[i].style.lineHeight = "1.5";
		}

	}
	for (i = 0; i < objDl.length; i++) {
		if (objDl[i].notzoom == null || objDl[i].notzoom == undefined) {
			objDl[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objDl[i].style.lineHeight = "1.5";
		}
	}
	for (i = 0; i < objUl.length; i++) {
		if (objUl[i].notzoom == null || objUl[i].notzoom == undefined) {
			objUl[i].style.fontSize = com_fSize + "px";
			if (com_fSize > 15)
				objUl[i].style.lineHeight = "1.5";
		}
	}
}


/**
 * $btn을 클릭했을때 $btn을 기준으로 특정 layer(특정div영역)의 위치를 변경 할 수 있습니다.
 * @param $btn layer위치의 기준이 되는 버튼
 * @param $layer 화면에 보여줄 영역
 * @parma position left,right,top,bottom을 사용하여 $btn의 왼쪽, 오른쪽, 위, 아래에 layer가 오도록 설정
 * @parma xpos 설정된 레이어에 추가로 x값을 - + 할수 있다 +는 기호표시 하지 않음.
 * @parma ypos 설정된 레이어에 추가로 y값을 - + 할수 있다 +는 기호표시 하지 않음.
 * @예제 $("#A1").click(function(){ cf_moveLayer($(this),$("#SELECT_LAYER"), "left"); });
 */
var __LAYER_ID = "";
function cf_moveLayer($btn, $layer, position, xpos, ypos) {

	if (xpos == null || xpos == undefined) {
		xpos = 0;
	}

	if (ypos == null || ypos == undefined) {
		ypos = 0;
	}

	if (__LAYER_ID != $btn.attr("id")) {
		var layerWidth = $layer.width();
		var layerHeight = $layer.height();
		var btnWidth = $btn.width();
		var btnHeight = $btn.height();
		var rleft = 0;
		var rtop = 0;

		var scrOfX = 0, scrOfY = 0;
		if (typeof (window.pageYOffset) == 'number') {
			// Netscape compliant
			scrOfY = window.pageYOffset;
			scrOfX = window.pageXOffset;
		} else if (document.body
				&& (document.body.scrollLeft || document.body.scrollTop)) {
			// DOM compliant
			scrOfY = document.body.scrollTop;
			scrOfX = document.body.scrollLeft;
		} else if (document.documentElement
				&& (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
			// IE6 standards compliant mode
			scrOfY = document.documentElement.scrollTop;
			scrOfX = document.documentElement.scrollLeft;
		}

		if (position != undefined && position != null && position != "") {
			if (position == "left") {
				rleft = (window.event.clientX - layerWidth);
				rtop = window.event.clientY + scrOfY;
			} else if (position == "right") {
				rleft = (window.event.clientX + btnWidth);
				rtop = window.event.clientY + scrOfY;
			} else if (position == "top") {
				rleft = (window.event.clientX + (Math.round(btnWidth / 2)) - (Math.round(layerWidth / 2)));
				rtop = ((window.event.clientY + scrOfY) - layerHeight);
			} else if (position == "bottom") {
				rleft = (window.event.clientX + (Math.round(btnWidth / 2)) - (Math.round(layerWidth / 2)));
				rtop = ((window.event.clientY + scrOfY) + btnHeight);
			}
			$layer.offset({
				top : rtop,
				left : rleft
			});
		}

		$layer.offset({
			top : rtop,
			left : rleft
		});
		$layer.show();
		__LAYER_ID = $btn.attr("id");
	} else {
		$layer.hide();
		__LAYER_ID = "";
	}

}

/**
 * Move Layer의 닫기버튼
 */
function cf_moveLayerClose() {
	__LAYER_ID = "";
}

/**
 * 이체금액에 이체금액버튼의 금액만큼 더해줌
 * @param $form 폼객체
 * @param trnAmtFieldName 금액을 입력받는 태그의 name
 * @param trnAmtBtn 이체금액버튼의 금액
 * @예제 cf_addTrnAmtBtn($("#form1"),"SMP_TRN_AMT", 1000*10000);
 */
function cf_addTrnAmtBtn($form, trnAmtFieldName, trnAmtBtn) {
	cf_putHiddenVal($("#trnAmtForm"), "TYPE", "AMT");
	cf_putHiddenVal($("#trnAmtForm"), "TRN_AMT_FIELD_NAME", trnAmtFieldName);
	cf_putHiddenVal($("#trnAmtForm"), "TRN_AMT_BTN", trnAmtBtn);

	var orgTrnAmt = "";
	orgTrnAmt = $form.find('input[name="' + trnAmtFieldName + '"]').val();
	orgTrnAmt = getOnlyNumberFormat(eval("document.form1." + trnAmtFieldName).value);
	cf_putHiddenVal($("#trnAmtForm"), "ORG_TRN_AMT", orgTrnAmt);
	$("#trnAmtForm").attr("action", "FWK004001r.act");
	$("#trnAmtForm").attr("target", "comprcIframe");
	$("#trnAmtForm").attr("method", "post");
	$("#trnAmtForm").submit();
}

/**
 * e2e 적용된 필드의 값을 가져올 수 있음
 * @param $form 폼객체
 * @param fieldName e2e 적용하는 필드 name
 * @param fieldValue e2e 적용하는 필드의 값
 * @예제 cf_setE2eFieldData($("#form1"),"SMP_IN_ACCT", "0031111111111")
 */
function cf_setE2eFieldData($form, fieldName, fieldValue) {
	cf_putHiddenVal($("#trnAmtForm"), "TYPE", "NOMAL");
	cf_putHiddenVal($("#trnAmtForm"), "FIELD_NAME", fieldName);
	cf_putHiddenVal($("#trnAmtForm"), "FIELD_VALUE", fieldValue);

	$("#trnAmtForm").attr("action", "FWK004001r.act");
	$("#trnAmtForm").attr("target", "comprcIframe");
	$("#trnAmtForm").attr("method", "post");
	$("#trnAmtForm").submit();
}

/**
 * 공통 msg처리시 type가져오는 함수
 * @param str - 내용 메세지
 * @returns : 325,425,525.
 */
function cf_msgLengthCheck(str) {
	var splitData = cf_replace(
			cf_replace(cf_replace(str, " ", "").toLowerCase(), "<br/>", "|"), "<br>", "|").split("|");
	var maxLength = 0;
	for ( var i = 0; i < splitData.length; i++) {
		if (cf_getByteLength(splitData[i]) > maxLength) {
			maxLength = cf_getByteLength(splitData[i]);
		}
	}

	if (maxLength > 0 && maxLength <= 40) {
		return "325";
	} else if (maxLength > 40 && maxLength <= 50) {
		return "425";
	} else {
		return "525";
	}
}


/**
 * 그리드 하단 추가 저장 데이터 설정
 * @param jsonData json형식의 반복부 리스트
 * @예제 cf_setGridFooterData(jsonData);
 */
function cf_setGridFooterData(jsonData) {
	jgridFooterData = [];
	jgridFooterData = jsonData;
}

/**
 * radiobox selected 값 반환.
 * 함수 : cf_getRadioValue(input)
 * @param input : input (radio object)
 */
function cf_getRadioValue(Input)
{
    var reData = "";
    if (Input.length > 1) {
        for (var inx = 0; inx < Input.length; inx++) {
            var cutData = "";
            if (Input[inx].checked) {
                cutData = Input[inx].value.split("|");
                reData += cutData[0];
            }
        }
    } else {
        var cutData = "";
        if (Input.checked){
            cutData = Input.value.split("|");
            reData = cutData[0];
        }
    }

    return reData;
}

/**
 * obj 보여줌.
 * 함수 : cf_showObj(objId)
 * @param objId : object
 */
function cf_showObj(objId)
{
    document.getElementById(objId).style.display='';
}

/**
 * obj 숨김.
 * 함수 : cf_hiddenObj(objId)
 * @param objId : object
 */
function cf_hiddenObj(objId)
{
    document.getElementById(objId).style.display='none';
}

/**
 * obj 숨김.
 * 함수 : cf_getFormToJson(formId)
 * @param objId : object
 */
function cf_getFormToJson(frmId){
	
	var jsonData = {};
	var jsonArray = $('#'+frmId).serializeArray();
	for(var i=0; i<jsonArray.length; i++) {
		jsonData[jsonArray[i].name] = jsonArray[i].value;		
	}
	return jsonData;
}


/**
 * divId 프린트 할 영역 
 * scroollYn true 스크롤이 있으면 스크롤 펼쳐서 인쇄 
 * @param divId
 * @param scrollYn
 */
function cf_printMade(divId ,scrollYn, isPop){
	var obj = {};
	if(!!divId){obj.elementid = "#"+divId;}
	if(!!scrollYn){obj.scroll = scrollYn;}
	if(!!isPop){obj.popup = isPop;}	
	
	//다국어처리..
	var prtLang = "1"  ; // 1:한국어, 0:영어
	if(jexjs.getLang() == "EN"){  // KO, EN
		prtLang = "0"  ; 
	}
	obj.language = prtLang;	
	
	
	PTMPrintWebPage(obj);
}


/**
 * 약관 인쇄시 아코디언 펼침
 * @param tarGetArea
 * @param obj
 */
function cf_printStpl(tarGetArea,obj){
	if(!$(obj).parent().parent().parent().parent().parent().hasClass("on")){
		$(obj).parent().parent().parent().parent().parent().find('.accordion').trigger('click');	
	}
	cf_printMade(tarGetArea,true);
}


/**
 * 설명 : 이메일 주소체크
 * 예제 : cf_chkEmail(str)
 * @param str : 메일주소값
 * 리턴 : true, false
 */
function cf_chkEmail(str)
{
    if(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(str)) { return false; }
    else {  return true; }
}

/**
 * JSONarray SORT 함수
 * @param obj JSONarray
 * @param col 소트 컬럼(asc만됨)
 */
function cf_jsonSort(obj, col) {
	obj.sort(function(a,b){
		return parseInt(a[col]) - parseInt(b[col]);
	});
}

/**
 * 사용하지 마세요. TO-BE에서는 없어지는 함수임
 * 
 */
function ccf_alert(msg, formname, focus, func, width, height, isclosefunc, ajaxerr, locale) {
	cf_alert(msg);
}

/**
 * 설명 : 새창띄우는 함수
 * 예제 : cf_newWin("test.jsp", "newWin", 400, 300, 'yes','타 사이트로 이동합니다.')
 * @param url : URL경로
 * @param winName : 팝업NAME
 * @param sizeW : 넓이
 * @param sizeH : 높이
 * @param scroll : 스크롤사용여부
 * @param msg : alert 메세지 사용
 * @param isblank : Y이면 새창으로 뜬다 팝업창 아님
 */
function cf_newWin(url, winName, sizeW, sizeH, scroll, msg, isblank, forceOpt){
	
    var isnopop = false;
    if(msg==null || msg==undefined || msg ==""){
       if(url.indexOf("http://")>-1 && url.indexOf("citi")==-1){
           isnopop = true;
           alert('타 사이트로 이동합니다.');
       }
    }else{
       isnopop = true;
       alert(msg);
    }
    if(isblank!=null && isblank!=undefined && isblank=="Y"){
        isnopop = true;
    }

   if(winName==null | winName == "") {
       winName = "defaultWin";
   }

   var scroll=(!scroll)? 'no' : 'yes';
   var nLeft  = screen.width/2 - sizeW/2 ;
   var nTop  = screen.height/2 - sizeH/2 ;
   var pos = 0;
   var winObj;
   opt = !!forceOpt ? forceOpt : "toolbar=no, menubar=no, location=yes, scrollbars="+scroll+", status=no, resizable=yes";
   if(!isnopop){
       winObj = window.open(url, winName, "width="+sizeW+", height="+sizeH+", left="+nLeft+", top="+nTop+", "+opt);
       winName.href=url;
   } else {
	   window.open(url, '_blank');
   }
}

/**
 * 설명 : 새창띄우는 함수(카드업무 사용)
 * 예제 : cf_newWinCard("test.jsp", "newWin", 400, 300, 'yes','타 사이트로 이동합니다.')
 * @param url : URL경로
 * @param winName : 팝업NAME
 * @param sizeW : 넓이
 * @param sizeH : 높이
 * @param scroll : 스크롤사용여부
 * @param msg : alert 메세지 사용
 * @param isblank : Y이면 새창으로 뜬다 팝업창 아님
 */
function cf_newWinCard(url, winName, sizeW, sizeH, scroll, msg, isblank, forceOpt){
	
    var isnopop = false;
    if(msg==null || msg==undefined || msg ==""){
    }else{
       isnopop = true;
       alert(msg);
    }
    if(isblank!=null && isblank!=undefined && isblank=="Y"){
        isnopop = true;
    }

   if(winName==null | winName == "") {
       winName = "defaultWin";
   }

   var nLeft  = screen.width/2 - sizeW/2 ;
   var nTop  = screen.height/2 - sizeH/2 ;
   var pos = 0;
   var winObj;
   opt = !!forceOpt ? forceOpt : "toolbar=no, menubar=no, location=yes, scrollbars=yes, status=no, resizable=yes";
   if(!isnopop){
	   if (sizeW == undefined || sizeH == undefined ) {
	       winObj = window.open(url, winName, "width="+screen.width+", height="+screen.height+", left="+nLeft+", top="+nTop+", "+opt);
	   } else {
	       winObj = window.open(url, winName, "width="+sizeW+", height="+sizeH+", left="+nLeft+", top="+nTop+", "+opt);		   
	   }
       winName.href=url;
   } else {
	   window.open(url, '_blank');
   }
}


/*
 * 카드 상품 안내 페이지 에서 외부 사이트로 링크시
 * confirm 메시지 처리 function
 * 링크 된 사이트와 운영사가 같을 경우 호출
 * @param str : 링크 사이트 명
 * @param site : 외부 사이트 URL
 */
function outLink(str,site) {
	
    var msg_param = { "OUTLINK_STR":str};
	
   var msg = jexComMl("common_J0034","한국씨티은행 홈페이지를 벗어나 \＂#{OUTLINK_STR}\＂로 연결됩니다. 한국씨티은행은 \＂#{OUTLINK_STR}\＂에 공식적으로 제공하지 않은 서비스 및 상품, 웹사이트상의 각종 정보 등에 대해 어떠한 책임도 지지 않습니다.\n\n또한, \＂#{OUTLINK_STR}\＂ 웹사이트에서는 당행의 프라이버시(Privacy) 및 개인정보보호정책이 적용되지 않으며, 고객님과 당행 사이의 제반 약정이 적용되지 않으니 웹사이트 이용시 유의하시기 바랍니다.", msg_param);

   
   var result = confirm(msg);
    if(result) {
        window.open(site);
    }
}

/**
 * 설명 : 카드 사용 유틸 전각문자로 변환
 */
function cf_Half2Full(HalfVal)
{
    var arg;
    arg = cf_myHalf2Full(HalfVal);
    return arg;
}

/**
* 설명 : 카드 사용 유틸 전각문자로 변환
*/
function cf_myHalf2Full(HalfVal)
{
  var FullChar = [
               "　", "！","＂","＃","＄","％","＆","＇","（",     //33~
        "）","＊","＋","，","－","．","／","０","１","２",      //41~
        "３","４","５","６","７","８","９","：","；","＜",      //51~
        "＝","＞","？","＠","Ａ","Ｂ","Ｃ","Ｄ","Ｅ","Ｆ",      //61~
        "Ｇ","Ｈ","Ｉ","Ｊ","Ｋ","Ｌ","Ｍ","Ｎ","Ｏ","Ｐ",      //71~
        "Ｑ","Ｒ","Ｓ","Ｔ","Ｕ","Ｖ","Ｗ","Ｘ","Ｙ","Ｚ",      //81~
        "［","￦","］","＾","＿","｀","Ａ","Ｂ","Ｃ","Ｄ",      //91~
        "Ｅ","Ｆ","Ｇ","Ｈ","Ｉ","Ｊ","Ｋ","Ｌ","Ｍ","Ｎ",      //101~
        "Ｏ","Ｐ","Ｑ","Ｒ","Ｓ","Ｔ","Ｕ","Ｖ","Ｗ","Ｘ",      //111~
        "Ｙ","Ｚ","｛","｜","｝","～"                         //121~
        ];
 var stFinal = "";
        var ascii;
        for( i = 0; i < HalfVal.length; i++)
        {
                ascii = HalfVal.charCodeAt(i);
                if( (31 < ascii && ascii < 128))
                {
                  stFinal += FullChar[ascii-32];
                }
                else
                {
                  stFinal += HalfVal.charAt(i);
                }
        }
        return stFinal;
}

/**
 * 설명 : IE 판별
 */
function compIE(){
	var agent = navigator.userAgent;
	if(agent.indexOf("MSIE 7.0") > -1 || agent.indexOf("MSIE 8.0") > - 1 || agent.indexOf("Trident 4.0") > -1)
		return false;

	if(document.documentMode && document.documentMode <= 5)
		return false;

	return true;
}

/**
 * 파일 다운로드
 * @param frm 폼
 * @param dir 파일경로
 * @param fileNm 파일명
 * @return
 */
function uf_fileDownload(frmNm, dir, fileNm, isOpen){
    var frm = eval("document."+frmNm);
    cf_putHiddenVal($("#"+frmNm), "downloadDir", dir);
    cf_putHiddenVal($("#"+frmNm), "downloadNm", fileNm);    

    if( isOpen == "Y" ){
        cf_newWin(dir.substring(dir.indexOf("/download"))+fileNm, 'FILE_DOWNLOAD', 600, 400, true);
    } else {
        frm.target  = "downloadIfr";
        frm.action  = "/jsp/common/com_download.jsp";
        ccf_formSubmit(frm);
        reset_submit();
    }
}

//cf_crdInfoPopup("test", "testsite", "http://www.naver.com")
function cf_crdInfoPopup(title, site, url) {
	var targetAct = "CrdInfoCiti9005p.act"; // 호출 act.
	var targetJs  = "crd/info/citi/CrdInfoCiti9005p.js";
	var titleNm = "";
	var siteNm = "";
	
	if(!cf_isEmpty(title)) titleNm = title;
	if(!cf_isEmpty(site)) siteNm = site;
	if(!cf_isEmpty(url)) siteUrl = url;
	
	var joj = {'TITLE_NM':titleNm, 'SITE':siteNm, 'SITE_URL':siteUrl}; // .act 파라미터(반드시 JSON 형식으로).
	
	cf_popupOpen(targetAct, joj, targetJs, null);
}

function cf_crdCdptMallPopup(title, site, url) {
	var targetAct = "CrdCdptMall9003p.act"; // 호출 act.
	var targetJs  = "crd/cdpt/mall/CrdCdptMall9003p.js";
	var titleNm = "";
	var siteNm = "";
	
	if(!cf_isEmpty(title)) titleNm = title;
	if(!cf_isEmpty(site)) siteNm = site;
	if(!cf_isEmpty(url)) siteUrl = url;
	
	var joj = {'TITLE_NM':titleNm, 'SITE':siteNm, 'SITE_URL':siteUrl}; // .act 파라미터(반드시 JSON 형식으로).
	
	cf_popupOpen(targetAct, joj, targetJs, null);
}

function cf_crdPromotionProc(data){	
	var strPromotion = "";
	var isLangKo = ("KO" == jexjs.getLang()) ? true : false;
	if(isLangKo){
		var jexAjax = jexjs.createAjaxUtil('CardLayerPopup');
		jexAjax.setting({async:false});
		jexAjax.execute(function (data) {
			strPromotion = data.PROMOTION;
			strPROCODE	 = data.CRD_PROCODE;
		});
		
		if(strPromotion != ""){
			if(strPROCODE.indexOf(strPromotion) > -1){
		        if(cf_getCookie("PromotionCook")!="1"){
		        	cf_popupOpen("CrdPromotion"+strPromotion+".act", {}, null, null);
	           }
			}    	    
		}
	}
}

function cf_PromotionPopupClose(){
    if($("#Promo_dayChk").is(":checked")){
        cf_setCookie("PromotionCook","1","1");
    } else if($("#Promo_weekChk").is(":checked")){
        cf_setCookie("PromotionCook","1","7");
    }
	common.popupClose();return false;
}

function cf_initErrAlert(data) {
	if (!cf_isEmpty(data.attribute)) {
		cf_alert("["+data.attribute._ERROR_CODE_+"]<br/>"+data.attribute._ERROR_MESSAGE_);
	}
}


function  cf_changeKO(){
	//e.preventDefault();
	$("#btn_ml_ko").hide();
	$("#btn_ml_en").show();
	//jexMl.change("KO");
	jexjs.setLang("KO");
	
	if( $("header").hasClass('post') ){
		cf_location('ComOverBank0100.act'); //post overview
	}else{
		cf_location('ComMainCnts0100.act');// pre main
	}
}

function  cf_changeEN(){
	//e.preventDefault();
	$("#btn_ml_ko").show();
	$("#btn_ml_en").hide();
	//jexMl.change("EN");
	jexjs.setLang("EN");
	 
	if( $("header").hasClass('post') ){
		cf_location('ComOverBank0100.act'); //post overview
	}else{
		cf_location('ComMainCnts0100_en.act');// pre main
	}
}

function cf_chkAge(no, age) {
	var vRtn = "";
	try {
		if ( !(no.length == 7 || no.length == 13) ) {
			return "";
		}
		
	    var vExpireBirth = Number(cf_getDateTime("mmdd")) - Number(no.substring(2,6));
	    var vAddBirthYear = 0;
	    if(vExpireBirth < 0) {
	        vAddBirthYear = -1;
	    }
	    var vLawAge = (Number(cf_getDateTime("yyyy")) - Number(cf_getFullBirthYear(no)) ) + vAddBirthYear;
	    			
		if (!cf_isEmpty(age)) {
			if (vLawAge < Number(age)) {
				return false;
		    } else {
		    	return true;
		    }
		} else {
			vRtn = vLawAge.toString();
		}
		
	} catch(e) {
		vRtn = "";
	}
	return vRtn;
}

function cf_getFullBirthYear(no) {
	var vRtn = "";
	var vFullBirthYear = "";
	try {
		if ( !(no.length == 7 || no.length == 13) ) {
			return "";
		}
		if( no.substring(6,7) == "3" || no.substring(6,7) == "4" || no.substring(6,7) == "7" || no.substring(6,7) == "8" ) {
	        vFullBirthYear = "20" + no.substring(0,2);
	    } else {
	    	vFullBirthYear = "19" + no.substring(0,2);
	    }
		if((vFullBirthYear + no.substring(2,6)) >= cf_getDateTime("yyyymmdd")){
			vFullBirthYear = "19" + no.substring(0,2);
		}
		
		vRtn = vFullBirthYear;
		
	} catch(e) {
		vRtn = "";
	}
	return vRtn;
}

function cf_addSpaceVal(val) {
	var rtnVal = "";
	if (val != undefined && val != null) {
		for (var i=0 ; i < val.length ; i++) {
			rtnVal += val[i] + " ";
		}
	}
	return rtnVal;
}

/**
 * 한글만 있는지 여부를 리턴한다 - 정규식으로 체크
 * @param val : 확인할 값
 * @returns : true, false
 * @예제 : cf_isHangul(pValue)
 */
function cf_isHangulCheck(val){
	if (cf_isEmpty(val))return false;
	
	var kor = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;
	
	for(var i=0; i < val.length; i++){
		if(!kor.test(val.substring(i, i+1))){
			return false;
		}
	}
	return true;
}