﻿/* prototype Ajax <--> Ajax.ASP.NET Ajax 연결 */
if(!Ajax){
    var Ajax = {}
    
    Ajax.Request = function(url, paramSet) {
        this._name='Ajax.Request'; 

		var method = 'GET';
		if(typeof(paramSet.method)=='string')
		    method = paramSet.method.toUpperCase();
		
		var parameters = '';
		if(typeof(paramSet.parameters)=='string')
		    parameters = paramSet.parameters;
    
        var onCompleted = function (executor, eventArgs) 
        {
            var isSucc = false;
            var responseData = '';
            
            try{
                isSucc = executor.get_responseAvailable();
                responseData = executor.get_responseData();
                
                if (executor.get_statusCode()!=200){
                    isSucc = false;
                }
            } catch(ex){
                // window.stop();
                executor.abort();
                responseData = '';
                isSucc = false;
            }
            
            if( typeof(responseData)=='undefined' || responseData == ''){
                responseData = "''";
            }  
                            
            if(isSucc) 
            {
                if(typeof(paramSet.onSuccess)=='function') {
                    var obj = {'responseText': responseData};
                    paramSet.onSuccess(obj)
                }
            }
            else
            {
                if(typeof(paramSet.onFailure)=='function') {
                    var errMsg = responseData;
                    
                    if( typeof(errMsg)=='undefined' || errMsg == ''){
                        if (executor.get_timedOut()) {
                            errMsg = "'제한시간이 만료되었습니다.'";
                        } else if (executor.get_aborted()) {
                            errMsg = "'사용자에의해 취소되었습니다.'";
                        } else {
                            errMsg == "''";
                        }                                 
                    }
                    
                    var obj = {'responseText': errMsg};                
                    paramSet.onFailure(obj)
                }
            }    
        }
        
        this._req = new Sys.Net.WebRequest();
        this._req.set_httpVerb(method);
        
        if(method=="GET") {
            url = url + '?' + parameters;
        } else if(method=="POST") {
            this._req.set_body(parameters);
        } else {
            alert('지원하지 않는 method방식입니다.');
        }
        
        this._req.set_url(url);
		this._req.add_completed(onCompleted);
        this._req.set_timeout(10000); // 10초에 시간제한만료
        this._req.invoke();
        return this._req;
    }
    
    Ajax.Updater = function(placeHolderName, url, paramSet) {
        var tmpOnSuccess = '';
        
        if(typeof(paramSet.onSuccess)=='function') {
            tmpOnSuccess = paramSet.onSuccess
        }

        paramSet.onSuccess = function(obj){
            var o = document.getElementById(placeHolderName);

            try {
               if(typeof(o)!='undefined') {
                   o.innerHTML = obj.responseText;
               }
            } catch(ex) {
            
            }         
                  
            if(typeof(tmpOnSuccess)=='function')
                tmpOnSuccess(obj);
        }

        
        this._req = new Ajax.Request(url, paramSet);
    }
}
function $H(dic){
    var res = '';
    for(var i in dic){
        if(typeof(dic[i])=='function') continue;
        
        res = '&' + i + '=' + encodeURIComponent(dic[i]) + res;
    }
    return {
        toQueryString : function(){
            return res.substring(1);
        }
    }
}
/* ######### */

 var Alajax = (new function(){
	
	if(!Ajax) return false;	
	
	this.wrapFnText = function(wrappedFn){
		// if(typeof(wrappedFn)!='function') return function(){};
        if(typeof(wrappedFn)=='undefined' || wrappedFn==null) return function(){};
		return function(httpRes) {
			var res;
			eval('res = ' + httpRes.responseText);
			wrappedFn(res);
		};	
	}

	// 모든 invoke의 추상화된 function
	this.baseInvoke = function(url, baseRealPar, fnName, par, callBackFn, fallBackFn, encoding, fmethod){
		var queryPar = $H(par).toQueryString();
		var realPar = baseRealPar + "&f="+fnName+"&p="+escape(queryPar) + "&dummy="+escape(new Date().getTime());
		if(encoding) realPar = realPar + "&e="+escape(encoding);
		if(!fmethod) fmethod = 'POST';
		
		if(!callBackFn) callBackFn = this.onDefaultSucc;

		var paramSet = {
			method: fmethod,
			parameters : realPar,
			onSuccess : this.wrapFnText(callBackFn)
		};

		if(fallBackFn) paramSet.onFailure = this.wrapFnText(fallBackFn);
			
		var result = new Ajax.Request(
			url,
			paramSet
		);
		
		return result;	
	}
	
	this.invoke = function(groupName, fnName, par, callBackFn, fallBackFn, encoding, fmethod){
		return this.baseInvoke("/js/wAlajax.aspx", "g="+groupName, fnName, par, callBackFn, fallBackFn, encoding, fmethod);
	};
	
	// 해당페이지에 포함되어있는 메쏘드 호출
	this.invokeThis = function(fnName, par, callBackFn, fallBackFn, encoding, fmethod){
		return this.baseInvoke(document.location.pathname, "__callAlajaxPage=true", fnName, par, callBackFn, fallBackFn, encoding, fmethod);
	};

	// 해당콘트롤에 포함되어있는 메쏘드 호출
	this.invokeControl = function(fnName, par, callBackFn, fallBackFn, encoding, fmethod){
		return this.baseInvoke(document.location.pathname, "__callAlajaxCtl=true", fnName, par, callBackFn, fallBackFn, encoding, fmethod);
	};	
	
	// 메쏘드 완료후 특정 엘리먼트의 text를 바꿔준다 
	this.replaceHTML = 	function(groupName, fnName, par, targetElementName, msgBody, encoding){
		// not Impl
	};
	
	// 메쏘드 완료후 Alert메세지를 보여준다.
	this.alertMsg = function(groupName, fnName, par, msg, encoding, fmethod){
		return Alajax.invoke(groupName, fnName, par, function(res){ alert(msg); }, this.onDefaultFail, encoding, fmethod);
	};


	// TODO : this.baseInvoke통합
	this.importPage = function(placeHolderName, pageName, callBackFn, fallBackFn, encoding){
        var url = '/js/wAlajax.aspx';
        var realPar = 't=p&p='+pageName+'&dummy='+escape(new Date().toString())
        if(encoding) realPar = realPar + "&e="+escape(encoding);
        
		var paramSet = {
			method:'POST',
			parameters : realPar
		};

        if( typeof(callBackFn)=='function' ) paramSet.onSuccess = this.wrapFnText(callBackFn); // callBackFn이 꼭 필요한 것이 아님
        if( typeof(fallBackFn)=='function' ) paramSet.onFailure = this.wrapFnText(fallBackFn);
        		        
        var result = new Ajax.Updater(
            placeHolderName,
            url,
            paramSet
        );

        return result;
	};

	// Runtime JS호출-Dynamic [TODO : this.baseInvoke통합 + 정리]
	this.InvokeJSRun = function(groupName, fnName, par, fallBackFn, encoding, fmethod){
		var url = '/js/wAlajax.aspx';
		var queryPar = $H(par).toQueryString();
		var realPar = "g="+groupName + "&f="+fnName+"&p="+escape(queryPar) + "&exec=true&dummy="+escape(new Date().getTime());
		if(encoding) realPar = realPar + "&e="+escape(encoding);
		if(!fmethod) fmethod = 'POST';

		var callBackFn = function(httpRes) {
			var res = '';
			eval(httpRes.responseText);
		};

		var paramSet = {
			method: fmethod,
			parameters : realPar,
			onSuccess : callBackFn
		};

		if(fallBackFn) paramSet.onFailure = this.wrapFnText(fallBackFn);
			
		var result = new Ajax.Request(
			url,
			paramSet
		);
		
		return result;	
	}	
	
	this.invokePage = function(url, par, callBackFn, fallBackFn, encoding){
		var queryPar = $H(par).toQueryString();
        var realPar = queryPar+'&dummy='+escape(new Date().getTime())
        if(encoding) realPar = realPar + "&e="+escape(encoding);
        
		var paramSet = {
			method:'POST',
			parameters : realPar
		};

        if( typeof(callBackFn)=='function' ) paramSet.onSuccess = this.wrapFnText(callBackFn); // callBackFn이 꼭 필요한 것이 아님
        if( typeof(fallBackFn)=='function' ) paramSet.onFailure = this.wrapFnText(fallBackFn);
        		        
        var result = new Ajax.Request(
            url,
            paramSet
        );

        return result;
	};	
	
	this.updaterPage = function(placeHolderName, url, par, callBackFn, fallBackFn, encoding){

		var queryPar = $H(par).toQueryString();
        var realPar = queryPar+'&dummy='+escape(new Date().getTime())
        if(encoding) realPar = realPar + "&e="+escape(encoding);
  
		var paramSet = {
			method:'POST',
			parameters : realPar,
			evalScripts : true
		};

        if( typeof(callBackFn)=='function' ) paramSet.onSuccess = callBackFn; // callBackFn이 꼭 필요한 것이 아님
        if( typeof(fallBackFn)=='function' ) paramSet.onFailure = fallBackFn;

        var result = new Ajax.Updater(
            placeHolderName, 
            url,
            paramSet
        );
          
        return result;
	};		
	
	this.onDefaultSucc = function(res){
		alert(res);
	};
		
	this.onDefaultFail = function(res){
		alert('다음과 같은 에러가 발생하였습니다.\r\n' + res);
	};
 });
 
 
 var AlajaxUtil = {};
 /* element의 onclick이벤트를 바꾸고, 필요에 따라 alert메세지를 뿌린다. visharp */
 AlajaxUtil.replaceOnClickAndText = function(elName, fnBody, newTxt, alertMsg){
 	if(typeof(alertMsg)=='string') alert(alertMsg);
 	
 	var el = $(elName);
 	eval('el.onclick = function(){ '+fnBody+' }');
 	el.innerHTML = newTxt;
 }

