이호영 이호영 2024-07-19
dateUtils.js or java 작업
@01cd8f78a6f9063796d9adff44de930dad33a2fb
src/main/java/itn/com/cmm/util/DateUtils.java
--- src/main/java/itn/com/cmm/util/DateUtils.java
+++ src/main/java/itn/com/cmm/util/DateUtils.java
@@ -121,15 +121,19 @@
     }
 
     // 현재 날짜에서 특정 일수 전 날짜를 기본 포맷으로 반환
-    public static String getDateDaysAgo(int days) {
-        return getDateDaysAgo(days, SLUSH_FORMATTER);
+    public static String getDateMonthsAgo(int months) {
+        return getDateMonthsAgo(months, SLUSH_FORMATTER);
     }
 
     // 현재 날짜에서 특정 일수 전 날짜를 지정된 포맷으로 반환
-    public static String getDateDaysAgo(int days, DateTimeFormatter formatter) {
+    public static String getDateMonthsAgo(int months, DateTimeFormatter formatter) {
         LocalDate today = LocalDate.now();
-        LocalDate daysAgo = today.minusDays(days);
-        return daysAgo.format(formatter);
+//        System.out.println("months : "+ months);
+//        System.out.println("today.minusMonths(months) : "+ today.minusMonths(months).format(formatter));
+        LocalDate monthsAgo = today.minusMonths(months).plusDays(1);
+//        System.out.println("monthsAgo : " + monthsAgo);
+//        System.out.println("monthsAgo.format(formatter) : " + monthsAgo.format(formatter));
+        return monthsAgo.format(formatter);
     }
 
 	
src/main/java/itn/let/mjo/msgCustom/web/MjonMsgCustomWebController.java
--- src/main/java/itn/let/mjo/msgCustom/web/MjonMsgCustomWebController.java
+++ src/main/java/itn/let/mjo/msgCustom/web/MjonMsgCustomWebController.java
@@ -145,7 +145,7 @@
     	// 내 보관함 - 기본 날짜 검색 셋팅
     	// 오늘 날짜에서 365일 날짜 가져와서 
     	// 검색날짜에 입력
-    	model.addAttribute("myStartDate", DateUtils.getDateDaysAgo(365));
+    	model.addAttribute("myStartDate", DateUtils.getDateMonthsAgo(12));
     	model.addAttribute("myEndDate", DateUtils.getCurrentDate());
     	
     	
@@ -231,7 +231,7 @@
 		// 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색
 		if(!DateUtils.dateChkAndValueChk(mjonMsgCustomVO.getSearchStartDate(),mjonMsgCustomVO.getSearchEndDate(), 12 )) {
 
-			mjonMsgCustomVO.setSearchStartDate(DateUtils.getDateDaysAgo(365));
+			mjonMsgCustomVO.setSearchStartDate(DateUtils.getDateMonthsAgo(12));
 			mjonMsgCustomVO.setSearchEndDate(DateUtils.getCurrentDate());
 			
 		};
src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
--- src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
+++ src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
@@ -35,6 +35,7 @@
 import itn.com.cmm.LoginVO;
 import itn.com.cmm.service.EgovFileMngService;
 import itn.com.cmm.service.EgovFileMngUtil;
+import itn.com.cmm.util.DateUtils;
 import itn.com.utl.fcc.service.EgovStringUtil;
 import itn.let.kakao.user.sent.service.KakaoSentService;
 import itn.let.mjo.addr.service.AddrGroupService;
@@ -235,21 +236,23 @@
     	
     	if(startDate == null && endDate == null ) {
     		
-    		Calendar cal = Calendar.getInstance();
-        	Date now = new Date();
-        	
-        	SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
-
-        	//종료일은 오늘날짜
-        	cal.setTime(now);
-        	endDate = format.format(cal.getTime());
-
-        	//시작일은 전날로 셋팅
-        	cal.add(Calendar.DATE, -1);
-        	startDate = format.format(cal.getTime());
     		
-        	mjonMsgSentVO.setStartDate(startDate);
-        	mjonMsgSentVO.setEndDate(endDate);
+//    		
+//    		Calendar cal = Calendar.getInstance();
+//        	Date now = new Date();
+//        	
+//        	SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
+//
+//        	//종료일은 오늘날짜
+//        	cal.setTime(now);
+//        	endDate = format.format(cal.getTime());
+//
+//        	//시작일은 전날로 셋팅
+//        	cal.add(Calendar.DATE, -1);
+//        	startDate = format.format(cal.getTime());
+    		
+        	mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3));
+        	mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate());
         	
     	}
     	
@@ -455,6 +458,16 @@
 		mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex());
 		mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
     	
+		
+		
+		if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getStartDate(),mjonMsgSentVO.getEndDate(), 3 )) {
+			mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3));
+			mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate());
+		};
+
+    	model.addAttribute("startDate", mjonMsgSentVO.getStartDate());
+    	model.addAttribute("endDate", mjonMsgSentVO.getEndDate());
+		
     	//전체 발송 리스트 불러오기
     	List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO);
     	model.addAttribute("resultAllSentList", resultAllSentList);
src/main/java/itn/let/mjo/pay/web/MjonPayController.java
--- src/main/java/itn/let/mjo/pay/web/MjonPayController.java
+++ src/main/java/itn/let/mjo/pay/web/MjonPayController.java
@@ -2030,8 +2030,10 @@
 
     			{
     				// 초기 날짜 셋팅
-    				model.addAttribute("startDate", DateUtils.getDateDaysAgo(365));
+    				model.addAttribute("startDate", DateUtils.getDateMonthsAgo(13));
     				model.addAttribute("endDate", DateUtils.getCurrentDate());
+//    				model.addAttribute("startDate", DateUtils.getDateDaysAgo(365));
+//    				model.addAttribute("endDate", DateUtils.getCurrentDate());
     			}
 
 
@@ -2121,7 +2123,7 @@
 //			mjonPayVO.setEndDate(mjonPayVO.getEndDate() == null ? DateUtil.getCurrentDate() : mjonPayVO.getEndDate());
 			
 			if(!DateUtils.dateChkAndValueChk(mjonPayVO.getStartDate(),mjonPayVO.getEndDate(), 12 )) {
-				mjonPayVO.setStartDate(DateUtils.getDateDaysAgo(365));
+				mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12));
 				mjonPayVO.setEndDate(DateUtils.getCurrentDate());
 			};
 			
@@ -2738,7 +2740,7 @@
 		}
 		{
 			// 초기 날짜 셋팅
-			model.addAttribute("startDate", DateUtils.getDateDaysAgo(365));
+			model.addAttribute("startDate", DateUtils.getDateMonthsAgo(12));
 			model.addAttribute("endDate", DateUtils.getCurrentDate());
 		}
 		
@@ -2793,7 +2795,7 @@
 			// 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색
 			if(!DateUtils.dateChkAndValueChk(mjonMsgVO.getStartDate(),mjonMsgVO.getEndDate(), 12 )) {
 
-				mjonMsgVO.setStartDate(DateUtils.getDateDaysAgo(365));
+				mjonMsgVO.setStartDate(DateUtils.getDateMonthsAgo(12));
 				mjonMsgVO.setEndDate(DateUtils.getCurrentDate());
 				
 			};
src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
--- src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
+++ src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
@@ -442,6 +442,7 @@
 			userSearchVO.setCandidateYn("Y");
 			
 			List<?> resultList = mberManageService.selectMberLoginAddList(userSearchVO);
+			System.out.println("?????????????????????????????");
 			model.addAttribute("resultList", resultList);
 			paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
 			model.addAttribute("paginationInfo", paginationInfo);
@@ -998,7 +999,7 @@
 		
 		//회원정보 불러오기
 		mberManageVO = mberManageService.selectMber(reqMberManageVO.getMberId());
-		
+		System.out.println(" mberManageVOmberManageVO");
 		//스팸 필터링 예외처리 여부 값 - (온: Y, 오프 : N) 온 일때 스미싱의심 예외 되도록 적용
 		String exceptSpamYn = mberManageVO.getExceptSpamYn();
 		model.addAttribute("exceptSpamYn", exceptSpamYn);
 
src/main/webapp/WEB-INF/jsp/web/addr/AddrList_advcBackup_20240717.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/addr/AddrList_advcBackup_20240717.jsp
@@ -0,0 +1,1623 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
+<script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script>
+
+<script type="text/javascript">
+var tableErrorData = [];
+var tableErrorCheckData = [];
+var addrMassDupliSaveList = null;
+
+var gArrRestartIndex = 0;	//배열 재시작카운드
+var gNameList = [];		//치환문자 이름
+var gPhoneList = [];	//받는사람
+var gInfo1List = [];		//치환문자1
+var gInfo2List = [];		//치환문자2
+var gInfo3List = [];		//치환문자3
+var gInfo4List = [];		//치환문자4
+var gMemoList = [];			//메모
+
+$(document).ready(function(){
+	listAddrGrp();
+	addrLoadAjax();
+	
+	// 주소록 대량등록
+	addrMassTab(1);	
+	
+	// 중복 휴대폰번호 버튼 노출여부
+	$("#btnAddrMassDupli").hide();
+	$("#btnAddrMassSaveDupli").hide();
+}); 
+
+function listAddrGrp(){
+	var sendData = $(document.searchAddrGrpForm).serializeArray() ;
+	$("#adr1_left").load("/web/addr/selectAddrGroupListAjax.do", sendData ,function(response, status, xhr){});
+}
+
+function addrGroupLoadAjax(){
+	$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+	$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+}
+
+function addrLoadAjax(){
+	$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do",  function(response, status, xhr){tableAllChk();});
+	addrGroupLoadAjax();
+}
+
+function insertAddrGroupAjax() {
+	var form = document.addrGrpInsertForm;
+	if(form.addrGrpNm.value == "") {
+		alert("주소록 그룹명을 입력해주세요.");
+		return;
+	}
+	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
+		return;
+	}
+	var data = new FormData(form);
+	
+	$.ajax({
+		cache : false,
+		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
+		type : 'POST', 
+		data : data,
+		dataType:'json',
+		processData: false,
+		contentType: false,
+		success : function(returnData, status){
+			if(status == "success") {
+				if("fail"==returnData.result){
+					alert(returnData.message);
+					return;
+				} else if("dupl"==returnData.result) {
+					alert("중복된 그룹명입니다.");
+					return;
+				}
+				alert("등록되었습니다.");
+				listAddrGrp();
+				addrGroupLoadAjax();
+				
+			}else{ alert("ERROR!");return;} 
+		},
+		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+	
+}
+
+function insertAddrAjax() {
+	var selectVal = $("#addrRegistSelect option:selected").val();
+	//alert(selectVal);
+	
+	var form = document.addrInsertForm;
+	/*
+	//필수값 아니어서 뺐음
+	if(form.addrNm.value == "") {
+		alert("주소록 이름을 입력하세요");
+		return;
+	}
+	*/
+	if(form.addrPhoneNo.value == "") {
+		alert("주소록 번호를 입력하세요");
+		return;
+	}
+	//if(!confirm("주소록을 추가하시겠습니까?")) {
+	//	return;
+	//}
+	
+	if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
+		if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
+			
+			alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
+			return false;
+			
+		}
+		
+	}
+	
+	var data = new FormData(form);
+
+	$.ajax({
+		cache : false,
+		url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />", 
+		type : 'POST', 
+		data : data,
+		dataType:'json',
+		processData: false,
+		contentType: false,
+		success : function(returnData, status){
+			if(status == "success") {
+				if("fail"==returnData.result){
+					alert(returnData.message);
+					return;
+				} else if("dupl"==returnData.result){
+					alert("해당 그룹에 중복된 번호가 있습니다.");
+					return;
+				}
+				//alert("저장 되었습니다.");
+				
+				listAddrGrp();
+				addrGroupLoadAjax();
+				addrLoadAjax();
+				
+				// 주소록그룹 콤보박스 유지
+				setTimeout(setSelectSetting, 500, selectVal);			
+				
+			}else{ alert("ERROR!");return;} 
+		},
+		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+	
+}
+
+// 주소록그룹 콤보박스 유지
+function setSelectSetting(selectVal) {
+	$("#addrRegistSelect").val(selectVal).prop("selected", true);	
+}
+	
+function linkPage(pageNo){
+	if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
+		// 문자전송 검색용
+		$("#msgStartKeyword").val("");
+	}
+
+	var searchForm = document.searchAddrForm;
+	searchForm.pageIndex.value = pageNo;
+	searchForm.pageUnit.value = $('#pageUnit').val();
+	searchForm.searchCondition.value = $('#searchConditionAddr').val();
+	searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
+	searchForm.startKeyword.value = $("#msgStartKeyword").val();
+	
+	var sendData = $(document.searchAddrForm).serializeArray();
+	$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
+	addrGroupLoadAjax();
+}
+
+function moveTab(type){
+	if(type == "addr") 			location.href="/web/mjon/addr/selectAddrList.do";
+	if(type == "fax") 			location.href="/web/mjon/fax/addr/selectFaxAddrList.do";
+	if(type == "block") 		location.href="/web/mjon/addrBlock/selectBlockList.do";
+	if(type == "addrMob") 		location.href="/web/mjon/addr/addrMobGuide.do";
+	if(type == "addrApply") 	location.href="/web/mjon/addragency/selectAddrAgencyList.do";
+}
+
+
+
+//#############################################################################################
+//Tabulator
+//#############################################################################################
+var tableR = null; //우측 주소록 불러오기 Tabulator 변수
+
+/* 파일등록 */
+var _fileIdx = 0;
+var _fileForm2 = new Array();
+var fileExt = ""; // 첨부파일 확장자
+var excelAddr = []; //엑셀 불러오기에서 내용 저장하는 배열 변수
+
+$(document).ready(function(){
+	//Tabulator AJAX Data Loading
+	tableR = new Tabulator(".callList_box", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    //data:tabledata,
+	    //autoColumns:true,
+	    headerHozAlign:"center",
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
+	 	        cell.getRow().toggleSelect();
+		 		}
+		 	}, 
+		 	{title:"이름", hozAlign:"center", field:"name", editor:"input", width:140, validator:["maxLength:12", "string"]},
+		 	{title:"휴대폰", hozAlign:"center", field:"phone", editor:"input", width:145, validator:["required","minLength:10", "maxLength:13"]},
+		 	{title:"[*1*]", hozAlign:"center", field:"info1", editor:"input", width:100, validator:["maxLength:100", "string"]},
+		 	{title:"[*2*]", hozAlign:"center", field:"info2", editor:"input", width:100, validator:["maxLength:100", "string"]},
+		 	{title:"[*3*]", hozAlign:"center", field:"info3", editor:"input", width:100, validator:["maxLength:100", "string"]},
+		 	{title:"[*4*]", hozAlign:"center", field:"info4", editor:"input", width:100, validator:["maxLength:100", "string"]},
+		 	{title:"메모", hozAlign:"center", field:"memo", editor:"input", width:119, validator:["maxLength:100", "string"]}
+	 	],
+	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
+	        var valid = cell.isValid();
+	 		if(!valid){
+	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
+	 			
+	 			//해당 셀 데이터 삭제
+	 			cell.setValue("");
+	 		}
+	 		return value % parameters.phone;
+	    },
+	});
+
+	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
+	$('.callList_box').on('paste', function (e) {
+		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
+		var elmSplit= [];
+		elmSplit = element.split("\n");
+		var elmLen = elmSplit.length;
+		if(elmLen < 0){
+			alert("붙여넣을 연락처를 복사해주세요.");
+			return false;
+		}else{
+			if (elmLen > 20001) {
+				alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
+				return false;
+			}			
+			
+			tableErrorData.length = 0;	// 오류 번호 배열 초기화
+
+			var splitData = [];
+			var realPhone = [];
+			for(var i=0; i < elmLen; i++){
+				var splitStr = elmSplit[i];
+				var tabData = splitStr.split("\t"); //탭 구분으로 데이터 분할
+				var comData = splitStr.split(","); //콤마 구분으로 데이터 분할
+				if(tabData.length >= 2){
+					splitData = tabData;
+				}else{
+					splitData = comData;
+				}
+				
+				if(splitData.length == 0){// 데이터가 없는경우
+					alert("탭으로 구분하여 데이터를 복사해 주세요.");
+				  	return false;
+				}else if(splitData.length == 1){// 데이터가 탭으로 구분이 없는 경우
+					for(var j=0; j < splitData.length; j++){
+						if(checkHpNum(splitData[j].trim())){//핸드폰 양식이 맞는지 확인
+							//배열 끝에 데이터 추가해 주기
+							realPhone.push({name: "", phone: removeDash(splitData[j].trim())});
+						}
+						else {
+							if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
+								tableErrorData.push(splitData[j].trim());
+							}							
+						}
+					}
+				}else{//데이터가 탭으로 구분되어 이름, 연락처로 구분된 경우
+					var name;	//이름
+					var phone;	//핸드폰번호					
+					var info1;
+					var info2;
+					var info3;
+					var info4;
+					var memo;	//메모
+					var isPhoneValid = false;
+					for(var j=0; j < splitData.length; j++){
+						if(j == 0){
+							name = splitData[j].trim();
+						}
+						if(j == 1){
+							if(checkHpNum(splitData[j].trim())){//핸드폰 양식이 맞는지 확인
+								phone = removeDash(splitData[j].trim());
+								isPhoneValid = true;
+							}
+							else {
+								if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
+									tableErrorData.push(splitData[j].trim());
+								}
+							}
+						}
+						
+						if(j == 2){
+							info1 = splitData[j].trim();
+						}
+						if(j == 3){
+							info2 = splitData[j].trim();
+						}
+						if(j == 4){
+							info3 = splitData[j].trim();
+						}
+						if(j == 5){
+							info4 = splitData[j].trim();
+						}						
+						
+						if(j == 6){	//메모
+							memo = splitData[j].trim();
+						}
+					}
+					
+					if (isPhoneValid == true) {
+						//배열 끝에 데이터 추가해 주기
+						realPhone.push({name: name, phone: phone, info1 : info1, info2 : info2, info3 : info3, info4 : info4, memo : memo });
+					}
+				}//else end
+			}
+			
+			var recTableData = tableR.getRows();		 // 받는사람 리스트의 전체 목록을 저장
+			var tableData = [];
+			
+			//기존 받는사람 리스트를 배열에 미리 담아둔다.
+			if(recTableData.length > 0){
+				for(var j=0; j < recTableData.length; j++){
+					tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), info1: recTableData[j].getData().info1, info2: recTableData[j].getData().info2, info3: recTableData[j].getData().info3, info4: recTableData[j].getData().info4, memo: recTableData[j].getData().memo});
+				}
+			}
+			
+			if(realPhone.length > 0){
+				for(var j=0; j < realPhone.length; j++){
+					tableData.push({name: realPhone[j].name, phone: removeDash(realPhone[j].phone.trim()), info1: realPhone[j].info1, info2: realPhone[j].info2, info3: realPhone[j].info3, info4: realPhone[j].info4, memo: realPhone[j].memo});
+				}
+			}
+			
+			//tableData.push(realPhone);
+				
+			//중복 연락처 1개만 남기고 삭제하기
+			var removeDuplPhone = dupliPhoneData(tableData);
+			  
+			//수신자 리스트에 전화번호 추가해주기
+			//tableR.addData(removeDuplPhone);
+			tableR.setData(removeDuplPhone);
+			
+			totRows = tableR.getRows().length; 
+			updateTotCnt(totRows); //전체 데이터 갯수 구하기
+			
+			if (tableErrorData.length > 0) {
+				alert("올바르지 않은 휴대폰 번호가 "+ tableErrorData.length +" 건 있습니다.");
+				//for(var x=0; x < tableErrorData.length; x++){
+				//	alert(tableErrorData[x]);
+				//}
+			}
+		}
+	});
+
+	//tableR.setData(tabledata);
+
+	//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
+	$('.addCallToF').click(function(){ 
+		var recTableData = tableR.getRows();		 // 받는사람 리스트의 전체 목록을 저장
+		var tableData = [];
+
+		//빈 Row 한줄을 상단에 먼저 추가해준다.
+		tableData.push({phone: ""});
+		
+		//기존 받는사람 리스트를 배열에 미리 담아둔다.
+		if(recTableData.length > 0){
+			for(var j=0; j < recTableData.length; j++){
+				tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), info1: recTableData[j].getData().info1, info2: recTableData[j].getData().info2, info3: recTableData[j].getData().info3, info4: recTableData[j].getData().info4, memo: recTableData[j].getData().memo});
+			}
+		}
+		
+		//연락처 추가해 주기
+		//addPhoneInfo(tabledata);
+		
+		tableR.setData(tableData);
+		
+		//전체 데이터 갯수 구하기
+	    totRows = tableR.getRows().length;
+	    updateTotCnt(totRows);
+	});
+
+
+	//받는사람 전체삭제 버튼 처리
+	$('.all_del').click(function(){
+		var data = tableR.getRows();	
+		if(data == null || data == ""){
+			alert("받는사람을 추가해 주세요.");
+			return false;
+		}else{
+			tableR.clearData();
+			$("#rowTotCnt").text(0); //총건수 수정
+			$("#rowDupCnt").text(0); //중복건수 수정
+			dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+		}
+		
+	});
+
+
+	// 받는사람 선택삭제 버튼 처리해주기
+	$('.select_del').click(function(){
+		$("#rowDupCnt").text(0); //중복건수 수정
+		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+		
+		if(tableR == null || tableR == ""){
+			alert("받는사람을 추가해 주세요.");
+			return false;
+		}
+		
+		var selectedData = tableR.getSelectedRows();
+		
+		if(selectedData == "" || selectedData == null){
+			alert("받는 사람을 선택해 주세요.");
+			return false;
+		}else{ // 선택한 Row 데이터 삭제하기
+			for(var i=0; i < selectedData.length; i++){
+				selectedData[i].delete();
+			}
+		}
+		
+		totRows = tableR.getRows().length;
+	    
+		updateTotCnt(totRows);
+	});
+
+	//받는사람 오류번호 삭제 처리해주기
+	$('.chkVali_del').click(function(){
+		//기존 연락처 모두 불러오기
+	    var data = tableR.getRows();
+	    var tableData = [];
+	    var totLen = tableR.getRows().length;
+	    var errCnt = 0;
+	    
+	    if(totLen > 0){
+	    	if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
+	    		for(var i=0; i < totLen; i++){
+	            	var phone = data[i].getData().phone;
+	            	var valiCheck = checkHpNum(phone);
+	            	if(valiCheck){
+	            		tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
+	            	}else{
+	            		errCnt++;
+	            	}
+	            }
+	            
+	            var removeDuplData = dupliPhoneData(tableData);
+	        	
+	            tableR.setData(removeDuplData);
+	            
+	            //총 받는사람 수 계산
+	            totRows = tableR.getRows().length;
+	            updateTotCnt(totRows);
+	            
+	          	if(errCnt > 0){
+	          		alert(errCnt + " 건의 연락처를 삭제하였습니다.");
+	          		return false;
+	          	}else{
+	          		alert("오류가 있는 연락처가 없습니다.");
+	          	}
+	    	}
+	    }else{
+	    	alert("연락처 정보를 입력해 주세요.");
+	    	return false;
+	    }
+	});
+
+
+	// 오류검사 항목 중복제거
+	function SetTableErrorDupliCheck(sVal) {
+		var isDuplicate = false;
+		if (tableErrorCheckData.length == 0) {
+			tableErrorCheckData.push(sVal);
+		}
+		else {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				if (tableErrorCheckData[i] == sVal) {
+					isDuplicate = true;
+				}
+			}
+			
+			if (isDuplicate) {
+				return;
+			}
+			else {
+				tableErrorCheckData.push(sVal);
+			}
+		}
+	}	
+	
+	
+	// 오류검사 항목 중복제거
+	function SetTableErrorDupliCheck(sVal) {
+		var isDuplicate = false;
+		if (tableErrorCheckData.length == 0) {
+			tableErrorCheckData.push(sVal);
+		}
+		else {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				if (tableErrorCheckData[i] == sVal) {
+					isDuplicate = true;
+				}
+			}
+			
+			if (isDuplicate) {
+				return;
+			}
+			else {
+				tableErrorCheckData.push(sVal);
+			}
+		}
+	}	
+	
+	$('.check_validity').click(function(){
+		tableErrorCheckData.length = 0;	// 오류 번호 배열 초기화
+		
+		var data = tableR.getRows();
+		var invalid = tableR.getInvalidCells();		//오류 데이터 체크
+		var dataLen = tableR.getRows().length;		//연락처 데이터 갯수
+		var totLen = invalid.length;				//오류 데이터 갯수
+		var errMsg = "";							//최종 alert에 표시할 메시지 저장 변수
+		
+		if(dataLen > 0) { //연락처 정보가 있으면 수행
+			if(totLen > 0) { //내용에 오류가 있으면 수행
+				//오류 데이터 값 저장
+				for(var i=0; i < totLen; i++) {
+					var cellValue = invalid[i].getValue();
+					SetTableErrorDupliCheck(cellValue);
+				}
+				
+				for(var i=0; i < dataLen; i++){
+					// 휴대폰번호 체크
+		        	var phone = data[i].getData().phone;
+		        	var valiCheck = checkHpNum(phone);
+		        	if(!valiCheck){
+		        		SetTableErrorDupliCheck(phone);
+		        	}
+				}
+			}
+			else {
+				for(var i=0; i < dataLen; i++){
+					// 휴대폰번호 체크
+		        	var phone = data[i].getData().phone;
+		        	var valiCheck = checkHpNum(phone);
+		        	if(!valiCheck){
+		        		SetTableErrorDupliCheck(phone);
+		        	}
+				}				
+			}
+		}
+		else {
+			alert("연락처를 입력해 주세요.");
+			return false;
+		}
+		
+		if (tableErrorCheckData.length > 0) {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				errMsg += tableErrorCheckData[i];
+				if ((tableErrorCheckData.length - 1) > i) {
+					errMsg += ", ";
+				}
+			}			
+    		alert(errMsg + "의 내용에 오류가 있습니다.");			
+		}
+		else {
+			alert("오류 데이터가 없습니다.");			
+		}
+		
+		return false;		
+	});
+	
+
+	$('.addExcelDw').click(function(){
+		var data = tableR.getRows();
+		if(data.length > 0){
+			tableR.download("xlsx", "recieveAddr.xlsx", {sheetName:"recieveAddr"});
+		}else{
+			alert("입력된 연락처 정보가 없습니다.");
+			return false;
+		}
+	});
+
+	//받는사람 중복 삭제
+	$('.duple_del').click(function(){
+		//기존 연락처 모두 불러오기
+	    var data = tableR.getRows();
+	    var tableData = [];
+	    var dpCnt = 0;
+	    var totLen = tableR.getRows().length;
+	    
+	    for(var i=0; i < totLen; i++){
+	    	tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
+	    }
+	    
+	    var removeDuplData = dupliPhoneData(tableData);
+	    tableR.setData(removeDuplData);
+	    
+	    //총 받는사람 수 계산
+	    totRows = tableR.getRows().length;
+	    updateTotCnt(totRows);
+	});	
+	
+	
+});
+
+
+//전체 데이터 갯수 구하는 함수
+function updateTotCnt(data){
+	var rowTotCnt = data;
+	$("#rowTotCnt").text(rowTotCnt);
+}
+
+function addPhoneInfo(data){
+	if(data == null){
+		alert("연락처 정보가 없습니다.");
+		return;
+	}else{
+		var idx = 0;
+		var newData = data;//중복 연락처는 하나만 남기고 모두 제거
+		
+		var recTableData = tableR.getRows();		 // 받는사람 리스트의 전체 목록을 저장
+		var tableData = [];
+		
+		//기존 받는사람 리스트를 배열에 미리 담아둔다.
+		if(recTableData.length > 0){
+			for(var j=0; j < recTableData.length; j++){
+				tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), info1: recTableData[j].getData().info1, info2: recTableData[j].getData().info2, info3: recTableData[j].getData().info3, info4: recTableData[j].getData().info4, memo: recTableData[j].getData().memo});
+			}
+		}
+		
+		//받는사람 리스트를 담아둔 배열에 신규 추가 데이터를 추가해 준다.
+		for(var i=0; i < newData.length; i++){
+			tableData.push({name: newData[i].name.trim(), phone: removeDash(newData[i].phone.trim()), info1: newData[i].info1, info2: newData[i].info2, info3: newData[i].info3, info4: newData[i].info4, memo: newData[i].memo});
+		}
+		
+		var temp = tableData.length;
+		
+		//기존 수신 리스트를 지워준 후 신규 전체 리스트를 추가해준다.
+		tableR.clearData(); //기존 받는사람 목록을 삭제.
+		tableR.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기
+		_fileForm2 = []; //form file data 초기화
+		_fileIdx = 0;	//form file idx 초기화
+		
+		totRows = tableR.getRows().length; 
+		updateTotCnt(totRows); //전체 데이터 갯수 구하기
+	}
+}
+
+/* 파일사이즈 가져오기 */
+function getStrFileSize(filesize){
+	var sizeStr="";
+	var sizeKB = filesize/1024;
+	if(parseInt(sizeKB) > 1024){
+	    var sizeMB = sizeKB/1024;
+	    sizeStr = sizeMB.toFixed(2)+" MB";
+	}else{
+	    sizeStr = sizeKB.toFixed(2)+" KB";
+	}
+	return sizeStr;
+}
+
+//#############################################################################################
+//파일업로드 드래그앤 드롭
+//#############################################################################################
+var objDragAndDrop = $(".upload_area");
+$(document).on("dragenter",".upload_area",function(e){
+  e.stopPropagation();
+  e.preventDefault();
+  //$(this).css('border', '2px solid #0B85A1');
+});
+$(document).on("dragover",".upload_area",function(e){
+  e.stopPropagation();
+  e.preventDefault();
+});
+$(document).on("drop",".upload_area",function(e){
+  //$(this).css('border', '2px dotted #0B85A1');
+  e.preventDefault();
+  var files = e.originalEvent.dataTransfer.files;
+  handleFileUpload(files,objDragAndDrop);  //파일업로드
+});
+
+$(document).on('dragenter', function (e){
+  e.stopPropagation();
+  e.preventDefault();
+});
+$(document).on('dragover', function (e){
+e.stopPropagation();
+e.preventDefault();
+//objDragAndDrop.css('border', '2px dotted #0B85A1');
+});
+$(document).on('drop', function (e){
+  e.stopPropagation();
+  e.preventDefault();
+});
+//파일 드래그앤드롭 종료
+
+function handleFileUpload(files,obj)  //업로드 function
+{
+	_fileForm2 = []; //form file data 초기화
+	
+	var limitsize = 50*1024*1024;  //파일 제한 체크(50개, 50MB)
+	var limitcount = 1;//$("input[name=limitcount]").val()*1 ;
+	var fileNece = true; //첨부파일필수
+ 
+ 
+	if($('#fileNece').length > 0){
+		if('N'==$('#fileNece').val()){
+			fileNece = false;  
+		}
+ 	}
+ 
+	//엑셀 및 TXT 파일만 업로드 할수 있도록 체크하기
+	var fileNm = files[0].name;
+	fileExt = fileNm.split('.').pop().toLowerCase();
+
+	// IE11 대응
+	if (fileExt != "") { 
+		if($.inArray(fileExt, ['txt','xls','xlsx']) == -1) {
+			alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.');
+			return;
+		}
+		
+		for (var i = 0; i < files.length; i++)
+		{
+		    var fd = new FormData();
+		    fd.append('file', files[i]);
+		    var tmpObj = new Object();
+		    tmpObj.name = "file_" + _fileIdx;
+		    tmpObj.fileObj = files[i];
+		     
+		    _fileForm2.push(tmpObj);
+		    sendFileToServer(fd, obj, files[i], _fileIdx);
+		    _fileIdx++;
+		     
+		    var totalfileSize = 0;
+		    $('.totalfileCount').text($('.item_file_size').length) ;
+		    $('.item_file_size').each(function(){
+		    	totalfileSize += $(this).val()*1 ;
+		    });
+		    $('.totalfileSize').text(getStrFileSize(totalfileSize)) ; 
+		}
+	}
+}
+
+//드래그앤 드롭 엑셀 및 텍스트 파일 서버 전송 함수
+function sendFileToServer(formData, obj , fileObj, _fileIdx)
+{
+	var msg;
+	msg = "해당 첨부파일을  수정하시겠습니까?";
+	var data = new FormData(document.msgForm);
+	_fileForm2.forEach(function(obj, idx) {
+		if (obj) data.append("file0", obj.fileObj);
+	});
+	
+	var url = "";
+	
+	// IE11 대응
+	if (fileExt != "") {
+		if(fileExt == "xls" || fileExt == "xlsx"){
+			url = "/web/mjon/addr/sendExelFilePhoneNumAjax.do";
+		}else if(fileExt == "txt"){
+			url = "/web/mjon/addr/sendTxtFilePhoneNumAjax.do";
+		}else{
+			alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.');
+			return;
+		}
+		
+		//엑셀 데이터 변수에 자료가 있으면 지워준다.
+	   	if(excelAddr.length > 0){
+	    	excelAddr = [];
+	    }
+		
+		$.ajax({
+	      type: "POST",
+	      enctype: 'multipart/form-data',
+	      url: url,
+	      data: data,
+	      dataType:'json',
+	      async: true,
+	      processData: false,
+	      contentType: false,
+	      cache: false,
+	      //timeout: 600000,
+	      success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if(returnData.success){
+						var data = returnData.data;
+						var message = returnData.message;
+						
+						if (message == "20000") {
+							alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
+						}
+						else {
+							if(data != null){
+								var arr = []; // 넘어온 데이터를 받은 배열 변수
+								$.each(data, function(i, item){
+									arr.push({name: item.name, phone: item.phone, info1: item.info1, info2: item.info2, info3: item.info3, info4: item.info4, memo: item.memo});
+								});
+		
+								addPhoneInfo(arr); // 연락처를 처리해줄 함수 호출
+							}
+							
+							//메세지가 있는 경우 알려주기
+							if(message != '' && message != null) {
+								alert(returnData.message);
+							}							
+						}
+
+					}else{
+						alert(returnData.message);
+					}
+				} else if(status== 'fail'){
+					alert("저장에 실패하였습니다. !!");
+				}
+			},
+	      	error: function (e) { 
+	      		alert("저장에 실패하였습니다."); 
+	      		console.log("ERROR : ", e); 
+	      	},
+			beforeSend : function(xmlHttpRequest) {
+	        	//로딩창 show
+	        	$('.loading_layer').addClass('active');				
+			},	        	        
+	        complete : function(xhr, textStatus) {
+	        	//로딩창 hide
+	        	$('.loading_layer').removeClass('active');
+			}	      			
+	  	});
+	}
+	
+}
+
+
+//#############################################################################################
+//등록
+//#############################################################################################
+
+//등록
+$(document).on('click', '#btnAddrMassReg', function() {
+	// 저장
+	SetAddrMassSave();
+});
+
+$(document).on('click', '#btnAddrMassClose', function() {
+	// 대량등록 닫기
+	setAddrMassClose();
+});
+
+// 대량등록 닫기
+function setAddrMassClose() {
+	tableR.clearData();
+	$("#rowTotCnt").text(0); //총건수 수정
+	$("#rowDupCnt").text(0); //중복건수 수정
+	dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+	addrMassDupliSaveList = null;
+
+	$("#btnAddrMassDupli").hide();
+	$("#btnAddrMassSaveDupli").hide();
+	
+	//location.reload();
+	listAddrGrp();
+	addrGroupLoadAjax();
+	addrLoadAjax();			
+}
+
+// 주소록 그룹 중복체크
+function getAddrGroupDuplCheckAjax() {
+	var isReturn = true;
+	
+	$.ajax({
+		url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", 
+		type : 'POST', 
+		data : {"addrGrpNm" : $("#addrGrpNm").val()},
+		dataType:'json',
+		async: false,			// 동기
+		success : function(data, status){
+			if(data.isSuccess == true) {
+				if(data.isDupl == true) {
+					//alert("중복된 그룹명입니다.");
+					isReturn = false;
+				}
+			} 
+			else {
+				//alert("Message : " + msg);
+			}			
+		},
+		error: function (e) {
+			//alert("주소록 중복체크에 실패했습니다.");
+		}
+	});
+	
+	return isReturn;	
+}
+
+
+//저장
+function SetAddrMassSave(){
+	gArrRestartIndex = 0;	//배열 재시작카운드
+	gNameList = [];		//치환문자 이름
+	gPhoneList = [];	//받는사람
+	gInfo1List = [];		//치환문자1
+	gInfo2List = [];		//치환문자2
+	gInfo3List = [];		//치환문자3
+	gInfo4List = [];		//치환문자4
+	gMemoList = [];			//메모
+	
+	var selectedData = tableR.getRows();
+	if (selectedData == "" || selectedData == null) {
+		alert("한 개 이상의 연락처를 입력하세요");
+		return false;
+	}
+	else if (selectedData.length > 20000) {
+		alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
+		return false;
+	}
+	
+	var selectMassVal = $("#addrGrpIdInfo option:selected").val();
+	
+	var loginVO = '${LoginVO}';
+	if(loginVO == "" || loginVO == null){
+		alert("로그인 후 이용이 가능합니다.");
+		return false;
+	}
+	else if ($("#addrGrpIdInfo option:selected").val() == "NEW" && ($("#addrGrpNm").val() == "" || $("#addrGrpNm").val() == null || $("#addrGrpNm").val() == undefined)) {
+		alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
+		return false;		
+	}
+	
+	// 새 그룹명 중복체크
+	if ($("#addrGrpIdInfo option:selected").val() == "NEW" && $("#addrGrpNm").val() != "") {
+		//주소록 중복체크
+		if (getAddrGroupDuplCheckAjax() == false) {
+			alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
+			return false;			
+		}
+	}	
+	
+	var commaSelectedData = numberWithCommas(selectedData.length);
+	var confirmMsg = "저장하시겠습니까?\n이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte 초과 글자는 절사됩니다.";
+	if (selectedData.length >= 10000) {
+		confirmMsg = "저장하시겠습니까?\n이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte 초과 글자는 절사됩니다.\n1만건 이상 등록시 약 30초정도 소요됩니다.\n잠시만 기다려주세요.";
+	}
+	if (confirm(confirmMsg)) {	
+		//로딩창 show
+		$('.loading_layer').addClass('active');				
+
+		setTimeout(setSenderList, 1000);
+	}
+}
+
+function setSenderList() {
+	var selectedData = tableR.getRows();
+	for (var i=gArrRestartIndex; i < selectedData.length; i++) {
+		var name = tableR.getRows()[i].getData().name;
+		var phone = removeDash(tableR.getRows()[i].getData().phone);
+		var info1 = tableR.getRows()[i].getData().info1;
+		var info2 = tableR.getRows()[i].getData().info2;
+		var info3 = tableR.getRows()[i].getData().info3;
+		var info4 = tableR.getRows()[i].getData().info4;
+		var memo = tableR.getRows()[i].getData().memo;
+		
+		gPhoneList[i] = phone;
+		// name
+		if (name == "" || name == null || name == undefined) {
+			gNameList[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(name)){//이모지 체크 해주기
+				return false;
+			}
+			
+			gNameList[i] = name.replace(/,/g,"§");
+		}
+		
+		// info1
+		if (info1 == "" || info1 == null || info1 == undefined) {
+			gInfo1List[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(info1)){//이모지 체크 해주기
+				return false;
+			}
+			
+			gInfo1List[i] = info1.replace(/,/g,"§");
+		}
+		// info2
+		if (info2 == "" || info2 == null || info2 == undefined) {
+			gInfo2List[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(info2)){//이모지 체크 해주기
+				return false;
+			}
+			
+			gInfo2List[i] = info2.replace(/,/g,"§");
+		}
+		// info3
+		if (info3 == "" || info3 == null || info3 == undefined) {
+			gInfo3List[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(info3)){//이모지 체크 해주기
+				return false;
+			}
+			gInfo3List[i] = info3.replace(/,/g,"§");
+		}
+		// info4
+		if (info4 == "" || info4 == null || info4 == undefined) {
+			gInfo4List[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(info4)){//이모지 체크 해주기
+				return false;
+			}
+			gInfo4List[i] = info4.replace(/,/g,"§");
+		}
+		// memo
+		if (memo == "" || memo == null || memo == undefined) {
+			gMemoList[i] = "";
+		}
+		else {
+			if(!addrEmojiCheck(memo)){//이모지 체크 해주기
+				return false;
+			}
+			gMemoList[i] = memo.replace(/,/g,"§");
+		}
+
+		//브라우저 대기 메세지 안나오게 하기위한 처리
+		var reStartArray = [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, 110000, 120000, 130000, 140000, 150000, 160000, 170000, 180000, 190000, 200000];
+		
+		if (reStartArray.includes(i, 0)) {
+			gArrRestartIndex = i+1;
+			
+			if (selectedData.length > gArrRestartIndex) {
+				setTimeout(setSenderList, 500);
+				break;
+			}
+		}
+	}	
+	
+	if (gPhoneList.length == selectedData.length) {
+		//console.log(new Date());
+		//console.log("gPhoneList.length : " + gPhoneList.length);
+		//console.log("selectedData.length : " + selectedData.length);
+		
+		SetAddrMassSave_Step2();		
+	}	
+}
+
+//저장
+function SetAddrMassSave_Step2(){
+	var form = document.addrMassForm;
+	form.phoneList.value = gPhoneList;
+	form.nameList.value = gNameList;
+	form.info1List.value = gInfo1List;
+	form.info2List.value = gInfo2List;
+	form.info3List.value = gInfo3List;
+	form.info4List.value = gInfo4List;
+	form.memoList.value = gMemoList;
+	form.addrGrpId.value = $("#addrGrpIdInfo").val();
+	
+	var data = new FormData(form);
+	
+	url = "/web/mjon/addr/addrMassInsertByTempAjax.do";
+	
+	$.ajax({
+        type: "POST",
+        url: url,
+        data: data,
+        dataType:'json',
+        async: true,
+        processData: false,
+        contentType: false,
+        cache: false,
+        success: function (returnData) {
+        	//로딩창 hide
+        	$('.loading_layer').removeClass('active');			
+        	
+			if (returnData.isSuccess) { 
+				alert("저장에 성공했습니다.\n저장 : " + returnData.resultCnt + "건, 중복 : " + returnData.dupliCnt + "건, 휴대폰번호 오류 : " + returnData.errPhoneCnt + "건");
+
+				// 중복번호 Hide
+				$("#btnAddrMassDupli").hide();
+				$("#btnAddrMassSaveDupli").hide();
+				
+				// 중복건이 있을경우
+				if (returnData.dupliCnt > 0) {
+					//alert(returnData.addrMassDupliList.length);
+
+					// 중복번호(해당 그룹) Show
+					$("#btnAddrMassSaveDupli").show();
+					
+					addrMassDupliSaveList = returnData.addrMassDupliList;
+					//$("#btnAddrMassSaveDupli").trigger("click");
+				}
+				
+				// 데이터 비우기
+				SetClear();		
+				
+				var selectMassVal = $("#addrGrpIdInfo option:selected").val();
+				
+				// 주소록그룹 콤보박스 유지
+				setTimeout(setSelectMassSetting, 500, selectMassVal);					
+			} 
+			else {
+				alert("오류 알림 : " + returnData.msg);
+			}
+		},
+        error: function (e) { 
+        	//로딩창 hide
+        	$('.loading_layer').removeClass('active');			
+        	
+        	alert("저장에 실패하였습니다."); 
+        	alert("ERROR : " + JSON.stringify(e)); 
+        },
+		beforeSend : function(xmlHttpRequest) {
+        	//로딩창 show
+        	$('.loading_layer').addClass('active');				
+		},	        	        
+        complete : function(xhr, textStatus) {
+        	//로딩창 hide
+        	$('.loading_layer').removeClass('active');
+		}	        
+    });
+}
+
+//주소록그룹 콤보박스 유지
+function setSelectMassSetting(selectMassVal) {
+	$("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);	
+}
+
+
+//데이터 비우기
+function SetClear() {
+	$("#addrGrpNm").val(""); //	새그룹명 Clear;
+	// 주소록 그룹정보 불러오기
+	getAddrGroupList();	
+	
+	var data = tableR.getRows();	
+	if (data == null || data == "") {
+	}
+	else {
+		tableR.clearData();
+		$("#rowTotCnt").text(0); //총건수 수정
+		$("#rowDupCnt").text(0); //중복건수 수정
+		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+	}
+}
+
+
+$(document).on('click', '#btnAddrMassRegCall', function() {
+	getAddrGroupList();
+});
+
+// 주소록 그룹정보 불러오기
+function getAddrGroupList() {
+    $.ajax({
+        type : "POST",
+        async : false,
+        url : "/web/mjon/addr/addrGroupListAjax.do",
+        data : {},
+        dataType:'json',
+        success : function(data) {
+			//alert(JSON.stringify(data.addrGroupList));
+
+			// Show Html
+			getAddrGroupListShow(data.addrGroupList);
+        },
+        error : function(xhr, status, error) {
+            alert(error);
+            return false;
+        }
+    });	    	
+}
+	
+// Show Html
+function getAddrGroupListShow(jsonList) {
+	var sHtml = "";
+	sHtml += "<option value='NEW'>그룹추가</option>";
+	sHtml += "<option value='0'>그룹미지정</option>";
+	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
+	for (var j = 0; j < jsonList.length; j++) {
+		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
+	}
+	    	
+	$("#addrGrpIdInfo").html(sHtml);
+}
+
+$(document).on('change', '#addrGrpIdInfo', function() {
+	if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
+		$("#addrGrpNm").val(""); //	새그룹명 Clear;
+	}
+});
+
+//#############################################################################################
+//파일 불러오기
+//#############################################################################################
+
+//엑섹불러오기 버튼 클릭시 파일 첨부 실행
+$(document).on('click', '.c3', function() {
+	$("#excelFile").click();
+});
+
+//seetJs 엑셀 파일 불러오기
+function excelExport(event){
+	var data = new FormData(document.excelForm);
+	data.append("file0", $('#excelFile').prop('files')[0]);
+	
+	var fileValue = $("#excelFile").val().split("\\");
+	var fileName = fileValue[fileValue.length-1];
+	
+	var fileExt = fileName.split('.').pop().toLowerCase();
+
+	// IE11 대응
+	if (fileExt != "") {
+		if($.inArray(fileExt, ['txt','xls','xlsx']) == -1) {
+			alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.');
+			return false;
+		}
+		
+		var url = "";
+		
+		if(fileExt == "xls" || fileExt == "xlsx"){
+			url = "/web/mjon/addr/sendExelFilePhoneNumAjax.do";
+		}else if(fileExt == "txt"){
+			url = "/web/mjon/addr/sendTxtFilePhoneNumAjax.do";
+		}else{
+			alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.');
+			return;
+		}
+		
+		//엑셀 데이터 변수에 자료가 있으면 지워준다.
+	   	if(excelAddr.length > 0){
+	    	excelAddr = [];
+	    }
+		
+		$.ajax({
+	        type: "POST",
+	        enctype: 'multipart/form-data',
+	        url: url,
+	        data: data,
+	        dataType:'json',
+	        async: true,
+	        processData: false,
+	        contentType: false,
+	        cache: false,
+	        //timeout: 600000,
+	        success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if(returnData.success){
+						var data = returnData.data;
+						var message = returnData.message;
+						
+						if (message == "20000") {
+							alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
+						}
+						else {						
+							if(data != null){
+								var arr = []; // 넘어온 데이터를 받은 배열 변수
+								$.each(data, function(i, item){
+									arr.push({name: item.name, phone: item.phone, info1: item.info1, info2: item.info2, info3: item.info3, info4: item.info4, memo: item.memo});
+								});
+		
+								addPhoneInfo(arr); // 연락처를 처리해줄 함수 호출
+								
+								//메세지가 있는 경우 알려주기
+								if(message != '' && message != null) {
+									alert(returnData.message);
+								}							
+							}
+						}
+					}else{
+						alert(returnData.message);
+					}
+				} else if(status== 'fail'){
+					alert("저장에 실패하였습니다. !!");
+				}
+			},
+	        error: function (e) {
+	        	alert("저장에 실패하였습니다."); 
+	        	console.log("ERROR : ", e); 
+	        }
+			,
+			beforeSend : function(xmlHttpRequest) {
+	        	//로딩창 show
+	        	$('.loading_layer').addClass('active');				
+			},	        	        
+	        complete : function(xhr, textStatus) {
+	        	//로딩창 hide
+	        	$('.loading_layer').removeClass('active');
+			}	      			
+	    });
+		
+		$("#excelFile").val("");
+	    $("#excelNm").val(fileName); 
+	}
+	
+}
+
+//체크박스 전체선택/해제
+$(document).on("click", "#chkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});
+
+$(document).on("click", "#duplicationChkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});	
+
+//팝업 텍스트 더보기 클릭 시 펼쳐지고 숨겨짐
+function popMore(e){
+	$(e).closest(".pop_more_cont").toggleClass("pop_more_click");
+	
+	if($(e).closest(".pop_more_cont").is(".pop_more_click")){
+		$(e).html('숨기기');
+		$(e).append('<i></i>');
+	}else {
+		$(e).html('더보기');
+		$(e).append('<i></i>');
+	}
+}
+
+/* 윈도우팝업 열기 */
+function infoPop(pageUrl){
+	document.popForm.pageType.value = pageUrl;
+	document.popForm.action = "/web/pop/infoPop.do";
+	document.popForm.method = "post"; 
+	window.open("about:blank", 'infoPop', 'width=790, height=430, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
+	document.popForm.target = "infoPop";
+	document.popForm.submit();
+}
+
+// 주소록 대량등록
+function addrMassTab(tabIdx) {
+	if (tabIdx == 2) {
+		// 붙여넣기
+		$(".upload_area").hide();
+		$(".excel_btn2").hide();
+		$(".req_area").show();
+	}
+	else {
+		$(".upload_area").show();
+		$(".excel_btn2").show();
+		$(".req_area").hide();
+	}
+}
+
+
+function linkPage2(pageNo){
+	var searchForm = document.searchAddrDupliForm;
+	searchForm.pageIndex.value = pageNo;
+	searchForm.pageUnit.value = 10;
+	
+	var sendData = $(document.searchAddrDupliForm).serializeArray();
+	$("#duplication_layer").load("/web/mjon/addr/selectAddrDupliAjax.do", sendData, function(response, status, xhr){});
+}
+
+// 중복 연락처
+function GetAddrMassDupli() {
+	var sHtml = "";
+	sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
+	sHtml += "<table class='tType4'>";
+	sHtml += "		<colgroup>";
+	sHtml += "			<col style='width:auto' />";
+	sHtml += "		</colgroup>";
+	sHtml += "		<thead>";
+	sHtml += "			<tr>";
+	sHtml += "				<th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
+	sHtml += "			</tr>";
+	sHtml += "		</thead>";
+	sHtml += "		<tbody>";
+	for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
+		sHtml += "		<tr>";
+		sHtml += "			<td>" + dupliPhoneDataRealList[i] + "</td>";
+		sHtml += "		</tr>";
+	}
+	sHtml += "		</tbody>";
+	sHtml += "	</table>";
+	sHtml += "	</div>";
+	
+	$("#addrMassDupli_layer").html(sHtml);
+}
+
+//중복 연락처 => 저장시
+function GetAddrMassSaveDupli() {
+	var sHtml = "";
+	sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
+	sHtml += "<table class='tType4'>";
+	sHtml += "		<colgroup>";
+	sHtml += "			<col style='width:auto' />";
+	sHtml += "		</colgroup>";
+	sHtml += "		<thead>";
+	sHtml += "			<tr>";
+	sHtml += "				<th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
+	sHtml += "			</tr>";
+	sHtml += "		</thead>";
+	sHtml += "		<tbody>";
+	for (var i = 0; i < addrMassDupliSaveList.length; i++) {
+		sHtml += "		<tr>";
+		sHtml += "			<td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>";
+		sHtml += "		</tr>";
+	}
+	sHtml += "		</tbody>";
+	sHtml += "	</table>";
+	sHtml += "	</div>";
+	
+	$("#addrMassSaveDupli_layer").html(sHtml);
+}
+
+</script>
+
+<div class="loading_layer">
+	<div class="loading_container">
+		<div class="bar"></div>
+		<div class="text">Loading</div>
+	</div>
+</div>
+<!-- 수신거부 대량등록  data-tooltip:adr_popup01 -->
+<form id="addrMassForm" name="addrMassForm" method="post">
+	<input type="hidden" id="phoneList" name="phoneList" value=""/>
+	<input type="hidden" id="nameList" name="nameList" value=""/>
+	<input type="hidden" id="info1List" name="info1List" value=""/>
+	<input type="hidden" id="info2List" name="info2List" value=""/>
+	<input type="hidden" id="info3List" name="info3List" value=""/>
+	<input type="hidden" id="info4List" name="info4List" value=""/>
+	<input type="hidden" id="memoList" name="memoList" value=""/>
+	<input type="hidden" id="addrGrpId" name="addrGrpId" value=""/>
+	<div class="tooltip-wrap" id="addrMassLoad">
+		<div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;">
+			<div class="popup_heading">
+	               <p>주소록 대량등록</p>
+	               <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+	           </div>
+	           <div class="layer_in" style="padding: 25px 30px;">
+	               <div class="list_tab_wrap2">
+	                   <!-- tab button -->
+	                   <ul class="list_tab"> 
+	                       <li class="tab active"><button type="button" onclick="popupTab(this,'1'); addrMassTab('1');">엑셀입력</button></li>
+	                       <li class="tab"><button type="button" onclick="popupTab(this,'2'); addrMassTab('2');">붙여넣기</button></li>
+	                   </ul><!--// tab button -->
+	               </div>
+	               <!-- 엑셀입력 -->
+	               <div class="popCont current pop_more_cont" id="popCont_1">
+	                   <div class="titBox">
+							<p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p>
+							<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p>
+							<p>  &nbsp;&nbsp;※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p>
+							<p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;주소록에 이미 등록된 휴대폰 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 휴대폰 번호를 삭제한 후 재등록해 주시기 바랍니다.</p>
+							<p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
+							<p>- 휴대폰 번호는 필수입력 항목입니다.</p>
+							<p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
+							<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
+							<p>- 이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte까지 입력 가능합니다.</p>
+							<p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p>
+							<p>- ‘오류 검사’를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.</p>
+							<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
+	                       <button type="button" class="excel_btn" onclick="location.href='/download/addr/주소록_대량등록.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
+	                   </div>
+	                   <div class="pop_more_wrap">
+	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+	                   </div>
+	                </div><!--// 엑셀입력 -->
+	                
+	                <!-- 붙여넣기 -->
+	                <div class="popCont pop_more_cont" id="popCont_2">
+	                    <div class="titBox">
+	                        <p>- 텍스트(txt) 파일로 작성된 주소록을 등록하실 수 있습니다.</p>
+	                        <p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 붙여 넣으셔야 합니다.</p>
+	                        <p>- 입력 내용은 (Tab) 또는 (,) 구분하여 입력하여야 합니다.</p>
+	                        <p>- 한 줄(열)에 주소 한 건만 입력 가능합니다.</p>
+	                        <p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
+	                        <p>&nbsp;&nbsp;(예) 홍길동,010-1234-5678 또는 홍길동,01012345678</p>
+	                        <p>- 한번에 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+c) + 붙여넣기(Ctrl+v)’ 또는 ‘엑셀입력’을 이용하세요.</p>
+	                        <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
+	                        <button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>                        
+	                    </div>
+	                    <div class="pop_more_wrap">
+	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+	                   </div>
+	                </div><!--// 붙여넣기 -->                
+	
+					<!-- 공통 -->
+					<div>
+		                <table class="layer_tType1">
+		                    <caption>엑셀입력 표</caption>
+		                    <colgroup>
+		                        <col style="width: 95px">
+		                        <col style="width: auto">
+		                    </colgroup>
+		                    <tbody>
+		                        <tr>
+		                            <th>그룹 선택</th>
+		                            <td>
+		                                <label for="" class="label">그룹 선택</label>
+		                                <select id="addrGrpIdInfo" name="addrGrpIdInfo">
+		                                </select>
+	                                    <label for="" class="label">그룹명 입력</label>
+	                                    <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
+	
+		                                <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/>
+		                                <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
+		                            </td>
+		                        </tr>
+		                    </tbody>
+		                </table>
+	                </div>
+					<div class="file_add upload_area">
+						<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
+					</div>
+					<div class="excel_middle2">
+						<p>
+							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
+							&nbsp; 
+							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button>
+							&nbsp;
+							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button>
+						</p>
+						<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
+					</div>
+					<div class="drag_drop_wrap callList_box">
+						<img src="/publish/images/content/excel.jpg" style="width: 100%;">
+					</div>
+					<div class="excel_middle">
+						<div class="select_btnWrap clearfix">
+							<div>
+								<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
+								<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
+								<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
+								<button type="button" class="check_validity">오류 검사 <i></i></button>
+								<div class="error_hover_cont send_hover_cont addr_hover_cont">
+									<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
+									<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
+								</div>
+							</div>
+	
+						</div>
+					</div><!--// 공통 -->     
+	
+					<!-- 붙여놓기 설명 -->
+	                <div class="req_area">
+	                  	<div class="text_box">
+	                    	- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
+							- 휴대폰 번호는 필수입력 항목입니다.<br>
+							- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br>
+							- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br>
+							- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.
+						</div>
+	                </div>
+	
+	
+	           </div>
+	           <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
+	               <button type="button" id="btnAddrMassReg">등록</button>
+	               <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close"  data-focus-next="popup02">닫기</button>                      
+	           </div>
+		</div>
+	</div>
+</form>
+<!--// 주소록 대량등록 팝업 -->
+
+<div class="inner">
+	<!-- send top -->
+	<div class="send_top">
+		<!-- tab button -->
+		<ul class="tabType4">
+			<li class="tab active"><button type="button" onclick="TabType5(this,'1'); moveTab('addr');">주소록관리</button></li>
+			<li class="tab"><button type="button" onclick="TabType5(this,'2'); moveTab('fax');">팩스 주소록관리</button></li>
+			<li class="tab"><button type="button" onclick="TabType5(this,'3'); moveTab('block');">수신거부</button></li>
+			<li class="tab"><button type="button" onclick="TabType5(this,'4'); moveTab('addrMob');">폰주소록 등록</button></li>
+			<li class="tab"><button type="button" onclick="TabType5(this,'5'); moveTab('addrApply');">주소록 입력 대행(무료)</button></li>
+		</ul><!--// tab button -->
+		<!-- 주소록 관리 - 주소록 관리 -->
+		<div class="adr_cont current" id="tab5_1">
+			<div class="heading">
+				<h2>주소록 관리</h2>
+	        	<button type="button" class="button info" onclick="infoPop('selectAddrList');">사용안내</button>
+			</div>
+			<%--<div class="titBox">
+				<p>- 연락처를 그룹별로 분류하여 간편하고 편리하게 관리할 수 있습니다(최대 100,000개까지 등록 가능)</p>
+				<p>- 그룹은 그룹 간 이동, 병합 및 복사가 가능합니다.</p>
+				<p>- 주소록은 중복검사가 가능하며 중복된 연락처를 삭제할 수 있습니다. 단, 데이터 양에 따라 시간이 소요될 수 있습니다.</p>
+				<p>- 주소록 관리에서 그룹 또는 연락처를 선택하여 문자를 바로 발송할 수 있습니다.</p>
+				<p>- 주소록 내보내기를 통해 다른 ID로 주소록을 복사할 수 있습니다(그룹 전송만 가능, 보낸 주소록 결과는 최대 90일까지 보관)</p>
+				<p>- 주소록 내보내기 시에는 개인정보보호를 위해 추가 휴대폰 인증을 실시하며, 휴대폰 인증은 등록된 발신번호로만 인증 가능합니다.</p>
+				<p>- 고객님께서 보유하신 엑셀파일이나 텍스트파일 등으로 작성된 주소록을 대량 등록할 수 있습니다.</p>
+				<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
+				<p>- 주소록 무료대행은 신규 그룹으로 생성됩니다(기존 그룹 수정 불가)</p>
+			</div>--%>
+			
+			<div class="adr1">
+				<!-- 왼쪽 영역 -->
+				<div class="adr1_left" id="adr1_left"></div>
+				<!-- 오른쪽 영역 -->
+				<div class="adr1_right" id="adr1_right">
+				</div>
+			</div>
+		</div>
+	</div><!--// 주소록 관리 - 주소록 관리 -->
+</div><!--// send top -->
+
+<form name="popForm" id="popForm" method="post">
+	<input type="hidden" name="pageType" id="pageType" value=""/> 
+</form>
+
+<form name="msgAddrForm2" id="msgAddrForm2" method="post">
+	<input name="msgStartKeyword" id="msgStartKeyword" type="hidden" />
+</form>(No newline at end of file)
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
@@ -8,6 +8,15 @@
 <script src="/publish/js/popupLayer.js"></script>
 <script type="text/javascript">
 $(document).ready(function(){
+	var startDate = '${startDate}';
+	var endDate = '${endDate}';
+    
+	// DatePicker 값 수정
+    var startDatePicker = $('#startDate').pickadate('picker');
+    startDatePicker.set('select', startDate, { format: 'yyyy/mm/dd' });
+    startDatePicker = $('#endDate').pickadate('picker');
+    startDatePicker.set('select', endDate, { format: 'yyyy/mm/dd' });
+    
 	
 	/* 목록 정렬 항목 아이콘 표시 */ 
 	var searchSortCnd = $("[name='searchSortCnd']").val();
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp
@@ -8,7 +8,7 @@
 <script src="/publish/js/popupLayer.js"></script>
 <script type="text/javascript">
 $(document).ready(function(){
-	
+
 	/* 목록 정렬 항목 아이콘 표시 */ 
 	var searchSortCnd = $("[name='searchSortCnd']").val();
 	var searchSortOrd = $("[name='searchSortOrd']").val();
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp
@@ -8,7 +8,7 @@
 <script src="/publish/js/popupLayer.js"></script>
 <script type="text/javascript">
 $(document).ready(function(){
-	
+
 	/* 목록 정렬 항목 아이콘 표시 */ 
 	var searchSortCnd = $("[name='searchSortCnd']").val();
 	var searchSortOrd = $("[name='searchSortOrd']").val();
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp
@@ -8,7 +8,7 @@
 <script src="/publish/js/popupLayer.js"></script>
 <script type="text/javascript">
 $(document).ready(function(){
-	
+
 	/* 목록 정렬 항목 아이콘 표시 */ 
 	var searchSortCnd = $("[name='searchSortCnd']").val();
 	var searchSortOrd = $("[name='searchSortOrd']").val();
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
@@ -11,8 +11,6 @@
 var lastfuledday = "";		//전월 마지막일
 var thisfulstlday = "";		//당월 시작일
 var thisfuledtlday = "";	//당원 마지막일
-var threefulstday = "";		//3개월전 시작일
-var threefuledday = "";		//3개월전 마지막일
 
 $(document).ready(function(){
 	
@@ -38,8 +36,6 @@
 	thisfulstlday += "/01" ;
 	
 	//3개월 이전 날짜 구해오기
-	threefulstday = prevMonth(3);
-	threefuledday = today();
 	
 	/* 목록 정렬 항목 아이콘 표시 */ 
 	/* var searchSortCnd = $("[name='searchSortCnd']").val();
@@ -101,35 +97,9 @@
 	
 });
 
-//오늘날짜 구하기
-function today() {
-   var d = new Date();
-   return getDateStr(d);
-}
 
-//이전 날짜 구하기
-function prevDay(days) {
-   var d = new Date();
-   var dayOfMonth = d.getDate();
-   d.setDate(dayOfMonth - days);
-   return getDateStr(d);
-}
 	
-//이전 월 구하기
-function prevMonth(month) {
-   var d = new Date();
-   var monthOfYear = d.getMonth();
-   d.setMonth(monthOfYear - month);
-   return getDateStr(d);
-}
 
-//날짜 받아오기
-function getDateStr(myDate){
-   var year = myDate.getFullYear();
-   var month = ("0"+(myDate.getMonth()+1)).slice(-2);
-   var day = ("0"+myDate.getDate()).slice(-2);
-   return ( year + '/' + month + '/' + day );
-}
 
 //캘린더에 날짜 입력해 주기
 function setCalVal(val,targetObj){
@@ -278,9 +248,11 @@
 }
 
 function fnSearch(pageNo){
-	
+	if(!fn_G_cmndataValueChk("startDate", "endDate", 3)){
+		return;
+	};
+	console.log('fnSearch')
 	var form = document.searchForm;
-	
 	form.pageIndex.value = pageNo ;
 	
 	
@@ -931,7 +903,7 @@
 									<button type="button" onclick="setCalVal(lastfulstday,'startDate');setCalVal( lastfuledday,'endDate'); return false;"  class="btnType btnType19">전월</button>
 									<button type="button" onclick="setCalVal(thisfulstlday,'startDate');setCalVal( thisfuledtlday,'endDate'); return false;"  class="btnType btnType19">당월</button>
 									<!-- <button type="button">3개월</button> -->
-									<button type="button" onclick="setCalVal(threefulstday,'startDate');setCalVal( threefuledday,'endDate'); return false;"  class="btnType btnType19">3개월</button>
+									<button type="button" onclick="fn_G_getPrevMonth('startDate', 3);fn_G_getCurrDate('endDate'); return false;"  class="btnType btnType19">3개월</button>
 									<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
 								</div>
 								<div class="btn_right">
src/main/webapp/publish/js/dateUtils.js
--- src/main/webapp/publish/js/dateUtils.js
+++ src/main/webapp/publish/js/dateUtils.js
@@ -48,8 +48,6 @@
     maxStartDate.setMonth(maxStartDate.getMonth() - chkMonth);
     
     // 시작일자가 종료일자 기준 chkMonth 개월 전보다 이전인지 확인
-    console.log('start :: ',start);
-    console.log('maxStartDate :: ',maxStartDate);
     if (start <= maxStartDate) {
         alert("총 검색 기간은 " + chkMonth + "개월을 넘을 수 없습니다.");
         return false;
@@ -78,3 +76,39 @@
     $('#'+startId).val(startOfYear);
     $('#'+endId).val(endOfYear);
 }
+
+
+/**
+ * 몇개월 전 date 구하기
+ * @param {String} a 값 입력할 search input ID
+ * @param {String} b 값 구고하고 싶은 month번째 전월
+ * @returns {String} ex) b = 3; a value 해당년도/해당달-3/해당일+1 
+ */
+function fn_G_getPrevMonth(searchId, month) {
+	   var d = new Date();
+	   d.setDate(d.getDate() +1);
+	   var monthOfYear = d.getMonth();
+	   d.setMonth(monthOfYear - month);
+	   console.log('getDateStr(d) : ', getDateStr(d));
+	   $('#'+searchId).val(getDateStr(d));
+}
+
+/**
+ * 해당 년월일 가져오기
+ * @param {String} a 값 입력할 search input ID
+ * @returns {String} ID value 해당년도/해당달/해당일 
+ */
+function fn_G_getCurrDate(searchId) {
+	var d = new Date();
+	$('#'+searchId).val(getDateStr(d));
+}
+
+
+// 날짜를 원하는 포멧으로 수정후 리턴 Str
+function getDateStr(myDate){
+	var year = myDate.getFullYear();
+	var month = ("0"+(myDate.getMonth()+1)).slice(-2);
+	var day = ("0"+myDate.getDate()).slice(-2);
+	return ( year + '/' + month + '/' + day );
+}
+
Add a comment
List