﻿<!----------------------------------------------------------------------------!> 
<!-- 함 수 명	: funcGetXMLHttpRequest()                                   --!> 
<!-- 설 명      : XMLHTTP 생성                                              --!> 
<!-- 전달인수	:                                                           --!> 
<!-- 반 환 값	: 정상 - xmlhttp                                            --!> 
<!--              오류 - null                                               --!> 
<!--                                                                        --!> 
<!-- 자바스크립트의 버전을 확인하고 Msxml2.XMLHTTP -> Microsoft.XMLHTTP ->  --!> 
<!-- new XMLHttpRequest()의 과정을 거지면서 브라우저별 객체를 생성하고 있다.--!> 
<!-- 앞의 2단계는 익스플로러의 경우이면 마치막 객체의 생성은 모질라 및      --!> 
<!-- 사파리를 위한 코드이다. 만약 MSXML4.0을 사용한다면 Msxml2.XMLHTTP.     --!> 
<!-- 4.0을 이용해서 생성해야 한다.                                          --!> 
<!-- 익스플로러와 불여우에서 시험해본결과 불여우에서는 @_jscript_version을  --!> 
<!-- 확인하지 못하는 듯 하다. Jscrpt는 마이크로소프트사에서 제공해주고 있는 --!> 
<!-- 듯 하다. 또한 두 브라우저에서 JavaScript의 버전은 1.3으로 동일하게     --!> 
<!-- 나타났다. 코드는 ms사에서 제공해주는 브라우저는 @_jscript_version값을  --!> 
<!-- 이용해서 객체를 생성하고 불여우의 경우 변수값을 가지고 있지 않음으로   --!> 
<!-- new XMLHttpRequest()를 이용해서 객체를 생성한다.                       --!> 
<!-- MSXML4.0사용자를 위해서는 Try{}catch{}문은 위쪽에 추가하여 객체를      --!> 
<!-- 생성할 수 있다.                                                        --!> 
<!----------------------------------------------------------------------------!>
function funcGetXMLHttpRequest() 
{
    var xmlhttp;
    
    if (window.ActiveXObject)
    {  // IE
        try 
        {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) 
        {
            try 
            {
                xmlhttp =  new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (E) 
            {               
                xmlhttp =  false;
            }
        }
    }
    else if(window.XMLHttpRequest) 
    {  // IE 이외(Firefox, Opera8 등)

        try 
        {
            xmlhttp = new XMLHttpRequest();
        } 
        catch (e) 
        {
            xmlhttp = false;
        }
    }
    else
    {
        xmlhttp = false;
    }
    
    if (!xmlhttp) 
    {
        funcErrorMessage("지원할 수 없는 브라우저입니다.");   //XMLHttpRequest 생성 실패
    }
  
    return xmlhttp;
}

<!----------------------------------------------------------------------------!> 
<!-- 함 수 명	: funcGetDataByXMLHttpRequest()                             --!> 
<!-- 설 명      :                                                           --!> 
<!-- 전달인수	: strURL -  데이터를 받아올 주소                            --!> 
<!--            : strResultFunc -  서버로 부터 받아온 결과를 처리할 함수    --!> 
<!--            : strRcvData -  가공된 데이터를 표시할 object               --!> 
<!--            : strSubmit - 서버로 전송할 데이터                          --!> 
<!--            : strMovementFunc - 서버로 부터 진행중일때 처리할 함수      --!> 
<!--            : strAsync -  false, true                                   --!> 
<!-- 반 환 값	: 정상 -                                                    --!> 
<!--              오류 - null                                               --!> 
<!--                                                                        --!> 
<!-- 이 함수를 재사용할 수 있는 일반 함수로 만들기 위해 세 개의 매개변수를  --!>
<!-- 사용한다. 서버에서 처리중인 페이지에 대한 URL, 데이터를 전송하기       --!>
<!-- 위해 쿼리 스트링 형식으로 저장된 데이터, 서버로부터의 응답을 처리하기  --!>
<!-- 위한 자바스크립트 함수의 이름(나중에 eval을 사용해서 호출된다)을       --!>
<!-- 매개변수로 사용한다                                                    --!> 
<!----------------------------------------------------------------------------!>
function funcGetDataByXMLHttpRequest(jsPSDivInfo) 
{
    var xmlHttpReq = funcGetXMLHttpRequest();
    var strURL = jsPSDivInfo.JsonUrl + jsPSDivInfo.Param;
    var strResultFunc = jsPSDivInfo.SetFunc;
    var strRcvData = jsPSDivInfo.DisplayDiv;
    var strSubmit = jsPSDivInfo.SubmitData;
    var strMovementFunc = jsPSDivInfo.MovementFunc;
    var strAsync = jsPSDivInfo.Async;
    var strCallBackFunc = "";
    var boolCallBackFlg = true;

    try
    {
        if(xmlHttpReq)
        {
            if(strSubmit == "")
            {
                strSubmit = null;
            }
           
            if(strURL.indexOf("?") > 0)
            {
                strURL = strURL + "&timeStamp=" + new Date().getTime();
            }
            else
            {
                strURL = strURL + "?timeStamp=" + new Date().getTime();
            }
            
            if(strAsync == "")
            {
                xmlHttpReq.open(strSubmit?"POST":"GET", strURL, true);
            }
            else
            {
                xmlHttpReq.open(strSubmit?"POST":"GET", strURL, strAsync);
            }
            
            xmlHttpReq.onreadystatechange = function() 
            {
                try
                {
/*
                    if (xmlHttpReq.readyState == 3)//서버 처리중
    	            {

    	                if(strMovementFunc == null)
    	                {
    	                    funcDefaultMovement(strRcvData);
    	                }
    	                else
    	                {
    	                    eval(strMovementFunc + '(strRcvData)'); //진행중일때 처리 
                        }

                    }                                            
                    else 
*/                    
                    if (xmlHttpReq.readyState == 4)//서버 처리 완료 
    	            {                                            
                        if (xmlHttpReq.status == 200)    //파일 수신 성공 
                        {
                            if(boolCallBackFlg)
                            {
                                boolCallBackFlg = false;
                                eval(strResultFunc + '(xmlHttpReq, jsPSDivInfo)');//callback 함수 
                            }
                        }
                        else 
                        {
                            funcXmlHttpReqExceptionControl(xmlHttpReq, strRcvData);    //예외 처리 
                        }
                    }
                } 
                catch (err) 
                {
                    funcErrorMessage("It does not appear that the server is available for this application. Please"+" try again very soon. \nError: "+err.message);
                }
            }

            //xmlHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") 
        
            xmlHttpReq.send(strSubmit); //send()를 onreadystatechange보다 먼저 작성하면 가끔 ‘서버 파일 수신’ 버튼을 두 번 클릭해야 실행되는 경우가 있다. 특히, 애플리케이션을 처음 개발하여 실행하는 경우에 발생 빈도가 높다. 그렇다고 매번 발생하는 것은 아니다. 하지만, send() 메소드를 뒷부분에 작성하면 이러한 문제가 발생하지 않는다.
        }
    } 
    catch (errv) 
    {
        funcErrorMessage("The application cannot contact the server at the moment. "+ "Please try again in a few seconds." );
//      alert("IE의 인터넷 옵션 중 보안설정에서 도메인간 데이터 소스 엑세스를 '사용함'으로 설정해 주세요"); 
//		alert(errv + "|" + errv.name + "|" + errv.message + "|" + errv.number + "|" + errv.description); 
    }
}

<!----------------------------------------------------------------------------!>
<!-- 함 수 명	: funcDefaultMovement()                                     --!>
<!-- 설 명      :                                                           --!>
<!-- 전달인수	:                                                           --!>
<!-- 반 환 값	: 정상 -                                                    --!>
<!--              오류 -                                                    --!>
<!--                                                                        --!>
<!----------------------------------------------------------------------------!>
function funcDefaultMovement(strRcvData)
{
    funcGetElementById(strRcvData).innerHTML = "처리중!!!";
}

<!----------------------------------------------------------------------------!>
<!-- 함 수 명	: funcXmlHttpReqExceptionControl()                          --!>
<!-- 설 명      :                                                           --!>
<!-- 전달인수	:                                                           --!>
<!-- 반 환 값	: 정상 -                                                    --!>
<!--              오류 -                                                    --!>
<!--                                                                        --!>
<!----------------------------------------------------------------------------!>
function funcXmlHttpReqExceptionControl(xmlHttp, strRcvData)
{
    var strExceptShow = "상태 코드: " + xmlHttp.status;
    strExceptShow += ",  비정상으로 종료되었습니다.";
    funcGetElementById(strRcvData).innerHTML = strExceptShow;
}


