PageSourceSearch

https://nijimori.com/js/member_config.1790659391.js

js nijimori.com collected 2026-10-04 22:01:20 UTC 477,841 bytes, 10,951 lines download raw bytes

1if(typeof LANG == 'undefined') var LANG = getLanguage(); 
2  
3$(window).load(function(data) {
4	setLanguage(LANG);
5	collectionSortable();
6});
7
8$(function() {
9	$('.pageIcon.nonpage a[href="#"]').click(function(e) {
10		e.preventDefault();
11	});
12
13	$.fheader = {
14		refreshFixedSub: function() {
15			// console.log('refreshFixedSub');
16			//ver4 ( ver3 + menu height )
17
18			var body_width = (PAGE_MODE == 'c') ? $('body').width() : window.innerWidth,
19				$fh = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
20				fh_type = $fh.attr('data-fh-type'),
21				fh_postion = (typeof $fh.attr('data-position') != 'undefined') ? $fh.attr('data-position') : '',
22				fh_transparent = ($fh.hasClass('transparent')) ? true : false,
23				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
24
25			if( $fh.find('#fixed-menu').length == 0 ||
26				$fh.hasClass('sidebar') ||
27				fh_type != 'right' ||
28				$fh.find(' > .container[data-fh-align]').length == 0
29			) { return false; }
30
31			var fixedSubOn = ($fh.find('.fh-container').css('display') == 'none') ? false : true;
32
33			if(!checkFixTypeMenu && window.innerWidth > 768) {
34				var collapse_w	= $fh.find('.collapse').width(),
35					tpl_nav_w	= $fh.find('#tpl-menu').outerWidth(),
36					fixed_nav_w	= parseInt($fh.find('#fixed-menu').outerWidth()) + parseInt($fh.find('#fixed-menu').css('margin-left')) + parseInt($fh.find('#fixed-menu').css('margin-right')),
37					checkWidth	= (parseInt(collapse_w) < parseInt(tpl_nav_w) + fixed_nav_w) ? true : false;
38
39				if(checkWidth) {
40					var checkOnepx = ((parseInt(tpl_nav_w) + fixed_nav_w) - parseInt(collapse_w) === 1) ? true : false;
41					if(checkOnepx) checkWidth = false;
42				}
43
44				var tpl_nav_cnt	= $fh.find('#tpl-menu > li').length,
45					tpl_nav_th	= (tpl_nav_cnt == 0) ? 0 : $fh.find('#tpl-menu > li').eq(0).position().top,
46					tpl_nav_h	= (tpl_nav_cnt == 0) ? 0 : $fh.find('#tpl-menu > li').eq(tpl_nav_cnt-1).position().top,
47					checkHeight	= (parseInt(tpl_nav_th) != parseInt(tpl_nav_h)) ? true : false;
48
49				if(fixedSubOn) { // aready fixed menu sub show
50					if(!checkWidth && !checkHeight) fixedSubOn = false;
51				} else {
52					if(checkWidth || checkHeight) fixedSubOn = true;
53				}
54			}
55
56			if(fixedSubOn) {
57				if($fh.hasClass('transparent')) {
58					$fh.find('#tpl-menu').addClass('overflow-menu');
59					$fh.find('#fixed-menu').addClass('overflow-menu');
60					$fh.find('#fixed-menu-sub').addClass('overflow-menu');
61				}
62				var fh_nav_pdRight = parseInt($fh.find('#tpl-menu > li > a').css('padding-right')) + parseInt($fh.find('.collapse').css('padding-right')) - 10;
63
64				if($fh.find('.navbar-center').length==0) {
65					if(checkFixTypeMenu) return false;
66					$('#fixed-menu').hide();
67					$('#fixed-menu-sub').closest('.fh-container').eq(0).show().addClass('active');
68				} 
69				
70				$('#fixed-menu-sub').css('margin-right',fh_nav_pdRight+'px');
71			} else {
72				$fh.find('#tpl-menu').removeClass('overflow-menu');
73				$fh.find('#fixed-menu').removeClass('overflow-menu');
74				$fh.find('#fixed-menu-sub').removeClass('overflow-menu');
75
76				$('#fixed-menu').show();
77				$('#fixed-menu-sub').closest('.fh-container').eq(0).hide().removeClass('active');
78			}
79
80			if($fh.hasClass('transparent') && $fh.hasClass('overflow-menu') && !$fh.find('#tpl-menu').hasClass('overflow-menu')) {
81				$fh.find('#tpl-menu').addClass('overflow-menu');
82				$fh.find('#fixed-menu').addClass('overflow-menu');
83				$fh.find('#fixed-menu-sub').addClass('overflow-menu');
84			}
85
86
87			if(PAGE_MODE == 'c') {
88				$('.addElementButton.addel-menu').css('top',$('header.navbar').outerHeight() + 'px');
89			}
90
91			if($('.element[data-feature*=fixedscroll]').length > 0) gjs01SetFixedscroll($('.element[data-feature*=fixedscroll]').eq(0));
92		},
93		init: function(mode) {
94			// console.log('fheader init');
95			var checkElviewer = '';
96			if(window.parent && window.parent != this && $('.elviewhtml').length > 0) {
97				checkElviewer = $('#el-list-image .elgrid.active', window.parent.document).find('.blockname-str').text().trim();
98			}
99
100			var s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
101				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE,
102				checkGabia = (s_service.indexOf('gabia') > -1) ? true : false,
103				checkEllist = (typeof mode != 'undefined' && mode == 'ellist') ? true : false,
104				checkTemplate = (typeof property != 'undefined' && property.TEMPLATE && property.TEMPLATE=='1') ? true : false,
105				sid = (PAGE_MODE == 'c') ? ((checkEllist) ? checkElviewer.replace(/menu-/gi,'') : SID) : property.SID,
106				$pc_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
107				pc_nav_name = (checkEllist) ? $pc_nav.attr('data-name') : 'menu-'+sid,
108				$mobile_nav = $pc_nav.find('#tpl-menu').closest('.navbar-'+pc_nav_name).clone(),
109				checkFixTypeMenu = (typeof $pc_nav.attr('data-fixtype') != 'undefined' && $pc_nav.attr('data-fixtype')) ? true : false;
110
111			if($pc_nav.find('.cl-menu-option').length > 0) $.moption.init(mode);
112
113			$mobile_nav.prop({id:'mobile-nav'}).removeAttr('class').removeAttr('style');
114			
115			if(!$pc_nav.hasClass('navbar-fheader') || (checkFixTypeMenu && $pc_nav.find('.cl-fixed-menu').length>0)) return false;
116			if(!checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
117
118				var fh_sub = '',
119					fh_type = $pc_nav.attr('data-fh-type');
120
121				switch(s_validtype) {
122					case 'FR':
123					case 'BS':
124						fh_sub = '\
125							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
126						';
127						break;
128					case 'BN':
129						fh_sub = '\
130							<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
131							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
132						';
133						break;
134					case 'SM':
135						fh_sub = '\
136							<li class="siteSEARCH"><a href="#"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a></li>\
137							<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
138							<li class="siteCART"><a href="#"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a></li>\
139							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
140						';
141
142
143						/* Shopping Only KO Site */
144						// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
145						// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
146						// 	fh_sub = '\
147						// 	<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
148						// 	<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
149						// 	';
150						// }
151						break;
152					default:
153						break;
154				}
155
156				if(fh_type == 'top') {
157					var menu_container = $pc_nav.find(' > .container').attr('class'),
158						fh_line = '<hr class="fh-line"  style="display: none;"/>',
159						fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
160						fh_content = '\
161							<div class="' + menu_container +' fh-container" style="display: none;">\
162								<div class="navbar-wrap">\
163									<ul class="navbar-nav navbar-top" id="fixed-menu">\
164									' + fh_sub + '\
165									</ul>\
166								</div>\
167							</div>\
168						';
169
170					if($pc_nav.find('.cl-drop-fixed-menu').length > 0) $pc_nav.find('.cl-drop-fixed-menu').remove();
171
172					if($pc_nav.find('.fh-line').length > 0) $pc_nav.find('.fh-line').replaceWith(fh_line);
173					else $pc_nav.prepend(fh_line);
174
175					if($pc_nav.find('#fixed-menu').length > 0) $pc_nav.find('.fh-container').replaceWith(fh_content);
176					else $pc_nav.prepend(fh_content);
177
178
179					if(!checkEllist) {
180						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).find('#fixed-menu').clone());
181						else $mobile_nav.prepend($(fh_content).find('#fixed-menu').clone());
182					}
183
184				} else if(fh_type == 'right' || fh_type == 'sidebar') {
185					var fixed_menu_str = (fh_type == 'sidebar') ? '' : 'navbar-right',
186						fh_line = '<hr class="fh-line visible-xs" style="display: none;"/>',
187						fh_content = '\
188							<ul class="navbar-nav ' + fixed_menu_str + '" id="fixed-menu" style="display: none;">\
189							' + fh_sub + '\
190							</ul>\
191						';
192
193					if(checkEllist) {
194						if(fh_type == 'right' && $pc_nav.find('.mini-home').length > 0) {
195							$pc_nav.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
196						}
197					} else {
198						var fh_container = $pc_nav.find(' > .container[data-fh-align]'),
199							fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
200							fh_content2 = (	fh_type == 'sidebar' || fh_container.length == 0 ) ? '' : '\
201							<div class="' + fh_container.attr('class') +' fh-container" style="display: none;">\
202								<div class="navbar-wrap">\
203									<ul class="navbar-nav navbar-top" id="fixed-menu-sub" style="margin-right: '+fh_nav_pdRight+'px;">\
204										' + fh_sub + '\
205									</ul>\
206								</div>\
207							</div>\
208						';
209					}
210
211					if($pc_nav.find('#fixed-menu').length > 0) $pc_nav.find('#fixed-menu').replaceWith(fh_content);
212					else $pc_nav.find('#tpl-menu').before(fh_content);
213
214					if($pc_nav.find('.fh-line').length > 0) $pc_nav.find('.fh-line').replaceWith(fh_line);
215					else $pc_nav.find('#tpl-menu').before(fh_line);
216
217					if(!checkEllist) {
218						if(fh_content2.length > 0) {
219							if($pc_nav.find('#fixed-menu-sub').length > 0) $pc_nav.find('.fh-container').replaceWith(fh_content2);
220							else $pc_nav.prepend(fh_content2);
221						}
222
223						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).removeAttr('style').clone());
224						else $mobile_nav.prepend($(fh_content).removeAttr('style').clone());
225					}
226
227				}
228			}
229
230			/* 메뉴 ::: 확장기능 버튼 추가 버전(20220928) *********************************************************/
231			if(checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
232				var fh_sub = '',
233					fixbtnData = $.menuFixBtn.getData($pc_nav),
234					parent_dsgnbody = (checkEllist && typeof PAGE_MODE!='undefined' && PAGE_MODE=='c') ? window.parent.document : '',
235					lang_txt = (checkEllist) ? $(parent_dsgnbody).find('header.navbar-fheader .siteLANG.cl-fixbtn').attr('data-fixlang') : '',
236					lang_code = (checkEllist) ? $(parent_dsgnbody).find('header.navbar-fheader .siteLANG.cl-fixbtn').attr('data-fixlangcode') : '',
237					lang_sidebar = (fixbtnData['fh-type']=='sidebar') ? false : true,
238					slang_html = '',
239					lang_str = LANG,
240					validArray = {},
241					validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
242					validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN;
243
244				if(checkEllist && typeof SLANG == 'undefined') {
245					var slang_obj = {
246							use_language : 'off',
247							lists : {},
248							select : lang_txt,
249							select_code : lang_code
250						}
251					SLANG = slang_obj;
252				} else SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
253				
254				if((typeof SLANG != 'undefined' && typeof SLANG.select_code != 'undefined' && SLANG.select_code)
255			                || (!$.isEmptyObject(SLANG) && SLANG.use_language == 'on' && SLANG.select_code)) {
256			        lang_str = (SLANG['select_code'].toLowerCase()!='ko') ? 'en' : 'ko';
257			    } 
258			   
259				var validArray = {
260					'validtype' : validtype,
261					'validplan' : validplan
262				}
263			
264				$mobile_nav.attr('data-fixtype',fixbtnData['fixtype'])
265							.attr('data-fixlangtype',fixbtnData['fixlangtype'])
266							.attr('data-fixsize',fixbtnData['fixsize'])
267							.attr('data-fixlangsize',fixbtnData['fixlangsize']);			
268			
269				if(fixbtnData['fixtypeText']=='top') fh_sub += $.menuFixBtn.topSet(fixbtnData['fixtypeNum'],false,validArray,SLANG);
270				else fh_sub += $.menuFixBtn.sidebarSet(fixbtnData['fixtypeNum'],false,validArray,SLANG); 				
271
272				if(fixbtnData['fh-type'] == 'top') {
273					var menu_container = $pc_nav.find(' > .container').attr('class'),
274						/*fh_line = '<hr class="fh-line"  style="display: none;"/>',*/
275						fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
276						fh_content = '\
277							<div class="' + menu_container +' fh-container">\
278								<div class="navbar-wrap">\
279									<ul class="navbar-nav navbar-top cl-fixed-menu" id="fixed-menu">\
280									' + fh_sub + '\
281									</ul>\
282								</div>\
283							</div>\
284						';
285
286					if($pc_nav.find('input[class*="cl-menu-"]').length > 0) $pc_nav.find('input[class*="cl-menu-"]').last().after(fh_content);
287					else $pc_nav.prepend(fh_content);
288					
289					//if(!checkEllist) {
290						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).find('#fixed-menu').clone());
291						else $mobile_nav.prepend($(fh_content).find('#fixed-menu').clone());
292					//}
293				} else if(fixbtnData['fh-type'] == 'right' || fixbtnData['fh-type'] == 'sidebar') {
294					var fixed_menu_str = (fixbtnData['fh-type'] == 'sidebar') ? '' : 'navbar-right',
295						fh_line = '<hr class="fh-line visible-xs" style="display: none;"/>',
296						fh_content = '\
297							<ul class="navbar-nav ' + fixed_menu_str + ' cl-fixed-menu" id="fixed-menu">\
298							' + fh_sub + '\
299							</ul>\
300						';
301
302					if(checkEllist) {
303						if(fixbtnData['fh-type'] == 'right' && $pc_nav.find('.mini-home').length > 0) {
304							$pc_nav.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
305						}
306					}
307
308					$pc_nav.find('#fixed-menu').remove();
309					$pc_nav.find('#tpl-menu').before(fh_content);
310
311					//if(!checkEllist) {
312						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).removeAttr('style').clone());
313						else {
314							$(fh_content).removeAttr('style').clone();
315							$mobile_nav.prepend($(fh_content).removeAttr('style').clone());
316						}
317					//}
318				}
319
320				/* 메뉴 디자인변경 :: slang make X => fheader init(pc_nav)에서 적용 ***/
321				if(checkEllist) {
322					slang_html = $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],lang_sidebar,SLANG,'',validArray);
323					$pc_nav.find('.siteLANG.cl-fixbtn').remove();
324					(fixbtnData['fh-type']=='sidebar') ? $pc_nav.find('.menu-inner').after(slang_html) : $pc_nav.find('#fixed-menu').append(slang_html);
325											
326					$pc_nav.find('.siteLANG').removeClass('dropup').removeClass('dropdown');
327					$pc_nav.find('.siteLANG .cl-lang').removeClass('dropdown-toggle');
328					$pc_nav.find('.siteLANG .dropdown-menu').remove();
329				}
330			}
331
332			// $mobile_nav.find('#fixed-menu').removeAttr('class');
333			// $mobile_nav.find('#tpl-menu').prop({class:'nav navbar-nav'}).find('ul').prop({class:'',id:''});
334			// $mobile_nav.find('#tpl-menu').removeAttr('class');
335			$mobile_nav.find('#tpl-menu').removeClass('hide').removeClass('preloading');
336			$mobile_nav.find('#tpl-menu').removeAttr('style');
337
338			$mobile_nav.find('.dropdown').not('.siteUM.cl-fixbtn').each(function() {
339				$(this).addClass('menu-has-children').removeClass('dropdown');
340				$(this).find('> a').removeClass('dropdown-toggle');
341				$(this).find('> a i').remove();
342
343				if(($(this).hasClass('active') || $(this).hasClass('open')) && $(this).find('li.active').length > 0) {
344					if($(this).find('li.active').length > 0) $(this).removeClass('active').addClass('open');
345					$(this).find('> a').nextAll('ul').eq(0).slideToggle();
346					$(this).prepend('<i class="fa fa-chevron-up"></i>');
347				} else {
348					$(this).prepend('<i class="fa fa-chevron-down"></i>');
349				}
350			});
351
352			if(checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
353				$mobile_nav.find('#fixed-menu').wrap('<div class="mobilenav_top"></div>');
354				
355				/* 메뉴 디자인변경 :: slang make X => fheader init(mobile_nav)에서 적용 ***/
356				if(checkEllist) {
357					var psearch_ellist = `
358						<li class="siteSEARCH">
359							<a href="javascript:;" class="psearch-btn"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a>
360							<div class="psearch-overlay">
361								<span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
362								<div class="psearch-body">
363									<span class="psearch-wrap">
364										<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
365										<input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
366									</span>
367								</div>
368							</div>
369						</li>
370					`;
371					var sitelangStr = $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false,'',true);
372
373					var hide_UM = (s_validtype=='BN' || s_validtype=='SM') ? '' : 'hide';
374					$mobile_nav.find('.mobilenav_top').prepend('<div class="login-content siteUM"><a href="javascript:;" class="login '+hide_UM+'">' + $.lang[lang_str]['manager.site-um.mobile.login'] + clSVG('select_arrow',16,16) + '</a></div>');
375					if(s_validtype=='SM') {
376						$mobile_nav.find('#fixed-menu .siteSEARCH').replaceWith(psearch_ellist);
377					}
378					if(s_validtype && sitelangStr) $mobile_nav.append(sitelangStr).find('.cl-fixbtn.siteLANG');
379				}
380				//if(checkEllist) $mobile_nav.find('#fixed-menu .mobilenav_top').prepend(ellist_mobile_logincontent);
381			}
382			
383			var fh_line = '<hr class="fh-line" />';
384			(checkFixTypeMenu) ? $mobile_nav.find('.mobilenav_top').after(fh_line) : $mobile_nav.find('#fixed-menu').after(fh_line);
385			//$mobile_nav.find('#tpl-menu').after(fh_line);
386
387			var menu_selector = (checkEllist) ? '.elviewhtml .menu-'+sid : '.el-menu .menu-'+sid,
388				$checkMenuEL = $(menu_selector),
389				check_mobile_design = $checkMenuEL.hasClass('mobile-design-clear') ? false : true,
390				check_mnormal = ($checkMenuEL.find('.cl-menu-normal').length > 0) ? true : false,
391				check_msidebar = ($checkMenuEL.find('.cl-menu-sidebar').length > 0) ? true : false,
392				check_moption = ($checkMenuEL.find('.cl-menu-option').length > 0) ? true : false;
393			if(checkEllist) $mobile_nav.addClass('elview');
394			if(check_moption) $mobile_nav.addClass('moption');
395			else if(check_mnormal) $mobile_nav.addClass('mnormal');
396			else if(check_msidebar) $mobile_nav.addClass('msidebar');
397			if(!check_mobile_design) {
398				$mobile_nav.addClass('mobile-design-clear menu-'+sid);
399				$mobile_nav.find('.menu-has-children > ul').addClass('dropdown-menu');
400			}
401			
402			$('.dsgn-body').append($mobile_nav);
403			$('.dsgn-body').append('<div id="mobile-body-overly"><span class="pull-right hand" id="mobile-nav-toggle"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Menu"></span></div>');
404
405			if(checkTemplate) {
406				$(document).find('#mobile-nav').find('.mobilenav_top').hide();
407				$(document).find('#mobile-nav').find('.mobilenav_top').next('.fh-line').hide();
408			}
409
410			var mobile_selector = (checkEllist) ? ['.elview','.elviewhtml'] : ['','.el-menu'];
411			if(check_moption || check_mnormal || check_msidebar) {
412				
413				mobile_selector[0] += (check_moption) ? '.moption' : ((check_msidebar) ? '.msidebar' : '.mnormal');
414				mobile_selector[1] +=  (check_moption) ? ' .cl-menu-option ~ .container' : ((check_msidebar) ? ' .cl-menu-sidebar ~ .container' : ' .cl-menu-normal ~ .container');
415				
416				var nav_font = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-fname'),
417					nav_color = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-color'),
418					nav_color_active = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-color-active'),
419					nav_fixed_key = (check_mobile_design) ? '--menu-fname' : '--fixed-menu-color',
420					fixed_color = (checkFixTypeMenu) ? getComputedStyle(document.querySelector(menu_selector)).getPropertyValue(nav_fixed_key) : '';
421			} else {
422				var nav_font = (checkFixTypeMenu) ? $('.menu-' + sid + ' ul#tpl-menu > li > a').css('font-family') : $('.menu-' + sid + ' ul.navbar-nav > li > a').css('font-family');
423				if(typeof nav_font != 'undefined' && nav_font) {
424					nav_font = nav_font.replace(/\'/gi,'').replace(/\"/gi,'');
425
426					var nav_color = $('.menu-' + sid + ' ul.navbar-nav > li > a:not(:hover)').css('color'),
427						nav_color_active = $('.menu-' + sid + ' ul.navbar-nav > li.active > a').css('color'),
428						fixed_color = '';
429					if(checkFixTypeMenu) {
430						fixed_color = ($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? $('.menu-' + sid + ' ul.cl-fixed-menu >
430 li.cl-fixbtn a').css('color') : $('.el-menu .navbar-toggle .icon-bar').css('background-color');
431					}
432				}
433
434				if(typeof nav_color_active == 'undefined' || nav_color_active == '') nav_color_active = nav_color;
435				var mcss_fixed = (checkFixTypeMenu) ? '\
436						'+mobile_selector[1]+' .siteCART.micon {color : ' + fixed_color + '; }\
437						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear .mobilenav_top a {color : ' + fixed_color + '; }\
438						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear .mobilenav_top svg {fill : ' + fixed_color + '; }\
439					' : '',
440					mcss_more = '\
441					@media only screen and (max-width:768px) {\
442						#mobile-nav'+mobile_selector[0]+' { font-family: ' + nav_font + '; }\
443						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children i,\
444						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children i:focus { color: ' + nav_color + '; }\
445						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children.active i { color: ' + nav_color_active + '; }\
446						'+ mcss_fixed +'\
447					}\
448				';
449	
450				var menu_css_selector = (checkEllist) ? '.elviewcss' : '#menu-'+sid;
451				$(menu_css_selector).append(mcss_more);
452			}
453
454			$('.el-menu').removeClass('_ready');
455		},
456		set: function(mode) {
457			// console.log('fheader set');
458			var checkEllist = (typeof mode != 'undefined' && mode=='ellist') ? true : false,
459				checkStorageCapture = (typeof isStoragebox != 'undefined' && isStoragebox && typeof isCapture != 'undefined' && isCapture) ? true : false,
460				$fh = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
461				fh_type = $fh.attr('data-fh-type'),
462				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
463				
464			if($fh.find('#fixed-menu').children().length == 0) {
465				if(fh_type == 'top') $fh.find('.fh-container').remove();
466				else if(fh_type == 'right' || fh_type == 'sidebar') $fh.find('#fixed-menu, .fh-line').remove();
467				$('#mobile-nav #fixed-menu, #mobile-nav .fh-line').remove();
468			}
469			
470			if(!checkFixTypeMenu) {
471				if(checkStorageCapture) {
472				} else {
473					if(fh_type == 'top') {
474						$fh.find('.fh-container').eq(0).slideToggle();
475					} else if(fh_type == 'right' || fh_type == 'sidebar') {
476						$fh.find('#fixed-menu').slideToggle();
477					}
478					
479					$fh.find('.fh-line').slideToggle();
480				}
481			}			
482			
483			setTimeout(function() {				
484				if(checkEllist) {
485					if(fh_type == 'right' && $fh.find('.mini-home').length > 0) {
486						$fh.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
487					} else if(checkFixTypeMenu && fh_type == 'sidebar') {
488						$fh.find('#fixed-menu').css('overflow','');
489					}
490				} else {
491					if($('#page-loading-css').length == 0) {
492						setTimeout(function() {
493							$.fheader.position();
494						},400);
495					}
496				}
497							
498			},400);
499		},
500		position: function() {
501			if(!$('header.navbar').hasClass('navbar-fheader')) {
502	            var parentDocument = $(window.parent.document),
503	                $detail_modal = parentDocument.find('.product-detail-modal');
504	            if($detail_modal.length) {
505	            	($('.openBandBanner').length) ? 
506	            		$('.dsgn-body').css('padding-top','120px') :
507	            		$('.dsgn-body').css('padding-top','0px');
508	            }
509				return false;
510			}
511
512			// console.log('fheader position');
513			// if(!$('header.navbar').hasClass('navbar-fheader')) return false;
514
515			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
516				$fh = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
517				fh_type = $fh.attr('data-fh-type'),
518				fh_postion = (typeof $fh.attr('data-position') != 'undefined') ? $fh.attr('data-position') : '',
519				fh_transparent = ($fh.hasClass('transparent')) ? true : false,
520				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
521				
522			var body_width = (PAGE_MODE == 'c') ? $('body').width() : window.innerWidth;
523			
524			if(body_width <= 768) {
525				if(fh_type == 'right' && $fh.find('.mini-home').length > 0) { 
526					$fh.find('.mini-home').parent().removeAttr('style'); 
527				}
528				$fh.find('.psearch-overlay.open').removeClass('open');
529				$('.cl-popupBanner').removeClass('zindex20');
530				if(!checkFixTypeMenu) $fh.find('#fixed-menu-sub').closest('.fh-container').eq(0).hide();
531			} else {
532				if(fh_type == 'right' && $fh.find('.mini-home').length > 0) {
533					if(!checkFixTypeMenu) {
534						$fh.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
535					} 
536				}
537
538				if(fh_type == 'right' && !$fh.hasClass('sidebar') && $fh.find(' > .container[data-fh-align]').length > 0) {
539					$.fheader.refreshFixedSub();
540				}
541
542				$('#mobile-nav .psearch-overlay.open').removeClass('open');
543				$('.cl-popupBanner').removeClass('zindex20');
544				if($('.dsgn-body').hasClass('mobile-nav-active')) $fh.find('.navbar-toggle').click();
545			}
546
547			if(fh_transparent) {
548				if($('.cl-bandBanner').length == 0) {
549					$('.dsgn-body').css('padding-top','0px');
550					if(PAGE_MODE == 'c') $('.el-menu_ctrl .config-element').removeAttr('style');
551				}
552			} else if(fh_postion != 'relative') {
553				if(fh_type == 'sidebar' && body_width > 768) {
554					var pt = '0px';
555					if(typeof getComputedStyle(document.querySelector('body')).getPropertyValue('--bandBanner-height-pc') != 'undefined') {
556						pt = getComputedStyle(document.querySelector('body')).getPropertyValue('--bandBanner-height-pc');
557					}
558					$('.dsgn-body').css('padding-top',pt);
559					return false;
560				}
561			}
562
563			if(PAGE_MODE == 'c') {
564				if($('.dsgn-body').get(0).scrollHeight  > $('.dsgn-body').innerHeight()) {
565					var scrollbar_gap = window.innerWidth - $('.dsgn-body').get(0).clientWidth;
566					$('.navbar-fixed-top, .navbar-fixed-bottom').css('right',scrollbar_gap);
567				} else {
568	                $('.navbar-fixed-top, .navbar-fixed-bottom').removeAttr('style');
569				}
570			}
571			if(checkEllist) {
572				if(checkFixTypeMenu) setFixedMenuCss(true);
573			} else {
574				var delay_time = (PAGE_MODE == 'c') ? 800 : 0;
575				setTimeout(function() {
576					var header_h = (fh_transparent || ($fh.hasClass('sidebar') && $('.dsgn-body').width() > 767) ) ? 0 : $fh.outerHeight(),
577						band_h = $.siteBanner.getBandHeight();
578					if($fh.find('.cl-menu-option.open:not(.single:not(.nfullDrop))').length > 0 && $fh.find('.cl-menu-option.open').is('[data-moption="nfull"], [data-moption="ntoggle"]')) {
579						var hide_h = $fh.find('.moption-container').outerHeight();
580						header_h -= hide_h;
581					}
582					$('.dsgn-body').css('padding-top', (band_h + header_h)+'px'); 
583					if($('.el_0.element').is('[data-type="gallery"][data-type2="premium"][data-feature*=fixedscroll]')) gjs01SetFixedscroll($('.el_0.element'));
584				}, delay_time);
585
586				if(PAGE_MODE == 'c') {
587					setTimeout(function() {
588						var btn_top = $('header.navbar').outerHeight();
589						$('.addElementButton.addel-menu').css('top',btn_top + 'px');
590					}, delay_time+200);
591				}
592			}
593		}
594	}
595
596	$.moption = {
597		getList: function(menu_selector) {
598			var checkEditList = (menu_selector.match(/^\.elmenu-color-edit/gi)) ? true : false,
599				moption_list = [];
600
601			$(menu_selector).find('#tpl-menu > li').each(function() {
602				var tmp_child = [],
603					tmp_main = $(this);
604				if(tmp_main.hasClass('dropdown')) {
605					tmp_main.find('.dropdown-menu > li').each(function() {
606						var tmp_sub = $(this);
607						tmp_child.push({
608							'idx0': moption_list.length,
609							'idx1': tmp_child.length,
610							'name': tmp_sub.find(' > a').eq(0).text().trim(),
611							'active': (tmp_sub.hasClass('active')) ? 'active' : '',
612							'href': (checkEditList) ? 'javascript:;' : '',
613							'target': '',
614							'isbookmark': '',
615							'isflink': '',
616							'depth': 1,
617							'children': tmp_child, 
618						});
619					});
620				}
621			
622				moption_list.push({
623					'idx0': moption_list.length,
624					'name': tmp_main.find(' > a').eq(0).text().trim(),
625					'active': (tmp_main.hasClass('active')) ? 'active' : '',
626					'href': (checkEditList) ? 'javascript:;' : '',
627					'target': '',
628					'isbookmark': '',
629					'isflink': '',
630					'depth': 0,
631					'children': tmp_child, 
632				});
633			});
634			return moption_list;
635		},
636		init: function(mode) {
637			// console.log('fh moption(mode: '+mode+')');
638
639			var checkElviewer = '';
640			if(window.parent && window.parent != this && $('.elviewhtml').length > 0) {
641				checkElviewer = $('#el-list-image .elgrid.active', window.parent.document).find('.blockname-str').text().trim();
642			}
643
644			var s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
645				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE,
646				checkGabia = (s_service.indexOf('gabia') > -1) ? true : false,
647				checkEllist = (typeof mode != 'undefined' && mode == 'ellist') ? true : false,
648				checkMenuEdit = (typeof mode != 'undefined' && mode == 'menuedit') ? true : false,
649				checkTemplate = (typeof property != 'undefined' && property.TEMPLATE && property.TEMPLATE=='1') ? true : false,
650				sid = (PAGE_MODE == 'c') ? ((checkEllist) ? checkElviewer.replace(/menu-/gi,'') : SID) : property.SID,
651				pc_seletor = (checkEllist) ? '.elviewhtml header.navbar' : ((checkMenuEdit) ? '.elmenu-color-edit header.navbar' : '.el-menu header.navbar'),
652				$pc_nav = $(pc_seletor),
653				$mobile_nav = $pc_nav.find('#tpl-menu').closest('.navbar-menu-'+sid).clone(),
654				checkFixTypeMenu = (typeof $pc_nav.attr('data-fixtype') != 'undefined' && $pc_nav.attr('data-fixtype')) ? true : false;
655
656			var moption = $pc_nav.find('.cl-menu-option').attr('data-moption'),
657				checkDrawClmoption = ($.inArray(moption, ['nfull','ntoggle']) > -1) ? true : false;
658			if(checkDrawClmoption) {
659				var moption_table = '<ul class="cl-'+moption+' cl-moption"></ul>',
660					moption_col = '<li class="cl-moption-col"></li>',
661					moption_row = '<div class="cl-moption-row"></div>';
662
663				if($pc_nav.find('.container.moption-container').length > 0) $pc_nav.find('.container.moption-container').html('<div class="moption-row"></div>');
664				else $pc_nav.find('.container:not(:is(.fh-container, .moption-container))').after('<div class="container moption-container"><div class="moption-row"></div></div>');
665				var $moptionContainer = $pc_nav.find('.container.moption-container'),
666					$moptionRow = $moptionContainer.find('.moption-row');
667				if($pc_nav.find('.container:not(:is(.fh-container, .moption-container))').hasClass('full-width')) $moptionContainer.addClass('full-width');
668
669				$moptionRow.append(moption_table);
670				var menu_option = (PAGE_MODE == 'c') ? MENUOPTION : property.MENUOPTION,
671					$moptionTable = $moptionContainer.find('.cl-moption');
672
673				if(checkMenuEdit) menu_option = $.moption.getList(pc_seletor);
674				$.each(menu_option, function(idx0, obj0) {
675					var $tmpCol = $(moption_col),
676						tmp_row = moption_row.replace(/cl\-moption\-row\"\>\</g,'cl-moption-row '+obj0.active+'"><a href="' + obj0.href + '" ' + obj0.target + obj0.isbookmark + obj0.isflink + '>
676' + obj0.name + '</a><');
677					if(obj0.children.length > 0) {
678						$.each(obj0.children, function(idx1, obj1) {
679							tmp_row += moption_row.replace(/cl\-moption\-row\"\>\</g,'cl-moption-row '+obj1.active+'" data-parent="'+obj1.idx0+'"><a href="' + obj1.href + '" ' + obj1.target + obj1.isbookmark + obj1.isflink + '>' + obj1.name + '</a><');
680						});
681					}
682
683					$tmpCol.append(tmp_row);
684					if($tmpCol.find('.cl-moption-row').length > 1) $tmpCol.addClass('has-sub');
685					if(menu_option.length-1 == idx0) $tmpCol.addClass('last-sub');
686					$moptionTable.append($tmpCol);
687				});
688			}
689
690			switch(moption) {
691				case 'nfull':
692
693					var hasSubMenu = (PAGE_MODE == 'c') ? MENUCHECK.sub : property.MENUCHECK.sub;
694					if(hasSubMenu) $pc_nav.find('.cl-menu-option').removeClass('single');
695					else $pc_nav.find('.cl-menu-option').addClass('single');
696
697					$pc_nav.find('#tpl-menu > li, .moption-container').off('mouseover mouseleave').on({
698						mouseover: function(e) {
699							if($(this).find('.cl-moption').is(':empty') || (PAGE_MODE == 'c' && $('#el-blockConfig').hasClass('open') && selectEL != 'el-menu')) return false;
700
701							$(this).closest('header').find('.cl-menu-option').addClass('open');
702						},
703						mouseleave: function(e) {
704							if($(this).find('.cl-moption').is(':empty')) return false;
705
706							if(	$(this).closest('header').find('.cl-menu-option').hasClass('fixed') ||
707								$(this).closest('header').find('.cl-menu-option').hasClass('nfullDrop') ||
708								$('#el-blockConfig').is('.open')
709							) {
710								return false;
711							}
712
713							$(this).closest('header').find('.cl-menu-option').removeClass('open');
714							if($(this).closest('header').find('.cl-menu-option').is('[data-mwidth="all"]')) {
715								$.fheader.position();
716							}
717						}
718					});
719					break;
720
721				case 'ntoggle':
722					break;
723
724				default:
725					break;
726			}
727
728			$pc_nav.find('.cl-drop-fixed-menu ~ .navbar-toggle, .cl-menu-option ~ .container .navbar-toggle').off('click').on({
729				click: function() {
730					if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',true);
731				},
732			});
733
734
735			$pc_nav.ready(function() {
736				setTimeout(function() {
737					if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) $.moption.checkNfullDrop(pc_seletor);
738					else if($pc_nav.find('.cl-menu-option[data-moption="ntoggle"]').length > 0 && $pc_nav.is('[data-fh-type="right"]')) $.moption.drawClDropFixedmenu($pc_nav);
739				}, 300);
740			});
741
742            $(window).resize(function() {
743                if(this.moptionResizeTO) {
744                    clearTimeout(this.moptionResizeTO);
745                }
746                this.moptionResizeTO = setTimeout(function() {
747                    $(this).trigger('resizeMoptionEnd');
748                }, 300);
749            });
750            $(window).on('resizeMoptionEnd', function() {
751                $.fheader.position();
752                if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) $.moption.checkNfullDrop(pc_seletor);
753				else if($pc_nav.find('.cl-menu-option[data-moption="ntoggle"]').length > 0 && $pc_nav.is('[data-fh-type="right"]')) $.moption.drawClDropFixedmenu($pc_nav);
754
755				if($pc_nav.find('.cl-menu-option').length > 0  && $('body').width() < 767) {
756					$pc_nav.find('.cl-menu-option').removeClass('open');
757				} else {
758			        if ($('header #tpl-menu').children().length) $('header.navbar-fheader .navbar-toggle').css({ 'visibility': 'visible' });
759			        else $('header.navbar-fheader .navbar-toggle').css({ 'visibility': 'hidden' });
760			        $('.dsgn-body').removeClass('mobile-nav-active');
761			        $('#mobile-body-overly').removeClass('in');
762			        $('#mobile-nav .siteLANG.cl-fixbtn').hide();
763				}
764            });
765		},
766		setRootBlock(thisBlock,root_key,usedtoggle) {
767			if(	typeof thisBlock != 'undefined' && thisBlock.length > 0 && thisBlock.find('.cl-menu-option').length > 0) {
768				if(root_key == '--block-height') {
769					var h = thisBlock.outerHeight();
770					document.querySelector('header').style.setProperty('--block-height', h + 'px', null);
771
772					if($('#el-blockConfig').hasClass('open')) {
773						if(!thisBlock.find('.cl-menu-option').hasClass('open')) thisBlock.find('.cl-menu-option').toggleClass('open');
774					} else if(usedtoggle) {
775						thisBlock.find('.cl-menu-option').toggleClass('open');
776					} else {
777						thisBlock.find('.cl-menu-option').removeClass('open');
778					}
779
780					if(thisBlock.find('.cl-menu-option').is('.nfullDrop[data-mo
780ption="nfull"]')) {
781						var h_p_b = thisBlock.css('padding-bottom').replace(/[^0-9]/g,'') * 1;
782						document.querySelector('header').style.setProperty('--cl-nfull-top', h_p_b + 'px', null);
783					}
784				}
785			}
786
787		},
788		drawClDropFixedmenu: function(pcNav) {
789			if($('header #fixed-menu').length > 0) {
790				var drop_fixed_menu = '<ul class="cl-drop-fixed-menu">' + $('header #fixed-menu').html() + '</ul>';
791				if(pcNav.find('.cl-drop-fixed-menu').length > 0) pcNav.find('.cl-drop-fixed-menu').replaceWith(drop_fixed_menu);
792				else if(pcNav.find('.navbar-header .micon').length > 0) pcNav.find('.navbar-header .micon').before(drop_fixed_menu);
793				else pcNav.find('.navbar-header .navbar-toggle').before(drop_fixed_menu);
794			}
795		},
796		checkNfullDrop: function(nav_selector) {
797			var $pc_nav = $(nav_selector),
798				isellist = (nav_selector.match(/^\.elviewhtml/gi)) ? true : false,
799				iselmenuedit = (nav_selector.match(/^\.elmenu-color-edit/gi)) ? true : false,
800				isparent = (typeof window.parent != 'undefined' && window.parent != this) ? true : false;
801
802			if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) {
803
804				var checkBlockConfig = $('#el-blockConfig').hasClass('open');
805				if(checkBlockConfig || isparent) {
806					$pc_nav.find('.cl-drop-fixed-menu').remove();
807					$pc_nav.find('.cl-menu-option').removeAttr('data-nfull-drop').removeClass('nfullDrop');
808				}
809
810				var delay = (checkBlockConfig) ? 500 : 0;
811				setTimeout(function() {
812					var checkMfullDrop = $pc_nav.find('.cl-menu-option').is('[data-nfull-drop]'),
813						// checkMenuOrg = ($pc_nav.find('.cl-menu-option').is('[data-mwidth]')) ? false : true,
814						// tpl_menu_selector = (checkMenuOrg) ? nav_selector+' #tpl-menu' : nav_selector+' .cl-moption',
815						tpl_menu_selector = nav_selector + ' #tpl-menu',
816						m_wrap = $(tpl_menu_selector).first().width(),
817						m_w = 0,
818						mdrop_onoff = (checkMfullDrop) ? $pc_nav.find('.cl-menu-option').hasClass('nfullDrop') : false;
819
820					var fixed_menu_w = $pc_nav.find('#fixed-menu').outerWidth();
821					if($pc_nav.is('[data-fh-type="right"][data-fixtextalign="center"]')) {
822						$pc_nav.find(nav_selector+' #tpl-menu').css('padding-left',fixed_menu_w + 'px');
823					} else {
824						document.querySelector(nav_selector+' #tpl-menu').style.removeProperty('padding-left');
825					}
826
827					if(checkMfullDrop) {
828						var m_container = $pc_nav.find('.container:not(.moption-container, .fh-container)').eq(0).width(),
829							m_drop = $pc_nav.find('.cl-menu-option').attr('data-nfull-drop');
830						if(Number(m_drop) > 0 && m_container > Number(m_drop)) {
831							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeClass('nfullDrop');
832						} else {
833							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').addClass('nfullDrop');
834							setFixedMenuCss(isellist);
835						}
836					} else {
837						$(tpl_menu_selector).first().children().each(function() {
838							m_w += $(this).outerWidth();
839						});
840
841						var m_top = $(tpl_menu_selector).first().children().first().offset().top,
842							m_last = $(tpl_menu_selector).first().children().last().offset().top;
843						if(m_top != m_last || m_w > m_wrap) {
844							var mcontainer = $pc_nav.find('.container:not(.moption-container, .fh-container)').eq(0).width(),
845								mdrop = mcontainer + (m_w - m_wrap);
846
847							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').attr('data-nfull-drop',mdrop).addClass('nfullDrop');
848							setFixedMenuCss(isellist);
849						} else {
850							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeAttr('data-nfull-drop');
851						}
852					}
853
854					if($pc_nav.is('[data-fh-type="right"]') && $pc_nav.find('.cl-menu-option').hasClass('nfullDrop')) {
855						$.moption.drawClDropFixedmenu($pc_nav);
856					}
857
858					// if(iselmenuedit) $pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeClass('nfullDrop');
859					if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',false);
860				}, delay);
861			} else {
862				if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',false);
863			}
864
865		},
866	}
867
868	$.psearch = {
869		init: function() {
870			// console.log('psearch init');
871			if(!$('.el-menu header.navbar').hasClass('navbar-fheader')) return false;
872
873			// psearch - 쇼핑몰 요금제 사용여부 체크 후 on/off
874            var s_validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN,
875                s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
876                checkSM = (s_validplan && s_validtype == 'SM') ? true : false;
877
878            if(checkSM) $.psearch.set('on');
879			else $.psearch.set('off');
880		},
881		set: function(onoff) {
882			// console.log('psearch set');
883			if(!$('.el-menu header.navbar').hasClass('navbar-fheader')) return false;
884
885			if(onoff.match(/on/gi)) $.psearch.makeSiteSEARCH();
886			else {
887				$('#fixed-menu, #fixed-menu-sub').find('.siteSEARCH').remove();
888			}
889		},
890		makeSiteSEARCH: function() {
891			// console.log('psearch makeSiteSearch');
892			// 우선 PC, MOBILE 구조 동일하게 적용함 => (menufixbtn적용 전 메뉴블럭)
893			
894			/* Shopping Only KO Site */
895			// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
896			// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
897			// 	$('#fixed-menu, #fixed-menu-sub').find('.siteSEARCH').remove();
898			// 	return false;
899			// }
900
901			var pc_nav = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub');
902			var mobile_nav = $('#mobile-nav #fixed-menu');
903			var checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false;
904			var checkLux = (PAGE_MODE == 'c') ? LUX : property.LUX;
905			var search_icon = (checkFixTypeMenu) ? clSVG('fixbtn_search4',28,28) : '<i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i>';
906				
907			var content = (checkFixTypeMenu) ? `
908				<div class="psearch-overlay">
909                    <span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
910                    <div class="psearch-body">
911                        <span class="psearch-wrap">
912                            <a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
913                            <input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
914                        </span>
915                    </div>
916                </div>
917			` : `
918				<li class="siteSEARCH">
919                    <a href="javascript:;" class="psearch-btn"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a>
920                    <div class="psearch-overlay">
921                        <span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
922                        <div class="psearch-body">
923                            <span class="psearch-wrap">
924                                <a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
925                                <input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
926                            </span>
927                        </div>
928                    </div>
929                </li>
930			`;
931			var mobile_content = `
932				<li class="siteSEARCH">
933					<a href="javascript:;" class="psearch-btn">${search_icon}</a>
934					<div class="psearch-overlay">
935						<span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
936						<div class="psearch-body">
937							<span class="psearch-wrap">
938								<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
939								<input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
940							</span>
941						</div>
942					</div>
943				</li>
944			`;
945			
946			if(pc_nav.find('.siteSEARCH').length > 0) {
947				if(checkFixTypeMenu){
948					pc_nav.find('.siteSEARCH').find('a').addClass('psearch-btn');
949					pc_nav.find('.siteSEARCH').append(content);
950				} else pc_nav.find('.siteSEARCH').replaceWith(content);
951			} else pc_nav.prepend(content);
952			
953			if(mobile_nav.find('.siteSEARCH').length>0) {
954				if(checkFixTypeMenu) {
955					var regExp = new RegExp(/cl\-fixbtn|cl\-visible/, "gi"),
956						addClass = (mobile_nav.find('.siteSEARCH').attr('class').match(regExp)!==null) ? mobile_nav.find('.siteSEARCH').attr('class').match(regExp).join(" ") : '',
957						$site_search = mobile_nav.find('.siteSEARCH');
958
959					mobile_nav.find('.siteSEARCH').find('a').addClass('psearch-btn');
960					mobile_nav.find('.siteSEARCH').replaceWith(mobile_content);
961					mobile_nav.find('.siteSEARCH').addClass(addClass);
962
963					if(pc_nav.find('.siteSEARCH').css('display')=='none') mobile_nav.find('.siteSEARCH').hide();
964				} else mobile_nav.find('.siteSEARCH').replaceWith(mobile_content);
965			} else mobile_nav.prepend(mobile_content);
966			
967			// #fixed-menu-sub psearch not working 
968			// pc_nav.each(function() {
969			// 	if($(this).attr('id') == 'fixed-menu-sub') {
970			// 		$(this).find('.psearch-overlay').remove();
971			// 	}
972			// });
973		},
974		groupByTab: function(list) {
975			var groups = {
976				all: [],
977				shopping: [],
978				forum: [],
979				gallery: [],
980				etc: []
981			};
982
983			for (var i = 0; i < list.length; i++) {
984				var o = list[i];
985				var tab = o.tab || 'etc';
986
987				groups.all.push(o);
988
989				if (!groups[tab]) tab = 'etc';
990				groups[tab].push(o);
991			}
992
993			return groups;
994		},
995		initTabs: function($wrap){
996			var groups = $wrap.data('psearchGroups') || {};
997			var $tabs = $wrap.find('.psearch-tabs');
998			if($tabs.length==0) return;
999
1000			var active = $tabs.attr('data-active') || 'all';
1001
1002			// 초기 활성화
1003			$wrap.find('.psearch-tab-nav .tab-item').removeClass('active');
1004			$wrap.find('.psearch-tab-nav .tab-item[data-tab="'+active+'"]').addClass('active');
1005
1006			$wrap.find('.psearch-panel').hide();
1007			$wrap.find('.psearch-panel[data-tab="'+active+'"]').show();
1008
1009			// 클릭 이벤트
1010			$wrap.find('.psearch-tab-nav .tab-item').live('click', function(e){
1011				e.preventDefault();
1012				var tab = $(this).attr('data-tab');
1013
1014				var tabPages = $wrap.data('psearchTabPages') || {};
1015				tabPages[tab] = 1;
1016				$wrap.data('psearchTabPages', tabPages);
1017
1018				$tabs.attr('data-active', tab);
1019				if($wrap.find('#psearch-tab').length) $wrap.find('#psearch-tab').val(tab);
1020
1021				$wrap.find('.psearch-tab-nav .tab-item').removeClass('active');
1022				$(this).addClass('active');
1023
1024				$wrap.find('.psearch-panel').hide();
1025				$wrap.find('.psearch-panel[data-tab="'+tab+'"]').show();
1026
1027				var cnt = groups[tab] ? groups[tab].length : 0,
1028					cnt_lang = (LANG == 'ko') ? '개' : '';
1029				$wrap.find('.psearch-total-count').html('<strong>'+cnt + cnt_lang +'</strong><span class="count-txt">' + $.lang[LANG]['fheader.psearch.result'] + '</span>');
1030			});
1031		},
1032		view: function() {
1033			// console.log('psearch view');
1034			// var deferred = $.Deferred();
1035
1036			var check_p = (property.PAGE == 'psearch') ? true : false;
1037			if(check_p) {
1038				var p_stx = property.PARENT?.psearch_stx ?? '';
1039				var p_total = property.PARENT?.psearch_total ?? 0;
1040				var p_list = property.PARENT['psearch_list'];
1041				var p_page_num = property.PARENT['psearch_num'];
1042				var p_view = property.PARENT['psearch_view'];
1043				var p_selector = (property.LUX) ? 'psearch-block' : 'psearch-view';
1044
1045				let psearch_view = '';
1046				if(property.LUX) {
1047					//lux search view
1048					psearch_view = property.PARENT['psearch_eltag'];
1049					if($('style#psearchblockcss').length == 0) {
1050						 $('body').append('<link rel="stylesheet" type="text/css" id="psearchblockcss" href="/css/block/psearch_block.css">');
1051					}
1052					if($('script#psearchblockjs').length == 0) {
1053						var psearchJS = document.createElement('script');
1054						psearchJS.setAttribute('src', '/js/block/psearch_block.js');
1055						psearchJS.setAttribute('id', 'psearchblockjs');
1056						document.body.appendChild(psearchJS);
1057
1058						psearchJS.onload = function() {
1059							$('body').append('<input type="hidden" id="psearchblockjs" data-src="/js/block/psearch_block.js">');
1060							$(`.${p_selector}`).fadeIn().removeAttr('style');
1061
1062							if($('.psearch-block .pfilter-fbox .fcol-c-ul:not([data-key="psearch"]) > li.active').length > 0) {
1063								if($('.psearch-block .pfilter-fbox .fcol-c-ul[data-key="brand"] > li.active').length > 0) {
1064									$('.psearch-block .pfilter-fbox .fcol-c-ul[data-key="brand"]').closest('.frow').addClass('open');
1065								}
1066								var cancel_svg = clSVG('close',10,10,true,'pick-cancel-btn');
1067								$('.psearch-block .pfilter-fbox .fcol-c-ul:not([data-key="psearch"]) > li.active').each(function() {
1068									var isOnly = $(this).closest('ul').is('[data-only="true"]');
1069									var pfilter_key = $(this).closest('ul').attr('data-key');
1070									var pfilter_name = $(this).text().trim();
1071									var pfilter_val = $(this).attr('data-val');
1072									var pfilter_input = (isOnly) ? pfilter_key : pfilter_key+'[]';
1073									if(isOnly) $('#psearchForm .psearch-pick.'+pfilter_key+'').remove();
1074									$('#psearchForm').append('<input type="hidden" class="psearch-pick '+pfilter_key+'" name="'+pfilter_input+'"  value="'+pfilter_val+'" />');
1075									$('.psearch-block .pfilter-fbox .frow.last .fcol-c-ul[data-key="psearch"]').append('<li data-key="'+pfilter_key+'" data-val="'+pfilter_val+'"><div class="fcol-c-label"><span class="fcol-c-name">'+pfilter_name+'</span>'+cancel_svg+'</div></li>');
1076								});
1077								$('.psearch-block .pfilter-fbox .frow.last').removeClass('hide');
1078							} else {
1079								$('.psearch-block .pfilter-fbox .frow.last').addClass('hide');
1080							}
1081						}
1082					}
1083
1084				} else {
1085					//shopping search view
1086					var wrap = ($('header.navbar .container').hasClass('full-width')) ? 'full-width' : '';
1087					psearch_view = '\
1088						<div class="psearch-view" data-sid="'+property.SID+'" style="height:' + ($(document).height() * 0.2) + 'px; display: none;">\
1089							<input type="hidden" id="psearch-stx" value="' + p_stx + '" />\
1090							<input type="hidden" id="psearch-total" value="' + p_total + '" />\
1091							<input type="hidden" id="psearch-tab" value="all" />\
1092							<div class="container ' + wrap + '">\
1093								<div class="psearch-body">\
1094									<div class="row">\
1095										<div class="col-sm-offset-2 col-md-offset-4 col-xs-12 col-sm-8 col-md-4">\
1096											<span class="psearch-wrap">\
1097												<input class="psearch-input" type="text" name="" placeholder="' + $.lang[LANG]['fheader.psearch'] + '" value="' + p_stx + '">\
1098												<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>\
1099											</span>\
1100										</div>\
1101									</div>\
1102					';
1103
1104					// 탭 분류
1105					var groups = $.psearch.groupByTab(p_list);
1106
1107					var PAGE_SIZE = 8;
1108					var PAGE_VIEW = 5;
1109					var $pEL = $('.'+p_selector);
1110					$pEL.data('psearchPageSize', PAGE_SIZE);
1111					$pEL.data('psearchPageView', PAGE_VIEW);
1112
1113					// 탭별
1114					$pEL.data('psearchTabPages', { all:1, shopping:1, forum:1, gallery:1, etc:1 });
1115
1116					// all 섹션별
1117					$pEL.data('psearchAllSectionPages', { shopping:1, gallery:1, forum:1, etc:1 });
1118
1119					var tabCount = {
1120						all: groups.all.length,
1121						shopping: groups.shopping.length,
1122						forum: groups.forum.length,
1123						gallery: groups.gallery.length,
1124						etc: groups.etc.length
1125					};
1126
1127					// 기본 활성 탭(쇼핑>게시판>갤러리>기타)
1128					var activeTab = 'all';
1129					// 전체 검색결과 수
1130					var totalCnt = tabCount.shopping + tabCount.forum + tabCount.gallery + tabCount.etc;
1131					if (totalCnt === 0) { //검색결과 0
1132						activeTab = 'all';
1133					} else {
1134						if (tabCount.shopping > 0 && totalCnt === tabCount.shopping) {
1135							activeTab = 'shopping';
1136						} else if (tabCount.forum > 0 && totalCnt === tabCount.forum) {
1137							activeTab = 'forum';
1138						} else if (tabCount.gallery > 0 && totalCnt === tabCount.gallery) {
1139							activeTab = 'gallery';
1140						} else if (tabCount.etc > 0 && totalCnt === tabCount.etc) {
1141							activeTab = 'etc';
1142						} else {
1143							activeTab = 'all';
1144						}
1145					}
1146
1147					var p_sort = (typeof property.PARENT['psearch_sort'] != 'undefined' && property.PARENT['psearch_sort']) ? property.PARENT['psearch_sort'] : '
1147new',
1148						cnt_lang = (LANG == 'ko') ? '개' : '';
1149					// 탭 네비
1150					psearch_view += '\
1151						<div class="psearch-tabs" data-active="'+activeTab+'">\
1152							<ul class="psearch-tab-nav">\
1153								<li class="tab-item" data-tab="all">' + $.lang[LANG]['fheader.psearch.all'] + ' <span class="cnt">('+tabCount.all+')</span></li>\
1154								<li class="tab-item" data-tab="shopping">' + $.lang[LANG]['fheader.psearch.shopping'] + ' <span class="cnt">('+tabCount.shopping+')</span></li>\
1155								<li class="tab-item" data-tab="gallery">' + $.lang[LANG]['fheader.psearch.gallery'] + ' <span class="cnt">('+tabCount.gallery+')</span></li>\
1156								<li class="tab-item" data-tab="forum">' + $.lang[LANG]['fheader.psearch.forum'] + ' <span class="cnt">('+tabCount.forum+')</span></li>\
1157								<li class="tab-item" data-tab="etc">' + $.lang[LANG]['fheader.psearch.etc'] + ' <span class="cnt">('+tabCount.etc+')</span></li>\
1158							</ul>\
1159						</div>\
1160						<div class="psearch-sort-wrap">\
1161							<div class="psearch-total-count"><strong>'+ p_total + cnt_lang +'</strong><span class="count-txt">' + $.lang[LANG]['fheader.psearch.result'] + '</span></div>\
1162							<div class="gallery-sort-nav goption-row psearch-sort" data-sort-lang="' + LANG + '">\
1163								<div class="toggle-dropdown display-flex space-between align-items-center">\
1164									<span class="active-sort">'+(p_sort=='old' ? $.lang[LANG]['fheader.psearch.dropdown.old'] : $.lang[LANG]['fheader.psearch.dropdown.recent'])+'</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="m8 11.35-6-6 .71-.7L8 9.94l5.29-5.29.71.7z"/></svg>\
1165								</div>\
1166								<ul>\
1167									<li class="'+(p_sort=='new' ? 'active' : '')+'"><a href="javascript:;" data-sort="new">' + $.lang[LANG]['fheader.psearch.dropdown.recent'] + '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 10" width="13" height="10"><path d="m5 9.71-5-5 1.41-1.42L5 6.88 11.59.29 13 1.71z"/></svg></a></li>\
1168									<li class="'+(p_sort=='old' ? 'active' : '')+'"><a href="javascript:;" data-sort="old">' + $.lang[LANG]['fheader.psearch.dropdown.old'] + '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 10" width="13" height="10"><path d="m5 9.71-5-5 1.41-1.42L5 6.88 11.59.29 13 1.71z"/></svg></a></li>\
1169								</ul>\
1170							</div>\
1171						</div>\
1172					';
1173
1174					// 탭 패널 렌더
1175					psearch_view += '<div class="psearch-tab-panels">';
1176
1177					psearch_view += (function(){
1178						var h = '<div class="psearch-panel" data-tab="all" style="display:none;">';
1179						var parts = [];
1180						var s1 = $.psearch.renderAllSection($pEL, 'shopping', groups.shopping);
1181						if(s1) parts.push(s1);
1182						var s2 = $.psearch.renderAllSection($pEL, 'gallery',  groups.gallery);
1183						if(s2) parts.push(s2);
1184						var s3 = $.psearch.renderAllSection($pEL, 'forum',    groups.forum);
1185						if(s3) parts.push(s3);
1186						var s4 = $.psearch.renderAllSection($pEL, 'etc',      groups.etc);
1187						if(s4) parts.push(s4);
1188
1189						if(parts.length === 0){
1190							h += '<div class="row text-center pitem-empty">'
1191							+ $.lang[LANG]["fheader.psearch.pitem-empty"]
1192							+ '</div>';
1193						} else {
1194							h += parts.join('');
1195						}
1196
1197						h += '</div>';
1198						return h;
1199					})();
1200					psearch_view += $.psearch.renderTabPanel($pEL, 'shopping', groups.shopping);
1201					psearch_view += $.psearch.renderTabPanel($pEL, 'forum',    groups.forum);
1202					psearch_view += $.psearch.renderTabPanel($pEL, 'gallery',  groups.gallery);
1203					psearch_view += $.psearch.renderTabPanel($pEL, 'etc',      groups.etc);
1204					psearch_view += '</div>';
1205					psearch_view += '</div></div></div></div>';
1206
1207					$('.psearchcss').remove();
1208					var p_color = $('.dsgn-body').css('color');
1209					var p_line_color = $('.dsgn-body').css('color');
1210					var p_size = $('.dsgn-body').css('font-size');
1211					var p_css = `
1212						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-wrap { border-bottom-color: ${p_line_color}; }
1213						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-input { color: ${p_color}; }
1214						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-pagination > li > a { color: ${p_color}; }
1215					`;
1216					$('#dsgn-body').after(`<style class="psearchcss"${p_css}</style>`);
1217				}
1218
1219				if($.clnav.check()) {
1220					$('.dsgn-body').prepend(psearch_view);
1221				} else {
1222					$('.header.el-menu').after(psearch_view);
1223				}
1224
1225				var $pEL = $('.'+p_selector);
1226				$pEL.data('psearchGroups', groups);
1227				
1228				changeBrokenImages($pEL);
1229
1230				$.psearch.initTabs($('.'+p_selector));
1231				$.psearch.bindClientPagination($pEL);
1232				$pEL.find('.psearch-sort').val(p_sort);
1233
1234				var p_tab = (property.PARENT && property.PARENT['psearch_tab'])	? property.PARENT['psearch_tab'] : ($pEL.find('.psearch-tabs').attr('data-active') || 'shopping');
1235				// console.log(p_tab);
1236				setTimeout(function(){
1237					$pEL.find('.psearch-tab-nav .tab-item[data-tab="'+p_tab+'"]').trigger('click');
1238				}, 0);
1239
1240				// 정렬 드롭다운 토글 (열고/닫기)
1241				$pEL.off('click', '.psearch-sort .toggle-dropdown');
1242				$pEL.on('click', '.psearch-sort .toggle-dropdown', function(e){
1243					e.preventDefault();
1244					e.stopPropagation();
1245					$(this).closest('.psearch-sort').toggleClass('open');
1246				});
1247				// 바깥 클릭 시 닫기
1248				$(document).off('click.psearchSortClose').on('click.psearchSortClose', function(e){
1249					if($(e.target).closest('.psearch-sort').length === 0){
1250						$pEL.find('.psearch-sort').removeClass('open');
1251					}
1252				});
1253
1254				// 정렬 선택
1255				$pEL.off('click', '.psearch-sort ul a[data-sort]');
1256				$pEL.on('click', '.psearch-sort ul a[data-sort]', function(e){
1257					e.preventDefault();
1258
1259					var sort = $(this).attr('data-sort') || 'new'; // 클릭한 값
1260					var currentSort = property.PARENT['psearch_sort'] || 'new'; // 현재 값
1261
1262					if(sort === currentSort){
1263						$pEL.find('.psearch-sort').removeClass('open');
1264						return;
1265					}
1266
1267					var psearch_stx = $('#psearch-stx').val() || '';
1268					var tab  = $('#psearch-tab').val() || 'all';
1269
1270					// UI 텍스트 반영
1271					$pEL.find('.psearch-sort .active-sort').text($(this).text().trim());
1272					$pEL.find('.psearch-sort').removeClass('open');
1273
1274					var url = (PAGE_MODE=='s') ? '' : '/render';
1275					location.href = url + '/psearch/num/1/stx/' + encodeURIComponent(psearch_stx) + '/sort/' + sort + '/tab/' + tab;
1276				});
1277
1278				if(p_selector == 'psearch-view') $pEL.fadeIn().removeAttr('style');
1279
1280				// $pagination = $pEL.find('.psearch-pagination');
1281				// $.psearch.setPagination($pagination,p_stx,p_total,p_page_num,p_view);
1282
1283				// if(p_total <= p_view) $pagination.addClass('hidden');
1284				// else $pagination.removeClass('hidden');
1285
1286				if(p_selector == 'psearch-view') {
1287					if(PAGE_MODE != 'c') $.psearch.showSiteProjectSEARCH(true);
1288					if(PAGE_MODE == 's' && typeof callbackEvtProductSearch == 'function') callbackEvtProductSearch(p_stx);
1289				}
1290
1291				$pEL.off('click', '.psearch-client-nav a');
1292					$pEL.on('click', '.psearch-client-nav a', function(e){
1293					e.preventDefault();
1294
1295					// disabled면 무시
1296					if ($(this).parent().hasClass('disabled')) return;
1297
1298					var sectionKey = $(this).closest('.psearch-client-nav').attr('data-skey');
1299					var page = parseInt($(this).attr('data-page'), 10) || 1;
1300
1301					// 상태 저장
1302					var secPages = $pEL.data('psearchAllSectionPages') || {};
1303					secPages[sectionKey] = page;
1304					$pEL.data('psearchAllSectionPages', secPages);
1305
1306					// 해당 섹션만 재렌더
1307					var groups = $pEL.data('psearchGroups') || {};
1308					var list = groups[sectionKey] || [];
1309
1310					var html = renderSection(sectionKey, list);
1311					$pEL.find('.psearch-all-section[data-section="'+sectionKey+'"]').replaceWith(html);
1312				});
1313
1314				$pEL.off('click', '.psearch-tab-navpage a');
1315					$pEL.on('click', '.psearch-tab-navpage a', function(e){
1316					e.preventDefault();
1317					if($(this).closest('li').hasClass('disabled')) return;
1318
1319					var tabKey = $(this).closest('.psearch-tab-navpage').attr('data-tkey'); // shopping|forum|gallery|etc
1320					var page = parseInt($(this).attr('data-page'), 10) || 1;
1321
1322					// 상태 저장
1323					var tabPages = $pEL.data('psearchTabPages') || {};
1324					tabPages[tabKey] = page;
1325					$pEL.data('psearchTabPages', tabPages);
1326
1327					// 전체 패널 재렌더 (로컬 renderPanel 제거)
1328					$.psearch.rerenderPanels($pEL);
1329
1330					// 활성 탭 유지
1331					var active = $pEL.find('.psearch-tabs').attr('data-active') || 'all';
1332					$pEL.find('.psearch-panel').hide();
1333					$pEL.find('.psearch-panel[data-tab="'+active+'"]').show();
1334				});
1335
1336			}
1337
1338			// deferred.resolve();
1339		 //    return deferred.promise();
1340		},
1341		pItemEmpty: function() {
1342			// console.log('psearch pItemEmpty');
1343			return `
1344				<div class="pitem sample-item">
1345					<div class="col-xs-3 col-sm-3 col-md-3 no-padding">
1346						<div class="center-block"><img src="//storage.googleapis.com/i.addblock.net/blitem_empty_img.png" alt="" class="img-responsive"/></div>
1347					</div>
1348				</div>
1349			`;
1350		},
1351		pItem: function(o) {
1352			// console.log('psearch pItem',o);
1353			var img_path = (typeof o.settings.storage != 'undefined' && o.settings.storage) ? o.settings.storage : property.RPATH;
1354			var img_original = (typeof o.settings.storage != 'undefined' && o.settings.storage) ? img_path + '1920/' : img_path;
1355			var img_src = getServeImage(o.image,600,img_path);
1356			var src_s0 = getServeImage(o.image,'0',img_path);
1357
1358			var glink = (typeof o.settings.glink != 'undefined' && o.settings.glink) ? o.settings.glink : '';
1359			var glink_target = (typeof o.settings.glink_target != 'undefined' && o.settings.glink_target) ? o.settings.glink_target : '';
1360
1361			if(glink) {
1362				if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
1363					var bookmark_seq = glink.replace(/^\@/g,'');
1364					if(typeof property.SETTINGS.blockBookmarkList == 'undefined' || typeof property.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
1365						glink = '';
1366						glink_target = '';
1367					}
1368				} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
1369					glink_target = '';
1370				} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),property.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
1371				} else {																					// link-type: link-out      ==> a[attr-link]
1372					if(checkBase64Encode(glink)) glink = Base64.decode(glink);
1373				}
1374			}
1375
1376			var pitem_src = '';
1377			var pitem_option = '';
1378
1379			if(glink) {
1380				pitem_src = makeLinkUrl(glink, property.ONE, property.VIEW);
1381
1382				if(glink.match(/^\@/g) !== null) {
1383					pitem_option = 'attr-bookmark="' + glink.replace(/^\@/g,'') + '"';
1384				} else if(glink.match(/^flink\@[0-9]/g) !== null) {
1385					pitem_option = 'attr-flink="' + glink.replace(/^flink\@/g,'') + '"';
1386				} else if(property.MENULIST.includes(glink.replace(/ /g,'-'))) {
1387					pitem_option = 'data-user-link="' + pitem_src + '"';
1388				} else {
1389					var checkURL = /(http(s)?:\/\/)?\S+(\.[^(\n|\t|\s|\/))]+)+/gi;
1390					if(checkURL.test(glink)) pitem_option = 'attr-link="' + glink + '"';
1391					else pitem_src = 'javascript:;';
1392				}
1393			} else {
1394				// etc(page) 해당 페이지로 이동
1395				if (o.type === 'page') {
1396					var map = property.MENU_BREADCRUMB_MAP || {};
1397
1398					// 1) page slug 구하기: "스토리-서브11122,580901" 같은 경우 대비
1399					var pageRaw = (o.page || '').toString();
1400					var slug = pageRaw.indexOf(',') > -1 ? $.trim(pageRaw.split(',')[0]) : pageRaw;
1401
1402					// 2) 상세 URL이 있든 없든 메뉴 키는 "/slug" 로 맞춰서 lookup
1403					var key = $.psearch.normalizeHref('/' + slug);
1404					var crumb = map[key];
1405
1406					if (crumb) {
1407						o.cont = crumb; // "홈 > 브랜드 스토리 > 스토리 서브11122"
1408					} else {
1409					// fallback
1410						o.cont = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + slug.replace(/-/g,' ');
1411					}
1412
1413					// /url/view/id 로 이동
1414					if (pageRaw.indexOf(',') > -1) {
1415
1416						var parts = pageRaw.split(',');
1417						var urlPage = $.trim(parts[0] || '');
1418						var viewId  = $.trim(parts[1] || '');
1419
1420						if (urlPage && viewId) {
1421							// /{urlPage}/view/{viewId}
1422							pitem_src = ((property.URL=='/') ? '' : property.URL) + '/' + urlPage + '/view/' + viewId;
1423							pitem_option = ''; // view 링크는 data-user-link 필요없음
1424						} else {
1425							pitem_src = 'javascript:;';
1426						}
1427
1428					} else {
1429						if (property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1430							pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1431							pitem_option = 'data-user-link="' + o.page + '" data-psearch-pid="' + o.pid + '"';
1432						} else {
1433							pitem_src = 'javascript:;';
1434						}
1435					}
1436
1437				// forum은 /forum/view/{id} 로 이동
1438				} else if (o.type === 'forum') {
1439
1440					var base = (PAGE_MODE == 'r') ? '/render' : '';
1441					pitem_src = base + '/forum/view/' + o.id;
1442					pitem_option = ''; // forum은 data-user-link 필요 없음
1443
1444				// 쇼핑(상품) view 페이지 유지
1445				} else if (o.type === 'gallery' && o.p_mode === 'shopping') {
1446
1447					pitem_src = ((property.URL == '/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1448
1449				// 갤러리(상세페이지) view 페이지 이동
1450				} else if (o.type === 'gallery' && o.p_mode === 'project') {
1451
1452					pitem_src = ((property.URL == '/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1453
1454				// 일반 갤러리/기타 → 해당 페이지로 이동 (블럭 위치로)
1455				} else {
1456
1457					if (property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1458						pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1459						pitem_option = 'data-user-link="' + o.page + '" data-psearch-pid="' + o.pid + '"';
1460					} else {
1461						pitem_src = 'javascript:;';
1462					}
1463
1464				}
1465			}
1466
1467			// } else {
1468			// 	if (o.p_mode == 'gallery') {
1469			// 		if(property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1470			// 			var pitem_cookie = (o.p_cookie == 'gallery') ? 'data-psearch-pid="' + o.pid + '"' : 'data-
1470psearch-seq="' + o.id + '"';
1471			// 			pitem_option = 'data-user-link="' + o.page + '" '+pitem_cookie;
1472			// 			pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1473			// 		} else {
1474			// 			pitem_src = 'javascript:;';
1475			// 		}
1476			// 	} else {
1477			// 		pitem_src = ((property.URL=='/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1478			// 	}
1479			// }
1480			var isGallery = (o.type === 'gallery') ? '<img src="' + o.thumb + '" alt="" class="img-responsive" />' : '';
1481			// console.log(o);
1482			var str = '\
1483					<div class="col-xs-6 col-sm-4 col-md-3 no-padding pitem" data-index="' + o.num + '" data-pid="' + o.pid + '" data-gid="' + o.id + '">\
1484						<a href="'+pitem_src+'" '+ pitem_option + '>\
1485							'+ isGallery +'\
1486							<div class="info-wrap">\
1487								<h5 class="'+ ($.inArray('title', o.field_disable) > -1 ? 'hide' : '') +'">' + o.title + '</h5>\
1488							';
1489				if(o.p_mode == 'shopping' || o.p_mode == 'gallery') str += '<p class="'+ ($.inArray('caption', o.field_disable) > -1 ? 'hide' : '') +'">' + o.cont + '</p>';
1490				else str += '<p class="'+ ($.inArray('cont', o.field_disable) > -1 ? 'hide' : '') +'">' + o.cont + '</p>';
1491								
1492				if(o.p_mode == 'shopping') {
1493					if(o.price) {
1494						str += '\
1495								<p class="price-box '+ ($.inArray('price', o.field_disable) > -1 ? 'hide' : '') +'"><span class="figure-krw">₩</span> ' + o.price + '</p>\
1496								<span></span>\
1497						';
1498					}
1499
1500					if(o.review_onoff && o.review_cnt > 0) {
1501						str += '\
1502								<ul class="review-box">\
1503									<li class="review-cnt">리뷰 <span class="sh-pcolor">' + o.review_cnt + '</span></li>\
1504									<li class="review-score">평점 <span class="sh-pcolor">' + o.review_score + '</span></li>\
1505								</ul>\
1506						';
1507					}
1508
1509			// let str = `
1510			// <div class="col-xs-6 col-sm-4 col-md-3 no-padding pitem" data-index="${o.num}" data-pid="${o.pid}" data-gid="${o.id}">
1511			// 	<a href="${pitem_src}" ${pitem_option}>
1512			// 		<img src="${o.thumb}" alt="" class="img-responsive" />
1513			// 		<div class="info-wrap">
1514			// 			<h5>${htmlDecode(o.title)}</h5>
1515			// 			<p>${htmlDecode(o.cont)}</p>
1516			// `;
1517
1518					var basket_class = (o.basket_off || $.inArray('basket', o.field_disable) > -1) ? 'hide' : '';
1519					str += '\
1520							<div class="basket-box ' + basket_class + '"><span class="basket-btn">장바구니 담기</span></div>\
1521					';
1522				}
1523				
1524				if(o.type == 'forum') {
1525					// var cate = o.cate;
1526					// if(cate == '') cate = '카테고리 없음'
1527					str += '\
1528						<p>\
1529							<span class="'+ ($.inArray('name', o.field_disable) > -1 ? 'hide' : '') +'">'+ o.name +' |</span>\
1530							<span class="'+ ($.inArray('date', o.field_disable) > -1 ? 'hide' : '') +'">'+ o.date +' |</span>\
1531							<span class="'+ ($.inArray('hit', o.field_disable) > -1 ? 'hide' : '') +'"><svg viewBox="0 0 16 16" width="16" height="16"><path d="M10.4 6.9c.4 1.3-.4 2.7-1.8 3.1-1.3.4-2.7-.4-3.1-1.8v-.5c0-.2.2-.2.3-.2h.5c.9 0 1.7-.7 1.7-1.7v-.5c0-.1 0-.3.2-.3 1.1 0 2 .8 2.3 1.9ZM8 4.3c-2.7 0-4.1 1.8-4.9 3.4v.6C4 9.9 5.3 11.7 8 11.7s4.1-1.8 4.9-3.4v-.6C12 6.1 10.7 4.3 8 4.3m0-1c3.3 0 4.9 2.3 5.8 4 .3.5.3 1 0 1.5-.9 1.6-2.5 4-5.8 4s-4.9-2.3-5.8-4c-.3-.5-.3-1 0-1.5.9-1.6 2.5-4 5.8-4Z"></path></svg>'+ o.hit +' |</span>\
1532							<span class="'+ ($.inArray('comment', o.field_disable) > -1 ? 'hide' : '') +'"><svg viewBox="0 0 16 16" width="16" height="16"><path d="M9.6 3h-3C4.3 3 2.2 4.7 2 7c-.1 1.6.6 3 1.8 3.8 0 .5-.2 1-.5 1.6-.1.3.1.6.4.6h.2c.7-.3 1.6-.7 2.4-1.3h3c2.3 0 4.3-1.6 4.6-3.9.2-2.6-1.8-4.7-4.4-4.7Zm-.2 7.6H6.1l-.3.2c-.3.3-.7.5-1 .6v-1.1l-.4-.4c-1-.7-1.5-1.8-1.4-3 .1-1.7 1.7-3.1 3.6-3.1h3c1 0 1.9.4 2.5 1.1.6.7.9 1.6.8 2.5-.2 1.7-1.7 3-3.6 3Z"></path></svg>'+ o.comment +'</span>\
1533						</p>\
1534					';
1535				}
1536				str += '\
1537							</div>';
1538				if(o.type == 'forum') {
1539					var thumb = (o.thumb) ? o.thumb : '//storage.googleapis.com/i.addblock.net/icon/noimage_250_black.png',
1540						empty = (o.thumb == '') ? 'empty' : '';
1541					str += '\
1542						<div class="image-wrap '+ empty +'"><image src='+ thumb +'></div>\
1543					';
1544				}
1545				str += '\
1546						</a>\
1547					</div>\
1548			';
1549			// console.log(str);
1550			return str;
1551		},
1552		// setPagination: function($obj,stx,total,page_num,view) {
1553		// 	// console.log('psearch setPagination');
1554		// 	var checkLux = (PAGE_MODE == 'c') ? LUX : property.LUX;
1555		// 	if(checkLux) stx += location.search;
1556
1557		// 	var p_url = (PAGE_MODE == 'r') ? '/render' : '',
1558		// 		page_view = 5,
1559		// 		total_page = Math.ceil(total/view),
1560		// 		start_page = (page_num%page_view) ? page_num - (page_num%page_view) + 1 : page_num - (page_view-1), 
1561		// 		end_page = start_page + (page_view-1);
1562		// 	if(end_page > total_page) end_page = total_page;
1563
1564		// 	var prev_page = ((start_page-1) == 0) ? 1 : start_page-1,
1565		// 		next_page = ((end_page+1) > total_page) ? end_page : end_page+1;
1566
1567		// 	$obj.find('li').addClass('psearch-page');
1568
1569		// 	var $first = $obj.children().first().clone(),
1570		// 		$prev = $obj.children().first().clone(),
1571		// 		$next = $obj.children().last().clone(),
1572		// 		$last = $obj.children().last().clone();
1573
1574		// 	$obj.empty();
1575		// 	$first.find('a').attr('href',p_url+'/psearch/num/1/stx/'+stx).find('i').removeClass('fa-angle-left').addClass('fa-angle-double-left');
1576		// 	$prev.find('a').attr('href',p_url+'/psearch/num/'+prev_page+'/stx/'+stx);
1577		// 	$next.find('a').attr('href',p_url+'/psearch/num/'+next_page+'/stx/'+stx);
1578		// 	$last.find('a').attr('href',p_url+'/psearch/num/'+total_page+'/stx/'+stx).find('i').removeClass('fa-angle-right').addClass('fa-angle-double-right');
1579
1580		// 	$obj.append($prev).append($next);
1581		// 	for(i=start_page; i<=end_page; i++) {
1582		// 		var active = (i == page_num) ? 'active' : '';
1583		// 		$obj.children().last().before($('<li class="psearch-page '+ active +'"><a href="'+p_url+'/psearch/num/'+i+'/stx/'+stx+'">' + i + '</a></li>'));
1584		// 	}
1585
1586		// 	if(start_page == prev_page) $obj.children().eq(0).hide();
1587		// 	if(end_page == next_page) $obj.children().last().hide();
1588
1589		// 	// if(start_page > page_view) $obj.prepend($first);
1590		// 	// if(end_page < total_page) $obj.append($last);
1591
1592		// },
1593		bindClientPagination: function($wrap){
1594			$wrap.find('.psearch-client-nav .psearch-page a').off('click').on('click', function(e){
1595				e.preventDefault();
1596
1597				var $nav = $(this).closest('.psearch-client-nav');
1598				if($nav.find('li.disabled').length && $(this).parent().hasClass('disabled')) return;
1599
1600				var key = $nav.attr('data-key');     // 예: "shopping" 또는 "all:shopping"
1601				var page = parseInt($(this).attr('data-page'), 10) || 1;
1602
1603				if (typeof key === 'string' && key.indexOf('all:') === 0) {
1604					var sectionKey = key.replace('all:', '');
1605					var secPages = $wrap.data('psearchAllSectionPages') || {};
1606					secPages[sectionKey] = page;
1607					$wrap.data('psearchAllSectionPages', secPages);
1608				} else if (typeof key === 'string') {
1609					var tabPages = $wrap.data('psearchTabPages') || {};
1610					tabPages[key] = page;
1611					$wrap.data('psearchTabPages', tabPages);
1612				} else {
1613					// 디버깅용
1614					console.warn('psearch pagination key is undefined', this);
1615				}
1616
1617				// 패널 재렌더
1618				$.psearch.rerenderPanels($wrap);
1619				$.psearch.initTabs($wrap);
1619 // 활성 탭 유지
1620			});
1621		},
1622		renderAllSection: function($wrap, sectionKey, list){
1623			var total = (list && list.length) ? list.length : 0;
1624
1625			// ✅ 전체탭에서만 쓰는 섹션이므로: 결과 없으면 아예 출력하지 않음
1626			if(total === 0) return '';
1627
1628			var pageSize = $wrap.data('psearchPageSize') || 8;
1629			var secPages = $wrap.data('psearchAllSectionPages') || {};
1630			var cur = secPages[sectionKey] || 1;
1631
1632			var totalPage = Math.ceil(total / pageSize);
1633			var sliced = list.slice((cur-1)*pageSize, cur*pageSize);
1634
1635			var title_name = (sectionKey == 'shopping') ? $.lang[LANG]['fheader.psearch.shopping']
1636							: (sectionKey == 'forum') ? $.lang[LANG]['fheader.psearch.forum']
1637							: (sectionKey == 'gallery') ? $.lang[LANG]['fheader.psearch.gallery']
1638							: $.lang[LANG]['fheader.psearch.etc'];
1639
1640			var html = '<div class="psearch-all-section" data-section="'+sectionKey+'">';
1641			html += '<div class="psearch-section-title">'+title_name+'</div>';
1642
1643			html += '<div class="row multi-columns-row" data-loop="true">';
1644			for(var i=0;i<sliced.length;i++){
1645				html += $.psearch.pItem(sliced[i]);
1646			}
1647			html += '</div>';
1648
1649			// 섹션 페이지네이션(원하는 정책대로: 1페이지도 무조건 노출이면 totalPage<=0 체크로 조정)
1650			html += $.psearch.renderSectionPagination(sectionKey, cur, totalPage);
1651
1652			html += '</div>';
1653			return html;
1654		},
1655		renderTabPanel: function($wrap, tabKey, list){
1656			var pageSize = $wrap.data('psearchPageSize') || 8;
1657			var tabPages = $wrap.data('psearchTabPages') || {};
1658			var cur = tabPages[tabKey] || 1;
1659
1660			var total = (list && list.length) ? list.length : 0;
1661			var totalPage = Math.ceil(total / pageSize);
1662			var sliced = (total > 0) ? list.slice((cur-1)*pageSize, cur*pageSize) : [];
1663
1664			var html = '<div class="psearch-panel" data-tab="'+tabKey+'" style="display:none;">';
1665
1666			if(total === 0){
1667			html += '<div class="row text-center pitem-empty">' + $.lang[LANG]["fheader.psearch.pitem-empty"] + '</div>';
1668			} else {
1669			html += '<div class="row multi-columns-row" data-loop="true">';
1670			for(var i=0;i<sliced.length;i++){
1671				html += $.psearch.pItem(sliced[i]);
1672			}
1673			html += '</div>';
1674
1675			// 탭 pagination
1676			html += $.psearch.renderTabPagination(tabKey, cur, totalPage);
1677			}
1678
1679			html += '</div>';
1680			return html;
1681		},
1682		rerenderPanels: function($wrap){
1683			var groups = $wrap.data('psearchGroups') || {};
1684			if(!groups) return;
1685
1686			// 패널 영역만 다시 그림
1687			var $panels = $wrap.find('.psearch-tab-panels');
1688			if($panels.length==0) return;
1689
1690			var html = '';
1691
1692			// all 패널
1693			html += (function(){
1694				function renderSection(sectionKey, list){
1695					return $.psearch.renderAllSection($wrap, sectionKey, list);
1696				}
1697				var h = '<div class="psearch-panel" data-tab="all" style="display:none;">';
1698				h += renderSection('shopping', groups.shopping);
1699				h += renderSection('gallery', groups.gallery);
1700				h += renderSection('forum', groups.forum);
1701				h += renderSection('etc', groups.etc);
1702				h += '</div>';
1703				return h;
1704			})();
1705
1706			// 탭 패널들
1707			html += $.psearch.renderTabPanel($wrap, 'shopping', groups.shopping);
1708			html += $.psearch.renderTabPanel($wrap, 'forum', groups.forum);
1709			html += $.psearch.renderTabPanel($wrap, 'gallery', groups.gallery);
1710			html += $.psearch.renderTabPanel($wrap, 'etc', groups.etc);
1711
1712			$panels.html(html);
1713
1714			// 클릭 바인딩 다시
1715			$.psearch.bindClientPagination($wrap);
1716		},
1717		renderSectionPagination: function(sectionKey, current, totalPage){
1718			if(totalPage <= 0) return '';
1719
1720			var pageView = 5;
1721			var start = (Math.floor((current-1)/pageView)*pageView) + 1;
1722			var end = Math.min(start + pageView - 1, totalPage);
1723			var showArrows = totalPage > pageView;
1724			var prevBlock = Math.max(1, start-1);
1725			var nextBlock = Math.min(totalPage, end+1);
1726
1727			// all 탭 섹션용 key는 "all:섹션"
1728			var html = '<nav class="text-center clear psearch-client-nav" data-key="all:'+sectionKey+'">';
1729			html += '<ul class="pagination pagination-sm psearch-pagination">';
1730
1731			if(showArrows){
1732				html += '<li class="psearch-page prev '+(start==1?'disabled':'')+'">'
1733				+ '<a href="#" data-page="'+prevBlock+'"><i class="fa fa-angle-left"></i></a></li>';
1734			}
1735
1736			for(var p=start; p<=end; p++){
1737				html += '<li class="psearch-page '+(p==current?'active':'')+'">'
1738				+ '<a href="#" data-page="'+p+'">'+p+'</a></li>';
1739			}
1740
1741			if(showArrows){
1742				html += '<li class="psearch-page next '+(end==totalPage?'disabled':'')+'">'
1743				+ '<a href="#" data-page="'+nextBlock+'"><i class="fa fa-angle-right"></i></a></li>';
1744			}
1745
1746			html += '</ul></nav>';
1747			return html;
1748		},
1749		renderTabPagination: function(tabKey, current, totalPage){
1750			if(totalPage <= 0) return '';
1751
1752			var pageView = 5;
1753			var start = (Math.floor((current-1)/pageView)*pageView) + 1;
1754			var end   = Math.min(start + pageView - 1, totalPage);
1755			var showArrows = totalPage > pageView; // 6페이지 이상일 때만 prev/next
1756			var prevBlock = Math.max(1, start-1);
1757			var nextBlock = Math.min(totalPage, end+1);
1758
1759			var html = '<nav class="text-center clear psearch-tab-navpage" data-tkey="'+tabKey+'">';
1760			html += '<ul class="pagination pagination-sm psearch-pagination">';
1761
1762			if(showArrows){
1763				html += '<li class="psearch-page prev '+(start==1?'disabled':'')+'">'
1764						+ '<a href="#" data-page="'+prevBlock+'"><i class="fa fa-angle-left"></i></a></li>';
1765			}
1766			for(var p=start; p<=end; p++){
1767				html += '<li class="psearch-page '+(p==current?'active':'')+'">'
1768					+ '<a href="#" data-page="'+p+'">'+p+'</a></li>';
1769			}
1770			if(showArrows){
1771				html += '<li class="psearch-page next '+(end==totalPage?'disabled':'')+'">'
1772						+ '<a href="#" data-page="'+nextBlock+'"><i class="fa fa-angle-right"></i></a></li>';
1773			}
1774
1775			html += '</ul></nav>';
1776			return html;
1777		},
1778		showSiteProjectSEARCH: function(view_page) {
1779			// console.log('psearch showSiteProjectSEARCH');
1780			if(PAGE_MODE == 'c') return false;
1781			$('.cl-popupBanner.openPopupBanner').addClass('zindex20');
1782
1783			var sid = property.SID,
1784				checkUsedMpcWeb = property.SETTINGS.vpMode_onoff;
1785			
1786			var active_nav = $('.el-menu header');
1787			if(window.innerWidth <= 768) active_nav = active_nav.is('.cl-nav') ? $('.clnav-sidemobile') : $('#mobile-nav');
1788
1789			var psearchWarp = active_nav.find('.psearch-overlay');
1790			if(view_page) psearchWarp = $('.psearch-view').find('.psearch-wrap');
1791
1792			psearchWarp.find('input.psearch-input').live({
1793				focus: function() {
1794				},
1795				keydown: function(key) {
1796					if(key.keyCode == 13) psearchWarp.find('.psearch-icon').click();
1797				},
1798			});
1799
1800			psearchWarp.find('.psearch-icon').live({
1801				click: function() {
1802					var psearch_wrap = $(this).closest('.psearch-body');
1803					var psearch_input = $(this).closest('.psearch-wrap').find('input.psearch-input');
1804                    var regExp = new RegExp('^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣\\?\\@\\!\\- ]*$');
1805					var stx = psearch_input.val().trim();
1806					var error_str = '';
1807
1808					if(stx.length == 0) error_str = $.lang[LANG]['psearch.input.empty'];
1809					else if(!regExp.test(stx)) error_str = $.lang[LANG]['psearch.input.regexp'];
1810
1811					if(error_str.length > 0) {
1812						if(psearch_wrap.find('.error').length > 0) psearch_wrap.find('.error').html('<i class="cl-icon alert02"></i> ' + error_str);
1813						else psearch_input.closest('.psearch-wrap').after('<span class="error"><i class="cl-icon alert02"></i> ' + error_str + '</span>');
1814						
1815						psearch_input.focus();
1816						return;
1817					} else {
1818						psearch_wrap.find('.error').remove();
1819					}
1820
1821					//check mpcWeb Mode
1822					if(checkUsedMpcWeb) {
1823						var viewportMode = property.SETTINGS.viewportMode,
1824							vpmode = (typeof $('.mobilepc_ch').attr('data-desktop-option') != 'undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : viewportMode;
1825						$.cookie('desktop-option',vpmode, { path: '/' });
1826					}
1827					
1828					var url = (PAGE_MODE=='s') ? '' : '/render',
1829						href = url + '/psearch/num/1/stx/' + encodeURIComponent(stx);
1830					location.href = href;
1831
1832				}
1833			});
1834
1835		},
1836		normalizeHref: function(href) {
1837			href = (href || '').toString().trim();
1838			if(!href) return '';
1839
1840			href = href.replace(/^\/render/i, '');
1841			href = href.split('#')[0].split('?')[0];
1842
1843			if(/^https?:\/\//i.test(href)){
1844				try { href = new URL(href).pathname; } catch(e){}
1845			}
1846
1847			href = href.replace(/\/view\/\d+$/i, '');
1848
1849			if(href && href.charAt(0) !== '/') href = '/' + href;
1850			return href;
1851		},
1852		buildMenuBreadcrumbMap: function(menuOption) {
1853			var map = {}; // key: normalized href  value: "홈 > 메인 > 서브"
1854
1855			if(!menuOption || !menuOption.length) return map;
1856
1857			for(var i=0; i<menuOption.length; i++){
1858				var m = menuOption[i];
1859				var mainName = (m && m.name) ? m.name : '';
1860				var mainHref = $.psearch.normalizeHref(m && m.href);
1861
1862				if(mainHref){
1863				map[mainHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName;
1864				}
1865
1866				var children = (m && m.children) ? m.children : [];
1867				for(var j=0; j<children.length; j++){
1868				var c = children[j];
1869				var subName = (c && c.name) ? c.name : '';
1870				var subHref = $.psearch.normalizeHref(c && c.href);
1871
1872				if(subHref){
1873					map[subHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName + ' > ' + subName;
1874				}
1875				}
1876			}
1877			return map;
1878		}
1879	}
1880
1881	$.shopping = {
1882		init: function() {
1883			// console.log('shopping init');
1884			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
1885				fheader_selec = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar');
1886
1887			if(!fheader_selec.hasClass('navbar-fheader')) return false;
1888
1889			var sid = (PAGE_MODE == 'c') ? SID : property.SID,				
1890				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE;
1891
1892			var scart = (s_validtype == 'SM') ? true : false;
1893			
1894			if(scart) $.shopping.set('on',checkEllist);
1895			else $.shopping.set('off',checkEllist);
1896		},
1897		set: function(onoff,checkEllist){
1898			var checkClnav =  $.clnav.check();
1899			if(checkClnav) return false;
1900
1901			// console.log('shopping set');
1902			var checkEllist = ( typeof checkEllist!='undefined' && checkEllist) ? checkEllist : false;
1903			fheader_selec = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar');
1904			if(!fheader_selec.hasClass('navbar-fheader')) return false;
1905
1906			if(onoff.match(/on/gi)) $.shopping.makeSiteFixedCART();
1907			else {
1908				$('#fixed-menu, #fixed-menu-sub').find('.siteCART').remove();
1909				$('#tpl-menu').find('.siteCART').remove();
1910				$('div.siteCART.micon').remove();
1911			}
1912		},
1913		makeSiteFixedCART: function() {
1914			var checkClnav =  $.clnav.check();
1915			if(checkClnav) return false;
1916
1917			// console.log('shopping makeSiteFixedCART');
1918			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
1919				pc_nav = (checkEllist) ? $('.elviewhtml header.navbar #fixed-menu, .elviewhtml header.navbar #fixed-menu-sub') : $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub'),
1920				mobile_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
1921				checkfixtype_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
1922				checkFixTypeMenu = (typeof checkfixtype_nav.attr('data-fixtype') != 'undefined' && checkfixtype_nav.attr('data-fixtype')) ? true : false;
1923
1924			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
1925				cart_url = (PAGE_MODE == 'c' || PAGE_MODE == 'r') ? 'javascript:;' : '/_cart',
1926				content = '\
1927				<li class="siteCART">\
1928					<a href="' + cart_url + '"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a>\
1929				</li>\
1930			',
1931				mobile_content = '\
1932				<div class="siteCART micon">\
1933					<a href="' + cart_url + '"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a>\
1934				</div>\
1935			';
1936
1937			/* Shopping Only KO Site */
1938			// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
1939			// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
1940			// 	$('#fixed-menu, #fixed-menu-sub').find('.siteCART').remove();
1941			// 	$('#tpl-menu').find('.siteCART').remove();
1942			// 	$('div.siteCART.micon').remove();
1943			// 	return false;
1944			// }
1945
1946			if(pc_nav.find('.siteCART').length > 0) {
1947				if(checkFixTypeMenu) pc_nav.find('.siteCART').find('a').attr('href',cart_url);
1948				else pc_nav.find('.siteCART').replaceWith(content);
1949			} else pc_nav.append(content);
1950
1951			if(mobile_nav.find('div.siteCART.micon').length>0) {
1952				if(checkFixTypeMenu) mobile_nav.find('div.siteCART.micon').find('a').attr('href',cart_url);
1953				else mobile_nav.find('div.siteCART.micon').replaceWith(mobile_content);
1954			} else {
1955				mobile_nav.find('.navbar-toggle').before(mobile_content);
1956			}
1957
1958			if(pc_nav.find('.siteCART').css('display')=='none') mobile_nav.find('.siteCART.micon').hide();
1959			
1960			var fixed_a_color = (checkFixTypeMenu) ? '' : $('.el-menu .navbar-toggle .
1960icon-bar').css('background-color');
1961			//var mobile_color = $('#mobile-nav').find('.cl-fixbtn.cl-visible').find('svg').css('fill');
1962			if(checkEllist && typeof PAGE_MODE!='undefined' && PAGE_MODE=='c') {
1963				fixed_a_color = mobile_nav.find('.navbar-toggle .icon-bar').css('background-color');
1964			}
1965			
1966
1967			if(pc_nav.closest('header').find('.cl-menu-option').length > 0) {
1968			} else {
1969				mobile_nav.find('div.siteCART.micon').css({
1970					'color': fixed_a_color,
1971					'right': '56px',
1972					'display': (checkFixTypeMenu) ? $('header.navbar-fheader').find('.siteCART.cl-fixbtn').css('display') : ''
1973				});
1974			}
1975			
1976			if(PAGE_MODE == 's') {
1977				var cart_active = Number(property.CART);
1978				// $.ajax({
1979				// 	type: 'POST',
1980				// 	url: '/_basket/check',
1981				// 	data: { sid : sid },
1982				// 	dataType: 'json',
1983				// 	async: true,
1984				// 	success: function(r) {
1985				// 		if(typeof r.error != 'undefined' && r.error) {
1986				// 			// console.log(r.error);
1987				// 			return false;
1988				// 		}
1989				// console.log(property.CART);
1990						if(Number(cart_active) > 0) {
1991							if(checkFixTypeMenu) {
1992								var cart_active_str = cart_active.toString(),
1993									$selec = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub'),
1994									fixtypeNum = $('.el-menu header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),
1995									cart_active_selec = ($selec.find('.siteCART .cart-active-txt').length>0) ? $selec.find('.cart-active-txt') : $selec.find('.cart-active'),									
1996									cart_active_class = (cart_active_str.length>1 && cart_active_str.length<3) ? 'cartActive_2' : ((cart_active_str.length>2 && cart_active_str.length<4) ? 'cartActive_3' : ''),
1997									radius_arr = ['03','04','05','06','10'];
1998
1999								cart_active_selec.text(cart_active);
2000								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').show();
2001								$('.el-menu header.navbar').find('.siteCART.micon .cl_icon_cart').html('<span class="cart-active"></span>');
2002
2003								if($.inArray(fixtypeNum,radius_arr) > -1) $selec.find('.cart-active').removeClass('cartActive_2 cartActive_3').addClass(cart_active_class);
2004								
2005							} else {
2006								var cart_active = '<span class="cart-active"></span>';
2007								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cl_icon_cart').html(cart_active);
2008							}
2009							
2010						} else {
2011							var r = { member : property.UMEMBER },
2012								check_login = (typeof r.member != 'undefined') ? r.member.check_login : false;
2013
2014							// if(!check_login) $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').hide();
2015							// else $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').show();
2016
2017							if(checkFixTypeMenu && Number(cart_active)==0) {
2018								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.cart-active').hide();
2019							}
2020						}
2021				// 	}
2022				// });
2023			} else {
2024				if(PAGE_MODE=='r' && checkFixTypeMenu) $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.cart-active').remove();
2025			}
2026
2027		}
2028	}
2029
2030	$.slang = {
2031		init: function(data) {
2032            // console.log('$.slang.init()');
2033			if(typeof data != 'undefined' && data) {
2034				if(PAGE_MODE == 'c') SLANG = data;
2035				else property.SLANG = data;
2036			}
2037
2038			var slang = (PAGE_MODE == 'c')
2039					? ((typeof SLANG != 'undefined' && SLANG) ? SLANG : {})
2040					: ((typeof property != 'undefined' && property && property.SLANG) ? property.SLANG : {}),
2041				slang_lists = $.isArray(slang['lists']) ? slang['lists'] : [],
2042				s_validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN,
2043				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2044				checkFree = (!s_validplan || s_validtype == 'PK') ? true : false;
2045
2046			if(checkFree || $.isEmptyObject(slang) || slang.use_language != 'on' || slang_lists.length === 0) {
2047				$.slang.set('off');
2048			} else {
2049				$.slang.set('on');
2050			}
2051		},
2052		set: function(onoff) {
2053            // console.log('$.slang.set()');
2054			var check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false,
2055				pc_nav = (check_fh) ? (($('.el-menu > header.navbar').hasClass('sidebar')) ? $('.el-menu > header.navbar') : $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub')) : $('.el-menu header.navbar #tpl-menu'),
2056				mobile_nav = (check_fh) ? $('#mobile-nav #fixed-menu') : $('.el-menu header.navbar'),
2057				checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2058
2059			if(onoff.match(/on/gi)) $.slang.make();
2060			else {
2061				$('.el-menu .siteLANG, #mobile-nav .siteLANG').remove();
2062
2063				if(pc_nav.find('.siteUM').css('display')=='none') {
2064					if(!checkFixOnSearch) {
2065						mobile_nav.parent().addClass('hide');
2066					} else {
2067						mobile_nav.parent().find('.login-content').css('pointer-events','none');
2068						mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2069					}
2070				}
2071			}
2072		},
2073		make: function() {
2074            // console.log('$.slang.make()');
2075			var slang = (PAGE_MODE == 'c')
2076					? ((typeof SLANG != 'undefined' && SLANG) ? SLANG : {})
2077					: ((typeof property != 'undefined' && property && property.SLANG) ? property.SLANG : {}),
2078				check_fh = ($('.el-menu > header.navbar').hasClass('navbar-fheader')) ? true : false,
2079				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2080				slang_data = $.isArray(slang['lists']) ? slang['lists'] : [],
2081				slang_str = (typeof slang['select'] != 'undefined') ? slang['select'] : '',
2082				slang_arrow = (slang_data.length > 1) ? '<i class="cl-icon arrow09" aria-hidden="true"></i>' : '',
2083				slang_list = '',
2084				checkFixLangTypeMenu = (typeof $('.el-menu > header.navbar').attr('data-fixlangtype') != 'undefined' && $('.el-menu > header.navbar').attr('data-fixlangtype')) ? true : false,
2085				pc_nav = (check_fh) ? (($('.el-menu > header.navbar').hasClass('sidebar')) ? $('.el-menu > header.navbar') : $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub')) : $('.el-menu header.navbar #tpl-menu'),
2086				mobile_nav = (check_fh) ? $('#mobile-nav #fixed-menu') : $('.el-menu header.navbar'),
2087				fixbtnData = ($('.el-menu > header.navbar').hasClass('sidebar')) ? $.menuFixBtn.getData(pc_nav) : $.menuFixBtn.getData($('.el-menu > header.navbar')),
2088				checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2089				
2090			if(slang_data.length === 0) {
2091				$.slang.set('off');
2092				return;
2093			}
2094
2095
2096			$.each(slang_data, function(i,o) {
2097				var active = (o['name'] == slang_str) ? 'active' : '';
2098
2099				/* Shopping Only KO Site */
2100				// if(active && o['code'] != 'ko') {
2101				// 	pc_nav.find('.makeSiteSEARCH').remove();
2102				// 	pc_nav.find('.siteCART').remove();
2103				// }
2104
2105				slang_list += '\
2106						<li class="' + active + '"><a href="javascript:;" data-code="' + o['code'] + '">' + o['name'] + '</a></li>\
2107				';
2108			});
2109
2110			/*SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG;*/
2111			var content = (checkFixLangTypeMenu) ? ($('.el-menu > header.navbar').hasClass('sidebar') ? $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false) : $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'])) : '\
2112				<li class="siteLANG dropdown">\
2113					<a href="javascript:;" class="dropdown-toggle"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i> <span class="slang-active">' + slang_str + '</span>' + slang_arrow + '</a>\
2114					<ul class="dropdown-menu">\
2115						' + slang_list + '\
2116					</ul>\
2117				</li>\
2118				',
2119				mobile_content = (checkFixLangTypeMenu) ? $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false,'',true) : ((check_fh) ? '\
2120								<li class="siteLANG dropdown">\
2121									<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-target="#m-dropdown-wrap-lang"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a>\
2122									<div class="dropdown-menu-wrap" id="m-dropdown-wrap-lang">\
2123										<span class="dropdown-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Change Multilingual Site"></span></span>\
2124										<ul class="dropdown-menu">\
2125											' + slang_list + '\
2126										</ul>\
2127									</div>\
2128								</li>\
2129								':'\
2130								<div class="siteLANG micon dropdown">\
2131									<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-target=".siteLANG-dmenu-wrap"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a>\
2132								</div>\
2133								'),
2134				mobile_dropdown_menu = '\
2135				<div class="siteLANG-dmenu-wrap">\
2136					<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2137					<ul class="dropdown-menu">\
2138						' + slang_list + '\
2139					</ul>\
2140				</div>\
2141			';
2142
2143			if(pc_nav.find('.siteLANG').length > 0) {
2144				pc_nav.find('.siteLANG').replaceWith(content);
2145				if($('.el-menu >
2145 header.navbar').hasClass('sidebar')) {
2146					pc_nav.find('.fh-line').remove();
2147					pc_nav.parents('.menu-inner').after('<hr class="fh-line" />');
2148				} 
2149			} else {
2150				pc_nav.find('.siteLANG.cl-fixbtn').remove();
2151				if(checkFixLangTypeMenu && $('.el-menu > header.navbar').hasClass('sidebar')) {
2152					pc_nav.find('.fh-line').remove();
2153					$('.el-menu > header.navbar').find('.menu-inner').after(content);
2154					pc_nav.parents('.menu-inner').after('<hr class="fh-line" />');
2155				} else pc_nav.append(content);
2156			}
2157			if(pc_nav.find('.siteUM').css('display')=='none') {
2158				if(!checkFixOnSearch) {
2159					mobile_nav.parent().addClass('hide');
2160				} else {
2161					mobile_nav.parent().find('.login-content').css('pointer-events','none');
2162					mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2163				}
2164			}
2165		
2166			if(check_fh) {
2167				if(checkFixLangTypeMenu) {
2168					if(mobile_nav.find('.cl-fixbtn.siteLANG').length==0) {
2169						$('#mobile-nav').append(mobile_content);
2170						$('#mobile-nav').find('.cl-fixbtn.siteLANG.dropup .dropdown-backdrop').remove();
2171					}
2172
2173					var mobile_color = mobile_nav.find('.siteSEARCH.cl-fixbtn svg').css('fill');
2174					
2175					$('#mobile-nav').find('.siteLANG.cl-fixbtn a').css({
2176						'color':mobile_color,
2177						'border-color':mobile_color
2178					})
2179
2180					$('#mobile-nav').find('.siteLANG.cl-fixbtn a svg').css('fill',mobile_color);
2181				} else {
2182					if(mobile_nav.find('.siteLANG').length > 0) mobile_nav.find('.siteLANG').replaceWith(mobile_content);
2183					else mobile_nav.append(mobile_content);
2184				}
2185			} else {
2186				if(mobile_nav.find('div.siteLANG.micon').length>0) mobile_nav.find('div.siteLANG.micon').replaceWith(mobile_content);
2187				else mobile_nav.find('.navbar-toggle').before(mobile_content);
2188
2189				if($('div.siteLANG-dmenu-wrap').length>0) $('div.siteLANG-dmenu-wrap').replaceWith(mobile_dropdown_menu);
2190				else if($('div.siteUM-dmenu-wrap').length>0) $('div.siteUM-dmenu-wrap').after(mobile_dropdown_menu);
2191				else $('#tpl-menu').parent().after(mobile_dropdown_menu);
2192
2193				mobile_nav.find('div.siteLANG.micon').css({
2194					'color': $('.el-menu .navbar-toggle .icon-bar').css('background-color'),
2195					'right': '56px',
2196				});
2197			}
2198		}
2199	} /*slang end*/
2200
2201
2202	$.umember = {		
2203		init: function(um_used, um_lang, um_display, callback) {
2204			// console.log('umember init');
2205			
2206			if(typeof um_used != 'undefined' && um_used) {
2207				if(PAGE_MODE == 'c') SITEUM = um_used;
2208				else property.SITEUM = um_used;
2209			}
2210
2211			if(typeof um_lang != 'undefined' && um_lang) {
2212				if(PAGE_MODE == 'c') SITEUMLANG = um_lang;
2213				else property.SITEUMLANG = um_lang;
2214			}
2215
2216			if(typeof um_display != 'undefined' && um_display) {
2217				if(PAGE_MODE == 'c') SITEUMDISPLAY = um_display;
2218				else property.SITEUMDISPLAY = um_display;
2219			}
2220
2221			var s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2222				check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false;
2223
2224			if(s_um == 0 || (typeof s_um == 'string' && s_um == '0')) {
2225				if(check_fh) {
2226					$('#fixed-menu, #fixed-menu-sub').find('.siteUM').remove();
2227					$('#mobile-nav').find('.siteUM').remove();
2228					$('#mobile-nav').find('.mobilenav_top').addClass('hide');
2229				} else {
2230					$('#tpl-menu').find('.siteUM').remove();
2231					$('div.siteUM.micon').remove();
2232					$('div.siteUM-dmenu-wrap').remove();
2233				}
2234				if(typeof callback == 'function') { callback(); }
2235			} else {
2236				if(check_fh) $.umember.makeSiteFixedUM(callback);
2237				else $.umember.makeSiteUM(callback);
2238			}
2239		},
2240		setUM: function(onoff,callback) {
2241			// console.log('umember setUM');
2242			var check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false;
2243			// menu ver2 : navbar-simple(mobile design)
2244			// menu ver3 : navbar-fheader(+shopping cart, mobile slide nav)
2245
2246			if(onoff.match(/on/gi)) {
2247				if(check_fh) $.umember.makeSiteFixedUM(callback);
2248				else $.umember.makeSiteUM(callback);
2249			} else {
2250				if(check_fh) {
2251					$('#fixed-menu, #fixed-menu-sub').find('.siteUM').remove();
2252					$('#mobile-nav').find('.siteUM').remove();
2253				} else {
2254					$('#tpl-menu').find('.siteUM').remove();
2255					$('div.siteUM.micon').remove();
2256					$('div.siteUM-dmenu-wrap').remove();
2257				}
2258
2259				if(typeof callback == 'function') {
2260					callback();
2261				}
2262			}
2263		},
2264		makeSiteFixedUM: function(callback) {
2265			// console.log('umember makeSiteFixedUM');
2266			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
2267				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2268				s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2269				s_um_lang = (PAGE_MODE == 'c') ? SITEUMLANG : property.SITEUMLANG,
2270				s_um_display = (PAGE_MODE == 'c') ? SITEUMDISPLAY : property.SITEUMDISPLAY,
2271				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE;
2272
2273			if( s_validtype != 'BN' && s_validtype != 'SM' ||
2274				s_validtype == 'BN' && s_um == '-1'
2275			) {
2276				$.umember.setUM('off',callback);
2277				return false;
2278			}
2279
2280			if(s_validtype == 'SM' && s_um_display == 'join') s_um_display = 'login';
2281
2282			if(PAGE_MODE == 'c') {
2283				if(typeof callback == 'function') {
2284					callback();
2285				}
2286				return false;
2287			}
2288
2289			var display = (s_um == 1) ? 'login' : s_um_display,
2290				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2291				str = (s_um == 1) ? $.lang[LANG]['manager.site-um.login'] : ((s_um_display) ? $.lang[s_um_lang]['manager.site-um.'+s_um_display] : '');
2292			
2293			// $.post('/umember/login/check', { sid : sid }, function(r) {
2294				var r = { member : property.UMEMBER };
2295
2296				var check_login = (typeof r.member != 'undefined') ? r.member.check_login : false, 
2297					check_admin = (typeof r.member != 'undefined') ? r.member.check_adm : false, 
2298					check_uadmin = (typeof r.member != 'undefined') ? r.member.check_uadm : false,
2299					check_groot = (typeof r.member != 'undefined') ? r.member.check_groot : false,
2300					uadmin_type = (typeof r.member != 'undefined') ? r.member.uadmin_type : '',
2301					check_id_type = (typeof r.member != 'undefined') ? r.member.id_type : '',
2302 					login_id = (typeof r.member != 'undefined') ? r.member.id : '',
2303 					login_nick = (typeof r.member.nick != 'undefined') ? r.member.nick : login_id,
2304 					login_profile = (typeof r.member.profile != 'undefined') ? r.member.profile : '//storage.googleapis.com/i.addblock.net/defaultImg.png',
2305 					f_color = ($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? 'style="color:' + $('.el-menu ul.navbar-nav > li > a').css('color') + ';"' : '',
2306 					checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false,
2307 					fixtype_color = (checkFixTypeMenu) ? (($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? 'style="color:' + $('.el-menu ul.cl-fixed-menu > li > a').css('color') + ';"' : '') : f_color,
2308 					fixtype_menu_color = (checkFixTypeMenu) ? (($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? 'style="color:' + $('.el-menu #tpl-menu > li > a').css('color') + ';"' : '') : f_color,
2309 					checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2310					
2311				var hostAry = window.location.hostname.split('.'),
2312					isCoKr = hostAry[2] == 'co' && hostAry[3] == 'kr',
2313					checkDomain = (hostAry[1] != 'creatorlink' && hostAry[1] != 'addblock') ? true : false,
2314					checkPort = (location.port) ? ':'+location.port : '',
2315					host = (!checkDomain) ? (!isCoKr ? `${hostAry[1]}.${hostAry[2]}` : 'creatorlink.co.kr') : 'creatorlink.net',
2316					host_url = (s_service.indexOf('gabia') > -1) ? '//creatorlink-gabia.com' : '//'+host+checkPort,
2317					menu_url = {
2318						'dashboard': (check_uadmin) ? '/_admin/dashboard' : host_url + '/dashboard',
2319						'member'   : (check_uadmin) ? '/_admin/member' : host_url + '/manager/member',
2320					};
2321
2322				var menu_dashboard_str = (check_admin || check_uadmin) ? '\
2323							<li><a href="' + menu_url['dashboard'] + '" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2324							' : '',
2325					menu_member_str = (check_admin) ? '\
2326							<li><a href="' + host_url + '/manager/member/" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.manage'] + '</a></li>\
2327							' : '',
2328					menu_mygabia_str = (s_service.indexOf('gabia') > -1 && (check_admin || (check_uadmin && check_groot))) ? '\
2329							<li><a href="https://www.gabia.com/mygabia/service" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.mypage.gabia'] + '</a></li>\
2330							' : '',
2331					menu_mypage_str = (check_admin) ? '' : ((checkFixTypeMenu) ? '\
2332							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2333							<li><a class="hand cl-umMenu myinfo-change" href="javascript:;" onclick="myinfoChangeBtn(this)" id="myinfo-change-btn" data-sid="'+sid+'">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>\
2334							' : '<li><a class="mypage" href="javascript:;">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>');
2335
2336				if(checkDomain && check_admin) {
2337					menu_dashboard_str = '\
2338							<li><a class="dashboard cl-umMenu" href="javascript:;" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2339							';
2340				}
2341
2342				if(s_validtype == 'SM') {
2343					if(checkFixTypeMenu) {
2344						var propertySettings = (PAGE_MODE!='c' && typeof property.SETTINGS!='undefined') ? property.SETTINGS : {},
2345							smSettings = (PAGE_MODE!='c' && typeof property.SMSETTINGS!='undefined') ? property.SMSETTINGS : {},
2346							point_settings = (PAGE_MODE!='c' && typeof property.POINGSETTINGS!='undefined') ? property.POINGSETTINGS : {},
2347							point_user = (PAGE_MODE!='c' && typeof point_settings.point_use != 'undefined' && point_settings.point_use) ? point_settings.point_use : '',
2348							coupon_btn_str = (PAGE_MODE!='c' && typeof smSettings.coupon_use_yn != 'undefined' && smSettings.coupon_use_yn == 'Y') ? ('<li><a class="coupon cl-umMenu" href="/_coupon">' + $.lang[LANG]['manager.site-um.mypage.coupon'] + '</a></li>') : '',
2349							point_useStr = (PAGE_MODE!='c' && point_user && point_user=='Y' && LANG=='ko') ? '<li><a class="mypoint cl-umMenu" href="/_point">' + $.lang[LANG]['manager.site-um.mypage.point'] + '</a></li>' : '',
2350							wishlist_btn_str = (typeof propertySettings.product_wishlist_btn != 'undefined' && (propertySettings.product_wishlist_btn=='Y') && LANG=='ko') ? '<li><a class="mywishlist cl-umMenu" href="/_wishlist">' + $.lang[LANG]['manager.site-um.mypage.wishlistbtn'] + '</a></li>' : '';
2351						
2352						menu_mypage_str = (check_admin) ? '' : '\
2353								<li><a class="myorderlist cl-umMenu" href="/_mypage">' + $.lang[LANG]['manager.site-um.mypage.orderlist'] + '</a></li>' 
2354								+ wishlist_btn_str + coupon_btn_str + point_useStr + '\
2355								<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2356								<li><a class="hand myinfo-change cl-umMenu" href="javascript:;" onclick="myinfoChangeBtn(this)" id="myinfo-change-btn" data-sid="'+sid+'">' + $.lang[LANG]['manager.site-um.mypage.new'] + '</a></li>\
2357						';
2358					} else {
2359						menu_mypage_str = (check_admin) ? '' : '\
2360								<li><a class="mypage" href="javascript:;">' + $.lang[LANG]['manager.site-um.mypage.SM'] + '</a></li>\
2361						';
2362					}
2363				}
2364
2365				if(login_id == 'naverpaytest') {
2366					menu_mypage_str = '';
2367				}
2368
2369				var SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG,
2370					lang_str = LANG;
2371
2372				if((typeof SLANG != 'undefined' && typeof SLANG.select_code != 'undefined' && SLANG.select_code)
2373			                || (!$.isEmptyObject(SLANG) && SLANG.use_language == 'on' && SLANG.select_code)) {
2374			        lang_str = (SLANG['select_code'].toLowerCase()!='ko') ? 'en' : LANG;
2375			    } 
2376			  
2377				var login_url = (s_validtype == 'SM') ? '/_login' : 'javascript:;',	
2378					login_content_dropdown_class = (checkFixTypeMenu) ? 'dropdown-toggle' : '',
2379					login_content_dropdown = (checkFixTypeMenu) ? 'data-toggle="dropdown" data-target="#m-dropdown-wrap-um"' : '',
2380					login_svg = (checkFixTypeMenu) ? clSVG('arrow_next',16,16) : '',
2381					login_content = (!check_login) ? '<div class="login-content siteUM"><a href="javascript:;" class="' + display + '" ' + fixtype_color + '>' + $.lang[lang_str]['manager.site-um.mobile.'+s_um_display] + login_svg + '</a></div>' : '\
2382					<div class="login-content '+login_content_dropdown_class+'" '+login_content_dropdown+'>\
2383						<div class="login-profile">\
2384							<img src="' + login_profile + '" alt="" class="img-responsive" />\
2385						</div>\
2386						<div class="login-nick"  ' + fixtype_menu_color + '><span>' + login_nick + '</span> 님</div>\
2387					</div>',
2388					menu_str = menu_dashboard_str + menu_member_str + menu_mygabia_str + menu_mypage_str,
2389					pc_dropdown = (check_login) ? '\
2390					<ul class="dropdown-menu">\
2391							' + menu_str + '\
2392							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2393						</ul>\
2394						' : '',
2395					content = (!check_login) ? '\
2396					<li class="siteUM"><a href="javascript:;" class="' + display + '"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>' : '\
2397					<li class="siteUM dropdown">\
2398						<a href="javascript:;" class="dropdown-toggle"><i class="cl-icon cl_icon_profile_on02" aria-hidden="true"></i></a>\
2399						'+ pc_dropdown +'\
2400					</li>\
2401					',
2402					mobile_dropdown = (check_login) ? '\
2403					<div class="dropdown-menu-wrap" id="m-dropdown-wrap-um">\
2404						<span class="dropdown-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Member Menu"></span></span>\
2405						<ul class="dropdown-menu">\
2406							' + menu_str + '\
2407							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2408						</ul>\
2409					</div>\
2410					' : '',
2411					mobile_content = (!check_login) ? '\
2412					<li class="siteUM"><a href="javascript:;" class="' + display + '"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>' : '\
2413					<li class="siteUM dropdown">\
2414						<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-target="#m-dropdown-wrap-um"><i class="cl-icon cl_icon_profile_on02" aria-hidden="true"></i></a>\
2415						'+ mobile_dropdown +'\
2416					</li>\
2417					';
2418
2419				// IE ERROR_promise__H.20210603
2420				// var successSiteUMLogin = new Promise(function(resolve, reject) {
2421				var successSiteUMLogin = function() {
2422					var deferred = $.Deferred();
2423
2424					var pc_nav = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub'),
2425						mobile_nav = $('#mobile-nav #fixed-menu'),
2426						checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false;
2427
2428					if(pc_nav.find('.siteUM').length > 0) {
2429						if(checkFixTypeMenu) {
2430							setLoginLogoutAttribute(check_login,pc_nav,display);
2431							if(check_login) pc_nav.find('.siteUM').find('.cl-logout').after(pc_dropdown);										
2432						} else pc_nav.find('.siteUM').replaceWith(content);
2433					} else {
2434						if(pc_nav.find('.siteSEARCH').length > 0) pc_nav.find('.siteSEARCH').after(content);
2435						else if(pc_nav.find('.siteCART').length > 0) pc_nav.find('.siteCART').before(content);
2436						else if(pc_nav.find('.siteLANG').length > 0) pc_nav.find('.siteLANG').before(content);
2437						else pc_nav.append(content);
2438					}
2439
2440					if(mobile_nav.find('.siteUM').length > 0) {
2441						if(checkFixTypeMenu) {
2442							setLoginLogoutAttribute(check_login,mobile_nav,display);
2443							if(check_login) mobile_nav.prepend(mobile_dropdown);
2444						} else mobile_nav.find('.siteUM').replaceWith(mobile_content);
2445					} else {
2446						if(mobile_nav.find('.siteSEARCH').length > 0) mobile_nav.find('.siteSEARCH').after(mobile_content);
2447						else if(mobile_nav.find('.siteCART').length > 0) mobile_nav.find('.siteCART').before(mobile_content);
2448						else if(mobile_nav.find('.siteLANG').length > 0) mobile_nav.find('.siteLANG').before(mobile_content);
2449						else mobile_nav.append(mobile_content);
2450					}
2451
2452					
2453					if(mobile_nav.closest('#mobile-nav').find('.login-content').length > 0) mobile_nav.closest('#mobile-nav').find('.login-content').replaceWith(login_content);
2454					else mobile_nav.before(login_content);
2455
2456					if(pc_nav.find('.siteUM').css('display')=='none') {
2457						if(!checkFixOnSearch) {
2458							mobile_nav.parent().addClass('hide');
2459						} else {
2460							mobile_nav.parent().find('.login-content').css('pointer-events','none');
2461							mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2462						}
2463					}
2464
2465					// var loginStr = (checkFixTypeMenu && !check_login) ? mobile_nav.find('.siteUM').removeClass('dropdown').find('.cl-login').clone() : '';
2466
2467					// if(checkFixTypeMenu && (mobile_nav.closest('#mobile-nav').find('.login-content').length > 0) && !check_login) {
2468					// 	$('.mobilenav_top .login-content').html(loginStr);
2469					// } 
2470
2471				// IE ERROR_promise__H.20210603
2472				// 	resolve();
2473				// });
2474					deferred.resolve();
2475					return deferred.promise();
2476				}
2477
2478
2479				// IE ERROR_promise__H.20210603
2480				// successSiteUMLogin.then(function(value) {
2481				successSiteUMLogin().then(function(value) {
2482					if(typeof callback == 'function') {
2483						callback();
2484					}
2485				});
2486
2487
2488			// },'json');
2489
2490
2491		},
2492		makeSiteUM: function(callback) {
2493			// console.log('umember makeSiteUM');
2494			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
2495				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2496				s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2497				s_um_lang = (PAGE_MODE == 'c') ? SITEUMLANG : property.SITEUMLANG,
2498				s_um_display = (PAGE_MODE == 'c') ? SITEUMDISPLAY : property.SITEUMDISPLAY,
2499				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE;
2500
2501			if( s_validtype != 'BN' && s_validtype != 'SM' ||
2502				s_validtype == 'BN' && s_um == '-1') {
2503				$.umember.setUM('off',callback);
2504				return false;
2505			}
2506
2507			if(s_validtype == 'SM' && s_um_display == 'join') s_um_display = 'login';
2508
2509			var display = (s_um == 1) ? 'login' : s_um_display,
2510				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2511				str = (s_um == 1) ? $.lang[LANG]['manager.site-um.login'] : ((s_um_display) ? $.lang[s_um_lang]['manager.site-um.'+s_um_display] : '');
2512
2513			$.post('/umember/login/check', { sid : sid }, function(r) {
2514				var check_login = (typeof r.member != 'undefined') ? r.member.check_login : false, 
2515					check_admin = (typeof r.member != 'undefined') ? r.member.check_adm : false, 
2516					check_uadmin = (typeof r.member != 'undefined') ? r.member.check_uadm : false,
2517					uadmin_type = (typeof r.member != 'undefined') ? r.member.uadmin_type : '',
2518					check_id_type = (typeof r.member != 'undefined') ? r.member.id_type : '',
2519 					login_id = (typeof r.member != 'undefined') ? r.member.id : '',
2520 					login_nick = (typeof r.member.nick != 'undefined') ? r.member.nick : login_
2520id;
2521
2522                var hostAry = window.location.hostname.split('.'),
2523					isCoKr = hostAry[2] == 'co' && hostAry[3] == 'kr',
2524                    checkDomain = (hostAry[1] != 'creatorlink' && hostAry[1] != 'addblock') ? true : false,
2525                    checkPort = (location.port) ? ':'+location.port : '',
2526					host = (!checkDomain) ? (!isCoKr ? `${hostAry[1]}.${hostAry[2]}` : 'creatorlink.co.kr') : 'creatorlink.net',
2527                    host_url = (s_service.indexOf('gabia') > -1) ? '//creatorlink-gabia.com' : '//'+host+checkPort,
2528					menu_url = {
2529					'dashboard': (check_uadmin) ? '/_admin/dashboard' : host_url + '/dashboard',
2530					'member'   : (check_uadmin) ? '/_admin/member' : host_url + '/manager/member',
2531				};
2532
2533				var menu_dashboard_str = (check_admin || check_uadmin) ? '\
2534							<li><a href="' + menu_url['dashboard'] + '" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2535							' : '',
2536					menu_member_str = (check_admin) ? '\
2537							<li><a href="' + host_url + '/manager/member" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.manage'] + '</a></li>\
2538							' : '',
2539					menu_mygabia_str = (s_service.indexOf('gabia') > -1 && (check_admin || (check_uadmin && check_groot))) ? '\
2540							<li><a href="https://www.gabia.com/mygabia/service" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.mypage.gabia'] + '</a></li>\
2541							' : '',
2542					menu_mypage_str = (check_admin) ? '' : '\
2543							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2544							<li><a class="hand myinfo-change cl-umMenu" onclick="myinfoChangeBtn(this)" id="myinfo-change-btn" data-sid="'+sid+'">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>\
2545							';
2546
2547				if(checkDomain && check_admin) {
2548					menu_dashboard_str = '\
2549							<li><a class="dashboard cl-umMenu" href="javascript:;" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2550							';
2551				}
2552
2553				if(s_validtype == 'SM') {
2554					var propertySettings = (PAGE_MODE!='c' && typeof property.SETTINGS!='undefined') ? property.SETTINGS : {},
2555						smSettings = (PAGE_MODE!='c' && typeof property.SMSETTINGS!='undefined') ? property.SMSETTINGS : {},
2556						point_settings = (PAGE_MODE!='c' && typeof property.POINGSETTINGS!='undefined') ? property.POINGSETTINGS : {},
2557						point_user = (PAGE_MODE!='c' && typeof point_settings.point_use != 'undefined' && point_settings.point_use) ? point_settings.point_use : '',
2558						coupon_btn_str = (PAGE_MODE!='c' && typeof smSettings.coupon_use_yn != 'undefined' && smSettings.coupon_use_yn=='Y') ? ('<li><a class="coupon cl-umMenu" href="/_coupon">' + $.lang[LANG]['manager.site-um.mypage.coupon'] + '</a></li>') : '';
2559						point_useStr = (PAGE_MODE!='c' && point_user && point_user=='Y') ? '<li><a class="mypoint cl-umMenu" href="/_point">' + $.lang[LANG]['manager.site-um.mypage.point'] + '</a></li>' : '',
2560						wishlist_btn_str = (typeof propertySettings.product_wishlist_btn != 'undefined' && (propertySettings.product_wishlist_btn=='Y')) ? '<li><a class="mywishlist cl-umMenu" href="/_wishlist">' + $.lang[LANG]['manager.site-um.mypage.wishlistbtn'] + '</a></li>' : '';
2561					
2562					menu_mypage_str = (check_admin) ? '' : '\
2563							<li><a class="myorderlist cl-umMenu" href="/_mypage">' + $.lang[LANG]['manager.site-um.mypage.orderlist'] + '</a></li>'
2564							+ wishlist_btn_str + coupon_btn_str + point_useStr + '\
2565							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2566							<li><a class="hand myinfo-change cl-umMenu" href="javascript:;" onclick="myinfoChangeBtn(this)" id="myinfo-change-btn" data-sid="'+sid+'">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>\
2567					';
2568				}
2569
2570				var menu_str = menu_dashboard_str + menu_member_str + menu_mygabia_str + menu_mypage_str,
2571					content = (!check_login) ? '<li class="siteUM"><a class="' + display + '" href="javascript:;"><span class="glyphicon glyphicon-user"></span> ' + str + '</a></li>' : '\
2572					<li class="siteUM dropdown">\
2573						<a href="javascript:;" class="dropdown-toggle">' + login_nick + ' <i class="' + caret + '" aria-hidden="true"></i></a>\
2574						<ul class="dropdown-menu">\
2575							' + menu_str + '\
2576							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2577						</ul>\
2578					</li>\
2579					',
2580					mobile_content = (!check_login) ? '<div class="siteUM micon"><a class="' + display + '" href="javascript:;"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></div>' : '\
2581					<div class="siteUM micon dropdown">\
2582						<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-target=".siteUM-dmenu-wrap"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a>\
2583					</div>\
2584					',
2585					mobile_dropdown_menu = '\
2586					<div class="siteUM-dmenu-wrap">\
2587						<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2588						<ul class="dropdown-menu">\
2589							' + menu_str + '\
2590							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2591						</ul>\
2592					</div>\
2593				';
2594
2595				if(check_id_type == 'creatorlink' && !check_admin && login_id) { //creatorlink member
2596					var mypage_url = (s_service.indexOf('gabia') > -1) ? '//www.gabia.com/mygabia/service' : '//'+host_url+'/mypage',
2597						mypage_name = (s_service.indexOf('gabia') > -1) ? $.lang[LANG]['manager.site-um.mypage.gabia'] : $.lang[LANG]['manager.site-um.mypage'];
2598
2599					content = '\
2600					<li class="siteUM dropdown">\
2601						<a href="javascript:;" class="dropdown-toggle">' + login_nick + ' <i class="' + caret + '" aria-hidden="true"></i></a>\
2602						<ul class="dropdown-menu">\
2603							<li><a href="' + host_url + '/dashboard" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2604					';
2605
2606					if(!check_uadmin) content +='\
2607							<li><a href="' + mypage_url + '" target="_blank" class="cl-umMenu">' + mypage_name + '</a></li>\
2608					';
2609					content += '\
2610							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2611						</ul>\
2612					</li>\
2613					';
2614					mobile_content = '\
2615					<div class="siteUM micon dropdown">\
2616						<a href="javascript:;" class="dropdown-toggle" data-target=".siteUM-dmenu-wrap"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a>\
2617					</div>\
2618					';
2619					mobile_dropdown_menu = '\
2620					<div class="siteUM-dmenu-wrap">\
2621						<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2622						<ul class="dropdown-menu">\
2623							<li><a href="' + host_url + '/dashboard" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2624							<li><a href="' + mypage_url + '" target="_blank">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>\
2625							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2626						</ul>\
2627					</div>\
2628					';
2629				} 
2630
2631
2632				// IE ERROR_promise__H.20210603
2633				// var successSiteUMLogin = new Promise(function(resolve, reject) {
2634				var successSiteUMLogin = function() {
2635					var deferred = $.Deferred();
2636
2637					if($('#tpl-menu').find('.siteUM').length > 0) $('#tpl-menu').find('.siteUM').replaceWith(content);
2638					else {
2639						if($('#tpl-menu').find('.siteLANG').length > 0 ) $('#tpl-menu').find('.siteLANG').before(content);
2640						else $('#tpl-menu').append(content);
2641					}
2642
2643					if($('div.siteUM.micon').length>0) $('div.siteUM.micon').replaceWith(mobile_content);
2644					else $('.el-menu .navbar-toggle').before(mobile_content);
2645
2646					if($('div.siteUM-dmenu-wrap').length>0) $('div.siteUM-dmenu-wrap').replaceWith(mobile_dropdown_menu);
2647					else $('#tpl-menu').parent().after(mobile_dropdown_menu);
2648
2649					var check_slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
2650					$('.el-menu .navbar-header div.siteUM.micon').css({
2651						'color': $('.el-menu .navbar-toggle .icon-bar').css('background-color'),
2652						'right': ($.isEmptyObject(check_slang)) ? '56px' : '91px',
2653					});
2654
2655				// IE ERROR_promise__H.20210603
2656				// 	resolve();
2657				// });
2658					deferred.resolve();
2659					return deferred.promise();
2660				}
2661
2662				// IE ERROR_promise__H.20210603
2663				// successSiteUMLogin.then(function(value) {
2664				successSiteUMLogin().then(function(value) {
2665					if(typeof callback == 'function') {
2666						callback();
2667					}
2668				});
2669			},'json');
2670
2671		},
2672		showMngModal: function(sid, content, id, backdrop, showcallback, showncallback, hiddencallback, callback, closecallback) {
2673			// console.log('umember showMngModal');
2674			var container = $(content),
2675				backdrop = (typeof backdrop == 'undefined') ? false : true;
2676
2677			$('body').append(container);
2678			var newInstance = jQuery.extend(true, {}, container);
2679			var modalElement = newInstance.find('#' + id);
2680
2681			modalElement.attr('data-sid',sid);
2682
2683			if(backdrop) modalElement.modal({ backdrop : 'static'});
2684			else modalElement.modal();
2685
2686			modalElement.on('show.bs.modal', function(e) {
2687				if(typeof showcallback == 'function') showcallback();
2688			});
2689
2690			modalElement.on('shown.bs.modal', function(e) {
2691				var modal = document.querySelector('.modal');
2692				modal.style.position = 'absolute';
2693				setTimeout(function() {
2694					modal.style.position = 'fixed';
2695				},0);
2696				if(window.innerWidth <= 768) $.mobileToggleMenu.close();
2697				if(typeof showncallback == 'function') showncallback();
2698			});
2699
2700			modalElement.on('hidden.bs.modal', function(e) {
2701				var flat_modal_id = $(this).attr('id');
2702				$('.editor-navbar').css('z-index','1040');
2703				var this_modal = $('#'+flat_modal_id).closest('.flat-modal');
2704				this_modal.next('.modal-backdrop').remove();
2705				this_modal.remove();
2706
2707				if($('.modal-backdrop').length) {
2708					setTimeout(function() {
2709						$('body').addClass('modal-open');    
2710					},10);                
2711				}
2712				$('body').removeClass('no-fixed');
2713
2714				if(typeof hiddencallback == "function") hiddencallback();
2715			});
2716
2717			newInstance.find('.ok-button-dialog').bind('click', function () {
2718				if(typeof callback == 'function')
2719					callback();
2720			});
2721
2722			newInstance.find('.close-button-dialog').bind('click', function () {
2723				if(typeof closecallback == 'function')
2724					closecallback();
2725			});
2726
2727			return modalElement;
2728		},
2729		showJoinModal: function(sid,mode) {
2730			console.log('umember showJoinModal');
2731			mode = (typeof mode != 'undefined' && mode) ? '-' + mode : '';
2732
2733			if($('#join-modal' + mode).length > 0) return false;
2734			if($('#login-modal').length > 0) $('#login-modal').delay(3000).modal('hide');
2735
2736			$.post('/umember/get/type/join', { sid : sid, field : '*' }, function(data) {
2737				if(typeof data.error != 'undefined' && data.error) {
2738					alert(data.error);
2739					return false;
2740				}
2741				
2742				COLLECTION_REGEX = $.parseJSON(data['regExp']);
2743
2744				var content = $.umember.makeJoinModalContent(sid,data,mode);
2745				$.umember.showMngModal(sid, content, 'join-modal' + mode, false,
2746										function() { $.umember.joinModalInit(mode); }, 
2747										function() { $.umember.joinModalKeyFunc(mode); }, '', '', '');
2748				
2749			}, 'json');
2750		},
2751		makeJoinCollectionsTypeVal: function(oval_i,oval_type,oval_v,org_field,optional_class,check_page,val) {
2752			var str = '';
2753
2754			check_page = (typeof check_page != 'undefined' && check_page) ? check_page : '';
2755			val = (typeof val != 'undefined' && val) ? val : '';
2756	
2757			switch (oval_type) {
2758				case 'memo':
2759					str += '\
2760						<textarea class="cl-s-form-control" name="'+org_field+'" cols="120" rows="10" id="cl-etc-input-val-memo">'+oval_v+'</textarea>\
2761					';
2762					break;
2763				case 'radio':
2764					var oval_checked = ((check_page=='mypage') && (oval_v==val)) ? 'checked' : '';
2765					str += '\
2766						<div class="newcheckbox">\
2767							<label>\
2768								<div class="newcheckboxSvgRadio">\
2769									<input type="radio" class="cl-common-form-radio-hide cl-etc-input-val cl-s-form-control" name="'+org_field+'" value="'+oval_v+'" '+oval_checked+'>\
2770									<svg viewBox="0 0 18 18" width="18" height="18">\
2771										<path d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 
27710-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
2772									</svg>\
2773									<svg class="active" viewBox="0 0 18 18" width="18" height="18">\
2774										<path d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 0-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
2775										<circle cx="9" cy="9" r="6"/>\
2776									</svg>\
2777								</div>\
2778								<span>'+oval_v+'</span>\
2779							</label>\
2780						</div>\
2781					';
2782					
2783					break;				
2784					
2785				case 'check':
2786					var oval_checked = ((check_page=='mypage') && (oval_v==val)) ? 'checked' : '';
2787						if(check_page=='mypage' && (val.indexOf('`') > -1)) {
2788							if(val.indexOf(oval_v) > -1) {
2789								oval_checked = 'checked';
2790							}
2791						}
2792						str += '\
2793						<div class="newcheckbox">\
2794							<label>\
2795								<div class="newcheckboxSvg">\
2796									<input type="checkbox" class="cl-common-form-radio-hide cl-etc-input-val cl-s-form-control" id="" name="'+org_field+'" value="'+oval_v+'" '+oval_checked+'>\
2797									<svg viewBox="0 0 16 16" width="16" height="16">\
2798										<path class="st6" d="M3 0h10c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H3c-1.66 0-3-1.34-3-3V3C0 1.34 1.34 0 3 0z"></path>\
2799										<path class="st19" d="M13 1c1.1 0 2 0.9 2 2v10c0 1.1-0.9 2-2 2H3c-1.1 0-2-0.9-2-2V3c0-1.1 0.9-2 2-2H13M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0L13 0z"></path>\
2800									</svg>\
2801									<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
2802										<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
2803										<path class="st19" d="M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0zM13.03 6.03l-5.5 5.5C7.38 11.68 7.19 11.75 7 11.75s-0.38-0.07-0.53-0.22l-3.5-3.5c-0.29-0.29-0.29-0.77 0-1.06s0.77-0.29 1.06 0L7 9.94l4.97-4.97c0.29-0.29 0.77-0.29 1.06 0S13.32 5.74 13.03 6.03z"></path>\
2804									</svg>\
2805								</div>\
2806								<span>'+oval_v+'</span>\
2807							</label>\
2808						</div>\
2809						';
2810					
2811					break;
2812
2813				case 'select':
2814					var selected = ((check_page=='mypage') && (oval_v==val)) ? 'selected' : '';
2815					str += '\
2816						<option value="'+oval_v+'" '+selected+'>'+oval_v+'</option>\
2817					';
2818					
2819					break;
2820
2821				case 'fupload':
2822					str += $.umember.fileHtmlRender(org_field, {
2823						val : val,
2824						type : "type1",
2825					})
2826					break;
2827
2828				default:
2829					break;
2830			}
2831				if(org_field=='etc7') {
2832				console.log(oval_v);
2833				}
2834			return str;
2835						
2836		},
2837		makeJoinConditionsStr: function(sid,data,key,mode) {
2838			// console.log('umember makeJoinConditionsStr');
2839			switch(key) {
2840				case 'captcha' :
2841					return `
2842								<div class="kcaptcha-wrap clearfix ${(data['captcha'] == '1') ? '' : 'hide'}">
2843									<div class="col-xs-4 col-sm-4 col-md-4 no-padding kcaptcha-box">
2844										<p id="write_option"><img src="" id="kcaptcha" alt=""/></p>
2845									</div>
2846									<div class="col-xs-8 col-sm-8 col-md-8 text-left kcaptcha-key-wrap">
2847										<input type="text" id="wr_key" name="wr_key" class="col-xs-12 col-sm-12 col-md-12 ed" placeholder="${$.lang[LANG]['manager.join.cl.captcha-msg']}" />
2848										<a class="kcaptcha-change hand small">${$.lang[LANG]['manager.join.cl.captcha-change']}</a>
2849									</div>
2850								</div>
2851					`;
2852					break;
2853
2854				case 'collections':
2855					var collections_html = '';
2856					$.each(data['collections'], function(field,o) {
2857						if(field == 'email') return;
2858						if(o['used']) {
2859							var org_field = (field == 'addr') ? field + '1' : field,
2860								optional = o['optional'],
2861								name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+org_field],
2862								optional_class = (optional) ? 'optional' : '',
2863								key_func = '',
2864								add_input = '',
2865								jcollection_val_str = '',
2866								fupload_label = '',
2867 								etc_val_type = ['memo','radio','check','select','fupload'];
2868
2869							if(field == 'birth') {
2870								name = $.lang[LANG]['siteum.mypage.Birth'];
2871								key_func = 'onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)"';
2872								key_func = 'onkeydown="auto_date_format(event, this)"';
2873							}
2874						
2875							var star = (optional) ? '<span class="input-star">*</span>' : '';
2876							if(field.indexOf('etc')>-1 && etc_val_type.includes(o['type'])) {
2877								var o_val = o['val'],
2878									o_val_arr = ((o_val.indexOf('`') > -1) && (o['type']=='radio' || o['type']=='check' || o['type']=='select'|| o['type']=='fupload')) ? o_val.split('`') : [o_val],
2879									description_class = (o['description_used']=='true' && (o['type']=='memo')) ? 'use_descr' : '';
2880
2881								add_input = '\
2882								<div class="cl-s-join-collections-etcwrap cl-s-form-wrap '+(o['type']=='fupload' ? 'nodata' : '') +' '+ optional_class + '" data-jcoltype="'+o['type']+'">';
2883								add_input += '\
2884									<div class="cl-s-etc">\
2885										<span class="cl-s-etc-name">'+ name + star +'</span>\
2886										';
2887								add_input += (o['description_used']=='true') ? '<span class="cl-s-etc-description">'+ o['description'] +'</span>' : '';
2888								add_input += '\
2889									</div>\
2890									';
2891
2892								add_input += '\
2893									<div class="cl-s-etc-val '+description_class+'">\
2894								';
2895
2896								if(o['type']=='select') {
2897									add_input += '\
2898									<div class="cl-s-form-group cl-s-form-group-select">\
2899										<select class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required">\
2900											<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
2901									';
2902								} 
2903								if(o_val_arr.length > 0) {
2904									$.each(o_val_arr, function(oval_i,oval_v){
2905										jcollection_val_str += $.umember.makeJoinCollectionsTypeVal(oval_i,o['type'],oval_v,org_field,optional_class);
2906									});
2907								} 
2908								
2909								if(o['type']=='select') {
2910									jcollection_val_str += '\
2911										</select>\
2912										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
2913									</div>\
2914									';
2915								}
2916								jcollection_val_str += '</div></div>';
2917								
2918							} else {
2919								add_input = '\
2920											<div class="cl-s-form-wrap ' + optional_class + '">\
2921												<div class="cl-s-form-group">\
2922													<input type="text" class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required" value="" ' + key_func + '>\
2923													<label for="input" class="cl-s-control-label">' + name + star + '</label>\
2924												</div>\
2925											</div>\
2926									';
2927								
2928								if(field == 'addr') {
2929									var addr_modal = (mode.indexOf('shopping') > -1 || o['addrsearch']) ? 'readonly onfocus="addrSearchModal(\'input\')" ' : '';
2930									add_input = '\
2931											<div class="cl-s-form-wrap ' + optional_class + '">\
2932												<div class="cl-s-form-group">\
2933													<input type="hidden" class="cl-s-form-control" name="postcode" id="input-postcode" value="">\
2934													<input type="text" class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required" value="" ' + addr_modal + '>\
2935													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr1'] + star + '</label>\
2936												</div>\
2937											</div>\
2938											<div class="cl-s-form-wrap">\
2939												<div class="cl-s-form-group">\
2940													<input type="text" class="cl-s-form-control" name="addr2" id="input-addr2" required="required" value="">\
2941													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr2'] + '</label>\
2942												</div>\
2943											</div>\
2944									';
2945								}
2946
2947								if(field == 'gender') {
2948									add_input = '\
2949											<div class="cl-s-form-wrap ' + optional_class + '">\
2950												<div class="cl-s-form-group">\
2951													<select class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required">\
2952														<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
2953														<option value="01">'+$.lang[LANG]['manager.list.info.gender.01']+'</option>\
2954														<option value="02">'+$.lang[LANG]['manager.list.info.gender.02']+'</option>\
2955													</select>\
2956													<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
2957													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.gender'] + star + '</label>\
2958												</div>\
2959											</div>\
2960									';
2961								}
2962
2963								//if(mode == 'shopping_social' && !optional) add_input = '';
2964								if(mode == 'shopping_social' && !o['used']) add_input = '';
2965
2966
2967								if(mode.indexOf('cert') > -1) {
2968									switch (field) {
2969										case 'name':
2970										case 'gender':
2971										case 'birth':
2972										case 'tel':
2973											add_input = '<input id="input-' + org_field + '" type="hidden" name="' + org_field + '" value="">';
2974											break;
2975									}
2976								}
2977							}
2978
2979							collections_html += add_input + jcollection_val_str;
2980
2981						}
2982					});
2983					return collections_html;
2984					break;
2985
2986				default:
2987					return data[key];
2988					break;
2989			}
2990
2991		},
2992		makeJoinModalContent: function(sid,data,mode) {
2993			// console.log('umember makeJoinModalContent');
2994			if(PAGE_MODE == 's') { // 게시사이트 다국어 회원가입 페이지 한글과 섞
2994여나오는 부분 방지
2995				if(property.SLANG.select_code == undefined) {
2996					LANG = 'ko';
2997				} else {
2998					if(property.SLANG.select_code == 'ko') LANG = 'ko';
2999					else LANG = 'en';
3000				}
3001			}
3002			var collections = $.umember.makeJoinConditionsStr(sid,data,'collections',mode),
3003				captcha = $.umember.makeJoinConditionsStr(sid,data,'captcha',mode),
3004				privacy_type = (LANG == 'ko') ? 'privacy-join' : 'privacy',
3005				approval = (typeof data.approval != 'undefined' && data.approval) ? data.approval : 'hand',
3006				mode2 = data.mode2;
3007
3008			var sns_input = (mode == 'shopping_social' || (mode == 'shopping_cert' && mode2 == 'shopping_sns')) ? 'readonly="true"' : '',
3009				content = '\
3010					<div class="cl-s-form-wrap optional">\
3011						<div class="cl-s-form-group">\
3012							<input type="text" class="cl-s-form-control" name="email" id="input-email" required="required" value="" '+sns_input+'>\
3013							<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.email'] + '<span class="input-star">*</span></label>\
3014						</div>\
3015					</div>\
3016			';
3017
3018			if(mode == 'shopping_social' || (mode == 'shopping_cert' && mode2 == 'shopping_sns')) {
3019				content += collections;
3020				var register_form_arr = {
3021					'content' : content
3022				}
3023			} else {
3024				content += '\
3025						<div class="cl-s-form-wrap optional">\
3026							<div class="cl-s-form-group">\
3027								<input type="password" class="cl-s-form-control" name="password" id="input-password" required="required" value="">\
3028								<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password'] + '<span class="input-star">*</span></label>\
3029							</div>\
3030						</div>\
3031						<div class="cl-s-form-wrap optional">\
3032							<div class="cl-s-form-group">\
3033								<input type="password" class="cl-s-form-control" name="password_checked" id="input-password-checked" required="required" value="">\
3034								<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password-check'] + '<span class="input-star">*</span></label>\
3035							</div>\
3036						</div>\
3037						<div class="cl-s-form-description">' + $.lang[LANG]['siteum.login.password.description'] + '</div>\
3038						' + collections + '\
3039				';
3040				var register_form_arr = {
3041					'content' : content,
3042					'captcha' : captcha
3043				}
3044			}
3045			return register_form_arr;
3046		},
3047		joinModalInit: function(mode) {
3048			// console.log('umember joinModalInit');
3049			mode = (mode) ? '-' + mode : '';
3050			var joinModal = $('#join-modal' + mode);
3051
3052			joinModal.find('.form-group').each(function() {
3053				$(this).removeClass('focus');
3054				$(this).find('.error').remove();
3055				$(this).find('input.form-control').val('');
3056				$(this).find('#join-textarea').html('');
3057			});
3058			
3059			joinModal.find('#wr_key').val('');
3060		},
3061		joinModalKeyFunc: function(mode) {
3062			// console.log('umember joinModalKeyFunc');
3063			mode = (mode) ? '-' + mode : '';
3064			var joinModal = $('#join-modal' + mode);
3065
3066			if(!joinModal.find('.kcaptcha-wrap').hasClass('hide')) {
3067				load_kcaptcha();
3068				joinModal.find('#wr_key').live({
3069					keyup: function() {
3070						if($(this).val().trim().length > 0) { $(this).next('.error').remove(); }
3071					}
3072				});
3073			}
3074
3075			joinModal.find('input.form-control').live({
3076				focus: function() {
3077					$(this).closest('.form-group').addClass('focus').siblings().removeClass('focus');
3078				}, 
3079				blur: function() {
3080					$(this).closest('.form-group').removeClass('focus');
3081				},
3082				keydown: function(key) {
3083					if(key.keyCode == 13) $('#uJoin').click();
3084				},
3085				keyup: function() {
3086					var groupEl = $(this).closest('.form-group'),
3087						errorEL = $(this).next().next('.error'),
3088						field = $(this).attr('id').trim().replace(/input-/,''),
3089						reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
3090						reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
3091						reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
3092
3093					if(field=='password' || field == 'password-checked') {
3094						var pwEl = joinModal.find('#input-password'),
3095							pw2El = joinModal.find('#input-password-checked'),
3096							error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
3097
3098						if(pwEl.val() == pw2El.val()) { 
3099							pw2El.next().next('.error').remove();
3100						} else {
3101							if(pw2El.val().length > 0) {
3102								if(pw2El.next().next('.error').length > 0) pw2El.next().next('.error').removeClass('empty').text(error_str);
3103								else pw2El.closest('.form-group').append('<span class="error">'+ error_str + '</span>');
3104							}
3105						}	
3106					}
3107
3108					if(reg_has && errorEL.length > 0) { 
3109
3110						var reg = new RegExp(reg_pattern);
3111						if(reg.test($(this).val())) errorEL.remove();
3112						else {
3113							if(errorEL.hasClass('empty')) errorEL.removeClass('empty').text(reg_ex);
3114						}
3115
3116					}
3117
3118				}
3119			});
3120		},
3121		showLoginModal: function(sid) {
3122			// console.log('umember showLoginModal');
3123			if($('#join-modal').length > 0 ) $('#join-modal').delay(3000).modal('hide');
3124			if($('#forgotpw-modal').length > 0 ) $('#forgotpw-modal').delay(3000).modal('hide');
3125
3126			var content = $.umember.makeLoginModalContent();
3127			$.umember.showMngModal(sid, content, 'login-modal', false,
3128									function() { $.umember.LoginModalInit(); }, 
3129									function() { $.umember.loginModalKeyFunc(); }, '', '', '');
3130		},
3131		makeLoginModalContent: function() {
3132			// console.log('umember makeLoginModalContent');
3133			var s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
3134				join_btn = (s_um == 1) ? '' : '<div class="btn-join siteUM"><span class="join hand">' + $.lang[LANG]['manager.site-um.join.3'] + '</span></div>',
3135				privacy_type = (LANG == 'ko') ? 'privacy-join' : 'privacy';
3136	
3137			var loginModal_html = '\
3138				<div class="flat-modal mng-login-modal mng-siteUM-modal">\
3139					<div class="modal modal-default fade" id="login-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3140						<div class="modal-dialog" role="document">\
3141							<div class="modal-content">\
3142								<div class="modal-header">\
3143									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3144										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3145									</button>\
3146									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['header.login'] + '</h5>\
3147								</div>\
3148								<div class="modal-body">\
3149									<span class="form-group optional initial">\
3150										<input class="form-control" type="text" id="input-id" placeholder="' + $.lang[LANG]['siteum.login.id'] + '"/>\
3151										<label for="input-id">\
3152											<i class="fa fa-asterisk"></i>\
3153											<span>id</span>\
3154										</label>\
3155									</span>\
3156									<span class="form-group optional initial">\
3157										<input class="form-control" type="password" id="input-password" placeholder="' + $.lang[LANG]['siteum.login.password'] + '"/>\
3158										<label for="input-password">\
3159											<i class="fa fa-asterisk"></i>\
3160											<span>password</span>\
3161										</label>\
3162									</span>\
3163								</div>\
3164								<div class="modal-footer">\
3165									<button type="button" class="btn btn-primary" id="uLogin">' + $.lang[LANG]['manager.site-um.login'] + '</button>\
3166									' + join_btn + '\
3167									<p class="modal-change-wrap siteUM"><span class="forgot-pw hand">' + $.lang[LANG]['siteum.forgot.id-pw'] + '</span></p>\
3168								</div>\
3169							</div>\
3170						</div>\
3171					</div>\
3172				</div>\
3173				';
3174
3175
3176			return loginModal_html;
3177		},
3178		loginModalInit: function(mode) {
3179			mode = (mode) ? '-' + mode : '';
3180			var loginModal = $('#login-modal'+mode);
3181
3182			loginModal.find('.form-group').each(function() {
3183				$(this).removeClass('focus');
3184				$(this).find('.error').remove();
3185				$(this).find('input.form-control').val('');
3186			});
3187		},
3188		loginModalKeyFunc: function(mode) {
3189			mode = (mode) ? '-' + mode : '';
3190			var loginModal = $('#login-modal'+mode);
3191
3192			loginModal.find('input.form-control').live({
3193				focus:   function(e) { $(this).closest('.form-group').addClass('focus').siblings().removeClass('focus'); }, 
3194				blur: 	 function(e) { $(this).closest('.form-group').removeClass('focus'); },
3195				keydown: function(e) { 
3196					if($('.dsgn-body').hasClass('mobile-nav-active')) $('.el-menu header.n
3196avbar-fheader .navbar-toggle').click();
3197					if(e.keyCode == 13) $('#uLogin').click(); 
3198				},
3199				keyup: function(e) {
3200					var groupEl = $(this).closest('.form-group'),
3201						errorEL = $(this).next().next('.error');
3202					if($(this).val().length > 0) errorEL.remove();
3203				}
3204			});
3205		},
3206		showForgotIDModal: function(sid) {
3207			if($('#forgotpw-modal').length > 0 ) $('#forgotpw-modal').delay(3000).modal('hide');
3208
3209			var content = $.umember.makeForgotIDModalContent();
3210			$.umember.showMngModal(sid, content, 'forgotid-modal', false, function() {
3211					$('#forgotid-modal').find('.error').remove();
3212					$('#forgotid-modal').find('input.form-control').val('');
3213					$('#forgotid-modal .modal-body').children().removeAttr('style');
3214					$('#forgotid-modal .modal-footer').children('button').removeAttr('style');
3215					$('#forgotid-modal').find('.forgot-id-result').text('');
3216				}, function() {
3217					$('#forgotid-modal').find('input.form-control').live({
3218						keydown: function(key) { if(key.keyCode == 13) $('#uForgotID').click(); },
3219						keyup: function() {
3220							$('#forgotid-modal .modal-body').children().removeAttr('style');
3221							$('#forgotid-modal .modal-footer').children('button').removeAttr('style');
3222							$('#forgotid-modal').find('.forgot-id-result').text('');
3223							var regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
3224								errorEL = $(this).closest('.form-group').find('.error');
3225
3226							if(!regexp.test($(this).val())) errorEL.text($.lang[LANG]['siteum.regexp.check.email']);
3227							else errorEL.remove();
3228						}
3229					});
3230				}, '', '', '');
3231		},
3232		makeForgotIDModalContent: function() {
3233			var forgotIDModal_html = '\
3234				<div class="flat-modal mng-forgotid-modal mng-siteUM-modal">\
3235					<div class="modal modal-default fade" id="forgotid-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3236						<div class="modal-dialog" role="document">\
3237							<div class="modal-content">\
3238								<div class="modal-header">\
3239									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3240										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3241									</button>\
3242									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['siteum.forgot.id.link'] + '</h5>\
3243								</div>\
3244								<div class="modal-body">\
3245									<div>' + $.lang[LANG]['siteum.forgot.id.description'] + '</div>\
3246									<span class="form-group">\
3247										<input class="form-control" type="text" id="input-email" placeholder="' + $.lang[LANG]['siteum.forgot.pw.input-email'] + '"/>\
3248									</span>\
3249									<div class="forgot-id-result"></div>\
3250								</div>\
3251								<div class="modal-footer">\
3252									<button type="button" class="btn btn-primary" id="uForgotID">' + $.lang[LANG]['siteum.forgot.id.btn'] + '</button>\
3253									<p class="modal-change-wrap siteUM"> <span class="forgot-pw hand">' + $.lang[LANG]['siteum.forgot.pw.link'] + '</span></p>\
3254									<p class="modal-change-wrap siteUM"> <span class="login hand">' + $.lang[LANG]['manager.site-um.login'] + '</span></p>\
3255								</div>\
3256							</div>\
3257						</div>\
3258					</div>\
3259				</div>\
3260			';
3261
3262			return forgotIDModal_html;
3263		},
3264		showForgotPWModal: function(sid) {
3265			if($('#login-modal').length > 0 ) $('#login-modal').delay(3000).modal('hide');
3266			if($('#forgotid-modal').length > 0 ) $('#forgotid-modal').delay(3000).modal('hide');
3267
3268			var content = $.umember.makeForgotPWModalContent();
3269			$.umember.showMngModal(sid, content, 'forgotpw-modal', false, function() {
3270					$('#forgotpw-modal').find('.focus').removeClass('focus');
3271					$('#forgotpw-modal').find('.error').remove();
3272					$('#forgotpw-modal').find('input.form-control').val('');
3273				}, function() {
3274					$('#forgotpw-modal').find('input.form-control').live({
3275						foucs: function() { $(this).closest('.form-group').addClass('focus').siblings().removeClass('focus'); },
3276						blur: function() { $(this).closest('.form-group').removeClass('focus'); },
3277						keydown: function(key) { if(key.keyCode == 13) $('#uForgotPW').click(); },
3278						keyup: function() { 
3279							var regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
3280								field = $(this).attr('id').trim().replace(/input-/,''),
3281								errorEL = $(this).closest('.form-group').find('.error');
3282
3283							if(field == 'email' && !regexp.test($(this).val())) errorEL.text($.lang[LANG]['siteum.regexp.check.email']);
3284							else errorEL.remove();
3285						}
3286					});
3287				}, '', '', '');
3288		},
3289		makeForgotPWModalContent: function() {
3290			var forgotPWModal_html = '\
3291				<div class="flat-modal mng-forgotpw-modal mng-siteUM-modal">\
3292					<div class="modal modal-default fade" id="forgotpw-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3293						<div class="modal-dialog" role="document">\
3294							<div class="modal-content">\
3295								<div class="modal-header">\
3296									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3297										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3298									</button>\
3299									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['siteum.forgot.pw.title'] + '</h5>\
3300								</div>\
3301								<div class="modal-body">\
3302									<div>' + $.lang[LANG]['siteum.forgot.pw.description'] + '</div>\
3303									<span class="form-group">\
3304										<input class="form-control" type="text" id="input-id" placeholder="' + $.lang[LANG]['manager.list.info.id'] + '"/>\
3305									</span>\
3306									<span class="form-group">\
3307										<input class="form-control" type="text" id="input-email" placeholder="' + $.lang[LANG]['siteum.forgot.pw.input-email'] + '"/>\
3308									</span>\
3309								</div>\
3310								<div class="modal-footer">\
3311									<button type="button" class="btn btn-primary" id="uForgotPW">' + $.lang[LANG]['siteum.forgot.pw.btn'] + '</button>\
3312									<p class="modal-change-wrap siteUM"> <span class="forgot-id hand">' + $.lang[LANG]['siteum.forgot.id.link'] + '</span></p>\
3313									<p class="modal-change-wrap siteUM"> <span class="login hand">' + $.lang[LANG]['manager.site-um.login'] + '</span></p>\
3314								</div>\
3315							</div>\
3316						</div>\
3317					</div>\
3318				</div>\
3319			';
3320
3321			return forgotPWModal_html;
3322		},
3323		showMypageModal: function(sid) {
3324			if($('.mng-siteUM-modal').length > 0 ) $('.mng-siteUM-modal').children().first().modal('hide');
3325
3326			$.getJSON('/umember/get/type/mypage', function(data) {
3327				if(typeof data.error != 'undefined' && data.error) {
3328					alert(data.error);
3329					return false;
3330				}
3331				// COLLECTION_REGEX = $.parseJSON(data['regExp']);
3332				COLLECTION_REGEX = data['regExp'];
3333
3334				var content = $.umember.makeMypageContent(sid,data,'');
3335				$('body').find('.dsgn-body').append('<link rel="stylesheet" href="/css/manager.css" type="text/css" class="manager_css">');
3336				$.umember.showMngModal(sid, content, 'mypage-modal', false,
3337										function() { }, 
3338										function() { }, 
3339										function() { $('body .dsgn-body').find('link.manager_css').remove(); }, '', '');
3340			});
3341		},
3342		
3343		makeMypageConditionsStr: function(sid,data,mode,cert) {
3344			if(typeof cert === 'undefined' || !cert) cert = 'N';
3345
3346			var collections = '',
3347				make_pass = ['sid', 'no', 'id', 'image', 'regExp', 'cert', 'cert_date', 'cert_adult', 'cert_adult_date', 'sm_addr', 'shopgrade_name', 'coupon_cnt', 'my_point', 'acc_amount', 'acc_count', 'to_next_amount', 'to_next_count', 'next_grade'];
3348				
3349			$.each(data, function(field,o) {
3350				if (field != 'um_sns_key') {
3351					if($.inArray(field,make_pass) == -1) {
3352						var name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+field],
3353							optional = (o['optional']) ? o['optional'] : false,
3354							optional_class = (optional) ? 'optional' : '',
3355							prev_val = (field == 'email' || field == 'nick') ? 'data-prev="' + o['value'] + '"' : '',
3356							etc_val_type = ['memo','radio','check','select','fupload'],
3357							cl_val_str = '',
3358							add_input = '',
3359							jcollection_val_str = '';
3360							 // 간결하게 삼항 연산자로 리팩토링
3361							 
3362							 var filecount_data = o['type'] === 'fupload' && o['value'] ? 'isdata' : o['type'] === 'fupload' ? 'nodata' : '';
3363
3364						var star = (optional) ? '<span class="input-star">*</span>' : '';
3365				
3366						if(field.indexOf('etc')>-1 && etc_val_type.includes(o['type'])) {
3367							var o_val = o['value'],
3368								o_val_arr = ((o['jcol_val'].indexOf('`') > -1) && (o['type']=='radio' || o['type']=='check' || o['type']=='select')) ? o['jcol_val'].split('`') : [o_val],
3369								description_class = (o['description_used']=='true' && (o['type']=='memo')) ? 'use_descr' : '';
3370
3371							add_input = '\
3372							<div class="cl-s-join-collections-etcwrap cl-s-form-wrap '+filecount_data+' '+ optional_class + '" data-jcoltype="'+o['type']+'">';
3373									
3374							var text_class = (o_val && (o['type']=='memo')) ? 'textarea-active' : '';
3375							add_input += '\
3376								<div class="cl-s-etc '+text_class+'">\
3377									<span class="cl-s-etc-name">'+ name + star +'</span>\
3378									';
3379							add_input += (o['description_used']=='true') ? '<span class="cl-s-etc-description">'+ o['description'] +'</span>' : '';
3380							add_input += '\
3381								</div>\
3382								';
3383
3384							add_input += '\
3385								<div class="cl-s-etc-val '+description_class+'">\
3386							';
3387
3388							if(o['type']=='select') {
3389								add_input += '\
3390								<div class="cl-s-form-group cl-s-form-group-select">\
3391									<select class="cl-s-form-control" name="'+field+'" id="input-' + field + '" required="required">\
3392										<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
3393								';
3394							} 
3395
3396							if(o_val_arr.length > 0) {
3397								$.each(o_val_arr, function(oval_i,oval_v){			
3398									jcollection_val_str += $.umember.makeJoinCollectionsTypeVal(oval_i,o['type'],oval_v,field,optional_class,'mypage',o_val);
3399								});
3400							} 
3401
3402							if(o['type']=='select') {
3403								jcollection_val_str += '\
3404									</select>\
3405									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
3406								</div>\
3407								';
3408							}
3409							jcollection_val_str += '</div></div>';
3410							
3411						} else {
3412							add_input += '\
3413							<div class="cl-s-form-wrap ' + optional_class + '">\
3414								<div class="cl-s-form-group">\
3415									<input type="text" class="cl-s-form-control" name="'+field+'" id="input-' + field + '" required="required" value="' + o['value'] + '" ' + prev_val + '>\
3416									<label for="input" class="cl-s-control-label">' + name + star + '</label>\
3417								</div>\
3418							</div>\
3419						';
3420						
3421						}
3422						if(field == 'birth') {
3423							var birth = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+field];
3424
3425							add_input = '\
3426								<div class="cl-s-form-wrap ' + optional_class + '">\
3427									<div class="cl-s-form-group">\
3428										<input type="text" class="cl-s-form-control cl-s-form-birth" name="'+field+'" id="input-' + field + '" required="required" value="' + o['value'] + '" onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)">\
3429										<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.mypage.Birth'] + star + ' </label>\
3430									</div>\
3431								</div>\
3432							';
3433						} else if(field == 'addr') {
3434							
3435							
3436							if(  mode && mode === 'business'){
3437								var o_postcode = (o['value'][0]) ? o['value'][0].trim() : '',
3438									o_addr1 = (o['value'][1]) ? o['value'][1].trim() : '',
3439									o_addr2 = (o['value'][2]) ? o['value'][2].trim() : '',
3440									addr_has_clas = (o_postcode || o_addr1) ? 'has-value' : '',
3441									addr_modal = (mode == 'shopping' || o['addrsearch']) ? 'readonly onfocus="addrSearchModal(\'input\')" ' : '';
3442
3443								add_input = '\
3444										<div class="cl-s-form-wrap ' + optional_class + '">\
3445											<div class="cl-s-form-group">\
3446												<input type="hidden" class="cl-s-form-control" name="postcode" id="input-postcode" value="' + o_postcode + '">\
3447												<input type="text" class="cl-s-form-control '+addr_has_clas+'" name="addr1" id="input-addr1" required="required" value="' + o_addr1 + '" ' + addr_modal + '>\
3448												<label for="input" class="cl-s-control-label">' + name + star + '</label>\
3449											</div>\
3450										</div>\
3451										<div class="cl-s-form-wrap">\
3452											<div class="cl-s-form-group">\
3453												<input type="text" class="cl-s-form-control" name="addr2" id="input-addr2" required="required" value="' + o_addr2 + '">\
3454												<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr2'] + '</label>\
3455											</div>\
3456										</div>\
3457								';								
3458							} else if(mode && mode === 'shopping') {
3459								var sm_name    = '', 
3460									sm_tel     = '', 
3461									sm_addr0   = '', 
3462									sm_addr0_empty ='',
3463									sm_addr1   = '', 
3464									sm_addr2   = '', 
3465									sm_isalias = '',
3466									sm_isalias_empty = '',
3467									aliasText = '',
3468									sm_nodata  = '';
3469									btn_text =''
3470									  
3471								if (data['sm_addr'] && data['sm_addr']['is_default'] === 0) {
3472									sm_nodata = 'emptyFlag';
3473									btn_text = '추가하기';
3474								} else{
3475									const sm = data?.sm_addr || {};
3476
3477									sm_name    = sm.name?.trim?.() || '';
3478									sm_tel     = sm.tel?.trim?.() || '';
3479									
3480									addrText   = sm.value?.[0]?.trim?.() || '';
3481									sm_addr0   = addrText ? '[' + addrText + ']' : '';
3482									sm_addr0_empty = sm_addr0 ? '' : 'hide';
3483
3484									sm_addr1   = sm.value?.[1]?.trim?.() || '';
3485									sm_addr2   = sm.value?.[2]?.trim?.() || '';
3486									aliasText = sm.alias?.trim?.() || '';  // 먼저 alias 문자열 뽑기
3487									sm_isalias = aliasText ? '(' + aliasText + ')' : '';  // 괄호 처리
3488									sm_isalias_empty = aliasText ? '' : 'hide';  // 클래스 처리
3489
3490
3491									btn_text = '변경하기';
3492  
3493								}		
3494					 
3495								var valueCheckEl = "";
3496								(valueCheckEl = sm_nodata ? '<input type="text" class="cl-s-form-control hide" required="required" value="">' : '' );
3497								add_input = '\
3498								<div class="cl-s-form-wrap sm-parent '+sm_nodata+'">\
3499									<div class="cl-s-form-wrap '+(sm_nodata ? optional_class : "") +'">\
3500										<div class="cl-s-form-group">\
3501											<div class="cl-s-form-control flexbox">\
3502											'+valueCheckEl+'\
3503												<label for="input" class="cl-s-control-label">배송지 정보<span class="input-star '+ (optional_class ? '' : 'hide') +'">*</span></label>\
3504												<div class="cl-s-form-wrap btn-load-addresses mypage" data-action="getList">\
3505													<div class="cl-s-form-group EditBtn">\
3506													<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="m15.29 7-1.31 1.31c.16-3-1.96-5.71-5-6.22-1.91-.32-3.86.3-5.23 1.67l.71.71a5.003 5.003 0 0 1 7.07 0 4.989 4.989 0 0 1 1.45 3.81L11.7 7l-.71.71 2.5 2.5 2.5-2.5-.71-.71ZM4.46 11.53a4.989 4.989 0 0 1-1.45-3.81L4.29 9 5 8.29l-2.5-2.5L0 8.29.71 9l1.31-1.31c-.16 3 1.96 5.71 5 6.22 1.91.32 3.86-.3 5.23-1.67l-.71-.71a5.003 5.003 0 0 1-7.07 0Z"/></svg><span>'+btn_text+'</span>\
3507													</div>\
3508													<div class="cl-s-form-group ">\
3509													<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"><path d="M6.5 12h-1V6.5H0v-1h5.5V0h1v5.5H12v1H6.5V12Z"/></svg><span>'+btn_text+'</span>\
3510													</div>\
3511												</div>\
3512											</div>\
3513											<div class="cl-s-form-control"><div class="sm-name">'+sm_name+'</div><div class="sm-alias '+sm_isalias_empty+'">'+sm_isalias+'</div><div class="sm-default-addr"><span>기본배송지</span></div></div>\
3514											\
3515											<div class="cl-s-form-control"><div class="sm-addr1"><span class ="'+sm_addr0_empty+'">'+sm_addr0+'</span><span>'+sm_addr1+' '+sm_addr2+'</span></div></div>\
3516											<div class="cl-s-form-control"><div class="sm-tel">'+sm_tel+'</div></div>\
3517											<div class="cl-s-form-control noaddress" style="text-align:center; padding:20px; color:#999;">등록된 배송지가 없습니다.</div>\
3518										</div>\
3519									</div>\
3520								</div>\
3521								';		
3522							}
3523
3524						} else if(field == 'gender') {
3525							add_input = '\
3526									<div class="cl-s-form-wrap ' + optional_class + '">\
3527										<div class="cl-s-form-group">\
3528											<select class="cl-s-form-control" name="gender" id="input-gender" required="required">\
3529												<option value="">선택</option>';
3530							if(o['value'] == '01') {
3531								add_input += '\
3532												<option value="01" selected>남</option>\
3533												<option value="02">여</option>';
3534							} else if(o['value'] == '02') {
3535								add_input += '\
3536												<option value="01">남</option>\
3537												<option value="02" selected>여</option>';
3538							} else {
3539								add_input += '\
3540												<option value="01">남</option>\
3541												<option value="02">여</option>';
3542							}
3543							add_input += '\
3544											</select>\
3545											<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
3546											<label for="input" class="cl-s-control-label">' + name + star +'</label>\
3547										</div>\
3548									</div>\
3549							';
3550						}
3551
3552						if(cert == 'Y') {
3553							switch (field) {
3554								case 'name':
3555								case 'gender':
3556								case 'birth':
3557								case 'tel':
3558									var value = (o['value'])? o['value']:'';
3559									add_input = '<input id="input-' + field + '" type="hidden" name="' + field + '" value="' + value + '">';
3560									break;
3561							}
3562						}
3563						
3564						collections += add_input + jcollection_val_str;
3565
3566					}
3567				}
3568			});
3569			return collections;
3570		},
3571		makeMypageContent: function(sid,data,mode,cert) {
3572			if(typeof cert === 'undefined' || !cert) cert = 'N';
3573			
3574			var collections = $.umember.makeMypageConditionsStr(sid,data,mode,cert),
3575				s_validtype = (typeof VALIDTYPE != 'undefined') ? VALIDTYPE : property.VALIDTYPE;
3576
3577			var default_info = '\
3578				<div class="profile-wrap cl-s-profile-box col-xs-12 col-sm-12 col-md-12 no-padding">\
3579					<div class="profile-image-wrap profile-image-box">\
3580						<svg viewBox="0 0 110 110">\
3581							<pattern id="profileMyImg" patternUnits="userSpaceOnUse" width="110" height="110">\
3582								<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="' + data['image'] + '" x="0" width="110" height="110"></image>\
3583							</pattern>\
3584							<circle cx="55" cy="56" r="54" fill="url(#profileMyImg)" stroke="#ededed"></circle>\
3585						</svg>\
3586					</div>\
3587					<div class="profile-text-wrap">\
3588						<div class="cl-s-form-wrap cl-s-info-id" disabled>\
3589							<input type="hidden" class="cl-s-form-control" name="id" id="input-id" required="required" value="' + data['id']['value'] + '">\
3590							<span class="id-text">' + data['id']['value'] + '</span>\
3591						</div>\
3592						<label for="profileMyImgFileupload">' + $.lang[LANG]['siteum.mypage.change.image'] + '</label>\
3593						<input id="profileMyImgFileupload" class="modal-upload-button um-image-upload" type="file" name="files[]" data-sid="' + sid + '" data-uid="' + data['id']['value'] + '" />\
3594						<p class="cl-s-image-size">' + $.lang[LANG]['manager.mypage.profile.image.note'] + ' ' + $.lang[LANG]['manager.mypage.profile.image.size'] + '</p>\
3595					</div>\
3596				</div>\
3597				<div class="clearfix"></div>\
3598				';
3599
3600			var mypage_avatar = '\
3601				<div class="profile-wrap cl-s-profile-box col-xs-12 col-sm-12 col-md-12 no-padding">\
3602					<div class="profile-image-wrap profile-image-box">\
3603						<svg viewBox="0 0 110 110">\
3604							<pattern id="profileMyImg" patternUnits="userSpaceOnUse" width="110" height="110">\
3605								<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="' + data['image'] + '" x="0" width="110" height="110"></image>\
3606							</pattern>\
3607							<circle cx="55" cy="56" r="54" fill="url(#profileMyImg)" stroke="#ededed"></circle>\
3608						</svg>\
3609					</div>\
3610				</div>\
3611				<div class="clearfix"></div>\
3612				';
3613
3614			var content = '\
3615				<div class="cl-s-form-wrap">\
3616					<div class="cl-s-form-group">\
3617						<input type="password" class="cl-s-form-control" name="password" id="input-password" required="required" value="">\
3618						<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password.myinfo'] + '</label>\
3619					</div>\
3620				</div>\
3621				<div class="cl-s-form-wrap">\
3622					<div class="cl-s-form-group">\
3623						<input type="password" class="cl-s-form-control" name="password_checked" id="input-password-checked" required="required" value="">\
3624						<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password-check'] + '</label>\
3625					</div>\
3626				</div>\
3627				<div class="cl-s-form-description">' + $.lang[LANG]['siteum.login.password.description'] + '</div>\
3628			';
3629
3630			return { content: content, collections: collections, default_info: default_info, mypage_avatar:mypage_avatar };
3631		},
3632		showMyImageUploadModal: function(sid,uid,src) {
3633			var content = '\
3634				<div class="flat-modal mng-mypage-modal">\
3635					<div class="modal modal-default fade" id="my-image-modal" tabindex="-1" role="dialog" aria-labelledby="mySmallMod
3635alLabel" aria-hidden="true" data-sid="' + sid + '" data-uid="' + uid + '">\
3636						<div class="modal-dialog w385">\
3637							<div class="modal-content">\
3638								<button type="" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-modal.png" alt="close"></span></button>\
3639								<div class="modal-body">\
3640									<div class="profile-image-wrap no-opacity">\
3641										<div>\
3642											<span class="top"></span>\
3643											<span class="bottom"></span>\
3644										</div>\
3645										<img class="my-image img-responsive" src="' + src + '" alt="profile image" />\
3646									</div>\
3647									<p>' + $.lang[LANG]['manager.mypage.profile.image.note'] + ' <strong>' + $.lang[LANG]['manager.mypage.profile.image.size'] + '</strong></p>\
3648								</div>\
3649								<div id="progress" class="progress">\
3650									<div class="progress-bar progress-bar-success"></div>\
3651								</div>\
3652								<div class="modal-footer">\
3653									<button type="button" class="btn btn-default" data-dismiss="modal">' + $.lang[LANG]['config.close'] + '</button>\
3654									<span class="btn btn-primary fileinput-button">\
3655										<span>' + $.lang[LANG]['manager.mypage.profile.image.apply'] + '</span>\
3656										<input id="profileUMFileupload" class="modal-upload-button um-image-upload" type="file" name="files[]" data-sid="' + sid + '" data-uid="' + uid + '" >\
3657									</span>\
3658								</div>\
3659							</div>\
3660						</div>\
3661					</div>\
3662				</div>\
3663			';
3664
3665			$.umember.showMngModal(sid, content, 'my-image-modal', false, '', '', '', '', '');				
3666		},
3667		fileurlcreate : function(cl_val) {
3668			// 단일 파일 URL 생성 함수
3669			// cl_val을 받아서 다운로드 링크와 파일 정보를 반환
3670			var result = {
3671				download_link: '',
3672				file_links: '',
3673				file_data: '',
3674				file_info: {
3675					name: '',
3676					size: '',
3677					url: '',
3678					size_display: ''
3679				}
3680			};
3681			
3682			if(cl_val && cl_val.trim() !== '') {
3683				// 단일 파일 처리 - 첫 번째 파일만 사용
3684				var file_data = cl_val.split(',')[0];
3685				result.file_data = file_data;
3686				
3687				if(file_data && file_data.trim() !== '') {
3688					var explode_v = file_data.split('||');
3689					// console.log('fileurlcreate explode_v:', explode_v); // 디버깅용
3690					
3691					// 현재 데이터 구조에 맞게 수정
3692					// explode_v[0]: 파일명, explode_v[1]: 파일 크기, explode_v[2]: URL
3693					var link_url = explode_v[2] || '';
3694					var link_url_arr = link_url.split('/');
3695					var true_file_name = link_url_arr[link_url_arr.length - 1];
3696					
3697					if(explode_v[0]) {
3698						// 파일 크기 계산 (explode_v[1]에서 크기 추출)
3699						var flink_s = (explode_v[1]) ? parseFloat(explode_v[1].replace(/[^0-9\.]/g, '')) : 0;
3700						var flink_unit = (explode_v[1] && explode_v[1].indexOf('MB') > -1) ? 'MB' : 'KB';
3701						var flink_size = (flink_unit === 'MB') ? flink_s : flink_s;
3702						// view.html의 round($flink_size,2)와 동일하게 소수점 2자리까지 표시
3703						var flink_str = (explode_v[1]) ? parseFloat(flink_size.toFixed(2)) + flink_unit : '';
3704						
3705						var current_sid = (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '');
3706						var download_link = '<a href="/down/flink/1/sid/' + current_sid + '/name/' + encodeURIComponent(explode_v[0]) + '/s/' + true_file_name + '" class="file-download-btn" target="_blank">';
3707						
3708						result.download_link = download_link;
3709						result.file_links = download_link;
3710						result.file_info = {
3711							name: explode_v[0],
3712							size: explode_v[1] || '',
3713							url: link_url,
3714							size_display: flink_str
3715						};
3716					}
3717				}
3718			}
3719			
3720			return result;
3721		},
3722		fileHtmlRender : function(orgfield,option){// 그리기 담당 메서드
3723 			// 온 값에따라 그리는거 달라지기 
3724			option = $.extend({
3725				val : "",
3726				type : "",
3727				type2_downlink : ""	
3728
3729				
3730			},  option);
3731			
3732			// option.val에서 파일 정보 파싱 (파일명||파일크기||파일경로 형태)
3733			var fileName = '';
3734			var fileSize = '';
3735			var filePath = '';
3736			var fileSizeDisplay = '';
3737			var fileSizeUnit = 'KB';
3738			var hasValidFile = false;
3739			// option.val이 있고 파일 정보 형식이 맞는지 확인
3740			if (option.val && option.val.indexOf('||') > -1) {
3741				var fileData = option.val.split('||');
3742				if (fileData.length >= 3) {
3743					fileName = fileData[0];
3744					fileSize = fileData[1];
3745					filePath = fileData[2];
3746					filePaths = (filePath && filePath.indexOf('/') > -1 ? [filePath.split('/').pop()] : []);
3747					// 파일명과 경로가 모두 있는 경우에만 유효한 파일로 판단
3748					if (fileName && filePath) {
3749						hasValidFile = true;
3750						
3751						// 파일 크기 단위 처리
3752						if (fileSize.indexOf('KB') > -1) {
3753							fileSize = parseFloat(fileSize.replace('KB', ''));
3754							fileSizeUnit = 'KB';
3755						} else if (fileSize.indexOf('MB') > -1) {
3756							fileSize = parseFloat(fileSize.replace('MB', ''));
3757							fileSizeUnit = 'MB';
3758						} else {
3759							fileSize = parseFloat(fileSize);
3760							fileSizeUnit = 'KB';
3761						}
3762						
3763						// 파일 크기 표시 형식 조정
3764						if (fileSizeUnit === 'KB' && fileSize > 1024) {
3765							fileSizeDisplay = (fileSize / 1024).toFixed(2) + 'MB';
3766						} else {
3767							fileSizeDisplay = fileSize.toFixed(2) + fileSizeUnit;
3768						}
3769					}
3770				}
3771			}
3772			
3773			var temphtml = '';
3774
3775			if(option.type == 'type1') {
3776				if (hasValidFile) {
3777					// 파일이 있는 경우
3778					temphtml +=	'\
3779					<div class="cl-s-form-group">\
3780						<input type="text" class="cl-s-form-control valueCheck"  value="' + option.val + '" required="required" name="'+orgfield+'" id="input-' + orgfield + '">\
3781						<div class="cl-s-form-control-register">\
3782							<p class="file-title text hide">첨부된 파일이 없습니다.</p>\
3783							<label r-fupload-type="file.upload" r-fupload-require="" class="hide"><input type="file" class="hide" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M1 15v-3.5h1V14h12v-2.5h1V15H1Zm6.5-2.79v-9.3L4.35 6.06l-.71-.71L8 1l4.35 4.35-.71.71-3.15-3.15v9.29h-1Z"/></svg>' + $.lang[LANG]['register.fileUpload.btn.text'] + '</label>\
3784							<div class="file-row display-flex align-items-center">\
3785								<div class="r-flex-left">\
3786									<div class="file-thumb"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M4 16c-1.66 0-3-1.34-3-3V6l6-6h5c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H4Zm-2-3c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2H8v4c0 1.1-.9 2-2 2H2v6Zm.41-7H6c.55 0 1-.45 1-1V1.41L2.41 6ZM4 13v-1h8v1H4Zm0-3V9h8v1H4Z"/></svg></div>\
3787									<div>\
3788										<p class="file-name">'+fileName+'</p>\
3789									</div>\
3790								</div>\
3791								<div class="r-flex-right">\
3792									<p class="file-size">'+fileSizeDisplay+'</p>\
3793									<span class="form-file-delete" data-src="'+filePaths+'">\
3794									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15" width="15" height="15"><g>
3794<path d="M2.35 12.65c-.2-.2-.2-.51 0-.71l9.6-9.6c.2-.2.51-.2.71 0 .2.2.2.51 0 .71l-9.6 9.6c-.2.2-.52.2-.71 0z"/><path d="M12.3 2.2a.47.47 0 0 0-.35.15l-9.6 9.6c-.2.2-.2.51 0 .71.1.1.23.15.35.15.13 0 .26-.05.35-.15l9.6-9.6c.2-.2.2-.51 0-.71-.1-.1-.22-.15-.35-.15z"/><path d="M12.65 12.65c-.2.2-.51.2-.71 0l-9.6-9.6c-.2-.2-.2-.51 0-.71.2-.2.51-.2.71 0l9.6 9.6c.2.2.2.52 0 .71z"/><path d="M2.7 2.2a.47.47 0 0 0-.35.15c-.2.2-.2.51 0 .71l9.6 9.6c.1.1.23.15.35.15.13 0 .26-.05.35-.15.2-.2.2-.51 0-.71l-9.6-9.6a.47.47 0 0 0-.35-.15z"/></g></svg>\
3795									</span>\
3796								</div>\
3797							</div>\
3798						</div>\
3799					</div>\
3800					';
3801				} else {
3802					// 파일이 없는 경우
3803					temphtml +=	'\
3804					<div class="cl-s-form-group">\
3805						<input type="text" class="cl-s-form-control valueCheck"  value=""  required="required" name="'+orgfield+'" id="input-' + orgfield + '">\
3806						<div class="cl-s-form-control-register"  >\
3807							<p class="file-title hide text">첨부된 파일이 없습니다.</p><label r-fupload-type="file.upload" r-fupload-require="" class=""><input type="file" class="hide" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M1 15v-3.5h1V14h12v-2.5h1V15H1Zm6.5-2.79v-9.3L4.35 6.06l-.71-.71L8 1l4.35 4.35-.71.71-3.15-3.15v9.29h-1Z"/></svg>' + $.lang[LANG]['register.fileUpload.btn.text'] + '</label></div>\
3808						</div>\
3809					</div>\
3810					';
3811				}
3812			} else if(option.type == 'type2') {
3813				if(!option.val){
3814					temphtml += '\
3815					<div class="type2 cl-common-form-wrap nonplace-holder  '+ (option.val ? 'isdata' : 'nodata') +'" data-jcoltype="fupload" id="member-'+ orgfield + '">\
3816						<div class="cl-common-form-group">\
3817									<div class="cl-s-form-group">\
3818										<input type="text" class="member-info-input form-control cl-s-form-control valueCheck"  value=""  required="required" name="member-'+orgfield+'" id="member-' + orgfield + '">\
3819										<div class="cl-s-form-control-register"  >\
3820										<label r-fupload-type="file.upload" r-fupload-require="" class=""><input type="file" class="hide" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M1 15v-3.5h1V14h12v-2.5h1V15H1Zm6.5-2.79v-9.3L4.35 6.06l-.71-.71L8 1l4.35 4.35-.71.71-3.15-3.15v9.29h-1Z"/></svg>' + $.lang[LANG]['register.fileUpload.btn.text'] + '</label></div>\
3821										</div>\
3822									</div>\
3823					</div>';					
3824				} else {
3825					temphtml += '\
3826					<div class="type2 cl-common-form-wrap nonplace-holder  '+ (option.val ? 'isdata' : 'nodata') +'" data-jcoltype="fupload" id="member-'+ orgfield + '">\
3827						<div class="cl-common-form-group">\
3828									<div class="cl-s-form-group">\
3829										<input type="text" class="member-info-input form-control cl-s-form-control valueCheck"  value="'+option.val+'"  required="required" name="member-'+orgfield+'" id="member-' + orgfield + '">\
3830										<div class="cl-s-form-control-register"  >\
3831																<div class="file-row file-info-layout">\
3832																	<div class="file-left-area">\
3833																		<p class="file-name">'+fileName+'</p>\
3834																	</div>\
3835																	<div class="file-right-area">\
3836																		<span class="file-size">'+fileSizeDisplay+'</span>\
3837																		'+$.umember.fileurlcreate(option.val).download_link+'\
3838																			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
3839																				<path d="M5 19v-3.5h1V18h12v-2.5h1V19H5Zm2.65-7.15.71-.71 3.15 3.15V5h1v9.29l3.15-3.15.71.71-4.35 4.35-4.35-4.35Z"/>\
3840																			</svg>\
3841																		</a>\
3842																		<span class="form-file-delete" data-src="'+filePaths+'">\
3843																			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
3844																				<path d="M19 8h-3V6H8.02v2H5v1h1v9c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V9h1V8ZM9.02 7H15v1H9.02V7ZM17 18c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1V9h10v9Zm-7-7h1v6h-1v-6Zm3 0h1v6h-1v-6Z"/>\
3845																			</svg>\
3846																		</span>\
3847																	</div>\
3848																</div>\
3849										<label r-fupload-type="file.upload" r-fupload-require="" class=""><input type="file" class="hide" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M1 15v-3.5h1V14h12v-2.5h1V15H1Zm6.5-2.79v-9.3L4.35 6.06l-.71-.71L8 1l4.35 4.35-.71.71-3.15-3.15v9.29h-1Z"/></svg>
3849' + $.lang[LANG]['register.fileUpload.btn.text'] + '</label></div>\
3850										</div>\
3851									</div>\
3852					</div>';						
3853				}
3854			}
3855
3856			return temphtml;
3857		}
3858	} /*umember end*/
3859
3860
3861
3862	$(document).on("click", "label[r-fupload-type='file.upload']", function () {
3863		var currentPage = ""
3864		if($(this).closest('.info-modal').length > 0) currentPage = "info";
3865		else if ($(this).closest(".register_form-wrap").length > 0) currentPage = "register";
3866		else if ($(this).closest(".account-info").length > 0) currentPage = "mypage";
3867
3868
3869		var REGISTER_MAX_FILE_NUMBER = 1;
3870
3871    $(" div[data-jcoltype='fupload'] input[type='file']").fileupload({        
3872        url: '/template/register_fupload/upload-file',
3873        dataType: 'json',
3874        async: true,
3875        pasteZone: null,
3876        formData: function() {
3877            // sid 값을 가져오기 위한 로직
3878            var current_sid = (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '');
3879            return [
3880                {name: 'sid', value: current_sid}
3881            ];
3882        },			
3883        change : function (e, data) { // 파일 선택 후 확인 버튼 클릭할때 change 조건들 통과해야 함
3884            if(data.files.length > REGISTER_MAX_FILE_NUMBER || $(this).closest(".cl-s-form-control-register ").find('.file-row').length + data.files.length > REGISTER_MAX_FILE_NUMBER){
3885				//		    $(this).showModalFlat($.lang[LANG]['manager.list.member.block.title'], modal_content, true, true, function() {
3886
3887                var modal = $(this).showModalFlat('',$.lang[LANG]['register.file.upload.limit'], modal_content, true, true, function() {
3888                    $(document).on('keydown', function(e) {
3889                        if(e.keyCode == 27) modal.modal('hide');
3890                    });
3891                }, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
3892                return false; 
3893            }
3894			// console.log("afaf");
3895			var maxsize = "";
3896			if(typeof property != 'undefined' && property) maxsize = (property.VALIDPLAN && $.inArray(property.VALIDTYPE,['BN','SM']) > -1) ? 104857600 : 10485760;
3897			else if(typeof VALIDTYPE != 'undefined' && VALIDTYPE) maxsize = ($.inArray(VALIDTYPE,["BUSNESS","SHOPPING"]) > -1) ? 104857600 : 10485760;
3898			// console.log(maxsize);
3899            var flag = true;
3900            $.each(data.files, function(idx, file) {
3901                var filesize = file.size;
3902                if(file.size > maxsize) {
3903                    filesize = (filesize/1024/1024).toFixed(1);
3904                    if(maxsize == 104857600) err = $.lang[LANG]['editor.upload.max.100'] + $.lang[LANG]['editor.upload.max.2'];
3905                    else err = $.lang[LANG]['editor.upload.max.1'] + $.lang[LANG]['editor.upload.max.2'];
3906				
3907					$('.flat-modal').addClass('hide');
3908					$('.modal-backdrop').addClass('hide');
3909					
3910					var modal = $(this).showModalFlat('', err,true,false,function(){
3911						
3912						$(document).on('keydown', function(e) {
3913                            if(e.keyCode == 27) modal.modal('hide');
3914                        });
3915						$('.flat-modal').removeClass('hide');
3916						$('.modal-backdrop').removeClass('hide');
3917
3918					},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3919						$('.flat-modal').removeClass('hide');
3920						$('.modal-backdrop').removeClass('hide');
3921
3922					});
3923					
3924
3925                    flag = false;
3926                    return false;
3927                }
3928            });
3929
3930            if(!flag) return false;
3931        },
3932        add: function(e,data) { // 서버에 업로드 일단 함
3933            var r = $.upload_add(e,data,'register_flink');
3934			// r 객체에 submit이 false이고 err 메시지가 있는 경우 에러 팝업을 띄우는 처리 예시입니다.
3935			if (r && r.submit === false && r.err) {
3936				$('.flat-modal').addClass('hide');
3937				$('.modal-backdrop').addClass('hide');
3938			}
3939
3940            if(r.submit) {
3941                $('#loading').css('left','-100%');
3942                $.processON();
3943                data.submit();
3944				
3945                // var jqXHR = data.submit();
3946            } else {
3947				
3948				
3949
3950				var modal = $(this).showModalFlat('', r.err,true,false,function(){
3951					$(document).on('keydown', function(e) {
3952                        if(e.keyCode == 27) modal.modal('hide');
3953                    });
3954					$('.flat-modal').removeClass('hide');
3955					$('.modal-backdrop').removeClass('hide');
3956
3957				},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3958					$('.flat-modal').removeClass('hide');
3959					$('.modal-backdrop').removeClass('hide');
3960
3961				});				
3962            }
3963        },
3964        done: function (e, data) {
3965            if(typeof data.result.error != 'undefined' && data.result.error) {
3966                // alert(data.result.error);
3967
3968				var modal = $(this).showModalFlat('', data.result.error,true,false,function(){
3969						
3970					$(document).on('keydown', function(e) {
3971                        if(e.keyCode == 27) modal.modal('hide');
3972                    });
3973					$('.flat-modal').removeClass('hide');
3974					$('.modal-backdrop').removeClass('hide');
3975
3976				},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3977					$('.flat-modal').removeClass('hide');
3978					$('.modal-backdrop').removeClass('hide');
3979
3980				});	
3981                // $('.progress .progress-bar').css('width','0%');
3982                $.processOFF();
3983                return;
3984            }
3985            if(typeof data.result.file == 'undefined' || !data.result.file || typeof data.result.uploaded == 'undefined' || !data.result.uploaded) {
3986              
3987
3988				var modal = $(this).showModalFlat('', $.lang[LANG]['form.file.upload.disabled'],true,false,function(){
3989						
3990					$(document).on('keydown', function(e) {
3991                        if(e.keyCode == 27) modal.modal('hide');
3992                    });
3993					$('.flat-modal').removeClass('hide');
3994					$('.modal-backdrop').removeClass('hide');
3995
3996				},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3997					$('.flat-modal').removeClass('hide');
3998					$('.modal-backdrop').removeClass('hide');
3999
4000				});					
4001                $.processOFF();
4002                return;
4003            }
4004
4005            if(data.result.uploaded) {
4006                var flink_s = (data.result.uploaded.file_size) ? Number(data.result.uploaded.file_size) : 0,
4007                    flink_unit = (flink_s > 1024) ? 'MB' : 'KB',
4008                    flink_size = (flink_s > 1024) ? flink_s/1024 : flink_s;
4009                    
4010                var uploaded = data.result.uploaded;
4011                var thumb = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50" height="50"><g><path d="M28 16.82c0 1.21.98 2.18 2.18 2.18H40L28 7v9.82z" style="fill:#3870B2"/><path d="M30.18 19c-1.2 0-2.18-.98-2.18-2.18V7H13c-1.66 0-3 1.34-3 3v30c0 1.66 1.34 3 3 3h24c1.66 0 3-1.34 3-3V19h-9.82zM32 35H18v-2h14v2zm0-5H18v-2h14v2zm0-5H18v-2h14v2z" style="fill:#4789e7"/></g></svg>';
4012                if(uploaded.file_type.indexOf('image/') > -1 && uploaded.thumbnail_url) {
4013                    thumb = '<img src="' + uploaded.thumbnail_url + '">';
4014                }
4015                
4016                //$(this).closest(".cl-s-etc-val").find("input[type='text']").remove();
4017                $(this).closest("[data-jcoltype='fupload']").find(".valueCheck").val(data.result.uploaded.orig_name + '||' + data.result.uploaded.file_size + 'KB' + '||' + data.result.file);
4018                $(this).closest(".cl-s-form-wrap").removeClass("empty");
4019				
4020				switch(currentPage){
4021					case "mypage" : 
4022					case "register" : 
4023						var fileRow = '\
4024						<div class="file-row display-flex align-items-center">\
4025							<div class="r-flex-left">\
4026								<div class="file-thumb"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M4 16c-1.66 0-3-1.34-3-3V6l6-6h5c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H4Zm-2-3c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2H8v4c0 1.1-.9 2-2 2H2v6Zm.41-7H6c.55 0 1-.45 1-1V1.41L2.41 6ZM4 13v-1h8v1H4Zm0-3V9h8v1H4Z"/></svg></div>\
4027								<div>\
4028									<p class="file-name">'+uploaded.orig_name+'</p>\
4029								</div>\
4030							</div>\
4031							<div class="r-flex-right">\
4032									<p class="file-size">'+flink_size.toFixed(2) + flink_unit+'</p>\
4033								<span class="form-file-delete" data-src="'+uploaded.file_name+'">\
4034									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15" width="15" height="15"><g>
4034<path d="M2.35 12.65c-.2-.2-.2-.51 0-.71l9.6-9.6c.2-.2.51-.2.71 0 .2.2.2.51 0 .71l-9.6 9.6c-.2.2-.52.2-.71 0z"/><path d="M12.3 2.2a.47.47 0 0 0-.35.15l-9.6 9.6c-.2.2-.2.51 0 .71.1.1.23.15.35.15.13 0 .26-.05.35-.15l9.6-9.6c.2-.2.2-.51 0-.71-.1-.1-.22-.15-.35-.15z"/><path d="M12.65 12.65c-.2.2-.51.2-.71 0l-9.6-9.6c-.2-.2-.2-.51 0-.71.2-.2.51-.2.71 0l9.6 9.6c.2.2.2.52 0 .71z"/><path d="M2.7 2.2a.47.47 0 0 0-.35.15c-.2.2-.2.51 0 .71l9.6 9.6c.1.1.23.15.35.15.13 0 .26-.05.35-.15.2-.2.2-.51 0-.71l-9.6-9.6a.47.47 0 0 0-.35-.15z"/></g></svg>\
4035								</span>\
4036							</div>\
4037						</div>\
4038						';
4039					break; 		
4040								
4041					case "info" :
4042						// 파일 정보를 조합하여 다운로드 링크 생성
4043						var file_info_str = uploaded.orig_name + '||' + uploaded.file_size + 'KB' + '||' + data.result.file;
4044						var fileResult = $.umember.fileurlcreate(file_info_str);
4045						var download_link = fileResult.download_link;
4046						
4047						var fileRow = '\
4048						<div class="file-row file-info-layout">\
4049							<div class="file-left-area">\
4050								<p class="file-name">'+uploaded.orig_name+'</p>\
4051							</div>\
4052							<div class="file-right-area">\
4053								<span class="file-size">'+flink_size.toFixed(2) + flink_unit+'</span>\
4054								'+download_link+'\
4055									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
4056										<path d="M5 19v-3.5h1V18h12v-2.5h1V19H5Zm2.65-7.15.71-.71 3.15 3.15V5h1v9.29l3.15-3.15.71.71-4.35 4.35-4.35-4.35Z"/>\
4057									</svg>\
4058								</a>\
4059								<span class="form-file-delete" data-src="'+uploaded.file_name+'">\
4060									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
4061										<path d="M19 8h-3V6H8.02v2H5v1h1v9c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V9h1V8ZM9.02 7H15v1H9.02V7ZM17 18c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1V9h10v9Zm-7-7h1v6h-1v-6Zm3 0h1v6h-1v-6Z"/>\
4062									</svg>\
4063								</span>\
4064							</div>\
4065						</div>\
4066						';
4067					break; 	
4068				}	
4069                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register").append(fileRow);
4070				$(this).closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').addClass('hide');
4071
4072				$(this).closest("[data-jcoltype='fupload']").addClass('isdata');
4073				$(this).closest("[data-jcoltype='fupload']").removeClass('nodata');
4074            }
4075            
4076             if($(this).closest("[data-jcoltype='fupload']").find('.file-row').length >= REGISTER_MAX_FILE_NUMBER) {
4077                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register").find('label').addClass('disabled');
4078                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register ").find('input[type="file"]').prop('disabled', true);
4079
4080				var $inputElement = $(this).closest("[data-jcoltype='fupload']").find('.valueCheck');
4081				$inputElement.attr('data-etcidx', '');
4082				$inputElement.attr('data-id', '');
4083				$inputElement.attr('data-file-name', '');				
4084            }
4085            $.processOFF();
4086            // $('#loading').css('left','50%');
4087        },
4088    }).prop('disabled', !$.support.fileInput)
4089        .parent().addClass($.support.fileInput ? undefined : 'disabled');
4090	});
4091
4092	$(document).on("click", "div[data-jcoltype='fupload'] .form-file-delete", function() {
4093		var REGISTER_MAX_FILE_NUMBER = 1;
4094		var $elem = $(this);
4095
4096		var $label = $(this).closest("[data-jcoltype='fupload']").find('label');
4097		var $inputFile = $(this).closest("[data-jcoltype='fupload']").find('input[type="file"]');
4098		var etcIdx = $(this).closest("[data-jcoltype='fupload']").find('.valueCheck').attr('name');
4099		etcIdx = etcIdx.replace('member-', '');
4100		var directDeleteFlag = false;
4101		var $closestForm = $(this).closest('form[name="myinfo_form"]');
4102		var id = "";
4103
4104		if( $closestForm.length > 0 && $closestForm.attr('action') === '/_myinfo_proc') {
4105			directDeleteFlag = true;
4106			id = $(this).closest($closestForm).find('[name="email"]').val();
4107		} else if (($(this).closest(".mng-modal-body").length > 0)){
4108			directDeleteFlag = true;
4109			id = $(this).closest(".mng-modal-body").find(".member-info-input").val();
4110		}
4111
4112		if(directDeleteFlag) {
4113
4114			var $inputElement = $elem.closest("[data-jcoltype='fupload']").find('.valueCheck');
4115			$inputElement.attr('data-etcidx', etcIdx);
4116			$inputElement.attr('data-id', id || '');
4117			$inputElement.attr('data-file-name', $elem.data('src'));
4118			
4119			// 파일 업로드 상태 업데이트
4120			var fileRowCnt = $elem.closest("[data-jcoltype='fupload']").find('.file-row').length;
4121			$elem.closest("[data-jcoltype='fupload']").find(".valueCheck").attr('value', '');
4122			
4123			$elem.closest("[data-jcoltype='fupload']").addClass('nodata');
4124			$elem.closest("[data-jcoltype='fupload']").removeClass('isdata');
4125			$elem.closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').removeClass('hide');
4126
4127			if($elem.closest("[data-jcoltype='fupload']").hasClass("type2")) {
4128				$elem.closest("[data-jcoltype='fupload']").removeClass("isdata");
4129				$elem.closest("[data-jcoltype='fupload']").addClass("nodata");
4130			}
4131			if(fileRowCnt - 1 < REGISTER_MAX_FILE_NUMBER) {
4132				$label.removeClass('disabled');
4133				$inputFile.prop('disabled', false);
4134			}
4135			$elem.closest('.file-row').remove();
4136			
4137			// 확인 메시지
4138			
4139		} else {
4140			if(confirm(directDeleteFlag ? $.lang[LANG]['upload.file.confirm.delete'] : $.lang[LANG]['form.file.confirm.delete'])) {
4141			
4142 			$.ajax({
4143				url:"/template/register_fupload/delete-file",
4144				type:"post",
4145				async: true,
4146				beforeSend: function() {
4147					$.processON();
4148				},
4149				data:{
4150					"s": $elem.data("src"),
4151					"directDeleteflag" : directDeleteFlag ,
4152					"etcIdx" : etcIdx,
4153					"id" : id || "",
4154					"sid": (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '')
4155				},
4156				dataType:"json",
4157				success:function() {
4158					var fileRowCnt = $elem.closest("[data-jcoltype='fupload']").find('.file-row').length;
4159					$elem.closest("[data-jcoltype='fupload']").find(".valueCheck").attr('value', '');
4160					if(fileRowCnt > 1) {
4161						$elem.closest("[data-jcoltype='fupload']").find('.file-uploaded-number').text('(' + (fileRowCnt - 1) + '/' + REGISTER_MAX_FILE_NUMBER + ')');
4162					} else {
4163						$elem.closest("[data-jcoltype='fupload']").addClass('nodata');
4164						$elem.closest("[data-jcoltype='fupload']").removeClass('isdata');
4165						$elem.closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').removeClass('hide');
4166
4167						if($elem.closest("[data-jcoltype='fupload']").hasClass("type2")) {
4168							$elem.closest("[data-jcoltype='fupload']").removeClass("isdata");
4169							$elem.closest("[data-jcoltype='fupload']").addClass("nodata");
4170						}
4171					}
4172					
4173					if(fileRowCnt - 1 < REGISTER_MAX_FILE_NUMBER) {
4174						$label.removeClass('disabled');
4175						$inputFile.prop('disabled', false);
4176					}
4177				},
4178				complete: function() {
4179					$elem.closest('.file-row').remove();
4180					$.processOFF();
4181				}
4182			});
4183		 }
4184		}			
4185	});		
4186	// $.fixbtnConfig = {
4187	// 	html: function(e){
4188	// 		// console.log('fixbtnConfig html');
4189
4190	// 		var $this = ($('.siteLANG').has(e.target).length || $(e.target).hasClass('siteLANG')) ? $('.el-menu .siteLANG') : $(e.target),
4191	// 			fixbtnPosition = $.fixbtnConfig.position($this),
4192	// 			checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false,
4193	// 			fh_type = $('header.navbar[data-fixtype]').attr('data-fh-type'),	
4194	// 			fixtypeNum = $('header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),		
4195	// 			fixtypeArr = ['01','02','03','08'],
4196	// 			edit_html = '<div class="fixbtn_wrap"><span class="fixbtn_edit">' + clSVG('block-config',15,15) + '</span></div>',
4197	// 			checktarget = $.fixbtnConfig.checkTarget($this);
4198				
4199	// 		if(checktarget.indexOf('FixedMenu')>-1) {
4200	// 			if(checkSidebar) $('.navbar-fheader[data-fixtype] .cl-fixed-menu').prepend(edit_html);
4201	// 			else $('.navbar-fheader[data-fixtype] .cl-fixed-menu').before(edit_html);
4202	// 		} else {
4203	// 			$('.element [data-fixtype^="sidebar_"] .siteLANG.cl-fixbtn').prepend(edit_html);
4204	// 		}
4205			
4206	// 		$('.fixbtn_wrap').css('left',fixbtnPosition.left+'px');
4207			
4208	// 		if(checkSidebar && $.inArray(fixtypeNum, fixtypeArr) > -1) $('.fixbtn_wrap').css('top',fixbtnPosition.top+'px');
4209	// 		if(!checkSidebar) $('.fixbtn_wrap').css('height',fixbtnPosition.height+'px');
4210	// 		if(!checkSidebar && (fh_type=='top')) $('header.navbar[data-fixtype]').find('.cl-fixed-menu').css('padding-left','50px');
4211	// 	},
4212	// 	position: function($this){
4213	// 		// console.log('fixbtnConfig position');
4214	// 	    if((window.innerWidth < 769 && typeof MODE == 'undefined')) return false; 
4215	// 	    var height_arr = {},
4216	// 	    	fh_type = ($('c').attr('data-fh-type')) ? $('header.navbar[data-fixtype]').attr('data-fh-type') : 'top',
4217	// 	    	fixtextalign = ($('header.navbar[data-fixtype]').attr('data-fixtextalign')) ? $('header.navbar[data-fixtype]').attr('data-fixtextalign') : 'center',
4218	// 	        fixtypeNum = $('header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),
4219	// 	        fixtypeArr = ['01','02','03','08'],
4220	// 	        checkSlang = ($('.cl-fixbtn.siteLANG').length > 0) ? true : false,
4221	// 	        checkFixedMenu = ($('.cl-fixed-menu').length > 0) ? true : false,
4222	// 	        checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false,
4223	// 	        checktarget = $.fixbtnConfig.checkTarget($this);
4224
4225	// 			$this = (checktarget.indexOf('FixedMenu')>-1) ? $('.element header.navbar[data-fixtype] .cl-fixed-menu') : $('.element [data-fixtype^="sidebar_"] .siteLANG.cl-fixbtn');
4226
4227	// 	    var $cl_fixbtn = ($('header.navbar[data-fixtype] .cl-fixed-menu .cl-fixbtn.cl-visible').length>0) ? $('header.navbar[data-fixtype] .cl-fixed-menu .cl-fixbtn.cl-visible') : '',
4228	// 	    	width_val = ($cl_fixbtn) ? $cl_fixbtn.width() : 0,
4229    //             clfixbtn_eq = (fixtextalign=='left' && checkSidebar && !$this.hasClass('siteLANG')) ? ($cl_fixbtn ? $cl_fixbtn.last() : $cl_fixbtn.first()) : ($this.hasClass('siteLANG') ? '' : $cl_fixbtn.first()),
4230    //             $selector = $this.hasClass('siteLANG') ? $this.find('.cl-lang').offset().left.toFixed(0) : 
4231	// 	        			( $cl_fixbtn ? ((clfixbtn_eq.find('> a:visible').length>0) ? clfixbtn_eq.find('> a:visible').offset().left.toFixed(0) : 0) : 0),
4232	//    			leftPosCal = (checkSidebar) ? 50 : 47,
4233	// 	        top_cal = '';
4234
4235	//    			$selector = Number($selector);
4236
4237   	// 		//사이드바 세로디자인 확장기능버튼(01,02,03,08) => a 태그 width 최대값 구하기
4238   	// 		if(checkSidebar && ($.inArray(fixtypeNum, fixtypeArr) > -1) && !$this.hasClass('siteLANG')) {  
4239	//         	var width_arr = [],
4240	//         		selector_arr = [];
4241
4242    //             $cl_fixbtn.find('> a:visible').each(function(){
4243    //             	var w_val = $(this).width();
4244    //             	if(!top_cal) top_cal = Number(($(this).parents('li.cl-fixbtn.cl-visible').height() - 25) / 2);
4245            
4246    //             	width_arr.push(w_val);
4247    //             	selector_arr.push($(this));
4248    //             });
4249
4250    //             var w_max = Math.max(...width_arr),
4251    //             	w_index = width_arr.indexOf(w_max);
4252	
4253    //         	$selector = Number($(selector_arr[w_index]).offset().left.toFixed(0));      
4254            	     	
4255    //         	width_val = w_max;
4256    //         } 
4257          	
4258    //         var fixed_left = ($this.hasClass('siteLANG')) ? ((fixtextalign=='left') ? $selector+$this.find('.cl-lang').width()-3 : $selector-47) : ((fixtextalign=='left' && checkSidebar) ? $selector+width_val : $selector-leftPosCal),
4259	// 	        fixed_height = ($this.height() < 15) ? 45 : (fh_type=='right' ? $('header.navbar[data-fixtype]').find('#tpl-menu li').height() + 1 : $('header.navbar[data-fixtype]').find('#fixed-menu').height());
4260	       
4261	// 	    height_arr = {
4262	// 	        'left' : fixed_left,
4263	// 	        'height' : fixed_height,
4264	// 	        'top' : top_cal
4265	// 	    }
4266
4267	// 	    return height_arr;
4268	// 	},
4269	// 	checkTarget : function($this) {
4270	// 		// console.log('fixbtnConfig checkTarget');
4271	// 		var checkTarget = '',
4272	// 			checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false;
4273
4274	// 		if(checkSidebar) {
4275	// 	    	checkTarget = ($this.has($('.siteLANG')).length>0 || $this.hasClass('siteLANG')) ? 'sidebarSiteLang' : 'sidebarFixedMenu';
4276	// 	    } else {	
4277	// 	    	checkTarget = 'topFixedMenu'
4278	// 	    }
4279
4280	// 	    return checkTarget;
4281	// 	}
4282	// }
4283
4284	var setLoginLogoutAttribute = function(check_login,nav,display) {
4285		if(!check_login) {
4286			nav.find('.siteUM').removeClass('dropdown').find('.cl-login').show().removeClass(display).addClass(display);
4287			nav.find('.siteUM').find('.cl-logout').hide();
4288		} else {
4289			nav.find('.siteUM').find('.cl-login').hide();				
4290			nav.find('.siteUM').find('.cl-logout').show();
4291			nav.find('.siteUM').find('.dropdown-menu').remove();
4292		}
4293	}
4294
4295	var getJoinCollectionsList = function(sid) {
4296		var returnHtml = '';
4297		$.ajax({
4298			url: '/umember/collections',
4299			type: 'post',
4300			data: { sid : sid },
4301			dataType: 'html',
4302			success: function (list_html) {
4303				// $('.order-list-area').html(list_html);
4304				returnHtml += list_html;
4305			}, error: function () {
4306	
4307			}, complete: function () {
4308				// $.processOFF();
4309			}
4310		});
4311	   
4312		return returnHtml;
4313	}	
4314	
4315	/***********************************************************************************************************************************member-config page START*/
4316	var activePrev = $('#join-activate').selectpicker('val');
4317	$('#join-activate, #join-language, #join-approval, #join-display, #join-captcha').live('change', function () {
4318		var key = $(this).attr('id').replace(/join-/gi,''),
4319			val = ($(this).is('select')) ? $(this).val() : $(this).prop('checked');
4320
4321		$.ajax({
4322			type: 'POST',
4323			url: '/umember/update/type/condition',
4324			data: { sid : SID, key : key, val : val },
4325			dataType: 'json',
4326			async: true,
4327			success: function(data) {
4328				if(typeof data.error != 'undefined' && data.error) {
4329					alert(data.error);
4330					return false;
4331				}
4332				if(data.cert_use !== undefined && data.cert_use) {
4333					$('#join-activate').selectpicker('val', activePrev);
4334		            var modal_str = $.lang[LANG]['manager.cert.disable.option.txt'];
4335		            $(this).showModalFlat($.lang[LANG]['manager.cert.disable.option'], modal_str,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-okbtn-pbt70 site-umember-modal');
4336		            return false;
4337				}
4338				activePrev = val;
4339
4340				if(val == '0') {
4341					$('#section-top-menu li').addClass('disabled-cert');
4342				} else {
4343					$('#section-top-menu li').removeClass('disabled-cert');
4344				}
4345			}
4346		});
4347	});
4348
4349	$(document).off('click', '.mng-settings[data-type="collection"] .collection-item-used, .mng-settings[data-type="collection"] .collection-item-optional')
4350			   .on('click', '.mng-settings[data-type="collection"] .collection-item-used, .mng-settings[data-type="collection"] .collection-item-optional', function() {
4351		if($(this).closest('.checkboxs').hasClass('disabled')) {
4352			var modal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['manager.check.collection.required.message'], true, false, '', 'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
4353			return false;
4354		}
4355
4356		var cl_val = $(this).prop('checked'),
4357			item_seq = $(this).parents('.collection-item').attr('data-seq'),
4358			jcol_name = $(this).parents('.collection-item').find('.collection-name').text(),
4359			update_data = {},
4360			jcol_data = {},
4361			d_index = 0,
4362			check_class = $(this).attr('class').replace(/collection-item-/gi,'');
4363
4364		check_class = (check_class=='optional') ? 'require' : check_class;
4365				
4366		jcol_data[0] = {
4367			seq : item_seq,
4368			[check_class] : cl_val.toString()
4369		}
4370
4371		if (check_class === 'used' && cl_val.toString() === 'false' && $(this).closest('.use-option-check').find('.collection-item-optional').prop('checked') === true) {
4372			jcol_data[0]['require'] = 'false';
4373			$(this).closest('.use-option-check').find('.collection-item-optional').prop('checked', false);
4374		}
4375		if (check_class === 'require' && cl_val.toString() === 'true' && $(this).closest('.use-option-check').find('.collection-item-used').prop('checked') === false) {
4376			jcol_data[0]['used'] = 'true';
4377			$(this).closest('.use-option-check').find('.collection-item-used').prop('checked', true);
4378		}
4379		
4380		$.ajax({
4381			type: 'POST',
4382			url: '/umember/setJoinCollections/type/jcol_update',
4383			data: { sid: SID, update_data: jcol_data },
4384			dataType: 'json',
4385			async: true,
4386			success: function(data) {
4387				if(typeof data.error != 'undefined' && data.error) {
4388					alert(data.error);
4389					return false;
4390				}
4391
4392				var slog_val = check_class+'.'+cl_val.toString(),
4393					slog_field = {'field_name':jcol_name};
4394				setSiteLogs('um.config.collection.new',slog_val,slog_field,'um.config.collection.new');
4395			},
4396			complete: function () {
4397				$.processOFF();
4398			}
4399		});
4400	});
4401	
4402	$('.cl-s-join-collections-etcwrap[data-jcoltype="memo"] textarea').live({
4403		focus : function(e){
4404			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').addClass('etc-mouseEnter');
4405			if($(this).val()) {
4406				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active').addClass('textarea-active');
4407			} else {
4408				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active');
4409			}
4410		},
4411		focusout : function(e) {
4412			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('etc-mouseEnter');
4413			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active-text').addClass('textarea-active-text');
4414			if($(this).val()) {
4415				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active').addClass('textarea-active');
4416			} else {
4417				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active');
4418			}
4419		}
4420		
4421	});
4422
4423	$('.mng-member .mng-settings[data-type="collection"] .collection-add').live('click',function() {
4424
4425		if($('.mng-member .collection-content').find('.collection-item.additem').length>0) {
4426			return false;
4427		}
4428		// if($('.mng-member .collection-content').find('.collection-update').length>0) {
4429		// 	$('.mng-member .collection-content .collection-update').find('input').focus();
4430		// 	return false;
4431		// }
4432	
4433		if($('.mng-member .collection-content').find('.collection-item').length==15) $(this).hide();
4434		if($('.mng-member .collection-content').find('.collection-item').length>16) {
4435			var modal = $(this).showModalFlat('DELETE FIELD', $.lang[LANG]['manager.join.cl.item.max-add'], true, false, '', 'ok');
4436			return false;
4437		}
4438
4439		var cl_etc_arr = $('.mng-member .collection-content .collection-item').map(function() { 
4440							var cl_type = $(this).attr('data-type');
4441							if(cl_type.match(/^etc/)) return cl_type.replace('etc','');
4442						}).get().sort(),
4443			cl_etc = $('.collection-content .collection-item').length-6;
4444
4445		for (var i = 0; i < 10; i++) {
4446			if(typeof cl_etc_arr[i] == 'undefined' || parseInt(cl_etc_arr[i]) != (i+1) ) {
4447				cl_etc = i+1; 
4448				break;
4449			}
4450		}
4451
4452		var str = collectionItem('',cl_etc);
4453		
4454        $('.mng-member .collection-content').append(str)
4455		
4456		
4457		$('.mng-member .collection-content').find('.collection-item[data-etc="' + cl_etc + '"] .collection-edit').click();
4458		$('.collection-type-selectbox select[name="jcollection-select-type"]').selectpicker();		
4459		
4460		$('.collection-item.additem').find('.collection-config').removeClass('hide').addClass('hide');
4461		collectionSortable('.mng-member .collection-item');
4462		
4463	});
4464
4465
4466	
4467
4468    $('.mng-member .mng-settings[data-type="collection"] .collection-edit').live('click', function() {
4469		if($('.mng-member .collection-content').find('.collection-update').length > 0 ) {
4470			return false;
4471		}
4472		var selectCl = $(this).closest('.collection-item'),
4473			cl_name = selectCl.find('.collection-name').text(),
4474			input_text = addCollectionInput(cl_name);
4475
4476		selectCl.removeClass('collection-status-edit').addClass('collection-status-edit');
4477		$('.mng-member .collection-content').removeClass('collection-status-disabled').addClass('collection-status-disabled');
4478		$(this).parents('.collection-item').siblings().find('.collection-config > .icons').removeClass('hide').addClass('hide');
4479		// $(input_text).prependTo(selectCl.find('.collection-info'));
4480		// $(input_text).prependTo(selectCl);
4481
4482		// $(this).parents('.collection-item').find('.collection-info .collection-name').hide();
4483		// $('.mng-member .collection-content').find('.collection-item').css('pointer-events','none');
4484		// $('.mng-member .collection-content').find('.collection-update-cancel, .collection-update-save, .collection-update-name').css('pointer-events','auto');
4485		// $('.mng-member .collection-update .collection-update-name').focus();
4486		$('#join-collections,#mjoin-collections').sortable({cancel: '.collection-item' });
4487	});
4488
4489	$('.mng-member .mng-settings[data-type="collection"] .collection-delete').live('click', function() {
4490		var selectCl = $(this).closest('.collection-item'),
4491			cl_etc = (typeof selectCl.attr('data-etc') != 'undefined' && selectCl.attr('data-etc')) ? selectCl.attr('data-etc') : '',
4492			cl_field = 'etc' + cl_etc,
4493			cl_name = selectCl.find('.collection-name').text(),
4494			item_seq = $(this).parents('.collection-item').attr('data-seq');
4495
4496		var del_modal = $(this).showModalFlat($.lang[LANG]['manager.join.cl.item.delete.title'], $.lang[LANG]['manager.join.cl.item.delete'], true, true, function() {
4497			selectCl.addClass('delete_item');
4498
4499			$.processON();
4500
4501			$.ajax({
4502				type: 'POST',
4503				url: '/umember/setJoinCollections/type/jcol_delete',
4504				data: { sid: SID, d_seq : item_seq },
4505				dataType: 'json',
4506				async: true,
4507				success: function(data) {
4508					if(typeof data.error != 'undefined' && data.error) {
4509						alert(data.error);
4510						return false;
4511					}
4512			
4513					$('.mng-member .collection-content').find('.collection-item[data-etc="'+cl_etc+'"]').remove();
4514					if($('.mng-member .collection-content').find('.collection-item').length<16) {
4515						$('.mng-member .collection-add').show();
4516					}
4517					
4518					del_modal.modal('hide');
4519
4520					setSiteLogs('um.config.collection','delete',{'field_name':cl_name,'field':cl_field},'um.config.collection');
4521
4522				},
4523				complete: function () {
4524					$.processOFF();
4525				}
4526			});
4527		}, 'cancel',$.lang[LANG]['manager.join.cl.item.delete.btn.delete'],'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
4528	});
4529
4530
4531	$('.mng-member .mng-settings[data-type="collection"] .collection-update-cancel').live('click', function() {
4532		if($('.mng-member .collection-content').find('.collection-item').length<16) $('.mng-member .collection-add').show();
4533		if(!$(this).closest('.collection-item').find('.collection-name').text()) {
4534			$(this).closest('.collection-item').remove();
4535		}
4536		$(this).parents('.collection-item').find('.collection-info .collection-name').show();
4537		$('.mng-member .collection-content').find('.config-error').remove();
4538		$('.mng-member .collection-content').find('.collection-item').removeAttr('style');
4539		$(this).closest('.collection-update').remove();
4540		collectionSortable();
4541	});
4542
4543	$('.mng-member .collection-update-save').live('click', function(e) {
4544		var selectCl = $(this).closest('.collection-item'),
4545			cl_etc = (typeof selectCl.attr('data-etc') != 'undefined' && selectCl.attr('data-etc')) ? selectCl.attr('data-etc') : '',
4546			cl_field = 'etc' + cl_etc,
4547			cl_type = selectCl.find('.collection-item-type-select').val(),
4548			cl_name = selectCl.find('.collection-update-name').val().trim(),
4549			cl_prev = selectCl.find('.collection-name').text().trim(),
4550			regexp = /^[ㄱ-ㅎ가-힣ㅏ-ㅣa-zA-Z0-9\# ]+$/i,
4551			error_str = '';
4552
4553
4554		$('.collection-content .config-error').remove();
4555		$(this).parents('.collection-item').find('.collection-info .collection-name').show();
4556
4557		if(cl_prev == cl_name) {
4558			if(selectCl.hasClass('additem')) {
4559				error_str = $.lang[LANG]['manager.join.cl.item.name.enter'];
4560			} else {
4561				$('.collection-content').find('.collection-item').removeAttr('style');
4562				$('.collection-content').find('.collection-update').remove();
4563				return false;
4564			}
4565		}
4566
4567
4568		if(cl_name.length == 0) error_str = $.lang[LANG]['board.enter-group-name'];
4569		else if(checkEmojis(cl_name)) error_str = $.lang[LANG]['config.unable.emoji'];
4570		else if(!regexp.test(cl_name)) error_str = $.lang[LANG]['board.allowed-chars'];
4571		else if(cl_name.length>20) error_str = $.lang[LANG]['board.enter-max-chars'];
4572		else if(cl_prev == cl_name) {
4573			if(selectCl.hasClass('additem')) {
4574				error_str = $.lang[LANG]['manager.join.cl.item.name.enter'];
4575			} else {
4576				$('.collection-content').find('.collection-item').removeAttr('style');
4577				$('.collection-content').find('.collection-update').remove();
4578				return false;
4579			}
4580		} else {
4581			var cl_name_list = $('.collection-content').find('.collection-name').map(function() { return $(this).text().trim(); }).get();
4582			if($.inArray(cl_name,cl_name_list) > -1) {
4583				error_str = $.lang[LANG]['manager.join.cl.item.name.inuse'];
4584			}
4585		}
4586
4587		if(error_str.length > 0) {
4588			e.preventDefault();
4589			$(this).parents('.collection-item').find('.collection-info .collection-name').hide();
4590			selectCl.append('<div class="config-error collection-edit">' + error_str + '</div>');
4591			return false;
4592		}
4593			
4594		var collections = {};
4595		$('.mng-member .collection-content').children('.collection-item').each(function() {
4596			var field = $(this).attr('data-type'),
4597				name = (field == cl_field) ? cl_name : $(this).find('.collection-name').text().trim(),
4598				type = (field == cl_field) ? cl_type : $(this).find('.collection-item-type-select').val(),
4599				used = $(this).find('.collection-item-used').prop('checked'),
4600				optional = $(this).find('.collection-item-optional').prop('checked');
4601
4602			collections[field] = {
4603				'used'	: used,
4604				'optional'	: optional,
4605				'name'	: name,
4606				'type'	: type
4607			};
4608		});
4609		
4610		$.ajax({
4611			type: 'POST',
4612			url: '/umember/update/type/condition',
4613			data: { sid: SID, key: 'collections_all', val: JSON.stringify(collections) },
4614			dataType: 'json',
4615			async: true,
4616			success: function(data) {
4617				if(typeof data.error != 'undefined' && data.error) {
4618					alert(data.error);
4619					return false;
4620				}
4621
4622				if(selectCl.hasClass('additem')) {
4623					selectCl.removeClass('additem');
4624					selectCl.find('#collection-item-used-additem').removeAttr('id').attr('id','collection-item-used-'+cl_field);
4625					// selectCl.find('label[for="collection-item-used-additem"]').removeAttr('for').attr('for','collection-item-used-'+cl_field);
4626					selectCl.find('#collection-item-optional-additem').removeAttr('id').attr('id','collection-item-optional-'+cl_field);
4627					// selectCl.find('label[for="collection-item-optional-additem"]').removeAttr('for').attr('for','collection-item-optional-'+cl_field);
4628				}
4629				selectCl.find('.collection-name').text(cl_name);
4630
4631				$('.collection-content').find('.config-error').remove();
4632				$('.collection-content').find('.collection-item').removeAttr('style');
4633				selectCl.find('.collection-update').remove();
4634				collectionSortable();
4635
4636
4637				var checkAdd = (cl_prev == '') ? true : false,
4638					slog_val = (checkAdd) ? 'add' : 'edit',
4639					slog_field = (checkAdd) ? {'field_name':cl_name,'field':cl_field} : {'field_name':cl_prev,'field':cl_field,'before':cl_prev,'after':cl_name};
4640				setSiteLogs('um.config.collection',slog_val,slog_field,'um.config.collection');
4641
4642			}
4643		});
4644	});
4645
4646
4647	$('#config-acces-terms, #config-privacy, #config-privacy-join, #config-privacy-nonmem, #config-description').live('blur', function(e) {
4648		var blur_id = $(this).attr('id'),
4649			key = blur_id.replace(/config-/gi,'').replace(/-/gi,'_'),
4650			val = $(this).val().trim(),
4651			mng_settings_el = $(this).closest('.mng-settings');
4652
4653		if(key.charAt(0) == 'm') key = key.substring(1,key.length);
4654
4655		$.ajax({
4656			type: 'POST',
4657			url: '/umember/update/type/condition',
4658			data: { sid : SID, key : key, val : val },
4659			dataType: 'json',
4660			async: true,
4661			success: function(data) {
4662				if(typeof data.error != 'undefined' && data.error) {
4663					alert(data.error);
4664					return false;
4665				}
4666				mngShowToast('check', $.lang[LANG]['manager.check.save.text'] , mng_settings_el);
4667
4668				if(typeof data.val  != 'undefined' && val == '') {
4669					$('#'+blur_id).val(data.val);
4670				}
4671			}
4672		});
4673
4674	});
4675
4676
4677	/*가입 수집 항목 : type 변경 기능(추후) 사용되는 부분.*/
4678	$('.mng-settings[data-type="collection"] .collection-toggle').live('click', function() {
4679	    $(this).closest('.collection-item').toggleClass('item-content-open');
4680	    if($(this).closest('.collection-item').hasClass('item-content-open')) {
4681	        $(this).removeClass('fa-angle-down').addClass('fa-angle-up');
4682	        // $(this).closest('.collection-item').find('.collection-item-content').removeAttr('style');
4683	    } else {
4684	        $(this).removeClass('fa-angle-up').addClass('fa-angle-down');
4685	        // $(this).closest('.collection-item').find('.collection-item-content').css('display','none');
4686	    }
4687	});
4688
4689
4690    $('.mng-siteUM-modal .profile-image-wrap,#my-image-modal .profile-image-wrap').live({
4691		click: function() {
4692			var checkFirstStep = ($(this).find('#profileMyImg').length > 0) ? false : true;
4693			if(checkFirstStep) $('.mng-siteUM-modal .my-image-edit').click();
4694			else $('#profileUMFileupload').click();
4695		}
4696	});
4697
4698    $('#profileUMFileupload').live({
4699		click: function() {
4700			
4701			var sid = $('#my-image-modal').attr('data-sid'),
4702				uid = $('#my-image-modal').attr('data-uid');
4703
4704			$(this).fileupload({
4705				url: '/umember/update/type/myimage/sid/'+sid+'/uid/'+uid,
4706				dataType: 'json',
4707				pasteZone: null,
4708				async: true,
4709				add: function(e, data) {
4710					$('#loading').css('left','-100%');
4711					$.processON();
4712					data.submit();
4713				}, 
4714				done: function(e, data) {
4715					if(typeof data.result.error != 'undefined' && data.result.error) {
4716						alert(data.result.error);
4717						$('.progress .progress-bar').css('width','0%');
4718						$.processOFF();
4719						return;
4720					}
4721					if(data.result.src) {
4722						$('.profile-image-wrap .my-image').prop('src',data.result.src);
4723						if($('.dashboard._admin_dashboard').length > 0) $('#dashboard-image-top image').attr('xlink:href',data.result.src);
4724						if($('#mobile-nav').length > 0) $('#mobile-nav .login-profile img').prop('src',data.result.src);
4725					}
4726                    $.processOFF();
4727					$('#loading').css('left','50%');
4728				},
4729				progressall: function(e, data) {
4730					var progress = parseInt(data.loaded / data.total * 100, 10);
4731					$('.progress .progress-bar').css(
4732						'width',
4733						progress + '%'
4734					);
4735				},
4736			}).prop('disabled', !$.support.fileInput)
4737				.parent().addClass($.support.fileInput ? undefined : 'disabled');
4738
4739		}
4740	});
4741
4742
4743	$('#uJoin').live('click', function() {
4744		var joinModal = $('#join-modal'),
4745			approval = $(this).attr('data-approval'),
4746			input_data = {};
4747
4748		if($(this).closest('#join-modal-preview').length != 0) {
4749			$(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
4750			return false; 
4751		}
4752
4753		joinModal.find('.form-group').each(function(i) { 
4754			var inputEL = $(this).find('input.form-control'),
4755				errorEL = $(this).find('.error'),
4756				field 	= inputEL.attr('id').trim().replace(/input-/,''),
4757				val		= inputEL.val(), 
4758				optional = $(this).hasClass('optional'),
4759				empty_class = (optional && val.trim().length == 0) ? 'empty' : '',
4760				error_str =   (optional && val.trim().length == 0) ? $.lang[LANG]['manager.check.required.message'] : '';
4761
4762			if(!error_str && val.trim().length > 0) {
4763				switch(field) {
4764					case 'password-checked': 
4765						if(joinModal.find('#input-password').val().trim() != val.trim()) {
4766							error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
4767						}
4768						break;
4769
4770					default:
4771						if(typeof  COLLECTION_REGEX[field] != 'undefined' &&  COLLECTION_REGEX[field]) {
4772							var pattern = COLLECTION_REGEX[field]['pattern_j'],
4773								reg = new RegExp(pattern);
4774							if(!reg.test(val)) error_str = COLLECTION_REGEX[field]['error'];
4775						}
4776						break;
4777				}
4778			}
4779
4780
4781			if(error_str.length > 0) {
4782				if(errorEL.length > 0) errorEL.text(error_str);
4783				else $(this).append('<span class="error ' + empty_class + '">' + error_str + '</span>');
4784
4785				if(joinModal.find('.focus').length == 0) inputEL.focus();
4786			} else {
4787				errorEL.remove();
4788				if(field == 'id') val = val.toLowerCase();
4789				if(field == 'password') val = hex_md5(val);
4790				if(field == 'email') val = val.toLowerCase();
4791
4792				if(field != 'password-checked') input_data[field] = val;
4793			}
4794
4795			input_data['wr_key'] = $("#wr_key").val();
4796		});
4797
4798		if(!joinModal.find('.kcaptcha-wrap').hasClass('hide')) {
4799			var captcha = joinModal.find('#wr_key'),
4800				val = captcha.val(),
4801				captcha_error = captcha.next('label.error'),
4802				error_str = '';
4803
4804			if( val.trim().length == 0 ) {
4805				error_str = $.lang[LANG]['manager.join.regexp.captcha'];
4806			} else if( val && (Base64.encode(val.trim()) != md5_norobot_key)) {
4807				error_str = $.lang[LANG]['manager.join.regexp.captcha.wrong'];
4808			} 
4809
4810			if( error_str.length > 0 ) {
4811				if(captcha_error.length > 0) captcha_error.text(error_str);
4812				else captcha.after('<label class="error">' +  error_str + '</label>');
4813				
4814				if(joinModal.find('.focus').length == 0) captcha.focus();
4815			} else {
4816				captcha_error.remove();
4817			}
4818		}
4819
4820
4821		if(joinModal.find('.error').length == 0) {
4822
4823			var sid = joinModal.attr('data-sid');
4824			$.post('/umember/join/update', { sid : sid, data : JSON.stringify(input_data) }, function(data) {
4825				if(typeof data.error != 'undefined' && data.error) {
4826					$.each(data.error, function(key,str) {
4827						if(joinModal.find('#input-'+key).length > 0 ) {
4828							joinModal.find('#input-'+key).focus();
4829							joinModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4830						} else { alert(str,'/manager/member'); return false; }
4831					});
4832					if(joinModal.find('.error').length > 0) return false;
4833				}
4834				
4835				if(typeof userSiteJoinCallback == 'function')
4836			    			userSiteJoinCallback();
4837			    		
4838				var okModal = $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.join.success.'+approval], true, false, '', $.lang[LANG]['config.close']);
4839				$.umember.joinModalInit();
4840				joinModal.modal('hide');
4841			},'json');
4842
4843		}
4844
4845
4846	});
4847
4848
4849	$('.view-join-textarea').live('click', function() {
4850		var sid = $(this).closest('.modal-default').attr('data-sid'),
4851			type = $(this).attr('data-type').replace(/-/gi,'_');
4852
4853		$.post('/umember/get/type/join', { sid : sid, field : type }, function(data) {
4854			if(typeof data.error != 'undefined' && data.error) {
4855				alert(data.error);
4856				return false;
4857			}
4858
4859			$('#join-textarea').html(data);
4860			if($('#join-textarea').css('display') == 'none') $('#join-textarea').fadeIn();
4861
4862		}, 'json');
4863
4864	});
4865
4866
4867	$('#uLogin').live('click', function() {
4868		var loginModal = $('#login-modal'),
4869			input_data = {};
4870
4871		loginModal.find('.form-group').each(function(i) { 
4872			var inputEL = $(this).find('input.form-control'),
4873				errorEL = $(this).find('.error'),
4874				field 	= inputEL.attr('id').trim().replace(/input-/,''),
4875				val		= inputEL.val(),
4876				error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.'+field+'.input'] : '';
4877
4878			if(error_str.length > 0 ) {
4879				if(errorEL.length > 0) errorEL.text(error_str);
4880				else $(this).append('<span class="error">' + error_str + '</span>');
4881
4882				if(loginModal.find('.focus').length == 0) inputEL.focus();
4883			} else {
4884				errorEL.remove();
4885				if(field == 'id') val = val.trim().toLowerCase();
4886				if(field == 'password') val = hex_md5(val);
4887				input_data[field] = val;
4888			}
4889		});
4890
4891		if(loginModal.find('.error').length == 0) {
4892
4893			var sid = loginModal.attr('data-sid');
4894			$.post('/umember/login/in', { sid : sid, data : JSON.stringify(input_data) }, function(data) {
4895
4896				if(typeof data.error != 'undefined' && data.error) {
4897					$.each(data.error, function(key,str) {
4898						if(loginModal.find('#input-'+key).length > 0 ) {
4899							loginModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4900						} else { alert(str,'/manager/member'); return false; }
4901					});
4902					if(loginModal.find('.error').length > 0) return false;
4903				}
4904
4905				$.umember.loginModalInit();
4906				$.umember.init();
4907				loginModal.modal('hide');
4908
4909				if(data.member.check_login) {
4910					if(typeof data.ss_url != 'undefined' && data.ss_url) {
4911						$.each(data.ss_url, function(i,url) {
4912							$('.dsgn-body').after('<img class="auth-img" src="' + url + '">');
4913						});
4914					}
4915
4916					if(typeof data.ga_uid != 'undefined' && data.ga_uid) {
4917						localStorage.setItem('googleAnalyticsUID'+sid, data.ga_uid);
4918					}
4919				}
4920
4921				if($('.menu-lock-block').length > 0 || $('.forum-view').length > 0) location.reload(); 
4922				if($('.element[data-type="latest"]').find('.latest-table-loop').hasClass('latest-table-empty')) location.reload();
4923				if($('.element[data-type="forum"]').length > 0) {
4924					if( 
4925						$('.element[data-type="forum"]').find('.tpl-forum-list-title[data-option="S"]').length > 0 ||
4926						$('.element[data-type="forum"]').find('.container .table tr > td[colspan="10"]').length > 0 ||
4927						$('.element[data-type="forum"]').find('.tpl-forum-write:contains(login)').length > 0 
4928					) location.reload();
4929				}
4930
4931				$('.gallery-item').each(function () {
4932					if ($(this).hasClass('nonePrice')) {
4933						location.reload();
4934					}
4935				});
4936
4937			},'json');
4938
4939		}
4940
4941	});
4942
4943	$('#uForgotID').live('click', function() {
4944		var forgotIDModal = $('#forgotid-modal'),
4945			input_data = '';
4946
4947		var groupEL = forgotIDModal.find('.form-group'),
4948			errorEL = groupEL.find('.error'),
4949			val		= forgotIDModal.find('input.form-control').val(),
4950			regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
4951			error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.email.input'] : '';
4952		
4953		if(error_str.length == 0 &&  !regexp.test(val)) {
4954			error_str = $.lang[LANG]['siteum.regexp.check.email'];
4955		}
4956
4957		if(error_str.length > 0 ) {
4958			if(errorEL.length > 0) errorEL.text(error_str);
4959			else groupEL.append('<span class="error">' + error_str + '</span>');
4960			
4961			groupEL.find('input').focus();
4962		} else {
4963			errorEL.remove();
4964			input_data = val.toLowerCase();
4965		}
4966
4967		if(forgotIDModal.find('.error').length == 0) {
4968
4969			$.post('/umember/password/forgot', { fn:'id', email:input_data }, function(data) {
4970				if(typeof data.error != 'undefined' && data.error) {
4971					$.each(data.error, function(key,str) {
4972						if(forgotIDModal.find('#input-'+key).length > 0 ) {
4973							forgotIDModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4974							forgotIDModal.find('#input-'+key).focus();
4975						} else { return false; }
4976					});
4977					if(forgotIDModal.find('.error').length > 0) return false;
4978				}
4979
4980				forgotIDModal.find('input.form-control').val('');
4981				var num = ((data.uid.length/3)*2).toFixed(0),
4982					uid = data.uid.substr(0,num);
4983				for(var i=0; i<(data.uid.length-num); i++) {
4984					uid += '*';
4985				}
4986				forgotIDModal.find('.modal-body').children(':not(.forgot-id-result)').css({'opacity':0.4});
4987				forgotIDModal.find('.modal-footer').children('button').css({'opacity':0.4, 'pointer-events':'none'});
4988				forgotIDModal.find('.modal-body').find('.forgot-id-result').text(uid);
4989
4990			},'json');
4991
4992		}
4993
4994	});
4995
4996	$('#uForgotPW').live('click', function() {
4997		var forgotPWModal = $('#forgotpw-modal'),
4998			input_data = {};
4999
5000		forgotPWModal.find('.form-group').each(function(i) { 
5001			var inputEL = $(this).find('input.form-control'),
5002				errorEL = $(this).find('.error'),
5003				field 	= inputEL.attr('id').trim().replace(/input-/,''),
5004				val		= inputEL.val(),
5005				regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
5006				error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.'+field+'.input'] : '';
5007			
5008			if(error_str.length == 0 &&  field == 'email' && !regexp.test(val)) {
5009				error_str = $.lang[LANG]['siteum.regexp.check.email'];
5010			}
5011
5012			if(error_str.length > 0 ) {
5013				if(errorEL.length > 0) errorEL.text(error_str);
5014				else $(this).append('<span class="error">' + error_str + '</span>');
5015
5016				if(forgotPWModal.find('.focus').length == 0) inputEL.closest('.form-group').addClass('focus').find('input').focus();
5017			} else {
5018				errorEL.remove();
5019				input_data[field] = val.toLowerCase();
5020			}
5021		});
5022
5023		if(forgotPWModal.find('.error').length == 0) {
5024
5025			$.post('/umember/password/forgot', { fn:'pw', uid:input_data['id'], email:input_data['email'] }, function(data) {
5026				if(typeof data.error != 'undefined' && data.error) {
5027					$.each(data.error, function(key,str) {
5028						if(forgotPWModal.find('#input-'+key).length > 0 ) {
5029							forgotPWModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
5030							forgotPWModal.find('#input-'+key).focus();
5031						} else { return false; }
5032					});
5033					if(forgotPWModal.find('.error').length > 0) return false;
5034				}
5035				forgotPWModal.find('input.form-control').val('');
5036				forgotPWModal.modal('hide');
5037
5038				var modal = $(this).showModalFlat('INFORMATION', data.result, true, false, '', 'ok');
5039				// var modal = $(this).showModalFlat('INFORMATION', '<h3>이메일 발송 완료!</h3><p>비밀번호 재설정 링크 확인 및 변경을 위한 이메일을 확인하세요.</p>', true, false, '', 'ok');
5040
5041			},'json');
5042
5043		}
5044
5045	});
5046
5047
5048
5049	/* [Fixed menu link] Click*/
5050	$(` .siteUM .join, 
5051		.siteUM .login, 
5052		.siteUM .logout, 
5053		.siteUM .forgot-id, 
5054		.siteUM .forgot-pw, 
5055		.siteUM .dashboard, 
5056		.siteUM .mypage, 
5057		.siteUM-dmenu-wrap .mypage, 
5058		.siteUM-dmenu-wrap .logout, 
5059		.cl-fixed-menu#fixed-menu .logout.cl-umMenu,
5060		.cl-fixnav-item.loginout a.login,
5061		.cl-fixnav-item.loginout a.logout,
5062		.cl-nav .clnav-mobile-btn.mypage .cl-fixsubnav-item > a.dashboard,
5063		.cl-nav .clnav-mobile-btn.mypage .cl-fixsubnav-item > a.logout,
5064		.clnav-sidemobile .section-area.user > .login,
5065		.clnav-sidemobile .section-area.user > .logout,
5066		.clnav-sidemobile .cl-fixsubnav-item > a.logout,
5067		#mobile-nav .dashboard
5068	`).live({
5069		click: function(e) {
5070			e.preventDefault();
5071
5072			if(typeof PAGE_MODE != 'undefined' && PAGE_MODE == 's' && property.SITEFIXEDLANG && property.SITEFIXEDLANG != LANG) {
5073				LANG = property.SITEFIXEDLANG;
5074			}
5075			var sid = (typeof SID != 'undefined' && SID) ? SID : property.SID;
5076
5077
5078			var possible_page = ['s', 'um'];
5079			if(typeof PAGE_MODE != 'undefined' && PAGE_MODE && $.inArray(PAGE_MODE,possible_page) == -1) {
5080				var str = (PAGE_MODE == 'r') ? $.lang[LANG]['manager.check.no-support.render-mode'] : $.lang[LANG]['manager.check.no-support.config-mode'];
5081				if($.clnav.check()) str = '';
5082				if(str != '') $(this).showModalFlat('INFORMATION',str,true,false,'','ok');
5083				return false;
5084			} else {
5085
5086				var checkUAdminMode = ($('header').hasClass('_admin')) ? true : false,
5087					s_validtype = (typeof VALIDTYPE != 'undefined' && VALIDTYPE) ? VALIDTYPE : ((typeof property != 'undefined' && property) ? property.VALIDTYPE : ''),
5088					s_siteum = (typeof SITEUM != 'undefined' && SITEUM) ? SITEUM : ((typeof property != 'undefined' && property) ? property.SITEUM : -1),
5089					checkShoppingUM = (!checkUAdminMode && s_validtype == 'SM') ? true : false,
5090					service = (typeof SERVICE == 'undefined') ? ((typeof property == 'undefined') ? '' : property.SERVICE) : SERVICE,
5091					checkGabia = (service.indexOf('gabia') > -1) ? true : false;
5092
5093				if($(this).hasClass('join')) {
5094
5095					var mode = (typeof $(this).attr('data-preview') == 'undefined') ? '' : 'preview';
5096					if(mode == 'preview') {
5097						var checkUadmin = ($('.mng-dashboard').hasClass('_admin')) ? true : false,
5098							check_url = (checkUadmin) ? '/_admin/dashboard/checkDomainConnect' : '/dashboard/checkDomainConnect',
5099							domains_flag = false;
5100					    $.ajax({
5101					        url: check_url,
5102					        type:'post',
5103					        dataType:'json',
5104					        data:{'sid' : SID},
5105					        success:function(data) {
5106
5107					        	var domain = sid + '.' + getServiceHost(location.host);
5108					        	if(data.domains_active_list.length) {
5109					        		domain = data.domains_active_list[0].zone_domain;
5110					        	} else if(checkUadmin) {
5111					        		domain = getServiceHost(location.host);
5112					        	}
5113					        	
5114					        	var http_str = (checkGabia) ? 'http://' : '//';
5115								window.open(http_str + domain + '/_register/preview', '_blank');
5116					        }
5117					    });
5118					} else {
5119						location.href = '/_register';
5120						return false;
5121					}
5122
5123					/*
5124					if(checkShoppingUM) {
5125						location.href = '/_register';
5126						return false;
5127					}
5128
5129					var mode = (typeof $(this).attr('data-preview') == 'undefined') ? '' : 'preview';
5130					var joinModal = $.umember.showJoinModal(sid,mode);
5131					*/
5132				} else if($(this).hasClass('login')) {
5133
5134					location.href = (location.port) ? '/_login' : 'https://'+location.host+'/_login';
5135					return false;
5136					/*
5137					if($('#join-modal-preview').length > 0) {
5138			            $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
5139						return false;
5140					}
5141
5142					if($('header').hasClass('_admin')) { //goto url -> uadmin login page
5143						if($(this).closest('#join-modal-preview').length >0) {
5144				            $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
5145							return false;
5146						}
5147						if(location.pathname == '/_admin') $('.flat-modal[class*="mng-"] .modal').modal('hide');
5148						else location.replace('/_admin');
5149						return false;
5150					}
5151
5152					if(checkShoppingUM) {
5153						location.href = (location.port) ? '/_login' : 'https://'+location.host+'/_login';
5154						return false;
5155					}
5156
5157					if(typeof s_siteum != 'undefined' && s_siteum > 0)  var loginModal = $.umember.showLoginModal(sid);
5158					else return false;
5159					*/
5160				} else if($(this).hasClass('forgot-id')) {
5161					/*
5162					var forgotIDModal = $.umember.showForgotIDModal(sid);
5163					*/
5164				} else if($(this).hasClass('forgot-pw')) {
5165					/*
5166					var forgotPWModal = $.umember.showForgotPWModal(sid);
5167					*/
5168				} else if($(this).hasClass('logout')) {
5169					$.getJSON('/umember/login/out', function(r) {
5170						if($.cookie('cert_popup') !== undefined) {
5171							$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
5172						}
5173						
5174			            if(typeof sid!='undefined' && sid) {
5175			            	if($.cookie('domainSet-next-'+sid) !== undefined) $.removeCookie('domainSet-next-'+sid, { path: '/' });  
5176			            }
5177
5178						var load_url =  (typeof r.url != 'undefined' && r.url) ? r.url : '/';
5179						if($('header').hasClass('_admin')) location.href = load_url;
5180						else if(s_validtype == 'SM')  location.href = load_url;
5181						else location.reload();
5182					},'json');
5183				} else if($(this).hasClass('dashboard')) {
5184					$.getJSON('/umember/goDashboard', function(r) {
5185						if(typeof r.url != 'undefined' && r.url) location.href = r.url;
5186					},'json');
5187				} else if($(this).hasClass('mypage')) {
5188					if(checkUAdminMode) {
5189							location.replace('/_myinfo');			
5190					} else {
5191						if(s_validtype == 'BN') {
5192							location.replace('/_mypost');
5193						} else {
5194							location.replace('/_mypage');
5195						}
5196					}
5197
5198					return false;
5199					/*
5200					if(checkShoppingUM && $(this).attr('href') == 'javascript:;') {
5201						location.replace('/_mypage');
5202						return false;
5203					}
5204
5205					var mypageModal = $.umember.showMypageModal(sid);
5206					*/
5207				}
5208			}
5209
5210		}
5211	});
5212
5213
5214	/*************************************************************************************************************************************member-config page END*/
5215
5216
5217
5218	/*************************************************************************************************************************************member-list page START*/
5219	function initMemberListCustomSelects() {
5220		$('.mng-settings.memberlist[data-type="member-list"] .member-native-select').each(function() {
5221			var $select = $(this);
5222			if ($select.data('customSelectInit')) return;
5223
5224			var selectId = $select.attr('id'),
5225				$custom = $('<div/>', { 'class': 'member-custom-select', 'data-target': selectId }),
5226				$button = $('<button/>', { 'class': 'member-custom-select-btn', 'type': 'button' }),
5227				$label = $('<span/>', { 'class': 'member-custom-select-label' }),
5228				$icon = $('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="M4 4 0 0h8z"/></svg>'),
5229				$list = $('<ul/>', { 'class': 'member-custom-select-list' });
5230
5231			$select.find('option').each(function() {
5232				var $option = $(this),
5233					$item = $('<li/>', {
5234						'class': 'member-custom-select-option',
5235						'data-value': $option.val()
5236					}).text($option.text());
5237
5238				if ($option.is(':selected')) {
5239					$item.addClass('active');
5240					$label.text($option.text());
5241				}
5242				$list.append($item);
5243			});
5244
5245			$button.append($label, $icon);
5246			$custom.append($button, $list);
5247			$select.after($custom).data('customSelectInit', true);
5248		});
5249	}
5250
5251	initMemberListCustomSelects();
5252
5253	$(document).on('click', '.mng-settings.memberlist[data-type="member-list"] .member-custom-select-btn', function(e) {
5254		e.preventDefault();
5255		e.stopPropagation();
5256
5257		var $custom = $(this).closest('.member-custom-select');
5258		$('.mng-settings.memberlist[data-type="member-list"] .member-custom-select').not($custom).removeClass('active');
5259		$custom.toggleClass('active');
5260	});
5261
5262	$(document).on('click', '.mng-settings.memberlist[data-type="member-list"] .member-custom-select-option', function(e) {
5263		e.preventDefault();
5264		e.stopPropagation();
5265
5266		var $option = $(this),
5267			$custom = $option.closest('.member-custom-select'),
5268			target = $custom.data('target'),
5269			$select = $('#' + target);
5270
5271		$custom.find('.member-custom-select-option').removeClass('active');
5272		$option.addClass('active');
5273		$custom.find('.member-custom-select-label').text($option.text());
5274		$custom.removeClass('active');
5275		$select.val($option.data('value')).trigger('change');
5276	});
5277
5278	$('body').on('click', function(e) {
5279		if($(e.target).closest('.member-custom-select').length == 0) {
5280			$('.mng-settings.memberlist[data-type="member-list"] .member-custom-select').removeClass('active');
5281		}
5282	});
5283
5284	function renderShopgradeChangeSelect($modal) {
5285		var $select = $modal.find('#shopgrade-select'),
5286			$oldCustom = $modal.find('.shopgrade-modal-select');
5287
5288		$oldCustom.remove();
5289		if (!$select.length) return;
5290
5291		var $custom = $('<div/>', { 'class': 'member-custom-select shopgrade-modal-select', 'data-target': 'shopgrade-select' }),
5292			$button = $('<button/>', { 'class': 'member-custom-select-btn', 'type': 'button' }),
5293			$label = $('<span/>', { 'class': 'member-custom-select-label' }),
5294			$icon = $('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"><path d="m6 8 4-4H2z"/></svg>'),
5295			$list = $('<ul/>', { 'class': 'member-custom-select-list' }),
5296			selectedText = '';
5297
5298		$select.find('option').each(function() {
5299			var $option = $(this),
5300				$item = $('<li/>', {
5301					'class': 'member-custom-select-option',
5302					'data-value': $option.val()
5303				}).text($option.text());
5304
5305			if ($option.is(':selected')) {
5306				$item.addClass('active');
5307				selectedText = $option.text();
5308			}
5309			$list.append($item);
5310		});
5311
5312		$label.text(selectedText || $select.find('option:first').text());
5313		if ($select.val() === '') $button.addClass('placeholder');
5314		$button.append($label, $icon);
5315		$custom.append($button, $list);
5316		$select.after($custom);
5317	}
5318
5319	$(document).on('click', '.shopgrade-change-modal .member-custom-select-btn', function(e) {
5320		e.preventDefault();
5321		e.stopPropagation();
5322
5323		var $custom = $(this).closest('.member-custom-select');
5324		$('.shopgrade-change-modal .member-custom-select').not($custom).removeClass('active');
5325		$custom.toggleClass('active');
5326	});
5327
5328	$(document).on('click', '.shopgrade-change-modal .member-custom-select-option', function(e) {
5329		e.preventDefault();
5330		e.stopPropagation();
5331
5332		var $option = $(this),
5333			$custom = $option.closest('.member-custom-select'),
5334			$modal = $option.closest('.shopgrade-change-modal'),
5335			$select = $modal.find('#shopgrade-select');
5336
5337		$custom.find('.member-custom-select-option').removeClass('active');
5338		$option.addClass('active');
5339		$custom.find('.member-custom-select-label').text($option.text());
5340		$custom.find('.member-custom-select-btn').toggleClass('placeholder', String($option.attr('data-value')) === '');
5341		$custom.removeClass('active');
5342		$select.val($option.data('value')).trigger('change');
5343	});
5344
5345	$('body').on('click', function(e) {
5346		if($(e.target).closest('.shopgrade-change-modal .member-custom-select').length == 0) {
5347			$('.shopgrade-change-modal .member-custom-select').removeClass('active');
5348		}
5349	});
5350
5351	$('.mng-settings.memberlist[data-type="member-list"] .mng-selectboxlist select.form-control').live('change',function() {
5352		// var sfl_type = $(this).attr('id').replace('sfl_',''),
5353		// 	val = $(this).val();
5354		// location.replace('/manager/member/list/page/1/'+sfl_type+'/'+val);
5355
5356		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/list' : '/manager/member/list',
5357			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
5358			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
5359			stx =  $(this).parents('.mng-list').find('.mng-search-box').find('#stx').val();
5360
5361		var sgi = buildSgiSeg();
5362
5363		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+sgi);
5364	});
5365
5366	$('.mng-settings.memberlist[data-type="member-list"] .mng-search-box .search-btn').live('click',function(e) {
5367		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/list' : '/manager/member/list',
5368			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
5369			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
5370			stx =  $(this).parents('.mng-search-box').find('#stx').val();
5371
5372		if(checkEmojis(stx)) {
5373			e.preventDefault();
5374			errorEmojisModal();
5375			return false;
5376		}
5377
5378		setSiteLogs('um.list','search',{'stx':stx},'um.list');
5379
5380		var sgi = buildSgiSeg();
5381		if(stx.length > 0) stx = '/stx/'+stx;
5382		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+stx+sgi);
5383	});
5384
5385	$('.mng-settings[data-type="member-list"] .mng-sortBtn').live('click',function() {
5386		if ($('.mng-sortBtn').hasClass('active') === true) {
5387			$('.mng-sortBtn').removeClass('active');
5388			$('.mng-sortWrap').removeClass('active');
5389			$('.mng-sortlistWrap').hide();	
5390			} else {
5391			$('.mng-sortBtn').addClass('active');
5392			$('.mng-sortWrap').addClass('active');
5393			$('.mng-sortlistWrap').show();
5394		}
5395	});
5396
5397	$('.mng-settings[data-type="member-list"] .mng-sortshopBtn').live('click',function() {
5398		if ($('.mng-sortshopBtn').hasClass('active') === true) {
5399			$('.mng-sortshopBtn').removeClass('active');
5400			$('.mng-shopgradeWrap').removeClass('active');
5401			$('.mng-sortshoplistWrap').hide();	
5402			} else {
5403			$('.mng-sortshopBtn').addClass('active');
5404			$('.mng-shopgradeWrap').addClass('active');
5405			$('.mng-sortshoplistWrap').show();
5406		}
5407	});
5408
5409	$('body').click(function(e){
5410		if($(e.target).parents('.mng-sortWrap').length==0) {
5411			$('.mng-sortBtn').removeClass("active");
5412			$('.mng-sortWrap').removeClass("active");
5413			$('.mng-sortlistWrap').hide();
5414		}
5415		if($(e.target).parents('.mng-shopgradeWrap').length==0) {
5416			$('.mng-sortshopBtn').removeClass("active");
5417			$('.mng-shopgradeWrap').removeClass("active");
5418			$('.mng-sortshoplistWrap').hide();
5419		}		
5420	});
5421
5422	$('.member-message-btn').live('click', function() {
5423		if($(this).hasClass('member_disabled')) {
5424			siteNotice('manager');
5425			return false;
5426		}
5427		var check_data = getMemberListCheckData($(this)),
5428			mng_settings_el = $(this).closest('.mng-settings');
5429
5430		if( typeof check_data.error != 'undefined' && check_data.error) {
5431			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5432			return false;
5433		}
5434
5435		var first_name = (LANG == 'en' && check_data.count > 0) ? '' : '<span class="addressee-name">' + check_data.name + '</span> ' + ((check_data.count == 0) ? $.lang[LANG]['manager.list.member.str'] : ''),
5436			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5437						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5438						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5439			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5440			selected_str = $.lang[LANG]['manager.list.member.message.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.message.txt.2'];
5441
5442		var modal_content = '\
5443			<div class="mng-modal-body message-modal">\
5444				<p class="desc">\
5445					' + selected_str + '\
5446				</p>\
5447				<div class="form-group">\
5448					<input type="text" class="form-control" id="message-title" placeholder="제목" />\
5449				</div>\
5450				<div class="form-group clearfix">\
5451					<textarea class="form-control" name="" id="message-content" cols="30" rows="2" placeholder="내용"></textarea>\
5452					<label for="message-content"><span class="write-count">0</span>/1000</label>\
5453				</div>\
5454				<div class="form-group">\
5455					<div class="btn-wrap">\
5456						<span class="btn btn-xs btn-white"><i class="fa fa-sticky-note-o" aria-hidden="true"></i>파일첨부</span>\
5457					</div>\
5458				</div>\
5459			</div>\
5460		';
5461
5462		$('#message-title, #message-content').live('keyup', function() {
5463			var type = ($(this).attr('id').match(/title/) !== null) ? 'title' : 'content',
5464				str = $(this).val();
5465
5466			if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
5467			$(this).next('label').find('.write-count').text(str.length);
5468			if(str.length > 1000 && type == 'content') {
5469				$(this).val($(this).val().substring(0, 1000));
5470			}
5471		});
5472
5473		var message_modal = $(this).showModalFlat('SEND MESSAGE', modal_content, true, true, function() {
5474			var message_title = $('#message-title').val(),
5475				message_content = $('#message-content').val();
5476
5477			if(message_title.length == 0) {
5478				$('#message-title').focus();
5479				$('#message-title').closest('.form-group').append('<div class="mng-error">제목을 입력하세요</div>');
5480				return false;
5481			}
5482			if(message_content.length == 0) {
5483				$('#message-content').focus();
5484				$('#message-content').closest('.form-group').append('<div class="mng-error">내용을 입력하세요</div>');
5485				return false;
5486			}
5487			//메시지 전송 기능 작업.
5488
5489			message_modal.modal('hide');
5490			mngShowToast('check', '전송 완료', mng_settings_el);
5491
5492		}, 'cancel', 'send', 'w480');
5493	});
5494
5495
5496	// 쇼핑그룹 ids
5497	function buildSgiSeg() {
5498		var ids = $('input.sgSortCheckbox:checked').map(function(){ return this.value; }).get();
5499		if (!ids.length) {
5500			ids = $('li.active input.sgSortCheckbox').map(function(){ return this.value; }).get();
5501		}
5502
5503		if (!ids.length) {
5504			var v = $('#sgi_current').val(); // <input type="hidden" id="sgi_current" value="1,9">
5505			if (v) ids = v.split(',');
5506		}
5507
5508		if (!ids.length) {
5509			var m = location.pathname.match(/\/sgi\/([^\/?]+)/);
5510			if (m) ids = m[1].split(',');
5511		}
5512
5513		var seen = {}, uniq = [];
5514		for (var i=0;i<ids.length;i++){
5515			var k = String(ids[i]);
5516			if (k && !seen[k]) { seen[k]=1; uniq.push(k); }
5517		}
5518		return uniq.length ? '/sgi/' + uniq.join(',') : '';
5519	}
5520
5521
5522	/*$('.member-sms-btn').live('click', function() {
5523		var check_data = getMemberListCheckData($(this)),
5524			mng_settings_el = $(this).closest('.mng-settings');
5525
5526		if( typeof check_data.error != 'undefined' && check_data.error) {
5527			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5528			return false;
5529		}
5530
5531		var others_str = (check_data.count<1) ? '' : ' 외 <span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">' + check_data.count + '</span> 명';
5532		var modal_content = '\
5533			<div class="mng-modal-body sms-modal">\
5534				<p class="desc">\
5535					<span class="addressee-name">' + check_data.name + '</span> \
5536					' + others_str + ' 에게 SMS를 보냅니다.\
5537				</p>\
5538				<div class="sms-recharge-btn-wrap">\
5539					<div>잔여 SMS <span class="sms-count point">8</span>건 </div>\
5540					<span class="sms-recharge-btn btn btn-xs btn-white">충전하기</span>\
5541				</div>\
5542				<div class="form-group">\
5543					<input type="text" class="form-control" id="sms-title" placeholder="보내는 번호" />\
5544				</div>\
5545				<div class="form-group clearfix">\
5546					<textarea class="form-control" name="" id="sms-content" cols="30" rows="2" placeholder="내용"></textarea>\
5547					<label for="sms-content"><span class="write-count">0</span>/90 Byte</label>\
5548					<span class="info">90바이트가 초과될 경우 MS로 전환되어 3건의 SMS가 차감됩니다.</span>\
5549				</div>\
5550				<div class="form-group clearfix">\
5551					<div class="btn-wrap pull-left">\
5552						<span class="btn btn-xs btn-white"><i class="fa fa-sticky-note-o" aria-hidden="true"></i>파일첨부</span>\
5553					</div>\
5554					<div class="precautions pull-right">\
5555						<span data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="' + $.lang[LANG]['manager.list.sms.precautions'] + '"><i class="fa fa-info-circle"></i> 광고성 SMS 전송 시 주의사항</span>\
5556					</div>\
5557				</div>\
5558			</div>\
5559		';
5560
5561		$('#sms-title, #sms-content').live('keyup', function() {
5562			var type = ($(this).attr('id').match(/title/) !== null) ? 'title' : 'content',
5563				str = $(this).val(),
5564				str_len = $(this).val().length,
5565				cbyte = 0,
5566				clen = 0,
5567				maxInputByte = 90;
5568
5569			if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
5570
5571			if(type == 'content') {
5572				for(var i=0; i<str_len; i++) {
5573					var is_one_char = $(this).val().charAt(i);
5574					if(escape(is_one_char).length > 4) {
5575						cbyte += 2; //korean 1 char == 2byte
5576					} else {
5577						cbyte++;
5578					}
5579
5580					if(cbyte <= maxInputByte) {
5581						clen = i + 1;
5582					}
5583				}
5584				$(this).next('label').find('.write-count').text(parseInt(cbyte));
5585				if(parseInt(cbyte) > parseInt(maxInputByte)) {
5586					$(this).val($(this).val().substring(0, clen));
5587					$(this).next('label').find('.write-count').text(parseInt(maxInputByte));
5588				}
5589			}
5590		});
5591
5592		var sms_modal = $(this).showModalFlat('SEND SMS', modal_content, true, true, function() {
5593			var sms_title = $('#sms-title').val(),
5594				sms_content = $('#sms-content').val();
5595
5596			if(sms_title.length == 0) {
5597				$('#sms-title').focus();
5598				$('#sms-title').closest('.form-group').append('<div class="mng-error">보내실 번호를 입력하세요</div>');
5599				return false;
5600			}
5601			if(sms_content.length == 0) {
5602				$('#sms-content').focus();
5603				$('#sms-content').closest('.form-group').append('<div class="mng-error">내용을 입력하세요</div>');
5604				return false;
5605			}
5606			//SMS 전송 기능 작업.
5607
5608
5609			sms_modal.modal('hide');
5610			mngShowToast('check', '전송 완료', mng_settings_el);
5611
5612		}, 'cancel', 'send', 'w480');
5613
5614		$('.sms-recharge-btn').click(function() {
5615			smsRechargeModal(SID);
5616		});
5617
5618	});/*sms*/
5619
5620
5621	/*$('.member-level-btn .dropdown-item').live('click', function() {
5622		var level = parseInt($(this).text().trim()),
5623			check_data = getMemberListCheckData($(this)),
5624			mng_settings_el = $(this).closest('.mng-settings');
5625
5626		if( typeof check_data.error != 'undefined' && check_data.error) {
5627			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5628			return false;
5629		}
5630
5631		var others_str = (check_data.count<1) ? '' : ' 외 <span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">' + check_data.count + '</span> 명';
5632		var modal_content = '\
5633			<div class="mng-modal-body level-modal">\
5634				<p class="addressee-wrap">\
5635					<span class="addressee-name">' + check_data.name + '</span> \
5636					' + others_str + ' 의 회원 레벨을 <br><span class="point">' + level + '</span> (으)로 적용하시겠습니까?\
5637				</p>\
5638			</div>\
5639		';
5640
5641		var level_modal = $(this).showModalFlat('회원 등급 변경', modal_content, true, true, function() {
5642			var uids = check_data.ids;ㅈ
5643
5644			$.ajax({
5645				type: 'POST',
5646				url: '/umember/update/type/level',
5647				data: { sid : SID, uids : uids, val : level },
5648				dataType: 'json',
5649				async: true,
5650				success: function(data) {
5651					if(typeof data.error != 'undefined' && data.error) {
5652						// alert(data.error);
5653						if(level_modal.find('.error').length == 0) level_modal.find('.level-modal').append('<span class="error">' + data.error + '</span>');
5654						else level_modal.find('.level-modal').find('.error').text(data.error);
5655						return false;
5656					}
5657
5658					$.each(uids, function(i,v) {
5659						$(mng_settings_el).find('.mng-list table tbody tr[data-uid="'+v+'"]').find('.level').text(level);
5660					});
5661
5662					level_modal.modal('hide');
5663					mngShowToast('check', '저장완료', mng_settings_el);
5664				}
5665			});
5666
5667
5668		});
5669
5670	});/*level-all*/
5671
5672
5673	$('#member-level-select').live('change', function() {
5674		var conf = confirm("선택하신 회원의 레벨을 변경하시겠습니까?");
5675		if(conf){
5676			var uid = $(this).closest('tr').attr('data-uid')
5677			var level = $(this).val();
5678
5679			if(typeof uid == 'undefined' || !uid) {
5680				window.location.reload();
5681				return false;
5682			}
5683			
5684			$.ajax({
5685				type: 'POST',
5686				url: '/umember/update/type/level',
5687				data: { sid : SID, uids : uid, val : level },
5688				dataType: 'json',
5689				async: true,
5690				success: function(data) {
5691					if(typeof data.error != 'undefined' && data.error) {
5692						alert(data.error);
5693						return false;
5694					}
5695					
5696					// setSiteLogs('um.edit','level.one',{'id':uid,'level':level},'um.list');
5697				}
5698			});
5699		}else{
5700			window.location.reload();
5701			return false;
5702		}
5703		
5704	});
5705
5706	$('.member-leave-btn').live('click', function() {
5707		if($(this).hasClass('member_disabled')) {
5708			siteNotice('manager');
5709			return false;
5710		}
5711		var check_data = getMemberListCheckData($(this)),
5712			mng_settings_el = $(this).closest('.mng-settings');
5713
5714		if( typeof check_data.error != 'undefined' && check_data.error) {
5715            $(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], check_data.error,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
5716			return false;
5717		}
5718
5719		var first_name = (LANG == 'en' && check_data.count > 0) ? '' : '<span class="addressee-name">' + check_data.name + '</span> ' + ((check_data.count == 0) ? $.lang[LANG]['manager.list.member.str'] : ''),
5720			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5721						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5722						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5723			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5724			selected_str = $.lang[LANG]['manager.list.member.leave.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.leave.txt.2'];
5725
5726		var modal_content = '\
5727			<div class="mng-modal-body leave-modal">\
5728				<p class="addressee-wrap">\
5729					' + selected_str + '\
5730				</p>\
5731			</div>\
5732		';
5733
5734		var level_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.leave.title'], modal_content, true, true, function() {
5735			var uids = check_data.ids;
5736
5737			$.ajax({
5738				type: 'POST',
5739				url: '/umember/update/type/leave',
5740				data: { sid : SID, uids : uids, val : 'deny' },
5741				dataType: 'json',
5742				async: true,
5743				success: function(data) {
5744					if(typeof data.error != 'undefined' && data.error) {
5745						// alert(data.error);
5746						if(level_modal.find('.error').length == 0) level_modal.find('.leave-modal').append('<span class="error">' + data.error + '</span>');
5747						else level_modal.find('.leave-modal').find('.error').text(data.error);
5748						return false;
5749					} else {
5750						level_modal.modal('hide');
5751						window.location.reload();
5752					}
5753
5754				}
5755			});
5756
5757
5758		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
5759
5760	});
5761
5762
5763	$('.member-block-btn').live('click', function() {
5764		if($(this).hasClass('member_disabled')) {
5765			siteNotice('manager');
5766			return false;
5767		}
5768		var check_data = getMemberListCheckData($(this)),
5769			mng_settings_el = $(this).closest('.mng-settings');
5770
5771		if( typeof check_data.error != 'undefined' && check_data.error) {
5772            $(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], check_data.error,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
5773			return false;
5774		}
5775
5776		var first_name = (LANG == 'en' && check_data.count > 0) ? '' : '<span class="addressee-name">' + check_data.name + '</span> ' + ((check_data.count == 0) ? $.lang[LANG]['manager.list.member.str'] : ''),
5777			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5778						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5779						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5780			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5781			selected_str = $.lang[LANG]['manager.list.member.block.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.block.txt.2'];
5782
5783		var modal_content = '\
5784			<div class="mng-modal-body block-modal">\
5785				<p class="addressee-wrap">\
5786					' + selected_str + '\
5787				</p>\
5788			</div>\
5789		';
5790
5791		var block_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.block.title'], modal_content, true, true, function() {
5792			var val = check_data.ids;
5793
5794			$.ajax({
5795				type: 'POST',
5796				url: '/umember/set/type/block',
5797				data: { sid : SID, key : 'id', val : val },
5798				dataType: 'json',
5799				async: true,
5800				success: function(data) {
5801					if(typeof data.error != 'undefined' && data.error) {
5802						// alert(data.error);
5803						if(block_modal.find('.error').length == 0) block_modal.find('.block-modal').append('<span class="error">' + data.error + '</span>');
5804						else block_modal.find('.block-modal').find('.error').text(data.error);
5805						return false;
5806					} else {
5807						block_modal.modal('hide');
5808						window.location.reload();
5809					}
5810				}
5811			});
5812
5813		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
5814	});
5815	
5816	let startX, startY;
5817	$('.fullcover-scroll.payment .address-item')
5818	.live('click',function(e){
5819		if( $(e.target).closest('.edit btn-edit-addr').length > 0) {
5820			return;
5821		}
5822		
5823
5824	})
5825	.live('mousedown', function(e) {
5826		startX = e.clientX;
5827		startY = e.clientY;
5828	})
5829	.live('mouseup', function(e) {
5830		const dx = Math.abs(e.clientX - startX);
5831		const dy = Math.abs(e.clientY - startY);
5832
5833		// 드래그가 거의 없었으면 클릭으로 판단
5834		if (dx < 5 && dy < 5) {
5835		// 클릭 동작 수행
5836		$(this).find('input[type="radio"]').prop('checked',true)
5837		//   console.log('클릭됨');
5838		} else {
5839		// 드래그한 것으로 판단하여 무시
5840		console.log('텍스트 선택 감지됨, 클릭 무시');
5841		}
5842	});
5843
5844	$('.adm-member-addr').live('click',function(){
5845		const action = $(this).data('action');
5846		switch (action){
5847			case "adm-edit" : 
5848				getaddrList("manager", false, function(result) {
5849				});
5850			break;
5851		}
5852	});
5853
5854	
5855	// 주소 목록, 기본 주소 설정
5856 	$('.btn-load-addresses, .btn-default-address, .btn-add-addr, .btn-edit-addr,.address-delete').live('click',function(){
5857		//if (!property?.SID || !property?.UMEMBER?.id) return;
5858		
5859		const action = $(this).data('action');
5860		let currentPage =  '';
5861		const elcurPage = $('.btn-load-addresses');		
5862		if(elcurPage.hasClass('mypage')){
5863			currentPage = 'mypage';
5864		} else if (elcurPage.parent().hasClass('smpage-btn')){
5865			currentPage = 'payment';
5866		} else {
5867			currentPage = 'manager';
5868		}
5869
5870		if (!action) return;		
5871 
5872		// 목록 버튼 눌렀을때 > 
5873		// 추가 팝업에서 저장하기 눌렀을떄 
5874		// 기본 주소 설정하기 눌렀을 때
5875		if (action === 'getList') {
5876			getaddrList(currentPage);
5877		} else if (action == "add") {
5878			if ($('.address-item').length <= 14) {				
5879				editAndaddPoppup("N","add",currentPage);
5880			}
5881		} else if (action == "edit") {
5882			editAndaddPoppup("N","edit",currentPage,$(this));
5883		} else if (action =="delete") {
5884			deletePopup(currentPage,$(this));
5885		} else if (action === 'setDefault') {
5886			var seq = $(this).attr('seq');
5887			if(!seq) return;
5888
5889			$.ajax({
5890				type: 'POST',
5891				url: '/umember/get/type/smAddressList',
5892				data: {
5893				sid: property.SID,
5894				uid: property.UMEMBER.id,
5895				seq: seq,
5896				action: 'setDefault'
5897				},
5898				dataType: 'json',
5899				success: function (data) {
5900					
5901					//$addresslist_popup.modal('hide');
5902
5903					if (data?.error) {
5904						alert(data.error);
5905						getaddrList(currentPage);
5906						return;
5907					} else {
5908						//$addresslist_popup.one('hidden.bs.modal', function () {
5909							// setTimeout(function() {
5910							// 	getaddrList(currentPage);
5911							// 	updateAddressUI(data,currentPage);
5912														
5913							// }, '50');
5914								getaddrList(currentPage,true);
5915
5916								if(currentPage == "payment"){
5917									var elSeq = $('.sm-parent').attr('data-smseq');
5918									var elDefault = $('.sm-parent').find('.sm-default-addr').hasClass("hide");
5919
5920									if(!elDefault || elSeq == seq){
5921										updateAddressUI(data,currentPage);
5922									}
5923								} else {
5924									updateAddressUI(data,currentPage);
5925								}
5926						//});
5927					}
5928				}
5929			}); 
5930		}
5931  	});
5932	window.checkNumberPopup = function(el) {
5933		var val = el.val();
5934		el.val(val.replace(/[^0-9]/g,''));
5935	}
5936	// 주소 가져오기 
5937	var getaddrList = function(currentPage,changeHtml = false ) {
5938 		$.ajax({
5939			type: 'POST',
5940			url: '/umember/get/type/smAddressList',
5941			data: {
5942			sid: (typeof property !== 'undefined' && property?.SID) ? property.SID : SID,
5943			uid: (currentPage=='manager') ? $('.memberinfo-modal .member-info-input').val() :  property.UMEMBER.id,
5944			action: 'getList'
5945			},
5946			dataType: 'json',
5947			success: function (data) {
5948				// if(currentPage === "manager" && callback){
5949				// 	callback(data);
5950				// 	return true;
5951				// } 
5952				if (data?.error) {
5953					alert(data.error);
5954					return;
5955				}
5956				if (data.length > 0) {
5957					// 가져온 주소 팝업에 그리기
5958					// console.log(changeHtml);
5959					var changehtm = showList(data, currentPage,changeHtml);
5960					if(changehtm){
5961						// console.log(changehtm);
5962						const $tempDom = $('<div>').html(changehtm); 
5963						const $newItems = $tempDom.find('li.address-item');
5964
5965						const $list = $addresslist_popup.find('ul.address-list');
5966
5967						// 기존 li 제거 후 새 li 삽입
5968						$list.empty().append($newItems);
5969					}
5970					if(data.length >= 15) {
5971						
5972						$('.btn-add-addr').addClass('pointer-none');
5973					}					
5974					
5975				} else {	
5976					// 가져온 주소x 
5977					editAndaddPoppup("Y","add",currentPage);
5978				}
5979
5980			}
5981		});
5982	}
5983	
5984	// 주소 그리기
5985	var showList = function(d,currentPage,changeHtml = false) { 
5986		
5987		if(currentPage == "manager") {
5988			$('.memberinfo-modal').closest('.flat-modal').hide();
5989			$('.memberinfo-modal').closest('.flat-modal').next('.modal-backdrop').hide();
5990		}
5991		var content_li = '';
5992		$.each(d,function(i,v){
5993			const isDefault = v.is_default == 1 ? 'show' : 'hide';
5994			const name = v.to_name;
5995			const alias = v.alias || '';
5996			const aliasel = (v.alias) ? 'open' : 'hide';
5997			const seq = v.seq;			
5998			const tel = v.to_tel;
5999			
6000			
6001			const to_addr1 = v.to_addr1 || '';
6002			let postCode = '';
6003			let addr1 = '';
6004
6005			if (to_addr1.includes('||')) {
6006			const parts = to_addr1.split('||');
6007			postCode = parts[0].trim();
6008			addr1 = parts[1].trim();
6009			} else {
6010			postCode = '';
6011			addr1 = to_addr1.trim();
6012			}
6013
6014			const addr2 = v.to_addr2 || '';
6015			content_li += `
6016			<li class="address-item">
6017				<div class="div1">
6018					<span class="name">${name}</span> 
6019					<span class="tag ${!alias ? 'hide' : ''}" edit-tag="${escape(alias)}">${alias ? '(' + alias + ')' : ''}</span> 
6020					<span class="default ${isDefault}">기본 배송지</span>
6021					<div class="newcheckbox hand">
6022						<div class="newcheckboxSvgRadio">
6023						<label>
6024							<input type="radio" name="temp" value="${seq}"  ${v.is_default == 1 ? 'checked' : ''}>
6025							<svg viewBox="0 0 18 18" width="18" height="18">
6026								<path fill="#dbdcdf" d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 0-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"></path>
6027							</svg>
6028							<svg class="active" viewBox="0 0 18 18" width="18" height="18">
6029								<path fill="#4789e7" d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 0-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"></path>
6030								<circle fill="#4789e7" cx="9" cy="9" r="6"></circle>
6031							</svg>
6032						</laberl>		
6033						</div>
6034					</div>
6035				</div>
6036				<div  class="div2">
6037					<span class="address1 ${!postCode ? 'hide' : ''}" edit-postcode="${postCode}">${postCode ? '[' + postCode + ']' : ''}</span><span class="address2" edit-addr1="${escape(addr1)}" edit-addr2="${escape(addr2)}">${addr1} ${addr2}</span>
6038				</div>
6039				<div class="div3 phone">${tel}</div>
6040				<div class="div4 actions clearfix">
6041					<button class="edit btn-edit-addr" data-action="edit" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" class="address-edit" data-toggle="tooltip" data-placement="top" title="" data-original-title="수정" width="12" height="12"><path d="m11.56.57-.13-.13C11.14.15 10.76 0 10.37 0c-.38 0-.77.15-1.06.44L.75 9 0 12l3-.75 8.56-8.56c.59-.59.59-1.54 0-2.12zm-9.07 9.78-1.11.28.28-1.11 6.58-6.58.84.84-6.59 6.57zm8.36-8.37L9.77 3.06l-.83-.83 1.08-1.08a.487.487 0 0 1 .7 0l.13.13c.2.19.2.51 0 .7z"></path></svg></button><button class=" ${currentPage == "manager" ? 'hide' : ''} delete ${(v.is_default == 1) ? 'hide' : ''}"><svg viewBox="0 0 12 13" width="12" height="13" class="address-delete" data-toggle="tooltip" data-placement="top" title="" data-original-title="삭제" data-action="delete"><path d="M11.01 2H9V0H3v2H0.99 0v1h1v8c0 1.1 0.9 2 2 2h6c1.1 0 2-0.9 2-2V3h1V2H11.01zM4 1h4v1H4V1zM10 11c0 0.55-0.45 1-1 1H3c-0.55 0-1-0.45-1-1V3h1.02H9h1V11z"></path><rect x="4" y="4" width="1" height="7"></rect><rect x="7" y="4" width="1" height="7"></rect></svg></button>
6042					<div data-action="setDefault" seq ="${v.seq}" class="  ${currentPage == "manager" ? 'hide' : ''} btn-default-address ${(v.is_default == 1) ? 'hide': ''}" style="">기본 배송지 설정</div>
6043				</div>
6044			</li>
6045		`;
6046		});
6047
6048		var modal_content =`
6049		<div class="btn-add-addr  ${currentPage == "manager" ? 'hide' : ''}"  data-action="add" >
6050			<div>
6051				<svg viewBox="0 0 15 15" width="15" height="15">
6052					<polygon points="15 7 8 7 8 0 7 0 7 7 0 7 0 8 7 8 7 15 8 15 8 8 15 8 "></polygon>
6053				</svg>		
6054				<span>배송지 추가</span>
6055			</div>
6056		</div>
6057		<ul class="fullcover-scroll address-list ${currentPage}">
6058			${content_li}
6059		</ul>
6060		`		 
6061		if(changeHtml) return content_li;
6062		$addresslist_popup = $(this).showModalFlat("배송지 목록", modal_content, true, (currentPage == "mypage" ||currentPage == "manager" ) ? false : true , function(){
6063			
6064			
6065				// 결제 페이지의 목록 팝업에서 확인 버튼 클릭 시
6066				$("#no-fouc").removeClass("scroll-lock-fullcover-popup");
6067				var seq = $addresslist_popup.find('.address-item input[type="radio"]:checked').attr('value');
6068
6069				$.ajax({
6070					type: 'POST',
6071					url: '/umember/get/type/smAddressList',
6072					data: {
6073					sid: property.SID,
6074					uid: property.UMEMBER.id,
6075					seq:seq,
6076					action: 'getExistAddr',
6077					},
6078					dataType: 'json',
6079					success: function (data) {
6080						if (data?.error) {
6081							alert(data.error);
6082							$addresslist_popup.modal('hide');
6083							getaddrList(currentPage);						
6084							return;
6085						} else {
6086							UpdateelSeq(seq);
6087							updateAddressUI(data,currentPage);
6088							$addresslist_popup.modal('hide');
6089
6090						}
6091					}
6092				});				
6093		},   (currentPage == "payment" ? 'cancel' : 'close' )  , 'config.save', 'cl-cmmodal cl-s-btn w560 cl-p70 cl-p0  addr-list-parents cover fullcover-modal fullcover-modal-scroll  ' + ((currentPage === 'manager') ? "manager" : "") + '   ',true,function(){
6094			$("#no-fouc").removeClass("scroll-lock-fullcover-popup");
6095
6096			if(currentPage == "manager") {
6097				$('.memberinfo-modal').closest('.flat-modal').show();
6098				$('.memberinfo-modal').closest('.flat-modal').next('.modal-backdrop').show();
6099			}
6100		},function(){
6101
6102			// if($addresslist_popup.closest('#flat-modal1').length >0 ){
6103			// 	$addresslist_popup.closest('#flat-modal1').attr('id','flat-modal');
6104			// }
6105
6106		});
6107		
6108		if($("#no-fouc").addClass("scroll-lock-fullcover-popup"));
6109	  
6110		
6111	}
6112	
6113	// 마이페이지 팝업에서 주소를 등록하거나 결제 페이지 팝업에서 저장 버튼을 클릭했을 때 데이터 반영
6114	var updateAddressUI = function(d,cPage){
6115			
6116		if(cPage == "mypage"){
6117			var removeEl = $('.sm-parent.emptyFlag'); // 요소 자체를 담음
6118			if (removeEl.length) { 
6119				// optional 클래스 제거
6120				removeEl.find('.cl-s-form-wrap.empty').removeClass('empty');
6121				removeEl.find('.optional').removeClass('optional');
6122				// flexbox 안의 input 제거
6123				removeEl.find('.flexbox').children('input').remove();
6124			}
6125		} 
6126			
6127
6128		var $sm = $('.sm-parent');
6129		var $sm_btn = $sm.find('.btn-load-addresses div span');
6130		var $sm_name = $sm.find('.sm-name');
6131		var $sm_alias = $sm.find('.sm-alias');
6132		var $sm_default = $sm.find('.sm-default-addr');
6133
6134		const $sm_addr1 = $sm.find('.sm-addr1 span').first();   // [우편번호]
6135		const $sm_addr2 = $sm.find('.sm-addr1 span').last();    // 주소
6136		const $sm_tel = $sm.find('.sm-tel');  				    // 주소2
6137
6138		d?.alias ? $sm_alias.text('(' + d.alias + ')').removeClass('hide') : $sm_alias.text('').addClass('hide');
6139		
6140		$sm.removeClass('emptyFlag');
6141		
6142
6143		
6144		(cPage == "mypage") ? $sm_btn.text('변경하기') : $sm_btn.text('배송지 목록');
6145		
6146		$sm_name.text(d?.to_name);
6147		
6148		const tempArr = d.to_addr1?.split('||') || [];			
6149		tempArr[0] ? $sm_addr1.text('[' + tempArr[0] + ']').removeClass('hide') : $sm_addr1.addClass('hide');
6150		$sm_addr2.text(tempArr[1] +' '+d?.to_addr2);
6151		$sm_tel.text(d?.to_tel);
6152		$sm.find('.noaddress').addClass('hide');
6153
6154		if($('.btn-load-addresses.empty').length > 0) {
6155			$('.btn-load-addresses.empty').removeClass('empty');
6156		}
6157
6158		if(cPage == "payment") {
6159
6160			if (+d.is_default > 0) {
6161			$sm_default.removeClass("hide");
6162			} else {
6163			$sm_default.addClass("hide");
6164			}				
6165			
6166			$('#reciever-name').val(d.to_name);
6167			$('#reciever-phone').val(d.to_tel);
6168			$('#reciever-postcode').val(tempArr[0]);
6169			$('#reciever-addr1').val(tempArr[1]);
6170			$('#reciever-addr2').val(d.to_addr2);
6171			changeDeliveryPrice($(this).closest('form').attr('data-sid'));
6172			// console.log($(this));
6173		}
6174	}
6175
6176	var editAndaddPoppup = function(fix_addr = "N",  mode = "", cpage = "",select = ""){
6177		var dontclick_label = "";		
6178		var opa = "";
6179
6180		if (fix_addr === "Y") {
6181			dontclick_label = 'disabled checked';
6182			opa = "opa";
6183		} else if (mode === "edit") {
6184			var $a_item = select.closest('.address-item');
6185
6186			if ($a_item.find('.default.show').length > 0) {
6187				dontclick_label = 'disabled checked';				
6188				opa = "opa";
6189			}
6190		}
6191
6192		var modal_content =  `
6193					<div>
6194						<div class="cl-s-info">배송지 정보</div>
6195						<div class="col-xs-12 col-sm-12 col-md-12 no-padding">
6196							<div class="cl-s-form-wrap">
6197								<div class="cl-s-form-group">
6198									<input type="text" class="cl-s-form-control-popup" id="addrPopup-alias"name ="alias" required>
6199									<label for="input" class="cl-s-control-label">배송지명</label>
6200								</div>
6201							</div>
6202						</div> 					
6203						<div class="col-xs-6 col-sm-6 col-md-6 no-padding p-r-5">
6204							<div class="cl-s-form-wrap">
6205								<div class="cl-s-form-group">
6206									<input type="text" class="cl-s-form-control-popup" id="addrPopup-name" name="to_name" required="required">
6207									<label for="input" class="cl-s-control-label">이름<span class="input-star">*</span></label>
6208									
6209								</div>
6210							</div>
6211						</div>
6212						<div class="col-xs-6 col-sm-6 col-md-6 no-padding p-l-5">
6213							<div class="cl-s-form-wrap">
6214								<div class="cl-s-form-group">
6215									<input type="text" class="cl-s-form-control-popup" id="addrPopup-phone" name="to_tel" required="required" onkeyup="checkNumberPopup($(this))">
6216									<label for="input" class="cl-s-control-label">연락처<span class="input-star">*</span></label>
6217								</div>
6218							</div>
6219						</div>
6220						<div class="col-xs-12 col-sm-12 col-md-12 no-padding clearfix">
6221							<div class="cl-s-form-wrap">
6222								<div class="cl-s-form-group">
6223									<input type="hidden" class="cl-s-form-control-popup" id="addrPopup-postcode" name="addr1" required="required" value="">
6224									<input type="text" class="cl-s-form-control-popup" id="addrPopup-addr1" name="addr2" required="required" readonly onfocus="addrSearchModal('addrPopup')">
6225									<label for="input" class="cl-s-control-label">주소<span class="input-star">*</span></label>
6226								</div>
6227							</div>
6228							<div class="cl-s-form-wrap">
6229								<div class="cl-s-form-group">
6230									<input type="text" class="cl-s-form-control-popup" id="addrPopup-addr2" name="addr3" required>
6231									<label for="input" class="cl-s-control-label">상세주소</label>
6232								</div>
6233							</div>
6234						</div> 
6235						<span class="pull-left checkbox-wrap ${cpage == "manager" ? 'hide' : ''}">
6236							<div class="cl-s-checkbox ${opa}">
6237								<label>
6238									<input type="checkbox" id="addrPopup-set" name="is_default" ${dontclick_label}>
6239									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M13 0H3C1.3 0 0 1.3 0 3v10c0 1.7 1.3 3 3 3h10c1.7 0 3-1.3 3-3V3C16 1.3 14.7 0 13 0zM15 13c0 1.1-0.9 2-2 2H3c-1.1 0-2-0.9-2-2V3c0-1.1 0.9-2 2-2h10c1.1 0 2 0.9 2 2V13z"></path></svg>
6240									<svg class="active" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0zM13.03 6.03l-5.5 5.5C7.38 11.68 7.19 11.75 7 11.75s-0.38-0.07-0.53-0.22l-3.5-3.5c-0.29-0.29-0.29-0.77 0-1.06s0.77-0.29 1.06 0L7 9.94l4.97-4.97c0.29-0.29 0.77-0.29 1.06 0S13.32 5.74 13.03 6.03z"></path></svg>
6241									기본 배송지 설정
6242								</label>
6243							</div>
6244						</span>						
6245					</div>			
6246		`		
6247		
6248		var $addPopup = $(this).showModalFlat( (mode == "add") ? "배송지 추가" : "배송지 수정" , modal_content, true, true , function(){
6249			
6250			$addPopup.find('.cl-s-form-wrap').removeClass('empty');
6251
6252			let focused = false;
6253			let flagCheck = false;
6254
6255			$addPopup.find('.cl-s-form-wrap').each(function (i,e) {
6256				const $wrap = $(this);
6257				const $inputs = $wrap.find('input:not([type=hidden]), textarea');
6258				const hasError = $wrap.hasClass('error');
6259
6260				let isEmpty = false;
6261
6262				// 오직 required="required" 로 명시된 필드만 검사
6263				$inputs.each(function () {
6264					const input = this;
6265					const $input_id = $(input).attr('id');
6266				 	let error_str= "";
6267					// required만 검사
6268					if (input.getAttribute('required') === 'required') {
6269						// console.log($(this));
6270						const val = $(input).val()?.trim();
6271						const $wrap = $(input).closest('.cl-s-form-wrap');
6272						const $errorLabel = $wrap.next('.cl-s-control-label.error');
6273
6274						// 기존 에러 제거
6275						$errorLabel.remove();
6276
6277						if (!val) {
6278							isEmpty = true;
6279							 error_str = "";
6280
6281							switch($input_id){
6282								case "addrPopup-name" :
6283									error_str = " 이름을 입력해 주세요.";
6284									break;
6285								case "addrPopup-phone" :
6286									error_str = " 연락처를 입력해 주세요."
6287									break;
6288								case "addrPopup-addr1" :
6289									error_str = " 주소 찾기를 통해 주소를 입력해주세요."									
6290									break;
6291							}
6292							// 새 에러 추가
6293							$wrap.after(
6294								'<label for="input" class="cl-s-control-label error"><i class="cl-icon alert02"></i>' + error_str + '</label>'
6295							);
6296						}
6297					}
6298				});
6299
6300				if (isEmpty) {
6301					$wrap.addClass('empty');
6302					flagCheck = true;
6303				}
6304
6305				// 포커스: 첫 번째 error 또는 empty 항목
6306				if ((isEmpty || hasError) && !focused) {
6307					flagCheck = true;
6308					const $focusTarget = $wrap.find('input, textarea').filter(':visible').first();
6309					if ($focusTarget.length > 0) {
6310					$focusTarget.focus();
6311					focused = true;
6312					}
6313				}
6314			});
6315
6316			if (flagCheck) return true;
6317
6318
6319			const formValues = {
6320				to_name: $addPopup.find('#addrPopup-name').val()?.trim(),
6321				to_tel: $addPopup.find('#addrPopup-phone').val()?.trim(),
6322				to_addr1: `${$addPopup.find('#addrPopup-postcode').val()?.trim()}||${$addPopup.find('#addrPopup-addr1').val()?.trim()}`,
6323				to_addr2: $addPopup.find('#addrPopup-addr2').val()?.trim(),
6324				alias: $addPopup.find('#addrPopup-alias').val()?.trim(),				
6325				is_default: $addPopup.find('#addrPopup-set').prop('checked') ? '1' : '0'
6326			};
6327
6328			if(mode == "add"){
6329				$.ajax({
6330					type: 'POST',
6331					url: '/umember/get/type/smAddressList',
6332					data: {
6333					sid: property.SID,
6334					uid: property.UMEMBER.id,
6335					action: 'add',
6336					fixaddr : fix_addr,
6337					value : formValues
6338					},
6339					dataType: 'json',
6340					success: function (data) {
6341						if (data?.error) {
6342							alert(data.error);
6343							$addPopup.modal('hide');
6344							getaddrList(cpage);						
6345							return;
6346						} else {
6347							if( typeof $addresslist_popup !== "undefined" && $addresslist_popup.length > 0) {
6348								$addresslist_popup.modal('hide');
6349							}
6350
6351							if(cpage == "mypage" && formValues.is_default == "1"){
6352								updateAddressUI(formValues,cpage);
6353							} 
6354							else if (
6355								(cpage == "payment" && fix_addr == "Y") ||
6356								(cpage == "payment" && formValues.is_default > 0 && $('.sm-default-addr:not(.hide)').length > 0)
6357							) {
6358								updateAddressUI(formValues,cpage);
6359								UpdateelSeq(data["seq"]);
6360							}
6361							$addPopup.modal('hide');							
6362							getaddrList(cpage);
6363						}
6364					}
6365				});		
6366			} else if (mode == "edit") {
6367			
6368				var $tempitem = select.closest('.address-item');
6369				var radio_value = $tempitem.find('input[type="radio"]').val() || '';
6370				if (!radio_value) return true;
6371				
6372				if(cpage == "manager" && $('#member-postcode').length > 0 && formValues.is_default > 0) {
6373					$('#member-addr1').val($addPopup.find('#addrPopup-addr1').val()?.trim()) ;
6374					$('#member-addr2').val(formValues.to_addr2) ;
6375					// console.log('afaf');
6376					$('#member-postcode').attr('value',$addPopup.find('#addrPopup-postcode').val()?.trim());	
6377					
6378					var temp_uid = $('.memberinfo-modal .member-info-input').val();
6379					$('.mng-list table tr[data-uid="' + temp_uid + '"]').find('.'+'addr').text(formValues.to_addr1 + formValues.to_addr2);
6380
6381				}
6382					$.ajax({
6383						type: 'POST',  
6384						url: '/umember/get/type/smAddressList',
6385						data: {
6386						sid: (typeof property !== 'undefined' && property.SID) ? property.SID : SID,
6387						uid: (cpage=='manager') ? $('.memberinfo-modal .member-info-input').val() :  property.UMEMBER.id,
6388						action: 'edit',
6389						seq : radio_value,
6390						value : formValues
6391						},
6392						dataType: 'json',
6393						success: function (data) {
6394							if (data?.error) {
6395								alert(data.error);
6396								$addPopup.modal('hide');
6397								getaddrList(cpage);						
6398								return;
6399							} else {
6400								$addPopup.modal('hide');
6401								$addresslist_popup.modal('hide');
6402								
6403								getaddrList(cpage);
6404								
6405								var elSeq = $('.sm-parent').attr('data-smseq');
6406								var elDefault = $('.sm-parent').find('.sm-default-addr').hasClass("hide");
6407
6408								if(cpage =="payment" && !elDefault &&  formValues["is_default"] == 1 || 
6409								   cpage =="payment" &&  elSeq == radio_value
6410								){
6411									updateAddressUI(formValues,cpage);
6412								} else if(cpage != "payment"){
6413
6414									updateAddressUI(formValues,cpage);
6415								}
6416							}
6417						}
6418					});		
6419
6420			}
6421	
6422
6423
6424		}, 'cancel', (cpage === 'manager' ? '저장' : 'config.save'), 'cl-cmmodal cl-s-btn w560 cl-p70 cl-p0 parallax-description-modal cl-s-add-addrPopup cover fullcover-modal ' + ( (cpage == "manager") ? 'manageredit' : '')  +'',true,function(){
6425			console.log('a');
6426		},function(){});		
6427
6428		if(mode == "edit") {
6429			if($addresslist_popup.length > 0) {
6430
6431				var $item = select.closest('.address-item');
6432
6433				var name_edit = $item.find('.name').text().trim();
6434				var aliasAttr = unescape($item.find('.tag').attr('edit-tag'));
6435				var alias_edit = aliasAttr ? aliasAttr.trim() : '';
6436				var is_default_edit = $item.find('.default.show').length > 0 ? '1' : '0';
6437				var postcodeAttr = $item.find('[edit-postcode]').attr('edit-postcode');
6438				var postcode_edit = postcodeAttr ? postcodeAttr.trim() : '';
6439				var addr1Attr = unescape($item.find('[edit-addr1]').attr('edit-addr1'));
6440				var address1_edit = addr1Attr ? addr1Attr.trim() : '';
6441				var addr2Attr = unescape($item.find('[edit-addr2]').attr('edit-addr2'));
6442				var address2_edit = addr2Attr ? addr2Attr.trim() : '';
6443				var phone_edit = $item.find('.div3.phone').text().trim();
6444				if (mode === 'edit') {
6445						$addPopup.find('#addrPopup-alias').val(alias_edit);
6446						$addPopup.find('#addrPopup-name').val(name_edit);
6447						$addPopup.find('#addrPopup-phone').val(phone_edit);
6448						$addPopup.find('#addrPopup-postcode').val(postcode_edit);
6449						$addPopup.find('#addrPopup-addr1').val(address1_edit).addClass('has-value');
6450						$addPopup.find('#addrPopup-addr2').val(address2_edit);
6451						$addPopup.find('#addrPopup-set').prop('checked', is_default_edit === '1');
6452				}
6453			}
6454		}	 
6455	}	
6456
6457	var deletePopup = function(cpage,c_this){
6458
6459		$addresslist_popup.addClass('hide');
6460		var $tempitem = $(c_this).closest('.address-item');
6461		var radio_value = $tempitem.find('input[type="radio"]').val() || '';
6462						
6463		var $addr_modal_delete = $(this).showModalFlat("주소를 삭제하시겠습니까?", "삭제한 주소는 복구할 수 없습니다. <br> 정말 삭제하시겠습니까?", true, true , function(){
6464			
6465			$.ajax({
6466				type: 'POST',
6467				url: '/umember/get/type/smAddressList',
6468				data: {
6469				sid: property.SID,
6470				uid: property.UMEMBER.id,
6471				seq:radio_value,
6472				action: 'delete',
6473				},
6474				dataType: 'json',
6475				success: function (data) {		
6476					setTimeout(function() {
6477						getaddrList(cpage);							
6478					},'');		
6479					$addr_modal_delete.modal('hide');
6480					$addresslist_popup.modal('hide'); 
6481				}
6482			});
6483
6484		}, 'cancel','ok','modal-dialog cl-cmmodal cl-s-btn w560 cl-p70',false,'','',function(){
6485			$addresslist_popup.removeClass('hide');
6486		});
6487				
6488
6489	}
6490
6491	var UpdateelSeq = function(seq){
6492		$('.sm-parent').attr("data-smseq",seq);
6493	}
6494
6495	$('.btn-add-addr.pointer-none').live('click',function(e) {
6496		var modal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['shopping.addr.title.dec'], true, false, function(){
6497			$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',1)		
6498			if ($backModal.next().hasClass('modal-backdrop')) {
6499				$backModal.next().css('opacity', 0.9);  // 원하는 스타일
6500			}
6501		}, 'ok', '', 'cl-p130 cl-cmmodal cl-s-btn w560 cl-p0 cl-okbtn-pbt70',true,function(){
6502			$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',1)		
6503			if ($backModal.next().hasClass('modal-backdrop')) {
6504				$backModal.next().css('opacity', 0.9);  // 원하는 스타일
6505			}
6506
6507		},function(){
6508		});
6509		$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',0)		
6510		if ($backModal.next().hasClass('modal-backdrop')) {
6511			$backModal.next().css('opacity', 0);  // 원하는 스타일
6512		}
6513	});
6514
6515
6516	$('.cl-s-add-addrPopup .cl-s-form-group').live('click',function(e) {
6517		if($(e.target).hasClass('cl-s-form-group')) {
6518			$(e.target).find('.cl-s-form-control-popup:not([type=hidden])').focus();
6519		}
6520	});
6521	$('.cl-s-form-control-popup').live({
6522		
6523		focus: function(e) {
6524			if($(this).attr('type') == 'hidden') {
6525				e.preventDefault();
6526				return false;
6527			}
6528			if($(this).is('#addrPopup-addr2') && $('#addrPopup-addr1').val().trim().length > 0 ) {
6529
6530				const formWrap = $('#addrPopup-addr1').closest('.cl-s-form-wrap');
6531				const nextElement = formWrap.next('.cl-s-control-label');
6532
6533				if (nextElement.length > 0) {
6534					nextElement.remove();
6535				}
6536				var input_id = $(this).attr('id'),
6537					input_addr1 = input_id.replace('-addr2','-addr1');
6538					// console.log(input_addr1);
6539				if($('#'+input_addr1).val().trim().length > 0) {
6540					$('#'+input_addr1).closest('.cl-s-form-wrap').removeClass('empty');
6541				}
6542			}
6543			$(this).closest('.cl-s-form-wrap').addClass('active');
6544		},
6545		blur: function(e) {
6546			$(this).closest('.cl-s-form-wrap').removeClass('active');
6547
6548			if($(this).attr('type') == 'hidden' || $(this).is('textarea')) {
6549				e.preventDefault();
6550				return false;
6551			}
6552
6553			var	error_str = '',
6554				val = $(this).val().trim();
6555
6556
6557			if (val.length === 0 && this.getAttribute('required') === 'required') {
6558				$(this).closest('.cl-s-form-wrap').removeClass('error').addClass('empty');
6559				$(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
6560				return false;
6561			} else {
6562				$(this).closest('.cl-s-form-wrap').removeClass('empty');
6563				$(this).closest('.cl-s-form-wrap').next('.cl-s-control-label.error').remove();
6564
6565				if(val.length > 0 && checkEmojis(val)){
6566				 	error_str = $.lang[LANG]['config.unable.emoji'];
6567					
6568				} else if( ($(this).is('#addrPopup-alias') || $(this).is('#addrPopup-name')) &&  val.length > 50) {
6569					      error_str = '50자 이내로 입력해 주세요.';
6570				}
6571
6572				if(error_str.length > 0) {
6573					$(this).closest('.cl-s-form-wrap').addClass('error');
6574					if($(this).parent().find('.cl-s-control-label.error').length > 0) {
6575						$(this).parent().find('.cl-s-control-label.error').html(error_str);
6576					} else {
6577						$(this).after('<label for="input" class="cl-s-control-label error">' + error_str + '</label>');
6578					}
6579					return false;
6580				}
6581			}
6582
6583			// 유효성 통과 시 에러 문구들 제거
6584			$(this).closest('.cl-s-form-wrap').removeClass('error').removeClass('empty');
6585			$(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
6586
6587		}
6588	});
6589	//레벨변경 탭 추가
6590	$('.member-level-btn').live('click', function() {
6591		if($(this).hasClass('member_disabled')) {
6592			siteNotice('manager');
6593			return false;
6594		}
6595		var blank = $('input[type="checkbox"]:checked').hasClass("blank");
6596		if(blank){
6597			$(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], $.lang[LANG]['manager.list.member.selected.blank'],true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
6598			return false;
6599		}
6600		
6601		var check_data = getMemberListCheckData($(this)),
6602			mng_settings_el = $(this).closest('.mng-settings');
6603
6604		if( typeof check_data.error != 'undefined' && check_data.error) {
6605            $(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], check_data.error,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
6606			return false;
6607		}
6608
6609		var first_name = (LANG == 'en' && check_data.count > 0) ? '' : '<span class="addressee-name">' + check_data.name + '</span> ',
6610			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
6611						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
6612						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
6613			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
6614			selected_str = $.lang[LANG]['manager.list.member.level.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.level.txt.2'];
6615		
6616		//레벨숫자버튼 생성
6617		var level_btn = "";
6618		for(var i=1; i < 11; i++){
6619			level_btn += '<button class="btn-lg btn-default level-btn" value="' + i + '">' + i + '</button>';
6620		}
6621		
6622		var modal_content = '\
6623			<div class="mng-modal-body level-modal">\
6624			<p class="addressee-wrap">\
6625				' + selected_str + '\
6626				</p>\
6627				' + level_btn + '\
6628			</div>\
6629		';
6630		
6631		var level_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.level.title'], modal_content, true, true, function() {
6632			var uids = check_data.ids;
6633			var level = $(".level-modal").children(".active").val();
6634
6635			if(level == "undefined" || !level){
6636				alert("레벨을 선택해 주세요");
6637				return false;
6638			}
6639
6640			if(typeof uids == 'undefined' || !uids) {
6641				window.location.reload();
6642				return false;
6643			}
6644			
6645			$.ajax({
6646				type: 'POST',
6647				url: '/umember/update/type/level',
6648				data: { sid : SID, uids : uids, val : level },
6649				dataType: 'json',
6650				async: true,
6651				success: function(data) {
6652					if(typeof data.error != 'undefined' && data.error) {
6653						//alert(data.error);
6654						if(level_modal.find('.error').length == 0) level_modal.find('.level-modal').append('<span class="error">' + data.error + '</span>');
6655						else level_modal.find('.level-modal').find('.error').text(data.error);
6656						return false;
6657					} else {
6658						level_modal.modal('hide');
6659					}
6660					location.reload(true);
6661				}
6662			});
6663			
6664		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0',true);
6665	});
6666
6667
6668	//  쇼핑등급 변경 탭 추가
6669	$('.member-shopgrade-btn').live('click', function() {
6670		if($(this).hasClass('member_disabled')) {
6671			siteNotice('manager');
6672			return false;
6673		}
6674		var blank = $('input[type="checkbox"]:checked').hasClass("blank");
6675		if(blank){
6676			$(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], $.lang[LANG]['manager.list.member.selected.blank'],true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
6677			return false;
6678		}
6679		
6680		var check_data = getMemberListCheckData($(this)),
6681			mng_settings_el = $(this).closest('.mng-settings');
6682
6683		if( typeof check_data.error != 'undefined' && check_data.error) {
6684            $(this).showModalFlat($.lang[LANG]['manager.list.member.selected.empty.title'], check_data.error,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-member-list-block');
6685			return false;
6686		}
6687
6688		var selected_str = '<span class="shopgrade-member-id">' + check_data.name + '</span>';
6689		if (check_data.count > 0) {
6690			selected_str += '<span class="shopgrade-member-extra" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">외 <span class="shopgrade-member-count">' + check_data.count + '명</span></span>';
6691		}
6692		var notice_send_enabled = (typeof shopgradeNoticeSendEnabled == 'undefined') ? true : !!shopgradeNoticeSendEnabled;
6693		var notice_disabled_class = notice_send_enabled ? '' : ' shopgrade-notice-disabled';
6694		var notice_checked_attr = notice_send_enabled ? ' checked' : '';
6695		var notice_disabled_attr = notice_send_enabled ? '' : ' disabled';
6696		
6697		// 쇼핑등급 select
6698		var shopgrade_btn =
6699			'<select id="shopgrade-select" class="form-control shopgrade-select member-native-select" disabled>' +
6700			'  <option value="">로딩 중…</option>' +
6701			'</select>';
6702
6703		var modal_content = '\
6704			<div class="mng-modal-body sg-modal">\
6705				<table class="grade-create-table">\
6706					<tr>\
6707						<td class="form-title form-title-chagne">대상회원</td>\
6708						<td>\
6709							<div class="form-inline2">\
6710								<p class="shopgrade-name">'+ selected_str +'</p>\
6711							</div>\
6712						</td>\
6713					</tr>\
6714					<tr><td colspan="2"> </td></tr>\
6715					<tr>\
6716						<td class="form-title form-title-chagne">등급</td>\
6717						<td>\
6718							<div class="form-inline2">\
6719								' + shopgrade_btn + '\
6720							</div>\
6721						</td>\
6722					</tr>\
6723				</table>\
6724				<label class="shopgrade-notice-row' + notice_disabled_class + '">\
6725					<span class="newcheckbox hand shopgrade-notice-check"><span class="newcheckboxSvg"><input type="checkbox" id="shopgrade-notice-send" class="shopgrade-notice-checkbox"' + notice_checked_attr + notice_disabled_attr + '><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M13 0H3C1.3 0 0 1.3 0 3v10c0 1.7 1.3 3 3 3h10c1.7 0 3-1.3 3-3V3C16 1.3 14.7 0 13 0zM15 13c0 1.1-0.9 2-2 2H3c-1.1 0-2-0.9-2-2V3c0-1.1 0.9-2 2-2h10c1.1 0 2 0.9 2 2V13z"/></svg><svg class="active" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0zM13.03 6.03l-5.5 5.5C7.38 11.68 7.19 11.75 7 11.75s-0.38-0.07-0.53-0.22l-3.5-3.5c-0.29-0.29-0.29-0.77 0-1.06s0.77-0.29 1.06 0L7 9.94l4.97-4.97c0.29-0.29 0.77-0.29 1.06 0S13.32 5.74 13.03 6.03z"/></svg><svg class="disabled" preserveAspectRatio="none" overflow="visible" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13 0H3C1.34 0 0 1.34 0 3V13C0 14.66 1.34 16 3 16H13C14.66 16 16 14.66 16 13V3C16 1.34 14.66 0 13 0ZM13.03 6.03L7.53 11.53C7.38 11.68 7.19 11.75 7 11.75C6.81 11.75 6.62 11.68 6.47 11.53L2.97 8.03C2.68 7.74 2.68 7.26 2.97 6.97C3.26 6.68 3.74 6.68 4.03 6.97L7 9.94L11.97 4.97C12.26 4.68 12.74 4.68 13.03 4.97C13.32 5.26 13.32 5.74 13.03 6.03Z" fill="#D9D9D9"/><rect x="2" y="2" width="12" height="12" fill="#D9D9D9"/></svg></span></span>\
6726					<span class="shopgrade-notice-text">\
6727						<span class="shopgrade-notice-title-row"><span class="shopgrade-notice-title">회원에게 등급 변경 알림 발송</span><span class="config-tooltip shopgrade-notice-tooltip-wrap"><svg class="sg-grade-use shopgrade-notice-tooltip" viewBox="0 0 13 13" width="13" height="13" tabindex="0" data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="&#8226;&nbsp;회원에게 이메일, 알림톡으로 발송합니다. 둘 다 대시보드에서 알림 사용을 개별 해제할 수 있습니다.<br><br>&#8226;&nbsp;알림톡: 대시보드 &gt; 알림 &gt; 카카오 알림톡 설정 &gt;
6727 쇼핑등급 변경 알림을 켜주세요.<br><br>&#8226;&nbsp;메일: 대시보드 &gt; 알림 &gt; 알림 메일 설정 &gt; 쇼핑 등급 변경 알림을 켜주세요."><path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/><rect x="6" y="9" width="1" height="1"/><path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/></svg></span></span>\
6728						<span class="shopgrade-notice-desc">회원에게 이메일, 알림톡으로 안내를 발송합니다.</span>\
6729					</span>\
6730				</label>\
6731			</div>\
6732		';
6733		
6734		var shopgrade_modal = $(this).showModalFlat('쇼핑 등급 변경', modal_content, true, true, function () {
6735			var uids  = check_data.ids;
6736			var grade_id = shopgrade_modal.find('#shopgrade-select').val();
6737			var send_notice = (notice_send_enabled && shopgrade_modal.find('#shopgrade-notice-send').is(':checked')) ? 'Y' : 'N';
6738			// console.log('uids: ', uids);
6739			if (!grade_id) {
6740				alert('쇼핑등급을 선택 해 주세요');
6741				return false;
6742			}
6743
6744			if (!confirm('선택한 회원의 쇼핑등급을 변경하시겠습니까?')) return false;
6745
6746			if (!uids) {
6747				window.location.reload();
6748				return false;
6749			}
6750			
6751			$.ajax({
6752				type: 'POST',
6753				url: '/shop_grade/check_update',
6754				data: { sid: SID, uids: uids, grade_id: grade_id, send_notice: send_notice },
6755				dataType: 'json',
6756				async: true,
6757				success: function (data) {
6758					if (typeof data.error !== 'undefined' && data.error) {
6759						if (shopgrade_modal.find('.error').length === 0)
6760							shopgrade_modal.find('.sg-modal').append('<span class="error">' + data.error + '</span>');
6761						else
6762							shopgrade_modal.find('.sg-modal .error').text(data.error);
6763						return false;
6764					} else {
6765						shopgrade_modal.modal('hide');
6766					}
6767					location.reload(true);
6768				},
6769
6770			});
6771		}, 'cancel', '', 'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cover shopgrade-change-modal', true);
6772		shopgrade_modal.find('.shopgrade-notice-tooltip').tooltip({
6773			container: 'body',
6774			template: '<div class="tooltip shopgrade-notice-tooltip-popover" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
6775		});
6776		shopgrade_modal.find('.shopgrade-notice-tooltip').on('click', function(e) {
6777			e.preventDefault();
6778			e.stopPropagation();
6779		});
6780
6781		setTimeout(function () {
6782			var $sel = shopgrade_modal.find('#shopgrade-select');
6783			$.ajax({
6784				type: 'POST',
6785				url: '/shop_grade/get_list',
6786				data: { sid: SID },
6787				dataType: 'json',
6788				success: function (data) {
6789					if (data && data.success && $.isArray(data.list) && data.list.length) {
6790						var opts = '<option value="">등급 선택</option>';
6791						$.each(data.list, function (_, g) {
6792							var id   = (g.grade_id != null) ? g.grade_id : (g.id != null ? g.id : g.seq);
6793							var name = g.grade_name || g.name || g.title || ('등급 ' + id);
6794							if (id != null) opts += '<option value="' + id + '">' + name + '</option>';
6795						});
6796						$sel.html(opts).prop('disabled', false); // disabled 해제
6797						renderShopgradeChangeSelect(shopgrade_modal);
6798					} else {
6799						$sel.html('<option value="">등급 없음</option>').prop('disabled', false);
6800						renderShopgradeChangeSelect(shopgrade_modal);
6801					}
6802				},
6803				error: function () {
6804					$sel.html('<option value="">로드 실패</option>').prop('disabled', false);
6805					renderShopgradeChangeSelect(shopgrade_modal);
6806				}
6807			});
6808		}, 0);
6809
6810	});
6811
6812
6813
6814
6815		/* 쇼핑등급 설정 shopgrade start */
6816	$('.shopGrade').on('click', function () {
6817		if(typeof canConfigureShopgrade != 'undefined' && !canConfigureShopgrade) return false;
6818		let currentShopgradeAutoPolicyCycleType = '2';
6819		let currentShopgradeAutoPolicyEnabled = (typeof shopgradeAutoPolicyEnabled != 'undefined') ? !!shopgradeAutoPolicyEnabled : false;
6820
6821		$.ajax({
6822			url: '/shop_grade/get_list',
6823			type: 'post',
6824			data: { sid : SID },
6825			dataType: 'json',
6826			success: function (data) {
6827				if (data.success) {
6828					group_list = data.list;
6829					openShoppingGradeModal.call($('.shopGrade'));
6830
6831					// policy
6832					$.ajax({
6833						url: '/shop_grade/get_policy',
6834						type: 'post',
6835						data: { sid: SID },
6836						dataType: 'json',
6837						success: function (res) {
6838							const policy = res.success && res.policy ? res.policy : null;
6839							const html = renderPolicyBox(
6840								policy?.cycle_type,
6841								policy?.accumulate_month
6842							);
6843							currentShopgradeAutoPolicyEnabled = !!(policy && policy.cycle_type);
6844							shopgradeAutoPolicyEnabled = currentShopgradeAutoPolicyEnabled;
6845							currentShopgradeAutoPolicyCycleType = policy?.cycle_type ? String(policy.cycle_type) : '2';
6846							$('.policy-box').html(html);
6847							$('.policy-area').toggleClass('policy-empty-area', !policy || !policy.cycle_type);
6848						}
6849					});
6850
6851				} else {
6852					alert('등급 목록을 불러오지 못했습니다.');
6853				}
6854			},
6855			error: function () {
6856				alert('서버 오류로 등급 목록을 불러오지 못했습니다.');
6857			}
6858		});
6859
6860		function escapeShopgradeText(value) {
6861			return $('<div/>').text(value || '').html();
6862		}
6863
6864		function renderGroupList(groups) {
6865			let html = '';
6866			groups.forEach(g => {
6867				const gradeName = g.grade_name || '';
6868				const sgSeq = g.seq;
6869				const isDefaultGrade = String(g.grade_seq) === '0';
6870				const autoIcon = g.use_auto == 1 ? '<span class="grade_auto-badge">자동 등급</span>' : '';
6871				const defaultIcon = isDefaultGrade ? '<span class="grade-default-badge">기본 등급</span>' : '';
6872				const editIcon = `
6873					<button class="edit-group-btn" data-group="${sgSeq}" title="수정">
6874						<svg class="shopgrade-edit-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" preserveAspectRatio="none" fill="none"><path d="M16.1267 4.27269C17.1208 3.27858 18.7332 3.27858 19.7273 4.27269C20.7214 5.26681 20.7214 6.87917 19.7273 7.87328L8.9275 18.6731L3.52711 20.4729L5.32691 15.0725L16.1267 4.27269ZM6.41969 15.7463L5.5027 18.4963L8.2527 17.5793L16.8181 9.01391L14.9851 7.1809L6.41969 15.7463ZM18.8435 5.15648C18.3376 4.65053 17.5165 4.65053 17.0105 5.15648L15.8699 6.29711L17.7029 8.13012L18.8435 6.98949C19.3495 6.48353 19.3495 5.66244 18.8435 5.15648Z" fill="#8E9095"/></svg>
6875						<span class="shopgrade-action-text">등급 수정</span>
6876					</button>`;
6877				const trashIcon = g.grade_seq != 0 ? `<button class="delete-group-btn" data-gradename="${gradeName}" data-sgseq="${sgSeq}" title="삭제"><svg class="shopgrade-delete-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" preserveAspectRatio="none" fill="none"><path d="M20 7.1875H17V4.1875H7V7.1875H4V8.4375H5.749V17.1875C5.75006 17.8834 6.02696 18.5504 6.51901 19.0425C7.01107 19.5345 7.67813 19.8114 8.374 19.8125H15.688C16.3839 19.8114 17.0509 19.5345 17.543 19.0425C18.035 18.5504 18.3119 17.8834 18.313 17.1875V8.4375H20V7.1875ZM8.25 5.4375H15.75V7.1875H8.25V5.4375ZM17.063 17.1875C17.0625 17.552 16.9174 17.9014 16.6597 18.1592C16.4019 18.4169 16.0525 18.562 15.688 18.5625H8.374C8.00966 18.5617 7.66049 18.4166 7.40296 18.1588C7.14543 17.9011 7.00053 17.5518 7 17.1875V8.4375H17.063V17.1875ZM9.375 10.8125H10.625V15.8125H9.375V10.8125ZM13.375 10.8125H14.625V15.8125H13.375V10.8125Z" fill="#8E9095"/></svg><span class="shopgrade-action-text">삭제</span></button>` : '';
6878
6879				let gradeDesc = '<ul class="grade-desc-list">';
6880				let hasGradeDesc = false;
6881
6882				// 기준
6883				if (isDefaultGrade) {
6884					gradeDesc += `
6885						<li class="grade-desc-item">
6886							<strong class="grade-desc-title">기준</strong>
6887							<span class="grade-desc-content">가입 시 적용</span>
6888						</li>`;
6889					hasGradeDesc = true;
6890				} else if (g.use_auto == 1) {
6891					gradeDesc += `
6892						<li class="grade-desc-item">
6893							<strong class="grade-desc-title">기준</strong>
6894							<span class="grade-desc-content">${Number(g.use_auto_amount_min || 0).toLocaleString()}원 이상 ${Number(g.use_auto_amount_max || 0).toLocaleString()}원 미만 구매</span>
6895						</li>`;
6896					hasGradeDesc = true;
6897				}
6898
6899				// 혜택
6900				if (g.discount_use == 1 || g.reserve_use == 1) {
6901					let discountPart = '';
6902					let reservePart = '';
6903
6904					if (g.discount_use == 1) {
6905						const discountUnit = g.discount_type == '1' ? '원' : '%';
6906						const discountMaxPart = g.discount_type == '0' ? ` (최대 ${Number(g.discount_max || 0).toLocaleString()}원)` : '';
6907						discountPart = `${Number(g.discount_amount || 0).toLocaleString()}원 이상 구매 시 ${Number(g.discount_value || 0).toLocaleStr
6907ing()}${discountUnit} 할인${discountMaxPart}`;
6908					}
6909					if (g.reserve_use == 1) {
6910						const reserveUnit = g.reserve_type == '1' ? '원' : '%';
6911						const reserveMaxPart = g.reserve_type == '0' ? ` (최대 ${Number(g.reserve_max || 0).toLocaleString()}원)` : '';
6912						reservePart = `${Number(g.reserve_amount || 0).toLocaleString()}원 이상 구매 시 ${Number(g.reserve_value || 0).toLocaleString()}${reserveUnit} 적립${reserveMaxPart}`;
6913					}
6914					let benefitHtml = '';
6915					if (discountPart) benefitHtml += `<span class="benefit-line">${discountPart}</span>`;
6916					if (reservePart) benefitHtml += `<span class="benefit-line ${discountPart ? 'indent' : ''}">${reservePart}</span>`;
6917
6918					gradeDesc += `
6919					<li class="grade-desc-item">
6920						<strong class="grade-desc-title">혜택</strong>
6921						${benefitHtml}
6922					</li>`;
6923					hasGradeDesc = true;
6924				}
6925
6926				// 배송비
6927				if (g.delivery_benefit == 1) {
6928					gradeDesc += `
6929						<li class="grade-desc-item">
6930							<strong class="grade-desc-title">배송비</strong>
6931							<span class="grade-desc-content">배송비 무료</span>
6932						</li>`;
6933					hasGradeDesc = true;
6934				}
6935
6936				if (!hasGradeDesc) {
6937					gradeDesc += `
6938						<li class="grade-desc-item grade-desc-empty">
6939							<strong class="grade-desc-title"></strong>
6940							<span class="grade-desc-content grade-desc-empty-text">내용 없음</span>
6941						</li>`;
6942				}
6943
6944				gradeDesc += '</ul>';
6945
6946				html += `
6947					<div class="grade-block" data-seq="${sgSeq}" ${g.grade_seq == 0 ? 'data-fixed="true"' : ''}>
6948						<div class="grade-line">
6949							<span class="drag-handle">${isDefaultGrade ? '' : '<svg class="shopgrade-drag-icon" preserveAspectRatio="none" overflow="visible" width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g><path d="M13 8C13 8.29667 12.912 8.58668 12.7472 8.83336C12.5824 9.08003 12.3481 9.27229 12.074 9.38582C11.7999 9.49935 11.4984 9.52906 11.2074 9.47118C10.9164 9.4133 10.6491 9.27044 10.4393 9.06066C10.2296 8.85088 10.0867 8.58361 10.0288 8.29264C9.97093 8.00166 10.0006 7.70006 10.1141 7.42597C10.2277 7.15189 10.42 6.91762 10.6666 6.7528C10.9133 6.58797 11.2033 6.5 11.5 6.5C11.8978 6.5 12.2794 6.65804 12.5607 6.93934C12.842 7.22064 13 7.60218 13 8ZM16.5 9.5C16.7967 9.5 17.0867 9.41203 17.3334 9.2472C17.58 9.08238 17.7723 8.84811 17.8859 8.57403C17.9994 8.29994 18.0291 7.99834 17.9712 7.70736C17.9133 7.41639 17.7704 7.14912 17.5607 6.93934C17.3509 6.72956 17.0836 6.5867 16.7926 6.52882C16.5016 6.47094 16.2001 6.50065 15.926 6.61418C15.6519 6.72771 15.4176 6.91997 15.2528 7.16664C15.088 7.41332 15 7.70333 15 8C15 8.39782 15.158 8.77936 15.4393 9.06066C15.7206 9.34196 16.1022 9.5 16.5 9.5ZM11.5 12.5C11.2033 12.5 10.9133 12.588 10.6666 12.7528C10.42 12.9176 10.2277 13.1519 10.1141 13.426C10.0006 13.7001 9.97093 14.0017 10.0288 14.2926C10.0867 14.5836 10.2296 14.8509 10.4393 15.0607C10.6491 15.2704 10.9164 15.4133 11.2074 15.4712C11.4984 15.5291 11.7999 15.4994 12.074 15.3858C12.3481 15.2723 12.5824 15.08 12.7472 14.8334C12.912 14.5867 13 14.2967 13 14C13 13.6022 12.842 13.2206 12.5607 12.9393C12.2794 12.658 11.8978 12.5 11.5 12.5ZM16.5 12.5C16.2033 12.5 15.9133 12.588 15.6666 12.7528C15.42 12.9176 15.2277 13.1519 15.1141 13.426C15.0006 13.7001 14.9709 14.0017 15.0288 14.2926C15.0867 14.5836 15.2296 14.8509 15.4393 15.0607C15.6491 15.2704 15.9164 15.4133 16.2074 15.4712C16.4984 15.5291 16.7999 15.4994 17.074 15.3858C17.3481 15.2723 17.5824 15.08 17.7472 14.8334C17.912 14.5867 18 14.2967 18 14C18 13.6022 17.842 13.2206 17.5607 12.9393C17.2794 12.658 16.8978 12.5 16.5 12.5ZM11.5 18.5C11.2033 18.5 10.9133 18.588 10.6666 18.7528C10.42 18.9176 10.2277 19.1519 10.1141 19.426C10.0006 19.7001 9.97093 20.0017 10.0288 20.2926C10.0867 20.5836 10.2296 20.8509 10.4393 21.0607C10.6491 21.2704 10.9164 21.4133 11.2074 21.4712C11.4984 21.5291 11.7999 21.4994 12.074 21.3858C12.3481 21.2723 12.5824 21.08 12.7472 20.8334C12.912 20.5867 13 20.2967 13 20C13 19.6022 12.842 19.2206 12.5607 18.9393C12.2794 18.658 11.8978 18.5 11.5 18.5ZM16.5 18.5C16.2033 18.5 15.9133 18.588 15.6666 18.7528C15.42 18.9176 15.2277 19.1519 
694915.1141 19.426C15.0006 19.7001 14.9709 20.0017 15.0288 20.2926C15.0867 20.5836 15.2296 20.8509 15.4393 21.0607C15.6491 21.2704 15.9164 21.4133 16.2074 21.4712C16.4984 21.5291 16.7999 21.4994 17.074 21.3858C17.3481 21.2723 17.5824 21.08 17.7472 20.8334C17.912 20.5867 18 20.2967 18 20C18 19.6022 17.842 19.2206 17.5607 18.9393C17.2794 18.658 16.8978 18.5 16.5 18.5Z" fill="#B1B3B7"/></g></svg>'}</span>
6950							<span class="grade-name">${gradeName}${defaultIcon}<span class="auto-icon">${isDefaultGrade ? '' : autoIcon}</span></span>
6951						</div>
6952						<div class="grade-desc">${gradeDesc}</div>
6953						<div class="grade-actions">${isDefaultGrade ? editIcon : editIcon + trashIcon}</div>
6954					</div>
6955				`;
6956			});
6957			return html;
6958		}
6959
6960		function renderPolicyBox(cycle_type, accumulate_month) {
6961			if (!cycle_type) {
6962				return `
6963					<div class="policy-empty-state">
6964						<div class="policy-empty-title" style="font-size:15px !important;font-weight:600 !important;line-height:22.5px !important;">설정된 정책이 없습니다.</div>
6965						<div class="policy-empty-desc">등급을 구매 금액 기준으로 자동 조정하려면 정책을 설정해주세요.</div>
6966						<button class="auto-adjust-setting policy-empty-setting">
6967							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20" style="width:20px !important;height:20px !important;flex:0 0 20px !important;margin:0 !important;display:block !important;">
6968								<path d="M16.93 6c-.29-.51-.64-.98-1.03-1.41l-1.7.39c-.58-.49-1.24-.87-1.95-1.12l-.51-1.66a8.1 8.1 0 0 0-3.47 0l-.51 1.66c-.71.26-1.37.64-1.95 1.13L4.12 4.6c-.39.43-.74.9-1.03 1.41s-.53 1.04-.7 1.6l1.18 1.28a6.5 6.5 0 0 0 0 2.25l-1.18 1.27c.35 1.12.95 2.14 1.74 3.01l1.7-.39c.58.48 1.24.87 1.95 1.12l.51 1.66c1.14.25 2.33.25 3.47 0l.51-1.66c.71-.26 1.37-.64 1.95-1.13l1.69.39c.79-.87 1.38-1.89 1.74-3.01l-1.18-1.28c.13-.75.13-1.51 0-2.25l1.18-1.27c-.18-.56-.41-1.09-.7-1.6M10 15.05c-2.79 0-5.05-2.26-5.05-5.05S7.21 4.95 10 4.95s5.05 2.26 5.05 5.05-2.26 5.05-5.05 5.05"/>
6969							</svg><span class="shopgrade-action-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">정책 설정하기</span>
6970						</button>
6971					</div>
6972				`;
6973			} else{
6974				const cycleText = cycle_type === '2'
6975					? '<span style="color:#222428 !important;">월 단위 (매월 1일 갱신)</span>'
6976					: '주 단위 (매주 월요일 갱신)';
6977				const accText = cycle_type === '2' 
6978					? `<span style="color:#222428 !important;">최근 ${accumulate_month}개월간의 총 구매 금액</span>`
6979					: '최근 1주일간의 총 구매 금액';
6980
6981				return `
6982					<div class="policy-row">
6983						<div class="policy-label">자동 변경 주기</div>
6984						<div class="policy-value">${cycleText}</div>
6985					</div>
6986					<div class="policy-row">
6987						<div class="policy-label">누적기간</div>
6988						<div class="policy-value">${accText}</div>
6989					</div>
6990				`;
6991			}
6992		}
6993
6994		function openShoppingGradeModal() {
6995			$('#modalAutopolicy').remove();
6996			const shopgradeSettingTooltipBullet = '<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 4 4\' width=\'4\' height=\'4\'><circle cx=\'2\' cy=\'2\' r=\'2\'/></svg>';
6997			const shopgradeSettingTooltipContent = '<div>' + shopgradeSettingTooltipBullet + '사이트 회원들의 등급을 지정해보세요.</div><div>' + shopgradeSettingTooltipBullet + '회원가입 시 모든 회원은 기본등급으로 지정됩니다.</div><div>' + shopgradeSettingTooltipBullet + '사이트/브랜드 운영에 맞게 등급 자동 조정이 필요하다면 설정해 보세요.</div><div>' + shopgradeSettingTooltipBullet + '생성한 등급을 삭제 시, 해당 등급은 삭제되고 기본등급으로 변경됩니다.</div>';
6998			const shopgradeAutoTooltipContent = '<div>' + shopgradeSettingTooltipBullet + '사이트 회원들의 등급을 주기에 맞춰 자동으로 변경합니다.</div><div>' + shopgradeSettingTooltipBullet + '자동 조정을 사용하지 않는 등급의 회원은 영향받지 않습니다.</div>';
6999			
7000			const setGroup_modal = `
7001			<div class="shopping-grade-modal">
7002				<a class="shopgrade-use-guide-link" href="https://supportcenter.creatorlink.net/creatorlink/management/ecommerce/additional-function/membership" target="_blank" rel="noopener noreferrer">쇼핑 등급 이용 가이드 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14" width="12" height="12"><path d="M.88 2.12v11h11v-5h-1.25v3.75H2.12V3.38h3.75V2.13H.88Zm7-1.24v1.25H11L5.44 7.69l.88.88 5.56-5.56v3.12h1.25V.88z"></path></svg></a>
7003				<div class="grade-grid">
7004					<div class="grade-grid-left">
7005						<div class="grade-label">등급 설정
7006								<span class="config-tooltip">
7007									<svg class="sg-grade-use contents-align shopgrade-setting-info-popover shopgrade-setting-tooltip" viewBox="0 0 13 13" width="13" height="13" tabindex="0" data-trigger="hover" data-toggle="popover" data-placement="right" data-html="true" data-content="${shopgradeSettingTooltipContent}" data-original-title="" title=""><path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/><rect x="6" y="9" width="1" height="1"/><path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
7008									</svg>
7009								</span>
7010						</div>
7011					</div>
7012					<div class="grade-grid-right">
7013						<div class="grade-list-wrap">${renderGroupList(group_list)}</div>
7014						<div class="grade-header">
7015							<button class="create-group-btn">
7016								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20" fill="none" preserveAspectRatio="none" overflow="visible" style="width:20px !important;height:20px !important;flex:0 0 20px !important;margin:0 !important;display:block !important;"><path d="M9.375 2.5V9.375H2.5V10.625H9.375V17.5H10.625V10.625H17.5V9.375H10.625V2.5H9.375Z" fill="#4789E7"></path></svg>
7017								<span class="shopgrade-add-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">등급 추가</span>
7018							</button>
7019						</div>
7020					</div>
7021				</div>
7022				<div class="grade-grid">
7023					<div class="grade-grid-left">
7024						<div class="grade-label">등급 자동 조정
7025							<span class="config-tooltip">
7026								<svg class="sg-grade-use contents-align shopgrade-setting-info-popover shopgrade-auto-tooltip" viewBox="0 0 13 13" width="13" height="13" tabindex="0" data-trigger="hover" data-toggle="popover" data-placement="right" data-html="true" data-content="${shopgradeAutoTooltipContent}" data-original-title="" title=""><path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/><rect x="6" y="9" width="1" height="1"/><path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
7027								</svg>
7028							</span>		
7029						</div>
7030					</div>
7031					<div class="grade-grid-right">
7032						<a class="shopgrade-notice-setting-link" href="/notificationtalkmail">쇼핑 등급 변경 알림 설정하기 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14" width="12" height="12"><path d="M.88 2.12v11h11v-5h-1.25v3.75H2.12V3.38h3.75V2.13H.88Zm7-1.24v1.25H11L5.44 7.69l.88.88 5.56-5.56v3.12h1.25V.88z"></path></svg></a>
7033						<div class="policy-area">
7034							<div class="gradeauto-line" style="font-size:15px !important;font-weight:600 !important;">정책</div>
7035							<div class="policy-box"></div>
7036							<div class="grade-header policy-setting-footer">
7037								<button class="auto-adjust-setting">
7038									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20" style="width:20px !important;height:20px !important;flex:0 0 20px !important;margin:0 !important;display:block !important;">
7039										<path d="M16.93 6c-.29-.51-.64-.98-1.03-1.41l-1.7.39c-.58-.49-1.24-.87-1.95-1.12l-.51-1.66a8.1 8.1 0 0 0-3.47 0l-.51 1.66c-.71.26-1.37.64-1.95 1.13L4.12 4.6c-.39.43-.74.9-1.03 1.41s-.53 1.04-.7 1.6l1.18 1.28a6.5 6.5 0 0 0 0 2.25l-1.18 1.27c.35 1.12.95 2.14 1.74 3.01l1.7-.39c.58.48 1.24.87 1.95 1.12l.51 1.66c1.14.25 2.33.25 3.47 0l.51-1.66c.71-.26 1.37-.64 1.95-1.13l1.69.39c.79-.87 1.38-1.89 1.74-3.01l-1.18-1.28c.13-.75.13
7039-1.51 0-2.25l1.18-1.27c-.18-.56-.41-1.09-.7-1.6M10 15.05c-2.79 0-5.05-2.26-5.05-5.05S7.21 4.95 10 4.95s5.05 2.26 5.05 5.05-2.26 5.05-5.05 5.05"/>
7040									</svg><span class="shopgrade-action-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">설정하기</span>
7041								</button>
7042							</div>
7043						</div>
7044					</div>
7045				</div>
7046			</div>
7047
7048			`;
7049
7050			modal = $(this).showModalFlat(
7051				'쇼핑 등급 설정',
7052				setGroup_modal,
7053				true,
7054				true,
7055				function () {        // 확인 버튼 콜백
7056					if (hasShopgradeAutoCriteriaGap()) {
7057						showShopgradeCriteriaGapNotice();
7058						return;
7059					}
7060					window.location.reload();
7061    		},
7062				'닫기',
7063				'닫기',
7064				'cl-cmmodal cl-s-btn cl-p130 cl-p0 cover shopgrade-setting-modal',
7065				true,
7066				function () {        // 닫기 버튼 콜백
7067        	window.location.reload();
7068    		}
7069			);
7070			modal.find('.modal-footer .close-button-dialog').remove();
7071			modal.find('.modal-footer .ok-button-dialog')
7072				.removeClass('btn-primary ok-button-dialog')
7073				.addClass('btn-default close-button-dialog shopgrade-setting-close-action');
7074			modal.find('.shopgrade-setting-info-popover').popover({
7075				html: true,
7076				trigger: 'hover',
7077				placement: 'right'
7078			});
7079			
7080			// esc 방지 mspark
7081			$(document).on('keydown.disableEsc', function (e) {
7082				if (e.key === "Escape" || e.keyCode === 27) {
7083					e.preventDefault();
7084					e.stopPropagation();
7085					return false;
7086				}
7087			});
7088
7089			bindEditEvents(modal);
7090
7091			setTimeout(() => {
7092				bindDragAndDrop(); // <== 드래그앤드롭 활성화
7093			}, 100);
7094
7095		}
7096
7097		function getShopgradeAutoCriteriaIntervals() {
7098			const intervals = [];
7099			$.each(group_list || [], function (_, grade) {
7100				if (!grade || String(grade.use_auto) !== '1') return true;
7101				if (String(grade.grade_seq) === '0') return true;
7102
7103				const min = Number(String(grade.use_auto_amount_min || '').replace(/,/g, ''));
7104				const max = Number(String(grade.use_auto_amount_max || '').replace(/,/g, ''));
7105				if (!isFinite(min) || !isFinite(max) || min >= max) return true;
7106
7107				intervals.push({ min: min, max: max });
7108			});
7109
7110			intervals.sort(function (a, b) {
7111				if (a.min === b.min) return a.max - b.max;
7112				return a.min - b.min;
7113			});
7114
7115			return intervals;
7116		}
7117
7118		function hasShopgradeAutoCriteriaGap() {
7119			const intervals = getShopgradeAutoCriteriaIntervals();
7120			if (intervals.length < 2) return false;
7121
7122			let coveredMax = intervals[0].max;
7123			for (let i = 1; i < intervals.length; i++) {
7124				if (coveredMax < intervals[i].min) return true;
7125				coveredMax = Math.max(coveredMax, intervals[i].max);
7126			}
7127
7128			return false;
7129		}
7130
7131		function getDefaultShopgradeName() {
7132			let defaultName = '씨앗등급';
7133			$.each(group_list || [], function (_, grade) {
7134				if (grade && String(grade.grade_seq) === '0' && grade.grade_name) {
7135					defaultName = grade.grade_name;
7136					return false;
7137				}
7138			});
7139			return defaultName;
7140		}
7141
7142		function showShopgradeCriteriaGapNotice() {
7143			const defaultGradeName = escapeShopgradeText(getDefaultShopgradeName());
7144			const html = `
7145				<div class="delete-grade-modal">
7146					<div class="delete-grade-message">
7147						등급 기준 사이에 적용되지 않는 구매금액 구간이 있습니다.<br>
7148						일부 회원은 기준에 맞는 등급이 없습니다.<br>
7149						해당 회원은 기본 등급(${defaultGradeName})으로 적용됩니다.
7150					</div>
7151				</div>
7152			`;
7153
7154			const noticeModal = $(window).showModalFlat(
7155				'안내',
7156				html,
7157				true,
7158				false,
7159				'',
7160				'ok',
7161				'',
7162				'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal shopgrade-gap-notice-modal',
7163				true,
7164				function () {
7165					$('.modal-overlay-blocker').remove();
7166					$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
7167				}
7168			);
7169
7170			setTimeout(() => {
7171				$('.modal-dialog.cl-cmmodal')
7172					.not(':last')
7173					.addClass('shopgrade-auto-policy-covered')
7174					.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
7175			}, 10);
7176
7177			return noticeModal;
7178		}
7179
7180		function bindDragAndDrop() {
7181			$('.grade-list-wrap').sortable({
7182				handle: '.drag-handle',
7183				items: '.grade-block:not([data-fixed="true"])', // grade_seq=0 은 제외
7184				placeholder: 'grade-placeholder',
7185				axis: 'y',
7186				update: function () {
7187					const order = [];
7188					$('.grade-list-wrap .grade-block').each((idx, el) => {
7189						const $el = $(el);
7190						const seq = $el.data('seq');
7191						const fixed = $el.data('fixed');
7192
7193						if (!fixed) {
7194							order.push({ seq: seq, grade_seq: idx});
7195						}
7196					});
7197
7198					// 서버에 업데이트 요청
7199					$.ajax({
7200						url: '/shop_grade/update_gradeseq',
7201						type: 'POST',
7202						data: {
7203							sid: SID,
7204							order: JSON.stringify(order)
7205						},
7206						success: function (res) {
7207							if (typeof res === 'string') res = JSON.parse(res);
7208							if (res.success) {
7209								console.log('등급 순서가 저장되었습니다.');
7210							} else {
7211								alert('순서 저장 실패: ' + (res.error || '알 수 없음'));
7212							}
7213						},
7214						error: function () {
7215							alert('순서 저장 중 오류가 발생했습니다.');
7216						}
7217					});
7218				}
7219			});
7220		}
7221
7222		function bindEditEvents() {
7223			$(document).off('click', '.edit-group-btn').on('click', '.edit-group-btn', function () {
7224				const sgSeq = $(this).data('group');
7225
7226				$.ajax({
7227					type: 'POST',
7228					url: '/shop_grade/get_one',
7229					data: {	seq: sgSeq,	sid: SID },
7230					dataType: 'json',
7231					success: function (res) {
7232						if (res.success && res.item) {
7233							openGroupEditModal(res.item);
7234						} else {
7235							alert('등급 정보를 불러오지 못했습니다.');
7236						}
7237					},
7238					error: function () {
7239						alert('서버 오류가 발생했습니다.');
7240					}
7241				});
7242			});
7243		}
7244
7245		$(document).off('click', '.auto-adjust-setting').on('click', '.auto-adjust-setting', function () {
7246			$('#modalAutopolicy').remove();
7247			$.ajax({
7248				type: 'POST',
7249				url: '/shop_grade/get_policy',
7250				data: { sid: SID },
7251				dataType: 'json',
7252				success: function (res) {
7253					openAutoAdjustModal(res.policy, function () {
7254						$.ajax({
7255							type: 'POST',
7256							url: '/shop_grade/get_policy',
7257							data: { sid: SID },
7258							dataType: 'json',
7259							success: function (res2) {
7260								const policy = res2.success && res2.policy ? res2.policy : null;
7261								const html = renderPolicyBox(policy ? policy.cycle_type : null, policy ? policy.accumulate_month : null);
7262								currentShopgradeAutoPolicyEnabled = !!(policy && policy.cycle_type);
7263								shopgradeAutoPolicyEnabled = currentShopgradeAutoPolicyEnabled;
7264								currentShopgradeAutoPolicyCycleType = policy && policy.cycle_type ? String(policy.cycle_type) : '2';
7265								$('.modal-content .policy-box').html(html);
7266								$('.modal-content .policy-area').toggleClass('policy-empty-area', !policy || !policy.cycle_type);
7267							}
7268						});
7269					});
7270				}
7271			});
7272		});
7273
7274		// 등급 자동조정 설정
7275		function openAutoAdjustModal(policy, onSaveCallback) {
7276			const autogradecycle = $.lang[LANG]['manager.list.member.shopgrade.autogradecycle'],
7277						autogradepolicyperiod = $.lang[LANG]['manager.list.member.shopgrade.autogradepolicyperiod'];
7278			const restoreAutoPolicyParentModal = function () {
7279				$('.auto-policy-month-select-floating-menu').remove();
7280				$('.auto-policy-month-select').removeClass('open has-floating-menu');
7281				$('.modal-overlay-blocker.shopgrade-auto-policy-backdrop').remove();
7282				$('.shopgrade-auto-policy-covered .modal-overlay-blocker').remove();
7283				$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
7284			};
7285			const modalAutopolicy = `
7286			<form id="auto-adjust-form">
7287				<input type="hidden" name="base_date">
7288				<input type="hidden" name="start_date">
7289				<input type="hidden" name="end_date">
7290				<div class="mng-modal-body">
7291					<table class="grade-create-table">
7292						<tr>
7293							<td class="form-title"><span class="shopgrade-auto-policy-title-label">자동 변경 주기</span><span class="config-tooltip">
7294									<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0" data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${autogradecycle}"><path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/><rect x="6" y="9" width="1" height="1"/><path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
7295									</svg>
7296								</span>
7297							</td>
7298							<td>
7299								<div class="form-inline cycle_type">
7300									<label>
7301										<input type="radio" name="cycle_type" value="1">
7302										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7303											<path d="M9 0a9 9 0 1 0 .001 18.001A9 9 0 0 0 9 0zm0 17c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"></path>
7304										</svg>
7305										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7306											<path d="M9 0a9 9 0 1 0 .001 18.001A9 9 0 0 0 9 0zm0 17c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"></path>
7307											<circle cx="9" cy="9" r="6"></circle>
7308										</svg>주 단위(매주 월요일 갱신)
7309									</label>
7310									<label>
7311									<input type="radio" name="cycle_type" value="2"> 
7312										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7313											<path d="M9 0a9 9 0 1 0 .001 18.001A9 9 0 0 0 9 0zm0 17c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"></path>
7314										</svg>
7315										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7316											<path d="M9 0a9 9 0 1 0 .001 18.001A9 9 0 0 0 9 0zm0 17c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"></path>
7317											<circle cx="9" cy="9" r="6"></circle>
7318										</svg>월 단위(매월 1일 갱신)
7319									</label>
7320								</div>
7321							</td>
7322						</tr>
7323						<tr>
7324							<td class="form-title"><span class="shopgrade-auto-policy-title-label">누적 기간</span><span class="config-tooltip">
7325									<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0" data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${autogradepolicyperiod}"><path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/><rect x="6" y="9" width="1" height="1"/>
7325<path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
7326									</svg>
7327								</span>							
7328							</td>
7329							<td>
7330								<div class="form-inline">
7331									<select name="accumulate_month" class="grade_select">
7332										<option value="1">최근 1개월</option>
7333										<option value="2">최근 2개월</option>
7334										<option value="3">최근 3개월</option>
7335										<option value="6">최근 6개월</option>
7336										<option value="12">최근 12개월</option>
7337										<option value="24">최근 24개월</option>
7338										<option value="36">최근 36개월</option>
7339										<option value="48">최근 48개월</option>
7340										<option value="60">최근 60개월</option>
7341										<option value="72">최근 72개월</option>
7342									</select>
7343									간의 총 구매 금액
7344								</div>
7345							</td>
7346						</tr>
7347						<tr>
7348							<td class="form-title">
7348변경 시점 예시</td>
7349							<td class="policy-preview"></td>
7350						</tr>
7351					</table>
7352				</div>
7353			</form>
7354			`;
7355
7356			const policy_modal = $('<div>').showModalFlat(
7357				'등급 자동 조정 설정',
7358				modalAutopolicy,
7359				true,
7360				true,
7361				function () {
7362					const formData = $('#auto-adjust-form').serializeArray();
7363					const data = { sid: SID };
7364					formData.forEach(e => data[e.name] = e.value);
7365
7366					$.ajax({
7367						type: 'POST',
7368						url: '/shop_grade/update_policy',
7369						data: data,
7370						dataType: 'json',
7371						success: function (res) {
7372							if (res.success) {
7373								alert('설정이 저장되었습니다.');
7374								policy_modal.modal('hide');
7375								$('#modalAutopolicy').remove();
7376								restoreAutoPolicyParentModal();
7377
7378								if (typeof onSaveCallback === 'function') {
7379									onSaveCallback();
7380								}
7381
7382							} else {
7383								alert('설정 저장 실패: ' + res.error);
7384							}
7385						},
7386						error: function () {
7387							alert('서버 오류 발생');
7388						}
7389					});
7390				},
7391				'취소',
7392				'저장',
7393				'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cover shopgrade-auto-policy-modal',
7394				true,
7395				restoreAutoPolicyParentModal,
7396				null,
7397				restoreAutoPolicyParentModal
7398			);
7399			policy_modal.addClass('shopgrade-auto-policy-modal-scroll');
7400
7401			setTimeout(() => {
7402
7403				$('.modal-dialog.cl-cmmodal')
7404					.not(':last') // 가장 마지막에 열린 모달 제외
7405					.addClass('shopgrade-auto-policy-covered')
7406					.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
7407
7408				const $form = $('#auto-adjust-form');
7409				const $cycleType = $form.find('input[name="cycle_type"]');
7410				const $accumulateSelect = $form.find('select[name="accumulate_month"]');
7411
7412				if (!policy) {
7413					$cycleType.filter('[value="2"]').prop('checked', true);
7414					$accumulateSelect.val('1');
7415				}
7416
7417				if (policy) {
7418					$cycleType.filter(`[value="${policy.cycle_type}"]`).prop('checked', true);
7419					$accumulateSelect.val(policy.accumulate_month);
7420				}
7421
7422				function syncAutoPolicyMonthSelect() {
7423					const $custom = $form.find('.auto-policy-month-select');
7424					if (!$custom.length) return;
7425
7426					const selectedText = $accumulateSelect.find('option:selected').text();
7427					$custom.find('.auto-policy-month-select-value').text(selectedText);
7428					$custom.find('.auto-policy-month-select-option').removeClass('selected');
7429					$custom.find(`.auto-policy-month-select-option[data-value="${$accumulateSelect.val()}"]`).addClass('selected');
7430					$custom.toggleClass('disabled', $accumulateSelect.prop('disabled'));
7431				}
7432
7433				function buildAutoPolicyMonthSelect() {
7434					if ($accumulateSelect.next('.auto-policy-month-select').length) return;
7435
7436					const $custom = $('<div/>', { 'class': 'auto-policy-month-select', tabindex: 0 });
7437					const $button = $('<button/>', { type: 'button', 'class': 'auto-policy-month-select-btn' });
7438					const $value = $('<span/>', { 'class': 'auto-policy-month-select-value' });
7439					const $menu = $('<div/>', { 'class': 'auto-policy-month-select-menu' });
7440
7441					$accumulateSelect.find('option').each(function () {
7442						const $option = $(this);
7443						$menu.append($('<button/>', {
7444							type: 'button',
7445							'class': 'auto-policy-month-select-option',
7446							'data-value': $option.val(),
7447							text: $option.text()
7448						}));
7449					});
7450
7451					$button.append($value);
7452					$custom.append($button, $menu);
7453					$accumulateSelect.addClass('auto-policy-native-select').after($custom);
7454					syncAutoPolicyMonthSelect();
7455				}
7456
7457				function removeAutoPolicyFloatingMonthSelect() {
7458					$('.auto-policy-month-select-floating-menu').remove();
7459					$('.auto-policy-month-select').removeClass('open has-floating-menu');
7460				}
7461
7462				function openAutoPolicyFloatingMonthSelect($wrap) {
7463					removeAutoPolicyFloatingMonthSelect();
7464
7465					const $button = $wrap.find('.auto-policy-month-select-btn');
7466					const offset = $button.offset();
7467					const $menu = $wrap.find('.auto-policy-month-select-menu').clone();
7468
7469					$wrap.addClass('open has-floating-menu');
7470					$menu
7471						.addClass('auto-policy-month-select-floating-menu')
7472						.css({
7473							top: offset.top + $button.outerHeight() + 2,
7474							left: offset.left,
7475							width: $button.outerWidth()
7476						})
7477						.appendTo('body')
7478						.show();
7479				}
7480
7481				buildAutoPolicyMonthSelect();
7482
7483				$(document).off('click.autoPolicyMonthSelect').on('click.autoPolicyMonthSelect', function (e) {
7484					if (!$(e.target).closest('.auto-policy-month-select, .auto-policy-month-select-floating-menu').length) {
7485						removeAutoPolicyFloatingMonthSelect();
7486					}
7487				});
7488
7489				$form.off('click.autoPolicyMonthSelectBtn', '.auto-policy-month-select-btn').on('click.autoPolicyMonthSelectBtn', '.auto-policy-month-select-btn', function (e) {
7490					e.preventDefault();
7491					e.stopPropagation();
7492					const $wrap = $(this).closest('.auto-policy-month-select');
7493					if ($wrap.hasClass('disabled')) return;
7494					if ($wrap.hasClass('open')) {
7495						removeAutoPolicyFloatingMonthSelect();
7496						return;
7497					}
7498					openAutoPolicyFloatingMonthSelect($wrap);
7499				});
7500
7501				$form.off('click.autoPolicyMonthSelectOption', '.auto-policy-month-select-option').on('click.autoPolicyMonthSelectOption', '.auto-policy-month-select-option', function (e) {
7502					e.preventDefault();
7503					e.stopPropagation();
7504					const $option = $(this);
7505					$accumulateSelect.val($option.attr('data-value'));
7506					syncAutoPolicyMonthSelect();
7507					removeAutoPolicyFloatingMonthSelect();
7508					$accumulateSelect.trigger('change');
7509				});
7510
7511				$(document).off('click.autoPolicyMonthSelectFloatingOption').on('click.autoPolicyMonthSelectFloatingOption', '.auto-policy-month-select-floating-menu .auto-policy-month-select-option', function (e) {
7512					e.preventDefault();
7513					e.stopPropagation();
7514					const $option = $(this);
7515					$accumulateSelect.val($option.attr('data-value'));
7516					syncAutoPolicyMonthSelect();
7517					removeAutoPolicyFloatingMonthSelect();
7518					$accumulateSelect.trigger('change');
7519				});
7520
7521				function formatDateLocal(date) {
7522					return date.getFullYear() + '-' +
7523						String(date.getMonth() + 1).padStart(2, '0') + '-' +
7524						String(date.getDate()).padStart(2, '0');
7525				}
7526
7527				$form.find('input, select').off('change.policyPreview').on('change.policyPreview', function () {
7528					const type = $form.find('input[name="cycle_type"]:checked').val();
7529					const month = parseInt($form.find('select[name="accumulate_month"]').val(), 10);
7530					const today = new Date();
7531
7532					if (type === '1') {
7533						$form.find('select[name="accumulate_month"]').prop('disabled', true);
7534					} else {
7535						$form.find('select[name="accumulate_month"]').prop('disabled', false);
7536					}
7537					syncAutoPolicyMonthSelect();
7538
7539					let start, end, baseDate;
7540
7541					if (type === '1') {
7542						const day = today.getDay();
7543						const diffToMon = ((1 - day + 7) % 7) || 7;
7544						baseDate = new Date(today);
7545						baseDate.setDate(today.getDate() + diffToMon);
7546						start = new Date(baseDate);
7547						start.setDate(start.getDate() - 7);
7548						end = new Date(baseDate);
7549						end.setDate(end.getDate() - 1);
7550					} else {
7551						baseDate = new Date(today.getFullYear(), today.getMonth() + 1, 1); // 기준일: 다음달 1일
7552						start = new Date(today.getFullYear(), today.getMonth() + 1 - month, 1); // 누적 시작일
7553						end = new Date(today.getFullYear(), today.getMonth() + 1, 0); // 누적 종료일 (이번달 말일)
7554					}
7555					const baseDateFormatted = formatDateLocal(baseDate);
7556					const startStr = formatDateLocal(start);
7557					const endStr = formatDateLocal(end);
7558
7559					const preview = `
7560						<div class="grade-changeex shopgrade-auto-policy-preview-text">
7561							<span class="policy-date-text" style="color:#4789e7 !important;">${baseDateFormatted}</span> 일에 <span class="policy-date-text" style="color:#4789e7 !important;">${startStr}</span> ~ <span class="policy-date-text" style="color:#4789e7 !important;">${endStr}</span> 간의 총 누적 기준으로 변경됩니다.
7562						</div>
7563					`;
7564
7565					$('.policy-preview').html(preview);
7566					$form.find('input[name="base_date"]').val(baseDateFormatted);
7567					$form.find('input[name="start_date"]').val(startStr);
7568					$form.find('input[name="end_date"]').val(endStr);
7569				});
7570
7571				$form.find('input, select').trigger('change');
7572			}, 50);
7573		}
7574
7575		// 등급 추가
7576		$(document).off('click', '.create-group-btn').on('click', '.create-group-btn', function () {
7577			openGradeModal('add', {}); 
7578		});
7579
7580		// 등급 수정
7581		function openGroupEditModal(data) {
7582			openGradeModal('edit', data);
7583		}
7584
7585
7586		function stripNumberOnly($form) {
7587			$form.find('input[numberOnly]').each(function () {
7588				this.value = normalizeIntegerInputValue(this.value);
7589			});
7590		}
7591
7592		function normalizeIntegerInputValue(value, max) {
7593			value = (value == null) ? '' : String(value).replace(/,/g, '').trim();
7594			if (value === '') return '';
7595
7596			const num = parseFloat(value.replace(/[^0-9.]/g, ''));
7597			if (!isFinite(num)) return '';
7598
7599			let intValue = Math.floor(num);
7600			if (typeof max !== 'undefined') intValue = Math.min(intValue, max);
7601			return String(intValue);
7602		}
7603
7604		function formatNumberFieldsOnce($form) {
7605			const names = [
7606				'use_auto_amount_min', 'use_auto_amount_max',
7607				'discount_amount', 'discount_value', 'discount_max',
7608				'reserve_amount',  'reserve_value',  'reserve_max'
7609			];
7610			names.forEach((n) => {
7611				const $el = $form.find(`input[name="${n}"]`);
7612				if (!$el.length) return;
7613				let v = $el.val();
7614				if (v == null || v === '') return;
7615				v = normalizeIntegerInputValue(v);
7616				const withComma = (window.addCommas ? window.addCommas(v) : String(v).replace(/\B(?=(\d{3})+(?!\d))/g, ','));
7617				$el.val(withComma);
7618			});
7619		}
7620
7621		function alertShopgradeAutoPolicyRequired() {
7622			alert('등급 자동 조정 설정을 해주세요.');
7623		}
7624
7625		function syncShopgradeAutoPolicyToggle($form) {
7626			if (!$form || !$form.length) $form = $('#grade-form').last();
7627			const $useAuto = $form.find('input[name="use_auto"]');
7628			if (!$useAuto.length) return;
7629
7630			const disabled = !currentShopgradeAutoPolicyEnabled;
7631			const $switch = $useAuto.closest('.simple-switch');
7632			$switch.toggleClass('shopgrade-auto-policy-disabled', disabled);
7633			$useAuto.attr('aria-disabled', disabled ? 'true' : 'false');
7634
7635			if (disabled) {
7636				$useAuto.prop('checked', false);
7637				$form.find('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]')
7638					.prop('required', false)
7639					.prop('disabled', true)
7640					.removeClass('input-error');
7641				$form.find('.criteria-row').hide();
7642				$form.find('.criteria-divider, .auto-error-row').hide();
7643			}
7644		}
7645
7646		function openGradeModal(mode, data = {}) {
7647			const isDefaultGrade = mode === 'edit' && String(data.grade_seq) === '0';
7648			const title = (mode === 'edit') ? '쇼핑 등급 수정' : '쇼핑 등급 추가';
7649			const html  = getGradeFormHtml(data, mode);
7650			const useShopgradeFormStyle = mode === 'add' || mode === 'edit';
7651			const modalClass = 'cl-cmmodal cl-s-btn cl-p130 cl-p0 cover' + (useShopgradeFormStyle ? ' shopgrade-add-modal' : '');
7652			const removeShopgradeModalOverlay = function () {
7653				$('.modal-overlay-blocker').remove();
7654				$('.shopgrade-add-modal-covered').removeClass('shopgrade-add-modal-covered');
7655				$('.shopgrade-add-modal-covered-wrap').removeClass('shopgrade-add-modal-covered-wrap');
7656			};
7657
7658			const modal = $('<div>').showModalFlat(
7659				title,
7660				html,
7661				true,
7662				true,
7663				function onConfirm() {
7664					const $form = $('#grade-form').last();
7665					const $input = $form.find('.grade_name');
7666					const gradeNameVal = $.trim($input.val());
7667					$input.val(gradeNameVal);
7668					$form.find('.input-error').removeClass('input-error');
7669					$('.grade-error-text, .auto-error-row').remove();
7670					$form.find('.shopgrade-has-error').removeClass('shopgrade-has-error');
7671					let valid = true;
7672					let $firstInvalid = $();
7673					if ($.trim($input.val()) === '') {
7674						$input.closest('tr').addClass('shopgrade-has-error');
7675						$input.addClass('input-error')
7676									.after(`
7677										<div class="grade-error-text">
7678											<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7679												<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7680												<rect x="6" y="3" width="1" height="5"></rect>
7681												<rect x="6" y="9" width="1" height="1"></rect>
7682											</svg> 등급 이름을 입력 해 주세요.
7683										</div>
7684									`).focus();
7685						$input.next('.grade-error-text').contents().filter(function () {
7686							return this.nodeType === 3;
7687						}).remove();
7688						$input.next('.grade-error-text').append(document.createTextNode('등급 이름을 입력해주세요.'));
7689
7690						$(document).off('input.grade_name').on('input.grade_name', 'input.grade_name', function () {
7691							const $t = $(this);
7692							if ($t.val().trim().length > 0) {
7693								$t.removeClass('input-error');
7694								$t.next('.grade-error-text').remove();
7695								$t.closest('tr').removeClass('shopgrade-has-error');
7696							}
7697						});
7698						$firstInvalid = $input;
7699						valid = false;
7700					}
7701
7702					const isAutoChecked     = !isDefaultGrade && $form.find('input[name="use_auto"]').is(':checked');
7703					const isDiscountChecked = $form.find('input[name="discount_use"]').is(':checked');
7704					const isReserveChecked  = $form.find('input[name="reserve_use"]').is(':checked');
7705
7706					if (isAutoChecked && !currentShopgradeAutoPolicyEnabled) {
7707						syncShopgradeAutoPolicyToggle($form);
7708						alertShopgradeAutoPolicyRequired();
7709						return false;
7710					}
7711
7712					function reqInput($el) {
7713						const val = $.trim($el.val());
7714						const num = Number(String(val).replace(/,/g, ''));
7715
7716						if (val === '' || val === '0' || (!isNaN(num) && num === 0)) {
7717							$el.addClass('input-error');
7718							if (!$firstInvalid.length) $firstInvalid = $el;
7719							valid = false;
7720						} else {
7721							$el.removeClass('input-error');
7722						}
7723					}
7724
7725					function reqSelect($el) {
7726						const val = $.trim($el.val());
7727
7728						if (val === '' || val == null) {
7729							$el.addClass('input-error');
7730							if (!$firstInvalid.length) $firstInvalid = $el;
7731							valid = false;
7732						} else {
7733							$el.removeClass('input-error');
7734						}
7735					}
7736
7737					// 가시 상태에 따라 필수 검사
7738					reqInput($input);
7739					if (gradeNameVal !== '') {
7740						let hasDuplicateGradeName = false;
7741						$.each(group_list || [], function (_, grade) {
7742							if (!grade) return true;
7743							if (mode === 'edit' && String(grade.seq) === String(data.seq)) return true;
7744							if ($.trim(grade.grade_name || '') === gradeNameVal) {
7745								hasDuplicateGradeName = true;
7746								return false;
7747							}
7748						});
7749
7750						if (hasDuplicateGradeName) {
7751							$input.next('.grade-error-text').remove();
7752							$input.closest('tr').addClass('shopgrade-has-error');
7753							$input.addClass('input-error').after(`
7754								<div class="grade-error-text">
7755									<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7756										<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7757										<rect x="6" y="3" width="1" height="5"></rect>
7758										<rect x="6" y="9" width="1" height="1"></rect>
7759									</svg>
7760								</div>
7761							`);
7762							$input.next('.grade-error-text').append(document.createTextNode('이미 생성된 등급이름 입니다.'));
7763							if (!$firstInvalid.length) $firstInvalid = $input;
7764							valid = false;
7765						}
7766					}
7767
7768					if (isAutoChecked) {
7769						reqInput($form.find('input[name="use_auto_amount_min"]'));
7770						reqInput($form.find('input[name="use_auto_amount_max"]'));
7771					}
7772					if (isDiscountChecked) {
7773						reqInput($form.find('input[name="discount_amount"]'));
7774						reqInput($form.find('input[name="discount_value"]'));
7775						reqSelect($form.find('select[name="discount_type"]'));
7776						if ($form.find('select[name="discount_type"]').val() === '0') {
7777							reqInput($form.find('input[name="discount_max"]'));
7778						}
7779					}
7780					if (isReserveChecked) {
7781						reqInput($form.find('input[name="reserve_amount"]'));
7782						reqInput($form.find('input[name="reserve_value"]'));
7783						reqSelect($form.find('select[name="reserve_type"]'));
7784						if ($form.find('select[name="reserve_type"]').val() === '0') {
7785							reqInput($form.find('input[name="reserve_max"]'));
7786						}
7787					}
7788
7789					if (isAutoChecked) {
7790						const $autoMin = $form.find('input[name="use_auto_amount_min"]');
7791						const $autoMax = $form.find('input[name="use_auto_amount_max"]');
7792						const autoMinVal = $.trim($autoMin.val());
7793						const autoMaxVal = $.trim($autoMax.val());
7794						const autoMin = Number(String(autoMinVal).replace(/,/g, ''));
7795						const autoMax = Number(String(autoMaxVal).replace(/,/g, ''));
7796						let hasAutoOverlap = false;
7797
7798						if (autoMinVal !== '' && autoMaxVal !== '' && autoMin > 0 && autoMax > 0 && autoMin < autoMax) {
7799							$.each(group_list || [], function (_, grade) {
7800								if (!grade || String(grade.use_auto) !== '1') return true;
7801								if (String(grade.grade_seq) === '0') return true;
7802								if (mode === 'edit' && String(grade.seq) === String(data.seq)) return true;
7803
7804								const gradeMin = Number(String(grade.use_auto_amount_min || 0).replace(/,/g, ''));
7805								const gradeMax = Number(String(grade.use_auto_amount_max || 0).replace(/,/g, '')) || 1000000000000;
7806								if (autoMin < gradeMax && autoMax > gradeMin) {
7807									hasAutoOverlap = true;
7808									return false;
7809								}
7810							});
7811						}
7812
7813						if (hasAutoOverlap) {
7814							$('.auto-error-row').remove();
7815							$form.find('.criteria-row').after(`
7816								<div class="auto-error-text auto-error-row">
7817									<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7818										<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7819										<rect x="6" y="3" width="1" height="5"></rect>
7820										<rect x="6" y="9" width="1" height="1"></rect>
7821									</svg> 중복된 기준의 쇼핑등급이 존재합니다.
7822								</div>
7823							`);
7824							$form.find('.auto-error-row').last().contents().filter(function () {
7825								return this.nodeType === 3;
7826							}).remove();
7827							$form.find('.auto-error-row').last().append(document.createTextNode('동일한 기준의 쇼핑등급이 존재합니다.'));
7828							$autoMin.add($autoMax).addClass('input-error');
7829							if (!$firstInvalid.length) $firstInvalid = $autoMin;
7830							valid = false;
7831						}
7832					}
7833					if (!valid) {
7834						if ($firstInvalid.length) $firstInvalid.focus();
7835						return false;
7836					}
7837
7838					// 서버 전송 전 숫자 정제
7839					stripNumberOnly($form);
7840					const formData = new FormData($form[0]);
7841					formData.append('sid', SID);
7842					if (mode === 'edit' && typeof data.seq !== 'undefined') {
7843						formData.append('seq', data.seq);
7844					}
7845					if (isDefaultGrade) {
7846						if (typeof formData.set === 'function') {
7847							formData.set('use_auto', '0');
7848							formData.set('use_auto_amount_min', '0');
7849							formData.set('use_auto_amount_max', '0');
7850						} else {
7851							formData.append('use_auto_amount_min', '0');
7852							formData.append('use_auto_amount_max', '0');
7853						}
7854					}
7855					if ($form.find('select[name="discount_type"]').val() === '1') {
7856						if (typeof formData.set === 'function') formData.set('discount_max', '0');
7857						else formData.append('discount_max', '0');
7858					}
7859					if ($form.find('select[name="reserve_type"]').val() === '1') {
7860						if (typeof formData.set === 'function') formData.set('reserve_max', '0');
7861						else formData.append('reserve_max', '0');
7862					}
7863
7864					const url = (mode === 'edit')
7865						? '/shop_grade/update/type/edit'
7866						: '/shop_grade/update/type/add';
7867
7868					// 상태 트리거(뷰 갱신)
7869					$form.find('input[name="use_auto"]').trigger('change');
7870					$form.find('input[name="discount_use"]').trigger('change');
7871					$form.find('input[name="reserve_use"]').trigger('change');
7872
7873					$.ajax({
7874						type: 'POST',
7875						url,
7876						data: formData,
7877						processData: false,
7878						contentType: false,
7879						dataType: 'json',
7880						success: function (res) {
7881							if ((mode === 'edit' && res.success) || (mode === 'add' && !res.error)) {
7882								alert(mode === 'edit' ? '수정되었습니다.' : '저장되었습니다.');
7883								modal.modal('hide');
7884								removeShopgradeModalOverlay();
7885								refreshGradeList();
7886								return;
7887							}
7888
7889							// 에러 처리
7890							const err = res.error;
7891							if (err === 'auto_policy_required') {
7892								syncShopgradeAutoPolicyToggle($form);
7893								alertShopgradeAutoPolicyRequired();
7894								return;
7895							}
7896							if (err === 'grade_name') {
7897								const $in = $form.find('.grade_name');
7898								$in.next('.grade-error-text').remove();
7899								$in.closest('tr').addClass('shopgrade-has-error');
7900								$in.addClass('input-error').after(`
7901									<div class="grade-error-text">
7902										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7903											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7904											<rect x="6" y="3" width="1" height="5"></rect>
7905											<rect x="6" y="9" width="1" height="1"></rect>
7906										</svg> 중복된 등급 이름 입니다.
7907									</div>
7908								`).focus();
7909								$in.next('.grade-error-text').contents().filter(function () {
7910									return this.nodeType === 3;
7911								}).remove();
7912								$in.next('.grade-error-text').append(document.createTextNode('이미 생성된 등급이름 입니다.'));
7913								$(document).off('input.grade_name').on('input.grade_name', 'input.grade_name', function () {
7914									const $t = $(this);
7915									if ($t.val().trim().length > 0) {
7916										$t.removeClass('input-error');
7917										$t.next('.grade-error-text').remove();
7918										$t.closest('tr').removeClass('shopgrade-has-error');
7919									}
7920								});
7921								return;
7922							}
7923
7924							if (err === 'use_auto') {
7925								$('.auto-error-row').remove();
7926								const $autoMin = $form.find('input[name="use_auto_amount_min"]');
7927								const $autoMax = $form.find('input[name="use_auto_amount_max"]');
7928								const autoMinVal = $.trim($autoMin.val());
7929								const autoMaxVal = $.trim($autoMax.val());
7930								if (autoMinVal === '' || autoMaxVal === '') {
7931									$autoMin.add($autoMax).filter(function () {
7932										return $.trim($(this).val()) === '';
7933									}).addClass('input-error');
7934									return;
7935								}
7936								$form.find('.criteria-row').after(`
7937									<div class="auto-error-text auto-error-row">
7938										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7939											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7940											<rect x="6" y="3" width="1" height="5"></rect>
7941											<rect x="6" y="9" width="1" height="1"></rect>
7942										</svg> 중복된 기준의 쇼핑등급이 존재합니다.
7943									</div>
7944								`);
7945								$form.find('.auto-error-row').last().contents().filter(function () {
7946									return this.nodeType === 3;
7947								}).remove();
7948								$form.find('.auto-error-row').last().append(document.createTextNode('동일한 기준의 쇼핑등급이 존재합니다.'));
7949								$autoMin.add($autoMax).addClass('input-error');
7950								return;
7951							}
7952
7953							if (err === 'invalid_range') {
7954								$('.auto-error-row').remove();
7955								$form.find('.criteria-row').after(`
7956									<div class="auto-error-text auto-error-row">
7957										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7958											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"></path>
7959											<rect x="6" y="3" width="1" height="5"></rect>
7960											<rect x="6" y="9" width="1" height="1"></rect>
7961										</svg> 최소값이 최대값보다 크거나 같습니다.
7962									</div>
7963								`);
7964								$form.find('.auto-error-row').last().contents().filter(function () {
7965									return this.nodeType === 3;
7966								}).remove();
7967								$form.find('.auto-error-row').last().append(document.createTextNode('최소값이 최대값보다 크거나 같습니다.'));
7968								$form.find('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]').addClass('input-error');
7969								return;
7970							}
7971
7972							if (err === 'nama_full') {
7973								alert('쇼핑등급은 최대 20개까지만 등록할 수 있습니다.');
7974								return;
7975							}
7976
7977							alert(res.error || '처리에 실패했습니다.');
7978						},
7979						error: function () {
7980							alert('서버 오류가 발생했습니다.');
7981						}
7982					});
7983				},
7984				'취소',
7985				'저장',
7986				modalClass,
7987				true,
7988				removeShopgradeModalOverlay,
7989				'',
7990				removeShopgradeModalOverlay
7991			);
7992
7993			if (useShopgradeFormStyle) {
7994				modal.addClass('shopgrade-add-modal-scroll');
7995				$('.modal-dialog.shopgrade-setting-modal')
7996					.addClass('shopgrade-add-modal-covered')
7997					.closest('.modal')
7998					.addClass('shopgrade-add-modal-covered-wrap');
7999				modal.find('.config-tooltip svg.sg-grade-use')
8000					.attr({
8001						'xmlns': 'http://www.w3.org/2000/svg',
8002						'viewBox': '0 0 13 13',
8003						'width': '13',
8004						'height': '13'
8005					})
8006					.html('<path d="M0 6.5a6.5 6.5 0 1 1 13 0 6.5 6.5 0 0 1-13 0Zm1 0C1 9.54 3.46 12 6.5 12S12 9.54 12 6.5 9.54 1 6.5 1 1 3.46 1 6.5ZM6 10V9h1v1H6Zm0-2c.02-.67.35-1.29.88-1.69.42-.33.69-.81.76-1.34a.923.923 0 0 0-.87-.96h-.14c-.56 0-1 .14-1.08.76 0 .08-.02.16-.02.23H4.51v-.2c.07-1.06.98-1.87 2.04-1.8.04 0 .08 0 .12.01A1.89 1.89 0 0 1 8.7 4.77v.11c-.07.74-.44 1.42-1.03 1.88-.63.62-.67.91-.68 1.25H6Z"/>');
8007				modal.find('#grade-form input[type="text"]').not('.grade_name').attr('placeholder', '0');
8008				modal.find('select[name="discount_type"], select[name="reserve_type"]').each(function () {
8009					var $select = $(this);
8010					var $wonOption = $select.find('option[value="1"]');
8011					var $percentOption = $select.find('option[value="0"]');
8012					if ($wonOption.length && $percentOption.length) {
8013						$wonOption.insertBefore($percentOption);
8014					}
8015				});
8016				modal.find('.modal-footer .close-button-dialog').text('취소');
8017				modal.find('.delivery-benefit-toggle-row').closest('tr').addClass('delivery-benefit-row');
8018				modal.find('.grade-create-table tr:has(td[colspan] hr)').addClass('shopgrade-hr-row');
8019				var $criteriaRow = modal.find('.criteria-row');
8020				$criteriaRow.closest('tr').addClass('auto-grade-row');
8021				var $autoMin = $criteriaRow.find('input[name="use_auto_amount_min"]');
8022				var $autoMax = $criteriaRow.find('input[name="use_auto_amount_max"]');
8023				var criteriaCycleText = currentShopgradeAutoPolicyCycleType === '1' ? '매주' : '매월';
8024				if ($criteriaRow.length && $autoMin.length && $autoMax.length) {
8025					$criteriaRow.empty().append(
8026						$('<div/>', { 'class': 'form-inline3 criteria-title' }).append(
8027							document.createTextNode('등급 충족 기준 : '),
8028							$('<span/>', { 'class': 'criteria-cycle', text: criteriaCycleText })
8029						),
8030						$('<div/>', { 'class': 'criteria-amount-row criteria-amount-line' }).append(
8031							$('<span/>', { 'class': 'criteria-label', text: '구매 금액' }),
8032							$('<span/>', { 'class': 'criteria-input-wrap' }).append($autoMin),
8033							$('<span/>', { 'class': 'criteria-unit', text: '원 이상,' }),
8034							$('<span/>', { 'class': 'criteria-input-wrap' }).append($autoMax),
8035							$('<span/>', { 'class': 'criteria-unit', text: '원 미만' })
8036						)
8037					);
8038				}
8039			}
8040
8041			// 모달 겹침 방지 오버레이
8042			setTimeout(() => {
8043				const $coveredModals = $('.modal-dialog.cl-cmmodal').not(':last');
8044				if (useShopgradeFormStyle) {
8045					$coveredModals.filter('.shopgrade-setting-modal')
8046						.addClass('shopgrade-add-modal-covered')
8047						.closest('.modal')
8048						.addClass('shopgrade-add-modal-covered-wrap');
8049				} else {
8050					$coveredModals.append('<div class="modal-overlay-blocker"></div>');
8051				}
8052				const $gradeForm = $('#grade-form').last();
8053				formatNumberFieldsOnce($gradeForm);
8054				$gradeForm.find('input[name="use_auto"], input[name="discount_use"], input[name="reserve_use"], input[name="delivery_benefit"], select[name="discount_type"], select[name="reserve_type"]').trigger('change');
8055				syncShopgradeAutoPolicyToggle($gradeForm);
8056				if (useShopgradeFormStyle) {
8057					modal.find('.discount-benefit-row:not(.discount-max-row), .reserve-benefit-row:not(.reserve-max-row)').each(function () {
8058						var $row = $(this);
8059						var isDiscountRow = $row.hasClass('discount-benefit-row');
8060						$row.closest('tr').addClass(isDiscountRow ? 'discount-benefit-form-row' : 'reserve-benefit-form-row');
8061						var isEnabled = isDiscountRow
8062							? modal.find('input[name="discount_use"]').is(':checked')
8063							: modal.find('input[name="reserve_use"]').is(':checked');
8064						var $amount = $row.find('.pos-relative').first().detach();
8065						var $value = $row.find('input.input-ms').first().detach();
8066						var $select = $row.find('select').first().detach();
8067						var $label = $row.find('span').last().detach();
8068						var $amountUnit = $amount.children('.pos-span, .pos-span1, .pos-span2').last();
8069						var $conditionSpan = $amount.children('span').not('.pos-span, .pos-span1, .pos-span2').last();
8070						var amountUnitText = $.trim($amountUnit.text());
8071						var amountConditionText = $.trim($amount.contents().filter(function () {
8072							return this.nodeType === 3;
8073						}).text());
8074						if (!amountConditionText && $conditionSpan.length) {
8075							amountConditionText = $.trim($conditionSpan.text());
8076						}
8077						$conditionSpan.remove();
8078						$amountUnit.remove();
8079						$amount.contents().filter(function () {
8080							return this.nodeType === 3;
8081						}).remove();
8082						var conditionText = amountConditionText || $.trim($row.contents().filter(function () {
8083							return this.nodeType === 3;
8084						}).text());
8085						if (amountUnitText) {
8086							conditionText = amountUnitText + (conditionText ? ' ' + conditionText : '');
8087						}
8088						$row.empty().addClass('shopgrade-benefit-line').append(
8089							$amount,
8090							$('<span/>', { 'class': 'benefit-condition', text: conditionText }),
8091							$value,
8092							$select,
8093							$label
8094						);
8095						$row.css('display', isEnabled ? 'grid' : 'none');
8096					});
8097					modal.find('.discount-max-row, .reserve-max-row').each(function () {
8098						var $row = $(this);
8099						var isDiscountRow = $row.hasClass('discount-max-row');
8100						var isEnabled = isDiscountRow
8101							? modal.find('input[name="discount_use"]').is(':checked')
8102							: modal.find('input[name="reserve_use"]').is(':checked');
8103						var $maxLabel = $row.find('.max-label').first().detach();
8104						var $maxInput = $row.find('.pos-relative').first().detach();
8105						$maxInput.children('.pos-span, .pos-span1, .pos-span2').last().addClass('benefit-max-unit');
8106						$row.empty().addClass('shopgrade-benefit-max-line').append(
8107							$('<span/>', { 'class': 'benefit-condition' }),
8108							$maxLabel,
8109							$maxInput,
8110							$('<span/>', { 'class': 'benefit-unit-placeholder' })
8111						);
8112						var isPercent = isDiscountRow
8113							? modal.find('select[name="discount_type"]').val() === '0'
8114							: modal.find('select[name="reserve_type"]').val() === '0';
8115						$row.css('display', (isEnabled && isPercent) ? 'grid' : 'none');
8116					});
8117					$gradeForm.find('input[name="discount_use"], input[name="reserve_use"], select[name="discount_type"], select[name="reserve_type"]').trigger('change');
8118					modal.find('select[name="discount_type"], select[name="reserve_type"]').each(function () {
8119						var $select = $(this);
8120						if ($select.next('.shopgrade-type-select').length) return;
8121						var $custom = $('<div/>', { 'class': 'shopgrade-type-select', tabindex: 0 });
8122						var $button = $('<button/>', { type: 'button', 'class': 'shopgrade-type-select-btn' });
8123						var $value = $('<span/>', { 'class': 'shopgrade-type-select-value', text: $select.find('option:selected').text() });
8124						var $menu = $('<div/>', { 'class': 'shopgrade-type-select-menu' });
8125						$select.find('option').each(function () {
8126							var $option = $(this);
8127							$menu.append($('<button/>', {
8128								type: 'button',
8129								'class': 'shopgrade-type-select-option' + ($option.is(':selected') ? ' selected' : ''),
8130								'data-value': $option.val(),
8131								text: $option.text()
8132							}));
8133						});
8134						$button.append($value);
8135						$custom.append($button, $menu);
8136						$select.addClass('shopgrade-native-type-select').after($custom);
8137					});
8138					syncShopgradeBenefitRows($gradeForm);
8139				}
8140			}, 10);
8141		}
8142
8143
8144
8145		function normalizeGradeFormData(data = {}, mode = 'edit') {
8146			const isAddMode = mode === 'add';
8147			const isDefaultGrade = mode === 'edit' && String(data.grade_seq) === '0';
8148			const emptyIfNull = (value, fallback = '') => {
8149				return (value === null || typeof value === 'undefined' || value === 'null') ? fallback : value;
8150			};
8151			const isEmptyValue = (value) => {
8152				return value === null || typeof value === 'undefined' || value === '' || value === 'null';
8153			};
8154			const isEmptyNumberValue = (value) => {
8155				return isEmptyValue(value) || String(value) === '0';
8156			};
8157			const emptyIfNoNumber = (value) => {
8158				return isEmptyNumberValue(value) ? '' : normalizeIntegerInputValue(value);
8159			};
8160			const hasNoBenefitSettings = (fields) => {
8161				return fields.every((field) => isEmptyNumberValue(data[field]));
8162			};
8163			const defaultBenefitType = isAddMode ? '0' : '1';
8164			return {
8165				seq: emptyIfNull(data.seq),
8166				grade_seq: emptyIfNull(data.grade_seq),
8167				grade_name: emptyIfNull(data.grade_name),
8168				use_auto: isDefaultGrade ? 0 : (hasNoBenefitSettings(['use_auto_amount_min', 'use_auto_amount_max']) ? 0 : emptyIfNull(data.use_auto, 0)),
8169				use_auto_amount_min: isDefaultGrade ? '' : emptyIfNoNumber(data.use_auto_amount_min),
8170				use_auto_amount_max: isDefaultGrade ? '' : emptyIfNoNumber(data.use_auto_amount_max),
8171				discount_use: isAddMode ? 1 : (hasNoBenefitSettings(['discount_amount', 'discount_value', 'discount_max']) ? 0 : emptyIfNull(data.discount_use, 0)),
8172				discount_amount: emptyIfNoNumber(data.discount_amount),
8173				discount_value: emptyIfNoNumber(data.discount_value),
8174				discount_type: emptyIfNull(data.discount_type, defaultBenefitType),
8175				discount_max: emptyIfNoNumber(data.discount_max),
8176				reserve_use: isAddMode ? 1 : (hasNoBenefitSettings(['reserve_amount', 'reserve_value', 'reserve_max']) ? 0 : emptyIfNull(data.reserve_use, 0)),
8177				reserve_amount: emptyIfNoNumber(data.reserve_amount),
8178				reserve_value: emptyIfNoNumber(data.reserve_value),
8179				reserve_type: emptyIfNull(data.reserve_type, defaultBenefitType),
8180				reserve_max: emptyIfNoNumber(data.reserve_max),
8181				delivery_benefit: isAddMode ? 1 : emptyIfNull(data.delivery_benefit, 0)
8182			};
8183		}
8184
8185		function getGradeFormHtml(data = {}, mode = 'edit') {
8186			const {
8187				grade_seq = '',
8188				grade_name = '',
8189				use_auto = 0,
8190				use_auto_amount_min = '',
8191				use_auto_amount_max = '',
8192				discount_use = 1,
8193				discount_amount = '',
8194				discount_value = '',
8195				discount_type = '0',
8196				discount_max = '',
8197				reserve_use = 1,
8198				reserve_amount = '',
8199				reserve_value = '',
8200				reserve_type = '0',
8201				reserve_max = '',
8202				delivery_benefit = 0
8203			} = normalizeGradeFormData(data, mode);
8204			const isDefaultGrade = mode === 'edit' && String(grade_seq) === '0';
8205
8206			const slAutouse   = '&#8226;&nbsp;앞에서 설정한 등급 자동 조정이 반영됩니다. 해당 등급은 사용을 원치 않을 경우 자동으로 등급 변경이 되지 않습니다.<br><br>&#8226;&nbsp;충족 기준은 총 실결제금액에서 각종 할인,쿠폰,적립금, 배송비 등 혜택이 제외된 금액) 기준 입니다.',
8207						slAddbenefit= $.lang[LANG]['manager.list.member.shopgrade.addbenefit'],
8208						slSavebenefit=$.lang[LANG]['manager.list.member.shopgrade.s
8208avebenefit'],
8209						slDelibenefit=$.lang[LANG]['manager.list.member.shopgrade.delibenefit'];
8210
8211			return `
8212				<form id="grade-form">
8213					<div class="mng-modal-body">
8214						<table class="grade-create-table">
8215							<tr>
8216								<td class="form-title">등급 이름</td>
8217								<td>
8218									<div class="form-inline">
8219										<input type="text" name="grade_name" class="grade_name" required
8220													placeholder="등급 이름을 입력 해 주세요." value="${grade_name}">
8221									</div>
8222								</td>
8223							</tr>
8224
8225							${isDefaultGrade ? '' : `
8226							<tr>
8227								<td class="form-title">자동 등급 사용
8228									<span class="config-tooltip">
8229										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8230												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slAutouse}">
8231											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>
8232											<rect x="6" y="9" width="1" height="1"/>
8233											<path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
8234										</svg>
8235									</span>
8236								</td>
8237								<td>
8238									<div class="toggle-switch">
8239										<label class="simple-switch">
8240											<input type="checkbox" name="use_auto" class="simple-switch-input" value="1" ${(use_auto == 1 && currentShopgradeAutoPolicyEnabled) ? 'checked' : ''}>
8241											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8242											<span class="simple-switch-handle"></span>
8243										</label>
8244									</div>
8245
8246									<div class="criteria-row" style="display: ${use_auto == 1 ? 'block' : 'none'};">
8247										<div class="form-inline3">등급 충족 기준 : <span class="criteria-cycle">${currentShopgradeAutoPolicyCycleType === '1' ? '매주' : '매월'}</span></div>
8248										<div class="form-inline">
8249											구매 금액
8250											<div class="pos-relative">
8251												<input type="text" name="use_auto_amount_min" class="input-ss" numberOnly data-keep-comma value="${use_auto_amount_min}">
8252												<span class="pos-span1">원 이상,</span>
8253												<input type="text" name="use_auto_amount_max" class="input-ss" numberOnly data-keep-comma value="${use_auto_amount_max}">
8254												<span class="pos-span2">원 미만</span>
8255											</div>
8256										</div>
8257									</div>
8258								</td>
8259							</tr>
8260							`}
8261
8262							<tr><td colspan="2"><hr></td></tr>
8263
8264							<tr>
8265								<td class="form-title">추가 할인 혜택
8266									<span class="config-tooltip">
8267										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8268												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slAddbenefit}">
8269											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>
8270											<rect x="6" y="9" width="1" height="1"/>
8271											<path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
8272										</svg>
8273									</span>
8274								</td>
8275								<td>
8276									<div class="toggle-switch">
8277										<label class="simple-switch">
8278											<input type="checkbox" name="discount_use" class="simple-switch-input" value="1" ${discount_use == 1 ? 'checked' : ''}>
8279											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8280											<span class="simple-switch-handle"></span>
8281										</label>
8282									</div>
8283
8284									<div class="form-inline3 discount-benefit-row" style="display: ${discount_use == 1 ? '' : 'none'};">
8285										<div class="pos-relative">
8286											<input type="text" name="discount_amount" class="input-mm" numberOnly data-keep-comma value="${discount_amount}">
8287											<span class="pos-span">원</span>
8288											<span>이상 구매 시</span>
8289										</div>
8290										<input type="text" name="discount_value" class="input-ms" numberOnly data-keep-comma value="${discount_value}">
8291										<select name="discount_type">
8292											<option value="0" ${discount_type == '0' ? 'selected' : ''}>%</option>
8293											<option value="1" ${discount_type == '1' ? 'selected' : ''}>원</option>
8294										</select>
8295										<span>
8295할인</span>
8296									</div>
8297
8298									<div class="form-inline1 discount-benefit-row discount-max-row" style="display: ${(discount_use == 1 && discount_type == '0') ? '' : 'none'};">
8299										<span class="max-label discount-limit-label"><span class="limit-star"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"><path d="M5.5 4.04v1.31l-1.25-.41-.31.95 1.25.4-.77 1.07.81.59L6 6.89l.77 1.06.81-.59-.77-1.06 1.25-.4-.31-.96-1.25.4V4.03h-1Z"/></svg></span>할인 한도 :</span>
8300										<div class="pos-relative">
8301											<input type="text" name="discount_max" class="input-mm" numberOnly data-keep-comma value="${discount_max}">
8302											<span class="pos-span">원</span>
8303										</div>
8304									</div>
8305								</td>
8306							</tr>
8307
8308							<tr>
8309								<td class="form-title">추가 적립 혜택
8310									<span class="config-tooltip">
8311										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8312												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slSavebenefit}">
8313											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>
8314											<rect x="6" y="9" width="1" height="1"/>
8315											<path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.66 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
8316										</svg>
8317									</span>
8318								</td>
8319								<td>
8320									<div class="toggle-switch">
8321										<label class="simple-switch">
8322											<input type="checkbox" name="reserve_use" class="simple-switch-input" value="1" ${reserve_use == 1 ? 'checked' : ''}>
8323											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8324											<span class="simple-switch-handle"></span>
8325										</label>
8326									</div>
8327
8328									<div class="form-inline3 reserve-benefit-row" style="display: ${reserve_use == 1 ? '' : 'none'};">
8329										<div class="pos-relative">
8330											<input type="text" name="reserve_amount" class="input-mm" numberOnly data-keep-comma value="${reserve_amount}">
8331											<span class="pos-span">원</span>
8332											<span>이상 구매 시</span>
8333										</div>
8334										<input type="text" name="reserve_value" class="input-ms" numberOnly data-keep-comma value="${reserve_value}">
8335										<select name="reserve_type">
8336											<option value="0" ${reserve_type == '0' ? 'selected' : ''}>%</option>
8337											<option value="1" ${reserve_type == '1' ? 'selected' : ''}>원</option>
8338										</select>
8339										<span>적립</span>
8340									</div>
8341
8342									<div class="form-inline1 reserve-benefit-row reserve-max-row" style="display: ${(reserve_use == 1 && reserve_type == '0') ? '' : 'none'};">
8343										<span class="max-label reserve-limit-label"><span class="limit-star"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"><path d="M5.5 4.04v1.31l-1.25-.41-.31.95 1.25.4-.77 1.07.81.59L6 6.89l.77 1.06.81-.59-.77-1.06 1.25-.4-.31-.96-1.25.4V4.03h-1Z"/></svg></span>적립 한도 :</span>
8344										<div class="pos-relative">
8345											<input type="text" name="reserve_max" class="input-mm" numberOnly data-keep-comma value="${reserve_max}">
8346											<span class="pos-span">원</span>
8347										</div>
8348									</div>
8349								</td>
8350							</tr>
8351
8352							<tr>
8353								<td class="form-title">배송비 무료
8354									<span class="config-tooltip">
8355										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8356												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slDelibenefit}">
8357											<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>
8358											<rect x="6" y="9" width="1" height="1"/>
8359											<path d="M6.66 3.01C5.61 3.01 4.58 3.5 4.5 4.8c0 0.06-0.01 0.12 0 0.2h1.02c0-0.07 0.01-0.15 0.02-0.23 0.08-0.62 0.52-0.76 1.08-0.76 0.63 0 1.02 0.37 1.02 0.95 -0.01 0.48-0.3 0.87-0.76 1.34C6.21 6.97 6.02 7.37 6 8h0.99C7 7.
835966 7.04 7.37 7.67 6.75 8.17 6.27 8.7 5.68 8.7 4.87 8.7 3.85 7.89 3.01 6.66 3.01z"/>
8360										</svg>
8361									</span>
8362								</td>
8363								<td>
8364									<div class="delivery-benefit-toggle-row">
8365									<div class="toggle-switch">
8366										<label class="simple-switch">
8367											<input type="checkbox" name="delivery_benefit" class="simple-switch-input delivery-toggle" value="1" ${delivery_benefit == 1 ? 'checked' : ''}>
8368											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8369											<span class="simple-switch-handle"></span>
8370										</label>
8371									</div>
8372									</div>
8373								</td>
8374							</tr>
8375
8376						</table>
8377					</div>
8378				</form>
8379			`;
8380		}
8381
8382
8383		$(document).off('blur.keepComma', 'input[numberOnly][data-keep-comma]').on('blur.keepComma', 'input[numberOnly][data-keep-comma]', function () {
8384			var v = $(this).val();
8385			v = (typeof removeCommas === 'function') ? removeCommas(v) : String(v).replace(/,/g, '');
8386			if (typeof addCommas === 'function') {
8387				$(this).val(addCommas(v));
8388			} else {
8389				$(this).val(String(v).replace(/\B(?=(\d{3})+(?!\d))/g, ','));
8390			}
8391		});
8392
8393		function stripNumberOnly($form) {
8394			$form.find('input[numberOnly]').each(function () {
8395				this.value = (typeof removeCommas === 'function')
8396					? removeCommas(this.value)
8397					: String(this.value).replace(/,/g, '');
8398			});
8399		}
8400
8401		$(function () {
8402			$('input[numberOnly]').each(function () {
8403				var v = $(this).val();
8404				if (v) {
8405					v = v.replace(/,/g, ''); // 혹시 기존 콤마 제거
8406					$(this).val(v.replace(/\B(?=(\d{3})+(?!\d))/g, ",")); // 천단위 콤마 찍기
8407				}
8408			});
8409		});
8410
8411
8412
8413		function getShopgradeCriteriaDisplay() {
8414			return $(window).width() <= 767 ? 'flex' : 'block';
8415		}
8416
8417		$(document).off('change', '.simple-switch-input').on('change', '.simple-switch-input', function (e) {
8418			const $tr = $(this).closest('tr');
8419
8420			if ($tr.find('td:first').text().includes('자동')) {
8421				if ($(this).attr('name') === 'use_auto' && !currentShopgradeAutoPolicyEnabled) {
8422					const $form = $(this).closest('#grade-form');
8423					syncShopgradeAutoPolicyToggle($form);
8424					if (e.originalEvent) alertShopgradeAutoPolicyRequired();
8425					return false;
8426				}
8427				const checked = $(this).is(':checked');
8428				$('.criteria-row').css('display', checked ? getShopgradeCriteriaDisplay() : 'none');
8429				$('.criteria-divider, .auto-error-row').toggle(checked);
8430			}
8431		});
8432
8433		$(document).off('click.shopgradeAutoPolicy', '#grade-form .shopgrade-auto-policy-disabled')
8434			.on('click.shopgradeAutoPolicy', '#grade-form .shopgrade-auto-policy-disabled', function (e) {
8435				e.preventDefault();
8436				e.stopImmediatePropagation();
8437				const $form = $(this).closest('#grade-form');
8438				syncShopgradeAutoPolicyToggle($form);
8439				alertShopgradeAutoPolicyRequired();
8440				return false;
8441			});
8442
8443		$(window).off('resize.shopgradeCriteria').on('resize.shopgradeCriteria', function () {
8444			$('.shopgrade-add-modal .criteria-row:visible').css('display', getShopgradeCriteriaDisplay());
8445		});
8446
8447		function syncShopgradeBenefitRows($form) {
8448			if (!$form || !$form.length) $form = $('#grade-form').last();
8449
8450			var $discountType = $form.find('select[name="discount_type"]');
8451			var $discountUse = $form.find('input[name="discount_use"]');
8452			var $discountMax = $form.find('input[name="discount_max"]');
8453			var showDiscountRows = $discountUse.is(':checked');
8454			var showDiscountMax = showDiscountRows && $discountType.val() === '0';
8455
8456			$form.find('tr.discount-benefit-form-row')
8457				.toggleClass('shopgrade-benefit-off', !showDiscountRows);
8458			$form.find('.discount-benefit-row').not('.discount-max-row')
8459				.toggleClass('shopgrade-benefit-hidden', !showDiscountRows)
8460				.css('display', showDiscountRows ? 'grid' : 'none');
8461
8462			$form.find('.discount-max-row')
8463				.toggleClass('shopgrade-benefit-hidden shopgrade-max-hidden', !showDiscountMax)
8464				.css('display', showDiscountMax ? 'grid' : 'none');
8465			$form.find('input[name="discount_amount"], input[name="discount_value"], select[name="discount_type"]')
8466				.prop('required', showDiscountRows)
8467				.prop('disabled', !showDiscountRows);
8468			$discountMax.prop('required', showDiscountMax).prop('disabled', !showDiscountMax);
8469			if (!showDiscountRows) {
8470				$form.find('input[name="discount_amount"], input[name="discount_value"], input[name="discount_max"]').removeClass('input-error');
8471			} else if (!showDiscountMax) {
8472				$discountMax.removeClass('input-error').val('');
8473			}
8474
8475			var $reserveType = $form.find('select[name="reserve_type"]');
8476			var $reserveUse = $form.find('input[name="reserve_use"]');
8477			var $reserveMax = $form.find('input[name="reserve_max"]');
8478			var showReserveRows = $reserveUse.is(':checked');
8479			var showReserveMax = showReserveRows && $reserveType.val() === '0';
8480
8481			$form.find('tr.reserve-benefit-form-row')
8482				.toggleClass('shopgrade-benefit-off', !showReserveRows);
8483			$form.find('.reserve-benefit-row').not('.reserve-max-row')
8484				.toggleClass('shopgrade-benefit-hidden', !showReserveRows)
8485				.css('display', showReserveRows ? 'grid' : 'none');
8486
8487			$form.find('.reserve-max-row')
8488				.toggleClass('shopgrade-benefit-hidden shopgrade-max-hidden', !showReserveMax)
8489				.css('display', showReserveMax ? 'grid' : 'none');
8490			$form.find('input[name="reserve_amount"], input[name="reserve_value"], select[name="reserve_type"]')
8491				.prop('required', showReserveRows)
8492				.prop('disabled', !showReserveRows);
8493			$reserveMax.prop('required', showReserveMax).prop('disabled', !showReserveMax);
8494			if (!showReserveRows) {
8495				$form.find('input[name="reserve_amount"], input[name="reserve_value"], input[name="reserve_max"]').removeClass('input-error');
8496			} else if (!showReserveMax) {
8497				$reserveMax.removeClass('input-error').val('');
8498			}
8499		}
8500
8501		$(document).off('click.shopgradeTypeSelect').on('click.shopgradeTypeSelect', function (e) {
8502			if (!$(e.target).closest('.shopgrade-type-select').length) {
8503				$('.shopgrade-type-select').removeClass('open');
8504			}
8505		});
8506
8507		$(document).off('click.shopgradeTypeSelectBtn', '.shopgrade-type-select-btn').on('click.shopgradeTypeSelectBtn', '.shopgrade-type-select-btn', function (e) {
8508			e.preventDefault();
8509			e.stopPropagation();
8510			var $wrap = $(this).closest('.shopgrade-type-select');
8511			$('.shopgrade-type-select').not($wrap).removeClass('open');
8512			$wrap.toggleClass('open');
8513		});
8514
8515		$(document).off('click.shopgradeTypeSelectOption', '.shopgrade-type-select-option').on('click.shopgradeTypeSelectOption', '.shopgrade-type-select-option', function (e) {
8516			e.preventDefault();
8517			e.stopPropagation();
8518			var $option = $(this);
8519			var $wrap = $option.closest('.shopgrade-type-select');
8520			var $select = $wrap.prev('select.shopgrade-native-type-select');
8521			var selectedValue = $option.attr('data-value');
8522			var $form = $select.closest('#grade-form');
8523			$select.val(selectedValue);
8524			if ($select[0]) {
8525				$select[0].dispatchEvent(new Event('change', { bubbles: true }));
8526			} else {
8527				$select.trigger('change');
8528			}
8529			syncShopgradeBenefitRows($form);
8530			$wrap.find('.shopgrade-type-select-value').text($option.text());
8531			$wrap.find('.shopgrade-type-select-option').removeClass('selected');
8532			$option.addClass('selected');
8533			$wrap.removeClass('open');
8534		});
8535
8536		let isComposing = false;
8537
8538		// 공통 필터링 함수
8539		function filterGroupName($input) {
8540			let val = $input.val();
8541			val = val.replace(/[^a-zA-Z가-힣 ]/g, '');
8542			if (val.length > 40) val = val.substring(0, 40);
8543			$input.val(val);
8544		}
8545
8546		// 조합 입력 시작
8547		$(document).on('compositionstart', '.grade_name', function () {
8548			isComposing = true;
8549		});
8550
8551		// 조합 입력 끝났을 때 필터링
8552		$(document).on('compositionend', '.grade_name', function () {
8553			isComposing = false;
8554			filterGroupName($(this));
8555		});
8556
8557		// 일반 입력 중일 때 (영문 입력 등)
8558		$(document).on('input', '.grade_name', function () {
8559			if (!isComposing) {
8560				filterGroupName($(this));
8561			}
8562		});
8563
8564		$(document).on('change input', 'select[name="discount_type"], input[name="discount_value"], select[name="reserve_type"], input[name="reserve_value"], .input-mm, .input-ms, .input-ss', function (e) {
8565			const $target = $(this);
8566			const $form = $target.closest('#grade-form');
8567			const isUserChange = !!e.originalEvent;
8568
8569			if ($target.hasClass('input-mm') || $target.hasClass('input-ms') || $target.hasClass('input-ss')) {
8570				$target.val(normalizeIntegerInputValue($target.val(), 99999999));
8571			}
8572
8573			if ($target.attr('name') === 'discount_type' ||	$target.attr('name') === 'discount_value') {
8574				const $type = $form.find('select[name="discount_type"]');
8575				const $value = $form.find('input[name="discount_value"]');
8576				const $discountMax = $form.find('input[name="discount_max"]');
8577				const isPercent = $type.val() === '0';
8578				$value.attr(isPercent ? { min: 0, max: 100 } : { min: 0, max: 99999999 });
8579
8580				if ($target.attr('name') === 'discount_type' && isUserChange) {
8581					$value.removeClass('input-error').val('');
8582					$discountMax.removeClass('input-error').val('');
8583				} else if ($target.attr('name') === 'discount_value') {
8584					$value.val(normalizeIntegerInputValue($value.val(), isPercent ? 100 : 99999999));
8585				}
8586
8587				syncShopgradeBenefitRows($form);
8588			}
8589
8590			if ($target.attr('name') === 'reserve_type' || $target.attr('name') === 'reserve_value') {
8591				const $type = $form.find('select[name="reserve_type"]');
8592				const $value = $form.find('input[name="reserve_value"]');
8593				const $reserveMax = $form.find('input[name="reserve_max"]');
8594				const isPercent = $type.val() === '0';
8595				$value.attr(isPercent ? { min: 0, max: 100 } : { min: 0, max: 99999999 });
8596
8597				if ($target.attr('name') === 'reserve_type' && isUserChange) {
8598					$value.removeClass('input-error').val('');
8599					$reserveMax.removeClass('input-error').val('');
8600				} else if ($target.attr('name') === 'reserve_value') {
8601					$value.val(normalizeIntegerInputValue($value.val(), isPercent ? 100 : 99999999));
8602				}
8603
8604				syncShopgradeBenefitRows($form);
8605			}
8606		});
8607
8608		// 1. 자동 등급 체크 상태에 따라 기준 필드 required 여부 설정
8609		$(document).on('change', 'input[name="use_auto"]', function () {
8610				const isChecked = $(this).is(':checked');
8611				$('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]')
8612						.prop('required', isChecked)
8613						.prop('disabled', !isChecked);
8614		});
8615
8616		// 2. 할인 혜택 필드 제어
8617		$(document).on('change', 'input[name="discount_use"]', function () {
8618				const $form = $(this).closest('#grade-form');
8619				syncShopgradeBenefitRows($form);
8620		});
8621
8622		// 3. 적립 혜택 필드 제어
8623		$(document).on('change', 'input[name="reserve_use"]', function () {
8624				const $form = $(this).closest('#grade-form');
8625				syncShopgradeBenefitRows($form);
8626		});
8627
8628		$(document).off('input.shopgradeRequired change.shopgradeRequired', '#grade-form input, #grade-form select')
8629			.on('input.shopgradeRequired change.shopgradeRequired', '#grade-form input, #grade-form select', function () {
8630				const $field = $(this);
8631				const val = $.trim($field.val());
8632				if (val !== '' && val !== '0') {
8633					$field.removeClass('input-error');
8634					if ($field.hasClass('grade_name')) {
8635						$field.next('.grade-error-text').remove();
8636						$field.closest('tr').removeClass('shopgrade-has-error');
8637					}
8638				}
8639			});
8640
8641
8642		// 등급 삭제
8643		$(document).off('click', '.delete-group-btn').on('click', '.delete-group-btn', function () {
8644			const gradeSeq = $(this).data('sgseq');
8645			const gradeName = $(this).data('gradename');
8646
8647			// 등급에 포함된 회원 수 조회
8648			$.ajax({
8649				type: 'POST',
8650				url: '/shop_grade/shopgrade_member_count',
8651				dataType: 'json',
8652				data: { sid: SID, grade_id: gradeSeq },
8653				success: function (res) {
8654					const memberCount = res.count || 0;
8655
8656					if (memberCount > 0) {
8657						const warnModal = $(this).showModalFlat(
8658							'쇼핑 등급 삭제',
8659							`
8660							<div class="delete-grade-modal">
8661								<div class="delete-grade-name-row">
8662									<span class="delete-grade-name-label">등급명</span>
8663									<span class="delete-grade-name-value">[ ${gradeName} ]</span>
8664								</div>
8665								<div class="delete-grade-message">
8666									이 등급에 회원이 <strong>${memberCount}</strong>명 있습니다.<br>
8667									<span class="delete-grade-danger">삭제</span> 하면 기본 등급으로 내려갑니다.
8668								</div>
8669							</div>
8670							`,
8671							true,
8672							true,
8673							function () {
8674								$.ajax({ // 기존 씨앗으로 리셋
8675									type: 'POST',
8676									url: '/shop_grade/shopgrade_member_reset',
8677									dataType: 'json',
8678									data: { sid: SID, grade_id: gradeSeq },
8679									success: function (resetRes) {
8680										$.ajax({
8681											type: 'POST',
8682											url: '/shop_grade/update/type/delete',
8683											dataType: 'json',
8684											data: { sid: SID, seq: gradeSeq },
8685											success: function (res) {
8686												if (res.success) {
8687													alert('삭제되었습니다.');
8688													warnModal.modal('hide');
8689													$('.modal-overlay-blocker').remove();
8690													$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8691													refreshGradeList();
8692												} else {
8693													alert('삭제 실패: ' + res.error);
8694												}
8695											}
8696										});
8697									}
8698								});
8699							},
8700							'취소',
8701							'삭제',
8702							'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal',
8703							true,
8704							function () {
8705								$('.modal-overlay-blocker').remove();
8706								$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8707							}
8708						);
8709
8710						setTimeout(() => {
8711							$('.modal-dialog.cl-cmmodal')
8712								.not(':last')
8713								.addClass('shopgrade-auto-policy-covered')
8714								.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
8715						}, 10);
8716
8717					} else {
8718
8719						const confirmModal = $(this).showModalFlat(
8720							'쇼핑 등급 삭제',
8721							`
8722							<div class="delete-grade-modal">
8723								<div class="delete-grade-name-row">
8724									<span class="delete-grade-name-label">등급명</span>
8725									<span class="delete-grade-name-value">[ ${gradeName} ]</span>
8726								</div>
8727								<div class="delete-grade-message">
8728									삭제된 쇼핑 등급은 복구 불가능합니다.<br>
8729									쇼핑 등급을 <span class="delete-grade-danger">삭제</span> 하시겠습니까?
8730								</div>
8731							</div>
8732							`,
8733							true,
8734							true,
8735							function () {
8736								$.ajax({
8737									type: 'POST',
8738									url: '/shop_grade/update/type/delete',
8739									dataType: 'json',
8740									data: { sid: SID, seq: gradeSeq },
8741									success: function (res) {
8742										if (res.success) {
8743											alert('삭제되었습니다.');
8744											confirmModal.modal('hide');
8745											$('.modal-overlay-blocker').remove();
8746											$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8747											refreshGradeList();
8748										} else {
8749											alert('삭제 실패: ' + res.error);
8750										}
8751									}
8752								});
8753							},
8754							'취소',
8755							'삭제',
8756							'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal',
8757							true,
8758							function () {
8759								$('.modal-overlay-blocker').remove();
8760								$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8761							}
8762						);
8763
8764						setTimeout(() => {
8765							$('.modal-dialog.cl-cmmodal')
8766								.not(':last')
8767								.addClass('shopgrade-auto-policy-covered')
8768								.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
8769						}, 10);
8770					}
8771				}
8772			});
8773		});
8774
8775		// 등급 리스트 새로고침
8776		function refreshGradeList() {
8777			$.ajax({
8778				type: 'POST',
8779				url: '/shop_grade/get_list',
8780				dataType: 'json',
8781				data: { sid: SID },
8782				success: function (res) {
8783					if (res.success) {
8784						group_list = res.list;
8785						const newListHtml = renderGroupList(group_list);
8786						modal.find('.grade-list-wrap').html(newListHtml);
8787						bindEditEvents(modal);
8788					}
8789				}
8790			});
8791		}
8792
8793
8794		});
8795		/* 쇼핑등급 설정 end */
8796
8797		function hasShopgradeSettingOpenParam() {
8798			var params = new URLSearchParams(window.location.search || '');
8799			return params.get('open_shopgrade_setting') == '1';
8800		}
8801
8802		function removeShopgradeSettingOpenParam() {
8803			if(typeof history == 'undefined' || typeof history.replaceState != 'function') return;
8804
8805			var url = new URL(window.location.href);
8806			url.searchParams.delete('open_shopgrade_setting');
8807			history.replaceState({}, document.title, url.pathname + url.search + url.hash);
8808		}
8809
8810		function openShopgradeSettingModalFromUrl() {
8811			if(!hasShopgradeSettingOpenParam()) return;
8812
8813			removeShopgradeSettingOpenParam();
8814			setTimeout(function() {
8815				var $btn = $('.shopgrade-setting-btn.shopGrade').not('.shopping_disabled, .ss_user_noActive').first();
8816				if($btn.length == 0) $btn = $('.shopGrade').not('.shopping_disabled, .ss_user_noActive').first();
8817				if(typeof canConfigureShopgrade != 'undefined' && !canConfigureShopgrade) return;
8818				if($btn.length > 0) $btn.trigger('click');
8819			}, 300);
8820		}
8821
8822		openShopgradeSettingModalFromUrl();
8823
8824
8825
8826
8827
8828
8829
8830
8831	$('input[type="checkbox"].cl-etc-input-val').live('click',function(){ 
8832		if($(this).is(":checked")===true) {
8833			
8834			console.log($(this).prop('checked'));
8835			$(this).prop('checked',true);
8836		} else {
8837			
8838			console.log($(this).prop('checked'));
8839			$(this).prop('checked',false);
8840		}
8841	
8842	});
8843	
8844	$('.member-info').live('click', function() {
8845		var isGabia = ($('.dashboard_u.gabia').length > 0) ? true : false,
8846			checkViewMode = ($(this).find('.collection-view').length > 0) ? true : false,
8847			uid = $(this).closest('tr').attr('data-uid'),
8848			mng_settings_el = $(this).closest('.mng-settings'),
8849			list_type = mng_settings_el.attr('data-type'),
8850			list_str = '',
8851			no_active_btn = $('div[data-ssuser]').attr('data-ssuser');
8852
8853		$.post('/umember/lists/type/memberinfo', { sid : SID, val : uid }, function(data) {
8854			if(typeof data.error != 'undefined' && data.error) {
8855				alert(data.error);
8856				return false;
8857			}
8858			var page_type = $('.mng-settings').attr('data-type'),
8859				slog_p = '';
8860			if(typeof page_type != 'undefined' && page_type) {
8861				if(page_type == 'member-waitlist') setSiteLogs('um.wait','info',{'id':uid},'um.waitlist');
8862				else setSiteLogs('um.list','info',{'id':uid},'um.list');
8863			}
8864			var cert_use = $('.memberlist-table').attr('data-cert');
8865			$.each(data, function(k,o) {
8866				if(isGabia && $.inArray(k, ['cert_date','cert_adult_date']) > -1) return true;				
8867				var cl_name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+k],
8868					cl_type = (o['type']) ? o['type'] : 'text',
8869					cl_val = (o['value']) ? o['value'].replace(/\"/g,'&quot;').replace(/\'/g,'&#39;').replace(/\</g,'&lt;').replace(/\>/g,'&gt;') : '',
8870					pass_field = ['no','addr2','umseq'],
8871					disabled_field = ['id','approvaldate'],
8872                    cl_jcol_list_type = ((o['type']=='check') || (o['type']=='radio')) ? 'cl-etc-list-type' : '';
8873
8874				list_str += ($.inArray(k,pass_field) > -1) ? '' : '\
8875					<div class="form-group">\
8876						<label class="memW-title control-label '+cl_jcol_list_type+' " id="member-'+ k + '-label">'+ cl_name + '</label>\
8877						<div class="memW-info-wrap">\
8878				';
8879
8880				if(k=='birth') cl_val = (cl_val=='0000-00-00') ? '' : cl_val;
8881				
8882				switch(k) {
8883					case 'no':
8884					case 'addr2': 
8885					case 'umseq': 
8886						break;
8887
8888					case 'addr1':
8889						var addr2_str = (data['addr2']['value']) ? '||' + data['addr2']['value'] : '|| ',
8890							addr_str = (cl_val.indexOf('||') === -1) ? ' || '+cl_val+addr2_str : cl_val+addr2_str,
8891							addr = addr_str.split('||'),
8892							plan_type = (typeof property != 'undefined' && property) ? property.VALIDTYPE : VALIDTYPE,
8893							checkSM = (typeof plan_type != 'undefined' && (plan_type == 'SM' || plan_type == 'SHOPPING')) ? true : false,
8894							usedAddrSearchModal = (checkSM || o['addrsearch']) ? 'readonly onclick="addrSearchModal(\'member\')"' : '';
8895							;
8896							
8897						var sm_addr =  (data && data.umseq) ? data.umseq : '',
8898							sm_name =  (sm_addr && sm_addr.to_name) ? sm_addr.to_name : '',							
8899							sm_alias = (sm_addr && sm_addr.alias) ? sm_addr.alias : '',
8900							sm_tel = (sm_addr && sm_addr.to_tel) ? sm_addr.to_tel : '',
8901							addr_list_btn ='';
8902							addr_default_html = '';
8903							if(sm_addr || checkSM) {
8904								
8905								addr_list_btn += '\
8906								<div class="cl-s-form-wrap btn-load-addresses adm-member-addr '+(!sm_addr? 'hide' : '' )+' " data-action="adm-edit">\
8907									<div class="cl-s-form-group "><span>배송지 목록</span>\
8908									</div>\
8909								</div>';		
8910								
8911								addr_default_html += '\
8912								<div class="sm-parent '+ (!sm_addr ? 'emptyFlag' : '') +'">\
8913									<div class="cl-s-form-wrap">\
8914										<div class="cl-s-form-group">\
8915											<div class="cl-s-form-control"><div class="sm-name">'+sm_name+'</div><div class="sm-alias ' +(sm_alias ? '':'hide')+ '">' +(sm_alias ? '('+sm_alias+')' : '' )+ ' </div><div class="sm-default-addr"><span>기본배송지</span></div></div>\
8916											<div class="cl-s-form-control"><div class="sm-addr1"><span class=" '+ (addr[0]?.trim() ? '' : 'hide')+' "> '+(addr[0]?.trim() ? '['+ addr[0]?.trim() +']' : '' )+'</span><span>'+  addr[1].trim() +' '+ addr[2].trim() +'</span></div></div>\
8917											<div class="cl-s-form-control"><div class="sm-tel">'+sm_tel+'</div></div>\
8918											<div class="cl-s-form-control noaddress" style="text-align:center; padding:20px; color:#999;">등록된 배송지가 없습니다.</div>\
8919										</div>\
8920									</div>\
8921								</div>\
8922								';
8923							}
8924							 
8925						if(list_type == 'member-list') {
8926							if(sm_addr || checkSM) { list_str += addr_list_btn; }
8927
8928							list_str += '\
8929								<input class="hide" id="member-postcode" type="hidden" value="' + addr[0].trim() + '">\
8930								<div class="cl-common-form-wrap nonplace-holder">\
8931			   						<div class="cl-common-form-group">\
8932                                       	<input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + addr[1].trim() + '" ' + usedAddrSearchModal + ' name="member-'+ k + '" required="required">\
8933			 						</div>\
8934			   					</div>\
8935			   					<div class="cl-common-form-wrap nonplace-holder">\
8936			   						<div class="cl-common-form-group">\
8937                                       	<input class="member-info-input form-control" id="member-addr2" type="text" value="' + escapeHtml(addr[2].trim()) + '" name="member-addr2" required="required">\
8938			 						</div>\
8939			   					</div>\
8940							';
8941
8942							if (sm_addr || checkSM) { list_str += addr_default_html;}							
8943						} else {
8944							list_str += '\
8945								<input class="hide" id="member-postcode" type="hidden" value="' + addr[0].trim() + '">\
8946								<span id="member-'+ k + '" '+usedAddrSearchModal+'>'
8947									+ addr[1].trim() + ((addr[2].trim() != '') ? '<br>'+addr[2].trim() : '') +
8948								'</span>\
8949							';
8950						}
8951						break;
8952					case 'gender':
8953						if(list_type == 'member-list') {
8954							var disabled = (cert_use == 'Y' || cert_use == 'A' || checkViewMode) ? ' disabled':'';
8955							list_str += '\
8956								<select class="form-control" name="member-'+ k + '" id="member-'+ k+ '"'+disabled+'>\
8957									<option value="">선택</option>';
8958							if(o['value'] == '01') {
8959								list_str += '\
8960									<option value="01" selected>남</option>\
8961									<option value="02">여</option>';
8962							} else if(o['value'] == '02') {
8963								list_str += '\
8964									<option value="01">남</option>\
8965									<option value="02" selected>여</option>';
8966							} else {
8967								list_str += '\
8968									<option value="01">남</option>\
8969									<option value="02">여</option>';
8970							}
8971							list_str += '\
8972								</select>\
8973								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
8974							';
8975						} else {
8976							var gender_val = (cl_val)? ((cl_val == '01')? '남':'여'):'';
8977							list_str += '\
8978								<span id="member-'+ k + '">'
8979									+ gender_val +
8980								'</span>\
8981								';
8982						}
8983							
8984						break;
8985					case 'memo':
8986						var m_count = cl_val.length,
8987							checkReadonly = (checkViewMode) ? 'readonly' : '';
8988						if(list_type == 'member-list') {
8989							list_str += '\
8990								<textarea class="form-control" name="member-'+ k + '" id="member-'+ k+ '" rows="3" '+checkReadonly+'>' + cl_val + '</textarea>\
8991								<label for="member-'+ k + '"><span class="write-count">' + m_count + '</span>/1000</label>\
8992								';
8993						} else {
8994							list_str += '\
8995								<span id="member-'+ k+ '">' + cl_val + '</span>';
8996						}
8997						break;
8998
8999					case 'birth':
9000						if(list_type == 'member-list') {
9001							var disabled = (cert_use == 'Y' || cert_use == 'A') ? ' disabled':'';
9002							list_str += '\
9003								<div class="cl-common-form-wrap nonplace-holder">\
9004			   						<div class="cl-common-form-group'+disabled+'">\
9005	                                       <input class="member-info-input form-control birthKeyCheck" id="member-'+ k + '" type="text" value="' + cl_val + '" name="member-'+ k + '" onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)" required="required"'+disabled+'>\
9006			 						</div>\
9007			   					</div>\
9008							';
9009						} else {
9010							list_str += '\
9011								<span id="member-'+ k + '" class="birthKeyCheck" onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)">'
9012									+ cl_val +
9013								'</span>\
9014							';
9015						}
9016
9017						break;
9018
9019					case 'cert_date':
9020					case 'cert_adult_date':
9021						if(list_type == 'member-list') {
9022							list_str += '\
9023		                            <div class="cl-common-form-wrap nonplace-holder member-'+ k + '-wrap">';
9024		                        if(cl_val != '' && cl_val != '0000-00-00 00:00:00') {
9025				   				list_str += '\
9026				   						<div class="cl-common-form-group">\
9027		                                    <input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + cl_val + '" name="member-'+ k + '" required="required" ' + prev_val + ' disabled>\
9028				 						</div>';
9029					 			}
9030				 			list_str += '\
9031				   					</div>\
9032								';
9033						} else {
9034							if(cl_val != '' && cl_val != '0000-00-00 00:00:00') {
9035								list_str += '\
9036									<span id="member-'+ k + '">'
9037										+ cl_val +
9038									'</span>\
9039								';
9040							}
9041						}
9042
9043						break;
9044					default:
9045						var disabled = ($.inArray(k,disabled_field) > -1) ? 'disabled' : '',
9046							prev_val = (k == 'email' || k == 'nick') ? 'data-prev="' + cl_val + '"' : '',
9047							cl_type_str = '';
9048
9049						if(list_type == 'member-list') {
9050							if($.inArray(k, ['name', 'tel']) > -1 && (cert_use == 'Y' || cert_use == 'A')) disabled = 'disabled';
9051							var list_jcolval = [o['jcol_val']];
9052							if((cl_type=='select') || (cl_type=='check') || (cl_type=='radio')) {
9053								list_jcolval =  (o['jcol_val'].indexOf('`') > -1) ? o['jcol_val'].split('`') : list_jcolval;
9054							}
9055							switch (cl_type) {
9056								case 'memo':
9057									cl_type_str += '<textarea class="form-control" name="member-'+ k + '" id="member-'+ k+ '" rows="3">' + cl_val + '</textarea>';
9058									break;
9059								case 'select':									
9060									if(list_jcolval.length > 0) {
9061										cl_type_str += '\
9062										<select class="form-control etc-select" name="member-'+ k + '" id="member-'+ k+ '"'+disabled+'>\
9063											<option value="">선택</option>';
9064										$.each(list_jcolval, function(i,v) {
9065											var selected = (v==cl_val) ? 'selected' : '';
9066											cl_type_str += '\
9067											<option value="'+v+'" '+selected+'>'+v+'</option>\
9068											';
9069										});
9070										cl_type_str += '\
9071										</select>\
9072										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 4" width="8" height="4"><path d="m0 0 4 4 4-4z"/></svg>\
9073										';
9074									}
9075									
9076									break;
9077
9078								case 'radio':
9079									if(list_jcolval.length > 0) {
9080										$.each(list_jcolval, function(i,v) {
9081											var checked = (v==cl_val) ? 'checked' : '';
9082											cl_type_str += '\
9083											<div class="newcheckbox cl-etc-jcoltype">\
9084												<label>\
9085													<div class="newcheckboxSvgRadio">\
9086														<input type="radio" class="form-control cl-common-form-radio-hide cl-etc-input-val cl-s-form-control" id="member-'+ k + '-'+i+'" name="member-'+ k + '" value="'+v+'" '+checked+'>\
9087														<svg viewBox="0 0 18 18" width="18" height="18">\
9088															<path d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 
90880-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
9089														</svg>\
9090														<svg class="active" viewBox="0 0 18 18" width="18" height="18">\
9091															<path d="M9 0C4.03 0 0 4.03 0 9c0 4.97 4.03 9 9 9s9-4.03 9-9C18 4.03 13.97 0 9 0zM9 17c-4.41 0-8-3.59-8-8 0-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
9092															<circle cx="9" cy="9" r="6"/>\
9093														</svg>\
9094													</div>\
9095													<span>'+v+'</span>\
9096												</label>\
9097											</div>\
9098											';
9099										});		
9100									}
9101
9102									break;	
9103
9104                                case 'check':
9105                                    if(list_jcolval.length > 0) {
9106                                        $.each(list_jcolval, function(i,v) {
9107											var checked = ((cl_val.indexOf('`') > -1) && (cl_val.indexOf(v.trim()) > -1)) ? 'checked' : (v==cl_val ? 'checked' : '');
9108											cl_type_str += '\
9109												<div class="newcheckbox cl-etc-jcoltype">\
9110													<label>\
9111														<div class="newcheckboxSvg">\
9112															<input type="checkbox" class="form-control cl-common-form-radio-hide cl-etc-input-val cl-s-form-control" id="member-'+ k + '-'+i+'" name="member-'+ k + '" value="'+v+'" '+checked+'>\
9113															<svg viewBox="0 0 16 16" width="16" height="16">\
9114																<path class="st6" d="M3 0h10c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H3c-1.66 0-3-1.34-3-3V3C0 1.34 1.34 0 3 0z"></path>\
9115																<path class="st19" d="M13 1c1.1 0 2 0.9 2 2v10c0 1.1-0.9 2-2 2H3c-1.1 0-2-0.9-2-2V3c0-1.1 0.9-2 2-2H13M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0L13 0z"></path>\
9116															</svg>\
9117															<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
9118																<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
9119																<path class="st19" d="M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0zM13.03 6.03l-5.5 5.5C7.38 11.68 7.19 11.75 7 11.75s-0.38-0.07-0.53-0.22l-3.5-3.5c-0.29-0.29-0.29-0.77 0-1.06s0.77-0.29 1.06 0L7 9.94l4.97-4.97c0.29-0.29 0.77-0.29 1.06 0S13.32 5.74 13.03 6.03z"></path>\
9120															</svg>\
9121														</div>\
9122														<span>'+v+'</span>\
9123													</label>\
9124												</div>\
9125											';
9126                                        });	
9127                                    }
9128                                   
9129                                    break;
9130
9131								case 'fupload':
9132									var fileResult = $.umember.fileurlcreate(cl_val);
9133									var download_link = fileResult.download_link;
9134									var file_data = fileResult.file_data;
9135									cl_type_str += $.umember.fileHtmlRender(k, {
9136										val : file_data || '',
9137										type : "type2",
9138										type2_downlink : download_link,
9139									})
9140
9141									break;
9142                    
9143								default:
9144									cl_type_str += '\
9145									<div class="cl-common-form-wrap nonplace-holder" id="member-'+ k + '">\
9146										<div class="cl-common-form-group '+disabled+'">\
9147											<input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + cl_val + '" ' + disabled + ' name="member-'+ k + '" required="required" ' + prev_val + '>\
9148										</div>\
9149									</div>';
9150									break;
9151							}
9152
9153							list_str += cl_type_str;
9154
9155						} else {
9156							if((cl_type=='select') || (cl_type=='check') || (cl_type=='radio')) {
9157								cl_val =  (cl_val.indexOf('`') > -1) ? cl_val.replace(/`/gi,',') : cl_val;
9158							}
9159							 
9160							if(cl_type=='fupload' && cl_val) {
9161								var templink = $.umember.fileurlcreate(cl_val|| '');
9162
9163								var tempdownicon = '<svg class="file-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M5 19v-3.5h1V18h12v-2.5h1V19H5Zm2.65-7.15.71-.71 3.15 3.15V5h1v9.29l3.15-3.15.71.71-4.35 4.35-4.35-4.35Z"/></svg>'
9164								cl_val = ''
9165								+ '<div class="fupload-cell">'
9166								+   '<span class="file-name">' + templink.file_info.name + '</span>'
9167								+     templink.download_link  // <a href="... " class="file-download-btn" target="_blank">
9168								+       tempdownicon          // <svg ...>
9169								+     '</a>'
9170								+ '</div>';								
9171							}
9172							
9173							list_str += '\
9174								<span id="member-'+ k + '">'
9175									+ cl_val +
9176								'</span>\
9177							';
9178						}
9179						break;
9180				}
9181				list_str += ($.inArray(k,pass_field) > -1) ? '' : '\
9182				</div>\
9183				</div>\
9184				';
9185			});
9186			
9187			var modal_view = (checkViewMode) ? 'readonly' : '',
9188				modal_content = '\
9189			<div class="mng-modal-body info-modal '+modal_view+'" data-uid="' + uid + '" data-list-type="' + list_type + '">\
9190				<div class="form-horizontal">\
9191					' + list_str + '\
9192				</div>\
9193			</div>\
9194			';
9195			if(list_type == 'member-list') {
9196				var closed_txt = (checkViewMode) ? 'close' : 'cancel';
9197				var info_modal = $(this).showModalFlat($.lang[LANG]['manager.member.details.title'], modal_content, true, !checkViewMode, function() {
9198
9199					var info_data = {},
9200						regExp_arr = ['name','nick','email','tel','birth'],
9201						regexp = {
9202							name: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9203							nick: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9204							email: /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
9205							tel: /^[0-9-+]*$/,
9206							birth: /^(19[0-9][0-9]|20\d{2})-(0[0-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/,
9207						},
9208						check_error = false,
9209						slog_more = '',
9210						slog_more_array = {},
9211						etc_Array = [],
9212						etc_i= 0;
9213						
9214					$('.info-modal').find('.form-control:not([disabled])').each(function(i) {
9215						var type = $(this).attr('id').replace(/(member\-)|(\-\d)/gi,''),
9216							type_str = $(this).closest('.form-group').find('.control-label').text(),
9217							error_str = '',
9218							etc_type_arr = etc_Array[type];
9219							
9220                        if($(this).parents('.newcheckbox').hasClass('cl-etc-jcoltype')) {
9221							
9222							if($(this).is(":checked")) {								
9223								val = $(this).val().trim();
9224								var check_jcol_first = false;
9225								if((typeof $(this).parents('.form-group').attr('data-jcolval')=='undefined') || (!$(this).parents('.form-group').attr('data-jcolval'))) {
9226									check_jcol_first = true;
9227									$(this).parents('.form-group').attr('data-jcolval',val);
9228								}
9229
9230								var jcolVal = $(this).parents('.form-group').attr('data-jcolval');
9231								if($(this).parents('.form-group').find('.cl-etc-input-val:checked').length>1 && val && !check_jcol_first) {
9232									val = jcolVal + '`' + val;
9233									val = val.replace(/\`$/gi, ''); 
9234									$(this).parents('.form-group').attr('data-jcolval',val);
9235								} 
9236							} else {
9237								if($(this).parents('.form-group').find('.cl-etc-input-val:checked').length==0) val = '';
9238							}
9239
9240                        } else val = $(this).val().trim();
9241					
9242						if(typeof $(this).parents('.form-group').attr('data-jcolval') != 'undefined' && $(this).parents('.form-group').attr('data-jcolval')) {
9243							val = $(this).parents('.form-group').attr('data-jcolval');
9244						}					
9245
9246						var emoji_val = (type.indexOf('addr') > -1) ? $('#member-addr1').val().trim() + ' ' + $('#member-addr2').val().trim() : val;
9247						if(checkEmojis(emoji_val)) error_str = $.lang[LANG]['config.unable.emoji'];
9248						else {
9249							// if(type == 'addr1') slog_more += type_str+' : '+val;
9250							// else if(type == 'addr2') slog_more += ' '+val+'<br>';
9251							// else slog_more += type_str+' : '+val+'<br>';
9252							
9253							if((val.length == 0 && type != 'email') || regExp_arr.indexOf(type) == -1) {
9254								
9255								if(type == 'addr1') val = $('#member-postcode').val() + ' || ' + val;																
9256								info_data[type] = val;
9257
9258								if(type=='addr2') {
9259									slog_more_array[type_str] = info_data['addr1'] + ' ' + val;
9260								} else slog_more_array[type_str] = val;
9261								
9262								return true;
9263							}
9264							if(!regexp[type].test(val)) {
9265								error_str = $.lang[LANG]['siteum.regexp.check.'+type];
9266								if(val.length == 0 && type == 'email') error_str = $.lang[LANG]['manager.check.required.message'];
9267							} else if(type == 'nick' && (val.length < 1 || val.length > 20)) {
9268								error_str = $.lang[LANG]['siteum.regexp.check.nick'];
9269							} else {
9270								$(this).closest('.form-group').removeClass('has-error');
9271								$(this).parent().find('.mng-error').remove();
9272								info_data[type] = val;
9273								slog_more_array[type_str] = val;								
9274							}
9275
9276							
9277							
9278						}
9279						var this_group = $(this).closest('.form-group');
9280						if(error_str.length > 0) {
9281							var error_icon = '\
9282									<svg class="error-icon" viewBox="0 0 13 13" width="13" height="13">\
9283										<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>\
9284										<rect x="6" y="3" width="1" height="5"/>\
9285										<rect x="6" y="9" width="1" height="1"/>\
9286									</svg>\
9287							';
9288
9289							this_group.addClass('has-error');
9290							if(this_group.find('.mng-error').length > 0 ) this_group.find('.mng-error').html(error_icon + error_str);
9291							else this_group.append('<span class="mng-error">' + error_icon + error_str + '</span>');
9292
9293							if($(this).closest('.form-horizontal').find('.has-error').length == 0) $(this).focus();
9294						}
9295					}).promise().done(function() {
9296						
9297						check_error = ($('.info-modal').find('.has-error').length == 0) ? true : false;
9298						if(!check_error) {
9299							$('.info-modal').find('.has-error').first().find('input').focus();
9300							return false; 
9301						} else {
9302							// deletes 클래스가 있는 파일들 수집
9303							var deletedFiles = [];
9304							$('.info-modal .valueCheck[data-etcidx]').each(function() {
9305								var $inputElement = $(this);
9306								
9307								deletedFiles.push({
9308									file_name: $inputElement.attr('data-file-name'),
9309									etcIdx: $inputElement.attr('data-etcidx'),
9310									id: $inputElement.attr('data-id')
9311								});
9312							});
9313							$.processON();
9314							
9315							$.ajax({
9316								type: 'POST',
9317								url: '/umember/update/type/member',
9318								data: { sid : SID, val: JSON.stringify(info_data), uid : uid ,addrnoupdate : data.umseq,deleted_files: JSON.stringify(deletedFiles)},
9319								dataType: 'json',
9320								async: true,
9321								success: function(data) {
9322										
9323									if(typeof data.error != 'undefined' && data.error) {
9324										$.each(data.error, function(key,str) {
9325											if(info_modal.find('#member-'+key).length > 0 ) {
9326												info_modal.find('#member-'+key).focus();
9327												if(info_modal.find('#member-'+key).closest('.form-group').find('.mng-error').length > 0) info_modal.find('#member-'+key).closest('.form-group').find('.mng-error').text(str);
9328												else info_modal.find('#member-'+key).closest('.form-group').append('<span class="mng-error">' + str + '</span>');
9329											} else { alert(str); return false; }
9330										});
9331										$.processOFF();
9332
9333										if(info_modal.find('.mng-error').length > 0) return false;
9334									}
9335									$.processOFF(); // 성공 시에도 processOFF 호출
9336
9337									slog_more += '\
9338									<div class="slog-jcol-wrap">\
9339										<ul class="slog-jcol-ul">\
9340										';
9341										$.each(slog_more_array, function(key,v){
9342											v = (v.indexOf('`')>-1) ? v.replace(/`/gi,', ') : v;					
9343											slog_more += '\
9344											<li class="slog-jcol-li">\
9345												<div class="slog-jcol-title">'+key+'</div>\
9346												<div class="slog-jcol-contents">'+v+'</div>\
9347											</li>\
9348											';
9349										});
9350					
9351									slog_more += '\
9352											</ul>\
9353										</div>\
9354									';
9355
9356									//console.log(slog_more);
9357									setSiteLogs('um.edit','info',{'id':uid,'more':slog_more},'um.list');
9358
9359									info_modal.find('.mng-error').remove();									
9360									info_data.addr = info_data.addr1+' '+info_data.addr2;
9361									console.log(info_data);
9362									$.each(info_data, function(k, v) {
9363										if(k == 'gender') {
9364											v = (v == '01')? '남':'여';
9365										}
9366										$('.mng-list table tr[data-uid="' + uid + '"]').find('.'+k).text(v);
9367									});
9368
9369									info_modal.modal('hide');
9370								},
9371								error: function(xhr, status, error) {
9372									console.error('AJAX 요청 실패:', error);
9373									$.processOFF(); // 에러 시에도 processOFF 호출
9374								}
9375							});
9376						}
9377
9378					});
9379
9380				}, closed_txt, 'save', 'memberinfo-modal cl-cmmodal cl-s-btn cover', true, '', function() {
9381					
9382					var regexp = {
9383							name: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9384							nick: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9385							email: /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
9386							tel: /^[0-9-+]*$/,
9387							birth: /^(19[0-9][0-9]|20\d{2})-(0[0-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/,
9388						};
9389
9390					var info_recheck_regexp = function(input,event_type) {
9391						var type = $(input).attr('id').replace(/member-/i,''),
9392							val = $(input).val().trim(),
9393							emoji_val = (type.indexOf('addr') > -1) ? $('#member-addr1').val().trim() + ' ' + $('#member-addr2').val().trim() : '',
9394							error_str = '';
9395
9396						if(checkEmojis(emoji_val)) error_str = $.lang[LANG]['config.unable.emoji'];
9397						else if(regexp.hasOwnProperty(type)) {
9398							if(!regexp[type].test(val)) error_str = $.lang[LANG]['siteum.regexp.check.'+type];
9399							else {
9400								var checkDuplicate = (	event_type == 'blur' &&
9401														$.inArray(type, ['email','nick']) > -1 &&
9402														typeof $(input).attr('data-prev') != 'undefined' && 
9403														$(input).attr('data-prev').trim().toLowerCase() != val.toLowerCase()
9404													) ? true : false;
9405								if(type == 'email' && $('input#member-id').val().trim().toLowerCase() == val.toLowerCase()) checkDuplicate = false;
9406								else if(type == 'nick' && ($('input#member-nick').val().trim().length < 1 || $('input#member-nick').val().trim().length > 20)) {
9407									checkDuplicate = false;
9408									error_str = $.lang[LANG]['siteum.regexp.check.nick'];
9409								}
9410								if(checkDuplicate) {
9411									var splan = (typeof VALIDTYPE != 'undefined' && VALIDTYPE) ? VALIDTYPE : '';
9412									$.post('/umember/join/used_check', { sid : SID, field : type, data : val, splan : splan }, function(check_result) {
9413										if(typeof check_result.error != 'undefined' && check_result.error) {
9414											error_str = check_result.error;
9415										}
9416									}, 'json');
9417								}
9418							}
9419						}
9420
9421							
9422						if(error_str.length > 0) {
9423							var error_html = '<span class="mng-error">\
9424									<svg class="error-icon" viewBox="0 0 13 13" width="13" height="13">\
9425										<path d="M6.5 0C2.91 0 0 2.91 0 6.5S2.91 13 6.5 13 13 10.09 13 6.5 10.09 0 6.5 0zM6.5 12C3.47 12 1 9.53 1 6.5S3.47 1 6.5 1 12 3.47 12 6.5 9.53 12 6.5 12z"/>\
9426										<rect x="6" y="3" width="1" height="5"/>\
9427										<rect x="6" y="9" width="1" height="1"/>\
9428									</svg>' + error_str + '</span>\
9429							';
9430
9431							$(input).closest('.form-group').addClass('has-error');
9432							if($(input).closest('.form-group').find('.mng-error').length > 0) $(input).closest('.form-group').find('.mng-error').replaceWith(error_html);
9433							else $(input).closest('.form-group').append(error_html);
9434						} else {
9435							$(input).closest('.form-group').removeClass('has-error').find('.mng-error').remove();
9436						}
9437					}
9438
9439					$('.info-modal .form-control').live({
9440						keyup : function(e) { info_recheck_regexp($(this),'keyup');	},
9441						blur  : function(e) { info_recheck_regexp($(this),'blur');	}
9442					});
9443
9444				});
9445
9446
9447				$('#member-memo').live('keyup', function() {
9448					var str = $(this).val();
9449					if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
9450					$(this).next('label').find('.write-count').text(str.length);
9451					if(str.length > 1000) {
9452						$(this).val($(this).val().substring(0, 1000));
9453					}
9454				});
9455				if(no_active_btn) $('.memberinfo-modal.cl-cmmodal .ok-button-dialog.btn-sm').addClass(no_active_btn);
9456			} else { // only show__
9457				var info_modal = $(this).showModalFlat($.lang[LANG]['manager.member.details.title'], modal_content, true, false, '', 'ok', '', 'member-waitlist cl-cmmodal cl-s-btn cover');
9458				if(no_active_btn) $('.member-waitlist.cl-cmmodal .ok-button-dialog.btn-sm').addClass(no_active_btn);
9459			}
9460
9461
9462		}, 'json');
9463
9464	});
9465
9466	/***************************************************************************************************************************************member-list page END*/
9467
9468
9469
9470
9471
9472	/*********************************************************************************************************************************member-waitlist page START*/
9473	$('.approval-btn, .deny-btn').live('click', function() {
9474		if($(this).hasClass('member_disabled')) {
9475			siteNotice('manager');
9476			return false;
9477		}
9478		var position = $(this).closest('td'),
9479			uno = $(this).closest('tr').attr('data-uno'),
9480			uid = $(this).closest('tr').attr('data-uid'),
9481			result = ($(this).hasClass('approval-btn')) ? 'hand' : 'deny',
9482			wait_cnt = parseInt($(this).closest('.mng-wrap').find('.wait-count').text()),
9483			isDeny = $(this).hasClass('deny-btn') ? true : false,
9484			applyhtml = '';
9485
9486		if(isDeny) $(this).parents('tr[data-uno="'+uno+'"]').find('.member-info').addClass('hide');
9487
9488		$.post('/umember/update/type/approval', { sid : SID, val : result, uid : uid, uno : uno }, function(data) {
9489			if(typeof data.error != 'undefined' && data.error) {
9490				alert(data.error);
9491				return false;
9492			}
9493			
9494			applyhtml += '\
9495						<span>'+$.lang[LANG]['manager.wait-list.approval.'+result]+'</span>\
9496						<span>('+data.result.um_approvaldate+')</span>\
9497						';
9498			$('.mng-settings[data-type="member-waitlist"]').find('.wait-count').text(wait_cnt-1);
9499			position.html(applyhtml).addClass('approval-status');
9500		}, 'json');
9501
9502	});
9503	/***********************************************************************************************************************************member-waitlist page END*/
9504
9505	/********************************************************************************************************************************member-blocklist page START*/
9506	
9507	$('.block-add-btn').live('click', function() {
9508		if($(this).hasClass('member_disabled')) {
9509			siteNotice('manager');
9510			return false;
9511		}
9512		var mng_settings_el = $(this).closest('.mng-settings'),
9513			add_content = '\
9514			<div class="form-row">\
9515				<div class="form-inline clearfix">\
9516					<div class="form-group col-sm-5">\
9517						<select id="block-type" class="form-control" name="block-type" placeholder="Search">\
9518							<option value="id">회원 아이디</option>\
9519							<option value="ip">IP</option>\
9520						</select>\
9521					</div>\
9522					<div class="form-group col-sm-7"><input class="form-control" type="text" id="block-data"/></div>\
9523				</div>\
9524			</div>\
9525		';
9526
9527		var modal = $(this).showModalFlat('Block data add', add_content, true, true, function() {
9528			var key = modal.find('#block-type').val(),
9529				val = modal.find('#block-data').val().trim(),
9530				regExp_ip = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/gi;
9531
9532			if(key === null) {
9533				modal.find('#block-type').click();
9534				return false;
9535			} else if(modal.find('.error').length > 0) {
9536				modal.find('#block-data').focus();
9537				return false;
9538			} else if (modal.find('#block-data').val().trim().length == 0) {
9539				modal.find('#block-data').focus();
9540				modal.find('#block-data').parent().append('<span class="error">내용을 입력하세요</span>');
9541				return false;
9542			} else if (key == 'ip' && !regExp_ip.test(val)) {
9543				modal.find('#block-data').focus();
9544				modal.find('#block-data').parent().append('<span class="error">ip 형식이 올바르지 않습니다.</span>');
9545				return false;
9546			}
9547
9548				$.ajax({
9549					type: 'POST',
9550					url: '/umember/set/type/block',
9551					data: { sid : SID, key : key, val : val },
9552					dataType: 'json',
9553					async: true,
9554					success: function(data) {
9555
9556						if(typeof data.error != 'undefined' && data.error) {
9557							if(modal.find('.error').length == 0) modal.find('#block-data').focus().parent().append('<span class="error">' + data.error + '</span>');
9558							else modal.find('#block-data').focus().next('.error').text(data.error);
9559							return false;
9560						} else {
9561							modal.modal('hide');
9562							window.location.reload();
9563						}
9564
9565					}
9566				});
9567
9568
9569		}, 'cancel','save', 'block-add-modal');
9570
9571		$('#block-data').live({
9572			keyup: function() {
9573				$(this).parent().find('.error').remove();
9574			}
9575		});
9576
9577
9578	});
9579
9580	$('.block-clear-btn').live('click', function() {
9581		if($(this).hasClass('member_disabled')) {
9582			siteNotice('manager');
9583			return false;
9584		}
9585		var block_type = $(this).closest('tr').find('.type').attr('data-type'),
9586			block_val = $(this).closest('tr').find('.val').text().trim(),
9587			block_id = $(this).closest('tr').find('.id').text().trim(),
9588			block_data = $(this).closest('tr').attr('data-id'),
9589			is_uadmin = $(this).parents('.mng-member').attr('data-uadmin');
9590
9591		if(block_data == 0) return false;
9592		else {
9593			var modal_content = '\
9594				<div class="mng-modal-body clear-modal">\
9595					<p class="addressee-wrap">\
9596						'  + $.lang[LANG]['manager.block-list.block.clear.txt.1'] + '\
9597						<span class="addressee-name">' + block_id + '</span> \
9598						' + $.lang[LANG]['manager.block-list.block.clear.txt.2'] + '\
9599					</p>\
9600				</div>\
9601				';	
9602
9603			var modal = $(this).showModalFlat($.lang[LANG]['manager.block-list.block.clear.title'], modal_content, true, true, function() {
9604
9605				$.ajax({
9606					type: 'POST',
9607					url: '/umember/delete/type/block',
9608					data: { sid : SID, val : block_data, block_type : block_type, block_val : block_val },
9609					async: true,
9610					success: function(data) {
9611						if(typeof data.error != 'undefined' && data.error) {
9612							alert(data.error);
9613							return false;
9614						} else {
9615							var cntTr = $(this).parents('table').length;
9616
9617							if(cntTr > 0) window.location.reload();
9618							else location.href = is_uadmin+'/member/blocklist';							
9619						}
9620					}
9621				});
9622
9623			},'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
9624
9625		}
9626
9627	});
9628
9629	/**********************************************************************************************************************************member-blocklist page END*/
9630
9631
9632	/********************************************************************************************************************************member-leavelist page START*/
9633	$('.leavelist .mng-selectboxlist select.form-control').live('change',function() {
9634		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/leavelist' : '/manager/member/leavelist',
9635			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
9636			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
9637			stx =  $(this).parents('.mng-list').find('.mng-search-box').find('#stx').val();
9638
9639		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view);
9640	});
9641
9642	$('.leavelist .mng-search-box .search-btn').live('click',function(e) {
9643		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/leavelist' : '/manager/member/leavelist',
9644			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
9645			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
9646			stx =  $(this).parents('.mng-search-box').find('#stx').val();
9647
9648		if(checkEmojis(stx)) {
9649			e.preventDefault();
9650			errorEmojisModal();
9651			return false;
9652		}
9653
9654		setSiteLogs('um.leavelist','search',{'stx':stx},'um.leavelist');
9655
9656		if(stx.length > 0) stx = '/stx/'+stx;
9657		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+stx);
9658	});
9659
9660	function escapeHtml(str) {
9661		return str
9662			.replace(/&/g, '&amp;')
9663			.replace(/"/g, '&quot;')
9664			.replace(/'/g, '&#39;')
9665			.replace(/</g, '&lt;')
9666			.replace(/>/g, '&gt;');
9667	}
9668	/**********************************************************************************************************************************member-leavelist page END*/
9669
9670
9671	/****************************************************************************************************************************************Mypage Modal START*/	
9672	$('.my-cl-edit').live({
9673		click: function() {
9674			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap'),
9675				sid = $('#mypage-modal').attr('data-sid'),
9676				uid = $('#mypage-modal').attr('data-uid');
9677
9678			var clInput = function(type, value) {
9679				if(type == 'id') return;
9680				var str = '\
9681						<div class="input-group my-cl-update-wrap">\
9682				';
9683
9684				$.each(value, function(i,v) {
9685
9686					if(type == 'addr') {
9687						var plan_type = (typeof property != 'undefined' && property) ? property.VALIDTYPE : VALIDTYPE,
9688							checkSM = (typeof plan_type != 'undefined' && (plan_type == 'SM' || plan_type == 'SHOPPING')) ? true : false,
9689							usedAddrSearchModal = (checkSM && i==1) ? 'readonly onclick="addrSearchModal(\'my-input\')"' : '';
9690							field_name = (i == 0) ? 'postcode' : type + i,
9691							hide_class = (i == 0) ? 'hide' : '';
9692
9693						str += '\
9694								<input type="text" id="my-input-'+field_name+'" class="my-cl-update form-control ' + hide_class + '" placeholder="' + $.lang[LANG]['manager.join.cl.item.name.enter'] + '" value="' + v + '" data-type="' + type + '"/ ' + usedAddrSearchModal + '>\
9695						';
9696					} else {
9697						str += '\
9698								<input type="text" id="my-input-'+type+'" class="my-cl-update form-control" placeholder="' + $.lang[LANG]['manager.join.cl.item.name.enter'] + '" value="' + v + '" data-type="' + type + '"/>\
9699						';
9700					}
9701
9702				});
9703				str += '\
9704						</div>\
9705				';
9706				return str;
9707			}
9708			$(this).hide();
9709			cl.find('.my-cl-cancel,.my-cl-save').show();
9710			cl.addClass('update-mode');
9711			cl.children().each(function() {
9712				var type = $(this).attr('data-type'),
9713					value = $(this).find('.my-data').map(function() { return $(this).text().trim(); }).get(),
9714					input_text = clInput(type,value);
9715
9716				if(type != 'id') $(input_text).prependTo($(this).find('.mng-panel-body'));
9717				if(cl.children('.focus').length == 0) $(this).addClass('focus').find('input').focus();
9718			});
9719
9720
9721
9722		}
9723	});
9724
9725	$('.my-cl-cancel').live({
9726		click: function() {
9727			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap');
9728
9729			cl.find('.mng-error').remove();
9730			cl.find('.my-cl-cancel,.my-cl-save').hide();
9731			cl.find('.my-cl-edit').show();
9732			cl.removeClass('update-mode');
9733			cl.children().each(function() {
9734				$(this).find('.my-cl-update-wrap').remove();
9735			});
9736		}
9737	});
9738
9739	$('.my-cl-save').live({
9740		click: function() {
9741			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap'),
9742				sid = $('#mypage-modal').attr('data-sid'),
9743				uid = $('#mypage-modal').attr('data-uid'),
9744				cl_data = {},
9745				check_error = false;
9746
9747			if(cl.find('.has-error').length > 0) cl.find('.has-error').addClass('foucs').find('.my-cl-update').first().focus();
9748
9749			var recheck_regexp = function(input) {
9750				var field = input.attr('data-type'),
9751					val = input.val(),
9752					reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
9753					reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
9754					reg = new RegExp(reg_pattern),
9755					reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
9756
9757				if(reg_has && !reg.test(val)) {
9758					input.closest('.mng-panel-body').find('.mng-error').text(reg_ex);
9759				} else {
9760					input.closest('.mng-panel').removeClass('has-error').find('.mng-error').remove();
9761				}
9762			}
9763
9764			$('#mypage-modal .mng-settings[data-type="profile"] .my-cl-update').live({
9765				focus: function(e) { $(this).closest('.mng-panel').addClass('focus').siblings().removeClass('foucs'); },
9766				keyup : function(e) { recheck_regexp($(this)); },
9767				blur  : function(e) { $(this).closest('.mng-panel').removeClass('focus'); }
9768			});
9769
9770			cl.children('.mng-panel:not([data-type="id"])').each(function() {
9771				var field = $(this).attr('data-type'),
9772					optional = $(this).hasClass('optional') ? true : false,
9773					value = $(this).find('.my-cl-update').map(function() { return $(this).val().trim(); }).get(),
9774					this_cl = $(this),
9775					// prev_value = $(this).find('.my-data').map(function() { return $(this).text().trim(); }).get(),
9776					error_str = '',
9777					reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
9778					reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
9779					reg = new RegExp(reg_pattern),
9780					reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
9781
9782				$.each(value, function(i,v) {
9783
9784					if(field == 'addr' && i == 0) return true;
9785
9786					var field_name = (field == 'addr') ? field + i : field,
9787						this_wrap = this_cl.find('.mng-panel-body'); 
9788
9789					if(optional && v.length==0 && i==0) error_str = $.lang[LANG]['manager.check.required.message'];
9790					else if(reg_has && !reg.test(v)) {
9791						error_str = (v.length == 0 && !optional) ? '' : COLLECTION_REGEX[field]['error'];
9792					}
9793					
9794					if(error_str.length > 0)  {
9795						this_cl.addClass('has-error');
9796						if(this_wrap.find('.mng-error').length > 0) this_wrap.find('.mng-error').text(error_str);
9797						else this_wrap.append('<span class="mng-error">' + error_str + '</span>');
9798
9799						if(cl.find('.mng-panel.focus').length == 0) this_cl.find('.my-input-'+field_name).focus();
9800					} else {
9801						this_cl.removeClass('has-error');
9802						this_wrap.find('.mng-error').remove();
9803
9804						if(field == 'addr' && i == 1) {
9805							var postcode = $('#my-input-postcode').val();
9806							v = (typeof postcode != 'undefined' && postcode) ? postcode.trim() + '|| ' + v : ' || ' + v;
9807						}
9808
9809						cl_data[field_name] = v;
9810					}
9811				});
9812			}).promise().done(function() {
9813				var check_error = (cl.find('.has-error').length == 0) ? true : false;
9814
9815				if(!check_error) {
9816					cl.find('.has-error').first().first('input').focus();
9817				} else {
9818					$.ajax({
9819						type: 'POST',
9820						url: '/umember/update/type/member',
9821						data: { sid : sid, val: JSON.stringify(cl_data), uid : uid },
9822						dataType: 'json',
9823						async: true,
9824						success: function(data) {
9825							// if(typeof data.error != 'undefined' && data.error) {
9826							// 	alert(data.error);
9827							// 	return false;
9828							// }
9829							if(typeof data.error != 'undefined' && data.error) {
9830								$.each(data.error, function(key,str) {
9831									if(cl.find('#my-input-'+key).length > 0 ) {
9832										cl.find('#my-input-'+key).focus();
9833										cl.find('#my-input-'+key).closest('.mng-panel-body').append('<span class="mng-error">' + str + '</span>');
9834									} else { alert(str); return false; }
9835								});
9836								if(cl.find('.mng-error').length > 0) return false;
9837							}
9838							cl.find('.mng-error').remove();
9839
9840							cl.find('.my-cl-cancel,.my-cl-save').hide();
9841							cl.find('.my-cl-edit').show();
9842							cl.removeClass('update-mode');
9843							$.each(cl_data,function(k,v) {
9844
9845								if(k == 'addr1') {
9846									var addr_arr = v.split('||'),
9847										postcode_str = (addr_arr[0]) ? addr_arr[0].trim() : '';
9848									cl.find('.my-postcode').text(postcode_str);
9849									v = (addr_arr[1]) ? addr_arr[1].trim() : '';
9850								}
9851
9852								cl.find('.my-'+k).text(v);
9853
9854								if(k == 'nick') {
9855									if($('._admin_dashboard .site-info .site-data .site-username').length > 0) {
9856										$('._admin_dashboard .site-info .site-data .site-username').text(v).attr('data-user-name',v);
9857									}
9858									if($('#mobile-nav').length > 0) $('#mobile-nav .login-nick span').text(v);
9859								}
9860							});
9861							cl.find('.my-cl-update-wrap').remove();
9862						}
9863					});
9864				}
9865
9866			});
9867
9868
9869		}
9870	});
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881	$('.mng-siteUM-modal .my-image-edit').live({
9882		click: function() {
9883			var sid = $('#mypage-modal').attr('data-sid'),
9884				uid = $('#mypage-modal').attr('data-uid'),
9885				src = $('.mng-settings[data-type="profile"]').find('.my-image').attr('src');
9886
9887			$.umember.showMyImageUploadModal(sid, uid, src);
9888		}
9889	});
9890
9891
9892	$('.mng-siteUM-modal .my-password-save').live({
9893		click: function() {
9894			var mypageModal = $('#mypage-modal'),
9895				myPasswordWrap = mypageModal.find('.mng-settings[data-type="password-change"]'),
9896				mng_settings_el = $(this).closest('.mng-settings');
9897
9898			myPasswordWrap.find('input.form-control').each(function() {
9899				var field = $(this).attr('id').trim().replace(/input-/,''),
9900					val = $(this).val(),
9901					errorEL = $(this).next('.mng-error'),
9902					error_str = '',
9903					reg_has = (field != 'new-password-checked') ? true : false,
9904					reg_pattern = (reg_has) ? COLLECTION_REGEX['password']['pattern_j'] : '',
9905					reg = new RegExp(reg_pattern),
9906					reg_error = (reg_has) ? COLLECTION_REGEX['password']['error'] : '';
9907
9908				if(val.length == 0) error_str = $.lang[LANG]['siteum.regexp.password.input'];
9909				else {
9910					if(reg_has && !reg.test($(this).val()) ) error_str = reg_error;
9911					else if( field == 'new-password-checked' && ($(this).val() != myPasswordWrap.find('#input-new-password').val())) error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
9912				}
9913
9914				if(error_str.length > 0) {
9915					if(errorEL.length > 0 ) errorEL.addClass('empty').text(error_str);
9916					else $(this).after('<span class="mng-error empty">'+ $.lang[LANG]['siteum.regexp.password.input'] + '</span>');
9917
9918					if(myPasswordWrap.find('.mng-panel-body.focus').length == 0) $(this).focus();
9919					else { myPasswordWrap.find('.mng-panel-body.focus input').focus(); }
9920				} else {
9921					errorEL.remove();
9922					$(this).closest('.mng-panel-body').removeClass('focus');
9923				} 
9924			});
9925
9926
9927			if(myPasswordWrap.find('.mng-error').length == 0) {
9928				var uid = mypageModal.find('.my-id').text(),
9929					pw = hex_md5(myPasswordWrap.find('#input-password').val()),
9930					new_pw = hex_md5(myPasswordWrap.find('#input-new-password').val());
9931
9932				$.post('/umember/password/change', { uid : uid, pw : pw, new_pw : new_pw }, function(data) {
9933					if(typeof data.error != 'undefined' && data.error) {
9934						$.each(data.error, function(key,str) {
9935							if(mypageModal.find('#input-'+key).length > 0) {
9936								mypageModal.find('#input-'+key).closest('.mng-panel-body').append('<span class="mng-error">' + str + '</span>');
9937								mypageModal.find('#input-'+key).focus();
9938							} else { alert(str,'/manager/member'); return false; }
9939						});
9940						if(mypageModal.find('.mng-error').length > 0) return false;
9941					}
9942					mypageModal.find('input.form-control').val('');
9943					mngShowToast('check', $.lang[LANG]['siteum.forgot.pw.success'], mng_settings_el);
9944
9945				}, 'json');
9946			}
9947
9948
9949
9950
9951		}
9952	});
9953
9954	$('.mng-siteUM-modal .mng-settings[data-type="password-change"] input.form-control').live({
9955		focus: function() {
9956			$(this).closest('.mng-panel-body').addClass('focus').siblings().removeClass('focus');
9957		}, 
9958		blur: function() {
9959			$(this).closest('.mng-panel-body').removeClass('focus');
9960		},
9961		keyup: function() {
9962
9963			var field = $(this).attr('id').trim().replace(/input-/,''),
9964				groupEl = $(this).closest('.mng-panel-body'),
9965				errorEL = $(this).next('.mng-error'),
9966				reg_pw = (field == 'new-password-checked') ? field : 'password',
9967				reg_has = (typeof COLLECTION_REGEX[reg_pw] != 'undefined' && COLLECTION_REGEX[reg_pw]) ? true : false,
9968				reg_pattern = (reg_has) ? COLLECTION_REGEX[reg_pw]['pattern_j'] : '',
9969				reg_ex = (reg_has) ? COLLECTION_REGEX[reg_pw]['ex'] : '';
9970
9971			if(field == 'new-password' || field == 'new-password-checked') {
9972				var pwEl = $('.mng-settings[data-type="password-change"]').find('#input-new-password'),
9973					pw2El = $('.mng-settings[data-type="password-change"]').find('#input-new-password-checked'),
9974					error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
9975
9976				if(pwEl.val() == pw2El.val()) { 
9977					pw2El.next('.mng-error').remove();
9978				} else {
9979					if(pw2El.val().length > 0) {
9980						if(pw2El.next('.mng-error').length > 0) pw2El.next('.mng-error').removeClass('empty').text(error_str);
9981						else pw2El.closest('.mng-panel-body').append('<span class="mng-error">'+ error_str + '</span>');
9982					}
9983				}
9984
9985			}
9986
9987			if(reg_has && errorEL.length > 0) { 
9988				var reg = new RegExp(reg_pattern);
9989				if(reg.test($(this).val())) errorEL.remove();
9990				else { errorEL.removeClass('empty').text(reg_ex); }
9991			}
9992
9993		}
9994	});
9995
9996	$('.mng-siteUM-modal .my-account-remove').live({
9997		click: function() {
9998			var sid = $('#mypage-modal').attr('data-sid'),
9999				uid = $('#mypage-modal').attr('data-uid');
10000
10001			var content = '\
10002				<div class="mng-in-flat-modal-wrap">\
10003					<div class="my-account-remove-info text-left">\
10004						<strong>' + $.lang[LANG]['manager.mypage.my-remove.txt.1'] + '</strong>\
10005						<ol>\
10006							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.2'] + '</li>\
10007							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.3'] + '</li>\
10008							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.4'] + '</li>\
10009						</ol>\
10010					</div>\
10011					<div class="my-account-remove-check clearfix">\
10012						<div class="checkboxs hand">\
10013							<input type="checkbox" class="my-account-remove-agree" id="my-account-remove-agree">\
10014							<strong>' + $.lang[LANG]['manager.mypage.my-remove.agree.txt'] + '</strong>\
10015						</div>\
10016					</div>\
10017				</div>\
10018			';
10019
10020			$('.my-account-remove-agree').live({
10021				click: function() {
10022					if($(this).prop('checked')) $(this).closest('.my-account-remove-check').find('.mng-error').remove();
10023				}
10024			});
10025
10026			$('.my-account-remove-input-password').live({
10027				keyup: function() {
10028					if($(this).val().length > 0) $(this).closest('.form-group').find('.mng-error').remove();
10029				}
10030			});
10031
10032			var agreeModal = $(this).showModalFlat('DELETE ACCOUNT', content, true, true, function() {
10033				var checked = agreeModal.find('#my-account-remove-agree').prop('checked'),
10034					errorEL = agreeModal.find('.my-account-remove-check').find('.mng-error'),
10035					error_str = (!checked) ? $.lang[LANG]['manager.mypage.my-remove.agree.check'] : '';
10036
10037				if(!checked) {
10038					if(errorEL.length > 0) errorEL.text(error_str);
10039					else $('.my-account-remove-check').append('<span class="mng-error">' + error_str + '</span>');
10040					return false;
10041				}
10042
10043				var udata_content = '\
10044					<div class="mng-in-flat-modal-wrap padding-top-0">\
10045						<p style="margin-bottom: 15px;">' + $.lang[LANG]['manager.mypage.my-remove.description'] + '</p>\
10046						<span class="form-group">\
10047							<input class="form-control" type="password" id="input-password" placeholder="' + $.lang[LANG]['siteum.regexp.password.input'] + '">\
10048						</span>\
10049					</div>\
10050				';
10051
10052				var removeModal = $(this).showModalFlat('DELETE ACCOUNT', udata_content, true, true, function() {
10053					var pw = removeModal.find('#input-password').val();
10054
10055					if(pw.length == 0) {
10056						if(removeModal.find('.mng-error').length > 0) removeModal.find('.mng-error').text($.lang[LANG]["siteum.regexp.password.input"]);
10057						else removeModal.find('.form-group').append('<span class="mng-error">' + $.lang[LANG]["siteum.regexp.password.input"] + '</span>');
10058
10059						removeModal.find('#input-password').focus();
10060						return false;
10061					} else {
10062						$.processON('Deleting....');
10063						var remove_data = {
10064							'id' : uid,
10065							'password' : hex_md5(pw),
10066						};
10067
10068						removeModal.find('.mng-error').remove();
10069						$.post('/umember/login/remove', { data : JSON.stringify(remove_data) }, function(data) {
10070							if(typeof data.error != 'undefined' && data.error) {
10071								$.processOFF();
10072								$.each(data.error, function(key,str) {
10073									if(removeModal.find('#input-'+key).length > 0 ) {
10074										removeModal.find('#input-'+key).closest('.form-group').append('<span class="mng-error">' + str + '</span>');
10075										removeModal.find('#input-'+key).focus();
10076									} else { alert(str); return false; }
10077								});
10078								if(removeModal.find('.mng-error').length > 0) return false;
10079							}
10080
10081							removeModal.modal('hide');
10082							agreeModal.modal('hide');
10083							$('#mypage-modal').modal('hide');
10084							$.umember.init();
10085							setTimeout(function() {
10086								$.processOFF();
10087								var successModal = $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.mypage.my-remove.success'], true, false, '', 'ok');
10088							}, '1000');
10089
10090						}, 'json');
10091					}
10092
10093					
10094				}, 'cancel', 'manager.mypage.my-remove.last-btn', 'mng-mypage-modal'); /*removeModal:: END*/
10095
10096
10097
10098			}, 'cancel', '', 'w480 mng-mypage-modal'); /*agreeModal:: END*/
10099
10100
10101		}
10102	});
10103
10104
10105	
10106
10107	/******************************************************************************************************************************************Mypage Modal END*/
10108
10109});
10110
10111// psearch 모바일 탭 좌우 그라데이션 추가 ***********************************************************************************************************************
10112document.addEventListener('DOMContentLoaded', () => {
10113	const wrap = document.querySelector('.dsgn-body .psearch-body .psearch-tabs');
10114	const nav  = wrap && wrap.querySelector('.dsgn-body .psearch-body .psearch-tab-nav, .psearch-tab-nav');
10115	if (!wrap || !nav) return;
10116
10117	const MOBILE_MQ = window.matchMedia('(max-width: 767px)');
10118	const isOverflowing = () => nav.scrollWidth > nav.clientWidth + 1;
10119
10120	/* =========================
10121	   1) 모바일 그라데이션(페이드)
10122	========================= */
10123	const updateFade = () => {
10124		const max = nav.scrollWidth - nav.clientWidth;
10125
10126		if (!MOBILE_MQ.matches || max <= 1) {
10127			wrap.classList.remove('has-left', 'has-right');
10128			return;
10129		}
10130
10131		wrap.classList.toggle('has-left', nav.scrollLeft > 1);
10132		wrap.classList.toggle('has-right', nav.scrollLeft < max - 1);
10133	};
10134
10135	nav.addEventListener('scroll', updateFade, { passive: true });
10136	window.addEventListener('resize', updateFade);
10137	MOBILE_MQ.addEventListener?.('change', updateFade);
10138	requestAnimationFrame(() => requestAnimationFrame(updateFade));
10139
10140
10141	/* =========================
10142	   2) PC(마우스) 드래그 스크롤 (클릭 살리는 버전)
10143	   - threshold 이상 움직였을 때만 drag로 전환
10144	   - 그때만 setPointerCapture + preventDefault
10145	========================= */
10146	const DRAG_THRESHOLD = 6;
10147
10148	let pointerId = null;
10149	let down = false;
10150	let dragging = false;
10151	let startX = 0;
10152	let startLeft = 0;
10153	let moved = 0;
10154	let suppressClick = false;
10155
10156	nav.addEventListener('pointerdown', (e) => {
10157		if (e.pointerType !== 'mouse') return;
10158		if (!isOverflowing()) return;
10159		if (e.button !== 0) return;
10160
10161		down = true;
10162		dragging = false;
10163		suppressClick = false;
10164		moved = 0;
10165
10166		pointerId = e.pointerId;
10167		startX = e.clientX;
10168		startLeft = nav.scrollLeft;
10169	});
10170
10171	nav.addEventListener('pointermove', (e) => {
10172		if (!down) return;
10173		if (e.pointerId !== pointerId) return;
10174
10175		const dx = e.clientX - startX;
10176		moved = Math.max(moved, Math.abs(dx));
10177
10178		// threshold 넘어가는 순간 드래그 모드로 전환
10179		if (!dragging && moved >= DRAG_THRESHOLD) {
10180			dragging = true;
10181			suppressClick = true;
10182			nav.classList.add('is-dragging');
10183			nav.setPointerCapture?.(pointerId);
10184		}
10185
10186		if (dragging) {
10187			nav.scrollLeft = startLeft - dx;
10188			e.preventDefault(); // 드래그 중에만 텍스트 선택 방지
10189			updateFade();
10190		}
10191	});
10192
10193	const endPointer = () => {
10194		if (!down) return;
10195		down = false;
10196
10197		if (dragging) {
10198			nav.classList.remove('is-dragging');
10199		}
10200
10201		dragging = false;
10202		pointerId = null;
10203
10204		// 드래그 직후 클릭 1회만 막고 다음 클릭은 정상
10205		if (suppressClick) {
10206			setTimeout(() => { suppressClick = false; }, 0);
10207		}
10208	};
10209
10210	nav.addEventListener('pointerup', endPointer);
10211	nav.addEventListener('pointercancel', endPointer);
10212	window.addEventListener('blur', endPointer);
10213
10214	// 진짜 드래그였던 경우에만 클릭 차단
10215	nav.addEventListener('click', (e) => {
10216		if (suppressClick) {
10217			e.preventDefault();
10218			e.stopPropagation();
10219		}
10220	}, true);
10221
10222
10223	/* =========================
10224	   3) 동적 배경색 → 그라데이션 색 자동 추출
10225	========================= */
10226	const applyDynamicBg = () => {
10227		const bg = getComputedStyle(wrap).backgroundColor;
10228
10229		if (bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent') {
10230			let parent = wrap.parentElement;
10231			while (parent) {
10232				const parentBg = getComputedStyle(parent).backgroundColor;
10233				if (parentBg !== 'rgba(0, 0, 0, 0)' && parentBg !== 'transparent') {
10234					wrap.style.setProperty('--tab-bg', parentBg);
10235					return;
10236				}
10237				parent = parent.parentElement;
10238			}
10239		} else {
10240			wrap.style.setProperty('--tab-bg', bg);
10241		}
10242	};
10243
10244	applyDynamicBg();
10245	window.addEventListener('resize', applyDynamicBg);
10246});
10247// psearch 모바일 탭 좌우 그라데이션 추가 end ****************************************************************************************************************
10248
10249/***********************************************************************************************************************************member-config page START*/
10250var collectionSortable = function(cancel) {
10251	cancel = (cancel) ? cancel : '.collection-item.fix[data-type="email"], .collection-item-used, .collection-item-optional, .collection-name-input, button, .collection-edit, .collection-delete, label, .collection-item-type-select';
10252
10253	$('#join-collections,#mjoin-collections').sortable({
10254		items: '.collection-item:not(.fix[data-type="email"])',
10255		handle: '.icon-move',
10256		cancel: cancel,
10257		scroll: true,
10258		placeholder: 'collection-item-placeholder',
10259		update: function(event,ui) {
10260			$.processON();
10261
10262			var update_data = {},
10263				new_data = {},
10264				d_index = 0;
10265			
10266			$('#join-collections').children('.collection-item').each(function(i,v){
10267				var org_idx = $(this).attr('data-idx'),
10268					new_idx = $(this).index(),
10269					item_seq = $(this).attr('data-seq');
10270				
10271				if(org_idx!=new_idx) {
10272					$(this).attr('data-idx',new_idx);
10273					update_data[d_index] = {
10274						seq : item_seq,
10275						idx : new_idx
10276					}
10277					d_index++;
10278				}				
10279			});							
10280		
10281			$.ajax({
10282				type: 'POST',
10283				url: '/umember/setJoinCollections/type/jcol_update',
10284				data: { sid: SID, update_data: update_data },
10285				dataType: 'json',
10286				async: true,
10287				success: function(data) {
10288					if(typeof data.error != 'undefined' && data.error) {
10289						alert(data.error);
10290						return false;
10291					}
10292			
10293					var slog_field = {'field_name':$(ui.item).find('.collection-name').text().trim(),'field':$(ui.item).attr('data-type')};
10294					setSiteLogs('um.config.collection','sort',slog_field,'um.config.collection');
10295				},
10296				complete: function () {
10297					$.processOFF();
10298				}
10299			});
10300		}
10301	}).disableSelection();
10302
10303}
10304
10305var collectionItem = function(name,etc) {
10306	var types = '';
10307
10308	$.each(COLLECTION_TYPES, function(k,v) {
10309		types = types + '<option value="' + k + '" '+((k == 'text') ? 'selected' : '')+'>' + v + '</option>';
10310	});
10311
10312	var jcollection_select_type = ['text','memo','radio','check','select','fupload'],
10313		collectionAdd = (!name) ? 'additem' : '',
10314		str = '\
10315		<div class="collection-item ' + collectionAdd + '" data-type="etc' + etc + '" data-etc="' + etc + '" data-orgjcoltype="text" data-jcoltype="" data-seq="">\
10316			<div class="collection-info">\
10317				<span class="icons icon-move cl-sort-handle hand">\
10318					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M9 4c0 .83-.67 1.5-1.5 1.5S6 4.83 6 4s.67-1.5 1.5-1.5S9 3.17 9 4m3.5 1.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5S11 3.17 11 4s.67 1.5 1.5 1.5m-5 3C6.67 8.5 6 9.17 6 10s.67 1.5 1.5 1.5S9 10.83 9 10s-.67-1.5-1.5-1.5m5 0c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5S14 10.83 14 10s-.67-1.5-1.5-1.5m-5 6c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5S9 16.83 9 16s-.67-1.5-1.5-1.5m5 0c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5S14 16.83 14 16s-.67-1.5-1.5-1.5"/></svg>\
10319				</span>\
10320				<span class="collection-name">' + name + '</span>\
10321			</div>\
10322			<input type="text" id="collection-name-text" name="name" class="setting-input collection-name-input hide jcol-text"  value="'+ name +'" placeholder="'+$.lang[LANG]['manager.config.jcollection.item.placeholder.collection-name-input']+'">\
10323			<div class="collection-config">\
10324				<div class="icons hand">\
10325					<svg class="collection-edit memberconfig-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><g data-name="그룹_6421"><g data-name="그룹_6429"><path d="M13.57 3.22 8.27 10l-.46 2.17c-.03.16 0 .33.09.47.13.2.36.31.6.28.07 0 .13-.03.2-.06l1.95-.93 5.27-6.72.08-.1zm-4.16 7.35 4.37-5.59.46.36-4.37 5.59-.58.28.13-.63Zm3.6.95h1.25v3.12c0 1.17-.95 2.12-2.12 2.12h-6c-1.17 0-2.12-.95-2.12-2.12v-7c0-1.17.95-2.13 2.12-2.13h3.12v1.25H6.14c-.48 0-.87.39-.88.88v7c0 .48.39.87.88.88h6c.48 0 .87-.39.88-.87v-3.13Z"/></g></g></svg>\
10326				</div>\
10327				<div class="icons hand">\
10328					<svg class="collection-delete memberconfig-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><g data-name="그룹_6416"><g data-name="그룹_6428"><path d="M13.12 5.88v-2H6.89v2H3.87v1.25h1v6.88c0 1.17.95 2.12 2.12 2.12h6c1.17 0 2.12-.95 2.12-2.12V7.13h1V5.88h-3Zm-1.24 0H8.15v-.75h3.73zm1.12 9H7c-.48 0-.87-.39-.88-.88V7.12h7.75V14c0 .48-.39.87-.88.88m-2.11-7h1.25v6.25h-1.25zm-3 0h1.25v6.25H7.88z"/></g></g></svg>\
10329				</div>\
10330				<div class="use-option-check">\
10331					<div class="checkboxs hand newcheckbox">\
10332						<label>\
10333							<div class="newcheckboxSvg">\
10334								<input type="checkbox" class="collection-item-used" id="collection-item-used-additem"/>\
10335								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="m4.4 5.6 2.21 2.21A9.03 9.03 0 0 0 3.52 12c1.27 3.59 4.67 6 8.48 6 1.35 0 2.69-.31 3.9-.9l2.5 2.5 1.2-1.2-14-14zM12 16c-2.21 0-4-1.79-4-4 0-.76.24-1.51.66-2.14l1.09 1.09c-.16.33-.24.69-.25 1.05a2.5 2.5 0 0 0 2.5 2.5c.36 0 .72-.09 1.05-.25l1.09 1.09c-.63.42-1.38.65-2.14.66m2.43-4.57-1.86-1.86c.92.22 1.64.94 1.86 1.86m6.05.57a9.05 9.05 0 0 1-2.12 3.36l-2.47-2.46a3.965 3.965 0 0 0-4.78-4.78L9.39 6.4c4.6-1.41 9.49 1.07 11.09 5.61"/></svg>\
10336								<svg class="active" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 6c-3.81 0-7.21 2.41-8.48 6 1.65 4.68 6.78 7.14 11.46 5.49A8.95 8.95 0 0 0 20.47 12c-1.27-3.59-4.67-6-8.48-6M12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4m2.5-4a2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1 5 0"/></svg>\
10337								<!--<label for="collection-item-used-additem"></label>-->\
10338							</div>\
10339						</label>\
10340					</div>\
10341					<div class="checkboxs hand newcheckbox">\
10342						<label>\
10343							<div class="newcheckboxSvg">\
10344								<input type="checkbox" class="collection-item-optional" id="collection-item-optional-additem"/>\
10345								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><g data-name="그룹_6435"><path class="collection-optional-bg" d="M5 2h10c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H5c-1.66 0-3-1.34-3-3V5c0-1.66 1.34-3 3-3" data-name="패스_4513"/><path class="collection-optional-line" d="M15 3.25c.97 0 1.75.78 1.75 1.75v10c0 .97-.78 1.75-1.75 1.75H5c-.97 0-1.75-.78-1.75-1.75V5c0-.97.78-1.75 1.75-1.75zM15 2H5C3.34 2 2 3.34 2 5v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3"/></g></svg>\
10346								<svg class="active" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M15 2H5C3.34 2 2 3.34 2 5v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3m.03 6.03-5.5 5.5c-.29.29-.77.29-1.06 0l-3.5-3.5a.754.754 0 0 1 0-1.06c.29-.29.77-.29 1.06 0L9 11.94l4.97-4.97c.3-.29.77-.28 1.06.02.28.29.28.75 0 1.04"/></svg>\
10347								<!--<label for="collection-item-optional-additem"></label>-->\
10348							</div>\
10349						</label>\
10350					</div>\
10351				</div>\
10352			</div>\
10353			<div class="clear"></div>\
10354			<div class="collection-item-content" style="display:none;">\
10355				<div class="collection-item-content-wrap">\
10356					<div class="collection-type-selectbox common-selectbox">\
10357						<select name="jcollection-select-type" class="setting-small-input selectpicker dropdown jcollection-select">\
10358					';
10359					$.each(jcollection_select_type, function(i,v){
10360						var selected = (v=='text') ? 'selected' : '';
10361		str +=			'<option class="jcollection-type-opt" value="'+v+'" '+selected+'>'+$.lang[LANG]['manager.config.siteUM.jcollections.'+v]+'</option>';
10362					});
10363		
10364		str +=		'\
10365						</select>\
10366						<svg viewBox="0 0 8 4" width="8" height="4"><polygon points="0 0 4 4 8 0 "></polygon></svg>\
10367					</div>	\
10368					<span class="collection-type-info hand">\
10369						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
10369<path d="M5.5 12c0-3.6 2.9-6.5 6.5-6.5s6.5 2.9 6.5 6.5-2.9 6.5-6.5 6.5-6.5-2.9-6.5-6.5Zm1 0c0 3 2.5 5.5 5.5 5.5s5.5-2.5 5.5-5.5S15 6.5 12 6.5 6.5 9 6.5 12Zm5 3.5v-1h1v1h-1Zm0-2c0-.7.3-1.3.9-1.7.4-.3.7-.8.8-1.3 0-.5-.4-.9-.9-1h-.1c-.6 0-1 .1-1.1.8v.2h-1v-.2c0-1.1 1-1.9 2-1.8h.1c1 0 2 .7 2 1.8v.1c0 .7-.4 1.4-1 1.9-.6.6-.7.9-.7 1.2h-1Z"/></svg>\
10370					</span>\
10371				</div>\
10372				<div class="description-wrap hide">\
10373					<div class="description-input hide">\
10374						<div class="cl-common-form-wrap nonplace-holder">\
10375							<div class="cl-common-form-group">\
10376								<input type="text" id="collection-description-text" name="description" class="setting-input description-text jcol-text"  value="" placeholder="'+$.lang[LANG]['manager.config.siteUM.jcollections.description.placeholder']+'">\
10377							</div>\
10378						</div>\
10379					</div>\
10380					<div class="newcheckbox hand">\
10381						<label>\
10382							<div class="newcheckboxSvg">\
10383								<input type="checkbox" class="" id="collection-description" name="description" value="">\
10384								<svg viewBox="0 0 16 16" width="16" height="16">\
10385									<path class="st6" d="M3 0h10c1.66 0 3 1.34 3 3v10c0 1.66-1.34 3-3 3H3c-1.66 0-3-1.34-3-3V3C0 1.34 1.34 0 3 0z"></path>\
10386									<path class="st19" d="M13 1c1.1 0 2 0.9 2 2v10c0 1.1-0.9 2-2 2H3c-1.1 0-2-0.9-2-2V3c0-1.1 0.9-2 2-2H13M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0L13 0z"></path>\
10387								</svg>\
10388								<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
10389									<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
10390									<path class="st19" d="M13 0H3C1.34 0 0 1.34 0 3v10c0 1.66 1.34 3 3 3h10c1.66 0 3-1.34 3-3V3C16 1.34 14.66 0 13 0zM13.03 6.03l-5.5 5.5C7.38 11.68 7.19 11.75 7 11.75s-0.38-0.07-0.53-0.22l-3.5-3.5c-0.29-0.29-0.29-0.77 0-1.06s0.77-0.29 1.06 0L7 9.94l4.97-4.97c0.29-0.29 0.77-0.29 1.06 0S13.32 5.74 13.03 6.03z"></path>\
10391								</svg>\
10392							</div>\
10393							'+$.lang[LANG]['manager.config.siteUM.jcollections.description.text']+'\
10394						</label>\
10395					</div>\
10396				</div>\
10397				<div class="jcol-btn-wrap">\
10398					<div class="jcol-btn-cancel jcol-btn hand">\
10399						'+$.lang[LANG]['manager.config.jcollection.item.btn.cancel']+'\
10400					</div>\
10401					<div class="jcol-btn-save jcol-btn hand">\
10402						'+$.lang[LANG]['manager.config.jcollection.item.btn.save']+'\
10403					</div>\
10404				</div>\
10405			</div>\
10406		</div>\
10407	';
10408	return str;
10409}
10410
10411var addCollectionInput = function(cl_name) {
10412	var cl_name = (typeof cl_name == 'undefined' || !cl_name) ? '' : cl_name,
10413		str = '\
10414		<div class="collection-update">\
10415			<div class="input-group">\
10416				<input type="text" class="collection-update-name form-control" placeholder="' + $.lang[LANG]['manager.join.cl.item.name.enter'] + '" value="' + cl_name + '"/>\
10417				<span class="input-group-btn">\
10418					<button class="collection-update-save btn btn-active">\
10419						<svg viewBox="0 0 15 10" width="15" height="10"><path d="M14.29 0L5.5 8.79 0.71 4 0 4.71l5.15 5.15C5.24 9.95 5.37 10 5.5 10s0.26-0.05 0.35-0.15L15 0.71 14.29 0z"/></svg>\
10420					</button>\
10421				</span>\
10422				<div class="collection-update-cancel"><svg viewBox="0 0 12 12" width="12" height="12"><polygon points="12 0.71 11.29 0 6 5.29 0.71 0 0 0.71 5.29 6 0 11.29 0.71 12 6 6.71 11.29 12 12 11.29 6.71 6"/></svg></div>\
10423			</div>\
10424		</div>\
10425	';
10426	return str;
10427}
10428
10429//keyup birth
10430var auto_date_format = function( e, oThis ){        
10431    var num_arr = [ 
10432        97, 98, 99, 100, 101, 102, 103, 104, 105, 96,
10433        48, 49, 50, 51, 52, 53, 54, 55, 56, 57
10434    ]      
10435
10436    var key_code = ( e.which ) ? e.which : e.keyCode;
10437
10438    if((num_arr.indexOf( Number( key_code ) ) != -1) || (key_code != 229) || (key_code != 0)){
10439	    var len = oThis.value.length;
10440	    if( len == 4 && (key_code != 8)) oThis.value += '-';
10441	    if( len == 7 && (key_code != 8)) oThis.value += '-';
10442    }
10443}
10444
10445var myinfoChangeBtn = function(e) {
10446    var sid = (typeof $(e).attr('data-sid')!='undefined') ? $(e).attr('data-sid') : property['SID'];
10447    if(property.UMEMBER.check_sns) {
10448        $(location).attr('href','/_myinfo');
10449        return false;
10450    }
10451
10452    var str = '\
10453        <div>\
10454            <div class="cl-s-form-wrap">\
10455                <div class="cl-s-form-group">\
10456                    <input type="password" class="cl-s-form-control" id="check-password" required="required">\
10457                    <label for="input" class="cl-s-control-label">'+ $.lang[LANG]['manager.mypage.personal.info.pw.input'] +'</label>\
10458                </div>\
10459            </div>\
10460        </div>\
10461    ';
10462
10463    $('.flat-modal .modal').modal('hide');
10464    var checkMyinfoPwMdoal = $(e).showModalFlat($.lang[LANG]['manager.mypage.personal.info.pw.title'],str,true,true,function () {
10465
10466        var pw_val = $('#check-password').val().trim();
10467        if(!pw_val) {
10468            $('#check-password').closest('.cl-s-form-wrap').addClass('empty');
10469            $('#check-password').focus();
10470            return false;
10471        } else if(checkEmojis(pw_val)) {
10472            $('#check-password').focus();
10473            return false;
10474        }
10475        
10476        $.post('/_check_mypw', { sid:sid, pw:hex_md5(pw_val) }, function(data) {
10477            if(typeof data.error != 'undefined' && data.error) {
10478                $('#check-password').closest('.cl-s-form-wrap').removeClass('empty').addClass('error');
10479                if($('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').length > 0) {
10480                    $('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').html(data.error);
10481                } else {
10482                    $('#check-password').after('<label for="input" class="cl-s-control-label error">' + data.error + '</label>');
10483                }
10484                $('#check-password').val('').focus();
10485                return false;
10486            } else {
10487                checkMyinfoPwMdoal.modal('hide');
10488                $(location).attr('href','/_myinfo');
10489            }
10490        },'json');
10491
10492    },'닫기',$.lang[LANG]['manager.mypage.personal.info.pw.btn'],'cl-s-product-pw cl-modal cl-s-btn w620',false,'', function() {
10493
10494        $('.cl-s-product-pw .cl-s-form-group').on('click',function(e) {
10495            if($(e.target).hasClass('cl-s-form-group')) {
10496                $(e.target).find('.cl-s-form-control:not([type=hidden])').focus();
10497            }
10498        });
10499
10500        $('.cl-s-product-pw .cl-s-form-control').on({
10501            keyup: function(e) {
10502                if($(this).val().trim().length == 0) {
10503                    $(this).closest('.cl-s-form-wrap').removeClass('error');
10504                    $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10505                }
10506            },
10507            focus: function(e) {
10508                $(this).closest('.cl-s-form-wrap').addClass('active');
10509            },
10510            blur: function(e) {
10511                $(this).closest('.cl-s-form-wrap').removeClass('active');
10512
10513                var val = $(this).val().trim();
10514                if(val.length == 0) {
10515                    $(this).closest('.cl-s-form-wrap').removeClass('error').addClass('empty');
10516                    $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10517                    return false;
10518                } else if(checkEmojis(val)) {
10519                    $('#check-password').closest('.cl-s-form-wrap').removeClass('empty').addClass('error');
10520                    if($('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').length > 0) {
10521                        $('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').html($.lang[LANG]['config.unable.emoji']);
10522                    } else {
10523                        $('#check-password').after('<label for="input" class="cl-s-control-label error">' + $.lang[LANG]['config.unable.emoji'] + '</label>');
10524                    }
10525                    $('#check-password').val('').focus();
10526                    return false;
10527                }
10528
10529                $(this).closest('.cl-s-form-wrap').removeClass('error').removeClass('empty');
10530                $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10531            }
10532        });
10533
10534    });
10535}
10536
10537/*
10538var smsRechargeModal = function(sid) {
10539	var recharge_plan = {
10540		'plan-5000': { name : '5,000원', content: '250건', price: '20원'},
10541		'plan-10000': { name : '10,000원', content: '500건', price: '20원'},
10542		'plan-20000': { name : '20,000원', content: '1100건<span class="additional">(보너스 100건 포함)</span>', price: '18.2원'},
10543		'plan-30000': { name : '30,000원', content: '1800건<span class="additional">(보너스 300건 포함)</span>', price: '16.7원'},
10544		'plan-50000': { name : '50,000원', content: '3100건<span class="additional">(보너스 600건 포함)</span>', price: '16.1원'},
10545	}
10546	var modal_content = '\
10547		<div class="mng-modal-body recharge-modal">\
10548			<div class="row">\
10549				<div class="recharge-head clearfix">\
10550					<div class="col-xs-4 col-sm-4 col-md-4 plan">금액별(VAT별도)</div>\
10551					<div class="col-xs-4 col-sm-4 col-md-6 content">충전 SMS 건수</div>\
10552					<div class="col-xs-4 col-sm-4 col-md-2 price">단가</div>\
10553				</div>\
10554	';
10555	$.each(recharge_plan, function(i,v) {
10556		modal_content = modal_content + '\
10557				<div class="recharge-item clearfix">\
10558					<div class="col-xs-4 col-sm-4 col-md-4 plan">\
10559						<div class="radio-inline">\
10560							<input type="radio" id="recharge-'+ i + '" name="recharge-plan" value="'+ i +'">\
10561							<label for="recharge-' + i + '">' + v['name'] + '</label>\
10562						</div>\
10563					</div>\
10564					<div class="col-xs-4 col-sm-4 col-md-6 content">' + v['content'] + '</div>\
10565					<div class="col-xs-4 col-sm-4 col-md-2 price">' + v['price'] + '</div>\
10566				</div>\
10567		';
10568	});
10569	modal_content = modal_content + '\
10570				<div class="recharge-payment clearfix">\
10571					<div class="col-xs-4 col-sm-4 col-md-3">결제방법</div>\
10572					<div class="col-xs-4 col-sm-4 col-md-9">\
10573						<div class="radio-group">\
10574							<div class="radio-inline">\
10575								<input type="radio" class="payment-method-radio" id="payment-method-card" name="payment-method-radio" value="card">\
10576								<label for="payment-method-card">신용카드</label>\
10577							</div>\
10578							<div class="radio-inline">\
10579								<input type="radio" class="payment-method-radio" id="payment-method-vbank" name="payment-method-radio" value="vbank">\
10580								<label for="payment-method-vbank">가상계좌</label>\
10581							</div>\
10582						</div>\
10583					</div>\
10584				</div>\
10585			</div>\
10586		</div>\
10587	';
10588
10589	var recharge_modal = $(this).showModalFlat('문자메시지(SMS) 충전', modal_content, true, true, function() {
10590		
10591		//문자메시지(SMS) 충전 기능 작업.
10592
10593
10594		recharge_modal.modal('hide');
10595	}, 'cancel', '충전하기', 'w480');
10596
10597}
10598/*sms*/
10599
10600var setJcolError = function(col_item, error_selector, error_text) {	
10601	var error_str = '\
10602		<div class="error_wrap '+error_selector+'-error">\
10603			<span class="error_svg">\
10604				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 13" width="13" height="13">
10604<path d="M6.5 0C2.9 0 0 2.9 0 6.5S2.9 13 6.5 13 13 10.1 13 6.5 10.1 0 6.5 0Zm0 12C3.5 12 1 9.5 1 6.5S3.5 1 6.5 1 12 3.5 12 6.5 9.5 12 6.5 12ZM6 3h1v5H6V3Zm0 6h1v1H6V9Z"/></svg>\
10605			</span>\
10606			<span class="error_str">\
10607			'+$.lang[LANG]['manager.config.jcollection.item.error.'+error_text]+'\
10608			</span>\
10609		</div>';
10610		
10611	col_item.find('.'+error_selector+'.empty').removeClass('jcol_error').addClass('jcol_error');
10612
10613	return error_str;
10614	
10615}
10616
10617var getJcollectionItemOptionVal = function(t) {
10618	var opt_str = '';
10619	$.each(t.find('.jcollection-item-option'), function(i,v) {
10620		var opt_name = $(this).find('.jcol-option-name').val().trim(),
10621			split_str = (i==(t.find('.jcollection-item-option').length-1)) ? '' : '`',
10622			error_str = '';
10623
10624		// if(!opt_name) {
10625		// 	$(this).find('.jcol-option-name').removeClass('empty').addClass('empty');
10626			
10627		// 	error_str = setJcolError(t, 'jcol-option-name', 'opt_name');
10628		// 	$(this).find('.error_wrap.jcol-option-name-error').remove();			
10629		// 	$(this).find('.jcol-option-name').after(error_str);
10630			
10631		// 	return false;
10632		// } else {
10633		// 	$(this).find('.jcol-option-name').removeClass('empty').removeClass('jcol_error');
10634		// 	$(this).find('.error_wrap.jcol-option-name-error').remove();
10635		// }
10636
10637		// t.removeClass('empty');
10638		opt_str += opt_name + split_str;
10639	});
10640
10641	return opt_str;
10642};
10643
10644var setJoinCollectionData = function(t, sid){
10645	/*
10646		sid : sid
10647		mb_id : mb_id
10648		collection_type : email/addr/...etc1...
10649		used : true / false
10650		require : optional
10651		name : name
10652		type : type 	(text(단문형), memo(장문형), radio(단일선택형), check(다중선택형), select(목록선택형))
10653		idx : idx
10654		val : val      
10655		regdate : regdate
10656	*/
10657
10658	var data = {};
10659
10660	t.each(function(i,v) {
10661		var collection_type = (typeof $(this).attr('data-collectiontype')!='undefined') ? $(this).attr('data-collectiontype') : 'etc1',
10662			seq = (typeof $(this).attr('data-seq') != 'undefined') ? $(this).attr('data-seq') : '',
10663			used = (typeof $(this).attr('data-used') != 'undefined') ? $(this).attr('data-used') : 'false',
10664			require = (typeof $(this).attr('data-require')!='undefined') ? $(this).attr('data-require') : 'false',
10665			name = (typeof $(this).attr('data-name')!='undefined') ? (!$(this).attr('data-name') ? $(this).find('.jcollection_item_input').val() : $(this).attr('data-name')) : '',
10666			type = (typeof $(this).attr('data-type')!='undefined') ? $(this).attr('data-type') : 'text',
10667			idx = (typeof $(this).attr('data-idx')!='undefined') ? $(this).attr('data-idx') : '0',
10668			val = '';
10669
10670		val = getJcollectionItemOptionVal($(this));
10671		
10672		used = (used===false) ? 'false' : 'true';
10673		require = (require===false) ? 'false' : 'true';
10674		
10675		data[collection_type] = {
10676			sid : sid,
10677			seq : seq,
10678			collection_type : collection_type,
10679			used : used,
10680			require : require,
10681			name : name,
10682			type : type,
10683			idx : idx,
10684			val : val
10685		}
10686	});
10687	console.log(data);
10688
10689	return data;	
10690}
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706/*************************************************************************************************************************************member-config page END*/
10707
10708
10709
10710
10711/*************************************************************************************************************************************member-list page START*/
10712	
10713var getMemberListCheckData = function(el) {
10714	var select_count = el.closest('.mng-list').find('tr.active td.no input[type="checkbox"]:checked').length - 1,
10715		select_ids = el.closest('.mng-list').find('tr.active').map(function() {  return $(this).find('td.id').text().trim(); }).get(),
10716		select_name = '',
10717		select_names = '';
10718
10719	if(select_count < 0) return { error: $.lang[LANG]['manager.list.member.selected.empty'] };
10720	el.closest('.mng-list').find('tr.active').map(function(i) { 
10721		if(i==0) select_name = $(this).find('td.id').text().trim();
10722		else select_names = select_names + ((select_names.length > 0) ? ', ' : '') + $(this).find('td.id').text().trim(); 
10723	});
10724
10725	var result = {
10726		count	: select_count,
10727		ids 	: select_ids,
10728		name	: select_name,
10729		names	: select_names
10730	};
10731
10732	return result;
10733}
10734
10735// var dissmissCert = function(el, uid) {
10736// 	var id = $(el).attr('id');
10737// 	var dismiss = '';
10738// 	if(id == 'member-cert_date-button') {
10739// 		dismiss = 'cert';
10740// 	} else if (id == 'member-cert_adult_date-button') {
10741// 		dismiss = 'adult';
10742// 	}
10743
10744// 	$.ajax({
10745// 		type: 'POST',
10746// 		url: '/umember/update/type/dismiss_cert',
10747// 		data: { sid : SID, uid : uid, dismiss : dismiss },
10748// 		dataType: 'json',
10749// 		async: true,
10750// 		success: function(data) {
10751// 			if(data.affected_rows > 0) {
10752// 				var modalTitle = '';
10753// 				if(data.um_cert == 'N') {
10754// 					modalTitle = '본인인증이 해제되었습니다.';
10755// 					$('.member-cert_date-wrap').html('');
10756// 				} else if (data.um_cert_adult == 'N') {
10757// 					modalTitle = '성인인증이 해제되었습니다.';
10758// 					$('.member-cert_adult_date-wrap').html('');
10759// 				}
10760// 				$(this).showModalFlat(modalTitle, '해당 계정의 인증이 해제되어 인증 이전 상태로 복구되었습니다.', true, false, function() {
10761// 					location.reload();
10762// 				}, 'ok', 'cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-close-btn');
10763// 			} else {
10764// 				alert('error');
10765// 			}
10766// 		}
10767// 	});
10768// }
10769/*************************************************************************************************************************************member-list page   END*/
10770
10771var mngShowToast = function(icon,message,el,time) {
10772	console.log('mngShowToast')
10773	if($('.mng-toast-wrap').length > 0 ) $('.mng-toast-wrap.remove').remove();
10774	if(typeof time == 'undefined') time = 800;
10775	var icon = "fa fa-"+icon,
10776		toast = '\
10777		<div class="mng-toast-wrap">\
10778			<div class="mng-toast">\
10779				<span class="mng-toast-icon"><i class="' + icon + '"></i></span>\
10780				<span class="mng-toast-message">' + message + ' </span>\
10781			</div>\
10782		</div>\
10783	';
10784
10785	el.find('.mng-title, .mng-wrap').addClass('mng-toast-showing').animate({
10786		'opacity': 0.3,
10787		'pointer-events': 'none'
10788	}, { 
10789		duration: '.5s', 
10790		easing: 'easeInOutCubic'
10791	},50).delay(time).fadeIn(100, function() { 
10792		$(this).animate({
10793			'opacity': 1, 
10794			'pointer-events': 'auto'
10795		}, {
10796			duration: '.5s', 
10797			easing: 'easeInOutCubic'
10798		}, 100).removeClass('mng-toast-showing'); 
10799	});
10800
10801	$(toast).appendTo(el).css({
10802		'opacity': 0,
10803		'margin-top': '-10px'
10804	}).animate({
10805		'opacity': 1,
10806		'margin-top': '0px'
10807	}, {
10808		duration: '.7s',
10809		easing: 'easeInOutCubic'
10810	},50).delay(time).fadeOut(100, function() { $(this).addClass('remove'); });
10811
10812}
10813
10814var howToApplyCert = function() {
10815	var mobile = (window.innerWidth<768) ? 'm.' : '',
10816	str = '\
10817			<div class="guide-top lang-'+LANG+'">\
10818				<h3 class="modal-title guidetitle">'+$.lang[LANG]['manager.cert.guide.title']+'</h3>\
10819				<div class="guide-menu">\
10820					<ul>';
10821					for (var i=0;i<3;i++) {
10822						var menuactive = (i==0) ? 'active' : '';
10823						str = str + '<li class="hand '+menuactive+'">';
10824						if(i==2) str = str + '<div class="line left"></div>';
10825						else if(i==1) {
10826							str = str +'\
10827								<div class="line left"></div>\
10828								<div class="line right"></div>\
10829							';	
10830						}
10831						str = str + '<p>'+$.lang[LANG]['manager.cert.guide.step.'+mobile+i]+'</p>';
10832						if(i==0) str = str + '<div class="line right"></div>';
10833						str = str + '</li>';
10834					};
10835		str +=	'\
10836					</ul>\
10837				</div>\
10838			</div>\
10839			<div class="guide-wrap">\
10840				<div class="step">\
10841					<div id="step1">\
10842						<h3>'+$.lang[LANG]['manager.cert.guide.step.1.title']+'</h3>\
10843						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.1']+'</h4>\
10844						<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.1']+'</p>\
10845						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.2']+'</h4>\
10846						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_01_'+LANG+'.jpg">\
10847			';
10848			if(LANG == 'ko') {
10849				str +=	'\
10850						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.3']+'</h4>\
10851						<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.3']+'</p>\
10852						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_02_'+LANG+'.jpg">\
10853				';	
10854			}
10855			str +=	'\
10856					</div>\
10857					<hr class="line">\
10858					<div id="step2">\
10859						<h3>'+$.lang[LANG]['manager.cert.guide.step.2.title']+'</h3>\
10860						<div class="step2-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.1']+'</div>\
10861						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_03_'+LANG+'.jpg">\
10862						<div class="step2-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.2']+'</div>\
10863						<div class="step2-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.3']+'</div>\
10864				';
10865			if(LANG == 'ko') {
10866				str +=	'\
10867					 	<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_04_'+LANG+'.jpg">';
10868			} else {
10869				str +=	'\
10870						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_05_'+LANG+'.jpg">\
10871				';
10872			}
10873			str +=	'\
10874					 	<div class="step2-step text-left">\
10875					 		<span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.4']+'\
10876					 	';
10877			if(LANG != 'ko') {
10878				str +=	'<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.3']+'</p>\
10879				';	
10880			}
10881			str += '\
10882					 	</div>';
10883			if(LANG == 'ko') {
10884				str += '\
10885						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_05_'+LANG+'.jpg">';
10886			}
10887			str += '\
10888					 	<div class="step2-step text-left"><span>STEP 05.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.5']+'</div>\
10889					 	<div class="step2-step text-left">\
10890					 		<span>STEP 06.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.6']+'\
10891					 		<p>'+$.lang[LANG]['manager.cert.guide.step.2.txt.6.sub']+'</p>\
10892					 	</div>\
10893					 	<div class="step2-step text-left"><span>STEP 07.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.7']+'</div>\
10894						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_06_'+LANG+'.jpg">\
10895						<div class="step2-step text-left"><span>STEP 08.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.8']+'</div>\
10896						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_07_'+LANG+'.jpg">\
10897					</div>\
10898					<hr class="line">\
10899					<div id="step3">\
10900						<h3>'+$.lang[LANG]['manager.cert.guide.step.3.title']+'</h3>\
10901						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.1']+'</h4>\
10902						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-1']+'</p>\
10903						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-2']+'</div>\
10904						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_08_'+LANG+'.jpg">\
10905						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-3']+'</div>\
10906						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_09_'+LANG+'.jpg">\
10907						<div class="step3-step text-left"><span>
10907STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-4']+'</div>\
10908						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_10_'+LANG+'.jpg">\
10909						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-5']+'</div>\
10910						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_11_'+LANG+'.jpg">\
10911						\
10912						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.2']+'</h4>\
10913						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-1']+'</p>\
10914						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-2']+'</div>\
10915						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_12_'+LANG+'.jpg">\
10916						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-3']+'</div>\
10917						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_13_'+LANG+'.jpg">\
10918						<div class="step3-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-4']+'</div>\
10919						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_14_'+LANG+'.jpg">\
10920						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-5']+'</div>\
10921						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_15_'+LANG+'.jpg">\
10922						\
10923						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.3']+'</h4>\
10924						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-1']+'</p>\
10925						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-2']+'</div>\
10926						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_16_'+LANG+'.jpg">\
10927						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-3']+'</div>\
10928						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_17_'+LANG+'.jpg">\
10929						<div class="step3-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-4']+'</div>\
10930						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_18_'+LANG+'.jpg">\
10931						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-5']+'</div>\
10932						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_19_'+LANG+'.jpg">\
10933					</div>\
10934				</div>\
10935				<div class="modal-footer guideClose">\
10936					<button type="button" class="btn btn-default btn-sm close-button-dialog clostbtnfalse" data-dismiss="modal">'+$.lang[LANG]['config.close']+'</button>\
10937				</div>\
10938			</div>\
10939			';
10940
10941	var certApplyGuideModal = $(this).showModalFlat('',str,true,false,'','close','','guidePopup cl-cmmodal cl-s-btn cover w700 cert-guide-modal', false ,'',function() {
10942		$(window).resize(function () {
10943			var mobile = (window.innerWidth<768) ? 'm.' : '';
10944
10945			$('.cert-guide-modal .guide-menu li').each(function(i) {
10946				$(this).find('p').html($.lang[LANG]['manager.cert.guide.step.'+mobile+i]);
10947			});
10948		});
10949		$.guidePopup.scrollevent();
10950	});
10951}

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.