/**
 * 파일명 : ajaxUtil.js
 * 만든날 : 2007.12.03.
 * 만든곳 : nona/Netville
 *
 * 설명 :
 *  Ajax의 사용을 편리하게 하기 위한 유틸리티성 자바스크립트 입니다.
 *  수정시 친절한 코멘트 부탁드립니다.
 *
 *  (주의) prototype.js에 살짝 의존합니다.
 *
 **/


/*
 * Ajax를 호출한다.
 * 파라미터 전달시 URL에 모두 담지 말고 param을 이용하기 바람.
 * 중복처리 로직 포함됨.
 * 파라미터
 *  - url : 호출 URL
 *  - param : 파라미터
 *  - returnFunc : 결과를 리턴할 Function 명
 */
function AjaxRequest(url, param, returnFunc) {
	if(checkAjaxActionDup(param, returnFunc)) {
		alert('이미 처리중입니다.\n\n잠시 기다려주세요.');
		return false;
	}
	
	var myAjax = new Ajax.Request(
        url,
        {
            method: 'post',
            parameters: param,
            onComplete: eval(returnFunc),
            onFailure : AjaxRequestError,
            asynchronous: true,
            evalJSON : 'force'
        }
    );
    
    setAjaxAction(param, returnFunc, myAjax);
    return true;
}


/*
 * XML Response를 JSON Object로 리턴한다.
 */
function Xml2Json(originalRequest) {
	try {
		var jsonObject = originalRequest.responseJSON
		return jsonObject;
	} catch (e) {
		//alert("Function XmlToJson error : " + e);
	}
}

/*
 * XML 데이터를 DTO 객체로 변환하여 반환한다.
 */
function Xml2DTO(originalRequest, className) {
	
try {
	
	var isList = false;
	var totalCount = 1;
	var rtnObj = {};
	var isMessage = false;
	var success = false;
	
	// AjaxResponseMessage에 대한 체크
	var messageObjClassName = "AjaxResponseMessage";
	var jsonObject = Xml2Json(originalRequest);
	if(!jsonObject) {
		jsonObject = originalRequest.responseText.evalJSON();
	}
	if(eval("jsonObject." + messageObjClassName)) {
		rtnObj = eval("jsonObject." + messageObjClassName);
		isList = false;
		totalCount = 0;
		className = messageObjClassName;
		success = rtnObj.success;
		isMessage = true;
	} else if(eval("jsonObject.list")) {
		if(eval("jsonObject.list." + className))
			rtnObj = eval("jsonObject.list." + className);
		isList = true;
		if(rtnObj.length)
			totalCount = rtnObj.length;
		else {
			var temp = new Array();
			
			temp[0] = rtnObj;
			rtnObj = temp;
			totalCount = 1;
		}
		success = true;		
	} else {
		if(eval("jsonObject." + className))
			rtnObj = eval("jsonObject." + className);
		else
			totalCount = 0;
		success = true;		
	}
	
	rtnObj.isList = isList;
	rtnObj.totalCount = totalCount;
	rtnObj.className = className;
	rtnObj.success = success;
	rtnObj.isMessage = isMessage;
	
	return rtnObj;
}catch(e){
//	alert(e.message);
	}
}



/*
 * Ajax 에러 발생시 호출되는 Function
 */
function AjaxRequestError() {
	//alert("Ajax Request error");
	return;
}



/*******************************
 * 중복 액션 방지 처리 시작
 *******************************/
/* 1. request와 response의 transaction은
 *		request시 Ajax 호출시 생성하는 Ajax.Request 객체의 transport 속성과
 *		response시 메서드의 첫번째 파라미터로 전달되는 originalRequest 객체의
 *		일치 여부로 판단한다.
 * 2. 중복액션의 처리는 
 *		'오브젝트명_액션명'을 인덱스로 Ajax.Request의 객체를 value로 하여 AJAX_ACTION_LIST에 넣고
 *		체크시 Ajax.Request객체의 존재여부, 완료여부로 판단한다.
 */
var AJAX_ACTION_LIST = new Array();

/*
 * 현재 해당 Object에 대한 특정 action이 수행중인지 판단한다.
 * true : 수행중, false : 수행중이지 않음.
 */
function checkAjaxActionDup(objectName, actionName) {
try{
	var key = objectName+"_"+actionName;
	if(AJAX_ACTION_LIST[key]) {
		var preAjaxObject = AJAX_ACTION_LIST[key];
		if(preAjaxObject.transport.readyState == 4) {
			return false;
		} else {
			return true;
		}
	}
}catch(e){
	//alert(e);
	}
	return false;
}

/*
 * 현재 수행중인 액션을 저장합니다.
 */
function setAjaxAction(objectName, actionName, ajaxObject) {
	var key = objectName+"_"+actionName;
	AJAX_ACTION_LIST[key] = ajaxObject;
}

/*
 * ajaxObject를 통해 key를 가져옵니다.
 * (ajax의 request시 -> myAjax.transport, response시 ->originalRequest)
 */
function getKeyByAjaxObject(ajaxObject) {
	for (var i in AJAX_ACTION_LIST) {
		if(AJAX_ACTION_LIST[i].transport == ajaxObject)
			return i;
	}
	return null;
}

/*
 * ajaxObject를 통해 해당 objectName을 가져옵니다.
 * (ajax의 request시 -> myAjax.transport, response시 ->originalRequest)
 */
function getObjectNameByAjaxObject(ajaxObject) {
	var objectName = null;

	for (var i in AJAX_ACTION_LIST) {
		if(AJAX_ACTION_LIST[i].transport == ajaxObject) {
			objectName = i;
			break;
		}
	}

	if(objectName != null) {
		objectName = objectName.substring(0, objectName.indexOf('_'));
	}
	return objectName;
}

/*******************************
 * 중복 액션 방지 처리 끝
 *******************************/