modular_core.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. /**********************************************************************************
  2. * modular_core.js
  3. *
  4. * Modular 프레임워크의 핵심과 관련된 부분이 포함되어 있는 스크립트 파일
  5. * 'Modular' 이라는 네임스페이스를 사용하고 있음
  6. *
  7. * Modular 프레임워크에서 추가적인 네임스페이스를 사용하고자 할 경우에는
  8. * 여기 포함되어 있는 Modular.namespace 함수를 사용하여 네임 스페이스를 추가해야 함
  9. *
  10. * @author 김선엽(sunyoupk@udapsoft.co.kr)
  11. **********************************************************************************/
  12. /**
  13. * 프레임워크의 메인 네임스페이스
  14. */
  15. Modular = {
  16. /**
  17. * Modular JavaScript 프레임워크 버전
  18. */
  19. version : "0.0.9",
  20. namespace : function() {
  21. var a = arguments, o = null, i, j, d, rt;
  22. for (i = 0; i < a.length; ++i) {
  23. d = a[i].split(".");
  24. rt = d[0];
  25. eval("if (typeof " + rt + " == 'undefined'){" + rt + " = {};} o = " + rt + ";");
  26. for (j = 1; j < d.length; ++j) {
  27. /*
  28. * 예시)
  29. * Modular["model"] = Modular["model"] || {};
  30. * Modular["model"] = typeof Modular["model"] == "undefined" ? {} : Modular["model"];
  31. */
  32. o[d[j]] = o[d[j]] || {};
  33. o = o[d[j]];
  34. }//end for
  35. }//end for
  36. }
  37. };
  38. /*
  39. * Modular에 namespace를 추가하고자 할 경우에는 필히 아래에 해당 namespace를 기술해야만 한다.
  40. *
  41. */
  42. Modular.namespace("Modular", "Modular.model", "Modular.view", "Modular.controller");
  43. /*******************************************************
  44. * Modular 프레임워크의 템플릿과 관련된 부분
  45. *******************************************************/
  46. /*
  47. * template 적용을 위한 jquery.template.js 기본 설정 적용
  48. *
  49. * 설정 변수는 #변수명# 형태로 지정한다.
  50. *
  51. */
  52. jQuery.template.regx.modular = /#([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?#/g;
  53. jQuery.template.regx.standard = jQuery.template.regx.modular;
  54. /*******************************************************
  55. * Modular 프레임워크의 유틸리티와 관련된 부분
  56. *******************************************************/
  57. /**
  58. * 문자열에 존재하는 공백을 삭제합니다.
  59. * <pre>
  60. * <code>
  61. * var s = " foo bar ";
  62. * alert("[" + s + "]"); //alerts "[ foo bar ]"
  63. * alert("[" + s.trim() + "]"); //alerts "[foo bar]"
  64. * </code>
  65. * </pre>
  66. *
  67. * @return {String} 공백이 제거된 문자열
  68. */
  69. String.prototype.trim = function() {
  70. return function(){ return jQuery.trim(this); };
  71. }();
  72. /**
  73. * 주어진 문자열이 해당 문자열로 시작되는지 확인
  74. * @param prefix {String} 검사 대상 시작 문자열
  75. * @return {Boolean} true or false
  76. */
  77. String.prototype.startsWith = function(prefix) {
  78. return this.indexOf(prefix) == 0;
  79. };
  80. /**
  81. * 주어진 문자열이 해당 문자열로 종료되는지 확인
  82. * @param suffix {String} 검사 대상 종료 문자열
  83. * @return {Boolean} true or false
  84. */
  85. String.prototype.endsWith = function(suffix) {
  86. return this.match(suffix + "$") == suffix;
  87. };
  88. /**
  89. * 프레임워크의 유틸리티 함수가 포함된 클래스
  90. */
  91. Modular.Utils = {
  92. /**
  93. * 주어진 문자열에 text가 존재하는지 확인합니다.
  94. * <pre>
  95. * <code>
  96. * var s = "";
  97. * alert(Modular.Utils.hasText(s)); //alerts "false"
  98. * </code>
  99. * </pre>
  100. *
  101. * @param str {String} 검사 대상 문자열
  102. * @return {boolean} 검사 결과 (Text 존재 시 true / 미 존재 시 false)
  103. */
  104. hasText : function(str) {
  105. var strVal;
  106. if (!str) {
  107. return false;
  108. }//end if
  109. if (typeof str == "object") {
  110. strVal = str.value;
  111. } else {
  112. strVal = new String(str);
  113. }//end if else
  114. if (strVal && strVal.trim().length > 0) {
  115. return true;
  116. } else {
  117. return false;
  118. }//end if else
  119. },
  120. /**
  121. * 주어진 객체를 JSON String 형태로 변환하여 리턴합니다.
  122. *
  123. * 이 메소드는 jQuery.toJSON.js 플러그인을 사용하고 있습니다.
  124. * 따라서, 페이지 내에서 정상적으로 동작하기 위해서는
  125. * <script type="text/javascript" src="js/ext/jQuery.toJSON.js"></script>
  126. * 와 같이 스크립트 소스 가 설정되어 있어야 합니다.
  127. *
  128. * @param object {Object} JSON String으로 변환하려는 대상 객체
  129. * @return {String} 변환된 JSON String
  130. */
  131. toJSON : function(object) {
  132. return jQuery.toJSON(object);
  133. },
  134. /**
  135. * 해당 배열에 지정된 이름에 해당하는 값이 있는지 여부를 리턴합니다.
  136. *
  137. * @param array {Array} 배열객체
  138. * @param obj {String} 찾고자 하는 값
  139. * @return {boolean} 검사 결과 (산택값 존재 시 true / 미 존재 시 false)
  140. */
  141. containsArray: function( array, obj ) {
  142. if ( array && array.length > 0 ) {
  143. for ( var i = 0 ; i < array.length ; i++ ) {
  144. if ( array[i] == obj ) {
  145. return true;
  146. }
  147. }
  148. }
  149. return false;
  150. },
  151. /**
  152. * 지정된 이름에 해당하는 쿠키 값을 리턴합니다.
  153. *
  154. * @param name {String} 쿠키 이름
  155. * @return {String} 쿠키 값
  156. */
  157. getCookie : function (name) {
  158. return jQuery.cookie(name);
  159. },
  160. /**
  161. * 지정된 이름과 종료 일자에 해당하는 쿠키 값을 설정합니다.
  162. *
  163. * @param name {String} 쿠키 이름
  164. * @param value {String} 쿠키 값
  165. * @param expiredays {Number} 만료 날짜
  166. */
  167. setCookie : function (name, value, expiredays) {
  168. var ed = new Number(expiredays);
  169. if (isNaN(ed)) {
  170. jQuery.cookie(name, value);
  171. } else {
  172. jQuery.cookie(name, value, {expires: ed.valueOf()});
  173. }//end if else
  174. },
  175. /**
  176. * 지정된 이름의 쿠키를 삭제합니다.
  177. *
  178. * @param name {String} 쿠키 이름
  179. */
  180. removeCookie : function (name) {
  181. jQuery.cookie(name);
  182. },
  183. /**
  184. * 지정된 ID에 해당하는 정보를 쿠키의 유효기간 설정을 사용하여
  185. * 지정된 기간동안 유효하도록 설정합니다.
  186. *
  187. * @param name {String} 쿠기 이름
  188. * @param expiredays {Number} 유효 날짜
  189. */
  190. setOpenEventDays : function (name, expiredays) {
  191. this.setCookie("openevent_" + name, "check", expiredays);
  192. },
  193. /**
  194. * 해당 Form내의 지정된 Key에 해당 하는 checkbox들을 toggle합니다.
  195. *
  196. * @param formId {String} 타겟 Form 아이디
  197. * @param chkKey {String} checkbox 엘리멘트 이름
  198. */
  199. toggleCheckBox : function(formId, chkKey) {
  200. jQuery("#"+formId + " input:checkbox[name='" + chkKey + "']").each(function (i) {
  201. this.checked = (this.checked) ? false : true;
  202. });
  203. },
  204. /**
  205. * 해당 Form내의 지정된 Key에 해당 하는 선택된 checkbox 값이 있는지 여부 반환
  206. *
  207. * @param formId {String} 타겟 Form 아이디
  208. * @param chkKey {String} checkbox 엘리멘트 이름
  209. * @return {boolean} 검사 결과 (산택값 존재 시 true / 미 존재 시 false)
  210. */
  211. hasCheckedValue : function (formId, chkKey) {
  212. return jQuery("#"+formId + " input:checkbox[name='" + chkKey + "']:checked").size() > 0;
  213. },
  214. /**
  215. * 해당 Form내의 지정된 Key에 해당 하는 선택된 checkbox 값을
  216. * 주어진 구분자를 사용해 문자열로 반환합니다.
  217. *
  218. * @param formId {String} 타겟 Form 아이디
  219. * @param chkKey {String} checkbox 엘리멘트 이름
  220. * @param delimeter {String} 구분자
  221. */
  222. getCheckedValue : function (formId, chkKey, delimeter) {
  223. var arr = [];
  224. jQuery("#"+formId + " input:checkbox[name='" + chkKey + "']:checked").each(function (i) {
  225. arr.push(jQuery(this).val());
  226. });
  227. return arr.join(delimeter);
  228. }
  229. };
  230. /**
  231. * 페이지 이동과 관련된 유틸리티 메소드를 포함하는 클래스
  232. */
  233. Modular.Page = {
  234. /**
  235. * 주어진 페이지로 이동합니다.
  236. *
  237. * @param location {String} 이동하려는 URL
  238. * @param hasHistory {boolean} 이력 저장 여부
  239. */
  240. go : function (location, hasHistory) {
  241. var historyKey = "modular.web.mvc.history";
  242. var params = {};
  243. if (hasHistory) {
  244. params[historyKey] = "true";
  245. }//end if
  246. window.location.href = location + "?" + jQuery.param(params);
  247. }
  248. };
  249. /**
  250. * Modular.debug()를 통한 디버깅 dialog를 제공한다.
  251. * (jQuery Dialog를 이용.)
  252. */
  253. Modular.Debugger = {
  254. enabled : true, //debugger를 on off 한다.
  255. dialog : jQuery("<div></div>"),
  256. body : jQuery("<table width=\"100%\"><tr><td width=\"110\"></td><td></td></tr></table>"),
  257. shown : false,
  258. show : function(){
  259. if(this.dialog.dialog( "isOpen" )) return;
  260. if(this.shown){
  261. this.dialog.dialog( "open" );
  262. }else{
  263. this.dialog.append(this.body);
  264. this.dialog.dialog({
  265. autoOpen: true,
  266. title: "HONE Debug Dialog",
  267. width: 600,
  268. show: 'blind',
  269. hide: 'blind',
  270. position : ['center','bottom'],
  271. buttons: { "clear": function() { Modular.Debugger.body.html("<tr><td width=\"110\"></td><td></td></tr>"); }}
  272. });
  273. this.shown = true;
  274. }
  275. }
  276. };
  277. /**
  278. * 디버깅용 로그 기록하기.
  279. */
  280. Modular.debug = function(msg){
  281. if(Modular.Debugger.enabled){
  282. Modular.Debugger.show();
  283. var d = new Date();
  284. var currentTime = "["+d.getFullYear() + "." + (d.getMonth() + 1) + "."+ d.getDate()+ " "+
  285. d.getHours()+ ":" + d.getMinutes()+":"+d.getSeconds()+"] ";
  286. var logMsg = jQuery("<tr><td valign='top'>"+currentTime+"</td><td>"+msg+"</td></tr>");
  287. jQuery("td", logMsg).css({'border-bottom': '1px dotted red'});
  288. Modular.Debugger.body.prepend(logMsg);
  289. }
  290. };