이호영 이호영 2024-12-18
문자전송 단문, 대량 화면 합치기
@46993e81ad611509b3abc06a6c2fa31043d757af
src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
--- src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
+++ src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
@@ -4,7 +4,11 @@
 import java.util.List;
 
 import itn.let.uss.umt.service.UserDefaultVO;
+import lombok.Getter;
+import lombok.Setter;
 
+@Getter
+@Setter
 public class MjonMsgDataVO  extends UserDefaultVO{
 
 	/**
@@ -73,325 +77,7 @@
 	private String msgResendAllReplaceYn;
 	private String atchFiles;
 	
-	public String getMsgResendAllReplaceYn() {
-		return msgResendAllReplaceYn;
-	}
-	public void setMsgResendAllReplaceYn(String msgResendAllReplaceYn) {
-		this.msgResendAllReplaceYn = msgResendAllReplaceYn;
-	}
-	public String getAtchFiles() {
-		return atchFiles;
-	}
-	public void setAtchFiles(String atchFiles) {
-		this.atchFiles = atchFiles;
-	}
-	public String getMsgGroupId() {
-		return msgGroupId;
-	}
-	public void setMsgGroupId(String msgGroupId) {
-		this.msgGroupId = msgGroupId;
-	}	
-	public String getFilePath1() {
-		return filePath1;
-	}
-	public void setFilePath1(String filePath1) {
-		this.filePath1 = filePath1;
-	}
-	public String getFilePath2() {
-		return filePath2;
-	}
-	public void setFilePath2(String filePath2) {
-		this.filePath2 = filePath2;
-	}
-	public String getFilePath3() {
-		return filePath3;
-	}
-	public void setFilePath3(String filePath3) {
-		this.filePath3 = filePath3;
-	}
-	public String getCallFrom() {
-		return callFrom;
-	}
-	public void setCallFrom(String callFrom) {
-		this.callFrom = callFrom;
-	}
-	public String getCallTo() {
-		return callTo;
-	}
-	public void setCallTo(String callTo) {
-		this.callTo = callTo;
-	}
-	public String getMsgResendAllFlag() {
-		return msgResendAllFlag;
-	}
-	public void setMsgResendAllFlag(String msgResendAllFlag) {
-		this.msgResendAllFlag = msgResendAllFlag;
-	}
-	public String getMsgResendAllGroupId() {
-		return msgResendAllGroupId;
-	}
-	public void setMsgResendAllGroupId(String msgResendAllGroupId) {
-		this.msgResendAllGroupId = msgResendAllGroupId;
-	}
-	public String getMsgResendAllAdvertiseYn() {
-		return msgResendAllAdvertiseYn;
-	}
-	public void setMsgResendAllAdvertiseYn(String msgResendAllAdvertiseYn) {
-		this.msgResendAllAdvertiseYn = msgResendAllAdvertiseYn;
-	}
+	private String tabDision;
 	
-	public String getCodeId() {
-		return codeId;
-	}
-	public void setCodeId(String codeId) {
-		this.codeId = codeId;
-	}
-	public String getCode() {
-		return code;
-	}
-	public void setCode(String code) {
-		this.code = code;
-	}
-	public String getCodeNm() {
-		return codeNm;
-	}
-	public void setCodeNm(String codeNm) {
-		this.codeNm = codeNm;
-	}
-	public String getSort() {
-		return sort;
-	}
-	public void setSort(String sort) {
-		this.sort = sort;
-	}
-	public String getUserId() {
-		return userId;
-	}
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-	public String getEsntl_id() {
-		return esntl_id;
-	}
-	public void setEsntl_id(String esntl_id) {
-		this.esntl_id = esntl_id;
-	}
-	public String getMsgId() {
-		return msgId;
-	}
-	public void setMsgId(String msgId) {
-		this.msgId = msgId;
-	}
-	public String getLetterId() {
-		return letterId;
-	}
-	public void setLetterId(String letterId) {
-		this.letterId = letterId;
-	}
-	public List getMsgIdList() {
-		return msgIdList;
-	}
-	public void setMsgIdList(List msgIdList) {
-		this.msgIdList = msgIdList;
-	}
-	public List getMsgSeqList() {
-		return msgSeqList;
-	}
-	public void setMsgSeqList(List msgSeqList) {
-		this.msgSeqList = msgSeqList;
-	}
-	public String getSubject() {
-		return subject;
-	}
-	public void setSubject(String subject) {
-		this.subject = subject;
-	}
-	public String getMmsSubject() {
-		return mmsSubject;
-	}
-	public void setMmsSubject(String mmsSubject) {
-		this.mmsSubject = mmsSubject;
-	}
-	public String getSmsTxt() {
-		return smsTxt;
-	}
-	public void setSmsTxt(String smsTxt) {
-		this.smsTxt = smsTxt;
-	}
-	public String getSmsLen() {
-		return smsLen;
-	}
-	public void setSmsLen(String smsLen) {
-		this.smsLen = smsLen;
-	}
-	public String[] getImgFileId() {
-		return imgFileId;
-	}
-	public void setImgFileId(String[] imgFileId) {
-		this.imgFileId = imgFileId;
-	}
-	public String getAtchFileId1() {
-		return atchFileId1;
-	}
-	public void setAtchFileId1(String atchFileId1) {
-		this.atchFileId1 = atchFileId1;
-	}
-	public String getAtchFileId2() {
-		return atchFileId2;
-	}
-	public void setAtchFileId2(String atchFileId2) {
-		this.atchFileId2 = atchFileId2;
-	}
-	public String getAtchFileId3() {
-		return atchFileId3;
-	}
-	public void setAtchFileId3(String atchFileId3) {
-		this.atchFileId3 = atchFileId3;
-	}
-	public List getAtchFileList() {
-		return atchFileList;
-	}
-	public void setAtchFileList(List atchFileList) {
-		this.atchFileList = atchFileList;
-	}
-	public Date getRegdate() {
-		return regdate;
-	}
-	public void setRegdate(Date regdate) {
-		this.regdate = regdate;
-	}
-	public String getMyMsgStDt() {
-		return myMsgStDt;
-	}
-	public void setMyMsgStDt(String myMsgStDt) {
-		this.myMsgStDt = myMsgStDt;
-	}
-	public String getMyMsgEndDt() {
-		return myMsgEndDt;
-	}
-	public void setMyMsgEndDt(String myMsgEndDt) {
-		this.myMsgEndDt = myMsgEndDt;
-	}
-	public String getPageType() {
-		return pageType;
-	}
-	public void setPageType(String pageType) {
-		this.pageType = pageType;
-	}
-	public String getMsgType() {
-		return msgType;
-	}
-	public void setMsgType(String msgType) {
-		this.msgType = msgType;
-	}
-	public String getMsgKind() {
-		return msgKind;
-	}
-	public void setMsgKind(String msgKind) {
-		this.msgKind = msgKind;
-	}
-	public String getMsgResendFlag() {
-		return msgResendFlag;
-	}
-	public void setMsgResendFlag(String msgResendFlag) {
-		this.msgResendFlag = msgResendFlag;
-	}
-	public String getCustomImgFlag() {
-		return customImgFlag;
-	}
-	public void setCustomImgFlag(String customImgFlag) {
-		this.customImgFlag = customImgFlag;
-	}
-	public String getMainImgFlag() {
-		return mainImgFlag;
-	}
-	public void setMainImgFlag(String mainImgFlag) {
-		this.mainImgFlag = mainImgFlag;
-	}
-	public String getMainLetterFlag() {
-		return mainLetterFlag;
-	}
-	public void setMainLetterFlag(String mainLetterFlag) {
-		this.mainLetterFlag = mainLetterFlag;
-	}
-	public String getMainMoreSamFlag() {
-		return mainMoreSamFlag;
-	}
-	public void setMainMoreSamFlag(String mainMoreSamFlag) {
-		this.mainMoreSamFlag = mainMoreSamFlag;
-	}
-	
-	public String getMainLetterTypeFlag() {
-		return mainLetterTypeFlag;
-	}
-	public void setMainLetterTypeFlag(String mainLetterTypeFlag) {
-		this.mainLetterTypeFlag = mainLetterTypeFlag;
-	}
-	public String getHeaderMsgSearchFlag() {
-		return headerMsgSearchFlag;
-	}
-	public void setHeaderMsgSearchFlag(String headerMsgSearchFlag) {
-		this.headerMsgSearchFlag = headerMsgSearchFlag;
-	}
-	public String getMoveAddrFlag() {
-		return moveAddrFlag;
-	}
-	public void setMoveAddrFlag(String moveAddrFlag) {
-		this.moveAddrFlag = moveAddrFlag;
-	}
-	public String getMoveAddrAllFlag() {
-		return moveAddrAllFlag;
-	}
-	public void setMoveAddrAllFlag(String moveAddrAllFlag) {
-		this.moveAddrAllFlag = moveAddrAllFlag;
-	}	
-	public List getAddrIdList() {
-		return addrIdList;
-	}
-	public void setAddrIdList(List addrIdList) {
-		this.addrIdList = addrIdList;
-	}
-	public String getFileSn() {
-		return fileSn;
-	}
-	public void setFileSn(String fileSn) {
-		this.fileSn = fileSn;
-	}
-	public String getFileStreCours() {
-		return fileStreCours;
-	}
-	public void setFileStreCours(String fileStreCours) {
-		this.fileStreCours = fileStreCours;
-	}
-	public String getStreFileNm() {
-		return streFileNm;
-	}
-	public void setStreFileNm(String streFileNm) {
-		this.streFileNm = streFileNm;
-	}
-	public String getFileExtsn() {
-		return fileExtsn;
-	}
-	public void setFileExtsn(String fileExtsn) {
-		this.fileExtsn = fileExtsn;
-	}
-	public String getStrImgPath() {
-		return strImgPath;
-	}
-	public void setStrImgPath(String strImgPath) {
-		this.strImgPath = strImgPath;
-	}
-	public String getUserIp() {
-		return userIp;
-	}
-	public void setUserIp(String userIp) {
-		this.userIp = userIp;
-	}
-	public String getRefundYn() {
-		return refundYn;
-	}
-	public void setRefundYn(String refundYn) {
-		this.refundYn = refundYn;
-	}
 	
 }
src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
--- src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
+++ src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
@@ -424,7 +424,8 @@
 			model.addAttribute("msgResendAllGroupId", searchVO.getMsgResendAllGroupId());
 			model.addAttribute("msgResendAllAdvertiseYn", searchVO.getMsgResendAllAdvertiseYn());
 			model.addAttribute("msgResendAllReplaceYn", searchVO.getMsgResendAllReplaceYn());
-			
+
+			model.addAttribute("tabDision", "tab01");
 		}catch(Exception ex) {
 			ex.printStackTrace();
 			
@@ -696,7 +697,8 @@
 		model.addAttribute("resultPhoList", resultPhoList);
 		paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0);
 		model.addAttribute("paginationInfo", paginationInfo);
-		
+
+		model.addAttribute("tabDision", searchVO.getTabDision());
 		return "web/msgdata/MsgDataSMLView";
 	}
 	
@@ -794,7 +796,236 @@
      * @throws Exception
      */
 	@RequestMapping(value= {"/web/mjon/msgdata/excel/selectMsgExcelDataView.do"})
-	public String selectMsgExcelDataView(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{
+	public String selectMsgExcelDataView(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, 
+				@ModelAttribute("cateCodeVO") CateCode cateCode,
+				HttpServletRequest request,
+				ModelMap model,
+				RedirectAttributes redirectAttributes) throws Exception{
+		
+		try {
+		
+			/*
+			 * 문자 샘플 검색어에 한글,영문,숫자, 공백을 제외한 문자가 포함된 경우 
+			 * 검색이 안되도록 조치함.
+			 * 2023.05.02 우영두
+			 * 
+			 * */
+			String keyword = searchVO.getSearchKeyword();
+			if(keyword != null) {
+				
+				keyword = URLDecoder.decode(keyword, "UTF-8");	
+				keyword = keyword.replaceAll("[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9 ]", "");
+				
+				if(!keyword.equals("")) {
+					
+					System.out.println("==========================잘못된 접근 경로 정보 시작==========================================");
+					System.out.println("1. 접근 IP 정보 ::: " + request.getRemoteAddr());
+					
+					System.out.println("전달 파라미터 값 ");
+					Set<String> keySet = request.getParameterMap().keySet();
+					int paramCnt = 2;
+					for(String key: keySet) {
+						System.out.println(paramCnt + ". " +key + " : " + request.getParameter(key));
+						paramCnt++;
+					}
+					
+					System.out.println("==========================잘못된 접근 경로 정보 종료==========================================");
+					
+					redirectAttributes.addFlashAttribute("message", "잘못된 검색어입니다.");
+					RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/web/main/mainPage.do");
+					return redirectUrlMaker.getRedirectUrl();
+					
+				}
+				
+			}
+			
+			//로그인 권한정보 불러오기
+			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+			model.addAttribute("loginVO", loginVO);
+					
+			String categoryType = cateCode.getCateType();
+			
+			if(categoryType == null) {
+				
+				categoryType = "N";
+				
+			}
+			
+			// 문자 카테고리 리스트 불러오기
+			//List<CateCode> cateConfList = letterService.selectCateConfWithList(categoryType);
+			//2뎁스 카테고리만 조회하게 수정
+			List<CateCode> cateConfList = letterService.selectCateConfTwoDepthWithList(categoryType);
+			model.addAttribute("cateCodeList", cateConfList);	
+			
+			// 문자 해쉬태그 리스트 불러오기
+			String msgType = "M"; //문자발송, 선거문자에서만 보여질 해시 태그리스트를 불러온다.
+			List<HashConfVO> hashTagList = letterService.selectHashTagWithList(msgType);
+			model.addAttribute("hashTagList", hashTagList);
+			
+			// 문자 리스트 불러오기
+			LetterVO letterVO = new LetterVO();
+			if(letterVO.getPageUnit() != 10) {
+				letterVO.setPageUnit(letterVO.getPageUnit());
+			}
+			
+			letterVO.setLetterType(searchVO.getMsgType());
+
+			/** pageing */
+			PaginationInfo paginationInfo = new PaginationInfo();
+			paginationInfo.setCurrentPageNo(letterVO.getPageIndex());
+			paginationInfo.setRecordCountPerPage(letterVO.getPageUnit());
+			paginationInfo.setPageSize(letterVO.getPageSize());
+
+			letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
+			letterVO.setLastIndex(paginationInfo.getLastRecordIndex());
+			letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
+			
+			
+			List<?> resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO);
+			
+			model.addAttribute("resultPhoList", resultPhoList);
+			paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0);
+			model.addAttribute("paginationInfo", paginationInfo);
+			model.addAttribute("letterVO", letterVO);
+			
+			//System.out.println(letterVO.getLetterType());
+			
+			//발송결과 문자 재전송에서 넘어오는 경우 파마리터 전달
+			List<String> temp = searchVO.getMsgSeqList();
+			
+			if(temp != null) {
+				
+				model.addAttribute("reSendMsgVO", searchVO);
+				
+			}
+			
+			//주소록에서 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getMoveAddrFlag())) {
+				model.addAttribute("addrVO", searchVO);
+			}
+			
+			//주소록에서 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getMoveAddrAllFlag())) {
+				AddrVO addrVO = new AddrVO();
+				
+				String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+				if(userId != "") {
+					addrVO.setMberId(userId);
+				} 
+				addrVO.setRecordCountPerPage(100000);
+				addrVO.setFirstIndex(0);
+				addrVO.setSearchAddrGrpId(request.getParameter("searchAddrGrpId"));
+				addrVO.setSearchCondition(request.getParameter("searchCondition"));
+				addrVO.setSearchKeyword(request.getParameter("searchKeyword"));
+				addrVO.setStartKeyword(request.getParameter("startKeyword"));
+				List<AddrVO> addrList = addrService.selectAddrList(addrVO);
+				
+				List<String> addrIdList = new ArrayList<String>();
+				for(AddrVO item : addrList) {
+					addrIdList.add(item.getAddrId());
+				}
+				
+				searchVO.setAddrIdList(addrIdList);
+				searchVO.setMoveAddrFlag("Y");
+				
+				model.addAttribute("addrVO", searchVO);
+			}		
+
+			
+			
+			//맞춤문자에서 이미지 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getCustomImgFlag())) {
+				
+				model.addAttribute("customImgVO", searchVO);
+				
+			}
+			
+			//메인화면에서 이미지 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getMainImgFlag())) {
+				
+				model.addAttribute("mainImgVO", searchVO);
+				
+			}
+			
+			//메인화면 인기문자(단/장문) 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getMainLetterFlag())) {
+				
+				MjonMsgDataVO mainLetterVO = mjonMsgDataService.selectLetterCnById(searchVO);
+				mainLetterVO.setMainLetterFlag(searchVO.getMainLetterFlag());
+				//기존 문자내용에서 줄바꿈 문자를 태그로 변환해줌 - 사용자 화면단의 스크립트에서 오류 발생 방지
+				mainLetterVO.setSmsTxt(mainLetterVO.getSmsTxt().replace("\r\n", "<br/>")
+						.replace("\r", "<br/>")
+						.replace("\n", "<br/>")
+						.replace("\n\r", "<br/>")
+						.replace("\"", "\\\"")
+						.replace("\'", "\\'"));
+				model.addAttribute("mainLetterVO", mainLetterVO);
+				
+			}
+			
+			//메인화면 더많은 샘플 보기 선택시 넘어오는 파라미터
+			if("Y".equals(searchVO.getMainMoreSamFlag())) {
+				
+				model.addAttribute("moreSampleYn", searchVO.getMainMoreSamFlag());
+				
+			}
+			
+			//헤더 문자검색에서 넘어오는 파라미터
+			if("Y".equals(searchVO.getHeaderMsgSearchFlag())){
+				
+				//공인 IP 구하기
+		  		String userIp = EgovClntInfo.getClntIP(request);
+				//java.util.Scanner s = new java.util.Scanner(new java.net.URL("https://api.ipify.org").openStream(), "UTF-8").useDelimiter("\\A");
+				//userIp = s.next();
+		  	    
+				System.out.println(userIp);
+				System.out.println(searchVO.getSearchKeyword());
+				
+				
+				
+				//기존 검색된 단어가 있는지 체크
+				int searchWordCnt = mjonMsgDataService.selectMsgSearchWordCnt(searchVO);
+				
+				if(searchWordCnt > 0) {
+					
+					searchVO.setUserIp(userIp);
+					//기존 검색어가 있는 경우 검색 카운트만 증가시켜 준다.
+					mjonMsgDataService.updateMsgSearchWordCnt(searchVO);
+					
+				}else {
+					
+					searchVO.setUserIp(userIp);
+					//문자검색어 디비 저장처리
+					int resultCnt = mjonMsgDataService.insertMsgSearchWordInfo(searchVO);
+					
+				}
+				
+				//문자검색 인기검색어 4개 불러오기
+				List<?> resultSearchWordList = mjonMsgDataService.selectMsgSearchWordList(searchVO); 
+				
+				model.addAttribute("resultSearchWordList", resultSearchWordList);
+				model.addAttribute("headerMsgSearchVO", searchVO);
+				
+			}
+			
+			// 문자 재전송 New
+			model.addAttribute("msgResendAllFlag", searchVO.getMsgResendAllFlag());
+			model.addAttribute("msgResendAllGroupId", searchVO.getMsgResendAllGroupId());
+			model.addAttribute("msgResendAllAdvertiseYn", searchVO.getMsgResendAllAdvertiseYn());
+			model.addAttribute("msgResendAllReplaceYn", searchVO.getMsgResendAllReplaceYn());
+			
+			model.addAttribute("tabDision", "tab02");
+			
+		}catch(Exception ex) {
+			ex.printStackTrace();
+			
+		}
+		
+		return "web/msgdata/MsgDataView";
+	}
+	
+	@RequestMapping(value= {"/web/mjon/msgdata/excel/selectMsgExcelDataView_backup.do"})
+	public String selectMsgExcelDataView_backup(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{
 		
 		//로그인 권한정보 불러오기
 		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
@@ -822,13 +1053,13 @@
 		if(letterVO.getPageUnit() != 10) {
 			letterVO.setPageUnit(letterVO.getPageUnit());
 		}
-
+		
 		/** pageing */
 		PaginationInfo paginationInfo = new PaginationInfo();
 		paginationInfo.setCurrentPageNo(letterVO.getPageIndex());
 		paginationInfo.setRecordCountPerPage(letterVO.getPageUnit());
 		paginationInfo.setPageSize(letterVO.getPageSize());
-
+		
 		letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
 		letterVO.setLastIndex(paginationInfo.getLastRecordIndex());
 		letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
@@ -19,6 +19,11 @@
 $(document).ready(function(){
 	
 
+	console.log(' + $(#tabDision).val() : ',$('#tabDision').val())
+	if($('#tabDision').val() == 'tab02'){
+		$('#send_adYnY').prop('checked', true); // 상태 변경 및 이벤트 발생
+		advMsgInsert();
+	}
 	
 	//받는사람 연락처 내용 처리
 	//Tabulator AJAX Data Loading
@@ -3881,9 +3886,13 @@
 		
 		<input type="hidden" id="blineCode" name="blineCode" value="<c:out value="${blineCode}"/>"/>
 		
+		<input type="hidden" id="tabDision" value="<c:out value="${tabDision}"/>"/>
+		
 	<!-- <div class="top_content current" id="tab1_1"> -->
 	    <div class="heading">
-	        <h2>문자전송</h2>
+	        <h2>
+				${tabDision eq 'tab01' ? '문자전송' : (tabDision eq 'tab02' ? '대량문자/단체문자 발송' : '')}
+			</h2>
 	        <button type="button" class="button info" onclick="infoPop('adrvertisement1');" style="right: 128px;">광고규정</button>
 	        <button type="button" class="button info" onclick="infoPop('selectMsgDataView1');">사용안내</button>
 	    </div>
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
@@ -6,1783 +6,10 @@
 
 <!-- <script src="/publish/js/content.js"></script> -->
 
+<script type="text/javascript" src="<c:url value='/js/web/msgdata/init.js?date=20241218'/>"></script>
+<script type="text/javascript" src="<c:url value='/js/web/msgdata/msgDataView.js?date=20241218'/>"></script>
 <script type="text/javascript">
 
-var _regExp1 = /(^02.{0}|^01.{1}|^[0-9]{3})-?([0-9]{3,4})-?([0-9]{4})$/;
-
-var imgFilePath = []; // 최종 선택한 이미지 경로 저장 변수
-var imgFileId = []; // 최종 선택한 파일 아이디 저장 변수
-var templateYn = []; // 템플릿 사용 여부 저장 변수
-var tableL = null; //좌측 받는 사람 주소록 Tabulator 변수
-var tableR = null; //우측 주소록 불러오기 Tabulator 변수
-var tableAddr = null; //주소록 불러오기 팝업 Tabulator 변수
-
-var loginVO = '${loginVO}';
-
-var popCustomScrT=0;	// 맞춤제작 요청 JSPark => 2023.02.21 추가
-var msgResendAllFlag = "${msgResendAllFlag}";
-var msgResendAllGroupId = "${msgResendAllGroupId}";
-var msgResendAllAdvertiseYn = "${msgResendAllAdvertiseYn}";
-var msgResendAllReplaceYn = "${msgResendAllReplaceYn}";
-
-$(document).ready(function(){
-	var tsMoreSampleYn = "${moreSampleYn}";
-	var tsMainImgFlag = "${mainImgVO.mainImgFlag}";
-	var tsMainLetterFlag = "${mainLetterVO.mainLetterFlag}";
-		
-	//메인화면에서 샘플 더보기로 왔을 시 문자타입, 카테고리 세팅
-	if(tsMoreSampleYn == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}
-	//메인화면에서 그림문자샘플 클릭으로 왔을 시 문자타입, 카테고리 세팅
-	if(tsMainImgFlag == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}
-	//메인화면에서 단문장문 문자샘플 클릭으로 왔을 시 문자타입, 카테고리 세팅
-	if(tsMainLetterFlag == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}	
-	
-
-	//문자 발송 화면 폼 불러오기
-	listMsgDataView();
-	
-	//최 하단  문자 샘플 탭 리스트 내용 불러오기
-	fnLetterListAjax(1);
-	
-	//최 하단 그림문자 탭 리스트 내용 불러오기
-	fnPhotoListAjax(1);
-	
-	// 내보관함 리스트 로그인이 완료된 경우에만 로드되도록
-	if(loginVO != "" && loginVO != null){
-		//최 하단 내문자함 탭 리스트 내용 불러오기
-		fnMyMsgListAjax(1);
-	}
-	
-	//그림문자 샘플 탭 활성화 시키기
-	TabType2($('.tabType2 li').eq(1), '2');
-	
-	//document.ready 마지막에 그림문자를 조회하기 때문에 letterForm.letterType이 P로 고정되는데, 메인에서 왔을 경우 letterType을 다시 원복하기 위한 작업
-	if(tsMoreSampleYn == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}
-	if(tsMainImgFlag == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}
-	if(tsMainLetterFlag == 'Y'){
-		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
-		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
-	}
-	
-	// 맞춤제작 요청 JSPark => 2023.02.21 추가
-	//맞춤제작 등록 Popup 
-	//customPopup();	
-});
-
-// 문자 그룹정보 => 재전송용
-function getMjMsgGroupInfoByResend() {
-	$.ajax({
-		type: "POST",
-		url: "/web/mjon/msgdata/selectMjMsgGroupInfoByResendAjax.do",
-		data: {"msgResendAllGroupId" : msgResendAllGroupId},
-		dataType:'json',
-		async: false,
-		success: function (data) {
-			//alert(JSON.stringify(data));
-			if(data.isSuccess == true){
-				var msgData = data.resultMsgInfo;
-				var fileData = data.resultMsgAddPhotoInfo;
-				
-				// 발신번호
-				var reCallFrom = $.trim(removeDash($("#callFromList option:selected").val()));
-				if ($.trim(removeDash(msgData.callFrom)) != reCallFrom) {
-					alert("발신번호가 이전에 발송한 번호가 아닙니다.\n발신번호를 확인해주세요.")
-				}
-				
-				var smsTxt = msgData.smsTxt;
-				var subject = msgData.subject;
-				var fileId = "";
-				var filePath = "";
-				var len = fileData.length;
-				
-				// 기존 내용 지워주기
-				//$(".btnReset").trigger("click");
-				$('.delLi').each(function(){
-					$(this).remove();
-				});
-				
-				$('.preBoxF').each(function(){
-					$(this).remove();
-				});
-
-				$('#imgCnt').val(0);
-				
-				// 기존 imgFileId, imgFilePath 배열에 있는 내용 초기화 해주기
-				imgFilePath = [];
-				imgFileId = [];
-
-				// 문자제목
-				if (msgData.subject != null && msgData.subject != "") {
-					$('.msg_title').addClass('active');
-					$("input:radio[name='title_status']:radio[value='Y']").prop('checked', true); // 선택하기
-					$('.textbox').show();
-					$("#mmsSubject").val(subject);	
-				}
-				
-				// 문자내용
-				if (smsTxt.indexOf("(광고)") == 0) {
-					$('#send_adYnY').prop('checked', true);
-					
-					//광고 상하단 내용 넣어주기
-					advMsgInsert();				
-					
-					// 광고 기본정보 제거
-					smsTxt = $.trim(smsTxt.replace("(광고)", ""));
-					var smsTxtLastIdxCnt = smsTxt.lastIndexOf("무료거부");
-					if (smsTxtLastIdxCnt != -1) {
-						smsTxt = $.trim(smsTxt.substring(0, smsTxtLastIdxCnt));	
-					}					
-				}
-				$('#smsTxtArea').val(smsTxt);	
-				
-				// 첨부 이미지가 있는경우 이미지 처리해주기
-				if(len > 0) {
-					for(var i=0; i < len; i++) {
-						var num = i + 1;
-						var imgId = fileData[i].atchFileId;
-						var imgSn = fileData[i].fileSn;
-						var fileStreCours = fileData[i].fileStreCours;
-						var streFileNm = fileData[i].streFileNm;
-						var fileExtsn = fileData[i].fileExtsn;
-						
-						/* var imgSrc = fileStreCours + "/" + streFileNm + "." + fileExtsn; */
-						var imgSrc = '/cmm/fms/getImage2.do?atchFileId=' + imgId + '&fileSn=' + imgSn;
-						myMsgImageControl(imgSrc, "edit_n", "Template", imgId);
-					}
-					
-					fnByteString($('#smsTxtArea').val());
-				}
-				else {
-					fnByteString($('#smsTxtArea').val());
-				}
-				
-				// 문자전송 상단으로 이동
-				var sendOfT=$('.send_top').offset().top;
-				$('html,body').stop().animate({'scrollTop':sendOfT-60},250);		
-				
-			} else {
-				//alert("Message : " + msg);
-			}
-		},
-		error: function (e) { 
-			//alert("저장에 실패하였습니다."); 
-			//console.log("ERROR : ", e); 
-		}
-	});
-}
-
-// 문자 상세정보 => 재전송용
-function getMjMsgListByResend() {
-	$.ajax({
-		type: "POST",
-		url: "/web/mjon/msgdata/selectMjMsgListByResendAjax.do",
-		data: {"msgResendAllGroupId" : msgResendAllGroupId},
-		dataType:'json',
-		async: false,
-		success: function (data) {
-			console.log('data : ', data);
-			if(data.isSuccess == true){
-				var listCnt = data.resultList.length;
-				
-				//수신자 처리 변수
-				var callToList = [];	//수신자 처리 리스트
-				var tableData = [];		//수신자 tabulator 처리 변수
-				
-				for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
-					callToList[i] = data.resultList[i].callTo;
-					tableData.push({phone: removeDash(callToList[i])});
-				}
-
-				console.log('tableData : ', tableData);
-				if(tableData.length > 0){
-					
-					// 데이터 추가
-					setTimeout(() => {
-						tableL.addData(dupliPhoneData(tableData));
-						totRows = tableL.getRows().length; 
-						console.log('totRows : ', totRows);
-						updateTotCnt(totRows); //전체 데이터 갯수 구하기
-						
-						//결제 금액 구하기
-					    totalPriceSum(totRows);		
-					}, 0); // 초기화 직후에 실행
-				}				
-				
-			} else {
-				//alert("Message : " + msg);
-			}
-		},
-		error: function (e) { 
-			//alert("저장에 실패하였습니다."); 
-			//console.log("ERROR : ", e); 
-		}
-	});
-}
-
-// 문자발송 URL Move 
-function goMsgUrlMove() {
-	document.location.href = "/web/mjon/msgdata/selectMsgDataView.do";
-}
-
-function listMsgDataView(){
-	
-	var sendData = $(document.searchForm).serializeArray() ;
-	$(".contentArea").load("/web/mjon/msgdata/selectMsgDataSMLViewAjax.do", sendData ,function(response, status, xhr){
-		
-		//문자 재전송 및 주소록 전달 처리를 위해 사용
-		$("#msgForm").ready(function(){	//문자 내용 폼이 로드된 후 실행
-			
-			//헤더 문자검색 결과 처리
-			var headerMsgSearchFlag = '${headerMsgSearchVO.headerMsgSearchFlag}';
-			
-			if(headerMsgSearchFlag == 'Y'){
-				
-				var letterType = '${headerMsgSearchVO.msgType}';
-				var form = document.letterForm;
-				var searchKeyword = '${headerMsgSearchVO.searchKeyword}';
-				form.letterType.value = letterType;
-				form.searchKeyword.value = searchKeyword;
-				
-				if(letterType == 'P'){
-					
-					//최 하단 그림문자 탭 리스트 내용 불러오기
-					fnPhotoListAjax(1);
-					
-					//문자 샘플 탭 활성화 시키기
-					TabType2($('.tabType2 li').eq(1), '2');
-					//하단 리스트 탭으로 이동 시키기
-					var offset = $('.tabType2').offset();
-				    $('html').animate({scrollTop : offset.top}, 400);
-					
-				}else if(letterType == 'L' || letterType == 'S' ){
-					
-					//문자 샘플 탭 활성화 시키기
-					TabType2($('.tabType2 li').eq(0), '1');
-					
-					//최 하단  문자 샘플 탭 리스트 내용 불러오기
-					fnLetterListAjax(1);
-					if(letterType == 'S'){
-						
-						$('.tDep1_letType a').eq(0).addClass('on');
-						$('.tDep1_letType a:last-child').removeClass('on');
-						
-					}else{
-						
-						$('.tDep1_letType a').eq(0).removeClass('on');
-						$('.tDep1_letType a:last-child').addClass('on');
-						
-					}
-										
-					//하단 리스트 탭으로 이동 시키기
-					var offset = $('.tabType2').offset();
-				    $('html').animate({scrollTop : offset.top}, 400);
-					
-				}
-				
-				
-			}
-			
-			
-			//메인화면 더많은 샘플보기 버튼 선택시 처리
-			var moreSamFlag = '${moreSampleYn}';
-			
-			if(moreSamFlag == 'Y'){
-			
-				//문자 샘플 탭 활성화 시키기
-				var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
-				var letterTab = '0';
-				var cateNo = "${cateCodeVO.cateNo}";
-				if(mainLetterTypeFlag == 'P'){
-					TabType2($('.tabType2 li').eq(1), '2');
-				}else{
-					TabType2($('.tabType2 li').eq(letterTab), '1');
-				}
-				//장문 일 시 tDep1_letType 탭 세팅
-				if(mainLetterTypeFlag == 'L'){
-					$('.tDep1_letType a').removeClass('on');
-					$('.tDep1_letType a').eq(1).addClass('on');
-				}
-					
-				//카테고리 탭 활성화 처리
-				if(mainLetterTypeFlag == 'P'){ //그림문자 샘플로 이동 왔을 시 
-					$('.tDep2_cateCode').find('.on').removeClass('on');
-					$('.tDep2_cateCode a').each(function(index){
-						if($(this).attr('value') == cateNo){
-							$(this).addClass('on');
-						}
-					})
-				}
-				if(mainLetterTypeFlag != 'P'){ //단문,장문 샘플로 왔을 시 
-					$('.tDep1_cateCode').find('.on').removeClass('on');	
-					$('.tDep1_cateCode a').each(function(index){
-						if($(this).attr('value') == cateNo){
-							$(this).addClass('on');
-						}
-					})
-				}
-
-				
-				//하단 리스트 탭으로 이동 시키기
-				var offset = $('.tabType2').offset();
-			    $('html').animate({scrollTop : offset.top}, 400);
-			    
-				
-			}
-			
-			
-			//메인화면 그림문자 이미지 선택시 처리
-			var mainImgFlag = '${mainImgVO.mainImgFlag}';
-			if(mainImgFlag == 'Y'){
-				//카테고리 처리
-				var cateNo = "${cateCodeVO.cateNo}";
-				$('.tDep2_cateCode').find('.on').removeClass('on');
-				$('.tDep2_cateCode a').each(function(index){
-					if($(this).attr('value') == cateNo){
-						$(this).addClass('on');
-					}
-				})				
-				
-				
-				var atchFileId = '${mainImgVO.atchFileId1}';
-				var fileSn = '${mainImgVO.fileSn}';
-				var strImgPath = '${mainImgVO.strImgPath}';
-				
-				fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
-				
-			}
-			
-			//메인화면 인기문자 메세지 선택시 처리
-			var mainLetterFlag = '${mainLetterVO.mainLetterFlag}';
-			if(mainLetterFlag == 'Y'){
-				var letterTab = '0';
-				//문자샘플 활성화 처리
-				TabType2($('.tabType2 li').eq(0), '1');
-				//단문,장문 탭 활성화 처리
-				var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
-				if(mainLetterTypeFlag == 'L'){
-					$('.tDep1_letType a').removeClass('on');
-					$('.tDep1_letType a').eq(1).addClass('on');
-				}
-				//카테고리 활성화 처리
-				var cateNo = "${cateCodeVO.cateNo}";
-				$('.tDep1_cateCode').find('.on').removeClass('on');	
-				$('.tDep1_cateCode a').each(function(index){
-					if($(this).attr('value') == cateNo){
-						$(this).addClass('on');
-					}
-				})
-				var smsTxt = '${mainLetterVO.smsTxt}';
-				if(smsTxt != null){
-					
-					smsTxt = smsTxt.replaceAll("<br/>", "\n");	//줄발꿈문자 변환하기
-					$("#smsTxtArea").val(smsTxt);
-					fnByteString(smsTxt);
-					
-				}
-				
-			}
-			
-			//맞춤제작 내보관함 이미지 선택시 처리
-			var customImgFlag = '${customImgVO.customImgFlag}';
-			if(customImgFlag == 'Y'){
-				
-				var atchFileId = '${customImgVO.atchFileId1}';
-				var fileSn = '${customImgVO.fileSn}';
-				var strImgPath = '${customImgVO.strImgPath}';
-				
-				fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
-				
-			}
-			
-			//문자 재전송 처리
-			var msgResendFlag = '${reSendMsgVO.msgResendFlag}';
-			var msgSeqList = [];
-			msgSeqList = '${reSendMsgVO.msgSeqList}';
-			if(msgSeqList.length > 0){
-					
-				fnMsgResend(msgResendFlag, msgSeqList);
-				
-			}
-			
-			//주소록에서 주소를 전송한 경우 처리
-			var moveAddrFlag = '${addrVO.moveAddrFlag}';
-			var addrIdList = [];
-			addrIdList = '${addrVO.addrIdList}';
-			if(addrIdList.length > 0) {
-				fnAddrSet(moveAddrFlag, addrIdList);
-			}
-			
-			// 문자 재전송 New
-			if (msgResendAllFlag == "Y") {
-				if (msgResendAllReplaceYn != "Y") {
-					// 문자 그룹정보 => 재전송용
-					getMjMsgGroupInfoByResend();
-				}
-
-				// 문자 상세정보 => 재전송용
-				getMjMsgListByResend();
-			}			
-			
-		});		
-		
-	}).slideDown();
-}
-
-function fnCustomImgSendMsg(atchFileId, fileSn, filePath){
-	
-	
-	var imgId = "";
-	var imgSrc = "";
-	
-	/* imgSrc = filePath.replace("/usr/local/tomcat_mjon/webapps/mjon",""); */
-	/* imgSrc = filePath; */
-	imgId = atchFileId;
-	
-	imgSrc = '/cmm/fms/getImage2.do?atchFileId=' + atchFileId + '&fileSn=' + fileSn;
-	
-	myMsgImageControl(imgSrc, "edit_n", "Template", imgId);
-	
-}
-
-function fnMsgResend(msgResendFlag, msgSeqList){
-	
-	if(msgResendFlag == 'Y'){ // 문자재전송에서 넘어오는 경우 
-		
-		var form = document.msgResendForm;
-		form.msgSeqList.value = msgSeqList;
-		
-		var data = new FormData(form);
-		url = "/web/mjon/msgdata/selectReSendMsgDataListAjax.do";
-		
-		$.ajax({
-	        type: "POST",
-	        url: url,
-	        data: data,
-	        dataType:'json',
-	        async: false,
-	        processData: false,
-	        contentType: false,
-	        cache: false,
-	        success: function (returnData, status) {
-				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-					if("fail"==returnData.result){
-						
-						alert(returnData.message);
-						return false;
-						
-					}else if("loginFail"==returnData.result){
-						
-						alert(returnData.message);
-						return false;
-						
-					}else if(returnData.resultListCnt == '0'){
-						
-						alert("재전송 문자내용이 없습니다.");
-						return false;
-						
-					}else{
-						
-						var data = returnData;
-						var listCnt = returnData.resultListCnt;
-						var photoInfo = returnData.resultMsgPhotoInfo;
-						//수신자 처리 변수
-						var callToList = [];	//수신자 처리 리스트
-						var tableData = [];		//수신자 tabulator 처리 변수
-						
-						//var subject = data.resultList[0].subject;	//제목
-						//var smsTxt = data.resultList[0].smsTxt;		//문자내용
-						//var fileCnt = data.resultList[0].fileCnt;		//그림문자 이미지 갯수
-						//var filePath1 = data.resultList[0].fileType1;	//이미지1 파일 경로
-						//var filePath2 = data.resultList[0].fileType2;	//이미지2 파일 경로
-						//var filePath3 = data.resultList[0].fileType3;	//이미지3 파일 경로
-						//var atchFileId1 = photoInfo.atchFileId1;		//이미지1 파일 번호
-						//var atchFileId2 = photoInfo.atchFileId2;		//이미지2 파일 번호
-						//var atchFileId3 = photoInfo.atchFileId3;		//이미지3 파일 번호
-						
-						
-						for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
-							
-							callToList[i] = data.resultList[i].callTo;
-							tableData.push({phone: removeDash(callToList[i])});
-							
-						}
-						
-						if(tableData.length > 0){
-							
-							tableL.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기
-							
-							//totRows = tableL.getRows().length; 
-							//updateTotCnt(totRows); //전체 데이터 갯수 구하기
-							
-							//결제 금액 구하기
-						    //totalPriceSum(totRows); 
-							
-						}
-						
-						return false;
-						
-					}
-				
-				} else if(status== 'fail'){
-					alert(returnData.message);
-				}
-			},
-	        error: function (e) { alert("문자 재전송 번호 등록에 실패하였습니다."); console.log("ERROR : ", e); }
-	    });
-		
-	}
-	
-}
-
-
-function fnAddrSet(moveAddrFlag, addrIdList){
-	
-	if(moveAddrFlag == 'Y'){ // 주소록에서 넘어오는 경우 
-		
-		var form = document.moveAddrForm;
-		form.addrIdList.value = addrIdList;
-		
-		var data = new FormData(form);
-		url = "/web/mjon/addr/selectAddrDataListAjax.do";
-		
-		$.ajax({
-	        type: "POST",
-	        url: url,
-	        data: data,
-	        dataType:'json',
-	        async: true,
-	        processData: false,
-	        contentType: false,
-	        cache: false,
-	        success: function (returnData, status) {
-				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-					if("fail"==returnData.result){
-						
-						alert(returnData.message);
-						return false;
-						
-					}else if("loginFail"==returnData.result){
-						
-						alert(returnData.message);
-						return false;
-						
-					}else if(returnData.resultListCnt == '0'){
-						
-						alert("전달된 주소록이 없습니다.");
-						return false;
-						
-					}else{
-						
-						var listCnt = returnData.resultListCnt;
-						
-						//수신자 처리 변수
-						var tableData = [];		//수신자 tabulator 처리 변수
-						
-						for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
-							
-							tableData.push({
-								name: returnData.resultList[i].addrNm
-								,phone: removeDash(returnData.resultList[i].addrPhoneNo)
-								,rep1: returnData.resultList[i].addrInfo1
-								,rep2: returnData.resultList[i].addrInfo2
-								,rep3: returnData.resultList[i].addrInfo3
-								,rep4: returnData.resultList[i].addrInfo4
-								});
-							
-						}
-						
-						tableL.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기
-						
-						totRows = tableL.getRows().length; 
-						updateTotCnt(totRows); //전체 데이터 갯수 구하기
-						
-						//결제 금액 구하기
-					    totalPriceSum(totRows);
-						
-						return false;
-						
-					}
-				
-				} else if(status== 'fail'){
-					alert(returnData.message);
-				}
-			},
-	        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');
-			}	      
-	    });
-		
-	}
-	
-}
-
-function fnLetterListAjax(index){
-	var form = document.letterForm;
-	var letterType = form.letterType.value;
-	
-	if($('.tDep1_letType a').eq(0).hasClass('on')) {
-		form.letterType.value='S';
-	} else if ($('.tDep1_letType a').eq(1).hasClass('on')) {
-		form.letterType.value='L';
-	}
-	
-	//검색자 입력 검색 시 카테고리, 해쉬태그 전체  초기화
-	if(form.searchKeyword.value != '') {
-		form.categoryCode.value = "";
-		form.hashTag.value = "";
-		
-		$('.tDep1_cateCode').find('.on').removeClass('on');
-		$('.tDep1_cateCode').find('.cateAll').addClass('on');
-		$('.tDep1_hashTag').find('.on').removeClass('on');
-		$('.tDep1_hashTag').find('.hashAll').addClass('on');
-	}else{
-		//해시태그가 선택되어 있을 경우 해당 태그 검색어를 전달해줌
-		var strTagTxt = $('.tDep1_hashTag').find('.on').text().replace("#","");
-		if(strTagTxt == "전체"){
-			form.hashTag.value = "";
-		}else{
-			form.hashTag.value = strTagTxt;
-		}
-	}
-	
-	form.pageIndex.value = index;
-	form.letterType.value = letterType;
-	var sendData = $(document.letterForm).serializeArray();
-	//하위 카테고리
-	$("#tDep1_depThrCateCode").load("/web/mjon/msgdata/selectCateConfThrDptListAjax.do", sendData ,function(response, status, xhr){
-		if(document.letterForm.searchKeyword.value == ''){
-			$('.bottom_content .area_total_count').hide();
-		}
-		if(form.hashTag.value != ''){
-			if($('#letterLoad .nodata_box').length > 0){
-				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
-			}
-		}
-		
-	});
-	//문자샘플
-	$("#letterLoad").load("/web/mjon/msgdata/selectLetterDataListAjax.do", sendData ,function(response, status, xhr){
-		if(document.letterForm.searchKeyword.value == ''){
-			$('.bottom_content .area_total_count').hide();
-		}
-		if(form.hashTag.value != ''){
-			if($('#letterLoad .nodata_box').length > 0){
-				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
-			}
-		}
-		
-	});
-	
-}
-
-function fnPhotoListAjax(index){
-	var form = document.letterForm;
-	//검색자 입력 검색 시 카테고리, 해쉬태그 전체  초기화
-	if(form.searchKeyword.value != '') {
-		form.categoryCode.value = "";
-		form.hashTag.value = "";
-		
-		$('.tDep2_cateCode').find('.on').removeClass('on');
-		$('.tDep2_cateCode').find('.cateAll').addClass('on');
-		$('.tDep2_hashTag').find('.on').removeClass('on');
-		$('.tDep2_hashTag').find('.hashAll').addClass('on');
-	}else{
-		//해시태그가 선택되어 있을 경우 해당 태그 검색어를 전달해줌
-		var strTagTxt = $('.tDep2_hashTag').find('.on').text().replace("#","");
-		if(strTagTxt == "전체"){
-			form.hashTag.value = "";
-		}else{
-			form.hashTag.value = strTagTxt;
-		}
-	}
-	form.letterType.value = 'P';
-	form.pageIndex.value = index;
-	var sendData = $(document.letterForm).serializeArray();
-	//하위 카테고리
-	$("#tDep2_depThrCateCode").load("/web/mjon/msgdata/selectCateConfThrDptListAjax.do", sendData ,function(response, status, xhr){
-		if(document.letterForm.searchKeyword.value == ''){
-			$('.bottom_content .area_total_count').hide();
-		}
-		if(form.hashTag.value != ''){
-			if($('#letterLoad .nodata_box').length > 0){
-				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
-			}
-		}
-		
-	});	
-	
-	$("#photoLoad").load("/web/mjon/msgdata/selectPhotoDataListAjax.do", sendData ,function(response, status, xhr){
-		photoLayerView();
-		if(document.letterForm.searchKeyword.value == ''){
-			$('.bottom_content .area_total_count').hide();
-		}
-		if(form.hashTag.value != ''){
-			if($('#photoLoad .nodata_box').length > 0){
-				$('#photoLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
-			}
-		}
-	});
-	
-}
-
-function fnMyMsgListAjax(index){
-	
-	if(loginVO == "" || loginVO == null){
-		//alert("로그인 후 사용이 가능합니다.");
-		location.href="/web/user/login/login.do";
-		return false;
-	}else{
-		document.myMsgForm.pageIndex.value = index;
-		var sendData = $(document.myMsgForm).serializeArray();
-		$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
-			/* $(".msg_cont").mCustomScrollbar({
-				axis: 'y',
-				scrollbarPosition: "inside",
-				theme: "dark",
-				autoHideScrollbar: false
-			}); */
-			
-		});
-	}
-}
-
-function fnMyMsgSearchListAjax(index){
-	
-	document.myMsgForm.pageIndex.value = index;
-	var sendData = $(document.myMsgForm).serializeArray();
-	$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
-		
-		/* $(".msg_cont").mCustomScrollbar({
-			axis: 'y',
-			scrollbarPosition: "inside",
-			theme: "dark",
-			autoHideScrollbar: false
-		}); */
-		
-	});
-	
-}
-
-function fnMsgExcelDataView(){
-	
-	/* var sendData = $(document.searchForm).serializeArray() ;
-	
-	//엑셀 문자 탭 활성화 시키기
-	TabType1($('.tabType1 li').eq(1), '2');
-	
-	$(".contentExcelArea").load("/web/mjon/msgdata/selectMsgExcelDataViewAjax.do", sendData ,function(response, status, xhr){
-	}); */
-	
-	location.href="/web/mjon/msgdata/excel/selectMsgExcelDataView.do";
-	
-}
-
-function fn_saveMyMsg(){ // 내 문자 보관함 저장
-	
-	var form = document.msgForm;
-	var myImgFileId = [];			//신규 이미지 추가 파일 Id 저장 변수
-	var adverYn = $("input[name='send_adYn']:checked").val(); //광고 체크여부
-	
-	/*
-		이미지 에디터를 사용하여 추가한 경우 이미지 업로드 처리 - 단 에디터에서 템플릿을 선택한 경우는 업로드안함
-		신규 이미지 추가를 한 경우만 이미지 파일 업로드 처리함
-	*/
-	$('.thumb_wrap').find('.thumb_img').each(function(idx, el) {
-		
-		if($("#delLi"+idx).hasClass("Template")){ //이미지 에디터 템플릿 이미지 선택 여부 확인
-			templateYn.push("Y"); 
-		} else {
-			templateYn.push("N"); 
-		}
-		
-		if($(el).hasClass("edit_y")) { //에디터를 사용했고
-			//이미지 변환
-			const imgBase64 = $(el).attr("src");
-			const decodImg = atob(imgBase64.split(',')[1]);  // base64~ 부분을 제외하고 데이터 디코딩
-			
-	
-			let array = [];
-			for (let i = 0; i < decodImg.length; i++) {
-			  array.push(decodImg.charCodeAt(i));
-			}
-
-			const file = new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
-			const fileName = 'canvas_img_' + new Date().getMilliseconds() + '.jpg';
-			let formData = new FormData();
-			formData.append('file', file, fileName);
-			
-			$.ajax({
-				type: 'post',
-				url: '/web/mjon/msgdata/insertEditImageAjax.do',
-				cache: false,
-				data: formData,
-				dataType:'json',
-				processData: false,
-				contentType: false,
-				async: false,
-				success: function (returnData, status) {
-					if(status == 'success'){
-						// imgFilePath 에 배열로 담아주기(이미지 순서대로)
-						//console.log(imgFilePath);
-						//imgFilePath.push(returnData.filefullPath);
-						myImgFileId.push(returnData.atchFileId);
-						
-					} else if(status== 'fail'){
-						alert(returnData.message);
-					}
-				},
-				error: function (e) { alert("이미지 업로드에 실패하였습니다."); console.log("ERROR : ", e); }
-			});
-			
-		} else {
-			//에디터 안거친 템플릿 이미지면 바로 src 때림
-			imgFilePath.push($(el).attr("src"));
-		}	
-	});
-	
-	if(myImgFileId.length > 0 && imgFileId.length > 0){ //기존 샘플 이미지와 이미지 에디터 둘다 사용한 경우
-		
-		var tempImgId = [];
-		
-		tempImgId.push(myImgFileId);
-		tempImgId.push(imgFileId);
-		form.imgFileId.value = tempImgId; 
-		
-	}else if(myImgFileId.length > 0){	//이미지 에디터에서 신규 등록한 이미지 
-		
-		form.imgFileId.value = myImgFileId; 
-		
-	}else{	//샘플 이미지 선택만 했을경우(이미지 에디터 사용 안했을때)
-		
-		form.imgFileId.value = imgFileId; 
-	}
-	
-	//광고 문자 내용 합쳐주기
-	if(adverYn == 'Y'){
-		
-		var adTxt = $('.ad_txt').text();
-		var denyTxt = $('.deny_txt').text();
-		var smsTxt = form.smsTxtArea.value;
-		
-		//var adverTxt = adTxt + '\n\n' + smsTxt + '\n\n' + denyTxt;
-		var adverTxt = smsTxt;
-		form.smsTxt.value = adverTxt;
-		
-	}else{
-		
-		var smsTxt = form.smsTxtArea.value;
-		form.smsTxt.value = smsTxt;
-		
-	}
-	
-	//문자 종류 설정(S:단문 , L:장문 , P:그림)
-	var photoSts = $('.delLi').length;
-	var conLeng = conByteLeng(form.smsTxt.value); // 내용 문자 입력 바이트 수 계산하기
-	
-	if(photoSts > 0){
-		
-		form.msgType.value = 'P';
-		
-	}else if(conLeng > 90){
-	
-		form.msgType.value = 'L';
-		
-	}else{
-		
-		form.msgType.value = 'S';
-		
-	}
-	
-	if(photoSts == '0' && conLeng == '0'){
-		
-		alert("문자내용을 입력해 주세요.");
-		return false;
-		
-	}
-	
-	var data = new FormData(form);
-	url = "/web/mjon/msgdata/insertMyMsgDataAjax.do";
-	
-	$.ajax({
-        type: "POST",
-        url: url,
-        data: data,
-        dataType:'json',
-        async: false,
-        processData: false,
-        contentType: false,
-        cache: false,
-        success: function (returnData, status) {
-			if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-				if("fail"==returnData.result){
-					
-					alert(returnData.message);
-					return false;
-					
-				}else{
-					
-					alert("내 문자함에 저장되었습니다.");
-					
-					//내 문자함 탭 활성화 시키기
-					TabType2($('.tabType2 li').eq(3), '4');
-					var offset = $('.tabType2').offset();
-				    $('html, body').animate({scrollTop : offset.top-140}, 400);
-					
-					//최 하단 내문자함 탭 리스트 내용 불러오기
-					var sendData = $(document.myMsgForm).serializeArray();
-					$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
-					});
-					
-				}
-			
-			} else if(status== 'fail'){
-				alert(returnData.message);
-			}
-		},
-        error: function (e) { alert("문자 저장에 실패하였습니다."); console.log("ERROR : ", e); }
-    });
-	
-}
-
-//내 문자함으로 탭이동
-function fnGoMyMsg(){
-	
-	//내 문자함 탭 활성화 시키기
-	TabType2($('.tabType2 li').eq(3), '4');
-	
-	var offset = $('.tabType2').offset();
-    $('html, body').animate({scrollTop : offset.top-140}, 400);
-	
-}
-
-
-// MJ_MSG_GROUP_DATA 누락데이터 체크
-function getMsgGroupDataErrorCheck() {
-	var isError = false;
-	
-	$.ajax({
-	    type: "POST",
-	    url: "/web/mjon/msgdata/selectMsgGroupNotExistInfoAjax.do",
-	    data: {},
-	    dataType:'json',
-	    async: false,
-	    success: function (data) {
-			if (data.isSuccess) { 
-				if (data.isError == true) {
-					isError = true;
-				}
-			} 
-		},
-	    error: function (e) {
-	    	
-	    }
-	});	
-
-	return isError;
-}
-
-function checkConf() {
-	var confCheck = false;
-	
-	$.ajax({
-		type: "POST",
-		url: "/web/mjon/conf/selectMjonMsgUseConfAjax.do",
-		data: {},
-		dataType:'json',
-		async: false,
-		success: function (returnData, status) {
-			if(returnData.result == "fail") {
-				console.log(returnData.message);
-			}else if(returnData.result == "success"){
-				confCheck = true;
-			}
-		}
-		,error: function (e) {console.log("ERROR : ", e); }
-	});	
-	
-	return confCheck;
-}
-function blineSendCheck(blineCode) {
-	
-	var confCheck = false;
-	
-	$.ajax({
-		type: "POST",
-		url: "/web/mjon/conf/selectBlineSendCheckAjax.do",
-		data: {"agentCode":blineCode},
-		dataType:'json',
-		async: false,
-		success: function (returnData, status) {
-			if(returnData.result == "fail") {
-				console.log(returnData.message);
-			}else if(returnData.result == "success"){
-				confCheck = true;
-			}
-		}
-		,error: function (e) {console.log("ERROR : ", e); }
-	});	
-	
-	return confCheck;
-}
-
-
-
-
-//문자발송 처리 함수
-function fn_sendMsgData(){
-
-    // 타블레이터 호출
-    var $selectedData = tableL.getData(); // 데이터 가져오기
-    
-	if(!checkConf()){	//문자온 conf-check
-		alert("현재 문자 발송하기 기능 점검 중입니다.\n\n1분 후 다시 시도해주세요.");
-		return false;
-	}
-
-	var form = document.msgForm;
-	var totPriceOnly = stringReplaceAll(form.totPrice.value, ",", "");
-	var userMoneyOnly = stringReplaceAll(form.myPrice.value, ",", "");
-
-	// test 주석
-	if(parseFloat(userMoneyOnly) < parseFloat(totPriceOnly)){
-		alert("문자 발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
-		return false;
-	} 
-
-	// 폼 유효성 검사
-	if (!validateForm(form)) return false;
-	
-	var spamStatus = false;
-	var exceptSpamYn = $("#exceptSpamYn").val(); //금지어 필터링 예외 여부 - N 일 경우만 스팸 검사를 진행
-	
-	
-	var blineCodeYn = $("#blineCode").val();
-	if(blineCodeYn != 'N'){
-		if(!blineSendCheck(blineCodeYn)){	//문자온 conf-check
-			alert("현재 문자 발송하기 기능 점검 중입니다.\n\n잠시 후 다시 시도해주세요.");
-			return false;
-		}
-	}
-	
-	if($selectedData.length > 300000){
-		alert("30만건까지 발송이 가능합니다.\n받는사람 목록을 확인해주세요.");
-		return false;
-	}
-	
-
-	
-	if(!confirm("문자를 전송하시겠습니까?")){
-		return false;
-	}
-
-	//총 결제금액 천단위 콤마 삭제 후 전송
-	var totPrice = form.totPrice.value;
-	form.totPrice.value = totPrice.replace(",","");
-	
-	
-	//이벤트 진행중 회원의 경우 이벤트 잔여금액 비교 처리 필요.
-	//이벤트 캐시가 부족한 경우 이벤트 캐시로 발송 가능한 만큼만 이벤트 금액으로 발송 처리해줌.
-	//이 후 나머지 발송 건수는 이벤트 캐시가 아닌 일반 단가로 발송 처리를 진행 함.
-	var eventStatus = form.eventStatus.value;
-	
-	if(eventStatus == 'Y'){ //이벤트 진행 대상자이면 문자종류에 이벤트로 구분
-		
-		form.eventYn.value = "Y"; //이벤트문자 종류 설정
-		
-	}
-	
-	var eventRemainCash = parseFloat(form.eventRemainCash.value);
-	console.log('eventStatus : ', eventStatus);
-	
-	if(eventStatus == 'Y' 
-				&& parseFloat(eventRemainCash) < parseFloat(totPriceOnly))
-	{
-		console.log('eventRemainCash : ', eventRemainCash);
-		if(!confirm("고객님의 이벤트 캐시 잔액(" + eventRemainCash + "원) 부족으로 요청하신 문자("+numberWithCommas($selectedData.length)+"건)를 모두 발송할 수 없습니다. 이벤트 캐시 초과 건에 대해서는 일반 단가를 적용하여 발송하시겠습니까?")){
-			return false;
-		}
-	}
-
-	console.log(' !!! imgFilePath : ', imgFilePath);
-		
-	// img 처리 영역
-	imgFilePath = [];
-	$('.thumb_wrap').find('.thumb_img').each(function(idx, el) {
-		if($("#delLi"+idx).hasClass("Template")){
-			templateYn.push("Y");
-		} else {
-			templateYn.push("N");
-		}
-		
-		if($(el).hasClass("edit_y")) {
-			//이미지 변환
-			const imgBase64 = $(el).attr("src");
-			const decodImg = atob(imgBase64.split(',')[1]);  // base64~ 부분을 제외하고 데이터 디코딩
-			
-	
-			let array = [];
-			for (let i = 0; i < decodImg.length; i++) {
-			  array.push(decodImg.charCodeAt(i));
-			}
-
-			const file = new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
-			const fileName = 'canvas_img_' + new Date().getMilliseconds() + '.jpg';
-			let formData = new FormData();
-			formData.append('file', file, fileName);
-
-			$.ajax({
-				type: 'post',
-				url: '/web/mjon/msgdata/insertEditImageAjax.do',
-				cache: false,
-				data: formData,
-				dataType:'json',
-				processData: false,
-				contentType: false,
-				async: false,
-				success: function (returnData, status) {
-					if(status == 'success'){
-						console.log('returnData : ',returnData)
-						// imgFilePath 에 배열로 담아주기(이미지 순서대로)
-						//console.log(imgFilePath);
-						imgFilePath.push(returnData.filefullPath);
-						imgFileId.push(returnData.atchFileId);
-						
-					} else if(status== 'fail'){
-						alert(returnData.message);
-					}
-				},
-				error: function (e) { alert("이미지 업로드에 실패하였습니다."); console.log("ERROR : ", e); }
-			});
-
-		} else {
-			if(imgFilePath.length != imgFileId.length){
-				//에디터 안거친 템플릿 이미지면 바로 src 때림
-				imgFilePath.push($(el).attr("src"));
-			}
-		}	
-	});
-		
-
-	//form.reserveYn.value = reserYn; // 즉시 / 예약 문자 선택 여부 
-	form.templateYnAdvc.value = templateYn;
-	console.log('imgFilePath : ', imgFilePath);
-	console.log('imgFilePath : ', JSON.stringify(imgFilePath));
-	console.log('imgFileId : ', imgFileId);
-	console.log('imgFileId : ', JSON.stringify(imgFileId));
-	form.imgFilePathAdvc.value = imgFilePath;
-	form.imgFileIdAdvc.value =  imgFileId;
-// 	form.imgFilePath.value = JSON.stringify(imgFilePath).replace(/\\/g, '');
-// 	form.imgFileId.value =  JSON.stringify(imgFileId).replace(/\\/g, '');
-	form.callFrom.value = removeDash($('#callFromList').val()); // 발신번호 대쉬(-) 문자 없애주기
-
-	//광고 종류 설정
-	var adverYn = $("input[name='send_adYn']:checked").val();
-	if(adverYn == 'Y'){
-		form.msgKind.value = "A"; //광고문자 종류 설정
-	}else{
-		form.msgKind.value = "N"; //일반문자 종류 설정
-	}
-	
-	// 예약 확인
-	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
-	form.reserveYn.value = reserYn; // 즉시 / 예약 문자 선택 여부 
-	
-	if(reserYn == 'Y'){
-		
-		var date = $(".resDate").val();//form.msgResDate.value;
-		var hour = form.msgResHour.value;
-		var min = form.msgResMin.value;
-		
-		if(date == ""){
-			
-			alert("예약전송 날짜를 선택해 주세요.");
-			return false;
-			
-		}else{
-			
-			var now = new Date();
-			var reqDate = date + " " + hour + ":" + min + ":00";
-			var gapDate = getGapDayTime(date, hour, min);
-			
-			if(gapDate < 0){ // 음수이면 이전날짜, 크면 이후 날짜.
-				alert("예약 날짜는 현재 시간 이후의 날짜 및 시간을 선택해 주세요.");
-				return false;
-			}else{
-				form.reqDate.value = reqDate;	//예약일자 파라미터 저장
-			}
-		}
-
-	}else{
-		
-		form.reqDate.value = "";
-		
-	}
-	
-	
-
-	//발송 Ajax 호출해주기
-	sendMsgAjax_advc();
-}
-
-
-// 선택된 데이터의 길이에 따라 예상 시간 계산 함수
-function calculateEstimatedTime(selectedCount) {
-	//기준값
-	// const processTimePerBatch = 130; // 130초
-	
-	
-	// 30만건 기준 10분으로 기준을 잡아서 
-	// 시간계산함
-	const processTimePerBatch = 600;
-	const batchSize = 300000;
-	
-	// 1건당 처리 시간
-	const timePerRecord = processTimePerBatch / batchSize;
-
-	// 예상 시간 계산
-	const estimatedTimeInSeconds = selectedCount * timePerRecord;
-
-	return estimatedTimeInSeconds.toFixed(2);
-}
-
-
-
-
-function sendMsgAjax_advc(){
-    // 타블레이터 호출
-    var $selectedData = tableL.getData(); // 데이터 가져오기
-
-	 // 폼 데이터를 배열로 직렬화
-	 var form = $('#msgForm');
-	 var formDataArray = form.serializeArray();
-	
-	 // 배열을 객체로 변환
-	 var formData = {};
-	 $.each(formDataArray, function(index, field) {
-	     formData[field.name] = field.value;
-	 });
-	
-	 // 빈 값 제거
-	 removeEmptyValues(formData);
-
-	// 선택된 데이터 추가
-	formData["mjonMsgSendVOList"] = $selectedData;
-	
-	// JSON 데이터 확인
-// 	console.log("최종 formData:", JSON.stringify(formData));
-	
-	
-	var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do";
-	 // 시작 시간
-	const startTime = new Date();
-	 
-	
-	 // 프로그래스파 시간을 위한 계산
-	var estimtedTime = calculateEstimatedTime($selectedData.length);
-	console.log('estimtedTime  : ', estimtedTime);
-	
-	 
-	$.ajax({
-		type: "POST",
-		url: url,
-		data: JSON.stringify(formData),
-		contentType: 'application/json',
-		dataType: 'json',
-		success: function (data) {
-			
-			// 요청 종료 시간 및 경과 시간 계산
-			const endTime = new Date();
-			const elapsed = (endTime - startTime) / 1000; // 밀리초 -> 초로 변환
-			console.log('AJAX 요청 성공, 경과 시간 : ', elapsed);
-			if (elapsed >= 60) {
-				const minutes = Math.floor(elapsed / 60); // 분 계산
-				const seconds = Math.floor(elapsed % 60); // 초 계산
-				console.log('AJAX 요청 성공, 경과 시간 : ' + minutes + '분 ' + seconds + '초');
-			} else {
-				console.log('AJAX 요청 성공, 경과 시간 : ' + elapsed + '초');
-			}
-			
-			
-			
-			console.log('data : ', data);
-			/*  message:"특정문구 일괄변환 치환문자 데이터가 없습니다."
-				status:"BAD_REQUEST" */
-			
-			var status = data.status;
-			if("OK" == status){
-				
-				var smsCnt = Number(data.object.resultSts);
-				var blockCnt = Number(data.object.resultBlockSts);
-				
-				if((smsCnt + blockCnt) == 0){
-					
-					$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-					$('.pop_msg_spam .msg_text').html("문자 발송(예약)에 실패하였습니다.<br/> 다시 시도해주세요. <br/>* 정상적으로 발송 시도하였으나 실패하신 경우 혹시 문자내용에 사용불가 이모지 <br/>또는 복사-붙여넣기로 인한 보이지 않는 특수문자가 포함되었는지 확인 후 다시 시도해주세요.");
-					$('.mask').addClass('on');
-					
-				}else{
-					
-					$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-					//예약발송 건의 경우 결과 팝업 문구 변경
-					
-					var reserYn = $("input[name=reserYn]:checked").val(); 
-					var resText = (reserYn === 'Y') ? '예약' : '발송';
-					/* 
-					if(reserYn == 'Y')
-					{
-						resText = "예약";
-					}
-					else
-					{
-						resText = "발송";
-					} 
-					*/
-					$('.pop_msg_success .msg_text').html(resText+" 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 "+resText+" 되었습니다.");
-					
-					$('.mask').addClass('on');
-					
-				}
-				
-				
-			}else if("BAD_REQUEST" == status){
-
-				alert(data.message);
-				return false;
-					
-			}else if("UNAUTHORIZED" == status){
-				
-				alert(data.message);
-				//문자발송 URL Move
-				goMsgUrlMove();
-				return false;
-				
-			}else if("NO_CONTENT" == status){
-				
-				$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-				$('.pop_msg_fails .msg_text').html(returnData.message);
-				$('.mask').addClass('on');
-				
-			}
-				
-		},
-		beforeSend : function(xmlHttpRequest) {
-			// 프로그래스 바 실행
-			// 프로그래스 바 실행
-			progressStart(estimtedTime);
-			//로딩창 show
-// 			$('.loading_layer').addClass('active');
-		},
-		complete : function(xhr, textStatus) {
-
-			// 프로그래스 바 종료
-			// 프로그래스 바 종료
-			progressComplete();;
-// 			로딩창 hide
-// 			$('.loading_layer').removeClass('active');
-		},
-		error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
-//폼 유효성 검사 함수
-function validateForm(form) {
-
-    // 타블레이터 호출
-    var $selectedData = tableL.getData(); // 데이터 가져오기
-    
-    if($selectedData.length < 1){
-		alert("받는사람 내역을 입력해주세요.");
-		return false;
-    }
-	
-	
-	if(form.callFromList.value == ""){
-		
-		alert("발신번호를 입력해 주세요.");
-		return false;
-		
-	}
-
-	if (form.title_status.value === 'N') {
-		form.mmsSubject.value = "";
-	} else if (getSpacialStringChk(form.mmsSubject.value)) {
-		alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다.");
-		return false;
-	}
-
-	//문자제목에 이모지가 있는지 체크
-	var titleStatusYn = $("input[name='title_status']:checked").val();
-	if(titleStatusYn == 'Y') {
-		if(!emojiCheck(form.mmsSubject.value)) return false;
-	}
-
-	// 문자내용에 이모지가 있는지 체크 
-	var strCont = form.smsTxtArea.value;
-	if (!emojiCheck(strCont)) return false;
-	
-	var rtnStr = strChinJpnCheck(strCont);
-	if(rtnStr.length > 0){
-		alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다.");
-	}
-	
-	if (imgFilePath.length === 0 && !form.smsTxtArea.value) {
-		alert("문자내용을 입력해 주세요.");
-		return false;
-	}
-	return true;
-}
-
-//이벤트가 아닌 일반 개별 단가 셋팅해주기
-function getNorEachPrice(evnMsgType){
-	
-	var norEachPrice = 0;
-	var evnImgCnt = $("#imgCnt").val();
-	
-	//일반 단가로 변경해주기
-	if(evnMsgType == '4'){
-		
-		norEachPrice = $("#norsPrice").val();
-		console.log("norEachPrice Short::: "+norEachPrice);
-		
-	}else if(evnMsgType == '6'){
-		
-		if(evnImgCnt == 0){//장문 가격
-			
-			norEachPrice = $("#normPrice").val();
-			console.log("norEachPrice Long ::: "+norEachPrice);
-			
-		}else if(evnImgCnt == 1){
-			
-			norEachPrice = $("#norpPrice").val();
-			console.log("norEachPrice p1 ::: "+norEachPrice);
-			
-		}else if(evnImgCnt == 2){
-			
-			norEachPrice = $("#norp2Price").val();
-			console.log("norEachPrice p2 ::: "+norEachPrice);
-			
-		}else if(evnImgCnt == 3){
-			
-			norEachPrice = $("#norp3Price").val();
-			console.log("norEachPrice p3 ::: "+norEachPrice);
-			
-		}
-		
-	}
-	
-	return norEachPrice;
-}
-
-//빈 값이나 null 값을 제거하는 함수
-function removeEmptyValues(obj) {
-    Object.keys(obj).forEach(function(key) {
-        if (obj[key] === null || obj[key] === '') {
-            delete obj[key];
-        }
-    });
-}
-
-
-function sendMsgAjax(paramSmsCnt, paramBlockCnt){
-	var form = document.msgForm;
-	var reserYn = $("#reserveYn").val();
-	
-	var data = new FormData(form);
- 	url = "/web/mjon/msgdata/sendMsgDataAjax.do";
-	
-	$.ajax({
-        type: "POST",
-        url: url,
-        data: data,
-        dataType:'json',
-        async: true,
-        processData: false,
-        contentType: false,
-        cache: false,
-        success: function (returnData, status) {
-			if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-				if("fail" == returnData.result){
-					
-					alert(returnData.message);
-					return false;
-					
-				}else if("loginFail" == returnData.result){
-					
-					alert(returnData.message);
-					return false;
-						
-				}else if("smsLengFail" == returnData.result){
-					
-					alert(returnData.message);
-					return false;
-						
-				}else if("imgSourceFail" == returnData.result){
-					
-					$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-					$('.pop_msg_fails .msg_text').html(returnData.message);
-					$('.mask').addClass('on');
-					
-				}else if("spamKeyWordFail" == returnData.result){//스팸 및 스미싱 단어가 들어간 문자 발송시 회원 이용정지 처리
-					
-					$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-					$('.pop_msg_spam .msg_text').html(returnData.message);
-					$('.mask').addClass('on');
-					
-				}else if("statusFail" == returnData.result){
-					
-					alert(returnData.message);
-					//문자발송 URL Move
-					goMsgUrlMove();
-					return false;
-					
-				}else{
-					
-					var smsCnt = Number(returnData.resultSts);
-					var blockCnt = Number(returnData.resultBlockSts);
-					
-					smsCnt = Number(smsCnt) + Number(paramSmsCnt);
-					blockCnt = Number(blockCnt) + Number(paramBlockCnt);
-					
-					if((smsCnt + blockCnt) == 0){
-						
-						$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-						$('.pop_msg_spam .msg_text').html("문자 발송(예약)에 실패하였습니다.<br/> 다시 시도해주세요. <br/>* 정상적으로 발송 시도하였으나 실패하신 경우 혹시 문자내용에 사용불가 이모지 <br/>또는 복사-붙여넣기로 인한 보이지 않는 특수문자가 포함되었는지 확인 후 다시 시도해주세요.");
-						$('.mask').addClass('on');
-						
-					}else{
-						
-						$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-						//예약발송 건의 경우 결과 팝업 문구 변경
-						if(reserYn == 'Y'){
-							$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 예약 되었습니다.");
-						}else{
-							$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 발송 되었습니다.");
-						}
-						
-						$('.mask').addClass('on');
-						
-					}
-					
-				}
-				
-			} else if(status== 'fail'){
-				alert(returnData.message);
-			}
-		},
-		beforeSend : function(xmlHttpRequest) {
-        	//로딩창 show
-        	$('.loading_layer').addClass('active');				
-		},	        	        
-        complete : function(xhr, textStatus) {
-        	//로딩창 hide
-        	$('.loading_layer').removeClass('active');
-		},	      			
-        error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); }
-    });
-	
-}
-
-function linkPage(pageNo){
-	fnLetterListAjax(pageNo);
-}
-
-
-function linkPhoPage(pageNo){
-	fnPhotoListAjax(pageNo);
-}
-
-function myMsgPage(pageNo){
-	fnMyMsgListAjax(pageNo);
-}
-
-function fnMyMsgCheckDelete(){
-	
-	var msgId = [];
-	if($("input:checkbox[name='myMsgDel']").is(":checked")==false){
-		alert("선택된 항목이 없습니다.");
-		return;
-	}
-	
-	$("input:checkbox[name='myMsgDel']:checked").each(function(index){
-		
-		msgId[index] = $(this).val();
-		
-	});
-	
-	if(msgId.length > 0){
-		
-		document.myMsgForm.msgIdList.value = msgId;
-		var sendData =  $(document.myMsgForm).serializeArray();
-		
-		$("#myMsgLoad").load("/web/mjon/msgdata/deleteMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
-			
-			//문자 내용 스크롤 적용
-			/* $(".msg_cont").mCustomScrollbar({
-				axis: 'y',
-				scrollbarPosition: "inside",
-				theme: "dark",
-				autoHideScrollbar: false
-			}); */
-			
-		});
-		
-	}else{
-		
-		alert("삭제할 문자를 선택해 주세요.");
-		return false;
-		
-	}
-	
-}
-
-//문자 샘플 2줄, 4줄 보기 기능 
-function fnLPageUnit(){
-	
-	var form = document.letterForm;
-	var pageUnit = form.LPageUnit.value;
-	
-	form.pageUnit.value = pageUnit;
-	fnLetterListAjax(1);
-	
-}
-
-//그림문자 샘플 2줄, 4줄 보기 기능 
-function fnPhPageUnit(){
-	
-	var form = document.letterForm;
-	var pageUnit = form.PhPageUnit.value;
-	
-	form.pageUnit.value = pageUnit;
-	fnPhotoListAjax(1);
-	
-}
-
-//내문자함 2줄 4줄보기 기능
-function fnMsgPageUnit(){
-	
-	var form = document.myMsgForm;
-	var pageUnit = form.msgPageUnit.value;
-	
-	form.pageUnit.value = pageUnit;
-	fnMyMsgListAjax(1);
-	
-}
-
-function fnMyMsgSearchListOrd(){
-	
-	var form = document.myMsgForm;
-	var sortOrd = form.searchSortOrd.value;
-	
-	if(sortOrd == 'desc'){
-		
-		form.searchSortOrd.value = 'asc';
-		$('#sortCnd').text('등록순');
-		
-	}else{
-		
-		form.searchSortOrd.value = 'desc';
-		$('#sortCnd').text('최근순');
-		
-	}
-	
-	//내문자함 내용 검색하기
-	fnMyMsgSearchListAjax(1);
-	
-}
-
-function msgSuccessClose(obj){
-	$(obj).closest('.pop_msg_success').attr('style','');
-	//문자발송 URL Move
-	goMsgUrlMove();
-	$('html').scrollTop(0);
-}
-
-function msgFailsClose(obj){
-	$(obj).closest('.pop_msg_fails').attr('style','');
-}
-
-function msgSpamClose(obj){
-	$(obj).closest('.pop_msg_spam').attr('style','');
-	//location.href="/web/uat/uia/actionLogout.do";
-}
-
-function msgResultLink(){
-	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
-	if(reserYn == 'Y'){
-		
-		location.href="/web/mjon/reservmsg/selectReservMsgView.do";
-		
-	}else{
-		
-		location.href="/web/mjon/msgsent/selectMsgSentView.do";
-		
-	}
-	
-}
-
-//START
-//맞춤제작 요청 JSPark => 2023.02.21 추가
-//맞춤제작 등록 Popup 
-function customPopup(){
-	$("#customPopup").load("/web/mjon/custom/selectMsgCustomPopupAjax.do", "" ,function(response, status, xhr){
-		popupImgList(1);
-	});
-}
-
-function openMsgCustomPopup() {
-	if(loginVO == "" || loginVO == null){
-		alert("로그인 후 이용이 가능합니다.");
-		return false;
-	} else {
-		$("#customPopupOpen").trigger("click");
-	}
-	$("#customType04").hide();
-	popCustomScrT=$(window).scrollTop();
-	popScrTarget();
-}
-
-$(window).on('load',function(){
-	setTimeout(function(){
-		popScrTarget();
-	},500);
-});
-
-function popScrTarget(){
-	var closeTarget=$('.custom_layer .tooltip-close');
-	closeTarget.attr('onclick','popScrCloseSetting();');
-}
-
-function popScrCloseSetting(){
-	setTimeout(function(){
-		$(window).scrollTop(popCustomScrT);	
-	},1);
-}
-//END
 </script>
 
 
@@ -1852,10 +79,11 @@
         <div class="send_top">
             <!-- tab button -->
             <ul class="tabType1">
-                <li class="tab active"><button type="button" onclick="TabType1(this,'1');">단문 · 장문 · 그림 문자</button></li>
-                <li class="tab">
-                	<!-- <button type="button" onclick="TabType1(this,'2');">대량 문자(엑셀·TXT)</button> -->
-                	<button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량 문자(엑셀·TXT)</button>
+                <li class="tab ${tabDision eq 'tab01' ? 'active' : ''}">
+                	<button type="button" onclick="javascript:fnMsgDataView(); return false;">단문 · 장문 · 그림 문자</button>
+                </li>
+                <li class="tab ${tabDision eq 'tab02' ? 'active' : ''}">
+                	<button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량 문자</button>
                 </li>
             </ul><!--// tab button -->
 			<!-- tab content1 -->
@@ -2173,3 +401,6 @@
 	<input name="moveAddrFlag" type="hidden" value="N"/>
 	<input name="addrIdList" type="hidden" value=""/>
 </form>
+<form id="goPageAjax" name="goPageAjax" method="post">
+	<input name="tabDision" type="hidden" value="<c:out value='${tabDision }'/>"/>
+</form>
src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp
@@ -33,7 +33,7 @@
 	}	
 	
 	//그림문자 샘플 탭 활성화 시키기
-	TabType2($('.tabType2 li').eq(1), '2');
+// 	TabType2($('.tabType2 li').eq(1), '2');
 	
 	// 맞춤제작 요청 JSPark => 2023.02.21 추가
 	//맞춤제작 등록 Popup 
@@ -1682,21 +1682,16 @@
             <!-- tab button -->
             <ul class="tabType1">
                 <li class="tab active">
-                	<!-- <button type="button" onclick="TabType1(this,'1');">단문 · 장문 · 그림 문자</button> -->
                 	<button type="button" onclick="javascript:fnMsgDataView(); return false;">단문 · 장문 · 그림 문자</button>
                 </li>
                 <li class="tab">
                 	<button type="button" onclick="TabType1(this,'2');">대량 문자(엑셀·TXT)</button>
-                	<!-- <button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량 문자(엑셀·TXT)</button> -->
                 </li>
             </ul><!--// tab button -->
-			<!-- tab content1 -->
-			<!-- <span id="contentArea"></span> -->
-			<!-- <div class="top_content current contentArea" id="tab1_1"></div> -->
+
+			<div class="top_content current get_excel contentExcelArea" id="tab1_2" style="min-height: 555px;">
 			
-			<!-- tab content2 -->
-			<!-- <span id="contentExcelArea"></span> -->
-			<div class="top_content current get_excel contentExcelArea" id="tab1_2" style="min-height: 555px;"></div>
+			</div>
 		</div><!--// send top -->
 	<!-- send bottom -->
 <div class="send_bottom">
@@ -1758,7 +1753,7 @@
 							<a href="#none" value="<c:out value='${cateList.cateCode}'/>"><c:out value="${cateList.cateNm}"/></a>
 						</c:forEach>
 					</div>
-					<div class="tab_depth4 tDep1_threeCateCode" id="tDep1_depThrCateCode" <!-- 해쉬태그 삭제 및 하위 카테고리 추가로 인해 class="tDep1_hashTag" 삭제 -->
+					<div class="tab_depth4 tDep1_threeCateCode" id="tDep1_depThrCateCode"> <!-- 해쉬태그 삭제 및 하위 카테고리 추가로 인해 class="tDep1_hashTag" 삭제 -->
 						<!-- 하위 카테고리(3뎁스)로 대체 -->
 						<%-- <a href="#none" class="on hashAll" value="">전체</a>
 						<c:forEach var="hashList" items="${hashTagList}" varStatus="status">
 
src/main/webapp/js/web/msgdata/init.js (added)
+++ src/main/webapp/js/web/msgdata/init.js
@@ -0,0 +1,81 @@
+
+var _regExp1 = /(^02.{0}|^01.{1}|^[0-9]{3})-?([0-9]{3,4})-?([0-9]{4})$/;
+
+var imgFilePath = []; // 최종 선택한 이미지 경로 저장 변수
+var imgFileId = []; // 최종 선택한 파일 아이디 저장 변수
+var templateYn = []; // 템플릿 사용 여부 저장 변수
+var tableL = null; //좌측 받는 사람 주소록 Tabulator 변수
+var tableR = null; //우측 주소록 불러오기 Tabulator 변수
+var tableAddr = null; //주소록 불러오기 팝업 Tabulator 변수
+
+var loginVO = '${loginVO}';
+
+var popCustomScrT=0;	// 맞춤제작 요청 JSPark => 2023.02.21 추가
+var msgResendAllFlag = "${msgResendAllFlag}";
+var msgResendAllGroupId = "${msgResendAllGroupId}";
+var msgResendAllAdvertiseYn = "${msgResendAllAdvertiseYn}";
+var msgResendAllReplaceYn = "${msgResendAllReplaceYn}";
+
+$(document).ready(function(){
+	var tsMoreSampleYn = "${moreSampleYn}";
+	var tsMainImgFlag = "${mainImgVO.mainImgFlag}";
+	var tsMainLetterFlag = "${mainLetterVO.mainLetterFlag}";
+		
+	//메인화면에서 샘플 더보기로 왔을 시 문자타입, 카테고리 세팅
+	if(tsMoreSampleYn == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}
+	//메인화면에서 그림문자샘플 클릭으로 왔을 시 문자타입, 카테고리 세팅
+	if(tsMainImgFlag == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}
+	//메인화면에서 단문장문 문자샘플 클릭으로 왔을 시 문자타입, 카테고리 세팅
+	if(tsMainLetterFlag == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}	
+	
+
+	//문자 발송 화면 폼 불러오기
+	listMsgDataView();
+	
+	//최 하단  문자 샘플 탭 리스트 내용 불러오기
+	fnLetterListAjax(1);
+	
+	//최 하단 그림문자 탭 리스트 내용 불러오기
+	fnPhotoListAjax(1);
+	
+	// 내보관함 리스트 로그인이 완료된 경우에만 로드되도록
+	if(loginVO != "" && loginVO != null){
+		//최 하단 내문자함 탭 리스트 내용 불러오기
+		fnMyMsgListAjax(1);
+	}
+	
+	//그림문자 샘플 탭 활성화 시키기
+	
+	// var tabDision = '${tabDision}';
+	// console.log('tabDision : ', tabDision);
+	// TabType1_advc($('.tabType1 li').eq(1));
+	// TabType2($('.tabType2 li').eq(1), '2');
+	
+	//document.ready 마지막에 그림문자를 조회하기 때문에 letterForm.letterType이 P로 고정되는데, 메인에서 왔을 경우 letterType을 다시 원복하기 위한 작업
+	if(tsMoreSampleYn == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}
+	if(tsMainImgFlag == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}
+	if(tsMainLetterFlag == 'Y'){
+		document.letterForm.letterType.value = '${searchVO.mainLetterTypeFlag}';
+		document.letterForm.categoryCode.value = "${cateCodeVO.cateNo}";
+	}
+	
+	// 맞춤제작 요청 JSPark => 2023.02.21 추가
+	//맞춤제작 등록 Popup 
+	//customPopup();	
+});
+
 
src/main/webapp/js/web/msgdata/msgDataView.js (added)
+++ src/main/webapp/js/web/msgdata/msgDataView.js
@@ -0,0 +1,1717 @@
+
+
+/**
+ * 20241218 advc 이호영
+ * @기존 MsgDataView.jsp에 있는 js를 가져와서 분기 처리중
+ * - document.ready는 init.js로 이동함
+ *
+ *
+ */
+
+// 문자 그룹정보 => 재전송용
+function getMjMsgGroupInfoByResend() {
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/msgdata/selectMjMsgGroupInfoByResendAjax.do",
+		data: {"msgResendAllGroupId" : msgResendAllGroupId},
+		dataType:'json',
+		async: false,
+		success: function (data) {
+			//alert(JSON.stringify(data));
+			if(data.isSuccess == true){
+				var msgData = data.resultMsgInfo;
+				var fileData = data.resultMsgAddPhotoInfo;
+				
+				// 발신번호
+				var reCallFrom = $.trim(removeDash($("#callFromList option:selected").val()));
+				if ($.trim(removeDash(msgData.callFrom)) != reCallFrom) {
+					alert("발신번호가 이전에 발송한 번호가 아닙니다.\n발신번호를 확인해주세요.")
+				}
+				
+				var smsTxt = msgData.smsTxt;
+				var subject = msgData.subject;
+				var fileId = "";
+				var filePath = "";
+				var len = fileData.length;
+				
+				// 기존 내용 지워주기
+				//$(".btnReset").trigger("click");
+				$('.delLi').each(function(){
+					$(this).remove();
+				});
+				
+				$('.preBoxF').each(function(){
+					$(this).remove();
+				});
+
+				$('#imgCnt').val(0);
+				
+				// 기존 imgFileId, imgFilePath 배열에 있는 내용 초기화 해주기
+				imgFilePath = [];
+				imgFileId = [];
+
+				// 문자제목
+				if (msgData.subject != null && msgData.subject != "") {
+					$('.msg_title').addClass('active');
+					$("input:radio[name='title_status']:radio[value='Y']").prop('checked', true); // 선택하기
+					$('.textbox').show();
+					$("#mmsSubject").val(subject);	
+				}
+				
+				// 문자내용
+				if (smsTxt.indexOf("(광고)") == 0) {
+					$('#send_adYnY').prop('checked', true);
+					
+					//광고 상하단 내용 넣어주기
+					advMsgInsert();				
+					
+					// 광고 기본정보 제거
+					smsTxt = $.trim(smsTxt.replace("(광고)", ""));
+					var smsTxtLastIdxCnt = smsTxt.lastIndexOf("무료거부");
+					if (smsTxtLastIdxCnt != -1) {
+						smsTxt = $.trim(smsTxt.substring(0, smsTxtLastIdxCnt));	
+					}					
+				}
+				$('#smsTxtArea').val(smsTxt);	
+				
+				// 첨부 이미지가 있는경우 이미지 처리해주기
+				if(len > 0) {
+					for(var i=0; i < len; i++) {
+						var num = i + 1;
+						var imgId = fileData[i].atchFileId;
+						var imgSn = fileData[i].fileSn;
+						var fileStreCours = fileData[i].fileStreCours;
+						var streFileNm = fileData[i].streFileNm;
+						var fileExtsn = fileData[i].fileExtsn;
+						
+						/* var imgSrc = fileStreCours + "/" + streFileNm + "." + fileExtsn; */
+						var imgSrc = '/cmm/fms/getImage2.do?atchFileId=' + imgId + '&fileSn=' + imgSn;
+						myMsgImageControl(imgSrc, "edit_n", "Template", imgId);
+					}
+					
+					fnByteString($('#smsTxtArea').val());
+				}
+				else {
+					fnByteString($('#smsTxtArea').val());
+				}
+				
+				// 문자전송 상단으로 이동
+				var sendOfT=$('.send_top').offset().top;
+				$('html,body').stop().animate({'scrollTop':sendOfT-60},250);		
+				
+			} else {
+				//alert("Message : " + msg);
+			}
+		},
+		error: function (e) { 
+			//alert("저장에 실패하였습니다."); 
+			//console.log("ERROR : ", e); 
+		}
+	});
+}
+
+// 문자 상세정보 => 재전송용
+function getMjMsgListByResend() {
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/msgdata/selectMjMsgListByResendAjax.do",
+		data: {"msgResendAllGroupId" : msgResendAllGroupId},
+		dataType:'json',
+		async: false,
+		success: function (data) {
+			console.log('data : ', data);
+			if(data.isSuccess == true){
+				var listCnt = data.resultList.length;
+				
+				//수신자 처리 변수
+				var callToList = [];	//수신자 처리 리스트
+				var tableData = [];		//수신자 tabulator 처리 변수
+				
+				for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
+					callToList[i] = data.resultList[i].callTo;
+					tableData.push({phone: removeDash(callToList[i])});
+				}
+
+				console.log('tableData : ', tableData);
+				if(tableData.length > 0){
+					
+					// 데이터 추가
+					setTimeout(() => {
+						tableL.addData(dupliPhoneData(tableData));
+						totRows = tableL.getRows().length; 
+						console.log('totRows : ', totRows);
+						updateTotCnt(totRows); //전체 데이터 갯수 구하기
+						
+						//결제 금액 구하기
+					    totalPriceSum(totRows);		
+					}, 0); // 초기화 직후에 실행
+				}				
+				
+			} else {
+				//alert("Message : " + msg);
+			}
+		},
+		error: function (e) { 
+			//alert("저장에 실패하였습니다."); 
+			//console.log("ERROR : ", e); 
+		}
+	});
+}
+
+// 문자발송 URL Move 
+function goMsgUrlMove() {
+	document.location.href = "/web/mjon/msgdata/selectMsgDataView.do";
+}
+
+function listMsgDataView(){
+	
+	var sendData = $(document.goPageAjax).serializeArray() ;
+	console.log('sendData : ', sendData)
+	$(".contentArea").load("/web/mjon/msgdata/selectMsgDataSMLViewAjax.do", sendData ,function(response, status, xhr){
+		
+		//문자 재전송 및 주소록 전달 처리를 위해 사용
+		$("#msgForm").ready(function(){	//문자 내용 폼이 로드된 후 실행
+			
+			//헤더 문자검색 결과 처리
+			var headerMsgSearchFlag = '${headerMsgSearchVO.headerMsgSearchFlag}';
+			
+			if(headerMsgSearchFlag == 'Y'){
+				
+				var letterType = '${headerMsgSearchVO.msgType}';
+				var form = document.letterForm;
+				var searchKeyword = '${headerMsgSearchVO.searchKeyword}';
+				form.letterType.value = letterType;
+				form.searchKeyword.value = searchKeyword;
+				
+				if(letterType == 'P'){
+					
+					//최 하단 그림문자 탭 리스트 내용 불러오기
+					fnPhotoListAjax(1);
+					
+					//문자 샘플 탭 활성화 시키기
+					TabType2($('.tabType2 li').eq(1), '2');
+					//하단 리스트 탭으로 이동 시키기
+					var offset = $('.tabType2').offset();
+				    $('html').animate({scrollTop : offset.top}, 400);
+					
+				}else if(letterType == 'L' || letterType == 'S' ){
+					
+					//문자 샘플 탭 활성화 시키기
+					TabType2($('.tabType2 li').eq(0), '1');
+					
+					//최 하단  문자 샘플 탭 리스트 내용 불러오기
+					fnLetterListAjax(1);
+					if(letterType == 'S'){
+						
+						$('.tDep1_letType a').eq(0).addClass('on');
+						$('.tDep1_letType a:last-child').removeClass('on');
+						
+					}else{
+						
+						$('.tDep1_letType a').eq(0).removeClass('on');
+						$('.tDep1_letType a:last-child').addClass('on');
+						
+					}
+										
+					//하단 리스트 탭으로 이동 시키기
+					var offset = $('.tabType2').offset();
+				    $('html').animate({scrollTop : offset.top}, 400);
+					
+				}
+				
+				
+			}
+			
+			
+			//메인화면 더많은 샘플보기 버튼 선택시 처리
+			var moreSamFlag = '${moreSampleYn}';
+			
+			if(moreSamFlag == 'Y'){
+			
+				//문자 샘플 탭 활성화 시키기
+				var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
+				var letterTab = '0';
+				var cateNo = "${cateCodeVO.cateNo}";
+				if(mainLetterTypeFlag == 'P'){
+					TabType2($('.tabType2 li').eq(1), '2');
+				}else{
+					TabType2($('.tabType2 li').eq(letterTab), '1');
+				}
+				//장문 일 시 tDep1_letType 탭 세팅
+				if(mainLetterTypeFlag == 'L'){
+					$('.tDep1_letType a').removeClass('on');
+					$('.tDep1_letType a').eq(1).addClass('on');
+				}
+					
+				//카테고리 탭 활성화 처리
+				if(mainLetterTypeFlag == 'P'){ //그림문자 샘플로 이동 왔을 시 
+					$('.tDep2_cateCode').find('.on').removeClass('on');
+					$('.tDep2_cateCode a').each(function(index){
+						if($(this).attr('value') == cateNo){
+							$(this).addClass('on');
+						}
+					})
+				}
+				if(mainLetterTypeFlag != 'P'){ //단문,장문 샘플로 왔을 시 
+					$('.tDep1_cateCode').find('.on').removeClass('on');	
+					$('.tDep1_cateCode a').each(function(index){
+						if($(this).attr('value') == cateNo){
+							$(this).addClass('on');
+						}
+					})
+				}
+
+				
+				//하단 리스트 탭으로 이동 시키기
+				var offset = $('.tabType2').offset();
+			    $('html').animate({scrollTop : offset.top}, 400);
+			    
+				
+			}
+			
+			
+			//메인화면 그림문자 이미지 선택시 처리
+			var mainImgFlag = '${mainImgVO.mainImgFlag}';
+			if(mainImgFlag == 'Y'){
+				//카테고리 처리
+				var cateNo = "${cateCodeVO.cateNo}";
+				$('.tDep2_cateCode').find('.on').removeClass('on');
+				$('.tDep2_cateCode a').each(function(index){
+					if($(this).attr('value') == cateNo){
+						$(this).addClass('on');
+					}
+				})				
+				
+				
+				var atchFileId = '${mainImgVO.atchFileId1}';
+				var fileSn = '${mainImgVO.fileSn}';
+				var strImgPath = '${mainImgVO.strImgPath}';
+				
+				fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
+				
+			}
+			
+			//메인화면 인기문자 메세지 선택시 처리
+			var mainLetterFlag = '${mainLetterVO.mainLetterFlag}';
+			if(mainLetterFlag == 'Y'){
+				var letterTab = '0';
+				//문자샘플 활성화 처리
+				TabType2($('.tabType2 li').eq(0), '1');
+				//단문,장문 탭 활성화 처리
+				var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
+				if(mainLetterTypeFlag == 'L'){
+					$('.tDep1_letType a').removeClass('on');
+					$('.tDep1_letType a').eq(1).addClass('on');
+				}
+				//카테고리 활성화 처리
+				var cateNo = "${cateCodeVO.cateNo}";
+				$('.tDep1_cateCode').find('.on').removeClass('on');	
+				$('.tDep1_cateCode a').each(function(index){
+					if($(this).attr('value') == cateNo){
+						$(this).addClass('on');
+					}
+				})
+				var smsTxt = '${mainLetterVO.smsTxt}';
+				if(smsTxt != null){
+					
+					smsTxt = smsTxt.replaceAll("<br/>", "\n");	//줄발꿈문자 변환하기
+					$("#smsTxtArea").val(smsTxt);
+					fnByteString(smsTxt);
+					
+				}
+				
+			}
+			
+			//맞춤제작 내보관함 이미지 선택시 처리
+			var customImgFlag = '${customImgVO.customImgFlag}';
+			if(customImgFlag == 'Y'){
+				
+				var atchFileId = '${customImgVO.atchFileId1}';
+				var fileSn = '${customImgVO.fileSn}';
+				var strImgPath = '${customImgVO.strImgPath}';
+				
+				fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
+				
+			}
+			
+			//문자 재전송 처리
+			var msgResendFlag = '${reSendMsgVO.msgResendFlag}';
+			var msgSeqList = [];
+			msgSeqList = '${reSendMsgVO.msgSeqList}';
+			if(msgSeqList.length > 0){
+					
+				fnMsgResend(msgResendFlag, msgSeqList);
+				
+			}
+			
+			//주소록에서 주소를 전송한 경우 처리
+			var moveAddrFlag = '${addrVO.moveAddrFlag}';
+			var addrIdList = [];
+			addrIdList = '${addrVO.addrIdList}';
+			if(addrIdList.length > 0) {
+				fnAddrSet(moveAddrFlag, addrIdList);
+			}
+			
+			// 문자 재전송 New
+			if (msgResendAllFlag == "Y") {
+				if (msgResendAllReplaceYn != "Y") {
+					// 문자 그룹정보 => 재전송용
+					getMjMsgGroupInfoByResend();
+				}
+
+				// 문자 상세정보 => 재전송용
+				getMjMsgListByResend();
+			}			
+			
+		});		
+		
+	}).slideDown();
+}
+
+function fnCustomImgSendMsg(atchFileId, fileSn, filePath){
+	
+	
+	var imgId = "";
+	var imgSrc = "";
+	
+	/* imgSrc = filePath.replace("/usr/local/tomcat_mjon/webapps/mjon",""); */
+	/* imgSrc = filePath; */
+	imgId = atchFileId;
+	
+	imgSrc = '/cmm/fms/getImage2.do?atchFileId=' + atchFileId + '&fileSn=' + fileSn;
+	
+	myMsgImageControl(imgSrc, "edit_n", "Template", imgId);
+	
+}
+
+function fnMsgResend(msgResendFlag, msgSeqList){
+	
+	if(msgResendFlag == 'Y'){ // 문자재전송에서 넘어오는 경우 
+		
+		var form = document.msgResendForm;
+		form.msgSeqList.value = msgSeqList;
+		
+		var data = new FormData(form);
+		url = "/web/mjon/msgdata/selectReSendMsgDataListAjax.do";
+		
+		$.ajax({
+	        type: "POST",
+	        url: url,
+	        data: data,
+	        dataType:'json',
+	        async: false,
+	        processData: false,
+	        contentType: false,
+	        cache: false,
+	        success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if("fail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if("loginFail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if(returnData.resultListCnt == '0'){
+						
+						alert("재전송 문자내용이 없습니다.");
+						return false;
+						
+					}else{
+						
+						var data = returnData;
+						var listCnt = returnData.resultListCnt;
+						var photoInfo = returnData.resultMsgPhotoInfo;
+						//수신자 처리 변수
+						var callToList = [];	//수신자 처리 리스트
+						var tableData = [];		//수신자 tabulator 처리 변수
+						
+						//var subject = data.resultList[0].subject;	//제목
+						//var smsTxt = data.resultList[0].smsTxt;		//문자내용
+						//var fileCnt = data.resultList[0].fileCnt;		//그림문자 이미지 갯수
+						//var filePath1 = data.resultList[0].fileType1;	//이미지1 파일 경로
+						//var filePath2 = data.resultList[0].fileType2;	//이미지2 파일 경로
+						//var filePath3 = data.resultList[0].fileType3;	//이미지3 파일 경로
+						//var atchFileId1 = photoInfo.atchFileId1;		//이미지1 파일 번호
+						//var atchFileId2 = photoInfo.atchFileId2;		//이미지2 파일 번호
+						//var atchFileId3 = photoInfo.atchFileId3;		//이미지3 파일 번호
+						
+						
+						for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
+							
+							callToList[i] = data.resultList[i].callTo;
+							tableData.push({phone: removeDash(callToList[i])});
+							
+						}
+						
+						if(tableData.length > 0){
+							
+							tableL.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기
+							
+							//totRows = tableL.getRows().length; 
+							//updateTotCnt(totRows); //전체 데이터 갯수 구하기
+							
+							//결제 금액 구하기
+						    //totalPriceSum(totRows); 
+							
+						}
+						
+						return false;
+						
+					}
+				
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        error: function (e) { alert("문자 재전송 번호 등록에 실패하였습니다."); console.log("ERROR : ", e); }
+	    });
+		
+	}
+	
+}
+
+
+function fnAddrSet(moveAddrFlag, addrIdList){
+	
+	if(moveAddrFlag == 'Y'){ // 주소록에서 넘어오는 경우 
+		
+		var form = document.moveAddrForm;
+		form.addrIdList.value = addrIdList;
+		
+		var data = new FormData(form);
+		url = "/web/mjon/addr/selectAddrDataListAjax.do";
+		
+		$.ajax({
+	        type: "POST",
+	        url: url,
+	        data: data,
+	        dataType:'json',
+	        async: true,
+	        processData: false,
+	        contentType: false,
+	        cache: false,
+	        success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if("fail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if("loginFail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if(returnData.resultListCnt == '0'){
+						
+						alert("전달된 주소록이 없습니다.");
+						return false;
+						
+					}else{
+						
+						var listCnt = returnData.resultListCnt;
+						
+						//수신자 처리 변수
+						var tableData = [];		//수신자 tabulator 처리 변수
+						
+						for(var i = 0; i < listCnt; i++){ // 수신자 리스트 Tabulator에 입력해 주기
+							
+							tableData.push({
+								name: returnData.resultList[i].addrNm
+								,phone: removeDash(returnData.resultList[i].addrPhoneNo)
+								,rep1: returnData.resultList[i].addrInfo1
+								,rep2: returnData.resultList[i].addrInfo2
+								,rep3: returnData.resultList[i].addrInfo3
+								,rep4: returnData.resultList[i].addrInfo4
+								});
+							
+						}
+						
+						tableL.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기
+						
+						totRows = tableL.getRows().length; 
+						updateTotCnt(totRows); //전체 데이터 갯수 구하기
+						
+						//결제 금액 구하기
+					    totalPriceSum(totRows);
+						
+						return false;
+						
+					}
+				
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        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');
+			}	      
+	    });
+		
+	}
+	
+}
+
+function fnLetterListAjax(index){
+	var form = document.letterForm;
+	var letterType = form.letterType.value;
+	
+	if($('.tDep1_letType a').eq(0).hasClass('on')) {
+		form.letterType.value='S';
+	} else if ($('.tDep1_letType a').eq(1).hasClass('on')) {
+		form.letterType.value='L';
+	}
+	
+	//검색자 입력 검색 시 카테고리, 해쉬태그 전체  초기화
+	if(form.searchKeyword.value != '') {
+		form.categoryCode.value = "";
+		form.hashTag.value = "";
+		
+		$('.tDep1_cateCode').find('.on').removeClass('on');
+		$('.tDep1_cateCode').find('.cateAll').addClass('on');
+		$('.tDep1_hashTag').find('.on').removeClass('on');
+		$('.tDep1_hashTag').find('.hashAll').addClass('on');
+	}else{
+		//해시태그가 선택되어 있을 경우 해당 태그 검색어를 전달해줌
+		var strTagTxt = $('.tDep1_hashTag').find('.on').text().replace("#","");
+		if(strTagTxt == "전체"){
+			form.hashTag.value = "";
+		}else{
+			form.hashTag.value = strTagTxt;
+		}
+	}
+	
+	form.pageIndex.value = index;
+	form.letterType.value = letterType;
+	var sendData = $(document.letterForm).serializeArray();
+	//하위 카테고리
+	$("#tDep1_depThrCateCode").load("/web/mjon/msgdata/selectCateConfThrDptListAjax.do", sendData ,function(response, status, xhr){
+		if(document.letterForm.searchKeyword.value == ''){
+			$('.bottom_content .area_total_count').hide();
+		}
+		if(form.hashTag.value != ''){
+			if($('#letterLoad .nodata_box').length > 0){
+				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
+			}
+		}
+		
+	});
+	//문자샘플
+	$("#letterLoad").load("/web/mjon/msgdata/selectLetterDataListAjax.do", sendData ,function(response, status, xhr){
+		if(document.letterForm.searchKeyword.value == ''){
+			$('.bottom_content .area_total_count').hide();
+		}
+		if(form.hashTag.value != ''){
+			if($('#letterLoad .nodata_box').length > 0){
+				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
+			}
+		}
+		
+	});
+	
+}
+
+function fnPhotoListAjax(index){
+	var form = document.letterForm;
+	//검색자 입력 검색 시 카테고리, 해쉬태그 전체  초기화
+	if(form.searchKeyword.value != '') {
+		form.categoryCode.value = "";
+		form.hashTag.value = "";
+		
+		$('.tDep2_cateCode').find('.on').removeClass('on');
+		$('.tDep2_cateCode').find('.cateAll').addClass('on');
+		$('.tDep2_hashTag').find('.on').removeClass('on');
+		$('.tDep2_hashTag').find('.hashAll').addClass('on');
+	}else{
+		//해시태그가 선택되어 있을 경우 해당 태그 검색어를 전달해줌
+		var strTagTxt = $('.tDep2_hashTag').find('.on').text().replace("#","");
+		if(strTagTxt == "전체"){
+			form.hashTag.value = "";
+		}else{
+			form.hashTag.value = strTagTxt;
+		}
+	}
+	form.letterType.value = 'P';
+	form.pageIndex.value = index;
+	var sendData = $(document.letterForm).serializeArray();
+	//하위 카테고리
+	$("#tDep2_depThrCateCode").load("/web/mjon/msgdata/selectCateConfThrDptListAjax.do", sendData ,function(response, status, xhr){
+		if(document.letterForm.searchKeyword.value == ''){
+			$('.bottom_content .area_total_count').hide();
+		}
+		if(form.hashTag.value != ''){
+			if($('#letterLoad .nodata_box').length > 0){
+				$('#letterLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
+			}
+		}
+		
+	});	
+	
+	$("#photoLoad").load("/web/mjon/msgdata/selectPhotoDataListAjax.do", sendData ,function(response, status, xhr){
+		photoLayerView();
+		if(document.letterForm.searchKeyword.value == ''){
+			$('.bottom_content .area_total_count').hide();
+		}
+		if(form.hashTag.value != ''){
+			if($('#photoLoad .nodata_box').length > 0){
+				$('#photoLoad .nodata_box').hide().next('.nodata_box.hashTag').show();
+			}
+		}
+	});
+	
+}
+
+function fnMyMsgListAjax(index){
+	
+	if(loginVO == "" || loginVO == null){
+		//alert("로그인 후 사용이 가능합니다.");
+		location.href="/web/user/login/login.do";
+		return false;
+	}else{
+		document.myMsgForm.pageIndex.value = index;
+		var sendData = $(document.myMsgForm).serializeArray();
+		$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
+			/* $(".msg_cont").mCustomScrollbar({
+				axis: 'y',
+				scrollbarPosition: "inside",
+				theme: "dark",
+				autoHideScrollbar: false
+			}); */
+			
+		});
+	}
+}
+
+function fnMyMsgSearchListAjax(index){
+	
+	document.myMsgForm.pageIndex.value = index;
+	var sendData = $(document.myMsgForm).serializeArray();
+	$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
+		
+		/* $(".msg_cont").mCustomScrollbar({
+			axis: 'y',
+			scrollbarPosition: "inside",
+			theme: "dark",
+			autoHideScrollbar: false
+		}); */
+		
+	});
+	
+}
+
+function fnMsgExcelDataView(){
+	
+	/* var sendData = $(document.searchForm).serializeArray() ;
+	
+	//엑셀 문자 탭 활성화 시키기
+	TabType1($('.tabType1 li').eq(1), '2');
+	
+	$(".contentExcelArea").load("/web/mjon/msgdata/selectMsgExcelDataViewAjax.do", sendData ,function(response, status, xhr){
+	}); */
+	
+	location.href="/web/mjon/msgdata/excel/selectMsgExcelDataView.do";
+	
+}
+
+function fnMsgDataView(){
+	
+	location.href="/web/mjon/msgdata/selectMsgDataView.do";
+	
+}
+
+
+function fn_saveMyMsg(){ // 내 문자 보관함 저장
+	
+	var form = document.msgForm;
+	var myImgFileId = [];			//신규 이미지 추가 파일 Id 저장 변수
+	var adverYn = $("input[name='send_adYn']:checked").val(); //광고 체크여부
+	
+	/*
+		이미지 에디터를 사용하여 추가한 경우 이미지 업로드 처리 - 단 에디터에서 템플릿을 선택한 경우는 업로드안함
+		신규 이미지 추가를 한 경우만 이미지 파일 업로드 처리함
+	*/
+	$('.thumb_wrap').find('.thumb_img').each(function(idx, el) {
+		
+		if($("#delLi"+idx).hasClass("Template")){ //이미지 에디터 템플릿 이미지 선택 여부 확인
+			templateYn.push("Y"); 
+		} else {
+			templateYn.push("N"); 
+		}
+		
+		if($(el).hasClass("edit_y")) { //에디터를 사용했고
+			//이미지 변환
+			const imgBase64 = $(el).attr("src");
+			const decodImg = atob(imgBase64.split(',')[1]);  // base64~ 부분을 제외하고 데이터 디코딩
+			
+	
+			let array = [];
+			for (let i = 0; i < decodImg.length; i++) {
+			  array.push(decodImg.charCodeAt(i));
+			}
+
+			const file = new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
+			const fileName = 'canvas_img_' + new Date().getMilliseconds() + '.jpg';
+			let formData = new FormData();
+			formData.append('file', file, fileName);
+			
+			$.ajax({
+				type: 'post',
+				url: '/web/mjon/msgdata/insertEditImageAjax.do',
+				cache: false,
+				data: formData,
+				dataType:'json',
+				processData: false,
+				contentType: false,
+				async: false,
+				success: function (returnData, status) {
+					if(status == 'success'){
+						// imgFilePath 에 배열로 담아주기(이미지 순서대로)
+						//console.log(imgFilePath);
+						//imgFilePath.push(returnData.filefullPath);
+						myImgFileId.push(returnData.atchFileId);
+						
+					} else if(status== 'fail'){
+						alert(returnData.message);
+					}
+				},
+				error: function (e) { alert("이미지 업로드에 실패하였습니다."); console.log("ERROR : ", e); }
+			});
+			
+		} else {
+			//에디터 안거친 템플릿 이미지면 바로 src 때림
+			imgFilePath.push($(el).attr("src"));
+		}	
+	});
+	
+	if(myImgFileId.length > 0 && imgFileId.length > 0){ //기존 샘플 이미지와 이미지 에디터 둘다 사용한 경우
+		
+		var tempImgId = [];
+		
+		tempImgId.push(myImgFileId);
+		tempImgId.push(imgFileId);
+		form.imgFileId.value = tempImgId; 
+		
+	}else if(myImgFileId.length > 0){	//이미지 에디터에서 신규 등록한 이미지 
+		
+		form.imgFileId.value = myImgFileId; 
+		
+	}else{	//샘플 이미지 선택만 했을경우(이미지 에디터 사용 안했을때)
+		
+		form.imgFileId.value = imgFileId; 
+	}
+	
+	//광고 문자 내용 합쳐주기
+	if(adverYn == 'Y'){
+		
+		var adTxt = $('.ad_txt').text();
+		var denyTxt = $('.deny_txt').text();
+		var smsTxt = form.smsTxtArea.value;
+		
+		//var adverTxt = adTxt + '\n\n' + smsTxt + '\n\n' + denyTxt;
+		var adverTxt = smsTxt;
+		form.smsTxt.value = adverTxt;
+		
+	}else{
+		
+		var smsTxt = form.smsTxtArea.value;
+		form.smsTxt.value = smsTxt;
+		
+	}
+	
+	//문자 종류 설정(S:단문 , L:장문 , P:그림)
+	var photoSts = $('.delLi').length;
+	var conLeng = conByteLeng(form.smsTxt.value); // 내용 문자 입력 바이트 수 계산하기
+	
+	if(photoSts > 0){
+		
+		form.msgType.value = 'P';
+		
+	}else if(conLeng > 90){
+	
+		form.msgType.value = 'L';
+		
+	}else{
+		
+		form.msgType.value = 'S';
+		
+	}
+	
+	if(photoSts == '0' && conLeng == '0'){
+		
+		alert("문자내용을 입력해 주세요.");
+		return false;
+		
+	}
+	
+	var data = new FormData(form);
+	url = "/web/mjon/msgdata/insertMyMsgDataAjax.do";
+	
+	$.ajax({
+        type: "POST",
+        url: url,
+        data: data,
+        dataType:'json',
+        async: false,
+        processData: false,
+        contentType: false,
+        cache: false,
+        success: function (returnData, status) {
+			if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+				if("fail"==returnData.result){
+					
+					alert(returnData.message);
+					return false;
+					
+				}else{
+					
+					alert("내 문자함에 저장되었습니다.");
+					
+					//내 문자함 탭 활성화 시키기
+					TabType2($('.tabType2 li').eq(3), '4');
+					var offset = $('.tabType2').offset();
+				    $('html, body').animate({scrollTop : offset.top-140}, 400);
+					
+					//최 하단 내문자함 탭 리스트 내용 불러오기
+					var sendData = $(document.myMsgForm).serializeArray();
+					$("#myMsgLoad").load("/web/mjon/msgdata/selectMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
+					});
+					
+				}
+			
+			} else if(status== 'fail'){
+				alert(returnData.message);
+			}
+		},
+        error: function (e) { alert("문자 저장에 실패하였습니다."); console.log("ERROR : ", e); }
+    });
+	
+}
+
+//내 문자함으로 탭이동
+function fnGoMyMsg(){
+	
+	//내 문자함 탭 활성화 시키기
+	TabType2($('.tabType2 li').eq(3), '4');
+	
+	var offset = $('.tabType2').offset();
+    $('html, body').animate({scrollTop : offset.top-140}, 400);
+	
+}
+
+
+// MJ_MSG_GROUP_DATA 누락데이터 체크
+function getMsgGroupDataErrorCheck() {
+	var isError = false;
+	
+	$.ajax({
+	    type: "POST",
+	    url: "/web/mjon/msgdata/selectMsgGroupNotExistInfoAjax.do",
+	    data: {},
+	    dataType:'json',
+	    async: false,
+	    success: function (data) {
+			if (data.isSuccess) { 
+				if (data.isError == true) {
+					isError = true;
+				}
+			} 
+		},
+	    error: function (e) {
+	    	
+	    }
+	});	
+
+	return isError;
+}
+
+function checkConf() {
+	var confCheck = false;
+	
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/conf/selectMjonMsgUseConfAjax.do",
+		data: {},
+		dataType:'json',
+		async: false,
+		success: function (returnData, status) {
+			if(returnData.result == "fail") {
+				console.log(returnData.message);
+			}else if(returnData.result == "success"){
+				confCheck = true;
+			}
+		}
+		,error: function (e) {console.log("ERROR : ", e); }
+	});	
+	
+	return confCheck;
+}
+function blineSendCheck(blineCode) {
+	
+	var confCheck = false;
+	
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/conf/selectBlineSendCheckAjax.do",
+		data: {"agentCode":blineCode},
+		dataType:'json',
+		async: false,
+		success: function (returnData, status) {
+			if(returnData.result == "fail") {
+				console.log(returnData.message);
+			}else if(returnData.result == "success"){
+				confCheck = true;
+			}
+		}
+		,error: function (e) {console.log("ERROR : ", e); }
+	});	
+	
+	return confCheck;
+}
+
+
+
+
+//문자발송 처리 함수
+function fn_sendMsgData(){
+
+    // 타블레이터 호출
+    var $selectedData = tableL.getData(); // 데이터 가져오기
+    
+	if(!checkConf()){	//문자온 conf-check
+		alert("현재 문자 발송하기 기능 점검 중입니다.\n\n1분 후 다시 시도해주세요.");
+		return false;
+	}
+
+	var form = document.msgForm;
+	var totPriceOnly = stringReplaceAll(form.totPrice.value, ",", "");
+	var userMoneyOnly = stringReplaceAll(form.myPrice.value, ",", "");
+
+	// test 주석
+	if(parseFloat(userMoneyOnly) < parseFloat(totPriceOnly)){
+		alert("문자 발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
+		return false;
+	} 
+
+	// 폼 유효성 검사
+	if (!validateForm(form)) return false;
+	
+	var spamStatus = false;
+	var exceptSpamYn = $("#exceptSpamYn").val(); //금지어 필터링 예외 여부 - N 일 경우만 스팸 검사를 진행
+	
+	
+	var blineCodeYn = $("#blineCode").val();
+	if(blineCodeYn != 'N'){
+		if(!blineSendCheck(blineCodeYn)){	//문자온 conf-check
+			alert("현재 문자 발송하기 기능 점검 중입니다.\n\n잠시 후 다시 시도해주세요.");
+			return false;
+		}
+	}
+	
+	if($selectedData.length > 300000){
+		alert("30만건까지 발송이 가능합니다.\n받는사람 목록을 확인해주세요.");
+		return false;
+	}
+	
+
+	
+	if(!confirm("문자를 전송하시겠습니까?")){
+		return false;
+	}
+
+	//총 결제금액 천단위 콤마 삭제 후 전송
+	var totPrice = form.totPrice.value;
+	form.totPrice.value = totPrice.replace(",","");
+	
+	
+	//이벤트 진행중 회원의 경우 이벤트 잔여금액 비교 처리 필요.
+	//이벤트 캐시가 부족한 경우 이벤트 캐시로 발송 가능한 만큼만 이벤트 금액으로 발송 처리해줌.
+	//이 후 나머지 발송 건수는 이벤트 캐시가 아닌 일반 단가로 발송 처리를 진행 함.
+	var eventStatus = form.eventStatus.value;
+	
+	if(eventStatus == 'Y'){ //이벤트 진행 대상자이면 문자종류에 이벤트로 구분
+		
+		form.eventYn.value = "Y"; //이벤트문자 종류 설정
+		
+	}
+	
+	var eventRemainCash = parseFloat(form.eventRemainCash.value);
+	console.log('eventStatus : ', eventStatus);
+	
+	if(eventStatus == 'Y' 
+				&& parseFloat(eventRemainCash) < parseFloat(totPriceOnly))
+	{
+		console.log('eventRemainCash : ', eventRemainCash);
+		if(!confirm("고객님의 이벤트 캐시 잔액(" + eventRemainCash + "원) 부족으로 요청하신 문자("+numberWithCommas($selectedData.length)+"건)를 모두 발송할 수 없습니다. 이벤트 캐시 초과 건에 대해서는 일반 단가를 적용하여 발송하시겠습니까?")){
+			return false;
+		}
+	}
+
+	console.log(' !!! imgFilePath : ', imgFilePath);
+		
+	// img 처리 영역
+	imgFilePath = [];
+	$('.thumb_wrap').find('.thumb_img').each(function(idx, el) {
+		if($("#delLi"+idx).hasClass("Template")){
+			templateYn.push("Y");
+		} else {
+			templateYn.push("N");
+		}
+		
+		if($(el).hasClass("edit_y")) {
+			//이미지 변환
+			const imgBase64 = $(el).attr("src");
+			const decodImg = atob(imgBase64.split(',')[1]);  // base64~ 부분을 제외하고 데이터 디코딩
+			
+	
+			let array = [];
+			for (let i = 0; i < decodImg.length; i++) {
+			  array.push(decodImg.charCodeAt(i));
+			}
+
+			const file = new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
+			const fileName = 'canvas_img_' + new Date().getMilliseconds() + '.jpg';
+			let formData = new FormData();
+			formData.append('file', file, fileName);
+
+			$.ajax({
+				type: 'post',
+				url: '/web/mjon/msgdata/insertEditImageAjax.do',
+				cache: false,
+				data: formData,
+				dataType:'json',
+				processData: false,
+				contentType: false,
+				async: false,
+				success: function (returnData, status) {
+					if(status == 'success'){
+						console.log('returnData : ',returnData)
+						// imgFilePath 에 배열로 담아주기(이미지 순서대로)
+						//console.log(imgFilePath);
+						imgFilePath.push(returnData.filefullPath);
+						imgFileId.push(returnData.atchFileId);
+						
+					} else if(status== 'fail'){
+						alert(returnData.message);
+					}
+				},
+				error: function (e) { alert("이미지 업로드에 실패하였습니다."); console.log("ERROR : ", e); }
+			});
+
+		} else {
+			if(imgFilePath.length != imgFileId.length){
+				//에디터 안거친 템플릿 이미지면 바로 src 때림
+				imgFilePath.push($(el).attr("src"));
+			}
+		}	
+	});
+		
+
+	//form.reserveYn.value = reserYn; // 즉시 / 예약 문자 선택 여부 
+	form.templateYnAdvc.value = templateYn;
+	console.log('imgFilePath : ', imgFilePath);
+	console.log('imgFilePath : ', JSON.stringify(imgFilePath));
+	console.log('imgFileId : ', imgFileId);
+	console.log('imgFileId : ', JSON.stringify(imgFileId));
+	form.imgFilePathAdvc.value = imgFilePath;
+	form.imgFileIdAdvc.value =  imgFileId;
+// 	form.imgFilePath.value = JSON.stringify(imgFilePath).replace(/\\/g, '');
+// 	form.imgFileId.value =  JSON.stringify(imgFileId).replace(/\\/g, '');
+	form.callFrom.value = removeDash($('#callFromList').val()); // 발신번호 대쉬(-) 문자 없애주기
+
+	//광고 종류 설정
+	var adverYn = $("input[name='send_adYn']:checked").val();
+	if(adverYn == 'Y'){
+		form.msgKind.value = "A"; //광고문자 종류 설정
+	}else{
+		form.msgKind.value = "N"; //일반문자 종류 설정
+	}
+	
+	// 예약 확인
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	form.reserveYn.value = reserYn; // 즉시 / 예약 문자 선택 여부 
+	
+	if(reserYn == 'Y'){
+		
+		var date = $(".resDate").val();//form.msgResDate.value;
+		var hour = form.msgResHour.value;
+		var min = form.msgResMin.value;
+		
+		if(date == ""){
+			
+			alert("예약전송 날짜를 선택해 주세요.");
+			return false;
+			
+		}else{
+			
+			var now = new Date();
+			var reqDate = date + " " + hour + ":" + min + ":00";
+			var gapDate = getGapDayTime(date, hour, min);
+			
+			if(gapDate < 0){ // 음수이면 이전날짜, 크면 이후 날짜.
+				alert("예약 날짜는 현재 시간 이후의 날짜 및 시간을 선택해 주세요.");
+				return false;
+			}else{
+				form.reqDate.value = reqDate;	//예약일자 파라미터 저장
+			}
+		}
+
+	}else{
+		
+		form.reqDate.value = "";
+		
+	}
+	
+	
+
+	//발송 Ajax 호출해주기
+	sendMsgAjax_advc();
+}
+
+
+// 선택된 데이터의 길이에 따라 예상 시간 계산 함수
+function calculateEstimatedTime(selectedCount) {
+	//기준값
+	// const processTimePerBatch = 130; // 130초
+	
+	
+	// 30만건 기준 10분으로 기준을 잡아서 
+	// 시간계산함
+	const processTimePerBatch = 600;
+	const batchSize = 300000;
+	
+	// 1건당 처리 시간
+	const timePerRecord = processTimePerBatch / batchSize;
+
+	// 예상 시간 계산
+	const estimatedTimeInSeconds = selectedCount * timePerRecord;
+
+	return estimatedTimeInSeconds.toFixed(2);
+}
+
+
+
+
+function sendMsgAjax_advc(){
+    // 타블레이터 호출
+    var $selectedData = tableL.getData(); // 데이터 가져오기
+
+	 // 폼 데이터를 배열로 직렬화
+	 var form = $('#msgForm');
+	 var formDataArray = form.serializeArray();
+	
+	 // 배열을 객체로 변환
+	 var formData = {};
+	 $.each(formDataArray, function(index, field) {
+	     formData[field.name] = field.value;
+	 });
+	
+	 // 빈 값 제거
+	 removeEmptyValues(formData);
+
+	// 선택된 데이터 추가
+	formData["mjonMsgSendVOList"] = $selectedData;
+	
+	// JSON 데이터 확인
+// 	console.log("최종 formData:", JSON.stringify(formData));
+	
+	
+	var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do";
+	 // 시작 시간
+	const startTime = new Date();
+	 
+	
+	 // 프로그래스파 시간을 위한 계산
+	var estimtedTime = calculateEstimatedTime($selectedData.length);
+	console.log('estimtedTime  : ', estimtedTime);
+	
+	 
+	$.ajax({
+		type: "POST",
+		url: url,
+		data: JSON.stringify(formData),
+		contentType: 'application/json',
+		dataType: 'json',
+		success: function (data) {
+			
+			// 요청 종료 시간 및 경과 시간 계산
+			const endTime = new Date();
+			const elapsed = (endTime - startTime) / 1000; // 밀리초 -> 초로 변환
+			console.log('AJAX 요청 성공, 경과 시간 : ', elapsed);
+			if (elapsed >= 60) {
+				const minutes = Math.floor(elapsed / 60); // 분 계산
+				const seconds = Math.floor(elapsed % 60); // 초 계산
+				console.log('AJAX 요청 성공, 경과 시간 : ' + minutes + '분 ' + seconds + '초');
+			} else {
+				console.log('AJAX 요청 성공, 경과 시간 : ' + elapsed + '초');
+			}
+			
+			
+			
+			console.log('data : ', data);
+			/*  message:"특정문구 일괄변환 치환문자 데이터가 없습니다."
+				status:"BAD_REQUEST" */
+			
+			var status = data.status;
+			if("OK" == status){
+				
+				var smsCnt = Number(data.object.resultSts);
+				var blockCnt = Number(data.object.resultBlockSts);
+				
+				if((smsCnt + blockCnt) == 0){
+					
+					$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					$('.pop_msg_spam .msg_text').html("문자 발송(예약)에 실패하였습니다.<br/> 다시 시도해주세요. <br/>* 정상적으로 발송 시도하였으나 실패하신 경우 혹시 문자내용에 사용불가 이모지 <br/>또는 복사-붙여넣기로 인한 보이지 않는 특수문자가 포함되었는지 확인 후 다시 시도해주세요.");
+					$('.mask').addClass('on');
+					
+				}else{
+					
+					$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					//예약발송 건의 경우 결과 팝업 문구 변경
+					
+					var reserYn = $("input[name=reserYn]:checked").val(); 
+					var resText = (reserYn === 'Y') ? '예약' : '발송';
+					/* 
+					if(reserYn == 'Y')
+					{
+						resText = "예약";
+					}
+					else
+					{
+						resText = "발송";
+					} 
+					*/
+					$('.pop_msg_success .msg_text').html(resText+" 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 "+resText+" 되었습니다.");
+					
+					$('.mask').addClass('on');
+					
+				}
+				
+				
+			}else if("BAD_REQUEST" == status){
+
+				alert(data.message);
+				return false;
+					
+			}else if("UNAUTHORIZED" == status){
+				
+				alert(data.message);
+				//문자발송 URL Move
+				goMsgUrlMove();
+				return false;
+				
+			}else if("NO_CONTENT" == status){
+				
+				$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+				$('.pop_msg_fails .msg_text').html(returnData.message);
+				$('.mask').addClass('on');
+				
+			}
+				
+		},
+		beforeSend : function(xmlHttpRequest) {
+			// 프로그래스 바 실행
+			// 프로그래스 바 실행
+			progressStart(estimtedTime);
+			//로딩창 show
+// 			$('.loading_layer').addClass('active');
+		},
+		complete : function(xhr, textStatus) {
+
+			// 프로그래스 바 종료
+			// 프로그래스 바 종료
+			progressComplete();;
+// 			로딩창 hide
+// 			$('.loading_layer').removeClass('active');
+		},
+		error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+	
+}
+
+//폼 유효성 검사 함수
+function validateForm(form) {
+
+    // 타블레이터 호출
+    var $selectedData = tableL.getData(); // 데이터 가져오기
+    
+    if($selectedData.length < 1){
+		alert("받는사람 내역을 입력해주세요.");
+		return false;
+    }
+	
+	
+	if(form.callFromList.value == ""){
+		
+		alert("발신번호를 입력해 주세요.");
+		return false;
+		
+	}
+
+	if (form.title_status.value === 'N') {
+		form.mmsSubject.value = "";
+	} else if (getSpacialStringChk(form.mmsSubject.value)) {
+		alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다.");
+		return false;
+	}
+
+	//문자제목에 이모지가 있는지 체크
+	var titleStatusYn = $("input[name='title_status']:checked").val();
+	if(titleStatusYn == 'Y') {
+		if(!emojiCheck(form.mmsSubject.value)) return false;
+	}
+
+	// 문자내용에 이모지가 있는지 체크 
+	var strCont = form.smsTxtArea.value;
+	if (!emojiCheck(strCont)) return false;
+	
+	var rtnStr = strChinJpnCheck(strCont);
+	if(rtnStr.length > 0){
+		alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다.");
+	}
+	
+	if (imgFilePath.length === 0 && !form.smsTxtArea.value) {
+		alert("문자내용을 입력해 주세요.");
+		return false;
+	}
+	return true;
+}
+
+//이벤트가 아닌 일반 개별 단가 셋팅해주기
+function getNorEachPrice(evnMsgType){
+	
+	var norEachPrice = 0;
+	var evnImgCnt = $("#imgCnt").val();
+	
+	//일반 단가로 변경해주기
+	if(evnMsgType == '4'){
+		
+		norEachPrice = $("#norsPrice").val();
+		console.log("norEachPrice Short::: "+norEachPrice);
+		
+	}else if(evnMsgType == '6'){
+		
+		if(evnImgCnt == 0){//장문 가격
+			
+			norEachPrice = $("#normPrice").val();
+			console.log("norEachPrice Long ::: "+norEachPrice);
+			
+		}else if(evnImgCnt == 1){
+			
+			norEachPrice = $("#norpPrice").val();
+			console.log("norEachPrice p1 ::: "+norEachPrice);
+			
+		}else if(evnImgCnt == 2){
+			
+			norEachPrice = $("#norp2Price").val();
+			console.log("norEachPrice p2 ::: "+norEachPrice);
+			
+		}else if(evnImgCnt == 3){
+			
+			norEachPrice = $("#norp3Price").val();
+			console.log("norEachPrice p3 ::: "+norEachPrice);
+			
+		}
+		
+	}
+	
+	return norEachPrice;
+}
+
+//빈 값이나 null 값을 제거하는 함수
+function removeEmptyValues(obj) {
+    Object.keys(obj).forEach(function(key) {
+        if (obj[key] === null || obj[key] === '') {
+            delete obj[key];
+        }
+    });
+}
+
+
+function sendMsgAjax(paramSmsCnt, paramBlockCnt){
+	var form = document.msgForm;
+	var reserYn = $("#reserveYn").val();
+	
+	var data = new FormData(form);
+ 	url = "/web/mjon/msgdata/sendMsgDataAjax.do";
+	
+	$.ajax({
+        type: "POST",
+        url: url,
+        data: data,
+        dataType:'json',
+        async: true,
+        processData: false,
+        contentType: false,
+        cache: false,
+        success: function (returnData, status) {
+			if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+				if("fail" == returnData.result){
+					
+					alert(returnData.message);
+					return false;
+					
+				}else if("loginFail" == returnData.result){
+					
+					alert(returnData.message);
+					return false;
+						
+				}else if("smsLengFail" == returnData.result){
+					
+					alert(returnData.message);
+					return false;
+						
+				}else if("imgSourceFail" == returnData.result){
+					
+					$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					$('.pop_msg_fails .msg_text').html(returnData.message);
+					$('.mask').addClass('on');
+					
+				}else if("spamKeyWordFail" == returnData.result){//스팸 및 스미싱 단어가 들어간 문자 발송시 회원 이용정지 처리
+					
+					$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					$('.pop_msg_spam .msg_text').html(returnData.message);
+					$('.mask').addClass('on');
+					
+				}else if("statusFail" == returnData.result){
+					
+					alert(returnData.message);
+					//문자발송 URL Move
+					goMsgUrlMove();
+					return false;
+					
+				}else{
+					
+					var smsCnt = Number(returnData.resultSts);
+					var blockCnt = Number(returnData.resultBlockSts);
+					
+					smsCnt = Number(smsCnt) + Number(paramSmsCnt);
+					blockCnt = Number(blockCnt) + Number(paramBlockCnt);
+					
+					if((smsCnt + blockCnt) == 0){
+						
+						$('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+						$('.pop_msg_spam .msg_text').html("문자 발송(예약)에 실패하였습니다.<br/> 다시 시도해주세요. <br/>* 정상적으로 발송 시도하였으나 실패하신 경우 혹시 문자내용에 사용불가 이모지 <br/>또는 복사-붙여넣기로 인한 보이지 않는 특수문자가 포함되었는지 확인 후 다시 시도해주세요.");
+						$('.mask').addClass('on');
+						
+					}else{
+						
+						$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+						//예약발송 건의 경우 결과 팝업 문구 변경
+						if(reserYn == 'Y'){
+							$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 예약 되었습니다.");
+						}else{
+							$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ smsCnt + "</strong>건,수신거부 : <span>" + blockCnt + "</span>건의<br>문자가 발송 되었습니다.");
+						}
+						
+						$('.mask').addClass('on');
+						
+					}
+					
+				}
+				
+			} else if(status== 'fail'){
+				alert(returnData.message);
+			}
+		},
+		beforeSend : function(xmlHttpRequest) {
+        	//로딩창 show
+        	$('.loading_layer').addClass('active');				
+		},	        	        
+        complete : function(xhr, textStatus) {
+        	//로딩창 hide
+        	$('.loading_layer').removeClass('active');
+		},	      			
+        error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); }
+    });
+	
+}
+
+function linkPage(pageNo){
+	fnLetterListAjax(pageNo);
+}
+
+
+function linkPhoPage(pageNo){
+	fnPhotoListAjax(pageNo);
+}
+
+function myMsgPage(pageNo){
+	fnMyMsgListAjax(pageNo);
+}
+
+function fnMyMsgCheckDelete(){
+	
+	var msgId = [];
+	if($("input:checkbox[name='myMsgDel']").is(":checked")==false){
+		alert("선택된 항목이 없습니다.");
+		return;
+	}
+	
+	$("input:checkbox[name='myMsgDel']:checked").each(function(index){
+		
+		msgId[index] = $(this).val();
+		
+	});
+	
+	if(msgId.length > 0){
+		
+		document.myMsgForm.msgIdList.value = msgId;
+		var sendData =  $(document.myMsgForm).serializeArray();
+		
+		$("#myMsgLoad").load("/web/mjon/msgdata/deleteMyMsgDataListAjax.do", sendData ,function(response, status, xhr){
+			
+			//문자 내용 스크롤 적용
+			/* $(".msg_cont").mCustomScrollbar({
+				axis: 'y',
+				scrollbarPosition: "inside",
+				theme: "dark",
+				autoHideScrollbar: false
+			}); */
+			
+		});
+		
+	}else{
+		
+		alert("삭제할 문자를 선택해 주세요.");
+		return false;
+		
+	}
+	
+}
+
+//문자 샘플 2줄, 4줄 보기 기능 
+function fnLPageUnit(){
+	
+	var form = document.letterForm;
+	var pageUnit = form.LPageUnit.value;
+	
+	form.pageUnit.value = pageUnit;
+	fnLetterListAjax(1);
+	
+}
+
+//그림문자 샘플 2줄, 4줄 보기 기능 
+function fnPhPageUnit(){
+	
+	var form = document.letterForm;
+	var pageUnit = form.PhPageUnit.value;
+	
+	form.pageUnit.value = pageUnit;
+	fnPhotoListAjax(1);
+	
+}
+
+//내문자함 2줄 4줄보기 기능
+function fnMsgPageUnit(){
+	
+	var form = document.myMsgForm;
+	var pageUnit = form.msgPageUnit.value;
+	
+	form.pageUnit.value = pageUnit;
+	fnMyMsgListAjax(1);
+	
+}
+
+function fnMyMsgSearchListOrd(){
+	
+	var form = document.myMsgForm;
+	var sortOrd = form.searchSortOrd.value;
+	
+	if(sortOrd == 'desc'){
+		
+		form.searchSortOrd.value = 'asc';
+		$('#sortCnd').text('등록순');
+		
+	}else{
+		
+		form.searchSortOrd.value = 'desc';
+		$('#sortCnd').text('최근순');
+		
+	}
+	
+	//내문자함 내용 검색하기
+	fnMyMsgSearchListAjax(1);
+	
+}
+
+function msgSuccessClose(obj){
+	$(obj).closest('.pop_msg_success').attr('style','');
+	//문자발송 URL Move
+	goMsgUrlMove();
+	$('html').scrollTop(0);
+}
+
+function msgFailsClose(obj){
+	$(obj).closest('.pop_msg_fails').attr('style','');
+}
+
+function msgSpamClose(obj){
+	$(obj).closest('.pop_msg_spam').attr('style','');
+	//location.href="/web/uat/uia/actionLogout.do";
+}
+
+function msgResultLink(){
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	if(reserYn == 'Y'){
+		
+		location.href="/web/mjon/reservmsg/selectReservMsgView.do";
+		
+	}else{
+		
+		location.href="/web/mjon/msgsent/selectMsgSentView.do";
+		
+	}
+	
+}
+
+//START
+//맞춤제작 요청 JSPark => 2023.02.21 추가
+//맞춤제작 등록 Popup 
+function customPopup(){
+	$("#customPopup").load("/web/mjon/custom/selectMsgCustomPopupAjax.do", "" ,function(response, status, xhr){
+		popupImgList(1);
+	});
+}
+
+function openMsgCustomPopup() {
+	if(loginVO == "" || loginVO == null){
+		alert("로그인 후 이용이 가능합니다.");
+		return false;
+	} else {
+		$("#customPopupOpen").trigger("click");
+	}
+	$("#customType04").hide();
+	popCustomScrT=$(window).scrollTop();
+	popScrTarget();
+}
+
+$(window).on('load',function(){
+	setTimeout(function(){
+		popScrTarget();
+	},500);
+});
+
+function popScrTarget(){
+	var closeTarget=$('.custom_layer .tooltip-close');
+	closeTarget.attr('onclick','popScrCloseSetting();');
+}
+
+function popScrCloseSetting(){
+	setTimeout(function(){
+		$(window).scrollTop(popCustomScrT);	
+	},1);
+}
+//END(No newline at end of file)
src/main/webapp/publish/js/content.js
--- src/main/webapp/publish/js/content.js
+++ src/main/webapp/publish/js/content.js
@@ -610,6 +610,16 @@
 	},250);
 }
 
+// 문자보내기 tab 버튼 - send_top
+function TabType1_advc(obj) {
+	var $tab = $(obj).closest("li");
+	$tab.addClass("active");
+	$tab.find("button").attr("title", "선택됨");
+	$tab.siblings("li.tab").removeClass("active");
+	$tab.siblings("li.tab").find("button").removeAttr("title");
+
+
+}
 
 // 문자보내기 tab 버튼 - send_top
 function TabType1(obj, tabId) {
Add a comment
List