/*=============================================================================================
 * 프로그램 : CJHS Componet 모음
 * 화 일 명 : core.js
 * 작 성 자 : 윤병화
 * 작 성 일 : 2008-11-23
 * 파일관리 :
= 기능설명 : G-Mall의 DWR 호출을 담당하는 함수
==============================================================================================*/
var cjhs = {};
var Ext = {};
Ext.BLANK_IMAGE_URL = '/images/default/s.gif';

Ext.apply = function(C, D, B) {
	if (B) {
		Ext.apply(C, B)
	}
	if (C && D && typeof D == "object") {
		for (var A in D) {
			C[A] = D[A]
		}
	}
	return C
};

Ext.urlEncode = function(o) {
	if (!o) {
		return ""
	}
	var buf = [];
	for (var key in o) {
		var ov = o[key],
		k = encodeURIComponent(key);
		var type = typeof ov;
		if (type == "undefined") {
			buf.push(k, "=&")
		} else {
			if (type != "function" && type != "object") {
				buf.push(k, "=", encodeURIComponent(ov), "&")
			} else {
				if (Ext.isArray(ov)) {
					if (ov.length) {
						for (var i = 0,
						len = ov.length; i < len; i++) {
							buf.push(k, "=", encodeURIComponent(ov[i] === undefined ? "": ov[i]), "&")
						}
					} else {
						buf.push(k, "=&")
					}
				}
			}
		}
	}
	buf.pop();
	return buf.join("")
}

var CJ_FATAL = 0;
var CJ_ERROR = 1;
var CJ_WARN = 2;
var CJ_INFO = 3;
var CJ_DEBUG = 4;
var CJ_CONFIRM = 5;
var CJ_PROMPT = 6;

function s_BeginBatch() {
	DWREngine.beginBatch();
}

function s_EndBatch() {
	DWREngine.endBatch();
}

function isArray(obj) {
	if (obj.constructor.toString().indexOf("Array") == -1)
		return false;
	else
		return true;
}

/*=============================================================================================
= 기능   : HTML or Form Element에 저장되어 있는 값을 Object에 설정한다.
= 인수   : id        HTML or Form Element의 ID Prefix값. (일반적으로 DM, DTO의 객체명을 표기)
         object    값을 저장할 DM or DTO 객체
= Return : void
= 설명   : HTML or Form Element에 저장되어 있는 값을 Object에 설정하며, 자동으로 설정하기 위해 Element는 DM DTO
                 속성을 Element ID로 해야한다. 예를들어 PostDto에 no라는 속성이 있다면, Element ID는 PostDto.no로
                 표기하며, s_GetValues("PostDto", postObject)로 postObject에 설정할 수 있다.
= 예제   : s_GetValues("PostDto", postObject);
==============================================================================================*/
function s_GetValues(id, object) {
	DWRUtil.getValues(object, {
		idPrefix :id
	});
}

/*=============================================================================================
= 기능   : Object에 저장되어 있는 값을 HTML or Form Element에 설정한다.
= 인수   : id        HTML or Form Element의 ID Prefix값. (일반적으로 DM, DTO의 객체명을 표기)
         object    값을 저장된 DM or DTO 객체
= Return : void
= 설명   : Object에 저장되어 있는 값을 HTML or Form Element에 설정하며, 자동으로 설정하기 위해 Element는 DM DTO
                 속성을 Element ID로 해야한다. 예를들어 PostDto에 no라는 속성이 있다면, Element ID는 PostDto.no로
                 표기하며, s_SetValues("PostDto", postObject)로 postObject값을 HTML or Form Element에 설정할
                 수 있다.
= 예제   : s_SetValues("PostDto", postObject);
==============================================================================================*/
function s_SetValues(id, object) {
	DWRUtil.setValues(object, {
		idPrefix :id
	});
}

/*=============================================================================================
= 기능   : 서버 DWR Controller의 Method를 호출
= 인수   : txId      트랜젝션ID
         method    서버 Method
= Return : void
= 설명   : 서버의 DWR Method로 호출을 보내고 그 결과를 f_DoPost(txId, returnData)로 받으며, Exception 발생시
         f_DoPostExt(txId, returnData)로 결과를 받을 수 있으며, returnData에는 Message 객체가 들어있다.
         returnData가 List 타입일 경우 서버는 CjhsExtJSEntry 타입으로 변환함으로 결과값을 가져오기 위해선
         returnData.data.results를 사용하면 배열값을 불러 올 수 있다.
= 예제   : s_Invoke("txID우편번호조회", PostDwrController.inquirePost);
==============================================================================================*/
function s_Invoke(txId, method) {
	this.params = Array.prototype.slice.call(arguments, 2);
	var callbackProxy = function(returnData) {
		if (returnData && returnData.code != undefined && returnData.message != undefined
				&& returnData.severity != undefined) {
			if (returnData.severity == CJ_FATAL) {
				errorHandlerProxy(returnData.message, txId);
				return;
			}
			s_Alert(returnData.severity, returnData.message);
			if (typeof f_DoPostExt == "function") {
				f_DoPostExt(txId, returnData);
			}
		} else {
			if (typeof f_DoPost == "function") {
				f_DoPost(txId, returnData);
			}
		}
	};
	var callMetaData = {
		callback :callbackProxy,
		errorHandler :errorHandlerProxy,
		warningHandler :warningHandlerProxy
	};
	params.push(callMetaData);
	method.apply(this, params);
}

function errorHandlerProxy(message, ex) {
	if (message == null || message == "") {
		message = "A server error has occured.";
	} else if (message.indexOf("0x80040111") != -1) {
		if (typeof f_DoPostExt == "function") {
			f_DoPostExt("0x80040111", message);
		}
	//} else if (ex != null && ex.getMessage() !== "") {
		//message = ex.getMessage();
	}
	s_Alert(CJ_FATAL, message);
}

function warningHandlerProxy(message, txId) {
	s_Alert(CJ_WARN, message);
}

/*=============================================================================================
= 기능   : Message를 가져온다.
= 인수   : msg       메세지 내역
         values    메세지 배열 변수
= Return : 완성된 메시지
= 설명   : {0} {1} {...}등의 자리에 values 배열의 값을 순차적으로 집어넣어 값을 완성한다.
= 예제   :
var common_Info0Info = "{0}는 {1}자리 이상이어야 합니다.";
s_GetMesg(common_Info0Info, ["우편번호", 7]);
==============================================================================================*/
function s_GetMesg(msg, values) {
	if (values == null) {
		return msg;
	} else if (typeof values == "string") {
		//return msg.replace(/{0}/g, values);
	} else if (isArray(values)) {
		for (var i=0, len=values.length; i < len; i++) {
			//msg.replace(/{i}/g, values[i]);
		}
	}
	return msg;
}

/*=============================================================================================
= 기능   : ALERT, CONFIRM, PROMPT 메세지
= 인수   : type      상수 CJ_FATAL, CJ_ERROR, CJ_WARN, CJ_INFO, CJ_DEBUG, CJ_CONFIRM, CJ_PROMPT
         msg       메세지 내역
         values    메세지 변수
         fn        콜백 함수 (형태: function (btnNm))
         title     메시지 창 제목
= Return : void
= 설명   : 메세지를 사용자에게 보여주며, 메시지창이 닫히면 fn에 정의된 콜백함수로 결과가 전달된다.
= 예제   : s_Alert(CJ_INFO, "{0}는 {1}자리 이상이어야 합니다.", ["우편번호", 7]);

s_Alert(CJ_CONFIRM, "삭제하시겠습니까?", null, function(btn, text){
    // btn 종류: ok, cancel, yes, no
    if (btn == 'ok'){
        // OK 버튼 시 처리
    }
});
==============================================================================================*/
function s_Alert(type, msg, values) {
	var message = s_GetMesg(msg, values);

	if (type == CJ_FATAL) {
		//window.location.href='/error.htm?message=' + encodeURIComponent(message);
		//return;
	} else if (type == CJ_CONFIRM) {
		return confirm(message);
	} else if (type == CJ_PROMPT) {
		prompt(message, "");
		return;
	}
	alert(message);
	return;
}

/*=============================================================================================
= 기능   : Excel 다운로드 요청을 한다.
= 인수   : url         Excel Download Url
         paramObject Excel Download Parameter
= Return :
= 설명   : 지정한 URL로 Excel 다운로드 요청을 보내며, 인자는 paramObject를 GET 방식으로 서버에 전달한다.
= 예제   : s_GetXsl("/ex/DummyExcelController.do", inquireDummyDto);
==============================================================================================*/
function s_GetXsl(url, pramObject) {
	url += (url.indexOf("?") != -1 ? "&" : "?") + Ext.urlEncode(pramObject);
	window.location.href = url;
}