PageSourceSearch

https://www.yerim.net/js/other.js?ver=1.01

js yerim.net collected 2026-10-06 03:31:03 UTC 48,941 bytes, 1,825 lines download raw bytes

1//달력 관련
2$(function() {
3
4	if ( $('#view_sdate').length ){
5		//$( "#view_sdate" ).datepicker( );
6		$( "#view_sdate" ).datepicker({
7			defaultDate : ''	//1985-01-01
8			,showButtonPanel: true //140423 추가
9			,closeText: '닫기' //140423 추가
10		});
11		/*
12		$( "#view_sdate3" ).datepicker({
13			defaultDate : '1980-01-01'
14			,showButtonPanel: true //140423 추가
15			,closeText: '닫기' //140423 추가
16		});*/
17		$( "#view_edate" ).datepicker({
18			showButtonPanel: true //140423 추가
19			,closeText: '닫기' //140423 추가
20		} );
21	}
22
23
24	if ( $('#view_sdate1').length ){
25		$( "#view_sdate1" ).datepicker({
26			showButtonPanel: true //140423 추가
27			,closeText: '닫기' //140423 추가
28		} );
29		$( "#view_edate1" ).datepicker( {
30			showButtonPanel: true //140423 추가
31			,closeText: '닫기' //140423 추가
32		});
33	}
34
35	if ( $('#view_sdate2').length ){
36		$( "#view_sdate2" ).datepicker({
37			showButtonPanel: true //140423 추가
38			,closeText: '닫기' //140423 추가
39		} );
40		$( "#view_edate2" ).datepicker( {
41			showButtonPanel: true //140423 추가
42			,closeText: '닫기' //140423 추가
43		});
44	}
45
46
47	if ( $('#view_sdate3').length ){
48		$( "#view_sdate3" ).datepicker({
49			showButtonPanel: true //140423 추가
50			,closeText: '닫기' //140423 추가
51		} );
52		$( "#view_edate3" ).datepicker( {
53			showButtonPanel: true //140423 추가
54			,closeText: '닫기' //140423 추가
55		});
56	}
57
58	if ( $('.datepicker').length ){
59		$( ".datepicker" ).datepicker({
60			showButtonPanel: true //140423 추가
61			,closeText: '닫기' //140423 추가
62		} );
63	}
64
65/*
66 $("#view_sdate").datepicker({
67  showOn: "both", // 버튼과 텍스트 필드 모두 캘린더를 보여준다.
68  buttonImage: "/application/db/jquery/images/calendar.gif", // 버튼 이미지
69  buttonImageOnly: true, // 버튼에 있는 이미지만 표시한다.
70  changeMonth: true, // 월을 바꿀수 있는 셀렉트 박스를 표시한다.
71  changeYear: true, // 년을 바꿀 수 있는 셀렉트 박스를 표시한다.
72  minDate: '-100y', // 현재날짜로부터 100년이전까지 년을 표시한다.
73  nextText: '다음 달', // next 아이콘의 툴팁.
74  prevText: '이전 달', // prev 아이콘의 툴팁.
75  numberOfMonths: [1,1], // 한번에 얼마나 많은 월을 표시할것인가. [2,3] 일 경우, 2(행) x 3(열) = 6개의 월을 표시한다.
76  //stepMonths: 3, // next, prev 버튼을 클릭했을때 얼마나 많은 월을 이동하여 표시하는가.
77  yearRange: 'c-100:c+10', // 년도 선택 셀렉트박스를 현재 년도에서 이전, 이후로 얼마의 범위를 표시할것인가.
78  showButtonPanel: true, // 캘린더 하단에 버튼 패널을 표시한다.
79  currentText: '오늘 날짜' , // 오늘 날짜로 이동하는 버튼 패널
80  closeText: '닫기',  // 닫기 버튼 패널
81  dateFormat: "yy-mm-dd", // 텍스트 필드에 입력되는 날짜 형식.
82  showAnim: "slide", //애니메이션을 적용한다.
83  showMonthAfterYear: true , // 월, 년순의 셀렉트 박스를 년,월 순으로 바꿔준다.
84  dayNamesMin: ['월1', '화', '수', '목', '금', '토', '일'], // 요일의 한글 형식.
85  monthNamesShort: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] // 월의 한글 형식.
86
87 });
88
89*/
90
91
92
93});
94
95// 첨부파일 추가 ============
96function add_file(){
97
98	var ord_count = parseInt(signform.file_num.value);
99	add = parseInt(ord_count+1);
100	document.signform.file_num.value = add;
101
102	if(add<=10) {
103		text = "<br><div class='input_wrap file_box mt_05' style='width:300px;'><p></p><span class='btn_type_file'>찾아보기</span><input type='file' name='in_file[]' size='50'></div>";
104		var Tag = document.getElementById("fname_span");
105		Tag.innerHTML += text;
106	} else {
107		alert("10개 까지만 첨부 가능합니다.");
108		return;
109	}
110	  function file_upload(){
111    var tmp = $(this).val();
112    $(this).siblings('p').text(tmp);
113  };
114  $('.file_box > input').change(file_upload);
115
116}
117
118function add_file2(){
119
120	var ord_count = parseInt(signform.file_num2.value);
121	add = parseInt(ord_count+1);
122	document.signform.file_num2.value = add;
123
124	if(add<=10) {
125		text = "<br><input type='file' name='in_file2[]' size='50'>";
126		var Tag = document.getElementById("fname_span2");
127		Tag.innerHTML += text;
128	} else {
129		alert("10개 까지만 첨부 가능합니다.");
130		return;
131	}
132	  function file_upload(){
133    var tmp = $(this).val();
134    $(this).siblings('p').text(tmp);
135  };
136  $('.file_box > input').change(file_upload);
137
138}
139
140
141//아이디 확인
142$(document).ready(function(){
143	$(document).on("keyup", "input[name='mid']", function(){
144		var idVal = $('input[name="mid"]').val();
145
146			$("#idchk").val('');
147			var IdChkExp =  /^[a-z0-9_-]{5,15}$/; // 아이디 검사식
148
149			//var IdChkExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; //이메일검사식
150
151			if(idVal.length < 5){
152				$("#loginId").html('※ 5자 이상 입력해주세요.');
153			} else {
154				if(!IdChkExp.test(idVal)) {
155					$("#loginId").html('※ 아이디는 영문과 숫자조합만 가능합니다.');
156					return false;
157				}
158				else
159				{
160					if(idVal.length >= 5){
161
162						$.ajax({
163							type : "POST"
164							, url : "/INC/other_ajax.php"
165							, dataType : "json"
166							, data : "mode=duplicate&v="+idVal
167							, beforeSend: function(){  $("#curtainTop").show(); }
168							, success : function(res){ $("#curtainTop").hide();
169							 if(res.code=='1'){
170								$("#loginId").html('※ 중복된 아이디 입니다.');
171								//$('input[name="id"]').val('');
172							 }else{
173								$("#loginId").html('');
174								$("#idchk").val('1');
175							 }
176							}
177						});
178					}else{
179							$("#loginId").html('※ 5자 이상 입력해주세요.');
180					}
181				}
182
183			}
184
185	});
186
187
188	//관리자에서 아이디 사용
189	$(document).on("keyup","input[name='mid_1']", function(){
190		var idVal = $('input[name="mid_1"]').val();
191
192			var IdChkExp =  /^[a-z0-9_-]{5,15}$/; // 아이디 검사식
193			if(!IdChkExp.test(idVal)) {
194				$("#loginId").html('<b style="color:#ff0000">영문,숫자만 가능</b>');
195				return false;
196			}
197
198
199			if(idVal.length >= 4){
200
201				$.ajax({
202					type : "POST"
203					, url : "/INC/other_ajax.php"
204					, dataType : "json"
205					, data : "mode=duplicate&v="+idVal
206					, beforeSend: function(){  $("#curtainTop").show(); }
207					, success : function(res){ $("#curtainTop").hide();
208					 if(res.code=='1'){
209						$("#loginId").html('<b style="color:#ff0000">중복된 아이디 입니다.</b>');
210						//$('input[name="id"]').val('');
211					 }else{
212						$("#loginId").html('사용가능');
213					 }
214					}
215				});
216			}else{
217					$("#loginId").html('<b style="color:#ff0000">5자 이상 입력</b>');
218			}
219	});
220
221
222	//비밀번호 확인
223	$(document).on("keyup","input[name='upasswd']", function(){
224		var idVal = $('input[name="upasswd"]').val();
225		var idVal_1 = $('input[name="upasswd1"]').val();
226
227			var PwChkExp = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*=])(?=.*[0-9]).{3,16}$/;
228			if(!PwChkExp.test(idVal)) {
229				$("#passId").html('※ 영문,숫자,특수문자 조합하여 6~16자로 입력해주세요.');
230				return false;
231			}
232
233			if(idVal.length < 6){
234				$("#passId").html('※ 글자수가 작습니다. 6글자 이상 입력해주세요.');
235			} else {
236				$("#passId").html('');
237				$("#passchk").val('1');
238			}
239
240	});
241
242	$(document).on("keyup","input[name='upasswd1']", function(){
243		var idVal = $('input[name="upasswd"]').val();
244		var idVal_1 = $('input[name="upasswd1"]').val();
245
246		if(idVal_1.length > 0){
247			if(idVal!=idVal_1) {
248				$("#passId_1").html('※ 비밀번호가 일치하지 않습니다.');
249				$("#passchk1").val('');
250			} else {
251				$("#passId_1").html('');
252				$("#passchk1").val('1');
253			}
254		}
255	});
256
257
258	//닉네임확인
259	$(document).on("keyup","input[name='unickname']", function(){
260		var nickVal = $('input[name="unickname"]').val();
261
262			var NickChkExp =  /^[a-z0-9_-]{3,16}$/; // 아이디 검사식
263			/*if(!NickChkExp.test(nickVal)) {
264				$("#loginNick").html('<b style="color:#ff0000">영문,숫자만 가능</b>');
265				return false;
266
267
268			if(nickVal.length >= 2){
269
270				$.ajax({
271					type : "POST"
272					, url : "/INC/other_ajax.php"
273					, dataType : "json"
274					, data : "mode=nickcheck&v="+nickVal
275					, beforeSend: function(){  $("#curtainTop").show(); }
276					, success : function(res){ $("#curtainTop").hide();
277					//alert(res.code);
278					 if(res.code=='1'){
279						$("#loginNick").html('<b style="color:#ff0000">중복</b>');
280						$('input[name=nickcheck]').attr('value',"no");
281					 }else{
282						$("#loginNick").html('사용가능');
283						$('input[name=nickcheck]').attr('value',"ok");
284					 }
285					}
286				});
287			}else{
288					$("#loginNick").html('<b style="color:#ff0000">2자 이상 입력</b>');
289			}
290			}*/
291	});
292
293
294}); //end $(document).ready(function(){
295
296
297//주소상동
298function addr_copy() {
299
300 if(signform.par_zip1){
301	signform.par_zip1.value=signform.uzip1.value;
302	signform.par_zip2.value=signform.uzip2.value;
303	signform.par_addr1.value=signform.uaddr1.value;
304	signform.par_addr2.value=signform.uaddr2.value;
305 }
306}
307
308//선택한 회원 처리
309function select_member_change(type,link) {
310
311	var j = 0;
312	var length = 0;
313	var arrItemList = new Array();
314	var Itemlist = new Array();
315
316
317	/* uid 배열로 구한다.  */
318	for(var i = 0; i<document.listform.length; i++) {
319		if(document.listform.elements[i].checked == true) {
320			if(document.listform.elements[i].value != 0) {
321				arrItemList[j] = document.listform.elements[i].value;
322				j += 1 ;
323			}
324		}
325	}
326
327	Itemlist = arrItemList.join(",");
328
329	if(type=="board_view"){		//게시물 숨기기
330		if( j == 0 ){
331			alert("선택한 항목이 없습니다");
332			return;
333			}
334		selectBoardview(Itemlist,link);
335	}
336
337	if(type=="board_delete"){		//게시물 숨기기
338		if( j == 0 ){
339			alert("선택한 항목이 없습니다");
340			return;
341			}
342		selectBoarddelete(Itemlist,link);
343	}
344
345	if(type=="user_board_delete"){		//게시물 숨기기
346		if( j == 0 ){
347			alert("선택한 항목이 없습니다");
348			return;
349			}
350		user_selectBoarddelete(Itemlist,link);
351	}
352
353}
354
355//선택한 회원 탈퇴 시키기
356function selectMemberout(Itemlist,link){
357	temp1 = confirm("선택한 회원을 탈퇴 시키겠습니까?");
358	if(temp1 == true) {
359		var ref = link + "&uid=" + Itemlist;
360		//window.open = ref;
361		fancyboxOpen_w(ref,'300');
362	} else {
363		return;
364	}
365
366}  //end function
367
368function memberOut(){
369	temp = confirm("회원탈퇴 신청을 하겠습니까?");
370	if(temp == true) {
371		signform_1.submit();
372	} else {
373		return;
374	}
375}
376
377
378//선택한 정보 fancyboxopen으로 처리
379function sel_action_open(link,txt) {
380	var j = 0;
381	var length = 0;
382	var arrItemList = new Array();
383	var Itemlist = new Array();
384
385
386	/* uid 배열로 구한다.  */
387	for(var i = 0; i<document.listform.length; i++) {
388		if(document.listform.elements[i].checked == true) {
389			if(document.listform.elements[i].value != 0) {
390				arrItemList[j] = document.listform.elements[i].value;
391				j += 1 ;
392			}
393		}
394	}
395	Itemlist = arrItemList.join(",");
396	if( j == 0 ){
397		alert("선택한 항목이 없습니다");
398		return;
399	}
400	temp1 = confirm("선택한 게시물을 "+txt+" 하겠습니까?");
401	if(temp1 == true) {
402		var ref = link + "&uid=" + Itemlist;
403		fancyboxOpen_w(ref,'300');
404	} else {
405		return;
406	}
407
408}
409
410//선택한 정보 처리
411function sel_action(link,txt) {
412	Itemlist = "";
413	temp1 = confirm(txt+" 하겠습니까?");
414	if(temp1 == true) {
415		var ref = link + "&uid=" + Itemlist;
416		window.location = ref;
417	} else {
418		return;
419	}
420
421}
422
423
424//선택한 게시물 삭제
425function user_selectBoarddelete(Itemlist,link){
426	temp1 = confirm("선택한 게시물을 삭제 하겠습니까?");
427	if(temp1 == true) {
428		var ref = link + "&uid=" + Itemlist;
429		window.location= ref;
430	} else {
431		return;
432	}
433
434}  //end function
435
436//선택한 정보처리
437function sel_action_box(link,tit){
438	temp1 = confirm(tit+" 처리 하겠습니까?");
439
440	if(temp1 == true) {
441		var ref = link;
442		fancyboxOpen_w(ref,'300');
443	} else {
444		return;
445	}
446
447}  //end function
448
449
450
451
452//선택한 정보 처리
453function sel_user_action(link,txt) {
454
455	temp1 = confirm(txt+" 하겠습니까?");
456	if(temp1 == true) {
457		var ref = link;
458		window.location = ref;
459	} else {
460		return;
461	}
462
463}
464
465//선택한 회원 승인
466function selectMemberinok(link,tit){
467	temp1 = confirm("선택한 정보를 "+tit+" 처리 하겠습니까?");
468
469	if(temp1 == true) {
470		var ref = link;
471		fancyboxOpen_w(ref,'300');
472	} else {
473		return;
474	}
475
476}  //end function
477
478
479//선택한 정보 처리
480function sel_uid_action(link,txt) {
481	var j = 0;
482	var length = 0;
483	var arrItemList = new Array();
484	var Itemlist = new Array();
485
486
487	/* uid 배열로 구한다.  */
488	for(var i = 0; i<document.listform.length; i++) {
489		if(document.listform.elements[i].checked == true) {
490			if(document.listform.elements[i].value != 0) {
491				arrItemList[j] = document.listform.elements[i].value;
492				j += 1 ;
493			}
494		}
495	}
496	Itemlist = arrItemList.join(",");
497	if( j == 0 ){
498		alert("선택한 항목이 없습니다");
499		return;
500	}
501
502	temp1 = confirm(txt+" 하겠습니까?");
503	if(temp1 == true) {
504		var ref = link + "&uid=" + Itemlist;
505		window.location = ref;
506	} else {
507		return;
508	}
509
510}
511
512//선택한 정보 처리
513function sel_uid_action_1(link,txt) {
514	var j = 0;
515	var length = 0;
516	var arrItemList = new Array();
517	var Itemlist = new Array();
518
519
520	/* uid 배열로 구한다.  */
521	for(var i = 0; i<document.listform.length; i++) {
522		if(document.listform.elements[i].checked == true) {
523			if(document.listform.elements[i].value != 0) {
524				arrItemList[j] = document.listform.elements[i].value;
525				j += 1 ;
526			}
527		}
528	}
529	Itemlist = arrItemList.join(",");
530	if( j == 0 ){
531		alert("선택한 항목이 없습니다");
532		return;
533	}
534
535
536	var ref = link + "&uid=" + Itemlist;
537	window.location = ref;
538
539}
540
541
542
543//게시판 글 등록 체크
544function boardDelcheck(){
545
546	if(isBlank(signform.pass.value)) {
547		alert("비밀번호를 입력해 주세요.");
548		signform.pass.focus();
549		return false;
550	}
551
552	signform.submit();
553
554}
555
556
557
558
559function isBlank(str) {
560    str = str.replace(/\s/g, '');
561    return (str.length==0);
562}
563
564//이미지 포맷 체크 함수
565function Check_Img(obj) {
566
567	var no = obj.value.lastIndexOf(".");
568	var file_name = obj.value.substr(no+1, 3);
569
570	if (!((file_name.toUpperCase() == "JPG") || (file_name.toUpperCase() == "GIF")))	{
571		return false;
572	}
573
574	return true;
575}
576
577// 게시판 글 삭제 한다 (페이지수,게시물번호)
578function contentDel(val){
579	temp = confirm("삭제 하겠습니까?");
580	if(temp == true) {
581		window.location = val;
582	} else {
583		return;
584	}
585}
586
587
588// 게시판 수정 한다 (변수,경고글)
589function contentModify(val,cont){
590	temp = confirm(cont);
591	if(temp == true) {
592		window.location = val;
593	} else {
594		return;
595	}
596}
597
598// 게시판 수정 한다 (변수,경고글)
599function contentModify_form(val,cont){
600	temp = confirm(cont);
601	if(temp == true) {
602		signform.action = val;
603		signform.target = "_self";
604		signform.method ="post";
605		signform.submit();
606	} else {
607		return;
608	}
609}
610
611
612
613
614//댓글 게시판 글 등록
615function memoCheck(){
616
617	if(memoform.uname){
618		if(isBlank(memoform.uname.value)) {
619			alert("이름을 입력해 주세요.");
620			memoform.uname.focus();
621			return;
622		}
623	}
624
625
626	if(memoform.pass){
627		if(isBlank(memoform.pass.value)) {
628			alert("비밀번호를 입력해 주세요.");
629			memoform.pass.focus();
630			return;
631		}
632	}
633
634
635	if(isBlank(memoform.content.value)) {
636		alert("내용을 입력해 주세요.");
637		memoform.content.focus();
638		return;
639	}
640
641	memoform.submit();
642}
643
644
645
646function showhide(what,num) {
647
648	if (what.style.display=='') {
649		closewhide(what);
650	return ;
651	}
652
653	for(j=1;j>=30;j++) {
654		if(j<=num)
655			menu_cont_+j+'.style.display=none';
656	}
657	if (what.style.display=='none') {
658		what.style.display='';
659	}
660}
661
662//이용후기 내용 감추기
663function closewhide(what) {
664	what.style.display='none';
665}
666
667//메일 직업입력 부분
668function changeEmail ( email ) {
669
670	if(email == "1") {
671		//document.getElementById("email2").style.display = "block";
672		document.signform.uemail2.value = "";
673	} else {
674		//document.getElementById("email2").style.display = "none";
675		document.signform.uemail2.value = email;
676	}
677}
678
679function changeEmail_1 ( email ) {
680	if(email == "1") {
681		document.signform_1.uemail2_1.value = "";
682	} else {
683		document.signform_1.uemail2_1.value = email;
684	}
685}
686
687function changeEmail_parent ( email ) {
688	if(email == "1") {
689		document.signform.parent_email2.value = "";
690	} else {
691		document.signform.parent_email2.value = email;
692	}
693}
694
695
696//파일 업로드 체크
697function file_upload() {
698	obj = document.getElementById('fileupload');
699	var filename = $(obj).val().substring($(obj).val().lastIndexOf('\\')+1);
700
701	var ext = filename.substring(filename.lastIndexOf('.')+1).toLowerCase();
702
703
704	if(!ext) {
705		alert("파일을 선택해 주세요.");
706		return;
707	}
708
709	if(ext == "xls" || ext == "txt" || ext == "csv") {
710		//alert("업로드 가능");
711		frm_up.submit();
712	} else {
713		alert("업로드가능한 파일이 아닙니다. 다시 선택해 주세요.");
714		frm_up.fileupload.focus();
715		return;
716	}
717
718}
719
720//파일 업로드 체크
721function csv_file_upload() {
722	obj = document.getElementById('fileupload');
723	var filename = $(obj).val().substring($(obj).val().lastIndexOf('\\')+1);
724
725	var ext = filename.substring(filename.lastIndexOf('.')+1).toLowerCase();
726
727
728	if(!ext) {
729		alert("파일을 선택해 주세요.");
730		return;
731	}
732	if(ext == "csv") {
733		//alert("업로드 가능");
734		frm_up.submit();
735	} else {
736		alert("csv 파일만 업로드 가능합니다. 확인해 주세요.");
737		frm_up.fileupload.focus();
738		return;
739	}
740
741}
742
743//문자열 길이 체크 (글자수길이,변수명)
744function CheckMsg(lenval,nameval) {
745	var str,msg;
746	var len = 0;
747	var temp;
748	var count = 0;
749
750	var msg = $('#'+nameval).val();
751	str = new String(msg);
752	len = str.length;
753
754	for (k=0 ; k<len ; k++){
755		temp = str.charAt(k);
756		if (escape(temp).length > 4) {
757			count += 2;
758		}
759		else if (temp == '\r' && str.charAt(k+1) == '\n') { // \r\n일 경우
760			count += 2;
761		}
762		else if (temp != '\n') {
763			count++;
764		}
765	}
766
767	allSend.innerText = count;
768	/*
769	if(count > lenval) {
770		//$('#'+nameval).blur();
771		//$('#'+nameval).focus();
772		CutChar(lenval,nameval);
773	}*/
774}
775
776function CutChar(endval,nameval) {
777	var str,msg;
778	var len=0;
779	var temp;
780	var count;
781	count = 0;
782
783	msg = $('#'+nameval).val();
784	str = new String(msg);
785	len = str.length;
786
787	for(k=0 ; k<len ; k++) {
788		temp = str.charAt(k);
789
790		if(escape(temp).length > 4) {
791			count += 2;
792		}
793		else if (temp == '\r' && str.charAt(k+1) == '\n') { // \r\n일 경우
794			count += 2;
795		}
796		else if(temp != '\n') {
797			count++;
798		}
799		if(count > endval) {
800			str = str.substring(0,k);
801			break;
802		}
803	}
804
805	$('#'+nameval).value = str;
806	alert("내용은 "+endval+"byte 까지만 가능합니다.");
807	//CheckMsg();
808} //end function CutChar() {
809
810
811// Radio(CheckBox) 설정값 가져오기 ##################################################
812function getRadioVal(obj) {
813
814	var i, value = "";
815
816	if (obj) {
817		if (typeof(obj.length) == "undefined") {
818			if (obj.checked) {
819				value = obj.value;
820			}
821		}
822		else {
823			for (i=0; i<obj.length; i++) {
824				if (obj[i].checked) {
825					value = obj[i].value;
826					break;
827				}
828			}
829		}
830	}
831	return value;
832}
833
834// Radio 설정하기 ##################################################
835function setRadioVal(obj, value) {
836	var i;
837
838	if (obj) {
839		if (typeof(obj.length) == "undefined") {
840			if (obj.value == value) {
841				obj.checked = true;
842			}
843		}
844		else {
845			for(i=0; i<obj.length; i++) {
846				if (obj[i].value == value) {
847					obj[i].checked = true;
848					break;
849				}
850			}
851		}
852	}
853}
854
855// 통화형태로 변환 ##################################################
856function toCurrency(obj) {
857	if (obj.disabled) return false;
858
859	var num = obj.value.stripspace();
860	if (num == "") return false;
861
862	if (!checkNum(stripComma(num))) {
863		//alert ("숫자만 입력해주세요.");
864		num = stripCharFromNum(num, false);
865		obj.blur(); obj.focus();
866	}
867	num = stripCharFromNum(stripComma(num), false);
868	num = removePreZero(num);
869	obj.value = formatComma(num);
870}
871
872// 숫자 문자열에서 문자열 제거 ##################################################
873function stripCharFromNum(value, isDec) {
874	var i;
875	var minus = "-";
876	var nums = "1234567890"+((isDec) ? "." : "");
877	var result = "";
878
879	for(i=0; i<value.length; i++) {
880		numChk = value.charAt(i);
881		if (i == 0 && numChk == minus) {
882			result += minus;
883		}
884		else {
885			for(j=0; j<nums.length; j++) {
886				if(numChk == nums.charAt(j)) {
887					result += nums.charAt(j);
888					break;
889				}
890			}
891		}
892	}
893	return result;
894}
895
896// 공백 확인 ##################################################
897function checkEmpty(obj) {
898	if (obj.value.stripspace() == "") {
899		return true;
900	}
901	else {
902		return false;
903	}
904}
905
906
907//메인 로그아웃 처리
908	$(document).ready(function(){
909		$("#main_logout").css("cursor","pointer");
910		$("#main_logout").click(function(){
911				$.ajax({
912					type : "POST"
913					, url : "/INC/userlogin_ajax1.php"
914					, dataType : "JSON"
915					, data : "mode=logout"
916					, success : function(res){
917						if(res.code=="1"){
918							location.replace("/main/main.html");
919						}
920					}
921				});
922		});
923	});
924
925
926function topsearchCheck(){
927	if(!topsearchForm.top_find_word.value){
928		alert("검색어를 입력하세요");
929		topsearchForm.top_find_word.focus();
930		return false;
931	}
932	topsearchForm.submit();
933}
934
935
936//주문자 정보와 동일
937function equal(f) 	{
938	if(f.alter.checked == true) {
939		f.rcvr_name.value=f.buyr_name.value;
940		f.rcvr_tel1.value=f.buyr_tel1.value;
941		f.rcvr_tel2.value=f.buyr_tel2.value;
942
943		f.rcvr_zipx.value=f.uzip.value;
944		f.rcvr_add1.value=f.uaddr1.value;
945		f.rcvr_add2.value=f.uaddr2.value;
946	}else{
947		f.rcvr_name.value="";
948		f.rcvr_tel1.value="";
949		f.rcvr_tel2.value="";
950
951		f.rcvr_zipx.value="";
952		f.rcvr_add1.value="";
953		f.rcvr_add2.value="";
954	}
955}
956
957//수량 변경 하기
958function Cartjumucount(buytype,num,val) {
959	ref="/menu1/cart_basket.php?buytype="+buytype+"&uid="+num+"&jumuncount="+val;
960	window.location = ref;
961}
962
963//선택한 정보 승인
964function selectInfook(link,tit){
965	temp1 = confirm(tit+" 처리 하겠습니까?");
966	if(temp1 == true) {
967		var ref = link;
968		fancyboxOpen_w(ref,'300');
969	} else {
970		return;
971	}
972}  //end function
973
974//경고창 없이 바로 진행
975function selectInfook_ing(link,tit){
976	var ref = link;
977	fancyboxOpen_w(ref,'300');
978}  //end function
979
980
981function checkall_box(frm){
982   var i=0;
983      for(i=1; i<=3; i++){
984         if(frm.yark_all.checked){
985            eval("signform.yark"+i+".checked=true;");
986         }else{
987            eval("signform.yark"+i+".checked=false;");
988      }
989    }
990} //end checkall(frm)
991
992function checkall_box_1(frm){
993   var i=0;
994      for(i=1; i<=6; i++){
995         if(frm.yark_all.checked){
996            eval("signform.yark"+i+".checked=true;");
997         }else{
998            eval("signform.yark"+i+".checked=false;");
999      }
1000    }
1001} //end checkall(frm)
1002
1003
1004
1005$(document).ready(function(){
1006
1007	//체크 박스 전체선택
1008	$("#check_all").click(function() {
1009		//만약 전체 선택 체크박스가 체크된상태일경우
1010		if($("#check_all").prop("checked")) {
1011			//해당화면에 전체 checkbox들을 체크해준다
1012			$("input[type=checkbox]").prop("checked",true);
1013		// 전체선택 체크박스가 해제된 경우
1014		} else {
1015			//해당화면에 모든 checkbox들의 체크를해제시킨다.
1016			$("input[type=checkbox]").prop("checked",false);
1017		}
1018
1019	});
1020
1021});
1022
1023
1024
1025//================= 이미지 사이즈 제한
1026//참고  onChange="choose(this.files,'230','140',this.name,'');"
1027//참고(배열로 하는 경우) id="fileadd1" onChange="choose(this.files,'503','366',this.name,this);"
1028function readImage(file,wf,hf,vname,idname) {
1029
1030	var reader = new FileReader();
1031	var image  = new Image();
1032
1033	reader.readAsDataURL(file);
1034	reader.onload = function(_file) {
1035		image.src    = _file.target.result;              // url.createObjectURL(file);
1036		image.onload = function() {
1037			var w = this.width,
1038				h = this.height,
1039				t = file.type,                           // ext only: // file.type.split('/')[1],
1040				n = file.name,
1041				s = ~~(file.size/1024) +'KB';
1042
1043				wwd = wf;	//원하는 사이즈
1044				hhd = hf;	//원하는 사이즈
1045
1046			//이미지가로사이즈가지정한사이즈보다클때메세지와함께폼전송을중지합니다.
1047			if(w != wwd) {
1048				alert('첨부한 이미지의 가로 사이즈는'+w+'입니다.\n\n이미지의 가로 사이즈는'+wwd+'이어야 합니다.');
1049				if(idname) {
1050					 document.getElementById(idname).value= ""; //아이디가 있는경우 아이값 변경
1051					//eval("signform."idname+".value=''");
1052				} else {
1053					eval("signform."+vname+".value=''");
1054				}
1055				//$('.choose').val("ssss");
1056				//$('#form_id input[type="text"]').val("");
1057				return false;
1058			}
1059
1060			if(hhd=="all") {
1061				//all 인경우 상관없이 올릴수 있다.
1062			} else {
1063				//이미지세로사이즈가지정한사이즈보다클때메세지와함께폼전송을중지합니다.
1064				if(h != hhd) {
1065					alert('첨부한 이미지의 세로 사이즈는'+h+'입니다.\n\n이미지의 세로 사이즈는'+hhd+'이어야  합니다.');
1066					return false;
1067				}
1068
1069			}
1070
1071			//$('#uploadPreview').append('<img src="'+ this.src +'"> '+w+'x'+h+' '+s+' '+t+' '+n+'<br>');
1072		};
1073		image.onerror= function() {
1074			alert("jpg,gif,png,jpeg 만 업로드 가능합니다.");
1075		};
1076	};
1077
1078}
1079function choose(F,wf,hf,vname,idname) {
1080	if(idname) {
1081		idname = document.getElementById(idname.getAttribute('id')).getAttribute('id');
1082	}
1083
1084	//var F = this.files;
1085	if(F && F[0]) for(var i=0; i<F.length; i++) readImage( F[i],wf,hf,vname,idname);
1086}
1087//================= END 이미지 사이즈 제한
1088
1089// 선택 게시물 디비 처리 한다 (변수,경고글)
1090function contentChange(val,cont){
1091	temp = confirm(cont);
1092	if(temp == true) {
1093		window.location = val;
1094	} else {
1095		return;
1096	}
1097}
1098
1099
1100
1101//================== sns 보내기2  =============
1102function sendSns(sns, url, txt, isApp){
1103    var o;
1104    var _url = encodeURIComponent(url);
1105    var _txt = encodeURIComponent(txt);
1106    var _br  = encodeURIComponent('\r\n');
1107
1108    switch(sns)
1109    {
1110        case 'facebook':
1111            o = {
1112                method:'popup',
1113                url:'http://www.facebook.com/sharer/sharer.php?u=' + _url
1114            };
1115            break;
1116
1117        case 'twitter':
1118            o = {
1119                method:'popup',
1120                url:'http://twitter.com/intent/tweet?text=' + _txt + '&url=' + _url
1121            };
1122            break;
1123
1124        case 'me2day':
1125            o = {
1126                method:'popup',
1127                url:'http://me2day.net/posts/new?new_post[body]=' + _txt + _br + _url + '&new_post[tags]=epiloum'
1128            };
1129            break;
1130
1131        case 'blog':
1132            o = {
1133                method:'popup',
1134                url:'http://blog.naver.com/openapi/share?title=' + _txt + '&url=' + _url
1135            };
1136            break;
1137
1138        case 'kakaostory':
1139            o = {
1140                method:'web2app',
1141                param:'posting?post=' + _txt + _br + _url + '&apiver=1.0&appver=2.0&appid=freewebclub.com',
1142                a_store:'itms-apps://itunes.apple.com/app/id486244601?mt=8',
1143                g_store:'market://details?id=com.kakao.story',
1144                a_proto:'storylink://',
1145                g_proto:'scheme=kakaolink;package=com.kakao.story'
1146            };
1147            break;
1148
1149        case 'band':
1150            o = {
1151                method:'web2app',
1152                param:'create/post?text=' + _txt + _br + _url,
1153                a_store:'itms-apps://itunes.apple.com/app/id542613198?mt=8',
1154                g_store:'market://details?id=com.nhn.android.band',
1155                a_proto:'bandapp://',
1156                g_proto:'scheme=bandapp;package=com.nhn.android.band'
1157            };
1158            break;
1159
1160		case 'kakaotalk':
1161            o = {
1162                method:'web2app',
1163                param:'kakaolink://send?msg=' + _txt + '&url=' + _url + '&type=link&apiver=2.0.1&appver=2.0&appid=freewebclub.com',
1164                a_store:'itms-apps://itunes.apple.com/app/id362057947?mt=8',
1165                g_store:'market://details?id=com.kakao.talk',
1166                a_proto:'kakaolink://',
1167                g_proto:'scheme=kakaolink;package=com.kakao.talk'
1168            };
1169            break;
1170
1171        default:
1172            alert('지원하지 않는 SNS입니다.');
1173            return false;
1174    }
1175
1176	if( isApp == "Y" )
1177		o.method = "app";
1178
1179    switch(o.method)
1180    {
1181		case "app" : location.href = "link://?url=" + o.url; break;
1182
1183        case 'popup':
1184            window.open(o.url);
1185            break;
1186
1187        case 'web2app':
1188            if(navigator.userAgent.match(/android/i)){
1189                // Android
1190				//alert( "intent://" + o.param + "#Intent;" + o.g_proto + ";end" );
1191                setTimeout(function(){ location.href = 'intent:' + o.param + '#Intent;' + o.g_proto + ';end'}, 100);
1192            } else if(navigator.userAgent.match(/(iphone)|(ipod)|(ipad)/i)) {
1193                // Apple
1194                setTimeout(function(){ location.href = o.a_store; }, 200);
1195                setTimeout(function(){ location.href = o.a_proto + o.param }, 100);
1196            } else {
1197                alert('이 기능은 모바일에서만 사용할 수 있습니다.');
1198            }
1199        break;
1200    }
1201}
1202//================== END sns 보내기2  =============
1203
1204//================== sns 보내기3  =============
1205function sendSns3(sns, url, txt, isApp){
1206    var o;
1207    var _url = encodeURIComponent(url);
1208    var _txt = encodeURIComponent(txt);
1209    var _br  = encodeURIComponent('\r\n');
1210
1211    switch(sns) {
1212        case 'facebook':
1213			url = 'http://www.facebook.com/sharer/sharer.php?u=' + _url
1214			window.location = url;
1215
1216        break;
1217        case 'twitter':
1218
1219			url = 'http://twitter.com/intent/tweet?text=' + _txt + '&url=' + _url
1220			window.location = url;
1221        break;
1222        default:
1223            alert('지원하지 않는 SNS입니다.');
1224            return false;
1225    }
1226}
1227
1228
1229function sendLink(v,t,img) {
1230  var kakaokey = "42b25d275e5f1b1e04554123b1a5ce17";
1231  if(kakaokey==""){
1232    alert('발급받은 API키가 등록되지 않았습니다.');
1233    return;
1234  }
1235  Kakao.init(kakaokey);
1236  var _title = t;
1237  var _description = $('#metadescription').attr('content');
1238  var _button = "보러 가기";
1239  var _link = v;
1240
1241  //var img = $('#metaimage').attr('content');
1242  if (!img) img = $('#metaimage').attr('content');
1243
1244  Kakao.Link.sendDefault({
1245    objectType: 'feed',
1246    content: {
1247      title: _title,
1248      description: _description,
1249      imageUrl: img,
1250      link: {
1251        mobileWebUrl: _link,
1252        webUrl: _link
1253      }
1254    },
1255    buttons: [
1256      {
1257        title: _button,
1258        link: {
1259    mobileWebUrl: _link,
1260    webUrl: _link
1261        }
1262      }
1263    ]
1264  });
1265}
1266
1267//================ 입력 글자 바이트 출력
1268$(document).ready(function(){
1269	$('input.write_byte').keyup(function(){
1270	bytesHandler(this);
1271	});
1272
1273	$('input.write_byte2').keyup(function(){
1274	bytesHandler2(this);
1275	});
1276});
1277function bytesHandler(obj){
1278	var text = $(obj).val();
1279	$('span.bytes').text(getTextLength(text));
1280}
1281function bytesHandler2(obj){
1282	var text = $(obj).val();
1283	$('span.bytes2').text(getTextLength(text));
1284}
1285
1286function getTextLength(str) {
1287	var len = 0;
1288	for (var i = 0; i < str.length; i++) {
1289		if (escape(str.charAt(i)).length == 6) {
1290		len++;
1291	}
1292		len++;
1293	}
1294		return len;
1295}
1296
1297//================ END 입력 글자 바이트 출력
1298
1299
1300//============= 클립보드 복사
1301function CopyToClipboard ( tagToCopy, textarea ){
1302
1303		textarea.parentNode.style.display = "block";
1304
1305		var textToClipboard = "";
1306		if ( "value" in tagToCopy ){    textToClipboard = tagToCopy.value;    }
1307		else {    textToClipboard = ( tagToCopy.innerText ) ? tagToCopy.innerText : tagToCopy.textContent;    }
1308
1309		var success = false;
1310
1311		if ( window.clipboardData ){
1312				window.clipboardData.setData ( "Text", textToClipboard );
1313				success = true;
1314		}
1315		else {
1316				textarea.value = textToClipboard;
1317
1318				var rangeToSelect = document.createRange();
1319
1320				rangeToSelect.selectNodeContents( textarea );
1321
1322				var selection = window.getSelection();
1323				selection.removeAllRanges();
1324				selection.addRange( rangeToSelect );
1325
1326				success = true;
1327
1328				try {
1329					if ( window.netscape && (netscape.security && netscape.security.PrivilegeManager) ){
1330						netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect" );
1331					}
1332
1333					textarea.select();
1334					success = document.execCommand( "copy", false, null );
1335				}
1336				catch ( error ){  success = false;  }
1337		}
1338
1339		textarea.parentNode.style.display = "none";
1340		textarea.value = "";
1341
1342		if ( success ){ alert( ' 클립보드에 복사되었습니다. \n "Ctrl+v"를 사용하여 원하는 곳에 붙여넣기 하세요. ' ); }
1343		else {    alert( " 복사하지 못했습니다. " );    }
1344
1345}
1346//============= END 클립보드 복사
1347
1348
1349
1350//숫자와 하이폰만 입력
1351function NumberHipun(check_num){
1352    var inText = check_num;
1353    var ret;
1354    for (var i=0; i<inText.length; i++)  {
1355
1356        ret = inText.charCodeAt(i);
1357        if (ret != 45) {
1358            if ((ret<48) || (ret>57)) {
1359                alert("숫자 또는 - 만 입력 하여 주시기 바랍니다.");
1360                check_num.value = "";
1361                check_num.focus();
1362                return false
1363            }
1364        }
1365    }
1366}
1367
1368/**
1369 * 스텝3 필수 항목 미완료 목록 (옵션 유/무 제외)
1370 * @returns {{ message: string, target: HTMLElement } | null}
1371 */
1372window.interiorStep3CellQty = function (cell) {
1373	if (!cell) return 0;
1374	var qtyEl = cell.querySelector(".opt-qty");
1375	return parseInt((qtyEl && qtyEl.textContent) || "0", 10) || 0;
1376};
1377window.interiorStep3HasExclusiveCabinetChoice = function () {
1378	var grid = document.querySelector(".interior-step-exclusiveselect");
1379	if (!grid) return true;
1380	var picked = false;
1381	grid.querySelectorAll(".opt-cell").forEach(function (cell) {
1382		if (window.interiorStep3CellQty(cell) > 0) picked = true;
1383	});
1384	return picked;
1385};
1386window.interiorStep3HasSelectedOptions = function () {
1387	var selected = false;
1388	document.querySelectorAll(".interior-step-optiongrid .opt-cell, .interior-step-exclusiveselect .opt-cell").forEach(function (cell) {
1389		if ((cell.getAttribute("data-opt-key") || "") === "none") return;
1390		if (window.interiorStep3CellQty(cell) > 0) selected = true;
1391	});
1392	return selected;
1393};
1394
1395window.interiorStep3PhotoLineCount = function (line) {
1396	var list = line && line.querySelector(".interior-photo-filelisting");
1397	if (!list) return 0;
1398	return list.querySelectorAll(".interior-photo-filebadge:not(.interior-photo-filebadge--pending)").length;
1399};
1400
1401window.interiorStep3PhotoLineMinCount = function (line) {
1402	var min = parseInt((line && line.getAttribute("data-min-count")) || "1", 10);
1403	return isNaN(min) || min < 1 ? 1 : min;
1404};
1405
1406window.interiorStep3PhotoLineHasUpload = function (line) {
1407	return window.interiorStep3PhotoLineCount(line) >= window.interiorStep3PhotoLineMinCount(line);
1408};
1409
1410window.interiorStep3SyncKitchenPhotoRequired = function () {
1411	var line = document.querySelector(".interior-photo-uploadline.interior-photo-kitchenupload")
1412		|| document.querySelector(".interior-photo-uploadblock .interior-photo-uploadline");
1413	if (!line) return;
1414	var ok = window.interiorStep3PhotoLineHasUpload(line);
1415	var min = window.interiorStep3PhotoLineMinCount(line);
1416	line.classList.toggle("is-required", !ok);
1417	line.classList.toggle("interior-photo-kitchenupload--required", !ok);
1418	var input = line.querySelector(".interior-photo-filehidden");
1419	if (input) {
1420		if (ok) {
1421			input.removeAttribute("required");
1422			if (typeof input.setCustomValidity === "function") input.setCustomValidity("");
1423		} else {
1424			input.setAttribute("required", "required");
1425			if (typeof input.setCustomValidity === "function") {
1426				input.setCustomValidity("주방 전체 사진을 최소 " + min + "장 이상 첨부해주세요.");
1427			}
1428		}
1429	}
1430};
1431
1432window.interiorStep3HasRequiredPhotos = function () {
1433	var block = document.querySelector(".interior-photo-uploadblock");
1434	if (!block) return false;
1435	var lines = block.querySelectorAll(".interior-photo-uploadline");
1436	if (!lines.length) return false;
1437	var ok = true;
1438	lines.forEach(function (line) {
1439		if (!window.interiorStep3PhotoLineHasUpload(line)) ok = false;
1440	});
1441	window.interiorStep3SyncKitchenPhotoRequired();
1442	return ok;
1443};
1444
1445window.interiorStep3SyncOptionPhotoRequiredStar = function () {
1446	var line = document.querySelector(".interior-photo-uploadline.interior-photo-optionupload")
1447		|| document.querySelector(".interior-photo-uploadline.interior-photo-finalupload");
1448	if (!line) return;
1449	var needStar = window.interiorStep3HasSelectedOptions();
1450	line.classList.toggle("interior-photo-optionupload--required", needStar);
1451	line.classList.toggle("interior-photo-finalupload--required", needStar);
1452	var headrow = line.querySelector(".interior-photo-headrow");
1453	if (!headrow) return;
1454	var star = headrow.querySelector(".interior-photo-starlabel, .interior-photo-starblank");
1455	var starHtml = needStar
1456		? '<span class="interior-photo-starlabel" aria-hidden="true">*</span>'
1457		: '<span class="interior-photo-starblank" aria-hidden="true">*</span>';
1458	if (star) {
1459		star.outerHTML = starHtml;
1460	} else {
1461		headrow.insertAdjacentHTML("afterbegin", starHtml);
1462	}
1463};
1464
1465window.interiorStep3OnExtraOptionChange = function () {
1466	window.interiorStep3SyncOptionPhotoRequiredStar();
1467};
1468
1469if (window.__interiorStep3PhotoUploadRequiredHandler) {
1470	document.removeEventListener("interior-step3-upload", window.__interiorStep3PhotoUploadRequiredHandler, true);
1471}
1472window.__interiorStep3PhotoUploadRequiredHandler = function () {
1473	window.interiorStep3SyncKitchenPhotoRequired();
1474};
1475document.addEventListener("interior-step3-upload", window.__interiorStep3PhotoUploadRequiredHandler, true);
1476if (document.readyState === "loading") {
1477	document.addEventListener("DOMContentLoaded", window.interiorStep3SyncKitchenPhotoRequired);
1478} else {
1479	window.interiorStep3SyncKitchenPhotoRequired();
1480}
1481
1482window.interiorStep3FindMissingRequirements = function () {
1483	var missing = [];
1484	var firstTarget = null;
1485
1486	function add(label, action, target) {
1487		missing.push({ label: label, action: action });
1488		if (!firstTarget && target) {
1489			firstTarget = target;
1490		}
1491	}
1492
1493	function formatItemMessage(item) {
1494		var lbl = String(item.label || "").trim();
1495		if (!lbl) return "";
1496		if (item.action === "첨부") {
1497			if (/첨부해주세요\.?$/.test(lbl)) {
1498				return lbl.replace(/\.?$/, ".");
1499			}
1500			return lbl + "을(를) 첨부해주세요.";
1501		}
1502		return lbl + "을(를) " + item.action + "해주세요.";
1503	}
1504
1505	if (!document.querySelector(".interior-step-sizechoice .pair-btn.on")) {
1506		add("평형대", "선택", document.querySelector('.flow-stack[data-step="1"]'));
1507	}
1508	if (!document.querySelector(".interior-step-lengthchoice .pair-btn.on")) {
1509		add("싱크대 길이", "선택", document.querySelector('.flow-stack[data-step="2"]'));
1510	}
1511	if (!window.interiorStep3HasExclusiveCabinetChoice()) {
1512		add("옵션(선택없음/상부장만/하부장만)", "선택", document.querySelector(".interior-step-exclusiveselect") || document.querySelector('.flow-stack[data-step="3"]'));
1513	}
1514	if (!document.querySelector(".interior-color-swatchblock .sim-swatch.on")) {
1515		add("컬러", "선택", document.querySelector('.flow-stack[data-step="4"]'));
1516	}
1517
1518	var photoBlock = document.querySelector(".interior-photo-uploadblock");
1519	if (photoBlock) {
1520		photoBlock.querySelectorAll(".interior-photo-uploadline").forEach(function (line) {
1521			if (window.interiorStep3PhotoLineHasUpload(line)) return;
1522			var min = window.interiorStep3PhotoLineMinCount(line);
1523			var label = min > 1
1524				? "주방 전체 사진을 최소 " + min + "장 이상 첨부해주세요."
1525				: "주방 전체 사진";
1526			add(label, "첨부", line);
1527		});
1528	}
1529
1530	if (missing.length < 1) return null;
1531
1532	var message;
1533	if (missing.length === 1) {
1534		message = formatItemMessage(missing[0]);
1535	} else {
1536		message =
1537			"다음 항목을 완료해주세요.\n\n" +
1538			missing
1539				.map(function (item) {
1540					return "· " + formatItemMessage(item);
1541				})
1542				.join("\n");
1543	}
1544
1545	return {
1546		message: message,
1547		target: firstTarget || document.querySelector('.flow-stack[data-step="5"]'),
1548	};
1549};
1550
1551/** 스텝3 미완료 항목 위치로 스크롤 */
1552window.interiorStep3ScrollToTarget = function (target) {
1553	if (!target || typeof target.scrollIntoView !== "function") return;
1554	target.scrollIntoView({ behavior: "smooth", block: "center" });
1555};
1556
1557/** 스텝3 다음 버튼 비활성 클릭 시 알림 + 해당 위치 이동 */
1558window.interiorStep3AlertMissingAndScroll = function () {
1559	var miss = window.interiorStep3FindMissingRequirements && window.interiorStep3FindMissingRequirements();
1560	if (!miss) return false;
1561	alert(miss.message);
1562	if (window.interiorStep3ScrollToTarget) {
1563		window.interiorStep3ScrollToTarget(miss.target);
1564	}
1565	return true;
1566};
1567
1568/**
1569 * 인테리어 견적: 스텝3→4-write 이동 시 세션(interior_estimate_pending_cart)에만 옵션·금액 저장 후 이동. 장바구니 DB 반영은 4-write 접수 시.
1570 * @param {string} href
1571 * @param {{ linkNext?: HTMLElement, totalSelector?: string }} opts
1572 */
1573window.interiorEstimateEnsureCartThenNavigate = function (href, opts) {
1574	opts = opts || {};
1575	href = href || "./interior-step4-write.html";
1576	var linkNext = opts.linkNext;
1577	var pcode = parseInt(document.body.getAttribute("data-interior-pcode") || "0", 10) || 0;
1578	var totalEl = document.querySelector(opts.totalSelector || ".interior-step-estimatesample");
1579	var buyprice =
1580		parseInt(
1581			totalEl && totalEl.textContent ? String(totalEl.textContent).replace(/\D/g, "") : "0",
1582			10
1583		) || 0;
1584	if (!pcode) {
1585		alert("상품 정보가 없습니다.");
1586		return;
1587	}
1588	if (buyprice < 1) {
1589		alert("예상 견적 금액을 확인할 수 없습니다.");
1590		return;
1591	}
1592	function restoreNext() {
1593		if (linkNext) {
1594			linkNext.classList.add("active");
1595			linkNext.setAttribute("tabindex", "0");
1596			linkNext.removeAttribute("aria-disabled");
1597		}
1598	}
1599	if (typeof jQuery === "undefined") {
1600		alert("페이지 로드가 완료된 후 다시 시도해 주세요.");
1601		return;
1602	}
1603	if (linkNext) {
1604		linkNext.classList.remove("active");
1605		linkNext.setAttribute("aria-disabled", "true");
1606		linkNext.setAttribute("tabindex", "-1");
1607	}
1608
1609	function collectSelectedInteriorOptions() {
1610		var map = {};
1611		function add(uid, qty) {
1612			uid = parseInt(uid || "0", 10) || 0;
1613			qty = parseInt(qty || "0", 10) || 0;
1614			if (uid < 1 || qty < 1) return;
1615			if (!map[uid]) map[uid] = 0;
1616			map[uid] += qty;
1617		}
1618
1619		// 수량형 옵션(예: 아일랜드/키큰장 등)
1620		document.querySelectorAll(".interior-step-optiongrid .opt-cell, .interior-step-exclusiveselect .opt-cell").forEach(function (cell) {
1621			if ((cell.getAttribute("data-opt-key") || "") === "none") return;
1622			var uid = parseInt(cell.getAttribute("data-option-uid") || "0", 10) || 0;
1623			var qtyEl = cell.querySelector(".opt-qty");
1624			var qty = parseInt((qtyEl && qtyEl.textContent) || "0", 10) || 0;
1625			var label = (cell.getAttribute("data-option-label") || "").replace(/\s+/g, "");
1626			if (label === "상부장만" || label === "하부장만") {
1627				qty = qty > 0 ? 1 : 0;
1628			}
1629			add(uid, qty);
1630		});
1631
1632		// 단일 선택형 옵션(평형/길이 등)
1633		document.querySelectorAll(".pair-btn.on[data-option-uid]").forEach(function (btn) {
1634			add(btn.getAttribute("data-option-uid"), 1);
1635		});
1636
1637		// step1 도어 옵션
1638		document.querySelectorAll(".pair-btn.on[data-door-option-uid]").forEach(function (btn) {
1639			add(btn.getAttribute("data-door-option-uid"), 1);
1640		});
1641
1642		// step2 구조 옵션
1643		document.querySelectorAll(".pair-btn.on[data-shape-option-uid]").forEach(function (btn) {
1644			add(btn.getAttribute("data-shape-option-uid"), 1);
1645		});
1646
1647		// 색상 선택
1648		document.querySelectorAll(".sim-swatch.on[data-option-uid]").forEach(function (btn) {
1649			add(btn.getAttribute("data-option-uid"), 1);
1650		});
1651
1652		// 투톤 선택(선택한 경우만 uid>0)
1653		document.querySelectorAll(".interior-color-optionchoice.is-on[data-option-uid]").forEach(function (btn) {
1654			add(btn.getAttribute("data-option-uid"), 1);
1655		});
1656
1657		var arr = [];
1658		Object.keys(map).forEach(function (k) {
1659			arr.push({
1660				option_uid: parseInt(k, 10),
1661				jumuncount: map[k]
1662			});
1663		});
1664		return arr;
1665	}
1666
1667	/** 스텝3 시공 범위(상·하부 전체 / 상부장만 / 하부장만) */
1668	function collectInteriorCabinetScopeLabel() {
1669		var grid = document.querySelector(".interior-step-exclusiveselect");
1670		if (!grid) return "상 · 하부장 전체시공";
1671		var picked = "";
1672		grid.querySelectorAll(".opt-cell").forEach(function (cell) {
1673			if ((cell.getAttribute("data-opt-key") || "") === "none") return;
1674			var qty = parseInt((cell.querySelector(".opt-qty") || {}).textContent || "0", 10) || 0;
1675			if (qty > 0) {
1676				picked = (cell.getAttribute("data-option-label") || "").trim();
1677			}
1678		});
1679		if (picked === "상부장만" || picked === "하부장만") return picked;
1680		return "상 · 하부장 전체시공";
1681	}
1682
1683	/** 스텝3 투톤 입력 → 장바구니 투톤 옵션 행 field_etc_01~08 저장용 POST (필드 매트릭스 숨김이면 전부 빈값) */
1684	function collectInteriorTwotoneForCartPost() {
1685		var keys = [
1686			"twotone_upper",
1687			"twotone_lower",
1688			"twotone_island",
1689			"twotone_tall",
1690			"twotone_fridge",
1691			"twotone_pantry",
1692			"twotone_balcony",
1693			"twotone_entrance",
1694		];
1695		var out = {};
1696		var matrix = document.querySelector(".interior-color-fieldmatrix");
1697		var ttRoot = document.querySelector(".interior-color-twotoneblock");
1698		var useActiveAttr = !!(ttRoot && ttRoot.hasAttribute("data-twotone-yes-uid"));
1699		var ttActive = useActiveAttr && ttRoot.getAttribute("data-twotone-active") === "1";
1700		var hidden = matrix && matrix.classList.contains("hide");
1701		keys.forEach(function (name) {
1702			if (hidden || (useActiveAttr && !ttActive)) {
1703				out[name] = "";
1704				return;
1705			}
1706			var el = document.querySelector('.interior-color-fieldinput[name="' + name + '"]');
1707			out[name] = el && el.value != null ? String(el.value).trim() : "";
1708		});
1709		if (useActiveAttr) {
1710			out.twotone_option_uid = String(
1711				parseInt(
1712					ttRoot.getAttribute(ttActive ? "data-twotone-yes-uid" : "data-twotone-no-uid"),
1713					10
1714				) || 0
1715			);
1716		} else {
1717			var ttOn = ttRoot && ttRoot.querySelector(".interior-color-optionchoice.is-on[data-option-uid]");
1718			out.twotone_option_uid =
1719				ttOn && ttOn.getAttribute("data-option-uid") != null
1720					? String(parseInt(ttOn.getAttribute("data-option-uid"), 10) || 0)
1721					: "0";
1722		}
1723		return out;
1724	}
1725
1726	// debug hooks removed
1727
1728	function runInteriorCartSave() {
1729		var selectedOptions = collectSelectedInteriorOptions();
1730		var tw = collectInteriorTwotoneForCartPost();
1731		var payload = $.extend(
1732			{
1733				formmode: "interior_estimate_pending_cart_payload_save",
1734				pcode: pcode,
1735				buytype: "basket",
1736				buyprice: buyprice,
1737				options_json: JSON.stringify(selectedOptions),
1738				cabinet_scope: collectInteriorCabinetScopeLabel(),
1739			},
1740			tw
1741		);
1742
1743		function sendPendingPayload(payload, triesLeft, delayMs) {
1744			triesLeft = typeof triesLeft === 'number' ? triesLeft : 3;
1745			delayMs = typeof delayMs === 'number' ? delayMs : 500;
1746			$.ajax({
1747				type: "POST",
1748				url: "/lib/board/board_ajax_proc_front.php",
1749				dataType: "json",
1750				data: payload,
1751				success: function (pendingRes) {
1752					if (pendingRes && String(pendingRes.code) === "1") {
1753						window.location.href = href;
1754						return;
1755					}
1756					// server returned non-success — only retry on network-like failures, otherwise show message
1757					if (triesLeft > 1) {
1758						setTimeout(function () {
1759							sendPendingPayload(payload, triesLeft - 1, delayMs);
1760						}, delayMs);
1761					} else {
1762						restoreNext();
1763						alert(pendingRes && pendingRes.data ? pendingRes.data : "임시 저장에 실패했습니다.");
1764					}
1765				},
1766				error: function () {
1767					if (triesLeft > 1) {
1768						setTimeout(function () {
1769							sendPendingPayload(payload, triesLeft - 1, delayMs);
1770						}, delayMs);
1771					} else {
1772						restoreNext();
1773						alert("요청 중 오류가 발생했습니다.");
1774					}
1775				}
1776			});
1777		}
1778
1779		// start with 3 attempts
1780		sendPendingPayload(payload, 3, 500);
1781	}
1782
1783	if (typeof window.interiorStep3SaveDoorFlow === "function") {
1784		window.interiorStep3SaveDoorFlow(runInteriorCartSave, restoreNext);
1785		return;
1786	}
1787	runInteriorCartSave();
1788};
1789
1790$(document).on("click", ".interior-step-cart-submit", function (e) {
1791	e.preventDefault();
1792	var pcode = $(this).data("pcode") || "";
1793	var optionUid = $(this).data("optionUid") || 0;
1794	var jumuncount = $(this).data("jumuncount") || 1;
1795	var buyprice = $(this).data("buyprice") || 0;
1796
1797	if (!pcode) {
1798		alert("상품 정보가 없어 장바구니에 담을 수 없습니다.");
1799		return false;
1800	}
1801
1802	$.ajax({
1803		type: "POST",
1804		url: "/lib/board/board_ajax_proc_front.php",
1805		dataType: "json",
1806		data: {
1807			formmode: "interior_cart_add",
1808			pcode: pcode,
1809			option_uid: optionUid,
1810			jumuncount: jumuncount,
1811			buyprice: buyprice,
1812			buytype: "basket"
1813		},
1814		success: function (res) {
1815			if (res && String(res.code) === "1") {
1816				window.location.href = "/mypage/";
1817			} else {
1818				alert((res && res.data) ? res.data : "장바구니 담기에 실패했습니다.");
1819			}
1820		},
1821		error: function () {
1822			alert("요청 중 오류가 발생했습니다.");
1823		}
1824	});
1825});

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.