/* 
  프로젝트    : Dohwaje java framework(djf)
  소프트웨어명: Dohwaje java framework basic javascript
  짧은 명     : djf js
  개 발 처    : 도화재 IT
  개 발 자    : 현백
  저작권자    : 도화재 IT
  이메일      : it@dohwaje.org
  version     : 2.0 rev. 13
  
  라이센스    : 
        1. 이 프로그램을 사용하는데 있어서 일체의 어떠한 보증도 하지 않으며,
		   어떠한 책임도 지지 않으며 사용자가 모든 책임을 진다.
		2. 그 외 일반적으로 LGPL 사항을 따른다.
		3. 개작시 LGPL에 따라 재배포되어야 하며, 
		   또한 위 email로 개작된 내용을 보내주어야하며
		   개작된 내용이 적합하면 다음 버전의 djf js에 포함될 수 있으며 
           포함된 내용의 저작권은 djf js 저작권자에 귀속된다.
		4. 이 라이센스는 djf js에만 해당되며 djf에는 적용되지 않는다.

  ** Copyright by dohwaje.org <hyeon_baek>
 
 */

function djf_getElementById(id) {
	if (this.isDOM) {
		return document.getElementById(id);
	} else if (this.isIE4) {
		return document.all[id];
	} else if (this.isNS4) {
		return document.layers[id];
	} else {
		return null;
	}
}

/*
  el parameter가 string이면 getElementById(el)를 호출한다. 그 외는 원래 el를 리턴
*/
function djf_getElementByIdIfString(el) {
	if (el != null && typeof(el) == "string") {
		el = this.getElementById(el);
	}
	return el;
}

function djf_setElementLeft(el, x) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}
	if (this.isDOM) {
		el.style.left = x + "px";
	} else if (this.isIE4) {
		el.style.pixelLeft = x;
	} else if (this.isNS4) {
		el.moveTo(x, this.getTop(el));
	}
}

function djf_setElementTop(el, y) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}
	if (this.isDOM) {
		el.style.top = y + "px";
	} else if (this.isIE4) {
		el.style.pixelTop = y;
	} else if (this.isNS4) {
		el.moveTo(this.getTop(el), y);
	}
}

function djf_moveElement(el, x, y) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}
	if (this.isDOM) {
		el.style.left = x + "px";
		el.style.top = y + "px";
	} else if (this.isIE4) {
		el.style.pixelLeft = x;
		el.style.pixelTop = y;
	} else if (this.isNS4) {
		el.moveTo(x, y);
	}
}

function djf_getLeftPosAsCenter(type, width) {
	// IE4, NS4 no test
	if ("screen" == type)	{
		return (screen.width - width) / 2;
	} else if ("body" == type)	{
		return (document.body.clientWidth - width) / 2;
	} else if ("page" == type)	{
		return (document.body.clientWidth -width) / 2 + this.getPageXOffset();
	} else {
		alert("unknow type: " + type);
	}
}

function djf_getTopPosAsCenter(type, height) {
	// IE4, NS4 no test
	if ("screen" == type)	{
		return (screen.height - height) / 2;
	} else if ("body" == type)	{
		return (document.body.clientHeight - height) / 2;
	} else if ("page" == type)	{
		return (document.body.clientHeight -height) / 2 + this.getPageYOffset();
	} else {
		alert("unknow type: " + type);
	}
}

function djf_moveElementToScreenCenter(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}

	var x = this.getLeftPosAsCenter("screen", this.getElementWidth(el));
	var y = this.getTopPosAsCenter("screen", this.getElementHeight(el));
	this.moveElement(el, x, y);
}

function djf_moveElementToBodyCenter(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}

	var x = this.getLeftPosAsCenter("body", this.getElementWidth(el));
	var y = this.getTopPosAsCenter("body", this.getElementHeight(el));
	this.moveElement(el, x, y);
}

function djf_moveElementToPageCenter(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return;
	}

	var x = this.getLeftPosAsCenter("page", this.getElementWidth(el));
	var y = this.getTopPosAsCenter("page", this.getElementHeight(el));
	this.moveElement(el, x, y);
}

function djf_getElementLeft(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return null;
	}
	if (this.isDOM) {
		return parseInt(el.style.left, 10);
	} else if (this.isIE4) {
		return el.style.pixelLeft;
	} else if (this.isNS4) {
		return el.left;
	} else {
		return null;
	}
}

function djf_getElementTop(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return null;
	}
	if (this.isDOM) {
		return parseInt(el.style.top, 10);
	} else if (this.isIE4) {
		return el.style.pixelTop;
	} else if (this.isNS4) {
		return el.top;
	} else {
		return null;
	}
}

function djf_getElementWidth(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return null;
	}
	if (this.isDOM) {
		return parseInt(el.style.width, 10);
	} else if (this.isIE4) { // no test
		return el.style.pixelWidth;
	} else if (this.isNS4) { // no test
		return el.width;
	} else {
		return null;
	}
}

function djf_getElementHeight(el) {
	el = this.getElementByIdIfString(el);

	if (el == null) {
		return null;
	}
	if (this.isDOM) {
		return parseInt(el.style.height, 10);
	} else if (this.isIE4) { // no test
		return el.style.pixelHeight;
	} else if (this.isNS4) { // no test
		return el.height;
	} else {
		return null;
	}
}

function djf_getPageXOffset()
{
	if (window.pageXOffset) {
		return window.pageXOffset;
	} else if (document.body.scrollLeft) {
		return document.body.scrollLeft;
	} else {
		return 0;
	}
}

function djf_getPageYOffset()
{
	if (window.pageYOffset) {
		return window.pageYOffset;
	} else if (document.body.scrollTop) {
		return document.body.scrollTop;
	} else {
		return 0;
	}
}

function djf_isShowElement(el) {
	el = this.getElementByIdIfString(el);

	if (el == null)	{
		return false;
	}
	return (el.style.visibility == "visible");
}

function djf_showElement(el, visible) {
	el = this.getElementByIdIfString(el);

	if (el == null)	{
		return;
	}
	if (this.isShowElement(el) != visible)	{
		el.style.visibility = (visible) ? "visible": "hidden";
	}
}

function djf_isDisplayElement(el) {
	el = this.getElementByIdIfString(el);

	if (el == null)	{
		return false;
	}
	return (el.style.display != "none");
}

/*
	display 속성을 변경한다.
	display: true면 value값으로 지정, false면 none으로 지정
	주: 테이블의 tr를 숨겼다가 보일경우는 value값을 "table-row"로 지정해야 firefox에서 정상적으로 동작한다.
	value는 생략가능하면 생략시 "block"값이 된다.
*/
function djf_displayElement(el, display, value) {
	if (value == undefined) value = "block";

	el = this.getElementByIdIfString(el);

	if (el == null)	{
		return;
	}

	if (this.isDisplayElement(el) != display)	{
		el.style.display = (display) ? value: "none";
	}
}

/*
  s.length == 0이거나 s가 전부 ' '로 되어있는지 검사
*/
function djf_isBlank(s) {
	var rv = true;
	len = s.length;
	for (i = 0; i < len; i++) {
		if (s.charAt(i) != ' ') {
			rv = false;
			break;
		}
	}
	return rv;
}

/*
  문자열을 trim한다.
*/
function djf_trim(s) {
	if (s == null && s.length == 0) {
		return "";
	}
	len = s.length;
	var fidx = -1;
	for (i = 0; i < len; i++) {
		if (s.charAt(i) != ' ') {
			fidx = i;
			break;
		}
	}
	if (fidx < 0) return ""; 
	var eidx = len;
	if (fidx < len - 1) {
		for (i = len - 1; i >= fidx; i--) {
			if (s.charAt(i) != ' ') {
				eidx = i + 1;
				break;
			}
		}
	}
	return s.substring(fidx, eidx);
}

/*
  브라우저 타입정보를 alert한다.
*/
function djf_alertInfo() {
	alert("isDOM=" + this.isDOM + ", isNS=" + this.isNS + ", isIE=" + this.isIE + 
		", isNS4=" + this.isNS4 + ", isIE4=" + this.isIE4);
}

/*
  년월의 마지막 일자를 리턴한다.
*/
function djf_getLastDate(year, month) {
	var month_days = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

	if (isNaN(year) || isNaN(month) || month < 1 || month > 12 || year < 1) {
		return NaN;
	}

	if (month != 2) {
		return month_days[month - 1];
	}
	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
		return 29;
	} else {
		return 28;
	}
}

/*
  일자를 문자열로 변환한다.
*/
function djf_formatDate(year, month, day, delim) {
	if (delim == undefined) {
		delim = "-";
	} else if (delim != "-" && delim != "." && delim != "/" && delim != "") {
		return null;
	}

	if (year < 1 || year > 9999 || month < 1 || month > 12 || 
		day < 1 || day > djf_getLastDate(year, month)) {
		return null;
	}

	var rv = year + delim + ((month < 10) ? "0": "") + month +
		delim + ((day < 10) ? "0": "") + day;
	return rv;
}

/*
  년월을 문자열로 변환한다.
*/
function djf_formatMonth(year, month, delim) {
	if (delim == undefined) {
		delim = "-";
	} else if (delim != "-" && delim != "." && delim != "/" && delim != "") {
		return null;
	}

	if (year < 1 || year > 9999 || month < 1 || month > 12) {
		return null;
	}

	var rv = year + delim + ((month < 10) ? "0": "") + month;
	return rv;
}

/*
  이번달을 문자열로 변환한다.
*/
function djf_thisMonth(delim) {
	if (delim == undefined) {
		delim = "-";
	}
	var now = new Date();
	return djf_formatMonth(now.getFullYear(), now.getMonth() + 1, delim);
}

/*
  오늘일자를 문자열로 변환한다.
*/
function djf_today(delim) {
	if (delim == undefined) {
		delim = "-";
	}
	var now = new Date();
	return djf_formatDate(now.getFullYear(), now.getMonth() + 1, now.getDate(), delim);
}

/*
 이번달 말일자를 문자열로 변환한다.
*/
function djf_lastday(delim) {
	if (delim == undefined) {
		delim = "-";
	}
	var now = new Date();
	return djf_formatDate(now.getFullYear(), now.getMonth() + 1, djf_getLastDate(now.getFullYear(), now.getMonth() + 1), delim);
}

/*
  obj: 안전하게 focus시킬 object
  doSelect: true면 obj.select() 호출
  결과: readOnly = false && disabled == false && obj.focus 이면 focus()호출
        readOnly = false && disabled == false && obj.select 이면 select()호출
  */
function djf_doFocus(obj, doSelect) {
	if (obj == undefined) {
		this.__debug__ && alert("djf doFocus: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf doFocus: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}
	if (! obj.readOnly && ! obj.disabled && obj.focus) {
		obj.focus();
	}
	if (! obj.readOnly && ! obj.disabled && obj.doSelect) {
		obj.select();
	}
}

/*
  obj.value가 length가 0보다 큰가 검사
  obj: 검사할 object
  trim: obj.value trim여부
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  return obj.value.length가 0보다 크면 true리턴
*/
function djf_checkRequired(obj, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkRequired: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkRequired: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	if (trim) {
		obj.value = djf_trim(obj.value);
	}
	var v = obj.value;
	if (v.length == 0) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj);
		} else {
			djf_doFocus(focus);
		}

		return false;
	}
	return true;
}

/*
  obj.value의 length가 min <= length <= max 인가 검사
  obj: 검사할 object
  trim: obj.value trim여부
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  return obj.value.length가 0보다 크면 true리턴
*/
function djf_checkLength(obj, min, max, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkLength: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkLength: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	if (trim) {
		obj.value = djf_trim(obj.value);
	}
	var v = obj.value;
	if (v.length < min || v.length > max) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj);
		} else {
			djf_doFocus(focus);
		}

		return false;
	}
	return true;
}

/*
  obj.value와 value가 일치하는가 검사
  obj: 검사할 object
  value: 일치 검사할 값
  trim: obj.value trim여부
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  return obj.value.length가 0보다 크면 true리턴
*/
function djf_checkEquals(obj, value, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkEquals: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkEquals: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	if (trim) {
		obj.value = djf_trim(obj.value);
	}
	var v = obj.value;
	if (v != value) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj);
		} else {
			djf_doFocus(focus);
		}

		return false;
	}
	return true;
}

/*
  trim한 obj.value가 fromValue와 toValue 범위에 있는지 검사
  obj: 검사할 object
  formValue: 범위 시작
  toValue: 범위 끝
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  allowZeroPrefix: 숫자앞에 0이 붙는 것을 허용할 때 true(예: 007허용시), 생략시 default false임(예: 7).
  return obj.value.length가 0이거나 범위 안에 들어 갈면 true리턴, 
  단. obj.value가 범위를 벗어나거나 최대 16자리의 숫자가 아니면 false리턴
*/
function djf_checkIntRange(obj, focus, fromValue, toValue, msg, allowZeroPrefix) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkIntRange: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkIntRange: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	obj.value = djf_trim(obj.value);

	var v = obj.value;

	if (v.length == 0) {
		return true;
	}

	var chk;
	if (allowZeroPrefix) {
		chk = /^-?\d{0,16}$/;
	} else {
		chk = /^(0|-?[1-9]\d{0,15})$/;
	}

	if (! chk.test(v)) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj);
		} else {
			djf_doFocus(focus);
		}

		return false;
	}

	
	var iv = parseInt(v, 10);
	if (iv < fromValue || iv > toValue) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj);
		} else {
			djf_doFocus(focus);
		}

		return false;
	}
	return true;
}

/*
  obj가 checked 되어있는가 검사
  obj: 검사할 object
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  return checked되어 있으면 true리턴
*/
function djf_checkRequiredChecked(obj, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkRequiredChecked: object is undefined");
		return false;
	}

	if (obj.length) {
		for (var i = 0; i < obj.length; i++) {
			if (obj[i].checked) return true;
		}
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
		if (typeof focus == "boolean") {
			if (focus) djf_doFocus(obj[0]);
		} else {
			djf_doFocus(focus);
		}
		return false;
	} else {
		if (! obj.checked) {
			if (typeof focus == "boolean") {
				if (focus) djf_doFocus(obj);
			} else {
				djf_doFocus(focus);
			}
		}
		return obj.checked;
	}
}

/*
  obj.value가 적합한 날짜인지 검사(trim후 검사함)
  obj: 검사할 object
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  name: return결과가 거짓일 때 alert할 msg내의 표시이름
  return obj.value.length가 0이거나 날짜로 적합하면 true리턴
*/
function djf_checkDate(obj, focus, name) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkDate: object is undefined");
		return false;
	}
	if (obj.length) {
		this.__debug__ && 
			alert("djf checkDate: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	var now = new Date();
	var year = now.getFullYear();
	var month = now.getMonth() + 1;
	var day = now.getDate();

	var v = djf_trim(obj.value);
	if (v.length == 0) {
		obj.value = v;
		return true;
	} else if (v == "t" || v == "T" || v == "ㅅ") { // today
		var rv = djf_today("-");
		obj.value = rv;
		return true;
	} 

	var idx1 = v.indexOf("-");
	var idx2 = v.lastIndexOf("-");
	if (idx1 < 0) {
		if (v == "l" || v == "L" || v == "ㅣ") { // lastday
			day = djf_getLastDate(year, month);
		} else {
			day = parseInt(v, 10);
		}
	} else if (idx2 == idx1) {
		month = parseInt(v.substring(0, idx1), 10);
		ds = v.substring(idx1 + 1);
		if (ds == "l" || ds == "L" || ds == "ㅣ") { // lastday
			day = djf_getLastDate(year, month);
		} else {
			day = parseInt(ds, 10);
		}
	} else {
		year = parseInt(v.substring(0, idx1), 10);
		month = parseInt(v.substring(idx1 + 1, idx2), 10);
		ds = v.substring(idx2 + 1);
		if (ds == "l" || ds == "L" || ds == "ㅣ") { // lastday
			day = djf_getLastDate(year, month);
		} else {
			day = parseInt(ds, 10);
		}
	}
	if (isNaN(year) || isNaN(month) || isNaN(day) || 
		month < 1 || month > 12 || year < 0 || year > 9999 || day < 1) {

		if (name != null && name.length > 0) {
			alert(name + "의 날짜가 적합하지 않습니다.\n\n날짜: " + v);
			if (typeof focus == "boolean") {
				if (focus) djf_doFocus(obj, true);
			} else {
				djf_doFocus(focus);
			}
		}
		return false;
	}

	if (year >= 50 && year < 100) {
		year = year + 1900;
	} else if (year < 50) {
		year = year + 2000;
	}

	var lastDate = djf_getLastDate(year, month);
	if (day > lastDate) {
		if (name != null && name.length > 0) {
			alert(name + "의 날짜가 적합하지 않습니다.\n\n날짜: " + v);
			if (typeof focus == "boolean") {
				if (focus) djf_doFocus(obj, true);
			} else {
				djf_doFocus(focus);
			}
		}
		return false;
	}

	var rv = djf_formatDate(year, month, day, "-");
	obj.value = rv;
	return true;

}

/*
  날짜가 유효한 날짜인지 검사
  year: 년
  month: 월
  day: 일
*/
function djf_validateDate(year, month, day) {
	if (year < 1 || year > 9999 || month < 1 || month > 12 ||
		day < 1 || day > djf_getLastDate(year, month)) {

		return false;
	}
	return true;
}

/* 
  주민등록번호가 유효한지 검사(trim후 검사한다)
  obj: 검사할 obj
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  isAlert: return결과가 거짓일 때 내부 msg alert 여부
  return obj.value.length가 0이거나 유효하면 true리턴
*/
function djf_checkJuminNo(obj, focus, isAlert) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkJuminNo: object is undefined");
		return false;
	}
	if (obj.length) {
		this.__debug__ && 
			alert("djf checkJuminNo: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

  obj.value = djf_trim(obj.value);
  var v = obj.value;

  if (v.length == 0) {
	  return true;
  }
  chk = /^\d{6}-[1234]\d{6}$/;
  if (! chk.test(v)) {
	  if (isAlert) {
		  alert("적합하지 않는 주민등록번호입니다.\n\n주민등록번호: " + v);
	  }
      if (typeof focus == "boolean") {
		if (focus) djf_doFocus(obj, true);
	  } else {
		djf_doFocus(focus);
	  }
	  return false;
  }

  var year = parseInt(v.substr(0, 2), 10);
  year += (v.charAt(7) <= '2') ? 1900: 2000;
  var month = parseInt(v.substr(2, 2), 10);
  var date = parseInt(v.substr(4, 2), 10);

  if (! djf_validateDate(year, month, date)) {
	  if (isAlert) {
		  alert("적합하지 않는 주민등록번호입니다.\n\n주민등록번호: " + v);
	  }
      if (typeof focus == "boolean") {
		if (focus) djf_doFocus(obj, true);
	  } else {
		djf_doFocus(focus);
	  }
	  return false;
  }

  // CheckSum 검사
  var no = new Array();
  var idx = 0;
  for (var i = 0; i < 14; i++) {
	  if (i == 6) continue;
	  no[idx++] = parseInt(v.charAt(i), 10);
  }

  var multi = [2 ,3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
  var sum = 0;
  for (var i = 0; i < 12; i++) {
	  sum += (no[i] *= multi[i]);
  }

  if ((11 - (sum % 11)) % 10 != no[12]) {
	  if (isAlert) {
		  alert("적합하지 않는 주민등록번호입니다.\n\n주민등록번호: " + v);
	  }
      if (typeof focus == "boolean") {
		if (focus) djf_doFocus(obj, true);
	  } else {
		djf_doFocus(focus);
	  }
	  return false;
  }

  return true;
}

/*
  popup window를 화면 중앙에 open한다
  url: url
  name: window name
  width: window width
  height: window height
*/
function djf_popupWindowCenter(url, name, width, height) {
	var y = (screen.height - height) / 2;
	var x = (screen.width - width) / 2;

	return window.open(url, name,
		"menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes,width=" + width + 
		",height=" + height + ",top=" + y + ",left=" + x);
}

/*
  popup window를 화면 중앙에 open한다, 스크롤바와 사이즈조절불가
  url: url
  name: window name
  width: window width
  height: window height
*/
function djf_popupFixWindowCenter(url, name, width, height) {
	var y = (screen.height - height) / 2;
	var x = (screen.width - width) / 2;

	return window.open(url, name,
		"menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no,width=" + width + 
		",height=" + height + ",top=" + y + ",left=" + x);
}

/*
 form내 모든 객체의 정보를 alert 또는 popup window에 표시한다
 form: 표시할 form(form내 'name'으로 된 객체가 있으면 form의 이름이 'object xx'로 나타난다)
 newWin: popup window로 표시할 지 여부, false면 alert(...)로 표시
*/
function djf_debugForm(form, newWin) {
	if (form == undefined || form.length == undefined) {
		alert("form is undefined or length is undefined");
		return false;
	}

	var msg = "";
	msg += "FORM name=" + form.name + ", action=" + form.action +
		", method=" + form.method + ", enctype=" + form.enctype + 
		", target=" + form.target + ", onreset=" + form.onreset +
		", onsubmit=" + form.onsubmit + ((newWin) ? "<br><br>": "") + "\r\n\r\n";

	if (newWin) {
		msg += "<table border=\"1\"><tr><th>index</th><th>name</th><th>type</th><th>value</th><th>duplicate</th><th>tabIndex</th></tr>";

	}
	var idx = 0;
	var a_name = new Array();
	var a_idx = new Array();

	var name;
	var dup;
	var dup_msg;;
	for (var i = 0; i < form.length; i++) {
		name = form[i].name;
		dup = -1;
		for (var k = 0; k < idx; k++) {
			if (a_name[k] == name) {
				dup = k;
				break;
			}
		} 
		dup_msg = "";
		if (dup < 0) {
			a_idx[idx] = i;
			a_name[idx++] = name;
		} else {
			dup_msg = ((newWin) ? "이름중복 Index[" + a_idx[dup] + "]":
				", 이름중복 Index[" + a_idx[dup] + "]");
		}
		if (newWin)	{
			
			msg += "<tr><td>" + i + "</td><td>" + form[i].name +
				"</td><td align='center'>" + form[i].type + ((form[i].length) ? ", option-len=" + form[i].length: "") +
				"</td><td>\"" + form[i].value + "\"" +
				((form[i].type == "radio" || form[i].type == "checkbox") ? " checked=" + form[i].checked: "") +
				"</td><td>" + dup_msg + "</td><td align='right'>" + form[i].tabIndex + "</td></tr>\r\n";
		} else {
			msg += i + ": NAME=[" + form[i].name +
				"], TYPE=" + form[i].type + ((form[i].length) ? ", option-len=" + form[i].length: "") +
				", VALUE=\"" + form[i].value + "\"" +
				((form[i].type == "radio" || form[i].type == "checkbox") ? " checked=" + form[i].checked: "") +
				
				dup_msg + ((newWin) ? "<br>": "") + ", tabIndex=" + form[i].tabIndex + "\r\n";
		}
	}
	if (newWin)	{
		msg += "</table>";
		var win = djf_popupWindowCenter("", "debug_form", 1000, 700);
		win.document.write(msg);
	} else {
		alert(msg);
	}
	return msg;
}

/*   
  obj.value가 해당 type에 유효한가 검사
  type: 'tel':전화번호, 'tel4':전화끝4자리, 'email', 'tel_st':엄격한전화번호, 'time':'01:23'형식의 시간 기타 추가예정
  obj: 검사할 obj
  trim: obj.value를 trim할 지 여부
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  msg: return결과가 거짓일 때 alert할 msg
  return obj.value.length가 0이거나 유효하면 true리턴
*/
function djf_checkType(type, obj, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkMatch: object is undefined");
		return false;
	}
	if (obj.length) {
		this.__debug__ && 
			alert("djf checkMatch: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

  if (trim) {
	  obj.value = djf_trim(obj.value);
  }
  var v = obj.value;
  var formMsg = "";

  if (v.length == 0) {
	  return true;
  }
  if (type == 'tel_st') {
	  rv = /^\d{2,4}-\d{3,4}-\d{4}$/.test(v) || /^\d{3,4}-\d{4}$/.test(v);
	  formMsg = "형식: 000-000-0000 또는 000-0000";
  } else if (type == 'tel') {
	  rv = /^\d+(-\d+)*-\d{4}$/.test(v);
 	  formMsg = "형식: 000-0000 또는 000-...-0000";
  } else if (type == 'tel4') {
	  rv = /^\d{4}$/.test(v);
	  formMsg = "형식: 0000";
  } else if (type == 'email') {
	  rv = /^[a-zA-z\d_]+@[a-zA-z\d_]+.([a-zA-z\d_]+.)*[a-zA-z\d_]+$/.test(v);
	  formMsg = "형식: 예) mailid@mailserver.net";
  } else if (type == 'time') {
      rv = /^([01]?\d|2[0-3]):[0-5]?\d$/.test(v);
	  formMsg = "형식: 예) 1:1 또는 01:01";
	  if (rv && v.length < 5) {
          var idx = v.indexOf(":");
          var f = v.substring(0, idx);
		  var e = v.substring(idx + 1);
		  v = ((f.length < 2) ? "0" + f: f) + ":" + ((e.length < 2) ? "0" + e: e);
		  obj.value = v;
	  }
  } else {
	  alert("unsupported type[" + type + "]");
	  return false;
  }

  if (! rv) {
	  if (msg != null && msg.length > 0) {
		alert(msg + "\r\n" + formMsg + "\r\n입력값: [" + v + "]");
      }
      if (typeof focus == "boolean") {
		if (focus) djf_doFocus(obj, true);
	  } else {
		djf_doFocus(focus);
	  }
	  return false;
  }
  return true;
}

/* 
 주의해서 사용할 것.
 obj: trim, focus할 대상,
 evalOper: eval내에서 실행할 문자열
 trim: eval전 obj trim여부
 focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
 msg: return결과가 거짓일 때 보여줄 alert msg
 return: if(eval(evalOper))가 참 또는 obj.value.length()가 0이면 true, 거짓이면 false;
*/
function djf_checkEval(obj, evalOper, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkEval: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkEval: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	if (trim) {
		obj.value = djf_trim(obj.value);
	}

	if (obj.value.length == 0) {
		return true;
	}

	if (! eval(evalOper)) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
        if (typeof focus == "boolean") {
		  if (focus) djf_doFocus(obj);
	    } else {
		  djf_doFocus(focus);
	    }
		return false;
	}
	return true;
}

/* 
 주의해서 사용할 것.
 obj: trim, focus할 대상,
 regexp: obj.value로 test할 regexp
 trim: eval전 obj trim여부
 focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
 msg: return결과가 거짓일 때 보여줄 alert msg
 return: regexp.test(obj.value)가 참 또는 obj.value.length()가 0이면 true, 거짓이면 false;
*/
function djf_checkRegExp(obj, regexp, trim, focus, msg) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkRegExp: object is undefined");
		return false;
	}
	if (obj.length && ! obj.type) { // for except select
		this.__debug__ && 
			alert("djf checkRegExp: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	if (trim) {
		obj.value = djf_trim(obj.value);
	}

	if (obj.value.length == 0) {
		return true;
	}

	if (! regexp.test(obj.value)) {
		if (msg != null && msg.length > 0) {
			alert(msg);
		}
        if (typeof focus == "boolean") {
		  if (focus) djf_doFocus(obj);
	    } else {
		  djf_doFocus(focus);
	    }
		return false;
	}
	return true;
}

/*
  obj.value가 적합한 날짜(년-월)인지 검사(trim후 검사함)
  obj: 검사할 object
  focus: return결과가 거짓일 때 obj에 focus할 것인가 여부, 
         [true: doFocus(obj), false: no act, object: doFocus(object)]
  name: return결과가 거짓일 때 alert할 msg내의 표시이름
  return obj.value.length가 0이거나 날짜로 적합하면 true리턴
*/
function djf_checkMonth(obj, focus, name) {
	if (obj == undefined) {
		this.__debug__ && alert("djf checkYearMonth: object is undefined");
		return false;
	}
	if (obj.length) {
		this.__debug__ && 
			alert("djf checkMonth: object is array" + ((obj[0] && obj[0].name) ? "[" + obj[0].name + "]": ""));
		return false;
	}

	var now = new Date();
	var year = now.getFullYear();
	var month = now.getMonth() + 1;

	var v = djf_trim(obj.value);
	if (v.length == 0) {
		obj.value = v;
		return true;
	} 

	var idx1 = v.indexOf("-");
	if (idx1 < 0) {
		if (v == "t" || v == "T" || v == "ㅅ") { // this month
		} else {
			month = parseInt(v, 10);
		}
	} else {
		year = parseInt(v.substring(0, idx1), 10);
		month = parseInt(v.substring(idx1 + 1), 10);
	}
	if (isNaN(year) || isNaN(month) || 
		month < 1 || month > 12 || year < 0 || year > 9999) {

		if (name != null && name.length > 0) {
			alert(name + "의 년월 날짜가 적합하지 않습니다.\n\n날짜: " + v);
			if (typeof focus == "boolean") {
				if (focus) djf_doFocus(obj, true);
			} else {
				djf_doFocus(focus);
			}
		}
		return false;
	}

	if (year >= 50 && year < 100) {
		year = year + 1900;
	} else if (year < 50) {
		year = year + 2000;
	}

	var rv = djf_formatMonth(year, month, "-");
	obj.value = rv;
	return true;

}

/*
  lpad 기능을 한다.
  단. ch는 반드시 한문자여야 한다. 
  한문자가 아니면 부족한 길이만큼 ch길이에 상관없이 반복추가된다.
  v: 
  size: 길이
  ch: v의 길이가 size보다 짧을 경우 반복 추가되는 문자(문자열일 경우 문자열이 반복추가됨)
  def: (옵션) 지정시 v.length가 0일 경우 ch가 추가되는 것이 아니고 def가 설정된다.
*/
function djf_lpad(v, size, ch, def) {
	if (v == undefined || v == null || v.length >= size) {
		return v;
	}
	if (v.length == 0 && def != undefined) {
		return def;
	}

	var rv = "";
	for (var i = 0; i < size - v.length; i++) {
		rv += ch;
	}

	return rv + v;
}

/*
  숫자 3자리마다 콤마를 찍는다
  return: v가 문자열일 경우 적합한 숫자형식이 아니면 그대로 v리턴
*/
function djf_cm(v) {
	var prefix = "";
	var v2 = this.trim("" + v);
	var suffix = "";

	var chk = /^(0([.]0)?|-?[1-9]\d{0,15}([.]\d+)?)$/;
	if (! chk.test(v2)) {
		return v2;
	}

	if (v2.charAt(0) == '-') {
		prefix = "-";
		v2 = v2.substring(1);
	}

	var idx = v2.indexOf('.');
	if (idx >= 0) {
		suffix = v2.substring(idx);
		v2 = v2.substring(0, idx);
	}

	var rv = "";
	var mok = Math.floor((v2.length - 1) / 3);
	var rem = (v2.length - 1) % 3 + 1;

	rv = v2.substring(0, rem);
	v2 = v2.substring(rem);

	for (var i = 0; i < mok; i++) {
		rv += ",";
		rv += v2.substr(i * 3, 3);
	}

	return prefix + rv + suffix;
}

function createDJF() {
	
	this.isDOM = (document.getElementById) ? true: false; 
	this.isNS4 = ! this.isDOM && ((document.layers) ? true: false);
	this.isNS = this.isNS4 || navigator.appName == "Netscape";
	this.isIE4 = ! this.isDOM && ((document.all) ? true: false);
	this.isIE = this.isIE4 || navigator.appName == "Microsoft Internet Explorer";

	this.getElementById = djf_getElementById;
	this.getElementByIdIfString = djf_getElementByIdIfString;
	this.moveElement = djf_moveElement;
	this.moveElementToScreenCenter = djf_moveElementToScreenCenter;
	this.moveElementToBodyCenter = djf_moveElementToBodyCenter;
	this.moveElementToPageCenter = djf_moveElementToPageCenter;
	this.getLeftPosAsCenter = djf_getLeftPosAsCenter;
	this.getTopPosAsCenter = djf_getTopPosAsCenter;
	this.getElementLeft = djf_getElementLeft;
	this.getElementWidth = djf_getElementWidth;
	this.getElementTop = djf_getElementTop;
	this.getElementHeight = djf_getElementHeight;
	this.setElementLeft = djf_setElementLeft;
	this.setElementTop = djf_setElementTop;
	this.getPageXOffset = djf_getPageXOffset;
	this.getPageYOffset = djf_getPageYOffset;
	this.alertInfo = djf_alertInfo;
	this.showElement = djf_showElement;
	this.isShowElement = djf_isShowElement;
	this.displayElement = djf_displayElement;
	this.isDisplayElement = djf_isDisplayElement;
	this.isBlank = djf_isBlank;
	this.trim = djf_trim;
	this.getLastDate = djf_getLastDate;
	this.formatDate = djf_formatDate;
	this.formatMonth = djf_formatMonth;
	this.thisMonth = djf_thisMonth;
	this.today = djf_today;
	this.formatDate = djf_formatDate;
	this.lastday = djf_lastday;
	this.checkDate = djf_checkDate;
	this.popupWindowCenter = djf_popupWindowCenter;
	this.popupFixWindowCenter = djf_popupFixWindowCenter;
	this.checkRequired = djf_checkRequired;
	this.checkLength = djf_checkLength;
	this.checkEquals = djf_checkEquals;
	this.checkRequiredChecked = djf_checkRequiredChecked;
	this.checkJuminNo = djf_checkJuminNo;
	this.validateDate = djf_validateDate;
	this.debugForm = djf_debugForm;
	this.checkType = djf_checkType;
	this.checkEval = djf_checkEval;
	this.checkRegExp = djf_checkRegExp;
	this.checkIntRange = djf_checkIntRange;
	this.doFocus = djf_doFocus;
	this.checkMonth = djf_checkMonth;
	this.lpad = djf_lpad;
	this.cm = djf_cm;

	this.__debug__ = false;
}

var _djf = new createDJF();


// wan
function trim(str) {
    return str.replace(/(^ *)|( *$)/g, "");
}

function empty(str){
	if(!str) return true;
	var res = trim(str);
	if(res.length == 0) return true;
	else return false;
}

function chkNum(obj){
	var size = trim(obj.value);
	
	// 숫자만 입력
	re=/[^0-9]/gi;
	size = size.replace(re,"");
	
	size = Number(size);
	if(size==0){
		obj.value = "";
	} else {
		obj.value = size;
	}
}

function chkNum2(obj){
	var str = trim(obj.value);
	
	// 숫자만 입력
	re=/[^0-9]/gi;
	str = str.replace(re,"");
	
	obj.value = str;	
}

function goLinkUrl(obj){
    if(!obj) return;
    location.href = obj.value;
}
