/**********************************************************************************
 * hone_core.js
 * 
 * Hone 프레임워크의 핵심과 관련된 부분이 포함되어 있는 스크립트 파일
 * 'Hone' 이라는 네임스페이스를 사용하고 있음
 * 
 * Hone 프레임워크에서 추가적인 네임스페이스를 사용하고자 할 경우에는
 * 여기 포함되어 있는 Hone.namespace 함수를 사용하여 네임 스페이스를 추가해야 함
 * 
 * @author 조만희
 **********************************************************************************/

/**
 * 프레임워크의 메인 네임스페이스
 */
Hone = {
	/**
	 * Hone JavaScript 프레임워크 버전
	 */
	version : "1.3.2",
	
	/**
	 * Namespace를 분리하기 위한 유틸리티 함수
	 * Extjs에서 사용한 방법을 차용하였음.
	 * 
	 * 2008.11.11 - Helexis
	 */
    namespace : function() {
	    var a = arguments, o = null, i, j, d, rt;
	    for (i = 0; i < a.length; ++i) {
	        d = a[i].split(".");
	        rt = d[0];
	        eval("if (typeof " + rt + " == 'undefined'){" + rt + " = {};} o = " + rt + ";");
	        for (j = 1; j < d.length; ++j) {
	        	/*
	        	 * 예시)
	        	 * Hone["model"] = Hone["model"] || {};
	        	 * Hone["model"] = typeof Hone["model"] == "undefined" ? {} : Hone["model"];
	        	 */
	            o[d[j]] = o[d[j]] || {};
	            o = o[d[j]];
	        }//end for
	    }//end for
	}
};


/*
 * Hone에 namespace를 추가하고자 할 경우에는 필히 아래에 해당 namespace를 기술해야만 한다.
 * 
 * 2008.11.07 - Helexis
 */
Hone.namespace("Hone", "Hone.model", "Hone.view", "Hone.controller");


/*******************************************************
 * Hone 프레임워크의 템플릿과 관련된 부분
 *******************************************************/
/*
 * template 적용을 위한 jquery.template.js 기본 설정 적용
 * 
 * 설정 변수는 #변수명# 형태로 지정한다.
 * 
 * 2008.12.29 - Helexis
 */
jQuery.template.regx.hone = /#([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?#/g;
jQuery.template.regx.standard = jQuery.template.regx.hone;

/*******************************************************
 * Hone 프레임워크의 유틸리티와 관련된 부분
 *******************************************************/

/**
 * 문자열에 존재하는 공백을 삭제합니다.
 * <pre>
 * <code>
 * var s = "  foo bar  ";
 * alert("[" + s + "]");         //alerts "[  foo bar  ]"
 * alert("[" + s.trim() + "]");  //alerts "[foo bar]"
 * </code>
 * </pre>
 * 
 * @return {String} 공백이 제거된 문자열
 */
String.prototype.trim = function() {
    return function(){ return jQuery.trim(this); };
}();

/**
 * 프레임워크의 유틸리티 함수가 포함된 클래스
 */
Hone.Utils = {
	/**
	 * 주어진 문자열에 text가 존재하는지 확인합니다.
	 * <pre>
	 * <code>
	 * var s = "";
	 * alert(Hone.Utils.hasText(s));	//alerts "false"
	 * </code>
	 * </pre>
	 * 
	 * @param str {String} 검사 대상 문자열
	 * @return {boolean} 검사 결과 (Text 존재 시 true / 미 존재 시 false)
	 */
	hasText : function(str) {
		var strVal;

		if (!str) {
			return false;
		}//end if

		if (typeof str == "object") {
			strVal = str.value;
		} else {
			strVal = new String(str);
		}//end if else

		if (strVal && strVal.trim().length > 0) {
			return true;
		} else {
			return false;
		}//end if else
	},

	/**
	 * 주어진 객체를 JSON String 형태로 변환하여 리턴합니다.
	 * 
	 * 이 메소드는 jQuery.toJSON.js 플러그인을 사용하고 있습니다.
	 * 따라서, 페이지 내에서 정상적으로 동작하기 위해서는
	 * <script type="text/javascript" src="js/ext/jQuery.toJSON.js"></script>
	 * 와 같이 스크립트 소스 가 설정되어 있어야 합니다.
	 * 
	 * @param object {Object} JSON String으로 변환하려는 대상 객체
	 * @return {String} 변환된 JSON String
	 */
	toJSON : function(object) {
		return jQuery.toJSON(object);
	},
	
	/**
	 * 해당 배열에 지정된 이름에 해당하는 값이 있는지 여부를 리턴합니다.
	 * 
	 * @param array {Array} 배열객체
	 * @param obj {String} 찾고자 하는 값 
	 * @return {boolean} 검사 결과 (산택값 존재 시 true / 미 존재 시 false)
	 */	
	containsArray: function( array, obj ) {
		if ( array && array.length > 0 ) {
			for ( var i = 0 ; i < array.length ; i++ ) {
				if ( array[i] == obj ) {
					return true;
				}
			}
		}

		return false;
	},	
	
	/**
	 * 지정된 이름에 해당하는 쿠키 값을 리턴합니다.
	 * 
	 * @param name {String} 쿠키 이름
	 * @return {String} 쿠키 값
	 */
	getCookie : function (name) {
		return jQuery.cookie(name);
	},

	/**
	 * 지정된 이름과 종료 일자에 해당하는 쿠키 값을 설정합니다.
	 * 
	 * @param name {String} 쿠키 이름
	 * @param value {String} 쿠키 값
	 * @param expiredays {Number} 만료 날짜
	 */
	setCookie : function (name, value, expiredays) {
		var ed = new Number(expiredays);
		if (isNaN(ed)) {
			jQuery.cookie(name, value);
		} else {
			jQuery.cookie(name, value, {expires: ed.valueOf()});
		}//end if else
	},
	
	/**
	 * 지정된 이름의 쿠키를 삭제합니다.
	 * 
	 * @param name {String} 쿠키 이름
	 */
	removeCookie : function (name) {
		jQuery.cookie(name);
	},
	
	/**
	 * 지정된 ID에 해당하는 정보를 쿠키의 유효기간 설정을 사용하여 
	 * 지정된 기간동안 유효하도록 설정합니다.
	 * 
	 * @param name {String} 쿠기 이름
	 * @param expiredays {Number} 유효 날짜
	 */
	setOpenEventDays : function (name, expiredays) {
		this.setCookie("openevent_" + name, "check", expiredays);
	},
	
	/**
	 * 해당 Form내의 지정된 Key에 해당 하는 checkbox들을 toggle합니다.
	 * 
	 * @param formId {String} 타겟 Form 아이디
	 * @param chkKey {String} checkbox 엘리멘트 이름 
	 */
	toggleCheckBox : function(formId, chkKey) {
		jQuery("#"+formId + " input:checkbox[name=" + chkKey + "]").each(function (i) {
			this.checked = (this.checked) ? false : true;
		});
	},
	
	/**
	 * 해당 Form내의 지정된 Key에 해당 하는 선택된 checkbox 값이 있는지 여부 반환
	 * 
	 * @param formId {String} 타겟 Form 아이디
	 * @param chkKey {String} checkbox 엘리멘트 이름  
	 * @return {boolean} 검사 결과 (산택값 존재 시 true / 미 존재 시 false)
	 */
	hasCheckedValue : function (formId, chkKey) {	
		return jQuery("#"+formId + " input:checkbox[name=" + chkKey + "]:checked").size() > 0;
	},
	
	/**
	 * 해당 Form내의 지정된 Key에 해당 하는 선택된 checkbox 값을 
	 * 주어진 구분자를 사용해 문자열로 반환합니다.
	 * 
	 * @param formId {String} 타겟 Form 아이디
	 * @param chkKey {String} checkbox 엘리멘트 이름
	 * @param delimeter {String} 구분자   
	 */
	getCheckedValue : function (formId, chkKey, delimeter) {	
		var arr = [];
		jQuery("#"+formId + " input:checkbox[name=" + chkKey + "]:checked").each(function (i) {
			arr.push(jQuery(this).val());
		});
		return arr.join(delimeter);
	}
	
};


/**
 * 페이지 이동과 관련된 유틸리티 메소드를 포함하는 클래스
 */
Hone.Page = {
	/**
	 * 주어진 페이지로 이동합니다.
	 * 
	 * @param location {String} 이동하려는 URL
	 * @param hasHistory {boolean} 이력 저장 여부
	 */
	go : function (location, hasHistory) {
		var historyKey = "hone.web.mvc.history";
		var params = {};
		if (hasHistory) {
			params[historyKey] = "true";
		}//end if
		window.location.href = location + "?" + jQuery.param(params);
	}
};

