//##############################################################################
//# 프로그램ID : base.js
//# 페이지설명 : 모든 사이트 공통 스크립트
//# 최초작성자 : 김왕기
//# 최초작성일 : 2007.10.05 (금)
//# 최종수정자 : 김왕기
//# 최종수정일 : 2008.01.26 (토)
//#
//#
//# === 검증 관련 ==============================================================
//# ---> jsIsIE()                                       ===> 브라우저 CHECK
//# ---> jsIsEmpty(strText)                             ===> 공백문자열 CHECK
//#      jsIfEmpty(strText, strSub)
//# ---> jsIsDigit(strText)                             ===> 숫자 CHECK
//#      jsIfNotDigit(strText, strSub)
//# ---> jsIsEnglish(strText)                           ===> 영어 CHECK
//#      jsIfNotEnglish(strText, strSub)
//# ---> jsIsDigitEnglish(strText)                      ===> 숫자영어 CHECK
//#      jsIsDigitEnglishHangeul(strText, strSub)       ===> 숫자영어한글 CHECK
//# ---> jsIsHangeul(strText)                           ===> 한글 CHECK
//#      jsIfNotHangeul(strText, strSub)
//#
//# ---> jsIsEmail(strText)                             ===> 이메일 전체 체크
//#      jsIsEmail2(strText)                            ===> 이메일 아이디 체크
//#      jsIsEmail3(strText)                            ===> 이메일 도메인 체크
//#
//# ---> jsImgExtCheck(strText)                         ===> 이미지 확장자 CHECK
//#
//# === 문자열 관련 ============================================================
//# ---> jsTrimString(strText)                          ===> 좌우공백 제거
//# ---> jsParseProperty(strProps, strToken)            ===> 프로퍼티 파싱
//#
//#
//# === 폼 관련 ================================================================
//# ---> jsTrimElement(objEle)                          ===> 엘리먼트 값 좌우공백 제거
//# ---> jsTrimTextElements(objForm)                    ===> TEXT(TEXTAREA) 값 좌우공백 제거
//# ---> jsGetCheckedValues(objEle, strDilim)           ===> CHECKBOX(RADIO)의 선택값
//#
//#
//# === 엘리먼트 관련 ==========================================================
//# ---> jsGetElementsByClass(strCls, strTag, strPid)   ===> 클래스명으로 엘리먼트 검색
//# ---> jsIgnoreWhiteSpace(objEle)                     ===> 빈 텍스트노드 제거
//# ---> jsGetPositionX(objEle)                         ===> BODY를 기준으로 엘리먼트의 X좌표 계산
//# ---> jsGetPositionY(objEle)                         ===> BODY를 기준으로 엘리먼트의 Y좌표 계산
//# ---> jsOrderElementPrev(objEle)                     ===> 같은 부모내에서 이전 순서로 이동
//# ---> jsOrderElementNext(objEle)                     ===> 같은 부모내에서 다음 순서로 이동
//#
//#
//# === 컨텐츠 관련 ============================================================
//# ---> jsPopup(strUrl, strName, strProps)             ===> 팝업
//# ---> jsViewFlash(strUrl, strProps)                      ===> 플래시
//# ---> jsCreateLayer(strId, strSrc, blnIsFile)        ===> 레이어 생성
//#
//#
//# === 이벤트 관련 ============================================================
//# ----> jsAttachEvent(strEvent, objFunc)              ===> 윈도우 이벤트 추가
//#
//#
//# === 이메일 체크  ===========================================================
//#
//#
//# === AJAX 관련 ==============================================================
//# ---> jsCreateXMLHTTP()                              ===> XMLHTTP 객체 생성
//# ---> jsGetSource(strUrl)                            ===> 파일 내용 추출
//# ---> jsIncludeFile(strUrl, strId)                       ===> 파일 인클루드
//##############################################################################
//



//==============================================================================
// 정규식 정의
//==============================================================================
var JS_CONST_REGEXP_DIGIT   = /^[0-9]+$/;
var JS_CONST_REGEXP_ENGLISH = /^[a-zA-Z]+$/;
var JS_CONST_REGEXP_HANGEUL = /^[ㄱ-ㅎ가-힣]+$/;
var JS_CONST_REGEXP_TRIM    = /(^[\s]*)|([\s]*$)/g;
var JS_CONST_REGEXP_DIGIT_ENGLISH = /^[0-9a-zA-Z]+$/;
var JS_CONST_REGEXP_DIGIT_ENGLISH_HANGEUL = /^[0-9a-zA-Zㄱ-ㅎ가-힣]+$/;
var JS_CONST_REGEXP_email1 = /^[a-zA-Z0-9\-\.\_]+$/;
var JS_CONST_REGEXP_email2 = /^[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4})+$/;


//==============================================================================
// 검증 관련
//==============================================================================
//------------------------------------------------------------------------------
// 브라우저 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsIE()
 * @return
 *      브라우저가 IE인지의 논리값
 * @description
 *      불완전... 나중에 로직 추가...
 */
function jsIsIE() {
    return (navigator.userAgent.toUpperCase().indexOf("MSIE") != -1);
}


//------------------------------------------------------------------------------
// 공백문자열 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsEmpty(strText)
 * @param
 *      strText 문자열
 * @return
 *      공백문자열인지의 논리값
 */
function jsIsEmpty(strText) {
    if (strText != null) {
        return (strText.toString().replace(JS_CONST_REGEXP_TRIM, "").length == 0);
    }
    else {
        return true;
    }
}

/***
 * @function
 *      jsIfEmpty(strText, strSub)
 * @used
 *      jsIsEmpty(strText)
 * @param
 *      strText 검증문자열
 *      strSub  대체문자열
 * @return
 *      공백문자열 여부에 따른 검증문자열 또는 대체문자열
 */
function jsIfEmpty(strText, strSub) {
    return (jsIsEmpty(strText) ? strSub : strText);
}


//------------------------------------------------------------------------------
// 숫자 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsDigit(strText)
 * @param
 *      strText 문자열
 * @return
 *      숫자인지의 논리값
 */
function jsIsDigit(strText) {
    return (strText != null) && (JS_CONST_REGEXP_DIGIT.test(strText));
}

/***
 * @function
 *      jsIfNotDigit(strText, strSub)
 * @used
 *      jsIsDigit(strText)
 * @param
 *      strText 검증문자열
 *      strSub  대체문자열
 * @return
 *      숫자인지의 여부에 따른 검증문자열 또는 대체문자열
 */
function jsIfNotDigit(strText, strSub) {
    return (jsIsDigit(strText) ? strText : strSub);
}


//------------------------------------------------------------------------------
// 영어 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsEnglish(strText)
 * @param
 *      strText 문자열
 * @return
 *      영문자인지의 논리값
 */
function jsIsEnglish(strText) {
    return (strText != null) && (JS_CONST_REGEXP_ENGLISH.test(strText));
}

//------------------------------------------------------------------------------
// 숫자 + 영어 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsDigitEnglish(strText)
 * @param
 *      strText 문자열
 * @return
 *      영문자인지의 논리값
 */
function jsIsDigitEnglish(strText) {
    return (strText != null) && (JS_CONST_REGEXP_DIGIT_ENGLISH.test(strText));
}


//------------------------------------------------------------------------------
// 숫자 + 영어 + 한글 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsDigitEnglish(strText)
 * @param
 *      strText 문자열
 * @return
 *      영문자인지의 논리값
 */
function jsIsDigitEnglishHangeul(strText) {
    return (strText != null) && (JS_CONST_REGEXP_DIGIT_ENGLISH_HANGEUL.test(strText));
}


/***
 * @function
 *      jsIfNotEnglish(strText, strSub)
 * @used
 *      jsIsEnglish(strText)
 * @param
 *      strText 검증문자열
 *      strSub  대체문자열
 * @return
 *      영문자인지의 여부에 따른 검증문자열 또는 대체문자열
 */
function jsIfNotEnglish(strText, strSub) {
    return (jsIsEnglish(strText) ? strText : strSub);
}


//------------------------------------------------------------------------------
// 한글 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsHangeul(strText)
 * @param
 *      strText 문자열
 * @return
 *      한글인지의 논리값
 */
function jsIsHangeul(strText) {
    return (strText != null) && (JS_CONST_REGEXP_HANGEUL.test(strText));
}

/***
 * @function
 *      jsIfNotHangeul(strText, strSub)
 * @used
 *      jsIsHangeul(strText)
 * @param
 *      strText 검증문자열
 *      strSub  대체문자열
 * @return
 *      한글인지의 여부에 따른 검증문자열 또는 대체문자열
 */
function jsIfNotHangeul(strText, strSub) {
    return (jsIsHangeul(strText) ? strText : strSub);
}

//------------------------------------------------------------------------------
// 이메일 아이디 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsEmail2(strText)
 * @param
 *      strText 문자열
 * @return
 *      영문숫자하이픈의 논리값
 */
function jsIsEmail2(strText)  {
    return (strText != null) && (JS_CONST_REGEXP_email1.test(strText));
}

//------------------------------------------------------------------------------
// 이메일 도메인 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsEmail3(strText)
 * @param
 *      strText 문자열
 * @return
 *      영문숫자하이픈의 논리값
 */
function jsIsEmail3(strText)  {
    return (strText != null) && (JS_CONST_REGEXP_email2.test(strText));
}

//------------------------------------------------------------------------------
// 이메일 형식 CHECK
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIsEmail(strText)
 * @param
 *      strText 문자열
 * @return
 *      이메일 합당한 논리값
 */
function jsIsEmail(strText) {
    emailEx1 = /[^@]+@[A-Za-z0-9_-]+.[A-Za-z]+/;
    emailEx2 = /[^@]+@[A-Za-z0-9_-]+.[A-Za-z0-9_-]+.[A-Za-z]+/;
    emailEx3 = /[^@]+@[A-Za-z0-9_-]+.[A-Za-z0-9_-]+.[A-Za-z0-9_-]+.[A-Za-z]+/;

    if(emailEx1.test(strText)) return true;
    if(emailEx2.test(strText)) return true;
    if(emailEx3.test(strText)) return true;

    return false;
}


//==============================================================================
// 문자열 관련
//==============================================================================
//------------------------------------------------------------------------------
// 좌우공백 제거
//------------------------------------------------------------------------------
/***
 * @function
 *      jsTrimString(strText)
 * @param
 *      strText 문자열
 * @return
 *      좌우공백이 제거된 문자열
 */
function jsTrimString(strText) {
    return (strText == null ? null : strText.replace(JS_CONST_REGEXP_TRIM, ""));
}


//------------------------------------------------------------------------------
// 프로퍼티 파싱
//------------------------------------------------------------------------------
/***
 * @function
 *      jsParseProperty(strProps, strToken)
 * @used
 *      jsIsEmpty(strText)
 * @param
 *      strProps 프로퍼티형식 문자열
 *      strToken 구분자
 * @return
 *      키와 값으로 이루어진 다차원 배열변수
 * @description
 *      strProps의 형식은 "key=value"와 같이 작성하며 strToken은 ","가 디폴트
 *
 *      ex) test = jsParseProperty("width=100&height=200&top=50", "&")
 *          test.get("width",  10)  ==> 100
 *          test.get("height", 30)  ==> 200
 *          test.get("top",    0)   ==> 50
 *          test.get("left",   300) ==> 300
 */
function jsParseProperty(strProps, strToken) {
    var aryList  = new Array();

    if (jsIsEmpty(strProps) == false) {
        var aryItems = strProps.replace(/[\s]/g, "").split(strToken == null ? "," : strToken);
        var intCnt   = 0;

        for (var i=0; i < aryItems.length; i++) {
            if (aryItems[i].indexOf("=") > 0) {
                var aryTemp = aryItems[i].split("=");

                if (jsIsEmpty(aryTemp[0]) == false) {
                    aryList[intCnt] = new Array(aryTemp[0], aryTemp[1]);
                    intCnt = intCnt + 1;
                }
            }
        }
    }

    aryList.get = function(strKey, strSub) {
        for (var i=0; i < this.length; i++) {
            if (this[i][0] == strKey) return this[i][1];
        }

        return strSub;
    }

    return aryList;
}


//==============================================================================
// 폼 관련
//==============================================================================
//------------------------------------------------------------------------------
// 엘리먼트 값 좌우공백 제거
//------------------------------------------------------------------------------
/***
 * @function
 *      jsTrimElement(objEle)
 * @used
 *      jsTrimString(strText)
 * @param
 *      objEle 엘리먼트
 * @return
 *      좌우공백이 제거된 엘리먼트의 값
 */


function jsTrimElement(objEle) {
    objEle.value = jsTrimString(objEle.value);
    return objEle.value;

}


//------------------------------------------------------------------------------
// TEXT(TEXTAREA) 엘리먼트 값 좌우공백 제거
//------------------------------------------------------------------------------
/***
 * @function
 *      jsTrimTextElements(objForm)
 * @used
 *      jsTrimElement(objEle)
 * @param
 *      objForm 엘리먼트의 부모폼
 */
function jsTrimTextElements(objForm) {
    for (var i=0; i < objForm.elements.length; i++) {
        if ((objForm.elements[i].type == "text") || (objForm.elements[i].type == "textarea")) {
            jsTrimElement(objForm.elements[i]);
        }
    }
}


//------------------------------------------------------------------------------
// CHECKBOX(RADIO)의 선택값
//------------------------------------------------------------------------------
/***
 * @function
 *      jsGetCheckedValues(objEle, strDilim)
 * @param
 *      objEle   엘리먼트
 *      strDilim 구분자
 */
function jsGetCheckedValues(objEle, strDilim) {
    var strValues = "";

    if (strDilim == null) strDilim = ",";

    if (objEle.length) {
        for (var i=0; i < objEle.length; i++) {
            if (objEle[i].checked) strValues = strValues + strDilim + objEle[i].value;
        }
    }
    else {
        if (objEle.checked) strValues = objEle.value;
    }

    return strValues.replace(new RegExp("^[" + strDilim + "]"), "");
}


//==============================================================================
// 엘리먼트 관련
//==============================================================================
//------------------------------------------------------------------------------
// 클래스명으로 엘리먼트 검색
//------------------------------------------------------------------------------
/***
 * @function
 *      jsGetElementsByClass(strCls, strTag, strPid)
 * @param
 *      strCls 클래스명
 *      strTag 태그명
 *      strPid 부모ID
 * @return
 *      검색된 엘리먼트가 저장된 배열변수
 */
function jsGetElementsByClass(strCls, strTag, strPid) {
    var aryList   = new Array();
    var objParent = document.getElementById(strPid);
    var aryEles   = (objParent == null ? document : objParent).getElementsByTagName(strTag == null ? "*" : strTag);
    var intCnt    = 0;

    for (var i=0; i < aryEles.length; i++) {
        if (aryEles[i].className.match(strCls)) {
            aryList[intCnt] = aryEles[i];
            intCnt = intCnt + 1;
        }
    }

    return aryList;
}


//------------------------------------------------------------------------------
// 빈 텍스트노드 제거
//------------------------------------------------------------------------------
/***
 * @function
 *      jsIgnoreWhiteSpace(objEle)
 * @used
 *      jsIsEmpty(strText)
 * @param
 *      objEle 엘리먼트
 */
function jsIgnoreWhiteSpace(objEle) {
    for (var i=0; i < objEle.childNodes.length; i++) {
        var objNode = objEle.childNodes[i];

        if ((objNode.nodeType == 3) && (jsIsEmpty(objNode.nodeValue))) {
            objEle.removeChild(objNode);
            i = i - 1;
        }
        else {
            jsIgnoreWhiteSpace(objNode);
        }
    }
}


//------------------------------------------------------------------------------
// BODY를 기준으로 엘리먼트의 X좌표 계산
//------------------------------------------------------------------------------
/***
 * @function
 *      jsGetPositionX(objEle)
 * @param
 *      objEle 엘리먼트
 * @return
 *      엘리먼트의 X좌표
 */
function jsGetPositionX(objEle) {
    var intX = 0;

    do {
        intX += objEle.offsetLeft;
        objEle = objEle.offsetParent;
    }
    while (objEle != document.body);

    return intX;
}


//------------------------------------------------------------------------------
// BODY를 기준으로 엘리먼트의 Y좌표 계산
//------------------------------------------------------------------------------
/***
 * @function
 *      jsGetPositionY(objEle)
 * @param
 *      objEle 엘리먼트
 * @return
 *      엘리먼트의 Y좌표
 */
function jsGetPositionY(objEle) {
    var intY = 0;

    do {
        intY += objEle.offsetTop;
        objEle = objEle.offsetParent;
    }
    while (objEle != document.body);

    return intY;
}


//------------------------------------------------------------------------------
// 같은 부모내에서 이전 순서로 이동
//------------------------------------------------------------------------------
/***
 * @function
 *      jsOrderElementPrev(objEle)
 * @param
 *      objEle 엘리먼트
 * @description
 *      부모엘리먼트가 같은 엘리먼트간의 순서 조정
 */
function jsOrderElementPrev(objEle) {
    var objParent = objEle.parentNode;
    var objPrev   = objEle.previousSibling;

    while (objPrev != null) {
        if ((objPrev.nodeType == 1) && (objPrev.style.display != "none")) {
            break;
        }
        else {
            objPrev = objPrev.previousSibling;
        }
    }

    if (objPrev != null) {
        objParent.removeChild(objEle);
        objParent.insertBefore(objEle, objPrev);
    }
}


//------------------------------------------------------------------------------
// 같은 부모내에서 다음 순서로 이동
//------------------------------------------------------------------------------
/***
 * @function
 *      jsOrderElementNext(objEle)
 * @used
 *      jsIsObject(objEle)
 * @param
 *      objEle 엘리먼트
 * @description
 *      부모엘리먼트가 같은 엘리먼트간의 순서 조정
 */
function jsOrderElementNext(objEle) {
    var objParent = objEle.parentNode;
    var objNext   = objEle.nextSibling;

    while (objNext != null) {
        if ((objNext.nodeType == 1) && (objNext.style.display != "none")) {
            break;
        }
        else {
            objNext = objNext.nextSibling;
        }
    }

    if (objNext != null) {
        objParent.removeChild(objEle);

        if (objNext.nextSibling == null) {
            objParent.appendChild(objEle);
        }
        else {
            objParent.insertBefore(objEle, objNext.nextSibling);
        }
    }
}


//==============================================================================
// 컨텐츠 관련
//==============================================================================
//------------------------------------------------------------------------------
// 팝업
//------------------------------------------------------------------------------
/***
 * @function
 *     jsPopup(strUrl, strName, strProps)
 * @use
 *     jsParseProperty(strProps, strToken)
 * @param
 *     strUrl   파일경로
 *     strName  윈도우 이름
 *     strProps 프로퍼티형식 문자열
 * @description
 *     strProps의 형태는 "width=100, height=100" 과 같이 작성한다.
 *     - top         위치 Y          (0)
 *     - left        위치 X          (200)
 *     - width       넓이            (0)
 *     - height      높이            (0)
 *     - titlebar    타이틀바 유무   (no)
 *     - toolbar     툴바 유무       (no)
 *     - menubar     메뉴바 유무     (no)
 *     - location    주소창 유무     (no)
 *     - status      상태창 유무     (no)
 *     - resizable   사이즈조정 유무 (no)
 *     - scrollbars  스크롤바 유무   (yes)
 *     - copthistory 히스토리 저장   (no)
 */
function jsPopup(strUrl, strName, strProps) {
    var aryPropList = jsParseProperty(strProps, ",");
    var strParam    = "";

    strParam += "top="         + aryPropList.get("top",         "0")   + ", ";
    strParam += "left="        + aryPropList.get("left",        "200") + ", ";
    strParam += "width="       + aryPropList.get("width",       "0")   + ", ";
    strParam += "height="      + aryPropList.get("height",      "0")   + ", ";
    strParam += "titlebar="    + aryPropList.get("titlebar",    "no")  + ", ";
    strParam += "toolbar="     + aryPropList.get("toolbar",     "no")  + ", ";
    strParam += "menubar="     + aryPropList.get("menubar",     "no")  + ", ";
    strParam += "location="    + aryPropList.get("location",    "no")  + ", ";
    strParam += "status="      + aryPropList.get("status",      "no")  + ", ";
    strParam += "resizable="   + aryPropList.get("resizable",   "no")  + ", ";
    strParam += "scrollbars="  + aryPropList.get("scrollbars",  "no")  + ", ";
    strParam += "copyhistory=" + aryPropList.get("copyhistory", "no")  + "  ";

    window.open(strUrl, strName, strParam);

    return strName;
}


//------------------------------------------------------------------------------
// 플래시
//------------------------------------------------------------------------------
/***
 * @function
 *     jsViewFlash(strUrl, strProps)
 * @use
 *     jsIsIE()
 *     jsParseProperty(strProps, strToken)
 * @param
 *     strUrl   파일경로
 *     strProps 프로퍼티형식 문자열
 * @description
 *     strProps의 형태는 "width=100, height=100, align=middle" 과 같이 작성한다.
 *     - width   넓이       (100%)
 *     - height  높이       (100%)
 *     - align   정렬       (middle)
 *     - quality 화질       (high)
 *     - bgcolor 백그라운드 (#FFFFFF)
 *     - wmode   투명도     (window)
 */
function jsViewFlash(strUrl, strProps) {
    var aryPropList = jsParseProperty(strProps, ",");
    var strHtml     = "";
    var strType     = "";

    if (jsIsIE()) {
         strType = "classid='clsid:D27CDB6E-AE6D-11CF-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0'";
    }
    else {
         strType = "type='application/x-shockwave-flash'";
    }

    strHtml += "<object " + strType + " data='" + strUrl + "' width='" + aryPropList.get("width", "100%") + "' height='" + aryPropList.get("height", "100%") + "' align='" + aryPropList.get("align", "middle") + "'>" + "\n";
    strHtml += "    <param name='movie'             value='" + strUrl                                + "'>" + "\n";
    strHtml += "    <param name='quality'           value='" + aryPropList.get("quality", "high")    + "'>" + "\n";
    strHtml += "    <param name='bgcolor'           value='" + aryPropList.get("bgcolor", "#FFFFFF") + "'>" + "\n";
    strHtml += "    <param name='wmode'             value='" + aryPropList.get("wmode"  , "window")  + "'>" + "\n";
    strHtml += "    <param name='allowScriptAccess' value='always'>                                       " + "\n";
    strHtml += "</object>                                                                                 " + "\n";

    document.write(strHtml);
}


//------------------------------------------------------------------------------
// 레이어 생성
//------------------------------------------------------------------------------
/***
 * @function
 *     jsCreateLayer(strID, strSrc, blnIsFile)
 * @param
 *     strId     엘리먼트 ID
 *     strSrc    컨텐츠 소스
 *     blnIsFile 컨텐츠(파일/텍스트) 판단 논리값
 * @return
 *     레이어(IFrame) 엘리먼트
 * @description
 *     select와 겹치는 문제때문에 IFrame으로 레이어를 구성
 */
function jsCreateLayer(strId, strSrc, blnIsFile) {
    var objLayer = document.getElementById(strId);

    if (objLayer == null) {
        objLayer = document.createElement("iframe");

        objLayer.id             = strId;
        objLayer.frameBorder    = 0;
        objLayer.style.display  = "none";
        objLayer.style.position = "absolute";

        document.body.appendChild(objLayer);

        if (blnIsFile) {
            objLayer.src = strSrc;
        }
        else {
            objLayer.contentWindow.document.open();
            objLayer.contentWindow.document.write(strSrc);
            objLayer.contentWindow.document.close();
        }
    }

    return objLayer;
}


//==============================================================================
// 이벤트 관련
//==============================================================================
//------------------------------------------------------------------------------
// 윈도우 이벤트 추가
//------------------------------------------------------------------------------
/***
 * @function
 *     jsAttachEvent(strEvent, objFunc)
 * @param
 *     strEvent 이벤트명
 *     objFunc  실행함수
 */
function jsAttachEvent(strEvent, objFunc) {
    if (/^on/i.test(strEvent)) strEvent = strEvent.substring(2);

    if (window.addEventListener) {
        window.addEventListener(strEvent, objFunc, false);
    }
    else {
        window.attachEvent("on" + strEvent, objFunc);
    }
}


//==============================================================================
// AJAX 관련
//==============================================================================
//------------------------------------------------------------------------------
// XMLHTTP 객체 생성
//------------------------------------------------------------------------------
/***
 * @function
 *     jsCreateXMLHTTP()
 * @return
 *     XMLHTTP 객체
 * @description
 *     테스트용으로만 사용하고, 실 새발시에는 사용하지 않는다.
 */
function jsCreateXMLHTTP() {
    var objReq = false;

    if (window.XMLHttpRequest) {
        try {
            objReq = new XMLHttpRequest();
        }
        catch (e) {
            objReq = false;
        }
    }
    else if (window.ActiveXObject) {
        try {
            objReq = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                objReq = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                objReq = false;
            }
        }
    }

    return objReq;
}


//------------------------------------------------------------------------------
// 파일 내용 추출
//------------------------------------------------------------------------------
/***
 * @function
 *     jsGetSource(strUrl)
 * @use
 *     jsIsIE()
 *     jsCreateXMLHTTP()
 * @param
 *     i_url 파일경로
 * @return
 *     XML객체 또는 파일의 내용
 * @description
 *     대상 파일의 형식이 UTF-8 형식이어야 정상적으로 작동
 *     테스트용으로만 사용하고, 실 개발시에는 사용하지 않는다.
 * @TODO
 *     onreadystatechange 구현
 */
function jsGetSource(strUrl) {
    var objSrc = null;
    var objReq = jsCreateXMLHTTP();
    var strExt = strUrl.substring(strUrl.lastIndexOf(".") + 1).toLowerCase();

    try {
        objReq.open("Get", strUrl, false);
        objReq.send(null);

        switch (strExt) {
            case "xml":
                objSrc = objReq.responseXML;

                if ((objSrc.hasChildNodes == false) && jsIsIE()) {
                    objSrc = new ActiveXObject("Microsoft.XMLDOM");
                    objSrc.load(strUrl);
                }
                break;

            default:
                objSrc = objReq.responseText;
        }
    }
    catch (e) {
        objSrc = "<strong style='color:#FF0000;'>Get_Source::" + e.message + "</strong>";
    }

    return objSrc;
}


//------------------------------------------------------------------------------
// 파일 인클루드
//------------------------------------------------------------------------------
/***
 * @function
 *     jsIncludeFile(strUrl, strId)
 * @use
 *     jsGetSource(strUrl)
 * @param
 *     strUrl 파일경로
 *     strId  엘리먼트 ID
 * @description
 *     대상 파일의 형식이 UTF-8 형식이어야 정상적으로 작동
 *     테스트용으로만 사용하고, 실 개발시에는 사용하지 않는다.
 */
function jsIncludeFile(strUrl, strId) {
    var strSrc = jsGetSource(strUrl);
    var objEle = document.getElementById(strId);

    if (objEle) {
        objEle.innerHTML = strSrc;
    }
    else {
        document.write(strSrc);
    }
}

function jsFileCheck(obj) {

    // 선택파일의 경로를 분리하여 확장자를 구합니다.
    PathPoint = obj.lastIndexOf('.');
    FilePoint = obj.substring(PathPoint+1,obj.length);
    ext = FilePoint.toLowerCase();

    // 확장자가 이미지 파일이면 photo에 보여줍니다.
    if((ext == 'zip') || (ext == 'jpg') || (ext == 'gif') || (ext == 'txt') || (ext == 'doc') || (ext == 'pdf') || (ext == 'hwp') || (ext == 'xls') || (ext == 'ppt') || (ext == 'pptx') || (ext == 'xlsx'))
        return true;
    else
    {
        alert("문서 및 이미지 파일만 업로드 가능합니다.");
        return false;
    }
}

function jsImgExtCheck(strText) {
    // 선택파일의 경로를 분리하여 확장자를 구합니다.
    PathPoint = strText.lastIndexOf('.');
    FilePoint = strText.substring(PathPoint+1,strText.length);
    ext = FilePoint.toLowerCase();

    // 확장자가 이미지 파일이면 photo에 보여줍니다.
    if((ext == 'jpg') || (ext == 'gif'))
        return true;
    else
        return false;
}