{"version":3,"sources":["ax5grid.min.js","ax5grid.js","ax5grid-body.js","ax5grid-collector.js","ax5grid-data.js","ax5grid-excel.js","ax5grid-formatter.js","ax5grid-header.js","ax5grid-inline-editor.js","ax5grid-page.js","ax5grid-scroller.js","ax5grid-tmpl.js","ax5grid-util.js"],"names":["_typeof","Symbol","iterator","obj","constructor","prototype","UI","ax5","ui","U","util","GRID","addClass","className","self","this","cfg","ctrlKeys","33","34","35","36","37","38","39","40","instanceId","getGuid","config","theme","animateTime","debounceTime","appendDebouncer","appendDebounceTimes","appendProgressIcon","appendProgress","frozenColumnIndex","frozenRowIndex","showLineNumber","showRowSelector","multipleSelect","virtualScrollY","virtualScrollX","headerSelect","virtualScrollYCountMargin","virtualScrollAccelerated","virtualScrollAcceleratedDelayTime","height","columnMinWidth","lineNumberColumnWidth","rowSelectorColumnWidth","sortable","undefined","remoteSort","header","display","align","columnHeight","columnPadding","columnBorderWidth","selector","body","grouping","mergeCells","rightSum","footSum","page","statusDisplay","navigationItemCount","scroller","size","barMinSize","trackPadding","columnKeys","selected","modified","deleted","disableSelection","tree","use","hashDigit","indentWidth","arrowWidth","iconWidth","icons","openedArrow","collapsedArrow","groupIcon","collapsedGroupIcon","itemIcon","parentKey","selfKey","collapse","hidden","parentHash","selfHash","children","depth","xvar","bodyTrHeight","scrollContentWidth","scrollContentHeight","scrollTimer","columns","colGroup","footSumColumns","bodyGrouping","list","proxyList","selectedDataIndexs","deletedList","sortInfo","focusedColumn","selectedColumn","isInlineEditing","inlineEditing","listIndexMap","contextMenu","headerTable","leftHeaderData","headerData","rightHeaderData","bodyRowTable","leftBodyRowData","bodyRowData","rightBodyRowData","bodyRowMap","bodyGroupingTable","leftBodyGroupingData","bodyGroupingData","rightBodyGroupingData","bodyGroupingMap","footSumTable","leftFootSumData","footSumData","needToPaintSum","initGrid","data","id","$target","html","tmpl","get","$","container","find","root","panel","aside-header","left-header","header-scroll","right-header","top-aside-body","top-left-body","top-body","top-body-scroll","top-right-body","aside-body","aside-body-scroll","left-body","left-body-scroll","body-scroll","right-body","right-body-scroll","bottom-aside-body","bottom-left-body","bottom-body","bottom-body-scroll","bottom-right-body","livePanelKeys","vertical","vertical-bar","horizontal","horizontal-bar","corner","navigation","status","form","clipboard","resizer","css","_height","initColumns","_columns","isArray","deepCopy","makeHeaderTable","call","makeBodyRowTable","makeBodyRowMap","rows","length","colGroupMap","r","rl","row","c","cl","cols","colIndex","jQuery","extend","k","push","onResetColumns","resetColGroupWidth","initFootSum","initBodyGroup","alignGrid","repaint","resize","CT_WIDTH","width","totalWidth","computedWidth","autoWidthColgroupIndexs","i","l","isNumber","_width","right","left","_footSum","makeFootSumTable","_grouping","by","makeBodyGroupingTable","kl","orderBy","seq","fixed","key","sort","sortFixed","_isFirst","Math","min","innerWidth","innerHeight","CT_HEIGHT","CT_INNER_WIDTH","CT_INNER_HEIGHT","asidePanelWidth","frozenPanelWidth","endIndex","verticalScrollerWidth","horizontalScrollerHeight","bodyHeight","rightPanelWidth","frozenRowHeight","footSumHeight","headerHeight","pageHeight","totalColGroupWidth","bodyWidth","panelDisplayProcess","vPosition","hPosition","containerType","isHide","hide","show","scrollerDisplayProcess","scrollerWidth","scrollerHeight","sortColumns","_sortInfo","isFunction","that","a","b","initData","clearGroupingData","resetLineNumber","init","_config","target","console","log","info","getError","onStateChanged","onClick","onLoad","onDataChanged","isObject","error","parseJson","attr","grid","window","bind","document","on","e","isPickerClick","findParentNode","_target","getAttribute","focused","blur","which","eventKeys","ESC","keyDown","originalEvent","RETURN","TAB","stopEvent","UP","shiftKey","DOWN","metaKey","ctrlKey","copySelect","SPACE","Object","keys","setTimeout","processor","KEY_UP","moveFocus","KEY_DOWN","KEY_LEFT","KEY_RIGHT","KEY_HOME","KEY_END","INLINE_EDIT","_e","inlineEdit","active","test","keydown","activeEditLength","columnKey","_act","_data","copysuccess","$clipBoard","copyTextArray","copyText","_rowIndex","_colIndex","_dindex","_di","_column","dindex","rowIndex","originalColumn","__isGrouping","forEach","join","innerText","select","execCommand","setData","isFirstPaint","paintStartRowIndex","set","scrollTo","top","navigationUpdate","getList","_type","setHeight","offsetParent","addRow","_row","_options","_this","add","focus","appendToList","_list","append","removeRow","remove","updateRow","update","repaintRow","updateChildRows","_updateData","updateChild","paintStartColumnIndex","deleteRow","setValue","_key","_value","doindex","repaintCell","_panelName","_rows","__dindex","__doindex","__key","__value","addColumn","first","concat","last","_cindex","_i","_l","splice","removeColumn","updateColumn","setColumnWidth","columnResizerIndex","getColumnSortInfo","setColumnSort","applySortStatus","_selectObject","selectedClear","clearSelect","updateRowState","clickBody","click","DBLClickBody","dblClick","selectAll","updateRowStateAll","exportExcel","_fileName","table","getExcelString","excel","_pos","selectedIndex","HOME","END","destroy","empty","grid_instance","filter","main","arguments","setConfig","apply","columnSelect","focusClear","panelName","removeAttr","clear","column","editKey","colspan","selectedRange","start","end","deActive","trl","range","s","max","_panels","columnSelector","cell","Number","off","_states","_doindex","di","pi","doi","__original_index__","cellChecked","checked","_state","col","targetClick","default","item","value","editor","type","getValue","newValue","trueValue","falseValue","editorConfig","rowSelector","internalCall","lineNumber","tree-control","_el","toggleCollapse","targetDBLClick","onDBLClick","param","t","menu","element","gridSelf","popup","popupFilter","touchmoved","resetFrozenColumn","paintRowCountMargin","paintRowCountTopMargin","floor","__throttledScroll","throttle","opts","noRepaint","callback","dividedBodyRowObj","divideTableByFrozenColumnIndex","asideBodyRowData","dataTable","label","rowspan","_col","columnAttr","leftData","rightData","dividedBodyGroupingObj","asideBodyGroupingData","dividedFootSumObj","getFieldValue","_item","_index","_returnPlainText","tagsToReplace","<",">","_editor","inlineEditor","editMode","__origin_index__","disabled","getHtml","valueProcessor","formatter","returnValue","replace","tag","treeControl","indentNodeHtml","getGroupingValue","_label","__groupingList","groupBy","__groupingBy","collector","getSumFieldValue","_reset","virtualPaintStartRowIndex","position","isNaN","paintEndColumnIndex","nopaintLeftColumnsWidth","nopaintRightColumnsWidth","bodyScrollLeft","ci","_sx","_ex","padding-left","padding-right","headerColGroup","bodyAlign","paintRowCount","virtualPaintRowCount","ceil","abs","dataRowCount","getTableByStartEndColumnIndex","repaintBody","_elTargetKey","_colGroup","_bodyRow","_groupRow","_scrollConfig","_elTarget","SS","cgi","cgl","dl","tri","cellHeight","colAlign","isScrolled","stripeString","len","isGroupingRow","rowTable","odi","trStyleClass","index","_focusedColumn","_selectedColumn","attrs","tdCSS_class","styleClass","_cellHeight","lineHeight","multiLine","innerHTML","repaintSum","isFootSum","mergeCellsBody","tblRowMaps","token","hasMergeTd","tableTrs","ri","tableTrTds","trMaps","childNodes","tdObj","text","_loop","prevTokenColIndexs","_loop2","search","hasFalse","ti","scrollConfig","frozenScrollConfig","asideColGroup","slice","leftHeaderColGroup","statusUpdate","_newValue","updateCell","updateWith","updateColumnKey","findPanelByColumnIndex","updateWithCell","replaceGroupTr","replaceTr","tr_element","timeoutUnUse","_position","UD","_dy","moveResult","while_i","nPanelInfo","newTop","LR","_dx","isScrollPanel","containerPanelName","isScrollTo","scrollLeft","$column","newLeft","outerWidth","INDEX","scrollTopValue","LEFT","RIGHT","_initValue","useReturnToSave","originalValue","initValue","__editor","isNothing","number","money","$inlineEditorCell","$inlineEditor","_msg","editorValue","tagName","val","action","CANCEL","__clear","bindedAx5ui","ax5picker","ax5select","getBody","getSum","po","_collapse","getProxyList","sum","avg","listLength","round","returnList","appendIndex","dataRealRowCount","groupingKeys","map","compareString","gi","gl","appendRow","ari","appendRowItem","labels","ki","arrangeData4tree","li","setDigit","_parent","_parentHash","__list","treeKeys","substr","ii","originIndex","_k","listIndex","Function","getRealPathForDataItem","_selected","sortInfoArray","getKeyValue","order","_a_val","_b_val","_a","_b","_callback","appendIdle","clearTimeout","_doindx","getExcelTmpl","tableToExcel","fileName","output","tables","mustache","render","worksheet","arr","name","isChrome","navigator","userAgent","indexOf","isSafari","isIE","documentMode","blob1","blankWindow","$iframe","iframe","anchor","msSaveOrOpenBlob","Blob","open","write","close","appendChild","createElement","download","href","URL","createObjectURL","removeChild","export","regExpPattern","RegExp","arrNumber","split","columnResizerEvent","_columnResizer","$columnResizer","columnResizerPositionLeft","offset","gridTargetOffsetLeft","resizeRange","ENM","mouseObj","getMousePosition","__da","clientX","mousePosition","columnResizerLived","removeClass","unbind","toggleSort","dividedHeaderObj","asideHeaderData","headerAlign","repaintHeader","tableWidth","trCSS_class","headerStyleClass","_SS","enableFilter","resizerHeight","resizerLeft","AS","sortOrder","multiSort","getHeader","edit_text","_root","_columnKey","attributes","attributesText","_$parent","$el","bindUI","_$el","edit_money","ax5formatter","pattern","edit_number","edit_date","direction","content","state","activePicker","edit_select","eConfig","optionValue","optionText","optionSelected","options","n","tabIndex","activeSelectOptionGroup","edit_checkbox","marginTop","edit_textarea","_getHtml","_bindUI","box","editorHeight","buttonHeight","$newDiv","$newTextarea","date","checkbox","textarea","onclickPageMove","_pageNo","currentPage","selectPage","onChange","prev","pageNo","next","totalPages","hasPage","pageSize","totalElements","firstIcon","prevIcon","nextIcon","lastIcon","returns","startI","endI","p","toRowIndex","rangeCount","fromRowIndex","progress","fromRowIndex_page","toRowIndex_page","convertScrollPosition","_var","_content_height","_panel_height","_scroller_height","_vertical_scroller_height","verticalScrollBarHeight","_content_width","_panel_width","_scroller_width","_horizontal_scroller_width","horizontalScrollBarWidth","convertScrollBarPosition","_top","scrollPositon","_left","scrollBarMover","track","bar","Date","getTime","moveout_timer","trackOffset","barBox","outerHeight","trackBox","getScrollerPosition","clientY","barOffset","scrollContentMover","wheel","delta","_body_scroll_position","body_panel_height","body_panel_width","_top_is_end","_left_is_end","x","y","getContentPosition","__x_da","__y_da","margin","E","detail","deltaY","wheelDelta","deltaX","supportTouch","page_navigation","page_status","tmplName","template","parse","_table","_frozenColumnIndex","tempTable_l","tempTable_r","colStartIndex","colEndIndex","leftCol","rightCol","_startColumnIndex","_endColumnIndex","tempTable","changedTouches","pageX","pageY","mousedown","mousemove","mouseup","maekRows","parentField","field","selfMakeRow","__columns","_footSumColumns","footSumRow","addC","_bodyGroupingColumns","_containerPanelName","_isScrollPanel","_dataPath","path","_path"],"mappings":"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","file":"ax5grid.min.js","sourcesContent":["\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*\n * Copyright (c) 2016. tom@axisj.com\n * - github.com/thomasjang\n * - www.axisj.com\n */\n\n// ax5.ui.grid\n(function () {\n\n var UI = ax5.ui;\n var U = ax5.util;\n var GRID = void 0;\n\n UI.addClass({\n className: \"grid\"\n }, function () {\n /**\n * @class ax5grid\n * @classdesc\n * @author tom@axisj.com\n * @example\n * ```\n * var myGrid = new ax5.ui.grid();\n * ```\n */\n return function () {\n var self = this,\n cfg = void 0,\n ctrlKeys = {\n \"33\": \"KEY_PAGEUP\",\n \"34\": \"KEY_PAGEDOWN\",\n \"35\": \"KEY_END\",\n \"36\": \"KEY_HOME\",\n \"37\": \"KEY_LEFT\",\n \"38\": \"KEY_UP\",\n \"39\": \"KEY_RIGHT\",\n \"40\": \"KEY_DOWN\"\n };\n\n this.instanceId = ax5.getGuid();\n this.config = {\n theme: 'default',\n animateTime: 250,\n debounceTime: 250,\n appendDebouncer: null,\n appendDebounceTimes: 0,\n appendProgressIcon: '...',\n appendProgress: false,\n\n // 틀고정 속성\n frozenColumnIndex: 0,\n frozenRowIndex: 0,\n showLineNumber: false,\n showRowSelector: false,\n multipleSelect: true,\n virtualScrollY: true,\n virtualScrollX: true,\n headerSelect: true,\n\n // 스크롤될 때 body 페인팅 딜레이를 주어 성능이 좋은 않은 브라우저에서 반응을 빠르게 할 때 사용하는 옵션들\n virtualScrollYCountMargin: 0,\n virtualScrollAccelerated: true,\n virtualScrollAcceleratedDelayTime: 10,\n\n height: 0,\n columnMinWidth: 100,\n lineNumberColumnWidth: 30,\n rowSelectorColumnWidth: 26,\n sortable: undefined,\n remoteSort: false,\n\n header: {\n display: true,\n align: false,\n columnHeight: 26,\n columnPadding: 3,\n columnBorderWidth: 1,\n selector: true\n },\n body: {\n align: false,\n columnHeight: 26,\n columnPadding: 3,\n columnBorderWidth: 1,\n grouping: false,\n mergeCells: false\n },\n rightSum: false,\n footSum: false,\n page: {\n height: 25,\n display: true,\n statusDisplay: true,\n navigationItemCount: 5\n },\n scroller: {\n size: 15,\n barMinSize: 15,\n trackPadding: 4\n },\n columnKeys: {\n selected: '__selected__',\n modified: '__modified__',\n deleted: '__deleted__',\n disableSelection: '__disable_selection__'\n },\n tree: {\n use: false,\n hashDigit: 8,\n indentWidth: 10,\n arrowWidth: 15,\n iconWidth: 18,\n icons: {\n openedArrow: '▾',\n collapsedArrow: '▸',\n groupIcon: '⊚',\n collapsedGroupIcon: '⊚',\n itemIcon: '⊙'\n },\n columnKeys: {\n parentKey: \"pid\",\n selfKey: \"id\",\n collapse: \"collapse\",\n hidden: \"hidden\",\n parentHash: \"__hp__\",\n selfHash: \"__hs__\",\n children: \"__children__\",\n depth: \"__depth__\"\n }\n }\n };\n this.xvar = {\n bodyTrHeight: 0, // 한줄의 높이\n scrollContentWidth: 0, // 스크롤 될 내용물의 너비 (스크롤 될 내용물 : panel['body-scroll'] 안에 컬럼이 있는)\n scrollContentHeight: 0, // 스크롤 된 내용물의 높이\n scrollTimer: null\n };\n\n // 그리드 데이터셋\n this.columns = []; // config.columns에서 복제된 오브젝트\n this.colGroup = []; // columns를 table태그로 출력하기 좋게 변환한 오브젝트\n this.footSumColumns = [];\n this.bodyGrouping = {};\n\n this.list = []; // 그리드의 데이터\n this.proxyList = null; // 그리드 데이터의 대리자\n this.page = null; // 그리드의 페이지 정보\n this.selectedDataIndexs = [];\n this.deletedList = [];\n this.sortInfo = {}; // 그리드의 헤더 정렬 정보\n this.focusedColumn = {}; // 그리드 바디의 포커스된 셀 정보\n this.selectedColumn = {}; // 그리드 바디의 선택된 셀 정보\n this.isInlineEditing = false;\n this.inlineEditing = {};\n this.listIndexMap = {}; // tree데이터 사용시 데이터 인덱싱 맵\n this.contextMenu = null; // contentMenu 의 인스턴스\n\n // header\n this.headerTable = {};\n this.leftHeaderData = {};\n this.headerData = {};\n this.rightHeaderData = {};\n\n // body\n this.bodyRowTable = {};\n this.leftBodyRowData = {};\n this.bodyRowData = {};\n this.rightBodyRowData = {};\n this.bodyRowMap = {};\n\n this.bodyGroupingTable = {};\n this.leftBodyGroupingData = {};\n this.bodyGroupingData = {};\n this.rightBodyGroupingData = {};\n this.bodyGroupingMap = {};\n\n // footSum\n this.footSumTable = {}; // footSum의 출력레이아웃\n this.leftFootSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 왼쪽\n this.footSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 오른쪽\n this.needToPaintSum = true; // 데이터 셋이 변경되어 summary 변경 필요여부\n\n cfg = this.config;\n\n var initGrid = function initGrid() {\n // 그리드 템플릿에 전달하고자 하는 데이터를 정리합시다.\n\n var data = {\n instanceId: this.id\n };\n\n this.$target.html(GRID.tmpl.get(\"main\", data));\n\n // 그리드 패널 프레임의 각 엘리먼트를 캐쉬합시다.\n this.$ = {\n \"container\": {\n \"hidden\": this.$target.find('[data-ax5grid-container=\"hidden\"]'),\n \"root\": this.$target.find('[data-ax5grid-container=\"root\"]'),\n \"header\": this.$target.find('[data-ax5grid-container=\"header\"]'),\n \"body\": this.$target.find('[data-ax5grid-container=\"body\"]'),\n \"page\": this.$target.find('[data-ax5grid-container=\"page\"]'),\n \"scroller\": this.$target.find('[data-ax5grid-container=\"scroller\"]')\n },\n \"panel\": {\n \"aside-header\": this.$target.find('[data-ax5grid-panel=\"aside-header\"]'),\n \"left-header\": this.$target.find('[data-ax5grid-panel=\"left-header\"]'),\n \"header\": this.$target.find('[data-ax5grid-panel=\"header\"]'),\n \"header-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"header\"]'),\n \"right-header\": this.$target.find('[data-ax5grid-panel=\"right-header\"]'),\n \"top-aside-body\": this.$target.find('[data-ax5grid-panel=\"top-aside-body\"]'),\n \"top-left-body\": this.$target.find('[data-ax5grid-panel=\"top-left-body\"]'),\n \"top-body\": this.$target.find('[data-ax5grid-panel=\"top-body\"]'),\n \"top-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"top-body\"]'),\n \"top-right-body\": this.$target.find('[data-ax5grid-panel=\"top-right-body\"]'),\n \"aside-body\": this.$target.find('[data-ax5grid-panel=\"aside-body\"]'),\n \"aside-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"aside-body\"]'),\n \"left-body\": this.$target.find('[data-ax5grid-panel=\"left-body\"]'),\n \"left-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"left-body\"]'),\n \"body\": this.$target.find('[data-ax5grid-panel=\"body\"]'),\n \"body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"body\"]'),\n \"right-body\": this.$target.find('[data-ax5grid-panel=\"right-body\"]'),\n \"right-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"right-body\"]'),\n \"bottom-aside-body\": this.$target.find('[data-ax5grid-panel=\"bottom-aside-body\"]'),\n \"bottom-left-body\": this.$target.find('[data-ax5grid-panel=\"bottom-left-body\"]'),\n \"bottom-body\": this.$target.find('[data-ax5grid-panel=\"bottom-body\"]'),\n \"bottom-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"bottom-body\"]'),\n \"bottom-right-body\": this.$target.find('[data-ax5grid-panel=\"bottom-right-body\"]')\n },\n \"livePanelKeys\": [], // 현재 사용중인 패널들 (grid-body repaint에서 수집하여 처리)\n \"scroller\": {\n \"vertical\": this.$target.find('[data-ax5grid-scroller=\"vertical\"]'),\n \"vertical-bar\": this.$target.find('[data-ax5grid-scroller=\"vertical-bar\"]'),\n \"horizontal\": this.$target.find('[data-ax5grid-scroller=\"horizontal\"]'),\n \"horizontal-bar\": this.$target.find('[data-ax5grid-scroller=\"horizontal-bar\"]'),\n \"corner\": this.$target.find('[data-ax5grid-scroller=\"corner\"]')\n },\n \"page\": {\n \"navigation\": this.$target.find('[data-ax5grid-page=\"navigation\"]'),\n \"status\": this.$target.find('[data-ax5grid-page=\"status\"]')\n },\n \"form\": {\n \"clipboard\": this.$target.find('[data-ax5grid-form=\"clipboard\"]')\n },\n \"resizer\": {\n \"vertical\": this.$target.find('[data-ax5grid-resizer=\"vertical\"]'),\n \"horizontal\": this.$target.find('[data-ax5grid-resizer=\"horizontal\"]')\n }\n };\n\n this.$[\"container\"][\"root\"].css({ height: this.config.height || this.config._height });\n\n return this;\n };\n var initColumns = function initColumns(_columns) {\n if (!U.isArray(_columns)) _columns = [];\n this.columns = U.deepCopy(_columns);\n\n this.headerTable = GRID.util.makeHeaderTable.call(this, this.columns);\n this.xvar.frozenColumnIndex = cfg.frozenColumnIndex || 0;\n\n this.bodyRowTable = GRID.util.makeBodyRowTable.call(this, this.columns);\n this.bodyRowMap = GRID.util.makeBodyRowMap.call(this, this.bodyRowTable);\n // 바디에 표현될 한줄의 높이를 계산합니다.\n this.xvar.bodyTrHeight = this.bodyRowTable.rows.length * this.config.body.columnHeight;\n\n var colGroupMap = {};\n for (var r = 0, rl = this.headerTable.rows.length; r < rl; r++) {\n var row = this.headerTable.rows[r];\n for (var c = 0, cl = row.cols.length; c < cl; c++) {\n colGroupMap[row.cols[c].colIndex] = jQuery.extend({}, row.cols[c]);\n }\n }\n\n this.colGroup = [];\n for (var k in colGroupMap) {\n this.colGroup.push(colGroupMap[k]);\n }\n\n return this;\n };\n var onResetColumns = function onResetColumns() {\n initColumns.call(this, this.config.columns);\n resetColGroupWidth.call(this);\n if (this.config.footSum) {\n initFootSum.call(this, this.config.footSum);\n this.needToPaintSum = true;\n }\n if (this.config.body.grouping) initBodyGroup.call(this, this.config.body.grouping);\n alignGrid.call(this, true);\n GRID.header.repaint.call(this, true);\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n };\n var resetColGroupWidth = function resetColGroupWidth() {\n /// !! 그리드 target의 크기가 변경되면 이 함수를 호출하려 this.colGroup의 _width 값을 재 계산 하여야 함. [tom]\n var CT_WIDTH = this.$[\"container\"][\"root\"].width() - function () {\n var width = 0;\n if (cfg.showLineNumber) width += cfg.lineNumberColumnWidth;\n if (cfg.showRowSelector) width += cfg.rowSelectorColumnWidth;\n width += cfg.scroller.size;\n return width;\n }(),\n totalWidth = 0,\n computedWidth = void 0,\n autoWidthColgroupIndexs = [],\n colGroup = this.colGroup,\n i = void 0,\n l = void 0;\n\n for (i = 0, l = colGroup.length; i < l; i++) {\n if (U.isNumber(colGroup[i].width)) {\n totalWidth += colGroup[i]._width = colGroup[i].width;\n } else if (colGroup[i].width === \"*\") {\n autoWidthColgroupIndexs.push(i);\n } else if (U.right(colGroup[i].width, 1) === \"%\") {\n totalWidth += colGroup[i]._width = CT_WIDTH * U.left(colGroup[i].width, \"%\") / 100;\n }\n }\n if (autoWidthColgroupIndexs.length > 0) {\n computedWidth = (CT_WIDTH - totalWidth) / autoWidthColgroupIndexs.length;\n for (i = 0, l = autoWidthColgroupIndexs.length; i < l; i++) {\n colGroup[autoWidthColgroupIndexs[i]]._width = computedWidth;\n }\n }\n };\n var initFootSum = function initFootSum(_footSum) {\n if (U.isArray(_footSum)) {\n this.footSumTable = GRID.util.makeFootSumTable.call(this, this.footSumColumns = _footSum);\n } else {\n this.footSumColumns = [];\n this.footSumTable = {};\n }\n };\n var initBodyGroup = function initBodyGroup(_grouping) {\n var grouping = jQuery.extend({}, _grouping);\n if (\"by\" in grouping && \"columns\" in grouping) {\n this.bodyGrouping = {\n by: grouping.by,\n columns: grouping.columns\n };\n this.bodyGroupingTable = GRID.util.makeBodyGroupingTable.call(this, this.bodyGrouping.columns);\n this.sortInfo = function () {\n var sortInfo = {};\n for (var k = 0, kl = this.bodyGrouping.by.length; k < kl; k++) {\n sortInfo[this.bodyGrouping.by[k]] = {\n orderBy: \"asc\",\n seq: k,\n fixed: true\n };\n for (var c = 0, cl = this.colGroup.length; c < cl; c++) {\n if (this.colGroup[c].key === this.bodyGrouping.by[k]) {\n this.colGroup[c].sort = \"asc\";\n this.colGroup[c].sortFixed = true;\n }\n }\n }\n return sortInfo;\n }.call(this);\n } else {\n cfg.body.grouping = false;\n }\n };\n var alignGrid = function alignGrid(_isFirst) {\n var list = this.proxyList ? this.proxyList : this.list;\n // 대상이 크기가 컬럼의 최소 크기 보다 작업 금지\n if (Math.min(this.$target.innerWidth(), this.$target.innerHeight()) < 5) {\n return false;\n }\n\n if (!this.config.height) {\n this.$[\"container\"][\"root\"].css({ height: this.config._height = this.$target.height() });\n }\n\n var CT_WIDTH = this.$[\"container\"][\"root\"].width(),\n CT_HEIGHT = this.$[\"container\"][\"root\"].height(),\n CT_INNER_WIDTH = CT_WIDTH,\n CT_INNER_HEIGHT = CT_HEIGHT,\n asidePanelWidth = cfg.asidePanelWidth = function () {\n var width = 0;\n if (cfg.showLineNumber) width += cfg.lineNumberColumnWidth;\n if (cfg.showRowSelector) width += cfg.rowSelectorColumnWidth;\n return width;\n }(),\n frozenPanelWidth = cfg.frozenPanelWidth = function (colGroup, endIndex) {\n var width = 0;\n for (var i = 0, l = endIndex; i < l; i++) {\n width += colGroup[i]._width;\n }\n return width;\n }(this.colGroup, cfg.frozenColumnIndex),\n verticalScrollerWidth = void 0,\n horizontalScrollerHeight = void 0,\n bodyHeight = void 0;\n\n // todo : 우측 함계컬럼 너비 계산\n var rightPanelWidth = 0,\n frozenRowHeight = function (bodyTrHeight) {\n return cfg.frozenRowIndex * bodyTrHeight;\n }(this.xvar.bodyTrHeight),\n footSumHeight = function (bodyTrHeight) {\n return this.footSumColumns.length * bodyTrHeight;\n }.call(this, this.xvar.bodyTrHeight),\n headerHeight = cfg.header.display ? this.headerTable.rows.length * cfg.header.columnHeight : 0,\n pageHeight = cfg.page.display ? cfg.page.height : 0;\n\n (function () {\n verticalScrollerWidth = CT_HEIGHT - headerHeight - pageHeight - footSumHeight < list.length * this.xvar.bodyTrHeight ? this.config.scroller.size : 0;\n // 남은 너비가 colGroup의 너비보다 넓을때. 수평 스크롤 활성화.\n horizontalScrollerHeight = function () {\n var totalColGroupWidth = 0;\n // aside 빼고 너비\n // 수직 스크롤이 있으면 또 빼고 비교\n var bodyWidth = CT_WIDTH - asidePanelWidth - verticalScrollerWidth;\n for (var i = 0, l = this.colGroup.length; i < l; i++) {\n totalColGroupWidth += this.colGroup[i]._width;\n }\n return totalColGroupWidth > bodyWidth ? this.config.scroller.size : 0;\n }.call(this);\n\n if (horizontalScrollerHeight > 0) {\n verticalScrollerWidth = CT_HEIGHT - headerHeight - pageHeight - footSumHeight - horizontalScrollerHeight < list.length * this.xvar.bodyTrHeight ? this.config.scroller.size : 0;\n }\n }).call(this);\n\n // 수평 너비 결정\n CT_INNER_WIDTH = CT_WIDTH - verticalScrollerWidth;\n // 수직 스크롤러의 높이 결정.\n CT_INNER_HEIGHT = CT_HEIGHT - pageHeight - horizontalScrollerHeight;\n\n bodyHeight = CT_INNER_HEIGHT - headerHeight;\n\n var panelDisplayProcess = function panelDisplayProcess(panel, vPosition, hPosition, containerType) {\n var css = {},\n isHide = false;\n\n switch (hPosition) {\n case \"aside\":\n if (asidePanelWidth === 0) {\n isHide = true;\n } else {\n css[\"left\"] = 0;\n css[\"width\"] = asidePanelWidth;\n }\n break;\n case \"left\":\n if (cfg.frozenColumnIndex === 0) {\n isHide = true;\n } else {\n css[\"left\"] = asidePanelWidth;\n css[\"width\"] = frozenPanelWidth;\n }\n break;\n case \"right\":\n if (!cfg.rightSum) {\n isHide = true;\n } else {}\n break;\n default:\n if (containerType !== \"page\") {\n if (cfg.frozenColumnIndex === 0) {\n css[\"left\"] = asidePanelWidth;\n } else {\n css[\"left\"] = frozenPanelWidth + asidePanelWidth;\n }\n css[\"width\"] = CT_INNER_WIDTH - asidePanelWidth - frozenPanelWidth - rightPanelWidth;\n }\n break;\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n if (containerType === \"body\") {\n switch (vPosition) {\n case \"top\":\n if (cfg.frozenRowIndex == 0) {\n isHide = true;\n } else {\n css[\"top\"] = 0;\n css[\"height\"] = frozenRowHeight;\n }\n break;\n case \"bottom\":\n if (!cfg.footSum) {\n isHide = true;\n } else {\n css[\"top\"] = bodyHeight - footSumHeight;\n css[\"height\"] = footSumHeight; // footSum height\n }\n break;\n default:\n css[\"top\"] = frozenRowHeight;\n css[\"height\"] = bodyHeight - frozenRowHeight - footSumHeight;\n\n break;\n }\n } else if (containerType === \"header\") {\n css[\"height\"] = headerHeight;\n } else if (containerType === \"page\") {\n if (pageHeight == 0) {\n isHide = true;\n } else {\n css[\"height\"] = pageHeight;\n }\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n panel.show().css(css);\n return this;\n };\n var scrollerDisplayProcess = function scrollerDisplayProcess(panel, scrollerWidth, scrollerHeight, containerType) {\n var css = {},\n isHide = false;\n\n switch (containerType) {\n case \"vertical\":\n if (scrollerWidth > 0) {\n css[\"width\"] = scrollerWidth;\n css[\"height\"] = CT_INNER_HEIGHT;\n css[\"bottom\"] = scrollerHeight + pageHeight;\n } else {\n isHide = true;\n }\n break;\n case \"horizontal\":\n if (scrollerHeight > 0) {\n css[\"width\"] = CT_INNER_WIDTH;\n css[\"height\"] = scrollerHeight;\n css[\"right\"] = scrollerWidth;\n css[\"bottom\"] = pageHeight;\n } else {\n isHide = true;\n }\n break;\n case \"corner\":\n if (scrollerWidth > 0 && scrollerHeight > 0) {\n css[\"width\"] = scrollerWidth;\n css[\"height\"] = scrollerHeight;\n css[\"bottom\"] = pageHeight;\n } else {\n isHide = true;\n }\n break;\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n panel.show().css(css);\n };\n\n this.$[\"container\"][\"header\"].css({ height: headerHeight });\n this.$[\"container\"][\"body\"].css({ height: bodyHeight });\n\n // 각 패널들의 크기 표시여부를 결정합니다\n panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-header\"], \"\", \"aside\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"left-header\"], \"\", \"left\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"header\"], \"\", \"\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"right-header\"], \"\", \"right\", \"header\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-aside-body\"], \"top\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-left-body\"], \"top\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-body\"], \"top\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-right-body\"], \"top\", \"right\", \"body\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-body\"], \"\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"left-body\"], \"\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"body\"], \"\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"right-body\"], \"\", \"right\", \"body\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-aside-body\"], \"bottom\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-left-body\"], \"bottom\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-body\"], \"bottom\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-right-body\"], \"bottom\", \"right\", \"body\");\n\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"vertical\"], verticalScrollerWidth, horizontalScrollerHeight, \"vertical\");\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"horizontal\"], verticalScrollerWidth, horizontalScrollerHeight, \"horizontal\");\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"corner\"], verticalScrollerWidth, horizontalScrollerHeight, \"corner\");\n\n panelDisplayProcess.call(this, this.$[\"container\"][\"page\"], \"\", \"\", \"page\");\n\n // 각 패널의 사이즈 결정\n /// 다른 패널의 사이즈 정보가 필요한 경우 여기서 정의해주고 사용함.\n this.xvar.bodyHeight = this.$.panel[\"body\"].height();\n this.xvar.bodyWidth = this.$.panel[\"body\"].width();\n // scrollContentWidth 는 grid-header repaint에서 결정합니다. 까먹지 맙시다. > this.xvar.scrollContentWidth\n\n return true;\n };\n var sortColumns = function sortColumns(_sortInfo) {\n GRID.header.repaint.call(this);\n\n if (U.isFunction(this.config.remoteSort)) {\n var that = { sortInfo: [] };\n for (var k in _sortInfo) {\n that.sortInfo.push({\n key: k,\n orderBy: _sortInfo[k].orderBy,\n seq: _sortInfo[k].seq\n });\n }\n that.sortInfo.sort(function (a, b) {\n return a.seq > b.seq;\n });\n this.config.remoteSort.call(that, that);\n } else {\n if (this.config.body.grouping) {\n this.list = GRID.data.initData.call(this, GRID.data.sort.call(this, _sortInfo, GRID.data.clearGroupingData.call(this, this.list)));\n } else {\n this.list = GRID.data.sort.call(this, _sortInfo, GRID.data.clearGroupingData.call(this, this.list), { resetLineNumber: true });\n }\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n }\n };\n /// private end\n\n /**\n /**\n * Preferences of grid UI\n * @method ax5grid.setConfig\n * @param {Object} _config - 클래스 속성값\n * @param {Element} _config.target\n * @param {Number} [_config.frozenColumnIndex=0]\n * @param {Number} [_config.frozenRowIndex=0]\n * @param {Boolean} [_config.showLineNumber=false]\n * @param {Boolean} [_config.showRowSelector=false]\n * @param {Boolean} [_config.multipleSelect=true]\n * @param {Number} [_config.columnMinWidth=100]\n * @param {Number} [_config.lineNumberColumnWidth=30]\n * @param {Number} [_config.rowSelectorColumnWidth=25]\n * @param {Boolean} [_config.sortable=false]\n * @param {Boolean} [_config.multiSort=false]\n * @param {Function} [_config.remoteSort=false]\n * @param {Boolean} [_config.virtualScrollY=true] - 세로축 가상스크롤 처리여부\n * @param {Boolean} [_config.virtualScrollX=true] - 가로축 가상스크롤 처리여부\n * @param {Object} [_config.header]\n * @param {Object} [_config.header.selector=true] - 헤더 checkbox 표시여부\n * @param {String} [_config.header.align]\n * @param {Number} [_config.header.columnHeight=25]\n * @param {Number} [_config.header.columnPadding=3]\n * @param {Number} [_config.header.columnBorderWidth=1]\n * @param {Object} [_config.body]\n * @param {Function} [_config.body.onClick]\n * @param {Function} [_config.body.onDBLClick]\n * @param {Function} [_config.body.onDataChanged]\n * @param {String|Array} [_config.body.mergeCells=false] -\n * @param {String} [_config.body.align]\n * @param {Number} [_config.body.columnHeight=25]\n * @param {Number} [_config.body.columnPadding=3]\n * @param {Number} [_config.body.columnBorderWidth=1]\n * @param {Object} [_config.body.grouping]\n * @param {Array} [_config.body.grouping.by] - list grouping keys\n * @param {Array} [_config.body.grouping.columns] - list grouping columns\n * @param {(String|Function)} [_config.body.trStyleClass]\n *\n * @param {Object} [_config.page]\n * @param {Number} [_config.page.height=25]\n * @param {Boolean} [_config.page.display=true] - grid page display\n * @param {Boolean} [_config.page.statusDisplay=true] - grid status display\n * @param {Number} [_config.page.navigationItemCount=5]\n * @param {Object} [_config.scroller]\n * @param {Number} [_config.scroller.size=15]\n * @param {Number} [_config.scroller.barMinSize=15]\n * @param {Number} [_config.scroller.trackPadding=4]\n * @param {Object} [_config.columnKeys]\n * @param {String} [_config.columnKeys.selected=\"_SELECTED\"]\n * @param {Object[]} _config.columns\n * @param {String} _config.columns[].key\n * @param {String} _config.columns[].label\n * @param {Number} _config.columns[].width\n * @param {(String|Function)} _config.columns[].styleClass\n * @param {(String|Function)} _config.columns[].headerStyleClass\n * @param {Boolean} _config.columns[].enableFilter\n * @param {Boolean} _config.columns[].sortable\n * @param {String} _config.columns[].align\n * @param {(String|Function)} _config.columns[].formatter\n * @param {Object} _config.columns[].editor\n * @param {String} _config.columns[].editor.type - text,number,money,date\n * @param {Object} _config.columns[].editor.config\n * @param {Array} _config.columns[].editor.updateWith\n * @param {Function} _config.columns[].editor.disabled - disable editor\n * @param {Boolean} [_config.columns[].multiLine=false]\n * @param {Object} [_config.tree]\n * @param {Boolean} [_config.tree.use=false] - Whether tree-type data is used\n * @param {Number} [_config.tree.hashDigit=8]\n * @param {Number} [_config.tree.indentWidth=10]\n * @param {Number} [_config.tree.arrowWidth=15]\n * @param {Number} [_config.tree.iconWidth=18]\n * @param {Object} [_config.tree.icons]\n * @param {String} [_config.tree.icons.openedArrow='▾']\n * @param {String} [_config.tree.icons.collapsedArrow='▸']\n * @param {String} [_config.tree.icons.groupIcon='⊚']\n * @param {String} [_config.tree.icons.collapsedGroupIcon='⊚']\n * @param {String} [_config.tree.icons.itemIcon='⊙']\n * @param {Object} [_config.tree.columnKeys]\n * @param {String} [_config.tree.columnKeys.parentKey=\"pid\"]\n * @param {String} [_config.tree.columnKeys.selfKey=\"id\"]\n * @param {String} [_config.tree.columnKeys.collapse=\"collapse\"]\n * @param {String} [_config.tree.columnKeys.hidden=\"hidden\"]\n * @param {String} [_config.tree.columnKeys.parentHash=\"__hp__\"]\n * @param {String} [_config.tree.columnKeys.selfHash=\"__hs__\"]\n * @param {String} [_config.tree.columnKeys.children=\"__children__\"]\n * @param {String} [_config.tree.columnKeys.depth=\"__depth__\"]\n * @returns {ax5grid}\n * @example\n * ```js\n * var firstGrid = new ax5.ui.grid();\n *\n * ax5.ui.grid.formatter[\"myType\"] = function () {\n * return \"myType\" + (this.value || \"\");\n * };\n * ax5.ui.grid.formatter[\"capital\"] = function(){\n * return (''+this.value).toUpperCase();\n * };\n *\n * ax5.ui.grid.collector[\"myType\"] = function () {\n * return \"myType\" + (this.value || \"\");\n * };\n *\n * var sampleData = [\n * {a: \"A\", b: \"A01\", price: 1000, amount: 12, cost: 12000, saleDt: \"2016-08-29\", customer: \"장기영\", saleType: \"A\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"B01\", price: 1100, amount: 11, cost: 12100, saleDt: \"2016-08-28\", customer: \"장서우\", saleType: \"B\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"C01\", price: 1200, amount: 10, cost: 12000, saleDt: \"2016-08-27\", customer: \"이영희\", saleType: \"A\"},\n * {companyJson: {\"대표자명\":\"위세라\"}, a: \"A\", b: \"A01\", price: 1300, amount: 8, cost: 10400, saleDt: \"2016-08-25\", customer: \"황인서\", saleType: \"C\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"B01\", price: 1400, amount: 5, cost: 7000, saleDt: \"2016-08-29\", customer: \"황세진\", saleType: \"D\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"A01\", price: 1500, amount: 2, cost: 3000, saleDt: \"2016-08-26\", customer: \"이서연\", saleType: \"A\"}\n * ];\n *\n * var gridView = {\n * initView: function () {\n * firstGrid.setConfig({\n * target: $('[data-ax5grid=\"first-grid\"]'),\n * columns: [\n * {\n * key: \"companyJson['대표자명']\",\n * label: \"필드A\",\n * width: 80,\n * styleClass: function () {\n * return \"ABC\";\n * },\n * enableFilter: true,\n * align: \"center\",\n * editor: {type:\"text\"}\n * },\n * {key: \"b\", label: \"필드B\", align: \"center\"},\n * {\n * key: undefined, label: \"필드C\", columns: [\n * {key: \"price\", label: \"단가\", formatter: \"money\", align: \"right\"},\n * {key: \"amount\", label: \"수량\", formatter: \"money\", align: \"right\"},\n * {key: \"cost\", label: \"금액\", align: \"right\", formatter: \"money\"}\n * ]\n * },\n * {key: \"saleDt\", label: \"판매일자\", align: \"center\"},\n * {key: \"customer\", label: \"고객명\"},\n * {key: \"saleType\", label: \"판매타입\"}\n * ]\n * });\n * return this;\n * },\n * setData: function (_pageNo) {\n * firstGrid.setData(sampleData);\n * return this;\n * }\n * };\n *\n * // onClick, onDBLClick, onDataChanged\n * firstGrid.setConfig({\n * target: $('[data-ax5grid=\"first-grid\"]'),\n * columns: [...],\n * body: {\n * onClick: function(){\n * console.log(this);\n * },\n * onDBLClick: function(){\n * console.log(this);\n * // If the column does not have an editor attribute, an event is raised.\n * },\n * onDataChanged: function(){\n * console.log(this);\n * // If change Data\n * }\n * }\n * });\n * ```\n */\n this.init = function (_config) {\n cfg = jQuery.extend(true, {}, cfg, _config);\n if (!cfg.target) {\n console.log(ax5.info.getError(\"ax5grid\", \"401\", \"init\"));\n return this;\n }\n\n // 그리드의 이벤트 정의 구간\n this.onStateChanged = cfg.onStateChanged;\n this.onClick = cfg.onClick;\n //this.onDblClick = cfg.onDblClick;\n this.onLoad = cfg.onLoad;\n this.onDataChanged = cfg.body.onDataChanged;\n // todo event에 대한 추가 정의 필요\n\n this.$target = jQuery(cfg.target);\n\n // target attribute data\n (function (data) {\n if (U.isObject(data) && !data.error) {\n cfg = jQuery.extend(true, cfg, data);\n }\n }).call(this, U.parseJson(this.$target.attr(\"data-ax5grid-config\"), true));\n\n var grid = this.config = cfg;\n\n if (!this.config.height) {\n this.config._height = this.$target.height();\n }\n\n if (!this.id) this.id = this.$target.data(\"data-ax5grid-id\");\n if (!this.id) {\n //this.id = 'ax5grid-' + ax5.getGuid();\n this.id = 'ax5grid-' + this.instanceId;\n this.$target.data(\"data-ax5grid-id\", grid.id);\n }\n\n GRID.data.init.call(this);\n\n if (this.config.tree.use) {\n // 트리라면\n this.sortInfo = {};\n this.sortInfo[this.config.tree.columnKeys.selfHash] = { orderBy: \"asc\", seq: 0, fixed: true };\n }\n\n ///========\n // 그리드를 그리기 위한 가장 기초적인 작업 뼈대와 틀을 준비합니다. 이 메소드는 초기화 시 한번만 호출 되게 됩니다.\n initGrid.call(this);\n\n // columns데이터를 분석하여 미리 처리해야하는 데이터를 정리합니다.\n initColumns.call(this, grid.columns);\n resetColGroupWidth.call(this);\n\n // footSum 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n if (grid.footSum) initFootSum.call(this, grid.footSum);\n\n // bodyGrouping 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n if (grid.body.grouping) initBodyGroup.call(this, grid.body.grouping);\n\n // 그리드의 각 요소의 크기를 맞춤니다.\n alignGrid.call(this, true);\n\n // columns의 데이터로 header데이터를 만들고\n GRID.header.init.call(this);\n // header를 출력합니다.\n GRID.header.repaint.call(this);\n\n // columns의 데이터로 body데이터를 만들고\n GRID.body.init.call(this);\n // body를 출력합니다.\n GRID.body.repaint.call(this);\n\n // scroller\n GRID.scroller.init.call(this);\n GRID.scroller.resize.call(this);\n\n jQuery(window).bind(\"resize.ax5grid-\" + this.id, function () {\n alignGrid.call(self);\n GRID.scroller.resize.call(self);\n GRID.body.repaint.call(self); // window resize시 repaint 함수 호출\n });\n\n jQuery(document.body).on(\"click.ax5grid-\" + this.id, function (e) {\n var isPickerClick = false,\n target = U.findParentNode(e.target, function (_target) {\n if (isPickerClick = _target.getAttribute(\"data-ax5grid-inline-edit-picker\")) {\n return true;\n }\n return _target.getAttribute(\"data-ax5grid-container\") === \"root\";\n });\n\n if (target && target.getAttribute(\"data-ax5grid-instance\") === this.id) {\n self.focused = true;\n } else {\n self.focused = false;\n GRID.body.blur.call(this);\n }\n }.bind(this));\n\n jQuery(window).on(\"keydown.ax5grid-\" + this.instanceId, function (e) {\n if (self.focused) {\n if (self.isInlineEditing) {\n\n if (e.which == ax5.info.eventKeys.ESC) {\n self.keyDown(\"ESC\", e.originalEvent);\n } else if (e.which == ax5.info.eventKeys.RETURN) {\n self.keyDown(\"RETURN\", e.originalEvent);\n } else if (e.which == ax5.info.eventKeys.TAB) {\n self.keyDown(\"TAB\", e.originalEvent);\n U.stopEvent(e);\n } else if (e.which == ax5.info.eventKeys.UP) {\n self.keyDown(\"RETURN\", { shiftKey: true });\n } else if (e.which == ax5.info.eventKeys.DOWN) {\n self.keyDown(\"RETURN\", {});\n }\n } else {\n\n if (e.metaKey || e.ctrlKey) {\n if (e.which == 67) {\n // c\n self.copySelect();\n }\n } else {\n if (ctrlKeys[e.which]) {\n self.keyDown(ctrlKeys[e.which], e.originalEvent); // 키다운 이벤트 호출\n U.stopEvent(e);\n } else if (e.which == ax5.info.eventKeys.ESC) {\n if (self.focused) {\n GRID.body.blur.call(self);\n }\n } else if (e.which == ax5.info.eventKeys.RETURN || e.which == ax5.info.eventKeys.SPACE) {\n self.keyDown(\"RETURN\", e.originalEvent);\n } else if (e.which == ax5.info.eventKeys.TAB) {\n //self.keyDown(\"RETURN\", e.originalEvent);\n U.stopEvent(e);\n } else if (Object.keys(self.focusedColumn).length) {\n /*\n self.keyDown(\"INLINE_EDIT\", e.originalEvent);\n */\n }\n }\n }\n }\n });\n\n jQuery(window).on(\"keyup.ax5grid-\" + this.instanceId, function (e) {\n if (self.focused) {\n if (self.isInlineEditing) {} else {\n if (e.metaKey || e.ctrlKey) {} else {\n if (ctrlKeys[e.which]) {} else if (e.which == ax5.info.eventKeys.ESC) {} else if (e.which == ax5.info.eventKeys.RETURN || e.which == ax5.info.eventKeys.SPACE) {} else if (e.which == ax5.info.eventKeys.TAB) {} else if (Object.keys(self.focusedColumn).length) {\n self.keyDown(\"INLINE_EDIT\", e.originalEvent);\n }\n }\n }\n }\n });\n\n // 그리드 레이아웃이 모든 준비를 마친시점에 onLoad존재 여부를 확인하고 호출하여 줍니다.\n setTimeout(function () {\n if (this.onLoad) {\n this.onLoad.call({\n self: this\n });\n }\n }.bind(this));\n return this;\n };\n\n /**\n * align grid size\n * @method ax5grid.align\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.repaint();\n * ```\n */\n this.align = function () {\n if (alignGrid.call(this)) {\n GRID.body.repaint.call(this);\n GRID.scroller.resize.call(this);\n }\n return this;\n };\n\n /**\n * repaint grid\n * @method ax5grid.repaint\n * @return {ax5grid}\n * @example\n * ```js\n * ax5Grid.repaint();\n * ```\n */\n this.repaint = function () {\n GRID.header.repaint.call(this);\n GRID.body.repaint.call(this, true); // 강제로 다시 그리기\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.keyDown\n * @param {String} _keyName\n * @param {Event|Object} _data\n * @return {ax5grid}\n */\n this.keyDown = function () {\n var processor = {\n \"KEY_UP\": function KEY_UP() {\n GRID.body.moveFocus.call(this, \"UP\");\n },\n \"KEY_DOWN\": function KEY_DOWN() {\n GRID.body.moveFocus.call(this, \"DOWN\");\n },\n \"KEY_LEFT\": function KEY_LEFT() {\n GRID.body.moveFocus.call(this, \"LEFT\");\n },\n \"KEY_RIGHT\": function KEY_RIGHT() {\n GRID.body.moveFocus.call(this, \"RIGHT\");\n },\n \"KEY_HOME\": function KEY_HOME() {\n GRID.body.moveFocus.call(this, \"HOME\");\n },\n \"KEY_END\": function KEY_END() {\n GRID.body.moveFocus.call(this, \"END\");\n },\n \"INLINE_EDIT\": function INLINE_EDIT(_e) {\n GRID.body.inlineEdit.active.call(this, this.focusedColumn, _e);\n if (!/[0-9a-zA-Z]/.test(_e.key)) {\n U.stopEvent(_e);\n }\n },\n \"ESC\": function ESC(_e) {\n GRID.body.inlineEdit.keydown.call(this, \"ESC\");\n },\n \"RETURN\": function RETURN(_e) {\n var activeEditLength = 0;\n for (var columnKey in this.inlineEditing) {\n activeEditLength++;\n\n if (!GRID.body.inlineEdit.keydown.call(this, \"RETURN\", columnKey)) {\n return false;\n U.stopEvent(_e);\n }\n // next focus\n if (activeEditLength == 1) {\n if (GRID.body.moveFocus.call(this, _e.shiftKey ? \"UP\" : \"DOWN\")) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\");\n }\n }\n }\n if (activeEditLength == 0) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\");\n U.stopEvent(_e);\n } else {}\n },\n \"TAB\": function TAB(_e) {\n\n var activeEditLength = 0;\n for (var columnKey in this.inlineEditing) {\n activeEditLength++;\n\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\", columnKey, { moveFocus: true });\n // next focus\n if (activeEditLength == 1) {\n if (GRID.body.moveFocus.call(this, _e.shiftKey ? \"LEFT\" : \"RIGHT\")) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\", undefined, { moveFocus: true });\n }\n }\n }\n }\n };\n return function (_act, _data) {\n if (_act in processor) processor[_act].call(this, _data);\n return this;\n };\n }();\n\n /**\n * @method ax5grid.copySelect\n * @returns {Boolean} copysuccess\n */\n this.copySelect = function () {\n var copysuccess = void 0,\n $clipBoard = this.$[\"form\"][\"clipboard\"],\n copyTextArray = [],\n copyText = \"\",\n _rowIndex = void 0,\n _colIndex = void 0,\n _dindex = void 0,\n _di = 0;\n\n for (var c in this.selectedColumn) {\n var _column = this.selectedColumn[c];\n\n if (_column) {\n if (typeof _dindex === \"undefined\") {\n _dindex = _column.dindex;\n _rowIndex = _column.rowIndex;\n _colIndex = _column.rowIndex;\n }\n\n if (_dindex != _column.dindex || _rowIndex != _column.rowIndex) {\n _di++;\n }\n\n if (!copyTextArray[_di]) {\n copyTextArray[_di] = [];\n }\n var originalColumn = this.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex];\n if (originalColumn) {\n if (this.list[_column.dindex].__isGrouping) {\n copyTextArray[_di].push(this.list[_column.dindex][_column.colIndex]);\n } else {\n copyTextArray[_di].push(this.list[_column.dindex][originalColumn.key]);\n }\n } else {\n copyTextArray[_di].push(\"\");\n }\n\n _dindex = _column.dindex;\n _rowIndex = _column.rowIndex;\n }\n }\n\n copyTextArray.forEach(function (r) {\n copyText += r.join('\\t') + \"\\n\";\n });\n\n $clipBoard.get(0).innerText = copyText;\n $clipBoard.select();\n\n try {\n copysuccess = document.execCommand(\"copy\");\n } catch (e) {\n copysuccess = false;\n }\n return copysuccess;\n };\n\n /**\n * @method ax5grid.setData\n * @param {Array} _data\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setData({\n * list: [],\n * page: {\n * currentPage: 0,\n * pageSize: 50,\n * totalElements: 500,\n * totalPages: 100\n * }\n * });\n *\n * // onlyList\n * ax5Grid.setData([]);\n * ```\n */\n this.setData = function (_data) {\n var isFirstPaint = typeof this.xvar.paintStartRowIndex === \"undefined\";\n\n GRID.data.set.call(this, _data);\n GRID.body.repaint.call(this);\n if (!isFirstPaint) GRID.body.scrollTo.call(this, { top: 0 });\n\n // 가로/세로 스크롤바 show/hide 처리\n alignGrid.call(this);\n // 가로세로 스크롤바의 크기 재 계산.\n GRID.scroller.resize.call(this);\n GRID.page.navigationUpdate.call(this);\n\n isFirstPaint = null;\n return this;\n };\n\n /**\n * @method ax5grid.getList\n * @param {String} _type - selected|modified|deleted\n * @returns {Array}\n * @example\n * ```js\n * ax5Grid.getList();\n * ax5Grid.getList(\"selected\");\n * ax5Grid.getList(\"modified\");\n * ax5Grid.getList(\"deleted\");\n * ```\n */\n this.getList = function (_type) {\n return GRID.data.getList.call(this, _type);\n };\n\n /**\n * @method ax5grid.setHeight\n * @param {Number} _height\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setHeight(height);\n * ```\n */\n this.setHeight = function (_height) {\n //console.log(this.$target);\n if (_height == \"100%\") {\n _height = this.$target.offsetParent().innerHeight();\n }\n this.$target.css({ height: _height });\n this.$[\"container\"][\"root\"].css({ height: _height });\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.addRow\n * @param {Object} _row\n * @param {Number|String} [_dindex=last]\n * @param {Object} [_options] - options of addRow\n * @param {Boolean} [_options.sort] - sortData\n * @param {Number|String} [_options.focus] - HOME|END|[dindex]\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.addRow($.extend({}, {...}), \"first\");\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: \"END\"});\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: \"HOME\"});\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: 10});\n * ```\n */\n this.addRow = function (_row, _dindex, _options) {\n var _this = this;\n\n GRID.data.add.call(this, _row, _dindex, _options);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n\n if (_options && _options.focus) {\n //GRID.body.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n setTimeout(function () {\n GRID.body.moveFocus.call(_this, _options.focus);\n }, 1);\n } else {\n GRID.scroller.resize.call(this);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.appendToList\n * @param _list\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.appendToList([{},{},{}]);\n * ax5Grid.appendToList([{},{},{}]);\n * ```\n */\n this.appendToList = function (_list) {\n GRID.data.append.call(this, _list, function () {\n alignGrid.call(this);\n GRID.body.repaint.call(this);\n GRID.scroller.resize.call(this);\n }.bind(this));\n return this;\n };\n\n /**\n * @method ax5grid.removeRow\n * @param {Number|String} [_dindex=last]\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.removeRow();\n * ax5Grid.removeRow(\"first\");\n * ax5Grid.removeRow(\"last\");\n * ax5Grid.removeRow(1);\n * ax5Grid.removeRow(\"selected\");\n * ```\n */\n this.removeRow = function (_dindex) {\n GRID.data.remove.call(this, _dindex);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n GRID.body.moveFocus.call(this, this.config.body.grouping ? \"START\" : \"END\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.updateRow\n * @param {Object} _row\n * @param {Number} _dindex\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.updateRow({price: 100, amount: 100, cost: 10000}, 1);\n * ```\n */\n this.updateRow = function (_row, _dindex) {\n GRID.data.update.call(this, _row, _dindex);\n // todo : mergeCells 옵션에 따라 예외처리\n\n GRID.body.repaintRow.call(this, _dindex);\n return this;\n };\n\n /**\n * @method ax5grid.updateChildRows\n * @param {Number} _dindex\n * @param {Object} _updateData\n * @param {Object} [_options]\n * @param {Function} [_options.filter]\n * @returns {ax5grid}\n * @example\n * ```js\n * onDataChanged: function () {\n * this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked});\n * }\n *\n * onDataChanged: function () {\n * this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked}, {filter: function(){\n * return this.item.type == \"A\";\n * });\n * }\n * ```\n */\n this.updateChildRows = function (_dindex, _updateData, _options) {\n GRID.data.updateChild.call(this, _dindex, _updateData, _options);\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.paintStartColumnIndex = undefined;\n GRID.body.repaint.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.deleteRow\n * @param {Number|String} _dindex\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.deleteRow(\"first\");\n * ax5Grid.deleteRow(\"last\");\n * ax5Grid.deleteRow(1);\n * ax5Grid.deleteRow(\"selected\");\n * ```\n */\n this.deleteRow = function (_dindex) {\n GRID.data.deleteRow.call(this, _dindex);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n // 삭제시엔 포커스 ?\n // GRID.body.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.setValue\n * @param _dindex\n * @param _key\n * @param _value\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setValue(0, \"price\", 100);\n * ```\n */\n this.setValue = function (_dindex, _key, _value) {\n // getPanelname;\n // let doindex = (typeof _doindex === \"undefined\") ? _dindex : _doindex;\n // setValue를 doindex로 처리하는 상황이 아직 발생전으므로 선언만 하고 넘어감\n var doindex = void 0;\n\n if (GRID.data.setValue.call(this, _dindex, doindex, _key, _value)) {\n var repaintCell = function repaintCell(_panelName, _rows, __dindex, __doindex, __key, __value) {\n for (var r = 0, rl = _rows.length; r < rl; r++) {\n for (var c = 0, cl = _rows[r].cols.length; c < cl; c++) {\n if (_rows[r].cols[c].key == __key) {\n if (this.xvar.frozenRowIndex > __dindex) {\n GRID.body.repaintCell.call(this, \"top-\" + _panelName, __dindex, __doindex, r, c, __value);\n } else {\n GRID.body.repaintCell.call(this, _panelName + \"-scroll\", __dindex, __doindex, r, c, __value);\n }\n }\n }\n }\n };\n\n repaintCell.call(this, \"left-body\", this.leftBodyRowData.rows, _dindex, doindex, _key, _value);\n repaintCell.call(this, \"body\", this.bodyRowData.rows, _dindex, doindex, _key, _value);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.addColumn\n * @param {Object} _column\n * @param {Number|String} [_cindex=last]\n * @returns {ax5grid}\n */\n this.addColumn = function () {\n var processor = {\n \"first\": function first(_column) {\n this.config.columns = [].concat(_column).concat(this.config.columns);\n },\n \"last\": function last(_column) {\n this.config.columns = this.config.columns.concat([].concat(_column));\n }\n };\n\n return function (_column, _cindex) {\n if (typeof _column === \"undefined\") throw '_column must not be null';\n if (typeof _cindex === \"undefined\") _cindex = \"last\";\n if (_cindex in processor) {\n processor[_cindex].call(this, _column);\n } else {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n if (U.isArray(_column)) {\n for (var _i = 0, _l = _column.length; _i < _l; _i++) {\n this.config.columns.splice(_cindex + _i, 0, _column[_i]);\n }\n } else {\n this.config.columns.splice(_cindex, 0, _column);\n }\n }\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n };\n }();\n\n /**\n * @method ax5grid.removeColumn\n * @param {Number|String} [_cindex=last]\n * @returns {ax5grid}\n */\n this.removeColumn = function () {\n var processor = {\n \"first\": function first(_cindex) {\n this.config.columns.splice(_cindex, 1);\n },\n \"last\": function last() {\n this.config.columns.splice(this.config.columns.length - 1, 1);\n }\n };\n return function (_cindex) {\n if (typeof _cindex === \"undefined\") _cindex = \"last\";\n if (_cindex in processor) {\n processor[_cindex].call(this, _cindex);\n } else {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n //\n this.config.columns.splice(_cindex, 1);\n }\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n };\n }();\n\n /**\n * @method ax5grid.updateColumn\n * @param {Object} _column\n * @param {Number} _cindex\n * @returns {ax5grid}\n */\n this.updateColumn = function (_column, _cindex) {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n //\n this.config.columns.splice(_cindex, 1, _column);\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n };\n\n /**\n * @method ax5grid.setColumnWidth\n * @param {Number} _width\n * @param {Number} _cindex\n * @returns {ax5grid}\n */\n this.setColumnWidth = function (_width, _cindex) {\n this.colGroup[this.xvar.columnResizerIndex]._width = _width;\n this.needToPaintSum = true;\n\n // 컬럼너비 변경사항 적용.\n GRID.header.repaint.call(this);\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n\n alignGrid.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.getColumnSortInfo\n * @returns {Object} sortInfo\n */\n this.getColumnSortInfo = function () {\n var that = { sortInfo: [] };\n for (var k in this.sortInfo) {\n that.sortInfo.push({\n key: k,\n orderBy: this.sortInfo[k].orderBy,\n seq: this.sortInfo[k].seq\n });\n }\n that.sortInfo.sort(function (a, b) {\n return a.seq > b.seq;\n });\n return that.sortInfo;\n };\n\n /**\n * @method ax5grid.setColumnSort\n * @param {Object} _sortInfo\n * @param {Object} _sortInfo.key\n * @param {Number} _sortInfo.key.seq - seq of sortOrder\n * @param {String} _sortInfo.key.orderBy - \"desc\"|\"asc\"\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5grid.setColumnSort({a:{seq:0, orderBy:\"desc\"}, b:{seq:1, orderBy:\"asc\"}});\n * ```\n */\n this.setColumnSort = function (_sortInfo) {\n if (typeof _sortInfo !== \"undefined\") {\n this.sortInfo = _sortInfo;\n GRID.header.applySortStatus.call(this, _sortInfo);\n }\n\n sortColumns.call(this, _sortInfo || this.sortInfo);\n return this;\n };\n\n /**\n * @method ax5grid.select\n * @param {Number|Object} _selectObject\n * @param {Number} _selectObject.index - index of row\n * @param {Number} _selectObject.rowIndex - rowIndex of columns\n * @param {Number} _selectObject.conIndex - colIndex of columns\n * @param {Object} _options\n * @param {Boolean} _options.selectedClear\n * @param {Boolean} _options.selected\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.select(0);\n * firstGrid.select(0, {selected: true});\n * firstGrid.select(0, {selected: false});\n * firstGrid.select(0, {selectedClear: true});\n * ```\n */\n this.select = function (_selectObject, _options) {\n if (U.isNumber(_selectObject)) {\n var _dindex2 = _selectObject;\n\n if (!this.config.multipleSelect) {\n this.clearSelect();\n } else {\n if (_options && _options.selectedClear) {\n this.clearSelect();\n }\n }\n\n GRID.data.select.call(this, _dindex2, undefined, _options && _options.selected);\n GRID.body.updateRowState.call(this, [\"selected\"], _dindex2, undefined);\n }\n return this;\n };\n\n /**\n * @method firstGrid.clickBody\n * @param {Number} _dindex\n * @returns {ax5grid}\n */\n this.clickBody = function (_dindex) {\n GRID.body.click.call(this, _dindex);\n return this;\n };\n\n /**\n * @method firstGrid.DBLClickBody\n * @param {Number} _dindex\n * @returns {ax5grid}\n */\n this.DBLClickBody = function (_dindex) {\n GRID.body.dblClick.call(this, _dindex);\n return this;\n };\n\n /**\n * @method ax5grid.clearSelect\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.clearSelect();\n * ```\n */\n this.clearSelect = function () {\n GRID.body.updateRowState.call(this, [\"selectedClear\"]);\n GRID.data.clearSelect.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.selectAll\n * @param {Object} _options\n * @param {Boolean} _options.selected\n * @param {Function} _options.filter\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.selectAll();\n * firstGrid.selectAll({selected: true});\n * firstGrid.selectAll({selected: false});\n * firstGrid.selectAll({filter: function(){\n * return this[\"b\"] == \"A01\";\n * });\n * firstGrid.selectAll({selected: true, filter: function(){\n * return this[\"b\"] == \"A01\";\n * });\n * ```\n */\n this.selectAll = function (_options) {\n GRID.data.selectAll.call(this, _options && _options.selected, _options);\n GRID.body.updateRowStateAll.call(this, [\"selected\"]);\n return this;\n };\n\n /**\n * @method ax5grid.exportExcel\n * @param {String} _fileName\n * @returns {ax5grid|String}\n * @example\n * ```js\n * firstGrid.exportExcel(\"grid-to-excel.xls\");\n * console.log(firstGrid.exportExcel());\n * ```\n */\n this.exportExcel = function (_fileName) {\n var table = [];\n table.push('
');\n table.push(GRID.header.getExcelString.call(this));\n table.push(GRID.body.getExcelString.call(this));\n table.push('
');\n\n if (typeof _fileName === \"undefined\") {\n return table.join('');\n } else {\n GRID.excel.export.call(this, [table.join('')], _fileName);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.focus\n * @param {String|Number} _pos - UP, DOWN, LEFT, RIGHT, HOME, END\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.focus(\"UP\");\n * firstGrid.focus(\"DOWN\");\n * firstGrid.focus(\"HOME\");\n * firstGrid.focus(\"END\");\n * ```\n */\n this.focus = function (_pos) {\n\n if (GRID.body.moveFocus.call(this, _pos)) {\n var focusedColumn = void 0;\n for (var c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (focusedColumn) {\n this.select(focusedColumn.dindex, { selectedClear: true });\n }\n } else {\n if (typeof this.selectedDataIndexs[0] === \"undefined\") {\n this.select(0);\n } else {\n var selectedIndex = this.selectedDataIndexs[0];\n\n var processor = {\n \"UP\": function UP() {\n if (selectedIndex > 0) {\n this.select(selectedIndex - 1, { selectedClear: true });\n GRID.body.moveFocus.call(this, selectedIndex - 1);\n }\n },\n \"DOWN\": function DOWN() {\n if (selectedIndex < this.list.length - 1) {\n this.select(selectedIndex + 1, { selectedClear: true });\n GRID.body.moveFocus.call(this, selectedIndex + 1);\n }\n },\n \"HOME\": function HOME() {\n this.select(0, { selectedClear: true });\n GRID.body.moveFocus.call(this, 0);\n },\n \"END\": function END() {\n this.select(this.list.length - 1, { selectedClear: true });\n GRID.body.moveFocus.call(this, this.list.length - 1);\n }\n };\n\n if (_pos in processor) {\n processor[_pos].call(this);\n }\n }\n }\n return this;\n };\n\n /**\n * @method ax5grid.destroy\n * @returns {null}\n */\n this.destroy = function () {\n var instanceId = this.instanceId;\n this.$target.empty();\n this.list = [];\n UI.grid_instance = ax5.util.filter(UI.grid_instance, function () {\n return this.instanceId != instanceId;\n });\n return null;\n };\n\n // 클래스 생성자\n this.main = function () {\n UI.grid_instance = UI.grid_instance || [];\n UI.grid_instance.push(this);\n\n if (arguments && U.isObject(arguments[0])) {\n this.setConfig(arguments[0]);\n }\n }.apply(this, arguments);\n };\n }());\n\n GRID = ax5.ui.grid;\n})();\n\n// todo : filter\n// todo : column reorder\n// todo : editor 필수값 속성 지정\n// ax5.ui.grid.body\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var columnSelect = {\n focusClear: function focusClear() {\n var self = this,\n _column = void 0;\n for (var c in self.focusedColumn) {\n _column = self.focusedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName].find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]').removeAttr('data-ax5grid-column-focused');\n }\n }\n self.focusedColumn = {};\n },\n clear: function clear() {\n var self = this,\n _column = void 0;\n for (var c in self.selectedColumn) {\n _column = self.selectedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName].find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]').removeAttr('data-ax5grid-column-selected');\n }\n }\n self.selectedColumn = {};\n },\n init: function init(column) {\n var self = this;\n if (this.isInlineEditing) {\n for (var editKey in this.inlineEditing) {\n if (editKey == column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex) {\n return this;\n }\n }\n }\n\n // focus\n columnSelect.focusClear.call(self);\n self.focusedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex] = {\n panelName: column.panelName,\n dindex: column.dindex,\n doindex: column.doindex,\n rowIndex: column.rowIndex,\n colIndex: column.colIndex,\n colspan: column.colspan\n };\n\n // select\n columnSelect.clear.call(self);\n self.xvar.selectedRange = {\n start: [column.dindex, column.rowIndex, column.colIndex, column.colspan - 1],\n end: null\n };\n self.selectedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex] = function (data) {\n if (data) {\n return false;\n } else {\n return {\n panelName: column.panelName,\n dindex: column.dindex,\n doindex: column.doindex,\n rowIndex: column.rowIndex,\n colIndex: column.colIndex,\n colspan: column.colspan\n };\n }\n }(self.selectedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex]);\n\n this.$.panel[column.panelName].find('[data-ax5grid-tr-data-index=\"' + column.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + column.colIndex + '\"]').attr('data-ax5grid-column-focused', \"true\").attr('data-ax5grid-column-selected', \"true\");\n\n if (this.isInlineEditing) {\n GRID.body.inlineEdit.deActive.call(this, \"RETURN\");\n }\n },\n update: function update(column) {\n var self = this;\n var dindex = void 0,\n doindex = void 0,\n colIndex = void 0,\n rowIndex = void 0,\n trl = void 0;\n\n self.xvar.selectedRange[\"end\"] = [column.dindex, column.rowIndex, column.colIndex, column.colspan - 1];\n columnSelect.clear.call(self);\n\n var range = {\n r: {\n s: Math.min(self.xvar.selectedRange[\"start\"][0], self.xvar.selectedRange[\"end\"][0]),\n e: Math.max(self.xvar.selectedRange[\"start\"][0], self.xvar.selectedRange[\"end\"][0])\n },\n c: {\n s: Math.min(self.xvar.selectedRange[\"start\"][2], self.xvar.selectedRange[\"end\"][2]),\n e: Math.max(self.xvar.selectedRange[\"start\"][2] + self.xvar.selectedRange[\"start\"][3], self.xvar.selectedRange[\"end\"][2] + self.xvar.selectedRange[\"end\"][3])\n }\n };\n\n dindex = range.r.s;\n for (; dindex <= range.r.e; dindex++) {\n\n trl = this.bodyRowTable.rows.length;\n rowIndex = 0;\n for (; rowIndex < trl; rowIndex++) {\n colIndex = range.c.s;\n for (; colIndex <= range.c.e; colIndex++) {\n var _panels = [],\n panelName = \"\";\n\n if (self.xvar.frozenRowIndex > dindex) _panels.push(\"top\");\n if (self.xvar.frozenColumnIndex > colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n if (_panels[0] !== \"top\") _panels.push(\"scroll\");\n panelName = _panels.join(\"-\");\n\n self.selectedColumn[dindex + \"_\" + colIndex + \"_\" + rowIndex] = {\n panelName: panelName,\n dindex: dindex,\n rowIndex: rowIndex,\n colIndex: colIndex,\n colspan: column.colspan\n };\n\n _panels = null;\n panelName = null;\n }\n }\n }\n dindex = null;\n doindex = null;\n colIndex = null;\n rowIndex = null;\n\n for (var c in self.selectedColumn) {\n var _column = self.selectedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName].find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]').attr('data-ax5grid-column-selected', 'true');\n }\n }\n }\n };\n\n var columnSelector = {\n \"on\": function on(cell) {\n var self = this;\n\n if (this.inlineEditing[cell.dindex + \"_\" + cell.colIndex + \"_\" + cell.rowIndex]) {\n return;\n }\n\n columnSelect.init.call(self, cell);\n\n this.$[\"container\"][\"body\"].on(\"mousemove.ax5grid-\" + this.instanceId, '[data-ax5grid-column-attr=\"default\"]', function (e) {\n if (this.getAttribute(\"data-ax5grid-column-rowIndex\")) {\n columnSelect.update.call(self, {\n panelName: this.getAttribute(\"data-ax5grid-panel-name\"),\n dindex: Number(this.getAttribute(\"data-ax5grid-data-index\")),\n doindex: Number(this.getAttribute(\"data-ax5grid-data-o-index\")),\n rowIndex: Number(this.getAttribute(\"data-ax5grid-column-rowIndex\")),\n colIndex: Number(this.getAttribute(\"data-ax5grid-column-colIndex\")),\n colspan: Number(this.getAttribute(\"colspan\"))\n });\n U.stopEvent(e);\n }\n }).on(\"mouseup.ax5grid-\" + this.instanceId, function () {\n columnSelector.off.call(self);\n }).on(\"mouseleave.ax5grid-\" + this.instanceId, function () {\n columnSelector.off.call(self);\n });\n\n jQuery(document.body).attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);\n },\n \"off\": function off() {\n\n this.$[\"container\"][\"body\"].off(\"mousemove.ax5grid-\" + this.instanceId).off(\"mouseup.ax5grid-\" + this.instanceId).off(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body).removeAttr('unselectable').css('user-select', 'auto').off('selectstart');\n }\n };\n\n var updateRowState = function updateRowState(_states, _dindex, _doindex, _data) {\n var self = this,\n cfg = this.config,\n processor = {\n \"selected\": function selected(_dindex, _doindex) {\n if (this.list[_doindex]) {\n var i = this.$.livePanelKeys.length;\n while (i--) {\n this.$.panel[this.$.livePanelKeys[i]].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]').attr(\"data-ax5grid-selected\", this.list[_doindex][cfg.columnKeys.selected]);\n }\n }\n },\n \"selectedClear\": function selectedClear() {\n var di = this.list.length;\n var pi = void 0;\n\n if (!this.proxyList) {\n while (di--) {\n if (this.list[di][cfg.columnKeys.selected]) {\n pi = this.$.livePanelKeys.length;\n while (pi--) {\n this.$.panel[this.$.livePanelKeys[pi]].find('[data-ax5grid-tr-data-index=\"' + di + '\"]').attr(\"data-ax5grid-selected\", false);\n }\n }\n this.list[di][cfg.columnKeys.selected] = false;\n }\n } else {\n while (di--) {\n this.list[di][cfg.columnKeys.selected] = false;\n }\n di = this.proxyList.length;\n while (di--) {\n if (this.list[doi][cfg.columnKeys.selected]) {\n pi = this.$.livePanelKeys.length;\n while (pi--) {\n this.$.panel[this.$.livePanelKeys[pi]].find('[data-ax5grid-tr-data-index=\"' + di + '\"]').attr(\"data-ax5grid-selected\", false);\n }\n }\n\n this.proxyList[di][cfg.columnKeys.selected] = false;\n var doi = this.proxyList[di].__original_index__;\n }\n }\n },\n \"cellChecked\": function cellChecked(_dindex, _doindex, _data) {\n var key = _data.key,\n rowIndex = _data.rowIndex,\n colIndex = _data.colIndex;\n\n var panelName = function () {\n var _panels = [];\n if (this.xvar.frozenRowIndex > _dindex) _panels.push(\"top\");\n if (this.xvar.frozenColumnIndex > colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n if (_panels[0] !== \"top\") _panels.push(\"scroll\");\n return _panels.join(\"-\");\n }.call(this);\n\n this.$.panel[panelName].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]').find('[data-ax5grid-column-rowIndex=\"' + rowIndex + '\"][data-ax5grid-column-colIndex=\"' + colIndex + '\"]').find('[data-ax5grid-editor=\"checkbox\"]').attr(\"data-ax5grid-checked\", '' + _data.checked);\n }\n };\n\n if (typeof _doindex === \"undefined\") _doindex = _dindex;\n\n _states.forEach(function (_state) {\n if (!processor[_state]) throw 'invaild state name';\n processor[_state].call(self, _dindex, _doindex, _data);\n });\n };\n\n var updateRowStateAll = function updateRowStateAll(_states, _data) {\n var self = this,\n cfg = this.config,\n processor = {\n \"selected\": function selected(_dindex) {\n GRID.body.repaint.call(this, true);\n }\n };\n\n _states.forEach(function (_state) {\n if (!processor[_state]) throw 'invaild state name';\n processor[_state].call(self, _data);\n });\n };\n\n var init = function init() {\n var self = this;\n\n this.$[\"container\"][\"body\"].on(\"click\", '[data-ax5grid-column-attr]', function (e) {\n var panelName = void 0,\n attr = void 0,\n row = void 0,\n col = void 0,\n dindex = void 0,\n doindex = void 0,\n rowIndex = void 0,\n colIndex = void 0,\n disableSelection = void 0,\n targetClick = {\n \"default\": function _default(_column) {\n var column = self.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex],\n that = {\n self: self,\n page: self.page,\n list: self.list,\n item: self.list[_column.doindex],\n dindex: _column.dindex,\n doindex: _column.doindex,\n rowIndex: _column.rowIndex,\n colIndex: _column.colIndex,\n column: column,\n value: self.list[_column.dindex][column.key]\n };\n\n if (column.editor && column.editor.type == \"checkbox\") {\n // todo : GRID.inlineEditor에서 처리 할수 있도록 구문 변경 필요.\n var value = GRID.data.getValue.call(self, _column.dindex, _column.doindex, column.key),\n checked = void 0,\n newValue = void 0;\n\n if (column.editor.config && column.editor.config.trueValue) {\n if (checked = !(value == column.editor.config.trueValue)) {\n newValue = column.editor.config.trueValue;\n } else {\n newValue = column.editor.config.falseValue;\n }\n } else {\n newValue = checked = value == false || value == \"false\" || value < \"1\" ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(self, _column.dindex, _column.doindex, column.key, newValue);\n\n updateRowState.call(self, [\"cellChecked\"], _column.dindex, _column.doindex, {\n key: column.key, rowIndex: _column.rowIndex, colIndex: _column.colIndex,\n editorConfig: column.editor.config, checked: checked\n });\n } else {\n if (self.config.body.onClick) {\n self.config.body.onClick.call(that);\n }\n }\n },\n \"rowSelector\": function rowSelector(_column) {\n var item = self.list[_column.doindex];\n if (item[self.config.columnKeys.disableSelection]) {\n return false;\n }\n\n if (!self.config.multipleSelect && self.selectedDataIndexs[0] !== _column.doindex) {\n updateRowState.call(self, [\"selectedClear\"]);\n GRID.data.clearSelect.call(self);\n }\n\n GRID.data.select.call(self, _column.dindex, _column.doindex, undefined, {\n internalCall: true\n });\n updateRowState.call(self, [\"selected\"], _column.dindex, _column.doindex);\n },\n \"lineNumber\": function lineNumber(_column) {},\n \"tree-control\": function treeControl(_column, _el) {\n //console.log(_column);\n toggleCollapse.call(self, _column.dindex, _column.doindex);\n }\n };\n\n panelName = this.getAttribute(\"data-ax5grid-panel-name\");\n attr = this.getAttribute(\"data-ax5grid-column-attr\");\n row = Number(this.getAttribute(\"data-ax5grid-column-row\"));\n col = Number(this.getAttribute(\"data-ax5grid-column-col\"));\n rowIndex = Number(this.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(this.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(this.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(this.getAttribute(\"data-ax5grid-data-o-index\"));\n\n if (attr in targetClick) {\n targetClick[attr]({\n panelName: panelName,\n attr: attr,\n row: row,\n col: col,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex\n }, this);\n }\n });\n this.$[\"container\"][\"body\"].on(\"dblclick\", '[data-ax5grid-column-attr]', function (e) {\n var panelName = void 0,\n attr = void 0,\n row = void 0,\n col = void 0,\n dindex = void 0,\n doindex = void 0,\n rowIndex = void 0,\n colIndex = void 0,\n targetDBLClick = {\n \"default\": function _default(_column) {\n if (self.isInlineEditing) {\n for (var columnKey in self.inlineEditing) {\n if (columnKey == _column.dindex + \"_\" + _column.colIndex + \"_\" + _column.rowIndex) {\n return this;\n }\n }\n }\n\n var column = self.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex],\n value = \"\";\n if (column) {\n if (!self.list[dindex].__isGrouping) {\n value = GRID.data.getValue.call(self, dindex, doindex, column.key);\n }\n }\n\n var editor = self.colGroup[_column.colIndex].editor;\n if (U.isObject(editor)) {\n GRID.body.inlineEdit.active.call(self, self.focusedColumn, e, value);\n } else {\n // 더블클릭 실행\n if (self.config.body.onDBLClick) {\n var that = {\n self: self,\n page: self.page,\n list: self.list,\n item: self.list[_column.dindex],\n dindex: _column.dindex,\n doindex: _column.doindex,\n rowIndex: _column.rowIndex,\n colIndex: _column.colIndex,\n column: column,\n value: self.list[_column.dindex][column.key]\n };\n self.config.body.onDBLClick.call(that);\n }\n }\n },\n \"rowSelector\": function rowSelector(_column) {},\n \"lineNumber\": function lineNumber(_column) {}\n };\n\n panelName = this.getAttribute(\"data-ax5grid-panel-name\");\n attr = this.getAttribute(\"data-ax5grid-column-attr\");\n row = Number(this.getAttribute(\"data-ax5grid-column-row\"));\n col = Number(this.getAttribute(\"data-ax5grid-column-col\"));\n rowIndex = Number(this.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(this.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(this.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(this.getAttribute(\"data-ax5grid-data-o-index\"));\n\n if (attr in targetDBLClick) {\n targetDBLClick[attr]({\n panelName: panelName,\n attr: attr,\n row: row,\n col: col,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex\n });\n }\n });\n\n if (this.config.contextMenu) {\n this.$[\"container\"][\"body\"].on(\"contextmenu\", function (e) {\n var target = void 0,\n dindex = void 0,\n doindex = void 0,\n rowIndex = void 0,\n colIndex = void 0,\n item = void 0,\n column = void 0,\n param = {};\n\n target = U.findParentNode(e.target, function (t) {\n if (t.getAttribute(\"data-ax5grid-column-attr\")) {\n return true;\n }\n });\n\n if (target) {\n // item 찾기\n rowIndex = Number(target.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(target.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(target.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(target.getAttribute(\"data-ax5grid-data-o-index\"));\n column = self.bodyRowMap[rowIndex + \"_\" + colIndex];\n item = self.list[dindex];\n }\n\n if (!self.contextMenu) {\n self.contextMenu = new ax5.ui.menu();\n }\n\n self.contextMenu.setConfig(self.config.contextMenu);\n\n param = {\n element: target,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex,\n item: item,\n column: column,\n gridSelf: self\n };\n\n self.contextMenu.popup(e, {\n filter: function filter() {\n return self.config.contextMenu.popupFilter.call(this, this, param);\n },\n param: param\n });\n\n U.stopEvent(e.originalEvent);\n target = null;\n dindex = null;\n doindex = null;\n rowIndex = null;\n colIndex = null;\n item = null;\n column = null;\n param = null;\n });\n }\n\n this.$[\"container\"][\"body\"].on(\"mousedown\", '[data-ax5grid-column-attr=\"default\"]', function (e) {\n if (self.xvar.touchmoved) return false;\n if (this.getAttribute(\"data-ax5grid-column-rowIndex\")) {\n columnSelector.on.call(self, {\n panelName: this.getAttribute(\"data-ax5grid-panel-name\"),\n dindex: Number(this.getAttribute(\"data-ax5grid-data-index\")),\n doindex: Number(this.getAttribute(\"data-ax5grid-data-o-index\")),\n rowIndex: Number(this.getAttribute(\"data-ax5grid-column-rowIndex\")),\n colIndex: Number(this.getAttribute(\"data-ax5grid-column-colIndex\")),\n colspan: Number(this.getAttribute(\"colspan\"))\n });\n }\n }).on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n resetFrozenColumn.call(this);\n\n // 그리드 바디에 출력할 여유 카운트\n this.xvar.paintRowCountMargin = this.config.virtualScrollYCountMargin;\n this.xvar.paintRowCountTopMargin = this.config.virtualScrollYCountMargin - Math.floor(this.config.virtualScrollYCountMargin / 2);\n\n if (this.config.virtualScrollAccelerated) {\n this.__throttledScroll = U.throttle(function (css, opts) {\n if (this.config.virtualScrollY && !opts.noRepaint && \"top\" in css) {\n repaint.call(this);\n } else if (this.config.virtualScrollX && !opts.noRepaint && \"left\" in css) {\n repaint.call(this);\n }\n if (opts.callback) {\n opts.callback();\n }\n }, this.config.virtualScrollAcceleratedDelayTime);\n } else {\n this.__throttledScroll = false;\n }\n };\n\n var resetFrozenColumn = function resetFrozenColumn() {\n var cfg = this.config,\n dividedBodyRowObj = GRID.util.divideTableByFrozenColumnIndex(this.bodyRowTable, this.xvar.frozenColumnIndex);\n\n this.asideBodyRowData = function (dataTable) {\n var data = { rows: [] };\n for (var i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = { cols: [] };\n if (i === 0) {\n var col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n },\n _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n label: \" \", key: \"__d-index__\"\n });\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n label: \"\", key: \"__d-checkbox__\"\n });\n data.rows[i].cols.push(_col);\n }\n }\n }\n\n return data;\n }.call(this, this.bodyRowTable);\n\n //console.log(dividedBodyRowObj);\n\n this.leftBodyRowData = dividedBodyRowObj.leftData;\n this.bodyRowData = dividedBodyRowObj.rightData;\n\n if (cfg.body.grouping) {\n var dividedBodyGroupingObj = GRID.util.divideTableByFrozenColumnIndex(this.bodyGroupingTable, this.xvar.frozenColumnIndex);\n this.asideBodyGroupingData = function (dataTable) {\n var data = { rows: [] };\n for (var i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = { cols: [] };\n if (i === 0) {\n var col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n },\n _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n label: \" \", key: \"__d-index__\"\n });\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n label: \"\", key: \"__d-checkbox__\"\n });\n data.rows[i].cols.push(_col);\n }\n }\n }\n\n return data;\n }.call(this, this.bodyGroupingTable);\n this.leftBodyGroupingData = dividedBodyGroupingObj.leftData;\n this.bodyGroupingData = dividedBodyGroupingObj.rightData;\n this.bodyGroupingMap = GRID.util.makeBodyRowMap.call(this, this.bodyGroupingTable);\n }\n\n this.leftFootSumData = {};\n this.footSumData = {};\n if (this.config.footSum) {\n var dividedFootSumObj = GRID.util.divideTableByFrozenColumnIndex(this.footSumTable, this.xvar.frozenColumnIndex);\n this.leftFootSumData = dividedFootSumObj.leftData;\n this.footSumData = dividedFootSumObj.rightData;\n }\n };\n\n var getFieldValue = function getFieldValue(_list, _item, _index, _col, _value, _returnPlainText) {\n\n var _key = _col.key,\n tagsToReplace = {\n '<': '<',\n '>': '>'\n };\n\n if (_key === \"__d-index__\") {\n return typeof _item[\"__index\"] !== \"undefined\" ? _item[\"__index\"] + 1 : \"\";\n } else if (_key === \"__d-checkbox__\") {\n return \"
\";\n } else {\n if (_col.editor && function (_editor) {\n if (_editor.type in GRID.inlineEditor) {\n return GRID.inlineEditor[_editor.type].editMode == \"inline\";\n }\n return false;\n }(_col.editor)) {\n // editor가 inline타입이라면\n\n _value = _value || GRID.data.getValue.call(this, _index, _item.__origin_index__, _key);\n\n if (U.isFunction(_col.editor.disabled)) {\n if (_col.editor.disabled.call({\n list: _list,\n dindex: _index,\n item: _list[_index],\n key: _key,\n value: _value\n })) {\n return _value;\n }\n }\n\n // print editor\n return _returnPlainText ? _value : GRID.inlineEditor[_col.editor.type].getHtml(this, _col.editor, _value);\n }\n\n var valueProcessor = {\n \"formatter\": function formatter() {\n var that = {\n key: _key,\n value: _value || GRID.data.getValue.call(this, _index, _item.__origin_index__, _key),\n dindex: _index,\n item: _item,\n list: _list\n };\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n },\n \"default\": function _default() {\n var returnValue = \"\";\n\n if (typeof _value !== \"undefined\") {\n returnValue = _value;\n } else {\n if (/[\\.\\[\\]]/.test(_key)) {\n _value = GRID.data.getValue.call(this, _index, _item.__origin_index__, _key);\n } else {\n _value = _item[_key];\n }\n\n if (_value !== null && typeof _value !== \"undefined\") returnValue = _value;\n }\n\n // 키값이 Boolean일때 오류 발생하여 수정.\n return typeof returnValue !== \"string\" ? returnValue : returnValue.replace(/[<>]/g, function (tag) {\n return tagsToReplace[tag] || tag;\n });\n },\n \"treeControl\": function treeControl(__value) {\n var cfg = this.config,\n keys = this.config.tree.columnKeys,\n indentNodeHtml = '';\n\n if (_item[keys.children].length) {\n indentNodeHtml += '';\n indentNodeHtml += _item[keys.collapse] ? cfg.tree.icons.collapsedArrow : cfg.tree.icons.openedArrow;\n indentNodeHtml += ' ';\n } else {\n indentNodeHtml += ' ';\n }\n\n indentNodeHtml += '';\n indentNodeHtml += _item[keys.children].length ? _item[keys.collapse] ? cfg.tree.icons.collapsedGroupIcon : cfg.tree.icons.groupIcon : cfg.tree.icons.itemIcon;\n indentNodeHtml += ' ';\n\n return indentNodeHtml + __value;\n }\n };\n\n var returnValue = _col.formatter ? valueProcessor.formatter.call(this) : valueProcessor.default.call(this);\n if (this.config.tree.use && _col.treeControl) {\n returnValue = valueProcessor.treeControl.call(this, returnValue);\n }\n\n return returnValue;\n }\n };\n\n var getGroupingValue = function getGroupingValue(_item, _index, _col) {\n var value = void 0,\n that = void 0,\n _key = _col.key,\n _label = _col.label;\n\n if (typeof _key === \"undefined\") {\n that = {\n key: _key,\n list: _item.__groupingList,\n groupBy: _item.__groupingBy\n };\n if (U.isFunction(_label)) {\n value = _label.call(that);\n } else {\n value = _label;\n }\n _item[_col.colIndex] = value;\n return value;\n } else if (_key === \"__d-index__\") {\n return '';\n } else if (_key === \"__d-checkbox__\") {\n return '';\n } else {\n if (_col.collector) {\n that = {\n key: _key,\n list: _item.__groupingList\n };\n if (U.isFunction(_col.collector)) {\n value = _col.collector.call(that);\n } else {\n value = GRID.collector[_col.collector].call(that);\n }\n _item[_col.colIndex] = value;\n\n if (_col.formatter) {\n that.value = value;\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n } else {\n return value;\n }\n } else {\n return \" \";\n }\n }\n };\n\n var getSumFieldValue = function getSumFieldValue(_list, _col) {\n var _key = _col.key,\n _label = _col.label;\n //, _collector, _formatter\n if (typeof _key === \"undefined\") {\n return _label;\n } else if (_key === \"__d-index__\" || _key === \"__d-checkbox__\") {\n return ' ';\n } else {\n if (_col.collector) {\n var that = {\n key: _key,\n list: _list\n },\n value = void 0;\n\n if (U.isFunction(_col.collector)) {\n value = _col.collector.call(that);\n } else {\n value = GRID.collector[_col.collector].call(that);\n }\n\n if (_col.formatter) {\n that.value = value;\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n } else {\n return value;\n }\n } else {\n return \" \";\n }\n }\n };\n\n var repaint = function repaint(_reset) {\n // debugger;\n var cfg = this.config,\n list = this.proxyList ? this.proxyList : this.list;\n\n /// repaint reset 타입이면 고정컬럼을 재조정\n if (_reset) {\n resetFrozenColumn.call(this);\n // 틀고정 이 변경되면 출력 시작 인덱스 값을 초기화\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.paintStartColumnIndex = undefined;\n }\n\n /// 출력시작 인덱스\n var paintStartRowIndex = void 0,\n virtualPaintStartRowIndex = void 0;\n\n if (this.config.virtualScrollY) {\n virtualPaintStartRowIndex = paintStartRowIndex = Math.floor(-this.$.panel[\"body-scroll\"].position().top / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex;\n if (this.xvar.paintRowCountTopMargin < paintStartRowIndex) {\n paintStartRowIndex -= this.xvar.paintRowCountTopMargin;\n }\n } else {\n paintStartRowIndex = this.xvar.frozenRowIndex;\n }\n\n if (isNaN(paintStartRowIndex)) return this;\n\n var paintStartColumnIndex = 0,\n paintEndColumnIndex = 0,\n nopaintLeftColumnsWidth = null,\n nopaintRightColumnsWidth = null;\n var bodyScrollLeft = -this.$.panel[\"body-scroll\"].position().left;\n\n if (this.config.virtualScrollX) {\n // 페인트 시작컬럼위치와 종료컬럼위치 구하기\n for (var ci = this.xvar.frozenColumnIndex; ci < this.colGroup.length; ci++) {\n // bodyScrollLeft\n this.colGroup[ci]._sx = ci == this.xvar.frozenColumnIndex ? 0 : this.colGroup[ci - 1]._ex;\n this.colGroup[ci]._ex = this.colGroup[ci]._sx + this.colGroup[ci]._width;\n\n if (this.colGroup[ci]._sx <= bodyScrollLeft && this.colGroup[ci]._ex >= bodyScrollLeft) {\n paintStartColumnIndex = ci;\n }\n if (this.colGroup[ci]._sx <= bodyScrollLeft + this.xvar.bodyWidth && this.colGroup[ci]._ex >= bodyScrollLeft + this.xvar.bodyWidth) {\n paintEndColumnIndex = ci;\n\n if (nopaintLeftColumnsWidth === null) nopaintLeftColumnsWidth = this.colGroup[paintStartColumnIndex]._sx;\n if (nopaintRightColumnsWidth === null) nopaintRightColumnsWidth = this.xvar.scrollContentWidth - this.colGroup[ci]._ex;\n }\n }\n\n if (nopaintLeftColumnsWidth === null) nopaintLeftColumnsWidth = 0;\n if (nopaintRightColumnsWidth === null) nopaintRightColumnsWidth = 0;\n this.$.panel[\"top-body-scroll\"].css({ \"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth });\n this.$.panel[\"body-scroll\"].css({ \"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth });\n this.$.panel[\"bottom-body-scroll\"].css({ \"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth });\n }\n\n var isFirstPaint = typeof this.xvar.paintStartRowIndex === \"undefined\",\n headerColGroup = this.headerColGroup,\n asideBodyRowData = this.asideBodyRowData,\n leftBodyRowData = this.leftBodyRowData,\n bodyRowData = this.bodyRowData,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n asideBodyGroupingData = this.asideBodyGroupingData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount = void 0,\n virtualPaintRowCount = void 0;\n\n if (!this.config.virtualScrollY) {\n virtualPaintRowCount = paintRowCount = list.length;\n } else {\n virtualPaintRowCount = Math.ceil(this.xvar.bodyHeight / this.xvar.bodyTrHeight);\n paintRowCount = virtualPaintRowCount + (this.xvar.paintRowCountMargin || 1);\n }\n\n // 여유범위 안에 있으면 페인팅 안할수 있게 paintStartRowIndex 변경하지 않음.\n if (this.xvar.paintRowCountTopMargin < paintStartRowIndex && Math.abs(this.xvar.paintStartRowIndex - paintStartRowIndex) <= this.xvar.paintRowCountTopMargin) {\n paintStartRowIndex = this.xvar.paintStartRowIndex;\n }\n\n if (this.xvar.dataRowCount === list.length && this.xvar.paintStartRowIndex === paintStartRowIndex && this.xvar.paintRowCount === paintRowCount && this.xvar.paintStartColumnIndex === paintStartColumnIndex && this.xvar.paintEndColumnIndex === paintEndColumnIndex) return this; // 스크롤 포지션 변경 여부에 따라 프로세스 진행여부 결정\n\n // bodyRowData 수정 : 페인트 컬럼 포지션이 달라지므로\n if (nopaintLeftColumnsWidth || nopaintRightColumnsWidth) {\n headerColGroup = [].concat(headerColGroup).splice(paintStartColumnIndex - this.xvar.frozenColumnIndex, paintEndColumnIndex - paintStartColumnIndex + 1 + this.xvar.frozenColumnIndex);\n bodyRowData = GRID.util.getTableByStartEndColumnIndex(bodyRowData, paintStartColumnIndex, paintEndColumnIndex);\n\n if (cfg.body.grouping) {\n bodyGroupingData = GRID.util.getTableByStartEndColumnIndex(bodyGroupingData, paintStartColumnIndex, paintEndColumnIndex);\n }\n if (cfg.footSum) {\n footSumData = GRID.util.getTableByStartEndColumnIndex(footSumData, paintStartColumnIndex, paintEndColumnIndex);\n }\n if (this.xvar.paintStartColumnIndex !== paintStartColumnIndex || this.xvar.paintEndColumnIndex !== paintEndColumnIndex) {\n this.needToPaintSum = true;\n }\n }\n\n /// 스크롤 컨텐츠의 높이 : 그리드 스크롤의 실제 크기와는 관계 없이 데이터 갯수에 따라 스크롤 컨텐츠 높이값 구해서 저장해두기.\n // todo scrollContentHeight\n this.xvar.scrollContentHeight = this.xvar.bodyTrHeight * (list.length - this.xvar.frozenRowIndex);\n if (this.xvar.scrollContentHeight < 0) this.xvar.scrollContentHeight = 0;\n\n /// 사용된 패널들의 키 모음\n this.$.livePanelKeys = [];\n\n // 그리드 바디 영역 페인트 함수\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _groupRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n var repaintBody = function repaintBody(_elTargetKey, _colGroup, _bodyRow, _groupRow, _list, _scrollConfig) {\n var _elTarget = this.$.panel[_elTargetKey];\n\n if (!isFirstPaint && !_scrollConfig) {\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return false;\n }\n\n var SS = [],\n cgi = void 0,\n cgl = void 0,\n di = void 0,\n dl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0,\n isScrolled = function () {\n // 스크롤값이 변경되거나 처음 호출되었습니까?\n if (typeof _scrollConfig === \"undefined\" || typeof _scrollConfig['paintStartRowIndex'] === \"undefined\") {\n _scrollConfig = {\n paintStartRowIndex: 0,\n paintRowCount: _list.length\n };\n return false;\n } else {\n return true;\n }\n }(),\n stripeString = '#fff 0px, #fff ' + (cfg.body.columnHeight - cfg.body.columnBorderWidth) + 'px, #eee ' + (cfg.body.columnHeight - cfg.body.columnBorderWidth) + 'px, #eee ' + cfg.body.columnHeight + 'px';\n\n if (isScrolled) {\n SS.push('
');\n }\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n di = _scrollConfig.paintStartRowIndex;\n\n for (dl = function () {\n var len = void 0;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n }(); di < dl; di++) {\n\n if (_list[di]) {\n var isGroupingRow = false,\n rowTable = void 0,\n odi = typeof _list[di].__origin_index__ !== \"undefined\" ? _list[di].__origin_index__ : di;\n if (_groupRow && \"__isGrouping\" in _list[di]) {\n rowTable = _groupRow;\n isGroupingRow = true;\n } else {\n rowTable = _bodyRow;\n }\n\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n\n SS.push('');\n\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), isGroupingRow ? getGroupingValue.call(this, _list[di], di, col) : getFieldValue.call(this, _list, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n }\n }\n SS.push('
');\n\n if (isScrolled && _list.length) {\n SS.push('
');\n }\n\n _elTarget.empty();\n SS = SS.join('');\n\n _elTarget.get(0).innerHTML = SS;\n\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return true;\n };\n\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n var repaintSum = function repaintSum(_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n var _elTarget = this.$.panel[_elTargetKey];\n\n if (!isFirstPaint && !_scrollConfig) {\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return false;\n }\n\n var SS = [],\n cgi = void 0,\n cgl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty();\n SS = SS.join('');\n\n _elTarget.get(0).innerHTML = SS;\n\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return true;\n };\n\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n var mergeCellsBody = function mergeCellsBody(_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n var tblRowMaps = [];\n var _elTarget = this.$.panel[_elTargetKey];\n var token = {},\n hasMergeTd = void 0;\n\n // 테이블의 td들을 수잡하여 저장해두고 스크립트로 반복하여 정리.\n var tableTrs = _elTarget.find(\"tr\");\n for (var ri = 0, rl = tableTrs.length; ri < rl; ri++) {\n var tableTrTds = void 0,\n trMaps = void 0;\n tableTrTds = tableTrs[ri].childNodes;\n trMaps = [];\n\n for (var _ci = 0, cl = tableTrTds.length; _ci < cl; _ci++) {\n var tdObj = {\n \"$\": jQuery(tableTrTds[_ci])\n };\n\n if (tdObj[\"$\"].attr(\"data-ax5grid-column-col\") != \"null\") {\n tdObj.dindex = tdObj[\"$\"].attr(\"data-ax5grid-data-index\");\n tdObj.tri = tdObj[\"$\"].attr(\"data-ax5grid-column-row\");\n tdObj.ci = tdObj[\"$\"].attr(\"data-ax5grid-column-col\");\n tdObj.rowIndex = tdObj[\"$\"].attr(\"data-ax5grid-column-rowIndex\");\n tdObj.colIndex = tdObj[\"$\"].attr(\"data-ax5grid-column-colIndex\");\n tdObj.rowspan = tdObj[\"$\"].attr(\"rowspan\");\n tdObj.text = tdObj[\"$\"].text();\n trMaps.push(tdObj);\n }\n\n tdObj = null;\n }\n tblRowMaps.push(trMaps);\n }\n\n // 두줄이상 일 때 의미가 있으니.\n if (tblRowMaps.length > 1) {\n hasMergeTd = false;\n\n var _loop = function _loop(_ri, _rl) {\n var prevTokenColIndexs = [];\n\n var _loop2 = function _loop2(_ci3, _cl2) {\n // 적용 하려는 컬럼에 editor 속성이 없다면 머지 대상입니다.\n\n if (!_colGroup[_ci3].editor && function () {\n if (U.isArray(cfg.body.mergeCells)) {\n return ax5.util.search(cfg.body.mergeCells, _colGroup[_ci3].key) > -1;\n } else {\n return true;\n }\n }()) {\n\n // 앞줄과 값이 같다면.\n if (token[_ci3] && function () {\n if (prevTokenColIndexs.length > 0) {\n var hasFalse = true;\n prevTokenColIndexs.forEach(function (ti) {\n if (tblRowMaps[_ri - 1][ti].text != tblRowMaps[_ri][ti].text) {\n hasFalse = false;\n }\n });\n return hasFalse;\n } else {\n return true;\n }\n }() && token[_ci3].text == tblRowMaps[_ri][_ci3].text) {\n tblRowMaps[_ri][_ci3].rowspan = 0;\n tblRowMaps[token[_ci3].ri][_ci3].rowspan++;\n hasMergeTd = true;\n } else {\n token[_ci3] = {\n ri: _ri,\n ci: _ci3,\n text: tblRowMaps[_ri][_ci3].text\n };\n }\n\n prevTokenColIndexs.push(_ci3);\n }\n };\n\n for (var _ci3 = 0, _cl2 = tblRowMaps[_ri].length; _ci3 < _cl2; _ci3++) {\n _loop2(_ci3, _cl2);\n }\n };\n\n for (var _ri = 0, _rl = tblRowMaps.length; _ri < _rl; _ri++) {\n _loop(_ri, _rl);\n }\n\n // rowspan을 다 구했으면 적용합니다.\n if (hasMergeTd) {\n for (var _ri2 = 0, _rl2 = tblRowMaps.length; _ri2 < _rl2; _ri2++) {\n for (var _ci2 = 0, _cl = tblRowMaps[_ri2].length; _ci2 < _cl; _ci2++) {\n if (tblRowMaps[_ri2][_ci2].rowspan == 0) {\n tblRowMaps[_ri2][_ci2][\"$\"].remove();\n } else if (tblRowMaps[_ri2][_ci2].rowspan > 1) {\n tblRowMaps[_ri2][_ci2][\"$\"].attr(\"rowspan\", tblRowMaps[_ri2][_ci2].rowspan).addClass(\"merged\");\n }\n }\n }\n }\n }\n };\n\n var scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n paintStartColumnIndex: paintStartColumnIndex,\n paintEndColumnIndex: paintEndColumnIndex,\n nopaintLeftColumnsWidth: nopaintLeftColumnsWidth,\n nopaintRightColumnsWidth: nopaintRightColumnsWidth,\n bodyTrHeight: this.xvar.bodyTrHeight,\n virtualScrollX: this.config.virtualScrollX,\n virtualScrollY: this.config.virtualScrollY\n };\n var frozenScrollConfig = jQuery.extend({}, scrollConfig, {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex\n });\n\n // aside\n if (cfg.asidePanelWidth > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-aside-body\", this.asideColGroup, asideBodyRowData, asideBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n\n repaintBody.call(this, \"aside-body-scroll\", this.asideColGroup, asideBodyRowData, asideBodyGroupingData, list, scrollConfig);\n\n if (cfg.footSum) {\n // 바닥 요약 (footSum에 대한 aside 사용안함)\n repaintSum.call(this, \"bottom-aside-body\", this.asideColGroup, asideBodyRowData, null, this.list);\n }\n }\n\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n\n repaintBody.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, leftBodyGroupingData, list, scrollConfig);\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", this.leftHeaderColGroup, leftFootSumData, this.list);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-body-scroll\", headerColGroup, bodyRowData, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n repaintBody.call(this, \"body-scroll\", headerColGroup, bodyRowData, bodyGroupingData, list, scrollConfig);\n\n // 바닥 요약\n if (cfg.footSum && this.needToPaintSum) {\n repaintSum.call(this, \"bottom-body-scroll\", headerColGroup, footSumData, this.list, scrollConfig);\n }\n // right\n if (cfg.rightSum) {}\n // todo : right 표현 정리\n\n\n /// mergeCells\n if (cfg.body.mergeCells && list.length) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n // console.log(this.leftHeaderColGroup, leftBodyRowData);\n mergeCellsBody.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, list.slice(0, this.xvar.frozenRowIndex));\n }\n mergeCellsBody.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, list, scrollConfig);\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n mergeCellsBody.call(this, \"top-body-scroll\", this.headerColGroup, bodyRowData, list.slice(0, this.xvar.frozenRowIndex));\n }\n mergeCellsBody.call(this, \"body-scroll\", this.headerColGroup, bodyRowData, list, scrollConfig);\n }\n\n this.xvar.virtualPaintStartRowIndex = virtualPaintStartRowIndex;\n this.xvar.paintStartRowIndex = paintStartRowIndex;\n this.xvar.paintRowCount = paintRowCount;\n this.xvar.virtualPaintRowCount = virtualPaintRowCount;\n this.xvar.paintStartColumnIndex = paintStartColumnIndex;\n this.xvar.paintEndColumnIndex = paintEndColumnIndex;\n this.xvar.nopaintLeftColumnsWidth = nopaintLeftColumnsWidth;\n this.xvar.nopaintRightColumnsWidth = nopaintRightColumnsWidth;\n this.xvar.dataRowCount = list.length;\n this.needToPaintSum = false;\n\n GRID.page.statusUpdate.call(this);\n };\n\n var repaintCell = function repaintCell(_panelName, _dindex, _doindex, _rowIndex, _colIndex, _newValue) {\n var self = this,\n cfg = this.config,\n list = this.list;\n\n var updateCell = this.$[\"panel\"][_panelName].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + _rowIndex + '\"][data-ax5grid-column-colindex=\"' + _colIndex + '\"]').find('[data-ax5grid-cellholder]'),\n colGroup = this.colGroup,\n col = colGroup[_colIndex];\n\n updateCell.html(getFieldValue.call(this, list, list[_dindex], _dindex, col));\n\n if (col.editor && col.editor.updateWith) {\n col.editor.updateWith.forEach(function (updateColumnKey) {\n colGroup.forEach(function (col) {\n if (col.key == updateColumnKey) {\n var rowIndex = col.rowIndex,\n colIndex = col.colIndex,\n panelName = GRID.util.findPanelByColumnIndex.call(self, _dindex, colIndex, rowIndex).panelName,\n updateWithCell = self.$[\"panel\"][panelName].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + rowIndex + '\"][data-ax5grid-column-colindex=\"' + colIndex + '\"]').find('[data-ax5grid-cellholder]');\n\n updateWithCell.html(getFieldValue.call(self, list, list[_dindex], _dindex, col));\n }\n });\n });\n }\n\n /// ~~~~~~\n\n var paintStartRowIndex = Math.floor(Math.abs(this.$.panel[\"body-scroll\"].position().top) / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex,\n headerColGroup = this.headerColGroup,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount = Math.ceil(this.$.panel[\"body\"].height() / this.xvar.bodyTrHeight) + 1,\n scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n bodyTrHeight: this.xvar.bodyTrHeight\n };\n\n if (this.xvar.nopaintLeftColumnsWidth || this.xvar.nopaintRightColumnsWidth) {\n headerColGroup = [].concat(headerColGroup).splice(this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex - this.xvar.paintStartColumnIndex + 1);\n if (cfg.body.grouping) {\n bodyGroupingData = GRID.util.getTableByStartEndColumnIndex(bodyGroupingData, this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex);\n }\n if (cfg.footSum) {\n footSumData = GRID.util.getTableByStartEndColumnIndex(footSumData, this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex);\n }\n }\n\n var repaintSum = function repaintSum(_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n var _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n cgi = void 0,\n cgl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty().get(0).innerHTML = SS.join('');\n return true;\n };\n var replaceGroupTr = function replaceGroupTr(_elTargetKey, _colGroup, _groupRow, _list, _scrollConfig) {\n var _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n di = void 0,\n dl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0;\n\n for (di = _scrollConfig.paintStartRowIndex, dl = function () {\n var len = void 0;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n }(); di < dl; di++) {\n if (_list[di] && _groupRow && \"__isGrouping\" in _list[di]) {\n var rowTable = _groupRow;\n SS = [];\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getGroupingValue.call(this, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n }\n _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0).innerHTML = SS.join('');\n }\n }\n };\n\n // body.grouping tr 다시 그리기..\n if (cfg.body.grouping) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-left-body\", headerColGroup, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex,\n bodyTrHeight: this.xvar.bodyTrHeight\n });\n }\n replaceGroupTr.call(this, \"left-body-scroll\", headerColGroup, leftBodyGroupingData, list, scrollConfig);\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-body-scroll\", headerColGroup, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex,\n bodyTrHeight: this.xvar.bodyTrHeight\n });\n }\n\n replaceGroupTr.call(this, \"body-scroll\", headerColGroup, bodyGroupingData, list, scrollConfig);\n }\n\n if (this.xvar.frozenColumnIndex > 0) {\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", headerColGroup, leftFootSumData, list);\n }\n }\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-body-scroll\", headerColGroup, footSumData, list, scrollConfig);\n }\n };\n\n var repaintRow = function repaintRow(_dindex) {\n var self = this,\n cfg = this.config,\n list = this.list;\n /// ~~~~~~\n\n var paintStartRowIndex = Math.floor(Math.abs(this.$.panel[\"body-scroll\"].position().top) / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex,\n asideBodyRowData = this.asideBodyRowData,\n leftBodyRowData = this.leftBodyRowData,\n bodyRowData = this.bodyRowData,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n asideBodyGroupingData = this.asideBodyGroupingData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount = Math.ceil(this.$.panel[\"body\"].height() / this.xvar.bodyTrHeight) + 1,\n scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n bodyTrHeight: this.xvar.bodyTrHeight\n };\n\n var repaintSum = function repaintSum(_elTargetKey, _colGroup, _bodyRow, _list) {\n var _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n cgi = void 0,\n cgl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty().get(0).innerHTML = SS.join('');\n return true;\n };\n var replaceGroupTr = function replaceGroupTr(_elTargetKey, _colGroup, _groupRow, _list, _scrollConfig) {\n var _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n di = void 0,\n dl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0;\n\n if (typeof _scrollConfig === \"undefined\" || typeof _scrollConfig['paintStartRowIndex'] === \"undefined\") {\n _scrollConfig = {\n paintStartRowIndex: 0,\n paintRowCount: _list.length\n };\n }\n\n for (di = _scrollConfig.paintStartRowIndex, dl = function () {\n var len = void 0;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n }(); di < dl; di++) {\n if (_list[di] && _groupRow && \"__isGrouping\" in _list[di]) {\n var rowTable = _groupRow;\n SS = [];\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getGroupingValue.call(this, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n }\n _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0).innerHTML = SS.join('');\n }\n }\n };\n var replaceTr = function replaceTr(_elTargetKey, _colGroup, _bodyRow, _list, di) {\n var _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n cellHeight = void 0,\n colAlign = void 0,\n rowTable = _bodyRow,\n odi = typeof _list[di].__origin_index__ !== \"undefined\" ? _list[di].__origin_index__ : di;\n\n var tr_element = _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0);\n if (tr_element) {\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push(function (_cellHeight) {\n var lineHeight = cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth;\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n }(cellHeight), getFieldValue.call(this, _list, _list[di], di, col), ' ');\n SS.push(' ');\n }\n SS.push(' ');\n }\n tr_element.innerHTML = SS.join('');\n }\n };\n\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceTr.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, list.slice(0, this.xvar.frozenRowIndex), _dindex);\n } else {\n replaceTr.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, list, _dindex);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceTr.call(this, \"top-body-scroll\", this.headerColGroup, bodyRowData, list.slice(0, this.xvar.frozenRowIndex), _dindex);\n } else {\n replaceTr.call(this, \"body-scroll\", this.headerColGroup, bodyRowData, list, _dindex);\n }\n\n // body.grouping tr 다시 그리기..\n if (cfg.body.grouping) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex));\n } else {\n replaceGroupTr.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyGroupingData, list, scrollConfig);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-body-scroll\", this.headerColGroup, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex));\n } else {\n replaceGroupTr.call(this, \"body-scroll\", this.headerColGroup, bodyGroupingData, list, scrollConfig);\n }\n }\n\n if (this.xvar.frozenColumnIndex > 0) {\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", this.leftHeaderColGroup, leftFootSumData, list);\n }\n }\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-body-scroll\", this.headerColGroup, footSumData, list, scrollConfig);\n }\n };\n\n var scrollTo = function scrollTo(css, opts) {\n if (typeof opts === \"undefined\") opts = { timeoutUnUse: false };\n if (this.isInlineEditing) {\n for (var key in this.inlineEditing) {\n //if(this.inlineEditing[key].editor.type === \"select\") {}\n // 인라인 에디팅 인데 스크롤 이벤트가 발생하면 디액티브 처리\n GRID.body.inlineEdit.deActive.call(this, \"ESC\", key);\n }\n }\n\n if (this.config.asidePanelWidth > 0 && \"top\" in css) {\n this.$.panel[\"aside-body-scroll\"].css({ top: css.top });\n }\n if (this.xvar.frozenColumnIndex > 0 && \"top\" in css) {\n this.$.panel[\"left-body-scroll\"].css({ top: css.top });\n }\n if (this.xvar.frozenRowIndex > 0 && \"left\" in css) {\n this.$.panel[\"top-body-scroll\"].css({ left: css.left });\n }\n\n this.$.panel[\"body-scroll\"].css(css);\n\n if (this.config.footSum && \"left\" in css) {\n this.$.panel[\"bottom-body-scroll\"].css({ left: css.left });\n }\n\n // 바디 리페인팅 this.__throttledScroll 은 body init 에서 초기화\n if (this.__throttledScroll) {\n this.__throttledScroll(css, opts);\n } else {\n if (this.config.virtualScrollY && !opts.noRepaint && \"top\" in css) {\n repaint.call(this);\n } else if (this.config.virtualScrollX && !opts.noRepaint && \"left\" in css) {\n repaint.call(this);\n }\n if (opts.callback) {\n opts.callback();\n }\n }\n };\n\n var blur = function blur() {\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n if (this.isInlineEditing) {\n inlineEdit.deActive.call(this);\n }\n };\n\n var moveFocus = function moveFocus(_position) {\n var focus = {\n \"UD\": function UD(_dy) {\n var moveResult = true,\n focusedColumn = void 0,\n originalColumn = void 0,\n while_i = void 0,\n nPanelInfo = void 0;\n\n for (var c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n\n if (!focusedColumn) return false;\n\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n if (_dy > 0) {\n // 아래로\n if (focusedColumn.rowIndex + (originalColumn.rowspan - 1) + _dy > this.bodyRowTable.rows.length - 1) {\n focusedColumn.dindex = focusedColumn.dindex + _dy;\n focusedColumn.doindex = focusedColumn.doindex + _dy;\n focusedColumn.rowIndex = 0;\n if (focusedColumn.dindex > this.list.length - 1) {\n focusedColumn.dindex = focusedColumn.doindex = this.list.length - 1;\n moveResult = false;\n }\n } else {\n focusedColumn.rowIndex = focusedColumn.rowIndex + _dy;\n }\n } else {\n // 위로\n if (focusedColumn.rowIndex + _dy < 0) {\n focusedColumn.dindex = focusedColumn.dindex + _dy;\n focusedColumn.doindex = focusedColumn.doindex + _dy;\n focusedColumn.rowIndex = this.bodyRowTable.rows.length - 1;\n if (focusedColumn.dindex < 0) {\n focusedColumn.dindex = focusedColumn.doindex = 0;\n moveResult = false;\n }\n } else {\n focusedColumn.rowIndex = focusedColumn.rowIndex + _dy;\n }\n }\n\n while_i = 0;\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n if (focusedColumn.rowIndex == 0 || while_i % 2 == (_dy > 0 ? 0 : 1)) {\n focusedColumn.colIndex--;\n } else {\n focusedColumn.rowIndex--;\n }\n\n if (focusedColumn.rowIndex <= 0 && focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n while_i++;\n }\n\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n\n // if mergeCells\n if (this.config.body.mergeCells && this.list.length) {\n while (!this.$.panel[nPanelInfo.panelName].find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').get(0)) {\n\n if (_dy > 0) {\n focusedColumn.dindex++;\n } else {\n focusedColumn.dindex--;\n }\n\n if (focusedColumn.dindex < 0 || focusedColumn.dindex > this.list.length - 1) {\n break;\n }\n }\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n }\n\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리.ㅊㅇ\n\n if (focusedColumn.dindex + 1 > this.xvar.frozenRowIndex) {\n if (focusedColumn.dindex <= this.xvar.virtualPaintStartRowIndex) {\n var newTop = (focusedColumn.dindex - this.xvar.frozenRowIndex - 1) * this.xvar.bodyTrHeight;\n if (newTop < 0) newTop = 0;\n scrollTo.call(this, { top: -newTop, timeoutUnUse: false });\n GRID.scroller.resize.call(this);\n } else if (focusedColumn.dindex + 1 > this.xvar.virtualPaintStartRowIndex + (this.xvar.virtualPaintRowCount - 2)) {\n scrollTo.call(this, { top: (this.xvar.virtualPaintRowCount - 2 - focusedColumn.dindex) * this.xvar.bodyTrHeight, timeoutUnUse: false });\n GRID.scroller.resize.call(this);\n }\n }\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n this.$.panel[focusedColumn.panelName].find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').attr('data-ax5grid-column-focused', \"true\");\n\n return moveResult;\n },\n \"LR\": function LR(_dx) {\n var moveResult = true,\n focusedColumn = void 0,\n originalColumn = void 0,\n while_i = 0,\n isScrollPanel = false,\n containerPanelName = \"\",\n nPanelInfo = void 0;\n\n for (var c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (!focusedColumn) return false;\n\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n if (_dx < 0) {\n focusedColumn.colIndex = focusedColumn.colIndex + _dx;\n if (focusedColumn.colIndex < 0) {\n focusedColumn.colIndex = 0;\n moveResult = false;\n }\n } else {\n focusedColumn.colIndex = focusedColumn.colIndex + _dx;\n if (focusedColumn.colIndex > this.colGroup.length - 1) {\n focusedColumn.colIndex = this.colGroup.length - 1;\n moveResult = false;\n }\n }\n\n if (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.rowIndex = 0;\n }\n\n if (this.list[focusedColumn.dindex] && this.list[focusedColumn.dindex].__isGrouping) {\n if (_dx < 0) {\n while (typeof this.bodyGroupingMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex--;\n if (focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n }\n } else {\n while (typeof this.bodyGroupingMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex++;\n if (focusedColumn.colIndex >= this.colGroup.length) {\n // find fail\n moveResult = false;\n break;\n }\n }\n }\n } else {\n if (_dx < 0) {\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex--;\n if (focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n }\n } else {\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex++;\n if (focusedColumn.colIndex >= this.colGroup.length) {\n // find fail\n moveResult = false;\n break;\n }\n }\n }\n }\n\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n\n // if mergeCells\n if (this.config.body.mergeCells && this.list.length && focusedColumn.dindex > 1) {\n while (!this.$.panel[nPanelInfo.panelName].find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').get(0)) {\n\n focusedColumn.dindex--;\n\n if (focusedColumn.dindex < 0 || focusedColumn.dindex > this.list.length - 1) {\n break;\n }\n }\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n }\n\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리\n var isScrollTo = function () {\n if (!this.config.virtualScrollX) return false;\n var scrollLeft = 0;\n if (focusedColumn.colIndex + 1 > this.xvar.frozenColumnIndex) {\n if (focusedColumn.colIndex <= this.xvar.paintStartColumnIndex && this.colGroup[focusedColumn.colIndex]) {\n scrollLeft = -this.colGroup[Number(focusedColumn.colIndex)]._sx;\n scrollTo.call(this, { left: scrollLeft });\n GRID.header.scrollTo.call(this, { left: scrollLeft });\n GRID.scroller.resize.call(this);\n return true;\n } else if (focusedColumn.colIndex >= this.xvar.paintEndColumnIndex && this.colGroup[Number(focusedColumn.colIndex)]) {\n if (this.colGroup[Number(focusedColumn.colIndex)]._ex > this.xvar.bodyWidth) {\n scrollLeft = this.colGroup[Number(focusedColumn.colIndex)]._ex - this.xvar.bodyWidth;\n scrollTo.call(this, { left: -scrollLeft });\n GRID.header.scrollTo.call(this, { left: -scrollLeft });\n GRID.scroller.resize.call(this);\n }\n return true;\n }\n }\n scrollLeft = null;\n return false;\n }.call(this);\n\n containerPanelName = nPanelInfo.containerPanelName;\n isScrollPanel = nPanelInfo.isScrollPanel;\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n\n var $column = this.$.panel[focusedColumn.panelName].find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').attr('data-ax5grid-column-focused', \"true\");\n\n if (!isScrollTo && $column && isScrollPanel) {\n // 스크롤 패널 이라면~\n // todo : 컬럼이동할 때에도 scrollTo 체크\n var newLeft = function () {\n if ($column.position().left + $column.outerWidth() > Math.abs(this.$.panel[focusedColumn.panelName].position().left) + this.$.panel[containerPanelName].width()) {\n return $column.position().left + $column.outerWidth() - this.$.panel[containerPanelName].width();\n } else if (Math.abs(this.$.panel[focusedColumn.panelName].position().left) > $column.position().left) {\n return $column.position().left;\n } else {\n return;\n }\n }.call(this);\n\n if (typeof newLeft !== \"undefined\") {\n GRID.header.scrollTo.call(this, { left: -newLeft });\n scrollTo.call(this, { left: -newLeft });\n GRID.scroller.resize.call(this);\n }\n }\n\n return moveResult;\n },\n \"INDEX\": function INDEX(_dindex) {\n var moveResult = true,\n focusedColumn = void 0,\n originalColumn = void 0,\n while_i = void 0;\n\n for (var c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (!focusedColumn) {\n focusedColumn = {\n rowIndex: 0,\n colIndex: 0\n };\n }\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n if (_dindex == \"end\") {\n _dindex = this.list.length - 1;\n }\n\n focusedColumn.dindex = _dindex;\n focusedColumn.rowIndex = 0;\n\n while_i = 0;\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n if (focusedColumn.rowIndex == 0 || while_i % 2 == (_dy > 0 ? 0 : 1)) {\n focusedColumn.colIndex--;\n } else {\n focusedColumn.rowIndex--;\n }\n\n if (focusedColumn.rowIndex <= 0 && focusedColumn.colIndex <= 0) {\n // find fail\n break;\n }\n while_i++;\n }\n\n var nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리.\n {\n if (focusedColumn.dindex + 1 > this.xvar.frozenRowIndex) {\n var virtualPaintStartRowIndex = this.xvar.virtualPaintStartRowIndex || 0;\n\n if (focusedColumn.dindex < virtualPaintStartRowIndex) {\n scrollTo.call(this, { top: -(focusedColumn.dindex - this.xvar.frozenRowIndex) * this.xvar.bodyTrHeight });\n GRID.scroller.resize.call(this);\n } else if (focusedColumn.dindex + 1 > virtualPaintStartRowIndex + (this.xvar.virtualPaintRowCount - 2)) {\n //debugger;\n //console.log((focusedColumn.dindex - this.xvar.frozenRowIndex - this.xvar.virtualPaintRowCount + 3));\n var scrollTopValue = !this.config.virtualScrollY ? focusedColumn.dindex - this.xvar.frozenRowIndex : focusedColumn.dindex - this.xvar.frozenRowIndex - this.xvar.virtualPaintRowCount + 3;\n scrollTo.call(this, { top: -scrollTopValue * this.xvar.bodyTrHeight });\n GRID.scroller.resize.call(this);\n }\n }\n }\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n this.$.panel[focusedColumn.panelName].find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').attr('data-ax5grid-column-focused', \"true\");\n\n return moveResult;\n }\n };\n\n var processor = {\n \"UP\": function UP() {\n return focus[\"UD\"].call(this, -1);\n },\n \"DOWN\": function DOWN() {\n return focus[\"UD\"].call(this, 1);\n },\n \"LEFT\": function LEFT() {\n return focus[\"LR\"].call(this, -1);\n },\n \"RIGHT\": function RIGHT() {\n return focus[\"LR\"].call(this, 1);\n },\n \"HOME\": function HOME() {\n return focus[\"INDEX\"].call(this, 0);\n },\n \"END\": function END() {\n return focus[\"INDEX\"].call(this, \"end\");\n },\n \"position\": function position(_position) {\n return focus[\"INDEX\"].call(this, _position);\n }\n };\n\n if (_position in processor) {\n return processor[_position].call(this);\n } else {\n return processor[\"position\"].call(this, _position);\n }\n };\n\n var inlineEdit = {\n active: function active(_focusedColumn, _e, _initValue) {\n var self = this,\n dindex = void 0,\n doindex = void 0,\n colIndex = void 0,\n rowIndex = void 0,\n panelName = void 0,\n colspan = void 0,\n col = void 0,\n editor = void 0;\n\n for (var key in _focusedColumn) {\n panelName = _focusedColumn[key].panelName;\n dindex = _focusedColumn[key].dindex;\n doindex = _focusedColumn[key].doindex;\n colIndex = _focusedColumn[key].colIndex;\n rowIndex = _focusedColumn[key].rowIndex;\n colspan = _focusedColumn[key].colspan;\n\n // 인라인 에디팅을 멈춰야 하는 경우 조건\n col = this.colGroup[colIndex];\n if (!(editor = col.editor)) return this;\n\n // editor disabled 체크\n if (U.isFunction(editor.disabled)) {\n if (editor.disabled.call({\n list: this.list,\n dindex: dindex,\n item: this.list[dindex],\n key: col.key,\n value: _initValue\n })) {\n return this;\n }\n }\n\n // 조건에 맞지 않는 에디팅 타입이면 반응 없음.\n if (!function (_editor, _type) {\n if (_editor.type in GRID.inlineEditor) {\n return GRID.inlineEditor[_editor.type].editMode == \"popup\";\n }\n }(editor)) {\n // 체크 박스 타입이면 값 변경 시도\n if (editor.type == \"checkbox\") {\n var checked = void 0,\n newValue = void 0;\n if (editor.config && editor.config.trueValue) {\n if (checked = !(_initValue == editor.config.trueValue)) {\n newValue = editor.config.trueValue;\n } else {\n newValue = editor.config.falseValue;\n }\n } else {\n newValue = checked = _initValue == false || _initValue == \"false\" || _initValue < \"1\" ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(self, dindex, doindex, col.key, newValue);\n updateRowState.call(self, [\"cellChecked\"], dindex, doindex, {\n key: col.key, rowIndex: rowIndex, colIndex: colIndex,\n editorConfig: col.editor.config, checked: checked\n });\n }\n return this;\n }\n\n if (this.list[dindex].__isGrouping) {\n return false;\n }\n if (key in this.inlineEditing) {\n return false;\n }\n\n this.inlineEditing[key] = {\n editor: editor,\n panelName: panelName,\n columnKey: key,\n column: _focusedColumn[key],\n useReturnToSave: GRID.inlineEditor[editor.type].useReturnToSave\n };\n this.isInlineEditing = true;\n }\n if (this.isInlineEditing) {\n\n var originalValue = GRID.data.getValue.call(self, dindex, doindex, col.key),\n initValue = function (__value, __editor) {\n if (U.isNothing(__value)) {\n __value = U.isNothing(originalValue) ? \"\" : originalValue;\n }\n\n if (__editor.type == \"money\") {\n return U.number(__value, { \"money\": true });\n } else {\n return __value;\n }\n }.call(this, _initValue, editor);\n\n this.inlineEditing[key].$inlineEditorCell = this.$[\"panel\"][panelName].find('[data-ax5grid-tr-data-index=\"' + dindex + '\"]').find('[data-ax5grid-column-rowindex=\"' + rowIndex + '\"][data-ax5grid-column-colindex=\"' + colIndex + '\"]').find('[data-ax5grid-cellholder]');\n\n this.inlineEditing[key].$inlineEditor = GRID.inlineEditor[editor.type].init(this, key, editor, this.inlineEditing[key].$inlineEditorCell, initValue);\n\n return true;\n }\n },\n deActive: function deActive(_msg, _key, _value) {\n // console.log(this.inlineEditing.column.dindex, this.inlineEditing.$inlineEditor.val());\n if (!this.inlineEditing[_key]) return this;\n\n var panelName = this.inlineEditing[_key].panelName,\n dindex = this.inlineEditing[_key].column.dindex,\n doindex = this.inlineEditing[_key].column.doindex,\n rowIndex = this.inlineEditing[_key].column.rowIndex,\n colIndex = this.inlineEditing[_key].column.colIndex,\n column = this.bodyRowMap[this.inlineEditing[_key].column.rowIndex + \"_\" + this.inlineEditing[_key].column.colIndex],\n editorValue = function ($inlineEditor) {\n if (typeof _value === \"undefined\") {\n if ($inlineEditor.get(0).tagName == \"SELECT\" || $inlineEditor.get(0).tagName == \"INPUT\" || $inlineEditor.get(0).tagName == \"TEXTAREA\") {\n return $inlineEditor.val();\n } else {\n _msg = \"CANCEL\";\n return false;\n }\n } else {\n return _value;\n }\n }(this.inlineEditing[_key].$inlineEditor),\n newValue = function (__value, __editor) {\n if (__editor.type == \"money\") {\n return U.number(__value);\n } else {\n return __value;\n }\n }.call(this, editorValue, column.editor);\n\n var action = {\n \"CANCEL\": function CANCEL(_dindex, _column, _newValue) {\n action[\"__clear\"].call(this);\n },\n \"RETURN\": function RETURN(_dindex, _doindex, _column, _newValue) {\n if (GRID.data.setValue.call(this, _dindex, _doindex, _column.key, _newValue)) {\n action[\"__clear\"].call(this);\n GRID.body.repaintCell.call(this, panelName, _dindex, _doindex, rowIndex, colIndex, _newValue);\n } else {\n action[\"__clear\"].call(this);\n }\n },\n \"__clear\": function __clear() {\n this.isInlineEditing = false;\n\n if (this.inlineEditing[_key] && this.inlineEditing[_key].$inlineEditor) {\n var bindedAx5ui = this.inlineEditing[_key].$inlineEditor.data(\"binded-ax5ui\");\n if (bindedAx5ui == \"ax5picker\") {\n this.inlineEditing[_key].$inlineEditor.ax5picker(\"close\");\n } else if (bindedAx5ui == \"ax5select\") {\n this.inlineEditing[_key].$inlineEditor.ax5select(\"close\");\n }\n this.inlineEditing[_key].$inlineEditor.remove();\n this.inlineEditing[_key].$inlineEditor = null;\n this.inlineEditing[_key].$inlineEditorCell = null;\n }\n\n this.inlineEditing[_key] = undefined;\n delete this.inlineEditing[_key]; // delete 지원안하는 브라우저 테스트..\n }\n };\n\n if (_msg in action) {\n action[_msg || \"RETURN\"].call(this, dindex, doindex, column, newValue);\n } else {\n action[\"__clear\"].call(this);\n }\n },\n keydown: function keydown(key, columnKey, _options) {\n var processor = {\n \"ESC\": function ESC() {\n for (var columnKey in this.inlineEditing) {\n inlineEdit.deActive.call(this, \"CANCEL\", columnKey);\n }\n },\n \"RETURN\": function RETURN() {\n if (this.isInlineEditing) {\n if (this.inlineEditing[columnKey] && this.inlineEditing[columnKey].useReturnToSave) {\n // todo : 네이밍 검증 할 필요있음.\n inlineEdit.deActive.call(this, \"RETURN\", columnKey);\n } else {\n return false;\n }\n } else {\n\n for (var k in this.focusedColumn) {\n var _column = this.focusedColumn[k],\n column = this.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex],\n _dindex3 = _column.dindex,\n doindex = _column.doindex,\n value = \"\",\n col = this.colGroup[_column.colIndex];\n\n if (column) {\n if (!this.list[_dindex3].__isGrouping) {\n value = GRID.data.getValue.call(this, _dindex3, doindex, column.key);\n }\n }\n\n if (col.editor && GRID.inlineEditor[col.editor.type].editMode === \"inline\") {\n if (_options && _options.moveFocus) {} else {\n if (column.editor && column.editor.type == \"checkbox\") {\n value = GRID.data.getValue.call(this, _dindex3, doindex, column.key);\n\n var checked = void 0,\n newValue = void 0;\n if (column.editor.config && column.editor.config.trueValue) {\n // console.log(value, column.editor.config.trueValue);\n\n if (value != column.editor.config.trueValue) {\n newValue = column.editor.config.trueValue;\n checked = true;\n } else {\n newValue = column.editor.config.falseValue;\n checked = false;\n }\n } else {\n newValue = checked = value == false || value == \"false\" || value < \"1\" ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(this, _dindex3, doindex, column.key, newValue);\n updateRowState.call(this, [\"cellChecked\"], _dindex3, doindex, {\n key: column.key, rowIndex: _column.rowIndex, colIndex: _column.colIndex,\n editorConfig: column.editor.config, checked: checked\n });\n }\n }\n } else {\n GRID.body.inlineEdit.active.call(this, this.focusedColumn, null, value);\n }\n }\n }\n return true;\n }\n };\n\n if (key in processor) {\n processor[key].call(this, key, columnKey, _options);\n }\n }\n };\n\n var getExcelString = function getExcelString() {\n var cfg = this.config,\n list = this.list,\n bodyRowData = this.bodyRowTable,\n footSumData = this.footSumTable,\n bodyGroupingData = this.bodyGroupingTable;\n\n // body-scroll 의 포지션에 의존적이므로..\n var getBody = function getBody(_colGroup, _bodyRow, _groupRow, _list) {\n var SS = [],\n di = void 0,\n dl = void 0,\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0,\n val = void 0;\n\n //SS.push('');\n for (di = 0, dl = _list.length; di < dl; di++) {\n var isGroupingRow = false,\n rowTable = void 0;\n\n if (_groupRow && \"__isGrouping\" in _list[di]) {\n rowTable = _groupRow;\n isGroupingRow = true;\n } else {\n rowTable = _bodyRow;\n }\n\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n SS.push('\\n');\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n SS.push('', (isGroupingRow ? getGroupingValue.call(this, _list[di], di, col) : getFieldValue.call(this, _list, _list[di], di, col, val, \"text\")) || ' ', ' ');\n }\n SS.push('\\n ');\n }\n }\n //SS.push('
');\n return SS.join('');\n };\n var getSum = function getSum(_colGroup, _bodyRow, _list) {\n var SS = [],\n tri = void 0,\n trl = void 0,\n ci = void 0,\n cl = void 0,\n col = void 0;\n\n //SS.push('');\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('\\n');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n SS.push('', getSumFieldValue.call(this, _list, col), ' ');\n }\n SS.push('\\n ');\n }\n //SS.push('
');\n\n return SS.join('');\n };\n\n var po = [];\n po.push(getBody.call(this, this.headerColGroup, bodyRowData, bodyGroupingData, list));\n if (cfg.footSum) {\n // 바닥 요약\n po.push(getSum.call(this, this.headerColGroup, footSumData, list));\n }\n\n // right\n if (cfg.rightSum) {\n // todo : right 표현 정리\n }\n\n return po.join('');\n };\n\n var toggleCollapse = function toggleCollapse(_dindex, _doindex, _collapse) {\n if (GRID.data.toggleCollapse.call(this, _dindex, _doindex, _collapse)) {\n this.proxyList = GRID.data.getProxyList.call(this, this.list);\n this.align();\n }\n };\n\n // todo : tree에서 dindex만으로 구현 했을 때 오류 발생 해결. (_doindex 이용)\n var click = function click(_dindex, _doindex) {\n var that = {\n self: this,\n page: this.page,\n list: this.list,\n item: this.list[_dindex],\n dindex: _dindex\n };\n\n moveFocus.call(this, _dindex);\n if (this.config.body.onClick) {\n this.config.body.onClick.call(that);\n }\n\n that = null;\n // console.log(this.$[\"panel\"][\"body-scroll\"].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]>td:first-child'));\n };\n\n var dblClick = function dblClick(_dindex, _doindex) {\n var that = {\n self: this,\n page: this.page,\n list: this.list,\n item: this.list[_dindex],\n dindex: _dindex\n };\n\n moveFocus.call(this, _dindex);\n\n if (this.config.body.onDBLClick) {\n this.config.body.onDBLClick.call(that);\n }\n\n that = null;\n };\n\n GRID.body = {\n init: init,\n repaint: repaint,\n repaintCell: repaintCell,\n repaintRow: repaintRow,\n updateRowState: updateRowState,\n updateRowStateAll: updateRowStateAll,\n scrollTo: scrollTo,\n blur: blur,\n moveFocus: moveFocus,\n inlineEdit: inlineEdit,\n getExcelString: getExcelString,\n toggleCollapse: toggleCollapse,\n click: click,\n dblClick: dblClick\n };\n})();\n// ax5.ui.grid.collector\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var sum = function sum() {\n var value = 0,\n i = this.list.length;\n while (i--) {\n if (!(\"__groupingList\" in this.list[i])) {\n value += U.number(this.list[i][this.key]);\n }\n }\n return value;\n };\n\n var avg = function avg() {\n var value = 0,\n i = this.list.length,\n listLength = 0;\n while (i--) {\n if (!(\"__groupingList\" in this.list[i])) {\n value += U.number(this.list[i][this.key]);\n listLength++;\n }\n }\n return U.number(value / (listLength || 1), { \"round\": 2 });\n };\n\n GRID.collector = {\n sum: sum,\n avg: avg\n };\n})();\n// ax5.ui.grid.layout\n(function () {\n\n var GRID = ax5.ui.grid,\n U = ax5.util;\n\n var init = function init() {};\n\n var clearGroupingData = function clearGroupingData(_list) {\n var i = 0,\n l = _list.length,\n returnList = [];\n for (; i < l; i++) {\n if (_list[i] && !_list[i][\"__isGrouping\"]) {\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n returnList.push(jQuery.extend({}, _list[i]));\n }\n }\n return returnList;\n };\n\n var initData = function initData(_list) {\n this.selectedDataIndexs = [];\n // this.deletedList = [];\n // todo : deletedList 초기화 시점이 언제로 하는게 좋은가. set 메소드에서 초기화 하는 것으로 수정\n\n var i = 0,\n l = _list.length,\n returnList = [],\n appendIndex = 0,\n dataRealRowCount = 0,\n lineNumber = 0;\n\n if (this.config.body.grouping) {\n\n var groupingKeys = U.map(this.bodyGrouping.by, function () {\n return {\n key: this,\n compareString: \"\",\n grouping: false,\n list: []\n };\n });\n\n var gi = 0,\n gl = groupingKeys.length,\n compareString = void 0,\n appendRow = [],\n ari = void 0;\n for (; i < l + 1; i++) {\n gi = 0;\n\n if (_list[i] && _list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n } else {\n compareString = \"\"; // 그룹핑 구문검사용\n appendRow = []; // 현재줄 앞에 추가해줘야 하는 줄\n\n // 그룹핑 구문검사\n for (; gi < gl; gi++) {\n if (_list[i]) {\n compareString += \"$|$\" + _list[i][groupingKeys[gi].key];\n }\n\n if (appendIndex > 0 && compareString != groupingKeys[gi].compareString) {\n var appendRowItem = { keys: [], labels: [], list: groupingKeys[gi].list };\n for (var ki = 0; ki < gi + 1; ki++) {\n appendRowItem.keys.push(groupingKeys[ki].key);\n appendRowItem.labels.push(_list[i - 1][groupingKeys[ki].key]);\n }\n appendRow.push(appendRowItem);\n groupingKeys[gi].list = [];\n }\n\n groupingKeys[gi].list.push(_list[i]);\n groupingKeys[gi].compareString = compareString;\n }\n\n // 새로 추가해야할 그룹핑 row\n ari = appendRow.length;\n while (ari--) {\n returnList.push({ __isGrouping: true, __groupingList: appendRow[ari].list, __groupingBy: { keys: appendRow[ari].keys, labels: appendRow[ari].labels } });\n }\n //~ 그룹핑 구문 검사 완료\n\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n // 그룹핑이 적용된 경우 오리지널 인덱스 의미 없음 : 정렬보다 그룹핑이 더 중요하므로.\n _list[i][\"__original_index\"] = _list[i][\"__index\"] = lineNumber;\n returnList.push(_list[i]);\n\n dataRealRowCount++;\n appendIndex++;\n lineNumber++;\n }\n }\n }\n } else {\n for (; i < l; i++) {\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n } else {\n\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n\n // __original_index 인덱스 키가 없다면 추가.\n if (typeof _list[i][\"__original_index\"] === \"undefined\") {\n _list[i][\"__original_index\"] = lineNumber;\n }\n _list[i][\"__index\"] = lineNumber;\n dataRealRowCount++;\n lineNumber++;\n returnList.push(_list[i]);\n }\n }\n }\n }\n\n // 원본 데이터의 갯수\n // grouping은 제외하고 수집됨.\n this.xvar.dataRealRowCount = dataRealRowCount;\n return returnList;\n };\n\n var arrangeData4tree = function arrangeData4tree(_list) {\n this.selectedDataIndexs = [];\n this.deletedList = [];\n var i = 0,\n seq = 0,\n appendIndex = 0,\n dataRealRowCount = 0,\n lineNumber = 0;\n\n var li = _list.length;\n var keys = this.config.tree.columnKeys;\n var hashDigit = this.config.tree.hashDigit;\n var listIndexMap = {};\n\n while (li--) {\n delete _list[li][keys.parentHash];\n delete _list[li][keys.selfHash];\n //delete _list[li][keys.childrenLength];\n }\n\n /// 루트 아이템 수집\n i = 0;\n seq = 0;\n li = _list.length;\n for (; i < li; i++) {\n if (_list[i]) {\n listIndexMap[_list[i][keys.selfKey]] = i; // 인덱싱\n\n if (U.isNothing(_list[i][keys.parentKey]) || _list[i][keys.parentKey] === \"top\") {\n // 최상위 아이템인 경우\n _list[i][keys.parentKey] = \"top\";\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = U.setDigit(\"0\", hashDigit);\n _list[i][keys.selfHash] = U.setDigit(\"0\", hashDigit) + \".\" + U.setDigit(seq, hashDigit);\n _list[i][keys.depth] = 0;\n _list[i][keys.hidden] = false;\n\n seq++;\n }\n }\n }\n\n /// 자식 아이템 수집\n i = 0;\n lineNumber = 0;\n for (; i < li; i++) {\n var _parent = void 0,\n _parentHash = void 0;\n if (_list[i] && _list[i][keys.parentKey] !== \"top\" && typeof _list[i][keys.parentHash] === \"undefined\") {\n\n if (_parent = _list[listIndexMap[_list[i][keys.parentKey]]]) {\n _parentHash = _parent[keys.selfHash];\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = _parentHash;\n _list[i][keys.selfHash] = _parentHash + \".\" + U.setDigit(_parent[keys.children].length, hashDigit);\n _list[i][keys.depth] = _parent[keys.depth] + 1;\n if (_parent[keys.collapse] || _parent[keys.hidden]) _list[i][keys.hidden] = true;\n _parent[keys.children].push(_list[i][keys.selfKey]);\n } else {\n _list[i][keys.parentKey] = \"top\";\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = U.setDigit(\"0\", hashDigit);\n _list[i][keys.selfHash] = U.setDigit(\"0\", hashDigit) + \".\" + U.setDigit(seq, hashDigit);\n _list[i][keys.hidden] = false;\n\n seq++;\n }\n }\n\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n _list[i][keys.hidden] = true;\n } else if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n\n _list[i][\"__index\"] = lineNumber;\n dataRealRowCount++;\n lineNumber++;\n }\n }\n\n this.listIndexMap = listIndexMap;\n this.xvar.dataRealRowCount = dataRealRowCount;\n\n return _list;\n };\n\n var getProxyList = function getProxyList(_list) {\n var i = 0,\n l = _list.length,\n returnList = [];\n for (; i < l; i++) {\n\n if (_list[i] && !_list[i][this.config.tree.columnKeys.hidden]) {\n _list[i].__origin_index__ = i;\n returnList.push(_list[i]);\n }\n }\n return returnList;\n };\n\n var set = function set(data) {\n\n var list = void 0;\n if (U.isArray(data)) {\n this.page = null;\n list = data;\n } else if (\"page\" in data) {\n this.page = jQuery.extend({}, data.page);\n list = data.list;\n }\n\n // console.log(this.list.length);\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n this.proxyList = null;\n this.list = initData.call(this, !this.config.remoteSort && Object.keys(this.sortInfo).length ? sort.call(this, this.sortInfo, list) : list);\n }\n this.selectedDataIndexs = [];\n this.deletedList = [];\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n\n if (this.config.body.grouping) {}\n return this;\n };\n\n var get = function get(_type) {\n return {\n list: this.list,\n page: this.page\n };\n };\n\n var getList = function getList(_type) {\n var returnList = [];\n //let list = (this.proxyList) ? this.proxyList : this.list;\n var list = this.list;\n var i = 0,\n l = list.length;\n switch (_type) {\n case \"modified\":\n for (; i < l; i++) {\n if (list[i] && !list[i][\"__isGrouping\"] && list[i][this.config.columnKeys.modified]) {\n returnList.push(jQuery.extend({}, list[i]));\n }\n }\n break;\n case \"selected\":\n for (; i < l; i++) {\n if (list[i] && !list[i][\"__isGrouping\"] && list[i][this.config.columnKeys.selected]) {\n returnList.push(jQuery.extend({}, list[i]));\n }\n }\n break;\n case \"deleted\":\n //_list = GRID.data.clearGroupingData(this.list);\n returnList = [].concat(this.deletedList);\n break;\n default:\n returnList = GRID.data.clearGroupingData.call(this, list);\n }\n return returnList;\n };\n\n var add = function add(_row, _dindex, _options) {\n var list = this.config.body.grouping ? clearGroupingData.call(this, this.list) : this.list;\n var processor = {\n \"first\": function first() {\n list = [].concat(_row).concat(list);\n },\n \"last\": function last() {\n list = list.concat([].concat(_row));\n }\n };\n\n if (this.config.tree.use) {\n var _list2 = this.list.concat([].concat(_row));\n\n this.list = arrangeData4tree.call(this, _list2);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n if (_dindex in processor) {\n _row[this.config.columnKeys.modified] = true;\n processor[_dindex].call(this, _row);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n if (U.isArray(_row)) {\n for (var _i = 0, _l = _row.length; _i < _l; _i++) {\n list.splice(_dindex + _i, 0, _row[_i]);\n }\n } else {\n list.splice(_dindex, 0, _row);\n }\n }\n\n if (this.config.body.grouping) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else if (_options && _options.sort && Object.keys(this.sortInfo).length) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else {\n list = initData.call(this, list);\n }\n\n this.list = list;\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n /**\n * list에서 완전 제거 하는 경우 사용.\n * ax5grid.data.remove\n */\n var remove = function remove(_dindex) {\n var list = this.config.body.grouping ? clearGroupingData.call(this, this.list) : this.list;\n var processor = {\n \"first\": function first() {\n if (this.config.tree.use) {\n processor.tree.call(this, 0);\n } else {\n list.splice(0, 1);\n }\n },\n \"last\": function last() {\n if (this.config.tree.use) {\n processor.tree.call(this, list.length - 1);\n } else {\n list.splice(list.length - 1, 1);\n }\n },\n \"index\": function index(_dindex) {\n if (this.config.tree.use) {\n processor.tree.call(this, _dindex);\n } else {\n list.splice(_dindex, 1);\n }\n },\n \"selected\": function selected() {\n if (this.config.tree.use) {\n processor.tree.call(this, \"selected\");\n } else {\n var __list = [],\n i = void 0,\n l = void 0;\n\n for (i = 0, l = list.length; i < l; i++) {\n if (!list[i][this.config.columnKeys.selected]) {\n __list.push(list[i]);\n }\n }\n list = __list;\n __list = null;\n i = null;\n }\n },\n \"tree\": function tree(_dindex) {\n var treeKeys = this.config.tree.columnKeys,\n selfHash = list[_dindex][this.config.tree.columnKeys.selfHash];\n list = U.filter(list, function () {\n return this[treeKeys.selfHash].substr(0, selfHash.length) != selfHash;\n });\n treeKeys = null;\n selfHash = null;\n }\n };\n\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n if (_dindex in processor) {\n processor[_dindex].call(this, _dindex);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n processor[\"index\"].call(this, _dindex);\n }\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n if (this.config.body.grouping) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else if (Object.keys(this.sortInfo).length) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else {\n list = initData.call(this, list);\n }\n this.list = list;\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n /**\n * list에서 deleted 처리 repaint\n * ax5grid.data.deleteRow\n */\n var deleteRow = function deleteRow(_dindex) {\n var list = this.config.body.grouping ? clearGroupingData.call(this, this.list) : this.list;\n var processor = {\n \"first\": function first() {\n if (this.config.tree.use) {\n processor.tree.call(this, 0);\n } else {\n list[0][this.config.columnKeys.deleted] = true;\n }\n },\n \"last\": function last() {\n if (this.config.tree.use) {\n processor.tree.call(this, list.length - 1);\n } else {\n list[list.length - 1][this.config.columnKeys.deleted] = true;\n }\n },\n \"selected\": function selected() {\n if (this.config.tree.use) {\n processor.tree.call(this, \"selected\");\n } else {\n var i = list.length;\n while (i--) {\n if (list[i][this.config.columnKeys.selected]) {\n list[i][this.config.columnKeys.deleted] = true;\n }\n }\n i = null;\n }\n },\n \"tree\": function tree(_dindex) {\n var keys = this.config.columnKeys,\n treeKeys = this.config.tree.columnKeys;\n\n if (_dindex === \"selected\") {\n\n var i = list.length;\n while (i--) {\n if (list[i][this.config.columnKeys.selected]) {\n list[i][this.config.columnKeys.deleted] = true;\n\n var selfHash = list[i][treeKeys.selfHash];\n var ii = list.length;\n\n while (ii--) {\n if (list[ii][treeKeys.selfHash].substr(0, selfHash.length) === selfHash) {\n list[ii][keys.deleted] = true;\n }\n }\n\n selfHash = null;\n ii = null;\n }\n }\n i = null;\n } else {\n var _selfHash = list[_dindex][treeKeys.selfHash];\n var _i2 = list.length;\n while (_i2--) {\n if (list[_i2][treeKeys.selfHash].substr(0, _selfHash.length) !== _selfHash) {\n list[_i2][keys.deleted] = true;\n }\n }\n _selfHash = null;\n _i2 = null;\n }\n\n keys = null;\n treeKeys = null;\n }\n };\n\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n\n if (_dindex in processor) {\n processor[_dindex].call(this, _dindex);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n list[_dindex][this.config.columnKeys.deleted] = true;\n }\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n if (this.config.body.grouping) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else if (Object.keys(this.sortInfo).length) {\n list = initData.call(this, sort.call(this, this.sortInfo, list));\n } else {\n list = initData.call(this, list);\n }\n\n this.list = list;\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n var update = function update(_row, _dindex) {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n //\n this.needToPaintSum = true;\n this.list.splice(_dindex, 1, _row);\n\n if (this.config.body.grouping) {\n this.list = initData.call(this, clearGroupingData.call(this, this.list));\n }\n };\n\n var updateChild = function updateChild(_dindex, _updateData, _options) {\n var keys = this.config.tree.columnKeys,\n selfHash = void 0,\n originIndex = void 0;\n\n if (typeof _dindex === \"undefined\") return false;\n originIndex = this.proxyList[_dindex].__origin_index__;\n\n if (this.list[originIndex][keys.children]) {\n this.proxyList = []; // 리셋 프록시\n\n if (_options && _options.filter) {\n if (_options.filter.call({ item: this.list[originIndex], dindex: originIndex }, this.list[originIndex])) {\n for (var _k in _updateData) {\n this.list[originIndex][_k] = _updateData[_k];\n }\n }\n } else {\n for (var _k2 in _updateData) {\n this.list[originIndex][_k2] = _updateData[_k2];\n }\n }\n\n selfHash = this.list[originIndex][keys.selfHash];\n\n var i = 0,\n l = this.list.length;\n for (; i < l; i++) {\n if (this.list[i]) {\n if (this.list[i][keys.parentHash].substr(0, selfHash.length) === selfHash) {\n\n if (_options && _options.filter) {\n if (_options.filter.call({ item: this.list[i], dindex: i }, this.list[i])) {\n for (var _k3 in _updateData) {\n this.list[i][_k3] = _updateData[_k3];\n }\n }\n } else {\n for (var _k4 in _updateData) {\n this.list[i][_k4] = _updateData[_k4];\n }\n }\n }\n\n if (!this.list[i][keys.hidden]) {\n this.proxyList.push(this.list[i]);\n }\n }\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n var setValue = function setValue(_dindex, _doindex, _key, _value) {\n var originalValue = getValue.call(this, _dindex, _doindex, _key);\n var list = this.list;\n var listIndex = typeof _doindex === \"undefined\" ? _dindex : _doindex;\n this.needToPaintSum = true;\n\n if (originalValue !== _value) {\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n list[listIndex][this.config.columnKeys.modified] = true;\n Function(\"val\", \"this\" + GRID.util.getRealPathForDataItem(_key) + \" = val;\").call(list[listIndex], _value);\n } catch (e) {}\n } else {\n list[listIndex][this.config.columnKeys.modified] = true;\n list[listIndex][_key] = _value;\n }\n\n if (this.onDataChanged) {\n this.onDataChanged.call({\n self: this,\n list: this.list,\n dindex: _dindex,\n doindex: _doindex,\n item: this.list[_dindex],\n key: _key,\n value: _value\n });\n }\n }\n\n return true;\n };\n\n var getValue = function getValue(_dindex, _doindex, _key, _value) {\n var list = this.list;\n var listIndex = typeof _doindex === \"undefined\" ? _dindex : _doindex;\n\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n _value = Function(\"\", \"return this\" + GRID.util.getRealPathForDataItem(_key) + \";\").call(list[listIndex]);\n } catch (e) {}\n } else {\n _value = list[listIndex][_key];\n }\n return _value;\n };\n\n var clearSelect = function clearSelect() {\n this.selectedDataIndexs = [];\n };\n\n var select = function select(_dindex, _doindex, _selected, _options) {\n var cfg = this.config;\n\n if (typeof _doindex === \"undefined\") _doindex = _dindex;\n\n if (!this.list[_doindex]) return false;\n if (this.list[_doindex].__isGrouping) return false;\n if (this.list[_doindex][cfg.columnKeys.disableSelection]) return false;\n\n if (typeof _selected === \"undefined\") {\n if (this.list[_doindex][cfg.columnKeys.selected] = !this.list[_doindex][cfg.columnKeys.selected]) {\n this.selectedDataIndexs.push(_doindex);\n } else {\n this.selectedDataIndexs.splice(U.search(this.selectedDataIndexs, function () {\n return this == _doindex;\n }), 1);\n }\n } else {\n if (this.list[_doindex][cfg.columnKeys.selected] = _selected) {\n this.selectedDataIndexs.push(_doindex);\n } else {\n this.selectedDataIndexs.splice(U.search(this.selectedDataIndexs, function () {\n return this == _doindex;\n }), 1);\n }\n }\n\n if (this.onDataChanged && _options && _options.internalCall) {\n this.onDataChanged.call({\n self: this,\n list: this.list,\n dindex: _dindex,\n doindex: _doindex,\n item: this.list[_doindex],\n key: cfg.columnKeys.selected,\n value: this.list[_doindex][cfg.columnKeys.selected]\n });\n }\n\n return this.list[_doindex][cfg.columnKeys.selected];\n };\n\n var selectAll = function selectAll(_selected, _options) {\n var cfg = this.config,\n dindex = this.list.length;\n\n this.selectedDataIndexs = [];\n\n if (typeof _selected === \"undefined\") {\n while (dindex--) {\n if (this.list[dindex].__isGrouping) continue;\n if (_options && _options.filter) {\n if (_options.filter.call(this.list[dindex]) !== true) {\n continue;\n }\n }\n if (this.list[dindex][cfg.columnKeys.disableSelection]) continue;\n\n if (this.list[dindex][cfg.columnKeys.selected] = !this.list[dindex][cfg.columnKeys.selected]) {\n this.selectedDataIndexs.push(dindex);\n }\n }\n } else {\n while (dindex--) {\n if (this.list[dindex].__isGrouping) continue;\n if (_options && _options.filter) {\n if (_options.filter.call(this.list[dindex]) !== true) {\n continue;\n }\n }\n if (this.list[dindex][cfg.columnKeys.disableSelection]) continue;\n\n if (this.list[dindex][cfg.columnKeys.selected] = _selected) {\n this.selectedDataIndexs.push(dindex);\n }\n }\n }\n\n if (this.onDataChanged && _options && _options.internalCall) {\n this.onDataChanged.call({\n self: this,\n list: this.list\n });\n }\n\n return this.list;\n };\n\n var sort = function sort(_sortInfo, _list, _options) {\n var self = this,\n list = _list || this.list,\n sortInfoArray = [],\n lineNumber = 0;\n var getKeyValue = function getKeyValue(_item, _key, _value) {\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n _value = Function(\"\", \"return this\" + GRID.util.getRealPathForDataItem(_key) + \";\").call(_item);\n } catch (e) {}\n } else {\n _value = _item[_key];\n }\n return _value;\n };\n\n for (var k in _sortInfo) {\n sortInfoArray[_sortInfo[k].seq] = { key: k, order: _sortInfo[k].orderBy };\n }\n sortInfoArray = U.filter(sortInfoArray, function () {\n return typeof this !== \"undefined\";\n });\n\n // 정렬조건이 없으면 original_index값을 이용하여 정렬처리\n if (_options && _options.resetLineNumber && sortInfoArray.length === 0) {\n sortInfoArray[0] = { key: '__original_index', order: \"asc\" };\n }\n\n var i = 0,\n l = sortInfoArray.length,\n _a_val = void 0,\n _b_val = void 0;\n\n list.sort(function (_a, _b) {\n for (i = 0; i < l; i++) {\n _a_val = getKeyValue(_a, sortInfoArray[i].key);\n _b_val = getKeyValue(_b, sortInfoArray[i].key);\n\n if ((typeof _a_val === \"undefined\" ? \"undefined\" : _typeof(_a_val)) !== (typeof _b_val === \"undefined\" ? \"undefined\" : _typeof(_b_val))) {\n _a_val = '' + _a_val;\n _b_val = '' + _b_val;\n }\n if (_a_val < _b_val) {\n return sortInfoArray[i].order === \"asc\" ? -1 : 1;\n } else if (_a_val > _b_val) {\n return sortInfoArray[i].order === \"asc\" ? 1 : -1;\n }\n }\n });\n\n if (_options && _options.resetLineNumber) {\n i = 0, l = list.length, lineNumber = 0;\n for (; i < l; i++) {\n if (_list[i] && !_list[i][\"__isGrouping\"]) {\n _list[i][\"__index\"] = lineNumber++;\n }\n }\n }\n\n if (_list) {\n return list;\n } else {\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n }\n };\n\n var append = function append(_list, _callback) {\n var self = this;\n\n if (this.config.tree.use) {\n var list = this.list.concat([].concat(_list));\n\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n list = null;\n } else {\n this.list = this.list.concat([].concat(_list));\n }\n\n this.appendProgress = true;\n GRID.page.statusUpdate.call(this);\n\n if (this.appendDebouncer) {\n if (self.appendDebounceTimes < this.config.debounceTime / 10) {\n clearTimeout(this.appendDebouncer);\n self.appendDebounceTimes++;\n } else {\n self.appendDebounceTimes = 0;\n appendIdle.call(self);\n _callback();\n return false;\n }\n }\n\n this.appendDebouncer = setTimeout(function () {\n self.appendDebounceTimes = 0;\n appendIdle.call(self);\n _callback();\n }, this.config.debounceTime);\n\n // todo : append bounce animation\n };\n\n var appendIdle = function appendIdle() {\n this.appendProgress = false;\n if (this.config.body.grouping) {\n this.list = initData.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n this.list = initData.call(this, this.list);\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = this.config.frozenRowIndex > this.list.length ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n };\n\n var toggleCollapse = function toggleCollapse(_dindex, _doindx, _collapse) {\n var keys = this.config.tree.columnKeys,\n selfHash = void 0,\n originIndex = void 0;\n\n if (typeof _dindex === \"undefined\") return false;\n originIndex = this.proxyList[_dindex].__origin_index__;\n\n if (this.list[originIndex][keys.children]) {\n this.proxyList = []; // 리셋 프록시\n if (typeof _collapse == \"undefined\") {\n _collapse = !(this.list[originIndex][keys.collapse] || false);\n }\n\n this.list[originIndex][keys.collapse] = _collapse;\n selfHash = this.list[originIndex][keys.selfHash];\n\n var i = this.list.length;\n while (i--) {\n if (this.list[i]) {\n // console.log(this.list[i][keys.parentHash].substr(0, selfHash.length), selfHash);\n if (this.list[i][keys.parentHash].substr(0, selfHash.length) === selfHash) {\n this.list[i][keys.hidden] = _collapse;\n }\n\n if (!this.list[i][keys.hidden]) {\n this.proxyList.push(this.list[i]);\n }\n }\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n GRID.data = {\n init: init,\n set: set,\n get: get,\n getList: getList,\n getProxyList: getProxyList,\n setValue: setValue,\n getValue: getValue,\n clearSelect: clearSelect,\n select: select,\n selectAll: selectAll,\n add: add,\n remove: remove,\n deleteRow: deleteRow,\n update: update,\n updateChild: updateChild,\n sort: sort,\n initData: initData,\n clearGroupingData: clearGroupingData,\n append: append,\n toggleCollapse: toggleCollapse\n };\n})();\n/*\n * Copyright (c) 2016. tom@axisj.com\n * - github.com/thomasjang\n * - www.axisj.com\n */\n\n// ax5.ui.grid.excel\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var base64 = function base64(s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n };\n\n var uri = \"data:application/vnd.ms-excel;base64,\";\n\n var getExcelTmpl = function getExcelTmpl() {\n return \"\\uFEFF\\n{{#tables}}{{{body}}}{{/tables}}\\n\";\n };\n\n var tableToExcel = function tableToExcel(table, fileName) {\n var link = void 0,\n a = void 0,\n output = void 0,\n tables = [].concat(table);\n\n output = ax5.mustache.render(getExcelTmpl(), {\n worksheet: function () {\n var arr = [];\n tables.forEach(function (t, ti) {\n arr.push({ name: \"Sheet\" + (ti + 1) });\n });\n return arr;\n }(),\n tables: function () {\n var arr = [];\n tables.forEach(function (t, ti) {\n arr.push({ body: t });\n });\n return arr;\n }()\n });\n\n var isChrome = navigator.userAgent.indexOf(\"Chrome\") > -1,\n isSafari = !isChrome && navigator.userAgent.indexOf(\"Safari\") > -1,\n isIE = /*@cc_on!@*/false || !!document.documentMode; // this works with IE10 and IE11 both :)\n\n var blob1 = void 0,\n blankWindow = void 0,\n $iframe = void 0,\n iframe = void 0,\n anchor = void 0;\n\n if (navigator.msSaveOrOpenBlob) {\n blob1 = new Blob([output], { type: \"text/html\" });\n window.navigator.msSaveOrOpenBlob(blob1, fileName);\n } else if (isSafari) {\n // 사파리는 지원이 안되므로 그냥 테이블을 클립보드에 복사처리\n //tables\n blankWindow = window.open('about:blank', this.id + '-excel-export', 'width=600,height=400');\n blankWindow.document.write(output);\n blankWindow = null;\n } else {\n if (isIE && typeof Blob === \"undefined\") {\n //otherwise use the iframe and save\n //requires a blank iframe on page called txtArea1\n $iframe = jQuery('');\n jQuery(document.body).append($iframe);\n\n iframe = window[this.id + '-excel-export'];\n iframe.document.open(\"text/html\", \"replace\");\n iframe.document.write(output);\n iframe.document.close();\n iframe.focus();\n iframe.document.execCommand(\"SaveAs\", true, fileName);\n $iframe.remove();\n } else {\n // Attempt to use an alternative method\n anchor = document.body.appendChild(document.createElement(\"a\"));\n\n // If the [download] attribute is supported, try to use it\n if (\"download\" in anchor) {\n anchor.download = fileName;\n anchor.href = URL.createObjectURL(new Blob([output], { type: 'text/csv' }));\n anchor.click();\n document.body.removeChild(anchor);\n }\n }\n }\n\n return true;\n };\n\n GRID.excel = {\n export: tableToExcel\n };\n})();\n// ax5.ui.grid.formatter\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var money = function money() {\n if (typeof this.value !== \"undefined\") {\n var val = ('' + this.value).replace(/[^0-9^\\.^\\-]/g, \"\"),\n regExpPattern = new RegExp('([0-9])([0-9][0-9][0-9][,.])'),\n arrNumber = val.split('.'),\n returnValue = void 0;\n\n arrNumber[0] += '.';\n\n do {\n arrNumber[0] = arrNumber[0].replace(regExpPattern, '$1,$2');\n } while (regExpPattern.test(arrNumber[0]));\n\n return arrNumber.length > 1 ? arrNumber[0] + U.left(arrNumber[1], 2) : arrNumber[0].split('.')[0];\n } else {\n return \"\";\n }\n };\n\n GRID.formatter = {\n money: money\n };\n})();\n// ax5.ui.grid.header\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var columnResizerEvent = {\n \"on\": function on(_columnResizer, _colIndex) {\n var self = this;\n var $columnResizer = $(_columnResizer);\n var columnResizerPositionLeft = $columnResizer.offset().left;\n var gridTargetOffsetLeft = self.$[\"container\"][\"root\"].offset().left;\n self.xvar.columnResizerIndex = _colIndex;\n var resizeRange = {\n min: -self.colGroup[_colIndex]._width + 2,\n max: self.$[\"container\"][\"root\"].width() - self.colGroup[_colIndex]._width\n };\n\n jQuery(document.body).bind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId, function (e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n\n if (resizeRange.min > self.xvar.__da) {\n self.xvar.__da = resizeRange.min;\n } else if (resizeRange.max < self.xvar.__da) {\n self.xvar.__da = resizeRange.max;\n }\n\n if (!self.xvar.columnResizerLived) {\n self.$[\"resizer\"][\"horizontal\"].addClass(\"live\");\n }\n self.xvar.columnResizerLived = true;\n self.$[\"resizer\"][\"horizontal\"].css({\n left: columnResizerPositionLeft + self.xvar.__da - gridTargetOffsetLeft\n });\n }).bind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId, function (e) {\n columnResizerEvent.off.call(self);\n U.stopEvent(e);\n }).bind(\"mouseleave.ax5grid-\" + this.instanceId, function (e) {\n columnResizerEvent.off.call(self);\n U.stopEvent(e);\n });\n\n jQuery(document.body).attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);\n },\n \"off\": function off() {\n this.$[\"resizer\"][\"horizontal\"].removeClass(\"live\");\n this.xvar.columnResizerLived = false;\n\n if (typeof this.xvar.__da === \"undefined\") {} else {\n this.setColumnWidth(this.colGroup[this.xvar.columnResizerIndex]._width + this.xvar.__da, this.xvar.columnResizerIndex);\n }\n\n jQuery(document.body).unbind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId).unbind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId).unbind(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body).removeAttr('unselectable').css('user-select', 'auto').off('selectstart');\n }\n };\n\n var init = function init() {\n // 헤더 초기화\n var self = this;\n\n this.$[\"container\"][\"header\"].on(\"click\", '[data-ax5grid-column-attr]', function (e) {\n var key = this.getAttribute(\"data-ax5grid-column-key\"),\n colIndex = this.getAttribute(\"data-ax5grid-column-colindex\"),\n\n //rowIndex = this.getAttribute(\"data-ax5grid-column-rowindex\"),\n col = self.colGroup[colIndex];\n\n if (key === \"__checkbox_header__\" && self.config.header.selector) {\n var selected = this.getAttribute(\"data-ax5grid-selected\");\n selected = U.isNothing(selected) ? true : selected !== \"true\";\n\n $(this).attr(\"data-ax5grid-selected\", selected);\n self.selectAll({ selected: selected });\n\n selected = null;\n } else {\n if (key && col && col.sortable !== false && !col.sortFixed) {\n if (col.sortable === true || self.config.sortable === true) {\n toggleSort.call(self, col.key);\n }\n }\n }\n\n GRID.body.blur.call(self);\n\n key = null;\n colIndex = null;\n col = null;\n });\n this.$[\"container\"][\"header\"].on(\"mousedown\", '[data-ax5grid-column-resizer]', function (e) {\n var colIndex = this.getAttribute(\"data-ax5grid-column-resizer\");\n\n self.xvar.mousePosition = GRID.util.getMousePosition(e);\n columnResizerEvent.on.call(self, this, Number(colIndex));\n U.stopEvent(e);\n\n colIndex = null;\n }).on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n resetFrozenColumn.call(this);\n };\n\n var resetFrozenColumn = function resetFrozenColumn() {\n var cfg = this.config,\n dividedHeaderObj = GRID.util.divideTableByFrozenColumnIndex(this.headerTable, this.xvar.frozenColumnIndex);\n\n this.asideHeaderData = function (dataTable) {\n var colGroup = [];\n var data = { rows: [] };\n for (var i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = { cols: [] };\n if (i === 0) {\n var col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n },\n _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n key: \"__index_header__\", label: \" \"\n });\n colGroup.push(_col);\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n key: \"__checkbox_header__\", label: \"\"\n });\n colGroup.push(_col);\n data.rows[i].cols.push(_col);\n }\n\n col = null;\n }\n }\n\n this.asideColGroup = colGroup;\n return data;\n }.call(this, this.headerTable);\n\n this.leftHeaderData = dividedHeaderObj.leftData;\n this.headerData = dividedHeaderObj.rightData;\n };\n\n var getFieldValue = function getFieldValue(_col) {\n return _col.key === \"__checkbox_header__\" ? this.config.header.selector ? \"
\" : \" \" : _col.label || \" \";\n };\n\n var repaint = function repaint(_reset) {\n var cfg = this.config,\n colGroup = this.colGroup;\n\n if (_reset) {\n resetFrozenColumn.call(this);\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n }\n var asideHeaderData = this.asideHeaderData,\n leftHeaderData = this.leftHeaderData,\n headerData = this.headerData,\n headerAlign = cfg.header.align;\n\n // this.asideColGroup : asideHeaderData에서 처리 함.\n this.leftHeaderColGroup = colGroup.slice(0, this.config.frozenColumnIndex);\n this.headerColGroup = colGroup.slice(this.config.frozenColumnIndex);\n\n var repaintHeader = function repaintHeader(_elTarget, _colGroup, _bodyRow) {\n var tableWidth = 0,\n SS = [];\n SS.push('');\n SS.push('');\n for (var cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n tableWidth += _colGroup[cgi]._width;\n }\n SS.push(' ');\n SS.push(' ');\n\n for (var tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n var trCSS_class = \"\";\n SS.push('');\n for (var ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n var col = _bodyRow.rows[tri].cols[ci];\n var cellHeight = cfg.header.columnHeight * col.rowspan - cfg.header.columnBorderWidth;\n var colAlign = headerAlign || col.align;\n SS.push('');\n\n SS.push(function () {\n var lineHeight = cfg.header.columnHeight - cfg.header.columnPadding * 2 - cfg.header.columnBorderWidth;\n return '';\n }(), function () {\n var _SS = \"\";\n\n if (!U.isNothing(col.key) && !U.isNothing(col.colIndex) && (cfg.sortable === true || col.sortable === true) && col.sortable !== false) {\n _SS += ' ';\n }\n return _SS;\n }(), getFieldValue.call(this, col), ' ');\n\n if (!U.isNothing(col.colIndex)) {\n if (cfg.enableFilter) {\n SS.push(' ');\n }\n }\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n SS.push('
');\n _elTarget.html(SS.join(''));\n\n /// append column-resizer\n (function () {\n var resizerHeight = cfg.header.columnHeight * _bodyRow.rows.length - cfg.header.columnBorderWidth,\n resizerLeft = 0,\n AS = [];\n\n for (var cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n var col = _colGroup[cgi];\n if (!U.isNothing(col.colIndex)) {\n //_colGroup[cgi]._width\n resizerLeft += col._width;\n AS.push('
');\n }\n }\n _elTarget.append(AS);\n }).call(this);\n\n return tableWidth;\n };\n\n if (cfg.asidePanelWidth > 0) {\n repaintHeader.call(this, this.$.panel[\"aside-header\"], this.asideColGroup, asideHeaderData);\n }\n if (cfg.frozenColumnIndex > 0) {\n repaintHeader.call(this, this.$.panel[\"left-header\"], this.leftHeaderColGroup, leftHeaderData);\n }\n\n this.xvar.scrollContentWidth = repaintHeader.call(this, this.$.panel[\"header-scroll\"], this.headerColGroup, headerData);\n\n if (cfg.rightSum) {}\n };\n\n var scrollTo = function scrollTo(css) {\n this.$.panel[\"header-scroll\"].css(css);\n return this;\n };\n\n var toggleSort = function toggleSort(_key) {\n var sortOrder = \"\",\n sortInfo = {},\n seq = 0;\n\n for (var k in this.sortInfo) {\n if (this.sortInfo[k].fixed) {\n sortInfo[k] = this.sortInfo[k];\n seq++;\n }\n }\n\n for (var i = 0, l = this.colGroup.length; i < l; i++) {\n if (this.colGroup[i].key == _key) {\n if (sortOrder == \"\") {\n if (typeof this.colGroup[i].sort === \"undefined\") {\n sortOrder = \"desc\";\n } else if (this.colGroup[i].sort === \"desc\") {\n sortOrder = \"asc\";\n } else {\n sortOrder = undefined;\n }\n }\n this.colGroup[i].sort = sortOrder;\n } else if (!this.config.multiSort) {\n this.colGroup[i].sort = undefined;\n }\n\n if (typeof this.colGroup[i].sort !== \"undefined\") {\n if (!sortInfo[this.colGroup[i].key]) {\n sortInfo[this.colGroup[i].key] = {\n seq: seq++,\n orderBy: this.colGroup[i].sort\n };\n }\n }\n }\n\n this.setColumnSort(sortInfo);\n return this;\n };\n\n var applySortStatus = function applySortStatus(_sortInfo) {\n for (var i = 0, l = this.colGroup.length; i < l; i++) {\n for (var _key in _sortInfo) {\n if (this.colGroup[i].key == _key) {\n this.colGroup[i].sort = _sortInfo[_key].orderBy;\n }\n }\n }\n return this;\n };\n\n var select = function select(_options) {\n GRID.data.select.call(this, dindex, _options && _options.selected);\n GRID.body.updateRowState.call(this, [\"selected\"], dindex);\n };\n\n var getExcelString = function getExcelString() {\n var cfg = this.config,\n colGroup = this.colGroup,\n headerData = this.headerTable,\n getHeader = function getHeader(_colGroup, _bodyRow) {\n var SS = [];\n //SS.push('');\n for (var tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (var ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n var col = _bodyRow.rows[tri].cols[ci];\n SS.push('', getFieldValue.call(this, col), ' ');\n }\n SS.push(' ');\n }\n //SS.push('
');\n\n return SS.join('');\n };\n\n return getHeader.call(this, colGroup, headerData);\n };\n\n GRID.header = {\n init: init,\n repaint: repaint,\n scrollTo: scrollTo,\n toggleSort: toggleSort,\n applySortStatus: applySortStatus,\n getExcelString: getExcelString\n };\n})();\n// ax5.ui.grid.inlineEditor\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var edit_text = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function getHtml(_root, _columnKey, _editor, _value) {\n if (typeof _editor.attributes !== \"undefined\") {\n var attributesText = \"\";\n for (var k in _editor.attributes) {\n attributesText += \" \" + k + \"='\" + _editor.attributes[k] + \"'\";\n }\n }\n return \" \";\n },\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.focus().select();\n }\n };\n\n var edit_money = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function getHtml(_root, _columnKey, _editor, _value) {\n var attributesText = \"\";\n if (typeof _editor.attributes !== \"undefined\") {\n for (var k in _editor.attributes) {\n attributesText += \" \" + k + \"='\" + _editor.attributes[k] + \"'\";\n }\n }\n return ' ';\n },\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n var $el = void 0;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.data(\"binded-ax5ui\", \"ax5formater\");\n _$el.ax5formatter($.extend(true, {\n pattern: \"money\"\n }, _editor.config));\n _$el.focus().select();\n }\n };\n\n var edit_number = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function getHtml(_root, _columnKey, _editor, _value) {\n var attributesText = \"\";\n if (typeof _editor.attributes !== \"undefined\") {\n for (var k in _editor.attributes) {\n attributesText += \" \" + k + \"='\" + _editor.attributes[k] + \"'\";\n }\n }\n return ' ';\n },\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.data(\"binded-ax5ui\", \"ax5formater\");\n _$el.ax5formatter($.extend(true, {\n pattern: \"number\"\n }, _editor.config));\n _$el.focus().select();\n }\n };\n\n var edit_date = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function getHtml(_root, _columnKey, _editor, _value) {\n return ' ';\n },\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n return $el;\n },\n bindUI: function bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n var self = _root;\n _$el.data(\"binded-ax5ui\", \"ax5picker\");\n\n _$el.ax5picker($.extend(true, {\n direction: \"auto\",\n content: {\n type: 'date',\n formatter: {\n pattern: 'date'\n }\n },\n onStateChanged: function onStateChanged() {\n if (this.state == \"open\") {\n this.self.activePicker.attr(\"data-ax5grid-inline-edit-picker\", \"date\");\n } else if (this.state == \"close\") {\n GRID.body.inlineEdit.deActive.call(self, \"RETURN\", _columnKey);\n }\n }\n }, _editor.config));\n\n _$el.focus().select();\n }\n };\n\n var edit_select = {\n useReturnToSave: false,\n editMode: \"popup\",\n getHtml: function getHtml(_root, _columnKey, _editor, _value) {\n var po = [];\n po.push('');\n po.push('
');\n\n return po.join('');\n },\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n return $el;\n },\n bindUI: function bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n var eConfig = {\n columnKeys: {\n optionValue: \"value\",\n optionText: \"text\",\n optionSelected: \"selected\"\n }\n };\n jQuery.extend(true, eConfig, _editor.config);\n\n eConfig.options.forEach(function (n) {\n if (n[eConfig.columnKeys.optionValue] == _value) n[eConfig.columnKeys.optionSelected] = true;\n });\n\n var self = _root;\n _$el.data(\"binded-ax5ui\", \"ax5select\");\n _$el.ax5select($.extend(true, {\n tabIndex: 1,\n direction: \"auto\",\n columnKeys: eConfig.columnKeys,\n options: eConfig.options,\n onStateChanged: function onStateChanged() {\n if (this.state == \"open\") {\n this.self.activeSelectOptionGroup.attr(\"data-ax5grid-inline-edit-picker\", \"select\");\n } else if (this.state == \"changeValue\") {\n GRID.body.inlineEdit.deActive.call(self, \"RETURN\", _columnKey, this.value[0][eConfig.columnKeys.optionValue]);\n } else if (this.state == \"close\") {\n GRID.body.inlineEdit.deActive.call(self, \"ESC\", _columnKey);\n }\n }\n }, _editor.config));\n _$el.ax5select(\"open\");\n _$el.ax5select(\"setValue\", _value);\n _$el.find(\"a\").focus();\n }\n };\n\n var edit_checkbox = {\n editMode: \"inline\",\n getHtml: function getHtml(_root, _editor, _value) {\n\n var lineHeight = _root.config.body.columnHeight - _root.config.body.columnPadding * 2 - _root.config.body.columnBorderWidth;\n var checked;\n if (_editor.config && _editor.config.trueValue) {\n checked = _value == _editor.config.trueValue ? \"true\" : \"false\";\n } else {\n checked = _value == false || _value == \"false\" || _value < \"1\" ? \"false\" : \"true\";\n }\n\n var eConfig = {\n marginTop: 2,\n height: lineHeight - 4\n };\n jQuery.extend(true, eConfig, _editor.config);\n eConfig.marginTop = (lineHeight - eConfig.height) / 2;\n\n return '
';\n }\n };\n\n var edit_textarea = {\n useReturnToSave: false,\n editMode: \"popup\",\n _getHtml: function _getHtml(_root, _columnKey, _editor, _value) {\n // init 에서 사용하게 될 HTML 태그를 만들어 줍니다.\n return \"
\";\n },\n _bindUI: function _bindUI(_root, _columnKey, _$el, _editor, _$parent, _value) {\n // 위치와 크기를 구합니다.\n var offset = _$el.offset();\n var box = {\n width: _$el.width()\n };\n var editorHeight = 150;\n var buttonHeight = 30;\n\n // 새로운 엘리먼트 생성\n var $newDiv = jQuery(\"\");\n var $newTextarea = $newDiv.find(\"textarea\");\n // 엘리먼트에 CSS 적용\n $newDiv.css({\n position: \"absolute\",\n left: offset.left,\n top: offset.top,\n width: box.width,\n height: editorHeight\n });\n $newDiv.find(\"textarea\");\n\n // 새로운 엘리먼트를 document.body에 append\n jQuery(document.body).append($newDiv);\n $newTextarea.focus().select();\n\n $newTextarea.on(\"blur\", function (e) {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey, this.value);\n $newDiv.remove();\n ax5.util.stopEvent(e.originalEvent);\n });\n $newTextarea.on(\"keydown\", function (e) {\n if (e.which == ax5.info.eventKeys.ESC) {\n GRID.body.inlineEdit.deActive.call(_root, \"ESC\", _columnKey);\n $newDiv.remove();\n ax5.util.stopEvent(e.originalEvent);\n }\n });\n\n /// 값 변경\n /// GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey, this.value[0][eConfig.columnKeys.optionValue]);\n /// 에디팅 취소\n /// GRID.body.inlineEdit.deActive.call(_root, \"ESC\", _columnKey);\n },\n\n init: function init(_root, _columnKey, _editor, _$parent, _value) {\n // 인라인 에디팅 활성화 시작\n /**\n * _root : gridInstance\n * _columnKey : di + \"_\" + col.colIndex + \"_\" + col.rowIndex\n * _editor : col.editor\n * _$parent : 셀\n * _value : 값\n */\n var $el = void 0;\n _$parent.append($el = jQuery(this._getHtml(_root, _columnKey, _editor, _value)));\n // 셀에 HTML 컨텐츠 추가\n\n this._bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n // 이벤트 바인딩\n\n return $el;\n }\n };\n\n GRID.inlineEditor = {\n \"text\": edit_text,\n \"money\": edit_money,\n \"number\": edit_number,\n \"date\": edit_date,\n \"select\": edit_select,\n \"checkbox\": edit_checkbox,\n \"textarea\": edit_textarea\n };\n})();\n// ax5.ui.grid.page\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var onclickPageMove = function onclickPageMove(_act) {\n var callback = function callback(_pageNo) {\n if (this.page.currentPage != _pageNo) {\n this.page.selectPage = _pageNo;\n if (this.config.page.onChange) {\n this.config.page.onChange.call({\n self: this,\n page: this.page,\n data: this.data\n });\n }\n }\n };\n var processor = {\n \"first\": function first() {\n callback.call(this, 0);\n },\n \"prev\": function prev() {\n var pageNo = this.page.currentPage - 1;\n if (pageNo < 0) pageNo = 0;\n callback.call(this, pageNo);\n },\n \"next\": function next() {\n var pageNo = this.page.currentPage + 1;\n if (pageNo > this.page.totalPages - 1) pageNo = this.page.totalPages - 1;\n callback.call(this, pageNo);\n },\n \"last\": function last() {\n callback.call(this, this.page.totalPages - 1);\n }\n };\n\n if (_act in processor) {\n processor[_act].call(this);\n } else {\n callback.call(this, _act - 1);\n }\n };\n\n var navigationUpdate = function navigationUpdate() {\n var self = this;\n if (this.page) {\n var page = {\n hasPage: false,\n currentPage: this.page.currentPage,\n pageSize: this.page.pageSize,\n totalElements: this.page.totalElements,\n totalPages: this.page.totalPages,\n firstIcon: this.config.page.firstIcon,\n prevIcon: this.config.page.prevIcon || \"«\",\n nextIcon: this.config.page.nextIcon || \"»\",\n lastIcon: this.config.page.lastIcon\n };\n var navigationItemCount = this.config.page.navigationItemCount;\n\n page[\"@paging\"] = function () {\n var returns = [],\n startI = void 0,\n endI = void 0;\n\n startI = page.currentPage - Math.floor(navigationItemCount / 2);\n if (startI < 0) startI = 0;\n endI = page.currentPage + navigationItemCount;\n if (endI > page.totalPages) endI = page.totalPages;\n\n if (endI - startI > navigationItemCount) {\n endI = startI + navigationItemCount;\n }\n\n if (endI - startI < navigationItemCount) {\n startI = endI - navigationItemCount;\n }\n if (startI < 0) startI = 0;\n\n for (var p = startI, l = endI; p < l; p++) {\n returns.push({ 'pageNo': p + 1, 'selected': page.currentPage == p });\n }\n return returns;\n }();\n\n if (page[\"@paging\"].length > 0) {\n page.hasPage = true;\n }\n\n this.$[\"page\"][\"navigation\"].html(GRID.tmpl.get(\"page_navigation\", page));\n this.$[\"page\"][\"navigation\"].find(\"[data-ax5grid-page-move]\").on(\"click\", function () {\n onclickPageMove.call(self, this.getAttribute(\"data-ax5grid-page-move\"));\n });\n } else {\n this.$[\"page\"][\"navigation\"].empty();\n }\n };\n\n var statusUpdate = function statusUpdate() {\n if (!this.config.page.statusDisplay) {\n return;\n }\n\n var toRowIndex = void 0,\n rangeCount = Math.min(this.xvar.dataRowCount, this.xvar.virtualPaintRowCount);\n var data = {};\n\n toRowIndex = this.xvar.virtualPaintStartRowIndex + rangeCount;\n\n if (toRowIndex > this.xvar.dataRowCount) {\n toRowIndex = this.xvar.dataRowCount;\n }\n\n data.fromRowIndex = U.number(this.xvar.virtualPaintStartRowIndex + 1, { \"money\": true });\n data.toRowIndex = U.number(toRowIndex, { \"money\": true });\n data.totalElements = false;\n data.dataRealRowCount = this.xvar.dataRowCount !== this.xvar.dataRealRowCount ? U.number(this.xvar.dataRealRowCount, { \"money\": true }) : false;\n data.dataRowCount = U.number(this.xvar.dataRowCount, { \"money\": true });\n data.progress = this.appendProgress ? this.config.appendProgressIcon : \"\";\n\n if (this.page) {\n data.fromRowIndex_page = U.number(this.xvar.virtualPaintStartRowIndex + this.page.currentPage * this.page.pageSize + 1, { \"money\": true });\n data.toRowIndex_page = U.number(this.xvar.virtualPaintStartRowIndex + rangeCount + this.page.currentPage * this.page.pageSize, { \"money\": true });\n data.totalElements = U.number(this.page.totalElements, { \"money\": true });\n\n if (data.toRowIndex_page > this.page.totalElements) {\n data.toRowIndex_page = this.page.totalElements;\n }\n }\n\n this.$[\"page\"][\"status\"].html(GRID.tmpl.get(\"page_status\", data));\n };\n\n GRID.page = {\n navigationUpdate: navigationUpdate,\n statusUpdate: statusUpdate\n };\n})();\n// ax5.ui.grid.scroller\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n var convertScrollPosition = {\n \"vertical\": function vertical(css, _var) {\n var _content_height = _var._content_height - _var._panel_height,\n _scroller_height = _var._vertical_scroller_height - _var.verticalScrollBarHeight,\n top = _content_height * css.top / _scroller_height;\n\n if (top < 0) top = 0;else if (_content_height < top) {\n top = _content_height;\n }\n return {\n top: -top\n };\n },\n \"horizontal\": function horizontal(css, _var) {\n var _content_width = _var._content_width - _var._panel_width,\n _scroller_width = _var._horizontal_scroller_width - _var.horizontalScrollBarWidth,\n left = _content_width * css.left / _scroller_width;\n\n if (left < 0) left = 0;else if (_content_width < left) {\n left = _content_width;\n }\n return {\n left: -left\n };\n }\n };\n\n var convertScrollBarPosition = {\n \"vertical\": function vertical(_top, _var) {\n\n var self = this,\n type = \"vertical\",\n _content_height = _var._content_height - _var._panel_height,\n _scroller_height = _var._vertical_scroller_height - _var.verticalScrollBarHeight,\n top = _scroller_height * _top / _content_height,\n scrollPositon = void 0;\n\n if (-top > _scroller_height) {\n top = -_scroller_height;\n\n scrollPositon = convertScrollPosition[type].call(this, { top: -top }, {\n _content_width: _var._content_width,\n _content_height: _var._content_height,\n _panel_width: _var._panel_width,\n _panel_height: _var._panel_height,\n _horizontal_scroller_width: _var._horizontal_scroller_width,\n _vertical_scroller_height: _var._vertical_scroller_height,\n verticalScrollBarHeight: _var.verticalScrollBarHeight,\n horizontalScrollBarWidth: _var.horizontalScrollBarWidth\n });\n\n GRID.body.scrollTo.call(self, scrollPositon);\n }\n\n return -top;\n },\n \"horizontal\": function horizontal(_left, _var) {\n var self = this,\n type = \"horizontal\",\n _content_width = _var._content_width - _var._panel_width,\n _scroller_width = _var._horizontal_scroller_width - _var.horizontalScrollBarWidth,\n left = _scroller_width * _left / _content_width,\n scrollPositon = void 0;\n\n if (-left > _scroller_width) {\n left = -_scroller_width;\n scrollPositon = convertScrollPosition[type].call(this, { left: -left }, {\n _content_width: _var._content_width,\n _content_height: _var._content_height,\n _panel_width: _var._panel_width,\n _panel_height: _var._panel_height,\n _horizontal_scroller_width: _var._horizontal_scroller_width,\n _vertical_scroller_height: _var._vertical_scroller_height,\n verticalScrollBarHeight: _var.verticalScrollBarHeight,\n horizontalScrollBarWidth: _var.horizontalScrollBarWidth\n });\n\n GRID.header.scrollTo.call(self, scrollPositon);\n GRID.body.scrollTo.call(self, scrollPositon);\n }\n\n return -left;\n }\n };\n\n var scrollBarMover = {\n \"click\": function click(track, bar, type, e) {\n\n // 마우스 무브 완료 타임과 클릭타임 차이가 20 보다 작으면 클릭이벤트 막기.\n if (new Date().getTime() - GRID.scroller.moveout_timer < 20) {\n return false;\n }\n\n var self = this,\n trackOffset = track.offset(),\n barBox = {\n width: bar.outerWidth(), height: bar.outerHeight()\n },\n trackBox = {\n width: track.innerWidth(), height: track.innerHeight()\n },\n _vertical_scroller_height = self.$[\"scroller\"][\"vertical\"].innerHeight(),\n _panel_height = self.$[\"panel\"][\"body\"].height(),\n _horizontal_scroller_width = self.$[\"scroller\"][\"horizontal\"].innerWidth(),\n _panel_width = self.$[\"panel\"][\"body\"].width(),\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n verticalScrollBarHeight = self.$[\"scroller\"][\"vertical-bar\"].outerHeight(),\n horizontalScrollBarWidth = self.$[\"scroller\"][\"horizontal-bar\"].outerWidth(),\n getScrollerPosition = {\n \"vertical\": function vertical(e) {\n var mouseObj = GRID.util.getMousePosition(e);\n // track을 벗어 나지 안도록 범위 체크\n var newTop = mouseObj.clientY - trackOffset.top;\n if (newTop < 0) {\n newTop = 0;\n } else if (newTop + barBox.height > trackBox.height) {\n newTop = trackBox.height - barBox.height;\n }\n return { top: newTop };\n },\n \"horizontal\": function horizontal(e) {\n var mouseObj = GRID.util.getMousePosition(e);\n // track을 벗어 나지 안도록 범위 체크\n var newLeft = mouseObj.clientX - trackOffset.left;\n if (newLeft < 0) {\n newLeft = 0;\n } else if (newLeft + barBox.width > trackBox.width) {\n newLeft = trackBox.width - barBox.width;\n }\n return { left: newLeft };\n }\n },\n css = getScrollerPosition[type](e);\n\n bar.css(css);\n\n var scrollPositon = convertScrollPosition[type].call(self, css, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n });\n if (type === \"horizontal\") GRID.header.scrollTo.call(self, scrollPositon);\n GRID.body.scrollTo.call(self, scrollPositon);\n\n scrollPositon = null;\n },\n \"on\": function on(track, bar, type, e) {\n var self = this,\n barOffset = bar.position(),\n barBox = {\n width: bar.outerWidth(), height: bar.outerHeight()\n },\n trackBox = {\n width: track.innerWidth(), height: track.innerHeight()\n },\n _vertical_scroller_height = self.$[\"scroller\"][\"vertical\"].innerHeight(),\n _panel_height = self.$[\"panel\"][\"body\"].height(),\n _horizontal_scroller_width = self.$[\"scroller\"][\"horizontal\"].innerWidth(),\n _panel_width = self.$[\"panel\"][\"body\"].width(),\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n verticalScrollBarHeight = self.$[\"scroller\"][\"vertical-bar\"].outerHeight(),\n horizontalScrollBarWidth = self.$[\"scroller\"][\"horizontal-bar\"].outerWidth(),\n getScrollerPosition = {\n \"vertical\": function vertical(e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientY - self.xvar.mousePosition.clientY;\n // track을 벗어 나지 안도록 범위 체크\n var newTop = barOffset.top + self.xvar.__da;\n if (newTop < 0) {\n newTop = 0;\n } else if (newTop + barBox.height > trackBox.height) {\n newTop = trackBox.height - barBox.height;\n }\n return { top: newTop };\n },\n \"horizontal\": function horizontal(e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n // track을 벗어 나지 안도록 범위 체크\n var newLeft = barOffset.left + self.xvar.__da;\n if (newLeft < 0) {\n newLeft = 0;\n } else if (newLeft + barBox.width > trackBox.width) {\n newLeft = trackBox.width - barBox.width;\n }\n return { left: newLeft };\n }\n };\n\n self.xvar.__da = 0; // 이동량 변수 초기화 (계산이 잘못 될까바)\n\n jQuery(document.body).bind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId, function (e) {\n var css = getScrollerPosition[type](e);\n bar.css(css);\n\n var scrollPositon = convertScrollPosition[type].call(self, css, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n });\n\n if (type === \"horizontal\") GRID.header.scrollTo.call(self, scrollPositon);\n\n GRID.body.scrollTo.call(self, scrollPositon);\n }).bind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId, function (e) {\n scrollBarMover.off.call(self, e);\n }).bind(\"mouseleave.ax5grid-\" + this.instanceId, function (e) {\n scrollBarMover.off.call(self, e);\n });\n\n jQuery(document.body).attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);\n },\n \"off\": function off(e) {\n ax5.util.stopEvent(e.originalEvent);\n GRID.scroller.moveout_timer = new Date().getTime();\n\n jQuery(document.body).unbind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId).unbind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId).unbind(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body).removeAttr('unselectable').css('user-select', 'auto').off('selectstart');\n }\n };\n\n var scrollContentMover = {\n \"wheel\": function wheel(delta) {\n var self = this,\n _body_scroll_position = self.$[\"panel\"][\"body-scroll\"].position(),\n _panel_height = self.xvar.body_panel_height,\n _panel_width = self.xvar.body_panel_width,\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth;\n\n if (isNaN(_content_height) || isNaN(_content_width)) {\n return false;\n }\n\n var newLeft = void 0,\n newTop = void 0,\n _top_is_end = false,\n _left_is_end = false;\n\n newLeft = _body_scroll_position.left - delta.x;\n newTop = _body_scroll_position.top - delta.y;\n\n // newTop이 범위를 넘었는지 체크\n if (newTop >= 0) {\n newTop = 0;\n _top_is_end = true;\n } else if (newTop <= _panel_height - _content_height) {\n newTop = _panel_height - _content_height;\n if (newTop >= 0) newTop = 0;\n _top_is_end = true;\n } else {\n if (delta.y == 0) _top_is_end = true;\n }\n\n // newLeft이 범위를 넘었는지 체크\n if (newLeft >= 0) {\n newLeft = 0;\n _left_is_end = true;\n } else if (newLeft <= _panel_width - _content_width) {\n newLeft = _panel_width - _content_width;\n if (newLeft >= 0) newLeft = 0;\n _left_is_end = true;\n } else {\n if (delta.x == 0) _left_is_end = true;\n }\n\n GRID.header.scrollTo.call(self, { left: newLeft });\n GRID.body.scrollTo.call(self, { left: newLeft, top: newTop }, {\n callback: function callback() {\n resize.call(self);\n }\n });\n\n return !_top_is_end || !_left_is_end;\n },\n \"on\": function on() {\n var self = this,\n _body_scroll_position = self.$[\"panel\"][\"body-scroll\"].position(),\n _panel_height = self.xvar.body_panel_height,\n _panel_width = self.xvar.body_panel_width,\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n getContentPosition = function getContentPosition(e) {\n var mouseObj = GRID.util.getMousePosition(e),\n newLeft = void 0,\n newTop = void 0;\n\n self.xvar.__x_da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n self.xvar.__y_da = mouseObj.clientY - self.xvar.mousePosition.clientY;\n\n newLeft = _body_scroll_position.left + self.xvar.__x_da;\n newTop = _body_scroll_position.top + self.xvar.__y_da;\n\n // newTop이 범위를 넘었는지 체크\n if (newTop >= 0) {\n newTop = 0;\n } else if (newTop <= _panel_height - _content_height) {\n newTop = _panel_height - _content_height;\n if (newTop >= 0) newTop = 0;\n }\n\n // newLeft이 범위를 넘었는지 체크\n if (newLeft >= 0) {\n newLeft = 0;\n } else if (newLeft <= _panel_width - _content_width) {\n newLeft = _panel_width - _content_width;\n if (newLeft >= 0) newLeft = 0;\n }\n\n return {\n left: newLeft, top: newTop\n };\n };\n\n this.xvar.__x_da = 0; // 이동량 변수 초기화\n this.xvar.__y_da = 0; // 계산이 잘못 될까바\n this.xvar.touchmoved = false;\n\n jQuery(document.body).on(\"touchmove\" + \".ax5grid-\" + this.instanceId, function (e) {\n var css = getContentPosition(e);\n\n resize.call(self);\n GRID.header.scrollTo.call(self, { left: css.left });\n GRID.body.scrollTo.call(self, css, { noRepaint: \"noRepaint\" });\n U.stopEvent(e.originalEvent);\n self.xvar.touchmoved = true;\n }).on(\"touchend\" + \".ax5grid-\" + this.instanceId, function (e) {\n if (self.xvar.touchmoved) {\n var css = getContentPosition(e);\n\n resize.call(self);\n GRID.header.scrollTo.call(self, { left: css.left });\n GRID.body.scrollTo.call(self, css);\n U.stopEvent(e.originalEvent);\n scrollContentMover.off.call(self);\n }\n });\n\n jQuery(document.body).attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);\n },\n \"off\": function off() {\n\n jQuery(document.body).off(\"touchmove\" + \".ax5grid-\" + this.instanceId).off(\"touchend\" + \".ax5grid-\" + this.instanceId);\n\n jQuery(document.body).removeAttr('unselectable').css('user-select', 'auto').off('selectstart');\n }\n };\n\n var init = function init() {\n var self = this,\n margin = this.config.scroller.trackPadding;\n\n if (margin == 0) {\n this.$[\"scroller\"][\"vertical-bar\"].css({ width: this.config.scroller.size, left: -1 });\n this.$[\"scroller\"][\"horizontal-bar\"].css({ height: this.config.scroller.size, top: -1 });\n } else {\n this.$[\"scroller\"][\"vertical-bar\"].css({ width: this.config.scroller.size - (margin + 1), left: margin / 2 });\n this.$[\"scroller\"][\"horizontal-bar\"].css({ height: this.config.scroller.size - (margin + 1), top: margin / 2 });\n }\n\n this.$[\"scroller\"][\"vertical-bar\"].on(GRID.util.ENM[\"mousedown\"], function (e) {\n this.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollBarMover.on.call(this, this.$[\"scroller\"][\"vertical\"], this.$[\"scroller\"][\"vertical-bar\"], \"vertical\", e);\n }.bind(this)).on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n this.$[\"scroller\"][\"vertical\"].on(\"click\", function (e) {\n if (e.target.getAttribute(\"data-ax5grid-scroller\") == \"vertical\") {\n scrollBarMover.click.call(this, this.$[\"scroller\"][\"vertical\"], this.$[\"scroller\"][\"vertical-bar\"], \"vertical\", e);\n }\n }.bind(this));\n\n this.$[\"scroller\"][\"horizontal-bar\"].on(GRID.util.ENM[\"mousedown\"], function (e) {\n this.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollBarMover.on.call(this, this.$[\"scroller\"][\"horizontal\"], this.$[\"scroller\"][\"horizontal-bar\"], \"horizontal\", e);\n }.bind(this)).on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n this.$[\"scroller\"][\"horizontal\"].on(\"click\", function (e) {\n if (e.target.getAttribute(\"data-ax5grid-scroller\") == \"horizontal\") {\n scrollBarMover.click.call(this, this.$[\"scroller\"][\"horizontal\"], this.$[\"scroller\"][\"horizontal-bar\"], \"horizontal\", e);\n }\n }.bind(this));\n\n this.$[\"container\"][\"body\"].on('mousewheel DOMMouseScroll', function (e) {\n var E = e.originalEvent,\n delta = { x: 0, y: 0 };\n\n if (E.detail) {\n delta.y = E.detail * 10;\n } else {\n if (typeof E.deltaY === \"undefined\") {\n delta.y = -E.wheelDelta;\n delta.x = 0;\n } else {\n delta.y = E.deltaY;\n delta.x = E.deltaX;\n }\n }\n\n if (scrollContentMover.wheel.call(this, delta)) {\n U.stopEvent(e);\n }\n }.bind(this));\n\n if (ax5.info.supportTouch) {\n this.$[\"container\"][\"body\"].on(\"touchstart\", '[data-ax5grid-panel]', function (e) {\n self.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollContentMover.on.call(self);\n });\n }\n\n this.xvar.body_panel_height = this.$[\"panel\"][\"body\"].height();\n this.xvar.body_panel_width = this.$[\"panel\"][\"body\"].width();\n };\n\n var resize = function resize() {\n var _vertical_scroller_height = this.$[\"scroller\"][\"vertical\"].height(),\n _horizontal_scroller_width = this.$[\"scroller\"][\"horizontal\"].width(),\n _panel_height = this.$[\"panel\"][\"body\"].height(),\n _panel_width = this.$[\"panel\"][\"body\"].width(),\n _content_height = this.xvar.scrollContentHeight,\n _content_width = this.xvar.scrollContentWidth,\n verticalScrollBarHeight = _panel_height * _vertical_scroller_height / _content_height,\n horizontalScrollBarWidth = _panel_width * _horizontal_scroller_width / _content_width;\n\n if (verticalScrollBarHeight < this.config.scroller.barMinSize) verticalScrollBarHeight = this.config.scroller.barMinSize;\n if (horizontalScrollBarWidth < this.config.scroller.barMinSize) horizontalScrollBarWidth = this.config.scroller.barMinSize;\n\n this.$[\"scroller\"][\"vertical-bar\"].css({\n top: convertScrollBarPosition.vertical.call(this, this.$.panel[\"body-scroll\"].position().top, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n }),\n height: verticalScrollBarHeight\n });\n\n this.$[\"scroller\"][\"horizontal-bar\"].css({\n left: convertScrollBarPosition.horizontal.call(this, this.$.panel[\"body-scroll\"].position().left, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n }),\n width: horizontalScrollBarWidth\n });\n\n this.xvar.body_panel_height = _panel_height;\n this.xvar.body_panel_width = _panel_width;\n\n _vertical_scroller_height = null;\n _horizontal_scroller_width = null;\n _panel_height = null;\n _panel_width = null;\n _content_height = null;\n _content_width = null;\n verticalScrollBarHeight = null;\n horizontalScrollBarWidth = null;\n };\n\n GRID.scroller = {\n // 타이머\n moveout_timer: new Date().getTime(),\n init: init,\n resize: resize\n };\n})();\n// ax5.ui.grid.tmpl\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var main = function main() {\n return \"\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\";\n };\n\n var page_navigation = function page_navigation() {\n return \"\\n {{#hasPage}}\\n
\\n {{#firstIcon}}{{{firstIcon}}} {{/firstIcon}}\\n {{{prevIcon}}} \\n
\\n
\\n {{#@paging}}\\n {{pageNo}} \\n {{/@paging}}\\n
\\n
\\n {{{nextIcon}}} \\n {{#lastIcon}}{{{lastIcon}}} {{/lastIcon}}\\n
\\n {{/hasPage}}\\n
\";\n };\n\n var page_status = function page_status() {\n return \"{{{progress}}} {{fromRowIndex}} - {{toRowIndex}} of {{dataRowCount}} {{#totalElements}} Total {{.}}{{/totalElements}} \";\n };\n\n GRID.tmpl = {\n \"main\": main,\n \"page_navigation\": page_navigation,\n \"page_status\": page_status,\n\n get: function get(tmplName, data, columnKeys) {\n var template = GRID.tmpl[tmplName].call(this, columnKeys);\n ax5.mustache.parse(template);\n return ax5.mustache.render(template, data);\n }\n };\n})();\n// ax5.ui.grid.util\n(function () {\n\n var GRID = ax5.ui.grid;\n\n var U = ax5.util;\n\n /**\n * @method ax5grid.util.divideTableByFrozenColumnIndex\n * @param _table\n * @param _frozenColumnIndex\n * @returns {{leftHeaderData: {rows: Array}, headerData: {rows: Array}}}\n */\n var divideTableByFrozenColumnIndex = function divideTableByFrozenColumnIndex(_table, _frozenColumnIndex) {\n\n var tempTable_l = { rows: [] },\n tempTable_r = { rows: [] };\n\n for (var r = 0, rl = _table.rows.length; r < rl; r++) {\n var row = _table.rows[r];\n\n tempTable_l.rows[r] = { cols: [] };\n tempTable_r.rows[r] = { cols: [] };\n\n for (var c = 0, cl = row.cols.length; c < cl; c++) {\n var col = jQuery.extend({}, row.cols[c]),\n colStartIndex = col.colIndex,\n colEndIndex = col.colIndex + col.colspan;\n\n if (colStartIndex < _frozenColumnIndex) {\n if (colEndIndex <= _frozenColumnIndex) {\n // 좌측편에 변형없이 추가\n tempTable_l.rows[r].cols.push(col);\n } else {\n var leftCol = jQuery.extend({}, col),\n rightCol = jQuery.extend({}, leftCol);\n\n leftCol.colspan = _frozenColumnIndex - leftCol.colIndex;\n rightCol.colIndex = _frozenColumnIndex;\n rightCol.colspan = col.colspan - leftCol.colspan;\n\n tempTable_l.rows[r].cols.push(leftCol);\n if (rightCol.colspan) {\n tempTable_r.rows[r].cols.push(rightCol);\n }\n }\n } else {\n // 오른편\n tempTable_r.rows[r].cols.push(col);\n }\n\n col = null;\n colStartIndex = null;\n colEndIndex = null;\n }\n\n row = null;\n }\n\n return {\n leftData: tempTable_l,\n rightData: tempTable_r\n };\n };\n\n var getTableByStartEndColumnIndex = function getTableByStartEndColumnIndex(_table, _startColumnIndex, _endColumnIndex) {\n\n var tempTable = { rows: [] };\n for (var r = 0, rl = _table.rows.length; r < rl; r++) {\n var row = _table.rows[r];\n\n tempTable.rows[r] = { cols: [] };\n for (var c = 0, cl = row.cols.length; c < cl; c++) {\n var col = jQuery.extend({}, row.cols[c]),\n colStartIndex = col.colIndex,\n colEndIndex = col.colIndex + col.colspan;\n\n if (_startColumnIndex <= colStartIndex || colEndIndex <= _endColumnIndex) {\n if (_startColumnIndex <= colStartIndex && colEndIndex <= _endColumnIndex) {\n // 변형없이 추가\n tempTable.rows[r].cols.push(col);\n } else if (_startColumnIndex > colStartIndex && colEndIndex > _startColumnIndex) {\n // 앞에서 걸친경우\n col.colspan = colEndIndex - _startColumnIndex;\n tempTable.rows[r].cols.push(col);\n } else if (colEndIndex > _endColumnIndex && colStartIndex <= _endColumnIndex) {\n tempTable.rows[r].cols.push(col);\n }\n }\n }\n }\n\n return tempTable;\n };\n\n var getMousePosition = function getMousePosition(e) {\n var mouseObj = void 0,\n originalEvent = e.originalEvent ? e.originalEvent : e;\n\n mouseObj = 'changedTouches' in originalEvent && originalEvent.changedTouches ? originalEvent.changedTouches[0] : originalEvent;\n // clientX, Y 쓰면 스크롤에서 문제 발생\n return {\n clientX: mouseObj.pageX,\n clientY: mouseObj.pageY\n };\n };\n\n var ENM = {\n \"mousedown\": ax5.info.supportTouch ? \"touchstart\" : \"mousedown\",\n \"mousemove\": ax5.info.supportTouch ? \"touchmove\" : \"mousemove\",\n \"mouseup\": ax5.info.supportTouch ? \"touchend\" : \"mouseup\"\n };\n\n var makeHeaderTable = function makeHeaderTable(_columns) {\n var columns = _columns,\n cfg = this.config,\n table = {\n rows: []\n },\n colIndex = 0,\n maekRows = function maekRows(_columns, depth, parentField) {\n var row = { cols: [] };\n var i = 0,\n l = _columns.length;\n var colspan = 1;\n\n for (; i < l; i++) {\n var field = jQuery.extend({}, _columns[i]);\n colspan = 1;\n\n if (!field.hidden) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n }();\n\n row.cols.push(field); // 복제된 필드 삽입\n\n if ('columns' in field) {\n colspan = maekRows(field.columns, depth + 1, field);\n } else {\n field.width = 'width' in field ? field.width : cfg.columnMinWidth;\n }\n field.colspan = colspan;\n } else {}\n }\n\n if (row.cols.length > 0) {\n if (!table.rows[depth]) {\n table.rows[depth] = { cols: [] };\n }\n table.rows[depth].cols = table.rows[depth].cols.concat(row.cols);\n return row.cols.length - 1 + colspan;\n } else {\n return colspan;\n }\n };\n\n maekRows(columns, 0);\n\n // set rowspan\n for (var r = 0, rl = table.rows.length; r < rl; r++) {\n for (var c = 0, cl = table.rows[r].cols.length; c < cl; c++) {\n if (!('columns' in table.rows[r].cols[c])) {\n table.rows[r].cols[c].rowspan = rl - r;\n }\n }\n }\n\n return table;\n };\n\n var makeBodyRowTable = function makeBodyRowTable(_columns) {\n var columns = _columns,\n table = {\n rows: []\n },\n colIndex = 0,\n maekRows = function maekRows(_columns, depth, parentField) {\n var row = { cols: [] },\n i = 0,\n l = _columns.length,\n colspan = 1;\n\n var selfMakeRow = function selfMakeRow(__columns) {\n var i = 0,\n l = __columns.length;\n for (; i < l; i++) {\n var field = jQuery.extend({}, __columns[i]),\n _colspan = 1;\n\n if (!field.hidden) {\n\n if ('key' in field) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n }();\n\n row.cols.push(field);\n if ('columns' in field) {\n _colspan = maekRows(field.columns, depth + 1, field);\n }\n field.colspan = _colspan;\n } else {\n if ('columns' in field) {\n selfMakeRow(field.columns, depth);\n }\n }\n } else {}\n }\n };\n\n for (; i < l; i++) {\n var field = jQuery.extend({}, _columns[i]);\n colspan = 1;\n\n if (!field.hidden) {\n\n if ('key' in field) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n }();\n\n row.cols.push(field);\n if ('columns' in field) {\n colspan = maekRows(field.columns, depth + 1, field);\n }\n field.colspan = colspan;\n } else {\n if ('columns' in field) {\n selfMakeRow(field.columns, depth);\n }\n }\n } else {}\n\n field = null;\n }\n\n if (row.cols.length > 0) {\n if (!table.rows[depth]) {\n table.rows[depth] = { cols: [] };\n }\n table.rows[depth].cols = table.rows[depth].cols.concat(row.cols);\n return row.cols.length - 1 + colspan;\n } else {\n return colspan;\n }\n };\n\n maekRows(columns, 0);\n\n (function (table) {\n // set rowspan\n for (var r = 0, rl = table.rows.length; r < rl; r++) {\n var row = table.rows[r];\n for (var c = 0, cl = row.cols.length; c < cl; c++) {\n var col = row.cols[c];\n if (!('columns' in col)) {\n col.rowspan = rl - r;\n }\n col = null;\n }\n row = null;\n }\n })(table);\n\n return table;\n };\n\n var makeBodyRowMap = function makeBodyRowMap(_table) {\n var map = {};\n _table.rows.forEach(function (row) {\n row.cols.forEach(function (col) {\n map[col.rowIndex + \"_\" + col.colIndex] = jQuery.extend({}, col);\n });\n });\n return map;\n };\n\n var makeFootSumTable = function makeFootSumTable(_footSumColumns) {\n var table = {\n rows: []\n };\n\n for (var r = 0, rl = _footSumColumns.length; r < rl; r++) {\n var footSumRow = _footSumColumns[r],\n addC = 0;\n\n table.rows[r] = { cols: [] };\n\n for (var c = 0, cl = footSumRow.length; c < cl; c++) {\n if (addC > this.colGroup.length) break;\n var colspan = footSumRow[c].colspan || 1;\n if (footSumRow[c].label || footSumRow[c].key) {\n table.rows[r].cols.push({\n colspan: colspan,\n rowspan: 1,\n colIndex: addC,\n columnAttr: \"sum\",\n align: footSumRow[c].align,\n label: footSumRow[c].label,\n key: footSumRow[c].key,\n collector: footSumRow[c].collector,\n formatter: footSumRow[c].formatter\n });\n } else {\n table.rows[r].cols.push({\n colIndex: addC,\n colspan: colspan,\n rowspan: 1,\n label: \" \"\n });\n }\n addC += colspan;\n colspan = null;\n }\n\n if (addC < this.colGroup.length) {\n for (var _c = addC; _c < this.colGroup.length; _c++) {\n table.rows[r].cols.push({\n colIndex: _c,\n colspan: 1,\n rowspan: 1,\n label: \" \"\n });\n }\n }\n footSumRow = null;\n addC = null;\n }\n\n return table;\n };\n\n var makeBodyGroupingTable = function makeBodyGroupingTable(_bodyGroupingColumns) {\n var table = {\n rows: []\n },\n r = 0,\n addC = 0;\n\n table.rows[r] = { cols: [] };\n for (var _c2 = 0, cl = _bodyGroupingColumns.length; _c2 < cl; _c2++) {\n if (addC > this.columns.length) break;\n var colspan = _bodyGroupingColumns[_c2].colspan || 1;\n if (_bodyGroupingColumns[_c2].label || _bodyGroupingColumns[_c2].key) {\n table.rows[r].cols.push({\n colspan: colspan,\n rowspan: 1,\n rowIndex: 0,\n colIndex: addC,\n columnAttr: \"default\",\n align: _bodyGroupingColumns[_c2].align,\n label: _bodyGroupingColumns[_c2].label,\n key: _bodyGroupingColumns[_c2].key,\n collector: _bodyGroupingColumns[_c2].collector,\n formatter: _bodyGroupingColumns[_c2].formatter\n });\n } else {\n table.rows[r].cols.push({\n rowIndex: 0,\n colIndex: addC,\n colspan: colspan,\n rowspan: 1,\n label: \" \"\n });\n }\n addC += colspan;\n }\n\n if (addC < this.colGroup.length) {\n for (var c = addC; c < this.colGroup.length; c++) {\n table.rows[r].cols.push({\n rowIndex: 0,\n colIndex: c,\n colspan: 1,\n rowspan: 1,\n label: \" \"\n });\n }\n }\n\n return table;\n };\n\n var findPanelByColumnIndex = function findPanelByColumnIndex(_dindex, _colIndex, _rowIndex) {\n var _containerPanelName = void 0,\n _isScrollPanel = false,\n _panels = [];\n\n if (this.xvar.frozenRowIndex > _dindex) _panels.push(\"top\");\n if (this.xvar.frozenColumnIndex > _colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n\n if (this.xvar.frozenColumnIndex <= _colIndex || this.xvar.frozenRowIndex <= _dindex) {\n _containerPanelName = _panels.join(\"-\");\n _panels.push(\"scroll\");\n _isScrollPanel = true;\n }\n\n return {\n panelName: _panels.join(\"-\"),\n containerPanelName: _containerPanelName,\n isScrollPanel: _isScrollPanel\n };\n };\n\n var getRealPathForDataItem = function getRealPathForDataItem(_dataPath) {\n var path = [],\n _path = [].concat(_dataPath.split(/[\\.\\[\\]]/g));\n\n _path.forEach(function (n) {\n if (n !== \"\") path.push(\"[\\\"\" + n.replace(/['\\\"]/g, \"\") + \"\\\"]\");\n });\n _path = null;\n return path.join(\"\");\n };\n\n GRID.util = {\n divideTableByFrozenColumnIndex: divideTableByFrozenColumnIndex,\n getTableByStartEndColumnIndex: getTableByStartEndColumnIndex,\n getMousePosition: getMousePosition,\n ENM: ENM,\n makeHeaderTable: makeHeaderTable,\n makeBodyRowTable: makeBodyRowTable,\n makeBodyRowMap: makeBodyRowMap,\n makeFootSumTable: makeFootSumTable,\n makeBodyGroupingTable: makeBodyGroupingTable,\n findPanelByColumnIndex: findPanelByColumnIndex,\n getRealPathForDataItem: getRealPathForDataItem\n };\n})();","/*\n * Copyright (c) 2016. tom@axisj.com\n * - github.com/thomasjang\n * - www.axisj.com\n */\n\n// ax5.ui.grid\n(function () {\n\n const UI = ax5.ui;\n const U = ax5.util;\n let GRID;\n\n UI.addClass({\n className: \"grid\"\n }, (function () {\n /**\n * @class ax5grid\n * @classdesc\n * @author tom@axisj.com\n * @example\n * ```\n * var myGrid = new ax5.ui.grid();\n * ```\n */\n return function () {\n let self = this,\n cfg,\n ctrlKeys = {\n \"33\": \"KEY_PAGEUP\",\n \"34\": \"KEY_PAGEDOWN\",\n \"35\": \"KEY_END\",\n \"36\": \"KEY_HOME\",\n \"37\": \"KEY_LEFT\",\n \"38\": \"KEY_UP\",\n \"39\": \"KEY_RIGHT\",\n \"40\": \"KEY_DOWN\"\n };\n\n this.instanceId = ax5.getGuid();\n this.config = {\n theme: 'default',\n animateTime: 250,\n debounceTime: 250,\n appendDebouncer: null,\n appendDebounceTimes: 0,\n appendProgressIcon: '...',\n appendProgress: false,\n\n // 틀고정 속성\n frozenColumnIndex: 0,\n frozenRowIndex: 0,\n showLineNumber: false,\n showRowSelector: false,\n multipleSelect: true,\n virtualScrollY: true,\n virtualScrollX: true,\n headerSelect: true,\n\n // 스크롤될 때 body 페인팅 딜레이를 주어 성능이 좋은 않은 브라우저에서 반응을 빠르게 할 때 사용하는 옵션들\n virtualScrollYCountMargin: 0,\n virtualScrollAccelerated: true,\n virtualScrollAcceleratedDelayTime: 10,\n\n height: 0,\n columnMinWidth: 100,\n lineNumberColumnWidth: 30,\n rowSelectorColumnWidth: 26,\n sortable: undefined,\n remoteSort: false,\n\n header: {\n display: true,\n align: false,\n columnHeight: 26,\n columnPadding: 3,\n columnBorderWidth: 1,\n selector: true\n },\n body: {\n align: false,\n columnHeight: 26,\n columnPadding: 3,\n columnBorderWidth: 1,\n grouping: false,\n mergeCells: false\n },\n rightSum: false,\n footSum: false,\n page: {\n height: 25,\n display: true,\n statusDisplay: true,\n navigationItemCount: 5\n },\n scroller: {\n size: 15,\n barMinSize: 15,\n trackPadding: 4\n },\n columnKeys: {\n selected: '__selected__',\n modified: '__modified__',\n deleted: '__deleted__',\n disableSelection: '__disable_selection__'\n },\n tree: {\n use: false,\n hashDigit: 8,\n indentWidth: 10,\n arrowWidth: 15,\n iconWidth: 18,\n icons: {\n openedArrow: '▾',\n collapsedArrow: '▸',\n groupIcon: '⊚',\n collapsedGroupIcon: '⊚',\n itemIcon: '⊙'\n },\n columnKeys: {\n parentKey: \"pid\",\n selfKey: \"id\",\n collapse: \"collapse\",\n hidden: \"hidden\",\n parentHash: \"__hp__\",\n selfHash: \"__hs__\",\n children: \"__children__\",\n depth: \"__depth__\",\n }\n }\n };\n this.xvar = {\n bodyTrHeight: 0, // 한줄의 높이\n scrollContentWidth: 0, // 스크롤 될 내용물의 너비 (스크롤 될 내용물 : panel['body-scroll'] 안에 컬럼이 있는)\n scrollContentHeight: 0, // 스크롤 된 내용물의 높이\n scrollTimer: null\n };\n\n // 그리드 데이터셋\n this.columns = []; // config.columns에서 복제된 오브젝트\n this.colGroup = []; // columns를 table태그로 출력하기 좋게 변환한 오브젝트\n this.footSumColumns = [];\n this.bodyGrouping = {};\n\n this.list = []; // 그리드의 데이터\n this.proxyList = null; // 그리드 데이터의 대리자\n this.page = null; // 그리드의 페이지 정보\n this.selectedDataIndexs = [];\n this.deletedList = [];\n this.sortInfo = {}; // 그리드의 헤더 정렬 정보\n this.focusedColumn = {}; // 그리드 바디의 포커스된 셀 정보\n this.selectedColumn = {}; // 그리드 바디의 선택된 셀 정보\n this.isInlineEditing = false;\n this.inlineEditing = {};\n this.listIndexMap = {}; // tree데이터 사용시 데이터 인덱싱 맵\n this.contextMenu = null; // contentMenu 의 인스턴스\n\n // header\n this.headerTable = {};\n this.leftHeaderData = {};\n this.headerData = {};\n this.rightHeaderData = {};\n\n // body\n this.bodyRowTable = {};\n this.leftBodyRowData = {};\n this.bodyRowData = {};\n this.rightBodyRowData = {};\n this.bodyRowMap = {};\n\n this.bodyGroupingTable = {};\n this.leftBodyGroupingData = {};\n this.bodyGroupingData = {};\n this.rightBodyGroupingData = {};\n this.bodyGroupingMap = {};\n\n // footSum\n this.footSumTable = {}; // footSum의 출력레이아웃\n this.leftFootSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 왼쪽\n this.footSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 오른쪽\n this.needToPaintSum = true; // 데이터 셋이 변경되어 summary 변경 필요여부\n\n cfg = this.config;\n\n const initGrid = function () {\n // 그리드 템플릿에 전달하고자 하는 데이터를 정리합시다.\n\n let data = {\n instanceId: this.id\n };\n\n this.$target.html(GRID.tmpl.get(\"main\", data));\n\n // 그리드 패널 프레임의 각 엘리먼트를 캐쉬합시다.\n this.$ = {\n \"container\": {\n \"hidden\": this.$target.find('[data-ax5grid-container=\"hidden\"]'),\n \"root\": this.$target.find('[data-ax5grid-container=\"root\"]'),\n \"header\": this.$target.find('[data-ax5grid-container=\"header\"]'),\n \"body\": this.$target.find('[data-ax5grid-container=\"body\"]'),\n \"page\": this.$target.find('[data-ax5grid-container=\"page\"]'),\n \"scroller\": this.$target.find('[data-ax5grid-container=\"scroller\"]')\n },\n \"panel\": {\n \"aside-header\": this.$target.find('[data-ax5grid-panel=\"aside-header\"]'),\n \"left-header\": this.$target.find('[data-ax5grid-panel=\"left-header\"]'),\n \"header\": this.$target.find('[data-ax5grid-panel=\"header\"]'),\n \"header-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"header\"]'),\n \"right-header\": this.$target.find('[data-ax5grid-panel=\"right-header\"]'),\n \"top-aside-body\": this.$target.find('[data-ax5grid-panel=\"top-aside-body\"]'),\n \"top-left-body\": this.$target.find('[data-ax5grid-panel=\"top-left-body\"]'),\n \"top-body\": this.$target.find('[data-ax5grid-panel=\"top-body\"]'),\n \"top-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"top-body\"]'),\n \"top-right-body\": this.$target.find('[data-ax5grid-panel=\"top-right-body\"]'),\n \"aside-body\": this.$target.find('[data-ax5grid-panel=\"aside-body\"]'),\n \"aside-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"aside-body\"]'),\n \"left-body\": this.$target.find('[data-ax5grid-panel=\"left-body\"]'),\n \"left-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"left-body\"]'),\n \"body\": this.$target.find('[data-ax5grid-panel=\"body\"]'),\n \"body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"body\"]'),\n \"right-body\": this.$target.find('[data-ax5grid-panel=\"right-body\"]'),\n \"right-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"right-body\"]'),\n \"bottom-aside-body\": this.$target.find('[data-ax5grid-panel=\"bottom-aside-body\"]'),\n \"bottom-left-body\": this.$target.find('[data-ax5grid-panel=\"bottom-left-body\"]'),\n \"bottom-body\": this.$target.find('[data-ax5grid-panel=\"bottom-body\"]'),\n \"bottom-body-scroll\": this.$target.find('[data-ax5grid-panel-scroll=\"bottom-body\"]'),\n \"bottom-right-body\": this.$target.find('[data-ax5grid-panel=\"bottom-right-body\"]')\n },\n \"livePanelKeys\": [], // 현재 사용중인 패널들 (grid-body repaint에서 수집하여 처리)\n \"scroller\": {\n \"vertical\": this.$target.find('[data-ax5grid-scroller=\"vertical\"]'),\n \"vertical-bar\": this.$target.find('[data-ax5grid-scroller=\"vertical-bar\"]'),\n \"horizontal\": this.$target.find('[data-ax5grid-scroller=\"horizontal\"]'),\n \"horizontal-bar\": this.$target.find('[data-ax5grid-scroller=\"horizontal-bar\"]'),\n \"corner\": this.$target.find('[data-ax5grid-scroller=\"corner\"]')\n },\n \"page\": {\n \"navigation\": this.$target.find('[data-ax5grid-page=\"navigation\"]'),\n \"status\": this.$target.find('[data-ax5grid-page=\"status\"]')\n },\n \"form\": {\n \"clipboard\": this.$target.find('[data-ax5grid-form=\"clipboard\"]')\n },\n \"resizer\": {\n \"vertical\": this.$target.find('[data-ax5grid-resizer=\"vertical\"]'),\n \"horizontal\": this.$target.find('[data-ax5grid-resizer=\"horizontal\"]')\n }\n };\n\n this.$[\"container\"][\"root\"].css({height: this.config.height || this.config._height});\n\n return this;\n };\n const initColumns = function (_columns) {\n if(!U.isArray(_columns)) _columns = [];\n this.columns = U.deepCopy(_columns);\n\n this.headerTable = GRID.util.makeHeaderTable.call(this, this.columns);\n this.xvar.frozenColumnIndex = cfg.frozenColumnIndex || 0;\n\n this.bodyRowTable = GRID.util.makeBodyRowTable.call(this, this.columns);\n this.bodyRowMap = GRID.util.makeBodyRowMap.call(this, this.bodyRowTable);\n // 바디에 표현될 한줄의 높이를 계산합니다.\n this.xvar.bodyTrHeight = this.bodyRowTable.rows.length * this.config.body.columnHeight;\n\n let colGroupMap = {};\n for (let r = 0, rl = this.headerTable.rows.length; r < rl; r++) {\n let row = this.headerTable.rows[r];\n for (let c = 0, cl = row.cols.length; c < cl; c++) {\n colGroupMap[row.cols[c].colIndex] = jQuery.extend({}, row.cols[c]);\n }\n }\n\n this.colGroup = [];\n for (var k in colGroupMap) {\n this.colGroup.push(colGroupMap[k]);\n }\n\n return this;\n };\n const onResetColumns = function () {\n initColumns.call(this, this.config.columns);\n resetColGroupWidth.call(this);\n if (this.config.footSum) {\n initFootSum.call(this, this.config.footSum);\n this.needToPaintSum = true;\n }\n if (this.config.body.grouping) initBodyGroup.call(this, this.config.body.grouping);\n alignGrid.call(this, true);\n GRID.header.repaint.call(this, true);\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n };\n const resetColGroupWidth = function () {\n /// !! 그리드 target의 크기가 변경되면 이 함수를 호출하려 this.colGroup의 _width 값을 재 계산 하여야 함. [tom]\n let CT_WIDTH = this.$[\"container\"][\"root\"].width() - (function () {\n let width = 0;\n if (cfg.showLineNumber) width += cfg.lineNumberColumnWidth;\n if (cfg.showRowSelector) width += cfg.rowSelectorColumnWidth;\n width += cfg.scroller.size;\n return width;\n })(),\n totalWidth = 0, computedWidth, autoWidthColgroupIndexs = [],\n colGroup = this.colGroup,\n i, l;\n\n for (i = 0, l = colGroup.length; i < l; i++) {\n if (U.isNumber(colGroup[i].width)) {\n totalWidth += colGroup[i]._width = colGroup[i].width;\n } else if (colGroup[i].width === \"*\") {\n autoWidthColgroupIndexs.push(i);\n } else if (U.right(colGroup[i].width, 1) === \"%\") {\n totalWidth += colGroup[i]._width = CT_WIDTH * U.left(colGroup[i].width, \"%\") / 100;\n }\n }\n if (autoWidthColgroupIndexs.length > 0) {\n computedWidth = (CT_WIDTH - totalWidth) / autoWidthColgroupIndexs.length;\n for (i = 0, l = autoWidthColgroupIndexs.length; i < l; i++) {\n colGroup[autoWidthColgroupIndexs[i]]._width = computedWidth;\n }\n }\n };\n const initFootSum = function (_footSum) {\n if (U.isArray(_footSum)) {\n this.footSumTable = GRID.util.makeFootSumTable.call(this, this.footSumColumns = _footSum);\n } else {\n this.footSumColumns = [];\n this.footSumTable = {};\n }\n };\n const initBodyGroup = function (_grouping) {\n let grouping = jQuery.extend({}, _grouping);\n if (\"by\" in grouping && \"columns\" in grouping) {\n this.bodyGrouping = {\n by: grouping.by,\n columns: grouping.columns\n };\n this.bodyGroupingTable = GRID.util.makeBodyGroupingTable.call(this, this.bodyGrouping.columns);\n this.sortInfo = (function () {\n let sortInfo = {};\n for (let k = 0, kl = this.bodyGrouping.by.length; k < kl; k++) {\n sortInfo[this.bodyGrouping.by[k]] = {\n orderBy: \"asc\",\n seq: k,\n fixed: true\n };\n for (let c = 0, cl = this.colGroup.length; c < cl; c++) {\n if (this.colGroup[c].key === this.bodyGrouping.by[k]) {\n this.colGroup[c].sort = \"asc\";\n this.colGroup[c].sortFixed = true;\n }\n }\n }\n return sortInfo;\n }).call(this);\n } else {\n cfg.body.grouping = false;\n }\n };\n const alignGrid = function (_isFirst) {\n let list = (this.proxyList) ? this.proxyList : this.list;\n // 대상이 크기가 컬럼의 최소 크기 보다 작업 금지\n if (Math.min(this.$target.innerWidth(), this.$target.innerHeight()) < 5) {\n return false;\n }\n\n if (!this.config.height) {\n this.$[\"container\"][\"root\"].css({height: this.config._height = this.$target.height()});\n }\n\n let CT_WIDTH = this.$[\"container\"][\"root\"].width(),\n CT_HEIGHT = this.$[\"container\"][\"root\"].height(),\n CT_INNER_WIDTH = CT_WIDTH,\n CT_INNER_HEIGHT = CT_HEIGHT,\n asidePanelWidth = cfg.asidePanelWidth = (function () {\n let width = 0;\n if (cfg.showLineNumber) width += cfg.lineNumberColumnWidth;\n if (cfg.showRowSelector) width += cfg.rowSelectorColumnWidth;\n return width;\n })(),\n frozenPanelWidth = cfg.frozenPanelWidth = (function (colGroup, endIndex) {\n let width = 0;\n for (let i = 0, l = endIndex; i < l; i++) {\n width += colGroup[i]._width;\n }\n return width;\n })(this.colGroup, cfg.frozenColumnIndex),\n verticalScrollerWidth, horizontalScrollerHeight, bodyHeight;\n\n // todo : 우측 함계컬럼 너비 계산\n let rightPanelWidth = 0,\n frozenRowHeight = (function (bodyTrHeight) {\n return cfg.frozenRowIndex * bodyTrHeight;\n })(this.xvar.bodyTrHeight),\n footSumHeight = (function (bodyTrHeight) {\n return this.footSumColumns.length * bodyTrHeight;\n }).call(this, this.xvar.bodyTrHeight),\n headerHeight = (cfg.header.display) ? this.headerTable.rows.length * cfg.header.columnHeight : 0,\n pageHeight = (cfg.page.display) ? cfg.page.height : 0;\n\n (function () {\n verticalScrollerWidth = ((CT_HEIGHT - headerHeight - pageHeight - footSumHeight) < list.length * this.xvar.bodyTrHeight) ? this.config.scroller.size : 0;\n // 남은 너비가 colGroup의 너비보다 넓을때. 수평 스크롤 활성화.\n horizontalScrollerHeight = (function () {\n let totalColGroupWidth = 0;\n // aside 빼고 너비\n // 수직 스크롤이 있으면 또 빼고 비교\n let bodyWidth = CT_WIDTH - asidePanelWidth - verticalScrollerWidth;\n for (let i = 0, l = this.colGroup.length; i < l; i++) {\n totalColGroupWidth += this.colGroup[i]._width;\n }\n return (totalColGroupWidth > bodyWidth) ? this.config.scroller.size : 0;\n }).call(this);\n\n if (horizontalScrollerHeight > 0) {\n verticalScrollerWidth = ((CT_HEIGHT - headerHeight - pageHeight - footSumHeight - horizontalScrollerHeight) < list.length * this.xvar.bodyTrHeight) ? this.config.scroller.size : 0;\n }\n }).call(this);\n\n // 수평 너비 결정\n CT_INNER_WIDTH = CT_WIDTH - verticalScrollerWidth;\n // 수직 스크롤러의 높이 결정.\n CT_INNER_HEIGHT = CT_HEIGHT - pageHeight - horizontalScrollerHeight;\n\n bodyHeight = CT_INNER_HEIGHT - headerHeight;\n\n let panelDisplayProcess = function (panel, vPosition, hPosition, containerType) {\n let css = {},\n isHide = false;\n\n switch (hPosition) {\n case \"aside\":\n if (asidePanelWidth === 0) {\n isHide = true;\n } else {\n css[\"left\"] = 0;\n css[\"width\"] = asidePanelWidth;\n }\n break;\n case \"left\":\n if (cfg.frozenColumnIndex === 0) {\n isHide = true;\n } else {\n css[\"left\"] = asidePanelWidth;\n css[\"width\"] = frozenPanelWidth;\n }\n break;\n case \"right\":\n if (!cfg.rightSum) {\n isHide = true;\n } else {\n\n }\n break;\n default:\n if (containerType !== \"page\") {\n if (cfg.frozenColumnIndex === 0) {\n css[\"left\"] = asidePanelWidth;\n } else {\n css[\"left\"] = frozenPanelWidth + asidePanelWidth;\n }\n css[\"width\"] = CT_INNER_WIDTH - asidePanelWidth - frozenPanelWidth - rightPanelWidth;\n }\n break;\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n if (containerType === \"body\") {\n switch (vPosition) {\n case \"top\":\n if (cfg.frozenRowIndex == 0) {\n isHide = true;\n } else {\n css[\"top\"] = 0;\n css[\"height\"] = frozenRowHeight;\n }\n break;\n case \"bottom\":\n if (!cfg.footSum) {\n isHide = true;\n } else {\n css[\"top\"] = bodyHeight - footSumHeight;\n css[\"height\"] = footSumHeight; // footSum height\n }\n break;\n default:\n css[\"top\"] = frozenRowHeight;\n css[\"height\"] = bodyHeight - frozenRowHeight - footSumHeight;\n\n break;\n }\n } else if (containerType === \"header\") {\n css[\"height\"] = headerHeight;\n } else if (containerType === \"page\") {\n if (pageHeight == 0) {\n isHide = true;\n } else {\n css[\"height\"] = pageHeight;\n\n }\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n panel.show().css(css);\n return this;\n };\n let scrollerDisplayProcess = function (panel, scrollerWidth, scrollerHeight, containerType) {\n let css = {},\n isHide = false;\n\n switch (containerType) {\n case \"vertical\":\n if (scrollerWidth > 0) {\n css[\"width\"] = scrollerWidth;\n css[\"height\"] = CT_INNER_HEIGHT;\n css[\"bottom\"] = scrollerHeight + pageHeight;\n } else {\n isHide = true;\n }\n break;\n case \"horizontal\":\n if (scrollerHeight > 0) {\n css[\"width\"] = CT_INNER_WIDTH;\n css[\"height\"] = scrollerHeight;\n css[\"right\"] = scrollerWidth;\n css[\"bottom\"] = pageHeight;\n } else {\n isHide = true;\n }\n break;\n case \"corner\":\n if (scrollerWidth > 0 && scrollerHeight > 0) {\n css[\"width\"] = scrollerWidth;\n css[\"height\"] = scrollerHeight;\n css[\"bottom\"] = pageHeight;\n } else {\n isHide = true;\n }\n break;\n }\n\n if (isHide) {\n panel.hide();\n // 프로세스 중지\n return this;\n }\n\n panel.show().css(css);\n };\n\n this.$[\"container\"][\"header\"].css({height: headerHeight});\n this.$[\"container\"][\"body\"].css({height: bodyHeight});\n\n // 각 패널들의 크기 표시여부를 결정합니다\n panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-header\"], \"\", \"aside\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"left-header\"], \"\", \"left\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"header\"], \"\", \"\", \"header\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"right-header\"], \"\", \"right\", \"header\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-aside-body\"], \"top\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-left-body\"], \"top\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-body\"], \"top\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"top-right-body\"], \"top\", \"right\", \"body\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-body\"], \"\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"left-body\"], \"\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"body\"], \"\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"right-body\"], \"\", \"right\", \"body\");\n\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-aside-body\"], \"bottom\", \"aside\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-left-body\"], \"bottom\", \"left\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-body\"], \"bottom\", \"\", \"body\");\n panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-right-body\"], \"bottom\", \"right\", \"body\");\n\n\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"vertical\"], verticalScrollerWidth, horizontalScrollerHeight, \"vertical\");\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"horizontal\"], verticalScrollerWidth, horizontalScrollerHeight, \"horizontal\");\n scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"corner\"], verticalScrollerWidth, horizontalScrollerHeight, \"corner\");\n\n panelDisplayProcess.call(this, this.$[\"container\"][\"page\"], \"\", \"\", \"page\");\n\n // 각 패널의 사이즈 결정\n /// 다른 패널의 사이즈 정보가 필요한 경우 여기서 정의해주고 사용함.\n this.xvar.bodyHeight = this.$.panel[\"body\"].height();\n this.xvar.bodyWidth = this.$.panel[\"body\"].width();\n // scrollContentWidth 는 grid-header repaint에서 결정합니다. 까먹지 맙시다. > this.xvar.scrollContentWidth\n\n return true;\n };\n const sortColumns = function (_sortInfo) {\n GRID.header.repaint.call(this);\n\n if (U.isFunction(this.config.remoteSort)) {\n let that = {sortInfo: []};\n for (let k in _sortInfo) {\n that.sortInfo.push({\n key: k,\n orderBy: _sortInfo[k].orderBy,\n seq: _sortInfo[k].seq\n });\n }\n that.sortInfo.sort(function (a, b) {\n return a.seq > b.seq;\n });\n this.config.remoteSort.call(that, that);\n } else {\n if (this.config.body.grouping) {\n this.list = GRID.data.initData.call(this,\n GRID.data.sort.call(this,\n _sortInfo,\n GRID.data.clearGroupingData.call(this,\n this.list\n )\n )\n );\n }\n else {\n this.list = GRID.data.sort.call(this, _sortInfo,\n GRID.data.clearGroupingData.call(this,\n this.list\n ),\n {resetLineNumber: true}\n );\n }\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n }\n };\n /// private end\n\n /**\n /**\n * Preferences of grid UI\n * @method ax5grid.setConfig\n * @param {Object} _config - 클래스 속성값\n * @param {Element} _config.target\n * @param {Number} [_config.frozenColumnIndex=0]\n * @param {Number} [_config.frozenRowIndex=0]\n * @param {Boolean} [_config.showLineNumber=false]\n * @param {Boolean} [_config.showRowSelector=false]\n * @param {Boolean} [_config.multipleSelect=true]\n * @param {Number} [_config.columnMinWidth=100]\n * @param {Number} [_config.lineNumberColumnWidth=30]\n * @param {Number} [_config.rowSelectorColumnWidth=25]\n * @param {Boolean} [_config.sortable=false]\n * @param {Boolean} [_config.multiSort=false]\n * @param {Function} [_config.remoteSort=false]\n * @param {Boolean} [_config.virtualScrollY=true] - 세로축 가상스크롤 처리여부\n * @param {Boolean} [_config.virtualScrollX=true] - 가로축 가상스크롤 처리여부\n * @param {Object} [_config.header]\n * @param {Object} [_config.header.selector=true] - 헤더 checkbox 표시여부\n * @param {String} [_config.header.align]\n * @param {Number} [_config.header.columnHeight=25]\n * @param {Number} [_config.header.columnPadding=3]\n * @param {Number} [_config.header.columnBorderWidth=1]\n * @param {Object} [_config.body]\n * @param {Function} [_config.body.onClick]\n * @param {Function} [_config.body.onDBLClick]\n * @param {Function} [_config.body.onDataChanged]\n * @param {String|Array} [_config.body.mergeCells=false] -\n * @param {String} [_config.body.align]\n * @param {Number} [_config.body.columnHeight=25]\n * @param {Number} [_config.body.columnPadding=3]\n * @param {Number} [_config.body.columnBorderWidth=1]\n * @param {Object} [_config.body.grouping]\n * @param {Array} [_config.body.grouping.by] - list grouping keys\n * @param {Array} [_config.body.grouping.columns] - list grouping columns\n * @param {(String|Function)} [_config.body.trStyleClass]\n *\n * @param {Object} [_config.page]\n * @param {Number} [_config.page.height=25]\n * @param {Boolean} [_config.page.display=true] - grid page display\n * @param {Boolean} [_config.page.statusDisplay=true] - grid status display\n * @param {Number} [_config.page.navigationItemCount=5]\n * @param {Object} [_config.scroller]\n * @param {Number} [_config.scroller.size=15]\n * @param {Number} [_config.scroller.barMinSize=15]\n * @param {Number} [_config.scroller.trackPadding=4]\n * @param {Object} [_config.columnKeys]\n * @param {String} [_config.columnKeys.selected=\"_SELECTED\"]\n * @param {Object[]} _config.columns\n * @param {String} _config.columns[].key\n * @param {String} _config.columns[].label\n * @param {Number} _config.columns[].width\n * @param {(String|Function)} _config.columns[].styleClass\n * @param {(String|Function)} _config.columns[].headerStyleClass\n * @param {Boolean} _config.columns[].enableFilter\n * @param {Boolean} _config.columns[].sortable\n * @param {String} _config.columns[].align\n * @param {(String|Function)} _config.columns[].formatter\n * @param {Object} _config.columns[].editor\n * @param {String} _config.columns[].editor.type - text,number,money,date\n * @param {Object} _config.columns[].editor.config\n * @param {Array} _config.columns[].editor.updateWith\n * @param {Function} _config.columns[].editor.disabled - disable editor\n * @param {Boolean} [_config.columns[].multiLine=false]\n * @param {Object} [_config.tree]\n * @param {Boolean} [_config.tree.use=false] - Whether tree-type data is used\n * @param {Number} [_config.tree.hashDigit=8]\n * @param {Number} [_config.tree.indentWidth=10]\n * @param {Number} [_config.tree.arrowWidth=15]\n * @param {Number} [_config.tree.iconWidth=18]\n * @param {Object} [_config.tree.icons]\n * @param {String} [_config.tree.icons.openedArrow='▾']\n * @param {String} [_config.tree.icons.collapsedArrow='▸']\n * @param {String} [_config.tree.icons.groupIcon='⊚']\n * @param {String} [_config.tree.icons.collapsedGroupIcon='⊚']\n * @param {String} [_config.tree.icons.itemIcon='⊙']\n * @param {Object} [_config.tree.columnKeys]\n * @param {String} [_config.tree.columnKeys.parentKey=\"pid\"]\n * @param {String} [_config.tree.columnKeys.selfKey=\"id\"]\n * @param {String} [_config.tree.columnKeys.collapse=\"collapse\"]\n * @param {String} [_config.tree.columnKeys.hidden=\"hidden\"]\n * @param {String} [_config.tree.columnKeys.parentHash=\"__hp__\"]\n * @param {String} [_config.tree.columnKeys.selfHash=\"__hs__\"]\n * @param {String} [_config.tree.columnKeys.children=\"__children__\"]\n * @param {String} [_config.tree.columnKeys.depth=\"__depth__\"]\n * @returns {ax5grid}\n * @example\n * ```js\n * var firstGrid = new ax5.ui.grid();\n *\n * ax5.ui.grid.formatter[\"myType\"] = function () {\n * return \"myType\" + (this.value || \"\");\n * };\n * ax5.ui.grid.formatter[\"capital\"] = function(){\n * return (''+this.value).toUpperCase();\n * };\n *\n * ax5.ui.grid.collector[\"myType\"] = function () {\n * return \"myType\" + (this.value || \"\");\n * };\n *\n * var sampleData = [\n * {a: \"A\", b: \"A01\", price: 1000, amount: 12, cost: 12000, saleDt: \"2016-08-29\", customer: \"장기영\", saleType: \"A\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"B01\", price: 1100, amount: 11, cost: 12100, saleDt: \"2016-08-28\", customer: \"장서우\", saleType: \"B\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"C01\", price: 1200, amount: 10, cost: 12000, saleDt: \"2016-08-27\", customer: \"이영희\", saleType: \"A\"},\n * {companyJson: {\"대표자명\":\"위세라\"}, a: \"A\", b: \"A01\", price: 1300, amount: 8, cost: 10400, saleDt: \"2016-08-25\", customer: \"황인서\", saleType: \"C\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"B01\", price: 1400, amount: 5, cost: 7000, saleDt: \"2016-08-29\", customer: \"황세진\", saleType: \"D\"},\n * {companyJson: {\"대표자명\":\"abcd\"}, a: \"A\", b: \"A01\", price: 1500, amount: 2, cost: 3000, saleDt: \"2016-08-26\", customer: \"이서연\", saleType: \"A\"}\n * ];\n *\n * var gridView = {\n * initView: function () {\n * firstGrid.setConfig({\n * target: $('[data-ax5grid=\"first-grid\"]'),\n * columns: [\n * {\n * key: \"companyJson['대표자명']\",\n * label: \"필드A\",\n * width: 80,\n * styleClass: function () {\n * return \"ABC\";\n * },\n * enableFilter: true,\n * align: \"center\",\n * editor: {type:\"text\"}\n * },\n * {key: \"b\", label: \"필드B\", align: \"center\"},\n * {\n * key: undefined, label: \"필드C\", columns: [\n * {key: \"price\", label: \"단가\", formatter: \"money\", align: \"right\"},\n * {key: \"amount\", label: \"수량\", formatter: \"money\", align: \"right\"},\n * {key: \"cost\", label: \"금액\", align: \"right\", formatter: \"money\"}\n * ]\n * },\n * {key: \"saleDt\", label: \"판매일자\", align: \"center\"},\n * {key: \"customer\", label: \"고객명\"},\n * {key: \"saleType\", label: \"판매타입\"}\n * ]\n * });\n * return this;\n * },\n * setData: function (_pageNo) {\n * firstGrid.setData(sampleData);\n * return this;\n * }\n * };\n *\n * // onClick, onDBLClick, onDataChanged\n * firstGrid.setConfig({\n * target: $('[data-ax5grid=\"first-grid\"]'),\n * columns: [...],\n * body: {\n * onClick: function(){\n * console.log(this);\n * },\n * onDBLClick: function(){\n * console.log(this);\n * // If the column does not have an editor attribute, an event is raised.\n * },\n * onDataChanged: function(){\n * console.log(this);\n * // If change Data\n * }\n * }\n * });\n * ```\n */\n this.init = function (_config) {\n cfg = jQuery.extend(true, {}, cfg, _config);\n if (!cfg.target) {\n console.log(ax5.info.getError(\"ax5grid\", \"401\", \"init\"));\n return this;\n }\n\n // 그리드의 이벤트 정의 구간\n this.onStateChanged = cfg.onStateChanged;\n this.onClick = cfg.onClick;\n //this.onDblClick = cfg.onDblClick;\n this.onLoad = cfg.onLoad;\n this.onDataChanged = cfg.body.onDataChanged;\n // todo event에 대한 추가 정의 필요\n\n this.$target = jQuery(cfg.target);\n\n // target attribute data\n (function (data) {\n if (U.isObject(data) && !data.error) {\n cfg = jQuery.extend(true, cfg, data);\n }\n }).call(this, U.parseJson(this.$target.attr(\"data-ax5grid-config\"), true));\n\n let grid = this.config = cfg;\n\n if (!this.config.height) {\n this.config._height = this.$target.height();\n }\n\n if (!this.id) this.id = this.$target.data(\"data-ax5grid-id\");\n if (!this.id) {\n //this.id = 'ax5grid-' + ax5.getGuid();\n this.id = 'ax5grid-' + this.instanceId;\n this.$target.data(\"data-ax5grid-id\", grid.id);\n }\n\n\n GRID.data.init.call(this);\n\n if (this.config.tree.use) { // 트리라면\n this.sortInfo = {};\n this.sortInfo[this.config.tree.columnKeys.selfHash] = {orderBy: \"asc\", seq: 0, fixed: true};\n }\n\n ///========\n // 그리드를 그리기 위한 가장 기초적인 작업 뼈대와 틀을 준비합니다. 이 메소드는 초기화 시 한번만 호출 되게 됩니다.\n initGrid.call(this);\n\n // columns데이터를 분석하여 미리 처리해야하는 데이터를 정리합니다.\n initColumns.call(this, grid.columns);\n resetColGroupWidth.call(this);\n\n // footSum 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n if (grid.footSum) initFootSum.call(this, grid.footSum);\n\n // bodyGrouping 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n if (grid.body.grouping) initBodyGroup.call(this, grid.body.grouping);\n\n // 그리드의 각 요소의 크기를 맞춤니다.\n alignGrid.call(this, true);\n\n // columns의 데이터로 header데이터를 만들고\n GRID.header.init.call(this);\n // header를 출력합니다.\n GRID.header.repaint.call(this);\n\n // columns의 데이터로 body데이터를 만들고\n GRID.body.init.call(this);\n // body를 출력합니다.\n GRID.body.repaint.call(this);\n\n // scroller\n GRID.scroller.init.call(this);\n GRID.scroller.resize.call(this);\n\n jQuery(window).bind(\"resize.ax5grid-\" + this.id, function () {\n alignGrid.call(self);\n GRID.scroller.resize.call(self);\n GRID.body.repaint.call(self); // window resize시 repaint 함수 호출\n });\n\n jQuery(document.body).on(\"click.ax5grid-\" + this.id, (function (e) {\n let isPickerClick = false,\n target = U.findParentNode(e.target, function (_target) {\n if (isPickerClick = _target.getAttribute(\"data-ax5grid-inline-edit-picker\")) {\n return true;\n }\n return _target.getAttribute(\"data-ax5grid-container\") === \"root\";\n });\n\n if (target && target.getAttribute(\"data-ax5grid-instance\") === this.id) {\n self.focused = true;\n } else {\n self.focused = false;\n GRID.body.blur.call(this);\n }\n }).bind(this));\n\n jQuery(window).on(\"keydown.ax5grid-\" + this.instanceId, function (e) {\n if (self.focused) {\n if (self.isInlineEditing) {\n\n if (e.which == ax5.info.eventKeys.ESC) {\n self.keyDown(\"ESC\", e.originalEvent);\n }\n else if (e.which == ax5.info.eventKeys.RETURN) {\n self.keyDown(\"RETURN\", e.originalEvent);\n }\n else if (e.which == ax5.info.eventKeys.TAB) {\n self.keyDown(\"TAB\", e.originalEvent);\n U.stopEvent(e);\n }\n else if (e.which == ax5.info.eventKeys.UP) {\n self.keyDown(\"RETURN\", {shiftKey: true});\n }\n else if (e.which == ax5.info.eventKeys.DOWN) {\n self.keyDown(\"RETURN\", {});\n }\n\n }\n else {\n\n if (e.metaKey || e.ctrlKey) {\n if (e.which == 67) { // c\n self.copySelect();\n }\n } else {\n if (ctrlKeys[e.which]) {\n self.keyDown(ctrlKeys[e.which], e.originalEvent); // 키다운 이벤트 호출\n U.stopEvent(e);\n } else if (e.which == ax5.info.eventKeys.ESC) {\n if (self.focused) {\n GRID.body.blur.call(self);\n }\n } else if (e.which == ax5.info.eventKeys.RETURN || e.which == ax5.info.eventKeys.SPACE) {\n self.keyDown(\"RETURN\", e.originalEvent);\n } else if (e.which == ax5.info.eventKeys.TAB) {\n //self.keyDown(\"RETURN\", e.originalEvent);\n U.stopEvent(e);\n } else if (Object.keys(self.focusedColumn).length) {\n /*\n self.keyDown(\"INLINE_EDIT\", e.originalEvent);\n */\n }\n }\n }\n }\n });\n\n jQuery(window).on(\"keyup.ax5grid-\" + this.instanceId, function (e) {\n if (self.focused) {\n if (self.isInlineEditing) {\n\n }\n else {\n if (e.metaKey || e.ctrlKey) {\n\n } else {\n if (ctrlKeys[e.which]) {\n\n } else if (e.which == ax5.info.eventKeys.ESC) {\n\n } else if (e.which == ax5.info.eventKeys.RETURN || e.which == ax5.info.eventKeys.SPACE) {\n\n } else if (e.which == ax5.info.eventKeys.TAB) {\n\n } else if (Object.keys(self.focusedColumn).length) {\n self.keyDown(\"INLINE_EDIT\", e.originalEvent);\n }\n }\n }\n }\n });\n\n // 그리드 레이아웃이 모든 준비를 마친시점에 onLoad존재 여부를 확인하고 호출하여 줍니다.\n setTimeout((function () {\n if (this.onLoad) {\n this.onLoad.call({\n self: this\n });\n }\n }).bind(this));\n return this;\n };\n\n /**\n * align grid size\n * @method ax5grid.align\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.repaint();\n * ```\n */\n this.align = function () {\n if (alignGrid.call(this)) {\n GRID.body.repaint.call(this);\n GRID.scroller.resize.call(this);\n }\n return this;\n };\n\n /**\n * repaint grid\n * @method ax5grid.repaint\n * @return {ax5grid}\n * @example\n * ```js\n * ax5Grid.repaint();\n * ```\n */\n this.repaint = function () {\n GRID.header.repaint.call(this);\n GRID.body.repaint.call(this, true); // 강제로 다시 그리기\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.keyDown\n * @param {String} _keyName\n * @param {Event|Object} _data\n * @return {ax5grid}\n */\n this.keyDown = (function () {\n let processor = {\n \"KEY_UP\": function () {\n GRID.body.moveFocus.call(this, \"UP\");\n },\n \"KEY_DOWN\": function () {\n GRID.body.moveFocus.call(this, \"DOWN\");\n },\n \"KEY_LEFT\": function () {\n GRID.body.moveFocus.call(this, \"LEFT\");\n },\n \"KEY_RIGHT\": function () {\n GRID.body.moveFocus.call(this, \"RIGHT\");\n },\n \"KEY_HOME\": function () {\n GRID.body.moveFocus.call(this, \"HOME\");\n },\n \"KEY_END\": function () {\n GRID.body.moveFocus.call(this, \"END\");\n },\n \"INLINE_EDIT\": function (_e) {\n GRID.body.inlineEdit.active.call(this, this.focusedColumn, _e);\n if (!/[0-9a-zA-Z]/.test(_e.key)) {\n U.stopEvent(_e);\n }\n },\n \"ESC\": function (_e) {\n GRID.body.inlineEdit.keydown.call(this, \"ESC\");\n },\n \"RETURN\": function (_e) {\n var activeEditLength = 0;\n for (var columnKey in this.inlineEditing) {\n activeEditLength++;\n\n if(!GRID.body.inlineEdit.keydown.call(this, \"RETURN\", columnKey)){\n return false;\n U.stopEvent(_e);\n }\n // next focus\n if (activeEditLength == 1) {\n if (GRID.body.moveFocus.call(this, (_e.shiftKey) ? \"UP\" : \"DOWN\")) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\");\n }\n }\n }\n if (activeEditLength == 0) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\");\n U.stopEvent(_e);\n } else {\n\n }\n },\n \"TAB\": function (_e) {\n\n var activeEditLength = 0;\n for (var columnKey in this.inlineEditing) {\n activeEditLength++;\n\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\", columnKey, {moveFocus: true});\n // next focus\n if (activeEditLength == 1) {\n if (GRID.body.moveFocus.call(this, (_e.shiftKey) ? \"LEFT\" : \"RIGHT\")) {\n GRID.body.inlineEdit.keydown.call(this, \"RETURN\", undefined, {moveFocus: true});\n }\n }\n }\n }\n };\n return function (_act, _data) {\n if (_act in processor) processor[_act].call(this, _data);\n return this;\n }\n })();\n\n /**\n * @method ax5grid.copySelect\n * @returns {Boolean} copysuccess\n */\n this.copySelect = function () {\n let copysuccess,\n $clipBoard = this.$[\"form\"][\"clipboard\"],\n copyTextArray = [], copyText = \"\",\n _rowIndex, _colIndex, _dindex, _di = 0;\n\n for (let c in this.selectedColumn) {\n let _column = this.selectedColumn[c];\n\n if (_column) {\n if (typeof _dindex === \"undefined\") {\n _dindex = _column.dindex;\n _rowIndex = _column.rowIndex;\n _colIndex = _column.rowIndex;\n }\n\n if (_dindex != _column.dindex || _rowIndex != _column.rowIndex) {\n _di++;\n }\n\n if (!copyTextArray[_di]) {\n copyTextArray[_di] = [];\n }\n let originalColumn = this.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex];\n if (originalColumn) {\n if (this.list[_column.dindex].__isGrouping) {\n copyTextArray[_di].push(this.list[_column.dindex][_column.colIndex]);\n } else {\n copyTextArray[_di].push(this.list[_column.dindex][originalColumn.key]);\n }\n } else {\n copyTextArray[_di].push(\"\");\n }\n\n _dindex = _column.dindex;\n _rowIndex = _column.rowIndex;\n }\n }\n\n copyTextArray.forEach(function (r) {\n copyText += r.join('\\t') + \"\\n\";\n });\n\n $clipBoard.get(0).innerText = copyText;\n $clipBoard.select();\n\n try {\n copysuccess = document.execCommand(\"copy\");\n } catch (e) {\n copysuccess = false;\n }\n return copysuccess;\n };\n\n /**\n * @method ax5grid.setData\n * @param {Array} _data\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setData({\n * list: [],\n * page: {\n * currentPage: 0,\n * pageSize: 50,\n * totalElements: 500,\n * totalPages: 100\n * }\n * });\n *\n * // onlyList\n * ax5Grid.setData([]);\n * ```\n */\n this.setData = function (_data) {\n let isFirstPaint = (typeof this.xvar.paintStartRowIndex === \"undefined\");\n\n GRID.data.set.call(this, _data);\n GRID.body.repaint.call(this);\n if (!isFirstPaint) GRID.body.scrollTo.call(this, {top: 0});\n\n // 가로/세로 스크롤바 show/hide 처리\n alignGrid.call(this);\n // 가로세로 스크롤바의 크기 재 계산.\n GRID.scroller.resize.call(this);\n GRID.page.navigationUpdate.call(this);\n\n isFirstPaint = null;\n return this;\n };\n\n /**\n * @method ax5grid.getList\n * @param {String} _type - selected|modified|deleted\n * @returns {Array}\n * @example\n * ```js\n * ax5Grid.getList();\n * ax5Grid.getList(\"selected\");\n * ax5Grid.getList(\"modified\");\n * ax5Grid.getList(\"deleted\");\n * ```\n */\n this.getList = function (_type) {\n return GRID.data.getList.call(this, _type);\n };\n\n /**\n * @method ax5grid.setHeight\n * @param {Number} _height\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setHeight(height);\n * ```\n */\n this.setHeight = function (_height) {\n //console.log(this.$target);\n if (_height == \"100%\") {\n _height = this.$target.offsetParent().innerHeight();\n }\n this.$target.css({height: _height});\n this.$[\"container\"][\"root\"].css({height: _height});\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.addRow\n * @param {Object} _row\n * @param {Number|String} [_dindex=last]\n * @param {Object} [_options] - options of addRow\n * @param {Boolean} [_options.sort] - sortData\n * @param {Number|String} [_options.focus] - HOME|END|[dindex]\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.addRow($.extend({}, {...}), \"first\");\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: \"END\"});\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: \"HOME\"});\n * ax5Grid.addRow($.extend({}, {...}), \"last\", {focus: 10});\n * ```\n */\n this.addRow = function (_row, _dindex, _options) {\n GRID.data.add.call(this, _row, _dindex, _options);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n\n if(_options && _options.focus) {\n //GRID.body.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n setTimeout(() => {\n GRID.body.moveFocus.call(this, _options.focus);\n }, 1);\n }else{\n GRID.scroller.resize.call(this);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.appendToList\n * @param _list\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.appendToList([{},{},{}]);\n * ax5Grid.appendToList([{},{},{}]);\n * ```\n */\n this.appendToList = function (_list) {\n GRID.data.append.call(this, _list, (function () {\n alignGrid.call(this);\n GRID.body.repaint.call(this);\n GRID.scroller.resize.call(this);\n }).bind(this));\n return this;\n };\n\n /**\n * @method ax5grid.removeRow\n * @param {Number|String} [_dindex=last]\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.removeRow();\n * ax5Grid.removeRow(\"first\");\n * ax5Grid.removeRow(\"last\");\n * ax5Grid.removeRow(1);\n * ax5Grid.removeRow(\"selected\");\n * ```\n */\n this.removeRow = function (_dindex) {\n GRID.data.remove.call(this, _dindex);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n GRID.body.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.updateRow\n * @param {Object} _row\n * @param {Number} _dindex\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.updateRow({price: 100, amount: 100, cost: 10000}, 1);\n * ```\n */\n this.updateRow = function (_row, _dindex) {\n GRID.data.update.call(this, _row, _dindex);\n // todo : mergeCells 옵션에 따라 예외처리\n\n GRID.body.repaintRow.call(this, _dindex);\n return this;\n };\n\n /**\n * @method ax5grid.updateChildRows\n * @param {Number} _dindex\n * @param {Object} _updateData\n * @param {Object} [_options]\n * @param {Function} [_options.filter]\n * @returns {ax5grid}\n * @example\n * ```js\n * onDataChanged: function () {\n * this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked});\n * }\n *\n * onDataChanged: function () {\n * this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked}, {filter: function(){\n * return this.item.type == \"A\";\n * });\n * }\n * ```\n */\n this.updateChildRows = function (_dindex, _updateData, _options) {\n GRID.data.updateChild.call(this, _dindex, _updateData, _options);\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.paintStartColumnIndex = undefined;\n GRID.body.repaint.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.deleteRow\n * @param {Number|String} _dindex\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.deleteRow(\"first\");\n * ax5Grid.deleteRow(\"last\");\n * ax5Grid.deleteRow(1);\n * ax5Grid.deleteRow(\"selected\");\n * ```\n */\n this.deleteRow = function (_dindex) {\n GRID.data.deleteRow.call(this, _dindex);\n alignGrid.call(this);\n GRID.body.repaint.call(this, \"reset\");\n // 삭제시엔 포커스 ?\n // GRID.body.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n GRID.scroller.resize.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.setValue\n * @param _dindex\n * @param _key\n * @param _value\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5Grid.setValue(0, \"price\", 100);\n * ```\n */\n this.setValue = function (_dindex, _key, _value) {\n // getPanelname;\n // let doindex = (typeof _doindex === \"undefined\") ? _dindex : _doindex;\n // setValue를 doindex로 처리하는 상황이 아직 발생전으므로 선언만 하고 넘어감\n let doindex;\n\n if (GRID.data.setValue.call(this, _dindex, doindex, _key, _value)) {\n let repaintCell = function (_panelName, _rows, __dindex, __doindex, __key, __value) {\n for (let r = 0, rl = _rows.length; r < rl; r++) {\n for (let c = 0, cl = _rows[r].cols.length; c < cl; c++) {\n if (_rows[r].cols[c].key == __key) {\n if (this.xvar.frozenRowIndex > __dindex) {\n GRID.body.repaintCell.call(this, \"top-\" + _panelName, __dindex, __doindex, r, c, __value);\n } else {\n GRID.body.repaintCell.call(this, _panelName + \"-scroll\", __dindex, __doindex, r, c, __value);\n }\n }\n }\n }\n };\n\n repaintCell.call(this, \"left-body\", this.leftBodyRowData.rows, _dindex, doindex, _key, _value);\n repaintCell.call(this, \"body\", this.bodyRowData.rows, _dindex, doindex, _key, _value);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.addColumn\n * @param {Object} _column\n * @param {Number|String} [_cindex=last]\n * @returns {ax5grid}\n */\n this.addColumn = (function () {\n let processor = {\n \"first\": function (_column) {\n this.config.columns = [].concat(_column).concat(this.config.columns);\n },\n \"last\": function (_column) {\n this.config.columns = this.config.columns.concat([].concat(_column));\n }\n };\n\n return function (_column, _cindex) {\n if (typeof _column === \"undefined\") throw '_column must not be null';\n if (typeof _cindex === \"undefined\") _cindex = \"last\";\n if (_cindex in processor) {\n processor[_cindex].call(this, _column);\n } else {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n if (U.isArray(_column)) {\n for (let _i = 0, _l = _column.length; _i < _l; _i++) {\n this.config.columns.splice(_cindex + _i, 0, _column[_i]);\n }\n } else {\n this.config.columns.splice(_cindex, 0, _column);\n }\n }\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n }\n })();\n\n /**\n * @method ax5grid.removeColumn\n * @param {Number|String} [_cindex=last]\n * @returns {ax5grid}\n */\n this.removeColumn = (function () {\n let processor = {\n \"first\": function (_cindex) {\n this.config.columns.splice(_cindex, 1);\n },\n \"last\": function () {\n this.config.columns.splice(this.config.columns.length - 1, 1);\n }\n };\n return function (_cindex) {\n if (typeof _cindex === \"undefined\") _cindex = \"last\";\n if (_cindex in processor) {\n processor[_cindex].call(this, _cindex);\n } else {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n //\n this.config.columns.splice(_cindex, 1);\n }\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n }\n })();\n\n /**\n * @method ax5grid.updateColumn\n * @param {Object} _column\n * @param {Number} _cindex\n * @returns {ax5grid}\n */\n this.updateColumn = function (_column, _cindex) {\n if (!U.isNumber(_cindex)) {\n throw 'invalid argument _cindex';\n }\n //\n this.config.columns.splice(_cindex, 1, _column);\n onResetColumns.call(this); // 컬럼이 변경되었을 때.\n return this;\n };\n\n /**\n * @method ax5grid.setColumnWidth\n * @param {Number} _width\n * @param {Number} _cindex\n * @returns {ax5grid}\n */\n this.setColumnWidth = function (_width, _cindex) {\n this.colGroup[this.xvar.columnResizerIndex]._width = _width;\n this.needToPaintSum = true;\n\n // 컬럼너비 변경사항 적용.\n GRID.header.repaint.call(this);\n GRID.body.repaint.call(this, true);\n GRID.scroller.resize.call(this);\n\n alignGrid.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.getColumnSortInfo\n * @returns {Object} sortInfo\n */\n this.getColumnSortInfo = function () {\n let that = {sortInfo: []};\n for (let k in this.sortInfo) {\n that.sortInfo.push({\n key: k,\n orderBy: this.sortInfo[k].orderBy,\n seq: this.sortInfo[k].seq\n });\n }\n that.sortInfo.sort(function (a, b) {\n return a.seq > b.seq;\n });\n return that.sortInfo;\n };\n\n /**\n * @method ax5grid.setColumnSort\n * @param {Object} _sortInfo\n * @param {Object} _sortInfo.key\n * @param {Number} _sortInfo.key.seq - seq of sortOrder\n * @param {String} _sortInfo.key.orderBy - \"desc\"|\"asc\"\n * @returns {ax5grid}\n * @example\n * ```js\n * ax5grid.setColumnSort({a:{seq:0, orderBy:\"desc\"}, b:{seq:1, orderBy:\"asc\"}});\n * ```\n */\n this.setColumnSort = function (_sortInfo) {\n if (typeof _sortInfo !== \"undefined\") {\n this.sortInfo = _sortInfo;\n GRID.header.applySortStatus.call(this, _sortInfo);\n }\n\n sortColumns.call(this, _sortInfo || this.sortInfo);\n return this;\n };\n\n /**\n * @method ax5grid.select\n * @param {Number|Object} _selectObject\n * @param {Number} _selectObject.index - index of row\n * @param {Number} _selectObject.rowIndex - rowIndex of columns\n * @param {Number} _selectObject.conIndex - colIndex of columns\n * @param {Object} _options\n * @param {Boolean} _options.selectedClear\n * @param {Boolean} _options.selected\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.select(0);\n * firstGrid.select(0, {selected: true});\n * firstGrid.select(0, {selected: false});\n * firstGrid.select(0, {selectedClear: true});\n * ```\n */\n this.select = function (_selectObject, _options) {\n if (U.isNumber(_selectObject)) {\n let dindex = _selectObject;\n\n if (!this.config.multipleSelect) {\n this.clearSelect();\n } else {\n if (_options && _options.selectedClear) {\n this.clearSelect();\n }\n }\n\n GRID.data.select.call(this, dindex, undefined, _options && _options.selected);\n GRID.body.updateRowState.call(this, [\"selected\"], dindex, undefined);\n }\n return this;\n };\n\n /**\n * @method firstGrid.clickBody\n * @param {Number} _dindex\n * @returns {ax5grid}\n */\n this.clickBody = function (_dindex) {\n GRID.body.click.call(this, _dindex);\n return this;\n };\n\n /**\n * @method firstGrid.DBLClickBody\n * @param {Number} _dindex\n * @returns {ax5grid}\n */\n this.DBLClickBody = function (_dindex) {\n GRID.body.dblClick.call(this, _dindex);\n return this;\n };\n\n /**\n * @method ax5grid.clearSelect\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.clearSelect();\n * ```\n */\n this.clearSelect = function () {\n GRID.body.updateRowState.call(this, [\"selectedClear\"]);\n GRID.data.clearSelect.call(this);\n return this;\n };\n\n /**\n * @method ax5grid.selectAll\n * @param {Object} _options\n * @param {Boolean} _options.selected\n * @param {Function} _options.filter\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.selectAll();\n * firstGrid.selectAll({selected: true});\n * firstGrid.selectAll({selected: false});\n * firstGrid.selectAll({filter: function(){\n * return this[\"b\"] == \"A01\";\n * });\n * firstGrid.selectAll({selected: true, filter: function(){\n * return this[\"b\"] == \"A01\";\n * });\n * ```\n */\n this.selectAll = function (_options) {\n GRID.data.selectAll.call(this, _options && _options.selected, _options);\n GRID.body.updateRowStateAll.call(this, [\"selected\"]);\n return this;\n };\n\n /**\n * @method ax5grid.exportExcel\n * @param {String} _fileName\n * @returns {ax5grid|String}\n * @example\n * ```js\n * firstGrid.exportExcel(\"grid-to-excel.xls\");\n * console.log(firstGrid.exportExcel());\n * ```\n */\n this.exportExcel = function (_fileName) {\n let table = [];\n table.push('');\n table.push(GRID.header.getExcelString.call(this));\n table.push(GRID.body.getExcelString.call(this));\n table.push('
');\n\n if (typeof _fileName === \"undefined\") {\n return table.join('');\n }\n else {\n GRID.excel.export.call(this, [table.join('')], _fileName);\n }\n\n return this;\n };\n\n /**\n * @method ax5grid.focus\n * @param {String|Number} _pos - UP, DOWN, LEFT, RIGHT, HOME, END\n * @returns {ax5grid}\n * @example\n * ```js\n * firstGrid.focus(\"UP\");\n * firstGrid.focus(\"DOWN\");\n * firstGrid.focus(\"HOME\");\n * firstGrid.focus(\"END\");\n * ```\n */\n this.focus = function (_pos) {\n\n if (GRID.body.moveFocus.call(this, _pos)) {\n let focusedColumn;\n for (let c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (focusedColumn) {\n this.select(focusedColumn.dindex, {selectedClear: true});\n }\n }\n else {\n if (typeof this.selectedDataIndexs[0] === \"undefined\") {\n this.select(0);\n } else {\n let selectedIndex = this.selectedDataIndexs[0];\n\n let processor = {\n \"UP\": function () {\n if (selectedIndex > 0) {\n this.select(selectedIndex - 1, {selectedClear: true});\n GRID.body.moveFocus.call(this, selectedIndex - 1);\n }\n },\n \"DOWN\": function () {\n if (selectedIndex < this.list.length - 1) {\n this.select(selectedIndex + 1, {selectedClear: true});\n GRID.body.moveFocus.call(this, selectedIndex + 1);\n }\n },\n \"HOME\": function () {\n this.select(0, {selectedClear: true});\n GRID.body.moveFocus.call(this, 0);\n },\n \"END\": function () {\n this.select(this.list.length - 1, {selectedClear: true});\n GRID.body.moveFocus.call(this, this.list.length - 1);\n }\n };\n\n if (_pos in processor) {\n processor[_pos].call(this);\n }\n }\n }\n return this;\n };\n\n /**\n * @method ax5grid.destroy\n * @returns {null}\n */\n this.destroy = function () {\n const instanceId = this.instanceId;\n this.$target.empty();\n this.list = [];\n UI.grid_instance = ax5.util.filter(UI.grid_instance, function () {\n return this.instanceId != instanceId;\n });\n return null;\n };\n\n // 클래스 생성자\n this.main = (function () {\n UI.grid_instance = UI.grid_instance || [];\n UI.grid_instance.push(this);\n\n if (arguments && U.isObject(arguments[0])) {\n this.setConfig(arguments[0]);\n }\n }).apply(this, arguments);\n };\n })());\n\n GRID = ax5.ui.grid;\n})();\n\n// todo : filter\n// todo : column reorder\n// todo : editor 필수값 속성 지정","// ax5.ui.grid.body\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const columnSelect = {\n focusClear: function () {\n let self = this, _column;\n for (let c in self.focusedColumn) {\n _column = self.focusedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]')\n .removeAttr('data-ax5grid-column-focused');\n }\n }\n self.focusedColumn = {};\n },\n clear: function () {\n let self = this, _column;\n for (let c in self.selectedColumn) {\n _column = self.selectedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]')\n .removeAttr('data-ax5grid-column-selected');\n }\n }\n self.selectedColumn = {};\n },\n init: function (column) {\n let self = this;\n if (this.isInlineEditing) {\n for (let editKey in this.inlineEditing) {\n if (editKey == column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex) {\n return this;\n }\n }\n }\n\n // focus\n columnSelect.focusClear.call(self);\n self.focusedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex] = {\n panelName: column.panelName,\n dindex: column.dindex,\n doindex: column.doindex,\n rowIndex: column.rowIndex,\n colIndex: column.colIndex,\n colspan: column.colspan\n };\n\n // select\n columnSelect.clear.call(self);\n self.xvar.selectedRange = {\n start: [column.dindex, column.rowIndex, column.colIndex, column.colspan - 1],\n end: null\n };\n self.selectedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex] = (function (data) {\n if (data) {\n return false;\n } else {\n return {\n panelName: column.panelName,\n dindex: column.dindex,\n doindex: column.doindex,\n rowIndex: column.rowIndex,\n colIndex: column.colIndex,\n colspan: column.colspan\n }\n }\n })(self.selectedColumn[column.dindex + \"_\" + column.colIndex + \"_\" + column.rowIndex]);\n\n this.$.panel[column.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + column.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + column.colIndex + '\"]')\n .attr('data-ax5grid-column-focused', \"true\")\n .attr('data-ax5grid-column-selected', \"true\");\n\n if (this.isInlineEditing) {\n GRID.body.inlineEdit.deActive.call(this, \"RETURN\");\n }\n },\n update: function (column) {\n const self = this;\n let dindex, doindex, colIndex, rowIndex, trl;\n\n self.xvar.selectedRange[\"end\"] = [column.dindex, column.rowIndex, column.colIndex, column.colspan - 1];\n columnSelect.clear.call(self);\n\n let range = {\n r: {\n s: Math.min(self.xvar.selectedRange[\"start\"][0], self.xvar.selectedRange[\"end\"][0]),\n e: Math.max(self.xvar.selectedRange[\"start\"][0], self.xvar.selectedRange[\"end\"][0])\n },\n c: {\n s: Math.min(self.xvar.selectedRange[\"start\"][2], self.xvar.selectedRange[\"end\"][2]),\n e: Math.max(self.xvar.selectedRange[\"start\"][2] + self.xvar.selectedRange[\"start\"][3], self.xvar.selectedRange[\"end\"][2] + self.xvar.selectedRange[\"end\"][3])\n }\n };\n\n dindex = range.r.s;\n for (; dindex <= range.r.e; dindex++) {\n\n\n trl = this.bodyRowTable.rows.length;\n rowIndex = 0;\n for (; rowIndex < trl; rowIndex++) {\n colIndex = range.c.s;\n for (; colIndex <= range.c.e; colIndex++) {\n var _panels = [],\n panelName = \"\";\n\n if (self.xvar.frozenRowIndex > dindex) _panels.push(\"top\");\n if (self.xvar.frozenColumnIndex > colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n if (_panels[0] !== \"top\") _panels.push(\"scroll\");\n panelName = _panels.join(\"-\");\n\n self.selectedColumn[dindex + \"_\" + colIndex + \"_\" + rowIndex] = {\n panelName: panelName,\n dindex: dindex,\n rowIndex: rowIndex,\n colIndex: colIndex,\n colspan: column.colspan\n };\n\n _panels = null;\n panelName = null;\n }\n }\n }\n dindex = null;\n doindex = null;\n colIndex = null;\n rowIndex = null;\n\n for (var c in self.selectedColumn) {\n var _column = self.selectedColumn[c];\n if (_column) {\n self.$.panel[_column.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _column.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + _column.rowIndex + '\"][data-ax5grid-column-colindex=\"' + _column.colIndex + '\"]')\n .attr('data-ax5grid-column-selected', 'true');\n }\n }\n\n }\n };\n\n const columnSelector = {\n \"on\": function (cell) {\n let self = this;\n\n if (this.inlineEditing[cell.dindex + \"_\" + cell.colIndex + \"_\" + cell.rowIndex]) {\n return;\n }\n\n columnSelect.init.call(self, cell);\n\n this.$[\"container\"][\"body\"]\n .on(\"mousemove.ax5grid-\" + this.instanceId, '[data-ax5grid-column-attr=\"default\"]', function (e) {\n if (this.getAttribute(\"data-ax5grid-column-rowIndex\")) {\n columnSelect.update.call(self, {\n panelName: this.getAttribute(\"data-ax5grid-panel-name\"),\n dindex: Number(this.getAttribute(\"data-ax5grid-data-index\")),\n doindex: Number(this.getAttribute(\"data-ax5grid-data-o-index\")),\n rowIndex: Number(this.getAttribute(\"data-ax5grid-column-rowIndex\")),\n colIndex: Number(this.getAttribute(\"data-ax5grid-column-colIndex\")),\n colspan: Number(this.getAttribute(\"colspan\"))\n });\n U.stopEvent(e);\n }\n })\n .on(\"mouseup.ax5grid-\" + this.instanceId, function () {\n columnSelector.off.call(self);\n })\n .on(\"mouseleave.ax5grid-\" + this.instanceId, function () {\n columnSelector.off.call(self);\n });\n\n jQuery(document.body)\n .attr('unselectable', 'on')\n .css('user-select', 'none')\n .on('selectstart', false);\n },\n \"off\": function () {\n\n this.$[\"container\"][\"body\"]\n .off(\"mousemove.ax5grid-\" + this.instanceId)\n .off(\"mouseup.ax5grid-\" + this.instanceId)\n .off(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body)\n .removeAttr('unselectable')\n .css('user-select', 'auto')\n .off('selectstart');\n }\n };\n\n const updateRowState = function (_states, _dindex, _doindex, _data) {\n let self = this,\n cfg = this.config,\n processor = {\n \"selected\": function (_dindex, _doindex) {\n if (this.list[_doindex]) {\n let i = this.$.livePanelKeys.length;\n while (i--) {\n this.$.panel[this.$.livePanelKeys[i]]\n .find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]')\n .attr(\"data-ax5grid-selected\", this.list[_doindex][cfg.columnKeys.selected]);\n }\n }\n },\n \"selectedClear\": function () {\n let di = this.list.length;\n let pi;\n\n if (!this.proxyList) {\n while (di--) {\n if (this.list[di][cfg.columnKeys.selected]) {\n pi = this.$.livePanelKeys.length;\n while (pi--) {\n this.$.panel[this.$.livePanelKeys[pi]]\n .find('[data-ax5grid-tr-data-index=\"' + di + '\"]')\n .attr(\"data-ax5grid-selected\", false);\n }\n }\n this.list[di][cfg.columnKeys.selected] = false;\n }\n } else {\n while (di--) {\n this.list[di][cfg.columnKeys.selected] = false;\n }\n di = this.proxyList.length;\n while (di--) {\n if (this.list[doi][cfg.columnKeys.selected]) {\n pi = this.$.livePanelKeys.length;\n while (pi--) {\n this.$.panel[this.$.livePanelKeys[pi]]\n .find('[data-ax5grid-tr-data-index=\"' + di + '\"]')\n .attr(\"data-ax5grid-selected\", false);\n }\n }\n\n this.proxyList[di][cfg.columnKeys.selected] = false;\n let doi = this.proxyList[di].__original_index__;\n }\n }\n },\n \"cellChecked\": function (_dindex, _doindex, _data) {\n let key = _data.key,\n rowIndex = _data.rowIndex,\n colIndex = _data.colIndex;\n\n let panelName = (function () {\n let _panels = [];\n if (this.xvar.frozenRowIndex > _dindex) _panels.push(\"top\");\n if (this.xvar.frozenColumnIndex > colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n if (_panels[0] !== \"top\") _panels.push(\"scroll\");\n return _panels.join(\"-\");\n }).call(this);\n\n this.$.panel[panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]')\n .find('[data-ax5grid-column-rowIndex=\"' + rowIndex + '\"][data-ax5grid-column-colIndex=\"' + colIndex + '\"]')\n .find('[data-ax5grid-editor=\"checkbox\"]')\n .attr(\"data-ax5grid-checked\", '' + _data.checked);\n }\n };\n\n if (typeof _doindex === \"undefined\") _doindex = _dindex;\n\n _states.forEach(function (_state) {\n if (!processor[_state]) throw 'invaild state name';\n processor[_state].call(self, _dindex, _doindex, _data);\n });\n };\n\n const updateRowStateAll = function (_states, _data) {\n let self = this,\n cfg = this.config,\n processor = {\n \"selected\": function (_dindex) {\n GRID.body.repaint.call(this, true);\n }\n };\n\n _states.forEach(function (_state) {\n if (!processor[_state]) throw 'invaild state name';\n processor[_state].call(self, _data);\n });\n };\n\n const init = function () {\n let self = this;\n\n this.$[\"container\"][\"body\"].on(\"click\", '[data-ax5grid-column-attr]', function (e) {\n let panelName, attr,\n row, col, dindex, doindex, rowIndex, colIndex, disableSelection,\n targetClick = {\n \"default\": function (_column) {\n let column = self.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex],\n that = {\n self: self,\n page: self.page,\n list: self.list,\n item: self.list[_column.doindex],\n dindex: _column.dindex,\n doindex: _column.doindex,\n rowIndex: _column.rowIndex,\n colIndex: _column.colIndex,\n column: column,\n value: self.list[_column.dindex][column.key]\n };\n\n if (column.editor && column.editor.type == \"checkbox\") { // todo : GRID.inlineEditor에서 처리 할수 있도록 구문 변경 필요.\n let value = GRID.data.getValue.call(self, _column.dindex, _column.doindex, column.key),\n checked, newValue;\n\n if (column.editor.config && column.editor.config.trueValue) {\n if (checked = !(value == column.editor.config.trueValue)) {\n newValue = column.editor.config.trueValue;\n } else {\n newValue = column.editor.config.falseValue;\n }\n } else {\n newValue = checked = (value == false || value == \"false\" || value < \"1\") ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(self, _column.dindex, _column.doindex, column.key, newValue);\n\n updateRowState.call(self, [\"cellChecked\"], _column.dindex, _column.doindex, {\n key: column.key, rowIndex: _column.rowIndex, colIndex: _column.colIndex,\n editorConfig: column.editor.config, checked: checked\n });\n } else {\n if (self.config.body.onClick) {\n self.config.body.onClick.call(that);\n }\n }\n },\n \"rowSelector\": function (_column) {\n let item = self.list[_column.doindex];\n if (item[self.config.columnKeys.disableSelection]) {\n return false;\n }\n\n if (!self.config.multipleSelect && self.selectedDataIndexs[0] !== _column.doindex) {\n updateRowState.call(self, [\"selectedClear\"]);\n GRID.data.clearSelect.call(self);\n }\n\n GRID.data.select.call(self, _column.dindex, _column.doindex, undefined, {\n internalCall: true\n });\n updateRowState.call(self, [\"selected\"], _column.dindex, _column.doindex);\n },\n \"lineNumber\": function (_column) {\n\n },\n \"tree-control\": function (_column, _el) {\n //console.log(_column);\n toggleCollapse.call(self, _column.dindex, _column.doindex);\n }\n };\n\n panelName = this.getAttribute(\"data-ax5grid-panel-name\");\n attr = this.getAttribute(\"data-ax5grid-column-attr\");\n row = Number(this.getAttribute(\"data-ax5grid-column-row\"));\n col = Number(this.getAttribute(\"data-ax5grid-column-col\"));\n rowIndex = Number(this.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(this.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(this.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(this.getAttribute(\"data-ax5grid-data-o-index\"));\n\n if (attr in targetClick) {\n targetClick[attr]({\n panelName: panelName,\n attr: attr,\n row: row,\n col: col,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex\n }, this);\n }\n });\n this.$[\"container\"][\"body\"].on(\"dblclick\", '[data-ax5grid-column-attr]', function (e) {\n let panelName, attr,\n row, col, dindex, doindex, rowIndex, colIndex,\n targetDBLClick = {\n \"default\": function (_column) {\n if (self.isInlineEditing) {\n for (let columnKey in self.inlineEditing) {\n if (columnKey == _column.dindex + \"_\" + _column.colIndex + \"_\" + _column.rowIndex) {\n return this;\n }\n }\n }\n\n let column = self.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex], value = \"\";\n if (column) {\n if (!self.list[dindex].__isGrouping) {\n value = GRID.data.getValue.call(self, dindex, doindex, column.key);\n }\n }\n\n let editor = self.colGroup[_column.colIndex].editor;\n if (U.isObject(editor)) {\n GRID.body.inlineEdit.active.call(self, self.focusedColumn, e, value);\n } else {\n // 더블클릭 실행\n if (self.config.body.onDBLClick) {\n let that = {\n self: self,\n page: self.page,\n list: self.list,\n item: self.list[_column.dindex],\n dindex: _column.dindex,\n doindex: _column.doindex,\n rowIndex: _column.rowIndex,\n colIndex: _column.colIndex,\n column: column,\n value: self.list[_column.dindex][column.key]\n };\n self.config.body.onDBLClick.call(that);\n }\n }\n },\n \"rowSelector\": function (_column) {\n\n },\n \"lineNumber\": function (_column) {\n\n }\n };\n\n panelName = this.getAttribute(\"data-ax5grid-panel-name\");\n attr = this.getAttribute(\"data-ax5grid-column-attr\");\n row = Number(this.getAttribute(\"data-ax5grid-column-row\"));\n col = Number(this.getAttribute(\"data-ax5grid-column-col\"));\n rowIndex = Number(this.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(this.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(this.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(this.getAttribute(\"data-ax5grid-data-o-index\"));\n\n if (attr in targetDBLClick) {\n targetDBLClick[attr]({\n panelName: panelName,\n attr: attr,\n row: row,\n col: col,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex\n });\n }\n });\n\n if (this.config.contextMenu) {\n this.$[\"container\"][\"body\"].on(\"contextmenu\", function (e) {\n let target, dindex, doindex, rowIndex, colIndex, item, column, param = {};\n\n target = U.findParentNode(e.target, function (t) {\n if (t.getAttribute(\"data-ax5grid-column-attr\")) {\n return true;\n }\n });\n\n if (target) {\n // item 찾기\n rowIndex = Number(target.getAttribute(\"data-ax5grid-column-rowIndex\"));\n colIndex = Number(target.getAttribute(\"data-ax5grid-column-colIndex\"));\n dindex = Number(target.getAttribute(\"data-ax5grid-data-index\"));\n doindex = Number(target.getAttribute(\"data-ax5grid-data-o-index\"));\n column = self.bodyRowMap[rowIndex + \"_\" + colIndex];\n item = self.list[dindex];\n }\n\n if (!self.contextMenu) {\n self.contextMenu = new ax5.ui.menu();\n }\n\n self.contextMenu.setConfig(self.config.contextMenu);\n\n param = {\n element: target,\n dindex: dindex,\n doindex: doindex,\n rowIndex: rowIndex,\n colIndex: colIndex,\n item: item,\n column: column,\n gridSelf: self\n };\n\n self.contextMenu.popup(e, {\n filter: function () {\n return self.config.contextMenu.popupFilter.call(this, this, param);\n },\n param: param\n });\n\n U.stopEvent(e.originalEvent);\n target = null;\n dindex = null;\n doindex = null;\n rowIndex = null;\n colIndex = null;\n item = null;\n column = null;\n param = null;\n });\n }\n\n this.$[\"container\"][\"body\"]\n .on(\"mousedown\", '[data-ax5grid-column-attr=\"default\"]', function (e) {\n if (self.xvar.touchmoved) return false;\n if (this.getAttribute(\"data-ax5grid-column-rowIndex\")) {\n columnSelector.on.call(self, {\n panelName: this.getAttribute(\"data-ax5grid-panel-name\"),\n dindex: Number(this.getAttribute(\"data-ax5grid-data-index\")),\n doindex: Number(this.getAttribute(\"data-ax5grid-data-o-index\")),\n rowIndex: Number(this.getAttribute(\"data-ax5grid-column-rowIndex\")),\n colIndex: Number(this.getAttribute(\"data-ax5grid-column-colIndex\")),\n colspan: Number(this.getAttribute(\"colspan\"))\n });\n }\n })\n .on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n resetFrozenColumn.call(this);\n\n // 그리드 바디에 출력할 여유 카운트\n this.xvar.paintRowCountMargin = this.config.virtualScrollYCountMargin;\n this.xvar.paintRowCountTopMargin = this.config.virtualScrollYCountMargin - Math.floor(this.config.virtualScrollYCountMargin / 2);\n\n if (this.config.virtualScrollAccelerated) {\n this.__throttledScroll = U.throttle(function (css, opts) {\n if (this.config.virtualScrollY && !opts.noRepaint && \"top\" in css) {\n repaint.call(this);\n } else if (this.config.virtualScrollX && !opts.noRepaint && \"left\" in css) {\n repaint.call(this);\n }\n if (opts.callback) {\n opts.callback();\n }\n }, this.config.virtualScrollAcceleratedDelayTime);\n } else {\n this.__throttledScroll = false;\n }\n };\n\n const resetFrozenColumn = function () {\n let cfg = this.config,\n dividedBodyRowObj = GRID.util.divideTableByFrozenColumnIndex(this.bodyRowTable, this.xvar.frozenColumnIndex);\n\n\n this.asideBodyRowData = (function (dataTable) {\n let data = {rows: []};\n for (let i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = {cols: []};\n if (i === 0) {\n let col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n }, _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n label: \" \", key: \"__d-index__\"\n });\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n label: \"\", key: \"__d-checkbox__\"\n });\n data.rows[i].cols.push(_col);\n }\n }\n }\n\n return data;\n }).call(this, this.bodyRowTable);\n\n //console.log(dividedBodyRowObj);\n\n this.leftBodyRowData = dividedBodyRowObj.leftData;\n this.bodyRowData = dividedBodyRowObj.rightData;\n\n if (cfg.body.grouping) {\n let dividedBodyGroupingObj = GRID.util.divideTableByFrozenColumnIndex(this.bodyGroupingTable, this.xvar.frozenColumnIndex);\n this.asideBodyGroupingData = (function (dataTable) {\n let data = {rows: []};\n for (let i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = {cols: []};\n if (i === 0) {\n let col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n }, _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n label: \" \", key: \"__d-index__\"\n });\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n label: \"\", key: \"__d-checkbox__\"\n });\n data.rows[i].cols.push(_col);\n }\n }\n }\n\n return data;\n }).call(this, this.bodyGroupingTable);\n this.leftBodyGroupingData = dividedBodyGroupingObj.leftData;\n this.bodyGroupingData = dividedBodyGroupingObj.rightData;\n this.bodyGroupingMap = GRID.util.makeBodyRowMap.call(this, this.bodyGroupingTable);\n }\n\n this.leftFootSumData = {};\n this.footSumData = {};\n if (this.config.footSum) {\n let dividedFootSumObj = GRID.util.divideTableByFrozenColumnIndex(this.footSumTable, this.xvar.frozenColumnIndex);\n this.leftFootSumData = dividedFootSumObj.leftData;\n this.footSumData = dividedFootSumObj.rightData;\n }\n };\n\n const getFieldValue = function (_list, _item, _index, _col, _value, _returnPlainText) {\n\n let _key = _col.key, tagsToReplace = {\n '<': '<',\n '>': '>'\n };\n\n if (_key === \"__d-index__\") {\n return (typeof _item[\"__index\"] !== \"undefined\") ? _item[\"__index\"] + 1 : \"\";\n }\n else if (_key === \"__d-checkbox__\") {\n return `
`;\n }\n else {\n if (_col.editor && (function (_editor) {\n if (_editor.type in GRID.inlineEditor) {\n return (GRID.inlineEditor[_editor.type].editMode == \"inline\");\n }\n return false;\n })(_col.editor)) { // editor가 inline타입이라면\n\n _value = _value || GRID.data.getValue.call(this, _index, _item.__origin_index__, _key);\n\n if (U.isFunction(_col.editor.disabled)) {\n if (_col.editor.disabled.call({\n list: _list,\n dindex: _index,\n item: _list[_index],\n key: _key,\n value: _value\n })) {\n return _value;\n }\n }\n\n // print editor\n return _returnPlainText ? _value : GRID.inlineEditor[_col.editor.type].getHtml(this, _col.editor, _value);\n }\n\n const valueProcessor = {\n \"formatter\": function () {\n let that = {\n key: _key,\n value: _value || GRID.data.getValue.call(this, _index, _item.__origin_index__, _key),\n dindex: _index,\n item: _item,\n list: _list\n };\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n },\n \"default\": function () {\n let returnValue = \"\";\n\n if (typeof _value !== \"undefined\") {\n returnValue = _value;\n } else {\n if (/[\\.\\[\\]]/.test(_key)) {\n _value = GRID.data.getValue.call(this, _index, _item.__origin_index__, _key);\n } else {\n _value = _item[_key];\n }\n\n if (_value !== null && typeof _value !== \"undefined\") returnValue = _value;\n }\n\n // 키값이 Boolean일때 오류 발생하여 수정.\n return (typeof returnValue !== \"string\") ? returnValue : returnValue.replace(/[<>]/g, function (tag) {\n return tagsToReplace[tag] || tag;\n });\n },\n \"treeControl\": function (__value) {\n let cfg = this.config,\n keys = this.config.tree.columnKeys,\n indentNodeHtml = '';\n\n if (_item[keys.children].length) {\n indentNodeHtml += '';\n indentNodeHtml += (_item[keys.collapse]) ? cfg.tree.icons.collapsedArrow : cfg.tree.icons.openedArrow;\n indentNodeHtml += ' ';\n } else {\n indentNodeHtml += ' ';\n }\n\n indentNodeHtml += '';\n indentNodeHtml += (_item[keys.children].length) ? (_item[keys.collapse]) ? cfg.tree.icons.collapsedGroupIcon : cfg.tree.icons.groupIcon : cfg.tree.icons.itemIcon;\n indentNodeHtml += ' ';\n\n return indentNodeHtml + __value;\n }\n };\n\n let returnValue = (_col.formatter) ? valueProcessor.formatter.call(this) : valueProcessor.default.call(this);\n if (this.config.tree.use && _col.treeControl) {\n returnValue = valueProcessor.treeControl.call(this, returnValue);\n }\n\n return returnValue;\n }\n\n };\n\n const getGroupingValue = function (_item, _index, _col) {\n let value, that, _key = _col.key, _label = _col.label;\n\n if (typeof _key === \"undefined\") {\n that = {\n key: _key,\n list: _item.__groupingList,\n groupBy: _item.__groupingBy\n };\n if (U.isFunction(_label)) {\n value = _label.call(that);\n } else {\n value = _label;\n }\n _item[_col.colIndex] = value;\n return value;\n }\n else if (_key === \"__d-index__\") {\n return '';\n }\n else if (_key === \"__d-checkbox__\") {\n return '';\n }\n else {\n if (_col.collector) {\n that = {\n key: _key,\n list: _item.__groupingList\n };\n if (U.isFunction(_col.collector)) {\n value = _col.collector.call(that);\n } else {\n value = GRID.collector[_col.collector].call(that);\n }\n _item[_col.colIndex] = value;\n\n if (_col.formatter) {\n that.value = value;\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n } else {\n return value;\n }\n } else {\n return \" \";\n }\n }\n };\n\n const getSumFieldValue = function (_list, _col) {\n let _key = _col.key, _label = _col.label;\n //, _collector, _formatter\n if (typeof _key === \"undefined\") {\n return _label;\n }\n else if (_key === \"__d-index__\" || _key === \"__d-checkbox__\") {\n return ' ';\n }\n else {\n if (_col.collector) {\n let that = {\n key: _key,\n list: _list\n },\n value;\n\n if (U.isFunction(_col.collector)) {\n value = _col.collector.call(that);\n } else {\n value = GRID.collector[_col.collector].call(that);\n }\n\n if (_col.formatter) {\n that.value = value;\n if (U.isFunction(_col.formatter)) {\n return _col.formatter.call(that);\n } else {\n return GRID.formatter[_col.formatter].call(that);\n }\n } else {\n return value;\n }\n\n } else {\n return \" \";\n }\n }\n };\n\n const repaint = function (_reset) {\n // debugger;\n let cfg = this.config, list = (this.proxyList) ? this.proxyList : this.list;\n\n /// repaint reset 타입이면 고정컬럼을 재조정\n if (_reset) {\n resetFrozenColumn.call(this);\n // 틀고정 이 변경되면 출력 시작 인덱스 값을 초기화\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.paintStartColumnIndex = undefined;\n }\n\n /// 출력시작 인덱스\n let paintStartRowIndex, virtualPaintStartRowIndex;\n\n if (this.config.virtualScrollY) {\n virtualPaintStartRowIndex = paintStartRowIndex = Math.floor(-(this.$.panel[\"body-scroll\"].position().top) / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex;\n if (this.xvar.paintRowCountTopMargin < paintStartRowIndex) {\n paintStartRowIndex -= this.xvar.paintRowCountTopMargin;\n }\n }\n else {\n paintStartRowIndex = this.xvar.frozenRowIndex;\n }\n\n if (isNaN(paintStartRowIndex)) return this;\n\n let paintStartColumnIndex = 0, paintEndColumnIndex = 0, nopaintLeftColumnsWidth = null, nopaintRightColumnsWidth = null;\n let bodyScrollLeft = -(this.$.panel[\"body-scroll\"].position().left);\n\n if (this.config.virtualScrollX) { // 페인트 시작컬럼위치와 종료컬럼위치 구하기\n for (let ci = this.xvar.frozenColumnIndex; ci < this.colGroup.length; ci++) {\n // bodyScrollLeft\n this.colGroup[ci]._sx = (ci == this.xvar.frozenColumnIndex) ? 0 : this.colGroup[ci - 1]._ex;\n this.colGroup[ci]._ex = this.colGroup[ci]._sx + this.colGroup[ci]._width;\n\n if (this.colGroup[ci]._sx <= bodyScrollLeft && this.colGroup[ci]._ex >= bodyScrollLeft) {\n paintStartColumnIndex = ci;\n }\n if (this.colGroup[ci]._sx <= (bodyScrollLeft + this.xvar.bodyWidth) && this.colGroup[ci]._ex >= (bodyScrollLeft + this.xvar.bodyWidth)) {\n paintEndColumnIndex = ci;\n\n if (nopaintLeftColumnsWidth === null) nopaintLeftColumnsWidth = this.colGroup[paintStartColumnIndex]._sx;\n if (nopaintRightColumnsWidth === null) nopaintRightColumnsWidth = this.xvar.scrollContentWidth - this.colGroup[ci]._ex;\n }\n }\n\n if (nopaintLeftColumnsWidth === null) nopaintLeftColumnsWidth = 0;\n if (nopaintRightColumnsWidth === null) nopaintRightColumnsWidth = 0;\n this.$.panel[\"top-body-scroll\"].css({\"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth});\n this.$.panel[\"body-scroll\"].css({\"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth});\n this.$.panel[\"bottom-body-scroll\"].css({\"padding-left\": nopaintLeftColumnsWidth, \"padding-right\": nopaintRightColumnsWidth});\n }\n\n let isFirstPaint = (typeof this.xvar.paintStartRowIndex === \"undefined\"),\n headerColGroup = this.headerColGroup,\n asideBodyRowData = this.asideBodyRowData,\n leftBodyRowData = this.leftBodyRowData,\n bodyRowData = this.bodyRowData,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n asideBodyGroupingData = this.asideBodyGroupingData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount, virtualPaintRowCount;\n\n if (!this.config.virtualScrollY) {\n virtualPaintRowCount = paintRowCount = list.length;\n } else {\n virtualPaintRowCount = Math.ceil(this.xvar.bodyHeight / this.xvar.bodyTrHeight);\n paintRowCount = virtualPaintRowCount + (this.xvar.paintRowCountMargin || 1);\n }\n\n // 여유범위 안에 있으면 페인팅 안할수 있게 paintStartRowIndex 변경하지 않음.\n if (this.xvar.paintRowCountTopMargin < paintStartRowIndex && Math.abs(this.xvar.paintStartRowIndex - paintStartRowIndex) <= this.xvar.paintRowCountTopMargin) {\n paintStartRowIndex = this.xvar.paintStartRowIndex;\n }\n\n if (\n this.xvar.dataRowCount === list.length\n && this.xvar.paintStartRowIndex === paintStartRowIndex\n && this.xvar.paintRowCount === paintRowCount\n && this.xvar.paintStartColumnIndex === paintStartColumnIndex\n && this.xvar.paintEndColumnIndex === paintEndColumnIndex\n ) return this; // 스크롤 포지션 변경 여부에 따라 프로세스 진행여부 결정\n\n // bodyRowData 수정 : 페인트 컬럼 포지션이 달라지므로\n if (nopaintLeftColumnsWidth || nopaintRightColumnsWidth) {\n headerColGroup = [].concat(headerColGroup).splice(paintStartColumnIndex - this.xvar.frozenColumnIndex, paintEndColumnIndex - paintStartColumnIndex + 1 + this.xvar.frozenColumnIndex);\n bodyRowData = GRID.util.getTableByStartEndColumnIndex(bodyRowData, paintStartColumnIndex, paintEndColumnIndex);\n\n if (cfg.body.grouping) {\n bodyGroupingData = GRID.util.getTableByStartEndColumnIndex(bodyGroupingData, paintStartColumnIndex, paintEndColumnIndex);\n }\n if (cfg.footSum) {\n footSumData = GRID.util.getTableByStartEndColumnIndex(footSumData, paintStartColumnIndex, paintEndColumnIndex);\n }\n if (this.xvar.paintStartColumnIndex !== paintStartColumnIndex || this.xvar.paintEndColumnIndex !== paintEndColumnIndex) {\n this.needToPaintSum = true;\n }\n }\n\n /// 스크롤 컨텐츠의 높이 : 그리드 스크롤의 실제 크기와는 관계 없이 데이터 갯수에 따라 스크롤 컨텐츠 높이값 구해서 저장해두기.\n // todo scrollContentHeight\n this.xvar.scrollContentHeight = this.xvar.bodyTrHeight * (list.length - this.xvar.frozenRowIndex);\n if (this.xvar.scrollContentHeight < 0) this.xvar.scrollContentHeight = 0;\n\n /// 사용된 패널들의 키 모음\n this.$.livePanelKeys = [];\n\n // 그리드 바디 영역 페인트 함수\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _groupRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n let repaintBody = function (_elTargetKey, _colGroup, _bodyRow, _groupRow, _list, _scrollConfig) {\n let _elTarget = this.$.panel[_elTargetKey];\n\n if (!isFirstPaint && !_scrollConfig) {\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return false;\n }\n\n let SS = [],\n cgi, cgl, di, dl, tri, trl, ci, cl, col,\n cellHeight,\n colAlign,\n isScrolled = (function () {\n // 스크롤값이 변경되거나 처음 호출되었습니까?\n if (typeof _scrollConfig === \"undefined\" || typeof _scrollConfig['paintStartRowIndex'] === \"undefined\") {\n _scrollConfig = {\n paintStartRowIndex: 0,\n paintRowCount: _list.length\n };\n return false;\n } else {\n return true;\n }\n })(),\n stripeString = '#fff 0px, #fff ' + (cfg.body.columnHeight - cfg.body.columnBorderWidth) + 'px, #eee ' + (cfg.body.columnHeight - cfg.body.columnBorderWidth) + 'px, #eee ' + (cfg.body.columnHeight) + 'px';\n\n if (isScrolled) {\n SS.push('
');\n }\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n di = _scrollConfig.paintStartRowIndex;\n\n for (dl = (function () {\n let len;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n })(); di < dl; di++) {\n\n if (_list[di]) {\n let isGroupingRow = false, rowTable, odi = (typeof _list[di].__origin_index__ !== \"undefined\") ? _list[di].__origin_index__ : di;\n if (_groupRow && \"__isGrouping\" in _list[di]) {\n rowTable = _groupRow;\n isGroupingRow = true;\n } else {\n rowTable = _bodyRow;\n }\n\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n\n SS.push('');\n\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), (isGroupingRow) ? getGroupingValue.call(this, _list[di], di, col) : getFieldValue.call(this, _list, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n }\n }\n SS.push('
');\n\n if (isScrolled && _list.length) {\n SS.push('
');\n }\n\n\n _elTarget.empty();\n SS = SS.join('');\n\n _elTarget.get(0).innerHTML = SS;\n\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return true;\n };\n\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n let repaintSum = function (_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n let _elTarget = this.$.panel[_elTargetKey];\n\n if (!isFirstPaint && !_scrollConfig) {\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return false;\n }\n\n let SS = [], cgi, cgl, tri, trl, ci, cl, col, cellHeight, colAlign;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty();\n SS = SS.join('');\n\n _elTarget.get(0).innerHTML = SS;\n\n this.$.livePanelKeys.push(_elTargetKey); // 사용중인 패널키를 모아둠. (뷰의 상태 변경시 사용하려고)\n return true;\n };\n\n /**\n * @param _elTargetKey\n * @param _colGroup\n * @param _bodyRow\n * @param _list\n * @param [_scrollConfig]\n * @returns {boolean}\n */\n let mergeCellsBody = function (_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n let tblRowMaps = [];\n let _elTarget = this.$.panel[_elTargetKey];\n let token = {}, hasMergeTd;\n\n // 테이블의 td들을 수잡하여 저장해두고 스크립트로 반복하여 정리.\n let tableTrs = _elTarget.find(\"tr\");\n for (let ri = 0, rl = tableTrs.length; ri < rl; ri++) {\n let tableTrTds, trMaps;\n tableTrTds = tableTrs[ri].childNodes;\n trMaps = [];\n\n for (let ci = 0, cl = tableTrTds.length; ci < cl; ci++) {\n let tdObj = {\n \"$\": jQuery(tableTrTds[ci])\n };\n\n if (tdObj[\"$\"].attr(\"data-ax5grid-column-col\") != \"null\") {\n tdObj.dindex = tdObj[\"$\"].attr(\"data-ax5grid-data-index\");\n tdObj.tri = tdObj[\"$\"].attr(\"data-ax5grid-column-row\");\n tdObj.ci = tdObj[\"$\"].attr(\"data-ax5grid-column-col\");\n tdObj.rowIndex = tdObj[\"$\"].attr(\"data-ax5grid-column-rowIndex\");\n tdObj.colIndex = tdObj[\"$\"].attr(\"data-ax5grid-column-colIndex\");\n tdObj.rowspan = tdObj[\"$\"].attr(\"rowspan\");\n tdObj.text = tdObj[\"$\"].text();\n trMaps.push(tdObj);\n }\n\n tdObj = null;\n }\n tblRowMaps.push(trMaps);\n }\n\n // 두줄이상 일 때 의미가 있으니.\n if (tblRowMaps.length > 1) {\n hasMergeTd = false;\n for (let ri = 0, rl = tblRowMaps.length; ri < rl; ri++) {\n let prevTokenColIndexs = [];\n\n for (let ci = 0, cl = tblRowMaps[ri].length; ci < cl; ci++) {\n // 적용 하려는 컬럼에 editor 속성이 없다면 머지 대상입니다.\n\n if (!_colGroup[ci].editor && (() => {\n if (U.isArray(cfg.body.mergeCells)) {\n return ax5.util.search(cfg.body.mergeCells, _colGroup[ci].key) > -1;\n } else {\n return true;\n }\n })()) {\n\n // 앞줄과 값이 같다면.\n if (token[ci] && (() => {\n if (prevTokenColIndexs.length > 0) {\n let hasFalse = true;\n prevTokenColIndexs.forEach(function (ti) {\n if (tblRowMaps[ri - 1][ti].text != tblRowMaps[ri][ti].text) {\n hasFalse = false;\n }\n });\n return hasFalse;\n } else {\n return true;\n }\n })() && token[ci].text == tblRowMaps[ri][ci].text) {\n tblRowMaps[ri][ci].rowspan = 0;\n tblRowMaps[token[ci].ri][ci].rowspan++;\n hasMergeTd = true;\n } else {\n token[ci] = {\n ri: ri,\n ci: ci,\n text: tblRowMaps[ri][ci].text\n };\n }\n\n prevTokenColIndexs.push(ci);\n }\n }\n }\n\n // rowspan을 다 구했으면 적용합니다.\n if (hasMergeTd) {\n for (let ri = 0, rl = tblRowMaps.length; ri < rl; ri++) {\n for (let ci = 0, cl = tblRowMaps[ri].length; ci < cl; ci++) {\n if (tblRowMaps[ri][ci].rowspan == 0) {\n tblRowMaps[ri][ci][\"$\"].remove();\n } else if (tblRowMaps[ri][ci].rowspan > 1) {\n tblRowMaps[ri][ci][\"$\"]\n .attr(\"rowspan\", tblRowMaps[ri][ci].rowspan)\n .addClass(\"merged\");\n }\n }\n }\n }\n }\n };\n\n let scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n paintStartColumnIndex: paintStartColumnIndex,\n paintEndColumnIndex: paintEndColumnIndex,\n nopaintLeftColumnsWidth: nopaintLeftColumnsWidth,\n nopaintRightColumnsWidth: nopaintRightColumnsWidth,\n bodyTrHeight: this.xvar.bodyTrHeight,\n virtualScrollX: this.config.virtualScrollX,\n virtualScrollY: this.config.virtualScrollY,\n };\n let frozenScrollConfig = jQuery.extend({}, scrollConfig, {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex\n });\n\n // aside\n if (cfg.asidePanelWidth > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-aside-body\", this.asideColGroup, asideBodyRowData, asideBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n\n repaintBody.call(this, \"aside-body-scroll\", this.asideColGroup, asideBodyRowData, asideBodyGroupingData, list, scrollConfig);\n\n if (cfg.footSum) {\n // 바닥 요약 (footSum에 대한 aside 사용안함)\n repaintSum.call(this, \"bottom-aside-body\", this.asideColGroup, asideBodyRowData, null, this.list);\n }\n }\n\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n\n repaintBody.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, leftBodyGroupingData, list, scrollConfig);\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", this.leftHeaderColGroup, leftFootSumData, this.list);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n repaintBody.call(this, \"top-body-scroll\", headerColGroup, bodyRowData, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), frozenScrollConfig);\n }\n repaintBody.call(this, \"body-scroll\", headerColGroup, bodyRowData, bodyGroupingData, list, scrollConfig);\n\n // 바닥 요약\n if (cfg.footSum && this.needToPaintSum) {\n repaintSum.call(this, \"bottom-body-scroll\", headerColGroup, footSumData, this.list, scrollConfig);\n }\n // right\n if (cfg.rightSum) {\n // todo : right 표현 정리\n }\n\n /// mergeCells\n if (cfg.body.mergeCells && list.length) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) { // 상단 행고정\n // console.log(this.leftHeaderColGroup, leftBodyRowData);\n mergeCellsBody.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, list.slice(0, this.xvar.frozenRowIndex));\n }\n mergeCellsBody.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, list, scrollConfig);\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) { // 상단 행고정\n mergeCellsBody.call(this, \"top-body-scroll\", this.headerColGroup, bodyRowData, list.slice(0, this.xvar.frozenRowIndex));\n }\n mergeCellsBody.call(this, \"body-scroll\", this.headerColGroup, bodyRowData, list, scrollConfig);\n }\n\n this.xvar.virtualPaintStartRowIndex = virtualPaintStartRowIndex;\n this.xvar.paintStartRowIndex = paintStartRowIndex;\n this.xvar.paintRowCount = paintRowCount;\n this.xvar.virtualPaintRowCount = virtualPaintRowCount;\n this.xvar.paintStartColumnIndex = paintStartColumnIndex;\n this.xvar.paintEndColumnIndex = paintEndColumnIndex;\n this.xvar.nopaintLeftColumnsWidth = nopaintLeftColumnsWidth;\n this.xvar.nopaintRightColumnsWidth = nopaintRightColumnsWidth;\n this.xvar.dataRowCount = list.length;\n this.needToPaintSum = false;\n\n GRID.page.statusUpdate.call(this);\n };\n\n const repaintCell = function (_panelName, _dindex, _doindex, _rowIndex, _colIndex, _newValue) {\n let self = this,\n cfg = this.config,\n list = this.list;\n\n let updateCell = this.$[\"panel\"][_panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + _rowIndex + '\"][data-ax5grid-column-colindex=\"' + _colIndex + '\"]')\n .find('[data-ax5grid-cellholder]'),\n colGroup = this.colGroup,\n col = colGroup[_colIndex];\n\n updateCell.html(getFieldValue.call(this, list, list[_dindex], _dindex, col));\n\n if (col.editor && col.editor.updateWith) {\n col.editor.updateWith.forEach(function (updateColumnKey) {\n colGroup.forEach(function (col) {\n if (col.key == updateColumnKey) {\n let rowIndex = col.rowIndex, colIndex = col.colIndex,\n panelName = GRID.util.findPanelByColumnIndex.call(self, _dindex, colIndex, rowIndex).panelName,\n updateWithCell = self.$[\"panel\"][panelName]\n .find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + rowIndex + '\"][data-ax5grid-column-colindex=\"' + colIndex + '\"]')\n .find('[data-ax5grid-cellholder]');\n\n updateWithCell.html(getFieldValue.call(self, list, list[_dindex], _dindex, col));\n }\n });\n });\n }\n\n /// ~~~~~~\n\n let paintStartRowIndex = Math.floor(Math.abs(this.$.panel[\"body-scroll\"].position().top) / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex,\n headerColGroup = this.headerColGroup,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount = Math.ceil(this.$.panel[\"body\"].height() / this.xvar.bodyTrHeight) + 1,\n scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n bodyTrHeight: this.xvar.bodyTrHeight\n };\n\n if (this.xvar.nopaintLeftColumnsWidth || this.xvar.nopaintRightColumnsWidth) {\n headerColGroup = [].concat(headerColGroup).splice(this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex - this.xvar.paintStartColumnIndex + 1);\n if (cfg.body.grouping) {\n bodyGroupingData = GRID.util.getTableByStartEndColumnIndex(bodyGroupingData, this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex);\n }\n if (cfg.footSum) {\n footSumData = GRID.util.getTableByStartEndColumnIndex(footSumData, this.xvar.paintStartColumnIndex, this.xvar.paintEndColumnIndex);\n }\n }\n\n let repaintSum = function (_elTargetKey, _colGroup, _bodyRow, _list, _scrollConfig) {\n let _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n cgi, cgl, tri, trl, ci, cl, col, cellHeight, colAlign;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty().get(0).innerHTML = SS.join('');\n return true;\n };\n let replaceGroupTr = function (_elTargetKey, _colGroup, _groupRow, _list, _scrollConfig) {\n let _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n di, dl, tri, trl, ci, cl,\n col, cellHeight, colAlign;\n\n for (di = _scrollConfig.paintStartRowIndex, dl = (function () {\n let len;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n })(); di < dl; di++) {\n if (_list[di] && _groupRow && \"__isGrouping\" in _list[di]) {\n let rowTable = _groupRow;\n SS = [];\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getGroupingValue.call(this, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n }\n _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0).innerHTML = SS.join('');\n }\n }\n };\n\n // body.grouping tr 다시 그리기..\n if (cfg.body.grouping) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-left-body\", headerColGroup, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex,\n bodyTrHeight: this.xvar.bodyTrHeight\n });\n }\n replaceGroupTr.call(this, \"left-body-scroll\", headerColGroup, leftBodyGroupingData, list, scrollConfig);\n }\n\n // body\n if (this.xvar.frozenRowIndex > 0) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-body-scroll\", headerColGroup, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex), {\n paintStartRowIndex: 0,\n paintRowCount: this.xvar.frozenRowIndex,\n bodyTrHeight: this.xvar.bodyTrHeight\n });\n }\n\n replaceGroupTr.call(this, \"body-scroll\", headerColGroup, bodyGroupingData, list, scrollConfig);\n }\n\n if (this.xvar.frozenColumnIndex > 0) {\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", headerColGroup, leftFootSumData, list);\n }\n }\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-body-scroll\", headerColGroup, footSumData, list, scrollConfig);\n }\n };\n\n const repaintRow = function (_dindex) {\n let self = this,\n cfg = this.config,\n list = this.list;\n /// ~~~~~~\n\n let paintStartRowIndex = Math.floor(Math.abs(this.$.panel[\"body-scroll\"].position().top) / this.xvar.bodyTrHeight) + this.xvar.frozenRowIndex,\n asideBodyRowData = this.asideBodyRowData,\n leftBodyRowData = this.leftBodyRowData,\n bodyRowData = this.bodyRowData,\n leftFootSumData = this.leftFootSumData,\n footSumData = this.footSumData,\n asideBodyGroupingData = this.asideBodyGroupingData,\n leftBodyGroupingData = this.leftBodyGroupingData,\n bodyGroupingData = this.bodyGroupingData,\n bodyAlign = cfg.body.align,\n paintRowCount = Math.ceil(this.$.panel[\"body\"].height() / this.xvar.bodyTrHeight) + 1,\n scrollConfig = {\n paintStartRowIndex: paintStartRowIndex,\n paintRowCount: paintRowCount,\n bodyTrHeight: this.xvar.bodyTrHeight\n };\n\n let repaintSum = function (_elTargetKey, _colGroup, _bodyRow, _list) {\n let _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n cgi, cgl, tri, trl, ci, cl, col, cellHeight, colAlign;\n\n SS.push('');\n SS.push('');\n for (cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n var lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getSumFieldValue.call(this, _list, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n\n SS.push('
');\n\n _elTarget.empty().get(0).innerHTML = SS.join('');\n return true;\n };\n let replaceGroupTr = function (_elTargetKey, _colGroup, _groupRow, _list, _scrollConfig) {\n let _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n di, dl, tri, trl, ci, cl, col, cellHeight, colAlign;\n\n if (typeof _scrollConfig === \"undefined\" || typeof _scrollConfig['paintStartRowIndex'] === \"undefined\") {\n _scrollConfig = {\n paintStartRowIndex: 0,\n paintRowCount: _list.length\n };\n }\n\n for (di = _scrollConfig.paintStartRowIndex, dl = (function () {\n let len;\n len = _list.length;\n if (_scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex < len) {\n len = _scrollConfig.paintRowCount + _scrollConfig.paintStartRowIndex;\n }\n return len;\n })(); di < dl; di++) {\n if (_list[di] && _groupRow && \"__isGrouping\" in _list[di]) {\n let rowTable = _groupRow;\n SS = [];\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getGroupingValue.call(this, _list[di], di, col), ' ');\n\n SS.push(' ');\n }\n SS.push(' ');\n }\n _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0).innerHTML = SS.join('');\n }\n }\n };\n let replaceTr = function (_elTargetKey, _colGroup, _bodyRow, _list, di) {\n let _elTarget = this.$.panel[_elTargetKey],\n SS = [],\n tri, trl, ci, cl, col, cellHeight, colAlign, rowTable = _bodyRow,\n odi = (typeof _list[di].__origin_index__ !== \"undefined\") ? _list[di].__origin_index__ : di;\n\n let tr_element = _elTarget.find('tr[data-ax5grid-tr-data-index=\"' + di + '\"]').empty().get(0);\n if (tr_element) {\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n cellHeight = cfg.body.columnHeight * col.rowspan - cfg.body.columnBorderWidth;\n colAlign = col.align || bodyAlign;\n\n SS.push('');\n\n SS.push((function (_cellHeight) {\n let lineHeight = (cfg.body.columnHeight - cfg.body.columnPadding * 2 - cfg.body.columnBorderWidth);\n if (!col.multiLine) {\n _cellHeight = cfg.body.columnHeight - cfg.body.columnBorderWidth;\n }\n\n return '';\n\n })(cellHeight), getFieldValue.call(this, _list, _list[di], di, col), ' ');\n SS.push(' ');\n }\n SS.push(' ');\n }\n tr_element.innerHTML = SS.join('');\n }\n };\n\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceTr.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyRowData, list.slice(0, this.xvar.frozenRowIndex), _dindex);\n } else {\n replaceTr.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyRowData, list, _dindex);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceTr.call(this, \"top-body-scroll\", this.headerColGroup, bodyRowData, list.slice(0, this.xvar.frozenRowIndex), _dindex);\n } else {\n replaceTr.call(this, \"body-scroll\", this.headerColGroup, bodyRowData, list, _dindex);\n }\n\n // body.grouping tr 다시 그리기..\n if (cfg.body.grouping) {\n // left\n if (this.xvar.frozenColumnIndex > 0) {\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-left-body\", this.leftHeaderColGroup, leftBodyGroupingData, list.slice(0, this.xvar.frozenRowIndex));\n }\n else {\n replaceGroupTr.call(this, \"left-body-scroll\", this.leftHeaderColGroup, leftBodyGroupingData, list, scrollConfig);\n }\n }\n\n // body\n if (this.xvar.frozenRowIndex > _dindex) {\n // 상단 행고정\n replaceGroupTr.call(this, \"top-body-scroll\", this.headerColGroup, bodyGroupingData, list.slice(0, this.xvar.frozenRowIndex));\n }\n else {\n replaceGroupTr.call(this, \"body-scroll\", this.headerColGroup, bodyGroupingData, list, scrollConfig);\n }\n }\n\n if (this.xvar.frozenColumnIndex > 0) {\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-left-body\", this.leftHeaderColGroup, leftFootSumData, list);\n }\n }\n\n if (cfg.footSum && this.needToPaintSum) {\n // 바닥 요약\n repaintSum.call(this, \"bottom-body-scroll\", this.headerColGroup, footSumData, list, scrollConfig);\n }\n };\n\n const scrollTo = function (css, opts) {\n if (typeof opts === \"undefined\") opts = {timeoutUnUse: false};\n if (this.isInlineEditing) {\n for (var key in this.inlineEditing) {\n //if(this.inlineEditing[key].editor.type === \"select\") {}\n // 인라인 에디팅 인데 스크롤 이벤트가 발생하면 디액티브 처리\n GRID.body.inlineEdit.deActive.call(this, \"ESC\", key);\n }\n }\n\n if (this.config.asidePanelWidth > 0 && \"top\" in css) {\n this.$.panel[\"aside-body-scroll\"].css({top: css.top});\n }\n if (this.xvar.frozenColumnIndex > 0 && \"top\" in css) {\n this.$.panel[\"left-body-scroll\"].css({top: css.top});\n }\n if (this.xvar.frozenRowIndex > 0 && \"left\" in css) {\n this.$.panel[\"top-body-scroll\"].css({left: css.left});\n }\n\n this.$.panel[\"body-scroll\"].css(css);\n\n if (this.config.footSum && \"left\" in css) {\n this.$.panel[\"bottom-body-scroll\"].css({left: css.left});\n }\n\n // 바디 리페인팅 this.__throttledScroll 은 body init 에서 초기화\n if (this.__throttledScroll) {\n this.__throttledScroll(css, opts);\n } else {\n if (this.config.virtualScrollY && !opts.noRepaint && \"top\" in css) {\n repaint.call(this);\n } else if (this.config.virtualScrollX && !opts.noRepaint && \"left\" in css) {\n repaint.call(this);\n }\n if (opts.callback) {\n opts.callback();\n }\n }\n };\n\n const blur = function () {\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n if (this.isInlineEditing) {\n inlineEdit.deActive.call(this);\n }\n };\n\n const moveFocus = function (_position) {\n let focus = {\n \"UD\": function (_dy) {\n let moveResult = true,\n focusedColumn, originalColumn, while_i,\n nPanelInfo;\n\n for (let c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n\n if (!focusedColumn) return false;\n\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n if (_dy > 0) {\n // 아래로\n if (focusedColumn.rowIndex + (originalColumn.rowspan - 1) + _dy > this.bodyRowTable.rows.length - 1) {\n focusedColumn.dindex = focusedColumn.dindex + _dy;\n focusedColumn.doindex = focusedColumn.doindex + _dy;\n focusedColumn.rowIndex = 0;\n if (focusedColumn.dindex > this.list.length - 1) {\n focusedColumn.dindex = focusedColumn.doindex = this.list.length - 1;\n moveResult = false;\n }\n } else {\n focusedColumn.rowIndex = focusedColumn.rowIndex + _dy;\n }\n }\n else {\n // 위로\n if (focusedColumn.rowIndex + _dy < 0) {\n focusedColumn.dindex = focusedColumn.dindex + _dy;\n focusedColumn.doindex = focusedColumn.doindex + _dy;\n focusedColumn.rowIndex = this.bodyRowTable.rows.length - 1;\n if (focusedColumn.dindex < 0) {\n focusedColumn.dindex = focusedColumn.doindex = 0;\n moveResult = false;\n }\n } else {\n focusedColumn.rowIndex = focusedColumn.rowIndex + _dy;\n }\n }\n\n while_i = 0;\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n if (focusedColumn.rowIndex == 0 || while_i % 2 == ((_dy > 0) ? 0 : 1)) {\n focusedColumn.colIndex--;\n } else {\n focusedColumn.rowIndex--;\n }\n\n if (focusedColumn.rowIndex <= 0 && focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n while_i++;\n }\n\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n\n // if mergeCells\n if (this.config.body.mergeCells && this.list.length) {\n while (!this.$.panel[nPanelInfo.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').get(0)) {\n\n if (_dy > 0) {\n focusedColumn.dindex++;\n } else {\n focusedColumn.dindex--;\n }\n\n if (focusedColumn.dindex < 0 || focusedColumn.dindex > this.list.length - 1) {\n break;\n }\n }\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n }\n\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리.ㅊㅇ\n\n if (focusedColumn.dindex + 1 > this.xvar.frozenRowIndex) {\n if (focusedColumn.dindex <= this.xvar.virtualPaintStartRowIndex) {\n let newTop = (focusedColumn.dindex - this.xvar.frozenRowIndex - 1) * this.xvar.bodyTrHeight;\n if (newTop < 0) newTop = 0;\n scrollTo.call(this, {top: -newTop, timeoutUnUse: false});\n GRID.scroller.resize.call(this);\n }\n else if (focusedColumn.dindex + 1 > this.xvar.virtualPaintStartRowIndex + (this.xvar.virtualPaintRowCount - 2)) {\n scrollTo.call(this, {top: (this.xvar.virtualPaintRowCount - 2 - focusedColumn.dindex) * this.xvar.bodyTrHeight, timeoutUnUse: false});\n GRID.scroller.resize.call(this);\n }\n }\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n this.$.panel[focusedColumn.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]')\n .attr('data-ax5grid-column-focused', \"true\");\n\n return moveResult;\n },\n \"LR\": function (_dx) {\n let moveResult = true,\n focusedColumn, originalColumn,\n while_i = 0, isScrollPanel = false, containerPanelName = \"\", nPanelInfo;\n\n for (var c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (!focusedColumn) return false;\n\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n if (_dx < 0) {\n focusedColumn.colIndex = focusedColumn.colIndex + _dx;\n if (focusedColumn.colIndex < 0) {\n focusedColumn.colIndex = 0;\n moveResult = false;\n }\n }\n else {\n focusedColumn.colIndex = focusedColumn.colIndex + _dx;\n if (focusedColumn.colIndex > this.colGroup.length - 1) {\n focusedColumn.colIndex = this.colGroup.length - 1;\n moveResult = false;\n }\n }\n\n if (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.rowIndex = 0;\n }\n\n if (this.list[focusedColumn.dindex] && this.list[focusedColumn.dindex].__isGrouping) {\n if (_dx < 0) {\n while (typeof this.bodyGroupingMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex--;\n if (focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n }\n } else {\n while (typeof this.bodyGroupingMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex++;\n if (focusedColumn.colIndex >= this.colGroup.length) {\n // find fail\n moveResult = false;\n break;\n }\n }\n }\n }\n else {\n if (_dx < 0) {\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex--;\n if (focusedColumn.colIndex <= 0) {\n // find fail\n moveResult = false;\n break;\n }\n }\n } else {\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n focusedColumn.colIndex++;\n if (focusedColumn.colIndex >= this.colGroup.length) {\n // find fail\n moveResult = false;\n break;\n }\n }\n }\n }\n\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n\n // if mergeCells\n if (this.config.body.mergeCells && this.list.length && focusedColumn.dindex > 1) {\n while (!this.$.panel[nPanelInfo.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]').get(0)) {\n\n focusedColumn.dindex--;\n\n if (focusedColumn.dindex < 0 || focusedColumn.dindex > this.list.length - 1) {\n break;\n }\n }\n nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n }\n\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리\n let isScrollTo = (function () {\n if (!this.config.virtualScrollX) return false;\n let scrollLeft = 0;\n if (focusedColumn.colIndex + 1 > this.xvar.frozenColumnIndex) {\n if (focusedColumn.colIndex <= this.xvar.paintStartColumnIndex && this.colGroup[focusedColumn.colIndex]) {\n scrollLeft = -this.colGroup[Number(focusedColumn.colIndex)]._sx;\n scrollTo.call(this, {left: scrollLeft});\n GRID.header.scrollTo.call(this, {left: scrollLeft});\n GRID.scroller.resize.call(this);\n return true;\n }\n else if (focusedColumn.colIndex >= this.xvar.paintEndColumnIndex && this.colGroup[Number(focusedColumn.colIndex)]) {\n if (this.colGroup[Number(focusedColumn.colIndex)]._ex > this.xvar.bodyWidth) {\n scrollLeft = (this.colGroup[Number(focusedColumn.colIndex)]._ex - this.xvar.bodyWidth);\n scrollTo.call(this, {left: -scrollLeft});\n GRID.header.scrollTo.call(this, {left: -scrollLeft});\n GRID.scroller.resize.call(this);\n }\n return true;\n }\n }\n scrollLeft = null;\n return false;\n }).call(this);\n\n containerPanelName = nPanelInfo.containerPanelName;\n isScrollPanel = nPanelInfo.isScrollPanel;\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n\n var $column = this.$.panel[focusedColumn.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]')\n .attr('data-ax5grid-column-focused', \"true\");\n\n if (!isScrollTo && $column && isScrollPanel) {// 스크롤 패널 이라면~\n // todo : 컬럼이동할 때에도 scrollTo 체크\n var newLeft = (function () {\n if ($column.position().left + $column.outerWidth() > Math.abs(this.$.panel[focusedColumn.panelName].position().left) + this.$.panel[containerPanelName].width()) {\n return $column.position().left + $column.outerWidth() - this.$.panel[containerPanelName].width();\n } else if (Math.abs(this.$.panel[focusedColumn.panelName].position().left) > $column.position().left) {\n return $column.position().left;\n } else {\n return;\n }\n }).call(this);\n\n if (typeof newLeft !== \"undefined\") {\n GRID.header.scrollTo.call(this, {left: -newLeft});\n scrollTo.call(this, {left: -newLeft});\n GRID.scroller.resize.call(this);\n }\n }\n\n return moveResult;\n },\n \"INDEX\": function (_dindex) {\n let moveResult = true,\n focusedColumn, originalColumn,\n while_i;\n\n for (let c in this.focusedColumn) {\n focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n break;\n }\n if (!focusedColumn) {\n focusedColumn = {\n rowIndex: 0,\n colIndex: 0\n }\n }\n originalColumn = this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex];\n\n columnSelect.focusClear.call(this);\n columnSelect.clear.call(this);\n\n\n if (_dindex == \"end\") {\n _dindex = this.list.length - 1;\n }\n\n focusedColumn.dindex = _dindex;\n focusedColumn.rowIndex = 0;\n\n while_i = 0;\n while (typeof this.bodyRowMap[focusedColumn.rowIndex + \"_\" + focusedColumn.colIndex] === \"undefined\") {\n if (focusedColumn.rowIndex == 0 || while_i % 2 == ((_dy > 0) ? 0 : 1)) {\n focusedColumn.colIndex--;\n } else {\n focusedColumn.rowIndex--;\n }\n\n if (focusedColumn.rowIndex <= 0 && focusedColumn.colIndex <= 0) {\n // find fail\n break;\n }\n while_i++;\n }\n\n let nPanelInfo = GRID.util.findPanelByColumnIndex.call(this, focusedColumn.dindex, focusedColumn.colIndex);\n focusedColumn.panelName = nPanelInfo.panelName;\n\n // 포커스 컬럼의 위치에 따라 스크롤 처리.\n {\n if (focusedColumn.dindex + 1 > this.xvar.frozenRowIndex) {\n let virtualPaintStartRowIndex = this.xvar.virtualPaintStartRowIndex || 0;\n\n if (focusedColumn.dindex < virtualPaintStartRowIndex) {\n scrollTo.call(this, {top: -(focusedColumn.dindex - this.xvar.frozenRowIndex) * this.xvar.bodyTrHeight});\n GRID.scroller.resize.call(this);\n }\n else if (focusedColumn.dindex + 1 > virtualPaintStartRowIndex + (this.xvar.virtualPaintRowCount - 2)) {\n //debugger;\n //console.log((focusedColumn.dindex - this.xvar.frozenRowIndex - this.xvar.virtualPaintRowCount + 3));\n let scrollTopValue = (!this.config.virtualScrollY) ? focusedColumn.dindex - this.xvar.frozenRowIndex : (focusedColumn.dindex - this.xvar.frozenRowIndex - this.xvar.virtualPaintRowCount + 3);\n scrollTo.call(this, {top: -scrollTopValue * this.xvar.bodyTrHeight});\n GRID.scroller.resize.call(this);\n }\n }\n }\n\n this.focusedColumn[focusedColumn.dindex + \"_\" + focusedColumn.colIndex + \"_\" + focusedColumn.rowIndex] = focusedColumn;\n this.$.panel[focusedColumn.panelName]\n .find('[data-ax5grid-tr-data-index=\"' + focusedColumn.dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + focusedColumn.rowIndex + '\"][data-ax5grid-column-colindex=\"' + focusedColumn.colIndex + '\"]')\n .attr('data-ax5grid-column-focused', \"true\");\n\n return moveResult;\n }\n };\n\n let processor = {\n \"UP\": function () {\n return focus[\"UD\"].call(this, -1);\n },\n \"DOWN\": function () {\n return focus[\"UD\"].call(this, 1);\n },\n \"LEFT\": function () {\n return focus[\"LR\"].call(this, -1);\n },\n \"RIGHT\": function () {\n return focus[\"LR\"].call(this, 1);\n },\n \"HOME\": function () {\n return focus[\"INDEX\"].call(this, 0);\n },\n \"END\": function () {\n return focus[\"INDEX\"].call(this, \"end\");\n },\n \"position\": function (_position) {\n return focus[\"INDEX\"].call(this, _position);\n }\n };\n\n if (_position in processor) {\n return processor[_position].call(this);\n } else {\n return processor[\"position\"].call(this, _position);\n }\n };\n\n const inlineEdit = {\n active(_focusedColumn, _e, _initValue) {\n let self = this,\n dindex, doindex, colIndex, rowIndex, panelName, colspan,\n col, editor;\n\n for (var key in _focusedColumn) {\n panelName = _focusedColumn[key].panelName;\n dindex = _focusedColumn[key].dindex;\n doindex = _focusedColumn[key].doindex;\n colIndex = _focusedColumn[key].colIndex;\n rowIndex = _focusedColumn[key].rowIndex;\n colspan = _focusedColumn[key].colspan;\n\n // 인라인 에디팅을 멈춰야 하는 경우 조건\n col = this.colGroup[colIndex];\n if (!(editor = col.editor)) return this;\n\n // editor disabled 체크\n if (U.isFunction(editor.disabled)) {\n if (editor.disabled.call({\n list: this.list,\n dindex: dindex,\n item: this.list[dindex],\n key: col.key,\n value: _initValue\n })) {\n return this;\n }\n }\n\n // 조건에 맞지 않는 에디팅 타입이면 반응 없음.\n if (!(function (_editor, _type) {\n if (_editor.type in GRID.inlineEditor) {\n return (GRID.inlineEditor[_editor.type].editMode == \"popup\");\n }\n })(editor)) {\n // 체크 박스 타입이면 값 변경 시도\n if (editor.type == \"checkbox\") {\n let checked, newValue;\n if (editor.config && editor.config.trueValue) {\n if (checked = !(_initValue == editor.config.trueValue)) {\n newValue = editor.config.trueValue;\n } else {\n newValue = editor.config.falseValue;\n }\n } else {\n newValue = checked = (_initValue == false || _initValue == \"false\" || _initValue < \"1\") ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(self, dindex, doindex, col.key, newValue);\n updateRowState.call(self, [\"cellChecked\"], dindex, doindex, {\n key: col.key, rowIndex: rowIndex, colIndex: colIndex,\n editorConfig: col.editor.config, checked: checked\n });\n }\n return this;\n }\n\n if (this.list[dindex].__isGrouping) {\n return false;\n }\n if (key in this.inlineEditing) {\n return false;\n }\n\n this.inlineEditing[key] = {\n editor: editor,\n panelName: panelName,\n columnKey: key,\n column: _focusedColumn[key],\n useReturnToSave: GRID.inlineEditor[editor.type].useReturnToSave\n };\n this.isInlineEditing = true;\n }\n if (this.isInlineEditing) {\n\n let originalValue = GRID.data.getValue.call(self, dindex, doindex, col.key),\n initValue = (function (__value, __editor) {\n if (U.isNothing(__value)) {\n __value = U.isNothing(originalValue) ? \"\" : originalValue;\n }\n\n if (__editor.type == \"money\") {\n return U.number(__value, {\"money\": true});\n }\n else {\n return __value;\n }\n }).call(this, _initValue, editor);\n\n this.inlineEditing[key].$inlineEditorCell = this.$[\"panel\"][panelName]\n .find('[data-ax5grid-tr-data-index=\"' + dindex + '\"]')\n .find('[data-ax5grid-column-rowindex=\"' + rowIndex + '\"][data-ax5grid-column-colindex=\"' + colIndex + '\"]')\n .find('[data-ax5grid-cellholder]');\n\n this.inlineEditing[key].$inlineEditor = GRID.inlineEditor[editor.type].init(this, key, editor, this.inlineEditing[key].$inlineEditorCell, initValue);\n\n return true;\n }\n },\n deActive(_msg, _key, _value) {\n // console.log(this.inlineEditing.column.dindex, this.inlineEditing.$inlineEditor.val());\n if (!this.inlineEditing[_key]) return this;\n\n let panelName = this.inlineEditing[_key].panelName,\n dindex = this.inlineEditing[_key].column.dindex,\n doindex = this.inlineEditing[_key].column.doindex,\n rowIndex = this.inlineEditing[_key].column.rowIndex,\n colIndex = this.inlineEditing[_key].column.colIndex,\n column = this.bodyRowMap[this.inlineEditing[_key].column.rowIndex + \"_\" + this.inlineEditing[_key].column.colIndex],\n editorValue = (function ($inlineEditor) {\n if (typeof _value === \"undefined\") {\n if ($inlineEditor.get(0).tagName == \"SELECT\" || $inlineEditor.get(0).tagName == \"INPUT\" || $inlineEditor.get(0).tagName == \"TEXTAREA\") {\n return $inlineEditor.val();\n } else {\n _msg = \"CANCEL\";\n return false;\n }\n } else {\n return _value;\n }\n })(this.inlineEditing[_key].$inlineEditor),\n newValue = (function (__value, __editor) {\n if (__editor.type == \"money\") {\n return U.number(__value);\n }\n else {\n return __value;\n }\n }).call(this, editorValue, column.editor);\n\n let action = {\n \"CANCEL\"(_dindex, _column, _newValue) {\n action[\"__clear\"].call(this);\n },\n \"RETURN\"(_dindex, _doindex, _column, _newValue) {\n if (GRID.data.setValue.call(this, _dindex, _doindex, _column.key, _newValue)) {\n action[\"__clear\"].call(this);\n GRID.body.repaintCell.call(this, panelName, _dindex, _doindex, rowIndex, colIndex, _newValue);\n } else {\n action[\"__clear\"].call(this);\n }\n },\n \"__clear\"() {\n this.isInlineEditing = false;\n\n if (this.inlineEditing[_key] && this.inlineEditing[_key].$inlineEditor) {\n let bindedAx5ui = this.inlineEditing[_key].$inlineEditor.data(\"binded-ax5ui\");\n if (bindedAx5ui == \"ax5picker\") {\n this.inlineEditing[_key].$inlineEditor.ax5picker(\"close\");\n } else if (bindedAx5ui == \"ax5select\") {\n this.inlineEditing[_key].$inlineEditor.ax5select(\"close\");\n }\n this.inlineEditing[_key].$inlineEditor.remove();\n this.inlineEditing[_key].$inlineEditor = null;\n this.inlineEditing[_key].$inlineEditorCell = null;\n }\n\n this.inlineEditing[_key] = undefined;\n delete this.inlineEditing[_key]; // delete 지원안하는 브라우저 테스트..\n }\n };\n\n if (_msg in action) {\n action[_msg || \"RETURN\"].call(this, dindex, doindex, column, newValue);\n } else {\n action[\"__clear\"].call(this);\n }\n },\n keydown(key, columnKey, _options) {\n let processor = {\n \"ESC\"() {\n for (var columnKey in this.inlineEditing) {\n inlineEdit.deActive.call(this, \"CANCEL\", columnKey);\n }\n },\n \"RETURN\"() {\n if (this.isInlineEditing) {\n if (this.inlineEditing[columnKey] && this.inlineEditing[columnKey].useReturnToSave) { // todo : 네이밍 검증 할 필요있음.\n inlineEdit.deActive.call(this, \"RETURN\", columnKey);\n } else {\n return false;\n }\n } else {\n\n for (var k in this.focusedColumn) {\n let _column = this.focusedColumn[k],\n column = this.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex],\n dindex = _column.dindex,\n doindex = _column.doindex,\n value = \"\",\n col = this.colGroup[_column.colIndex];\n\n if (column) {\n if (!this.list[dindex].__isGrouping) {\n value = GRID.data.getValue.call(this, dindex, doindex, column.key);\n }\n }\n\n if (col.editor && GRID.inlineEditor[col.editor.type].editMode === \"inline\") {\n if (_options && _options.moveFocus) {\n\n }\n else {\n if (column.editor && column.editor.type == \"checkbox\") {\n value = GRID.data.getValue.call(this, dindex, doindex, column.key);\n\n let checked, newValue;\n if (column.editor.config && column.editor.config.trueValue) {\n // console.log(value, column.editor.config.trueValue);\n\n if (value != column.editor.config.trueValue) {\n newValue = column.editor.config.trueValue;\n checked = true;\n } else {\n newValue = column.editor.config.falseValue;\n checked = false;\n }\n } else {\n newValue = checked = (value == false || value == \"false\" || value < \"1\") ? \"true\" : \"false\";\n }\n\n GRID.data.setValue.call(this, dindex, doindex, column.key, newValue);\n updateRowState.call(this, [\"cellChecked\"], dindex, doindex, {\n key: column.key, rowIndex: _column.rowIndex, colIndex: _column.colIndex,\n editorConfig: column.editor.config, checked: checked\n });\n }\n }\n } else {\n GRID.body.inlineEdit.active.call(this, this.focusedColumn, null, value);\n }\n }\n }\n return true;\n }\n };\n\n if (key in processor) {\n processor[key].call(this, key, columnKey, _options);\n }\n }\n };\n\n const getExcelString = function () {\n let cfg = this.config,\n list = this.list,\n bodyRowData = this.bodyRowTable,\n footSumData = this.footSumTable,\n bodyGroupingData = this.bodyGroupingTable;\n\n // body-scroll 의 포지션에 의존적이므로..\n let getBody = function (_colGroup, _bodyRow, _groupRow, _list) {\n let SS = [],\n di, dl,\n tri, trl,\n ci, cl,\n col, val;\n\n //SS.push('');\n for (di = 0, dl = _list.length; di < dl; di++) {\n let isGroupingRow = false, rowTable;\n\n if (_groupRow && \"__isGrouping\" in _list[di]) {\n rowTable = _groupRow;\n isGroupingRow = true;\n } else {\n rowTable = _bodyRow;\n }\n\n for (tri = 0, trl = rowTable.rows.length; tri < trl; tri++) {\n SS.push('\\n');\n for (ci = 0, cl = rowTable.rows[tri].cols.length; ci < cl; ci++) {\n col = rowTable.rows[tri].cols[ci];\n SS.push('', ((isGroupingRow ? getGroupingValue.call(this, _list[di], di, col) : getFieldValue.call(this, _list, _list[di], di, col, val, \"text\")) || ' '), ' ');\n }\n SS.push('\\n ');\n }\n }\n //SS.push('
');\n return SS.join('');\n };\n let getSum = function (_colGroup, _bodyRow, _list) {\n let SS = [],\n tri, trl,\n ci, cl,\n col;\n\n //SS.push('');\n for (tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('\\n');\n for (ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n col = _bodyRow.rows[tri].cols[ci];\n SS.push('', getSumFieldValue.call(this, _list, col), ' ');\n }\n SS.push('\\n ');\n }\n //SS.push('
');\n\n return SS.join('');\n };\n\n let po = [];\n po.push(getBody.call(this, this.headerColGroup, bodyRowData, bodyGroupingData, list));\n if (cfg.footSum) {\n // 바닥 요약\n po.push(getSum.call(this, this.headerColGroup, footSumData, list));\n }\n\n // right\n if (cfg.rightSum) {\n // todo : right 표현 정리\n }\n\n return po.join('');\n };\n\n const toggleCollapse = function (_dindex, _doindex, _collapse) {\n if (GRID.data.toggleCollapse.call(this, _dindex, _doindex, _collapse)) {\n this.proxyList = GRID.data.getProxyList.call(this, this.list);\n this.align();\n }\n };\n\n // todo : tree에서 dindex만으로 구현 했을 때 오류 발생 해결. (_doindex 이용)\n const click = function (_dindex, _doindex) {\n let that = {\n self: this,\n page: this.page,\n list: this.list,\n item: this.list[_dindex],\n dindex: _dindex\n };\n\n moveFocus.call(this, _dindex);\n if (this.config.body.onClick) {\n this.config.body.onClick.call(that);\n }\n\n that = null;\n // console.log(this.$[\"panel\"][\"body-scroll\"].find('[data-ax5grid-tr-data-index=\"' + _dindex + '\"]>td:first-child'));\n };\n\n const dblClick = function (_dindex, _doindex) {\n let that = {\n self: this,\n page: this.page,\n list: this.list,\n item: this.list[_dindex],\n dindex: _dindex\n };\n\n moveFocus.call(this, _dindex);\n\n if (this.config.body.onDBLClick) {\n this.config.body.onDBLClick.call(that);\n }\n\n that = null;\n };\n\n\n GRID.body = {\n init: init,\n repaint: repaint,\n repaintCell: repaintCell,\n repaintRow: repaintRow,\n updateRowState: updateRowState,\n updateRowStateAll: updateRowStateAll,\n scrollTo: scrollTo,\n blur: blur,\n moveFocus: moveFocus,\n inlineEdit: inlineEdit,\n getExcelString: getExcelString,\n toggleCollapse: toggleCollapse,\n click: click,\n dblClick: dblClick\n };\n})();","// ax5.ui.grid.collector\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n let sum = function () {\n let value = 0,\n i = this.list.length;\n while (i--) {\n if (!(\"__groupingList\" in this.list[i])) {\n value += U.number(this.list[i][this.key]);\n }\n }\n return value;\n };\n\n let avg = function () {\n let value = 0,\n i = this.list.length, listLength = 0;\n while (i--) {\n if (!(\"__groupingList\" in this.list[i])) {\n value += U.number(this.list[i][this.key]);\n listLength++;\n }\n }\n return U.number(value / (listLength || 1), {\"round\": 2});\n };\n\n GRID.collector = {\n sum: sum,\n avg: avg\n };\n\n})();","// ax5.ui.grid.layout\n(function () {\n\n let GRID = ax5.ui.grid,\n U = ax5.util;\n\n const init = function () {\n\n };\n\n const clearGroupingData = function (_list) {\n let i = 0, l = _list.length, returnList = [];\n for (; i < l; i++) {\n if (_list[i] && !_list[i][\"__isGrouping\"]) {\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n returnList.push(jQuery.extend({}, _list[i]));\n }\n }\n return returnList;\n };\n\n const initData = function (_list) {\n this.selectedDataIndexs = [];\n // this.deletedList = [];\n // todo : deletedList 초기화 시점이 언제로 하는게 좋은가. set 메소드에서 초기화 하는 것으로 수정\n\n let i = 0, l = _list.length,\n returnList = [],\n appendIndex = 0,\n dataRealRowCount = 0,\n lineNumber = 0;\n\n if (this.config.body.grouping) {\n\n let groupingKeys = U.map(this.bodyGrouping.by, function () {\n return {\n key: this,\n compareString: \"\",\n grouping: false,\n list: []\n }\n });\n\n let gi = 0, gl = groupingKeys.length, compareString, appendRow = [], ari;\n for (; i < l + 1; i++) {\n gi = 0;\n\n if (_list[i] && _list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n }\n else {\n compareString = \"\"; // 그룹핑 구문검사용\n appendRow = []; // 현재줄 앞에 추가해줘야 하는 줄\n\n // 그룹핑 구문검사\n for (; gi < gl; gi++) {\n if (_list[i]) {\n compareString += \"$|$\" + _list[i][groupingKeys[gi].key];\n }\n\n if (appendIndex > 0 && compareString != groupingKeys[gi].compareString) {\n let appendRowItem = {keys: [], labels: [], list: groupingKeys[gi].list};\n for (let ki = 0; ki < gi + 1; ki++) {\n appendRowItem.keys.push(groupingKeys[ki].key);\n appendRowItem.labels.push(_list[i - 1][groupingKeys[ki].key]);\n }\n appendRow.push(appendRowItem);\n groupingKeys[gi].list = [];\n }\n\n groupingKeys[gi].list.push(_list[i]);\n groupingKeys[gi].compareString = compareString;\n }\n\n // 새로 추가해야할 그룹핑 row\n ari = appendRow.length;\n while (ari--) {\n returnList.push({__isGrouping: true, __groupingList: appendRow[ari].list, __groupingBy: {keys: appendRow[ari].keys, labels: appendRow[ari].labels}});\n }\n //~ 그룹핑 구문 검사 완료\n\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n // 그룹핑이 적용된 경우 오리지널 인덱스 의미 없음 : 정렬보다 그룹핑이 더 중요하므로.\n _list[i][\"__original_index\"] = _list[i][\"__index\"] = lineNumber;\n returnList.push(_list[i]);\n\n dataRealRowCount++;\n appendIndex++;\n lineNumber++;\n }\n }\n }\n }\n else {\n for (; i < l; i++) {\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n } else {\n\n if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n\n // __original_index 인덱스 키가 없다면 추가.\n if(typeof _list[i][\"__original_index\"] === \"undefined\"){\n _list[i][\"__original_index\"] = lineNumber;\n }\n _list[i][\"__index\"] = lineNumber;\n dataRealRowCount++;\n lineNumber++;\n returnList.push(_list[i]);\n }\n }\n }\n }\n\n // 원본 데이터의 갯수\n // grouping은 제외하고 수집됨.\n this.xvar.dataRealRowCount = dataRealRowCount;\n return returnList;\n };\n\n const arrangeData4tree = function (_list) {\n this.selectedDataIndexs = [];\n this.deletedList = [];\n let i = 0, seq = 0,\n appendIndex = 0,\n dataRealRowCount = 0,\n lineNumber = 0;\n\n let li = _list.length;\n let keys = this.config.tree.columnKeys;\n let hashDigit = this.config.tree.hashDigit;\n let listIndexMap = {};\n\n while (li--) {\n delete _list[li][keys.parentHash];\n delete _list[li][keys.selfHash];\n //delete _list[li][keys.childrenLength];\n }\n\n /// 루트 아이템 수집\n i = 0;\n seq = 0;\n li = _list.length;\n for (; i < li; i++) {\n if (_list[i]) {\n listIndexMap[_list[i][keys.selfKey]] = i; // 인덱싱\n\n if (U.isNothing(_list[i][keys.parentKey]) || _list[i][keys.parentKey] === \"top\") { // 최상위 아이템인 경우\n _list[i][keys.parentKey] = \"top\";\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = U.setDigit(\"0\", hashDigit);\n _list[i][keys.selfHash] = U.setDigit(\"0\", hashDigit) + \".\" + U.setDigit(seq, hashDigit);\n _list[i][keys.depth] = 0;\n _list[i][keys.hidden] = false;\n\n seq++;\n }\n }\n }\n\n /// 자식 아이템 수집\n i = 0;\n lineNumber = 0;\n for (; i < li; i++) {\n let _parent, _parentHash;\n if (_list[i] && _list[i][keys.parentKey] !== \"top\" && typeof _list[i][keys.parentHash] === \"undefined\") {\n\n if (_parent = _list[listIndexMap[_list[i][keys.parentKey]]]) {\n _parentHash = _parent[keys.selfHash];\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = _parentHash;\n _list[i][keys.selfHash] = _parentHash + \".\" + U.setDigit(_parent[keys.children].length, hashDigit);\n _list[i][keys.depth] = _parent[keys.depth] + 1;\n if (_parent[keys.collapse] || _parent[keys.hidden]) _list[i][keys.hidden] = true;\n _parent[keys.children].push(_list[i][keys.selfKey]);\n } else {\n _list[i][keys.parentKey] = \"top\";\n _list[i][keys.children] = [];\n _list[i][keys.parentHash] = U.setDigit(\"0\", hashDigit);\n _list[i][keys.selfHash] = U.setDigit(\"0\", hashDigit) + \".\" + U.setDigit(seq, hashDigit);\n _list[i][keys.hidden] = false;\n\n seq++;\n }\n }\n\n if (_list[i]) {\n if (_list[i][this.config.columnKeys.deleted]) {\n this.deletedList.push(_list[i]);\n _list[i][keys.hidden] = true;\n }\n else if (_list[i][this.config.columnKeys.selected]) {\n this.selectedDataIndexs.push(i);\n }\n\n _list[i][\"__index\"] = lineNumber;\n dataRealRowCount++;\n lineNumber++;\n }\n }\n\n this.listIndexMap = listIndexMap;\n this.xvar.dataRealRowCount = dataRealRowCount;\n\n return _list;\n };\n\n const getProxyList = function (_list) {\n let i = 0, l = _list.length, returnList = [];\n for (; i < l; i++) {\n\n if (_list[i] && !_list[i][this.config.tree.columnKeys.hidden]) {\n _list[i].__origin_index__ = i;\n returnList.push(_list[i]);\n }\n }\n return returnList;\n };\n\n const set = function (data) {\n\n let list;\n if (U.isArray(data)) {\n this.page = null;\n list = data;\n } else if (\"page\" in data) {\n this.page = jQuery.extend({}, data.page);\n list = data.list;\n }\n\n // console.log(this.list.length);\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n } else {\n this.proxyList = null;\n this.list = initData.call(this,\n (!this.config.remoteSort && Object.keys(this.sortInfo).length) ? sort.call(this, this.sortInfo, list) : list\n );\n }\n this.selectedDataIndexs = [];\n this.deletedList = [];\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n\n if (this.config.body.grouping) {\n\n }\n return this;\n };\n\n const get = function (_type) {\n return {\n list: this.list,\n page: this.page\n };\n };\n\n const getList = function (_type) {\n let returnList = [];\n //let list = (this.proxyList) ? this.proxyList : this.list;\n let list = this.list;\n let i = 0, l = list.length;\n switch (_type) {\n case \"modified\":\n for (; i < l; i++) {\n if (list[i] && !list[i][\"__isGrouping\"] && list[i][this.config.columnKeys.modified]) {\n returnList.push(jQuery.extend({}, list[i]));\n }\n }\n break;\n case \"selected\":\n for (; i < l; i++) {\n if (list[i] && !list[i][\"__isGrouping\"] && list[i][this.config.columnKeys.selected]) {\n returnList.push(jQuery.extend({}, list[i]));\n }\n }\n break;\n case \"deleted\":\n //_list = GRID.data.clearGroupingData(this.list);\n returnList = [].concat(this.deletedList);\n break;\n default:\n returnList = GRID.data.clearGroupingData.call(this, list);\n }\n return returnList;\n };\n\n const add = function (_row, _dindex, _options) {\n let list = (this.config.body.grouping) ? clearGroupingData.call(this, this.list) : this.list;\n let processor = {\n \"first\"() {\n list = [].concat(_row).concat(list);\n },\n \"last\"() {\n list = list.concat([].concat(_row));\n }\n };\n\n if (this.config.tree.use) {\n let list = this.list.concat([].concat(_row));\n\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n }\n else {\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n if (_dindex in processor) {\n _row[this.config.columnKeys.modified] = true;\n processor[_dindex].call(this, _row);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n if (U.isArray(_row)) {\n for (let _i = 0, _l = _row.length; _i < _l; _i++) {\n list.splice(_dindex + _i, 0, _row[_i]);\n }\n } else {\n list.splice(_dindex, 0, _row);\n }\n }\n\n if (this.config.body.grouping) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n }\n else if (_options && _options.sort && Object.keys(this.sortInfo).length) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n }\n else {\n list = initData.call(this, list);\n }\n\n this.list = list;\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n /**\n * list에서 완전 제거 하는 경우 사용.\n * ax5grid.data.remove\n */\n const remove = function (_dindex) {\n let list = (this.config.body.grouping) ? clearGroupingData.call(this, this.list) : this.list;\n let processor = {\n \"first\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, 0);\n } else {\n list.splice(0, 1);\n }\n },\n \"last\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, list.length - 1);\n } else {\n list.splice(list.length - 1, 1);\n }\n },\n \"index\": function (_dindex) {\n if (this.config.tree.use) {\n processor.tree.call(this, _dindex);\n } else {\n list.splice(_dindex, 1);\n }\n },\n \"selected\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, \"selected\");\n } else {\n let __list = [], i, l;\n\n for (i = 0, l = list.length; i < l; i++) {\n if (!list[i][this.config.columnKeys.selected]) {\n __list.push(list[i]);\n }\n }\n list = __list;\n __list = null;\n i = null;\n }\n },\n \"tree\": function (_dindex) {\n let treeKeys = this.config.tree.columnKeys, selfHash = list[_dindex][this.config.tree.columnKeys.selfHash];\n list = U.filter(list, function () {\n return this[treeKeys.selfHash].substr(0, selfHash.length) != selfHash;\n });\n treeKeys = null;\n selfHash = null;\n },\n };\n\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n if (_dindex in processor) {\n processor[_dindex].call(this, _dindex);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n processor[\"index\"].call(this, _dindex);\n }\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n }\n else {\n if (this.config.body.grouping) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n } else if (Object.keys(this.sortInfo).length) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n } else {\n list = initData.call(this, list);\n }\n this.list = list;\n }\n\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n\n /**\n * list에서 deleted 처리 repaint\n * ax5grid.data.deleteRow\n */\n const deleteRow = function (_dindex) {\n let list = (this.config.body.grouping) ? clearGroupingData.call(this, this.list) : this.list;\n let processor = {\n \"first\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, 0);\n } else {\n list[0][this.config.columnKeys.deleted] = true;\n }\n },\n \"last\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, list.length - 1);\n } else {\n list[list.length - 1][this.config.columnKeys.deleted] = true;\n }\n },\n \"selected\": function () {\n if (this.config.tree.use) {\n processor.tree.call(this, \"selected\");\n } else {\n let i = list.length;\n while (i--) {\n if (list[i][this.config.columnKeys.selected]) {\n list[i][this.config.columnKeys.deleted] = true;\n }\n }\n i = null;\n }\n },\n \"tree\": function (_dindex) {\n let keys = this.config.columnKeys,\n treeKeys = this.config.tree.columnKeys;\n\n if (_dindex === \"selected\") {\n\n let i = list.length;\n while (i--) {\n if (list[i][this.config.columnKeys.selected]) {\n list[i][this.config.columnKeys.deleted] = true;\n\n let selfHash = list[i][treeKeys.selfHash];\n let ii = list.length;\n\n while (ii--) {\n if (list[ii][treeKeys.selfHash].substr(0, selfHash.length) === selfHash) {\n list[ii][keys.deleted] = true;\n }\n }\n\n selfHash = null;\n ii = null;\n }\n }\n i = null;\n\n } else {\n let selfHash = list[_dindex][treeKeys.selfHash];\n let i = list.length;\n while (i--) {\n if (list[i][treeKeys.selfHash].substr(0, selfHash.length) !== selfHash) {\n list[i][keys.deleted] = true;\n }\n }\n selfHash = null;\n i = null;\n }\n\n keys = null;\n treeKeys = null;\n },\n };\n\n if (typeof _dindex === \"undefined\") _dindex = \"last\";\n\n if (_dindex in processor) {\n processor[_dindex].call(this, _dindex);\n } else {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n list[_dindex][this.config.columnKeys.deleted] = true;\n }\n\n if (this.config.tree.use) {\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n }\n else {\n if (this.config.body.grouping) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n } else if (Object.keys(this.sortInfo).length) {\n list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n list\n )\n );\n } else {\n list = initData.call(this, list);\n }\n\n this.list = list;\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n };\n\n const update = function (_row, _dindex) {\n if (!U.isNumber(_dindex)) {\n throw 'invalid argument _dindex';\n }\n //\n this.needToPaintSum = true;\n this.list.splice(_dindex, 1, _row);\n\n if (this.config.body.grouping) {\n this.list = initData.call(this, clearGroupingData.call(this, this.list));\n }\n };\n\n const updateChild = function (_dindex, _updateData, _options) {\n let keys = this.config.tree.columnKeys, selfHash, originIndex;\n\n if (typeof _dindex === \"undefined\") return false;\n originIndex = this.proxyList[_dindex].__origin_index__;\n\n if (this.list[originIndex][keys.children]) {\n this.proxyList = []; // 리셋 프록시\n\n if (_options && _options.filter) {\n if (_options.filter.call({item: this.list[originIndex], dindex: originIndex}, this.list[originIndex])) {\n for (let _k in _updateData) {\n this.list[originIndex][_k] = _updateData[_k];\n }\n }\n }\n else {\n for (let _k in _updateData) {\n this.list[originIndex][_k] = _updateData[_k];\n }\n }\n\n selfHash = this.list[originIndex][keys.selfHash];\n\n let i = 0, l = this.list.length;\n for (; i < l; i++) {\n if (this.list[i]) {\n if (this.list[i][keys.parentHash].substr(0, selfHash.length) === selfHash) {\n\n if (_options && _options.filter) {\n if (_options.filter.call({item: this.list[i], dindex: i}, this.list[i])) {\n for (let _k in _updateData) {\n this.list[i][_k] = _updateData[_k];\n }\n }\n }\n else {\n for (let _k in _updateData) {\n this.list[i][_k] = _updateData[_k];\n }\n }\n }\n\n if (!this.list[i][keys.hidden]) {\n this.proxyList.push(this.list[i]);\n }\n }\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n const setValue = function (_dindex, _doindex, _key, _value) {\n let originalValue = getValue.call(this, _dindex, _doindex, _key);\n let list = this.list;\n let listIndex = (typeof _doindex === \"undefined\") ? _dindex : _doindex;\n this.needToPaintSum = true;\n\n if (originalValue !== _value) {\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n list[listIndex][this.config.columnKeys.modified] = true;\n (Function(\"val\", \"this\" + GRID.util.getRealPathForDataItem(_key) + \" = val;\")).call(list[listIndex], _value);\n } catch (e) {\n\n }\n } else {\n list[listIndex][this.config.columnKeys.modified] = true;\n list[listIndex][_key] = _value;\n }\n\n if (this.onDataChanged) {\n this.onDataChanged.call({\n self: this,\n list: this.list,\n dindex: _dindex,\n doindex: _doindex,\n item: this.list[_dindex],\n key: _key,\n value: _value\n });\n }\n }\n\n return true;\n };\n\n let getValue = function (_dindex, _doindex, _key, _value) {\n let list = this.list;\n let listIndex = (typeof _doindex === \"undefined\") ? _dindex : _doindex;\n\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n _value = (Function(\"\", \"return this\" + GRID.util.getRealPathForDataItem(_key) + \";\")).call(list[listIndex]);\n } catch (e) {\n\n }\n } else {\n _value = list[listIndex][_key];\n }\n return _value;\n };\n\n const clearSelect = function () {\n this.selectedDataIndexs = [];\n };\n\n const select = function (_dindex, _doindex, _selected, _options) {\n let cfg = this.config;\n\n if(typeof _doindex === \"undefined\") _doindex = _dindex;\n\n if (!this.list[_doindex]) return false;\n if (this.list[_doindex].__isGrouping) return false;\n if (this.list[_doindex][cfg.columnKeys.disableSelection]) return false;\n\n if (typeof _selected === \"undefined\") {\n if (this.list[_doindex][cfg.columnKeys.selected] = !this.list[_doindex][cfg.columnKeys.selected]) {\n this.selectedDataIndexs.push(_doindex);\n } else {\n this.selectedDataIndexs.splice(U.search(this.selectedDataIndexs, function () {\n return this == _doindex;\n }), 1);\n }\n } else {\n if (this.list[_doindex][cfg.columnKeys.selected] = _selected) {\n this.selectedDataIndexs.push(_doindex);\n } else {\n this.selectedDataIndexs.splice(U.search(this.selectedDataIndexs, function () {\n return this == _doindex;\n }), 1);\n }\n }\n\n if (this.onDataChanged && _options && _options.internalCall) {\n this.onDataChanged.call({\n self: this,\n list: this.list,\n dindex: _dindex,\n doindex: _doindex,\n item: this.list[_doindex],\n key: cfg.columnKeys.selected,\n value: this.list[_doindex][cfg.columnKeys.selected]\n });\n }\n\n return this.list[_doindex][cfg.columnKeys.selected];\n };\n\n const selectAll = function (_selected, _options) {\n let cfg = this.config,\n dindex = this.list.length;\n\n this.selectedDataIndexs = [];\n\n if (typeof _selected === \"undefined\") {\n while (dindex--) {\n if (this.list[dindex].__isGrouping) continue;\n if (_options && _options.filter) {\n if (_options.filter.call(this.list[dindex]) !== true) {\n continue;\n }\n }\n if (this.list[dindex][cfg.columnKeys.disableSelection]) continue;\n\n if (this.list[dindex][cfg.columnKeys.selected] = !this.list[dindex][cfg.columnKeys.selected]) {\n this.selectedDataIndexs.push(dindex);\n }\n }\n } else {\n while (dindex--) {\n if (this.list[dindex].__isGrouping) continue;\n if (_options && _options.filter) {\n if (_options.filter.call(this.list[dindex]) !== true) {\n continue;\n }\n }\n if (this.list[dindex][cfg.columnKeys.disableSelection]) continue;\n\n if (this.list[dindex][cfg.columnKeys.selected] = _selected) {\n this.selectedDataIndexs.push(dindex);\n }\n }\n }\n\n if (this.onDataChanged && _options && _options.internalCall) {\n this.onDataChanged.call({\n self: this,\n list: this.list\n });\n }\n\n return this.list;\n };\n\n const sort = function (_sortInfo, _list, _options) {\n let self = this, list = _list || this.list, sortInfoArray = [], lineNumber = 0;\n let getKeyValue = function (_item, _key, _value) {\n if (/[\\.\\[\\]]/.test(_key)) {\n try {\n _value = (Function(\"\", \"return this\" + GRID.util.getRealPathForDataItem(_key) + \";\")).call(_item);\n } catch (e) {\n }\n } else {\n _value = _item[_key];\n }\n return _value;\n };\n\n for (let k in _sortInfo) {\n sortInfoArray[_sortInfo[k].seq] = {key: k, order: _sortInfo[k].orderBy};\n }\n sortInfoArray = U.filter(sortInfoArray, function () {\n return typeof this !== \"undefined\";\n });\n\n // 정렬조건이 없으면 original_index값을 이용하여 정렬처리\n if(_options && _options.resetLineNumber && sortInfoArray.length === 0) {\n sortInfoArray[0] = {key: '__original_index', order: \"asc\"}\n }\n\n let i = 0, l = sortInfoArray.length, _a_val, _b_val;\n\n list.sort(function (_a, _b) {\n for (i = 0; i < l; i++) {\n _a_val = getKeyValue(_a, sortInfoArray[i].key);\n _b_val = getKeyValue(_b, sortInfoArray[i].key);\n\n if (typeof _a_val !== typeof _b_val) {\n _a_val = '' + _a_val;\n _b_val = '' + _b_val;\n }\n if (_a_val < _b_val) {\n return (sortInfoArray[i].order === \"asc\") ? -1 : 1;\n } else if (_a_val > _b_val) {\n return (sortInfoArray[i].order === \"asc\") ? 1 : -1;\n }\n }\n });\n\n if(_options && _options.resetLineNumber) {\n i = 0, l = list.length, lineNumber = 0;\n for (; i < l; i++) {\n if (_list[i] && !_list[i][\"__isGrouping\"]) {\n _list[i][\"__index\"] = lineNumber++;\n }\n }\n }\n\n if (_list) {\n return list;\n } else {\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n return this;\n }\n };\n\n const append = function (_list, _callback) {\n let self = this;\n\n if (this.config.tree.use) {\n let list = this.list.concat([].concat(_list));\n\n this.list = arrangeData4tree.call(this, list);\n this.proxyList = getProxyList.call(this, sort.call(this, this.sortInfo, this.list));\n list = null;\n } else {\n this.list = this.list.concat([].concat(_list));\n }\n\n this.appendProgress = true;\n GRID.page.statusUpdate.call(this);\n\n if (this.appendDebouncer) {\n if (self.appendDebounceTimes < this.config.debounceTime / 10) {\n clearTimeout(this.appendDebouncer);\n self.appendDebounceTimes++;\n } else {\n self.appendDebounceTimes = 0;\n appendIdle.call(self);\n _callback();\n return false;\n }\n }\n\n this.appendDebouncer = setTimeout(function () {\n self.appendDebounceTimes = 0;\n appendIdle.call(self);\n _callback();\n }, this.config.debounceTime);\n\n // todo : append bounce animation\n };\n\n const appendIdle = function () {\n this.appendProgress = false;\n if (this.config.body.grouping) {\n this.list = initData.call(this,\n sort.call(this,\n this.sortInfo,\n this.list\n )\n );\n } else {\n this.list = initData.call(this, this.list);\n }\n\n this.needToPaintSum = true;\n this.xvar.frozenRowIndex = (this.config.frozenRowIndex > this.list.length) ? this.list.length : this.config.frozenRowIndex;\n this.xvar.paintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n GRID.page.navigationUpdate.call(this);\n };\n\n const toggleCollapse = function (_dindex, _doindx, _collapse) {\n let keys = this.config.tree.columnKeys, selfHash, originIndex;\n\n if (typeof _dindex === \"undefined\") return false;\n originIndex = this.proxyList[_dindex].__origin_index__;\n\n if (this.list[originIndex][keys.children]) {\n this.proxyList = []; // 리셋 프록시\n if (typeof _collapse == \"undefined\") {\n _collapse = !(this.list[originIndex][keys.collapse] || false);\n }\n\n this.list[originIndex][keys.collapse] = _collapse;\n selfHash = this.list[originIndex][keys.selfHash];\n\n let i = this.list.length;\n while (i--) {\n if (this.list[i]) {\n // console.log(this.list[i][keys.parentHash].substr(0, selfHash.length), selfHash);\n if (this.list[i][keys.parentHash].substr(0, selfHash.length) === selfHash) {\n this.list[i][keys.hidden] = _collapse;\n }\n\n if (!this.list[i][keys.hidden]) {\n this.proxyList.push(this.list[i]);\n }\n }\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n GRID.data = {\n init: init,\n set: set,\n get: get,\n getList: getList,\n getProxyList: getProxyList,\n setValue: setValue,\n getValue: getValue,\n clearSelect: clearSelect,\n select: select,\n selectAll: selectAll,\n add: add,\n remove: remove,\n deleteRow: deleteRow,\n update: update,\n updateChild: updateChild,\n sort: sort,\n initData: initData,\n clearGroupingData: clearGroupingData,\n append: append,\n toggleCollapse: toggleCollapse\n };\n})();","/*\n * Copyright (c) 2016. tom@axisj.com\n * - github.com/thomasjang\n * - www.axisj.com\n */\n\n// ax5.ui.grid.excel\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const base64 = function (s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n };\n\n const uri = \"data:application/vnd.ms-excel;base64,\";\n\n const getExcelTmpl = function () {\n return `\\ufeff\n{{#tables}}{{{body}}}{{/tables}}\n`;\n };\n\n const tableToExcel = function (table, fileName) {\n let link, a, output,\n tables = [].concat(table);\n\n output = ax5.mustache.render(getExcelTmpl(), {\n worksheet: (function () {\n var arr = [];\n tables.forEach(function (t, ti) {\n arr.push({name: \"Sheet\" + (ti + 1)});\n });\n return arr;\n })(),\n tables: (function () {\n var arr = [];\n tables.forEach(function (t, ti) {\n arr.push({body: t});\n });\n return arr;\n })()\n });\n\n let isChrome = navigator.userAgent.indexOf(\"Chrome\") > -1,\n isSafari = !isChrome && navigator.userAgent.indexOf(\"Safari\") > -1,\n isIE = /*@cc_on!@*/false || !!document.documentMode; // this works with IE10 and IE11 both :)\n\n let blob1, blankWindow, $iframe, iframe, anchor;\n\n if (navigator.msSaveOrOpenBlob) {\n blob1 = new Blob([output], {type: \"text/html\"});\n window.navigator.msSaveOrOpenBlob(blob1, fileName);\n }\n else if (isSafari) {\n // 사파리는 지원이 안되므로 그냥 테이블을 클립보드에 복사처리\n //tables\n blankWindow = window.open('about:blank', this.id + '-excel-export', 'width=600,height=400');\n blankWindow.document.write(output);\n blankWindow = null;\n }\n else {\n if (isIE && typeof Blob === \"undefined\") {\n //otherwise use the iframe and save\n //requires a blank iframe on page called txtArea1\n $iframe = jQuery('');\n jQuery(document.body).append($iframe);\n\n iframe = window[this.id + '-excel-export'];\n iframe.document.open(\"text/html\", \"replace\");\n iframe.document.write(output);\n iframe.document.close();\n iframe.focus();\n iframe.document.execCommand(\"SaveAs\", true, fileName);\n $iframe.remove();\n } else {\n // Attempt to use an alternative method\n anchor = document.body.appendChild(\n document.createElement(\"a\")\n );\n\n // If the [download] attribute is supported, try to use it\n if (\"download\" in anchor) {\n anchor.download = fileName;\n anchor.href = URL.createObjectURL(new Blob([output], { type: 'text/csv' }));\n anchor.click();\n document.body.removeChild(anchor);\n }\n }\n }\n\n return true;\n };\n\n GRID.excel = {\n export: tableToExcel\n };\n})();","// ax5.ui.grid.formatter\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const money = function () {\n if (typeof this.value !== \"undefined\") {\n let val = ('' + this.value).replace(/[^0-9^\\.^\\-]/g, \"\"),\n regExpPattern = new RegExp('([0-9])([0-9][0-9][0-9][,.])'),\n arrNumber = val.split('.'),\n returnValue;\n\n arrNumber[0] += '.';\n\n do {\n arrNumber[0] = arrNumber[0].replace(regExpPattern, '$1,$2');\n } while (regExpPattern.test(arrNumber[0]));\n\n return (arrNumber.length > 1) ? arrNumber[0] + U.left(arrNumber[1], 2) : arrNumber[0].split('.')[0];\n } else {\n return \"\";\n }\n };\n\n GRID.formatter = {\n money: money\n };\n\n})();","// ax5.ui.grid.header\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const columnResizerEvent = {\n \"on\": function (_columnResizer, _colIndex) {\n var self = this;\n var $columnResizer = $(_columnResizer);\n var columnResizerPositionLeft = $columnResizer.offset().left;\n var gridTargetOffsetLeft = self.$[\"container\"][\"root\"].offset().left;\n self.xvar.columnResizerIndex = _colIndex;\n var resizeRange = {\n min: -self.colGroup[_colIndex]._width + 2,\n max: self.$[\"container\"][\"root\"].width() - self.colGroup[_colIndex]._width,\n };\n\n jQuery(document.body)\n .bind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId, function (e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n\n if (resizeRange.min > self.xvar.__da) {\n self.xvar.__da = resizeRange.min;\n } else if (resizeRange.max < self.xvar.__da) {\n self.xvar.__da = resizeRange.max;\n }\n\n if (!self.xvar.columnResizerLived) {\n self.$[\"resizer\"][\"horizontal\"].addClass(\"live\");\n }\n self.xvar.columnResizerLived = true;\n self.$[\"resizer\"][\"horizontal\"].css({\n left: columnResizerPositionLeft + self.xvar.__da - gridTargetOffsetLeft\n });\n })\n .bind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId, function (e) {\n columnResizerEvent.off.call(self);\n U.stopEvent(e);\n })\n .bind(\"mouseleave.ax5grid-\" + this.instanceId, function (e) {\n columnResizerEvent.off.call(self);\n U.stopEvent(e);\n });\n\n jQuery(document.body)\n .attr('unselectable', 'on')\n .css('user-select', 'none')\n .on('selectstart', false);\n },\n \"off\": function () {\n this.$[\"resizer\"][\"horizontal\"].removeClass(\"live\");\n this.xvar.columnResizerLived = false;\n\n if (typeof this.xvar.__da === \"undefined\") {\n\n }\n else {\n this.setColumnWidth(this.colGroup[this.xvar.columnResizerIndex]._width + this.xvar.__da, this.xvar.columnResizerIndex);\n }\n\n jQuery(document.body)\n .unbind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId)\n .unbind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId)\n .unbind(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body)\n .removeAttr('unselectable')\n .css('user-select', 'auto')\n .off('selectstart');\n }\n };\n\n const init = function () {\n // 헤더 초기화\n const self = this;\n\n this.$[\"container\"][\"header\"].on(\"click\", '[data-ax5grid-column-attr]', function (e) {\n let key = this.getAttribute(\"data-ax5grid-column-key\"),\n colIndex = this.getAttribute(\"data-ax5grid-column-colindex\"),\n //rowIndex = this.getAttribute(\"data-ax5grid-column-rowindex\"),\n col = self.colGroup[colIndex];\n\n if (key === \"__checkbox_header__\" && self.config.header.selector) {\n let selected = this.getAttribute(\"data-ax5grid-selected\");\n selected = (U.isNothing(selected)) ? true : (selected !== \"true\");\n\n $(this).attr(\"data-ax5grid-selected\", selected);\n self.selectAll({selected: selected});\n\n selected = null;\n }\n else {\n if (key && col && col.sortable !== false && !col.sortFixed) {\n if (col.sortable === true || self.config.sortable === true) {\n toggleSort.call(self, col.key);\n }\n }\n }\n\n GRID.body.blur.call(self);\n\n key = null;\n colIndex = null;\n col = null;\n });\n this.$[\"container\"][\"header\"]\n .on(\"mousedown\", '[data-ax5grid-column-resizer]', function (e) {\n let colIndex = this.getAttribute(\"data-ax5grid-column-resizer\");\n\n self.xvar.mousePosition = GRID.util.getMousePosition(e);\n columnResizerEvent.on.call(self, this, Number(colIndex));\n U.stopEvent(e);\n\n colIndex = null;\n })\n .on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n resetFrozenColumn.call(this);\n };\n\n const resetFrozenColumn = function () {\n let cfg = this.config,\n dividedHeaderObj = GRID.util.divideTableByFrozenColumnIndex(this.headerTable, this.xvar.frozenColumnIndex);\n\n this.asideHeaderData = (function (dataTable) {\n let colGroup = [];\n let data = {rows: []};\n for (let i = 0, l = dataTable.rows.length; i < l; i++) {\n data.rows[i] = {cols: []};\n if (i === 0) {\n let col = {\n label: \"\",\n colspan: 1,\n rowspan: dataTable.rows.length,\n colIndex: null\n }, _col = {};\n\n if (cfg.showLineNumber) {\n _col = jQuery.extend({}, col, {\n width: cfg.lineNumberColumnWidth,\n _width: cfg.lineNumberColumnWidth,\n columnAttr: \"lineNumber\",\n key: \"__index_header__\", label: \" \"\n });\n colGroup.push(_col);\n data.rows[i].cols.push(_col);\n }\n if (cfg.showRowSelector) {\n _col = jQuery.extend({}, col, {\n width: cfg.rowSelectorColumnWidth,\n _width: cfg.rowSelectorColumnWidth,\n columnAttr: \"rowSelector\",\n key: \"__checkbox_header__\", label: \"\"\n });\n colGroup.push(_col);\n data.rows[i].cols.push(_col);\n }\n\n col = null;\n }\n }\n\n this.asideColGroup = colGroup;\n return data;\n }).call(this, this.headerTable);\n\n this.leftHeaderData = dividedHeaderObj.leftData;\n this.headerData = dividedHeaderObj.rightData;\n };\n\n const getFieldValue = function (_col) {\n return (_col.key === \"__checkbox_header__\")\n ? ((this.config.header.selector) ? `
` : \" \")\n : (_col.label || \" \");\n };\n\n const repaint = function (_reset) {\n let cfg = this.config,\n colGroup = this.colGroup;\n\n if (_reset) {\n resetFrozenColumn.call(this);\n this.xvar.paintStartRowIndex = undefined;\n this.xvar.virtualPaintStartRowIndex = undefined; // 스크롤 포지션 저장변수 초기화\n }\n let asideHeaderData = this.asideHeaderData,\n leftHeaderData = this.leftHeaderData,\n headerData = this.headerData,\n headerAlign = cfg.header.align;\n\n // this.asideColGroup : asideHeaderData에서 처리 함.\n this.leftHeaderColGroup = colGroup.slice(0, this.config.frozenColumnIndex);\n this.headerColGroup = colGroup.slice(this.config.frozenColumnIndex);\n\n var repaintHeader = function (_elTarget, _colGroup, _bodyRow) {\n let tableWidth = 0,\n SS = [];\n SS.push('');\n SS.push('');\n for (var cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n SS.push(' ');\n tableWidth += _colGroup[cgi]._width;\n }\n SS.push(' ');\n SS.push(' ');\n\n for (var tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n var trCSS_class = \"\";\n SS.push('');\n for (var ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n var col = _bodyRow.rows[tri].cols[ci];\n var cellHeight = cfg.header.columnHeight * col.rowspan - cfg.header.columnBorderWidth;\n var colAlign = headerAlign || col.align;\n SS.push('');\n \n SS.push((function () {\n var lineHeight = (cfg.header.columnHeight - cfg.header.columnPadding * 2 - cfg.header.columnBorderWidth);\n return '';\n })(), (function () {\n var _SS = \"\";\n\n if (!U.isNothing(col.key) && !U.isNothing(col.colIndex) && (cfg.sortable === true || col.sortable === true) && col.sortable !== false) {\n _SS += ' ';\n }\n return _SS;\n })(), getFieldValue.call(this, col), ' ');\n\n if (!U.isNothing(col.colIndex)) {\n if (cfg.enableFilter) {\n SS.push(' ');\n }\n }\n\n SS.push(' ');\n }\n SS.push(' ');\n SS.push(' ');\n }\n SS.push('
');\n _elTarget.html(SS.join(''));\n\n /// append column-resizer\n (function () {\n let resizerHeight = cfg.header.columnHeight * _bodyRow.rows.length - cfg.header.columnBorderWidth,\n resizerLeft = 0,\n AS = [];\n\n for (var cgi = 0, cgl = _colGroup.length; cgi < cgl; cgi++) {\n var col = _colGroup[cgi];\n if (!U.isNothing(col.colIndex)) {\n //_colGroup[cgi]._width\n resizerLeft += col._width;\n AS.push('
');\n }\n }\n _elTarget.append(AS);\n }).call(this);\n\n\n return tableWidth;\n };\n\n if (cfg.asidePanelWidth > 0) {\n repaintHeader.call(this, this.$.panel[\"aside-header\"], this.asideColGroup, asideHeaderData);\n }\n if (cfg.frozenColumnIndex > 0) {\n repaintHeader.call(this, this.$.panel[\"left-header\"], this.leftHeaderColGroup, leftHeaderData);\n }\n\n this.xvar.scrollContentWidth = repaintHeader.call(this, this.$.panel[\"header-scroll\"], this.headerColGroup, headerData);\n\n if (cfg.rightSum) {\n\n }\n };\n\n const scrollTo = function (css) {\n this.$.panel[\"header-scroll\"].css(css);\n return this;\n };\n\n const toggleSort = function (_key) {\n let sortOrder = \"\",\n sortInfo = {},\n seq = 0;\n\n for (var k in this.sortInfo) {\n if (this.sortInfo[k].fixed) {\n sortInfo[k] = this.sortInfo[k];\n seq++;\n }\n }\n\n for (var i = 0, l = this.colGroup.length; i < l; i++) {\n if (this.colGroup[i].key == _key) {\n if (sortOrder == \"\") {\n if (typeof this.colGroup[i].sort === \"undefined\") {\n sortOrder = \"desc\";\n }\n else if (this.colGroup[i].sort === \"desc\") {\n sortOrder = \"asc\";\n }\n else {\n sortOrder = undefined;\n }\n }\n this.colGroup[i].sort = sortOrder;\n } else if (!this.config.multiSort) {\n this.colGroup[i].sort = undefined;\n }\n\n if (typeof this.colGroup[i].sort !== \"undefined\") {\n if (!sortInfo[this.colGroup[i].key]) {\n sortInfo[this.colGroup[i].key] = {\n seq: seq++,\n orderBy: this.colGroup[i].sort\n };\n }\n }\n }\n\n this.setColumnSort(sortInfo);\n return this;\n };\n\n const applySortStatus = function (_sortInfo) {\n for (var i = 0, l = this.colGroup.length; i < l; i++) {\n for (var _key in _sortInfo) {\n if (this.colGroup[i].key == _key) {\n this.colGroup[i].sort = _sortInfo[_key].orderBy;\n }\n }\n }\n return this;\n };\n\n const select = function (_options) {\n GRID.data.select.call(this, dindex, _options && _options.selected);\n GRID.body.updateRowState.call(this, [\"selected\"], dindex);\n };\n\n const getExcelString = function () {\n let cfg = this.config,\n colGroup = this.colGroup,\n headerData = this.headerTable,\n getHeader = function (_colGroup, _bodyRow) {\n var SS = [];\n //SS.push('');\n for (var tri = 0, trl = _bodyRow.rows.length; tri < trl; tri++) {\n SS.push('');\n for (var ci = 0, cl = _bodyRow.rows[tri].cols.length; ci < cl; ci++) {\n var col = _bodyRow.rows[tri].cols[ci];\n SS.push('', getFieldValue.call(this, col), ' ');\n }\n SS.push(' ');\n }\n //SS.push('
');\n\n return SS.join('');\n };\n\n return getHeader.call(this, colGroup, headerData);\n };\n\n GRID.header = {\n init: init,\n repaint: repaint,\n scrollTo: scrollTo,\n toggleSort: toggleSort,\n applySortStatus: applySortStatus,\n getExcelString: getExcelString\n };\n\n})();","// ax5.ui.grid.inlineEditor\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const edit_text = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function (_root, _columnKey, _editor, _value) {\n if(typeof _editor.attributes !== \"undefined\"){\n var attributesText = \"\";\n for (var k in _editor.attributes){\n attributesText += ` ${k}='${_editor.attributes[k]}'`;\n }\n }\n return ` `;\n },\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.focus().select();\n }\n };\n\n const edit_money = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function (_root, _columnKey, _editor, _value) {\n let attributesText = \"\";\n if(typeof _editor.attributes !== \"undefined\"){\n for (let k in _editor.attributes){\n attributesText += ` ${k}='${_editor.attributes[k]}'`;\n }\n }\n return ' ';\n },\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n let $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.data(\"binded-ax5ui\", \"ax5formater\");\n _$el.ax5formatter($.extend(true, {\n pattern: \"money\"\n }, _editor.config));\n _$el.focus().select();\n }\n };\n\n const edit_number = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function (_root, _columnKey, _editor, _value) {\n let attributesText = \"\";\n if(typeof _editor.attributes !== \"undefined\"){\n for (let k in _editor.attributes){\n attributesText += ` ${k}='${_editor.attributes[k]}'`;\n }\n }\n return ' ';\n },\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n $el.on(\"blur\", function () {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey);\n });\n return $el;\n },\n bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n _$el.data(\"binded-ax5ui\", \"ax5formater\");\n _$el.ax5formatter($.extend(true, {\n pattern: \"number\"\n }, _editor.config));\n _$el.focus().select();\n }\n };\n\n const edit_date = {\n useReturnToSave: true,\n editMode: \"popup\",\n getHtml: function (_root, _columnKey, _editor, _value) {\n return ' ';\n },\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n return $el;\n },\n bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n var self = _root;\n _$el.data(\"binded-ax5ui\", \"ax5picker\");\n\n _$el.ax5picker($.extend(true, {\n direction: \"auto\",\n content: {\n type: 'date',\n formatter: {\n pattern: 'date'\n }\n },\n onStateChanged: function () {\n if (this.state == \"open\") {\n this.self.activePicker.attr(\"data-ax5grid-inline-edit-picker\", \"date\");\n } else if (this.state == \"close\") {\n GRID.body.inlineEdit.deActive.call(self, \"RETURN\", _columnKey);\n }\n }\n }, _editor.config));\n\n _$el.focus().select();\n }\n };\n\n const edit_select = {\n useReturnToSave: false,\n editMode: \"popup\",\n getHtml: function (_root, _columnKey, _editor, _value) {\n var po = [];\n po.push('');\n po.push('
');\n\n return po.join('');\n },\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n var $el;\n _$parent.append($el = jQuery(this.getHtml(_root, _columnKey, _editor, _value)));\n this.bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n return $el;\n },\n bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n var eConfig = {\n columnKeys: {\n optionValue: \"value\",\n optionText: \"text\",\n optionSelected: \"selected\"\n }\n };\n jQuery.extend(true, eConfig, _editor.config);\n\n eConfig.options.forEach(function (n) {\n if (n[eConfig.columnKeys.optionValue] == _value) n[eConfig.columnKeys.optionSelected] = true;\n });\n\n var self = _root;\n _$el.data(\"binded-ax5ui\", \"ax5select\");\n _$el.ax5select($.extend(true, {\n tabIndex: 1,\n direction: \"auto\",\n columnKeys: eConfig.columnKeys,\n options: eConfig.options,\n onStateChanged: function () {\n if (this.state == \"open\") {\n this.self.activeSelectOptionGroup.attr(\"data-ax5grid-inline-edit-picker\", \"select\");\n } else if (this.state == \"changeValue\") {\n GRID.body.inlineEdit.deActive.call(self, \"RETURN\", _columnKey, this.value[0][eConfig.columnKeys.optionValue]);\n } else if (this.state == \"close\") {\n GRID.body.inlineEdit.deActive.call(self, \"ESC\", _columnKey);\n }\n }\n }, _editor.config));\n _$el.ax5select(\"open\");\n _$el.ax5select(\"setValue\", _value);\n _$el.find(\"a\").focus();\n }\n };\n\n const edit_checkbox = {\n editMode: \"inline\",\n getHtml: function (_root, _editor, _value) {\n\n var lineHeight = (_root.config.body.columnHeight - _root.config.body.columnPadding * 2 - _root.config.body.columnBorderWidth);\n var checked;\n if (_editor.config && _editor.config.trueValue) {\n checked = (_value == _editor.config.trueValue) ? \"true\" : \"false\";\n } else {\n checked = (_value == false || _value == \"false\" || _value < \"1\") ? \"false\" : \"true\";\n }\n\n var eConfig = {\n marginTop: 2,\n height: lineHeight - 4\n };\n jQuery.extend(true, eConfig, _editor.config);\n eConfig.marginTop = (lineHeight - eConfig.height) / 2;\n\n return '
';\n }\n };\n\n const edit_textarea = {\n useReturnToSave: false,\n editMode: \"popup\",\n _getHtml: function (_root, _columnKey, _editor, _value) {\n // init 에서 사용하게 될 HTML 태그를 만들어 줍니다.\n return `
`;\n },\n _bindUI: function (_root, _columnKey, _$el, _editor, _$parent, _value) {\n // 위치와 크기를 구합니다.\n let offset = _$el.offset();\n let box = {\n width: _$el.width()\n };\n let editorHeight = 150;\n let buttonHeight = 30;\n\n // 새로운 엘리먼트 생성\n let $newDiv = jQuery(``);\n let $newTextarea = $newDiv.find(\"textarea\");\n // 엘리먼트에 CSS 적용\n $newDiv.css({\n position: \"absolute\",\n left: offset.left,\n top: offset.top,\n width: box.width,\n height: editorHeight\n });\n $newDiv.find(\"textarea\");\n\n // 새로운 엘리먼트를 document.body에 append\n jQuery(document.body).append($newDiv);\n $newTextarea.focus().select();\n\n $newTextarea.on(\"blur\", function (e) {\n GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey, this.value);\n $newDiv.remove();\n ax5.util.stopEvent(e.originalEvent);\n });\n $newTextarea.on(\"keydown\", function (e) {\n if(e.which == ax5.info.eventKeys.ESC){\n GRID.body.inlineEdit.deActive.call(_root, \"ESC\", _columnKey);\n $newDiv.remove();\n ax5.util.stopEvent(e.originalEvent);\n }\n });\n\n /// 값 변경\n /// GRID.body.inlineEdit.deActive.call(_root, \"RETURN\", _columnKey, this.value[0][eConfig.columnKeys.optionValue]);\n /// 에디팅 취소\n /// GRID.body.inlineEdit.deActive.call(_root, \"ESC\", _columnKey);\n },\n\n init: function (_root, _columnKey, _editor, _$parent, _value) {\n // 인라인 에디팅 활성화 시작\n /**\n * _root : gridInstance\n * _columnKey : di + \"_\" + col.colIndex + \"_\" + col.rowIndex\n * _editor : col.editor\n * _$parent : 셀\n * _value : 값\n */\n let $el;\n _$parent.append($el = jQuery(this._getHtml(_root, _columnKey, _editor, _value)));\n // 셀에 HTML 컨텐츠 추가\n\n this._bindUI(_root, _columnKey, $el, _editor, _$parent, _value);\n // 이벤트 바인딩\n\n return $el;\n },\n };\n\n GRID.inlineEditor = {\n \"text\": edit_text,\n \"money\": edit_money,\n \"number\": edit_number,\n \"date\": edit_date,\n \"select\": edit_select,\n \"checkbox\": edit_checkbox,\n \"textarea\": edit_textarea\n };\n\n})();","// ax5.ui.grid.page\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const onclickPageMove = function (_act) {\n var callback = function (_pageNo) {\n if (this.page.currentPage != _pageNo) {\n this.page.selectPage = _pageNo;\n if (this.config.page.onChange) {\n this.config.page.onChange.call({\n self: this,\n page: this.page,\n data: this.data\n });\n }\n }\n };\n var processor = {\n \"first\": function () {\n callback.call(this, 0);\n },\n \"prev\": function () {\n var pageNo = this.page.currentPage - 1;\n if (pageNo < 0) pageNo = 0;\n callback.call(this, pageNo);\n },\n \"next\": function () {\n var pageNo = this.page.currentPage + 1;\n if (pageNo > this.page.totalPages - 1) pageNo = this.page.totalPages - 1;\n callback.call(this, pageNo);\n },\n \"last\": function () {\n callback.call(this, this.page.totalPages - 1);\n }\n };\n\n if (_act in processor) {\n processor[_act].call(this);\n }\n else {\n callback.call(this, _act - 1);\n }\n };\n\n const navigationUpdate = function () {\n let self = this;\n if (this.page) {\n let page = {\n hasPage: false,\n currentPage: this.page.currentPage,\n pageSize: this.page.pageSize,\n totalElements: this.page.totalElements,\n totalPages: this.page.totalPages,\n firstIcon: this.config.page.firstIcon,\n prevIcon: this.config.page.prevIcon || \"«\",\n nextIcon: this.config.page.nextIcon || \"»\",\n lastIcon: this.config.page.lastIcon,\n };\n let navigationItemCount = this.config.page.navigationItemCount;\n\n page[\"@paging\"] = (function () {\n let returns = [], startI, endI;\n\n startI = page.currentPage - Math.floor(navigationItemCount / 2);\n if (startI < 0) startI = 0;\n endI = page.currentPage + navigationItemCount;\n if (endI > page.totalPages) endI = page.totalPages;\n\n if (endI - startI > navigationItemCount) {\n endI = startI + navigationItemCount;\n }\n\n if (endI - startI < navigationItemCount) {\n startI = endI - navigationItemCount;\n }\n if (startI < 0) startI = 0;\n\n for (let p = startI, l = endI; p < l; p++) {\n returns.push({'pageNo': (p + 1), 'selected': page.currentPage == p});\n }\n return returns;\n })();\n\n if (page[\"@paging\"].length > 0) {\n page.hasPage = true;\n }\n\n this.$[\"page\"][\"navigation\"].html(GRID.tmpl.get(\"page_navigation\", page));\n this.$[\"page\"][\"navigation\"].find(\"[data-ax5grid-page-move]\").on(\"click\", function () {\n onclickPageMove.call(self, this.getAttribute(\"data-ax5grid-page-move\"));\n });\n\n } else {\n this.$[\"page\"][\"navigation\"].empty();\n }\n };\n\n const statusUpdate = function () {\n if (!this.config.page.statusDisplay) {\n return;\n }\n\n let toRowIndex, rangeCount = Math.min(this.xvar.dataRowCount, this.xvar.virtualPaintRowCount);\n let data = {};\n\n toRowIndex = this.xvar.virtualPaintStartRowIndex + rangeCount;\n\n if (toRowIndex > this.xvar.dataRowCount) {\n toRowIndex = this.xvar.dataRowCount;\n }\n\n data.fromRowIndex = U.number(this.xvar.virtualPaintStartRowIndex + 1, {\"money\": true});\n data.toRowIndex = U.number(toRowIndex, {\"money\": true});\n data.totalElements = false;\n data.dataRealRowCount = (this.xvar.dataRowCount !== this.xvar.dataRealRowCount) ? U.number(this.xvar.dataRealRowCount, {\"money\": true}) : false;\n data.dataRowCount = U.number(this.xvar.dataRowCount, {\"money\": true});\n data.progress = (this.appendProgress) ? this.config.appendProgressIcon : \"\";\n\n if (this.page) {\n data.fromRowIndex_page = U.number(this.xvar.virtualPaintStartRowIndex + (this.page.currentPage * this.page.pageSize) + 1, {\"money\": true});\n data.toRowIndex_page = U.number(this.xvar.virtualPaintStartRowIndex + rangeCount + (this.page.currentPage * this.page.pageSize), {\"money\": true});\n data.totalElements = U.number(this.page.totalElements, {\"money\": true});\n\n if (data.toRowIndex_page > this.page.totalElements) {\n data.toRowIndex_page = this.page.totalElements;\n }\n }\n\n this.$[\"page\"][\"status\"].html(\n GRID.tmpl.get(\"page_status\", data)\n );\n };\n\n GRID.page = {\n navigationUpdate: navigationUpdate,\n statusUpdate: statusUpdate\n };\n\n})();","// ax5.ui.grid.scroller\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n const convertScrollPosition = {\n \"vertical\": function (css, _var) {\n let _content_height = _var._content_height - _var._panel_height,\n _scroller_height = _var._vertical_scroller_height - _var.verticalScrollBarHeight,\n top = (_content_height * css.top) / _scroller_height;\n\n if (top < 0) top = 0;\n else if (_content_height < top) {\n top = _content_height;\n }\n return {\n top: -top\n }\n },\n \"horizontal\": function (css, _var) {\n let _content_width = _var._content_width - _var._panel_width,\n _scroller_width = _var._horizontal_scroller_width - _var.horizontalScrollBarWidth,\n left = (_content_width * css.left) / _scroller_width;\n\n if (left < 0) left = 0;\n else if (_content_width < left) {\n left = _content_width;\n }\n return {\n left: -left\n }\n }\n };\n\n const convertScrollBarPosition = {\n \"vertical\": function (_top, _var) {\n\n let self = this,\n type = \"vertical\",\n _content_height = _var._content_height - _var._panel_height,\n _scroller_height = _var._vertical_scroller_height - _var.verticalScrollBarHeight,\n top = (_scroller_height * _top) / _content_height,\n scrollPositon;\n\n if (-top > _scroller_height) {\n top = -_scroller_height;\n\n scrollPositon = convertScrollPosition[type].call(this, {top: -top}, {\n _content_width: _var._content_width,\n _content_height: _var._content_height,\n _panel_width: _var._panel_width,\n _panel_height: _var._panel_height,\n _horizontal_scroller_width: _var._horizontal_scroller_width,\n _vertical_scroller_height: _var._vertical_scroller_height,\n verticalScrollBarHeight: _var.verticalScrollBarHeight,\n horizontalScrollBarWidth: _var.horizontalScrollBarWidth\n });\n\n GRID.body.scrollTo.call(self, scrollPositon);\n }\n\n return -top\n },\n \"horizontal\": function (_left, _var) {\n let self = this,\n type = \"horizontal\",\n _content_width = _var._content_width - _var._panel_width,\n _scroller_width = _var._horizontal_scroller_width - _var.horizontalScrollBarWidth,\n left = (_scroller_width * _left) / _content_width,\n scrollPositon;\n\n if (-left > _scroller_width) {\n left = -_scroller_width;\n scrollPositon = convertScrollPosition[type].call(this, {left: -left}, {\n _content_width: _var._content_width,\n _content_height: _var._content_height,\n _panel_width: _var._panel_width,\n _panel_height: _var._panel_height,\n _horizontal_scroller_width: _var._horizontal_scroller_width,\n _vertical_scroller_height: _var._vertical_scroller_height,\n verticalScrollBarHeight: _var.verticalScrollBarHeight,\n horizontalScrollBarWidth: _var.horizontalScrollBarWidth\n });\n\n GRID.header.scrollTo.call(self, scrollPositon);\n GRID.body.scrollTo.call(self, scrollPositon);\n }\n\n return -left\n }\n };\n\n const scrollBarMover = {\n \"click\": function (track, bar, type, e) {\n\n // 마우스 무브 완료 타임과 클릭타임 차이가 20 보다 작으면 클릭이벤트 막기.\n if ((new Date()).getTime() - GRID.scroller.moveout_timer < 20) {\n return false;\n }\n\n let self = this,\n trackOffset = track.offset(),\n barBox = {\n width: bar.outerWidth(), height: bar.outerHeight()\n },\n trackBox = {\n width: track.innerWidth(), height: track.innerHeight()\n },\n _vertical_scroller_height = self.$[\"scroller\"][\"vertical\"].innerHeight(),\n _panel_height = self.$[\"panel\"][\"body\"].height(),\n _horizontal_scroller_width = self.$[\"scroller\"][\"horizontal\"].innerWidth(),\n _panel_width = self.$[\"panel\"][\"body\"].width(),\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n verticalScrollBarHeight = self.$[\"scroller\"][\"vertical-bar\"].outerHeight(),\n horizontalScrollBarWidth = self.$[\"scroller\"][\"horizontal-bar\"].outerWidth(),\n getScrollerPosition = {\n \"vertical\": function (e) {\n let mouseObj = GRID.util.getMousePosition(e);\n // track을 벗어 나지 안도록 범위 체크\n let newTop = mouseObj.clientY - trackOffset.top;\n if (newTop < 0) {\n newTop = 0;\n }\n else if ((newTop + barBox.height) > trackBox.height) {\n newTop = trackBox.height - barBox.height;\n }\n return {top: newTop};\n },\n \"horizontal\": function (e) {\n let mouseObj = GRID.util.getMousePosition(e);\n // track을 벗어 나지 안도록 범위 체크\n let newLeft = mouseObj.clientX - trackOffset.left;\n if (newLeft < 0) {\n newLeft = 0;\n }\n else if ((newLeft + barBox.width) > trackBox.width) {\n newLeft = trackBox.width - barBox.width;\n }\n return {left: newLeft};\n }\n },\n css = getScrollerPosition[type](e);\n\n bar.css(css);\n\n let scrollPositon = convertScrollPosition[type].call(self, css, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n });\n if (type === \"horizontal\") GRID.header.scrollTo.call(self, scrollPositon);\n GRID.body.scrollTo.call(self, scrollPositon);\n\n scrollPositon = null;\n },\n \"on\": function (track, bar, type, e) {\n let self = this,\n barOffset = bar.position(),\n barBox = {\n width: bar.outerWidth(), height: bar.outerHeight()\n },\n trackBox = {\n width: track.innerWidth(), height: track.innerHeight()\n },\n\n _vertical_scroller_height = self.$[\"scroller\"][\"vertical\"].innerHeight(),\n _panel_height = self.$[\"panel\"][\"body\"].height(),\n _horizontal_scroller_width = self.$[\"scroller\"][\"horizontal\"].innerWidth(),\n _panel_width = self.$[\"panel\"][\"body\"].width(),\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n verticalScrollBarHeight = self.$[\"scroller\"][\"vertical-bar\"].outerHeight(),\n horizontalScrollBarWidth = self.$[\"scroller\"][\"horizontal-bar\"].outerWidth(),\n\n getScrollerPosition = {\n \"vertical\": function (e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientY - self.xvar.mousePosition.clientY;\n // track을 벗어 나지 안도록 범위 체크\n var newTop = barOffset.top + self.xvar.__da;\n if (newTop < 0) {\n newTop = 0;\n }\n else if ((newTop + barBox.height) > trackBox.height) {\n newTop = trackBox.height - barBox.height;\n }\n return {top: newTop};\n },\n \"horizontal\": function (e) {\n var mouseObj = GRID.util.getMousePosition(e);\n self.xvar.__da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n // track을 벗어 나지 안도록 범위 체크\n var newLeft = barOffset.left + self.xvar.__da;\n if (newLeft < 0) {\n newLeft = 0;\n }\n else if ((newLeft + barBox.width) > trackBox.width) {\n newLeft = trackBox.width - barBox.width;\n }\n return {left: newLeft};\n }\n };\n\n self.xvar.__da = 0; // 이동량 변수 초기화 (계산이 잘못 될까바)\n\n jQuery(document.body)\n .bind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId, function (e) {\n let css = getScrollerPosition[type](e);\n bar.css(css);\n\n let scrollPositon = convertScrollPosition[type].call(self, css, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n });\n\n if (type === \"horizontal\") GRID.header.scrollTo.call(self, scrollPositon);\n\n GRID.body.scrollTo.call(self, scrollPositon);\n })\n .bind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId, function (e) {\n scrollBarMover.off.call(self, e);\n })\n .bind(\"mouseleave.ax5grid-\" + this.instanceId, function (e) {\n scrollBarMover.off.call(self, e);\n });\n\n jQuery(document.body)\n .attr('unselectable', 'on')\n .css('user-select', 'none')\n .on('selectstart', false);\n\n },\n \"off\": function (e) {\n ax5.util.stopEvent(e.originalEvent);\n GRID.scroller.moveout_timer = (new Date()).getTime();\n\n jQuery(document.body)\n .unbind(GRID.util.ENM[\"mousemove\"] + \".ax5grid-\" + this.instanceId)\n .unbind(GRID.util.ENM[\"mouseup\"] + \".ax5grid-\" + this.instanceId)\n .unbind(\"mouseleave.ax5grid-\" + this.instanceId);\n\n jQuery(document.body)\n .removeAttr('unselectable')\n .css('user-select', 'auto')\n .off('selectstart');\n }\n };\n\n const scrollContentMover = {\n \"wheel\": function (delta) {\n let self = this,\n _body_scroll_position = self.$[\"panel\"][\"body-scroll\"].position(),\n _panel_height = self.xvar.body_panel_height,\n _panel_width = self.xvar.body_panel_width,\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth;\n\n if (isNaN(_content_height) || isNaN(_content_width)) {\n return false;\n }\n\n let newLeft, newTop,\n _top_is_end = false,\n _left_is_end = false;\n\n newLeft = _body_scroll_position.left - delta.x;\n newTop = _body_scroll_position.top - delta.y;\n\n // newTop이 범위를 넘었는지 체크\n if (newTop >= 0) {\n newTop = 0;\n _top_is_end = true;\n } else if (newTop <= _panel_height - _content_height) {\n newTop = _panel_height - _content_height;\n if (newTop >= 0) newTop = 0;\n _top_is_end = true;\n } else {\n if (delta.y == 0) _top_is_end = true;\n }\n\n // newLeft이 범위를 넘었는지 체크\n if (newLeft >= 0) {\n newLeft = 0;\n _left_is_end = true;\n } else if (newLeft <= _panel_width - _content_width) {\n newLeft = _panel_width - _content_width;\n if (newLeft >= 0) newLeft = 0;\n _left_is_end = true;\n } else {\n if (delta.x == 0) _left_is_end = true;\n }\n\n GRID.header.scrollTo.call(self, {left: newLeft});\n GRID.body.scrollTo.call(self, {left: newLeft, top: newTop}, {\n callback: function () {\n resize.call(self);\n }\n });\n\n return !_top_is_end || !_left_is_end;\n },\n \"on\": function () {\n let self = this,\n _body_scroll_position = self.$[\"panel\"][\"body-scroll\"].position(),\n _panel_height = self.xvar.body_panel_height,\n _panel_width = self.xvar.body_panel_width,\n _content_height = self.xvar.scrollContentHeight,\n _content_width = self.xvar.scrollContentWidth,\n getContentPosition = function (e) {\n let mouseObj = GRID.util.getMousePosition(e), newLeft, newTop;\n\n self.xvar.__x_da = mouseObj.clientX - self.xvar.mousePosition.clientX;\n self.xvar.__y_da = mouseObj.clientY - self.xvar.mousePosition.clientY;\n\n newLeft = _body_scroll_position.left + self.xvar.__x_da;\n newTop = _body_scroll_position.top + self.xvar.__y_da;\n\n // newTop이 범위를 넘었는지 체크\n if (newTop >= 0) {\n newTop = 0;\n } else if (newTop <= _panel_height - _content_height) {\n newTop = _panel_height - _content_height;\n if (newTop >= 0) newTop = 0;\n }\n\n // newLeft이 범위를 넘었는지 체크\n if (newLeft >= 0) {\n newLeft = 0;\n } else if (newLeft <= _panel_width - _content_width) {\n newLeft = _panel_width - _content_width;\n if (newLeft >= 0) newLeft = 0;\n }\n\n return {\n left: newLeft, top: newTop\n }\n };\n\n this.xvar.__x_da = 0; // 이동량 변수 초기화\n this.xvar.__y_da = 0; // 계산이 잘못 될까바\n this.xvar.touchmoved = false;\n\n jQuery(document.body)\n .on(\"touchmove\" + \".ax5grid-\" + this.instanceId, function (e) {\n let css = getContentPosition(e);\n\n resize.call(self);\n GRID.header.scrollTo.call(self, {left: css.left});\n GRID.body.scrollTo.call(self, css, {noRepaint: \"noRepaint\"});\n U.stopEvent(e.originalEvent);\n self.xvar.touchmoved = true;\n })\n .on(\"touchend\" + \".ax5grid-\" + this.instanceId, function (e) {\n if (self.xvar.touchmoved) {\n let css = getContentPosition(e);\n\n resize.call(self);\n GRID.header.scrollTo.call(self, {left: css.left});\n GRID.body.scrollTo.call(self, css);\n U.stopEvent(e.originalEvent);\n scrollContentMover.off.call(self);\n }\n });\n\n jQuery(document.body)\n .attr('unselectable', 'on')\n .css('user-select', 'none')\n .on('selectstart', false);\n },\n \"off\": function () {\n\n jQuery(document.body)\n .off(\"touchmove\" + \".ax5grid-\" + this.instanceId)\n .off(\"touchend\" + \".ax5grid-\" + this.instanceId);\n\n jQuery(document.body)\n .removeAttr('unselectable')\n .css('user-select', 'auto')\n .off('selectstart');\n }\n };\n\n const init = function () {\n let self = this,\n margin = this.config.scroller.trackPadding;\n\n if (margin == 0) {\n this.$[\"scroller\"][\"vertical-bar\"].css({width: this.config.scroller.size, left: -1});\n this.$[\"scroller\"][\"horizontal-bar\"].css({height: this.config.scroller.size, top: -1});\n } else {\n this.$[\"scroller\"][\"vertical-bar\"].css({width: this.config.scroller.size - (margin + 1), left: margin / 2});\n this.$[\"scroller\"][\"horizontal-bar\"].css({height: this.config.scroller.size - (margin + 1), top: margin / 2});\n }\n\n this.$[\"scroller\"][\"vertical-bar\"]\n .on(GRID.util.ENM[\"mousedown\"], (function (e) {\n this.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollBarMover.on.call(this, this.$[\"scroller\"][\"vertical\"], this.$[\"scroller\"][\"vertical-bar\"], \"vertical\", e);\n }).bind(this))\n .on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n this.$[\"scroller\"][\"vertical\"]\n .on(\"click\", (function (e) {\n if (e.target.getAttribute(\"data-ax5grid-scroller\") == \"vertical\") {\n scrollBarMover.click.call(this, this.$[\"scroller\"][\"vertical\"], this.$[\"scroller\"][\"vertical-bar\"], \"vertical\", e);\n }\n }).bind(this));\n\n this.$[\"scroller\"][\"horizontal-bar\"]\n .on(GRID.util.ENM[\"mousedown\"], (function (e) {\n this.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollBarMover.on.call(this, this.$[\"scroller\"][\"horizontal\"], this.$[\"scroller\"][\"horizontal-bar\"], \"horizontal\", e);\n }).bind(this))\n .on(\"dragstart\", function (e) {\n U.stopEvent(e);\n return false;\n });\n\n this.$[\"scroller\"][\"horizontal\"]\n .on(\"click\", (function (e) {\n if (e.target.getAttribute(\"data-ax5grid-scroller\") == \"horizontal\") {\n scrollBarMover.click.call(this, this.$[\"scroller\"][\"horizontal\"], this.$[\"scroller\"][\"horizontal-bar\"], \"horizontal\", e);\n }\n }).bind(this));\n\n this.$[\"container\"][\"body\"].on('mousewheel DOMMouseScroll', (function (e) {\n let E = e.originalEvent, delta = {x: 0, y: 0};\n\n if (E.detail) {\n delta.y = E.detail * 10;\n } else {\n if (typeof E.deltaY === \"undefined\") {\n delta.y = -E.wheelDelta;\n delta.x = 0;\n } else {\n delta.y = E.deltaY;\n delta.x = E.deltaX;\n }\n }\n\n if (scrollContentMover.wheel.call(this, delta)) {\n U.stopEvent(e);\n }\n }).bind(this));\n\n if (ax5.info.supportTouch) {\n this.$[\"container\"][\"body\"]\n .on(\"touchstart\", '[data-ax5grid-panel]', function (e) {\n self.xvar.mousePosition = GRID.util.getMousePosition(e);\n scrollContentMover.on.call(self);\n });\n }\n\n this.xvar.body_panel_height = this.$[\"panel\"][\"body\"].height();\n this.xvar.body_panel_width = this.$[\"panel\"][\"body\"].width();\n };\n\n const resize = function () {\n let _vertical_scroller_height = this.$[\"scroller\"][\"vertical\"].height(),\n _horizontal_scroller_width = this.$[\"scroller\"][\"horizontal\"].width(),\n _panel_height = this.$[\"panel\"][\"body\"].height(),\n _panel_width = this.$[\"panel\"][\"body\"].width(),\n _content_height = this.xvar.scrollContentHeight,\n _content_width = this.xvar.scrollContentWidth,\n verticalScrollBarHeight = _panel_height * _vertical_scroller_height / _content_height,\n horizontalScrollBarWidth = _panel_width * _horizontal_scroller_width / _content_width;\n\n if (verticalScrollBarHeight < this.config.scroller.barMinSize) verticalScrollBarHeight = this.config.scroller.barMinSize;\n if (horizontalScrollBarWidth < this.config.scroller.barMinSize) horizontalScrollBarWidth = this.config.scroller.barMinSize;\n\n this.$[\"scroller\"][\"vertical-bar\"].css({\n top: convertScrollBarPosition.vertical.call(this, this.$.panel[\"body-scroll\"].position().top, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n }),\n height: verticalScrollBarHeight\n });\n\n this.$[\"scroller\"][\"horizontal-bar\"].css({\n left: convertScrollBarPosition.horizontal.call(this, this.$.panel[\"body-scroll\"].position().left, {\n _content_width: _content_width,\n _content_height: _content_height,\n _panel_width: _panel_width,\n _panel_height: _panel_height,\n _horizontal_scroller_width: _horizontal_scroller_width,\n _vertical_scroller_height: _vertical_scroller_height,\n verticalScrollBarHeight: verticalScrollBarHeight,\n horizontalScrollBarWidth: horizontalScrollBarWidth\n }),\n width: horizontalScrollBarWidth\n });\n\n this.xvar.body_panel_height = _panel_height;\n this.xvar.body_panel_width = _panel_width;\n\n _vertical_scroller_height = null;\n _horizontal_scroller_width = null;\n _panel_height = null;\n _panel_width = null;\n _content_height = null;\n _content_width = null;\n verticalScrollBarHeight = null;\n horizontalScrollBarWidth = null;\n };\n\n GRID.scroller = {\n // 타이머\n moveout_timer: (new Date()).getTime(),\n init: init,\n resize: resize\n };\n\n})();","// ax5.ui.grid.tmpl\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const main = function () {\n return `\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
`;\n };\n\n const page_navigation = function(){\n return `\n {{#hasPage}}\n
\n {{#firstIcon}}{{{firstIcon}}} {{/firstIcon}}\n {{{prevIcon}}} \n
\n
\n {{#@paging}}\n {{pageNo}} \n {{/@paging}}\n
\n
\n {{{nextIcon}}} \n {{#lastIcon}}{{{lastIcon}}} {{/lastIcon}}\n
\n {{/hasPage}}\n
`;\n };\n\n const page_status = function(){\n return `{{{progress}}} {{fromRowIndex}} - {{toRowIndex}} of {{dataRowCount}} {{#totalElements}} Total {{.}}{{/totalElements}} `;\n };\n\n GRID.tmpl = {\n \"main\": main,\n \"page_navigation\": page_navigation,\n \"page_status\": page_status,\n\n get: function (tmplName, data, columnKeys) {\n let template = GRID.tmpl[tmplName].call(this, columnKeys);\n ax5.mustache.parse(template);\n return ax5.mustache.render(template, data);\n }\n };\n\n\n})();","// ax5.ui.grid.util\n(function () {\n\n const GRID = ax5.ui.grid;\n\n const U = ax5.util;\n\n /**\n * @method ax5grid.util.divideTableByFrozenColumnIndex\n * @param _table\n * @param _frozenColumnIndex\n * @returns {{leftHeaderData: {rows: Array}, headerData: {rows: Array}}}\n */\n const divideTableByFrozenColumnIndex = function (_table, _frozenColumnIndex) {\n\n let tempTable_l = {rows: []},\n tempTable_r = {rows: []};\n\n for (let r = 0, rl = _table.rows.length; r < rl; r++) {\n let row = _table.rows[r];\n\n tempTable_l.rows[r] = {cols: []};\n tempTable_r.rows[r] = {cols: []};\n\n for (let c = 0, cl = row.cols.length; c < cl; c++) {\n let col = jQuery.extend({}, row.cols[c]),\n colStartIndex = col.colIndex,\n colEndIndex = col.colIndex + col.colspan;\n\n if (colStartIndex < _frozenColumnIndex) {\n if (colEndIndex <= _frozenColumnIndex) {\n // 좌측편에 변형없이 추가\n tempTable_l.rows[r].cols.push(col);\n } else {\n let leftCol = jQuery.extend({}, col),\n rightCol = jQuery.extend({}, leftCol);\n\n leftCol.colspan = _frozenColumnIndex - leftCol.colIndex;\n rightCol.colIndex = _frozenColumnIndex;\n rightCol.colspan = col.colspan - leftCol.colspan;\n\n tempTable_l.rows[r].cols.push(leftCol);\n if (rightCol.colspan) {\n tempTable_r.rows[r].cols.push(rightCol);\n }\n }\n }\n else {\n // 오른편\n tempTable_r.rows[r].cols.push(col);\n }\n\n col = null;\n colStartIndex = null;\n colEndIndex = null;\n }\n\n row = null;\n }\n\n return {\n leftData: tempTable_l,\n rightData: tempTable_r\n }\n };\n\n const getTableByStartEndColumnIndex = function (_table, _startColumnIndex, _endColumnIndex) {\n\n let tempTable = {rows: []};\n for (let r = 0, rl = _table.rows.length; r < rl; r++) {\n let row = _table.rows[r];\n\n tempTable.rows[r] = {cols: []};\n for (let c = 0, cl = row.cols.length; c < cl; c++) {\n let col = jQuery.extend({}, row.cols[c]),\n colStartIndex = col.colIndex, colEndIndex = col.colIndex + col.colspan;\n\n if (_startColumnIndex <= colStartIndex || colEndIndex <= _endColumnIndex) {\n if (_startColumnIndex <= colStartIndex && colEndIndex <= _endColumnIndex) {\n // 변형없이 추가\n tempTable.rows[r].cols.push(col);\n }\n else if (_startColumnIndex > colStartIndex && colEndIndex > _startColumnIndex) {\n // 앞에서 걸친경우\n col.colspan = colEndIndex - _startColumnIndex;\n tempTable.rows[r].cols.push(col);\n }\n else if (colEndIndex > _endColumnIndex && colStartIndex <= _endColumnIndex) {\n tempTable.rows[r].cols.push(col);\n }\n }\n }\n }\n\n return tempTable;\n };\n\n const getMousePosition = function (e) {\n let mouseObj,\n originalEvent = (e.originalEvent) ? e.originalEvent : e;\n\n mouseObj = ('changedTouches' in originalEvent && originalEvent.changedTouches) ? originalEvent.changedTouches[0] : originalEvent;\n // clientX, Y 쓰면 스크롤에서 문제 발생\n return {\n clientX: mouseObj.pageX,\n clientY: mouseObj.pageY\n }\n };\n\n const ENM = {\n \"mousedown\": (ax5.info.supportTouch) ? \"touchstart\" : \"mousedown\",\n \"mousemove\": (ax5.info.supportTouch) ? \"touchmove\" : \"mousemove\",\n \"mouseup\": (ax5.info.supportTouch) ? \"touchend\" : \"mouseup\"\n };\n\n const makeHeaderTable = function (_columns) {\n let columns = _columns,\n cfg = this.config,\n table = {\n rows: []\n },\n colIndex = 0,\n maekRows = function (_columns, depth, parentField) {\n let row = {cols: []};\n let i = 0, l = _columns.length;\n let colspan = 1;\n\n for (; i < l; i++) {\n let field = jQuery.extend({}, _columns[i]);\n colspan = 1;\n\n if (!field.hidden) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = (function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n })();\n\n row.cols.push(field); // 복제된 필드 삽입\n\n if ('columns' in field) {\n colspan = maekRows(field.columns, depth + 1, field);\n } else {\n field.width = ('width' in field) ? field.width : cfg.columnMinWidth;\n }\n field.colspan = colspan;\n } else {\n\n\n }\n }\n\n if (row.cols.length > 0) {\n if (!table.rows[depth]) {\n table.rows[depth] = {cols: []};\n }\n table.rows[depth].cols = table.rows[depth].cols.concat(row.cols);\n return (row.cols.length - 1) + colspan;\n } else {\n return colspan;\n }\n\n };\n\n maekRows(columns, 0);\n\n // set rowspan\n for (let r = 0, rl = table.rows.length; r < rl; r++) {\n for (let c = 0, cl = table.rows[r].cols.length; c < cl; c++) {\n if (!('columns' in table.rows[r].cols[c])) {\n table.rows[r].cols[c].rowspan = rl - r;\n }\n }\n }\n\n return table;\n };\n\n const makeBodyRowTable = function (_columns) {\n let columns = _columns,\n table = {\n rows: []\n },\n colIndex = 0,\n maekRows = function (_columns, depth, parentField) {\n let row = {cols: []},\n i = 0,\n l = _columns.length,\n colspan = 1;\n\n let selfMakeRow = function (__columns) {\n let i = 0, l = __columns.length;\n for (; i < l; i++) {\n let field = jQuery.extend({}, __columns[i]),\n colspan = 1;\n\n if (!field.hidden) {\n\n if ('key' in field) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = (function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n })();\n\n row.cols.push(field);\n if ('columns' in field) {\n colspan = maekRows(field.columns, depth + 1, field);\n }\n field.colspan = colspan;\n }\n else {\n if ('columns' in field) {\n selfMakeRow(field.columns, depth);\n }\n }\n }\n else {\n\n }\n }\n };\n\n for (; i < l; i++) {\n let field = jQuery.extend({}, _columns[i]);\n colspan = 1;\n\n if (!field.hidden) {\n\n if ('key' in field) {\n field.colspan = 1;\n field.rowspan = 1;\n\n field.rowIndex = depth;\n field.colIndex = (function () {\n if (!parentField) {\n return colIndex++;\n } else {\n colIndex = parentField.colIndex + i + 1;\n return parentField.colIndex + i;\n }\n })();\n\n row.cols.push(field);\n if ('columns' in field) {\n colspan = maekRows(field.columns, depth + 1, field);\n }\n field.colspan = colspan;\n }\n else {\n if ('columns' in field) {\n selfMakeRow(field.columns, depth);\n }\n }\n }\n else {\n\n }\n\n field = null;\n }\n\n if (row.cols.length > 0) {\n if (!table.rows[depth]) {\n table.rows[depth] = {cols: []};\n }\n table.rows[depth].cols = table.rows[depth].cols.concat(row.cols);\n return (row.cols.length - 1) + colspan;\n }\n else {\n return colspan;\n }\n };\n\n maekRows(columns, 0);\n\n (function (table) {\n // set rowspan\n for (let r = 0, rl = table.rows.length; r < rl; r++) {\n let row = table.rows[r];\n for (let c = 0, cl = row.cols.length; c < cl; c++) {\n let col = row.cols[c];\n if (!('columns' in col)) {\n col.rowspan = rl - r;\n }\n col = null;\n }\n row = null;\n }\n })(table);\n\n return table;\n };\n\n const makeBodyRowMap = function (_table) {\n let map = {};\n _table.rows.forEach(function (row) {\n row.cols.forEach(function (col) {\n map[col.rowIndex + \"_\" + col.colIndex] = jQuery.extend({}, col);\n });\n });\n return map;\n };\n\n let makeFootSumTable = function (_footSumColumns) {\n let table = {\n rows: []\n };\n\n for (let r = 0, rl = _footSumColumns.length; r < rl; r++) {\n let footSumRow = _footSumColumns[r],\n addC = 0;\n\n table.rows[r] = {cols: []};\n\n for (let c = 0, cl = footSumRow.length; c < cl; c++) {\n if (addC > this.colGroup.length) break;\n let colspan = footSumRow[c].colspan || 1;\n if (footSumRow[c].label || footSumRow[c].key) {\n table.rows[r].cols.push({\n colspan: colspan,\n rowspan: 1,\n colIndex: addC,\n columnAttr: \"sum\",\n align: footSumRow[c].align,\n label: footSumRow[c].label,\n key: footSumRow[c].key,\n collector: footSumRow[c].collector,\n formatter: footSumRow[c].formatter\n });\n } else {\n table.rows[r].cols.push({\n colIndex: addC,\n colspan: colspan,\n rowspan: 1,\n label: \" \",\n });\n }\n addC += colspan;\n colspan = null;\n }\n\n if (addC < this.colGroup.length) {\n for (let c = addC; c < this.colGroup.length; c++) {\n table.rows[r].cols.push({\n colIndex: (c),\n colspan: 1,\n rowspan: 1,\n label: \" \",\n });\n }\n }\n footSumRow = null;\n addC = null;\n }\n\n return table;\n };\n\n const makeBodyGroupingTable = function (_bodyGroupingColumns) {\n let table = {\n rows: []\n },\n r = 0,\n addC = 0;\n\n table.rows[r] = {cols: []};\n for (let c = 0, cl = _bodyGroupingColumns.length; c < cl; c++) {\n if (addC > this.columns.length) break;\n let colspan = _bodyGroupingColumns[c].colspan || 1;\n if (_bodyGroupingColumns[c].label || _bodyGroupingColumns[c].key) {\n table.rows[r].cols.push({\n colspan: colspan,\n rowspan: 1,\n rowIndex: 0,\n colIndex: addC,\n columnAttr: \"default\",\n align: _bodyGroupingColumns[c].align,\n label: _bodyGroupingColumns[c].label,\n key: _bodyGroupingColumns[c].key,\n collector: _bodyGroupingColumns[c].collector,\n formatter: _bodyGroupingColumns[c].formatter\n });\n } else {\n table.rows[r].cols.push({\n rowIndex: 0,\n colIndex: addC,\n colspan: colspan,\n rowspan: 1,\n label: \" \"\n });\n }\n addC += colspan;\n }\n\n if (addC < this.colGroup.length) {\n for (var c = addC; c < this.colGroup.length; c++) {\n table.rows[r].cols.push({\n rowIndex: 0,\n colIndex: (c),\n colspan: 1,\n rowspan: 1,\n label: \" \",\n });\n }\n }\n\n return table;\n };\n\n const findPanelByColumnIndex = function (_dindex, _colIndex, _rowIndex) {\n let _containerPanelName,\n _isScrollPanel = false,\n _panels = [];\n\n if (this.xvar.frozenRowIndex > _dindex) _panels.push(\"top\");\n if (this.xvar.frozenColumnIndex > _colIndex) _panels.push(\"left\");\n _panels.push(\"body\");\n\n if (this.xvar.frozenColumnIndex <= _colIndex || this.xvar.frozenRowIndex <= _dindex) {\n _containerPanelName = _panels.join(\"-\");\n _panels.push(\"scroll\");\n _isScrollPanel = true;\n }\n\n return {\n panelName: _panels.join(\"-\"),\n containerPanelName: _containerPanelName,\n isScrollPanel: _isScrollPanel\n }\n };\n\n const getRealPathForDataItem = function (_dataPath) {\n let path = [],\n _path = [].concat(_dataPath.split(/[\\.\\[\\]]/g));\n\n _path.forEach(function (n) {\n if (n !== \"\") path.push(\"[\\\"\" + n.replace(/['\\\"]/g, \"\") + \"\\\"]\");\n });\n _path = null;\n return path.join(\"\");\n };\n\n\n GRID.util = {\n divideTableByFrozenColumnIndex: divideTableByFrozenColumnIndex,\n getTableByStartEndColumnIndex: getTableByStartEndColumnIndex,\n getMousePosition: getMousePosition,\n ENM: ENM,\n makeHeaderTable: makeHeaderTable,\n makeBodyRowTable: makeBodyRowTable,\n makeBodyRowMap: makeBodyRowMap,\n makeFootSumTable: makeFootSumTable,\n makeBodyGroupingTable: makeBodyGroupingTable,\n findPanelByColumnIndex: findPanelByColumnIndex,\n getRealPathForDataItem: getRealPathForDataItem,\n };\n\n})();"]}