/************************************************************************
* 공통 펑션들
************************************************************************/

/**
 * 라디오 버튼 설정
 * @param radioObj 대상 라디오 객체
 * @param svalue 설장할 값
 * @return 설정했으면 true, 대상 값을 가지는 라디오가 없을땐 false;
 * @auth 곽병의 patracyu@hanmail.net
 */
function setRadioValue(radioObj, svalue) {
    if (radioObj.length > 1) {
        for (var i=0; i<radioObj.length; i++) {
            if (radioObj[i].value == svalue) {
                radioObj[i].checked = true;
                return true;
            }
            radioObj[i].checked = false;
        }
    } else {
        if (radioObj.value == svalue) {
            radioObj.checked = true;
            return true;
        }
        radioObj.checked = false;
    }
    return false
}

/**
 * 라디오 버튼 값 얻기
 * @param radioObj 대상 라디오 객체
 * @return 체크된 라디오 버튼의 값;
 * @auth 곽병의 patracyu@hanmail.net
 */
function getRadioValue(radioObj) {
    if (radioObj.length > 1) {
        for (var i=0; i<radioObj.length; i++) {
            if (radioObj[i].checked) {
                return radioObj[i].value;
            }
        }
    } else {
        if (radioObj.checked) {
            return radioObj.value;
        }
    }
    return null;
}

/**
 * 체크박스 설정
 * @param checkBoxObj 대상 체크박스
 * @param svalue 대상 채크박스의 값
 * @param checked true면 채크 false 언채크로 설정 생략하면 반전
 * @return 설정된 체크박스의 갯수
 * @auth 곽병의 patracyu@hanmail.net
 */
function setCheckBox(checkBoxObj, svalue, checked) {
    var	rv	= 0;

    if (checkBoxObj.length > 1) {
        for (var i=0; i<checkBoxObj.length; i++) {
            if (checkBoxObj[i].value == svalue) {
                if (checked == null) {
                    checkBoxObj[i].checked = !checkBoxObj[i].checked;
                } else {
                    checkBoxObj[i].checked = checked;
                }
                rv++;
            }
        }
    } else {
        if (checkBoxObj.value == svalue) {
            if (checked == null) {
                checkBoxObj.checked = !checkBoxObj.checked;
            } else {
                checkBoxObj.checked = checked;
            }
            rv++;
        }
    }
    return rv;
}

/**
 * 체크박스에 체크된 값 얻기
 * @param checkBoxObj 대상 체크박스
 * @return 체크된 값들을 Array로 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function getCheckBox(checkBoxObj) {
    var	rv	= new Array();

    if (checkBoxObj.length > 1) {
        for (var i=0; i<checkBoxObj.length; i++) {
            if (checkBoxObj[i].checked) {
                rv[rv.length] = checkBoxObj[i].value;
            }
        }
    } else {
        if (checkBoxObj.checked) {
            rv[rv.length] = checkBoxObj.value;
        }
    }
    return rv;
}


/*************************************************************
 * window status bar에 메세지를 동적으로 뿌려주어 주의를 환기 시키는
 * 기능과 관련된 펑션들
 *************************************************************/
var _showeTmId  = null;
var _showerText = null;
var _showerPos  = 0;
var _showObj	= null;

/**
 * 주어진 메세지를 window status bar에 동적으로 뿌립니다.
 * @param msg 대상 메세지
 * @auth 곽병의 patracyu@hanmail.net
 */
function StatusMessageShower(msg, tobj) {
    if (msg == null) {
        return;
    }
	if (_showObj == null) {
        window.status   = "";
	} else {
		_showObj.innerText	= "";
	}
    if (msg == "") {
        if (_showeTmId != null) {
            window.clearInterval(_showeTmId);
            _showeTmId	= null;
        }
        return;
    }

    _showerText = msg;
    _showerPos  = 0;
    _showObj	= tobj;
    if (_showeTmId == null) {
        _showeTmId  = window.setInterval("_StatusMessageShowerWorker()", 50);
    }
}

/**
 * 동적으로 뿌려지는 메세지들을 클리어 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function StatusMessageClear() {
	if (_showeTmId != null) {
        window.clearInterval(_showeTmId);
        _showeTmId	= null;
	}
	window.status   = "";
}

/**
 * StatusMessageShower 펑션에 의해 호출되는 동적으로 메세지를 뿌리는 내부 메소드
 * @auth 곽병의 patracyu@hanmail.net
 */
function _StatusMessageShowerWorker() {
    _showerPos++;
    if (_showerText.length == _showerPos) {
        window.status   = _showerText;
        window.clearInterval(_showeTmId);
        _showeTmId	= null;
    } else {
		if (_showObj == null) {
		    _showerText = '완료';
	        window.status   = _showerText.substring(0, _showerPos);
		} else {
			_showObj.innerText	= _showerText.substring(0, _showerPos);
		}
    }
}


/************************************************************************************************
 * S - 객체의 위치 좌표 객체
 ***********************************************************************************************/

/**
 * 주어진 객체의 위치를 속성 x 와 y에 가지는 객체
 * 객체가 주어지지 않으면 마우스 포인트의 위치를 가집니다.
 * @param tobj 대상 객체
 * @auth 곽병의 patracyu@hanmail.net
 */
function Position(tobj) {
    var	cobj;

    if (tobj == null){
        this.x	= window.event.clientX +  + document.body.scrollLeft;
        this.y	= window.event.clientY +  + document.body.scrollTop;
    } else {
        cobj	= tobj;
        this.x	= cobj.offsetLeft;
        this.y	= cobj.offsetTop;
        cobj	= cobj.offsetParent;
        while(cobj != null) {
            this.x	+= cobj.offsetLeft;
            this.y	+= cobj.offsetTop;
            cobj	= cobj.offsetParent;
        }
    }
}

/************************************************************************************************
 * E - 객체의 위치 좌표 객체
 ***********************************************************************************************/


/************************************************************************************************
 * S - <table>의 특정 컬럼을 기준으로 row를 소팅하는 기능과 관련된 펑션들
 ***********************************************************************************************/
var _trSortColIdx;
var _trSortAllow;
var	_trNumberSort;


/**
 * <table>의 row들을 정렬합니다.
 * @param tobj 대상 <table> 객체 혹은 ID
 * @param startRow 정렬 시작 row 번호(0이 첫번째 row)
 * @param colIdx 정렬 기준이되는 컬럼 번호(0이 첫번째 컬럼)
 * @param allow 'asc' 혹은 'desc' 정렬방향 지정
 * @auth 곽병의 patracyu@hanmail.net
 */
function trSort(tobj, startRow, colIdx, allow, type) {
    var buf;

    if (typeof(tobj) == "string") {
        tobj    = document.all[tobj];
    }
    if (tobj.length > 1) {
    	tobj	= tobj[0];
    }
    if (tobj == null) {
        alert("대상 table 객체가 전달되지 않았거나 찾을 수 없습니다.");
        return;
    }
    _trSortColIdx  = colIdx;
    if (allow == null || allow == "asc") {
        _trSortAllow    = 1;
    } else {
        _trSortAllow    = -1;
    }
    if (type != null && type == "number") {
    	_trNumberSort	= true;
    } else {
    	_trNumberSort	= false;
    }
    buf = new Array();
    for (var i=startRow; i<tobj.rows.length; i++) {
        buf[buf.length]  = tobj.rows[i];
    }
    buf.sort(_trSortFunc);
    for (var i=0; i<buf.length; i++) {
        tobj.tBodies[0].removeChild(buf[i]);
    }
    for (var i=0; i<buf.length; i++) {
        tobj.tBodies[0].appendChild(buf[i]);
    }
}

/**
 * 내부 호출 메소드
 * @auth 곽병의 patracyu@hanmail.net
 */
function _trSortFunc(tr1, tr2) {
    var rv;
    var tv1;
    var tv2;

    if (tr1.cells.length <= _trSortColIdx) {
        tv1 = "";
    } else {
        tv1 = tr1.cells[_trSortColIdx].innerText.toLowerCase();
    }
    if (tr2.cells.length <= _trSortColIdx) {
        tv2 = "";
    } else {
        tv2 = tr2.cells[_trSortColIdx].innerText.toLowerCase();
    }
    if (_trNumberSort) {
    	tv1	= parseFloat(tv1.replace(/\,/g, ""));
    	tv2	= parseFloat(tv2.replace(/\,/g, ""));
    }

    if (tv1 > tv2) {
        rv  = 1;
    } else if (tv1 < tv2) {
        rv  = -1;
    } else {
        rv  = 0;
    }
    rv  = rv * _trSortAllow;

    return rv;
}

/************************************************************************************************
 * E - <table>의 특정 컬럼을 기준으로 row를 소팅하는 기능과 관련된 펑션들
 ***********************************************************************************************/

/************************************************************************************
 * S - <table>의 특정 컬럼을 정렬을 수행하는 객체
 ***********************************************************************************/

/**
 * 생성자
 * @param tbid 대상 테이블의 객체 혹은 아이디
 * @param startRow 정렬 시작 로우 번호(0이 첫번째 로우)
 * @auth 곽병의 patracyu@hanmail.net
 */
function SimpleTrSort(tbid, startRow) {
	this.tbid			= tbid;
	this.startRow		= startRow;
	this.titles			= new Array();
	this.colIdxs		= new Array();
	this.addSortColumn	= _SimpleTrSort_addSortColumn;
	this.sort			= _SimpleTrSort_sort;
}

/**
 * 정렬 대상 컬럼을 추가 합니다.
 * @param colIdx 정렬 대상 컬럼의 인덱스(0이 첫번째 컬럼)
 * @param title 정렬 컬럼의 제목
 * @auth 곽병의 patracyu@hanmail.net
 */
function _SimpleTrSort_addSortColumn(colIdx, title) {
	for (var i=this.titles.length; i<=colIdx; i++) {
		this.titles[i]	= null;
	}
	this.titles[colIdx]	= title;
}

/**
 * 대상 컬럼을 기준으로 정렬합니다.
 * @param tdobj 정렬 대상 컬럼의 제목 표시 줄 TD 객체
 * 사전에 반드시 addSortColumn에 의해 등록 되어 있어야 동작합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _SimpleTrSort_sort(tdobj, type) {
	var	colIdx;
	var	title;
	var	trobj;
	var	tdText;
	var	allow;

	colIdx	= tdobj.cellIndex;
	title	= this.titles[colIdx];
	if (title == null) {
		return;
	}
	tdText	= tdobj.innerText;

	if (tdText == title + "▼") {
		allow	= "desc";
		tdText	= title + "▲";
	} else {
		allow	= "asc";
		tdText	= title	+ "▼";
	}
	trobj	= tdobj.parentElement;
	for (var i=0; i<trobj.cells.length; i++) {
		title	= this.titles[i];
		if (title != null) {
			trobj.cells[i].innerText	= title;
		}
	}
	tdobj.innerText	= tdText;
	trSort(this.tbid, this.startRow, colIdx, allow, type);
}
/************************************************************************************
 * E - <table>의 특정 컬럼을 정렬을 수행하는 객체
 ***********************************************************************************/

 /************************************************************************************************
 * S - 날짜 선택 다이얼로그
 ***********************************************************************************************/

 /**
  * 각 월에 누적 날짜 수
  */
 var _monthDays  = new Array();
_monthDays[0]   = 0;
_monthDays[1]   = 31;
_monthDays[2]   = 59;
_monthDays[3]   = 90;
_monthDays[4]   = 120;
_monthDays[5]   = 151;
_monthDays[6]   = 181;
_monthDays[7]   = 212;
_monthDays[8]   = 243;
_monthDays[9]   = 273;
_monthDays[10]  = 304;
_monthDays[11]  = 334;
_monthDays[12]  = 365;

/**
 * 다이얼로그 표시 레이어
 */
var _calendarDialogLayer    = null;
/**
 * 다이얼로그 표시 IFrame
 */
var _calendarDialogIFrm    = null;
/**
 * 선택된 날짜의 TD 객체
 */
var _calendarSelectedTd     = null;
/**
 * 날짜 선택 결과를 돌려줄 콜백 펑션
 */
var _calendarCallback       = null;

/**
 * 지정한 년의 달의 1일까지 날짜수(1년 1월 1일로 부터)를 얻습니다.
 * @param year 계산할 년도
 * @param month 계산할 달
 * @auth 곽병의 patracyu@hanmail.net
 */
function _getDays(year, month) {
    var rv;
    var pyear;

    // 작년까지의 일수 계산
    pyear   = year - 1;
    rv      = pyear * 365 + Math.floor(pyear / 4) - Math.floor(pyear / 100)
        + Math.floor(pyear / 400);

    // 지난달까지의 일수 계산
    rv      += _monthDays[month -1];

    // 2월이 지난경우 윤달 보정 - 첫날에 대한 계산이므로 3월부터 적용되도록 해야 함 (장시영)
    if (month > 2 && (year%4 == 0 && (year%400 == 0 || year%100 != 0))) {
        rv++;
    }
    // 해당월 1일 반영
    rv++;

    return rv;
}



/**
 * 날짜 선택 다이얼 로그를 표시합니다.
 * @param tobj 다이얼로그를 표시할 기준 위치가 되는 객체, 생략하면 마우스 포인터의 위치가 기준위치가 됩니다.
 * @param callback 선택된 날짜를 돌려받을 콜백 펑션
 *             null을 지정 했을때 tobj가 <input>이면 tobj에 값을 설정하는 콜백 펑션이 자동으로 할당됩니다.
 * @param defv 최초로 선택되어 있어야 되는 날짜를 yyyyMMdd로 지정.
 *             null을 지정 했을때 tobj가 <input>이면 tobj의 value를 선댁 되어 있어야 하는 날짜로 사용.
 *             지정된 날짜가 yyyyMMdd형식이 아니면 현재 날짜가 설정 됩니다.
 * @param dx 기준 위치에 적용할 상대 보정위치 x값
 * @param dy 기준 위치레 적용할 상대 보정위치 y값
 * @auth 곽병의 patracyu@hanmail.net
 */
function calendarDialog(tobj, callback, defv, dx, dy ,twidth) {
    var ttb;
    var pos;
    var stdt;
    var wfrm;

	if(twidth == null){twidth = 140;}
    if (_calendarDialogLayer == null) {
        var work;

        _calendarDialogLayer    		= document.createElement("div");
        _calendarDialogIFrm				= document.createElement("iframe");

        _calendarDialogIFrm.style.position = 'absolute';
        _calendarDialogLayer.style.cssText  =
            "position:absolute;top:0px;left:0px;visibility:hidden";
        work    = "<table width="+twidth+" class='CalendarDialogTable' cellspacing=0 cellpadding=0>"
            + "<form name='_calendarDialogForm'>"
            + "<tr>"
            + "    <td colspan=7 align=center height=30>"
            + "        <input name='year' type='text' class='CalendarDialogInput'"
            + "            style='width:36px' maxlength=4"
            + "            onFocus='this.select()'"
            + "            onKeyUp='_calendarDialogMoveTo()'>년"
            + "        <input name='month' type='text' class='CalendarDialogInput'"
            + "            style='width:18px' maxlength=2"
            + "            onFocus='this.select()'"
            + "            onKeyUp='_calendarDialogMoveTo()'>월"
            + "        <img src='" + IMAGE_HOST + "/images/back/common/calendarPmonth.gif' onclick='javascript:_calendarDialogPreviousMonth()' style='cursor:pointer' align='absmiddle' border=0>"
            + "        <img src='" + IMAGE_HOST + "/images/back/common/calendarNmonth.gif' onclick='javascript:_calendarDialogNextMonth()' style='cursor:pointer' align='absmiddle' border=0>"
            + "        <input name='day' type='hidden'>"
            + "    </td>"
            + "</tr>"
            + "<tr>"
            + "    <td width=20 align=center class='CalendarDialogLineTd' style='color:red'>일</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd'>월</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd'>화</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd'>수</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd'>목</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd'>금</td>"
            + "    <td width=20 align=center class='CalendarDialogLineTd' style='color:green'>토</td>"
            + "</tr>";
        for (var i=0; i<6; i++) {
            work    += "<tr>";
            for (var j=0; j <7; j++) {
                var fcolor;

                if (j == 0) {
                    fcolor  = "red";
                } else if (j == 6) {
                    fcolor  = "green";
                } else {
                    fcolor  = "black";
                }
                work    += "    <td align=right class='CalendarDialogTd'"
                    + " style='cursor:default;color:" + fcolor +"'"
                    + " onMouseOver='_calendarDialogMouseOver(this)'"
                    + " onMouseOut='_calendarDialogMouseOut(this)'"
                    + " onDblClick='_calendarDialogDclick(this)'"
                    + " onClick='_calendarDialogClick(this)'>&nbsp;</td>";
            }
            work    += "</tr>";
        }
        work    += "<tr>"
            + "    <td colspan=4 class='CalendarDialogLineTd'>"
            + "        <img src='" + IMAGE_HOST + "/images/back/common/calendarClear.gif' onclick='javascript:_calendarDialogClear()' style='cursor:pointer' align='absmiddle' border=0>"
            + "    </td>"
            + "    <td colspan=3 class='CalendarDialogLineTd' align=right>"
            + "        <img src='" + IMAGE_HOST + "/images/back/common/calendarCommit.gif' onclick='javascript:_calendarDialogCommit()' style='cursor:pointer' border=0 >"
            + "        <img src='" + IMAGE_HOST + "/images/back/common/calendarCancel.gif' onclick='javascript:_calendarDialogCancel()' style='cursor:pointer' border=0 >"
            + "    </td>"
            + "</tr>"
            + "</form>"
            + "</table>"
        _calendarDialogLayer.innerHTML  = work;
        document.body.appendChild(_calendarDialogLayer);
        document.body.appendChild(_calendarDialogIFrm);
    }

    // 초기화
    if (typeof(tobj) == "string") {
        tobj    = document.all[tobj];
    }
    if (dx == null) {
    	dx	= 0;
    }
    if (dy == null) {
    	dy	= 0;
    }
    if (callback == null && tobj.tagName.toLowerCase() == "input") {
    	_calendarCallback	= function(dt) {
    		tobj.value	= dt;
    	}
    } else {
	    _calendarCallback   = callback;
	}
    if (defv == null && tobj != null
		&& tobj.tagName.toLowerCase() == "input") {
        defv    = tobj.value;
    }
    if (defv != null && defv.length == 8) {
        try {
            stdt    = new Date();
            stdt.setFullYear(parseInt(defv.substring(0,4),10));
            stdt.setMonth(parseInt(defv.substring(4,6),10)-1);
            stdt.setDate(parseInt(defv.substring(6),10));
        } catch (e) {
            stdt    = null;
        }
    }

    if (stdt == null) {
        stdt    = new Date();
    }

    wfrm    = document.forms["_calendarDialogForm"];
    wfrm.year.value     = stdt.getFullYear();
    wfrm.month.value    = stdt.getMonth()+1;
    wfrm.day.value      = stdt.getDate();
    _calendarDialogMoveTo();

    // 다이얼로그 표시
    pos = new Position(tobj);
    _calendarDialogLayer.style.zIndex = 2;
    _calendarDialogLayer.style.left = pos.x + dx;
    _calendarDialogLayer.style.top  = pos.y + dy;
    _calendarDialogLayer.style.visibility   = "visible";

    _calendarDialogIFrm.style.width = _calendarDialogLayer.offsetWidth;
    _calendarDialogIFrm.style.height = _calendarDialogLayer.offsetHeight;
    _calendarDialogIFrm.style.top = _calendarDialogLayer.style.top;
    _calendarDialogIFrm.style.left = _calendarDialogLayer.style.left;
    _calendarDialogIFrm.style.zIndex = _calendarDialogLayer.style.zIndex - 1;
    _calendarDialogIFrm.style.display = 'block';
}

/**
 * 내부적으로 사용 되는 펑션으로
 * 변경(설정)된 날짜를 기준으로 달력을 그립니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogMoveTo() {
    var year;
    var month;
    var day;
    var wfrm;
    var firstDays;
    var firstDayOfWeek;
    var daysOfMonth;
    var isInvalid;

    wfrm    = document.forms["_calendarDialogForm"];
    ttb     = _calendarDialogLayer.childNodes[0];
    year    = wfrm.year.value;
    month   = wfrm.month.value;
    day     = wfrm.day.value;

    isInvalid   = isNaN(parseInt(year)) || isNaN(parseInt(month,10)) || isNaN(parseInt(day,10));
    if (isInvalid) {
        for (var i=0; i<7; i++) {
            for (var j=2; j<=7; j++) {
                ttb.rows[j].cells[i].innerText  = " ";
            }
        }
    } else {
        for (var i=0; i<7; i++) {
            ttb.rows[2].cells[i].innerText  = " ";
            ttb.rows[6].cells[i].innerText  = " ";
            ttb.rows[7].cells[i].innerText  = " ";
        }
    }
    if (_calendarSelectedTd != null) {
        _calendarSelectedTd.style.border   = "1px solid white";
        _calendarSelectedTd = null;
    }
    if (isInvalid) {
        return;
    }
    if (year < 1) {
        year    = 1;
        wfrm.year.value     = year;
    }
    if (month > 12) {
        month   = 12;
        wfrm.month.value    = month;
    }
    daysOfMonth         = _monthDays[month] - _monthDays[month-1];
    if (month == 2 && (year%4 == 0 && (year%400 == 0 || year%100 != 0))) {
        daysOfMonth = 29;
    }
    if (day > daysOfMonth) {
        day = daysOfMonth;
        wfrm.day.value      = day;
    }
    firstDays           = _getDays(year, month);
    firstDayOfWeek      = firstDays % 7;
    for (var i=0; i<daysOfMonth; i++) {
        var week;
        var tdObj;

        week    = Math.floor((i + firstDayOfWeek) / 7);
        tdObj   = ttb.rows[week + 2].cells[(i + firstDayOfWeek) % 7];
        tdObj.innerText  = i+1;
        if (day == i+1) {
            _calendarSelectedTd = tdObj;
            tdObj.style.border   = "1px solid red";
        }
    }
}

/**
 * 내부적으로 사용되는 평션으로 이전 달로 이동하고 달력을 다시 그립니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogPreviousMonth() {
    var wfrm;
    var year;
    var month;

    wfrm    = document.forms["_calendarDialogForm"];
    year    = wfrm.year.value;
    month   = wfrm.month.value;

    if (isNaN(parseInt(year)) || isNaN(parseInt(month,10))) {
        return;
    }
    month--;
    if (month == 0) {
        year--;
        month   = 12;
    }
    wfrm.year.value     = year;
    wfrm.month.value    = month;
    _calendarDialogMoveTo();
}

/**
 * 내부적으로 사용되는 평션으로 다음 달로 이동하고 달력을 다시 그립니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogNextMonth() {
    var wfrm;
    var year;
    var month;

    wfrm    = document.forms["_calendarDialogForm"];
    year    = wfrm.year.value;
    month   = wfrm.month.value;

    if (isNaN(parseInt(year)) || isNaN(parseInt(month,10))) {
        return;
    }
    month++;
    if (month == 13) {
        year++;
        month   = 1;
    }
    wfrm.year.value     = year;
    wfrm.month.value    = month;
    _calendarDialogMoveTo();
}

/**
 * 내부적으로 사용되는 평션으로 다음 달로 이동하고 달력을 다시 그립니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogCancel() {
    _calendarCallback   = null;
    if (_calendarSelectedTd != null) {
        _calendarSelectedTd.style.border   = "1px solid white";
        _calendarSelectedTd = null;
    }
    _calendarDialogLayer.style.visibility   = "hidden";
    _calendarDialogIFrm.style.display		= "none";
}

/**
 * 내부적으로 사용되는 평션으로 마우스 포인터가 위치하는 날짜의 시각 효과를 처리합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogMouseOver(tobj) {
    if (tobj.innerText == " ") {
        return;
    }
    tobj.style.background   = "#FFA070";
}

/**
 * 내부적으로 사용되는 펑션으로 마우스 포인터가 벗어난 날짜의 시각 효과를 처리합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogMouseOut(tobj) {
    if (tobj.innerText == " ") {
        return;
    }
    tobj.style.background   = "";
}

/**
 * 내부적으로 사용되는 펑션으로 사용자의 날짜 선택을 처리합니다.
 * @param tobj 선택한 날짜의 td객체
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogClick(tobj) {
    if (tobj.innerText == " ") {
        return;
    }
    wfrm    = document.forms["_calendarDialogForm"];
    if (_calendarSelectedTd != null) {
        _calendarSelectedTd.style.border   = "1px solid white";
    }
    wfrm.day.value  = tobj.innerText;
    tobj.style.border   = "1px solid red";
    _calendarSelectedTd = tobj;
}

/**
 * 내부적으로 사용되는 펑션으로  선택된 날짜를 컬백 펑션에 통지합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogCommit() {
    wfrm    = document.forms["_calendarDialogForm"];
    year    = wfrm.year.value;
    month   = wfrm.month.value;
    day     = wfrm.day.value;
    if (isNaN(parseInt(year)) || isNaN(parseInt(month,10)) || isNaN(parseInt(day,10))) {
        alert("날짜가 선택되지 않았거나 올바른 날짜가 아닙니다.");
        return;
    }
    if (_calendarCallback != null) {
        year    = ("0000" + year).substring(year.length);
        month   = ("00" + month).substring(month.length);
        day     = ("00" + day).substring(day.length);

        _calendarCallback(year + month + day);
    }
    _calendarCallback   = null;
    if (_calendarSelectedTd != null) {
        _calendarSelectedTd.style.border   = "1px solid white";
        _calendarSelectedTd = null;
    }
    _calendarDialogLayer.style.visibility   = "hidden";
    _calendarDialogIFrm.style.display		= "none";
}

/**
 * 내부적으로 사용되는 펑션으로 컬백 펑션에 널스트링을 전달하여 날짜를 지우도록 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogClear() {
    if (_calendarCallback != null) {
        _calendarCallback("");
    }
    _calendarCallback   = null;
    if (_calendarSelectedTd != null) {
        _calendarSelectedTd.style.border   = "1px solid white";
        _calendarSelectedTd = null;
    }
    _calendarDialogLayer.style.visibility   = "hidden";
    _calendarDialogIFrm.style.display		= "none";
}


/**
 * 내부적으로 사용되는 펑션으로 사용자의 날짜 선택과 커밋을 처리합니다.
 * @param tobj 선택한 날짜의 td객체
 * @auth 곽병의 patracyu@hanmail.net
 */
function _calendarDialogDclick(tobj) {
    if (tobj.innerText == " ") {
        return;
    }
    _calendarDialogClick(tobj);
    _calendarDialogCommit();

}

 /************************************************************************************************
 * E - 날짜 선택 다이얼로그
 ***********************************************************************************************/


 /************************************************************************************************
 * S - 다중 선택 샐랙버튼
 ***********************************************************************************************/

var _ms_cnt = 0;
var _mss    = new Array();

/**
 * 생성자
 * @param name 샐랙 버튼의 이름
 * @auth 곽병의 patracyu@hanmail.net
 */
function MultiSelect(name) {
    this.name           = name;
    this.idx            = _ms_cnt++;
    this.id             = "_ms_" + this.idx + "_" + name;
    this.optionTexts    = new Array();
    this.optionValues   = new Array();
    this.isWrited       = false;
    this.checkBoxes     = null;

    this.addOption      = _MultiSelect_addOption;
    this.write          = _MultiSelect_write;
    this.getCheckBoxes  = _MultiSelect_getCheckBoxes;
    this.show           = _MultiSelect_show;
    this.sync           = _MultiSelect_sync;
    this.hide           = _MultiSelect_hide;
    this.optionClick    = _MultiSelect_optionClick;
    this.selectClick    = _MultiSelect_selectClick;
    this.disabled       = _MultiSelect_disabled;
    this.getDisabled    = _MultiSelect_getDisabled;
    this.setChecked     = _MultiSelect_setChecked;
    this.onChanged      = null;

    _mss[this.idx]   = this;
}

/**
 * 옵션을 추가합니다.
 * @param value 값
 * @param text 표시이름
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_addOption(value, text) {
    var idx;

    idx = this.optionTexts.length;
    this.optionTexts[idx]   = text;
    this.optionValues[idx]  = value;
}

/**
 * 구성된 다중 선택 샐랙트 버튼을 출력합니다.
 * @patam style css 스타일
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_write(style) {
    if (this.isWrited) {
        return;
    }
    this.isWrited   = true;
    style   = (style == null ? "style=\"padding-left:2px;padding-right:2px;padding-top:1px;padding-bottom:1px;font-size:9pt;background:white\"" : "style=\"" + style + "\"");
    document.writeln("<table id='" + this.id + "pan' cellspacing=0 cellpadding=0 style='cursor:default;border:inset #E0E0E0 1px'");
    document.writeln(" onClick=\"_mss[" + this.idx + "].show();event.cancelBubble = true;\">");
    document.writeln("<tr>");
    document.writeln("\t<td id='" + this.id + "msg' nowrap " + style + "></td>");
    document.writeln("\t<td nowrap style='font-size:8pt;background:#e0e0e0;border:outset white 2px'>▼</td>");
    document.writeln("</tr>");
    document.writeln("</table>");

    document.writeln("<div id='" + this.id + "lay'");
    document.writeln("\tstyle='position:absolute;visibility:hidden;overflow-x:visible;overflow-y:auto;border:solid black 1px'");
    document.writeln("\tonClick='event.cancelBubble = true;'>");
    document.writeln("<table width=90 border=0 cellspacing=0 cellpadding=1 " + style);
    document.writeln("\t>");
    document.writeln("<tr style='cursor:default'");
    document.writeln("\tonMouseOver=\"this.style.background='#00004F';\"");
    document.writeln("\tonMouseOut=\"this.style.background='';\"");
    document.writeln("\tonDblClick=\"_mss[" + this.idx + "].hide()\"");
    document.writeln("\tonClick=\"_mss[" + this.idx + "].selectClick()\">");
    document.writeln("\t<td nowrap style=\"padding-right:20px;\"");
    document.writeln("\tonMouseOver=\"this.style.color='#FF9F00';\"");
    document.writeln("\tonMouseOut=\"this.style.color='';\">");
    document.writeln("\t\t&nbsp;<span id=\"" + this.id + "sel\">□</span>&nbsp;&nbsp;선택");
    document.writeln("\t</td>");
    for (var i=0; i<this.optionTexts.length; i++) {
        document.writeln("<tr style='cursor:default'");
        document.writeln("\tonMouseOver=\"this.style.background='#00004F';this.style.color='white';\"");
        document.writeln("\tonMouseOut=\"this.style.background='';this.style.color=''\"");
        document.writeln("\tonDblClick=\"_mss[" + this.idx + "].hide()\"");
        document.writeln("\tonClick=\"_mss[" + this.idx + "].optionClick(this)\">");
        document.writeln("\t<td nowrap style='padding-right:25px'");
        document.writeln("\tonMouseOver=\"this.style.color='white';\"");
        document.writeln("\tonMouseOut=\"this.style.color='';\">");
        document.writeln("\t\t<input type='checkbox' name=\"" + this.name + "\" value=\"" + this.optionValues[i]
            +"\" onClick=\"event.cancelBubble = true;\">" + this.optionTexts[i]);
        document.writeln("\t</td>");
    }
    document.writeln("</table>");
    document.writeln("</div>");
}

/**
 * 다중 선택 샐랙트 박스의 checkbox 들을 반환합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_getCheckBoxes() {
    var ttable;

    if (this.checkBoxes == null) {
        this.checkBoxes = new Array();
        ttable  = document.all[this.id + "lay"].childNodes[0];
        for (var i=1; i<ttable.rows.length; i++) {
            this.checkBoxes[i-1]  = ttable.rows[i].children[0].childNodes[0];
        }
    }

    return this.checkBoxes;
}

/**
 * 다중 체크 박스를 체크합니다.
 * @param value 대상 값
 * @param checked 체크 여부
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_setChecked(value, checked) {
    var chbxs;

    chbxs   = this.getCheckBoxes();
    for (var i=0; i<chbxs.length; i++) {
        if (chbxs[i].value == value) {
            chbxs[i].checked   = checked;
            break;
        }
    }
}

/**
 * 내부 메쏘드
 * 클릭된 tr객체에 존재하는 checkbox를 클릭합니다.
 * @patam trObj 대상 tr
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_optionClick(trObj) {
    var tip;

    tip = trObj.children[0].childNodes[0];

    if (tip.checked) {
        tip.checked = false;
    } else {
        tip.checked = true;
    }
}

/**
 * 선택 작업을 합니다.
 * 모두 선택 되어 있을땐 모두 선택 해제로.
 * 그 이외엔 모두 선택상태로 변경합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_selectClick() {
    var chks;
    var selCnt;
    var chkFlag;

    chks    = this.getCheckBoxes();
    if (chks.length == 0) {
        return;
    }
    selCnt  = 0;
    for (var i=0; i<chks.length; i++) {
        if (chks[i].checked) {
            selCnt++;
        }
    }
    if (selCnt == chks.length) {
        chkFlag = false;
        document.all[this.id + "sel"].innerHTML = "□";
    } else {
        chkFlag = true;
        document.all[this.id + "sel"].innerHTML = "■";
    }
    for (var i=0; i<chks.length; i++) {
        chks[i].checked = chkFlag;
    }
}

/**
 * 선택 레이어를 나타나게 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_show() {
    var pos;
    var lay;

    pos = new Position(document.all[this.id + "msg"]);
    lay = document.all[this.id + "lay"];
    lay.style.top   = pos.y;
    lay.style.left  = pos.x;
    if (lay.offsetHeight > 400) {
        lay.style.height = "400px";
    }

    document.all[this.id + "lay"].style.visibility = "visible";

    for (var i=0; i<_mss.length; i++) {
        if (_mss[i] != this) {
            _mss[i].hide();
        }
    }
}

/**
 * checkbox에 선택된 내용과 표시 내용을 동기화 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_sync() {
    var ttable;
    var selmsg;
    var selcnt;

    ttable  = document.all[this.id + "lay"].childNodes[0];
    selmsg  = null;
    selcnt  = 0;
    for (var i=ttable.rows.length-1; i>0; i--) {
        var ttd;
        var tip;

        ttd = ttable.rows[i].children[0];
        tip = ttd.childNodes[0];
        if (tip.checked) {
            selmsg = ttd.innerText;
            selcnt++;
        }
    }
    if (selcnt == 1) {
        document.all[this.id + "msg"].innerHTML = selmsg;
    } else if (selcnt > 1) {
        document.all[this.id + "msg"].innerHTML = selmsg
            + "..[" + (selcnt-1) + "]";
    } else {
        document.all[this.id + "msg"].innerHTML =
            "<font color='gray'>미선택</font>";
    }
    try {
        document.all[this.id + "msg"].width =
            document.all[this.id + "lay"].offsetWidth - 17;
    } catch (ignore) {}
    if (selcnt == 0) {
        document.all[this.id + "sel"].innerHTML = "□";
    } else if (selcnt == ttable.rows.length-1) {
        document.all[this.id + "sel"].innerHTML = "■";
    } else {
        document.all[this.id + "sel"].innerHTML = "▣";
    }
}

/**
 * 선택 레이어를 감추며 onChanged가 설정 되어 있다면 실행 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_hide() {
    var ber;
    var	lay;

	lay	= document.all[this.id + "lay"];
	if (lay == null || lay.style.visibility == "hidden") {
        return;
    }
    if (this.onChanged != null) {
        try {
            this.onChanged();
            ber = null;
        } catch (error) {
            ber = error;
        }
    }

    this.sync();

    document.all[this.id + "lay"].style.visibility = "hidden";
    if (ber != null) {
        throw ber;
    }
}

/**
 * 다중 선택 박스를 비/활성화 합니다.
 * @param flag true이면 비활성 false면 활성
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_disabled(flag) {
    document.all[this.id + "lay"].disabled  = flag;
    document.all[this.id + "pan"].disabled  = flag;
}

/**
 * 다중 선택 박스의 비/활성 여부를 얻습니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_getDisabled() {
    return document.all[this.id + "lay"].disabled;
}

/**
 * 열려진 모든 다중 선택 박스의 선택 레이어를 감춥니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_hideAll() {
    for (var i=0; i<_mss.length; i++) {
        _mss[i].hide();
    }
}
/**
 * 모든 다중 선택 박스를 동기화 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _MultiSelect_syncAll() {
    for (var i=0; i<_mss.length; i++) {
        _mss[i].sync();
    }
}

/************************************************************************************************
 * E - 다중 선택 샐랙버튼
 ***********************************************************************************************/

/************************************************************************************************
 * S - 풍선 도움말
 ***********************************************************************************************/
var	_msgLayer;

/**
 * 내부적으로 사용되는 펑션으로 풍선 도움말을 표시하기 위한 레이어를 초기화 합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _msgLayerInit() {
    if (_msgLayer == null) {
    	_msgLayer	= document.createElement("div");
    	_msgLayer.style.cssText  =
    		"position:absolute;top:0px;left:0px;visible:hidden";
    	document.body.appendChild(_msgLayer);
    }
}

/**
 * 메세지 풍선 돔말 레이어 표시
 * @param tobj 표시할 대상 객체
 * @param str 표시 택스트 1
 * @param str2 표시 택스트 2
 * @param dx 대상 객채로 부터의 상대 x 위치
 * @param dy 대상 객채로 부터의 상대 y 위치
 * @auth 곽병의 patracyu@hanmail.net
 */
function msgset(tobj, str, str2, dx, dy){
    var	loc;
    var	cobj;

	_msgLayerInit();
	if (typeof(tobj) == "string") {
		tobj	= document.all[tobj];
	}
    loc = new Position(tobj);
    if (dx == null) {
        dx  = 0;
    }
    if (dy == null) {
        dy  = 0;
    }

    _msgLayer.style.left	= loc.x + dx;
    _msgLayer.style.top		= loc.y + dy;
    msgtext(str, str2);
    _msgLayer.style.visibility	= "visible";
}


/**
 * 메세지의 위치는 변경하지 않고 문구만 설정하고 표시 합니다.
 * @param str 표시 택스트 1
 * @param str2 표시 택스트 2
 * @auth 곽병의 patracyu@hanmail.net
 */
function msgtext(str, str2){
    var text;

	_msgLayerInit();
    text = "<table border=0 cellpadding=6 cellspacing=0 bgcolor='#FFFFE0' style='font-size:9pt; border-width:1; border-color:#E0A07F; border-style:solid;color:#630262;'>";
    text += "<tr><td NOWRAP>"
    text += (str == null ? "" : "<b>" + str + "</b><br>");
    text += (str2 == null ? "" : str2);
    text += "</td></tr></table>";

    _msgLayer.innerHTML	= text;
}

/**
 * 메세지 풍선 돔말 레이어 이동(마우스 포인트 따라다니는 풍선돔말 전용)
 * @param dx 마우스 포인터의 위치로 부터의 상대 x 위치
 * @param dy 마우스 포인터의 위치로 부터의 상대 y 위치
 * @auth 곽병의 patracyu@hanmail.net
 */
function msgmove(dx, dy){
    var	msg;

	_msgLayerInit();
    _msgLayer.style.left	= window.event.clientX + document.body.scrollLeft + dx;
    _msgLayer.style.top		= window.event.clientY + document.body.scrollTop + dy;
}

/**
 * 메세지 풍선 돔말 레이어 감추기
 * @auth 곽병의 patracyu@hanmail.net
 */
function msghide(){

	_msgLayerInit();

    _msgLayer.innerHTML		= "";
    _msgLayer.visibility	= "hidden";
}

/************************************************************************************************
 * E - 풍선 도움말
 ***********************************************************************************************/

 /************************************************************************************************
 * S - 파일 업로드 객체
 ***********************************************************************************************/

/**
 * 생성자
 * @param title 	업로드 다이얼로그의 창 제목 표시줄에 표시될 제목을 지정하십시오.
 * @param message 	업로드 다이얼로그에 표시할 메세지를 지정하십시오.
 * @auth 곽병의 patracyu@hanmail.net
 */
function FileUpload(title, message) {

	// 인수 값 보정
	if (title == null) {
		title	= "파일 업로드";
	}
	if (message	== null) {
		message	= "업로드할 파일을 선택하고 전송 버튼을 눌러 전송하십시오.";
	}

	// 멤버
	this.res				= null;
	this.upSpecs			= new Array();
	this.title				= title;
	this.message			= message;

	// 메쏘드
	this.openDialog			= _FileUpload_openDialog;
	this.addSpec			= _FileUpload_addSpec;
	this.clear				= _FileUpload_clear;
	this.getUploadFileInfo	= _FileUpload_getUploadFileInfo;
	this.setUpfileToForm	= _FileUpload_setUpfileToForm;
	this.setCopyfileToForm	= _FileUpload_setCopyfileToForm;
	this.getUploadedDesc	= _FileUpload_getUploadedDesc;
}

/**
 * 업로드 스팩을 추가합니다.
 * @param name			업로드 이름입니다.
 * @param title			업로드 항목의 타이틀입니다. 생략시 업로드명과 동일합니다.
 * @param allowExts		업로드에 허용할 파일의 확장자를 콤마를 구분자로 나열하십시오.
 * 						생략하거나 null 지정시 파일 확장자 필터링을 하지 않습니다.
 * @param requireCount	업로드 파일 최소 필수 갯수 입니다.  업로드 파일 제한 갯수를 넘을 수 없습니다.
 *						생략하면 1입니다.
 * @param limitCount	업로드 파일 제한 갯수입니다.
 *						0을 지정하면 무제한입니다. 생략하면 1입니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _FileUpload_addSpec(name, title, allowExts, requireCount, limitCount) {
	var	uploadSpec;
	var	allowExtArray;

	// 인수 보정
	if (title == null) {
		title	= name;
	}
	if (limitCount == null || limitCount < 0 || isNaN(limitCount)) {
		limitCount	= 1;
	}
	if (requireCount == null || requireCount < 0 || isNaN(requireCount)) {
		requireCount	= 1;
	}
	if (limitCount != 0 && requireCount > requireCount) {
		throw new Error("업로드 최소 갯수는 업로드 제한 갯수보다 클 수 없습니다.");

	}
	if (limitCount == 0 || limitCount > 11){
		throw new Error("업로드 최대 개수는 0 이나 10 이상 개수를 지정하실수 없습니다.");
	}

	// 허용 확장자 처리
	if (allowExts == null || allowExts == "") {
		allowExtArray	= null;
	} else {
		allowExtArray	= allowExts.split("\\,");
	}

	uploadSpec					= new Array();
	uploadSpec["name"]			= name;
	uploadSpec["title"]			= title;
	uploadSpec["allowExts"]		= allowExtArray;
	uploadSpec["requireCount"]	= requireCount;
	uploadSpec["limitCount"]	= limitCount;

	this.upSpecs.push(uploadSpec);
}

/**
 * 업로드된 파일의 정보를 지웁니다.
 * 업로드된 파일이 삭제되는것은 아닙니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _FileUpload_clear() {
	this.res	= null;
}

/**
 * 파일 업로드 다이얼로그를 엷니다.
 * 업로드된 결과는 내부에 저장되며, 이전에 저장되어 있는 결과가 있고
 * 팝업창에서 전송이 이루어지지 않았다면 이전에 저장된 결과가 변경되지 않고 유지됩니다.
 * @return true이면 사용자의 업로드 전송이 있었습니다. false이면 사용자가 업로드 하지 않고 다이얼로그를 닫았습니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _FileUpload_openDialog() {
	var	res;
	var	width;
	var	height;
	var	args

	// 다이얼로그의 크기
	width	= 600;
	height	= 300;

	if (this.upSpecs.length == 0) {
		this.addSpec("file");
	}

	// 전달할 인수
	args				= new Array();
	args['title']		= this.title;
	args['message']		= this.message;
	args['upSpecs']		= this.upSpecs;

	res	= window.showModalDialog("/back/common/fileupload/FileUploadDialog.html", args,
		"dialogWidth:" + width
		+ "px;dialogHeight:" + height
		+ "px;center:yes;edge:rised;help:no;resizable:yes;scroll:no;status:no;unadorned;no");

	if (res != null) {
		var	newRes;

		newRes			= new Array();
		newRes["_all_"]	= new Array();
		for (var i=0; i<res.length; i++) {
			var upinfos;
			var	upinfo;

			upinfo	= new UploadedFileInfo(res[i]);
			upinfos	= newRes[upinfo.getFieldName()];
			if (upinfos == null) {
				upinfos	= new Array();
				newRes[upinfo.getFieldName()]	= upinfos;
			}
			upinfos.push(upinfo);
			newRes["_all_"].push(upinfo);
		}
		this.res	= newRes;
		return true;
	}
	return false;
}

/**
 * 업로드된 파일정보를 UploadedFileInfo의 Array로 반환합니다.
 * @param fieldName 정보를 얻을 필드 명, 생략 하거나 null을 지정하면 모든 필드의 정보를 반환합니다.
 * @auth 곽병의 patracyu@hanmail.net
 */
function _FileUpload_getUploadFileInfo(fieldName) {
	if (fieldName == null) {
		return this.res["_all_"];
	}
	return this.res[fieldName];
}

/**
 * 업로드된 정보를 지정한 HTML원소의 InnerHTML에 <input type="hidden"> 형식으로 출력합니다.
 * @param tObj 출력할 HTML 원소
 * @param fieldName 츨력할 필드 명, 생략 하거나 null을 지정하면 모든 필드의 정보를 출력합니다.
 * @param withDesc true가 지정되면 업로드된 정보를 사용자가 볼수 있도록 정해진 형식의 택스트도 같이
 *                 출력합니다.
 * @auth 김철민 netkers@gmail.com
 */
function _FileUpload_setUpfileToForm(tObj, fieldName, withDesc) {
	var	work;
	var	upinfos;
	var i=0;

	if (typeof(tObj) == "string") {
		tObj	= document.all[tObj];
	}



	if (withDesc == null) {
		withDesc	= false;
	}
	work	= "";
	upinfos	= this.getUploadFileInfo(fieldName);

	if (upinfos != null) {
		for (var j=0; j<upinfos.length; j++) {
			work	+= "<input type=\"hidden\" name=\""
					+ upinfos[j].getFieldName()
					+ "_recivedName_"+[j]+"\" value=\""
					+ upinfos[j].getFileName()
					+ "\">"
			work	+= "<input type=\"hidden\" name=\""
					+ upinfos[j].getFieldName()
					+ "_clientPath_"+[j]+"\" value=\""
					+ upinfos[j].getFilePath()
					+ "\">"
			work	+= "<input type=\"hidden\" name=\""
					+ upinfos[j].getFieldName()
					+ "_storedFile_"+[j]+"\" value=\""
					+ upinfos[j].getStoredFilePath()
					+ "\">"
			work	+= "<input type=\"hidden\" name=\""
					+ upinfos[j].getFieldName()
					+ "_size_"+[j]+"\" value=\""
					+ upinfos[j].getFileSize()
					+ "\">"
			work	+= "<input type=\"hidden\" name=\""
					+ upinfos[j].getFieldName()
					+ "_contentType_"+[j]+"\" value=\""
					+ upinfos[j].getContentType()
					+ "\">"
			i =j;
		}
		if (withDesc) {
			work	+= this.getUploadedDesc(fieldName);
		}
		// Upload count 가저오는 메소드
		work	+= "<input type=\"hidden\" name=\""
				+ "upload_count\" value=\""
				+ i
				+ "\">"
	}
	tObj.innerHTML	= work;

}


/**
 * 업로드된 정보를 지정한 HTML원소의 InnerHTML에 <input type="hidden"> 형식으로 출력합니다.
 * @param tObj 출력할 HTML 원소
 * @param recivedName 이동할 디렉토리 + 파일명 정보입니다.
 * @param count 파일업로드할 개수를 가져옵니다.
 * @auth 김철민 netkers@gmail.com
 */
function _FileUpload_setCopyfileToForm(tObj,fieldName,recivedName, count) {
	var	upinfos;
	var	work;

	if (typeof(tObj) == "string") {
		tObj	= document.all[tObj];
	}

	if (count == null) {
		count	= false;
	}else if(10 < count)
	{
		alert("업로드 개수는 10개 이상은 불가능 합니다.");
	}
	work	= "";
	if (recivedName != null) {
		for(var j=0 ; j <= parseInt(count,10) ; j++){
		work	+= "<input type=\"text\" name=\""
					+ "file_recivedName_"+j+"\""
					+ " value="+ recivedName +"/"
					+ document.all[fieldName
					+"_recivedName_"+j].value
					+ ">"
		work	+= "<input type=\"text\" name=\""
					+ "file_storedFile_"+j+"\""
					+ " value="
					+ document.all[fieldName
					+"_storedFile_"+j].value
					+ ">"
	}
		work	+= "<input type=\"hidden\" name=\""
				+ "upload_count\" value=\""
				+ parseInt(count,10)
				+ "\">"
	}
	tObj.innerHTML	= work;
}

/**
 * 업로드된 파일 정보를 택스트로 반환합니다.
 * @param fieldName 대상 업로드 필드명, 생략하면 모두
 * @auth 곽병의 patracyu@hanmail.net
 */
function _FileUpload_getUploadedDesc(fieldName) {
	var	upinfos;

	upinfos	= this.getUploadFileInfo(fieldName);
	if (upinfos == null) {
		return "";
	} else {
		var	rv;

		rv	= "<table>";
		for (var i=0; i<upinfos.length; i++) {
			rv	+= "<tr>";
			rv	+= "<td>[" + upinfos[i].fieldName + "]</td>";
			rv	+= "<td>" + upinfos[i].fileName + "</td>";
			rv	+= "</tr>";
		}
		rv	+= "</table>";
		return rv;
	}
}

/************************************************************************************************
 * E - 파일 업로드  객체
 ***********************************************************************************************/

 /************************************************************************************************
 * S - 업로드된 파일 정보  객체
 ***********************************************************************************************/

/**
 * 생성자
 * @param resArr 팝업 다이얼로그로 부터 받은 정보를 담은 어레이 객체
 * @auth 곽병의 patracyu@hanmail.net
 */
function UploadedFileInfo(resArr) {
	// 맴버
	this.fieldName		= resArr["fieldName"];		//업로드된 클라이언트측 필드명
	this.fileName		= resArr["fileName"];		//업로드된 클라이언트측 파일명(path 제외)
	this.filePath		= resArr["filePath"];		//업로드된 클라이언트측 파일명(path 포함)
	this.storedFilePath	= resArr["storedFilePath"];	//업로드된 서버측 파일명(path 포함)
	this.fileSize		= resArr["fileSize"];		//업로드된 파일의 크기
	this.contentType	= resArr["contentType"];	//업로드된 파일의 컨탠트 타입

	// 메쏘드
	this.getFieldName		= _UploadedFileInfo_getFieldName;
	this.getFileName		= _UploadedFileInfo_getFileName;
	this.getFilePath		= _UploadedFileInfo_getFilePath;
	this.getStoredFilePath	= _UploadedFileInfo_getStoredFilePath;
	this.getFileSize		= _UploadedFileInfo_getFileSize;
	this.getContentType		= _UploadedFileInfo_getContentType;
}

/**
 * 업로드된 클라이언트측 필드명(path 제외) 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getFieldName() {
	return this.fieldName;
}

/**
 * 업로드된 클라이언트측 파일명(path 제외) 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getFileName() {
	return this.fileName;
}

/**
 * 업로드된 클라이언트측 파일명(path 포함) 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getFilePath() {
	return this.filePath;
}

/**
 * 업로드된 서버측 파일명(path 포함) 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getStoredFilePath() {
	return this.storedFilePath;
}

/**
 * 업로드된 파일의 크기 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getFileSize() {
	return this.fileSize;
}

/**
 * 업로드된 파일의 컨탠트 타입 반환
 * @auth 곽병의 patracyu@hanmail.net
 */
function _UploadedFileInfo_getContentType() {
	return this.contentType;
}

/************************************************************************************************
 * E - 업로드된 파일 정보  객체
 ***********************************************************************************************/


/**
 * 모달창의 크기를 설정한다.
 * 속성 w : 폭
 * 속성 h : 높이
 * @author 오명철 (omc97@hanmail.net)
 */
function sizeDialog(w, h)
{
  top.dialogWidth = w + "px";
  top.dialogHeight = (h+55) + "px"; // for ie7.0

  top.dialogTop = (window.screen.height - Number(top.dialogHeight.replace(/\D/g, "")))/2;
  top.dialogLeft = (window.screen.width - Number(top.dialogWidth.replace(/\D/g, "")))/2;
}

/**
 * 콤보박스의 defaultSelected값을 클리어 시킨다.
 * 속성 obj : 콤보박스 객체
 * @author 오명철 (omc97@hanmail.net)
 */
function clearSelectDefault(obj)
{
    for(var i=0; i<obj.length; i++)
        obj[i].defaultSelected = false;
}

/**
 * 콤보박스의 defaultSelected값을 설정한다.
 * 속성 obj : 콤보박스 객체
 * @author 오명철 (omc97@hanmail.net)
 */
function setSelectDefault(obj)
{
	if ( obj != undefined && obj.selectedIndex != -1) {
	    obj[obj.selectedIndex].defaultSelected = true;
	}
}

/**
 * 콤보박스의 defaultSelected index값을 반환한다.
 * 속성 obj : 콤보박스 객체
 * @author 오명철 (omc97@hanmail.net)
 */
function getSelectDefaultIndex(obj)
{
	for(var i=0; i<obj.length; i++)
	{
		if(obj[i].defaultSelected)
			return i;
	}

	return -1;
}

/**
 * 콤보박스의 defaultSelected index값을 반환한다.
 * 속성 obj		: 대상 Object
 * 속성 length	: 최대길이
 * 속성 target	: 이동할 Object
 * @author 오명철 (omc97@hanmail.net)
 */
function autoTab(obj, length, target)
{
	if(obj.value.length == length)
		target.focus();
}

/**
 * 콤보박스의 defaultSelected index값을 반환한다.
 * 속성 obj		: 대상 Object
 * 속성 value		: value	Array
 * 속성 label		: label Array
 * @author 오명철 (omc97@hanmail.net)
 */
function addCombo(obj, valueArr, labelArr) {
    if( typeof(valueArr) == "string") valueArr = new Array(valueArr);
    if( typeof(labelArr) == "string") labelArr = new Array(labelArr);

    var option = null;

    for(var i = 0, n = valueArr.length; i < n ; i++) {
		option = new Option();
		option.value = valueArr[i];
		option.text = labelArr[i];
		obj.options[obj.options.length] = option;
    }
}

/**
 * 기 능      : String prototye에 trim function 추가
 * 설 명      : 공백 문자를 제거해줌
 * @parameter : 없음
 * @return    : 없음
 * @author    : 박현근(charlie@uzen.net)
 */
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}

/**
 * 팝업용 다이알로그 호출 함수
 * 속성 url		: 팝업 페이지 URL, 예) "/controls/back/settlement/ContractNoPopupForm"
 * 속성 spr    	: 팝업 페이지 구분자
 * @author 이병만 (inchonc@hotmail.com)
 */
function popUpWindow(url,spr){
	var state = "dialogWidth=1000px;dialogHeight=600px;center=yes;scroll=no;status=no;help=no;resizable:no;resize=0";
	var objParam = new Object();

	objParam.OPENER = window;
	objParam.spr = spr;
	var rtnValue = window.showModalDialog(url,objParam,state);
}

/**
 * 팝업용 다이알로그 호출 함수
 * 속성 url		: 팝업 페이지 URL, 예) "/controls/back/settlement/ContractNoPopupForm"
 * 속성 spr    	: 팝업 페이지 구분자
 * 속성 state    	: 팝업 환경 정보.
 * @author 안재모(grapi@naver.com)
 */
function popUpWindow(url,spr,state){
	if( state == null || state == '' ) {
		state = "dialogWidth=1000px;dialogHeight=600px;center=yes;scroll=auto;status=no;help=no;resizable:no";
	}

	var objParam = new Object();

	objParam.OPENER = window;
	objParam.spr = spr;
	var rtnValue = window.showModalDialog(url,objParam,state);
}

/**
 * 기준날짜에서 이력된 날짜후의 날짜값 리턴
 * 속성 today		 : 기준 날짜.
 * 속성 nextDate  : 기준날짜에서 nextDate 후
 * @author 안재모 (grapi@naver.com)
 */
function isNextDts( basicDate , nextDate )
{
		var y = basicDate.substring(0,4);
		var m = basicDate.substring(4,6);
		var d = basicDate.substring(6,8);
		m = Number(m);
		d = Number(d);
		var year;
		var month;
		var dayStr;

		var returnValueStr;

		//1970.01.01 날짜 계산이 시작되는 기준일
		//기준일
		var basic = new Date(0);

		//오늘
		var now = new Date(y,m-1,d);

		//오늘부터 몇일후
		var count;
		count = Number(nextDate);

		//오늘부터 몇일후의 날짜를 알 수 있다
		//1000*60*60*24 는 하루를 나타냄
		//(now - basic) / (1000*60*60*24) 오늘부터 기준일까지의 날짜수
	    //즉 기준일로부터 몇일까지의 날짜수를 Long형태로 만들어 날짜를 만들어낸다.
		var day = new Date((1000*60*60*24*(count+((now-basic)/(1000*60*60*24)))));

		// 결관 년도 입력
		year = day.getYear() ;
		// 결과 월수 입력
	    month= (day.getMonth()+1);
		if( month < 10) {
		    month = "0"+(day.getMonth()+1);
		}else{
		    month= (day.getMonth()+1);
		}
	    // 결과 날짜 입력
	    dayStr = (day.getDate());
		if( dayStr < 10) {
		    dayStr = "0"+(day.getDate());
		}else{
		    dayStr = (day.getDate());
		}
		returnValueStr = year +""+ month+""+dayStr;

	    return returnValueStr;
}

var dateObj;	// 달력에서 선택한  날짜를 입력 받을 대상  Object

/**
 * 달력을 띄운다.
 * 속성 obj : 선택한 날짜를 입력할 대상 Object
 * @author 오명철 (omc97@hanmail.net)
 */
function openCalendar(obj, width)
{
	dateObj = obj;

	calendarDialog(obj, setDate, removeFormat(obj.value, '-'), 0, 27, width);
}

/**
 * 달력에서 선택한 날짜를 입력한다.
 * 속성 obj : 선택한 날짜를 입력할 대상 Object
 * @author 오명철 (omc97@hanmail.net)
 */
function setDate(date)
{
	if(date == '')
	{
		dateObj.value = '';
		return ;
	}

	var year = date.substring(0, 4);
	var month = date.substring(4, 6);
	var date = date.substring(6);

	dateObj.value = year + '-' + month + '-' + date;
}

	/*******************************************************************
    * 특수문자 제한
    * @author 안재모 (grapi@naver.com)
    * 제한되는 특수문자 추가
	*******************************************************************/
    function isSpecialCharacterAlert(obj){
		if(obj.value.replace(/[^_%&#:/</>/^]/g,"") != ""){
			alert("특수문자는 사용할 수 없습니다.");
			obj.focus();
			return;
		}
    }
    
    
    /*******************************************************************
    * 특수문자 제한
    * @author 안재모 (grapi@naver.com)
    * 제한되는 특수문자 추가
    * 특수문자 포함 : true
    * 특수문자 포함 : false
	*******************************************************************/
    function isSpecialCharacterYn(obj){
		if(obj.value.replace(/[^_%&#:/</>/^]/g,"") != ""){
			return true; 
		}else{
			return false;
		}
    }

/**
 * str_value가 길이가 int_length보다 작으면 작은수만큼 왼쪽에 '0'으로 채워반환한다.
 * 속성 str : 문자열
 * @author 오명철 (omc97@hanmail.net)
 */
function setZero(str_value, int_length)
{
    var int_cnt = 0;

    for ( int_cnt = str_value.length; int_cnt < int_length; int_cnt++)
        str_value = "0" + str_value;

    return str_value;
}


var globalIndex='x';
var globalOutColor	='';			// mouse out color
var globalOverColor	='#E0FFFF';		// mouse over color
var globalClkColor	='#E0FFFF';		// mouse click color

/**
 * 마우스 오버시 리스트 배경색 변경
 * 속성 rowObj : row object
 * 속성 idx    : row index
 * @author 오명철 (omc97@hanmail.net)
 */
function contentOver(rowObj, idx)
{
	if (globalIndex != idx)
	{
		rowObj.style.backgroundColor = globalOverColor;
	}
}

/**
 * 마우스 아웃시 리스트 배경색 변경
 * 속성 rowObj : row object
 * 속성 idx    : row index
 * @author 오명철 (omc97@hanmail.net)
 */
function contentOut(rowObj, idx)
{
	if (globalIndex != idx)
	{
		rowObj.style.backgroundColor = globalOutColor;
	}
}

/**
 * 마우스 클릭시 리스트 배경색 변경
 * 속성 tableId : table id
 * 속성 idx     : row index
 * @author 오명철 (omc97@hanmail.net)
 */
function contentClick(tableId, idx) {

	try {
		try {
			if (globalIndex != 'x')
				{
				tableId.rows[globalIndex].style.backgroundColor = globalOutColor;
				}
		}catch(e) {}

		tableId.rows[idx].style.backgroundColor =globalClkColor;

		globalIndex = idx;
	}catch(e) {}
}

/**
 * 마우스 클릭시 리스트 배경색 변경
 * 속성 tableId : table id
 * 속성 idx     : row index
 * 속성 obj     : checkbox object
 * @author 오명철 (omc97@hanmail.net)
 */
function contentClick2(tableId, idx, obj) {

	if(obj == null)
	{
		tableId.rows[idx].style.backgroundColor = tableId.rows[idx].style.backgroundColor == globalClkColor ? globalOutColor : globalClkColor;
	}
	else
	{
		tableId.rows[idx].style.backgroundColor = obj.checked ? globalClkColor : globalOutColor;
	}
}

	/*******************************************************************
    * 불량단어 자동 체크
	*******************************************************************/
	/**
	 * 기 능      		: 불량단어 문자열 변경하기
	 * 설 명      	 	: 불량단어 문자열 변경하기
	 * @parameter : object
	 * @author    : 안재모 (grapi@naver.com)
	 */
	function isBadWordAlert(obj)
	{
	    var inputs = document.getElementsByTagName("input");
        var strValue = obj.value;

        badWord = new getBadWordChangeReturnStr( strValue, "★★★" );

        if( badWord.returnCnt > 0 ){
        	/*
	        	if (confirm("불량단어가 있습니다. 입력이 변경 됩니다. 확인(기본),취소(선택)")) {
	        		obj.value = badWord.changeStr;
	        		return;
	        	}else{
	        		return;
	        	}
        	*/
        	alert ( "불량단어가 있습니다. 입력 내용이 변경 됩니다.");
        	obj.value = badWord.changeStr;
        	return;
        }
	}
	/*******************************************************************
    * 불량단어 개수 와 변경 단어 넘겨주기
	*******************************************************************/
	/**
	 * 기 능      : 불량단어 개수 와 변경 단어 넘겨주기
	 * 설 명      : 문자열 변경하기
	 * @parameter : strValue  = 원문 , changStr: 변경할 문자.
	 * @return    : 불량 단어 갯수 리턴 / 원문에서 변경된 문자열을 변경하여  retrun 한다.
	 * @사용 예 	  :
	 *				badWord = new getBadWordChangeReturnStr( strValue, "***" );
	 *				badWord.returnCnt : 불량 단어 개수
	 *				badWord.changeStr : 불량단어를 *** 로 변경한 문자.
	 * @author    : 안재모 (grapi@naver.com)
	 */
	function getBadWordChangeReturnStr( strValue , changStr )
	{
	    var badBasicWord = "개새끼,소새끼,병신,지랄,씨팔,십팔,니기미,찌랄,지랄,쌍년,쌍놈,빙신,좆까,니기미,좆같은게,잡놈,벼엉신,바보새끼,씹새끼,씨발,씨팔,시벌,씨벌,떠그랄,좆밥,등신,미친놈,미친넘,찌랄,씨밸넘,쓰벌,쓰펄,미친년,개같은년,시발놈,시발넘,병신,븅신,븅딱,미친새끼,씨뱅이,씨부랄,씨박새끼,시방새,씨방새,씨박쉐이,개쉐이,씨봉새,옘병,존만아,쓰벌,븅신,썅년,니미럴,조사불라,쪼사뿔라,뷁,씹탱구리,script,iframe,expression,object,applet,embed,malicious.js";
	    var returnInt = 0;
		var badBasicWordArr;
		var badWordStr="";

		badBasicWordArr =  badBasicWord.split(',');
		for( var i = 0; i < badBasicWordArr.length ; i++){

		    if( strValue.indexOf(badBasicWordArr[i]) >  -1 ){
		    	strValue	= replaceStr(strValue,badBasicWordArr[i],changStr);
		    	badWordStr  += badBasicWordArr[i] + ",";
		        returnInt ++;
		    }
		}
		this.returnCnt = returnInt;
		this.changeStr = strValue;
		this.badWord = badWordStr;
		return this;
	}
	/**
	 * 기 능      : 문자열 변경하기
	 * 설 명      : 문자열 변경하기
	 * @parameter : str = 원문 , oldStr : 변경을 원하는 글자 , newStr: 변경할 문자.
	 * @return    : 원문에서 변경된 문자열을 변경하여  retrun 한다.
	 * @author    : 안재모 (grapi@naver.com)
	 */
	function replaceStr( str, oldStr, newStr )
	{
		var strValue = "";
		var old =new RegExp(oldStr,"g");
		strValue = str.replace(old, newStr );
		return strValue;
	}
	/**
	 * 기능 : Flash alert Inerface Funtion
	 * 설명 : 플래쉬 인터페이스 얼럿창 출력
	 * @parameter : str = 출력할 문자열
	 * return : 없음.
	 * author : 박형천 
	**/
	function flashMessage(str) {
		alert(str);
	}