var defaultDateFormat = "yyyy-MM-dd";
jQuery.noConflict();

/**
 * ***************************************************************************** String Method *****************************************************************************
 */
/**
 * 문자열 안에 조회 할 문자열의 개수를 리턴
 *
 * @param s :
 *            전체 문자열
 * @param w :
 *            검사할 문자열
 * @return 양의정수
 */
function fxWordCount( s, w )
{
	var c = 0;
	var sp;
	var lw = w.length;
	while( s.indexOf( w ) > -1 )
	{
		c++;
		sp = s.indexOf( w );
		ls = s.length;
		s = s.substr( 0, sp ) + s.substr( sp + lw, ls );
	}

	return c;
}

/**
 * firefox용 word-break(http://www.hedgerwow.com/360/dhtml/css-word-break.html)
 *
 * <pre>
 * void function(){
 *         var aEl = document.getElementsByTagName('div');
 *         var dEl,i;
 *         var sName = "break-word";
 *         var oReg =  new RegExp('(\\s|^)' + sName + '(\\s|$)');
 *         for(i=0;dEl = aEl[i];i++){
 *           if(dEl.className.match(oReg)){
 *             breakWord(dEl);
 *           }
 *         }
 *       }();
 * </pre>
 *
 * @param s :
 *            전체 문자열
 * @param w :
 *            검사할 문자열
 * @return 양의정수
 */
function breakWord( dEl )
{
	if( !dEl || dEl.nodeType !== 1 )
	{
		return false;
	}
	else if( dEl.currentStyle && typeof dEl.currentStyle.wordBreak === 'string' )
	{
		//Lazy Function Definition Pattern, Peter's Blog
		// From http://peter.michaux.ca/article/3556

		breakWord = function( dEl )
		{
			//For Internet Explorer
			dEl.runtimeStyle.wordBreak = 'break-all';
			return true;
		}

		return breakWord( dEl );
	}
	else if( document.createTreeWalker )
	{
		//Faster Trim in Javascript, Flagrant Badassery
		// http://blog.stevenlevithan.com/archives/faster-trim-javascript
		var trim = function( str )
		{
			str = str.replace( /^\s\s*/, '' );
			var ws = /\s/, i = str.length;
			while( ws.test( str.charAt( --i ) ) )
				;
			return str.slice( 0, i + 1 );
		}
		//Lazy Function Definition Pattern, Peter's Blog
		// From http://peter.michaux.ca/article/3556

		breakWord = function( dEl )
		{
			//For Opera, Safari, and Firefox
			var dWalker = document.createTreeWalker( dEl, NodeFilter.SHOW_TEXT, null, false );
			var node, s, c = String.fromCharCode( '8203' );
			while( dWalker.nextNode() )
			{
				node = dWalker.currentNode;
				// we need to trim String otherwise Firefox will display
				// incorect text-indent with space characters
				s = trim( node.nodeValue ).split( '' ).join( c );
				node.nodeValue = s;
			}
			return true;
		}

		return breakWord( dEl );
	}
	else
	{
		return false;
	}
}

/**
 * ajax로 가져온 결과 페이지에 script를 동적으로 로드
 *
 * <pre>
 * divSample.innerHTML = ajaxHtmlSource; // ajaxHtmlSource는 script태그를 포함하고 있는 html문서. 현재 문서에 ajaxHtmlSource를 포함시킨다.
 * fxEvalScript(ajaxHtmlSource); // ajaxHtmlSource에서 script태그 부분을 동적으로 로드시킨다.
 * </pre>
 */
function fxEvalScript( html )
{
	var re = /<script\b[\s\S]*?>([\s\S]*?)<\//ig;
	var match;
	while( match = re.exec( html ) )
	{
		eval( match[1] );
	}
}

/**
 ******************************************************************************
 * Number Method
 ******************************************************************************
 */
/**
 * 반올림
 *
 * <pre>
 * 예제)
 * var n = fxRoundPrecision(2.005, 3) // n은 2.01
 * </pre>
 *
 * @param v :
 *            반올림 할 값
 * @param p :
 *            반올림 할 자리수
 * @return 실수
 */
function fxRoundPrecision( v, p )
{
	var x = Math.pow( 10, p );
	return Math.round( v * x ) / x;
}

/**백분율
 *
 * <pre>
 * 예제)
 * var n = fxPercent(1, 3, 3) // n은 0.33
 * </pre>
 *
 * @param n : 분자
 * @param d : 분모
 * @param p : 반올림 할 소수점 자리수
 * @return 실수
 */
function fxPercent( n, d, p )
{
	return fxRoundPrecision( n / d * 100, p )
}

/**
 ******************************************************************************
 * Object Control Method
 ******************************************************************************
 */
/**
 * 지정한 이름의 element배열값을 문자열로 변환
 *
 * <pre>
 * 예제)
 * var n = fxCheckedValue(document.frm, &quot;UserID&quot;, &quot;/&quot;) // n은 ==&gt; hong123/hong124/hong125
 * </pre>
 *
 * @param f :
 *            폼element
 * @param n :
 *            element명
 * @param d :
 *            구분문자
 * @return 문자열
 */
function fxCheckedValue( f, n, d )
{
	var result = "";
	jQuery( "input[name=" + n + "]:checked", f ).each( function( i, elem )
	{
		result += jQuery( this ).val() + ( jQuery( "input[name=" + n + "]:checked", f ).size() - 1 == i ? "" : d );
	} );

	return result;
}

/**팝업 중앙에 띄우기
 *
 * <pre>
 * 예제)
 * fxPopCenter("SamplePopup.html", "TargetName", 500, 600, "yes");
 * </pre>
 *
 * @param u : 이동할 URL
 * @param p : 팝업타겟명
 * @param w : 가로사이즈
 * @param h : 세로사이즈
 * @param s : 스크롤사용여부(yes/no)
 */
function fxPopCenter( u, p, w, h, s )
{
	var winl = ( screen.width - w ) / 2;
	var wint = ( screen.height - h ) / 2;

	opt = 'height=' + h + ',width=' + w + ',top=' + wint + ',left=' + winl + ',scrollbars=' + s + ',resizable=no';
	w = window.open( u, p, opt );

	if( parseInt( navigator.appVersion ) >= 4 )
		w.window.focus();
}

/**폼element 내의 선택된 checkbox수 검사
 *
 * <pre>
 * 예제)
 * var n = fxCheckedCount(document.frm, "UserID") // n은 UserID를 이름으로 갖는 선택된 checkbox의 개수
 * </pre>
 *
 * @param f : 폼element
 * @param n : checkbox element명
 * @return 양의정수
 */
function fxCheckedCount( f, n )
{
	return jQuery( "input[name=" + n + "]:checkbox:checked", f ).size();
}

/**폼element 내의 checkbox나 radio의 선택여부 검사
 *
 * <pre>
 * 예제)
 * var b = fxIsChecked(document.frm, "UserID"); // 선택된 UserID가 있는 경우 true, 없는 경우 false
 * </pre>
 *
 * @param f : 폼element
 * @param n : checkbox, radio element명
 * @return 하나이상 체크된 경우 true, 아닌 경우 false
 */
function fxIsChecked( f, n )
{
	return jQuery( "input[name=" + n + "]:checked", f ).size() > 0 ? true : false;
}

/**체크박스 전체선택/전체해제
 *
 * @param e : 전체선택/해제용 체크박스
 * @param f : 폼element
 * @param n : 전체선택/해제할 체크박스명
 */
function fxToggleAll( e, f, n )
{
	if( e.checked )
		fxCheckAll( f, n );
	else
		fxClearAll( f, n );
}

/**체크박스 전체해제
 *
 * @param f : 폼element
 * @param n : 전체해제할 체크박스명
 */
function fxClearAll( f, n )
{
	for( var i = 0; i < f.elements.length; i++ )
		if( n == f.elements[i].name )
			f.elements[i].checked = false;
}

/**체크박스 전체선택
 *
 * @param f : 폼element
 * @param n : 전체선택할 체크박스명
 */
function fxCheckAll( f, n )
{
	for( var i = 0; i < f.elements.length; i++ )
		if( n == f.elements[i].name )
			f.elements[i].checked = true;
}

/**지정페이지로 이동. 최상위 부모페이지만 남기고 나머지는 종료.
 *
 * @param url
 */
function fxExpireSessionPage( url )
{
	var to = opener;
	var to2;
	if( to )
	{
		// 상위의 오프너페이지가 닫혀진 경우에는 자신의 페이지만 닫고 종료하도록 예외처리
		try
		{
			// 오프너페이지가 있는 경우
			while( to )
			{
				to2 = to.opener;

				// 오프너페이지의 오프너페이지가 있는 경우
				if( to2 )
				{
					// 오프너페이지가 프레임인 경우
					if( to.parent )
						to.parent.close(); // 오프너페이지가 프레임인 경우 프레임 상위에서 창을 닫는다.
					else
						// 오프너페이지가 프레임이 아닌 경우
						to.close(); // 오프너페이자가 프레임이 아닌 경우는 그냥 창을 닫는다.
				}
				else
				// 오프너페이지의 오프너가 없는 경우에는
				{
					// 오프너페이지가 프레임인 경우 상위의 페이지를 지정한 주소로 이동
					if( to.parent )
						to.parent.location.href = url;
					else
						// 오프너페이지가 프레임이 아닌 경우 지정한 주소로 이동
						to.location.href = url;
				}

				to = to2; // 상위의 오프너페이지가 없을 때까지 루프를 돌면서 체크
			}

			// 현재 창이 프레임인 경우 상위에서 창을 닫는다.
			if( top.parent == "[object]" )
				top.parent.self.close();
			else
				// 현재 창이 프레임이 아닌 경우 창을 닫는다.
				top.self.close();
		}
		catch( e )
		{
			// 상위의 오프너페이지가 닫혀진 경우 현재 창만 닫고 끝낸다.
			if( top.parent )
				top.parent.self.close();
			else
				top.self.close();
		}
	}
	else if( top.parent ) // 프레임인 경우 상위페이지에서 지정한 주소로 이동
	{
		top.location.href = url;
	}
	else
	// 현재 페이지에서 지정한 주소로 이동
	{
		location.href = url;
	}
}

/**submit 대응함수
 *
 * @param fobj : submit할 폼
 * @param act : action
 * @param tar : target
 * @param v : programId추가(값이 없는 경우에는 element를 추가하지 않음)
 */
function fxSubmit( fobj, act, tar, v )
{
	var preAction = fobj.action;
	var preTarget = fobj.target;

	if( v != "" && v != null )
		fxAddElement( fobj, "hidden", "programId", v );

	fobj.action = act;
	fobj.target = tar;
	fobj.submit();

	fobj.action = preAction;
	fobj.target = preTarget;
}

/**폼에 input element 추가(이미 있는 input element라면 값만 수정)
 *
 * <pre>
 * 예제)
 * var b = fxAddElement(document.frm, "hidden", "EleName", "1000");
 * </pre>
 *
 * @param f : 폼element
 * @param t : type
 * @param n: name
 * @param v: value
 */
function fxAddElement( f, t, n, v )
{
	var ele;
	for( var i = 0; i < f.elements.length; i++ )
	{
		if( n == f.elements[i].name )
		{
			ele = f.elements[i];
			break;
		}
	}

	if( !ele )
	{
		ele = document.createElement( "input" );
		ele.type = t;
		ele.id = n;
		ele.name = n;
		ele.value = v;

		f.appendChild( ele );
	}
	else
	{
		ele.value = v;
	}
}

/**iframe 사이즈 조정
 *
 * <pre>
 * 예제)
 * <iframe name="sample" src="" width="100%" onload="fxResizeIframe(this)">
 * </pre>
 *
 * @param o : iframe element
 */
function fxResizeIframe( o, min )
{
	var body;
	var h;

	body = ( o.contentWindow.document.getElementsByTagName( 'BODY' ) )[0];
	h = parseInt( body.scrollHeight ) + 5;
	o.style.height = ( h < min ? min : h ) + 'px';

	// window.scrollTo(1, 1);
}

/**
 ******************************************************************************
 * Paging Method
 ******************************************************************************
 */
/**
 * 페이지 이동
 *
 * @param pnum :
 *            이동할 페이지
 * @param f :
 *            폼element
 * @param pname :
 *            페이지element명
 */
function fxSubmitPaging( pnum, f, pname )
{
	fxAddElement( f, "hidden", pname, pnum );
	f.submit();
}

/**
 ******************************************************************************
 * RowSpan Method
 ******************************************************************************
 */
/**
 * 이전 td의 rowspan attribute를 기준으로 지정한 td의 rowspan attribute를 지정
 *
 */
function fxCalculateRow( trElem, prevIdx, idx )
{
	var prevTdElem = trElem.children( ":nth-child(" + prevIdx + ")" ); // rowspan할 열의 기준이 되는 열
	var tdElem = trElem.children( ":nth-child(" + idx + ")" ); // rowspan할 열

	var sp = 1; // 루프 시작점
	var ep = null; // 루프 종료점
	var loopFlag = true;
	while( loopFlag )
	{
		if( prevIdx > 0 )
			ep += prevTdElem.eq( sp ).attr( "rowspan" );
		else
			ep = tdElem.size() - 1; // 가장 처음 rowspan을 적용할 때는 전체 열의 개수를 기준으로 계산

		var rowSpanCnt = 1;
		var prevVal = "";
		var rp = sp; // rowspan 적용할 row의 위치
		for( var i = sp; i <= ep; i++ )
		{
			if( tdElem.eq( i ).attr( "mergevalue" ) == prevVal )
			{
				rowSpanCnt++;
			}
			else
			{
				tdElem.eq( rp ).attr( "rowspan", rowSpanCnt );
				rowSpanCnt = 1;
				rp = i;
				prevVal = tdElem.eq( i ).attr( "mergevalue" );
			}
		}

		if( rowSpanCnt > 1 )
		{
			tdElem.eq( rp ).attr( "rowspan", rowSpanCnt );
		}

		sp = ep + 1;
		if( sp >= prevTdElem.size() )
			loopFlag = false;
	}
}

function fxMergeRow( trElem, idx )
{
	var j = 0;
	var rowCnt = 0;
	var tdElem = trElem.children( ":nth-child(" + idx + "):gt(0)" );
	while( tdElem.size() > rowCnt )
	{
		var rowSpanCnt = tdElem.eq( rowCnt ).attr( "rowspan" );
		for( var i = rowCnt + 1; i < rowCnt + rowSpanCnt; i++ )
		{
			tdElem.eq( i ).remove();
		}

		rowCnt += rowSpanCnt;
	}
}

/**
 * <pre>
 *   &lt;table mergetable="true" border=1&gt;
 *     &lt;tr&gt;
 *   	&lt;td mergecolumn="true"&gt;학교&lt;/td&gt;
 *   	&lt;td mergecolumn="false"&gt;과목&lt;/td&gt;
 *   	&lt;td mergecolumn="true"&gt;학년&lt;/td&gt;
 *     &lt;/tr&gt;
 *     &lt;tr&gt;
 *   	&lt;td mergevalue="초등학교"&gt;초등학교&lt;/td&gt;
 *   	&lt;td mergevalue="바른생활"&gt;바른생활&lt;/td&gt;
 *   	&lt;td mergevalue="1학년"&gt;1학년&lt;/td&gt;
 *     &lt;/tr&gt;
 *     &lt;tr&gt;
 *   	&lt;td mergevalue="초등학교"&gt;초등학교&lt;/td&gt;
 *   	&lt;td mergevalue="바른생활"&gt;바른생활&lt;/td&gt;
 *   	&lt;td mergevalue="2학년"&gt;1학년&lt;/td&gt;
 *     &lt;/tr&gt;
 *     &lt;tr&gt;
 *   	&lt;td mergevalue="초등학교"&gt;초등학교&lt;/td&gt;
 *   	&lt;td mergevalue="슬기로운생활"&gt;슬기로운생활&lt;/td&gt;
 *   	&lt;td mergevalue="1학년"&gt;1학년&lt;/td&gt;
 *     &lt;/tr&gt;
 *   &lt;/table&gt;
 * </pre>
 * @return
 */
function fxMergeTable()
{
	var trElem = jQuery( "table[mergetable=true]>tbody>tr" );
	var prevIdx = 0; // 이전 셀합치가한 td열의 idx(1부터 시작)
	trElem.eq( 0 ).children().each( function( i )
	{
		if( jQuery( this ).attr( "mergecolumn" ) == "true" )
		{
			fxCalculateRow( trElem, prevIdx, i + 1 );
			prevIdx = i + 1;
		}
	} );

	trElem.eq( 0 ).children().each( function( i )
	{
		if( jQuery( this ).attr( "mergecolumn" ) == "true" )
		{
			fxMergeRow( trElem, trElem.eq( 0 ).children().size() - i );
		}
	} );
}

/**
 ******************************************************************************
 * SelectBox Set Method
 ******************************************************************************
 */
var Init = true;

/**
 * selectbox 설정
 *
 * @param param :
 *            파라미터
 * @param chgVal :
 *            선택된코드
 * @param chgObj :
 *            selectbox
 * @param msg :
 *            기본메세지
 * @param searchType :
 *            기본 fxCode 테이블이 아닌 쿼리로 조회시 타입정의
 * @param callback :
 *            callback 함수 호출
 */
function fxSetSelectBox( param, chgVal, chgObj, msg, searchType, callback )
{
	if( !Init )
		chgVal = "";

	// 지정되지 않은 경우 undefined로 넘어온다.
	if( searchType == undefined )
		searchType = "";

	jQuery.ajax(
	{
		type : "POST" ,
		url : "/shared/common/search_code.jsp?" + param, 
		data :
		{
			"searchType" : jQuery.isFunction( searchType ) ? "" : searchType
		} ,
		dataType : "json" ,
		async : false ,
		beforeSend : function()
		{
			chgObj.options.length = 1;
			chgObj.options[0].text = "조회 중입니다....";
//			jQuery( chgObj ).attr( "length", 0 ).append( "<option value=''>조회 중입니다....</option>" );
		} ,
		success : function( data )
		{
			chgObj.options.length = 0;
//			jQuery( chgObj ).attr( "length", 0 );
			
			if( msg != "" )
				jQuery( chgObj ).append( "<option value=''>" + msg + "</option>" );

			jQuery.each( data.codes, function( i, code )
			{
				jQuery( chgObj ).append( "<option value='" + jQuery.trim( code.cd ) + "'" + ( chgVal == jQuery.trim( code.cd ) ? " selected" : "" ) + ">" + jQuery.trim( code.cdNm ) + "</option>" );
			} );

			jQuery( chgObj ).change();

			// searchType은 생략 가능하므로 생략됐을 경우는 콜백함수가 올수 있으므로 타입 비교 후 실행
		if( jQuery.isFunction( searchType ) )
			searchType;
		else if( jQuery.isFunction( callback ) )
			callback;
	}
	} );

	Init = false;
}

/**selectbox 설정(fxSetSelectBox는 최초 선택된 값이 유지가 안되지만 fxInitSelectBox는 선택된 값이 유지가 된다.)
 *
 * @param selVal : 부모코드
 * @param chgVal : 선택된코드
 * @param chgObj : selectbox
 * @param msg : 기본메세지
 * @param searchType : 기본 fxCode 테이블이 아닌 쿼리로 조회시 타입정의
 * @param callback : callback 함수 호출
 */
function fxInitSelectBox( selVal, chgVal, chgObj, msg, searchType, callback )
{
	var oriInit = this.Init;
	this.Init = true;
	fxSetSelectBox( selVal, chgVal, chgObj, msg, searchType, callback );
	this.Init = oriInit;
}

 /**
  * selectbox 정렬
  * @param name : selectbox name
  * @param sorttype : 정렬대상( text, value )
  */
 function fxSortSelectBox( name, sorttype )
 {
 	var selectArr = new Array();

 	jQuery("select[name=" + name + "]>option").each(function()
 	{
 		var options = new Array();
 		if( sorttype == "value" )
 		{
 			options.push( jQuery(this).val() );
 			options.push( jQuery(this).text() );
 		}
 		else
 		{
 			options.push( jQuery(this).text() );
 			options.push( jQuery(this).val() );
 		}

 		selectArr.push(options);
 	});
 	
 	selectArr.sort();

 	jQuery("select[name=" + name + "]").attr("length", 0);

 	var txt = "";
 	var val = "";
 	for(var i = 0; i < selectArr.length; i++)
 	{
 		if( sorttype == "value" )
 		{
 			txt = selectArr[i][1];
 			val = selectArr[i][0];
 		}
 		else
 		{
 			txt = selectArr[i][0];
 			val = selectArr[i][1];
 		}
 		
 		jQuery("select[name=" + name + "]").append("<option value='" + val + "'>" + txt + "</option>");
 	}
 }
  
/**
 ******************************************************************************
 * Form Data Check Method
 ******************************************************************************
 */
function fxSetDateType( ele )
{
	// firefox에서 화면새로고침시 날짜포멧 변경이 제대로 되지 않는다. 포멧에 맞지 않는 날짜인 경우 포멧변경하지 않는다.
	if( jQuery( ele ).val().length == 8 )
		jQuery( ele ).val( fxConvertDateFormat( "yyyyMMdd", defaultDateFormat, jQuery( ele ).val() ) );

	// jquery 달력에 사용할 날짜 포멧으로 변경
	var jDateFormat = defaultDateFormat.replace( "yyyy", "yy" ).replace( "MM", "mm" );

	// closeText: '닫기',
	// prevText: '이전달',
	// nextText: '다음달',
	// currentText: '오늘',
	// monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
	// '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
	// monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
	// '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
	// dayNames: ['일','월','화','수','목','금','토'],
	// dayNamesShort: ['일','월','화','수','목','금','토'],
	// dayNamesMin: ['일','월','화','수','목','금','토'],
	// isRTL: false,
	// maxDate: '+30d',
	// minDate: '-0d',
	// changeYear : true ,
	// changeMonth : true,
	// dateFormat : jDateFormat
	jQuery( ele ).datepicker(
	{
		monthNames : [ '1월' , '2월' , '3월' , '4월' , '5월' , '6월' , '7월' , '8월' , '9월' , '10월' , '11월' , '12월' ] ,
		monthNamesShort : [ '1월' , '2월' , '3월' , '4월' , '5월' , '6월' , '7월' , '8월' , '9월' , '10월' , '11월' , '12월' ] ,
		dayNames : [ '일' , '월' , '화' , '수' , '목' , '금' , '토' ] ,
		dayNamesShort : [ '일' , '월' , '화' , '수' , '목' , '금' , '토' ] ,
		dayNamesMin : [ '일' , '월' , '화' , '수' , '목' , '금' , '토' ] ,
		isRTL : false ,
		changeYear : true ,
		changeMonth : true ,
		dateFormat : jDateFormat
	} );

	// jQuery( ele ).val();
}

var xes;

function fxSetAttribute( ele, xml )
{
	var arr = ["required", "label", "elementtype", "datatype", "chartype", "maxlen", "minlen", "charfilter", "filetype", "decimalpoint", 
	           "minvalue", "maxvalue", "beforedateobj", "afterdateobj", "duplicatedate", "selectcount", "isarray", "compare" ];
	
	jQuery(arr).each(function()
	{
		if( jQuery( ele ).attr( "" + this ) == null )
			jQuery( ele ).attr( "" + this, xml.attr( "" + this ) );
	});
	
	if( jQuery( ele ).attr( "datatype" ) == "date" )
		fxSetDateType( ele );
}

function fxLoadValidationXml( pagename, f )
{
	jQuery.ajax(
	{
		type : "GET" ,
		url : pagename ,
		dataType : "xml" ,
		beforeSend : function()
		{
			//			jQuery.blockUI(
		//			{
		//				message : "잠시만 기다려 주세요."
		// } );
	} ,
	success : function( xmlDoc )
	{
		xes = jQuery( "element", xmlDoc );
		xes.each( function()
		{
			if( jQuery( this ).attr( "elementtype" ) != "fileiframe" && jQuery( this ).attr( "elementtype" ) != "editor" )
			{				
				ele = eval( "document." + f.name + "." + jQuery( this ).attr( "name" ) );
				
				if( ele == undefined )
				{
					if( jQuery( this ).attr( "optional" ) != "true" )
						alert( jQuery( this ).attr( "name" ) + " 항목은 element가 아니거나 사용되지 않는 element입니다." );					
				}
				else if( ele[0] == undefined ) // 배열이 아닌 경우
				{
					if( ele.name == undefined && jQuery( this ).attr( "optional" ) != "true" )
						alert( jQuery( this ).attr( "name" ) + " 항목은 element가 아니거나 사용되지 않는 element입니다." );

					fxSetAttribute( ele, jQuery( this ) );
				}
				else
				{
					if( ele[0].tagName == "OPTION" ) // selectbox인 경우
					{
						fxSetAttribute( ele, jQuery( this ) );
					}
					else // 배열인 경우
					{
						if( jQuery( this ).attr( "isarray" ) != "true" )
							alert( jQuery( this ).attr( "label" ) + " 항목은 배열속성으로 지정되지 않은 element입니다. 속성값을 확인해 주세요." );

						for( var i = 0; i < ele.length; i++ )
						{
							fxSetAttribute( ele[i], jQuery( this ) );
						}
					}
				}
			}
		} );

		// jQuery.unblockUI();
	} ,
	error : function( xhr, textStatus, errorThrown )
	{
		alert( xhr.status );
		alert( textStatus );
		alert( errorThrown );
		// alert( "fxLoadValidationXml initialization failed" );
	}
	} );
}

/**폼하위의 모든 element에 대해서 입력 또는 선택여부체크
 *
 * @param f : 폼
 */
function fxValidateFormElement( f )
{
	var msg = "";
	var addfiles = "";
	var deletefiles = "";

	// xmlDoc가 null이면 초기화 스크립트 누락
	if( xes == null )
		return "xml file initialization failed";

	for( var i = 0; i < xes.size(); i++ )
	{
		required = jQuery( xes[i] ).attr( "required" );
		label = jQuery( xes[i] ).attr( "label" );
		elementtype = jQuery( xes[i] ).attr( "elementtype" );
		elementname = jQuery( xes[i] ).attr( "name" );
		isarray = jQuery( xes[i] ).attr( "isarray" );

		if( elementtype == "fileiframe" )
		{
			if( isarray == "true" )
			{
				return "isarray 속성은 fileframe, editor은 지원하지 않습니다.";
			}

			fcnt = eval( elementname + ".getFileCount()" );

			if( fcnt == 0 && required == "true" )
			{
				return "[" + label + "]항목을 등록해 주세요.";
			}
			else
			{
				if( addfiles == "" )
					addfiles = eval( elementname + ".getAddFileList()" );
				else
					addfiles += "," + eval( elementname + ".getAddFileList()" );

				if( deletefiles == "" )
					deletefiles = eval( elementname + ".getDeleteFileList()" );
				else
					deletefiles += "," + eval( elementname + ".getDeleteFileList()" );
			}
		}
		else if( elementtype == "editor" )
		{
			if( isarray == "true" )
			{
				return "isarray 속성은 fileframe, editor은 지원하지 않습니다.";
			}

			fe = eval( "f." + elementname );
			editor = eval( jQuery( xes[i] ).attr( "editorname" ) );

			if( fe != undefined )
			{
				fe.value = editor.outputBodyHTML();
				if( required == "true" && jQuery.trim( editor.outputBodyHTML() ) == "" )
				{
					return "[" + label + "] 항목을 입력하지 않았습니다. 입력해 주세요.";
				}
			}
		}
		else
		{
			ele = eval( "f." + elementname );

			if( ele != undefined )
			{
				if( ele[0] == undefined ) // 배열이 아닌 경우
				{
					if( ele.name == undefined && jQuery( this ).attr( "optional" ) != "true" )
						alert( jQuery( this ).attr( "name" ) + " 항목은 element가 아니거나 사용되지 않는 element입니다." );

					msg = fxValidteElement( f, ele );
				}
				else
				{
					if( ele[0].tagName == "OPTION" ) // selectbox인 경우
					{
						msg = fxValidteElement( f, ele );
					}
					else // 배열인 경우
					{
						if( jQuery( this ).attr( "isarray" ) != "true" )
							return jQuery( this ).attr( "label" ) + " 항목은 배열속성으로 지정되지 않은 element입니다. 속성값을 확인해 주세요.";

						for( var j = 0; j < ele.length; j++ )
						{
							msg = fxValidteElement( f, ele[j] );
							if( msg != "" )
								return msg;
						}
					}
				}
			}
		}

		if( msg != "" )
			return msg;
	}

	jQuery( "form[name=" + f.name + "]" ).append( "<input type=hidden name=addFiles value='" + addfiles + "'>" ).append( "<input type=hidden name=deleteFiles value='" + deletefiles + "'>" );

	// 날짜타입 기본상태(yyyyMMdd)로 변경
//	for( var i = 0; i < xes.length; i++ )
//	{
//		xe = xes[i];
//		datatype = xe.getAttribute( "datatype" );
//		elementname = xe.getAttribute( "name" );
//
//		if( datatype == "date" )
//		{
//			fe = eval( "f." + elementname );
//			fe.value = fxConvertDefaultDateFormat( fe.value, fe.getAttribute( "dateformat" ) );
//		}
//	}

	return msg;
}

/**
 *
 * 각 폼안의 element별 데이타 체크
 *
 * @param f : 폼element
 * @param fe : 폼내의 element
 */
function fxValidteElement( f, fe )
{
	if( fe.style.display == "none" )
		return "";

	var msg = ""; // 리턴메세지(오류메세지)
	var required = fe.getAttribute( "required" ); // 필수체크 여부(true : 체크)
	var elementtype = fe.getAttribute( "elementtype" ); // element타입(input, hidden, checkbox, radio, select, textarea, editor, fileiframe)
	var datatype = fe.getAttribute( "datatype" ); // 데이타 타입 설정(string, date, integer, +integer, -integer, float, +float, -float)
	if( datatype == "" || datatype == null )
		datatype = "";
	var chartype = fe.getAttribute( "chartype" ); // 문자 타입 설정(kor, eng, num)
	var label = fe.getAttribute( "label" ); // 메세지에 사용할 오브젝트명
	var maxlen = fe.getAttribute( "maxlen" ); // 문자열인 경우 최대길이
	var minlen = fe.getAttribute( "minlen" ); // 문자열인 경우 최소길이
	var charfilter = fe.getAttribute( "charfilter" ); // 필터링단어('||'를 구분자로 이용)
	var filetype = fe.getAttribute( "filetype" ); // 파일확장자설정
	var decimalpoint = fe.getAttribute( "decimalpoint" ); // 실수인 경우 소숫점설정
	var minvalue = fe.getAttribute( "minvalue" ); // 숫자타입인 경우 최소값 설정
	var maxvalue = fe.getAttribute( "maxvalue" ); // 숫자타입인 경우 최대값 설정
	var beforedate = fe.getAttribute( "beforedate" ); // 선택날짜와 비교할 이전날짜
	var afterdate = fe.getAttribute( "afterdate" ); // 선택날짜와 비교할 이후날짜
	var beforedateobj = fe.getAttribute( "beforedateobj" ); // 선택날짜와 비교할 이전날짜 element명
	var afterdateobj = fe.getAttribute( "afterdateobj" ); // 선택날짜와 비교할 이후날짜 element명
	var duplicatedate = fe.getAttribute( "duplicatedate" ); // 겹치는 날짜에 대한 처리조건
	var selectcount = fe.getAttribute( "selectcount" ); // checkbox인 경우 최소체크 개수 제약
	var compare = fe.getAttribute( "compare" ); // 값비교할 대상 element명

	// 필수체크
	if( required == "true" && fe.disabled == false && fe.style.display != "none" )
	{
		// 각각의 obj타입별 체크
		if( ( fe.type == "checkbox" || fe.type == "radio" ) && !fxIsChecked( f, fe.name ) )
		{
			fe.focus();
			return "[" + label + "] 항목을 선택하지 않았습니다. 선택해 주세요.";
		}
		else if( ( fe.type == "select-one" || fe.type == "select-multiple" ) && fe.value == "" )
		{
			fe.focus();
			return "[" + label + "] 항목을 선택하지 않았습니다. 선택해 주세요.";
		}
		else if( fe.type == "file" && fe.value == "" )
		{
			fe.focus();
			return "[" + label + "] 항목을 선택하지 않았습니다. 선택해 주세요.";
		}
		else if( fe.type == "hidden" && fe.value == "" )
		{
			fe.focus();
			return "[" + label + "] 항목을 선택하지 않았습니다. 선택해 주세요." + fe.value;
		}
		else if( fe.value == "" )
		{
			fe.focus();
			return "[" + label + "] 항목을 입력하지 않았습니다. 입력해 주세요.";
		}
	}

	// checkbox인 경우 체크 항목개수 제한 체크
	if( fe.type == "checkbox" && ( selectcount != "" || selectcount != null ) )
	{
		if( fxCheckedCount( f, fe.name ) < selectcount )
		{
			return "[" + label + "] 항목을 " + selectcount + "개 이상 선택해 주세요.";
		}
	}

	// 문자열 입력값 체크
	if( fe.value != "" && datatype == "string" )
	{
		// 입력가능문자열타입 체크(영문,한글,숫자)
		if( chartype != null && chartype.length > 0 )
		{
			var kor = /^[ㄱ-힣]{1,}$/;
			var eng = /^[a-zA-Z]{1,}$/;
			var num = /^[\d]{1,}$/;
			var koreng = /^[a-zA-Zㄱ-힣]{1,}$/;
			var kornum = /^[\dㄱ-힣]{1,}$/;
			var engnum = /^[a-zA-Z\d]{1,}$/;
			var korengnum = /^[a-zA-Z\dㄱ-힣]{1,}$/;
			var email = /^[\w-]+@[\w-]+(.[\w-]+)*$/g;

			var searchCnt = 0;

			if( chartype.indexOf( "kor", 0 ) > -1 )
				searchCnt = 1;
			if( chartype.indexOf( "eng", 0 ) > -1 )
				searchCnt += 3;
			if( chartype.indexOf( "num", 0 ) > -1 )
				searchCnt += 5;
			if( chartype == "email" )
				searchCnt = 10;
			if( chartype == "juminnum" )
				searchCnt = 11;

			switch( searchCnt )
			{
				case 1 :
					kor.test( fe.value ) ? "" : msg = label + "에는 한글만 입력할 수 있습니다.";
					break;
				case 3 :
					eng.test( fe.value ) ? "" : msg = label + "에는 영문만 입력할 수 있습니다.";
					break;
				case 5 :
					num.test( fe.value ) ? "" : msg = label + "에는 숫자만 입력할 수 있습니다.";
					break;
				case 4 :
					koreng.test( fe.value ) ? "" : msg = label + "에는 한글과 영문만 입력할 수 있습니다.";
					break;
				case 6 :
					kornum.test( fe.value ) ? "" : msg = label + "에는 한글과 숫자만 입력할 수 있습니다.";
					break;
				case 8 :
					engnum.test( fe.value ) ? "" : msg = label + "에는 영문과 숫자만 입력할 수 있습니다.";
					break;
				case 9 :
					korengnum.test( fe.value ) ? "" : msg = label + "에는 한글,영문과 숫자만 입력할 수 있습니다.";
					break;
				case 10 :
					email.test( fe.value ) ? "" : msg = "올바른 이메일 형식이 아닙니다.";
					break;
				case 11 :
					fxCheckJuminNum( fe.value ) ? "" : msg = "올바른 주민번호가 아닙니다.";
			}

			if( msg != "" )
			{
				fe.focus();
				return msg;
			}
		}

		// 최대입력문자자릿수 체크
		if( maxlen != null && parseInt( maxlen ) > 0 && fe.value.length > parseInt( maxlen ) )
		{
			fe.focus();
			return label + "에는 " + maxlen + "자리 이상 입력할수 없습니다.[입력문자수:" + fe.value.length + "]";
		}

		// 최소입력문자자릿수 체크
		if( minlen != null && parseInt( minlen ) > 0 && fe.value.length < parseInt( minlen ) )
		{
			fe.focus();
			return label + "에는 " + minlen + "자리 이상 입력해야 합니다.";
		}

		// 필터링할 문자체크
		if( charfilter != null && charfilter.length > 0 )
		{
			var strArr = charfilter.split( "//" );

			for( var i = 0; i < strArr.length; i++ )
			{
				chkChar = strArr[i];

				if( chkChar != "" && fe.value.indexOf( chkChar, 0 ) > -1 )
				{
					fe.focus();
					return label + "에는 '" + chkChar + "' 의 문자는 입력하실 수 없습니다.";
				}
			}
		}
		
		// 입력값 비교
		if( compare != null && compare != "undefined" && compare.length > 0 )
		{
			//alert(compare);
			var ele = eval( "f." + compare );
			if( fe.value != ele.value )
				return "입력하신 내용이 일치하지 않습니다.";
		}
	}

	// 파일업로드 입력값 체크
	if( fe.type == "file" && fe.value != "" && filetype != null && filetype != "" )
	{
		// 업로드가능한 파일타입체크
		var fname = fe.value;
		var fDot = fname.lastIndexOf( "." ) + 1;
		var ftype = fname.substring( fDot ).toUpperCase();

		if( filetype.toUpperCase().indexOf( ftype, 0 ) == -1 )
		{
			fe.focus();
			return "업로드 할 수 없는 파일타입입니다.";
		}
	}

	// 숫자타입 입력값 체크
	if( fe.value.length > 0 && ( datatype.indexOf( "integer" ) > -1 || datatype.indexOf( "float" ) > -1 ) )
	{
		if( datatype == "+integer" )
		{
			regExp = /^(\+|\d*)\d+$/;
			msg = label + "에는 양의 정수만 입력할 수 있습니다.";
		}
		else if( datatype == "-integer" )
		{
			regExp = /^(\-\d*)\d+$/;
			msg = label + "에는 음의 정수만 입력할 수 있습니다.";
		}
		else if( datatype == "integer" )
		{
			regExp = /^(\-|\+|\d*)\d+$/;
			msg = label + "에는 정수만 입력할 수 있습니다.";
		}
		else if( datatype == "+float" )
		{
			regExp = /^(\+|\d*)\d+(\.|\d*)\d*$/;
			msg = label + "에는 양의 실수만 입력할 수 있습니다.";
		}
		else if( datatype == "-float" )
		{
			regExp = /^(\-\d*)\d+(\.|\d*)\d*$/;
			msg = label + "에는 음의 실수만 입력할 수 있습니다.";
		}
		else if( datatype == "float" )
		{
			regExp = /^(\-|\+|\d*)\d+(\.|\d*)\d*$/;
			msg = label + "에는 실수만 입력할 수 있습니다.";
		}

		if( regExp.test( fe.value ) )
		{
			fe.value = parseFloat( fe.value );
			msg = "";
		}
		else
		{
			fe.focus();
			return msg;
		}

		// 소숫자리 체크
		if( !isNaN( decimalpoint ) )
		{
			var len = -1;

			if( fe.value.indexOf( "." ) >= 0 )
				len = fe.value.substring( fe.value.indexOf( "." ) + 1 ).length;

			if( len > parseInt( decimalpoint ) )
			{
				fe.focus();
				return label + "에는 소수점 " + decimalpoint + "자리까지 입력해 주세요.";
			}
		}

		// 최소값 체크
		if( !isNaN( minvalue ) && parseFloat( fe.value ) < parseFloat( minvalue ) )
		{
			fe.focus();
			return label + "에는 " + parseFloat( minvalue ) + "보다 같거나 큰값을 입력해 주세요.";
		}

		// 최대값 체크
		if( !isNaN( maxvalue ) && parseFloat( fe.value ) > parseFloat( maxvalue ) )
		{
			fe.focus();
			return label + "에는 " + parseFloat( maxvalue ) + "보다 같거나 작은값을 입력해 주세요.";
		}
	}

	// 날짜체크
	if( fe.value.length > 0 && datatype == "date" )
	{
		// 날짜 유효성 체크 (년/월/일에 대한 유효성 체크)
		if( !fxIsDate( fe ) )
		{
			fe.value = "";
			fe.focus();
			return "[" + label + "] 항목은 올바른 날짜 형식이 아닙니다. [" + defaultDateFormat + "] 형식으로 등록해 주세요.";
		}

		// 날짜 체크(이전날짜(beforedate)나 이후날짜(afterdate)가 있는 해당 아이디에 대해서 체크한다)
		if( beforedate != null && beforedate.length > 0 )
		{
			var preDate = fxConvertDefaultDateFormat( beforedate ); // 비교할 이전날짜
			var toDate = fxConvertDefaultDateFormat( fe.value ); // 비교할 선택날짜

			// 겹치는 날짜체크 옵션(duplicatedate)
			if( duplicatedate == "false" )
			{
				if( parseFloat( preDate ) >= parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + beforedate + "' 보다 이후 날짜를 선택하셔야 합니다.";
			}
			else
			{
				if( parseFloat( preDate ) > parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + beforedate + "' 보다 같거나 이후 날짜를 선택하셔야 합니다.";
			}
		}
		else if( beforedateobj != null && beforedateobj.length > 0 )
		{
			if( eval( "f." + beforedateobj ) == undefined )
				return "비교할 날짜항목[" + beforedateobj + "]이 존재하지 않습니다.";
			var beforedateobj = eval( "f." + beforedateobj );
			var beforedatename = beforedateobj.getAttribute( "label" );

			var preDate = fxConvertDefaultDateFormat( beforedateobj.value ); // 비교할 이전날짜
			var toDate = fxConvertDefaultDateFormat( fe.value ); // 비교할 선택날짜

			// 겹치는 날짜체크 옵션(duplicatedate)
			if( duplicatedate == "false" )
			{
				if( parseFloat( preDate ) >= parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + beforedatename + "' 보다 이후 날짜를 선택하셔야 합니다.";
			}
			else
			{
				if( parseFloat( preDate ) > parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + beforedatename + "' 보다 같거나 이후 날짜를 선택하셔야 합니다.";
			}
		}

		if( afterdate != null && afterdate.length > 0 )
		{
			var afterDate = fxConvertDefaultDateFormat( afterdate ); // 비교할 이전날짜
			var toDate = fxConvertDefaultDateFormat( fe.value ); // 비교할 선택날짜

			// 겹치는 날짜체크 옵션(duplicatedate)
			if( duplicatedate == "false" )
			{
				if( parseFloat( afterDate ) <= parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + afterdate + "' 보다 이전 날짜를 선택하셔야 합니다.";
			}
			else
			{
				if( parseFloat( afterDate ) < parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + afterdate + "' 보다 같거나 이전 날짜를 선택하셔야 합니다.";
			}
		}
		else if( afterdateobj != null && afterdateobj.length > 0 )
		{
			if( eval( "f." + afterdateobj ) == undefined )
				return "비교할 날짜항목[" + afterdateobj + "]이 존재하지 않습니다.";
			var afterdateobj = eval( "f." + afterdateobj );
			var afterdatename = afterdateobj.getAttribute( "label" );

			var afterDate = fxConvertDefaultDateFormat( afterdateobj.value ); // 비교할 이전날짜
			var toDate = fxConvertDefaultDateFormat( fe.value ); // 비교할 선택날짜

			// 겹치는 날짜체크 옵션(duplicatedate)
			if( duplicatedate == "false" )
			{
				if( parseFloat( afterDate ) <= parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + afterdatename + "' 보다 이전 날짜를 선택하셔야 합니다.";
			}
			else
			{
				if( parseFloat( afterDate ) < parseFloat( toDate ) )
					return "[" + label + "] 항목은 '" + afterdatename + "' 보다 같거나 이전 날짜를 선택하셔야 합니다.";
			}
		}
	}

	return msg;
}

function fxCheckJuminNum( juminnum )
{
	// 주민번호의 형태와 7번째 자리(성별) 유효성 검사
	fmt = /^\d{6}-[1234]\d{6}$/;
	if (!fmt.test(juminnum)) return false;

	// 날짜 유효성 검사
	birthYear = (juminnum.charAt(7) <= "2") ? "19" : "20";
	birthYear += juminnum.substr(0, 2);
	birthMonth = juminnum.substr(2, 2) - 1;
	birthDate = juminnum.substr(4, 2);
	birth = new Date(birthYear, birthMonth, birthDate);

	if (birth.getYear() % 100 != juminnum.substr(0, 2) || birth.getMonth() != birthMonth || birth.getDate() != birthDate)
		return false;

	// Check Sum 코드의 유효성 검사
	buf = new Array(13);
	for (i = 0; i < 6; i++)
		buf[i] = parseInt(juminnum.charAt(i));
	for (i = 6; i < 13; i++)
		buf[i] = parseInt(juminnum.charAt(i + 1));

	multipliers = [ 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 ];
	for (i = 0, sum = 0; i < 12; i++)
		sum += (buf[i] *= multipliers[i]);

	if ((11 - (sum % 11)) % 10 != buf[12])
		return false;

	return true;
}


// 날짜 유효성 체크
function fxIsDate( fe )
{
	var flag = true;
	var msg = "";

	var iYear = 0;
	var iMonth = 0;
	var iDay = 0;
	var iDaysInMonth = null;
	var iHour = -1;
	var iMinute = -1;

	var sDateFormat = defaultDateFormat; // yyyy : 년도, mm : 월, dd : 일
	var aDaysInMonth = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

	// 포멧과 비교할 날짜 길이가 같지 않다면 false 리턴
	if( sDateFormat.length != fe.value.length )
		return false;
	iYear = fe.value.substring( sDateFormat.indexOf( "yyyy" ), sDateFormat.indexOf( "yyyy" ) + 4 );
	iMonth = fe.value.substring( sDateFormat.indexOf( "MM" ), sDateFormat.indexOf( "MM" ) + 2 );
	iDaysInMonth = ( iMonth != 2 ) ? aDaysInMonth[iMonth - 1] : ( ( iYear % 4 == 0 && iYear % 100 != 0 || iYear % 400 == 0 ) ? 29 : 28 );
	iDay = fe.value.substring( sDateFormat.indexOf( "dd" ), sDateFormat.indexOf( "dd" ) + 2 );

	if( isNaN( iYear ) || isNaN( iMonth ) || isNaN( iDay ) )
		return false;

	if( iYear < 1 || iYear > 9999 || iMonth > 12 || iMonth < 1 || iDay < 1 || iDay > iDaysInMonth )
		return false;

	return true;
}

/**
 * 날짜포멧 변경(yyyy : 년도, MM : 월, dd : 일)
 *
 * @param df1 : 변환전 날짜포멧
 * @param df2 : 변환할 날짜포멧
 * @param dt : 변환전 날짜
 * @return
 */
function fxConvertDateFormat( df1, df2, dt )
{
	if( dt == "" || dt == null )
		return "";

	var df2 = df2.replace( "yyyy", dt.substring( df1.indexOf( "yyyy" ), df1.indexOf( "yyyy" ) + 4 ) );
	df2 = df2.replace( "MM", dt.substring( df1.indexOf( "MM" ), df1.indexOf( "MM" ) + 2 ) );
	df2 = df2.replace( "dd", dt.substring( df1.indexOf( "dd" ), df1.indexOf( "dd" ) + 2 ) );

	return df2;
}

function fxConvertDefaultDateFormat( ds )
{
	// yyyyMMdd 형태로 반환
	return fxConvertDateFormat( defaultDateFormat, "yyyyMMdd", ds );
}

var Lib = function()
{
	var chkboxname = "";
	var formname = "";
	
	this.sendMail = function()
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}

		fxPopCenter("/jsp/superad/user/adm_user_mail.jsp?h_member_id=" + escape(result), "mailPop", 600, 575, "yes");
	};
	
	this.sendSMS = function()
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}

		fxPopCenter("/jsp/superad/user/adm_user_sms.jsp?h_member_id=" + escape(result), "mailPop", 700, 540, "yes");
	};
	
	this.sendMsg = function(site_code)
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}

		fxPopCenter("/jsp/superad/user/adm_user_memo.jsp?h_member_id=" + escape(result), "messagePop", 600, 565, "yes");
	};
	
	this.sendUserMail = function()
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}
		
		var opening_no = jQuery("input[name=opening_no]").val();

		fxPopCenter("/jsp/mylecture/email_pop.jsp?opening_no=" + opening_no + "&h_member_id=" + escape(result), "mailPop", 680, 555, "yes");
	};
	
	this.sendUserSMS = function()
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}

		var opening_no = jQuery("input[name=opening_no]").val();

		fxPopCenter("/jsp/mylecture/sms_pop.jsp?opening_no=" + opening_no + "&h_member_id=" + escape(result), "smsPop", 700, 510, "yes");
	};
	
	this.sendUserMsg = function(site_code)
	{
		var result = "";
		var size = jQuery( "input[name=" + this.chkboxname + "]:checked").size();
		jQuery( "input[name=" + this.chkboxname + "]:checked" ).each( function( i, elem )
		{
			result += jQuery( this ).attr("sendid") + ( size - 1 == i ? "" : "," );
		} );

		if( result == "" ) 
		{
			alert("사용자를 선택하십시요.");
			return;
		}

		var opening_no = jQuery("input[name=opening_no]").val();

		fxPopCenter("/jsp/mylecture/memo_pop.jsp?opening_no=" + opening_no + "&h_member_id=" + escape(result), "messagePop", 680, 555, "yes");
	};
};

/**
 ******************************************************************************
 * ajax method
 ******************************************************************************
 */

jQuery( "" ).ajaxError( function( evt, xhr, opt )
{
//	alert( xhr.status + "\n" + opt.url + "\n" + opt.dataType + "\n" + opt.data );
//	return;
	if( xhr.status == 401 )
	{
		alert( "로그인후 이용해 주세요." );
		fxExpireSessionPage( loginPage );
	}
	else if( xhr.status == 403 )
		alert( "허가되지 않은 접근입니다." );
	else
		alert( "오류가 발생하였습니다. 다시 시도해 주세요." );
} );
