function bluring(){
	if(event.srcElement.tagName=="A"||event.srcElement.tagName=="IMG")
			document.body.focus();
}
//document.onfocusin=bluring;

//document 안에서 이름으로 object 를 찾는다
//찾으려는 object의 이름을 인자로 넘긴다
function jsAllFindObj(name)
{
	for(var ct=0; ct < document.all.length; ct++)
	{
		if(document.all[ct].name == name)
			return document.all[ct]
	}

	return null
}

//document 안에서 이름으로 Form을 찾는다
//찾으려는 Form 의 이름을 인자로 넘긴다
function jsFindFrm(name, rdoc)
{
	var docu = document;

	if(rdoc != null && rdoc != undefined)
		docu = rdoc;
	return docu.forms[name];
}

//매개 변수로 넘어온 폼 안에서 하위 객체를 이름으로 찾는다.
function jsFindItem(frm, aname)
{
	return frm.getAttribute(aname)
}

//document 안에서 id가 부여된 테그나 객체를 id로 찾는다
function jsFindId(id, rdoc)
{
	var docu = document;

	if(rdoc != null && rdoc != undefined)
		docu = rdoc

	return docu.getElementById(id);
}


//form 안에서 자신의 전후 object를 찾는다
//호출하는 object자신과 전후 이동할 값을 숫자로 입력 바로전 객체를 찾을때는 -1 바로다음 객체는 1 을 입력
function jsFindObj(obj,nop)
{
	var frm = obj.form

	if(obj.form == null || obj.form == undefined)
		return null;

	for(ct=0; ct < frm.elements.length; ct++)
	{
		if(frm.elements[ct] == obj && (ct + nop) < frm.elements.length)
			return frm.elements[ct+nop]
	}

	return null
}


//form 에서 자신의 index를 구할때 사용
function jsFindIndex(obj)
{
	var frm = obj.form

	for(var ct=0; ct < frm.elements.length; ct++)
	{
		if(frm.elements[ct] == obj)
			return ct;
	}

	return -1
}

//document 에서 자신의 index를 구할때 사용
function jsAllFindIndex(obj,pos)
{

	for(var ct=0; ct < document.all.length; ct++)
	{
		if(document.all[ct] == obj)
			return ct
	}

	return -1
}

var jsDateSelect = new Array();
var jsTimeSelect = new Array();

//실제로 select를 구현할때 쓰이는 함수이다

//처음에 년,월,일 select 를 생성  인자값은 년의 이름, 달의 이름, 일의 이름, 합쳐질 hidden 값의 이름을 받는다
//ndate는 년월일시간을 합쳐서 다음 페이지로 넘길때 사용할 폼이름이다
//nyear, nmonth, nday는 반드시 인자값으로 넘겨주어야 한다.
//size 에는 해당하는 font-size를 정의할 수 있다.
// ex) jsMakeDates("nyear","nmonht","nday","ndate","12px","2003","11","03")
//		jsMakeDates("nyear","nmonht","nday","ndate","12px","2003-11-03")

function jsMakeDates(nyear,nmonth,nday,ndate,size,dyear,dmonth,dday)
{
	if(!jsIsNS(dyear) && dyear.length > 9 && jsIsNS(dmonth))
	{
		dmonth = dyear.substring(5,7);
		dday = dyear.substring(8,10);
		dyear = dyear.substring(0,4);
	}
	else
	{
		dyear = jsGetToday("year");
		dmonth = jsGetToday("month");
		dday = jsGetToday("day");
	}

	new jsMakeDateBase(nyear,nmonth,nday,ndate,size,dyear,dmonth,dday);
}

function jsMakeDateBase(nyear,nmonth,nday,ndate,size,dyear,dmonth,dday)
{
	var len = jsDateSelect.length;

	jsDateSelect[len] = this;

	if(jsIsNS(nyear) || jsIsNS(nmonth == null) || jsIsNS(nday == null))
	{
		document.write("설정이 잘못되어 날짜 Select 그룹이 생성 되지 않았습니다.");
		return;
	}

	if(jsIsNS(size))
		size="12px";

	document.write("<font style='font-size:"+size+";'>");
	document.write("<select id='"+nyear+"' name='"+nyear+"' onchange='jsOnChangeDate("+len+");window.focus();' style='font:"+ size +";'></select>년 ");
	document.write("<select id='"+nmonth+"' name='"+nmonth+"' onchange='jsOnChangeDate("+len+");window.focus();' style='font:"+ size +";'></select>월 ");
	document.write("<select id='"+nday+"' name='"+nday+"' onchange='jsOnChangeDate("+len+");window.focus();' style='font:"+ size +";'></select>일");
	document.write("<input type=hidden id='"+ndate+"' index='" + len + "' name='"+ndate+"'>");
	document.write("</font>");

	this.year = jsFindId(nyear);
	this.month = jsFindId(nmonth);
	this.day = jsFindId(nday);
	this.date = jsFindId(ndate);

	jsSetDatesDefault(len, dyear, dmonth, dday);

	if(this.date.form != null)
		this.date.form.onreset = Function("","jsMkDay(jsDateSelect["+ len +"].day,"+ dyear +","+ dmonth +","+ dday +",true)");
}

function jsSetDatesDefault(date_idx, sdyear, sdmonth, sdday)
{
	var dateAry = new Array();

	if(sdyear == null || sdyear == undefined || jsTrim(sdyear.toString()).length == 0)
	{
		sdyear = jsGetToday("year");
		sdmonth = jsGetToday("month");
		sdday = jsGetToday("day");
	}
	else if(sdyear.toString().indexOf("-") > 0)
	{
		dateAry = sdyear.toString().jsSplit("-");
		sdyear = dateAry[0];
		sdmonth = dateAry[1];
		sdday = dateAry[2];
	}

	jsMakeOption(jsDateSelect[date_idx].year,1950,2100,sdyear, true);
	jsMakeOption(jsDateSelect[date_idx].month,1,12,sdmonth, true);
	jsMkDay(jsDateSelect[date_idx].day, sdyear, sdmonth, sdday, true);

	jsDateSelect[date_idx].date.defaultValue = sdyear +"-"+ sdmonth +"-"+ sdday;
	jsDateSelect[date_idx].date.value = sdyear +"-"+ sdmonth +"-"+ sdday;
}

//생성된 날짜들의 기본 값을 설정한다.
//ndate는 date를 설정한 hidden date의 이름, val은 2000-11-01 형식의 날짜 값을 입력
function jsSetDefDate(ndate, val)
{

	for(var idx=0; idx < jsDateSelect.length; idx++)
	{
		if(jsDateSelect[idx].date.name == ndate)
		{
			d_idx = idx;
			break;
		}
	}

	jsSetDatesDefault(d_idx, val);
}
/**
	jsMakeDates()를 사용하여 생성된 날짜 그룹을 disabled 설정한다.
	ndate : 생성된 hidden date의 이름
	flag : disabled의 값
 */
function jsDateDisabled(ndate, flag)
{
	for(var n=0; n < jsDateSelect.length; n++)
	{
		if(jsDateSelect[n].date.name != ndate)
			continue;

		jsDateSelect[n].year.disabled = flag;
		jsDateSelect[n].month.disabled = flag;
		jsDateSelect[n].day.disabled = flag;
		jsDateSelect[n].date.disabled = flag;
	}
}

//실제로 select를 구현할때 쓰이는 함수이다

//처음에 시, 분 select 를 생성  인자값은 시간의 이름, 분의 이름 합쳐질 hidden 값의 이름을 받는다
//nTimes는 시분을 합쳐진 내용이 있다.
//nTime, nMinute는 반드시 인자값으로 넘겨주어야 한다.
//size 에는 해당하는 font-size를 정의할 수 있다.
// ex) jsMakeTimes("nTime","nMinute","nTimes","12px", "01", "22")
//		jsMakeTimes("nTime","nMinute","nTimes","12px", "01:22")

function jsMakeTimes(nTime,nMinute,nTimes,size, dtime, dminute)
{
	new jsMakeTimeBase(nTime,nMinute,nTimes,size,dtime,dminute);
}

function jsMakeTimeBase(nclock,nminute,ntime,size,dclock,dminute)
{
	var len = jsTimeSelect.length

	jsTimeSelect[len] = this

	if(nclock == null || nminute == null || nclock == "" || nminute == "")
	{
		document.write("설정이 잘못되어 시간 Select 그룹이 생성 되지 않았습니다.")
		return
	}

	if(size==null || size=="")
		size="12px"
	document.write("<font style='font-size:"+size+"'>");
	document.write("<select id='"+nclock+"' name='"+nclock+"' onchange='jsOnChangeTime("+len+");window.focus();' style='font:"+ size +";'></select>시 ")
	document.write("<select id='"+nminute+"' name='"+nminute+"' onchange='jsOnChangeTime("+len+");window.focus();' style='font:"+ size +";'></select>분 ")
	document.write("<input type=hidden id='"+ntime+"' name='"+ntime+"'>")
	document.write("</font>")

	this.clock = jsFindId(nclock)
	this.minute = jsFindId(nminute)
	this.time = jsFindId(ntime)

	jsSetTimesDefault(len, dclock, dminute);
}

function jsSetTimesDefault(time_idx, clock, minute)
{
	var timeAry = new Array();

	if(clock == undefined || clock == null || jsTrim(clock.toString()).length == 0)
	{
		clock = "00";
		minute = "00";
	}
	else if(clock.toString().indexOf(":") > 0)
	{
		timeAry = clock.toString().jsSplit(":");
		clock = timeAry[0];
		minute = timeAry[1];
	}

	jsMakeOption(jsTimeSelect[time_idx].clock,0,23,clock, true);
	jsMakeOption(jsTimeSelect[time_idx].minute,0,59,minute, true);

	jsTimeSelect[time_idx].time.defaultValue = clock +":"+ minute;
	jsTimeSelect[time_idx].time.value = clock +":"+ minute;
}

//시간변경  select의 값이 바뀌었을때 그달에 해당하는 날짜를 마추어준다
function jsOnChangeDate(idx)
{
	if( jsDateSelect[idx] == undefined || jsDateSelect[idx] == null)
		return

	var oyear = jsDateSelect[idx].year
	var omonth = jsDateSelect[idx].month
	var oday = jsDateSelect[idx].day

	jsMkDay(oday,oyear.value,omonth.value,oday.value)

	jsDateSelect[idx].date.value = oyear.value +"-"+ omonth.value +"-"+ oday.value
}

//년과 월의  select의 값이 바뀌었을때 그달에 해당하는 날짜를 마추어준다
function jsOnChangeTime(idx)
{
	if(jsTimeSelect[idx] == null || jsTimeSelect[idx] == null)
		return

	var oclock = jsTimeSelect[idx].clock
	var ominute = jsTimeSelect[idx].minute

	jsTimeSelect[idx].time.value = oclock.value +":"+ ominute.value
}

//윤달과 매월 달라지는 날짜를 makeoption 을 호출해서 생성한다.
function jsMkDay(obj,year,month,day,def)
{
	jsClearSelect(obj)

	month = parseInt(month,10)
	year = parseInt(year,10)

	if(day == null || day == "")
		day = jsGetToday("day")

	jsMakeOption(obj,1,jsLastDay(year,month),day, def)
}


//오늘 날짜를 구한다 인자값은 구하는값이 '년'인지, '월'인지, '일'인지를 인자로 넘긴다
//"y"는 년도, "m"는 월,  "d"는 일,  "a"는 전체값을 리턴받는다
var weekShort = new Array("일", "월", "화", "수", "목", "금", "토");
var weekLong = new Array("일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일");

function jsGetToday(type){
	var today = new Date()
	var year = today.getFullYear()
	var month = today.getMonth()+1
	var day = today.getDate()

	month = jsAddZero(month,2)

	day = jsAddZero(day,2)

	switch(type)
	{
		case "year":
			return year
		case "month":
			return month
		case "day":
			return day
		case "all":
			return year+"-"+month+"-"+day
		case "ALL":
			return year+"년 "+month+"월 "+day+"일"
		case "w":
			return weekShort[today.getDay()];
		case "week":
			return weekLong[today.getDay()];
	}
}

//날짜에 대하여 연산을 한다.
//date는 원래값, type은 연산 하는 것이 년(y),달(m),일(d),전체(date)인지, value는 가감하는 값이다.
function jsAddDate(date, type, value)
{
	var year = parseInt(date.substring(0,4),10);
	var month = parseInt(date.substring(5,7),10);
	var day = parseInt(date.substring(8,10),10);

	var dt = new Array();
	dt[0] = 0;
	dt[1] = 0;
	dt[2] = 0;


	var cnt = 0;

	switch(type)
	{
		case "y":
			type = 0;
			dt[0] = value;
			cnt = 1;
		break;

		case "m":
			type = 1;
			dt[1] = value;
			cnt = 2;
		break;

		case "d":
			type = 2;
			dt[2] = value;
			cnt = 3;
		break;

		case "date":
			type = 3;
			dt[0] = parseInt(value.substring(0,4),10);
			dt[1] = parseInt(value.substring(5,7),10);
			dt[2] = parseInt(value.substring(8,10),10);
			cnt = 4;
		break;
	}

	var end = 0;
	var tmp = 0;

	for(var n=0; n < cnt; n++)
	{

		switch(n)
		{
			case 0:
				year += dt[0];
			break;

			case 1:
				tmp = month + dt[1];

				if(tmp == 0)
				{
					month = 12;
					year -= 1;
				}
				else if(tmp == 12)
				{
					month = tmp;
				}
				else
				{
					month = tmp % 12;

					year += tmp / 12;

					year = parseInt(year,10);

					if(month < 0)
						month = 12 + month;
				}

			break;

			case 2:
				tmp = (day + dt[2]);

				while(true)
				{
					end = jsLastDay(year,month);

					if(tmp > end)
					{
						if(month != 12)
						{
							month += 1;

							tmp -= end;
						}
						else
						{
							year += 1;
							month =  1;

							tmp -= end;
						}
					}
					else if(tmp <= 0)
					{
						if(month != 1)
						{
							month -= 1;
							end = jsLastDay(year,month);

							tmp += end;
						}
						else
						{
							year -= 1;
							month = 12;
							end = jsLastDay(year,month);

							tmp += end;
						}
					}
					else
					{
						break;
					}
				}
				day = tmp;
			break;
		}
	}
	month = jsAddZero(month,2);
	day = jsAddZero(day,2);

	return year + "-" + month + "-" + day;
}

//해당하는 년,달의 마지막 날을 구한다.
function jsLastDay(year,month)
{
	switch(month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
		break;

		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		break;

		case 2:
			if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			{
				return 29;
			}
			else
			{
				return 28;
			}
		break;
	}
}


//select의 option을 생성한다. 단, 숫자들로 이루어진 리스트 여야 한다.
//인자로는 호출하는 select , 시작값, 끝나는값, 처음 선택될 값을 넘겨준다.
function jsMakeOption(obj,begin, end, def_val, def)
{
	var end = parseInt(end, 10);
	var begin = parseInt(begin, 10);
	var endct = end - begin;
	var option = obj.options;

	for(var ct=0; ct <= endct; ct++)
	{
		option[ct] = new Option(jsAddZero(ct+begin, 2), jsAddZero(ct+begin, 2));

		if(def_val != null && def_val != undefined && parseInt(def_val,10) == parseInt(ct+begin,10))
		{
			if(def != null && def == true)
				option[ct].defaultSelected = true;

			option[ct].selected = true;
		}
	}
}

//select의 option을 변경한다. option 타입의 array로 변경을 한다.
//obj 변경될 select object, option_array 변경될 option array, def 변경된후 기본으로 설정될 value
//def_idx 변경된 후 기본을 설정될 select의 index
function jsMakeOptions(obj, option_array, def, def_idx)
{

	if(obj != null)
	{
		var option = obj.options;

		if(option == null)
			return;

		if(option_array == null || option_array.length == null){

			jsClearSelect(obj);
			option[0] = new Option("","");
			return;
		}

		var new_len = option_array.length;

		jsClearSelect(obj);

		for(var ct=0; ct < new_len; ct++)
		{
			option[ct] = option_array[ct];
		}

		if(!jsIsNS(def))
		{
			def = jsTrim(def);

			for(var ct=0; ct < new_len; ct++)
			{
				if(option[ct].value == def)
				{
					option[ct].defaultSelected = true;
					option[ct].selected = true;
				}
			}
		}
		else if(!jsIsNS(def_idx) && def_idx < new_len && def_idx >= 0)
		{
			option[def_idx].defaultSelected = true;
			option[def_idx].selected = true;
		}
		else
		{
			option[0].defaultSelected = true;
			option[0].selected = true;
		}
	}
}

//select의 option을 직접 write 한다. 단, 숫자들로 이루어진 리스트 여야 한다.
//인자로는 시작값, 끝나는값, 처음 선택될 값을 넘겨준다.
function jsWriteOption(begin,end,def)
{
	var end = parseInt(end, 10);
	var begin = parseInt(begin, 10);
	var endct = end - begin;

	var tmp = "";

	for(var ct=0; ct <= endct; ct++)
	{
		tmp += "<option value=\""+ jsAddZero(ct+begin, 2) +"\"";

		if(def != null && def != undefined && parseInt(def,10) == parseInt(ct+begin,10))
			tmp += " selected defaultSelected";

		tmp += ">"+ jsAddZero(ct+begin, 2) + "</option>\n";
	}

	document.write(tmp);
}

//select object와 값을 받아 select object의 초기값을 셋팅한다.
//select의 값을 설정은 하고 form.reset()을 했을땐 다른 값으로
//설정이 되게 할때는 def 에 false를 입력하여야 한다.
//그렇지 않을 경우에는 입력받은 값이 default값으로 설정된다.
function jsSetSelect(obj, val, def, index)
{
	if(def == null)
		def = true;

	if(jsIsNull(obj))
		return;

	var option = obj.options;

	if(jsIsNull(option) || jsIsNull(option.length))
		return;

	if(index != null){
		
		if(def)
			option[index].defaultSelected = true;
		option[index].selected = true;

		return;
	}


	for(ct=0; ct < option.length;ct++)
	{
		option[ct].selected = false;

		if(option[ct].value == val )
		{
			if(def)
				option[ct].defaultSelected = true;
			option[ct].selected = true;
		}
		else if(!isNaN(option[ct].value) && parseInt(option[ct].value,10) == parseInt(val))
		{
			if(def)
				option[ct].defaultSelected = true;
			option[ct].selected = true;
		}
	}
}

//radio group 의 초기값을 받아 radio group의 초기값을 셋팅한다.
function jsSetRadio(obj, val, index, def)
{
	if(jsIsNull(obj))
		return;

	if(obj.length == 1)
	{
		obj.checked = true;
		return;
	}
	
	if(def == null)
		def = true;

	if(index != null){
		
		if(def)
			obj[index].defaultChecked = true;
		obj[index].checked = true;

		return;
	}

	for(ct=0; ct < obj.length;ct++)
	{
		obj[ct].checked = false;

		if(obj[ct].value == val)
		{
			obj[ct].defaultChecked = true;
			obj[ct].checked = true;
		}
		else if(!isNaN(obj[ct].value) && parseInt(obj[ct].value,10) == parseInt(val))
		{
			obj[ct].defaultChecked = true;
			obj[ct].checked = true;
		}
	}
}

//select문의 내용을 초기화 한다
function jsClearSelect(obj)
{
	var sel_len = obj.options.length;

	if(sel_len == null)
		return;

	for(var i = 0 ; i < sel_len; i++)
 		obj.remove(0);

}

//한자리 숫자의 경우 앞에 '0'을 붙여야 할경우에 사용
//azval은 입력값,  azlen은 '0'을 붙인 문자열의 총길이
function jsAddZero(azval,azlen)
{

	var addzero = ""
	azval = azval.toString()

	if(azlen == null)
		azlen = 1

//	alert("azlen = "+ azlen +"\nazval.length = " + azval.length)
	for(var az=0; az < (azlen - azval.length); az++)
	{
		addzero += "0".toString()
	}

	azval = addzero.toString() + azval.toString()

	return azval.toString()
}

//뭉쳐서 들어온 날짜를 div로 들어온 문자열로 구분하여 준다.
//ex)jsMakeDate(20051122,"-") = 2005-11-22
function jsMakeDate(date,div)
{
	var len = date.length

	if(len == 6)
	{
		date = date.substring(0,2)+ div + date.substring(2,4)+ div + date.substring(4)
	}
	else if(len == 8)
	{
		date = date.substring(0,4)+ div + date.substring(4,6)+ div + date.substring(6)
	}
	return date
}

//넘어온 Object가 null 이거나 undefined 면 true를 아니면 false를 리턴한다.
function jsIsNull(obj)
{
	if(obj == null )
		return true;

	if(obj == undefined)
		return true;

	return false;
}

//넘어온 Object가 null 이거나 undefined 또는 공백, null 문자라면 true를 아니면 false를 리턴한다.
function jsIsNS(obj)
{
	if(jsIsNull(obj))
		return true;
	
	if(obj.toLowerCase() == "null")
		return true;

	if(jsIsSpace(obj))
		return true;

	return false;
}

//넘어온 문자열이 한글 인지 아닌지 검사
//한글이 아니면 문자가 있으면 false를 리턴
function jsIsKor(str)
{
	str = str.replace(/[가-힣]/g, "");

	if(str.length > 0)
		return false;

	return true;
}
//넘어온 문자열이 한글이나 영문이 아니면 false를 리턴
function jsIsKorE(val)
{
	str = str.replace(/[가-힣,a-z,A-Z]/g, "");

	if(str.length > 0)
		return false;

	return true;
}

//공백 문자만 있는지 검사한다.
//val로 넘어온 값이 String object가 아니거나, 아무것도 없거나, 공백문자만 있으면 true 를 리턴
function jsIsSpace(val){
	var re = /\s/g

	if(val.replace == undefined)
		return true;

	var reval = val.replace(re, "")

	if(reval.length == 0)
		return true

	return false
}

//문자열에 영문이 아닌 문자가 있는지 검사한다.
//val로 넘어온 값에 영문이 아닌 값이 있으면 false 를 리턴
function jsIsAlpha(val)
{
	var re = /[a-z]/gi
	var str = val.replace(re,"")

	if(str.length == 0)
		return true

	return false
}

//문자열에 영문과 숫자가 아닌 문자가 있는지 검사한다.
//val로 넘어온 값에 영문자나 숫자가 아니면 false 를 리턴
function jsIsNumAlpha(val)
{
	var re = /\w/gi
	var str = val.replace(re,"")

	if(str.length == 0)
		return true

	return false
}

//문자열에 숫자와 "-" 가 아닌 문자가 있는지 검사한다. (전화번호나 기타 일렬번호 검사에 사용)
//val로 넘어온 값에 숫자와 "-" 가 아닌 문자가 아니면 false 를 리턴
function jsIsBarNum(val)
{
	var re = /[0-9-]/g
	var str = val.replace(re,"")

	if(str.length == 0)
		return true

	return false
}

//주민번호를 검사한다.
//val1 은 주민번호 앞자리  val2는 주민번호 뒷자리 틀린 주민번호가 들어오면 false 리턴
//또는 val1 하나에 모두 넣고 val2는 null 상태로 두어도 된다.
function jsCheckRegNum(val1, val2)
{
	var tmp = ""

	var reg_num = val1

	if(val2 != null)
	{
		reg_num += val2.toString()
	}

	if(reg_num.length < 13)
		return false

	var digit = 0
	var digset = 2

	for(var n=0; n < (reg_num.length - 1); n++)
	{
		if(digset > 9)
			digset -= 8

		digit += reg_num.charAt(n) * digset

		digset++
	}

	digit = digit % 11
	digit = 11 - digit
	digit = digit % 10

	if(digit != reg_num.charAt(12))
		return false

	return true
}

//쿠키를 설정한다.
//이름, 값, expire는 기한 설정값으로 Date 타입으로 넘겨준다.

//ex) jsSetCookie("test", "13", new Date(2003,11,2))

function jsSetCookie(name,value,expire)
{
	expire = expire == null ? "" : ";expire=" + expire

	var cookie = name + "=" + escape(value) + expire

	document.cookie = cookie
}

//저정된 쿠키를 이름으로 찾는다.
//찾는 이름이 없으면 false가 리턴된다.
function jsGetCookie(name)
{
	var cookie = document.cookie
	name += "="
	var begin = cookie.indexOf(name)

	if(begin == -1)
		return false

	begin += name.length
	var end = cookie.indexOf(";",begin)

	if(end == -1)
		end = cookie.length

	return unescape(cookie.substring(begin, end))
}

//새창으로 열 주소와 새창의 크기 스크롤 여부를 파라미터로 넘긴다.
function jsPopUp(url,title,w,h,scroll,t,l,menu,tool,stat){
	var ww =""
	var hh = ""
	var scr = ""
	var tt = ""
	var ll = ""
	var mb = ""
	var tb = ""

	if(w != null && w != "")
		ww = ",width=" + w

	if(h != null && h != "")
		hh = ",height=" + h

	if(t != null && t != "" && t != "center" )
		tt = ",top=" + t

	if(l != null && l != "")
		ll = ",left=" + l

	if(t == "center"){

		tt = ",top=" + parseInt((screen.height - h) / 3 , 10);
		ll = ",left=" + parseInt((screen.width - w) / 2 , 10);
	}

	if(scroll != null && scroll != "")
		scr = ",scrollbars=" + scroll

	if(menu != null && menu != "")
		mb = ",menubar=" + menu

	if(tool != null && tool != "")
		tb = ",toolbar=" + tool

	if(stat != null && stat != "")
		st = ",status=" + stat

	var prop = mb + tb + st + ww + hh + scr + tt + ll

	return window.open(url,jsReplaceAll(title," ","_"),prop)

}

/*
* url:파일, w:폭, h:높이, scr: 스크롤유무, l:left, t:top
*/
function jsModal(url,w,h,scr,l,t){

	var ww ="";
	var hh = "";
	var tt = "";
	var ll = "";
	var sc = "";

	if(url == null && jsIsSpace(url))
		url = "about:blank";

	if(scr != null && scr != "")
		st = "scroll:"+ scr + ";";

	if(w != null && w != "")
		ww = "dialogWidth:" + w +"px;";

	if(h != null && h != "")
		hh = "dialogHeight:" + h +"px;";

	if(l != null && l != "")
		ll = "dialogLeft:" + l +"px;";

	if(t != null && t != "")
		tt = "dialogTop:" + t +"px;";

	var prop = sc + ww + hh + ll + tt;

	return window.showModalDialog(url,window, prop);
}

/*
* url:파일, w:폭, h:높이, scr: 스크롤유무, l:left, t:top
*/
function jsModeless(url,w,h,scr,l,t){

	var ww ="";
	var hh = "";
	var tt = "";
	var ll = "";
	var sc = "";

	if(url == null && jsIsSpace(url))
		url = "about:blank";

	if(scr != null && scr != "")
		st = "scroll:"+ scr + ";";

	if(w != null && w != "")
		ww = "dialogWidth:" + w +"px;";

	if(h != null && h != "")
		hh = "dialogHeight:" + h +"px;";

	if(l != null && l != "")
		ll = "dialogLeft:" + l +"px;";

	if(t != null && t != "")
		tt = "dialogTop:" + t +"px;";

	var prop = sc + ww + hh + ll + tt;

	return window.showModelessDialog(url,window, prop);
}

function move(url){
	window.location = url
}

//문자열의 전체 공백을 제거
function jsTrim(src)
{
	return src.replace(/\s/g, "")
}

//문자열의 외쪽에 있는 공백을 제거
function jsLTrim(src)
{
	return src.replace(/^\s+/, "");
}

//문자열의 오른쪽에 있는 공백을 제거
function jsRTrim(src)
{
	return src.replace(/\s+$/, "");
}

//들어온 값에 뒤에서 3번째 부터 3번째마다 "," 를 찍는다
function jsComma(val)
{

	if(val == null || val == undefined)
		return val

	var src = val.toString()
	var len = src.length

	if(len < 4)
		return src

	var start = len % 3

	var res = ""

	res += src.substring(0,start)

	for(var ct = start; ct < len-3; ct++)
	{
		res +=  ","+ src.substring(ct,ct+3)
		ct+=2
	}

	res += ","+ src.substring(len-3, len);

	if(res.charAt(0) == ',')
		res = res.substring(1);

	return res
}

//들어온 값의 , 를 제거하여 리턴
function jsRmComma(val)
{
	return jsReplaceAll(val,",","");
	
}

//src 원본의 target 로 들어온 값으로 잘라서 배열로 돌려준다.
//len으로 들어온 길이 보다 적다면 공백을 추가하여 길이 만큼의
//문자열 배열을 리턴.
function jsSplit(src, target, len)
{
	var ret = new Array();

	if(src == undefined || jsIsSpace(src)){

		if(len != undefined){

			for(var n = 0; n < len ; n++){
				ret[n] = "";
			}
			return ret;
		}
		else{
			return src;
		}
	}

	if(src.indexOf(target) < 0){

		ret[0] = src;

		for(var n = 1; n < len ; n++){
			ret[n] = "";
		}
		return ret;
	}

	ret = src.split(target);

	for(var n = ret.length; n < len ; n++){
		ret[n] = "";
	}

	return ret;
}


//src 원본의 target 로 들어온 값에 해당하는 문자들은 replace로 들어온 문자로 대체된다
function jsReplaceAll(src, target, replace)
{
	var pos = 0;
	var idx = 0;
	var t_len = target.length;
	var s_len = src.length;

	var ret = "";

	while(true)
	{
		idx = src.indexOf(target, pos);

		if(idx < 0)
			break;

		ret += src.substring(pos, idx);
		ret += replace;

		pos = idx + t_len;
	}

	if(pos < s_len)
		ret += src.substring(pos, s_len);

	return ret;
}

//src 원본의 target 로 들어온 값에 해당하는 문자중 첫번째것만 replace로 들어온 문자로 대체된다
function jsReplaceFirst(src, target, replace)
{
	var idx = 0;
	var warp = target.length;

	idx = src.indexOf(target);

	src = src.substring(0, idx) + replace + src.substring(idx+warp);

	return src;
}

/*전체 checkbox의 checked 값을 받는다 , ones는 부속 checkbox */
function jsAllCheck(ones,val)
{

	if(ones.name != undefined)
		ones.checked = val
	else
	{
		for(var n=0; n < ones.length; n++)
		{
			ones[n].checked = val
		}
	}
}

/* all은 전체선택 checkbox, one은 부속 checkbox */
function jsOneCheck(all,one)
{
	var flag = true

	if(one.name != undefined)
		flag = one.checked
	else
	{
		for(var n=0; n < one.length; n++)
		{
			flag = one[n].checked

			if(!flag)
				break
		}
	}
	all.checked = flag
}
// 입력한 폼의 하위 elements를 삭제
function jsFormClear(form){

	form.innerHTML = "";
}
// 입력한 폼의 하위 elements를 추가
function jsFormAddAttribute(form, name, value){
	
	form.innerHTML += "<input type='hidden' name='"+ name +"'>";

	var el = form.elements;
	el[(el.length - 1)].value = value;
}
//form 객체를 생성하고 hidden 객체의 생성 숫자를 넘겨준다
function jsInitForm(cnt,name)
{
	if(name == null)
	{
		name="gogogogogogogo"
	}

	if(cnt < 2)
		cnt = 2

	document.write("<form name='"+name+"'>")

	for(ct=0; ct< cnt;ct++)
	{
		document.write("<input type='hidden' disabled>")
	}

	document.write("</form>")
}

//이동할 페이지와 , 파라미터를 입력
//param은 "x=2,y=3,z=5" 같이 입력 하여야한다.
function jsFormSubmit(url,param,target,fname)
{
	var frm = null

	if(fname != null && fname != "")
		frm = jsFindFrm(fname)
	else
		frm = document.gogogogogogogo

	frm.method="post"
	frm.action = url

	if(target != null && target != "")
		frm.target = target

	for(var ct=0; ct < frm.length; ct++)
	{
		frm.elements[ct].disabled = true
	}

	if(!jsIsNS(param))
	{
		params = param.split(",")

		if(params.length > frm.length)
		{
			alert("가상 form 파라미터 수 설정이 잘못 되었습니다.");
			return;
		}

		for(ct=0; ct < params.length; ct++)
		{
			pm = params[ct].split("=")

			frm.elements[ct].disabled = false
			frm.elements[ct].name = pm[0]
			frm.elements[ct].value = pm[1]
		}
	}

	frm.submit()
}

/*
	지정한 form의 value를 모두 지운다.
*/
function jsFormReset(form){

	var el = form.elements;

	for(var n=0; n < el.length; n++){

		if(el[n].tagName == "INPUT" && (el[n].type.toLowerCase() == "hidden" || 
																		el[n].type.toLowerCase() == "text" ||
																		el[n].type.toLowerCase() == "password" ))
			el[n].value = "";

		if(el[n].tagName == "SELECT")
			jsSetSelect(el[n],"", null, 0);

		if(el[n].tagName == "INPUT" && (el[n].type.toLowerCase() == "checkbox"))
			el[n].checked = false;

		if(el[n].tagName == "INPUT" && (el[n].type.toLowerCase() == "radio"))
			jsSetRadio(el[el[n].name], "", 0);

		if(el[n].tagName == "TEXTAREA")
			el[n].value = "";

	}
}

/*
	지정한 form의 elements를 disabled 시킨다.
*/
function jsFormOff(form){

	var el = form.elements;

	for(var n=0; n < el.length; n++)
			el[n].disabled = true;

	form.disabled = true;
}

/*
	지정한 form의 elements를 enable 시킨다.
*/
function jsFormOn(form){

	var el = form.elements;

	for(var n=0; n < el.length; n++)
			el[n].disabled = false;

	form.disabled = false;
}

/** 특정 이벤트에 다음 form element로 이동 할때 사용
	c_obj는 이벤트 발생 element point는 이동할 count
**/
function jsFormNextFocus(c_obj,point)
{
	if(c_obj == null || c_obj == false)
		return;

	if(point == null)
		point = 1;

	var n_obj = jsFindObj(c_obj, point);

	if(n_obj != null)
	{
		if(!isLive(n_obj))
		{
			var el = c_obj.form.elements;

			if(!jsFormNextFocus(n_obj)){

				for(var n=0; n < el.length; n++){
					
					if(isLive(el[n])){
						el[n].focus();
						return true;
					}
				}
			}
		}
		else
		{
			n_obj.focus();
			return true;
		}
	}
	else{

		var el = c_obj.form.elements;

		if(!jsFormNextFocus(n_obj)){

			for(var n=0; n < el.length; n++){
				
				if(isLive(el[n])){
					el[n].focus();
					return true;
				}
			}
		}
	}
	return false;
}

/** 연계된 텍스트 박스에 사용.
	text에 들어온 Object의 값의 길이가 len의 길이와 같다면 다음 텍스트 박스로 포커스 이동
	onkeyup='jsFocusRelay(this,1)
**/
function jsFocusRelay(text, len)
{
	if(text == null)
		return;
	if(len == null || len == "" || len < 1)
		return;

	if(text.value.length == len)
		jsFormNextFocus(text);

}

/** form 의 textbox에서 enter key에 따라 function을 실행하기
	ex) <FORM NAME="FormMain" METHOD="post" ACTION="/CommonServlet" onSubmit="return false;" onKeyDown="return jsOnEnter(event, fs_Search);">
*/
function jsOnEnter(event, func){

	if(event.keyCode == 13){
		
		if(event.srcElement.tagName.indexOf("TEXTAREA") > -1)
			return true;

		func();
		return false;
	}
	else if(event.keyCode == 9){
		
		var c_obj = event.srcElement;
		var el = c_obj.form.elements;

		if(el[el.length-1] == c_obj)
			jsFormNextFocus(c_obj, -1 * (el.length-1));
		else
			jsFormNextFocus(c_obj);
		
		return false;
	}
	return true;
}
/** 넘긴 object가 focus를 줄수 있는지 여부를 반환 **/
function isLive(n_obj){

	if(n_obj == null
			|| (n_obj.disabled != null && n_obj.disabled == true)
			|| (n_obj.readonly != null && n_obj.readonly == true)
			|| n_obj.style.display.toLowerCase() == "none" 
			|| n_obj.type == 'hidden')
		return false;
	else
		return true;
}

/**입력 가능한 Object인지 여부를 반환 **/
function isIObj(n_obj){
	
	if(n_obj == null || n_obj.tagName == null)
		return false;

	var tg = n_obj.tagName;
	
	switch(tg){

		case "INPUT":
		case "SELECT":
		case "TEXTAREA":
			return true;
	}

	return false;
}

/** 특정 이벤트에 다음 element로 이동 할때 사용
	c_obj는 이벤트 발생 element, point는 이동할 count
**/
function jsAllNextFocus(c_obj,point)
{
	if(c_obj == null || c_obj == false)
		return;

	if(point == null)
		point = 1;
	else
		point = parseInt(point, 10);

	var c_idx = jsAllFindIndex(c_obj);
	var el = document.all;
	var pt = 1;

	for(var n=0; n < el.length; n++){
/*		
		if(confirm("tagName:"+ el[n].tagName + ", " + "name:"+ el[n].name + ", " + "id:"+ el[n].id + ", " + isIObj(el[n]) + ", " + isLive(el[n])))
			return;
*/
		if(c_idx < n && pt == point && isIObj(el[n]) && isLive(el[n])){

			el[n].focus();
			return true;
		}
		else if(c_idx < n && isIObj(el[n]) && isLive(el[n])){

			pt++;
			continue;
		}
		else
			continue;
	}

	return false;
}
/** 보고 있는 브라우저가 MSIE 인지 아닌지를 리턴 */
function jsIsMSIE(){
	
	if(navigator.appVersion.indexOf("MSIE") < -1)
		return false;
	else
		return true;
}

//깜빡이 text
/* 사용 예
<scrit>
	function blink()
	{
		cols = new Array();

		cols[0] = "red";
		cols[1] = "blue";

		blink_init('tbl', cols, 1); (끝의 1은 깜빡하는 간격을 설정 단위는 초)

	}
</script>
<BODY onload="blink();">
*/

var b_property = new Array();

function blank_property()
{
	this.id="";
	this.color = new Array();
	this.c_idx = 0;

	this.object = null;
}

function startBlink(idx)
{
	var prt = b_property[idx];

	var objBlink = prt.object;


	if(objBlink.style.visibility == "hidden")
	{
		objBlink.style.visibility = "";

		if(prt.color.length > 0)
		{
			objBlink.style.color = prt.color[prt.c_idx];

			prt.c_idx++;

			if(prt.c_idx == prt.color.length)
				prt.c_idx = 0;
		}
	}
	else
	{
		objBlink.style.visibility = "hidden";
	}
}

function blink_init(id, cols, interval)
{
	var tmp = null;
	var idx = b_property.length;

	var obj = jsFindId(id);

	if(!obj)
		return;

	if(interval == null || isNaN(interval))
		interval = 500;
	else
		interval = interval*1000;


	b_property[idx] = new blank_property();
	b_property[idx].id = id;

	b_property[idx].object = obj;

	if(cols != null)
		b_property[idx].color = cols;

	setInterval("startBlink("+ idx +")", interval);
}

//마우스 포인터의 가로 위치
function jsGetMousePosionX()
{
	var x = document.body.scrollLeft

	return parseInt(event.clientX + x,10);
}

//마우스 포인터의 세로 위치
function jsGetMousePosionY()
{
	var y = document.body.scrollTop

	return parseInt(event.clientY + y,10);
}




//255 보다 적은 integer 숫자를 hex 코드로 돌려준다.

function jsGetHex(val)
{
	var num = new Array();

	if(val > 255)
	{
		alert("입력값이 255보다 큽니다.")
		return
	}

	num[0] = parseInt(val / 16,10);
	num[1] = parseInt(val % 16,10);


	var ret = "";
	var tmp = "";

	for(var n=0; n < 2; n++)
	{
		switch(num[n])
		{
			case 10:
				tmp = "A";
			break;

			case 11:
				tmp = "B";
			break;

			case 12:
				tmp = "C";
			break;

			case 13:
				tmp = "D";
			break;

			case 14:
				tmp = "E";
			break;

			case 15:
				tmp = "F";
			break;

			default:
				tmp = num[n];
		}

		ret += tmp.toString();
	}

	return ret;
}


/*/마우스 오버,아웃 메소드
function kbsOver(obj)
{
	var ch = this.children;

	for(var n=0; n < ch.length; n++)
	{
		if(ch[n].tagName == "TD")
			ch[n].style.filter = "wave(freq=1,lightstrength=40, phase=0, strength=1);";
	}
}

function kbsOut(obj)
{

	var ch = this.children;

	for(var n=0; n < ch.length; n++)
	{
		if(ch[n].tagName == 'TD')
			ch[n].style.filter = "";
	}
}
*/
//////////////////////////*         팝업 메뉴         */////////////////////////////////////


//팝업 메뉴의 선택된 부분
function kbspmover(tr)
{
	tr.style.backgroundColor = "#000066";
	tr.style.color = "white";
	tr.style.cursor = "default";
}

//팝업 메뉴의 선택되지 않은 부분
function kbspmout(tr)
{
	tr.style.backgroundColor = "#D4D0C8";
	tr.style.color = "black";
}


// 위의 주석 부분은 사용 예제


//팝업 메뉴를 클릭 했을때...
function kbsPopupRun(value, target)
{
	location.target = target;

	location.href = "javascript:"+ value;

}

var kbsppmenus = new Array();
var kbssubmenu = new Array();

function makePopUpMenu(name,width,row,line)
{
	var kbsppmenu_cnt = kbsppmenus.length;

	line -= 1;

	document.write("<span style='z-index: 99;background-color: #8A2BE2;position: absolute; padding: 0px; margin: 0px;visibility: hidden;border: 1px outset;' id='"+name+"' row='"+row+"'>");
	document.write("<table width='"+ width +"' cellpadding='3' cellspacing='0' border='0' bgcolor='#D4D0C8' style='font:12px;border: 1px outset;' ondragstart='return false' onselectstart='return false'>");

	for(var n=0; n < row; n++)
	{
		document.write("<tr >");

		var lin = false;

		if(line != null)
		{
			if(line[0] == undefined)
			{
				if(line == n)
					lin = true;
			}
			else
			{
				for(var l=0; l < line.length; l++)
				{
					if(line[l] == n)
					{
						lin = true;
					}
				}
			}
		}

		if(!lin)
		{
			document.write("<td oncontextmenu='return false' valign='middle' onMouseOver='kbspmover(this)' onMouseOut='kbspmout(this)' id='"+name+n+"' ");
			document.write("style='padding-left: 10px;' onclick='kbsPopupRun(this.value, this.target)' value='' target='_self'></td>");
			document.write("</tr>");
		}
		else
		{
			document.write("<td oncontextmenu='return false' valign='middle' onMouseOver='kbspmover(this)' onMouseOut='kbspmout(this)' id='"+name+n+"' ");
			document.write("style='padding-left: 10px; border-bottom: 2px groove;' onclick='kbsPopupRun(this.value, this.target)' value='' target='_self'></td>");
			document.write("</tr><tr><td height='5'></td></tr>");
		}
	}
	document.write("</table>");
	document.write("</span>");

	kbsppmenus[kbsppmenu_cnt] = jsFindId(name);

	kbssubmenu[kbsppmenu_cnt] = new Array();

	for(var n=0; n < kbsppmenus[kbsppmenu_cnt].row; n++)
	{
		kbssubmenu[kbsppmenu_cnt][n] = jsFindId(name+n);
	}
}


//활성화된 팝업메뉴를 닫는다.
function kbsclosejsPopUp(non)
{
	//alert(kbspopupmenus.length);
	for(var n=0; n < kbsppmenus.length; n++)
	{
		if(n != non)
			kbsppmenus[n].style.visibility = "hidden";
	}
}

function setkbsPopupPosition(div)
{
	body=document.body

	x=event.clientX+body.scrollLeft
	y=event.clientY+body.scrollTop

	m = div
	m.style.pixelLeft=x

	if( (x+m.scrollWidth > body.clientWidth)&&(x-m.scrollWidth > 0) )
		m.style.pixelLeft=x-m.scrollWidth

	m.style.pixelTop=y

	if( (y+m.scrollHeight > body.clientHeight)&&(y-m.scrollHeight > 0) )
		m.style.pixelTop=y-m.scrollHeight

/*
	var pos = (div.row * 20);

//	alert((document.body.scrollTop+document.body.offsetHeight) +"---"+ (getMousePosionY() + pos));

	if((document.body.scrollTop+document.body.offsetHeight) > getMousePosionY() + pos)
		pos = 0;

	div.style.left = getMousePosionX();
	div.style.top = getMousePosionY() - pos;*/
}


//오른쪽 마우스를 눌렀을때 팝업 메뉴를 활성화 시킨다.
/* 예제
function kbsopenjsPopUp(reg_no, ccd)
{
	if(event.srcElement.tagName == "DIV")
		return false;

	kbsclosejsPopUp();

	var popid = jsFindId("pop1");

	if(!popid)
		return true;

//페이지별로 다르게 할 부분
	var m0 = jsFindId("pop10");
	var m1 = jsFindId("pop11");

	m0.value = "goCustInfo('"+reg_no+"','"+ccd+"')";
	m1.value = "goPayInfo('"+reg_no+"')";

	m0.innerHTML = "고객 정보 바로가기";
	m1.innerHTML = "고객 납부정보 바로가기";


	popid.style.visibility = "visible";
	popid.style.left = getMousePosionX();
	popid.style.top = getMousePosionY();


	return false;
}

팝업 메뉴가 나와야 할 곳의 예제
<td oncontextmenu="return kbsopenjsPopUp('1,2')" style="cursor:default;">

-----------------   html에 팝업 메뉴 닫는 함수를 클릭 이벤트에 포함하여야 한다.-----------------
<html onclick='kbsclosejsPopUp()'>
*/

//---------------  border style create ------------------------------

/********************************************************************************
border css 설정 postion은 top = t, bottom = b, lert = l, right = r, 
	top_bottom = tb, left_top_bottom = ltb, right_top_bottom = rtb, side = lr,
	side_top = lrt, side_bottom = lrb, all 이것중 선택
********************************************************************************/
function setBoardStyle(name, position, type, width, color)
{
	if(type == null || type == "")
		type = "solid";

	if(width == null || width == "")
		width = "1px";

	if(color == null || color == "")
		color = "gray";



	document.write("<style>");
	document.write("." + name + "{");

	switch(position)
	{
		case "t":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
		break;

		case "b":
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
		break;

		case "l":
			document.write("border-left: "+ width + " " + type + " " + color + ";");
		break;

		case "r":
			document.write("border-right: "+ width + " " + type + " " + color + ";");
		break;

		case "tb":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
		break;

		case "ltb":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
			document.write("border-left: "+ width + " " + type + " " + color + ";");
		break;

		case "rtb":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
			document.write("border-right: "+ width + " " + type + " " + color + ";");
		break;

		case "lr":
			document.write("border-left: "+ width + " " + type + " " + color + ";");
			document.write("border-right: "+ width + " " + type + " " + color + ";");
		break;

		case "lrt":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
			document.write("border-left: "+ width + " " + type + " " + color + ";");
			document.write("border-right: "+ width + " " + type + " " + color + ";");
		break;

		case "lrb":
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
			document.write("border-left: "+ width + " " + type + " " + color + ";");
			document.write("border-right: "+ width + " " + type + " " + color + ";");

		break;

		case "all":
			document.write("border-top: "+ width + " " + type + " " + color + ";");
			document.write("border-bottom: "+ width + " " + type + " " + color + ";");
			document.write("border-left: "+ width + " " + type + " " + color + ";");
			document.write("border-right: "+ width + " " + type + " " + color + ";");
		break;

	}


	document.write("}");
	document.write("</style>");

}

function  vcodetable(){

	for(var n=0; n < 10000; n++){
		document.write(String.fromCharCode(n) + " : " + n + "<br>");
	}
}
/* 레이어 테이블 내용에 따라 크기 변경 예제

function reSize(val)
{
	var size = getSize(val)

	var div = jsFindId("div_table");

	div.style.height = size;
}

function getSize(cnt)
{
	var infield = null;
	var size = 0;

	for(var n=0; n < cnt; n++)
	{
		infield = jsFindId("in_field"+n);

		if(infield == false)
			break;

		size += infield.offsetHeight + 4;

	}

	return size;
}





/*********************************************
* 파일명: lib.validate.js
* 기능: 유연한 자동 폼 검사기
* 만든이: 거친마루 <comfuture@maniacamp.com>
* 날짜: 2002-10-01
* == change log ==
* 2003-10-02 여러칸으로 나눠진 항목에 대한 검사기능 추가
* 2003-10-02 패스워드등 두개 항목에 대한 비교 기능 추가
**********************************************/
/*
<SCRIPT LANGUAGE="JAVASCRIPT" SRC="/inc/js/kfsbyjobutil.js"></SCRIPT>
<form name="test" action="script.php" method="post" onSubmit="return validate(this)">
................
................
</form> 
<!-- 검사할 폼 태그의 onsubmit 이벤트에 return validate(this) 라고 기술합니다 -->

이로써 준비 과정은 끝났습니다.


 
검사를 위한 속성 사용법 
이제 저 폼에 있는 모든 엘리먼트는 submit이 일어나기 전에 검사기를 통과하게 됩니다.
이때 어떤 항목을 검사할찌, 어떤 방법으로 검사할찌를 html 태그의 속성값으로 정해주기만 하면 됩니다.

쓰이는 속성들
hname 항목의 한글이름(에러메시지를 보여줄때 등) 
option 특수한 검사를 수행할 옵션 
required 필수항목인지 여부를 나타내는 속성 
maxbyte maxlength와 달리 한글 2글자는 4바이트로 인식 


예를 봅시다
<input type="text" name="userid" hname="유저 아이디" required> 
이것은 userid 라는 항목을 "유저 아이디" 라고 부르며 필수 항목이므로 입력이 안되면 에러를 발생시킵니다.

<input type="text" name="name" hname="이름" option="hangul" required>
이름은 역시 필수항목이며 "hangul" option이 추가되어서 이름에 한글이 한자이상 포함되어있지 않으면 에러를 발생시킵니다.

<input type="text" name="phone" hname="전화번호" option="phone">
전화번호 항목은 필수 항목은 아니지만 입력되었을 경우 제대로 입력되었는지 검사하게 되며, 핸드폰일경우는 자동으로 하이픈을 붙여주게 됩니다.

이상 예를 보고 다른 검사 항목도 충분히 사용할수 있으리라 생각됩니다.
 
특수 패턴 검사 option의 값  
email, phone, userid, hangul, number, engonly, jumin, bizno, passwd, imgfile(jpg,gif확장자만 허용)

이름만 보아도 어떤 옵션인지 쉽게 알수 있을껍니다. 자바스크립트를 조금 할 줄 아시는 분이라면 자신만의 검사
함수를 충분히 추가해 넣으실 수 있을껍니다. 자신이 없으신 분이라면 굳이 수정하지 않으셔도 충분히 사용하는데는
문제 없습니다. 여기에 올려진 검사 함수들은 자주 쓰이는것을만 포함시켰고, 이 외에도 아이피주소가 올바른지 또는
홈페이지 주소가 올바른지 체크하는 함수들이 얼마든지 있지만 공통으로 쉽게 불러 쓸 수 있는 함수를 만드는것이
목적이었으므로 일단 가볍게 배포합니다.
 
에러메시지 포멧 정의 
이번 버전에서 획기적으로 바뀐 부분이 에러메시지 사용자 정의 인터페이스 입니다. 기존 함수에서는 미리 정해진
에러만 출력 되었고, 항목 이름에 따라 조사가 자동으로 붙지 못해서 좀 어색한 에러 메시지를 출력할 수 밖에 없었지만
이번 라이브러리에서는 에러메시지를 사용자가 쉽게 바꾸어 사용할 수 있도록 정의 부분을 위쪽에 따로 빼내어두었고
자바스크립트 변수를 템플릿화 해서 사용할 수 있으며 변수 내용의 마지막 글자 종성 유무에 따라 조사를 자동으로
붙여주는 기능이 있습니다.

에러메시지 템플릿 사용법
ex)
NO_BLANK = "{name+은는} 필수 항목입니다";

위 변수에서 중괄호로 묶인 부분은 검사되는 엘리먼트의 hname 또는 name 으로 자동으로 대치됩니다. 또한 내용의
마지막 글자 종성유무에 따라 '은' 또는 '는' 조사가 자동으로 붙게 됩니다. userid 항목에 사용되었다면
"유저 아이디는 필수 항목입니다" 라는 에러를 발생시킬 것입니다. 이것은 다음과 같이 바꿀 수 있습니다.

NO_BLANK = "{name+이가} 비어있어서 전송하지 못했습니다";
또는
NO_BLANK = "{name+을를} 입력해주세요";

{변수+조사} 에서 +조사 부분은 없어도 동작합니다.

단순하게 아래와 같이 바꿀 수도 있습니다.
NO_BLANK = "{name}항목은 필수 항목입니다.";

 
2003년 10월 2일 추가된 기능 
- 여러 필드로 나누어진 항목에 대한 검사 방법이 추가되었습니다.

ex) 3개 필드로 나누어진 전화번호 입력란 만들기
<input type="text" name="phone1" size="3" hname="전화번호" option="phone" required span="3"> -
<input type="text" name="phone2" size="4"> -
<input type="text" name="phone3" size="4">
span 값이 있으면 해당 엘리먼트로부터 span값만큼의 엘리먼트의 값을 합친걸 기준으로 phone
형식 검사를 수행합니다. 이때 span 되는 엘리먼트에 대해서는 option을 따로 주지 않아도 됩니다.

ex2) 2개 항목으로 나누어진 이메일 입력란 만들기
<input type="text" name="email1" hname="이메일" option="email" required span="2" glue="@">@
<input type="text" name="email2">
여러개 항목으로 나눠져있지만 구분자는 입력에 들어가지 않을경우 glue 속성에 적어주시면 해당 문자로 합쳐집니다. 
-> email1@email2 에대한 이메일 패턴 검사 결과를 출력합니다. 

- 패스워드 확인등 두개의 항목값이 같아야 하는 상황에 대한 체크 방법이 추가되었습니다.

ex) 패스워드 confirm 구현하기
<input type="password" name="passwd" hname="패스워드" required match="passwd2">
한번더 <input type="password" name="passwd2" required> 
이때는 passwd 항목과 passwd2 항목이 같지 않을경우 경고창을 출력하게 됩니다.


*/
/// 에러메시지 포멧 정의 ///
var NO_BLANK = "{name+은는} 필수항목입니다";
var NOT_VALID = "{name+이가} 올바르지 않습니다";
var NOT_SELECT = "{name+을를} 선택하지 않았습니다.";
// var TOO_LONG = "{name}의 길이가 초과되었습니다 (최대 {maxbyte}바이트)";

/// 스트링 객체에 메소드 추가 ///
//공백 제거
String.prototype.trim = function(str) { 
	str = this != window ? this : str; 
	return str.replace(/\s/g, ""); 
}
//왼쪽 공백 제거
String.prototype.ltrim = function(str) { 
	str = this != window ? this : str; 
	return str.replace(/^\s+/, ""); 
}
//오른쪽 공백 제거
String.prototype.rtrim = function(str) { 
	str = this != window ? this : str; 
	return str.replace(/\s+$/, ""); 
}
//한글 조사를 판별
String.prototype.hasFinalConsonant = function(str) {
	str = this != window ? this : str; 
	var strTemp = str.substr(str.length-1);
	return ((strTemp.charCodeAt(0)-16)%28!=0);
}
//문자의 byte를 리턴
String.prototype.bytes = function(str) {
	str = this != window ? this : str;
	var len = 0;
	for(j=0; j<str.length; j++) {
		var chr = str.charAt(j);
		len += (chr.charCodeAt() > 128) ? 2 : 1;
	}
	return len;
}
//문자를 원하는 문자를 기준으로 나누어 준다
//len으로 들어온 길이 보다 적다면 공백을 추가하여 길이 만큼의
//문자열 배열을 리턴
String.prototype.capsplit = function(target, len){
	src = this != window ? this : src;

	var ret = src.split(target);
	
	if(len == undefined || len == null)
		return ret;

	for(var n = ret.length-1; n < len ; n++){
		ret[n] = "";
	}
	return ret;
}

function validate(form) {

	for (i = 0; i < form.elements.length; i++ ) {

		var el = form.elements[i];

		if (el.tagName == "FIELDSET" || el.disabled == true) {
			continue;
		}
		//el.value = el.value.rtrim();
		
		var minbyte = el.getAttribute("MINBYTE");
		var maxbyte = el.getAttribute("MAXBYTE");
		var option = el.getAttribute("OPTION");
		var match = el.getAttribute("MATCH");
		var glue = el.getAttribute("GLUE");

		if (el.getAttribute("REQUIRED") != null) {
			
			if(el.tagName == "SELECT" && el.selectedIndex == 0)
				return doError(el, NOT_SELECT);

			if(el.type != null && el.type == "radio"){
				
				var checkflag = false;

				for(var rn=0; rn < form.elements[el.name].length; rn++){

					if(form.elements[i+rn].checked == true){
						checkflag = true;
						break;
					}
				}
				
				if(!checkflag)
					return doError(el, NOT_SELECT);
			}

			if (el.value == null || el.value == "")
				return doError(el,NO_BLANK);

		}

		if (minbyte != null) {
			
			var ermsg = "";

			if (el.value.bytes() < parseInt(minbyte)) {

				if(option != null && option == "number")
					ermsg = "{name+은는} 최소 "+ minbyte +"자 이상 입력해야 합니다.";
				else if(option != null && option == "hangul")
					ermsg = "{name+은는} 최소 한글"+ Math.round(minbyte/2) +"자 이상 입력해야 합니다.";
				else if(option != null && option == "engonly")
					ermsg = "{name+은는} 최소 영문"+ minbyte +"자 이상 입력해야 합니다.";
				else if(option != null && option == "numalpha")
					ermsg = "{name+은는} 최소 숫자나 영문 "+ minbyte +"자 이상 입력해야 합니다.";
				else
					ermsg = "{name+은는} 최소 한글"+ Math.round(minbyte/2) +"자, 영문"+ minbyte +"자 이상 입력해야 합니다.";
				
				return doError(el, ermsg);
			}
		}

		if (maxbyte != null && el.value != "") {
			
			var ermsg = "";

			var len = 0;

			if (el.value.bytes() > parseInt(maxbyte)) {

				if(option != null && option == "number")
					ermsg = "{name+은는} 최대 "+ maxbyte +"자 이하로 입력해야 합니다.";
				else if(option != null && option == "hangul")
					ermsg = "{name+은는} 최대 한글"+ Math.round(maxbyte/2) +"자 이하로 입력해야 합니다.";
				else if(option != null && option == "engonly")
					ermsg = "{name+은는} 최대 영문"+ maxbyte +"자 이하로 입력해야 합니다.";
				else if(option != null && option == "numalpha")
					ermsg = "{name+은는} 최대 숫자나 영문 "+ maxbyte +"자 이하로 입력해야 합니다.";
				else
					ermsg = "{name+은는} 최대 한글"+ Math.round(maxbyte/2) +"자, 영문"+ maxbyte +"자 이하로 입력해야 합니다.";
				
				return doError(el, ermsg);
			}
		}

		if (match && (el.value != form.elements[match].value)) return doError(el,"{name+이가} 일치하지 않습니다");

		if (option != null && el.getAttribute('SPAN') != null) {

				var _value = new Array();

				for (span=0; span<el.getAttribute('SPAN');span++ ) {

					_value[span] = form.elements[i+span].value;
				}
				
				var value = _value.join("");
				
				if(jsIsSpace(value))
					continue;

				value = _value.join(glue == null ? '' : glue);

				if (!funcs[option](el,value)) return false;
		}
		else if(option != null && el.value != "") {

			if (!funcs[option](el)) return false;
		}
	}

	return true;
}

function josa(str,tail) {
	return (str.hasFinalConsonant()) ? tail.substring(0,1) : tail.substring(1,2);
}

function doError(el,type,action) {
	var pattern = /{([a-zA-Z0-9_]+)\+?([가-힝]{2})?}/;
	var name = (hname = el.getAttribute("HNAME")) ? hname : el.getAttribute("NAME");
	pattern.exec(type);
	var tail = (RegExp.$2) ? josa(eval(RegExp.$1),RegExp.$2) : "";
	alert(type.replace(pattern,eval(RegExp.$1) + tail));
	if (action == "sel") {
		el.select();
	} else if (action == "del")	{
		el.value = "";
	}
	try{
		el.focus();
	}catch(e){
	}
	return false;
}	

/// 특수 패턴 검사 함수 매핑 ///
var funcs = new Array();
funcs['email'] = isValidEmail;
funcs['phone'] = isValidPhone;
funcs['hphone'] = isValidHPhone;
funcs['userid'] = isValidUserid;
funcs['hangul'] = hasHangul;
funcs['number'] = isNumeric;
funcs['engonly'] = alphaOnly;
funcs['!spchar'] = isNotSpChar;
funcs['numalpha'] = isNumAlpha;
funcs['jumin'] = isValidJumin;
funcs['bizno'] = isValidBizNo;
funcs['domain'] = isValidDomain;
funcs['imgfile'] = isValidImage;
funcs['imgfiles'] = isValidImages;
funcs['passwd'] = isValidUserpwd;

/// 패턴 검사 함수들 ///

function isValidImage(el) {
	
	var pattern = /[\w\W]+\.jpg|gif$/i;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} jpg와 gif 파일만 업로드 할 수 있습니다.");
}
function isValidImages(el) {
	
	var pattern = /[\w\W]+\.jpg$/i;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} jpg 파일만 업로드 할 수 있습니다.");
}
function isValidEmail(el,value) {
	var value = value ? value : el.value;
	var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
	return (pattern.test(value)) ? true : doError(el,NOT_VALID);
}

function isValidUserid(el) {
	var pattern = /^[a-zA-Z]{1}[a-zA-Z0-9]{3,9}$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 4자이상 10자 이하이어야 하고,\n첫글자는 영문 그뒤는 영문, 숫자만 사용할 수 있습니다");
}

function isValidUserpwd(el) {
	var pattern = /^[a-zA-Z0-9]{4,8}$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 4자이상 8자 이하이어야 하고,\n영문, 숫자만 사용할 수 있습니다");
}

function hasHangul(el) {
	var pattern = /^[가-힣<>\[\]()\s]+$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 반드시 한글로 입력하십시오.");
}

function isNumAlpha(el) {

	return (jsIsNumAlpha(el.value)) ? true : doError(el,"{name+은는} 영문과 숫자만 입력 하여야 합니다.");
}

function isNotSpChar(el) {
	var pattern = /^[a-zA-Z가-힣0-9\s]+$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 특수문자를 사용할 수 없습니다.");
}

function alphaOnly(el) {
	var pattern = /^[a-zA-Z<>\[\]()\s]+$/;
	return (pattern.test(el.value)) ? true : doError(el,NOT_VALID);
}

function isNumeric(el, value) {
	var pattern = /^[0-9]+$/;
	var num = value ? value : el.value;

	return (pattern.test(num)) ? true : doError(el,"{name+은는} 반드시 숫자로만 입력해야 합니다");
}

function isValidJumin(el,value) {
  var pattern = /^([0-9]{6})-?([0-9]{7})$/; 
	var num = value ? value : el.value;

	if (!pattern.test(num)) return doError(el,NOT_VALID); 
	num = RegExp.$1 + RegExp.$2;
/*
	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return doError(el,NOT_VALID);
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return ((11 - mod) % 10 == last) ? true : doError(el,NOT_VALID);
	*/
	var digit = 0;
	var digset = "234567892345";

	for(var n=0; n < 12; n++)
		digit += parseInt(num.charAt(n),10) * parseInt(digset.charAt(n), 10);


	digit = digit % 11;
	digit = 11 - digit;
	digit = digit % 10;

	if(digit != parseInt(num.charAt(12),10))
		return doError(el, NOT_VALID);

	return true;
}

function isValidBizNo(el, value) { 
	var pattern = /([0-9]{3})-?([0-9]{2})-?([0-9]{5})/; 
	var num = value ? value : el.value;
	
	if (!pattern.test(num)) return doError(el,NOT_VALID); 
	num = RegExp.$1 + RegExp.$2 + RegExp.$3;

	var chkRule = "137137135";

	var strCorpNum = num;
	var step1, step2, step3, step4, step5, step6, step7;

	step1 = 0;

	for (i=0; i<7; i++)
	{
		step1 = step1 + (strCorpNum.substring(i, i+1) * chkRule.substring(i, i+1));
	}

	step2 = step1 % 10;
	step3 = (strCorpNum.substring(7, 8) * chkRule.substring(7, 8)) % 10;
	step4 = strCorpNum.substring(8, 9) * chkRule.substring(8, 9);
	step5 = Math.round(step4 / 10 - 0.5);
	step6 = step4 - (step5 * 10);
	step7 = (10 - ((step2 + step3 + step5 + step6) % 10)) % 10;

	if (strCorpNum.substring(9, 10) != step7)	// 결과 비교 판단
	{
		return doError(el,NOT_VALID);
	}
	return true;
}
function isValidHPhone(el, value) {
	var pattern = /^([0]{1}[0-9]{1,2})-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var num = value ? value : el.value;
	if (pattern.exec(num)) {

		if(RegExp.$1 == "010" || RegExp.$1 == "011" || RegExp.$1 == "016" || RegExp.$1 == "017" || RegExp.$1 == "018" || RegExp.$1 == "019"  ) {

			if (!el.getAttribute('SPAN'))
				el.value = RegExp.$1 + "-" + RegExp.$2 + "-" + RegExp.$3;
		}
		else
			return doError(el,NOT_VALID);

	} else {
		return doError(el,NOT_VALID);
	}
	return true;
}

function isValidHPhone2(el, value) {
	var pattern = /^([0]{1}[0-9]{1,2})-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var num = value ? value : el.value;
	if (pattern.exec(num)) {

		if(RegExp.$1 == "010" || RegExp.$1 == "011" || RegExp.$1 == "016" || RegExp.$1 == "017" || RegExp.$1 == "018" || RegExp.$1 == "019"  ) {


		}
		else
			return false;

	} else {
		return false;
	}
	return true;
}

function isValidPhone(el,value) {

	var pattern = /^([0-9]{2,4})-?([0-9]{3,4})-?([0-9]{4})$/;
	var num = value ? value : el.value;
	if (pattern.exec(num)) {
		if (!el.getAttribute('SPAN')){
			el.value = RegExp.$1 + "-" + RegExp.$2 + "-" + RegExp.$3;
		}

	} else {
		return doError(el,NOT_VALID);
	}
	return true;
}

/*
function isValidDomain(el) {
	var pattern = /^.+(\.[a-zA-Z]{2,3})$/;
	return (pattern.test(el.value)) ? true : doError(el,NOT_VALID);
}
*/

function isValidDomain(el,value) {
	var value = value ? value : el.value;

	if(value.indexOf("http://") > -1)
		return doError(el,"{name+은는} 'http://' 부분은 빼고 입력하십시오.");

	var pattern = new RegExp("^(http://)?([가-힝a-zA-Z0-9-\.]+\.[a-zA-Z]{2,3}$)","i");
	if (pattern.test(value)) {
		el.value = RegExp.$2;
		return true;
	} else {
		return doError(el,NOT_VALID);
	}
}

function jsSet3Phone(obj1, obj2, obj3, val){

	var nums = jsSplit(val, "-", 3);

	obj1.value = nums[0];
	obj2.value = nums[1];
	obj3.value = nums[2];
}

function jsSet2Post(obj1, obj2,  val){

	var nums = jsSplit(val, "-", 2);

	obj1.value = nums[0];
	obj2.value = nums[1];
}

//obj 전화번호 처음 object를 val은 011-111-11과 같은 전화번호를 입력하면 해당 object에
//자동으로 입력
function jsSetPhone(obj, val){

	var obj2 = jsFindObj(obj, 1);
	var obj3 = jsFindObj(obj, 2);

	jsSet3Phone(obj, obj2, obj3, val);
}


function jsGet3Phone(obj1, obj2, obj3){
	
	if(jsIsSpace(obj1.value) || jsIsSpace(obj2.value))
		return "";

	if(jsIsSpace(obj3.value))
		return obj1.value + "-" + obj2.value;
	else
		return obj1.value + "-" + obj2.value + "-" + obj3.value;
}
//obj 전화번호 처음 object를 입력하면 해당 전화번호 object들의 값을 합쳐 200-1111-1111과
//같은 값을 리턴
function jsGetPhone(obj){

	var obj2 = jsFindObj(obj, 1);
	var obj3 = jsFindObj(obj, 2);

	return jsGet3Phone(obj, obj2, obj3);
}

function jsSet3BizNo(obj1, obj2, obj3, val){

	if(val.length < 10){
		alert("사업자 번호 길이가 너무 짧습니다.");
		return 
	}

	obj1.value = val.substring(0,3);
	obj2.value = val.substring(3,5);
	obj3.value = val.substring(5);
}

function jsGet3BizNo(obj1, obj2, obj3){
	
	if(jsIsSpace(obj1.value) || jsIsSpace(obj2.value) || jsIsSpace(obj3.value))
		return "";

	return obj1.value + "" + obj2.value + "" + obj3.value;
}
//obj 사업자번호 처음 object를 입력하면 해당 사업자번호 object들의 값을 합쳐 200-11-11111과
//같은 값을 리턴
function jsGetBizNo(obj){

	var obj2 = jsFindObj(obj, 1);
	var obj3 = jsFindObj(obj, 2);

	return jsGet3BizNo(obj, obj2, obj3);
}

//obj 사업자번호 처음 object를 val은 287-99-82829 같은 사업자번호를 입력하면 해당 object에
//자동으로 입력
function jsSetBizNo(obj, val){

	var obj2 = jsFindObj(obj, 1);
	var obj3 = jsFindObj(obj, 2);

	jsSet3BizNo(obj, obj2, obj3, val);	
}

function jsSet2RegNo(obj1, obj2, val){

	if(val.length < 13){
		alert("주민번호 길이가 너무 짧습니다.");
		return;
	}

	obj1.value = val.substring(0,6);
	obj2.value = val.substring(6);

}
//obj 주민번호 처음 object를 val은 800101-1887888 같은 주민번호를 입력하면 해당 object에
//자동으로 입력
function jsSetRegNo(obj, val){

	var obj2 = jsFindObj(obj, 1);


	jsSet2RegNo(obj, obj2, val);	
}


//콤마 넣기
function jsSetMoney(obj, val) { 
	var pattern = /^[0-9,]+$/;

	if(val == "")
		return true;

	if (pattern.test(val)) {
		 obj.value = jsComma(jsRmComma(val))
		 return true;
	} else {
		doError(obj,"{name+은는} 반드시 숫자로만 입력해야 합니다") 
		obj.value = "";
		return false;
	}
} 
//콤마 빼기
function jsGetMoney(obj) { 
	return jsRmComma(obj.value);
}	

function isNumber(el) {
	var pattern = /^[0-9]+$/;
	return (pattern.test(el.value)) ? true : false;
}


/* 마우스 이벤트 
var message = "오른쪽 마우스는 사용할 수 없습니다.";
function click(mouse) {
	if (document.all) {
		if (event.button==2||event.button==3) {
			alert(message);
			return false;
		}
	}
	if (document.layers) {
		if (mouse.which == 3) {
			alert(message);
			return false;
		}
	}
}

if (document.layers) {
	
	document.captureEvents(Event.MouseDown);//protect from keyboard keypress
	
	function keypressed() {
		//alert(message); 
	}
}

if(!jsIsMSIE()){
	document.onmousedown=click;
	document.onkeydown=keypressed;
}
*/

/*** 마우스 이벤트 위치 확인 **/

function jsGetCPosition(){
	
	if(event.button == 2)
		return true;

	alert(event.clientX + ", " + event.clientY);
}
// 위치를 알아오는 함수
function jsGetOnEventPos(){
	document.onmousedown = jsGetCPosition
}


function formAddNameValue(form,name,value){
	var objForm = form;
	objForm.innerHTML += "<input type='hidden' name='"+name+"'" + " value='"+value+"' >";
	var el = objForm.elements;
	el[(el.length - 1)].value = value;
	//alert(objForm.innerHTML);
}



/**
* 라디오 버튼 에서 선택된 항목 값을 리턴
* @param objradio - 라디오 버튼 객체
* @return 선택된 항목 값 
*/
function getRadioValue(objradio){
	var obj = objradio;
	if(obj == null || obj == undefined){
		return null;
	}
	
	if (obj.length ){
		for ( var i=0; i<obj.length; i++){
			if ( obj[i].checked == true ) {
				return obj[i].value;
			}
		}
	}else if (obj.length == null || obj.length == undefined){
		if ( obj.checked == true ) {
			return obj.value;
		}
	}else{
		return null;
	}


}

/**
* 라디오 버튼 에서 선택된 라디오 버튼 객체 리턴
* @param objradio - 라디오 버튼 객체
* @return 선택된 항목 값 
*/
function getCheckedRadio(objradio){
	var obj = objradio;
	if(obj == null || obj == undefined){
		return null;
	}
	if (obj.length == null || obj.length == undefined){
		if ( obj.checked == true ) {
			return obj;
		}
	}else{

		for ( var i=0; i<obj.length; i++){

			if ( obj[i].checked == true ) {
				return obj[i];
			}
		}
	}
	return null;
}

/**
* 라디오 버튼 value 값이 val 인것을 선택 
* @param objradio - 라디오 버튼 객체
* @return 선택된 항목 값 
*/
function setCheckedRadio(objradio,val){
	var obj = objradio;
	if(obj == null || obj == undefined){
		return null;
	}
	if (obj.length == null || obj.length == undefined){
		if ( obj.checked == true ) {
			return ;
		}
	}else{
		for ( var i=0; i<obj.length; i++){

			if ( obj[i].value == val ) {
				obj[i].checked = true;
				return;
			}
		}
	}
	return null;
}


/**
* 
*/
function do_change_tab(idkey,attr,val){
	try{
		var trobj = _get_elements_by_id(idkey);
		if( typeof(trobj.length) == 'undefined'){
			if(trobj.getAttribute(attr)!=null)
			_el_active( trobj, eval("/^("+trobj.getAttribute(attr)+")$/"+".test(val)") );
		} else {
			for(i=0;i<trobj.length;i++){
				if(trobj[i].getAttribute(attr)!=null)
					_el_active( trobj[i], eval("/^("+trobj[i].getAttribute(attr)+")$/"+".test(val)") );
			}
		}
	} catch(e){
		alert(e.message);
	}
}

function _get_elements_by_id(idkey){
	if (document.all){
		return document.all[idkey];
	} else {
		var _return = new Array();
		var tagarray = new Array('TABLE','TR','TD','SPAN','DIV');
		for(var i=0; i < tagarray.length; i++) {
			el = document.getElementsByTagName(tagarray[i]);
			if( typeof(el.length) == 'undefined'){
				if( el.getAttribute('ID') == idkey ) {
					_return[_return.length] = el;
				}
			} else {
				for(i0=0;i0<el.length;i0++) {
					if( el[i0].getAttribute('ID') == idkey ){
						_return[_return.length] = el[i0];
					}
				}
			}
		}
		return _return;
	}
}

function _el_active(el,active){
	try {
		el.style.display = active ? "" : "none";
		//el.style.visibility = active ? "visible" : "hidden";;
		el.contentEditable = active;
		el.disabled = !active;
	} catch(e){}
}


function disableForm(form,keyval) {

	for (i = 0; i < form.elements.length; i++ ) {
		var el = form.elements[i];
		if (el.tagName == "INPUT" && el.type != null && el.type == "text") {
			if (keyval == el.getAttribute("KEYVAL")){
				el.disabled = false;
			}else{
				el.disabled = true;
			}
		}
	}
}

function only_numeric(){
	e = window.event; //윈도우의 event를 잡는것입니다. 그냥 써주심됩니당.
	var ctrl = window.event.ctrlKey;//컨트롤 키 이벤트 컨트롤키 이벤트는true   false로 구분한다.
	//숫자열 0 ~ 9 : 48 ~ 57, 키패드 0 ~ 9 : 96 ~ 105 ,8 : backspace, 46 : delete -->키코드값을 구분합니다. 저것들이 숫자랍니다.
	//방향키 37~40까지 컨트롤 씨(복사) ctrl+67 컨트롤 브이(붙여넣기) ctrl+86
	if(e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode == 8 || e.keyCode == 46 || e.keyCode == 9 ||e.keyCode == 37||e.keyCode == 38||e.keyCode == 39||e.keyCode == 40||(ctrl && e.keyCode == 67)||(ctrl && e.keyCode == 86)){
		if(e.keyCode == 48 || e.keyCode == 96){//0을 눌렀을경우
				return; //-->입력시킨다.
		}else{ //0이 아닌숫자
			return; //-->입력시킨다.
		}
	}else{ //숫자가 아니면 넣을수 없다.
		e.returnValue=false;
	}
}
/*
function only_number(){
	var c = window.event.keyCode;
	var e = window.event.srcElement;
	var s = window.event.shiftKey;
	if( s && !(c==9) ){
		window.event.returnValue = false;
		return false;
	}
	var isNumber    = (c >= 48 && c <= 57) || (c >= 96 && c <=105);
	var isDirection = (c >= 37 && c <= 40) || (c ==  9 && window.event.shiftKey) || (c ==  9);
	var isDelete    = (c ==  8 || c == 46);
	var isEnter     = (c == 13);

	window.event.returnValue = isNumber || isDirection || isDelete || isEnter;
	return isNumber || isDirection || isDelete || isEnter;
}
*/

function getXmlHttpRequest(){
	var xmlhttp = false;

	// Mozilla/Safari
	if (window.xmlhttpuest) {
			xmlhttp = new xmlhttpuest();
	}
	// IE
	else if (window.ActiveXObject) {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return xmlhttp;
}


function winclose(){
	document.location = "/ypbooks/order/close.html";
}


// 쿠키생성
function setCookie( name, value, expiredays )
{
 var today = new Date();
 today.setDate( today.getDate() + expiredays );
 document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + today.toGMTString() + ";";
}
// 쿠키구하기
function getCookie(name)
{
    cookie  = document.cookie;
    name    = name + "=";
    idx     = cookie.indexOf(name);
    if(cookie && idx >= 0) {        
        
        tmp     = cookie.substring(idx, cookie.length);
        deli    = tmp.indexOf(";");
        if(deli > 0) {
            return tmp.substring(name.length, deli);
        } else {
            return tmp.substring(name.length);
        }
        
    }
}

// 쿠키지우기
function clearCookie(name)
{
    today   = new Date();
    today.setDate(today.getDate() - 1);
    document.cookie = name + "=; path=/; expires=" + today.toGMTString() + ";";
}


 
