/** 

 * 폼 컨트롤 관련 자바 스크립트 
 *
 * 각종 화면단 폼 과 관련된 컨트롤 자바 스크립트 이다.
 * 
 * @author  장영조, foresight@topnwise.com
 * @version 1.0, 2004/08/17
 * @since   1.0
 *
 * Copyright. (c) 2004 by Kyobo Life
 */


//alert("[/CN_FormControl.js.js]: [test_3]");


 function CN_FormControl() { 
	this.getFldVal   = getFldVal;  
	this.setFldVal   = setFldVal; 
	this.setFocus    = setFocus; 
	this.setDisabled = setDisabled;  
	this.getSelectText = getSelectText;

	this.openWindow  = openWindow;

	this.openModalWindow = openModalWindow;

	this.setLoading  = setLoading;

	this.openCalendar	= openCalendar;

	this.openCalendarArg = openCalendarArg;

	this.checkByte	= checkByte;

	this.m_obj = null;

	this.m_his = null;

	this.disabledFalseStart = disabledFalseStart;

	this.disabledRollBack 	= disabledRollBack;

	this.setMultiChecked	= setMultiChecked;

	this.funcEmailValidate	= funcEmailValidate;

	this.setEmail	= setEmail;
	this.openCalendarHolidayArg = openCalendarHolidayArg; 
 }
 
 /* =============================================================

  Function : fld에 해당하는 필드에 셋팅된 값을 얻어온다.

  Return   : N/A

  Usage    :

================================================================= */

function getFldVal(fld, defVal, frm) { 
	if(!frm) frm = document.forms[0];//default 
	if(defVal == null) defVal = '';
 
	try { 
		with(frm) { 
			if(elements[fld]){ //존재하는 Object라면.  
				var obj = elements[fld]; 
				var cnt = elements[fld].length; 
				var t = ''; 

				if (obj.length == undefined) 
				{ 
					t = obj.type; 
				}  
				else  
				{ 
					t = obj[0]?obj[0].type:obj.type; 
				}
 
				/* 폼 객체 타입에 따라 value 값 리턴 방법 분기 */ 
				switch(t) { 
					case "checkbox" :   /* check box 인 경우 */ 
						if(obj.checked){ 
							return obj.value; 
						} 
						break; 
					case "radio":		/* 라디오 박스인 경우 */ 
						//if (obj.length == )

						for(var i=0;i<obj.length;i++){

							if(obj[i].checked){

								return obj[i].value;

							}

						}

						break;

					case "select-one": /* SELECT BOX 인경우 */

						var returnVal = "";



						for(var i=0;i<obj.length;i++){

							if(obj.selectedIndex == i){

								

								if (defVal && defVal == "text"){

									// select box 의 텍스트 값을 받아온다면 select box의 text를 리턴

									returnVal = obj.options[i].text;

								}

								else {

									// 기본값으로 value를 리턴

									returnVal = obj.options[i].value;

								}

								return returnVal;

							}

						}

						break;

					default:

						/* hidden 필드와 text 필드에 해당됨 */

						return obj.value?obj.value:defVal;

				}

			} else {

				throw new FormControlException("존재하지 않는 컴포넌트 입니다.");

			}

		}

	}

	catch(e) {

		alert(e.message);

	}

}



 /* =============================================================

  Function : setFldVal

  Return   : N/A

  Usage    : fld에 해당하는 필드에 값을 셋팅한다.

================================================================= */

function setFldVal(fld, val, frm) {

	if(!frm) frm = document.forms[0];//default

	if(val == null) val = '';



	try {

		with(frm) {

			if(elements[fld]){ //존재하는 Object라면.

				var obj = elements[fld];



				var cnt = elements[fld].length;



				//배열대상객체를 구분해서받는다.

				var t = '';

				//if (cnt > 1){

				//	t = obj[0]?obj[0].type:obj.type;

				//}

				//else {

				//	t = obj.type;

				//}

				

				t = obj[0]?obj[0].type:obj.type;

				

				switch(t) {

					case "radio":

						for(var i=0;i<obj.length;i++){

							if(obj[i].value == val){

								obj[i].checked = true;

								return true;

							}

						}

						break;

					case "checkbox":

						obj.checked = val;

						return true;

						break;

					case "select-one":

						for(var i=0;i<obj.length;i++){

							if(obj.options[i].value == val){

								obj.selectedIndex = i;

								return true;

							}

						}

						break;

					default:

						/*var cls = obj.className;//tag의 class명을 얻는다.



						if(cls == "date" && val) {//날짜클래스라면처리

							obj.value = toMask(val.replace(/(\/|\,|\.|\-)/g,""), "9999/99/99 99:99:99");

						} else if((cls == "currency" || cls == "number") && val != null) {

							if(val == '0') {

								obj.value = '';//0은 길이 없는 string으로 치환한다.

							} else {

								if(cls == "currency"){

									var t = toNumberMask((typeof(val) == "number")?""+val:val.replace(/(\,)/g, ""));

									obj.value = t;

								} else {

									obj.value = Number(val);

								}

							}

						} else if(cls == "jumin" && val) {

							obj.value = toMask(val, "999999-9999999");

						} else {

							obj.value = val;

						}*/

						

						// hidden 필드와 text 필드에 해당됨

						obj.value = val;



						return true;

				}

			} else {

				throw new FormControlException("존재하지 않는 컴포넌트 입니다.");

			}



			return false;

		}//end with

	

	}

	catch(e) {

		alert(e.message);

	}

}





/* ===================================================================

	Function : getSelectText(field)

	Return 	 :

	Usage 	 : select에서 선택된 것 label을 배열로 리턴한다.

=================================================================== */

function getSelectText(field){

	var arr = new Array()

	var arr_idx = 0;



	if(field == null){

		return arr;

	}



	if(field.options == null ) {

		return arr;

	}



	if(field.options[0] == null){//option이 하나일때

		if(field.options.selected == true){

			arr[arr_idx] = field.options.text;

		}

		return arr;

	}

	else{//option이 하나이상일때

		for(var i=0;i<field.options.length;i++){

			if(field.options[i].selected == true){

				arr[arr_idx] = field.options[i].text;

				arr_idx++;

			}

		}

		return arr;

	}

}



 /* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 우편번호 찾기 팝업 창 열기

================================================================= */

function findZipCode(url, width, height){

	openWindow(url, width, height);

}



 /* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 윈도우 팝업창을 띄운다.

================================================================= */

//function openWindow (url, width, height){

//	win = window.open(url,'win','toolbar=no,width='+width+',height='+height);

//	return false;

//}



/* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 윈도우 팝업창을 띄운다.

================================================================= */

function openWindow(name, url, left, top, width, height, toolbar, menubar, statusbar, scrollbar, resizable){



}





/* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 윈도우 팝업창을 띄운다.

================================================================= */

function openCalendar(){

	var width  = 250;

	var height = 240;

	var url    = "/jsp/kblcm/common/CM_calendar_lst.jsp";

	var calendarLeft = (screen.width  - width) / 2;

	var calendarTop  = (screen.height - height) / 2;

    window.open(url,'win','left='+calendarLeft+',top='+calendarTop+',toolbar=no,width='+width+',height='+height);

}



/* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 윈도우 팝업창을 띄운다.

================================================================= */

function openCalendarArg(arg, delim){

	var width  = 400;

	var height = 480;

	var url    = "/jsp/kblcm/common/CM_calendar_lst.jsp?formname='"+arg+"'&delim='"+delim+"'";

	var calendarLeft = (screen.width  - width) / 2;

	var calendarTop  = (screen.height - height) / 2;

    window.open(url,'win','left='+calendarLeft+',top='+calendarTop+',toolbar=no,width='+width+',height='+height);

}



 /* =============================================================

  Function : openModalWindow

  Return   : N/A

  Usage    : 윈도우 모달창을 띄운다.

================================================================= */

function openModalWindow (url, sendData, width, height){

	

	var vntResult = new Array();

	

	vntResult  = window.showModalDialog(url, sendData, 

	"dialogWidth="+width+"px; dialogHeight="+height+"px; center: Yes; help: No; resizable: No; status: No;");

	

	return vntResult;

}



/*=============================================================================

  Function : setFocus

  Return   : N/A

  Usage    : 지정필드에 포거스 이동처리 함수

=============================================================================*/

function setFocus(fld, frm){

	if(!frm) frm = document.forms[0];//default

	if(frm.elements[fld] && !frm.elements[fld].disabled){

		frm.elements[fld].focus();

	}

}



/*=============================================================================

  Function : setDisabled

  Return   : N/A

  Usage    : 지정필드를 dialbled 시킨다.

=============================================================================*/

function setDisabled(fld, bln, frm){

	if(!frm) frm = document.forms[0];//default

	

	var obj = frm.elements[fld];

	obj.disabled = bln;

	

}



/*=============================================================================

  Function : setMultiChecked

  Return   : true/false

  Usage    : 체크박스 전체 선택/해지를 한다.

=============================================================================*/

function setMultiChecked(fld, bln, frm){

	if(!frm) frm = document.forms[0];//default

	var obj = frm.elements[fld];

	

	if ( obj.length > 1) 

	{

		for (i=0;i<obj.length;i++) 

		{

			obj[i].checked = bln;	

		}

	}

	else 

	{

		obj.checked = bln;

	}

	

	

}



// ***** 별다셋개중요도.

/**

	데이타 로딩중이나 기타 중요상태일때 event를 컨트롤한다.

	각자 원하는 함수를 쓰면된당.

	이곳에서 마우스 커서를 바꾼다든가..기타..일하면된당.

*/



// 이벤트제어변수.

// 디폴트는 false로 한당.

var _LOAD_STAT = false;



/*=============================================================================

  Function : 로딩을 시작하고 커서를 모래시계로 바꾼다.

  Return   : true/false

  Usage    :

=============================================================================*/

function beginLoading(){

	_LOAD_STAT = true;

	document.body.style.cursor = "wait";

}



/*=============================================================================

  Function : 로딩을 끝내고 커서를 디폴트로 바꾼다.

  Return   : true/false

  Usage    :

=============================================================================*/

function endLoading(){

	_LOAD_STAT = false;

	document.body.style.cursor = "default";

	//window.status = "완료";

	//var timer = setTimeout('_StatusClear()', 1000);

}



/*=============================================================================

  Function : 실제적으로 호출되는 Loading 메서드

  Return   : true/false

  Usage    :

=============================================================================*/

function setLoading(fg){

	if(fg) {

		beginLoading();

	} else {

		endLoading();

	}

}



//컨트롤이 필요한 이벤트 목록은 찾으면 계속 늘려간다.

document.onkeydown   = eventWatch;

document.onmousedown = eventWatch;



/*=============================================================================

  Function : 화면단 이벤트 핸들러 역할을 한다.

  Return   : true/false

  Usage    :

=============================================================================*/

function eventWatch(){

	if(_LOAD_STAT){

		alert("데이터를 처리 중 입니다.!!\n잠시만 기다려주십시요.");

		document.body.style.cursor = "wait";

		return false;

	} else {

		return true;

	}

}



/* =============================================================

  Function : FormControlException

  Return   : N/A

  Usage    : FormControl과 관련된 User-defined Exception

================================================================= */

function FormControlException(msg) {

	this.message=msg;

}



/*===================================================================

 Function    : checkByte(obj, byteNum)

 Return      :

 Usage 	     : 한글, 영문, 숫자등 Byte단위로 체크한다.

====================================================================*/

function checkByte(obj, len){



	var str = obj.value;

	var nLen = str.length+(escape(str)+"%u").match(/%u/g).length-1;

    if ( nLen <= len ) {

       return true;

    } else {

        return false;

    }



	/*var tmpStr;



	tmpStr = obj.value;



	var temp    = 0;

	var onechar;

	var tcount;

	tcount      = 0;



	temp = tmpStr.length;



	for (k = 0 ; k < obj.value.length ; k++){



			onechar = obj.value.charAt(k);

			if (escape(onechar) =='%0D') { } else if (escape(onechar).length > 4) { tcount += 2; } else { tcount++; }

	}





	if(tcount>byteNum) {

		reserve = tcount-byteNum;

		alert(byteNum+" 자 이상 입력하실 수 없습니다.");

		fCutText(obj, byteNum);

		return false;

	}



	return true;*/

}



function fCutText(obj, byteNum){

	var tmpStr;

	var temp=0;

	var onechar;

	var tcount;

	tcount = 0;



	tmpStr = obj.value;

	temp = tmpStr.length;



	for(k = 0 ; k < obj.value.length ; k++){



			onechar = obj.value.charAt(k);



			if(escape(onechar).length > 4) {

					tcount += 2;

			} else {

					// 엔터값이 들어왔을때 값(\r\n)이 두번실행되는데 첫번째 값(\n)이 들어왔을때 tcount를 증가시키지 않는다.

					if(escape(onechar)=='%0A') {

					} else {

							tcount++;

					}

			}



			if(tcount>byteNum) {

					tmpStr = tmpStr.substring(0,k);

					break;

			}



	}

	obj.value = tmpStr;

	fCheckByte(obj, byteNum);

}



/* =============================================================================

	Function : disabledFalseStart(obj)

	Return : 

	Usage : submit할때 disabled된것을 disabled=false로 만들어준다.

			submit후에 disabled을 true로 셋팅.

			이하 2개 함수를 같이 사용.

			

			> var fc = new FormControl();

			> fc.disabledFalseStart(pFrm);

			> //실제 submit하는부분.

			> fc.disabledRollBack();			

============================================================================= */

function disabledFalseStart(obj){

	if(obj){

		var his = new Array(obj.elements.length);

		for(var i=0;i<obj.elements.length;i++){

			if(obj.elements[i].disabled){

				his[i]= true;				

				

				obj.elements[i].disabled = false;

			}//end if

		}//end for

		this.m_obj = obj;

		this.m_his = his;

	}//end if

}//end fun



function disabledRollBack(){

	if(this.m_obj){

		var obj = this.m_obj;

		var his = this.m_his;

		for(var i=0;i<his.length;i++){

			if(his[i])

				obj.elements[i].disabled = his[i];

		}//end for

	}//end if

}//end fun









/* =============================================================================

  Function : funcEmailValidate

  Return   : true/false

  Usage    : 필수 입력사항 체크

============================================================================= */

function funcEmailValidate(mail1, mail2, totMail, frm) 

{

	var mail1obj = eval("document.all['"+mail1+"']");

	var mail2obj = eval("document.all['"+mail2+"']");

	var totMailobj = eval("document.all['"+totMail+"']");

	if (mail1obj.value.length == 0) 

	{

	    setFocus(mail1);

    	alert("정확한 메일주소를 입력해 주십시오.");

	  	return false;

	}

	if (mail2obj.length != 0) 

	{

		mail1obj.disabled = false;

		if(mail2obj.value.length == 0){

			alert("정확한 메일주소를 입력해 주십시오.");

			return false;

		}else{

			//setFldVal(totMail, getFldVal(mail1)+"@"+getFldVal(mail2));
			setFldVal(totMail, getFldVal(mail1,'',frm)+"@"+getFldVal(mail2,'',frm),frm);

		}

	}else{

		alert("정확한 메일주소를 입력해 주십시오.");

			return false;

	}



    var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;

    if (totMailobj.value.search(format) == -1) {

		alert("정확한 메일주소를 입력해 주십시오.");

        return false;

    }

	mail2obj.disabled = true;

	

	return true;

}



/* =============================================================================

  Function : funcEmail

  Return   : true/false

  Usage    : 이메일 onChange

============================================================================= */
function setEmail(mail2, mailselect,frm){

	if(!frm) frm = document.forms[0];//default

	var email2 =  getFldVal(mail2,'',frm); 

	var email3 =  getFldVal(mailselect,'',frm); 

	if(email3.length == 0){

	}else{

		if(email3 == "etc"){

			eval("document.all['"+mail2+"']").disabled = false;

			//setFocus(mail2);
			setFldVal(mail2, "",frm); 

			setFocus(mail2,frm);


		}else{      

			setFldVal(mail2, email3,frm); 

			eval("document.all['"+mail2+"']").disabled = true;

		}

	}

}
/* =============================================================

  Function : openWindow

  Return   : N/A

  Usage    : 윈도우 팝업창을 띄운다.

================================================================= */

function openCalendarHolidayArg(){


	var width  = 400;

	var height = 480;

	var url    ="/jsp/kblcm/common/CM_calendar_holiday_lst.jsp";

	var calendarLeft = (screen.width  - width) / 2;

	var calendarTop  = (screen.height - height) / 2;

    window.open(url,'win','left='+calendarLeft+',top='+calendarTop+',toolbar=no,width='+width+',height='+height);

}
