/* 페이징 관련 변수 */
 // 근무설정
let workTotalCount   = 0;
let workTotalPages   = 0;

/*aggird*/
let workAgGridData = [];

let workSelectId = "";


 // 연차설정
let vacationTotalCount   = 0;
let vacationTotalPages   = 0;

/*aggird*/
let vacationAgGridData = [];

let vacationSelectId = "";

let selectRows = [];

/****************************************************************************
* 근무설정 정보 리스트 조회
****************************************************************************/
function fn_selectListWorkJson(){
	let formData = new FormData();
	formData.append("menuClass", menuClass);
	formData.append("workSearchKeywordParam", workSearchKeywordParam);
	formData.append("workSort", workSort);
	formData.append("workDir", workDir);
	formData.append("workStart", workStart);
	formData.append("workLimit", workLimit);
	formData.append("workSearchGroupId", workSearchGroupId);
	formData.append("workSearchDutyId", workSearchDutyId);

	$.ajax({
		url: encodeURI('/webwork/selectListWork.do'),
		data: formData,
		dataType: "json",
		processData: false,
		contentType: false,
		type: 'POST',
		async: true,
		success: function(data){
			if('0'==data.msgCode){
				// 페이징 처리
				workTotalCount  = data.totalCount;
				//$("#txt_workTotalCount").text(workTotalCount);
				
				workTotalPages = Math.ceil(workTotalCount/workLimit);
				
				// 리스트 조회
				workAgGridData = data.rows;
				workGridOptions.api.setRowData(workAgGridData);

				if(0<data.rows.length){
					//페이징 처리
					window.pagObj = $('#workPagination').twbsPagination({
						startPage    : ((workStart/workLimit)+1),
						totalPages   : (workTotalPages==0)?1:workTotalPages,
						visiblePages : 10,
						initiateStartPageClick: false,
						prev         : '<img src="/image/web/page_navigation_arrow.svg" alt="prev"/>',
						next         : '<img src="/image/web/page_navigation_arrow.svg" alt="next"/>',
						first        : '',
						last         : '',
						onPageClick: function (event, page) {
							fn_workPagination(page);
						}
					}).on('page', function (event, page) {
						//console.info(page + ' (from event listening)');
					});
				}
				else{
					
				}
			}
			else{
				modalEvent.danger("조회 오류", data.msgDesc);
			}
		},
		error : function(xhr, status, error) {
			modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
		},
		beforeSend:function(){
			// 로딩열기
			workGridOptions.api.showLoadingOverlay();
		},
		complete:function(){
			
		}
	});
}

/****************************************************************************
* 검색하기
****************************************************************************/
function fn_workSearch(param){
	if("A"!=param && "Y"!=selectUseYn){
		modalEvent.warning("", "조회 권한이 없습니다.");
		return false;
	}
	
	fn_workPaginReset();
	
	workSearchKeywordParam = $("#workSearchKeyword").val();

	workSearchGroupId    = $("#workSearchGroupId").val();
	workSearchDutyId     = $("#workSearchDutyId").val();

	fn_selectListWorkJson();
}


/****************************************************************************
* 초기화하기
****************************************************************************/
function fn_workReset(){
	// 조직
	fn_setGroupCombo();
	
	// 직무
	fn_setDutyCombo();
	
	// 조직
	$('#li_groupAll').click();
	
	// 직무
	$('#li_dutyAll').click();
	
	$("#workSearchKeyword").val("");

	fn_workSearch();
}

/****************************************************************************
* 페이징 처리
****************************************************************************/
function fn_workPagination(param){
	workStart = (parseInt(param)-1)*workLimit;
	
	fn_selectListWorkJson();
}

/****************************************************************************
* 페이징 리셋
****************************************************************************/
function fn_workPaginReset(){
	workSearchKeywordParam = '';

	workStart        = 0;
	workLimit        = 100;
	workTotalCount   = 0;
	workTotalPages   = 0;
	
	//페이징 초기화
	if($("#workPagination").data("twbs-pagination")){
		$("#workPagination").twbsPagination("destroy");
	}
}

/****************************************************************************
* 근무설정 삭제
****************************************************************************/
function fn_deleteWork(){
	if("Y"!=deleteUseYn){
		modalEvent.warning("", "삭제 권한이 없습니다.");
		return false;
	}
	
	if(!workSelectId){
		modalEvent.warning("", "삭제할 대상을 선택하세요.");
		return false;
	}

	modalEvent.info("삭제", "선택한 근무설정 정보를 삭제하시겠습니까?", function(){
		let formData = new FormData();
		formData.append("menuClass", menuClass);
		formData.append("selectId", workSelectId);

		$.ajax({
			url: encodeURI('/webwork/deleteWork.do'),
			data: formData,
			dataType: "json",
			processData: false,
			contentType: false,
			type: 'POST',
			async: true,
			success: function(data){
				if('0'==data.msgCode){
					modalEvent.success("삭제 성공", data.msgDesc, function(){
						fn_workOk();
					});
				}
				else{
					modalEvent.danger("삭제 오류", data.msgDesc);
				}
			},
			error : function(xhr, status, error) {
				modalEvent.danger("삭제 오류", "삭제 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
			},
			beforeSend:function(){
				
			},
			complete:function(){
				
			}
		});
	});
}

/****************************************************************************
* 검색 엔터 이벤트
****************************************************************************/
function fn_workEnter(e){
	if(e.which){
		// 파이어폭스
		if(13 == e.which) {
			//로그인 액션 스크립트
			fn_workSearch();
		}
	}
	else{
		// 윈도우, 사파리, 크롬
		if(13 == event.keyCode) {
			//로그인 액션 스크립트
			fn_workSearch();
		}
	}
}


/****************************************************************************
* 조직 옵션 조회
****************************************************************************/
function fn_setGroupCombo(){
	// 대상
	const target = $("#workSearchGroupId").siblings("ul.select_option_list");

	// 데이터 조회
	let comboData = fn_selectListGroupOption();
	
	// 조회 데이터 셋팅
	let comboHTML = '<li id="li_groupAll" class="option_list_item">조직 전체</li>';
	
	for(let i = 0; i < comboData.length; i++){
		let muGroupId     = comboData[i].muGroupId;
		let groupName     = comboData[i].groupName;
		
		comboHTML += '<li id="li_'+muGroupId+'" class="option_list_item">'+groupName+'</li>';
	}
	target.empty().html(comboHTML).trigger("create");

	// 콤보 이벤트
	target.find("li.option_list_item").click(function () {
		let selectIdArr = $(this).prop("id").split('_');
		let selectId    = selectIdArr[1];
		let selectName  = $(this).text();
		
		if(selectId.match("All")){
			selectId = '';
		}
		
		$(this).parent().siblings("button").text(selectName);
		$(this).parent().siblings("input").val(selectId);
	});
}

/****************************************************************************
* 직무 옵션 조회
****************************************************************************/
function fn_setDutyCombo(){
	// 대상
	const target = $("#workSearchDutyId").siblings("ul.select_option_list");
	
	// 데이터 조회
	let comboData = fn_selectListDutyOption();
	
	// 조회 데이터 셋팅
	let comboHTML = '<li id="li_dutyAll" class="option_list_item">직무 전체</li>';
	
	for(let i = 0; i < comboData.length; i++){
		let muDutyId     = comboData[i].muDutyId;
		let dutyName     = comboData[i].dutyName;
		
		comboHTML += '<li id="li_'+muDutyId+'" class="option_list_item">'+dutyName+'</li>';
	}
	target.empty().html(comboHTML).trigger("create");

	// 콤보 이벤트
	target.find("li.option_list_item").click(function () {
		let selectIdArr = $(this).prop("id").split('_');
		let selectId    = selectIdArr[1];
		let selectName  = $(this).text();

		if(selectId.match("All")){
			selectId = '';
		}
		
		$(this).parent().siblings("button").text(selectName);
		$(this).parent().siblings("input").val(selectId);
	});
}

/****************************************************************************
* 완료
****************************************************************************/
function fn_workOk(){
	fn_workReset();
}

function fn_insertWorkPopup(){
	if("Y"!=insertUseYn){
		modalEvent.warning("", "등록 권한이 없습니다.");
		return false;
	}
	
	let reqParam =  {};
	workInsertModal.popup(function(obj, reqParam) {
		fn_workOk();
	}, reqParam);
}
function fn_updateWorkPopup(muWorkId){
	if("Y"!=updateUseYn){
		modalEvent.warning("", "수정 권한이 없습니다.");
		return false;
	}

	let reqParam =  {"muWorkId":muWorkId};
	workUpdateModal.popup(function(obj, reqParam) {
		fn_workOk();
	}, reqParam);
}

// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/****************************************************************************
* 연차설정 정보 리스트 조회
****************************************************************************/
function fn_selectListVacationJson(){
	let formData = new FormData();
	formData.append("menuClass", menuClass);
	formData.append("vacationSearchKeywordParam", vacationSearchKeywordParam);
	formData.append("vacationSort", vacationSort);
	formData.append("vacationDir", vacationDir);
	formData.append("vacationStart", vacationStart);
	formData.append("vacationLimit", vacationLimit);
	
	$.ajax({
		url: encodeURI('/webvacation/selectListVacation.do'),
		data: formData,
		dataType: "json",
		processData: false,
		contentType: false,
		type: 'POST',
		async: true,
		success: function(data){
			if('0'==data.msgCode){
				// 리스트 조회
				vacationAgGridData = data.rows;
				vacationGridOptions.api.setRowData(vacationAgGridData);
			}
			else{
				modalEvent.danger("조회 오류", data.msgDesc);
			}
			 
		},
		error : function(xhr, status, error) {
			modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
		},
		beforeSend:function(){
			// 로딩열기
			vacationGridOptions.api.showLoadingOverlay();
		},
		complete:function(){
			
		}
	});
}

/****************************************************************************
* 연차설정 - 검색하기
****************************************************************************/
function fn_vacationSearch(param){
	if("A"!=param && "Y"!=selectUseYn){
		modalEvent.warning("", "조회 권한이 없습니다.");
		return false;
	}
	
	fn_vacationPaginReset();
	
	vacationSearchKeywordParam = $("#txt_vacationSearchKeyword").val();

	fn_selectListVacationJson();
}


/****************************************************************************
* 연차설정 - 초기화하기
****************************************************************************/
function fn_vacationReset(){
	// 조직
	fn_setGroupCombo();
	
	// 직무
	fn_setDutyCombo();
	
	// 조직
	$('#li_groupAll').click();
	
	// 직무
	$('#li_dutyAll').click();
	
	$("#txt_vacationSearchKeyword").val("");

	fn_vacationSearch();
}

/****************************************************************************
* 연차설정 - 페이징 처리
****************************************************************************/
function fn_vacationPagination(param){
	vacationStart = (parseInt(param)-1)*vacationLimit;
	
	fn_selectListVacationJson();
}

/****************************************************************************
* 연차설정 - 페이징 리셋
****************************************************************************/
function fn_vacationPaginReset(){
	vacationSearchKeywordParam = '';

	vacationStart        = 0;
	vacationLimit        = 100;
	vacationTotalCount   = 0;
	vacationTotalPages   = 0;
	
}

/****************************************************************************
* 연차설정 - 삭제
****************************************************************************/
function fn_deleteVacation(){
	if("Y"!=deleteUseYn){
		modalEvent.warning("", "삭제 권한이 없습니다.");
		return false;
	}
	
	if(!vacationSelectId){
		modalEvent.warning("", "삭제할 대상을 선택하세요.");
		return false;
	}

	modalEvent.info("삭제", "선택한 연차설정 정보를 삭제하시겠습니까?", function(){
		let formData = new FormData();
		formData.append("menuClass", menuClass);
		formData.append("selectId", vacationSelectId);

		$.ajax({
			url: encodeURI('/webvacation/deleteVacation.do'),
			data: formData,
			dataType: "json",
			processData: false,
			contentType: false,
			type: 'POST',
			async: true,
			success: function(data){
				if('0'==data.msgCode){
					modalEvent.success("삭제 성공", data.msgDesc, function(){
						fn_vacationOk();
					});

				}else{
					modalEvent.danger("삭제 오류", data.msgDesc);
				}
			},
			error : function(xhr, status, error) {
				modalEvent.danger("삭제 오류", "삭제 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
			},
			beforeSend:function(){
				
			},
			complete:function(){
				
			}
		});
	});
}

/****************************************************************************
* 연차설정 - 검색 엔터 이벤트
****************************************************************************/
function fn_vacationEnter(e){
	if(e.which){
		// 파이어폭스
		if(13 == e.which) {
			//로그인 액션 스크립트
			fn_vacationSearch();
		}
	}
	else{
		// 윈도우, 사파리, 크롬
		if(13 == event.keyCode) {
			//로그인 액션 스크립트
			fn_vacationSearch();
		}
	}
}

/****************************************************************************
* 연차설정 - 완료
****************************************************************************/
function fn_vacationOk(){
	fn_vacationReset();
}

function fn_insertVacationPopup(){
	if("Y"!=insertUseYn){
		modalEvent.warning("", "등록 권한이 없습니다.");
		return false;
	}
	
	let reqParam =  {};
	vacationInsertModal.popup(function(obj, reqParam) {
		fn_vacationOk();
	}, reqParam);
}

/****************************************************************************
* 페이지 init
****************************************************************************/
function fn_pageInit(){
	// 첫번째 탭 - 근무설정 조회
	// 조직
	fn_setGroupCombo();
	
	// 직무
	fn_setDutyCombo();
	
	// 초기 페이징 처리
	if(!workSearchGroupId){
		
	}else{
		$('#li_'+workSearchGroupId).click();
	}
	
	if(!workSearchDutyId){
		
	}else{
		$('#li_'+workSearchDutyId).click();
	}
	
	$("#workSearchKeyword").val(workSearchKeywordParam);
	fn_workSearch("A");
}

/****************************************************************************
* 페이지 event
****************************************************************************/
function fn_pageEvent(){
	// 근무 설정 - 검색 input
	$(document).on('keypress', '#workSearchKeyword', function(e) {
		fn_workEnter(e);
	});
	
	// 근무 설정 - 검색 버튼
	$("#btnSearchWork").click(function () {
		fn_workSearch();
	});
	
	// 근무 설정 - 근무일정 등록 버튼
	$("#btnInsertWork").click(function () {
		fn_insertWorkPopup();
	});
	
	// 연차 설정 - 연차유형 생성 버튼
	$("#btnInsertVacation").click(function () {
		fn_insertVacationPopup();
	});
	
	// 연차 설정 - 삭제 버튼
	$("#btnDeleteVacation").click(function () {
		fn_deleteVacation();
	});
	$("#btnDeleteWork").click(function () {
		fn_deleteWork(selectRows);
	});
	
	// 탭 이벤트
	$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
		let target = $(e.target).attr("href");
		
		if((target == '#work')) {
			// 근무설정
			// 조직
			fn_setGroupCombo();
			
			// 직무
			fn_setDutyCombo();
			
			// 초기 페이징 처리
			if(!workSearchGroupId){
				
			}else{
				$('#li_'+workSearchGroupId).click();
			}
			
			if(!workSearchDutyId){
				
			}else{
				$('#li_'+workSearchDutyId).click();
			}
			
			$("#workSearchKeyword").val(workSearchKeywordParam);
			fn_workSearch("A");
		}
		else if((target == '#vacation')) {
			// 연차 설정
			$("#txt_vacationSearchKeyword").val(vacationSearchKeywordParam);
			fn_vacationSearch("A");
		}
	});
}

$(function(){
	// 페이지 init
	fn_pageInit();
	
	// 페이지 event
	fn_pageEvent();
});

let workColumnDefs = [
	{field: "checkbox", headerName:"", minWidth:55, maxWidth:55, headerCheckboxSelection: true, checkboxSelection: true},
	{field: "rowNum", headerName:"번호", minWidth:60,sortable: false, cellStyle:{textAlign: 'center'}},
	{field: "workName", headerName:"근무일정명", minWidth:250, maxWidth:250, cellStyle:{cursor: 'pointer', color:'#3985EA'}},
	{field: "startEndTime", headerName:"시간",minWidth:150, maxWidth:150},
	{field: "groupName", headerName:"조직",minWidth:100, maxWidth:100},
	{field: "dutyName", headerName:"직무",minWidth:100,maxWidth: 100},
	{field: "etc", headerName:"메모",minWidth:864}
];

// let the grid know which columns and what data to use
let workGridOptions = {
	suppressRowTransform: true,
	columnDefs: workColumnDefs,
	defaultColDef: {		// 리스트 기본 설정
		flex: 1,
		sortable: true,		//정렬 여부
	    resizable: true,	//리사이즈
	    editable: true,	// 그리드에서 데이터 수정
	    cellStyle:{textAlign:'left',fontSize:'14px',padding:'0'},
	    //suppressSizeToFit:true,		//자동 맞춤
	    //enableRowGroup: true,		// 그룹 묶음
	    enablePivot: true,
		enableValue : true
	},
	//suppressMultiSort:true,  //단일솔트 true가 단일, false가 다중 shift + sort 시
	headerHeight : 41, // header 높이
	rowHeight : 41, // row 높이
	rowData : workAgGridData,
	suppressRowClickSelection : true, // 로우 클릭시 체크박스 선택 true no, false yes
	localeText : {
		noRowsToShow : '조회 결과가 없습니다.'
	}, //데이터 없을 시 나오는 문구
	rowSelection : 'multiple', // row 다중 선택
	debug : false,
	onCellClicked: function(event){ //셀 클릭 이벤트
		/* alert(event.column.colId); */
		if('workName'==event.column.colId){
			fn_updateWorkPopup(event.data.muWorkId);
		}
	},
	onSelectionChanged: function(event){ //체크박스 선택
		let selectRows = [];
		selectRows = event.api.getSelectedRows();
		
		workSelectId = '';
		for(let i=0; i<selectRows.length; i++){
			workSelectId += selectRows[i].muWorkId + ",";
		}
		workSelectId = workSelectId.substring(0, workSelectId.lastIndexOf(','));
	},
	onSortChanged: function(event){
		//정렬
		workSort = ''; //기존 정렬 초기화
		let columnArr = event.columnApi.getColumnState();
		if(0<columnArr.length){
			//sort index 순으로 재정렬
			columnArr.sort(function(a,b){
				return a.sortIndex - b.sortIndex;
			});
			
			let nullCnt = 0;
			for(let i=0; i<columnArr.length; i++){
				let gridSortModel = columnArr[i].colId;
				let gridSort = columnArr[i].sort;
				
				if(gridSort != null){
					workStart = 0;
					workSort += gridSortModel+' '+ gridSort + ',';
				}
				else{
					nullCnt++;
					
					if(nullCnt == columnArr.length){
						workSort = '';
						workDir = '';
						workStart = 0;
					}
				}
			}
		}
		workSort = workSort.substring(0,workSort.lastIndexOf( ",")); //맨끝 콤마 지우기

		fn_workSearch();
	}
};

// lookup the container we want the Grid to use
let workGridDiv = document.querySelector('#workGrid');

// create the grid passing in the div to use together with the columns & data we want to use
new agGrid.Grid(workGridDiv, workGridOptions);

// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
let vacationColumnDefs = [
	{field: "checkbox", headerName:"", minWidth:55, maxWidth:55, headerCheckboxSelection: true, checkboxSelection: true},
	{field: "rowNum", headerName:"번호", minWidth:60,sortable: false, cellStyle:{textAlign: 'center'}},
	{field: "vacationName", headerName:"연차유형명", minWidth:250, maxWidth:250/*, cellStyle:{cursor: 'pointer', color:'#3985EA'}*/},
	{field: "hourType", headerName:"시간",minWidth:150, maxWidth:150},
	{field: "availableDays", headerName:"연속 가능 일수",minWidth:150, maxWidth:150},
	{field: "etc", headerName:"메모",minWidth:914}
];

// let the grid know which columns and what data to use
let vacationGridOptions = {
	suppressRowTransform: true,
	columnDefs: vacationColumnDefs,
	defaultColDef: {		// 리스트 기본 설정
		flex: 1,
		sortable: true,		//정렬 여부
	    resizable: true,	//리사이즈
	    editable: true,	// 그리드에서 데이터 수정
	    cellStyle:{textAlign:'left',fontSize:'14px',padding:'0'},
	    //suppressSizeToFit:true,		//자동 맞춤
	    //enableRowGroup: true,		// 그룹 묶음
	    enablePivot: true,
		enableValue : true
	},
	//suppressMultiSort:true,  //단일솔트 true가 단일, false가 다중 shift + sort 시
	headerHeight : 41, // header 높이
	rowHeight : 41, // row 높이
	rowData : vacationAgGridData,
	suppressRowClickSelection : true, // 로우 클릭시 체크박스 선택 true no, false yes
	localeText : {
		noRowsToShow : '조회 결과가 없습니다.'
	}, //데이터 없을 시 나오는 문구
	rowSelection : 'multiple', // row 다중 선택
	debug : false,
	onCellClicked: function(event){ //셀 클릭 이벤트
		/* alert(event.column.colId); */
		if(event.column.colId=='vacationName'){
			//fn_updateVacationPopup(event.data.muVacationId);
		}
	},
	onSelectionChanged: function(event){ //체크박스 선택
		let selectRows = [];
		selectRows = event.api.getSelectedRows();
		
		vacationSelectId = '';
		for(let i=0; i<selectRows.length; i++){
			vacationSelectId += selectRows[i].muVacationId + ",";
		}
		vacationSelectId = vacationSelectId.substring(0, vacationSelectId.lastIndexOf(','));
	},
	onSortChanged: function(event){
		 //정렬
		vacationSort = ''; //기존 정렬 초기화
		let columnArr = event.columnApi.getColumnState();
		if(0<columnArr.length){
			//sort index 순으로 재정렬
			columnArr.sort(function(a,b){
				return a.sortIndex - b.sortIndex;
			});
			
			let nullCnt = 0;
			for(let i=0; i<columnArr.length; i++){
				let gridSortModel = columnArr[i].colId;
				let gridSort = columnArr[i].sort;

				if(gridSort != null){
					vacationStart = 0;
					vacationSort += gridSortModel+' '+ gridSort + ',';
				}
				else{
					nullCnt++;
					
					if(nullCnt == columnArr.length){
						vacationSort = '';
						vacationDir = '';
						vacationStart = 0;
					}
				}
			}
		}
		vacationSort = vacationSort.substring(0,vacationSort.lastIndexOf( ",")); //맨끝 콤마 지우기

		fn_vacationSearch();
	}
};
// lookup the container we want the Grid to use
let vacationGridDiv = document.querySelector('#vacationGrid');

// create the grid passing in the div to use together with the columns & data we want to use
new agGrid.Grid(vacationGridDiv, vacationGridOptions);