/*****************************************************************************
 * 파일명 : JHanaAjax.js
 * 작성일 : 2007. 12. 31
 * 작성자 : ork
 * 설   명 : Ajax통신을 위한 Utility js, prototype.js include 후 사용한다.
 * Dependency  : prototype.js , ext-base.js , ext-all.js
 * 메세지효과를 위하여 ExtJs 아래 정의 되어야 합니다.
 * ===========================================================================
 * 변경이력:
 * DATE				AUTHOR		DESCRIPTION
 * ---------------------------------------------------------------------------
 *              Nam,KiSeung	    HanaBank
 * 2007.12.31	Oh,Ryunkyong 	Revision
 * 2008.06.10   Oh,Ryunkyong    특정영역 Mask를 위해  Ext의 Ext.LoadMask 객체인 targetLoadingMask 변수 추가
 * 2008.09.26   오륜경           타이머 동작 시점 변경 
 * 2008.11.26   오륜경           로그아웃되었을 때 로그아웃 플래그 설정 (타이머 동작하지 않도록 설정)
 * 2009.01.09   오륜경           20090109-1 404등의 에러시에 요청 URL과 응답URL을 보여준다.   
 * 2009.03.04   오륜경           20090304 로그인 페이지를 리턴했을 경우 left 영역이 있다면 업데이트 
 * 2009.03.29   오륜경           20090329 요청시마다 로그아웃 시간을 연장한다. 
 * 2009.04.13   오륜경           20090413 transaction 을 설정했다면 마스크를 대기
 * 2009.04.16   오륜경           20090416 팝업에서 ajax 호출시 부모창 시간 리셋.
 * 2009.04.29   오륜경           20090429  404에 대한 처리는 404 페이지로 보내는 대신 msg layer로 띄워준다.  
 * 2009.05.05   오륜경           20090505 password 필드 초기화 (특정오류코드가 넘어왔을시에) 
 * 2009.05.07   오륜경           20090507 팝업에서 거래시 부모창 로그아웃 시간 연장 
 * 2009.05.07   오륜경           20090507-1 클릭했을 경우 대체 이미지로 바꾸고 이벤트를 지워준다. 취소시 원상복구
 * 2009.05.14   오륜경           20090514 innerHTML 에 응답받은 모든 텍스트를 업데이트 (strip / evelScript 하지않음)	  
 * 변경 이력은 이곳에 추가 합니다.
 *****************************************************************************/
var shttp_status_map = new Hash();
//암호화 오류 정의
/*shttp_status_map[900] = cpb_cer_mls.getST("암호화 오류|암호화 세션이 초기화 되었습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[901] = cpb_cer_mls.getST("암호화 오류|암호화된 Master Secret 이 도착하지 않았습니다. 네트워크 환경을 확인하세요.");
shttp_status_map[902] = cpb_cer_mls.getST("암호화 오류|암호화된 Master Secret 을 복호화 하는 도중 오류가 발생했습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[903] = cpb_cer_mls.getST("암호화 오류|보안 시퀀스가 존재하지 않아 페이지를 표시할 수 없습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[904] = cpb_cer_mls.getST("암호화 오류|보안 시퀀스가 일치하지 않아 페이지를 표시할 수 없습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[905] = cpb_cer_mls.getST("암호화 오류|서버에서 메시지 복호화 도중 오류가 발생했습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[906] = cpb_cer_mls.getST("암호화 오류|요청하고자 하는 데이터의 길이가 한계치를 넘어섰습니다. 파일 업로드를 시도 중이라면 용량이 작은 파일을 업로드 하세요.");
shttp_status_map[907] = cpb_cer_mls.getST("암호화 오류|메시지 복호화를 위한 Cipher-Parity 헤더가 도착하지 않았습니다. 네트워크 환경을 확인하세요.");
shttp_status_map[908] = cpb_cer_mls.getST("암호화 오류|잘못된 파라메터 입력입니다. 네트워크 환경을 확인하세요.");
shttp_status_map[909] = cpb_cer_mls.getST("암호화 오류|서버에 등록되지 않은 호스트 주소 입니다. 올바른 도메인을 사용하세요.");
shttp_status_map[910] = cpb_cer_mls.getST("암호화 오류|보안 세션과 WAS 세션의 동기화 확인에 실패했습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[911] = cpb_cer_mls.getST("암호화 오류|인증서 목록에 존재하지 않는 호스트 입니다. 올바른 도메인을 사용하세요.");

//공인인증 오류 정의
shttp_status_map[921] = cpb_cer_mls.getST("공인인증 오류|인증서 정책이 존재하지 않는 페이지 입니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[922] = cpb_cer_mls.getST("공인인증 오류|인증서 제출이 필요한 페이지 입니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[923] = cpb_cer_mls.getST("공인인증 오류|올바른 형식의 인증서가 아닙니다. X.509 표준 인증서만 사용 가능합니다.");
shttp_status_map[924] = cpb_cer_mls.getST("공인인증 오류|개인키 소유여부 확인을 위한 서명 데이터가 들어오지 않았습니다. 네트워크 환경을 확인하세요.");
shttp_status_map[925] = cpb_cer_mls.getST("공인인증 오류|개인키 소유여부 확인(서명 검증)에 실패했습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[926] = cpb_cer_mls.getST("공인인증 오류|인증서 본인 확인에 필요한 VID Random 값이 들어오지 않았습니다. 네트워크 환경을 확인하세요.");
shttp_status_map[927] = cpb_cer_mls.getST("공인인증 오류|인증서 본인 확인 기능을 제공하지 않는 인증서 입니다. 인증서를 재발급 받아 사용하십시오.");
shttp_status_map[928] = cpb_cer_mls.getST("공인인증 오류|인증서 본인 확인에 실패했습니다. 본인 주민번호(또는 사업자번호)와 일치하는 인증서만 사용 가능합니다.");
shttp_status_map[929] = cpb_cer_mls.getST("공인인증 오류|낮은 버전의 인증서는 허용하지 않습니다. 인증서를 재발급 받아 사용하십시오.");
shttp_status_map[930] = cpb_cer_mls.getST("공인인증 오류|인증서가 아직 유효하지 않습니다. 잠시 후 이용하시기 바랍니다.");
shttp_status_map[931] = cpb_cer_mls.getST("공인인증 오류|인증서가 만료되어 더 이상 사용할 수 없습니다. 인증서를 재발급 받아 사용하십시오.");
shttp_status_map[932] = cpb_cer_mls.getST("공인인증 오류|신뢰된 인증기관(CA) 에서 발급한 인증서가 아닙니다. 관리자에게 문의하세요.");
shttp_status_map[933] = cpb_cer_mls.getST("공인인증 오류|인증서 서명 검증에 실패했습니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[934] = cpb_cer_mls.getST("공인인증 오류|인증서 경로 검증에 실패했습니다. 인증서를 재발급 받아 사용하십시오.");
shttp_status_map[935] = cpb_cer_mls.getST("공인인증 오류|인증서 상호 연동 정책(OID) 에 부합하지 않는 인증서입니다.");
shttp_status_map[936] = cpb_cer_mls.getST("공인인증 오류|인증서 상호 연동 정책(OID) 검증에 실패했습니다.");
shttp_status_map[937] = cpb_cer_mls.getST("공인인증 오류|본 페이지 사용에 적합한 용도(KeyUsage)의 인증서가 아닙니다.");
shttp_status_map[938] = cpb_cer_mls.getST("공인인증 오류|인증서가 폐기되어 더 이상 사용할 수 없습니다. 인증서를 재발급 받아 사용하십시오.");
shttp_status_map[939] = cpb_cer_mls.getST("공인인증 오류|인증서가 효력정지 되어 현재는 사용할 수 없습니다. 효력 회복 후 사용 가능합니다.");
shttp_status_map[940] = cpb_cer_mls.getST("공인인증 오류|인증서 상태(폐기 여부) 확인에 실패했습니다. 관리자에게 문의하세요.");
shttp_status_map[949] = cpb_cer_mls.getST("공인인증 오류|인증서 검증 과정 중에 내부 서버 오류가 발생했습니다. 관리자에게 문의하세요.");

//전자서명 오류 정의
shttp_status_map[951] = cpb_cer_mls.getST("전자서명 오류|전자서명 데이터 제출이 필요한 페이지 입니다. 현재 브라우저를 닫고, 새로 접속하시기 바랍니다.");
shttp_status_map[952] = cpb_cer_mls.getST("전자서명 오류|클라이언트에서 보낸 전자서명 검증에 실패했습니다. 관리자에게 문의하세요.");
shttp_status_map[953] = cpb_cer_mls.getST("전자서명 오류|서버 측 전자서명에 실패했습니다. 관리자에게 문의하세요.");
shttp_status_map[954] = cpb_cer_mls.getST("전자서명 오류|전자서명 값을 저장하는 도중 오류가 발생했습니다. 관리자에게 문의하세요.");

//E2E 관련 오류
shttp_status_map[851] = cpb_cer_mls.getST("E2E 키보드 보안 오류|E2E 키보드 보안 세션이(치환 테이블)이 서로 일치하지 않습니다. 재 접속 하십시오.");
shttp_status_map[852] = cpb_cer_mls.getST("E2E 키보드 보안 오류|등록되지 않은 파트너 코드입니다.");
shttp_status_map[853] = cpb_cer_mls.getST("E2E 키보드 보안 오류|입력된 파트너 코드가 올바르지 않습니다.");
shttp_status_map[854] = cpb_cer_mls.getST("E2E 키보드 보안 오류|이 요청은 Seed 를 폐기 후에 요청할 수 있습니다.");
shttp_status_map[855] = cpb_cer_mls.getST("E2E 키보드 보안 오류|클라이언트에서 보낸 Hashed Real Seed 정보가 올바르지 않습니다.");

//기타 오류
shttp_status_map[800] = cpb_cer_mls.getST("공인인증 오류|타행/타기관 인증서 등록이 필요합니다.");
//기타 오류
shttp_status_map[801] = cpb_cer_mls.getST("공인인증 오류|제출한 공인인증서는 현재 사용하실 수 없습니다.<br />당행에서 발급 받은 공인인증서를 중복(2개이상 ID에서 사용) 등록하여 사용했던 인증서 입니다.<br />발급받은 기관에서 인증서를 재발급 받은 후에 재등록하시거나 <br />신규로 인증서를 발급 받은후에 사용하시기 바랍니다.");
//기타 오류
shttp_status_map[802] = cpb_cer_mls.getST("공인인증 오류|제출한 공인인증서는 현재 사용하실 수 없습니다.<br />타행/타기관에서 발급 받은 공인인증서를 중복(2개이상 ID에서 사용) 등록하여 사용했던 인증서 입니다.<br />발급받은 기관에서 인증서를 재발급 받은 후에 재등록하시거나 <br />신규로 인증서를 발급 받은후에 사용하시기 바랍니다.");
//999 
shttp_status_map[999] = cpb_cer_mls.getST("보안모듈 오류|보안모듈에 오류가 있을 수 있습니다. 이체거래인 경우는 반드시 [이체결과]와 [거래내역]을 확인하여 주시기 바랍니다.");

//뱅킹 내부 오류
//당행오류-인증서폐기-개인뱅킹
shttp_status_map[1001] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 폐기되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 ID/Password로 로그인 하신후 인증서를 발급 받은후에 사용하시기 바랍니다.");
//당행오류-인증서폐기-기업뱅킹
shttp_status_map[1002] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 폐기되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 ID/Password로 로그인 하신후 인증서를 발급 받은후에 사용하시기 바랍니다.");
//당행오류-인증서폐기-HanaCBS
shttp_status_map[1003] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 폐기되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 인증서를 발급 받은후에 사용하시기 바랍니다.");

//당행오류-인증서효력정지-개인뱅킹
shttp_status_map[1004] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 효력정지되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 인증서를 효력회복 하신후에 사용하시기 바랍니다.");
//당행오류-인증서효력정지-기업뱅킹
shttp_status_map[1005] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 효력정지되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 인증서를 효력회복 하신후에 사용하시기 바랍니다.");
//당행오류-인증서효력정지-HanaCBS
shttp_status_map[1006] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서는 효력정지되어 사용할 수 없는 인증서입니다. 현재 사용가능한 인증서를 제출하시거나 인증서를 효력회복 하신후에 사용하시기 바랍니다.");

shttp_status_map[1010] = cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 공인인증서는 고객원장에 등록되어 있지 않습니다. 1588-1111로 문의하여 주십시오.");

shttp_status_map[1021] = cpb_cer_mls.getST("공인인증 오류|제출하신 인증서는 개인뱅킹 고객이 아닙니다.");
shttp_status_map[1022] = cpb_cer_mls.getST("공인인증 오류|제출하신 인증서는 기업뱅킹 고객이 아닙니다.");
shttp_status_map[1023] = cpb_cer_mls.getST("공인인증 오류|제출하신 인증서는 HanaCBS 고객이 아닙니다.");

shttp_status_map[1031]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 자행 발급 공인인증서는 타행/타기관 등록을 할 수 없습니다.");
shttp_status_map[1032]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출하신 인증서와 입력한 사용자ID가 일치하지 않습니다.");
shttp_status_map[1033]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 선택한 저장매체 값이 없습니다.");
shttp_status_map[1034]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 제출한 스마트카드 시리얼번호 값이 없습니다.");
shttp_status_map[1035]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 주민(사업자)등록번호가 일치하지 않습니다. 제출하신 공인인증서가 고객님의 인증서가 맞는지 확인하시기 바랍니다.");
shttp_status_map[1036]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 사용자 ID가 일치하지 않습니다. 로그인 한 사용자 ID가 일치하지 않습니다.<br>제출하신 공인인증서가 고객님의 인증서가 맞는지 확인하시기 바랍니다.");
shttp_status_map[1037]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 로그인 세션이 없습니다. 다시 로그인 하시기 바랍니다.");
shttp_status_map[1038]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 인증서 정책 검증과정에서 오류가 발생했습니다 (인증서구분-1038)");
shttp_status_map[1039]= cpb_cer_mls.getST("공인인증 오류|죄송합니다. 인증서 정책 검증과정에서 오류가 발생했습니다 (1039)");

shttp_status_map[1040]= cpb_cer_mls.getST("공인인증 오류|당행 “HanaCBS”뱅킹에 등록된 공인인증서로   HanaCBS Light(기업뱅킹)에서 로그인을 하셨습니다. 제출하신 인증서 확인 후<br/>HanaCBS( www.hanacbs.com)으로 접속해 주시기 바랍니다.");
shttp_status_map[1041]= cpb_cer_mls.getST("공인인증 오류|당행 “HanaCBS Light(기업뱅킹)”에 등록된 공인인증서로 HanaCBS뱅킹에서 로그인을 하셨습니다. 제출하신 인증서 확인 후<br/>HanaCBS Light (http://corp.hanabank.com)로 접속해 주시기 바랍니다.");*/

/**
 * 20090505 password 필드 초기화할 에러코드
 */
var OTPCertNoFieldClearHash = new Hash();
OTPCertNoFieldClearHash['OCOM16218'] = 'OCOM16218'; // OTP 인증번호 1회 오류
OTPCertNoFieldClearHash['OCOM16219'] = 'OCOM16219'; // OTP 인증번호 2회 오류
OTPCertNoFieldClearHash['OCOM16220'] = 'OCOM16220'; // OTP 인증번호 3회 오류
OTPCertNoFieldClearHash['OCOM16221'] = 'OCOM16221'; // OTP 인증번호 4회 오류
OTPCertNoFieldClearHash['OCOM16222'] = 'OCOM16222'; // OTP 인증번호 5회 오류
OTPCertNoFieldClearHash['OCOM16223'] = 'OCOM16223'; // OTP 인증번호 6회 오류
OTPCertNoFieldClearHash['OCOM16224'] = 'OCOM16224'; // OTP 인증번호 7회 오류
OTPCertNoFieldClearHash['OCOM16225'] = 'OCOM16225'; // OTP 인증번호 8회 오류
OTPCertNoFieldClearHash['OCOM16226'] = 'OCOM16226'; // OTP 인증번호 9회 오류
OTPCertNoFieldClearHash['OCOM16227'] = 'OCOM16227'; // OTP 인증번호 오류횟수 초과
OTPCertNoFieldClearHash['BCOM15794'] = 'BCOM15794'; // OTP 입력횟수 초과
OTPCertNoFieldClearHash['BCOM16810'] = 'BCOM16810'; // OTP 인증실패

var acctNoFieldClearHash = new Hash();
acctNoFieldClearHash['OCOM02617'] = 'OCOM02617'; // 인증번호 일치 하지 않음 2번더 입력 가
acctNoFieldClearHash['OCOM02618'] = 'OCOM02618'; // 인증번호 일치 하지 않음 1번더 입력 가
acctNoFieldClearHash['OCOM06367'] = 'OCOM06367'; // 인증번호 오류회수 초과 

/**
 * Form prototype 추가 재정의 
 * @since 20090226 오륜경
 */
Form.serializeHanaElements = function(elements, getHash){
	var data = elements.inject({}, function(result, element){
		var reDash = /-/g;
		var reAcct = /,/g;
		var lTag   = /</g; 
		var rTag   = />/g;
		
		if (!element.disabled && element.name) {
//			var key = element.name, value = $(element).getValue();
			var key = element.name;
			var eleId = element.id;
		    var value = '';
			try {
				value = $(element).getValue();
			}catch(e) {
				if(element.value) {
						value = element.value;
				}
			} // 특정OS/BW에서 콤보객체의 getValue() 오류발생

			if (value!=null && value !=undefined) {
				//var pClassName = $j("#"+eleId).parent().attr("class");
//				var className = element.niceClass || element.className;
				var className = $j(element).data("niceClass") || $j(element).data("class");
				if (className != undefined && className != null) {
					if (className.indexOf("bizno") != -1 || className.indexOf("cal") != -1) {
						value = value.replace(reDash, "");
					}
					else 
						if (className.indexOf("acct") != -1 || className.indexOf("acctdollar") != -1) {
							value = value.replace(reAcct, "");
						}
				}
				// span class 찾기 추가
				/*if (pClassName != null && pClassName !=undefined) {
					if (pClassName.indexOf("bizno") != -1 || pClassName.indexOf("cal") != -1) {
						value = value.replace(reDash, "");
					}
					else 
						if (pClassName.indexOf("acct") != -1 || pClassName.indexOf("acctdollar") != -1) {
							value = value.replace(reAcct, "");
						}
				}*/
				
				// 20090407 글로벌 validation을 사용하지 않고 manual 속성을 추가했을 경우
				var stripCommas = element.stripCommas; 
				if (stripCommas !=undefined && stripCommas !=null) {
					if (stripCommas == "true") {
						value = value.replace(reAcct, "");
					}
				}
				
				value = value.replace(lTag, "&lt;");
				value = value.replace(rTag, "&gt;");
				
				if (key in result) {
					if (result[key].constructor != Array) 
						result[key] = [result[key]];
					result[key].push(value.stripScripts());
				}
				else 
					result[key] = value.stripScripts();
                    
/*                // 20090506 E2E 보안필드 존재하면 
                var e2eFieldName = element.submitName || key;
                if (e2eFieldName.indexOf('_E2E') != -1){
                    result['_e2e_'] = true;
                }  */
			}
		}
		return result;
	});
	return getHash ? data : Hash.toQueryString(data);
}
/**
 * @since 20090226 오륜경 
 */
Form.serializeHanaData = function (form, getHash){
	return Form.serializeHanaElements(Form.getElements(form), getHash);
}

/**
 * @since 20090304 오륜경 
 */
var loginFormURLs = ['requireLogin','requireEngLogin'];

var clearGuid = function(){
	var sf = findHanaSecureFrame();
	// 로그인 GUID 초기화 
	if ((typeof sf == "undefined") || (sf == null)) {
		// ignored..
	}
	else {
		if (sf.loginGuid) {
			sf.loginGuid = "";
		}
	}
}			

//전자서명 데이터생성
var getSignedData = function(form, eraseObjNames)
{
	//alert("from="+form);
	if(form == null)
		return "";

	var strResult = "";

	var name = "";
	var value = "";
	var sel=0;
	var eObjs;

	if(typeof(eraseObjNames)=="string")
		eObjs = eraseObjNames.split(",");
	else
		eObjs = eraseObjNames;

	var strResult = "";
	var $form = $j(form);
	$form.find("input[data-signid], input[name='ebondData']").each(function(idx, el) {
		
		var _signid = $j(el).data("signid");
		var _val = $j(el).val();
		var _id = $j(el).attr("id");
		var _name = $j(el).attr("name");
		var _type = $j(el).attr("type");
		element = form.elements[idx];
		
		if(_name == null || _name == '' || typeof _name == 'undefined') {
		    return;			
		} else {

			// 기업결재 전자서명일 경우엔 value만 넣는다.
			if(_name == "ebondData") {
			    strResult += _val;
			    return;
			}
			
		}

		if(_signid == null || _signid == '' || typeof _signid == 'undefined') {
			return;
		}

		if(_name=="filedata") return;

		// 20090413 전사암호화 필드 제외 (아래에 제외한 필드에 포함되지만..)
		if(_name=="password") return;
		if(_name=="pw") return;
        if(_name=="acctPw") return;
		if(_name=="paymAcctPw") return;
		if(_name=="wdrwAcctPw") return;
		if(_name=="ognTrscWdrwAcctPw") return;
		if(_name=="updBfPw") return;
		if(_name=="updAfPw") return;
		if(_name=="secPwd1_card") return;
		if(_name=="secPwd2_card") return;

		//////////////////////////
		//add to smgrl 2004/07/16
		if(eObjs!=null){

			for(var j=0; j<eObjs.length; j++){
				if(_name == eObjs[j]){
					return;
				}
			}

		}

		//제외한 컨트롤 지정 (AS-IS 남기승)
		if ( ((_type == "button") || (_type == "reset") || (_type == "submit") || (_type == "password"))) return;
		if ( ((_type == "radio") || (_type == "checkbox")) && (el.checked!=true) ) return;
		if ( _id == "*" ) return;

		if (_type == "select-one") {
			var sel = el.selectedIndex;
			if(sel < 0)
				return;
			else
				_val = el.options[sel].value;
		}

		//add to smgrl 2004/06/29
		if(_type == "select-multiple") {

			for(var j=0;j < el.options.length;j++){
				if(el.options[j].selected==true){
					if(strResult!="") strResult += "&";
					strResult += _name;
					strResult += "=";
					strResult += el.options[j].value;
				}
			}
			return;
		}

		if (strResult!="") strResult += "&";


		// element.id를 키로 서명값저장, element.id가 있을 경우에만 저장
		// 20090413 전자서명 필드key (signid) 이 있을 경우 필드이름을 지정.
		if (_signid && null != _signid && _signid != "") {
			strResult += _signid;
			strResult += "[";
			strResult += _name;
			strResult += "]=";

			// 20091028 전자서명데이터중 약정서는 escape로 치환
			if(_name.indexOf("signAgreeContents") == 0) {
				_val = escape(_val);
			} else {
				_val = hana.JHanaUtils.form.removeFormatChar(el, _val);
			}
			strResult += _val;
		}

	});
	
	return strResult;
}

/**
 * QueryString from serialize 공통화  
 */
var formObjToQueryString = function(formObj, signData, url){
	var returnStr = '';
	
	if(naviMenuNo != null && naviMenuNo !=undefined && naviMenuNo != '0'){
		if(formObj == null) formObj = form.createForm();
		form.createHiddenField(formObj, 'naviMenuNo', naviMenuNo, false);
	}

	if (null != formObj && typeof formObj == 'object') {
		// PC 정보를 form의 hidden필드에 추가한다.
		// if (fdsPcGthrUrlHash.keys().include(url)) {
		// 	ocp.common.util.gatheringClientPcInfo(formObj.name);
		// }
    	//
		var formSerialized  = Form.serializeHanaData(formObj);
		if(typeof useTouchEnnxKey != 'undefined') {
			returnStr = ocp.common.util.makeEncKey4QueryStr(formObj);
			returnStr += ('&'+formSerialized);
		} else {
			returnStr = formSerialized;
		}
	}
	
	return returnStr;
}

/**
 * 로그아웃 여부 플래그
 * @author 오륜경 20081126
 */
hana.isLogout = false;

/**
 * 20090329 보안프레임 존재여부를 판단하여 프레임을 리턴한다. 
 * @param {Object} f mainframe 여부 
 */
var findHanaSecureFrame = function(f){
    var secureframe = null;
    var startwindow = top;
	var findFrameName = '';
    try {
		if (cpb.CONTENT_WRAP == 'MSN_CONTENT') {
			startwindow = parent;
		}
	} 
	catch (e) {
		startwindow = top;
	}
	if (f) {
		findFrameName = 'hanaMainframe';
	} else {
		findFrameName = 'hanaSecureframe';
	}
    do{
        try{
            secureframe = startwindow.frames[findFrameName];
            if(secureframe != null){
                return secureframe;
            }
        } catch(e){
            secureframe = null;
        }
        if((secureframe==null || secureframe=='undefined') && startwindow.opener!=null){
            startwindow = startwindow.opener.top;
            continue;
        } else {
            startwindow = null;
        }
    }while(startwindow!=null);
    return secureframe;
}

/**
 * 20090329 로그아웃시간을 연장한다. 
 */
var	extendsLogoutTime =  function(timerFunc) {
	var timer = timerFunc;
	var sf = null;
	var mf = null;
	try {
		sf = findHanaSecureFrame();
		mf = findHanaSecureFrame(true);
	} catch(e) { 
		//alert('에러 ==>'+e.toString())
	}
	
	if(sf!=null && typeof(sf.loginGuid)=='string' && mf!=null){		
        // 로그아웃 시간 연장
        // 20090507 팝업에서 거래시 부모창 로그아웃 시간 연장
		if (!mf.hana.isLogout) {
            if (window.opener !=null) {
               var parentWindow = window.opener;
               if (parentWindow.$('logoutTimerBtn') !=undefined && parentWindow.$('logoutTimerBtn')!=null) {
                   parentWindow.$('logoutTimerBtn').click();
               }
            } else {
			   timer.call();
            }
		}
    }
}

/**
 * 모든 셀렉트 박스를 화면에서 숨기기
 */
var hiddeAllSelectBox = function() {
    for (i=0; i<document.forms.length; i++) {
        for (k=0; k<document.forms[i].length; k++) {
            el = document.forms[i].elements[k];
            if (el.type == "select-one" || el.style.visibility == 'visible')
                el.style.visibility = 'hidden';
        }
    }	
}  

/**
 * 버튼형이미지에 
 */
hana.image = function(){
	return {
		imageMasks : {},
		showMaskAtImageTags : function() {
			// 초기화 
			hana.image.imageMasks = new Array();
			var imgs = document.getElementsByTagName("IMG");
			var i = 0;
		    Ext.each(imgs, function(img){
				var imgSrc = img.src.toString().toUpperCase();
				if (imgSrc.indexOf("BTN") > -1) {
					var maskId = 'progressImgMask_' + i;
					cpb.extJS.targetMask.show(maskId, img, '#FFFFFF', 0, .2);
					hana.image.imageMasks[i] = maskId;
					i++;
				}
		    }); 
		},
		removeMaskedImageTags : function() {
			var masks = hana.image.imageMasks;
			var i = 0;
		    Ext.each(masks, function(maskId){
		        cpb.extJS.targetMask.remove(maskId);
				i++;
		    });			
		}
	}
}();

/**
 * 20090507-1
 * 서밋했을 경우 버튼 대체 및 릴리즈
 **/
hana.submiButton = {
    alternateImg : function(objectId,altObjectSrc) {
        if (objectId !=null && altObjectSrc !=null) {
            $(objectId).src = altObjectSrc;
            $(objectId).onclick = function() {
                alert('처리중입니다. 잠시후에 시도하세요.');
                return;
            };
        }    
    },

    // 이미지가 '처리중'인경우 원본 이미지로 돌려놓는다.
    releaseAltImg : function(objectId, objectSrc, objectOnclick){
        if (objectId !=null && objectId !=undefined && $(objectId) !=null) {
            if ($(objectId).src != null && $(objectId).src != undefined)
            	$(objectId).src = objectSrc;
            	
			if ($(objectId).onclick != null && $(objectId).onclick != undefined)            	
            	$(objectId).onclick = objectOnclick;
        }
    },
    // 전역변수를 사용한경우 원본 이미지로 돌리는데 전역변수의 정보를 이용한다.
    releaseAltImg2 : function(){
        if (cpb.ORIGIN_BTN_OBJ['id'] !=null && cpb.ORIGIN_BTN_OBJ['id'] !=undefined && cpb.ORIGIN_BTN_OBJ['id'] != "") {
            hana.submiButton.releaseAltImg(cpb.ORIGIN_BTN_OBJ['id'],cpb.ORIGIN_BTN_OBJ['src'],cpb.ORIGIN_BTN_OBJ['onclick']);
        }
    }


}

/**
 * @class JHanaAjax Ajax 통신을 위한 util Class
 * @constructor hana.JHanaAjax
 * @param {String} _divTarget  대상 Div
 * @param {boolean} _isLoading loading 표시 여부
 * @param {boolean} _isWhole 대상 Div만 마스크레이어를 씌울지 여부, true일 경우 전체대상
 * @param {String} _maskTarget 대상 Div
 * @param {String} _objectId 
 * TODO 기존에 삭제했었던 특정위치에만 마스트를 씌우고 로딩메세지를 출력하는 기능 구현 필요(마이하나)
 *      로딩메세지 종류는 big(현 flash), small 두가지
 *      프로토타입에서 set메서드 추가하여 로딩메세지 종류 선택할 수 있도록.. (2008.02.29)
 *
 */
hana.JHanaAjax = function(_divTarget, _isLoading, _isWhole, _maskTarget, _objectId){ // 생성자 함수
	/* Member field */
	var targetDiv = _divTarget; // 대상 Div 이름
	var isLoading = true; // loading 메세지를 보여줄 지 여부
	var isWhole = true; // target에 loading 을 표현하는 지 여부
    var focusElementId = null;
	var isSuccess = true;
	var callbackFunc = null;
	var objectId = null;
    
    /** start 20090507-1 ***/
    var objectSrc = null;
    var objectOnclick = null;
    var altObjectSrc = '/resource/images/common/btn_cbs_processing.gif'; // click시 대체 이미지
    
    if(CPB_LNGG_CD != 'KO'){
    	altObjectSrc = '/resource/images/common/btn_cbs_processing_EN.gif'; // click시 대체 이미지
    }
    
    var releseObj = {
        objectId : null,
        objectSrc : null,
        objectOnclick : null
    }    
	
	if (_objectId && _objectId != undefined){ 
        try {		
    		objectId = _objectId;
            releseObj.objectId = objectId;

			cpb.ORIGIN_BTN_OBJ['id'] =  objectId;

            if (null!=$(_objectId).src) {
                objectSrc = $(_objectId).src;
                releseObj.objectSrc = objectSrc;

				cpb.ORIGIN_BTN_OBJ['src'] = objectSrc;
            }
            if (null!=$(_objectId).onclick) {
                objectOnclick = $(_objectId).onclick;
                releseObj.objectOnclick = $(_objectId).onclick;

				cpb.ORIGIN_BTN_OBJ['onclick'] = objectOnclick;

            }
        } catch (e) {
           // ignored..
        }
	}
    // 20090514
	this.isSimpleUpdate = false;	
    
    this.getObjectSrc = function() {
        return objectSrc;
    }
    
    this.getObjectOnclick = function() {
        return objectOnclick;
    }
    
    this.getAltObjectSrc = function() {
        return altObjectSrc;
    }   
    
    this.getReleseObj = function() {
        return releseObj;
    }
    /** end 20090507-1 ***/    

	var maskTarget = _maskTarget;

    if (_divTarget && _divTarget != undefined) {
		targetDiv = _divTarget;
	}
	// 2008.06.11 오륜경 comment, 마스크가 씌워질 타겟이 없다면 업데이트 영역 타겟으로 설정한다.
	if (maskTarget == undefined) {
		maskTarget = _divTarget;
	}
	if (_isLoading != undefined) {
		isLoading = _isLoading;
	}

	if (isWhole != undefined) {
		isWhole = _isWhole;
	}

    this.transaction = false;
	
	/**
	 * 대상 Div를 가져온다.
	 */
	this.getTargetDiv = function(){
		return targetDiv;
	}

	this.getMaskTarget = function() {
		return maskTarget;
	}

	this.getIsWhole = function() {
		return isWhole;
	}
	this.setIsWhole = function(_whole) {
		isWhole = _whole;
	}
    /**
	 * 사용자 정의 포커스 할 element id
	 * @param {String} element id
	 */
    this.setFocusElementId = function(id){
		focusElementId = id;
	}

	/**
	 * Ajax 통신 정상종료여부
	 * @param {Object} success 정상종료여부
	 */
	this.setIsSuccess = function(success){
		isSuccess = success;
	}

	/**
	 * 사용자 정의 함수
	 * @param {Object} func 사용자 정의 함수
	 */
	this.setCallbackFunc = function(func){
		callbackFunc = func;
	}
	
	/**
	 * 메뉴및 컨텐츠 변경시 히스토리를 남기기 위한  객체
	 */
	this.getObjectId = function() {
		return objectId;
	}
	
	this.getIsLoading = function() {
		return isLoading;
	}
	
    /**
	 * 사용자 정의 포커스 할 element id 제공
	 */
    this.getFocusElementId = function(){
		return focusElementId;
	}	
	
	/**
	 * @since 20090413
	 * @param {Object} bTrue
	 */
	this.setTransaction = function(bTrue) {
		this.transaction = bTrue;
	}
	/**
	 * @since 20090413
	 */
	this.getTransaction = function() {
		return this.transaction;
	}

}

hana.JHanaAjax.prototype = {

	/**
     * Ajax onCreate 된 시점에 수행 될 함수
     */
	onCreate : function() {
		try {
			var isLoading = this.getIsLoading();
			var maskTarget = this.getMaskTarget();
			var isWhole = this.getIsWhole();
            
            //*** 20090507-1
            var objectId = this.getObjectId();
            var altObjectSrc =  this.getAltObjectSrc();
            hana.submiButton.alternateImg(objectId,altObjectSrc);
            //*** 20090507-1 ---> 
						
			if (isLoading) {
				// Loading 여부가 true 일때만 loading Div를 나타낸다.
				if (isWhole) {
//					cpb.extJS.loadingLayer.show();
					ocp.common.layerpopup.openLoading_fnc();
				}
				else {
//                    if($(maskTarget)){
//                        cpb.sLoadingMasks['x-mask' + maskTarget] = new Ext.LoadMask($(maskTarget), {
//                            msg: 'Loading...'
//                        });
//                        cpb.sLoadingMasks['x-mask' + maskTarget].show();
//                    }else{
//                        /*alert('maskTarget="'+maskTarget+'" 영역이 존재 하지 않습니다. JHanaAjax 설정을 확인하세요');*/                
//                    }
				}
			}
		}catch(e){
            //alert('ajax onCreate 시점에서 에러 발생 :' + e.message);
        }
	},
	
    /**
     * Ajax onComplete 된 시점에 수행 될 함수
     */
	onComplete : function() {
		try {
			document.onmousedown = null;
			var isLoading      = this.getIsLoading();
			var maskTarget     = this.getMaskTarget();
			var isWhole        = this.getIsWhole();	
			var focusElementId = this.getFocusElementId();
			// 20090413
			var transaction     = this.getTransaction();
			if (isLoading) {
				// 20090413 transaction 을 설정했다면.. 대기
				if (!transaction) {
					if (isWhole) {
						if (this.getTargetDiv() != undefined && cpb.BYPASS_ID == this.getTargetDiv()) {
							// 로딩 skip
						} else {
							ocp.common.layerpopup.closeLoading_fnc();
						}
					}
				}
			}

			if (focusElementId != null) {
				if ($(focusElementId) != null && $(focusElementId) != undefined) {
					document.getElementById(focusElementId).select();
					document.getElementById(focusElementId).focus();
				}
			}
		}catch(e){
            //alert('ajax onComplete 시점에서 에러 발생 :' + e.message);
        }

        //에러 확인 창 출력
        if(this.e){
//            var funcText = this.e.func.toString();
//            funcText = funcText.replace('function anonymous() {','');
//            funcText = funcText.replace(/}$/g,'');
//            var errMsg = 'ajax callback 함수 실행 시 에러 발생 했습니다. : '+this.e.message;
//
//            alert(errMsg + '\n실행 callback 함수 : \n' + funcText);
        }
    },
	
	/**
	 * Ajax로 Form 요청을 보낼때,
	 * callback 함수가 없고 div에 결과값을 바로 뿌려줄때 이용한다.
	 * @param {String} url, 요청 url
	 * @param {Object} formObj, form의 참조값
	 */
	ajaxCommSubmit : function(url, formObj, eraseObjNames) {
		// 서비스 이용시간 체크
		if(!fnOpenBankingTimeCheck()) {
			fnGoTimeAccept();
		} else {
			var onCreate = this.onCreate;
			var onComplete = this.onComplete;
			
			var ajaxObj = this;
	
			var data = 'ajax=true';
			var targetDiv = this.getTargetDiv();
			var maskTarget = this.getMaskTarget();
			var isWhole = this.getIsWhole();
			var alertFailure = this.alertFailure;
			var isSuccess = this.setIsSuccess;
//			var startTimer = this.startTimer;
			var objectId = this.getObjectId();
	        
	        //*** 20090507-1
	        var objectSrc = this.getObjectSrc();
	        var objectOnclick = this.getObjectOnclick();
	        var altObjectSrc =  this.getAltObjectSrc();
	        var releseObj = this.getReleseObj();
	        //*** 20090507-1 --->
			
	        //**** 20090514 
	        var isSimple = this.isSimpleUpdate;			
			
			// 20090413
			var transaction     = this.getTransaction();
			
			var signData = '';
	
	        // 20090506 
	        data += '&'+formObjToQueryString(formObj,signData, url);
			data += "&requestTarget="+targetDiv;
	
			ocp.common.util.auto_logout_timer.timeInstance_num = ocp.common.util.auto_logout_timer._getAutoLogoutTimeSec_fnc();	
			
			var request = new Ajax.Request(url, {
				method: 'post',
				parameters: null,
	            postBody : data,
	            onCreate : function(){
					onCreate.call(ajaxObj);
				},	
				onComplete : function() {
					ocp.common.util.auto_logout_timer.resetCS();
					onComplete.call(ajaxObj);
				},
				onSuccess: function(xmlHttp, arg){
					if (xmlHttp.status == 0) {
	                    // 20090507-1 -->
	                    hana.submiButton.releaseAltImg(objectId,objectSrc,objectOnclick);
	                    // 20090507-1 -->
	                    
						if (transaction) {
							if (isWhole) {
								ocp.common.layerpopup.closeLoading_fnc();
							}
						}
						return null;
					}
					
					var resType = xmlHttp.getResponseHeader('json-type');
					if (targetDiv != null && targetDiv != '' && (targetDiv == cpb.CONTENT_WRAP || targetDiv == 'hanaMainDiv')) {
						if (resType != 'error') {
							hana.JHanaUtils.html.scrollToTop();
						}
					}
					
					var directReleaseYn = xmlHttp.getResponseHeader('directReleaseYn');
					if (!ocp.common.util.isEmpty_fnc(directReleaseYn) && directReleaseYn.trim() == 'Y') {
						ajaxObj.setIsWhole(false);
					}
					ocp.common.ajax.parseAjaxData_fnc(xmlHttp,true,releseObj);
					
					if (resType != 'error' && resType !='redirect') {
						
//						var responseTecxt = xmlHttp.responseText;
						var responseText = ocp.common.ajax.getAjaxResponseAddUiInitString_fnc(targetDiv, url) + xmlHttp.responseText;
						responseText += ocp.common.ajax.getAjaxResponseAddString_fnc(targetDiv, xmlHttp.getResponseHeader('checkSecureframe'));
						
						$(targetDiv).update(responseText);
						
	                    hana.submiButton.releaseAltImg(objectId,objectSrc,objectOnclick);
	                                        
						if (transaction) {
							if (isWhole) {
								ocp.common.layerpopup.closeLoading_fnc();
							}
						}
						
						/* 20090304 */
						var resultInfo = xmlHttp.getResponseHeader('_RESULT_URL_');	
						if (loginFormURLs !=null && loginFormURLs.length > 0 && targetDiv == cpb.CONTENT_WRAP) {
							for (var k=0;k<loginFormURLs.length; k++){
								if (null!=resultInfo && resultInfo==loginFormURLs[k]){
									/* 왼쪽 리프레쉬.*/
									cpb.ajax.refreshLeft(true);
									// guid 클리어
									clearGuid();							
									break;
								}
							}
		
						}										
					} else {
						if (transaction) {
							if (isWhole) {
								ocp.common.layerpopup.closeLoading_fnc();
							}
						}
					}
				},
				asynchronous: true,
				onFailure: alertFailure
			});
		}
	},

	/**
	 * ajaxCommSubmit과 동일하나 callback 함수를 호출 한다.
	 *
	 * @author Jiho Park
	 * @since 2008.01.25
	 *
	 * @param {Object} url
	 * @param {Object} formObj
	 * @param {Object} callbackFunc
	 */
	ajaxCommSubmitCallback : function(url, formObj, callbackFunc, eraseObjNames) {
		// 서비스 이용시간 체크
		if(!fnOpenBankingTimeCheck()) {
			fnGoTimeAccept();
		} else {
			var onCreate = this.onCreate;
			var onComplete = this.onComplete;
			
			var ajaxObj = this;
			
//			var startTimer = this.startTimer;
			var data = 'ajax=true';
			var targetDiv = this.getTargetDiv();
			var maskTarget = this.getMaskTarget();
			var isWhole = this.getIsWhole();
			var alertFailure = this.alertFailure;
			var isSuccess = this.setIsSuccess;
			var objectId = this.getObjectId();		
			var signData = '';
	        
	        //*** 20090507-1
	        var objectSrc = this.getObjectSrc();
	        var objectOnclick = this.getObjectOnclick();
	        var altObjectSrc =  this.getAltObjectSrc();
	        var releseObj = this.getReleseObj();
	        //*** 20090507-1 --->   
			
	        //**** 20090514 
	        var isSimple = this.isSimpleUpdate;			     
			
			// 20090413
			var transaction     = this.getTransaction();
	
	        // 20090506 
	        data += '&'+formObjToQueryString(formObj,signData, url);
			data += "&requestTarget="+targetDiv;
		
			ocp.common.util.auto_logout_timer.timeInstance_num = ocp.common.util.auto_logout_timer._getAutoLogoutTimeSec_fnc();
				
			var request = new Ajax.Request(url, {
				method: 'post',
				parameters: null,
	            postBody : data,
				onCreate : function() {
					onCreate.call(ajaxObj);
				},	
				onComplete : function() {
					ocp.common.util.auto_logout_timer.resetCS();
					onComplete.call(ajaxObj);
				},
				onSuccess: function(xmlHttp, arg){
					if (xmlHttp.status == 0) {
	                    // 20090507-1 -->
	                    hana.submiButton.releaseAltImg(objectId,objectSrc,objectOnclick);
	                    // 20090507-1 -->
	                                    
						//////// 20090417
						if (transaction) {
							if (isWhole) {
//								cpb.extJS.loadingLayer.close();
								ocp.common.layerpopup.closeLoading_fnc();
							}
							else {
//								if (cpb.sLoadingMasks['x-mask' + maskTarget]) {
//									cpb.sLoadingMasks['x-mask' + maskTarget].el.setStyle("position", "static");
//									cpb.sLoadingMasks['x-mask' + maskTarget].hide();
//									
//									cpb.sLoadingMasks['x-mask' + maskTarget] = null;
//								}
							}						
						}
						//////// 20090417					
						return null;
					}
					
					var resType = xmlHttp.getResponseHeader('json-type');
					if (targetDiv != null && targetDiv != '' && (targetDiv == cpb.CONTENT_WRAP || targetDiv == 'hanaMainDiv')) {
						if (resType != 'error') {
							hana.JHanaUtils.html.scrollToTop();
						}
					}
					
	                // 20090507-1 에러시 릴리즈를 위해 .. 성공시 릴리즈는 개발자가 한다. 
//					cpb.ajax.parseData(xmlHttp,true,releseObj);
					var directReleaseYn = xmlHttp.getResponseHeader('directReleaseYn');
					if (!ocp.common.util.isEmpty_fnc(directReleaseYn) && directReleaseYn.trim() == 'Y') {
						ajaxObj.setIsWhole(false);
					}
					ocp.common.ajax.parseAjaxData_fnc(xmlHttp,true,releseObj);
					
					//////// 20090413
					if (transaction) {
						if (isWhole) {
//							cpb.extJS.loadingLayer.close();
							ocp.common.layerpopup.closeLoading_fnc();
						}
						else {
//							if (cpb.sLoadingMasks['x-mask' + maskTarget]) {	
//								cpb.sLoadingMasks['x-mask' + maskTarget].el.setStyle("position", "static");
//								cpb.sLoadingMasks['x-mask' + maskTarget].hide();
//								
//								cpb.sLoadingMasks['x-mask' + maskTarget] = null;
//							}
						}						
					}
					//////// 20090413				
							
					if (resType != 'error' && resType !='redirect') {
						
						var responseText = ocp.common.ajax.getAjaxResponseAddUiInitString_fnc(targetDiv, url) + xmlHttp.responseText;
						responseText += ocp.common.ajax.getAjaxResponseAddString_fnc(targetDiv, xmlHttp.getResponseHeader('checkSecureframe'));
						
						$(targetDiv).update(responseText);
									
						/* 20090304 */
						var resultInfo = xmlHttp.getResponseHeader('_RESULT_URL_');	
						if (loginFormURLs !=null && loginFormURLs.length > 0 && targetDiv == cpb.CONTENT_WRAP) {
							for (var k=0;k<loginFormURLs.length; k++){
								if (null!=resultInfo && resultInfo==loginFormURLs[k]){
									/* 왼쪽 리프레쉬.*/
									cpb.ajax.refreshLeft(true);
									// guid 클리어
									clearGuid();							
									break;
								}
							}
		
						}	
						try {
						    callbackFunc(true);
	                    }catch(e){
	                        e.func = new Function(callbackFunc);
	                        ajaxObj.e = e;
	                    }
	                } 
				},
				asynchronous: true,
				onFailure: alertFailure
			});
		}
	},

	/**
	 * Ajax로 Form 요청을 보내고, Callback 함수로 데이터를 처리할 때 이용한다.
	 * @param {String} url 요청 URL
	 * @param {Object} formObj Form의 참조값
	 * @param {boolean}isAsync 동기화 여부(필수항목, 하지만 비동기로 설정됨)
	 * @param {String} callbackFunc
	 * @param {String} encodingType
	 * @param {String} callBackFuncSameUseYn 콜백함수 정상/에러 같이 사용할 경우 Y로 세팅
	 */
	ajaxSubmit :  function(url, formObj, isAsync, callbackFunc, encodingType, eraseObjNames, callBackFuncSameUseYn) {
		// 서비스 이용시간 체크
		if(!fnOpenBankingTimeCheck()) {
			fnGoTimeAccept();
		} else {
			var onCreate = this.onCreate;
			var onComplete = this.onComplete;
			var ajaxObj = this;
	
//			var startTimer = this.startTimer;
			var alertFailure = this.alertFailure;
			var maskTarget = this.getMaskTarget();
			var isWhole = this.getIsWhole();
			var data = 'ajax=true&ajaxType=json';
			var _privateCallBack = callbackFunc;        
			var signData = '';
	        
	        var objectId = this.getObjectId();   
	        
	        //*** 20090507-1
	        var objectSrc = this.getObjectSrc();
	        var objectOnclick = this.getObjectOnclick();
	        var altObjectSrc =  this.getAltObjectSrc();
	        var releseObj = this.getReleseObj();
	        //*** 20090507-1 ---> 
			
			// 20090413
			var transaction     = this.getTransaction();		
	
	        // 20090506 
	        data += '&'+formObjToQueryString(formObj,signData, url);
			data += "&requestTarget=";
	
			ocp.common.util.auto_logout_timer.timeInstance_num = ocp.common.util.auto_logout_timer._getAutoLogoutTimeSec_fnc();
			
			var request = new Ajax.Request(url, {
				method: 'post',
				parameters: null,
	            postBody : data,
				onCreate : function(){
					onCreate.call(ajaxObj);
				},	
				onComplete : function(){
					onComplete.call(ajaxObj);
				},
				onSuccess: function(xmlHttp,args) {
					if (xmlHttp.status == 0) {
	                    // 20090507-1 -->
	                    hana.submiButton.releaseAltImg(objectId,objectSrc,objectOnclick);
	                    // 20090507-1 -->
	                                    
						//////// 20090417
						if (transaction) {
							if (isWhole) {
//								cpb.extJS.loadingLayer.close();
								ocp.common.layerpopup.closeLoading_fnc();
							}
							else {
//								if (cpb.sLoadingMasks['x-mask' + maskTarget]) {
//									cpb.sLoadingMasks['x-mask' + maskTarget].el.setStyle("position", "static");
//									cpb.sLoadingMasks['x-mask' + maskTarget].hide();
//									
//									cpb.sLoadingMasks['x-mask' + maskTarget] = null;
//								}
							}						
						}
						//////// 20090417						
						return null;
					}
	                // 20090507-1 에러시 릴리즈를 위해 .. 성공시 릴리즈는 개발자가 한다. 
//					cpb.ajax.parseData(xmlHttp,true,releseObj);
					ocp.common.ajax.parseAjaxData_fnc(xmlHttp,true,releseObj,'json');
	
	                var resType = xmlHttp.getResponseHeader('json-type');
					//////// 20090413
					if (transaction) {
						if (isWhole) {
//							cpb.extJS.loadingLayer.close();
							ocp.common.layerpopup.closeLoading_fnc();
						}
						else {
//							if (cpb.sLoadingMasks['x-mask' + maskTarget]) {
//								cpb.sLoadingMasks['x-mask' + maskTarget].el.setStyle("position", "static");
//								cpb.sLoadingMasks['x-mask' + maskTarget].hide();
//								
//								cpb.sLoadingMasks['x-mask' + maskTarget] = null;
//							}
						}						
					}
	                try{
	                	if ((resType != 'error' || (!ocp.common.util.isEmpty_fnc(callBackFuncSameUseYn) && callBackFuncSameUseYn == 'Y'))
	                		&& (typeof _privateCallBack) == 'function') {
	
							// 로그인이면 로딩바 표시
							if(url.indexOf("LoginSubmit") > -1) {
								ocp.common.layerpopup.openLoading_fnc();
							}
	
	                        _privateCallBack(xmlHttp, args);
	
						}
	                    /*if (_privateCallBack != undefined) {
							//그리드 callback 함수인 경우 error 여도 실행 하도록 함.
	                        var chkFunc = _privateCallBack.toString().replace(/\s/img,'');
	                        if(chkFunc.include('newhana.JXGrid')){
	                            _privateCallBack(xmlHttp, args);
	                        }
	                        //일반적인 경우 에러인 경우 callback 실행 안함
	                        else{
	                            if (resType != 'error') {
	                                _privateCallBack(xmlHttp, args);
	                            }
	                        }
						} */
	                }catch(e){
	                    e.func = new Function(_privateCallBack);
	                    ajaxObj.e = e;
	                }
					//
	
	            },
				asynchronous: isAsync,
				onFailure: alertFailure
			});
		}
	},

    /**
	 * Ajax로 Form 요청을 보내고, Callback 함수로 데이터를 처리할 때 이용한다.
	 * @param {String} url 요청 URL
	 * @param {Object} formObj Form의 참조값
	 * @param {String} eraseObjNames
	 */
	ajaxSubmitToFlex :  function(url, formObj,eraseObjNames ) {
		// 서비스 이용시간 체크
		if(!fnOpenBankingTimeCheck()) {
			fnGoTimeAccept();
		} else {
			var onCreate = this.onCreate;
			var onComplete = this.onComplete;
			var ajaxObj = this;
			
//			var startTimer = this.startTimer;
			var alertFailure = this.alertFailure;
			var maskTarget = this.getMaskTarget();
			var isWhole = this.getIsWhole();
			var data = 'ajax=true';
			var signData = '';
	        
	        var objectId = this.getObjectId(); 
	        
	       //*** 20090507-1
	        var objectSrc = this.getObjectSrc();
	        var objectOnclick = this.getObjectOnclick();
	        var altObjectSrc =  this.getAltObjectSrc();
	        var releseObj = this.getReleseObj();
	        //*** 20090507-1 ---> 
			
			// 20090413
			var transaction     = this.getTransaction();
					
			// 인증서 제출이 필요한 페이지이면 signData를 가져온다.
			// 요청 url이 인증서 제출이 필요한 url인지
			/*if(signUrlHash.keys().include(url)) {
				signData = getSignedData(formObj, eraseObjNames);
			}*/
	        
	        // 20090506 
	        data += '&'+formObjToQueryString(formObj,signData, url);
			data += "&requestTarget=";
			
			ocp.common.util.auto_logout_timer.timeInstance_num = ocp.common.util.auto_logout_timer._getAutoLogoutTimeSec_fnc();
					
			var request = new Ajax.Request(url, { 
				method: 'post',
				parameters: data,
				onCreate : function(){
					onCreate.call(ajaxObj);
				},	
				onComplete : function(){
					onComplete.call(ajaxObj);
				},
				onSuccess: function(xmlHttp,args) {
					cpb.ajax.flexData = xmlHttp.responseText;
	                
	                hana.submiButton.releaseAltImg(objectId,objectSrc,objectOnclick);
	                                
					//////// 20090413
					if (transaction) {
						if (isWhole) {
//							cpb.extJS.loadingLayer.close();
							ocp.common.layerpopup.closeLoading_fnc();
						}
						else {
							if (cpb.sLoadingMasks['x-mask' + maskTarget]) {
								cpb.sLoadingMasks['x-mask' + maskTarget].el.setStyle("position", "static");
								cpb.sLoadingMasks['x-mask' + maskTarget].hide();
								
								cpb.sLoadingMasks['x-mask' + maskTarget] = null;
							}
						}						
					}
					//////// 20090413
				},
				asynchronous: false,
				onFailure: alertFailure
			});
		}
	},	

	/**
	 *
	 * @param {Object} originalResquest
	 * @param {Object} xJson 수신한 데이터 헤더에 X-JSON 레이블이 있으면 eval한 결과값.
	 */
	alertFailure : function (originalResquest,xJson) {
		document.onmousedown=null;
		var reqStatus = originalResquest.status;
		var reqStatusText = originalResquest.statusText;
		// 20090109-1 404시에 요청 URL 과 응답URL을 보여주기위함 
		var reqInfo = originalResquest.getResponseHeader('_REQUEST_URL_');
		var resInfo = originalResquest.getResponseHeader('_RESULT_URL_');
		var extraInfo = '';
        var errMsg = originalResquest.responseText;
        		
       //*** 20090507-1
      	try {
      		//모근원 : this 호출이 아닌 전역변수에서 호출해서 restore
        	hana.submiButton.releaseAltImg2();        
      	} catch (e) { }
        //*** 20090507-1 --->

      	ocp.common.layerpopup.closeLoading_fnc();
		
		var msgTitle = "";
		var msgBody = "";
        //404 error 인 경우 에러 페이지로 보낸다
        if (reqStatus == '404') {
			// 20090429 layer 로 보여준다. 
			msgTitle = "전송 오류";
			reqStatusText = '<B><font class="red">입력하신 주소에 해당하는 페이지를 찾을 수 없습니다.</font></B><BR/>입력하신 주소를 다시 한번 확인해 주시기 바랍니다.<BR/>혹시 보시고자 하는 페이지가 없어졌거나 <BR/>일시적으로 장애일 수 있습니다.';
        }

        //500, 503, 505 서버 error 인 경우 에러 메세지를 출력 한다.
        if (reqStatus.toString().startsWith('5')) {
			extraInfo = '<BR/><B><font class="red">응답 페이지에 에러가 있습니다.</font></B><BR/>혹시 보시고자 하는 페이지가 없어졌거나 <BR/>일시적으로 장애일 수 있습니다.';
		}

      //MessageBox를 띄운다.
		var tmp = shttp_status_map[parseInt(reqStatus,10)];
		if (tmp == null || tmp == "") {
			msgTitle = "전송 오류";
			msgBody = reqStatusText;
			msgBody += extraInfo;
		}
		else {
			// 20090305 인증서 오류일경우는 URL 정보를 보여주지 않는다.
			var arr = tmp.split("|");
			msgTitle = arr[0];
			msgBody = arr[1];
		}

		ocp.common.layerpopup.openMessage_fnc({
			isConfirm: false,
			title: msgTitle,
			message: reqStatus + " : " + msgBody,
			callback: function(e){
				if (e == true) {
				}
			}
		});
		
		// 1. 그리드 초기화
		// TO-DO
		// 추가 필요
		
		// 2. E2E 초기화
		try{
			OCPTkClearByPws();
		}catch(e){
			alert(e.toString());
		}
		originalResquest.abort();
	},

	/**
	 *
	 * @param {Object} originalResquesthttp
	 * @param {Object} xJson 수신한 데이터 헤더에 X-JSON 레이블이 있으면 eval한 결과값.
	 */
	alertResponse : function (originalResquest,xJson) {
		var res = originalResquest.responseText;
		var instance = this;

		// 동작이 끝났을 경우 Observer 를 중지 시킨다.
		Event.stopObserving(window, 'resize', instance.resizeHandler);
		Event.stopObserving(window, 'scroll', instance.resizeHandler);

//		cpb.extJS.loadingLayer.close();
		ocp.common.layerpopup.closeLoading_fnc();

		if(originalResquest.status == 551) {
			Element.update(cpb.CONTENT_WRAP, res);
			return;
		}

		// MessageBox를 띄운다.
		ocp.common.layerpopup.openMessage_fnc({
			isConfirm: false,
			title: '처리 완료',
			message: '정상적 처리 되었습니다.',
			callback: function(e){
			}
		});
	},
	
	/**
	 * 타이머를 동작시킨다. 
	 */
	startTimer : function() {
		var timer = hana.startTimer();
		if (null!=timer)
			timer.start();			
	}

}

/**
 * LogoutTimer의 인스턴스를 이용하여 타이머를 작동시킨다
 * @constructor hana.JHanaLogoutTimer
 */
var timerInstance = null;

hana.startTimer = function() {
	if (null == timerInstance) {
		if ($(cpb.ICON_CLOCK_DIV)) {
			timerInstance = new hana.JHanaLogoutTimer();
		} else {
			return null;
		}
	}

	return timerInstance;
}

/**
 * LogoutTimer 를 설정하는 클래스
 * @constructor hana.JHanaLogoutTimer
 */
hana.JHanaLogoutTimer = function() {
    /* Member field */
	this.running    	 = false;
	this.currDate        = new Date();
	this.endDate         = new Date();
	this.currSec 		 = 0;
	this.currMin 		 = 0;
	this.logoutTimeDiv 	 = cpb.LOGOUT_TIME_DIV;   // 1분이 됐을 경우 보여줄 Alert레이어
	this.showTimeDiv 	 = cpb.SHOW_TIME_DIV;     // 화면에 보여줄 남은 시간 레이어
	this.alertMinutesDiv = cpb.ALERT_MINUTES_DIV; // 1분이 됐을 경우 Alert레이어에 보여줄 남은 시간 레이어
	this.iconClockDiv 	 = cpb.ICON_CLOCK_DIV;    // 남은시간 보여줄 레이어영역
	this.isRemainProc    = true                   // 1분미만일때 한번 처리될 부분을 처리할지 여부
	this.intervalID;							  // setInterval ID (중지할때 사용)
	
	
	this.baseTime = '10';
	var sf = findHanaSecureFrame();
	if (sf !=null) {
		var temp = '20';	
		try {
			temp = ''+parseInt(parseInt(sf.document.forms['MenuNav'].sessionTimeout.value,10)/60);
		} catch(e) {
            // ignored..
		}	
		if(temp.length  < 2){
			temp = '0'+temp;
		}
	    this.baseTime = temp;
	}	
}

hana.JHanaLogoutTimer.message = {
	infoMessage : function(res,arg) {
        //에러 발생시 그냥 return..
        if(res.getResponseHeader('json-type') == "error") return;
        
        cpb.extJS.messageBox.infoMsgBox({
			isConfirm: false,
			title: '정보',
			message: '로그아웃 시간을 연장하였습니다.',
			callback: function(e){
				//timerInstance reset
                if(timerInstance){
                    timerInstance.reset();
                }
			}
		});
	}
}
hana.JHanaLogoutTimer.prototype = {
	instance : null,
	/* Member method */
	/**
	 * login 하고 나면 실행시킨다.
	 */
	start : function() {
		if (!this.running) {
			this.running = true;
			if (this.reset()) {
				instance = this;
				this.intervalID = setInterval(function(){
					instance.update()
				}, 1000);
			}
		}
		else {
			// Observer 를 중지 시킨다.
			Event.stopObserving(window, 'resize', this.resizeHandler);
			Event.stopObserving(window, 'scroll', this.resizeHandler);

			this.reset();
		}
	},

	/**
	 * 로그인 유지시간 초기화
	 */
	reset : function() {

		this.isRemainProc = true;
		
		if(null==$(this.iconClockDiv) || $(this.iconClockDiv) == undefined) {
			return false;
		}

		cpb.showDiv(this.iconClockDiv);
//		document.getElementById(this.iconClockDiv).src = cpb.APPLICATION_CONTEXT_ROOT + "/resource/image/common/layout/icon_clock.gif";
//		document.getElementById(this.showTimeDiv).style.color = "#596fb8";
		document.getElementById(this.showTimeDiv).innerHTML = ""+this.baseTime+":00";

		this.endDate = new Date();

        // 시간을 변경시키려면 baseTime 을 변경시킨다.
		this.endDate.setMinutes(this.endDate.getMinutes()+parseInt(this.baseTime,10));

		if(typeof(_HANA_BANK_CS_YN_) != "undefined" && _HANA_BANK_CS_YN_ != null && _HANA_BANK_CS_YN_ == "Y") {
			//alert("HR_SESSION_TIME_RESET.....");
			  //alert("external : " + typeof(external.GetPrecis)) // "unknown"
			if( typeof(external.GetPrecis) != "undefined" ){
			    var retCsValue = external.GetPrecis("HR_SESSION_TIME_RESET");
			    //alert("CS의 function[GetPrecis()] 호출 함 : " + retCsValue);
			}
		}
			
		return true;
	},

	/**
	 * 로그인 유지시간 체크
	 */
	update : function () {
		this.currDate = new Date();
		var mf = null;
		try {
			mf = findHanaSecureFrame(true);
		} catch(e) { 
			//alert('에러 ==>'+e.toString())
		}		
		if (this.running && mf!=null && mf !=undefined) {

			var sec = parseInt((this.endDate - this.currDate) / 1000,10);
			this.currMin = eval(parseInt(sec / 60));
			this.currSec = eval(parseInt(sec % 60));

			// 1분 미만일 경우
			if (this.currMin < 1) {

				// 1분 미만 알림레이어 설정
				if (this.isRemainProc){
					mf.$(this.iconClockDiv).src = cpb.APPLICATION_CONTEXT_ROOT + "/resource/image/common/layout/icon_clock2.gif";
					mf.$(this.showTimeDiv).style.color = "#ff0000";

					// 알림 레이어를 띄워 준다.
					//this.openMsgLayer();
					//this.isRemainProc = false;
  					// CS일 경우 알림 레이어를 띄워는 대신, 바로 자동연장 function을 호출 한다.
  					if(typeof(_HANA_BANK_CS_YN_) != "undefined" && _HANA_BANK_CS_YN_ != null && _HANA_BANK_CS_YN_ == "Y") {
  					  hana.startTimer().restartCS(); // <== hana.startTimer().restart()
  					  //alert("로그인 Session 자동 연장 됨.");
  					} else {
  						this.openMsgLayer();
  						this.isRemainProc = false;
  					}
				}

				// 로그인 만료시간이 됐을 경우(00:00)
				if (this.currSec <= 0) {
					// 동작이 끝났을 경우 Observer 를 중지 시킨다.
					Event.stopObserving(window, 'resize', this.resizeHandler);
					Event.stopObserving(window, 'scroll', this.resizeHandler);

					this.reset();
					this.running = false;

					// 레이어 숨기기
					this.closeMsgLayer();
					
					hana.isLogout = true;
					clearInterval(this.intervalID);
					
					// 20081126 오륜경 로그아웃 실행 
					var hanaAjax = new hana.JHanaAjax(cpb.CONTENT_WRAP, true, true);
					hanaAjax.ajaxSubmit(cpb.APPLICATION_CONTEXT_ROOT + '/common/cpbLogoutTimerSubmit.do',null,true,function(xmlHttp){
						hana.isLogout = true;
						// 20090405 오륜경 
						// 모든 그리드 없앤다. 
						var gridObjs = mf.Ext.query("object[id$=Grid]");
						if (null != gridObjs) {
							for (var i = 0; i < gridObjs.length; i++) {
								gridObjs[i].style.visibility = 'hidden';
							}
						}
						// 20090407 오륜경 
						// 모든 셀렉트 박스를 없앤다.
						hiddeAllSelectBox();
						mf.cpb.extJS.targetMask.show('logoutMask',cpb.PAGE_WRAP,'#FFFFFF',1.5);						
					});
					
					mf.ocp.common.layerpopup.openMessage_fnc({
						isConfirm: false,
						title: cpb_com_mls.get('로그아웃'),
						message: cpb_com_mls.getST('고객님의 보안을 위해 자동으로 로그아웃되었습니다.<br/><br/>로그인 후 일정시간동안 사이트를 이용하지 않으셨습니다.<br/>불편하시더라도 다시 로그인 하시어 사용해 주시기 바랍니다.'),
						callback: function(e){
							var hanaAjax = new hana.JHanaAjax("", true, true);
							hanaAjax.ajaxSubmit(cpb.APPLICATION_CONTEXT_ROOT + '/common/logoutForward.do',
									null,
									true,
									function(xmlHttp){
										hana.isLogout = true;
									});
							
						}
					});

				}
			}
			Strsec = "" + this.currSec;
			Strmin = "" + this.currMin;
			if (Strsec.length < 2) {
				Strsec = "0" + this.currSec;
			}
			if (Strmin.length < 2) {
				Strmin = "0" + this.currMin;
			}
			
			try {
				mf.$(this.showTimeDiv).innerHTML = Strmin + ":" + Strsec;
//				mf.cpb.extJS.logoutMessage.updateTime(this.alertMinutesDiv, Strsec);

				if($j('#' + cpb.LOGOUT_TIME_DIV).size() > 0){
					mf.$(this.alertMinutesDiv).innerHTML = Strsec;
				}
				
			} catch(e) {
				//ignore
			}
			
		}
		else {
			clearInterval(this.intervalID);
			if ($("#" + this.showTimeDiv)) {
				$("#" + this.showTimeDiv).style.display = 'hidden';
			}			
		}
	},

	/**
	 *
	 * @param {Object} url
	 */
	loginTimeSubmit : function(url) {
		var request = new Ajax.Request(
			url,
			{
				method : 'post',
				parameters : 'ajax=ture',
				onSuccess : this.restart,
				onFailure : this.restart
			}
		);
	},

	openMsgLayer: function(){
//		cpb.extJS.logoutMessage.show();
		Event.observe(window, 'resize', this.resizeHandler);
		Event.observe(window, 'scroll', this.resizeHandler);
	},

	closeMsgLayer: function(){
		// 동작이 끝났을 경우 Observer 를 중지 시킨다.
		Event.stopObserving(window, 'resize', this.resizeHandler);
		Event.stopObserving(window, 'scroll', this.resizeHandler);

		if (null != cpb.extJS.logoutMessage) {
			cpb.extJS.logoutMessage.close();
		}
	},

	/**
	 * 5분 로그인 유지시간 초기화
	 */
	restart : function(){
		// Observer 를 중지 시킨다.
		Event.stopObserving(window, 'resize', this.resizeHandler);
		Event.stopObserving(window, 'scroll', this.resizeHandler);
		this.closeMsgLayer();

		var hanaAjax = new hana.JHanaAjax("", false, true);
		hanaAjax.ajaxSubmit(cpb.APPLICATION_CONTEXT_ROOT+'/common/restartTimer.do',
				null,
				true);	
		//this.reset();					
	},
	
    /**
     * CS : 자동 로그인 시간 연장. (5분 로그인 유지시간 초기화)
     */
    restartCS : function(){
    	//// Observer 를 중지 시킨다.
    	//Event.stopObserving(window, 'resize', this.resizeHandler);
    	//Event.stopObserving(window, 'scroll', this.resizeHandler);
    	//this.closeMsgLayer();
  
    	var hanaAjax = new hana.JHanaAjax("", false, true);
    	hanaAjax.ajaxSubmit(cpb.APPLICATION_CONTEXT_ROOT+'/common/restartTimer.do',
    			null,
    			true);	
    	//this.reset();					
    },

	/**
	 * 리사이즈/스크롤시 이벤트 핸들러
	 * @param {Object} evt
	 */
	resizeHandler : function(evt){
		// 레이어가 화면 가운데에 위치하도록 설정
		//2018.01.12 한부장님 확인필요
//		if (null != cpb.extJS.logoutMessage.logoutLayer) {
//			cpb.extJS.logoutMessage.logoutLayer.center();
//		}
	}
}

/* 첫페이지 인 경우 window의 load 이벤트 시 init 시킵니다. */
Event.observe(window, "load", hana.JHanaNiceForms.init, false);
