﻿////////////////////////////////////////////////////////////////////////////////////////////
// AjaxHelper.js
// Ajax 사용을 도와주는 스크립트이다
////////////////////////////////////////////////////////////////////////////////////////////
var AjaxHelper = new Object();

// XMLHttpRequest의 상태를 정의한다
AjaxHelper.READY_STATE_UNINITIALIZE = 0;
AjaxHelper.READY_STATE_LOADING = 1;
AjaxHelper.READY_STATE_LOADED = 2;
AjaxHelper.READY_STATE_INTERACTIVE = 3;
AjaxHelper.READY_STATE_COMPLETE = 4;

// ContentLoader 생성자
AjaxHelper.ContentLoader = function(component, url, method, requestParams)
{
    this.component = component;     // 비동기적으로 서버와 통신해 가져온 컨텐츠를 처리할 함수를 가지고 있는 컴포넌트
    this.url = url;                 // 서버 URL
    this.method = method;           // 서버와 통신하는 방법 (GET 또는 POST)
    this.requestParams = requestParams; // URL과 합쳐질 파라메터
}

// ContentLoader 에 딸린 함수들의 정의
AjaxHelper.ContentLoader.prototype = {

    getXMLHttpRequest: function()
    {
        var xmlHttpRequest;     // XMLHttpRequest 객체의 포인터
        if(window.XMLHttpRequest)
        {
            xmlHttpRequest = new XMLHttpRequest(); // 브라우저 자체내 지원
        }
        else if(window.ActiveXObject) // 인터넷 익스플로어러
        {
            try
            {
                xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
            }
            catch(err)
            {
                xmlHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
            }
        }
        
        return xmlHttpRequest;
    },
    
    sendRequest: function()
    {
        var requestParams = [];
        for(var i = 0; i < arguments.length; i++)
        {   
            requestParams.push(arguments[i]);
        }
        
        var oThis = this; // 클로저 사용
        var request = this.getXMLHttpRequest(); // XMLHttpRequest의 포인터를 받아온다
       
        request.open(this.method, this.url, true);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        request.onreadystatechange = function() { oThis.handleAjaxResponse(request); };
        request.send(this.queryString(requestParams));
    },
    
    queryString: function(args)
    {
        var requestParams = [];
        for ( var i = 0; i < this.requestParams.length; i++)
        {
            requestParams.push(this.requestParams[i]);
        }
        for( var j = 0; j < args.length; j++)
        {
            requestParams.push(args[j]);
        }
        
        var queryString = "";
        if( requestParams && requestParams.length > 0)
        {
            for(var i = 0 ; i < requestParams.length ; i++)
            {
                queryString += requestParams[i] + '&';
            }
            queryString = queryString.substring(0,queryString.length-1);
        }
        
        return queryString;
    },
    
    handleAjaxResponse: function(request) 
    {
    
        if( request.readyState == AjaxHelper.READY_STATE_COMPLETE)
        {
            if(this.isSuccess(request))
            {
                
                this.component.ajaxUpdate(request); 
            }
            else
            {
                this.component.handleError(request);
            }
        }
    },
    
    isSuccess: function(request)
    {
        return request.status == 0 || (request.status >=200 && request.status < 300);
    }
    
};

// AjaxHelper.js 끝    