1 /**
  2  * Object gridUtil() Grid 관련 Util을 제공 합니다.<br>
  3  * grid related util
  4  * @constructor
  5  * @extends Object
  6  */
  7 var gridUtil = function(){};
  8 
  9 /**
 10  * 그리드에서 체크박스 선택된 행번호를 배열로 반환<br>
 11  * ex) gridSelectedRowIndex(grid, 'SELECTED').length 하면 선택된 행의 갯수를 알 수 있음.
 12  * get selected index as array
 13  * @memberOf gridUtil
 14  * @param {Object}
 15  *            grid WiseGrid Object - [WiseGrid Object]
 16  * @param {String}
 17  *            checkBoxId 체크박스 컬럼 키
 18  * @returns {Array}<br>
 19  *          선택 된 행번호 배열
 20  */
 21 gridUtil.selectedRowIndexes = function(grid, checkBoxId) {
 22 	var selectedRowIndexes = [];
 23 	for ( var i = 0; i < grid.getRowCount(); i++) {
 24 		if (grid.getCellValue(checkBoxId, i) === '1') {
 25 			selectedRowIndexes[selectedRowIndexes.length] = i;
 26 		}
 27 	}
 28 	return selectedRowIndexes;
 29 };
 30 
 31 /**
 32  * 그리드에서 행 번호를 인자로 받아 두 로우를 swap (swap grid row)<br>
 33  * swap grid row with row num
 34  * @memberOf gridUtil
 35  * @param {Object}
 36  *            grid WiseGrid Object - [WiseGrid Object]
 37  * @param {Number}
 38  *            sourceRow
 39  * @param {Number}
 40  *            targetRow
 41  */
 42 gridUtil.swapRow = function(grid, sourceRow, targetRow) {
 43 	var datas = grid.datas.getJSONData();
 44 	var source = datas[sourceRow];
 45 	var temp = datas[targetRow];
 46 	datas[targetRow] = source;
 47 	datas[sourceRow] = temp;
 48 	grid.datas.setData(datas);
 49 };
 50 
 51 /**
 52  * WiseGrid 자동선택 - 그리드의 Cell의 값이 변했을 때 선택 Box를 자동으로 체크.<br>
 53  * auto select check box when change cell value
 54  * @memberOf gridUtil
 55  * @param {Object}
 56  *            grid WiseGrid Object - [WiseGrid Object]
 57  * @param {String}
 58  *            checkBoxId 체크박스 컬럼 키
 59  * @param {String}
 60  *            strColumnKey 체크 할 컬럼의 ID
 61  * @param {Number}
 62  *            nRow Event가 발생한 Row Index
 63  * @param {String}
 64  *            oVal
 65  * @param {String}
 66  *            nVal
 67  */
 68 gridUtil.autoSelect = function(grid, checkBoxId, strColumnKey, nRow, oVal, nVal) {
 69 	if (oVal != nVal) {
 70 		grid.setCellValue(checkBoxId, nRow, "1");
 71 	}
 72 	if (checkBoxId == strColumnKey) {
 73 		grid.setCellValue(checkBoxId, nRow, (nVal == "1") ? "1" : "0");
 74 	}
 75 
 76 };
 77 
 78 /**
 79  * check box가 선택된 갯수를 반환<br>
 80  * get selected count
 81  * @param {Object}
 82  *            grid WiseGrid Object - [WiseGrid Object]
 83  * @param {String}
 84  *            checkBoxId 체크박스 컬럼 키
 85  * @returns {Number}
 86  */
 87 gridUtil.selectedRowCount = function(grid, checkBoxId) {
 88 	return gridUtil.selectedRowIndexes(grid, checkBoxId).length;
 89 };
 90 
 91 /**
 92  * 그리드에 선택된 행이 있는지 확인(Is grid check box selected?)<br>
 93  * chech selected row exist
 94  * @memberOf Popup
 95  * @param {Object}
 96  *            grid WiseGrid Object - [WiseGrid Object]
 97  * @param {String}
 98  *            checkBoxId 체크박스 컬럼 키
 99  * @returns {Boolean}
100  */
101 gridUtil.isSelected = function(grid, checkBoxId) {
102 	return gridUtil.selectedRowIndexes(grid, checkBoxId).length != 0;
103 };
104 
105 /**
106  * 그리드의 선택된 행수가 하나이면 true else false
107  * checked selected one
108  * @param {Object}
109  *            grid WiseGrid Object - [WiseGrid Object]
110  * @param {String}
111  *            checkBoxId 체크박스 컬럼 키
112  * @returns {Boolean}
113  */
114 gridUtil.isSelectOne = function(grid, checkBoxId) {
115 	return gridUtil.selectedRowCount(grid, checkBoxId) == 1;
116 };
117 
118 /**
119  * 그리드의 선택된 행수가 하나보다 많으면 true else false<br>
120  * check selected item is more than 0
121  * @param {Object}
122  *            grid WiseGrid Object - [WiseGrid Object]
123  * @param {String}
124  *            checkBoxId 체크박스 컬럼 키
125  * @returns {Boolean}
126  */
127 gridUtil.isSelectMoreThan1 = function(grid, checkBoxId) {
128 	return gridUtil.selectedRowCount(grid, checkBoxId) > 1;
129 };
130 
131 /**
132  * 선택 되어진 값 중 해당 컬럼에 값을 확인 확인 할 값과 Message 쌍을 넘겨서 해당 값이 있으면 그에 맞는 메시지를 출력 합니다.<br>
133  * validate selected row column whith given value, if  it's different alert given message.
134  * @param {Object}
135  *            grid WiseGrid Object - [WiseGrid Object]
136  * @param {String}
137  *            checkBoxId 체크박스 컬럼 키
138  * @param {String}
139  *            strColumnKey 체크 할 컬럼의 ID
140  * @param {Array}
141  *            givenValues
142  * @param {Array}
143  *            messages
144  * @returns {Boolean}
145  */
146 gridUtil.isContainGivenValue = function(grid, checkBoxId, strColumnKey, givenValues, messages) {
147 	var gridData = grid.datas.getJSONData();
148     var selectedIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
149 	for (var x in selectedIndexes) {
150 		for (var y in givenValues)
151 			if (gridData[selectedIndexes[x]][strColumnKey] === givenValues[y]) {
152 				alert(messages[y]);
153 				return true;
154 			}
155 	}
156 	return false;
157 };
158 
159 /**
160  * WiseUX에서 제공하는 transactionalStatus 컬럼의 값을 제어하기 위한 function<br>
161  * transactionalStatus의 값을 Selected Column의 값과 맞춘다.
162  * 
163  * @param {Object}
164  *            grid WiseGrid Object - [WiseGrid Object]
165  * @param {String}
166  *            strColumnKey - "SELECTED" Column Key
167  */
168 gridUtil.removeTransactionalStatus = function(grid, strColumnKey) {
169 	for(var i = 0; i < grid.getRowCount(); i++) {
170 		if(grid.getCellValue(strColumnKey, i) != "1") {
171 			grid.cancelCRUDRow(i);
172 		}
173 	}
174 };
175 
176 /**
177  * 선택 되어진 값 중 해당 컬럼에 주어진 값의 Count 를 반환 합니다.<br>
178  * return selected count with given value
179  * @param {Object}
180  *            grid WiseGrid Object - [WiseGrid Object]
181  * @param {String}
182  *            checkBoxId 체크박스 컬럼 키
183  * @param {String}
184  *            strColumnKey 체크 할 컬럼의 ID
185  * @param {String}
186  *            givenValue
187  * @returns {Number}
188  */
189 gridUtil.containGivenValueCount = function(grid, checkBoxId, strColumnKey, givenValue) {
190 	var gridData = grid.datas.getJSONData();
191     var selectedIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
192 	var count = 0;
193 	for (var x in selectedIndexes) {
194 		if (gridData[selectedIndexes[x]][strColumnKey] === givenValue) {
195 			count++;
196 		}
197 	}
198 	return count;
199 };
200 
201 /**
202  * 컬럼과 행번호를 넘겨 해당 위치에 값이 존재하는지 확인 값이 null 이거나 빈값이면 false를 return<br>
203  * check isEmpty selected row with given column
204  * @param {Object}
205  *            grid WiseGrid Object - [WiseGrid Object]
206  * @param {String}
207  *            checkBoxId 체크박스 컬럼 키
208  * @param {String}
209  *            strColumnKey 체크 할 컬럼의 ID
210  * @param {Number}
211  *            nRow RowIndex
212  * @returns {Boolean}
213  */
214 
215 gridUtil.validateRowReruiredValue = function(grid, checkBoxId, strColumnKey, nRow) {
216 	for (x in strColumnKeys) {
217 		var strColumnKey = strColumnKeys[x];
218 		var hiddenValue = grid.getCellHiddenValue(strColumnKey, nRow);
219 		var cellValue = grid.getCellValue(strColumnKey, nRow);
220 		var value = grid.getColType(strColumnKeys[x]) === 't_combo' ? hiddenValue : cellValue;
221 		if (value === null || value === '') {
222 			return false;
223 		}
224 	}
225 	return true;
226 };
227 
228 /**
229  * 컬럼과 행번호를 넘겨 해당 위치에 값이 존재하는지 확인
230  * 값이 null 이거나 빈값이면 message를 출력하고 false를 return
231  * check isEmpty selected row with given column, message
232  * @param {Object}
233  *            grid WiseGrid Object - [WiseGrid Object]
234  * @param {String}
235  *            checkBoxId 체크박스 컬럼 키
236  * @param {String}
237  *            strColumnKey 체크 할 컬럼의 ID
238  * @param {Number}
239  *            nRow RowIndex
240  * @param {String}
241  *            message
242  * @returns {Boolean}
243  */
244 gridUtil.validateRowReruiredValueWithMessage = function(grid, checkBoxId, strColumnKey, nRow, message) {
245 	if (gridUtil.validateRowReruiredValue(grid, checkBoxId, strColumnKey, nRow) === false) {
246 		alert(message);
247 		grid.setCellFocus(strColumnKey, nRow, true);
248 		return false;
249 	}
250 	return true;
251 };
252 
253 /**
254  * 체크박스가 선택된 모든 로우와 Array로 받은 컬럼 키에 해당하는 곳에 모두 데이터가 들어 있는지 확인<br>
255  * 널이거나 빈값이 있다면 메시지를 출력하고 false return
256  * check isEmpty givenRow row with given column, message
257  * @param {Object}
258  *            grid WiseGrid Object - [WiseGrid Object]
259  * @param {String}
260  *            checkBoxId 체크박스 컬럼 키
261  * @param {String}
262  *            strColumnKey 체크 할 컬럼의 ID
263  * @param {Number}
264  *            nRow RowIndex
265  * @param {String}
266  *            message
267  * @returns {Boolean}
268  */
269 gridUtil.validateSelectedRowRequiredValueWithMessage = function(grid, strColumnKeys, checkBoxId, message) {
270 	var rowIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
271 	for ( var x in rowIndexes){
272 		for ( var y in strColumnKeys) {
273 			if (gridUtil.validateRowReruiredValue(grid, checkBoxId, strColumnKey[y], rowIndexes[x]) === false) {
274 				alert(message);
275 				grid.setCellFocus(strColumnKey[y], rowIndexes[x], true);
276 				return false;
277 			}
278 		}
279 	}
280 	return true;
281 };
282 
283 /**
284  * WiseGrid 필수값 체크 : Grid가 자동으로 생성될 때 DB에 지정한 필수컬럼을 자동으로 array로 만든다.<br>
285  * check grid mandatory value
286  * @param grid
287  * 		WiseGrid Object - [WiseGrid Object]
288  * @param selColID
289  * 		grid의 데이터 중 선택된 행만 체크하기 위한 '선택' 컬럼의 컬럼키명. - [String]
290  * @param message
291  * 		컬럼값이 null일 때 표시 할 메세지 - [String]
292  * @returns {Boolean}
293  */
294 gridUtil.gridRequired = function(grid, selColID, message){
295 
296 	var gridRow = grid.getRowCount();
297 	var args = eval(grid.getId()+"Element").validationColumns;
298 
299 	if(args != null && args != "") {
300 		for(var i = 0; i < gridRow; i++){
301 			if(grid.getCellValue(selColID, i) == "1"){
302 				for(var j = 0; j < args.length; j++){
303 					if(grid.getColType(args[j]) == 't_combo'){
304 						if(grid.getCellHiddenValue(args[j], i) == null || grid.getCellHiddenValue(args[j], i) == ""){
305 							alert(message);
306 							grid.setCellFocus(args[j], i, true);
307 							return false;
308 						}
309 					} else {
310 						if(grid.getCellValue(args[j], i) == null || grid.getCellValue(args[j], i) == ""){
311 							alert(message);
312 							grid.setCellFocus(args[j], i, true);
313 							return false;
314 						}
315 					}
316 				}
317 			}
318 		}
319 	}
320 	return true;
321 };
322 
323 /**
324  * WiseGrid 필수값 체크 : 사용자가 체크 할 Column을 array로 만들어 넘긴다.<br>
325  * check grid mandatory value with given grid column
326  * @param grid
327  * 		WiseGrid Object - [WiseGrid Object]
328  * @param args
329  * 		체크 할 컬럼명 ex) args = ["HOUSE_CODE","USER_ID"]; - [Array]
330  * @param selColID
331  * 		grid의 데이터 중 선택된 행만 체크하기 위한 '선택' 컬럼의 컬럼키명. - [String]
332  * @param message
333  * 		컬럼값이 null일 때 표시 할 메세지 - [String]
334  * @returns {Boolean}
335  */
336 gridUtil.gridRequiredCustom = function(grid, args, selColID, message){
337 
338 	var gridRow = grid.getRowCount();
339 
340 	if(args != null && args != "") {
341 		for(var i = 0; i < gridRow; i++){
342 			if(grid.getCellValue(selColID, i) == "1"){
343 				for(var j = 0; j < args.length; j++){
344 					if(grid.getColType(args[j]) == 't_combo'){
345 						if(grid.getCellHiddenValue(args[j], i) == null || grid.getCellHiddenValue(args[j], i) == ""){
346 							alert(message);
347 							grid.setCellFocus(args[j], i, true);
348 							return false;
349 						}
350 					} else {
351 						if(grid.getCellValue(args[j], i) == null || grid.getCellValue(args[j], i) == ""){
352 							alert(message);
353 							grid.setCellFocus(args[j], i, true);
354 							return false;
355 						}
356 					}
357 				}
358 			}
359 		}
360 	}
361 	return true;
362 };
363 /**
364  * 
365  */
366  /**
367   * WiseGrid 필수값 체크 : 전체 데이터 중 특정 컬럼의 특정 값을 가진 Row만 체크.<br>
368   * check grid mandatory value with given grid column and given value
369  * @param grid
370  * 		WiseGrid Object - [WiseGrid Object]
371  * @param args
372  * 		체크 할 컬럼명 ex) args = ["HOUSE_CODE","USER_ID"]; - [Array]
373  * @param selColID
374  * 		grid의 데이터 중 선택된 행만 체크하기 위한 '선택' 컬럼의 컬럼키명. - [String]
375  * @param checkColID
376  * 		체크해야 할 컬럼의 컬럼 ID - [String]
377  * @param checkVal
378  * 		체크해야 할 값 - [String]
379  * @param message
380  * 		컬럼값이 null일 때 표시 할 메세지 - [String]
381  * @returns {Boolean}
382  */
383 gridUtil.gridCaseRequired = function(grid, args, selColID, checkColID, checkVal, message){
384 
385      var gridRow = grid.getRowCount();
386      var checkColVal = "";
387      var gridVal = "";
388 
389      for(var i = 0; i < gridRow; i++){
390 
391          if(grid.getCellValue(selColID, i) == "1"){
392          	
393          	checkColVal = grid.getColType(checkColID) == "t_combo" ? grid.getCellHiddenValue(checkColID, i) : grid.getCellValue(checkColID, i);
394 
395          	if(checkColVal == checkVal){
396                  
397          		for(var j = 0; j < args.length; j++){
398                  	
399                  	gridVal = grid.getColType(args[j]) == "t_combo" ? grid.getCellHiddenValue(args[j], i) : grid.getCellValue(args[j], i);   
400                  		
401                  	if(gridVal == null || gridVal == ""){
402                          alert(message);
403                          grid.setCellFocus(args[j], i, true);
404                          return false;
405                      }
406                  }
407              }
408          }
409     }
410 	return true;
411 };
412  
413 /**
414  * 선택한 행들을 삭제. transactional stauts 가 C인 건만 삭제<br>
415  * delete selected row when transactional stauts is C
416  * @param grid
417  * @param checkBoxId
418  */
419 gridUtil.deleteRows = function(grid, checkBoxId) {
420 	var rowIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
421 	rowIndexes.reverse();
422 
423 	for (x in rowIndexes) {
424 		var rowIndex = rowIndexes[x];
425 			grid.deleteRow(rowIndex);
426 	}
427 };
428 
429 /**
430  * 선택한 행들을 삭제. transactional stauts 무시하고 삭제<br>
431  * delete selected row ignore transactional stauts
432  * 
433  * @param {Object}
434  *            grid WiseGrid Object - [WiseGrid Object]
435  * @param {String}
436  *            checkBoxId 체크박스 컬럼 키
437  */
438 gridUtil.deleteRowsIgnoreTransactionalStatus = function(grid, checkBoxId) {
439 	var rowIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
440 	rowIndexes.reverse();
441 
442 	for (x in rowIndexes) {
443 		var rowIndex = rowIndexes[x];
444 		if(grid.getCellValue('transactionalStatus', rowIndex) === ''){
445 			grid.deleteRow(rowIndex);
446 		} else {
447 			grid.deleteRow(rowIndex, false);
448 		}
449 	}
450 };
451 
452 
453 /**
454  * transactionStatus가 'C'인 행만 삭제 (행추가한 행만 삭제) 다른 status가 있는지 여부를 반환
455  * delete selected row when transactional stauts is C reutrn other status exist
456  * @param grid
457  * @param checkBoxId
458  * @return isExistOtherStatus	선택한 행 중 상태가 'C'가 아닌 다른 상태의 행이 존재하면 true 리턴
459  */
460 gridUtil.deleteAddedRows = function(grid, checkBoxId) {
461 	
462 	var rowIndexes = gridUtil.selectedRowIndexes(grid, checkBoxId);
463 	rowIndexes.reverse();
464 
465 	var isExistOtherStatus = false;
466 	for (x in rowIndexes) {
467 		var gridStatus = grid.getCellValue('transactionalStatus', rowIndexes[x]);
468 		if(gridStatus == 'C') {
469 			grid.deleteRow(rowIndexes[x]);
470 		} else {
471 			isExistOtherStatus = true;
472 		}
473 	}
474 	return isExistOtherStatus;
475 };
476 
477 /**
478  * Grid Data를 Excel File로 Import<br>
479  * import grid data from excel file
480  * @param {Object}
481  *            grid WiseGrid Object - [WiseGrid Object]
482  */
483 gridUtil.excelUpload = function(grid) {
484 	grid.excelImport('','importall','row',true,true);
485 };
486 
487 /**
488  * Grid Data를 Excel File로 Export<br>
489  * export grid data to excel file
490  * @param {Object}
491  *            grid WiseGrid Object - [WiseGrid Object]
492  */
493 gridUtil.excelDown = function(grid) {
494 	grid.excelExport('','',true,true);
495 };
496