/lib/AXGrid.js

https://github.com/qnotes/axisj · JavaScript · 5901 lines · 4830 code · 596 blank · 475 comment · 1954 complexity · d0c9e6b5b68a6b1fcf7cf76c261b08b1 MD5 · raw file

Large files are truncated click here to view the full file

  1. /**
  2. * AXGrid
  3. * @class AXGrid
  4. * @extends AXJ
  5. * @version v1.65
  6. * @author tom@axisj.com
  7. * @logs
  8. "2012-12-24 오전 11:51:26",
  9. "2013-01-08 오전 10:53:46 50% 진행중 - tom",
  10. "2013-01-22 오후 10:20:01 99% 완료 - tom",
  11. "2013-02-11 오후 12:21:55 editor value function 구문 적용 - tom",
  12. "2013-02-15 오후 7:04:03 list length 가 1일때 setEditor 버그 수정 - tom",
  13. "2013-02-16 오후 1:12:17 휠 스크롤 제어 예외 처리 - tom",
  14. "2013-02-16 오후 10:37:55 reloadList 추가 - tom",
  15. "2013-04-08 오후 9:48:53 getCheckedListWithIndex 추가 - tom",
  16. "2013-05-09 오후 1:56:53 setFocus 추가 - tom",
  17. "2013-06-17 오후 12:52:04 setFocus 스크롤 자동이동 기능 보강 / focusMove 추가 - tom ",
  18. "2013-06-21 오전 10:34:04 fitToWidth 속성 추가 & marker bugfix - tom",
  19. "2013-06-25 오후 5:23:29 getSelectedItem 추가 / 버그픽스 - tom",
  20. "2013-06-28 오전 11:32:33 wheel 버그픽스 - tom",
  21. "2013-07-04 오후 1:12:34 tooltip 속성 추가 - tom",
  22. "2013-07-17 오후 4:27:34 페이지 변경시 서버 2중 호출 버그 픽스",
  23. "2013-07-21 오후 10:15:09 wheel 버그픽스 - tom",
  24. "2013-07-24 오전 10:17:05 page 선언안함 버그픽스 - tom",
  25. "2013-09-04 오후 2:49:54 AXConfig에서 설정값 바인딩 구조로 변경 처리 - tom",
  26. "2013-09-23 오후 4:07:58 printList에서 리스트가 없을때 this.redrawGrid() 호출 추가 - root",
  27. "2013-09-24 오전 12:49:34 setList 선언전에 append 안되는 문제와 목록없음 표시 처리 문제 보강 / body > onscrollend 함수 지원 - tom",
  28. "2013-09-29 오전 12:41:29 colGroup width:'*' 옵션추가 / colHeadAlign 우선순위 조정 - tom",
  29. "2013-09-30 오전 1:40:22 colMap 함수정리 - tom",
  30. "2013-10-18 오전 8:30:50 dblclick 이벤트 개선 / click(index) 메서드 추가 - tom",
  31. "2013-10-23 오후 2:48:24 formatter radio 지원 - tom",
  32. "2013-10-24 오후 10:01:27 colGroup formatter - displayLabel:true 옵션추가 - tom",
  33. "2013-10-28 오전 9:37:26 page count 버그 픽스 / $ 키워드 제거 - tom",
  34. "2013-11-13 오전 10:09:14 tom : fitToWidth 창 최대화 최소화 버그 픽스",
  35. "2013-11-18 오후 1:34:35 tom : grid owidth 버그 픽스",
  36. "2013-12-09 오후 4:26:45 tom : setList 후 그리드 스크롤포지션 문제 해결",
  37. "2013-12-11 오후 9:31:45 tom : ajax setList 그리드 스크롤포지션 문제 해결",
  38. "2013-12-19 오후 3:30 tom : height=auto 일 경우 scrollTop 되는 현상 해결",
  39. "2013-12-24 오후 2:30:25 tom : 버그픽스",
  40. "2013-12-27 오전 11:56:44 tom marker bugfix",
  41. "2013-12-30 오후 11:00:00 tom : colGroup sort:false 기능 추가 및 버그 픽스",
  42. "2014-01-01 오후 8:55:17 tom : editor validate 액션버그 픽스",
  43. "2014-01-03 오후 3:31:09 tom : gridBodyClick 이벤트함수 수정",
  44. "2014-01-10 오후 5:08:30 tom : listCountMSG 설정 기능 추가",
  45. "2014-02-04 오전 10:13:38 tom : setList 메소드 호출 할 때 pageNo : 1 로 변경 기능 추가",
  46. "2014-02-06 오후 7:59:54 tom : jQuery 독립 우회 코드 변경",
  47. "2014-02-12 오전 11:31:41 tom : 불필요한 node 제거, * 설정시 헤드 너비 오차 문제 해결",
  48. "2014-02-14 오전 11:10:45 tom : setEditor 후 selector 키컨트롤 이벤트 방지, editor 안에 onkeyup 메소드 추가",
  49. "2014-02-14 오후 12:42:32 tom : appendList메소드 index를 지정 하지 않으면 맨 마지막으로 추가 되도록 변경",
  50. "2014-02-25 오전 11:24:29 tom : formatter 함수 this에 .value, .key 속성 추가",
  51. "2014-03-05 오후 12:17:26 tom : editor.response 에서 validate 후 editor 사라지도록 기능 변경, editorForm Item 중복되지 않도록 수정",
  52. "2014-03-05 오후 5:13:45 tom : 열 리사이즈했을 때 스크롤 위치 버그픽스",
  53. "2014-03-06 오후 8:22:00 tom : 열 리사이즈 후 컬럼 숨기기 표시 하시 액션 너비 변경 버그픽스",
  54. "2014-03-12 오후 3:04:11 root : 그리드 헤드 체크 박스 클릭시 disable 된 row 는 체크 하지않도록 변경",
  55. "2014-03-20 오전 11:16:51 tom : printList 실행 할 때 editor 활성화 되었으면 에디터 비 활성화",
  56. "2014-03-28 오전 8:18:54 tom : click 메소드 호출시 callBack 버그 픽스",
  57. "2014-03-31 오전 2:07:24 tom : init 에서 printList 호출 제거 / body.marker.addClass 속성 추가",
  58. "2014-03-31 오후 4:14:34 tom : scroll 영역 조정 ",
  59. "2014-04-01 오후 7:10:34 tom : .each for 로 변경/ changeGridView 메소드 추가",
  60. "2014-04-20 tom : listLoadingDisplay 실행할 때 가능하면 스크롤바의 위치를 맨위로 이동 시키기",
  61. "2014-04-22 tom : setList 호출시 onError 속성 추가",
  62. "2014-04-25 tom : setData 메소드 추가",
  63. "2014-04-28 tom : mobile 에서 터치무브 버그 픽스",
  64. "2014-04-28 tom : config.emptyListMSG 에서 설정가능",
  65. "2014-04-29 tom : AXConfig.AXGrid.pageCountMsg 설정기능 추가"
  66. * @description
  67. *
  68. ```js
  69. var myGrid = new AXGrid();
  70. myGrid.setConfig(classConfig:JSObject);
  71. ```
  72. *
  73. */
  74. var AXGrid;
  75. AXGrid = Class.create(AXJ, {
  76. initialize: function (AXJ_super) {
  77. AXJ_super();
  78. this.Observer = null;
  79. this.list = [];
  80. this.removedList = [];
  81. this.pageActive = false;
  82. this.page = { pageNo: 0, pageSize: 100, pageCount: "", listCount: 0 };
  83. this.moveSens = 0;
  84. this.config.viewMode = "grid"; // icon, mobile
  85. this.config.moveSens = 1;
  86. this.config.formPaddingRight = "11px";
  87. this.config.sort = true;
  88. this.config.xscroll = true;
  89. this.config.fitToWidth = (AXConfig.AXGrid.fitToWidth || false);
  90. this.config.fitToWidthRightMargin = (AXConfig.AXGrid.fitToWidthRightMargin || 10);
  91. this.config.passiveMode = AXConfig.AXGrid.passiveMode;
  92. this.config.passiveRemoveHide = AXConfig.AXGrid.passiveRemoveHide;
  93. this.selectedCells = [];
  94. this.selectedRow = [];
  95. var browser = AXUtil.browser;
  96. this.isMobile = browser.mobile;
  97. },
  98. /* 공통 영역 */
  99. defineConfig: function (rewrite) {
  100. var cfg = this.config;
  101. if (cfg.colGroup.length == 0) {
  102. trace("colGrpup is empty)");
  103. return;
  104. }
  105. /* col너비 합계 구하기 */
  106. var colWidth = 0;
  107. var hasHiddenCell = false;
  108. var showColLen = 0;
  109. if (!rewrite) this.fixedColSeq = cfg.fixedColSeq;
  110. var bodyWidth = this.body.width();
  111. var astricCount = 0;
  112. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  113. if (CG.colSeq == undefined) CG.colSeq = cidx;
  114. if (CG.display == undefined) CG.display = true;
  115. if (CG.display) {
  116. if (!rewrite) {
  117. if (CG.width == "*") {
  118. CG.width = 0;
  119. CG.widthAstric = true;
  120. astricCount++;
  121. }
  122. CG._owidth = CG.width;
  123. /* 최초의 너비값 기억 하기 */
  124. } else {
  125. if (CG.widthAstric) {
  126. CG.width = 0;
  127. CG._owidth = CG.width;
  128. astricCount++;
  129. }
  130. }
  131. colWidth += (CG._owidth || 0).number();
  132. showColLen += 1;
  133. } else {
  134. hasHiddenCell = true;
  135. }
  136. }
  137. if (!cfg.fitToWidth) {
  138. /* width * 예외처리 구문 ------------ s */
  139. if ((bodyWidth - cfg.fitToWidthRightMargin) > (colWidth + 100 * astricCount)) {
  140. var remainsWidth = (bodyWidth - cfg.fitToWidthRightMargin) - colWidth;
  141. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  142. if (CG.display && CG.widthAstric) {
  143. CG._owidth = (remainsWidth / astricCount).ceil();
  144. CG.width = CG._owidth;
  145. colWidth += (CG._owidth || 0).number();
  146. }
  147. }
  148. } else {
  149. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  150. if (CG.display && CG.widthAstric) {
  151. CG._owidth = 100;
  152. CG.width = 100;
  153. colWidth += (CG._owidth || 0).number();
  154. }
  155. }
  156. }
  157. /* width * 예외처리 구문 ------------ e */
  158. } else {
  159. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  160. if (CG.display && CG.widthAstric) {
  161. CG.width = 100;
  162. CG._owidth = 100;
  163. colWidth += (CG._owidth || 0).number();
  164. }
  165. }
  166. }
  167. this.colWidth = colWidth;
  168. if (cfg.fitToWidth) { /*너비 자동 맞춤버전의 경우 */
  169. if (bodyWidth > this.colWidth) {
  170. var _bodyWidth = bodyWidth - cfg.fitToWidthRightMargin;
  171. var zoomRatio = bodyWidth / this.colWidth;
  172. colWidth = 0;
  173. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  174. CG.width = (CG._owidth * zoomRatio).ceil();
  175. if (_bodyWidth > CG.width) _bodyWidth -= CG.width;
  176. else CG.width = _bodyWidth;
  177. if (CG.display) colWidth += CG.width.number();
  178. }
  179. this.colWidth = colWidth;
  180. } else {
  181. colWidth = 0;
  182. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  183. if (CG._owidth == undefined) CG._owidth = (CG.width || 0).number();
  184. CG.width = CG._owidth.number();
  185. if (CG.display) colWidth += CG.width.number();
  186. }
  187. this.colWidth = colWidth;
  188. }
  189. }
  190. this.showColLen = showColLen;
  191. /* col너비 합계 구하기 ~~~~~~~~~~~~~~ 구해진 너비합은 그리드 head, body 의 너비로 지정됨. */
  192. if (!cfg.colHead) cfg.colHead = {};
  193. if (!cfg.body) cfg.body = {};
  194. if (!cfg.page) cfg.page = { display: false, paging: false, status: { formatter: null } };
  195. if (cfg.colHead.rowsEmpty) cfg.colHead.rows = undefined;
  196. if (cfg.body.rowsEmpty) cfg.body.rows = undefined;
  197. /* colHead rows ----------------------------------------------------------------------------------------------------- */
  198. if (cfg.colHead.rows) {
  199. /* colHeadRow 정해진 경우 */
  200. cfg.colHead._maps = new Array(cfg.colHead.rows.length);
  201. var colMaxLen = 0;
  202. for (var r = 0; r < cfg.colHead.rows.length; r++) {
  203. var colLen = 0;
  204. for (var CH, CHidx = 0, __arr = cfg.colHead.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  205. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  206. if (CH.colspan == undefined || CH.colspan == null) {
  207. CH.colspan = 1;
  208. CH._colspan = 1;
  209. } else {
  210. if (!rewrite) {
  211. CH._colspan = CH.colspan;
  212. } else {
  213. CH.colspan = CH._colspan;
  214. }
  215. }
  216. if (CH.valign == undefined || CH.valign == null) CH.valign = "bottom";
  217. if (cfg.colHeadAlign) CH.align = "center";
  218. colLen += CH.colspan.number();
  219. }
  220. if (colMaxLen < colLen) colMaxLen = colLen;
  221. }
  222. for (var _m = 0; _m < cfg.colHead._maps.length; _m++) {
  223. cfg.colHead._maps[_m] = new Array(colMaxLen);
  224. }
  225. /* colEndPosition 관련 처리 함수 */
  226. var appendPosToColHeadMap = function (r, c, posR, position) {
  227. var nC = position.c;
  228. /*시작 컬럼 위치 */
  229. var startPosition = null;
  230. for (var rr = posR; rr < (posR + r); rr++) {
  231. if (r > 1) if (rr > 0 && startPosition != null) nC = startPosition;
  232. var tC = c;
  233. /*컬럼 루프횟수 */
  234. var isWhile = true;
  235. /* 루프유지변수 */
  236. while (isWhile) {
  237. try {
  238. if (tC == 0) {
  239. isWhile = false;
  240. } else {
  241. if (cfg.colHead._maps[rr][nC] == undefined) {
  242. cfg.colHead._maps[rr][nC] = position;
  243. if (startPosition == null) startPosition = nC;
  244. tC--;
  245. } else {
  246. nC++;
  247. }
  248. }
  249. } catch (e) {
  250. isWhile = false;
  251. }
  252. }
  253. }
  254. return startPosition;
  255. };
  256. for (var r = 0; r < cfg.colHead.rows.length; r++) {
  257. //var startPosition = null;
  258. //var isMultiRow = false;
  259. for (var CH, CHidx = 0, __arr = cfg.colHead.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  260. if (CH.colSeq != undefined) {
  261. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  262. } else {
  263. var myCG = cfg.colGroup.searchObject(function () {
  264. return CH.key == this.item.key;
  265. }).first();
  266. }
  267. if (myCG != null) {
  268. if (rewrite) AXUtil.overwriteObject(CH, myCG, true);
  269. else AXUtil.overwriteObject(CH, myCG, false);
  270. } else {
  271. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  272. }
  273. appendPosToColHeadMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  274. }
  275. }
  276. /*colHead._maps 마지막 줄에 해당하는 cfg.colHead.rows 에 속성부여 */
  277. for (var m, midx = 0, __arr = cfg.colHead._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  278. if (m) cfg.colHead.rows[m.r][m.c].isLastCell = true;
  279. }
  280. if (hasHiddenCell) { /* colGroup 중에 숨겨진 col 이 존재하는 경우 */
  281. /* colspan 감소 시키기 */
  282. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  283. if (!CG.display) {
  284. var rowPosition = null;
  285. for (var a = 0; a < cfg.colHead._maps.length; a++) {
  286. if (rowPosition != cfg.colHead._maps[a][cidx]) {
  287. rowPosition = cfg.colHead._maps[a][cidx];
  288. cfg.colHead.rows[rowPosition.r][rowPosition.c].colspan--;
  289. }
  290. }
  291. }
  292. }
  293. }
  294. /*trace(cfg.colHead._maps); //_maps check */
  295. /* colHeadRow 정해진 경우 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  296. } else {
  297. /* colHeadRow 정해지지 않은 경우 */
  298. cfg.colHead._maps = [
  299. []
  300. ];
  301. var colHeadRows = [
  302. []
  303. ];
  304. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  305. var adder = {
  306. key: CG.key,
  307. colSeq: CG.colSeq,
  308. label: CG.label,
  309. align: (cfg.colHeadAlign || CG.align || "left"),
  310. rowspan: 1, colspan: 1,
  311. valign: "bottom", isLastCell: true, display: CG.display, formatter: CG.formatter, checked: CG.checked, disabled: CG.disabled,
  312. sort: CG.sort,
  313. tooltip: CG.tooltip,
  314. displayLabel: (CG.displayLabel || false)
  315. };
  316. colHeadRows[0].push(adder);
  317. cfg.colHead._maps[0].push({ r: 0, c: cidx });
  318. }
  319. cfg.colHead.rows = colHeadRows;
  320. cfg.colHead.rowsEmpty = true;
  321. /* colHeadRow 정해지지 않은 경우 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  322. }
  323. /* colHead rows ----------------------------------------------------------------------------------------------------- */
  324. /* body rows ------------------------------------------------------------------------------------------------------- */
  325. if (cfg.body.rows) {
  326. /* bodyRow 정해진 경우 */
  327. cfg.body._maps = new Array(cfg.body.rows.length);
  328. var colMaxLen = 0;
  329. for (var r = 0; r < cfg.body.rows.length; r++) {
  330. var colLen = 0;
  331. for (var CH, CHidx = 0, __arr = cfg.body.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  332. if (CH.colspan == undefined || CH.colspan == null) {
  333. CH.colspan = 1;
  334. CH._colspan = 1;
  335. } else {
  336. if (!rewrite) CH._colspan = CH.colspan;
  337. else CH.colspan = CH._colspan;
  338. }
  339. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  340. if (CH.valign == undefined || CH.valign == null) CH.valign = "middle";
  341. /* if(CH.align == undefined || CH.align == null) CH.align = "left"; */
  342. colLen += CH.colspan.number();
  343. }
  344. if (colMaxLen < colLen) colMaxLen = colLen;
  345. }
  346. for (var _m = 0; _m < cfg.body._maps.length; _m++) {
  347. cfg.body._maps[_m] = new Array(colMaxLen);
  348. }
  349. /* colEndPosition 관련 처리 함수 */
  350. var appendPosToBodyMap = function (r, c, posR, position) {
  351. var nC = position.c;
  352. /*시작 컬럼 위치 */
  353. var startPosition = null;
  354. for (var rr = posR; rr < (posR + r); rr++) {
  355. if (r > 1) if (rr > 0 && startPosition != null) nC = startPosition;
  356. var tC = c;
  357. /*컬럼 루프횟수 */
  358. var isWhile = true;
  359. /* 루프유지변수 */
  360. while (isWhile) {
  361. try {
  362. if (tC == 0) {
  363. isWhile = false;
  364. } else {
  365. if (cfg.body._maps[rr][nC] == undefined) {
  366. cfg.body._maps[rr][nC] = position;
  367. if (startPosition == null) startPosition = nC;
  368. tC--;
  369. } else {
  370. nC++;
  371. }
  372. }
  373. } catch (e) {
  374. isWhile = false;
  375. }
  376. }
  377. }
  378. };
  379. for (var r = 0; r < cfg.body.rows.length; r++) {
  380. for (var CH, CHidx = 0, __arr = cfg.body.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  381. if (CH.colSeq != undefined) {
  382. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  383. } else {
  384. var myCG = cfg.colGroup.searchObject(function () {
  385. return this.item.key == CH.key;
  386. }).first();
  387. }
  388. if (myCG != null) {
  389. AXUtil.overwriteObject(CH, myCG, false);
  390. } else {
  391. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  392. }
  393. appendPosToBodyMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  394. }
  395. }
  396. /*body._maps 마지막 줄에 해당하는 cfg.body.rows 에 속성부여 */
  397. for (var m, midx = 0, __arr = cfg.body._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  398. if (m) cfg.body.rows[m.r][m.c].isLastCell = true;
  399. }
  400. if (hasHiddenCell) { /* colGroup 중에 숨겨진 col 이 존재하는 경우 */
  401. /* colspan 감소 시키기 */
  402. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  403. if (!CG.display) {
  404. for (var a = 0; a < cfg.body._maps.length; a++) {
  405. var rowPosition = cfg.body._maps[a][cidx];
  406. cfg.body.rows[rowPosition.r][rowPosition.c].colspan--;
  407. }
  408. }
  409. }
  410. }
  411. /* bodyRow 정해진 경우 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  412. } else {
  413. /* bodyRow 정해지지 않은 경우 */
  414. cfg.body._maps = [
  415. []
  416. ];
  417. var bodyRows = [
  418. []
  419. ];
  420. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  421. var adder = {
  422. key: CG.key, colSeq: CG.colSeq, label: CG.label, align: (CG.align || "left"), rowspan: 1, colspan: 1, valign: "middle", isLastCell: true,
  423. display: CG.display, checked: CG.checked, disabled: CG.disabled, formatter: CG.formatter,
  424. tooltip: CG.tooltip
  425. };
  426. bodyRows[0].push(adder);
  427. cfg.body._maps[0].push({ r: 0, c: cidx });
  428. }
  429. cfg.body.rows = bodyRows;
  430. cfg.body.rowsEmpty = true;
  431. /* bodyRow 정해지지 않은 경우 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  432. }
  433. /* body rows ------------------------------------------------------------------------------------------------------- */
  434. /*marker 관련 데이터 정리 */
  435. if (cfg.body.marker) {
  436. if (cfg.body.marker.rows) {
  437. this.bodyHasMarker = true;
  438. cfg.body.marker._maps = new Array(cfg.body.marker.rows.length);
  439. colMaxLen = 0;
  440. for (var r = 0; r < cfg.body.marker.rows.length; r++) {
  441. var colLen = 0;
  442. for (var CH, CHidx = 0, __arr = cfg.body.marker.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  443. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  444. if (CH.colspan == undefined || CH.colspan == null) {
  445. CH.colspan = 1;
  446. CH._colspan = 1;
  447. } else {
  448. if (!rewrite) CH._colspan = CH.colspan;
  449. else CH.colspan = CH._colspan;
  450. }
  451. if (CH.valign == undefined || CH.valign == null) CH.valign = "bottom";
  452. colLen += CH.colspan.number();
  453. }
  454. if (colMaxLen < colLen) colMaxLen = colLen;
  455. }
  456. for (var _m = 0; _m < cfg.body.marker._maps.length; _m++) {
  457. cfg.body.marker._maps[_m] = new Array(colMaxLen);
  458. }
  459. /* colEndPosition 관련 처리 함수 */
  460. var appendPosToMarkerMap = function (r, c, posR, position) {
  461. var nC = position.c;
  462. /*시작 컬럼 위치 */
  463. var startPosition = null;
  464. for (var rr = posR; rr < (posR + r); rr++) {
  465. if (r > 1) if (rr > 0 && startPosition != null) nC = startPosition;
  466. var tC = c;
  467. /*컬럼 루프횟수 */
  468. var isWhile = true;
  469. /* 루프유지변수 */
  470. while (isWhile) {
  471. try {
  472. if (tC == 0) {
  473. isWhile = false;
  474. } else {
  475. if (cfg.body.marker._maps[rr][nC] == undefined) {
  476. cfg.body.marker._maps[rr][nC] = position;
  477. if (startPosition == null) startPosition = nC;
  478. tC--;
  479. } else {
  480. nC++;
  481. }
  482. }
  483. } catch (e) {
  484. isWhile = false;
  485. }
  486. }
  487. }
  488. };
  489. for (var r = 0; r < cfg.body.marker.rows.length; r++) {
  490. for (var CH, CHidx = 0, __arr = cfg.body.marker.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  491. if (CH.colSeq != undefined) {
  492. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  493. } else {
  494. var myCG = cfg.colGroup.searchObject(function () {
  495. return this.item.key == CH.key;
  496. }).first();
  497. }
  498. if (myCG != null) {
  499. AXUtil.overwriteObject(CH, myCG, false);
  500. } else {
  501. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  502. }
  503. appendPosToMarkerMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  504. }
  505. }
  506. /*colHead._maps 마지막 줄에 해당하는 cfg.colHead.rows 에 속성부여 */
  507. for (var m, midx = 0, __arr = cfg.body.marker._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  508. if (m) cfg.body.marker.rows[m.r][m.c].isLastCell = true;
  509. }
  510. if (hasHiddenCell) { /* colGroup 중에 숨겨진 col 이 존재하는 경우 */
  511. /* colspan 감소 시키기 */
  512. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  513. if (!CG.display) {
  514. for (var a = 0; a < cfg.body.marker._maps.length; a++) {
  515. var rowPosition = cfg.body.marker._maps[a][cidx];
  516. cfg.body.marker.rows[rowPosition.r][rowPosition.c].colspan--;
  517. }
  518. }
  519. }
  520. }
  521. }
  522. }
  523. /*marker 관련 데이터 정리 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  524. /*head 관련 데이터 정리 */
  525. if (cfg.head) {
  526. cfg.head._maps = new Array(cfg.head.rows.length);
  527. colMaxLen = 0;
  528. for (var r = 0; r < cfg.head.rows.length; r++) {
  529. var colLen = 0;
  530. for (var CH, CHidx = 0, __arr = cfg.head.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  531. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  532. if (CH.colspan == undefined || CH.colspan == null) {
  533. CH.colspan = 1;
  534. CH._colspan = 1;
  535. } else {
  536. if (!rewrite) CH._colspan = CH.colspan;
  537. else CH.colspan = CH._colspan;
  538. }
  539. if (CH.valign == undefined || CH.valign == null) CH.valign = "bottom";
  540. /*if(CH.align == undefined || CH.align == null) CH.align = "left"; */
  541. colLen += CH.colspan.number();
  542. }
  543. if (colMaxLen < colLen) colMaxLen = colLen;
  544. }
  545. for (var _m = 0; _m < cfg.head._maps.length; _m++) {
  546. cfg.head._maps[_m] = new Array(colMaxLen);
  547. }
  548. /* colEndPosition 관련 처리 함수 */
  549. var appendPosToHeadMap = function (r, c, posR, position) {
  550. var nC = position.c;
  551. /*시작 컬럼 위치 */
  552. var startPosition = null;
  553. for (var rr = posR; rr < (posR + r); rr++) {
  554. if (r > 1) if (rr > 0 && startPosition != null) nC = startPosition;
  555. var tC = c;
  556. /*컬럼 루프횟수 */
  557. var isWhile = true;
  558. /* 루프유지변수 */
  559. while (isWhile) {
  560. try {
  561. if (tC == 0) {
  562. isWhile = false;
  563. } else {
  564. if (cfg.head._maps[rr][nC] == undefined) {
  565. cfg.head._maps[rr][nC] = position;
  566. if (startPosition == null) startPosition = nC;
  567. tC--;
  568. } else {
  569. nC++;
  570. }
  571. }
  572. } catch (e) {
  573. isWhile = false;
  574. }
  575. }
  576. }
  577. };
  578. for (var r = 0; r < cfg.head.rows.length; r++) {
  579. for (var CH, CHidx = 0, __arr = cfg.head.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  580. if (CH.colSeq != undefined) {
  581. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  582. } else {
  583. var myCG = cfg.colGroup.searchObject(function () {
  584. return this.item.key == CH.key;
  585. }).first();
  586. }
  587. if (myCG != null) {
  588. AXUtil.overwriteObject(CH, myCG, false);
  589. } else {
  590. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  591. }
  592. appendPosToHeadMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  593. }
  594. }
  595. /*colHead._maps 마지막 줄에 해당하는 cfg.colHead.rows 에 속성부여 */
  596. for (var m, midx = 0, __arr = cfg.head._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  597. if (m) cfg.head.rows[m.r][m.c].isLastCell = true;
  598. }
  599. if (hasHiddenCell) { /* colGroup 중에 숨겨진 col 이 존재하는 경우 */
  600. /* colspan 감소 시키기 */
  601. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  602. if (!CG.display) {
  603. for (var a = 0; a < cfg.head._maps.length; a++) {
  604. var rowPosition = cfg.head._maps[a][cidx];
  605. cfg.head.rows[rowPosition.r][rowPosition.c].colspan--;
  606. }
  607. }
  608. }
  609. }
  610. }
  611. /*head 관련 데이터 정리 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  612. /*foot 관련 데이터 정리 */
  613. if (cfg.foot) {
  614. cfg.foot._maps = new Array(cfg.foot.rows.length);
  615. colMaxLen = 0;
  616. for (var r = 0; r < cfg.foot.rows.length; r++) {
  617. var colLen = 0;
  618. for (var CH, CHidx = 0, __arr = cfg.foot.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  619. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  620. if (CH.colspan == undefined || CH.colspan == null) {
  621. CH.colspan = 1;
  622. CH._colspan = 1;
  623. } else {
  624. if (!rewrite) CH._colspan = CH.colspan;
  625. else CH.colspan = CH._colspan;
  626. }
  627. if (CH.valign == undefined || CH.valign == null) CH.valign = "bottom";
  628. colLen += CH.colspan.number();
  629. }
  630. if (colMaxLen < colLen) colMaxLen = colLen;
  631. }
  632. for (var _m = 0; _m < cfg.foot._maps.length; _m++) {
  633. cfg.foot._maps[_m] = new Array(colMaxLen);
  634. }
  635. /* colEndPosition 관련 처리 함수 */
  636. var appendPosToFootMap = function (r, c, posR, position) {
  637. var nC = position.c;
  638. /*시작 컬럼 위치 */
  639. var startPosition = null;
  640. for (var rr = posR; rr < (posR + r); rr++) {
  641. if (r > 1) if (rr > 0 && startPosition != null) nC = startPosition;
  642. var tC = c;
  643. var isWhile = true;
  644. while (isWhile) {
  645. try {
  646. if (tC == 0) {
  647. isWhile = false;
  648. } else {
  649. if (cfg.foot._maps[rr][nC] == undefined) {
  650. cfg.foot._maps[rr][nC] = position;
  651. if (startPosition == null) startPosition = nC;
  652. tC--;
  653. } else {
  654. nC++;
  655. }
  656. }
  657. } catch (e) {
  658. isWhile = false;
  659. }
  660. }
  661. }
  662. };
  663. for (var r = 0; r < cfg.foot.rows.length; r++) {
  664. for (var CH, CHidx = 0, __arr = cfg.foot.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  665. if (CH.colSeq != undefined) {
  666. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  667. } else {
  668. var myCG = cfg.colGroup.searchObject(function () {
  669. return this.item.key == CH.key;
  670. }).first();
  671. }
  672. if (myCG != null) {
  673. AXUtil.overwriteObject(CH, myCG, false);
  674. } else {
  675. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  676. }
  677. appendPosToFootMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  678. }
  679. }
  680. /*colHead._maps 마지막 줄에 해당하는 cfg.colHead.rows 에 속성부여 */
  681. for (var m, midx = 0, __arr = cfg.foot._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  682. if (m) cfg.foot.rows[m.r][m.c].isLastCell = true;
  683. }
  684. if (hasHiddenCell) { /* colGroup 중에 숨겨진 col 이 존재하는 경우 */
  685. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  686. if (!CG.display) {
  687. for (var a = 0; a < cfg.foot._maps.length; a++) {
  688. var rowPosition = cfg.foot._maps[a][cidx];
  689. cfg.foot.rows[rowPosition.r][rowPosition.c].colspan--;
  690. }
  691. }
  692. }
  693. }
  694. }
  695. /*foot 관련 데이터 정리 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  696. /*editor 관련 데이터 정리 */
  697. if (cfg.editor) {
  698. if (cfg.editor.rows) {
  699. this.hasEditor = true;
  700. cfg.editor._maps = new Array(cfg.editor.rows.length);
  701. colMaxLen = 0;
  702. for (var r = 0; r < cfg.editor.rows.length; r++) {
  703. var colLen = 0;
  704. for (var CH, CHidx = 0, __arr = cfg.editor.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  705. if (CH) {
  706. if (CH.rowspan == undefined || CH.rowspan == null) CH.rowspan = 1;
  707. if (CH.colspan == undefined || CH.colspan == null) {
  708. CH.colspan = 1;
  709. CH._colspan = 1;
  710. } else {
  711. if (!rewrite) CH._colspan = CH.colspan;
  712. else CH.colspan = CH._colspan;
  713. }
  714. if (CH.valign == undefined || CH.valign == null) CH.valign = "bottom";
  715. colLen += CH.colspan.number();
  716. }
  717. }
  718. if (colMaxLen < colLen) colMaxLen = colLen;
  719. }
  720. for (var _m = 0; _m < cfg.editor._maps.length; _m++) {
  721. cfg.editor._maps[_m] = new Array(colMaxLen);
  722. }
  723. /* colEndPosition 관련 처리 함수 */
  724. var appendPosToEditorMap = function (r, c, posR, position) {
  725. var nC = position.c;
  726. var startPosition = null;
  727. for (var rr = posR; rr < (posR + r); rr++) {
  728. var tC = c;
  729. var isWhile = true;
  730. while (isWhile) {
  731. try {
  732. if (tC == 0) {
  733. isWhile = false;
  734. } else {
  735. if (cfg.editor._maps[rr][nC] == undefined) {
  736. cfg.editor._maps[rr][nC] = position;
  737. if (startPosition == null) startPosition = nC;
  738. tC--;
  739. } else {
  740. nC++;
  741. }
  742. }
  743. } catch (e) {
  744. isWhile = false;
  745. }
  746. }
  747. }
  748. };
  749. for (var r = 0; r < cfg.editor.rows.length; r++) {
  750. for (var CH, CHidx = 0, __arr = cfg.editor.rows[r]; (CHidx < __arr.length && (CH = __arr[CHidx])); CHidx++) {
  751. if (CH) {
  752. if (CH.colSeq != undefined) {
  753. var myCG = cfg.colGroup.getToSeq(CH.colSeq);
  754. } else {
  755. var myCG = cfg.colGroup.searchObject(function () {
  756. return this.item.key == CH.key;
  757. }).first();
  758. }
  759. if (myCG != null) {
  760. AXUtil.overwriteObject(CH, myCG, false);
  761. } else {
  762. AXUtil.overwriteObject(CH, { align: "left", valign: "bottom", display: true, rowspan: 1, colspan: 1 }, false);
  763. }
  764. appendPosToEditorMap(CH.rowspan, CH.colspan, r, { r: r, c: CHidx });
  765. }
  766. }
  767. }
  768. for (var m, midx = 0, __arr = cfg.editor._maps.last(); (midx < __arr.length && (m = __arr[midx])); midx++) {
  769. if (m) cfg.editor.rows[m.r][m.c].isLastCell = true;
  770. }
  771. if (hasHiddenCell) {
  772. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  773. if (!CG.display) {
  774. for (var a = 0; a < cfg.editor._maps.length; a++) {
  775. var rowPosition = cfg.editor._maps[a][cidx];
  776. cfg.editor.rows[rowPosition.r][rowPosition.c].colspan--;
  777. }
  778. }
  779. }
  780. }
  781. }
  782. }
  783. /*editor 관련 데이터 정리 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  784. /*fixedColSeq가 설정된 경우 */
  785. if (cfg.fixedColSeq != undefined && cfg.fixedColSeq != null) {
  786. var fixedColSeq = this.fixedColSeq;
  787. for (var m, midx = 0, __arr = cfg.colHead._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  788. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  789. if (c) {
  790. if ((fixedColSeq + 1) > cidx) cfg.colHead.rows[c.r][c.c].isFixedCell = true;
  791. }
  792. }
  793. }
  794. for (var m, midx = 0, __arr = cfg.body._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  795. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  796. if (c) {
  797. if (fixedColSeq == cidx) cfg.body.rows[c.r][c.c].isFixedEndCell = true;
  798. if ((fixedColSeq + 1) > cidx) cfg.body.rows[c.r][c.c].isFixedCell = true;
  799. }
  800. }
  801. }
  802. if (cfg.head) {
  803. for (var m, midx = 0, __arr = cfg.head._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  804. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  805. if (c) {
  806. if (fixedColSeq == cidx) cfg.head.rows[c.r][c.c].isFixedEndCell = true;
  807. if ((fixedColSeq + 1) > cidx) cfg.head.rows[c.r][c.c].isFixedCell = true;
  808. }
  809. }
  810. }
  811. }
  812. if (cfg.foot) {
  813. for (var m, midx = 0, __arr = cfg.foot._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  814. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  815. if (c) {
  816. if (fixedColSeq == cidx) cfg.foot.rows[c.r][c.c].isFixedEndCell = true;
  817. if ((fixedColSeq + 1) > cidx) cfg.foot.rows[c.r][c.c].isFixedCell = true;
  818. }
  819. }
  820. }
  821. }
  822. if (cfg.body.marker) {
  823. if (cfg.body.marker.rows) {
  824. for (var m, midx = 0, __arr = cfg.body.marker._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  825. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  826. if (c) {
  827. if (fixedColSeq == cidx) cfg.body.marker.rows[c.r][c.c].isFixedEndCell = true;
  828. if ((fixedColSeq + 1) > cidx) cfg.body.marker.rows[c.r][c.c].isFixedCell = true;
  829. }
  830. }
  831. }
  832. }
  833. }
  834. if (cfg.editor) {
  835. if (cfg.editor.rows) {
  836. for (var m, midx = 0, __arr = cfg.editor._maps; (midx < __arr.length && (m = __arr[midx])); midx++) {
  837. for (var c, cidx = 0, __arr2 = m; (cidx < __arr2.length && (c = __arr2[cidx])); cidx++) {
  838. if (c) {
  839. if (fixedColSeq == cidx) cfg.editor.rows[c.r][c.c].isFixedEndCell = true;
  840. if ((fixedColSeq + 1) > cidx) cfg.editor.rows[c.r][c.c].isFixedCell = true;
  841. }
  842. }
  843. }
  844. }
  845. }
  846. this.hasFixed = true;
  847. if (hasHiddenCell) {
  848. var minusFixedCol = 0;
  849. var fixedColSeq = this.fixedColSeq;
  850. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  851. if (!CG.display) {
  852. if ((fixedColSeq + 1) > cidx) minusFixedCol++;
  853. }
  854. }
  855. cfg.fixedColSeq = this.fixedColSeq - minusFixedCol;
  856. } else {
  857. cfg.fixedColSeq = this.fixedColSeq;
  858. }
  859. if (cfg.fixedColSeq == -1) {
  860. /*fixed 제거*/
  861. this.hasFixed = false;
  862. }
  863. var fixedColSeq = this.fixedColSeq, fixedColWidth = 0;
  864. for (var CG, cidx = 0, __arr = cfg.colGroup; (cidx < __arr.length && (CG = __arr[cidx])); cidx++) {
  865. if (CG.display && cidx < (fixedColSeq + 1)) {
  866. fixedColWidth += CG.width.number();
  867. }
  868. }
  869. this.fixedColWidth = fixedColWidth;
  870. }
  871. },
  872. init: function () {
  873. var cfg = this.config;
  874. if (Object.isUndefined(cfg.targetID)) {
  875. trace("need targetID - setConfig({targetID:''})");
  876. return;
  877. }
  878. if (!cfg.colGroup) {
  879. trace("need colGroup - setConfig({colGroup:[]})");
  880. return;
  881. }
  882. cfg.emptyListMSG = cfg.emptyListMSG || AXConfig.AXGrid.emptyListMSG;
  883. cfg.listCountMSG = cfg.listCountMSG || AXConfig.AXGrid.listCountMSG || "전체 <b>{listCount}</b>개의 목록이 있습니다.";
  884. cfg.pageCountMSG = cfg.pageCountMSG || AXConfig.AXGrid.pageCountMSG;
  885. /*
  886. cfg.viewMode 결정 구간.
  887. */
  888. if (cfg.mediaQuery) {
  889. var _viewMode = "", clientWidth = axf.clientWidth();
  890. axf.each(cfg.mediaQuery, function (k, v) {
  891. if (Object.isObject(v)) {
  892. if(v.min != undefined && v.max != undefined){
  893. if (v.min <= clientWidth && clientWidth <= v.max) {
  894. _viewMode = (k == "dx") ? "grid" : "mobile";
  895. return false;
  896. }
  897. }else{
  898. if (v.min <= clientWidth) {
  899. _viewMode = (k == "dx") ? "grid" : "mobile";
  900. return false;
  901. }
  902. }
  903. }
  904. });
  905. if (_viewMode != "") {
  906. cfg.viewMode = _viewMode;
  907. }
  908. }
  909. if (Object.isObject(cfg.colGroup)) {
  910. var newColGroup = cfg.colGroup.concat();
  911. cfg.colGroup = newColGroup;
  912. }
  913. this.target = axdom("#" + cfg.targetID);
  914. var targetInnerHeight = this.target.innerHeight();
  915. if (targetInnerHeight == 0) targetInnerHeight = (AXConfig.AXGrid.pageHeight || 400);
  916. this.theme = (cfg.theme) ? cfg.theme : "AXGrid";
  917. /* 테마기본값 지정*/
  918. cfg.height = (cfg.height) ? cfg.height : targetInnerHeight + "px";
  919. /* 그리드 높이 지정 */
  920. var theme = this.theme;
  921. var gridCss = [];
  922. if (cfg.width) gridCss.push("width:" + cfg.width + ";");
  923. if (cfg.height) gridCss.push("height:" + cfg.height + ";");
  924. /* grid 뼈대 그리기 ----------------------------------------------------------------------------------------------------- */
  925. var ol = [];
  926. ol.push("<div class=\"" + theme + "\" id=\"" + cfg.targetID + "_AX_grid\" style=\"" + gridCss.join('') + "\">");
  927. ol.push(" <div class=\"AXgridScrollBody\" id=\"" + cfg.targetID + "_AX_gridScrollBody\" style=\"z-index:2;\">");
  928. ol.push(" <div class=\"AXGridColHead AXUserSelectNone\" id=\"" + cfg.targetID + "_AX_gridColHead\" onselectstart=\"return false;\"></div>");
  929. ol.push(" <div class=\"AXGridToolGroup top\" id=\"" + cfg.targetID + "_AX_gridToolGroupTop\"></div>");
  930. ol.push(" <div class=\"AXGridBody\" id=\"" + cfg.targetID + "_AX_gridBody\"></div>");
  931. ol.push(" <div cla…