/**
 *	공통 자바스크립트
 *
 *	@author	오경석
 *	@since	2006-06-08
 */
/**
 *	인수로 넘긴 분리자로 구분하여 돌려준다.
 *	@param	String separator 생략가능
 *	@return String Date
 *	@EX > YYYY-MM-DD
 */
Date.prototype.toCalendar = function(separator) {
	if (typeof(separator) == 'undefined' || separator == "") separator = "-";
	var tmp = new Array(3);
	tmp[0] = this.getYear();
	tmp[1] = this.getMonth() + 1;
	tmp[2] = this.getDate();
	if (tmp[1] < 10) tmp[1] = "0" + tmp[1];
	if (tmp[2] < 10) tmp[2] = "0" + tmp[2];
	return tmp.join(separator);
}
/**
 *	문자열에서 빈문자를 제거하고 돌려준다.(첫,마지막문자에 스페이스와 \n\r\t 등)
 *	@return String
 */
String.prototype.trim = function(str) {
	str = this != window ? this : str;
	return str.replace(/^\s+/g,'').replace(/\s+$/g,'');
}


/**
 *	문자열에서 원하는 길이(byte형식)를 돌려줍니다.
 *	@return int length
 */
String.prototype.bytes = function(str) {
	str = this != window ? this : str; len = 0;
	for(var i=0; i < str.length; i++) {
		len += (str.charCodeAt(i) > 128) ? 2 : 1
	}
	return len;
}
/**
 *	문자열에서 원하는 길이(byte형식)만큼 잘라내어 돌려준다.
 *	@param Int (byte의 길이)
 *	@return String
 */
String.prototype.cut = function(len,str) {
	str = this != window ? this : str;
	var l = 0;
	for (var i=0; i<str.length; i++) {
			l += (str.charCodeAt(i) > 128) ? 2 : 1;
			if (l > len) return str.substring(0,i);
	}
	return str;
}

/**
 *	널값인지 확인
 *	@return boolean
 */
String.prototype.isNull = function(str) {
	str = this != window ? this : str;
	return (str.trim().length == 0) ? true : false ;
}

/**
 *	숫자형식인지 확인
 *	@return boolean
 */
String.prototype.isNumeric = function(str) {
	str = this != window ? this : str;
	return (!str.isNull() && !isNaN(str)) ? true : false ;
}

/**
 *	문자열이 인수로 넘어온 문자가 같은지 비교한다.
 *	@param str
 *	@return boolean
 */
String.prototype.isEqual = function(str, orgStr) {
	orgStr = this != window ? this : orgStr;
	return (orgStr == str) ? true : false ;
}

/**
 *	문자열이 인수로 넘어온 문자가 같은지 비교한다.
 *	@param str
 *	@return boolean
 */
String.prototype.isDate = function(str) {
	str = this != window ? this : str;
	var pattern = /^([1]{1}[9]{1}[0-9]{2}|[2]{1}[0]{1}[0-9]{2})-?([0]{1}[1-9]{1}|[1]{1}[0-2]{1})-?([0]{1}[1-9]{1}|[3]{1}[0-1]{1}|[12]{1}[0-9]{1})$/
	return (pattern.test(str)) ? true : false ;
}

/**
 *	배열의 인덱스를 삭제한다.
 *	@param	index
 *	@주의 : 문자형 배열의 경우는 제대로 동작하지 않는다.
 */
Array.prototype.remove = function (index) {
	if (typeof(index) == 'undefined') return;
	if (index >= this.length) return;
	if (index == 0) {
		this.shift();
	}else{
		for (var i=index ; i < this.length - 1 ;i++ ) {
			this[i] = this[i+1];
		}
		this.pop();
	}
}

/**
 *	배열에 key값이 존재하는지 검사 한다.
 *	@param	key
 *	@return boolean
 */
Array.prototype.isKey = function (key) {
	if (typeof(key) == 'undefined') {
		status = 'useage : reference Array.isKey(key)'
		return false;
	}
	return (typeof(this[key]) != 'undefined');
}

/**
 *	배열에 인수로 넘긴 값이 존재하는지 여부와 인덱스를 넘겨준다..
 *	@param	val
 *	@return index
 *	@주의 : 값이 존재하지 않으면, -1 을 리턴 합니다.
 */
Array.prototype.indexAt = function (val) {
	var retVal = -1;
	if (typeof(val) == 'undefined') return retVal;
	if (this.length == 0) return retVal;
	for (var i=0 ; i < this.length ;i++ ) {
		if (this[i] == val) {
			retVal = i;
			break;
		}
	}
	return retVal;
}

/**
 *	해당 객체에 str1의 문자를  str2로 모두 치환 합니다.
 *	@param	str1, str2
 *	@return String
 */
String.prototype.replaceAll = function(str1, str2)
{
  var temp_str = this.trim();
  temp_str = temp_str.replace(eval("/" + str1 + "/gi"), str2);
  return temp_str;
}

/**
 *	XMLHttpRequest 연결을 만든다.
 *	@return XMLHttpRequest
 * 	@주의 연결 실패시 Null
 */
function makeXMLHttpRequest() {
	var conn = null;
	if( typeof(window.ActiveXObject) != 'undefined' ) {
		try {
			conn = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e) {
			window.status = "XMLHttpRequest 연결을 만들수 없습니다!";
		}
	}else if( typeof(XMLHttpRequest) != 'undefined' ) {
		try {
			conn = new XMLHttpRequest();
		} catch(e) {
			window.status = "XMLHttpRequest 연결을 만들수 없습니다!";
		}
	}
	return conn;
}

/**
 *	특정 URL의 XML을 받아 옵니다.
 *	@param url
 *	@return xml Object
 *	@주의 리턴값을 반드시 체크할 것 null 이면 오류임
 */
function getUrlToXml(url) {
	return getXmlFromUrl(url,"GET");
}

/**
 *	특정 URL의 XML을 받아 옵니다.
 *	@param url
 *	@param method
 *	@param params url 인수형태 예> name=111&kk=xxx
 *	@return xml Object
 *	@주의 리턴값을 반드시 체크할 것 null 이면 오류임
 */
function getXmlFromUrl(url,method,params) {
	var conn = makeXMLHttpRequest();
	var result = null;
	if (typeof(method) == 'undefined' || method.toUpperCase() != "POST") method = "GET";

	try {
		conn.open( method , url, false );
		conn.setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded; charset=UTF-8" );
		if (typeof(params) == 'undefined' || params == "")
			conn.send(null);
		else
			conn.send(params);

		if (conn.readyState == 4) {
			switch(conn.status) {
				case 200 :
					result = conn.responseXML.documentElement;
					break;
				case 403 :
					window.status = "403 Forbidden";
					break;
				case 404 :
					window.status = "404 Not Found";
					break;
				default :
					window.status = "400 Fault Request";
			}
		}else{
			window.status = "Fault Header";
		}

	} catch (e) {
		window.status = "Nested catch caught " + e;
	} finally {
		return result;
	}
}

/**
 *	동적  url로 부터[POST] 결과를  리턴 받습니다. 결과 셋은 xml 형태여야 합니다.
 *	@param url
 *	@param params 넘길 인수 url형태
 *	@return 결과값
 *	@주의 : 요청하는 곳에서는 반드시 결과를 xml 형태 <main><result>결과값</result></main>로 넘겨야 합니다.
 *	@주의 리턴값을 반드시 체크할 것 null 이면 오류임
 */
function getResultFromUrl(url,params) {
	var xmlDoc = getXmlFromUrl(url, "POST", params);
	if (xmlDoc == null) return null;
	if (xmlDoc.childNodes.item(0).nodeName == "result")
		return xmlDoc.childNodes.item(0).text;
	else
		return null;
}


/**
 *	해당하는 URL에 요청을 하여,, 결과 값을 알려 줍니다.
 *	@param	String URL
 *	@return	Status
 */
function getStatusFromUrl(url) {
	var conn = makeXMLHttpRequest();
	var result = null;
	try {
		conn.open( "GET" , url, false );
		conn.setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded; charset=UTF-8");
		conn.send(null);
		result = conn.status;
	} catch (e) {
		window.status = "Nested catch caught " + e;
	} finally {
		return result;
	}
}


/**
 *	Hashtable Class
 *	자바스크립트 해시테이블
 */
function Hashtable() {
	this.length = 0;
	this.keys = new Array();
	this.values = new Array();

	this.add = function (key,value) {
		if (typeof(key) == 'undefined' && typeof(value) == 'undefined') return this.error("missing key,value reference 'HashTalbe.add(key,value)'");
		else if (typeof(value) == 'undefined') {
			value = key;
			key = this.length;
		}
		var index = this.isKey(key);
		if (index != -1) {
			this.values[index] = value;
		}else{
			this.keys[this.length] = key;
			this.values[this.length] = value;
			this.length += 1;
		}
	}
	this.remove = function (key) {
		if (typeof(key) == 'undefined') return this.error("missing key reference 'HashTalbe.remove(key)'");
		var index = this.isKey(key);
		if (index == -1) return;
		else{
			this.keys.remove(index);
			this.values.remove(index);
			this.length--;
		}
	}
	this.removeAll = function () {
		this.length = 0;
		this.keys.length = 0;
		this.values.length = 0;
	}
	this.isEmpty = function () {
		if (this.length == 0) return true;
		else return false;
	}

	/**
	 *	요청한 키값이 존재하는지 여부와 키의 인덱스를 리턴 합니다.
	 *	@param	key
	 *	@return index
	 *	@주의 : 키값이 존재하지 않으면, -1 을 리턴 합니다.
	 */
	this.isKey = function (key) {
		var retVal = -1;
		if (typeof(key) == 'undefined') return this.error("missing key reference 'HashTalbe.isKey(key)'");
		if (this.length == 0) return retVal;
		for (var i=0; i < this.length ;i++ ) {
			if (this.keys[i] == key) {
				retVal = i;
				break;
			}
		}
		return retVal;
	}

	/**
	 *	요청한 키에대한 값을 리턴 합니다.
	 *	@param	key
	 *	@return value
	 *	@주의 : 존재하지 않는 키를 요청하면, undefined를 리턴 합니다.
	 */
	this.get = function (key) {
		if (typeof(key) == 'undefined') return this.error("missing key reference 'HashTalbe.get(key)'");
		if (this.length == 0) return;
		var index = this.isKey(key);
		if (index == -1) return;
		else return this.values[index];
	}
	this.size = function () {
		return this.length;
	}
	this.getKeys = function () {
		return this.keys;
	}
	this.getValues = function () {
		return this.values;
	}
	this.toString = function () {
		var retVal = "";
		for(var i=0;i<this.length;i++) {
			if (i != 0) retVal +=" ,";
			retVal += this.keys[i] + "=" + this.values[i];
		}
		return "Neooz Javascript Hashtable V2006-06-09 : {"+retVal+"}";
	}
	this.copyFrom = function (org) {
		if (typeof(org) == 'undefined' || org.constructor != "Hashtable")
			return this.error("org is not Hashtable!! reference 'HashTalbe.copyFrom(org)'");

		for(var i=0;i<org.length;i++) {
			this.add(org.keys[i],org.values[i]);
		}
	}
	this.constructor = "Hashtable";
	this.fromSelect = function (el) {
		if (typeof(el) == 'undefined' || typeof(el.tagName) == 'undefined' || el.tagName != "SELECT")
			return this.error("el is not SELECT field!! reference 'HashTalbe.fromSelect(el)'");

		for (var i=0; i<el.options.length ;i++) {
			if (el.options[i].value != "") {
				this.add(el.options[i].value,el.options[i].text);
			}
		}
	}
	this.toSelect = function (el, val) {
		if (typeof(el) == 'undefined' || typeof(el.tagName) == 'undefined' || el.tagName != "SELECT")
			return this.error("el is not SELECT field!! reference 'HashTalbe.toSelect(el)'");

		while (el.length = 0) el.options[0] = null;
		for (var i=0; i< this.length ;i++) {
			var option = new Option(this.values[i],this.keys[i]);
			el.options[i] = option;
			if (typeof(val) != 'undefined') {
				if (this.keys[i] == val) el.selectedIndex = i;
			}
		}
	}
	this.error = function (msg) {
		if (typeof(msg) == 'undefined') return;
		alert("\nERROR : "+msg+"\n");
		return;
	}
}

/**
 *	공용/ 이메일 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidEmail(str){ //이메일 검사
	return (sysIsValidPattern(str.trim(),/^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/)) ? true : false;
}

/**
 *	공용/ 전화번호 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidPhone(str) {
	return (sysIsValidPattern(str.trim(),/^([0]{1}[0-9]{1,2})-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/)) ? true : false;
}

/**
 *	공용/ 이동전화 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidMobile(str) {
	return (sysIsValidPattern(str.trim(),/^([0]{1}[1]{1}[167890]{1})-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/)) ? true : false;
}

/**
 *	공용/ 알파벳 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidAlpha(str) {
	return (sysIsValidPattern(str.trim(),/^[a-zA-Z]+$/)) ? true : false;
}

/**
 *	공용/ 알파벳과 숫자 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidAlpha(str) {
	return (sysIsValidPattern(str.trim(),/^[a-zA-Z0-9]+$/)) ? true : false;
}

/**
 *	공용/ 한글 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidHangul(str) {
	return (sysIsValidPattern(str.trim(),/[가-힝]/)) ? true : false;
}

/**
 *	공용/ 숫자 형식에 맞는지 검사
 *	@param	String str
 *	@return	boolean
 */
function comIsValidNumeric(str) {
	return (sysIsValidPattern(str.trim(),/[0-9]/)) ? true : false;
}

/**
 *	시스템/ 패턴테스트 결과를 리턴
 *	@param	String str
 *	@param	String pattern
 *	@return	boolean
 */
function sysIsValidPattern(str,pattern) {
	return (pattern.test(str)) ? true : false;
}

/**
 *	공용/ 숫자형식이고, 제한자리 범위일 경우 참을 리턴
 *	@param	String str
 *	@param	int limit
 *	@return	boolean
 */
function comIsValidNumLimit(str,limit) {
	return (str.isNumeric() && str.length <= limit) ? true : false;
}


/**
 *	공용/ 에러를 발생시키고, 경고창을 뛰우며, 해당필드에 포커를 준다.
 *	@param el [폼의 엘리먼트]
 *	@param msg [에러의 메시지]
 *	@return false [항상 false를 리턴한다]
 */
function formError(el,msg){
	alert(msg);
	try {
		el.focus();
	} catch (e) {}
	return false;
}


/**
 *	공용/ 자동포커스, 폼을 인수로 받을수 있다
 *	@param [form]
 */
function setAutoFocus(f) {
	var el = null;
	if (typeof(f) == 'undefined') {
		if (document.forms.length < 1) return;
		else f = document.forms[0];
	}
	for (var i = 0 ; i < f.elements.length ; i++ ) {
		el = f.elements[i];
		if (el.type == "text" || el.type == "textarea") {
			try{
				el.focus();
				break;
			}catch(e) {
				continue;
			}
		}
	}
}

/**
 *	금액형식을 체크하여 컴마를 더해준다.<b>
 *	@param el text 필드
 * 	@useage onKeyUp="checkMoneyUpdate(this);"
 */
function checkMoneyUpdate(el) {
	//37 <- , 39 ->, del 46
//	if (event.keyCode == 38 || event.keyCode == 40) return;
	var num = el.value.trim();
	if (num.length < 1) return;
	num = moneyFormat(num);
	if (num.length < 1) {
		alert("금액형식이 아닙니다!");
		el.value = "";
		el.focus();
		return;
	}else el.value = num;
}

/**
 *	문자열을 체크하여, 컴마를 삽입해 줍니다.
 *	@param str 숫자형 문자
 *	@useage	str = moneyFormat(str);
 *	@주의 : 숫자형 문자가 아닐때는 ""를 리턴합니다.
 */
function moneyFormat(str) {
	str += "";
	str = str.trim();
	var buho = "";
	if (str.charAt(0) == "-") {
		buho = "-";
		str = str.substring(1,str.length);
	}
	if (str.length < 1) {
		return buho ? buho : "";
	}
    str = str.split(",").join("");
    var pattern = /^(0|-?[1-9][0-9]*)+(.[0-9]{1,2})?$/;
	if (!pattern.test(str)) return "";
    var arr = str.split('.');
    var num = new Array();
    for (i = 0; i <= arr[0].length-1; i++) {
        num[i] = arr[0].substr(arr[0].length-1-i,1);
        if(i%3 == 0 && i != 0) num[i] += ',';
    }
    num = buho + num.reverse().join('');
	return !arr[1] ? num : num+'.'+arr[1];
}

/**
 * 	문자열에서 컴마를 제거한다.
 *	@param	String val
 *	@return String
 */
// 문자열에서 컴마를 제거한다.
function removeComma(str) {
	return str.split(",").join("");
}

/**
 * 	반올림 함수 num 자리 까지 표현 이후에서 반올림
 *	@param	float|double|int val
 *	@param	int num
 *	@return float|int
 */
function round3(val,num) {
	var retval;
	var dm = 1;
	for (var i=0;i < Math.abs(num) ;i++ ) dm *= 10;
	if (num < 0) retval = (parseInt(parseFloat(val) / dm + 0.5) * dm);
	else retval = (parseInt(parseFloat(val) * dm + 0.5) / dm);
	return retval;
}

/**
 * 	화면의 가운데로 새창을 열어줍니다.
 *	@param	String url
 *	@param	String window_name
 *	@param	int width
 *	@param	int height
 *	@param	String scroll 'yes':'no'
 *	@return window
 */
function popWindow(url,name,width,height,scroll) {
	var x = (screen.width - width) / 2 - 4;
	var y = (screen.height - height) / 2 - 16;
	var win = window.open(url,name,"left="+x+",top="+y+",width="+width+",height="+height+",scrollbars="+scroll);
	if (win) {
		win.focus();
		return win;
	}
}

function FullScreenWinOpen(Url, popName) {
	var popOpen = window.open(Url,popName,"toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width="+screen.availWidth+",height="+screen.availHeight);

	if ( popOpen == null )
	{
		alert("현재 팝업창이 허용되지 않았습니다. 팝업을 보실려면 허용해주세요.");
	}
}

/** 새창을 열때 창 조절 기능을 활성화 시킴 */
function popWindowResize(url,name,width,height,scroll,resize) {
	var x = (screen.width - width) / 2 - 4;
	var y = (screen.height - height) / 2 - 16;
	var win = window.open(url,name,"left="+x+",top="+y+",width="+width+",height="+height+",resizable="+resize+",scrollbars="+scroll);
	if (win) {
		win.focus();
		return win;
	}
}
/**
 * 	iframe 의 높이를 재 조정한다
 *	@param	iframe
 */
function iframeAutoResize(iframe) {
	if (typeof(iframe) == 'undefined' || typeof(iframe) != 'Object') return;
	iframe.setExpression('height',iframe.contentWindow.document.body.scrollHeight);
}

/**
 * 	체크상자의 모든 값을 선택(true)하거나, 해제(false) 합니다.
 *	@param	form
 *	@param	fieldname
 *	@param	boolean
 *	@return int
 */
function checkboxSelectAll(f,fieldName,bool){
	if(typeof(f.elements[fieldName]) == 'undefined') return false;
	if(typeof(f.elements[fieldName].length) == 'undefined'){
		if(bool)f.elements[fieldName].checked = true;
		else f.elements[fieldName].checked = false;
	}else{
		for(i=0;i<f.elements[fieldName].length;i++){
			if(bool)f.elements[fieldName][i].checked = true;
			else f.elements[fieldName][i].checked = false;
		}
	}
}

/**
 * 	체크상자 혹은 라디오버튼 그룹의 선택여부(갯수)를 리턴합니다.
 *	@param	form
 *	@param	fieldname
 *	@return int
 */
function checkboxSelectedCount(f,fieldName){
	if(typeof(f.elements[fieldName]) == 'undefined') return 0;
	if(typeof(f.elements[fieldName].length) == 'undefined') {
		if(f.elements[fieldName].checked) return 1;
		else return 0;
	}else{
		var cnt = 0;
		for(i=0;i<f.elements[fieldName].length;i++) {
			if(f.elements[fieldName][i].checked)
				cnt++;
		}
		return cnt;
	}
}

/**
 * 	체크상자 혹은 라디오 버튼의 선택되어진 모든 값을 컴마로 구분하여 문자열로 돌려줍니다.
 *	@param	form
 *	@param	fieldname
 *	@return String
 */
function checkboxSelectedValue(f,fieldName){
	if(typeof(f.elements[fieldName]) == 'undefined') return;
	if(typeof(f.elements[fieldName].length) == 'undefined') {
		if(f.elements[fieldName].checked) return f.elements[fieldName].value;
		else return;
	}else{
		var checkedCount = 0;
		var tmp = "";
		for(i=0;i<f.elements[fieldName].length;i++) {
			if(f.elements[fieldName][i].checked) {
				if (checkedCount != 0) tmp += ",";
				tmp += f.elements[fieldName][i].value;
				checkedCount ++;
			}
		}
		return tmp;
	}
}

/**
 * 	셀렉트 박스의 모든 옵션을 제거한다
 *	@param	selectbox
 */
function selectRemoveAll(el) {
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") return;
	for( i = el.length ; i >= 0 ; i-- ) el.options[i] = null;
}


/**
 *	공용/ 폼에 자동으로 값을 세팅 합니다.
 *
 *	@param 	form [폼]
 *	@param 	data [데이터는 자바스크립트의 배열로 키:값의 형태여야 합니다!]
 *	@see   	ebslang.com.uril/AutoFormScript.java 파일과 함께 사용합니다.
 *  @주의 :  	데이터에 들어가는 값중 textarea에 들어가고, 라인브레이크(엔터 값은) \n으로 초기화 해야 한다.
 */
function autoFormInput(form, data) {
	if (typeof(form) == 'undefined') return;
	var el,nm,i,j,x;
	for (i=0;i < form.elements.length;i++) {
		el = form.elements[i];
		nm = el.name;
		if (data[nm] != undefined) {
			switch (el.tagName) {
				case "SELECT" :
					if (data[nm]) {
						var tmp = data[nm].split(",");
						if (form.elements[nm].length > 1 && tmp.length > 1) {
							for (j=0; j<el.length; j++) {
								if (el == form.elements[nm][j] && typeof(tmp[j]) != 'undefined') {
									for (x=0;x<el.options.length;x++) {
										if (el.options[x].value == tmp[j]) {
											el.selectedIndex = x; break;
										}
									}
								}
							}
						}else{
							for (j=0;j<el.options.length;j++) {
								if (el.options[j].value == data[nm]) {
									el.selectedIndex = j; break;
								}
							}
						}
					}
					break;
				default :
					switch (el.type) {
						case "checkbox" :
							var xtmp = data[nm].split(",");
							for (x=0;x<xtmp.length;x++) {
								if (el.value == xtmp[x].trim()) el.checked = true;
							}
							break;
						case "radio" :
							if (el.value == data[nm]) el.checked = true;
							break;
						default :
							el.value = data[nm];
							break;
					}
					break;
			}
		}
	}
}
/**
 *	공통코드의 XML 파일을 받아 옵니다.
 *	@return Object xmlDoc
 */
function comClsCdtoXml () {
	// url은 수정이 되어 져야 합니다.
	var url = "/ebs/xml/classification.xml";
	
	return getUrlToXml(url);
}


/**
 *	공용 분류체계의 XML 데이터로 부터 다양한 작업을 합니다.
 *	@param	String name[반드시 객체를 선언한 이름을 넘겨야 합니다!]
 *	@param	Object xml[공용 분류체계의 xml 오브젝트]
 *	@accessable Method	:
 *		makeMultiSelect([val[,limit]])	: 현재위치에 다중 셀렉트를 만듭니다.
 *		getFullText(val)		: 풀텍스트를 돌려줍니다.
 *		getText(val)			: 현재 값의 텍스트를 돌려줍니다.
 *		getValue()				: 현재 선택된 값을 돌려줍니다.
 *		getLastValue()			: 셀렉트박스의 마지막 선택된 값을 돌려줍니다.
 *		getLastText()			: 셀렉트박스의 마지막 텍스트 값을 돌려줍니다.
 *		getHashtable([val])		: 해당하는 값의 하위 목록을 해시테이블 형태로 리턴해 줍니다.
 *		isContain(val)			: 해당 값이 존재여부를 돌려줍니다.
 *		setStyle(style)			: 셀렉트박스의 스타일을 지정합니다.
 *	@useage :
 *		var xmlDoc = getUrlToXml(url);
 *		var clscd = new NEMultiSelectFromXml("clscd",xmlDoc);
 *		clscd.makeMultiSelect();
 */
function NEMultiSelectFromXml(name,xml, limit) {
	if (typeof(name) == 'undefined') {
		alert("[ERROR] new NEMultiSelectFromXml(name,xml) : Required! name and xml ");
		return;
	}
	if (typeof(xml) == 'undefined') {
		alert("[ERROR] new NEMultiSelectFromXml(name,xml) : Required! name and xml ");
		return;
	}
	this.name = name;
	this.xml = xml;
	this.style = null;
	this.defaultStyle = "width:99px;BORDER:solid #D4D0C8 1px;BACKGROUND: #ffffff; MARGIN: 0px; COLOR: #666666; FONT-FAMILY: 'Verdana', '돋움'; FONT-SIZE: 11px;HEIGHT: 18px;  TEXT-DECORATION: none";
	this.index = new Array();
	this.separator = ">"; // 기본 분리자
	this.text = null;	// 선택된 텍스트
	this.val = null;	// 선택된 값
	this.limit = ((limit == undefined || limit < 1)?100:limit);	// 최대 셀렉트 박스 갯수
	this.visible = false;
	this.deep = 0;

	/**
	 *	셀렉트 박스의 활성여부를 설정합니다.
	 *	@param	boolean flag
	 *	@주의 : 기본 false 이며, true 일경우 xml의 최대 깊이 만큼 셀렉트를 미리 생성한다.
	 */
	this.setVisible = function (flag) {
		if (typeof(flag) == 'undefined' || !(flag == false || flag == true)) {
			alert("\n[ERROR] NEMultiSelectFromXml.setVisible(flag)\n\nRequire boolean falg!");
			return;
		}
		this.visible = flag
	}
	/**
	 *	XML로 부터 다중셀렉트 박스를 만듭니다.
	 *	@param	val
	 *	@param	int limit
	 */
	this.makeMultiSelect = function(val,limit) {
		if (typeof(val) == 'undefined' || val == null) this.val = "";
		else this.val = val;
		if (!(typeof(limit) == 'undefined' || isNaN(limit))) this.limit = limit;
		this.id = "NEXml_"+ Math.floor(Math.random() * 100000000);
		document.write("<div id="+this.id+"></div>");
		this.container = document.getElementById(this.id);
		this.makeMode = "default";
		this.initSelect();
	}

	/**
	 *	XML로 부터 다중셀렉트 박스를 만듭니다. 단, val 값 이후 부터 표현을 합니다.
	 *	@param	val
	 *	@param	int limit
	 */
	this.makeBelowMultiSelect = function(val,limit) {
		if (typeof(val) == 'undefined' || val == "") {
			alert("\n[ERROR] NEMultiSelectFromXml.makeBelowMultiSelect(val[,limit])\n\nRequire val!");
			return;
		}
		this.val = val;
		if (!(typeof(limit) == 'undefined' || isNaN(limit))) this.limit = limit;
		this.id = "NEXml_"+ Math.floor(Math.random() * 100000000);
		document.write("<div id="+this.id+"></div>");
		this.container = document.getElementById(this.id);
		this.makeMode = "below";
		this.belowVal = val;
		this.initSelect();
	}

	/**
	 *	XML로 부터 해당하는 리스트의 하위 목록을 해시테이블로 리턴합니다.
	 *	@param	[val] : 생략시 처음 단계의 목록을 리턴함
	 *	@return Hashtable
	 *	@see	common.js#Hashtable Object
	 */
	this.getHashtable = function (val) {
		var ht = new Hashtable();
		var node = this.xml.childNodes;
		if (typeof(val) == 'undefined') {
			for (var i=0; i < node.length ; i++ ) {
				if (node.item(i).tagName == "clas") {
					ht.add(node.item(i).getAttribute("id"),node.item(i).childNodes.item(0).text);
				}
			}
		}else{
			if (this.isContain(val)) {
				for (var i=0; i<this.index.length ;i++ ) {
					node = node.item(this.index[i]).childNodes;
				}
				for (var i=0; i < node.length ; i++ ) {
					if (node.item(i).tagName == "clas") {
						ht.add(node.item(i).getAttribute("id"),node.item(i).childNodes.item(0).text);
					}
				}
			}
		}
		return ht;
	}

	/**
	 *	XML의 깊이를 찾아 리턴합니다.
	 *
	 */
	this.initDeepFromXml = function (node) {
		if (node.length > 1) {
			this.deep++;
			this.initDeepFromXml(node.item(1).childNodes);
		}
	}

	/**
	 *	멀티셀렉트의 초기화 메소드
	 *	@access	private
	 */
	this.initSelect = function () {

		// XML의 깊이를 알아봅니다.
		this.initDeepFromXml(this.xml.childNodes);

		if (this.val == "") {
			this.nodeDraw();
		}else{
			// 초기화
			this.find = false;
			this.index.length = 0;
			this.nodeSearch(this.xml.childNodes);
			if (this.find) {
				this.nodeDraw();
			}else{
				this.val = "";
				this.nodeDraw();
			}
		}
	}

	/**
	 *	선택된 값으로 부터 셀렉트 박스를 만들어 줍니다
	 *	@access	private
	 */
	this.nodeDraw = function () {
		if (this.find == false || this.index.length == 0 || this.val == "") {
			this.container.innerHTML = this.makeSelect(this.xml.childNodes);
		}else{
			var tmp = "";
			node = this.xml.childNodes;
			for (var i=0; i < this.index.length ; i++) {
				if (i >= this.limit) break;
				if (this.makeMode == "default") {
					tmp += this.makeSelect(node,this.index[i]);
				}else if (this.makeMode == "below") {
					if (i == this.index.length - 1) {
						tmp += this.makeSelect(node,this.index[i]);
					}
					this.belowIndex = this.index;
				}
				node = node.item(this.index[i]).childNodes;
			}
			this.container.innerHTML = tmp;
		}

		// 마지막 선택값 하위를 표현
		this.updateSelect(this.container.children(this.container.children.length -1));

		if (this.visible) this.makeEmptySelect();
	}

	/**
	 *	깊이 만큼 빈 셀렉트 박스를 만듭니다.
	 */
	this.makeEmptySelect = function () {
		var start = 0;
		if (this.makeMode == "below") start = this.belowIndex.length;
		for (var i = (this.container.children.length + start); i < this.deep ; i++ ) {
			if (i >= this.limit + start) break;
			this.container.innerHTML += "<select onchange='"+this.name+".updateSelect(this)' style=\""+(this.style ? this.style : this.defaultStyle)+"\"></select>";
		}
	}

	/**
	 *	xml을 검색한 후 풀 텍스트를 만들어 줍니다.
	 *	@return String
	 *	@access	private
	 */
	this.makeFullText = function () {
		if (this.find == false || this.index.length == 0) return "";
		var retVal = "";
		node = this.xml.childNodes;
		for (var i=0; i < this.index.length ; i++) {
			if (i != 0) retVal += this.separator;
			retVal += node.item(this.index[i]).childNodes.item(0).text;
			node = node.item(this.index[i]).childNodes;
		}
		this.val = "";
		return retVal;
	}

	/**
	 *	인수로 넘어온 Node를 검색 합니다.
	 *	@return Object node
	 *	@access	private
	 */
	this.nodeSearch = function (node) {
		for (var i=0; i < node.length ; i++ ) {
			if (node.item(i).tagName == "clas") {
				if (node.item(i).getAttribute("id") == this.val) {
					this.find = true;
					this.text = node.item(i).childNodes.item(0).text;
					this.index.push(i);
					break;
				}else{
					if (this.find == false) {
						this.index.push(i);
						this.nodeSearch(node.item(i).childNodes);
						if (this.find == false) this.index.pop();
					}
				}
			}
		}
	}

	/**
	 *	셀렉트 박스가 변경이 될때마다 실행이 됩니다.
	 *	@param	Object selectbox
	 */
	this.updateSelect = function (el) {
		var node = null,sel = null,tmp = "";
		node = this.xml.childNodes;
		if (this.makeMode == "default") {
			if (el.value == "") {
				for (var i=0; i<this.container.children.length ; i++) {
					sel = this.container.children[i];
					if (el == sel) {
						tmp += this.makeSelect(node);
						if (i == 0) {
							this.val = "";
							this.text = "";
						}
						break;
					}
					if (i == 0) {
						tmp += this.makeSelect(node, sel.selectedIndex -1);
						node = node.item(sel.selectedIndex -1).childNodes;
					}else{
						tmp += this.makeSelect(node, sel.selectedIndex);
						node = node.item(sel.selectedIndex).childNodes;
					}
					this.val = sel.value;
					this.text = sel.options[sel.selectedIndex].text;
				}
			}else{
				for (var i=0; i<this.container.children.length ; i++) {
					sel = this.container.children[i];
					if (i == 0) {
						tmp += this.makeSelect(node, sel.selectedIndex -1);
						node = node.item(sel.selectedIndex -1).childNodes;
					}else{
						tmp += this.makeSelect(node, sel.selectedIndex);
						node = node.item(sel.selectedIndex).childNodes;
					}
					if (el == sel) {
						if (node.length > 1 && i < this.limit -1) tmp += this.makeSelect(node);
						break;
					}
				}
				this.val = el.value;
				this.text = el.options[el.selectedIndex].text;
			}
		}else if (this.makeMode == "below") {
			for (var i=0; i < this.belowIndex.length -1 ; i++ ) {
				node = node.item(this.belowIndex[i]).childNodes;
			}
			if (el.value == "") {
				for (var i=0; i<this.container.children.length ; i++) {
					sel = this.container.children[i];
					if (el == sel) {
						tmp += this.makeSelect(node);
						break;
					}else{
						tmp += this.makeSelect(node, sel.selectedIndex);
						node = node.item(sel.selectedIndex).childNodes;
					}
					this.val = sel.value;
					this.text = sel.options[sel.selectedIndex].text;
				}
			}else{
				for (var i=0; i<this.container.children.length ; i++) {
					sel = this.container.children[i];
					tmp += this.makeSelect(node, sel.selectedIndex);
					node = node.item(sel.selectedIndex).childNodes;
					if (el == sel) {
						if (i >= this.limit - 1) break;
						if (node.length > 1) tmp += this.makeSelect(node);
						break;
					}
				}
				this.val = el.value;
				this.text = el.options[el.selectedIndex].text;
			}
		}
		this.container.innerHTML = tmp;

		// 빈 셀렉트 표시
		if (this.visible) this.makeEmptySelect();
	}

	/**
	 *	내부적으로 사용하는 메소드로 셀렉트박스를 생성합니다.
	 *	@param	Object node
	 *	@param	int index [생략가능]
	 *	@return	String selectbox
	 */
	this.makeSelect = function (node,index) {
		if (typeof(node) == 'undefined') return;
		var opt = "<option value=''> - </option>";
		for (var i=0; i < node.length ;i++ ) {
			if (node.item(i).tagName == "clas") {
				opt += "<option value='"+node.item(i).getAttribute("id")+"' "+(index == i ? "selected" : "")+">"+ node.item(i).childNodes.item(0).text +"</option>\n";
			}
		}
		str = "<select onchange='"+this.name+".updateSelect(this)' style=\""+(this.style ? this.style : this.defaultStyle)+"\">"+opt+"</select>";
		return str;
	}

	/**
	 *	셀렉트박스의 스타일을 설정합니다
	 *	@param String style
	 */
	this.setStyle = function (style) {
		this.style = style;
	}

	/**
	 *	변수에 맞는 풀텍스트를 만들어 돌려 줍니다.
	 *	@param	val
	 *	@param	separator 분리자(생략가능) 생략시 >
	 *	@return	String
	 */
	this.getFullText = function(val,separator) {
		if (typeof(val) == 'undefined') {
			alert("[ERROR] NEMultiSelectFromXml.getFullText(val[,separator]) : Required! val");
			return;
		}
		if (typeof(separator) != 'undefined') this.separator = separator;

		// 초기화
		this.val = val;
		this.find = false;
		this.index.length = 0;
		this.nodeSearch(this.xml.childNodes);

		return this.makeFullText();
	}

	/**
	 *	변수에 맞는 텍스트를 만들어 돌려 줍니다.
	 *	@param	val
	 *	@return	String
	 */
	this.getText = function (val) {
		if (typeof(val) == 'undefined') {
			alert("[ERROR] NEMultiSelectFromXml.getText(val[,separator]) : Required! val");
			return;
		}
		if ( !this.val ) {
			// 초기화
			this.val = val;
			this.find = false;
			this.index.length = 0;
			this.nodeSearch(this.xml.childNodes);
		}
		this.val = null;
		return this.text;
	}

	/**
	 *	해당하는 키값이 존재하는지 여부를 리턴해 줍니다.	 *	@param	val
	 *	@param	val
	 *	@return	boolean
	 */
	this.isContain = function (val) {
		if (typeof(val) == 'undefined') {
			alert("[ERROR] NEMultiSelectFromXml.in(val) : Required! val");
			return;
		}
		this.val = val;
		this.find = false;
		this.index.length = 0;
		this.nodeSearch(this.xml.childNodes);
		return this.find;
	}


	/**
	 *	현재 선택되어진 값을 리턴합니다.
	 *	@return	val
	 */
	this.getValue = function () {
		return this.val;
	}

	/**
	 *	최종 셀렉트박스의 값을 리턴합니다.
	 *	@return val
	 */
	this.getLastValue = function () {
		var sel = this.container.children[this.container.children.length - 1];
		return sel.value;
	}

	/**
	 *	최종 셀렉트박스의 텍스트을 리턴합니다.
	 *	@return String text
	 */
	this.getLastText = function () {
		var sel = this.container.children[this.container.children.length - 1];
		if (sel.selectedIndex == 0) return "";
		else return sel.options[sel.selectedIndex].text;
	}
}

/**
 *	SELECT TYPE 의 키값을 구분자로 넘겨 줍니다.
 *	@param	el	SELECT Type element
 *	@param	separator	String
 */
function selectGetStringKeys (el,separator) {
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectGetStringKeys(el[,separator])\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	if (typeof(separator) == 'undefined') separator = ",";
	var retVal = "";
	for (var i=0; i < el.length ; i++) {
		if (retVal != "") retVal += separator;
		retVal += el.options[i].value;
	}
	return retVal;
}


/**
 *	SELECT TYPE의 옵션의 위치를 이동시킵니다.
 *	@param	el	SELECT Type element
 *	@param	flag	String [top,bottom,up,down]
 */
function selectMoveItem(el,flag){
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectMoveItem(el,flag)\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	if (typeof(flag) == 'undefined' || !(flag.toLowerCase() == "top" || flag.toLowerCase() == "bottom" || flag.toLowerCase() == "up" || flag.toLowerCase() == "down")) {
		alert("\n[ERROR] selectMoveItem(el,flag)\n\nRequire flag! Or flag not in[top,bottom,up,down]!");
		return;
	}
	if(el.selectedIndex == -1){
		alert("이동을 원하는 항목을 선택해주세요!");
		return;
	}
	if (flag == "down") {
		if(el.selectedIndex == el.length-1) return;
		selectMoveStep(el,el.selectedIndex+1);
	}else if(flag == "up") {
		if(el.selectedIndex == 0) return;
		selectMoveStep(el,el.selectedIndex-1);
	}else if(flag == "top") {
		selectMoveTop(el);
	}else if(flag == "bottom") {
		selectMoveBottom(el);
	}
}

/**
 *	SELECT TYPE의 옵션의 위치를 최상위로 이동시킵니다.
 *	@param	el	SELECT Type element
 *	@see	selectMoveItem()
 */
function selectMoveTop(el){
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectMoveTop(el)\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	var option = new Option(el.options[el.selectedIndex].text,el.options[el.selectedIndex].value,false,true);
	el.options[el.selectedIndex] = null;
	for(i = el.length-1;i>=0;i--){
		var tmp = new Option(el.options[i].text,el.options[i].value);
		el.options[i+1] = tmp;
	}
	el.options[0] = option;
}

/**
 *	SELECT TYPE의 옵션의 위치를 최하위로 이동시킵니다.
 *	@param	el	SELECT Type element
 *	@see	selectMoveItem()
 */
function selectMoveBottom(el){
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectMoveBottom(el)\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	var option = new Option(el.options[el.selectedIndex].text,el.options[el.selectedIndex].value,false,true);
	el.options[el.selectedIndex] = null;
	el.options[el.length] = option;
}

/**
 *	SELECT TYPE의 옵션의 위치를 지정한 위치로 이동시킵니다.
 *	@param	el	SELECT Type element
 *	@param	to	int index
 *	@see	selectMoveItem()
 */
function selectMoveStep(el,to){
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectMoveStep(el)\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	if (typeof(to) == 'undefined' || isNaN(to)) {
		alert("\n[ERROR] selectMoveStep(el,to)\n\nRequire to! to not numeric");
		return;
	}
	if (el.length -1 < to ) return;
	var i = el.selectedIndex;
	var option = new Option(el.options[i].text,el.options[i].value,false,true);
	var option2 = new Option(el.options[to].text,el.options[to].value);
	el.options[to] = option;
	el.options[i] = option2;
}

/**
 *	SELECT에 옵션을 추가하는데 상단에 추가를 합니다.
 *	@param	el	SELECT Type element
 *	@param	val	value
 *	@param	text
 *	@param	sel	boolean : 선택여부
 */
function selectAddTop(el,val,text,sel) {
	if (typeof(el) == 'undefined' || el.tagName != "SELECT") {
		alert("\n[ERROR] selectAddTop(el)\n\nRequire el! Or el wasn't SELECT Type!");
		return;
	}
	if (typeof(val) == 'undefined') val = "";
	if (typeof(text) == 'undefined') text = "";
	if (typeof(sel) == 'undefined' || !(sel == true || sel == false)) sel = false;
	el.options[el.length] = new Option(text,val);
	el.selectedIndex = el.options.length - 1;
	selectMoveTop(el);
	if (sel == false) el.selectedIndex = null;
}

/**
 *	나의 수강중인 과정: 학습창을 뛰웁니다.
 *	@param el SELECT TYPE
 *	@require /ebs/js/LCMS/common.js
 */
function funcChangeMyStep(el) {
	if (el.value != "") {
		var tmp = el.value.split(";");
		el.selectedIndex = 0;
		el.blur();
		coursePreview(tmp[0], tmp[1]);
		return false;
	}
}

/**
 *	가격 분할 금액을 n개로 나누어 금액을 스트링으로 구분자 |를  이용하여 리턴합니다.
 *	@param	money	int#금액
 *	@param	num		int#나눌 갯수
 *	@return String
 *	@see	common.js#round3(val, num); 반올림 함수
 */
function funcDcMoney(money, num) {
	if (typeof(money) == 'undefined' || isNaN(money)) {
		alert("\n[ERROR] funcDcMoney(money, num)\n\nRequire money! Or money is not numeric type!");
		return;
	}
	if (typeof(num) == 'undefined' || isNaN(num)) {
		alert("\n[ERROR] funcDcMoney(money, num)\n\nRequire num! Or num is not numeric type!");
		return;
	}
	money = round3(money,-1);
	var tmp = round3(money / num, -1);
	var validate = tmp*num;
	var retVal = new Array(num);
	retVal[0] = tmp + (money-validate);
	for (var i=1; i<num ;i++ ) retVal[i] = tmp;
	return retVal.join("|");
}


/**
 *	과정목록에서 장바구니에 담기
 *
 */
function funcAddCartCourse(user_id,type_cd,mapp_id) {
	if (typeof(user_id) == 'undefined' || user_id.length < 4) {
		return -1;
	}
	if (typeof(type_cd) == 'undefined' || type_cd == "") {
		return -1;
	}
	if (typeof(mapp_id) == 'undefined' || mapp_id == "") {
		return -1;
	}
	var url = "/ebs/fhz.AhkAddCartCourse.laf";
	var params = "user_id="+ user_id +"&type_cd="+ type_cd +"&mapp_id="+ mapp_id;
	var result = getResultFromUrl(url, params);
	if (result == null) {
		// alert("\n서버의 사용량이 많아 실행이 취소 되었습니다.\n\n잠시후에 사용해 주세요!");
		return -1;
	}else return result;
}

/**
 *	일반적인 장바구니에 담기
 *	@param	user_id
 *	@param	pdt_id	String 구분자는 컴마,
 *	@param	clip_id	String 구분자는 컴마,
 *	@return	int result -1 은 실패,, 나머지는 등록된 갯수
 */
function funcAddCart(user_id,pdt_id,clip_id) {
	if (typeof(user_id) == 'undefined' || user_id.length < 4) {
		return -1;
	}
	if (typeof(pdt_id) == 'undefined' || pdt_id == "") {
		return -1;
	}
	if (typeof(clip_id) == 'undefined') clip_id = "";
	var url = "/ebs/fhz.AhkAddCart.laf";
	var params = "user_id="+ user_id +"&pdt_id="+ pdt_id +"&clip_id="+ clip_id;
	//alert(params)
	var result = getResultFromUrl(url, params);
	//alert(result);
	if (result == null) {
		// alert("\n서버의 사용량이 많아 실행이 취소 되었습니다.\n\n잠시후에 사용해 주세요!");
		return -1;
	}else return result;
}

/**
 *	장바구니에서 하나의 항목 삭제
 *	@param	user_id
 *	@param	pdt_id	String 구분자는 컴마,
 *	@param	clip_id	String 구분자는 컴마,
 *	@return	int result -1 은 실패,, 나머지는 등록된 갯수
 */
function funcRemoveCart(user_id,pdt_id,clip_id) {
	if (typeof(user_id) == 'undefined' || user_id.length < 4) {
		return -1;
	}
	if (typeof(pdt_id) == 'undefined' || pdt_id == "") {
		return -1;
	}
	if (typeof(clip_id) == 'undefined') clip_id = "";
	var url = "/ebs/fhz.AhkRemoveCart.laf";
	var params = "user_id="+ user_id +"&pdt_id="+ pdt_id +"&clip_id="+ clip_id;
	var result = getResultFromUrl(url, params);
	if (result == null) {
		// alert("\n서버의 사용량이 많아 실행이 취소 되었습니다.\n\n잠시후에 사용해 주세요!");
		return -1;
	}else return result;
}

/**
 *	장바구니를 비웁니다.
 *	@param	user_id
 *	@return	int result -1 은 실패,, 나머지는 등록된 갯수
 */
function funcRemoveAllCart(user_id) {
	if (typeof(user_id) == 'undefined' || user_id.length < 4) {
		return -1;
	}
	var url = "/ebs/fhz.AhkRemoveAllCart.laf";
	var params = "user_id="+ user_id;
	var result = getResultFromUrl(url, params);
	if (result == null) {
		// alert("\n서버의 사용량이 많아 실행이 취소 되었습니다.\n\n잠시후에 사용해 주세요!");
		return -1;
	}else return result;
}

/**
 *	사용자 정보 팝업창 오픈
 *	(관리자페이지에서 사용)
 *	@param	user_id
 */
function showUserInfo( user_id ) {
	var url = "/ebs/ahz.AhuUserInfoPopup.laf?userid="+ user_id;
	var userWin = window.open(url,"", "width=500,height=270, left=100, top=100,resizable=yes,status=yes");
	userWin.focus();
}


/**
 *	아주택배, 현대택배 화물추적 팝업창 오픈
 *	@param	invono 송장번호
 *	@param	buyId 주문번호
 */
function goBesong(invcno, buyId) {
	if ( !invcno || invcno == 0 ) {
		alert("배송중비중 입니다");
	}else{

		if( buyId > 1000061002 ){
			X=616; Y=700;
			l = (screen.width) ?	(screen.width- X) / 2	: 0;
			t = (screen.height) ?	(screen.height- Y) / 2 : 0;
			ebslangTranWindow=window.open('http://www.hydex.net/ehydex/jsp/home/distribution/tracking/tracingNView.jsp?param1='+invcno,'ebslangtran','width='+X+',height='+Y+',top='+t+',left='+l+',scrollbars=yes,status=yes,resizable=yes');

		}else{
			X=616; Y=700;
			l = (screen.width) ?	(screen.width- X) / 2	: 0;
			t = (screen.height) ?	(screen.height- Y) / 2 : 0;
			ebslangTranWindow=window.open('http://www.ajuthankyou.com:8080/jsp/expr1/web_view_link_sheetno.jsp?sheetno='+invcno,'ebslangtran','width='+X+',height='+Y+',top='+t+',left='+l+',scrollbars=yes,status=yes,resizable=yes');
		}
	
	}
}

 
//숫자입력 체크(onblur시사용)
function  number_validate(theForm) {
	if (theForm.value != "") {
		var str=theForm.value;
		for (var i = 0; i< str.length; i++) {
			var ch = str.substring(i, i + 1);

			if ( (ch<"0" || ch>"9") ) {
				alert("\n숫자 만을 입력할수 있습니다.");
				tye = 1;
				theForm.value="";
				theForm.focus();
				return false;
			}
			else
				tye=0;
		}
	} else
		tye=0;
	return true;
}

// string length check
//onChange="doInputData(this,'파일명', 50)" onKeyDown="doInputData(this,'파일명', 50)" onKeyUp="doInputData(this,'파일명',50)"
function doInputData(obj, name, maxlen) {


	if (lenByte(obj.value) > maxlen) {
		alert(name + "에는 "+parseInt(maxlen/3)+"자(한글), "+maxlen+"(영문, 숫자)까지만 입력할 수 있습니다. ");
		obj.value=leftByte(obj.value, maxlen);
		obj.focus();
	}
}

function lenByte(str) {
	var wLen=0;

	for(var i=0;i<str.length;i++) {
		var   ch=str.charAt(i);
		if (escape(ch).length > 4) wLen=wLen+3;
		else wLen=wLen+1;
	}
	return wLen;
}

function leftByte(str, len) {
	var wLen=0;
	var buffer="";
	for(i=0;i<str.length;i++) {
		ch=str.charAt(i);
		if (escape(ch).length > 4) wLen=wLen+3;
		else wLen=wLen+1;
		if (wLen>len) { break;	}
		else buffer += ch;
	}
	return buffer;
}


function FileLenChk(str){		
	var LenChk = str.split("\\");
	var FileLen = LenChk.length;
	return LenChk[FileLen-1];
}

//Only Eng + Number
function glf_OnlyEng(id_text){
	var alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
	var nonkorean = alpha;

	var i ;
	for ( i=0; i < id_text.length; i++ )  {
		if( nonkorean.indexOf(id_text.substring(i,i+1)) < 0) {
			break ;
		}
	}

	if ( i != id_text.length ) {
		return false ;
	}
	else{
		return true ;
	}

	return true;
}

// Input String null checking
function validFieldText(objInput, msgStr){
	if(Trim(objInput.value) == "") {
		alert("" + msgStr + " 입력하세요.");
		objInput.focus();
		return false;
	}

	return true;
}

// Input String null checking
function validFieldSelect(objInput, msgStr){
	if(Trim(objInput.value)=="") {
		alert("" + msgStr+" 선택해 주세요.");
		objInput.focus();
		return false;
	}

	return true;
}

// Trim
function Trim(obj1){
	obj1 = obj1.replace(/^(\s+)|(\s+)$/g, "")
	return obj1;
}

/**
 *	이메일 주소 선택 셀렉트박스 생성
 *	@return	String selectbox
 *  @param email_txt : 공통코드에서 가져온 이메일 리스트
 *	@param obj : email input box id
 */
function makeEmail(email_txt, obj) {

	var opt = "<select class='input_textfield' onchange=\"selectEmail(this.value, '" + obj + "');\">";
	opt += "<option value=''>이메일선택</option>";
	opt += email_txt ;
	opt += "<option value='none'>직접입력</option>";
	opt += "</select>"

	document.write(opt);
}
function selectEmail(add, obj){	
	
	var obj = document.getElementById(obj);
	if(add == "none"){
		obj.value="";
		obj.readOnly = false ;
		obj.focus();
	}
	else{
		obj.readOnly = true ;
		obj.value = add;
	}
}

//File Name Check
//Use event : onChage
function doInputFileName(obj, name, maxlen) {  
 if (lenByte(obj) > maxlen) {
  alert(name + "ìë "+parseInt(maxlen/3)+"ì(íê¸), "+maxlen+"(ìë¬¸, ì«ì)ê¹ì§ë§ ìë ¥í  ì ììµëë¤. ");
  obj=leftByte(obj, maxlen);  
  return false; 
 }
 return true;
}
function allblur() {
  for (i = 0; i < document.links.length; i++) {
    var obj = document.links[i];
    if(obj.addEventListener) obj.addEventListener("focus", oneblur, false);
    else if(obj.attachEvent) obj.attachEvent("onfocus", oneblur);
  }
}
function oneblur(e) {
  var evt = e ? e : window.event;

  if(evt.target) evt.target.blur();
  else if(evt.srcElement) evt.srcElement.blur();
}


