PageSourceSearch

https://sdeaf.or.kr/ISAF/js/frmCheck.js?v=0.1127

js sdeaf.or.kr collected 2026-10-08 13:00:05 UTC 40,181 bytes, 1,384 lines download raw bytes

1/********************************************************************
2*
3* Form 관련 스크립트 함수 모음
4*
5*******************************************************************/
6class InputFormatter {
7  static replaceText(selector, type) {
8    const regexPatterns = {
9      typeID      : /[^a-zA-Z0-9\_]/gi,
10      typeNum     : /[^0-9]/gi,
11      typeDouble  : /[^0-9\.]/gi,
12      typeNum1    : /[^0-9\-\+]/gi,
13      typeMoney   : /[^0-9:\,]/gi,
14      typeDate    : /[^0-9:\-]/gi,
15      typeNKor    : /[^\!-z]/gi,
16      typeEng     : /[^a-z]/gi,
17      typeKor     : /[a-z0-9]/gi,
18      typeNSpec   : /[^(가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9\\s\\.\\?\\!\\-\\,|\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55)]/gi,
19    };
20    $(document).on("keyup keydown focus blur", selector, function () {
21      const regexPattern = regexPatterns[type];
22      $(this).val($(this).val().replace(regexPattern, ""));
23    });
24  }
25}
26InputFormatter.replaceText("input:text[typeID]"   , "typeID");
27InputFormatter.replaceText("input:text[typeNum]"  , "typeNum");
28InputFormatter.replaceText("input:text[typeDouble]"  , "typeDouble");
29InputFormatter.replaceText("input:text[typeNum1]" , "typeNum1");
30InputFormatter.replaceText("input:text[typeMoney]", "typeMoney");
31InputFormatter.replaceText("input:text[typeDate]" , "typeDate");
32InputFormatter.replaceText("input:text[typeNKor]" , "typeNKor");
33InputFormatter.replaceText("input:text[typeEng]"  , "typeEng");
34InputFormatter.replaceText("input:text[typeKor]"  , "typeKor");
35InputFormatter.replaceText("input:text[typeNSpec]", "typeNSpec");
36
37/* 폼 검증  함수
38**************************************************************************************************************/
39function checkForm(f){
40	var fLen = f.elements.length;
41	var fObj; // 폼 요소
42	var fTyp; // 폼 요소 Type
43	var fVal; // 폼 요소 Value
44	var fMsg; // 경고 메시지 속성
45	var fNum; // 숫자만 입력 속성
46	var fMax; // 최대 길이 지정
47	var fMin; // 최소 길이 지정
48	var fMxN; // 최대값 지정
49	var fMnN; // 최소값 지정
50	var fMal; // 메일 FORMAT
51	for(i=0;i<fLen;i++){
52		fObj = f.elements[i];
53		fTyp = toUpperCase(fObj.type);
54		fVal = fObj.value;
55		fMsg = fObj.getAttribute("msg"); // 경고 메시지
56		fNum = fObj.getAttribute("chknum"); // 숫자만 기입 가능하도록
57		fMax = fObj.getAttribute("maxlen"); // 최대 입력byte 제한
58		fMin = fObj.getAttribute("minlen"); // 최소 입력byte 제한
59		fMxN = fObj.getAttribute("maxnum"); // 최대 숫자 제한
60		fMnN = fObj.getAttribute("minnum"); // 최소 숫자 제한
61		fRrn = fObj.getAttribute("chkrrn"); // 주민등록번호 체크
62		fBrn = fObj.getAttribute("chkbrn"); // 사업자등록번호 체크
63		fFrn = fObj.getAttribute("chkfrn"); // 외국인등록번호 체크
64		fMal = fObj.getAttribute("chkmail"); // 이메일 체크
65
66		if(fMsg != null && (fTyp == "TEXT" || fTyp == "HIDDEN" || fTyp == "TEXTAREA" || fTyp == "PASSWORD") && fVal.replace(/ /gi,"") == ""){
67			alert(fMsg + " 입력해 주세요");
68			if(fTyp != "HIDDEN"){fObj.focus();}
69			return false;
70		}
71		if(fMsg != null && (fTyp == "SELECT-ONE" || fTyp == "SELECT-MULTIPLE") && fVal ==""){
72			alert(fMsg + " 선택해 주세요");
73			fObj.focus(); return false;
74		}
75		if(fMsg != null && (fTyp == "RADIO" || fTyp == "CHECKBOX") && checkChecked(fObj) == false){
76			alert(fMsg + " 선택해 주세요");
77			fObj.focus(); return false;
78		}
79		if(fNum != null && isNaN(fVal)){
80			alert("숫자로만 입력해 주세요");
81			fObj.focus(); return false;
82		}
83		if(fMin != null && fMin > getLen(fVal)){
84			alert("입력된 글자의 byte가 "+fMin+"byte보다 커야합니다.");
85			fObj.focus(); return false;
86		}
87		if(fMax != null && fMax < getLen(fVal)){
88			alert("입력된 글자의 byte가 "+fMax+"byte보다 작아야합니다.\n(영문 "+fMax+"자, 한글 "+Math.floor(fMax/2)+"자 까지 가능합니다.)");
89			fObj.focus(); return false;
90		}
91		if(fMxN != null && parseInt(fMxN) < parseInt(fVal)){
92			alert("입력된 숫자는 "+fMxN+"보다 작아야합니다.");
93			fObj.focus(); return false;
94		}
95		if(fMnN != null && parseInt(fMnN) > parseInt(fVal)){
96			alert("입력된 숫자는 "+fMnN+"보다 커야합니다.");
97			fObj.focus(); return false;
98		}
99		if(fRrn != null && checkRRN(fVal) == false && fVal != ""){
100			alert("주민등록번호가 올바르지 않습니다");
101			fObj.focus(); return false;
102		}
103		if(fBrn != null && checkBRN(fVal) == false && fVal != ""){
104			alert("사업자등록번호가 올바르지 않습니다");
105			fObj.focus(); return false;
106		}
107		if(fFrn != null && checkFRN(fVal) == false && fVal != ""){
108			alert("외국인등록번호가 올바르지 않습니다");
109			fObj.focus(); return false;
110		}
111		if(fMal != null && checkEmail(fVal) == false && fVal != ""){
112			alert("이메일 주소가 올바르지 않습니다");
113			fObj.focus(); return false;
114		}
115	}
116	return true;
117}
118
119function checkForm_new(f){
120	var fLen = f.elements.length;
121	var fObj; // 폼 요소
122	var fTyp; // 폼 요소 Type
123	var fVal; // 폼 요소 Value
124	var fMsg; // 경고 메시지 속성
125	var fNum; // 숫자만 입력 속성
126	var fMax; // 최대 길이 지정
127	var fMin; // 최소 길이 지정
128	var fMxN; // 최대값 지정
129	var fMnN; // 최소값 지정
130	var fMal; // 메일 FORMAT
131
132	for(i=0;i<fLen;i++){
133		fObj = f.elements[i];
134		fTyp = toUpperCase(fObj.type);
135		fVal = fObj.value;
136		fMsg = fObj.getAttribute("msg"); // 경고 메시지
137		fNum = fObj.getAttribute("chknum"); // 숫자만 기입 가능하도록
138		fMax = fObj.getAttribute("maxlen"); // 최대 입력byte 제한
139		fMin = fObj.getAttribute("minlen"); // 최소 입력byte 제한
140		fMxN = fObj.getAttribute("maxnum"); // 최대 숫자 제한
141		fMnN = fObj.getAttribute("minnum"); // 최소 숫자 제한
142		fRrn = fObj.getAttribute("chkrrn"); // 주민등록번호 체크
143		fBrn = fObj.getAttribute("chkbrn"); // 사업자등록번호 체크
144		fFrn = fObj.getAttribute("chkfrn"); // 외국인등록번호 체크
145		fMal = fObj.getAttribute("chkmail"); // 이메일 체크
146
147		if(fMsg != null && (fTyp == "TEXT" || fTyp == "HIDDEN" || fTyp == "TEXTAREA" || fTyp == "PASSWORD") && fVal.replace(/ /gi,"") == ""){
148			alert(fMsg + " 입력해 주세요");
149			return false;
150		}
151		if(fMsg != null && (fTyp == "SELECT-ONE" || fTyp == "SELECT-MULTIPLE") && fVal ==""){
152			alert(fMsg + " 선택해 주세요");
153			fObj.focus(); return false;
154		}
155		if(fMsg != null && (fTyp == "RADIO" || fTyp == "CHECKBOX") && checkChecked(fObj) == false){
156			alert(fMsg + " 선택해 주세요");
157			fObj.focus(); return false;
158		}
159		if(fNum != null && isNaN(fVal)){
160			alert("숫자로만 입력해 주세요");
161			fObj.focus(); return false;
162		}
163		if(fMin != null && fMin > getLen(fVal)){
164			alert("입력된 글자의 byte가 "+fMin+"byte보다 커야합니다.");
165			fObj.focus(); return false;
166		}
167		if(fMax != null && fMax < getLen(fVal)){
168			alert("입력된 글자의 byte가 "+fMax+"byte보다 작아야합니다.\n(영문 "+fMax+"자, 한글 "+Math.floor(fMax/2)+"자 까지 가능합니다.)");
169			fObj.focus(); return false;
170		}
171		if(fMxN != null && parseInt(fMxN) < parseInt(fVal)){
172			alert("입력된 숫자는 "+fMxN+"보다 작아야합니다.");
173			fObj.focus(); return false;
174		}
175		if(fMnN != null && parseInt(fMnN) > parseInt(fVal)){
176			alert("입력된 숫자는 "+fMnN+"보다 커야합니다.");
177			fObj.focus(); return false;
178		}
179		if(fRrn != null && checkRRN(fVal) == false && fVal != ""){
180			alert("주민등록번호가 올바르지 않습니다");
181			fObj.focus(); return false;
182		}
183		if(fBrn != null && checkBRN(fVal) == false && fVal != ""){
184			alert("사업자등록번호가 올바르지 않습니다");
185			fObj.focus(); return false;
186		}
187		if(fFrn != null && checkFRN(fVal) == false && fVal != ""){
188			alert("외국인등록번호가 올바르지 않습니다");
189			fObj.focus(); return false;
190		}
191		if(fMal != null && checkEmail(fVal) == false && fVal != ""){
192			alert("이메일 주소가 올바르지 않습니다");
193			fObj.focus(); return false;
194		}
195	}
196	return true;
197}
198
199// 배열 요소일 경우 checked 된것이 있는지 확인
200function checkChecked(obj){
201	var fname = obj.form.name;
202	var objnm = obj.name;
203	var oElem = eval(fname+"."+objnm);
204	var ret = false;
205
206	if(typeof(oElem.length) == "undefined"){
207		if(oElem.checked){
208			ret = true;
209		}
210	} else{
211		for(var i=0;i<oElem.length;i++){
212			if(oElem[i].checked){
213				ret = true;
214			}
215		}
216	}
217	return ret;
218}
219
220/* 유효성 체크
221**************************************************************************************************************/
222
223// 주민등록번호 유효성 체크(Resident Registration number)
224function checkRRN(rrn){
225	// 주민번호의 형태와 7번째 자리(성별) 유효성 검사
226	fmt = /^\d{6}-[1234]\d{6}$/;
227	if(!fmt.test(rrn)){
228		return false;
229	}
230
231	// 날짜 유효성 검사
232	birthYear =(rrn.charAt(7) <= "2") ? "19" : "20";
233	birthYear += rrn.substr(0, 2);
234	birthMonth = rrn.substr(2, 2) - 1;
235	birthDate = rrn.substr(4, 2);
236	birth = new Date(birthYear, birthMonth, birthDate);
237
238	if( birth.getYear() % 100 != rrn.substr(0, 2) || birth.getMonth() != birthMonth || birth.getDate() != birthDate){
239		return false;
240	}
241
242	// Check Sum 코드의 유효성 검사
243	buf = new Array(13);
244	for(i = 0; i < 6; i++) buf[i] = parseInt(rrn.charAt(i));
245	for(i = 6; i < 13; i++) buf[i] = parseInt(rrn.charAt(i + 1));
246
247	multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
248	for(i = 0, sum = 0; i < 12; i++) sum +=(buf[i] *= multipliers[i]);
249
250	if((11 -(sum % 11)) % 10 != buf[12]){
251		return false;
252	}
253	return true;
254}
255
256// 사업자등록번호 유효성 체크(Business Registration Number)
257function checkBRN(brn){
258  brn = brn.replace(/-/g,"");
259	var sum = 0;
260	var getlist =new Array(10);
261	var chkvalue =new Array("1","3","7","1","3","7","1","3","5");
262	for(var i=0; i<10; i++){ getlist[i] = brn.substring(i, i+1); }
263	for(var i=0; i<9; i++){ sum += getlist[i]*chkvalue[i]; }
264	sum = sum + parseInt((getlist[8]*5)/10);
265	sidliy = sum % 10;
266	sidchk = 0;
267	if(sidliy != 0){ sidchk = 10 - sidliy; }
268	else { sidchk = 0; }
269	if(sidchk != getlist[9]){ return false; }
270	return true;
271}
272
273// 외국인등록번호 유효성 체크(Foreign Registration Number)
274function checkFRN(frn){
275	var sum=0;
276	var odd=0;
277	buf = new Array(13);
278	for(i=0; i<13; i++){ buf[i]=parseInt(frn.charAt(i)); }
279	odd = buf[7]*10 + buf[8];
280	if(odd%2 != 0){ return false; }
281	if((buf[11]!=6) && (buf[11]!=7) && (buf[11]!=8) && (buf[11]!=9) ){
282		return false;
283	}
284	multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
285	for(i=0, sum=0; i<12; i++){ sum += (buf[i] *= multipliers[i]); }
286	sum = 11 - (sum%11);
287	if(sum >= 10){ sum -= 10; }
288	sum += 2;
289	if(sum >= 10){ sum -= 10; }
290	if(sum != buf[12]){ return false }
291	return true;
292}
293
294// 이메일 유효성 체크
295function checkEmail(str){
296	var reg = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;
297	if(str.search(reg) != -1){
298		return true;
299	}
300	return false;
301}
302
303/* 한글/영문/숫자 입력제한 함수 (지정된 것 제외하고 나머지는 무시)
304**************************************************************************************************************/
305// 숫자입력제어
306function pub_chkKeyPress(chkType){
307	// delete control key 와 상하좌우 허용함.
308	// Delete = 46, BackSpace=8 , Tab=9 , left-right=37-40 Enter = 13
309
310	if( ((event.keyCode>=37)&&(event.keyCode<=40))||((event.keyCode>=8)&&(event.keyCode<=9))||(event.keyCode==46) ) {
311		return true;
312	}
313// 숫자만 입력
314	if(chkType==1){
315		if( ( (event.keyCode>=48)&&(event.keyCode<=57) ) || ( (event.keyCode>=96)&&(event.keyCode<=105) ) )
316		{
317			return true;
318		}
319		else
320		{
321			event.preventDefault();
322			return false;
323		}
324	}
325// 숫자,, 만 입력
326	if(chkType==3){
327		if( ( (event.keyCode>=48)&&(event.keyCode<=57) ) || ( (event.keyCode>=96)&&(event.keyCode<=105) ) || ((event.keyCode >= 188)&&(event.keyCode <= 188)))
328		{
329			return true;
330		}
331		else
332		{
333			event.preventDefault();
334			return false;
335		}
336	}
337// 숫자,- 만 입력
338	if(chkType==4){
339		if( ( (event.keyCode>=48)&&(event.keyCode<=57) ) || ( (event.keyCode>=96)&&(event.keyCode<=105) ) || ((event.keyCode >= 189)&&(event.keyCode <= 189)) || ((event.keyCode >= 109)&&(event.keyCode <= 109)))
340		{
341			return true;
342		}
343		else
344		{
345			event.preventDefault();
346			return false;
347		}
348	}
349}
350
351// 한글만 입력
352function chkHan(this_s,type){
353	temp_value = this_s.value.toString();
354	regexp = '';
355	repexp = '';
356	switch(type){
357		case 'c': regexp = /[^ㄱ-ㅎ가-힣]/g;break;
358		case 's': regexp = /[^ㄱ-ㅎ가-힣\s]/g;break;
359		case '':	regexp = /[^가-힣]/g; break;
360		default : regexp = /[^ㄱ-ㅎ가-힣\s]/g;
361	}
362	if(regexp.test(temp_value)){
363		temp_value = temp_value.replace(regexp,repexp);
364		this_s.value = temp_value;
365	}
366}
367/*
368type
369-> 'c' : 초성 포함
370-> 's' : 초성 포함 + 공백 포함
371-> '' : 초성, 공백 무시
372
373사용예)
374초성, 공백 무시
375onkeyup = "chkHan(this, '');"
376초성 포함
377onkeyup = "chkHan(this, 'c');"
378초성, 공백 포함
379onkeyup = "chkHan(this, 's');"
380*/
381
382// 숫자만 입력받기
383function chkNum(this_s,type){
384	temp_value = this_s.value.toString();
385	regexp = /[^-\.0-9]/g;
386	repexp = '';
387	temp_value = temp_value.replace(regexp,repexp);
388	regexp = '';
389	repexp = '';
390	switch(type){
391		case 'int':	 regexp = /[^0-9]/g; break;
392		case 'float':regexp = /^(-?)([0-9]*)(\.?)([^0-9]*)([0-9]*)([^0-9]*)/; break;
393		case '-int':	regexp = /^(-?)([0-9]*)([^0-9]*)([0-9]*)([^0-9]*)/;break;
394		case '-float':regexp = /^(-?)([0-9]*)(\.?)([^0-9]*)([0-9]*)([^0-9]*)/; break;
395		default : regexp = /[^0-9]/g; break;
396	}
397	switch(type){
398		case 'int':repexp = '';break;
399		case 'float':repexp = '$2$3$5';break;
400		case '-int':	repexp = '$1$2$4';break;
401		case '-float':repexp = '$1$2$3$5'; break;
402		default : regexp = /[^0-9]/g; break;
403	}
404	temp_value = temp_value.replace(regexp,repexp);
405	this_s.value = temp_value;
406}
407/*
408type
409-> '', 'int' : 양의 정수
410-> 'float' : 양의 실수
411-> '-int' : 음의 정수 포함
412-> '-int' : 음의 실수 포함
413
414사용예)
415양의 정수만
416onkeyup = "chkNum(this, '');"
417양의 실수만
418onkeyup = "chkNum(this, 'float');"
419정수만
420onkeyup = "chkNum(this, '-int');"
421실수만
422onkeyup = "chkNum(this, '-float');"
423*/
424
425// 영어만 입력받기  (대소문자)
426function chkEng(this_s,type){
427	temp_value = this_s.value.toString();
428	regexp = '';
429	repexp = '';
430	switch(type){
431		case 'small':regexp = /[^a-z]/g;break;
432		case 'big':regexp = /[^A-Z]/g;break;
433		case 'all':regexp = /[^a-z]/i;break;
434		default :regexp = /[^a-z]/i;break;
435	}
436	temp_value = temp_value.replace(regexp,repexp);
437	this_s.value = temp_value;
438}
439/*
440type
441-> '', 'all' : 모두
442->
442 'small' : 소문자
443-> 'big' : 대문자
444
445사용예)
446모두
447onkeyup = "chkEng(this, '');"
448소문자만
449onkeyup = "chkEng(this, 'small');"
450대문자만
451onkeyup = "chkEng(this, 'big');"
452*/
453
454// 영어와 숫자만 입력받기
455function chkNumEng(this_s){
456	temp_value = this_s.value.toString();
457	regexp = /[^0-9a-zA-Z]/g;
458	repexp = '';
459	temp_value = temp_value.replace(regexp,repexp);
460	this_s.value = temp_value;
461}
462/*
463사용예)
464onkeyup = "chkNumEng(this);"
465*/
466
467// 영어와 숫자, 언더바만 입력받기
468function chkNumEngUbar(this_s){
469	temp_value = this_s.value.toString();
470	regexp = /[^0-9a-zA-Z_]/g;
471	repexp = '';
472	temp_value = temp_value.replace(regexp,repexp);
473	this_s.value = temp_value;
474}
475/*
476사용예)
477onkeyup = "chkNumEngUbar(this);"
478*/
479
480//ID 영문+숫자만 입력체크
481function Check_ID(input) {
482  var err_cnt=0
483  for (var i = 0; i < input.length; i++) {
484      var val = input.charAt(i);
485      if (!((val >= "0" && val <= "9") || (val >= "a" && val <= "z") || (val >= "A" && val <= "Z"))) err_cnt ++;
486  }
487  if (err_cnt == 0 ) {
488     return true;
489  } else {
490     return false;
491  }
492}
493
494function comma(v){
495	var num = v.value;
496	if (v.value.length >= 4){
497		re = /^$|,/g;
498		num = num.replace(re, "");
499		fl=""
500		if(isNaN(num)) { alert("문자는 사용할 수 없습니다.");return 0}
501		if(num==0) return num
502		if(num<0){
503			num=num*(-1)
504			fl="-"
505		}else{
506			num=num*1;
507		}
508		num = new String(num)
509		temp=""
510		co=3
511		num_len=num.length
512		while (num_len>0){
513			num_len=num_len-co
514			if(num_len<0){
515				co=num_len+co;
516				num_len=0;
517			}
518			temp=","+num.substr(num_len,co)+temp
519		}
520		v.value =  fl+temp.substr(1);
521	}
522}
523
524function number_format(numstr) {
525  var numstr = String(numstr);
526  var re0 = /(\d+)(\d{3})($|\..*)/;
527  if (re0.test(numstr))
528	return numstr.replace(
529	  re0,
530	  function(str,p1,p2,p3) { return number_format(p1) + "," + p2 + p3; }
531	);
532  else
533	return numstr;
534}
535
536/* 기타함수
537**************************************************************************************************************/
538
539// 폼에 해당하는 컨트롤들의 기본값 쉽게 셋팅해 주기
540function initForm(f){
541	var nLen; // form 요소의 갯수
542	var ival; // 각 요소의 default value 값 즉! 초기화하고자 하는값
543	var fTyp; // form 요소의 타입(select, radio, checkbox...)
544
545	for(var i = 0; i < f.elements.length; i++){
546		fTyp = toUpperCase(f.elements[i].type);
547		ival = f.elements[i].ival;
548
549		if(ival && fTyp == "SELECT-ONE"){
550			nLen = f.elements[i].options.length;
551			for(var j = 0; j < nLen; j++){
552				if(f.elements[i].options[j].value == ival)
553					f.elements[i].options[j].selected = true;
554			}
555		}
556		if(fTyp == "SELECT-MULTIPLE"){
557			nLen = f.elements[i].options.length;
558			for(var j = 0; j < nLen; j++){
559				if(f.elements[i].options[j].value == f.elements[i].options[j].ival)
560					f.elements[i].options[j].selected = true;
561			}
562		}
563		if(ival &&(fTyp == "RADIO" || fTyp == "CHECKBOX")){
564			if(f.elements[i].value == ival)
565				f.elements[i].checked = true;
566		}
567	}
568	return true;
569}
570
571// 문자 길이 반환(영문 1byte, 한글 2byte 계산)
572function getLen(str){
573	var strLen = str.length;
574	var cnt = 0;
575
576	for(k=0; k<strLen; k++){
577		var temp = str.charAt(k);
578		if(escape(temp).length > 4)
579			cnt += 2;
580		else if(temp != '\r')
581			cnt++;
582	}
583	return cnt;
584}
585
586// 바이트로 입력제한(초과분 자동삭제)
587function cutByte(f, maxByte){
588	var str = new String(f.value);
589	var strLen = str.length;
590	var strByte = getLen(str);
591	var cnt = 0;
592
593	if(strByte > maxByte){
594		var overByte = strByte-maxByte;
595		alert("내용을 "+maxByte+"byte 이상 입력하실 수 없습니다.\n입력하신 내용 중 초과 "+overByte+"byte는 자동 삭제 됩니다.");
596	}
597
598	for(k=0; k<strLen; k++){
599		if(cnt < maxByte){
600			var temp = str.charAt(k);
601			if(escape(temp).length > 4)
602				cnt += 2;
603			else if(temp != '\r')
604				cnt++;
605		}else{
606			str = str.substring(0, k);
607			if((maxByte%2) == 1){
608				strLen = str.length-1;
609				if(escape(str.charAt(strLen)).length > 4){
610					str = str.substring(0,strLen);
611				}
612			}
613			f.value = str;
614			break;
615		}
616	}
617}
618
619// 대문자 변환 ex) toUpperCase(문자)
620function toUpperCase(str){
621	var ret;
622	str != null ? ret = str.toUpperCase() : ret = "";
623	return ret;
624}
625
626// 포커스 변경
627function moveFocus(num,fromform,toform){
628	var str = fromform.value.length;
629	if(str == num) toform.focus();
630}
631
632// 이메일선택입력
633function inputDomain(f, domain){
634	if(domain){
635		f.email2.value = domain;
636	}else{
637		f.email2.value = "";
638		f.email2.focus();
639	}
640}
641
642// 파일폼 직접입력 제한
643function filePretect(){
644	alert("찾아보기를 이용해 주세요.");
645	event.returnValue = false;
646}
647
648//체크박스 전체선택
649function AllChk() {
650	if($("#chk").prop("checked") == true) {
651		for(var i = 0; i < document.ListForm.elements.length; i++) {
652			document.ListForm.elements[i].checked = true;
653		}
654	}else {
655		for(var i = 0; i < document.ListForm.elements.length; i++) {
656				document.ListForm.elements[i].checked = false;
657		}
658	}
659}
660
661//체크박스 전체선택
662function AllChk_sub() {
663	if($("#chk2").prop("checked") == true) {
664		for(var i = 0; i < document.ListForm2.elements.length; i++) {
665			document.ListForm2.elements[i].checked = true;
666		}
667	}else {
668		for(var i = 0; i < document.ListForm2.elements.length; i++) {
669				document.ListForm2.elements[i].checked = false;
670		}
671	}
672}
673
674//체크박스 전체선택
675function AllChk_sub2() {
676	if($("#chk3").prop("checked") == true) {
677		for(var i = 0; i < document.ListForm3.elements.length; i++) {
678			document.ListForm3.elements[i].checked = true;
679		}
680	}else {
681		for(var i = 0; i < document.ListForm3.elements.length; i++) {
682				document.ListForm3.elements[i].checked = false;
683		}
684	}
685}
686
687/* 지정된 체크박스 모두 체크
688**************************************************************************************************************/
689function AllChk2(frm, type){
690	var chk_obj = document.getElementsByName(type);
691	if(frm.allchk.checked == true){
692		for(var i=0; i<chk_obj.length; i++){
693			chk_obj[i].checked = true;
694		}
695	}else{
696		for(var i=0; i<chk_obj.length; i++){
697			chk_obj[i].checked = false;
698		}
699	}
700}
701
702//날짜 스크립트
703function wr_date(s_u, e_u, per){
704	var st_date = document.getElementsByName(s_u);
705	var en_date = document.getElementsByName(e_u);
706	var newDay=mydate=new Date();
707	var year=mydate.getYear()
708	var month=mydate.getMonth()+1
709	var day=mydate.getDate()
710
711	if (month<10) month="0"+month;
712	if (day<10) day="0"+day;
713
714
715	newDay.setDate(mydate.getDate()-per);
716	var se_year=newDay.getYear()
717	var se_month=newDay.getMonth()+1
718	var se_day=newDay.getDate()
719
720	if (se_month<10) se_month="0"+se_month;
721	if (se_day<10) se_day="0"+se_day;
722
723	st_date[0].value=se_year+"-"+se_month+"-"+se_day;
724	en_date[0].value=year+"-"+month+"-"+day;
725}
726
727function clr_txt(na){
728	var cl_name = document.getElementsByName(na);
729	cl_name[0].value="";
730}
731
732// 현재 이벤트객체 Index 가져오기 ##################################################
733function getDisObjIdx(obj) {
734	var i = 0;
735	var result = 0;
736
737	var arrTag = document.getElementsByTagName('*');
738
739	if (obj.sourceIndex) {
740		while (arrTag[i].sourceIndex < obj.sourceIndex) {
741			if (arrTag[i].id == obj.id) ++result;
742			++i;
743		}
744	}
745	else if (obj.compareDocumentPosition) {
746		while ((arrTag[i].compareDocumentPosition(obj) & 6) - 3 > 0) {
747			if (arrTag[i].id == obj.id) ++result;
748			++i;
749		}
750	}
751
752	return result;
753}
754
755/* 숫자세자리마다 콤마 찍기
756**************************************************************************************************************/
757function commify(n) {
758	var reg = /(^[+-]?\d+)(\d{3})/;		// 정규식
759	n += '';							// 숫자를 문자열로 변환
760
761	while (reg.test(n))
762		n = n.replace(reg, '$1'+','+'$2');
763
764	return n;
765}
766
767/* 삭제 함수
768**************************************************************************************************************/
769function do_delete(url, txt){
770
771	var c = confirm(txt);
772	if (c){
773		doquery.location.href=url;
774	}
775}
776
777function change_bg(num){
778	var num = parseInt(num);
779	$('#list_tr tr').slice(0).removeClass("tbrow_sel");
780	$('#list_tr tr').slice(0).addClass("tbrow");
781
782	$('#list_tr tr').slice(num, num+1).removeClass("tbrow");
783	$('#list_tr tr').slice(num, num+1).addClass("tbrow_sel");
784}
785
786function change_bg_sub(num){
787	var num = parseInt(num);
788	$('#list_tr_sub tr').slice(0).removeClass("tbrow_sel");
789	$('#list_tr_sub tr').slice(0).addClass("tbrow");
790
791	$('#list_tr_sub tr').slice(num, num+1).removeClass("tbrow");
792	$('#list_tr_sub tr').slice(num, num+1).addClass("tbrow_sel");
793}
794
795function change_bg3(num){
796	var num = parseInt(num);
797	$('#list_tr3 tr').slice(0).removeClass("tbrow_sel");
798	$('#list_tr3 tr').slice(0).addClass("tbrow");
799
800	$('#list_tr3 tr').slice(num, num+1).removeClass("tbrow");
801	$('#list_tr3 tr').slice(num, num+1).addClass("tbrow_sel");
802}
803
804function change_sel(num){
805	var num = parseInt(num);
806	var cls_name = $('#list_tr tr:eq('+num+')').attr("class");
807	if (cls_name=="tbrow"){
808		$('#list_tr tr:eq('+num+')').attr("class", "tbrow_selC");
809		$('#list_tr .Tno_border:eq('+num+')').attr("checked", true);
810	}else{
811		$('#list_tr tr:eq('+num+')').attr("class", "tbrow");
812		$('#list_tr .Tno_border:eq('+num+')').attr("checked", false);
813	}
814
815}
816
817function Tb_addRow(Tid, Trow){
818	$("#"+Tid).append($("#"+Trow).val());
819}
820
821function Tb_delRow(obj){
822	$(obj).parent().parent().remove();
823}
824// <template id="temp_1">
825// 	<li class="temp_div" itemID="">
826// 	</li>
827// </template>
828function addRow(tb_id, tmp_id, max=null, innerObj=null, acc = 'append'){
829  if(max!=null && innerObj!=null){
830    if($(innerObj).length >= max){
831      alert('최대 '+max+'개까지 추가할 수 있습니다.');
832      return false;
833    }
834  }
835	// addRow('#vmain_list', '#temp_1')
836	var wctemplate = document.querySelector(tmp_id);
837	var clone = document.importNode(wctemplate, true);
838  switch (acc) {
839    case 'append': $(tb_id).append(clone.content);break;
840    case 'after': $(tb_id).after(clone.content);break;
841    default: $(tb_id).append(clone.content);break;
842  }
843}
844function delRow(obj, p_Obj){
845	// delRow(this, '.temp_div')
846	$(obj).parents(p_Obj).remove();
847}
848
849function goTwitter(msg,url) {
850	var href = "http://twitter.com/home?status=" + encodeURIComponent(msg) + " " + encodeURIComponent(url);
851	var a = window.open(href, 'twitter', '');
852	if ( a ) {
853		a.focus();
854	}
855}
856function goMe2Day(msg,url,tag) {
857	var href = "http://me2day.net/posts/new?new_post[body]=" + encodeURIComponent(msg) + " " + encodeURIComponent(url) + "&new_post[tags]=" + encodeURIComponent(tag);
858	var a = window.open(href, 'me2Day', '');
859	if ( a ) {
860		a.focus();
861	}
862}
863function goFaceBook(msg,url) {
864	var href = "http://www.facebook.com/sharer.php?u=" + url + "&t=" + encodeURIComponent(msg);
865	var a = window.open(href, 'facebook', '');
866	if ( a ) {
867		a.focus();
868	}
869}
870function goCyWorld(msg, url) {
871	var link = "http://csp.cyworld.com/bi/bi_recommend_pop.php?title="+encodeURIComponent(msg);
872	link += "&url="+encodeURIComponent(url);
873	link += "&thumbnail="+encodeURIComponent("{sc_img[0]}");
874	link += "&summary="+encodeURIComponent("");
875	window.open(link,"sns",'width=700,height=600,resizable=yes,scrollbars=yes,status=0');
876
877}
878/*
879function goYozmDaum(prefix,link,parameter) {
880	var href = "http://yozm.daum.net/api/popup/prePost?link=" + encodeURIComponent(link) + "&prefix=" + encodeURIComponent(prefix) + "&parameter=" + encodeURIComponent(parameter);
881	var a = window.open(href, 'yozmSend', 'width=466, height=356');
882	if ( a ) {
883		a.focus();
884	}
885	//sourceid=54&
886}
887*/
888function goYozmDaum(msg,url) {
889	var href = "http://yozm.daum.net/api/popup/post?prefix=" + encodeURIComponent(msg) + "&meta=&key=&imgurl=&crossdomain=0&callback=&link=" + encodeURIComponent(url);
890	var a = window.open(href, 'yozmSend', 'width=466, height=356');
891	if ( a ) {
892		a.focus();
893	}
894	//sourceid=54&
895}
896
897// 쿠키값 가져오기
898function getCookie(name){
899	var Found = false;
900	var start, end;
901	var i = 0;
902
903	while(i <= document.cookie.length){
904		start = i;
905		end = start + name.length;
906		if(document.cookie.substring(start, end) == name){
907			Found = true;
908			break;
909		}
910		i++;
911	}
912
913	if(Found == true){
914		start = end + 1;
915		end = document.cookie.indexOf(';', start);
916		if (end < start) end = document.cookie.length;
917		return document.cookie.substring(start, end);
918	}
919	return '';
920}
921
922// 쿠키값 설정
923function setCookie(name, value, expiredays)
924{
925	var today = new Date();
926	today.setDate( today.getDate() + expiredays );
927	document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + today.toGMTString() + ";"
928}
929
930// 쿠키에서 로그인 정보 가져오기
931function getLogin()
932{
933	var frm = document.mem_lForm;
934
935	// userid 쿠키에서 id 값을 가져온다.
936	var id = getCookie("userid");
937
938	// 가져온 쿠키값이 있으면
939	if(id != "")
940	{
941		frm.log_id.value = id;
942		frm.saveid.checked = true;
943	}
944}
945
946// 쿠키에 로그인 정보 저장
947function saveLogin(id)
948{
949	if(id != "")
950	{
951		// userid 쿠키에 id 값을 7일간 저장
952		setCookie("svid", "Y", 90);
953		setCookie("userid", id, 90);
954	}
955	else{
956		// userid 쿠키 삭제
957		setCookie("userid", id, -1);
958		setCookie("svid", "Y", -1);
959	}
960}
961
962function popOpen(pW, pH, pUrl, pName){
963	var pL = parseInt((window.screen.width-pW)/2);	// 해상도가로
964	var pT = parseInt((window.screen.height-pH)/2);	// 해상도세로
965	var pProp = 'width=' + pW + ', height=' + pH + ', scrollbars=no, resizable=no, left=' + pL + ', top=' + pT + ', directories=no, status=no, menubar=no';
966
967	var newWin = window.open(pUrl, pName, pProp);
968	if (!newWin) alert('차단된 팝업창을 허용해 주세요.');
969	else newWin.focus();
970}
971
972function form_submit(f) {
973	// 폼 검증 함수 실행
974	if(!checkForm(f)){
975		return false;
976	}
977}
978
979function input_email(domain){
980	email = document.getElementsByName('email[]')
981	if(domain){
982		email[1].value = domain;
983	}else{
984		email[1].value = "";
985		email[1].focus();
986	}
987}
988
989function checked_status(val){
990	var num = $("."+val+":checked").size();
991	if (num<1){
992		return false;
993	}else{
994		return true;
995	}
996}
997
998var inputNameWrap = ".writePhoto";
999var inputNameFile = ".inpFile";
1000var inputNamePreview = ".photoView";
1001function clickInputFile2(obj){
1002  $(obj).parents(inputNameWrap).find(inputNameFile).trigger("click");
1003}
1004function readInputFile2(obj,chk) {
1005  var files = obj.files;
1006  var filesArr = Array.prototype.slice.call(files);
1007  filesArr.forEach(function(f) {
1008    if(!f.type.match("image.*")) {
1009      alert("이미지 확장자만 가능합니다.");
1010      var agent = navigator.userAgent.toLowerCase();
1011      if((navigator.appName == 'Netscape' && navigator.userAgent.
1011search('Trident') != -1) || (agent.indexOf("msie") != -1)) {
1012        // ie 일때
1013        $(obj).parents(inputNameWrap).find(inputNameFile).replaceWith($input.clone(true));
1014      } else {
1015        //other
1016        $(obj).parents(inputNameWrap).find(inputNameFile).val("");
1017      }
1018      return false;
1019    }
1020    var reader = new FileReader();
1021    reader.onload = function (e) {
1022      $(obj).parents(inputNameWrap).find(inputNamePreview).addClass("on").css("background-image","url("+e.target.result +")");
1023			if(chk=='Y') {
1024				$('#file_val').val('Y');
1025				submit_chk();
1026			}
1027    }
1028    reader.readAsDataURL(obj.files[0]);
1029  });
1030
1031}
1032function removeInputFile2(obj,chk){
1033  var wrap = $(obj).parents(".writePhoto");
1034  var $input = wrap.find(".inpFile");
1035  var $preview = wrap.find(".photoView");
1036  var agent = navigator.userAgent.toLowerCase();
1037  if((navigator.appName == 'Netscape' && navigator.userAgent.search('Trident') != -1) || (agent.indexOf("msie") != -1)) {
1038    // ie 일때
1039    $(obj).parents(inputNameWrap).find(inputNameFile).replaceWith($input.clone(true));
1040  } else {
1041    //other
1042    $(obj).parents(inputNameWrap).find(inputNameFile).val("");
1043  }
1044  $(obj).parents(inputNameWrap).find(inputNamePreview).removeClass("on").css("background-image","none");
1045	if(chk=='Y') {
1046		$('#file_val').val('');
1047		submit_chk();
1048	}
1049}
1050
1051
1052// 로딩중 DIV 제어
1053function loading_view(view){
1054	if(view==true){
1055		$("#btn_submit").hide();
1056		$("#div_loading").show();
1057	}else if(view==false){
1058		$("#div_loading").hide();
1059		$("#btn_submit").show();
1060	}
1061}
1062
1063/**************************************************************************************************************/
1064/**
1065* pageGo({url: '',target: '_blank',vals: [['a', val],['b', val]]});
1066*/
1067function pageGo(d){
1068	var insdoc = "";
1069	for(var i=0; i<d.vals.length; i++){
1070		insdoc+= "<input type='hidden' name='"+ d.vals[i][0] +"' value='"+ d.vals[i][1] +"'>";
1071	}
1072	var goform = $("<form>", { method: "post", action: d.url, target: d.target, html: insdoc }).appendTo("body");
1073	goform.submit();
1074	goform.remove();
1075}
1076
1077// 날짜입력 하이픈(-) 자동삽입
1078function inputYMDNumber(obj, check = false) {
1079  // 숫자만 입력되도록
1080  $(obj).keypress(function (event) {
1081    if (event.which < 48 || event.which > 57) {
1082      event.preventDefault();
1083    }
1084  });
1085  var RegNotNum = /[^0-9]/g;
1086  var date = $(obj).val();
1087
1088  date = date.replace(RegNotNum, ""); // 숫자만 남기기
1089  if (date == "" || date == null || date.length < 5) {
1090    $(obj).val(date);
1091    // return;
1092  }
1093
1094  var DataFormat;
1095  var RegPhonNum;
1096
1097  // 날짜 포맷(yyyy-mm-dd) 만들기
1098  if (date.length <= 6) {
1099    DataFormat = "$1-$2"; // 포맷을 바꾸려면 이곳을 변경
1100    RegPhonNum = /([0-9]{4})([0-9]+)/;
1101  } else if (date.length <= 8) {
1102    DataFormat = "$1-$2-$3"; // 포맷을 바꾸려면 이곳을 변경
1103    RegPhonNum = /([0-9]{4})([0-9]{2})([0-9]+)/;
1104  }
1105
1106  date = date.replace(RegPhonNum, DataFormat);
1107
1108  $(obj).val(date);
1109
1110  // 모두 입력됐을 경우 날짜 유효성 확인
1111  if (date.length == 10 || (check == true && date.length > 0)) {
1112    var isVaild = true;
1113
1114    if (date.length < 10) {
1115      isVaild = false;
1116    } else if (isNaN(Date.parse(date))) {
1117      // 유효 날짜 확인 여부
1118      isVaild = false;
1119    } else {
1120      // 년, 월, 일 0 이상 여부 확인
1121      var date_sp = date.split("-");
1122      date_sp.forEach(function (sp) {
1123        if (parseInt(sp) == 0) {
1124          isVaild = false;
1125        }
1126      });
1127
1128      // 마지막 일 확인
1129      var last = new Date(
1130        new Date(date).getFullYear(),
1131        new Date(date).getMonth() + 1,
1132        0
1133      );
1134      // 일이 달의 마지막날을 초과했을 경우 다음달로 자동 전환되는 현상이 있음 (예-2월 30일 -> 3월 1일)
1135      if (parseInt(date_sp[1]) != last.getMonth() + 1) {
1136        var date_sp2 = date_sp.slice(0);
1137        date_sp2[2] = "01";
1138        var date2 = date_sp2.join("-");
1139        last = new Date(
1140          new Date(date2).getFullYear(),
1141          new Date(date2).getMonth() + 1,
1142          0
1143        );
1144      }
1145      if (last.getDate() < parseInt(date_sp[2])) {
1146        isVaild = false;
1147      }
1148    }
1149
1150    if (!isVaild) {
1151      alert("잘못된 날짜입니다. \n다시 입력하세요.");
1152      $(obj).val("");
1153      $(obj).focus();
1154      return;
1155    }
1156  }
1157}
1158
1159/* Ajax ***********************************************************************************************************/
1160/**
1161 * @param {string} url
1162 * @param {FormData|Object} formData
1163 * @param {string} returnFn
1164 * @param {string} errorFn
1165 * @returns {Promise<void>}
1166 * @example
1167 * let url = "./ajax.php";
1168 * let formData = new FormData($("#sample_list")[0]); or let formData = {mode: "sample", number: 10};
1169 * let returnFn = "successFn";
1170 * let errorFn = "errorFn";
1171 * AjaxFn(url, formData, returnFn, errorFn);
1172 */
1173async function AjaxFn(url, formData, returnFn, errorFn=null) {
1174  if (formData instanceof Object && !(formData instanceof FormData)) {
1175    const formDataObj = new FormData();
1176    for (const [key, value] of Object.entries(formData)) {
1177      formDataObj.append(key, value);
1178    }
1179    formData = formDataObj;
1180  }
1181
1182  try {
1183    const response = await fetch(url, {
1184      method: 'POST',
1185      body: formData
1186    });
1187
1188    const responseData = await response.json();
1189
1190    if (responseData.result_code === 'session') {
1191      const message = responseData.result_msgOn ? responseData.result_msg || '로그인 세션이 종료되었습니다.\n\n다시 로그인 해주시길 바랍니다.' : '';
1192      if (message) alert(message);
1193      if (typeof loading_view === 'function') loading_view(false);
1194      
1195      if (fileExists(responseData.data)) location.href = responseData.data;
1196      else location.reload();
1197    } else if (responseData.result_code !== 200) {
1198      const message = responseData.result_msgOn ? responseData.result_msg || '알 수 없는 오류가 발생하였습니다.' : '';
1199      if (message) alert(message);
1200      if (typeof loading_view === 'function') loading_view(false);
1201      if (errorFn && typeof errorFn === 'string') window[errorFn](responseData.data);
1202    } else {
1203      if (responseData.result_msgOn && responseData.result_msg) alert(responseData.result_msg);
1204      if (returnFn && typeof returnFn === 'string') window[returnFn](responseData.data);
1205    }
1206  } catch (error) {
1207    // console.error(error);
1208    // alert(`이런...\nerror : ${error}`);
1209    if (typeof loading_view === 'function') loading_view(false);
1210  }
1211}
1212
1213function fileExists(url) {
1214  if (url) {
1215    const request = new XMLHttpRequest();
1216    request.open('HEAD', url, false);
1217    request.send();
1218    return request.status === 200;
1219  }
1220  return false;
1221}
1222/* Ajax ***********************************************************************************************************/
1223function number_format(numstr) {
1224  var numstr = String(numstr);
1225  var re0 = /(\d+)(\d{3})($|\..*)/;
1226  if (re0.test(numstr))
1227    return numstr.replace(re0, function (str, p1, p2, p3) {
1228      return number_format(p1) + "," + p2 + p3;
1229    });
1230  else return numstr;
1231}
1232function viewKorean(num) {
1233  num = num.replace(/,| /gi, "");
1234  var hanA = new Array(
1235    "",
1236    "일",
1237    "이",
1238    "삼",
1239    "사",
1240    "오",
1241    "육",
1242    "ì¹ ",
1243    "팔",
1244    "구",
1245    "십"
1246  );
1247  var danA = new Array(
1248    "",
1249    "십",
1250    "ë°±",
1251    "천",
1252    "",
1253    "십",
1254    "ë°±",
1255    "천",
1256    "",
1257    "십",
1258    "ë°±",
1259    "천",
1260    "",
1261    "십",
1262    "ë°±",
1263    "천"
1264  );
1265  var result = "";
1266  for (i = 0; i < num.length; i++) {
1267    str = "";
1268    han = hanA[num.charAt(num.length - (i + 1))];
1269    if (han != "") str += han + danA[i];
1270    if (i == 4) str += "만";
1271    if (i == 8) str += "억";
1272    if (i == 12) str += "ì¡°";
1273    result = str + result;
1274  }
1275  if (num != 0) result = result + " 원정";
1276  return result;
1277}
1278
1279// 사업자번호 하이픈 자동입력
1280function AutoHypen(companyNum) {
1281  companyNum = companyNum.replace(/[^0-9]/g, "");
1282  var tempNum = "";
1283
1284  if (companyNum.length < 4) {
1285    return companyNum;
1286  } else if (companyNum.length < 6) {
1287    tempNum += companyNum.substr(0, 3);
1288    tempNum += "-";
1289    tempNum += companyNum.substr(3, 2);
1290    return tempNum;
1291  } else if (companyNum.length < 11) {
1292    tempNum += companyNum.substr(0, 3);
1293    tempNum += "-";
1294    tempNum += companyNum.substr(3, 2);
1295    tempNum += "-";
1296    tempNum += companyNum.substr(5);
1297    return tempNum;
1298  } else {
1299    tempNum += companyNum.substr(0, 3);
1300    tempNum += "-";
1301    tempNum += companyNum.substr(3, 2);
1302    tempNum += "-";
1303    tempNum += companyNum.substr(5);
1304    return tempNum;
1305  }
1306}
1307
1308// 클립보드 복사
1309const copy = (text) => {
1310  // 임시의 textarea 생성
1311  const $textarea = document.createElement("textarea");
1312
1313  // body 요소에 존재해야 복사가 진행됨
1314  document.body.appendChild($textarea);
1315  
1316  // 복사할 특정 텍스트를 임시의 textarea에 넣어주고 모두 셀렉션 상태
1317  $textarea.value = text;
1318  $textarea.select();
1319  
1320  // 복사 후 textarea 지우기
1321  document.execCommand('copy');
1322  document.body.removeChild($textarea);
1323}
1324
1325$.fn.serializeObject = function() {
1326  "use strict"
1327  var result = {}
1328  var extend = function(i, element) {
1329    var node = result[element.name]
1330    if ("undefined" !== typeof node && node !== null) {
1331      if ($.isArray(node)) {
1332        node.push(element.value)
1333      } else {
1334        result[element.name] = [node, element.value]
1335      }
1336    } else {
1337      result[element.name] = element.value
1338    }
1339  }
1340
1341  $.each(this.serializeArray(), extend)
1342  return result
1343}
1344
1345function mergeTable(target, index) {
1346  var loop = null;
1347  var start_idx = 0;  //최초 td테그의 인덱스를 담을 변수 입니다.
1348  var add_num = 1;    //마지막 td 테그의 인덱스를 담을 변수 입니다.
1349  $(target).find('tr').each(function (idx) {
1350    var target_text = $(this).find('td').eq(index).text();
1351    if (!loop) {  //최초 동작이면
1352      loop = target_text;
1353      start_idx = idx;
1354    } else if (target_text == loop) {  //같은 열이 발견된 것 이라면
1355      add_num++;
1356      //같은열이긴 한데 근데 마지막이면
1357      if (idx == $(target).find('tr').length - 1) {
1358        $(target).find('tr').eq(start_idx).find('td').eq(index).attr("rowSpan", add_num).css('vertical-align', 'middle');
1359        for (var i = start_idx + 1; i < start_idx + add_num; i++) {
1360          $(target).find('tr').eq(i).find('td').eq(index).hide(); //hide로 변경
1361        }
1362      }
1363    } else { //다른 텍스트가 발견된 것 이라면
1364      if (add_num != 1) {    //머지가 필요한 경우라면
1365        $(target).find('tr').eq(start_idx).find('td').eq(index).attr("rowSpan", add_num).css('vertical-align', 'middle');
1366        for (var i = start_idx + 1; i < start_idx + add_num; i++) {
1367          $(target).find('tr').eq(i).find('td').eq(index).hide(); //hide로 변경
1368        }
1369      }
1370      start_idx = idx;
1371      loop = target_text;
1372      add_num = 1;
1373    }
1374  });
1375}
1376
1377// 전화번호 하이픈 자동
1378$(document).on("keyup", ".phoneNumber", function() {
1379	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") );
1380});
1381// 사업자번호 하이픈 자동
1382$(document).on("keyup", ".companyNumber", function() {
1383	$(this).val( AutoHypen($(this).val()) );
1384});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.