PageSourceSearch

https://i-pines.com/js/member_config.1791261834.js

js i-pines.com collected 2026-10-06 18:14:52 UTC 478,624 bytes, 10,971 lines download raw bytes

1if(typeof LANG == 'undefined') var LANG = getLanguage(); 
2
3var normalizeMemberMenuLinkPage = function(value) {
4	if (typeof normalizeRenderMenuLinkPage == 'function') return normalizeRenderMenuLinkPage(value);
5	value = $.trim(String(value || ''));
6	try {
7		value = decodeURIComponent(value);
8	} catch(e) {}
9	value = value.replace(/^\/+/g, '');
10	if (value.indexOf('#') === 0) value = value.replace(/^#+/g, '');
11	else if (value.indexOf('#') > -1 && !/^https?:\/\//i.test(value)) value = value.split('#').pop();
12	value = value.split('?')[0].split(',')[0];
13	return value
14		.replace(/ /g, '-')
15		.replace(/\//g, '/')
16		.replace(/&/g, '&')
17		.replace(/\./g, '.')
18		.replace(/\+/g, '+')
19		.replace(/\(/g, '(')
20		.replace(/\)/g, ')');
21};
22  
23$(window).load(function(data) {
24	setLanguage(LANG);
25	collectionSortable();
26});
27
28$(function() {
29	$('.pageIcon.nonpage a[href="#"]').click(function(e) {
30		e.preventDefault();
31	});
32
33	$.fheader = {
34		refreshFixedSub: function() {
35			// console.log('refreshFixedSub');
36			//ver4 ( ver3 + menu height )
37
38			var body_width = (PAGE_MODE == 'c') ? $('body').width() : window.innerWidth,
39				$fh = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
40				fh_type = $fh.attr('data-fh-type'),
41				fh_postion = (typeof $fh.attr('data-position') != 'undefined') ? $fh.attr('data-position') : '',
42				fh_transparent = ($fh.hasClass('transparent')) ? true : false,
43				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
44
45			if( $fh.find('#fixed-menu').length == 0 ||
46				$fh.hasClass('sidebar') ||
47				fh_type != 'right' ||
48				$fh.find(' > .container[data-fh-align]').length == 0
49			) { return false; }
50
51			var fixedSubOn = ($fh.find('.fh-container').css('display') == 'none') ? false : true;
52
53			if(!checkFixTypeMenu && window.innerWidth > 768) {
54				var collapse_w	= $fh.find('.collapse').width(),
55					tpl_nav_w	= $fh.find('#tpl-menu').outerWidth(),
56					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')),
57					checkWidth	= (parseInt(collapse_w) < parseInt(tpl_nav_w) + fixed_nav_w) ? true : false;
58
59				if(checkWidth) {
60					var checkOnepx = ((parseInt(tpl_nav_w) + fixed_nav_w) - parseInt(collapse_w) === 1) ? true : false;
61					if(checkOnepx) checkWidth = false;
62				}
63
64				var tpl_nav_cnt	= $fh.find('#tpl-menu > li').length,
65					tpl_nav_th	= (tpl_nav_cnt == 0) ? 0 : $fh.find('#tpl-menu > li').eq(0).position().top,
66					tpl_nav_h	= (tpl_nav_cnt == 0) ? 0 : $fh.find('#tpl-menu > li').eq(tpl_nav_cnt-1).position().top,
67					checkHeight	= (parseInt(tpl_nav_th) != parseInt(tpl_nav_h)) ? true : false;
68
69				if(fixedSubOn) { // aready fixed menu sub show
70					if(!checkWidth && !checkHeight) fixedSubOn = false;
71				} else {
72					if(checkWidth || checkHeight) fixedSubOn = true;
73				}
74			}
75
76			if(fixedSubOn) {
77				if($fh.hasClass('transparent')) {
78					$fh.find('#tpl-menu').addClass('overflow-menu');
79					$fh.find('#fixed-menu').addClass('overflow-menu');
80					$fh.find('#fixed-menu-sub').addClass('overflow-menu');
81				}
82				var fh_nav_pdRight = parseInt($fh.find('#tpl-menu > li > a').css('padding-right')) + parseInt($fh.find('.collapse').css('padding-right')) - 10;
83
84				if($fh.find('.navbar-center').length==0) {
85					if(checkFixTypeMenu) return false;
86					$('#fixed-menu').hide();
87					$('#fixed-menu-sub').closest('.fh-container').eq(0).show().addClass('active');
88				} 
89				
90				$('#fixed-menu-sub').css('margin-right',fh_nav_pdRight+'px');
91			} else {
92				$fh.find('#tpl-menu').removeClass('overflow-menu');
93				$fh.find('#fixed-menu').removeClass('overflow-menu');
94				$fh.find('#fixed-menu-sub').removeClass('overflow-menu');
95
96				$('#fixed-menu').show();
97				$('#fixed-menu-sub').closest('.fh-container').eq(0).hide().removeClass('active');
98			}
99
100			if($fh.hasClass('transparent') && $fh.hasClass('overflow-menu') && !$fh.find('#tpl-menu').hasClass('overflow-menu')) {
101				$fh.find('#tpl-menu').addClass('overflow-menu');
102				$fh.find('#fixed-menu').addClass('overflow-menu');
103				$fh.find('#fixed-menu-sub').addClass('overflow-menu');
104			}
105
106
107			if(PAGE_MODE == 'c') {
108				$('.addElementButton.addel-menu').css('top',$('header.navbar').outerHeight() + 'px');
109			}
110
111			if($('.element[data-feature*=fixedscroll]').length > 0) gjs01SetFixedscroll($('.element[data-feature*=fixedscroll]').eq(0));
112		},
113		init: function(mode) {
114			// console.log('fheader init');
115			var checkElviewer = '';
116			if(window.parent && window.parent != this && $('.elviewhtml').length > 0) {
117				checkElviewer = $('#el-list-image .elgrid.active', window.parent.document).find('.blockname-str').text().trim();
118			}
119
120			var s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
121				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE,
122				checkGabia = (s_service.indexOf('gabia') > -1) ? true : false,
123				checkEllist = (typeof mode != 'undefined' && mode == 'ellist') ? true : false,
124				checkTemplate = (typeof property != 'undefined' && property.TEMPLATE && property.TEMPLATE=='1') ? true : false,
125				sid = (PAGE_MODE == 'c') ? ((checkEllist) ? checkElviewer.replace(/menu-/gi,'') : SID) : property.SID,
126				$pc_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
127				pc_nav_name = (checkEllist) ? $pc_nav.attr('data-name') : 'menu-'+sid,
128				$mobile_nav = $pc_nav.find('#tpl-menu').closest('.navbar-'+pc_nav_name).clone(),
129				checkFixTypeMenu = (typeof $pc_nav.attr('data-fixtype') != 'undefined' && $pc_nav.attr('data-fixtype')) ? true : false;
130
131			if($pc_nav.find('.cl-menu-option').length > 0) $.moption.init(mode);
132
133			$mobile_nav.prop({id:'mobile-nav'}).removeAttr('class').removeAttr('style');
134			
135			if(!$pc_nav.hasClass('navbar-fheader') || (checkFixTypeMenu && $pc_nav.find('.cl-fixed-menu').length>0)) return false;
136			if(!checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
137
138				var fh_sub = '',
139					fh_type = $pc_nav.attr('data-fh-type');
140
141				switch(s_validtype) {
142					case 'FR':
143					case 'BS':
144						fh_sub = '\
145							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
146						';
147						break;
148					case 'BN':
149						fh_sub = '\
150							<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
151							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
152						';
153						break;
154					case 'SM':
155						fh_sub = '\
156							<li class="siteSEARCH"><a href="#"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a></li>\
157							<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
158							<li class="siteCART"><a href="#"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a></li>\
159							<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
160						';
161
162
163						/* Shopping Only KO Site */
164						// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
165						// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
166						// 	fh_sub = '\
167						// 	<li class="siteUM"><a href="#"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>\
168						// 	<li class="siteLANG"><a href="#"><i class="cl-icon cl_icon_globe" aria-hidden="true"></i></a></li>\
169						// 	';
170						// }
171						break;
172					default:
173						break;
174				}
175
176				if(fh_type == 'top') {
177					var menu_container = $pc_nav.find(' > .container').attr('class'),
178						fh_line = '<hr class="fh-line"  style="display: none;"/>',
179						fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
180						fh_content = '\
181							<div class="' + menu_container +' fh-container" style="display: none;">\
182								<div class="navbar-wrap">\
183									<ul class="navbar-nav navbar-top" id="fixed-menu">\
184									' + fh_sub + '\
185									</ul>\
186								</div>\
187							</div>\
188						';
189
190					if($pc_nav.find('.cl-drop-fixed-menu').length > 0) $pc_nav.find('.cl-drop-fixed-menu').remove();
191
192					if($pc_nav.find('.fh-line').length > 0) $pc_nav.find('.fh-line').replaceWith(fh_line);
193					else $pc_nav.prepend(fh_line);
194
195					if($pc_nav.find('#fixed-menu').length > 0) $pc_nav.find('.fh-container').replaceWith(fh_content);
196					else $pc_nav.prepend(fh_content);
197
198
199					if(!checkEllist) {
200						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).find('#fixed-menu').clone());
201						else $mobile_nav.prepend($(fh_content).find('#fixed-menu').clone());
202					}
203
204				} else if(fh_type == 'right' || fh_type == 'sidebar') {
205					var fixed_menu_str = (fh_type == 'sidebar') ? '' : 'navbar-right',
206						fh_line = '<hr class="fh-line visible-xs" style="display: none;"/>',
207						fh_content = '\
208							<ul class="navbar-nav ' + fixed_menu_str + '" id="fixed-menu" style="display: none;">\
209							' + fh_sub + '\
210							</ul>\
211						';
212
213					if(checkEllist) {
214						if(fh_type == 'right' && $pc_nav.find('.mini-home').length > 0) {
215							$pc_nav.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
216						}
217					} else {
218						var fh_container = $pc_nav.find(' > .container[data-fh-align]'),
219							fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
220							fh_content2 = (	fh_type == 'sidebar' || fh_container.length == 0 ) ? '' : '\
221							<div class="' + fh_container.attr('class') +' fh-container" style="display: none;">\
222								<div class="navbar-wrap">\
223									<ul class="navbar-nav navbar-top" id="fixed-menu-sub" style="margin-right: '+fh_nav_pdRight+'px;">\
224										' + fh_sub + '\
225									</ul>\
226								</div>\
227							</div>\
228						';
229					}
230
231					if($pc_nav.find('#fixed-menu').length > 0) $pc_nav.find('#fixed-menu').replaceWith(fh_content);
232					else $pc_nav.find('#tpl-menu').before(fh_content);
233
234					if($pc_nav.find('.fh-line').length > 0) $pc_nav.find('.fh-line').replaceWith(fh_line);
235					else $pc_nav.find('#tpl-menu').before(fh_line);
236
237					if(!checkEllist) {
238						if(fh_content2.length > 0) {
239							if($pc_nav.find('#fixed-menu-sub').length > 0) $pc_nav.find('.fh-container').replaceWith(fh_content2);
240							else $pc_nav.prepend(fh_content2);
241						}
242
243						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).removeAttr('style').clone());
244						else $mobile_nav.prepend($(fh_content).removeAttr('style').clone());
245					}
246
247				}
248			}
249
250			/* 메뉴 ::: 확장기능 버튼 추가 버전(20220928) *********************************************************/
251			if(checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
252				var fh_sub = '',
253					fixbtnData = $.menuFixBtn.getData($pc_nav),
254					parent_dsgnbody = (checkEllist && typeof PAGE_MODE!='undefined' && PAGE_MODE=='c') ? window.parent.document : '',
255					lang_txt = (checkEllist) ? $(parent_dsgnbody).find('header.navbar-fheader .siteLANG.cl-fixbtn').attr('data-fixlang') : '',
256					lang_code = (checkEllist) ? $(parent_dsgnbody).find('header.navbar-fheader .siteLANG.cl-fixbtn').attr('data-fixlangcode') : '',
257					lang_sidebar = (fixbtnData['fh-type']=='sidebar') ? false : true,
258					slang_html = '',
259					lang_str = LANG,
260					validArray = {},
261					validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
262					validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN;
263
264				if(checkEllist && typeof SLANG == 'undefined') {
265					var slang_obj = {
266							use_language : 'off',
267							lists : {},
268							select : lang_txt,
269							select_code : lang_code
270						}
271					SLANG = slang_obj;
272				} else SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
273				
274				if((typeof SLANG != 'undefined' && typeof SLANG.select_code != 'undefined' && SLANG.select_code)
275			                || (!$.isEmptyObject(SLANG) && SLANG.use_language == 'on' && SLANG.select_code)) {
276			        lang_str = (SLANG['select_code'].toLowerCase()!='ko') ? 'en' : 'ko';
277			    } 
278			   
279				var validArray = {
280					'validtype' : validtype,
281					'validplan' : validplan
282				}
283			
284				$mobile_nav.attr('data-fixtype',fixbtnData['fixtype'])
285							.attr('data-fixlangtype',fixbtnData['fixlangtype'])
286							.attr('data-fixsize',fixbtnData['fixsize'])
287							.attr('data-fixlangsize',fixbtnData['fixlangsize']);			
288			
289				if(fixbtnData['fixtypeText']=='top') fh_sub += $.menuFixBtn.topSet(fixbtnData['fixtypeNum'],false,validArray,SLANG);
290				else fh_sub += $.menuFixBtn.sidebarSet(fixbtnData['fixtypeNum'],false,validArray,SLANG); 				
291
292				if(fixbtnData['fh-type'] == 'top') {
293					var menu_container = $pc_nav.find(' > .container').attr('class'),
294						/*fh_line = '<hr class="fh-line"  style="display: none;"/>',*/
295						fh_nav_pdRight = parseInt($pc_nav.find('#tpl-menu > li > a').css('padding-right')) + parseInt($pc_nav.find('.collapse').css('padding-right')) - 10,
296						fh_content = '\
297							<div class="' + menu_container +' fh-container">\
298								<div class="navbar-wrap">\
299									<ul class="navbar-nav navbar-top cl-fixed-menu" id="fixed-menu">\
300									' + fh_sub + '\
301									</ul>\
302								</div>\
303							</div>\
304						';
305
306					if($pc_nav.find('input[class*="cl-menu-"]').length > 0) $pc_nav.find('input[class*="cl-menu-"]').last().after(fh_content);
307					else $pc_nav.prepend(fh_content);
308					
309					//if(!checkEllist) {
310						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).find('#fixed-menu').clone());
311						else $mobile_nav.prepend($(fh_content).find('#fixed-menu').clone());
312					//}
313				} else if(fixbtnData['fh-type'] == 'right' || fixbtnData['fh-type'] == 'sidebar') {
314					var fixed_menu_str = (fixbtnData['fh-type'] == 'sidebar') ? '' : 'navbar-right',
315						fh_line = '<hr class="fh-line visible-xs" style="display: none;"/>',
316						fh_content = '\
317							<ul class="navbar-nav ' + fixed_menu_str + ' cl-fixed-menu" id="fixed-menu">\
318							' + fh_sub + '\
319							</ul>\
320						';
321
322					if(checkEllist) {
323						if(fixbtnData['fh-type'] == 'right' && $pc_nav.find('.mini-home').length > 0) {
324							$pc_nav.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
325						}
326					}
327
328					$pc_nav.find('#fixed-menu').remove();
329					$pc_nav.find('#tpl-menu').before(fh_content);
330
331					//if(!checkEllist) {
332						if($mobile_nav.find('#fixed-menu').length > 0) $mobile_nav.find('#fixed-menu').replaceWith($(fh_content).removeAttr('style').clone());
333						else {
334							$(fh_content).removeAttr('style').clone();
335							$mobile_nav.prepend($(fh_content).removeAttr('style').clone());
336						}
337					//}
338				}
339
340				/* 메뉴 디자인변경 :: slang make X => fheader init(pc_nav)에서 적용 ***/
341				if(checkEllist) {
342					slang_html = $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],lang_sidebar,SLANG,'',validArray);
343					$pc_nav.find('.siteLANG.cl-fixbtn').remove();
344					(fixbtnData['fh-type']=='sidebar') ? $pc_nav.find('.menu-inner').after(slang_html) : $pc_nav.find('#fixed-menu').append(slang_html);
345											
346					$pc_nav.find('.siteLANG').removeClass('dropup').removeClass('dropdown');
347					$pc_nav.find('.siteLANG .cl-lang').removeClass('dropdown-toggle');
348					$pc_nav.find('.siteLANG .dropdown-menu').remove();
349				}
350			}
351
352			// $mobile_nav.find('#fixed-menu').removeAttr('class');
353			// $mobile_nav.find('#tpl-menu').prop({class:'nav navbar-nav'}).find('ul').prop({class:'',id:''});
354			// $mobile_nav.find('#tpl-menu').removeAttr('class');
355			$mobile_nav.find('#tpl-menu').removeClass('hide').removeClass('preloading');
356			$mobile_nav.find('#tpl-menu').removeAttr('style');
357
358			$mobile_nav.find('.dropdown').not('.siteUM.cl-fixbtn').each(function() {
359				$(this).addClass('menu-has-children').removeClass('dropdown');
360				$(this).find('> a').removeClass('dropdown-toggle');
361				$(this).find('> a i').remove();
362
363				if(($(this).hasClass('active') || $(this).hasClass('open')) && $(this).find('li.active').length > 0) {
364					if($(this).find('li.active').length > 0) $(this).removeClass('active').addClass('open');
365					$(this).find('> a').nextAll('ul').eq(0).slideToggle();
366					$(this).prepend('<i class="fa fa-chevron-up"></i>');
367				} else {
368					$(this).prepend('<i class="fa fa-chevron-down"></i>');
369				}
370			});
371
372			if(checkFixTypeMenu && ($.inArray(s_validtype, ['BS','BN','SM']) > -1 || (checkGabia && s_validtype == 'FR'))) {
373				$mobile_nav.find('#fixed-menu').wrap('<div class="mobilenav_top"></div>');
374				
375				/* 메뉴 디자인변경 :: slang make X => fheader init(mobile_nav)에서 적용 ***/
376				if(checkEllist) {
377					var psearch_ellist = `
378						<li class="siteSEARCH">
379							<a href="javascript:;" class="psearch-btn"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a>
380							<div class="psearch-overlay">
381								<span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
382								<div class="psearch-body">
383									<span class="psearch-wrap">
384										<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
385										<input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
386									</span>
387								</div>
388							</div>
389						</li>
390					`;
391					var sitelangStr = $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false,'',true);
392
393					var hide_UM = (s_validtype=='BN' || s_validtype=='SM') ? '' : 'hide';
394					$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>');
395					if(s_validtype=='SM') {
396						$mobile_nav.find('#fixed-menu .siteSEARCH').replaceWith(psearch_ellist);
397					}
398					if(s_validtype && sitelangStr) $mobile_nav.append(sitelangStr).find('.cl-fixbtn.siteLANG');
399				}
400				//if(checkEllist) $mobile_nav.find('#fixed-menu .mobilenav_top').prepend(ellist_mobile_logincontent);
401			}
402			
403			var fh_line = '<hr class="fh-line" />';
404			(checkFixTypeMenu) ? $mobile_nav.find('.mobilenav_top').after(fh_line) : $mobile_nav.find('#fixed-menu').after(fh_line);
405			//$mobile_nav.find('#tpl-menu').after(fh_line);
406
407			var menu_selector = (checkEllist) ? '.elviewhtml .menu-'+sid : '.el-menu .menu-'+sid,
408				$checkMenuEL = $(menu_selector),
409				check_mobile_design = $checkMenuEL.hasClass('mobile-design-clear') ? false : true,
410				check_mnormal = ($checkMenuEL.find('.cl-menu-normal').length > 0) ? true : false,
411				check_msidebar = ($checkMenuEL.find('.cl-menu-sidebar').length > 0) ? true : false,
412				check_moption = ($checkMenuEL.find('.cl-menu-option').length > 0) ? true : false;
413			if(checkEllist) $mobile_nav.addClass('elview');
414			if(check_moption) $mobile_nav.addClass('moption');
415			else if(check_mnormal) $mobile_nav.addClass('mnormal');
416			else if(check_msidebar) $mobile_nav.addClass('msidebar');
417			if(!check_mobile_design) {
418				$mobile_nav.addClass('mobile-design-clear menu-'+sid);
419				$mobile_nav.find('.menu-has-children > ul').addClass('dropdown-menu');
420			}
421			
422			$('.dsgn-body').append($mobile_nav);
423			$('.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>');
424
425			if(checkTemplate) {
426				$(document).find('#mobile-nav').find('.mobilenav_top').hide();
427				$(document).find('#mobile-nav').find('.mobilenav_top').next('.fh-line').hide();
428			}
429
430			var mobile_selector = (checkEllist) ? ['.elview','.elviewhtml'] : ['','.el-menu'];
431			if(check_moption || check_mnormal || check_msidebar) {
432				
433				mobile_selector[0] += (check_moption) ? '.moption' : ((check_msidebar) ? '.msidebar' : '.mnormal');
434				mobile_selector[1] +=  (check_moption) ? ' .cl-menu-option ~ .container' : ((check_msidebar) ? ' .cl-menu-sidebar ~ .container' : ' .cl-menu-normal ~ .container');
435				
436				var nav_font = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-fname'),
437					nav_color = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-color'),
438					nav_color_active = getComputedStyle(document.querySelector(menu_selector)).getPropertyValue('--menu-color-active'),
439					nav_fixed_key = (check_mobile_design) ? '--menu-fname' : '--fixed-menu-color',
440					fixed_color = (checkFixTypeMenu) ? getComputedStyle(document.querySelector(menu_selector)).getPropertyValue(nav_fixed_key) : '';
441			} else {
442				var nav_font = (checkFixTypeMenu) ? $('.menu-' + sid + ' ul#tpl-menu > li > a').css('font-family') : $('.menu-' + sid + ' ul.navbar-nav > li > a').css('font-family');
443				if(typeof nav_font != 'undefined' && nav_font) {
444					nav_font = nav_font.replace(/\'/gi,'').replace(/\"/gi,'');
445
446					var nav_color = $('.menu-' + sid + ' ul.navbar-nav > li > a:not(:hover)').css('color'),
447						nav_color_active = $('.menu-' + sid + ' ul.navbar-nav > li.active > a').css('color'),
448						fixed_color = '';
449					if(checkFixTypeMenu) {
450						fixed_color = ($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? $('.menu-' + sid + ' ul.cl-fixed-menu >
450 li.cl-fixbtn a').css('color') : $('.el-menu .navbar-toggle .icon-bar').css('background-color');
451					}
452				}
453
454				if(typeof nav_color_active == 'undefined' || nav_color_active == '') nav_color_active = nav_color;
455				var mcss_fixed = (checkFixTypeMenu) ? '\
456						'+mobile_selector[1]+' .siteCART.micon {color : ' + fixed_color + '; }\
457						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear .mobilenav_top a {color : ' + fixed_color + '; }\
458						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear .mobilenav_top svg {fill : ' + fixed_color + '; }\
459					' : '',
460					mcss_more = '\
461					@media only screen and (max-width:768px) {\
462						#mobile-nav'+mobile_selector[0]+' { font-family: ' + nav_font + '; }\
463						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children i,\
464						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children i:focus { color: ' + nav_color + '; }\
465						#mobile-nav'+mobile_selector[0]+'.mobile-design-clear #tpl-menu li.menu-has-children.active i { color: ' + nav_color_active + '; }\
466						'+ mcss_fixed +'\
467					}\
468				';
469	
470				var menu_css_selector = (checkEllist) ? '.elviewcss' : '#menu-'+sid;
471				$(menu_css_selector).append(mcss_more);
472			}
473
474			$('.el-menu').removeClass('_ready');
475		},
476		set: function(mode) {
477			// console.log('fheader set');
478			var checkEllist = (typeof mode != 'undefined' && mode=='ellist') ? true : false,
479				checkStorageCapture = (typeof isStoragebox != 'undefined' && isStoragebox && typeof isCapture != 'undefined' && isCapture) ? true : false,
480				$fh = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
481				fh_type = $fh.attr('data-fh-type'),
482				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
483				
484			if($fh.find('#fixed-menu').children().length == 0) {
485				if(fh_type == 'top') $fh.find('.fh-container').remove();
486				else if(fh_type == 'right' || fh_type == 'sidebar') $fh.find('#fixed-menu, .fh-line').remove();
487				$('#mobile-nav #fixed-menu, #mobile-nav .fh-line').remove();
488			}
489			
490			if(!checkFixTypeMenu) {
491				if(checkStorageCapture) {
492				} else {
493					if(fh_type == 'top') {
494						$fh.find('.fh-container').eq(0).slideToggle();
495					} else if(fh_type == 'right' || fh_type == 'sidebar') {
496						$fh.find('#fixed-menu').slideToggle();
497					}
498					
499					$fh.find('.fh-line').slideToggle();
500				}
501			}			
502			
503			setTimeout(function() {				
504				if(checkEllist) {
505					if(fh_type == 'right' && $fh.find('.mini-home').length > 0) {
506						$fh.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
507					} else if(checkFixTypeMenu && fh_type == 'sidebar') {
508						$fh.find('#fixed-menu').css('overflow','');
509					}
510				} else {
511					if($('#page-loading-css').length == 0) {
512						setTimeout(function() {
513							$.fheader.position();
514						},400);
515					}
516				}
517							
518			},400);
519		},
520		position: function() {
521			if(!$('header.navbar').hasClass('navbar-fheader')) {
522	            var parentDocument = $(window.parent.document),
523	                $detail_modal = parentDocument.find('.product-detail-modal');
524	            if($detail_modal.length) {
525	            	($('.openBandBanner').length) ? 
526	            		$('.dsgn-body').css('padding-top','120px') :
527	            		$('.dsgn-body').css('padding-top','0px');
528	            }
529				return false;
530			}
531
532			// console.log('fheader position');
533			// if(!$('header.navbar').hasClass('navbar-fheader')) return false;
534
535			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
536				$fh = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
537				fh_type = $fh.attr('data-fh-type'),
538				fh_postion = (typeof $fh.attr('data-position') != 'undefined') ? $fh.attr('data-position') : '',
539				fh_transparent = ($fh.hasClass('transparent')) ? true : false,
540				checkFixTypeMenu = (typeof $fh.attr('data-fixtype') != 'undefined' && $fh.attr('data-fixtype')) ? true : false;
541				
542			var body_width = (PAGE_MODE == 'c') ? $('body').width() : window.innerWidth;
543			
544			if(body_width <= 768) {
545				if(fh_type == 'right' && $fh.find('.mini-home').length > 0) { 
546					$fh.find('.mini-home').parent().removeAttr('style'); 
547				}
548				$fh.find('.psearch-overlay.open').removeClass('open');
549				$('.cl-popupBanner').removeClass('zindex20');
550				if(!checkFixTypeMenu) $fh.find('#fixed-menu-sub').closest('.fh-container').eq(0).hide();
551			} else {
552				if(fh_type == 'right' && $fh.find('.mini-home').length > 0) {
553					if(!checkFixTypeMenu) {
554						$fh.find('.mini-home').closest('.navbar-collapse').attr('style','display: inline-block !important');
555					} 
556				}
557
558				if(fh_type == 'right' && !$fh.hasClass('sidebar') && $fh.find(' > .container[data-fh-align]').length > 0) {
559					$.fheader.refreshFixedSub();
560				}
561
562				$('#mobile-nav .psearch-overlay.open').removeClass('open');
563				$('.cl-popupBanner').removeClass('zindex20');
564				if($('.dsgn-body').hasClass('mobile-nav-active')) $fh.find('.navbar-toggle').click();
565			}
566
567			if(fh_transparent) {
568				if($('.cl-bandBanner').length == 0) {
569					$('.dsgn-body').css('padding-top','0px');
570					if(PAGE_MODE == 'c') $('.el-menu_ctrl .config-element').removeAttr('style');
571				}
572			} else if(fh_postion != 'relative') {
573				if(fh_type == 'sidebar' && body_width > 768) {
574					var pt = '0px';
575					if(typeof getComputedStyle(document.querySelector('body')).getPropertyValue('--bandBanner-height-pc') != 'undefined') {
576						pt = getComputedStyle(document.querySelector('body')).getPropertyValue('--bandBanner-height-pc');
577					}
578					$('.dsgn-body').css('padding-top',pt);
579					return false;
580				}
581			}
582
583			if(PAGE_MODE == 'c') {
584				if($('.dsgn-body').get(0).scrollHeight  > $('.dsgn-body').innerHeight()) {
585					var scrollbar_gap = window.innerWidth - $('.dsgn-body').get(0).clientWidth;
586					$('.navbar-fixed-top, .navbar-fixed-bottom').css('right',scrollbar_gap);
587				} else {
588	                $('.navbar-fixed-top, .navbar-fixed-bottom').removeAttr('style');
589				}
590			}
591			if(checkEllist) {
592				if(checkFixTypeMenu) setFixedMenuCss(true);
593			} else {
594				var delay_time = (PAGE_MODE == 'c') ? 800 : 0;
595				setTimeout(function() {
596					var header_h = (fh_transparent || ($fh.hasClass('sidebar') && $('.dsgn-body').width() > 767) ) ? 0 : $fh.outerHeight(),
597						band_h = $.siteBanner.getBandHeight();
598					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"]')) {
599						var hide_h = $fh.find('.moption-container').outerHeight();
600						header_h -= hide_h;
601					}
602					$('.dsgn-body').css('padding-top', (band_h + header_h)+'px'); 
603					if($('.el_0.element').is('[data-type="gallery"][data-type2="premium"][data-feature*=fixedscroll]')) gjs01SetFixedscroll($('.el_0.element'));
604				}, delay_time);
605
606				if(PAGE_MODE == 'c') {
607					setTimeout(function() {
608						var btn_top = $('header.navbar').outerHeight();
609						$('.addElementButton.addel-menu').css('top',btn_top + 'px');
610					}, delay_time+200);
611				}
612			}
613		}
614	}
615
616	$.moption = {
617		getList: function(menu_selector) {
618			var checkEditList = (menu_selector.match(/^\.elmenu-color-edit/gi)) ? true : false,
619				moption_list = [];
620
621			$(menu_selector).find('#tpl-menu > li').each(function() {
622				var tmp_child = [],
623					tmp_main = $(this);
624				if(tmp_main.hasClass('dropdown')) {
625					tmp_main.find('.dropdown-menu > li').each(function() {
626						var tmp_sub = $(this);
627						tmp_child.push({
628							'idx0': moption_list.length,
629							'idx1': tmp_child.length,
630							'name': tmp_sub.find(' > a').eq(0).text().trim(),
631							'active': (tmp_sub.hasClass('active')) ? 'active' : '',
632							'href': (checkEditList) ? 'javascript:;' : '',
633							'target': '',
634							'isbookmark': '',
635							'isflink': '',
636							'depth': 1,
637							'children': tmp_child, 
638						});
639					});
640				}
641			
642				moption_list.push({
643					'idx0': moption_list.length,
644					'name': tmp_main.find(' > a').eq(0).text().trim(),
645					'active': (tmp_main.hasClass('active')) ? 'active' : '',
646					'href': (checkEditList) ? 'javascript:;' : '',
647					'target': '',
648					'isbookmark': '',
649					'isflink': '',
650					'depth': 0,
651					'children': tmp_child, 
652				});
653			});
654			return moption_list;
655		},
656		init: function(mode) {
657			// console.log('fh moption(mode: '+mode+')');
658
659			var checkElviewer = '';
660			if(window.parent && window.parent != this && $('.elviewhtml').length > 0) {
661				checkElviewer = $('#el-list-image .elgrid.active', window.parent.document).find('.blockname-str').text().trim();
662			}
663
664			var s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
665				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE,
666				checkGabia = (s_service.indexOf('gabia') > -1) ? true : false,
667				checkEllist = (typeof mode != 'undefined' && mode == 'ellist') ? true : false,
668				checkMenuEdit = (typeof mode != 'undefined' && mode == 'menuedit') ? true : false,
669				checkTemplate = (typeof property != 'undefined' && property.TEMPLATE && property.TEMPLATE=='1') ? true : false,
670				sid = (PAGE_MODE == 'c') ? ((checkEllist) ? checkElviewer.replace(/menu-/gi,'') : SID) : property.SID,
671				pc_seletor = (checkEllist) ? '.elviewhtml header.navbar' : ((checkMenuEdit) ? '.elmenu-color-edit header.navbar' : '.el-menu header.navbar'),
672				$pc_nav = $(pc_seletor),
673				$mobile_nav = $pc_nav.find('#tpl-menu').closest('.navbar-menu-'+sid).clone(),
674				checkFixTypeMenu = (typeof $pc_nav.attr('data-fixtype') != 'undefined' && $pc_nav.attr('data-fixtype')) ? true : false;
675
676			var moption = $pc_nav.find('.cl-menu-option').attr('data-moption'),
677				checkDrawClmoption = ($.inArray(moption, ['nfull','ntoggle']) > -1) ? true : false;
678			if(checkDrawClmoption) {
679				var moption_table = '<ul class="cl-'+moption+' cl-moption"></ul>',
680					moption_col = '<li class="cl-moption-col"></li>',
681					moption_row = '<div class="cl-moption-row"></div>';
682
683				if($pc_nav.find('.container.moption-container').length > 0) $pc_nav.find('.container.moption-container').html('<div class="moption-row"></div>');
684				else $pc_nav.find('.container:not(:is(.fh-container, .moption-container))').after('<div class="container moption-container"><div class="moption-row"></div></div>');
685				var $moptionContainer = $pc_nav.find('.container.moption-container'),
686					$moptionRow = $moptionContainer.find('.moption-row');
687				if($pc_nav.find('.container:not(:is(.fh-container, .moption-container))').hasClass('full-width')) $moptionContainer.addClass('full-width');
688
689				$moptionRow.append(moption_table);
690				var menu_option = (PAGE_MODE == 'c') ? MENUOPTION : property.MENUOPTION,
691					$moptionTable = $moptionContainer.find('.cl-moption');
692
693				if(checkMenuEdit) menu_option = $.moption.getList(pc_seletor);
694				$.each(menu_option, function(idx0, obj0) {
695					var $tmpCol = $(moption_col),
696						tmp_row = moption_row.replace(/cl\-moption\-row\"\>\</g,'cl-moption-row '+obj0.active+'"><a href="' + obj0.href + '" ' + obj0.target + obj0.isbookmark + obj0.isflink + '>
696' + obj0.name + '</a><');
697					if(obj0.children.length > 0) {
698						$.each(obj0.children, function(idx1, obj1) {
699							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><');
700						});
701					}
702
703					$tmpCol.append(tmp_row);
704					if($tmpCol.find('.cl-moption-row').length > 1) $tmpCol.addClass('has-sub');
705					if(menu_option.length-1 == idx0) $tmpCol.addClass('last-sub');
706					$moptionTable.append($tmpCol);
707				});
708			}
709
710			switch(moption) {
711				case 'nfull':
712
713					var hasSubMenu = (PAGE_MODE == 'c') ? MENUCHECK.sub : property.MENUCHECK.sub;
714					if(hasSubMenu) $pc_nav.find('.cl-menu-option').removeClass('single');
715					else $pc_nav.find('.cl-menu-option').addClass('single');
716
717					$pc_nav.find('#tpl-menu > li, .moption-container').off('mouseover mouseleave').on({
718						mouseover: function(e) {
719							if($(this).find('.cl-moption').is(':empty') || (PAGE_MODE == 'c' && $('#el-blockConfig').hasClass('open') && selectEL != 'el-menu')) return false;
720
721							$(this).closest('header').find('.cl-menu-option').addClass('open');
722						},
723						mouseleave: function(e) {
724							if($(this).find('.cl-moption').is(':empty')) return false;
725
726							if(	$(this).closest('header').find('.cl-menu-option').hasClass('fixed') ||
727								$(this).closest('header').find('.cl-menu-option').hasClass('nfullDrop') ||
728								$('#el-blockConfig').is('.open')
729							) {
730								return false;
731							}
732
733							$(this).closest('header').find('.cl-menu-option').removeClass('open');
734							if($(this).closest('header').find('.cl-menu-option').is('[data-mwidth="all"]')) {
735								$.fheader.position();
736							}
737						}
738					});
739					break;
740
741				case 'ntoggle':
742					break;
743
744				default:
745					break;
746			}
747
748			$pc_nav.find('.cl-drop-fixed-menu ~ .navbar-toggle, .cl-menu-option ~ .container .navbar-toggle').off('click').on({
749				click: function() {
750					if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',true);
751				},
752			});
753
754
755			$pc_nav.ready(function() {
756				setTimeout(function() {
757					if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) $.moption.checkNfullDrop(pc_seletor);
758					else if($pc_nav.find('.cl-menu-option[data-moption="ntoggle"]').length > 0 && $pc_nav.is('[data-fh-type="right"]')) $.moption.drawClDropFixedmenu($pc_nav);
759				}, 300);
760			});
761
762            $(window).resize(function() {
763                if(this.moptionResizeTO) {
764                    clearTimeout(this.moptionResizeTO);
765                }
766                this.moptionResizeTO = setTimeout(function() {
767                    $(this).trigger('resizeMoptionEnd');
768                }, 300);
769            });
770            $(window).on('resizeMoptionEnd', function() {
771                $.fheader.position();
772                if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) $.moption.checkNfullDrop(pc_seletor);
773				else if($pc_nav.find('.cl-menu-option[data-moption="ntoggle"]').length > 0 && $pc_nav.is('[data-fh-type="right"]')) $.moption.drawClDropFixedmenu($pc_nav);
774
775				if($pc_nav.find('.cl-menu-option').length > 0  && $('body').width() < 767) {
776					$pc_nav.find('.cl-menu-option').removeClass('open');
777				} else {
778			        if ($('header #tpl-menu').children().length) $('header.navbar-fheader .navbar-toggle').css({ 'visibility': 'visible' });
779			        else $('header.navbar-fheader .navbar-toggle').css({ 'visibility': 'hidden' });
780			        $('.dsgn-body').removeClass('mobile-nav-active');
781			        $('#mobile-body-overly').removeClass('in');
782			        $('#mobile-nav .siteLANG.cl-fixbtn').hide();
783				}
784            });
785		},
786		setRootBlock(thisBlock,root_key,usedtoggle) {
787			if(	typeof thisBlock != 'undefined' && thisBlock.length > 0 && thisBlock.find('.cl-menu-option').length > 0) {
788				if(root_key == '--block-height') {
789					var h = thisBlock.outerHeight();
790					document.querySelector('header').style.setProperty('--block-height', h + 'px', null);
791
792					if($('#el-blockConfig').hasClass('open')) {
793						if(!thisBlock.find('.cl-menu-option').hasClass('open')) thisBlock.find('.cl-menu-option').toggleClass('open');
794					} else if(usedtoggle) {
795						thisBlock.find('.cl-menu-option').toggleClass('open');
796					} else {
797						thisBlock.find('.cl-menu-option').removeClass('open');
798					}
799
800					if(thisBlock.find('.cl-menu-option').is('.nfullDrop[data-mo
800ption="nfull"]')) {
801						var h_p_b = thisBlock.css('padding-bottom').replace(/[^0-9]/g,'') * 1;
802						document.querySelector('header').style.setProperty('--cl-nfull-top', h_p_b + 'px', null);
803					}
804				}
805			}
806
807		},
808		drawClDropFixedmenu: function(pcNav) {
809			if($('header #fixed-menu').length > 0) {
810				var drop_fixed_menu = '<ul class="cl-drop-fixed-menu">' + $('header #fixed-menu').html() + '</ul>';
811				if(pcNav.find('.cl-drop-fixed-menu').length > 0) pcNav.find('.cl-drop-fixed-menu').replaceWith(drop_fixed_menu);
812				else if(pcNav.find('.navbar-header .micon').length > 0) pcNav.find('.navbar-header .micon').before(drop_fixed_menu);
813				else pcNav.find('.navbar-header .navbar-toggle').before(drop_fixed_menu);
814			}
815		},
816		checkNfullDrop: function(nav_selector) {
817			var $pc_nav = $(nav_selector),
818				isellist = (nav_selector.match(/^\.elviewhtml/gi)) ? true : false,
819				iselmenuedit = (nav_selector.match(/^\.elmenu-color-edit/gi)) ? true : false,
820				isparent = (typeof window.parent != 'undefined' && window.parent != this) ? true : false;
821
822			if($pc_nav.find('.cl-menu-option[data-moption="nfull"]').length > 0) {
823
824				var checkBlockConfig = $('#el-blockConfig').hasClass('open');
825				if(checkBlockConfig || isparent) {
826					$pc_nav.find('.cl-drop-fixed-menu').remove();
827					$pc_nav.find('.cl-menu-option').removeAttr('data-nfull-drop').removeClass('nfullDrop');
828				}
829
830				var delay = (checkBlockConfig) ? 500 : 0;
831				setTimeout(function() {
832					var checkMfullDrop = $pc_nav.find('.cl-menu-option').is('[data-nfull-drop]'),
833						// checkMenuOrg = ($pc_nav.find('.cl-menu-option').is('[data-mwidth]')) ? false : true,
834						// tpl_menu_selector = (checkMenuOrg) ? nav_selector+' #tpl-menu' : nav_selector+' .cl-moption',
835						tpl_menu_selector = nav_selector + ' #tpl-menu',
836						m_wrap = $(tpl_menu_selector).first().width(),
837						m_w = 0,
838						mdrop_onoff = (checkMfullDrop) ? $pc_nav.find('.cl-menu-option').hasClass('nfullDrop') : false;
839
840					var fixed_menu_w = $pc_nav.find('#fixed-menu').outerWidth();
841					if($pc_nav.is('[data-fh-type="right"][data-fixtextalign="center"]')) {
842						$pc_nav.find(nav_selector+' #tpl-menu').css('padding-left',fixed_menu_w + 'px');
843					} else {
844						document.querySelector(nav_selector+' #tpl-menu').style.removeProperty('padding-left');
845					}
846
847					if(checkMfullDrop) {
848						var m_container = $pc_nav.find('.container:not(.moption-container, .fh-container)').eq(0).width(),
849							m_drop = $pc_nav.find('.cl-menu-option').attr('data-nfull-drop');
850						if(Number(m_drop) > 0 && m_container > Number(m_drop)) {
851							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeClass('nfullDrop');
852						} else {
853							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').addClass('nfullDrop');
854							setFixedMenuCss(isellist);
855						}
856					} else {
857						$(tpl_menu_selector).first().children().each(function() {
858							m_w += $(this).outerWidth();
859						});
860
861						var m_top = $(tpl_menu_selector).first().children().first().offset().top,
862							m_last = $(tpl_menu_selector).first().children().last().offset().top;
863						if(m_top != m_last || m_w > m_wrap) {
864							var mcontainer = $pc_nav.find('.container:not(.moption-container, .fh-container)').eq(0).width(),
865								mdrop = mcontainer + (m_w - m_wrap);
866
867							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').attr('data-nfull-drop',mdrop).addClass('nfullDrop');
868							setFixedMenuCss(isellist);
869						} else {
870							$pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeAttr('data-nfull-drop');
871						}
872					}
873
874					if($pc_nav.is('[data-fh-type="right"]') && $pc_nav.find('.cl-menu-option').hasClass('nfullDrop')) {
875						$.moption.drawClDropFixedmenu($pc_nav);
876					}
877
878					// if(iselmenuedit) $pc_nav.find('.cl-menu-option[data-moption="nfull"]').removeClass('nfullDrop');
879					if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',false);
880				}, delay);
881			} else {
882				if($('body').width() > 767) $.moption.setRootBlock($pc_nav,'--block-height',false);
883			}
884
885		},
886	}
887
888	$.psearch = {
889		init: function() {
890			// console.log('psearch init');
891			if(!$('.el-menu header.navbar').hasClass('navbar-fheader')) return false;
892
893			// psearch - 쇼핑몰 요금제 사용여부 체크 후 on/off
894            var s_validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN,
895                s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
896                checkSM = (s_validplan && s_validtype == 'SM') ? true : false;
897
898            if(checkSM) $.psearch.set('on');
899			else $.psearch.set('off');
900		},
901		set: function(onoff) {
902			// console.log('psearch set');
903			if(!$('.el-menu header.navbar').hasClass('navbar-fheader')) return false;
904
905			if(onoff.match(/on/gi)) $.psearch.makeSiteSEARCH();
906			else {
907				$('#fixed-menu, #fixed-menu-sub').find('.siteSEARCH').remove();
908			}
909		},
910		makeSiteSEARCH: function() {
911			// console.log('psearch makeSiteSearch');
912			// 우선 PC, MOBILE 구조 동일하게 적용함 => (menufixbtn적용 전 메뉴블럭)
913			
914			/* Shopping Only KO Site */
915			// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
916			// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
917			// 	$('#fixed-menu, #fixed-menu-sub').find('.siteSEARCH').remove();
918			// 	return false;
919			// }
920
921			var pc_nav = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub');
922			var mobile_nav = $('#mobile-nav #fixed-menu');
923			var checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false;
924			var checkLux = (PAGE_MODE == 'c') ? LUX : property.LUX;
925			var search_icon = (checkFixTypeMenu) ? clSVG('fixbtn_search4',28,28) : '<i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i>';
926				
927			var content = (checkFixTypeMenu) ? `
928				<div class="psearch-overlay">
929                    <span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
930                    <div class="psearch-body">
931                        <span class="psearch-wrap">
932                            <a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
933                            <input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
934                        </span>
935                    </div>
936                </div>
937			` : `
938				<li class="siteSEARCH">
939                    <a href="javascript:;" class="psearch-btn"><i class="cl-icon cl_icon_magnifier" aria-hidden="true"></i></a>
940                    <div class="psearch-overlay">
941                        <span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
942                        <div class="psearch-body">
943                            <span class="psearch-wrap">
944                                <a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
945                                <input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
946                            </span>
947                        </div>
948                    </div>
949                </li>
950			`;
951			var mobile_content = `
952				<li class="siteSEARCH">
953					<a href="javascript:;" class="psearch-btn">${search_icon}</a>
954					<div class="psearch-overlay">
955						<span class="psearch-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Product Search"></span></span>
956						<div class="psearch-body">
957							<span class="psearch-wrap">
958								<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>
959								<input class="psearch-input" type="text" name="" placeholder="${$.lang[LANG]['psearch.input.placeholder']}">
960							</span>
961						</div>
962					</div>
963				</li>
964			`;
965			
966			if(pc_nav.find('.siteSEARCH').length > 0) {
967				if(checkFixTypeMenu){
968					pc_nav.find('.siteSEARCH').find('a').addClass('psearch-btn');
969					pc_nav.find('.siteSEARCH').append(content);
970				} else pc_nav.find('.siteSEARCH').replaceWith(content);
971			} else pc_nav.prepend(content);
972			
973			if(mobile_nav.find('.siteSEARCH').length>0) {
974				if(checkFixTypeMenu) {
975					var regExp = new RegExp(/cl\-fixbtn|cl\-visible/, "gi"),
976						addClass = (mobile_nav.find('.siteSEARCH').attr('class').match(regExp)!==null) ? mobile_nav.find('.siteSEARCH').attr('class').match(regExp).join(" ") : '',
977						$site_search = mobile_nav.find('.siteSEARCH');
978
979					mobile_nav.find('.siteSEARCH').find('a').addClass('psearch-btn');
980					mobile_nav.find('.siteSEARCH').replaceWith(mobile_content);
981					mobile_nav.find('.siteSEARCH').addClass(addClass);
982
983					if(pc_nav.find('.siteSEARCH').css('display')=='none') mobile_nav.find('.siteSEARCH').hide();
984				} else mobile_nav.find('.siteSEARCH').replaceWith(mobile_content);
985			} else mobile_nav.prepend(mobile_content);
986			
987			// #fixed-menu-sub psearch not working 
988			// pc_nav.each(function() {
989			// 	if($(this).attr('id') == 'fixed-menu-sub') {
990			// 		$(this).find('.psearch-overlay').remove();
991			// 	}
992			// });
993		},
994		groupByTab: function(list) {
995			var groups = {
996				all: [],
997				shopping: [],
998				forum: [],
999				gallery: [],
1000				etc: []
1001			};
1002
1003			for (var i = 0; i < list.length; i++) {
1004				var o = list[i];
1005				var tab = o.tab || 'etc';
1006
1007				groups.all.push(o);
1008
1009				if (!groups[tab]) tab = 'etc';
1010				groups[tab].push(o);
1011			}
1012
1013			return groups;
1014		},
1015		initTabs: function($wrap){
1016			var groups = $wrap.data('psearchGroups') || {};
1017			var $tabs = $wrap.find('.psearch-tabs');
1018			if($tabs.length==0) return;
1019
1020			var active = $tabs.attr('data-active') || 'all';
1021
1022			// 초기 활성화
1023			$wrap.find('.psearch-tab-nav .tab-item').removeClass('active');
1024			$wrap.find('.psearch-tab-nav .tab-item[data-tab="'+active+'"]').addClass('active');
1025
1026			$wrap.find('.psearch-panel').hide();
1027			$wrap.find('.psearch-panel[data-tab="'+active+'"]').show();
1028
1029			// 클릭 이벤트
1030			$wrap.find('.psearch-tab-nav .tab-item').live('click', function(e){
1031				e.preventDefault();
1032				var tab = $(this).attr('data-tab');
1033
1034				var tabPages = $wrap.data('psearchTabPages') || {};
1035				tabPages[tab] = 1;
1036				$wrap.data('psearchTabPages', tabPages);
1037
1038				$tabs.attr('data-active', tab);
1039				if($wrap.find('#psearch-tab').length) $wrap.find('#psearch-tab').val(tab);
1040
1041				$wrap.find('.psearch-tab-nav .tab-item').removeClass('active');
1042				$(this).addClass('active');
1043
1044				$wrap.find('.psearch-panel').hide();
1045				$wrap.find('.psearch-panel[data-tab="'+tab+'"]').show();
1046
1047				var cnt = groups[tab] ? groups[tab].length : 0,
1048					cnt_lang = (LANG == 'ko') ? '개' : '';
1049				$wrap.find('.psearch-total-count').html('<strong>'+cnt + cnt_lang +'</strong><span class="count-txt">' + $.lang[LANG]['fheader.psearch.result'] + '</span>');
1050			});
1051		},
1052		view: function() {
1053			// console.log('psearch view');
1054			// var deferred = $.Deferred();
1055
1056			var check_p = (property.PAGE == 'psearch') ? true : false;
1057			if(check_p) {
1058				var p_stx = property.PARENT?.psearch_stx ?? '';
1059				var p_total = property.PARENT?.psearch_total ?? 0;
1060				var p_list = property.PARENT['psearch_list'];
1061				var p_page_num = property.PARENT['psearch_num'];
1062				var p_view = property.PARENT['psearch_view'];
1063				var p_selector = (property.LUX) ? 'psearch-block' : 'psearch-view';
1064
1065				let psearch_view = '';
1066				if(property.LUX) {
1067					//lux search view
1068					psearch_view = property.PARENT['psearch_eltag'];
1069					if($('style#psearchblockcss').length == 0) {
1070						 $('body').append('<link rel="stylesheet" type="text/css" id="psearchblockcss" href="/css/block/psearch_block.css">');
1071					}
1072					if($('script#psearchblockjs').length == 0) {
1073						var psearchJS = document.createElement('script');
1074						psearchJS.setAttribute('src', '/js/block/psearch_block.js');
1075						psearchJS.setAttribute('id', 'psearchblockjs');
1076						document.body.appendChild(psearchJS);
1077
1078						psearchJS.onload = function() {
1079							$('body').append('<input type="hidden" id="psearchblockjs" data-src="/js/block/psearch_block.js">');
1080							$(`.${p_selector}`).fadeIn().removeAttr('style');
1081
1082							if($('.psearch-block .pfilter-fbox .fcol-c-ul:not([data-key="psearch"]) > li.active').length > 0) {
1083								if($('.psearch-block .pfilter-fbox .fcol-c-ul[data-key="brand"] > li.active').length > 0) {
1084									$('.psearch-block .pfilter-fbox .fcol-c-ul[data-key="brand"]').closest('.frow').addClass('open');
1085								}
1086								var cancel_svg = clSVG('close',10,10,true,'pick-cancel-btn');
1087								$('.psearch-block .pfilter-fbox .fcol-c-ul:not([data-key="psearch"]) > li.active').each(function() {
1088									var isOnly = $(this).closest('ul').is('[data-only="true"]');
1089									var pfilter_key = $(this).closest('ul').attr('data-key');
1090									var pfilter_name = $(this).text().trim();
1091									var pfilter_val = $(this).attr('data-val');
1092									var pfilter_input = (isOnly) ? pfilter_key : pfilter_key+'[]';
1093									if(isOnly) $('#psearchForm .psearch-pick.'+pfilter_key+'').remove();
1094									$('#psearchForm').append('<input type="hidden" class="psearch-pick '+pfilter_key+'" name="'+pfilter_input+'"  value="'+pfilter_val+'" />');
1095									$('.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>');
1096								});
1097								$('.psearch-block .pfilter-fbox .frow.last').removeClass('hide');
1098							} else {
1099								$('.psearch-block .pfilter-fbox .frow.last').addClass('hide');
1100							}
1101						}
1102					}
1103
1104				} else {
1105					//shopping search view
1106					var wrap = ($('header.navbar .container').hasClass('full-width')) ? 'full-width' : '';
1107					psearch_view = '\
1108						<div class="psearch-view" data-sid="'+property.SID+'" style="height:' + ($(document).height() * 0.2) + 'px; display: none;">\
1109							<input type="hidden" id="psearch-stx" value="' + p_stx + '" />\
1110							<input type="hidden" id="psearch-total" value="' + p_total + '" />\
1111							<input type="hidden" id="psearch-tab" value="all" />\
1112							<div class="container ' + wrap + '">\
1113								<div class="psearch-body">\
1114									<div class="row">\
1115										<div class="col-sm-offset-2 col-md-offset-4 col-xs-12 col-sm-8 col-md-4">\
1116											<span class="psearch-wrap">\
1117												<input class="psearch-input" type="text" name="" placeholder="' + $.lang[LANG]['fheader.psearch'] + '" value="' + p_stx + '">\
1118												<a href="#" class="psearch-icon"><i class="cl-icon cl_icon_magnifier"></i></a>\
1119											</span>\
1120										</div>\
1121									</div>\
1122					';
1123
1124					// 탭 분류
1125					var groups = $.psearch.groupByTab(p_list);
1126
1127					var PAGE_SIZE = 8;
1128					var PAGE_VIEW = 5;
1129					var $pEL = $('.'+p_selector);
1130					$pEL.data('psearchPageSize', PAGE_SIZE);
1131					$pEL.data('psearchPageView', PAGE_VIEW);
1132
1133					// 탭별
1134					$pEL.data('psearchTabPages', { all:1, shopping:1, forum:1, gallery:1, etc:1 });
1135
1136					// all 섹션별
1137					$pEL.data('psearchAllSectionPages', { shopping:1, gallery:1, forum:1, etc:1 });
1138
1139					var tabCount = {
1140						all: groups.all.length,
1141						shopping: groups.shopping.length,
1142						forum: groups.forum.length,
1143						gallery: groups.gallery.length,
1144						etc: groups.etc.length
1145					};
1146
1147					// 기본 활성 탭(쇼핑>게시판>갤러리>기타)
1148					var activeTab = 'all';
1149					// 전체 검색결과 수
1150					var totalCnt = tabCount.shopping + tabCount.forum + tabCount.gallery + tabCount.etc;
1151					if (totalCnt === 0) { //검색결과 0
1152						activeTab = 'all';
1153					} else {
1154						if (tabCount.shopping > 0 && totalCnt === tabCount.shopping) {
1155							activeTab = 'shopping';
1156						} else if (tabCount.forum > 0 && totalCnt === tabCount.forum) {
1157							activeTab = 'forum';
1158						} else if (tabCount.gallery > 0 && totalCnt === tabCount.gallery) {
1159							activeTab = 'gallery';
1160						} else if (tabCount.etc > 0 && totalCnt === tabCount.etc) {
1161							activeTab = 'etc';
1162						} else {
1163							activeTab = 'all';
1164						}
1165					}
1166
1167					var p_sort = (typeof property.PARENT['psearch_sort'] != 'undefined' && property.PARENT['psearch_sort']) ? property.PARENT['psearch_sort'] : '
1167new',
1168						cnt_lang = (LANG == 'ko') ? '개' : '';
1169					// 탭 네비
1170					psearch_view += '\
1171						<div class="psearch-tabs" data-active="'+activeTab+'">\
1172							<ul class="psearch-tab-nav">\
1173								<li class="tab-item" data-tab="all">' + $.lang[LANG]['fheader.psearch.all'] + ' <span class="cnt">('+tabCount.all+')</span></li>\
1174								<li class="tab-item" data-tab="shopping">' + $.lang[LANG]['fheader.psearch.shopping'] + ' <span class="cnt">('+tabCount.shopping+')</span></li>\
1175								<li class="tab-item" data-tab="gallery">' + $.lang[LANG]['fheader.psearch.gallery'] + ' <span class="cnt">('+tabCount.gallery+')</span></li>\
1176								<li class="tab-item" data-tab="forum">' + $.lang[LANG]['fheader.psearch.forum'] + ' <span class="cnt">('+tabCount.forum+')</span></li>\
1177								<li class="tab-item" data-tab="etc">' + $.lang[LANG]['fheader.psearch.etc'] + ' <span class="cnt">('+tabCount.etc+')</span></li>\
1178							</ul>\
1179						</div>\
1180						<div class="psearch-sort-wrap">\
1181							<div class="psearch-total-count"><strong>'+ p_total + cnt_lang +'</strong><span class="count-txt">' + $.lang[LANG]['fheader.psearch.result'] + '</span></div>\
1182							<div class="gallery-sort-nav goption-row psearch-sort" data-sort-lang="' + LANG + '">\
1183								<div class="toggle-dropdown display-flex space-between align-items-center">\
1184									<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>\
1185								</div>\
1186								<ul>\
1187									<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>\
1188									<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>\
1189								</ul>\
1190							</div>\
1191						</div>\
1192					';
1193
1194					// 탭 패널 렌더
1195					psearch_view += '<div class="psearch-tab-panels">';
1196
1197					psearch_view += (function(){
1198						var h = '<div class="psearch-panel" data-tab="all" style="display:none;">';
1199						var parts = [];
1200						var s1 = $.psearch.renderAllSection($pEL, 'shopping', groups.shopping);
1201						if(s1) parts.push(s1);
1202						var s2 = $.psearch.renderAllSection($pEL, 'gallery',  groups.gallery);
1203						if(s2) parts.push(s2);
1204						var s3 = $.psearch.renderAllSection($pEL, 'forum',    groups.forum);
1205						if(s3) parts.push(s3);
1206						var s4 = $.psearch.renderAllSection($pEL, 'etc',      groups.etc);
1207						if(s4) parts.push(s4);
1208
1209						if(parts.length === 0){
1210							h += '<div class="row text-center pitem-empty">'
1211							+ $.lang[LANG]["fheader.psearch.pitem-empty"]
1212							+ '</div>';
1213						} else {
1214							h += parts.join('');
1215						}
1216
1217						h += '</div>';
1218						return h;
1219					})();
1220					psearch_view += $.psearch.renderTabPanel($pEL, 'shopping', groups.shopping);
1221					psearch_view += $.psearch.renderTabPanel($pEL, 'forum',    groups.forum);
1222					psearch_view += $.psearch.renderTabPanel($pEL, 'gallery',  groups.gallery);
1223					psearch_view += $.psearch.renderTabPanel($pEL, 'etc',      groups.etc);
1224					psearch_view += '</div>';
1225					psearch_view += '</div></div></div></div>';
1226
1227					$('.psearchcss').remove();
1228					var p_color = $('.dsgn-body').css('color');
1229					var p_line_color = $('.dsgn-body').css('color');
1230					var p_size = $('.dsgn-body').css('font-size');
1231					var p_css = `
1232						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-wrap { border-bottom-color: ${p_line_color}; }
1233						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-input { color: ${p_color}; }
1234						.dsgn-body > .psearch-view[data-sid="${property.SID}"] .psearch-pagination > li > a { color: ${p_color}; }
1235					`;
1236					$('#dsgn-body').after(`<style class="psearchcss"${p_css}</style>`);
1237				}
1238
1239				if($.clnav.check()) {
1240					$('.dsgn-body').prepend(psearch_view);
1241				} else {
1242					$('.header.el-menu').after(psearch_view);
1243				}
1244
1245				var $pEL = $('.'+p_selector);
1246				$pEL.data('psearchGroups', groups);
1247				
1248				changeBrokenImages($pEL);
1249
1250				$.psearch.initTabs($('.'+p_selector));
1251				$.psearch.bindClientPagination($pEL);
1252				$pEL.find('.psearch-sort').val(p_sort);
1253
1254				var p_tab = (property.PARENT && property.PARENT['psearch_tab'])	? property.PARENT['psearch_tab'] : ($pEL.find('.psearch-tabs').attr('data-active') || 'shopping');
1255				// console.log(p_tab);
1256				setTimeout(function(){
1257					$pEL.find('.psearch-tab-nav .tab-item[data-tab="'+p_tab+'"]').trigger('click');
1258				}, 0);
1259
1260				// 정렬 드롭다운 토글 (열고/닫기)
1261				$pEL.off('click', '.psearch-sort .toggle-dropdown');
1262				$pEL.on('click', '.psearch-sort .toggle-dropdown', function(e){
1263					e.preventDefault();
1264					e.stopPropagation();
1265					$(this).closest('.psearch-sort').toggleClass('open');
1266				});
1267				// 바깥 클릭 시 닫기
1268				$(document).off('click.psearchSortClose').on('click.psearchSortClose', function(e){
1269					if($(e.target).closest('.psearch-sort').length === 0){
1270						$pEL.find('.psearch-sort').removeClass('open');
1271					}
1272				});
1273
1274				// 정렬 선택
1275				$pEL.off('click', '.psearch-sort ul a[data-sort]');
1276				$pEL.on('click', '.psearch-sort ul a[data-sort]', function(e){
1277					e.preventDefault();
1278
1279					var sort = $(this).attr('data-sort') || 'new'; // 클릭한 값
1280					var currentSort = property.PARENT['psearch_sort'] || 'new'; // 현재 값
1281
1282					if(sort === currentSort){
1283						$pEL.find('.psearch-sort').removeClass('open');
1284						return;
1285					}
1286
1287					var psearch_stx = $('#psearch-stx').val() || '';
1288					var tab  = $('#psearch-tab').val() || 'all';
1289
1290					// UI 텍스트 반영
1291					$pEL.find('.psearch-sort .active-sort').text($(this).text().trim());
1292					$pEL.find('.psearch-sort').removeClass('open');
1293
1294					var url = (PAGE_MODE=='s') ? '' : '/render';
1295					location.href = url + '/psearch/num/1/stx/' + encodeURIComponent(psearch_stx) + '/sort/' + sort + '/tab/' + tab;
1296				});
1297
1298				if(p_selector == 'psearch-view') $pEL.fadeIn().removeAttr('style');
1299
1300				// $pagination = $pEL.find('.psearch-pagination');
1301				// $.psearch.setPagination($pagination,p_stx,p_total,p_page_num,p_view);
1302
1303				// if(p_total <= p_view) $pagination.addClass('hidden');
1304				// else $pagination.removeClass('hidden');
1305
1306				if(p_selector == 'psearch-view') {
1307					if(PAGE_MODE != 'c') $.psearch.showSiteProjectSEARCH(true);
1308					if(PAGE_MODE == 's' && typeof callbackEvtProductSearch == 'function') callbackEvtProductSearch(p_stx);
1309				}
1310
1311				$pEL.off('click', '.psearch-client-nav a');
1312					$pEL.on('click', '.psearch-client-nav a', function(e){
1313					e.preventDefault();
1314
1315					// disabled면 무시
1316					if ($(this).parent().hasClass('disabled')) return;
1317
1318					var sectionKey = $(this).closest('.psearch-client-nav').attr('data-skey');
1319					var page = parseInt($(this).attr('data-page'), 10) || 1;
1320
1321					// 상태 저장
1322					var secPages = $pEL.data('psearchAllSectionPages') || {};
1323					secPages[sectionKey] = page;
1324					$pEL.data('psearchAllSectionPages', secPages);
1325
1326					// 해당 섹션만 재렌더
1327					var groups = $pEL.data('psearchGroups') || {};
1328					var list = groups[sectionKey] || [];
1329
1330					var html = renderSection(sectionKey, list);
1331					$pEL.find('.psearch-all-section[data-section="'+sectionKey+'"]').replaceWith(html);
1332				});
1333
1334				$pEL.off('click', '.psearch-tab-navpage a');
1335					$pEL.on('click', '.psearch-tab-navpage a', function(e){
1336					e.preventDefault();
1337					if($(this).closest('li').hasClass('disabled')) return;
1338
1339					var tabKey = $(this).closest('.psearch-tab-navpage').attr('data-tkey'); // shopping|forum|gallery|etc
1340					var page = parseInt($(this).attr('data-page'), 10) || 1;
1341
1342					// 상태 저장
1343					var tabPages = $pEL.data('psearchTabPages') || {};
1344					tabPages[tabKey] = page;
1345					$pEL.data('psearchTabPages', tabPages);
1346
1347					// 전체 패널 재렌더 (로컬 renderPanel 제거)
1348					$.psearch.rerenderPanels($pEL);
1349
1350					// 활성 탭 유지
1351					var active = $pEL.find('.psearch-tabs').attr('data-active') || 'all';
1352					$pEL.find('.psearch-panel').hide();
1353					$pEL.find('.psearch-panel[data-tab="'+active+'"]').show();
1354				});
1355
1356			}
1357
1358			// deferred.resolve();
1359		 //    return deferred.promise();
1360		},
1361		pItemEmpty: function() {
1362			// console.log('psearch pItemEmpty');
1363			return `
1364				<div class="pitem sample-item">
1365					<div class="col-xs-3 col-sm-3 col-md-3 no-padding">
1366						<div class="center-block"><img src="//storage.googleapis.com/i.addblock.net/blitem_empty_img.png" alt="" class="img-responsive"/></div>
1367					</div>
1368				</div>
1369			`;
1370		},
1371		pItem: function(o) {
1372			// console.log('psearch pItem',o);
1373			var img_path = (typeof o.settings.storage != 'undefined' && o.settings.storage) ? o.settings.storage : property.RPATH;
1374			var img_original = (typeof o.settings.storage != 'undefined' && o.settings.storage) ? img_path + '1920/' : img_path;
1375			var img_src = getServeImage(o.image,600,img_path);
1376			var src_s0 = getServeImage(o.image,'0',img_path);
1377
1378			var glink = (typeof o.settings.glink != 'undefined' && o.settings.glink) ? o.settings.glink : '';
1379			var glink_target = (typeof o.settings.glink_target != 'undefined' && o.settings.glink_target) ? o.settings.glink_target : '';
1380
1381			if(glink) {
1382				if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
1383					var bookmark_seq = glink.replace(/^\@/g,'');
1384					if(typeof property.SETTINGS.blockBookmarkList == 'undefined' || typeof property.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
1385						glink = '';
1386						glink_target = '';
1387					}
1388				} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
1389					glink_target = '';
1390				} else if($.inArray(normalizeMemberMenuLinkPage(glink), property.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
1391				} else {																					// link-type: link-out      ==> a[attr-link]
1392					if(checkBase64Encode(glink)) glink = Base64.decode(glink);
1393				}
1394			}
1395
1396			var pitem_src = '';
1397			var pitem_option = '';
1398
1399			if(glink) {
1400				pitem_src = makeLinkUrl(glink, property.ONE, property.VIEW);
1401
1402				if(glink.match(/^\@/g) !== null) {
1403					pitem_option = 'attr-bookmark="' + glink.replace(/^\@/g,'') + '"';
1404				} else if(glink.match(/^flink\@[0-9]/g) !== null) {
1405					pitem_option = 'attr-flink="' + glink.replace(/^flink\@/g,'') + '"';
1406				} else if(property.MENULIST.includes(normalizeMemberMenuLinkPage(glink))) {
1407					pitem_option = 'data-user-link="' + pitem_src + '"';
1408				} else {
1409					var checkURL = /(http(s)?:\/\/)?\S+(\.[^(\n|\t|\s|\/))]+)+/gi;
1410					if(checkURL.test(glink)) pitem_option = 'attr-link="' + glink + '"';
1411					else pitem_src = 'javascript:;';
1412				}
1413			} else {
1414				// etc(page) 해당 페이지로 이동
1415				if (o.type === 'page') {
1416					var map = property.MENU_BREADCRUMB_MAP || {};
1417
1418					// 1) page slug 구하기: "스토리-서브11122,580901" 같은 경우 대비
1419					var pageRaw = (o.page || '').toString();
1420					var slug = pageRaw.indexOf(',') > -1 ? $.trim(pageRaw.split(',')[0]) : pageRaw;
1421
1422					// 2) 상세 URL이 있든 없든 메뉴 키는 "/slug" 로 맞춰서 lookup
1423					var key = $.psearch.normalizeHref('/' + slug);
1424					var crumb = map[key];
1425
1426					if (crumb) {
1427						o.cont = crumb; // "홈 > 브랜드 스토리 > 스토리 서브11122"
1428					} else {
1429					// fallback
1430						o.cont = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + slug.replace(/-/g,' ');
1431					}
1432
1433					// /url/view/id 로 이동
1434					if (pageRaw.indexOf(',') > -1) {
1435
1436						var parts = pageRaw.split(',');
1437						var urlPage = $.trim(parts[0] || '');
1438						var viewId  = $.trim(parts[1] || '');
1439
1440						if (urlPage && viewId) {
1441							// /{urlPage}/view/{viewId}
1442							pitem_src = ((property.URL=='/') ? '' : property.URL) + '/' + urlPage + '/view/' + viewId;
1443							pitem_option = ''; // view 링크는 data-user-link 필요없음
1444						} else {
1445							pitem_src = 'javascript:;';
1446						}
1447
1448					} else {
1449						if (property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1450							pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1451							pitem_option = 'data-user-link="' + o.page + '" data-psearch-pid="' + o.pid + '"';
1452						} else {
1453							pitem_src = 'javascript:;';
1454						}
1455					}
1456
1457				// forum은 /forum/view/{id} 로 이동
1458				} else if (o.type === 'forum') {
1459
1460					var base = (PAGE_MODE == 'r') ? '/render' : '';
1461					pitem_src = base + '/forum/view/' + o.id;
1462					pitem_option = ''; // forum은 data-user-link 필요 없음
1463
1464				// 쇼핑(상품) view 페이지 유지
1465				} else if (o.type === 'gallery' && o.p_mode === 'shopping') {
1466
1467					pitem_src = ((property.URL == '/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1468
1469				// 갤러리(상세페이지) view 페이지 이동
1470				} else if (o.type === 'gallery' && o.p_mode === 'project') {
1471
1472					pitem_src = ((property.URL == '/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1473
1474				// 일반 갤러리/기타 → 해당 페이지로 이동 (블럭 위치로)
1475				} else {
1476
1477					if (property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1478						pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1479						pitem_option = 'data-user-link="' + o.page + '" data-psearch-pid="' + o.pid + '"';
1480					} else {
1481						pitem_src = 'javascript:;';
1482					}
1483
1484				}
1485			}
1486
1487			// } else {
1488			// 	if (o.p_mode == 'gallery') {
1489			// 		if(property.MENULIST.indexOf(o.page) > -1 || property.ONE) {
1490			// 			var pitem_cookie = (o.p_cookie == 'gallery') ? 'data-psearch-pid="' + o.pid + '"' : 'data-
1490psearch-seq="' + o.id + '"';
1491			// 			pitem_option = 'data-user-link="' + o.page + '" '+pitem_cookie;
1492			// 			pitem_src = makeLinkUrl(o.page, property.ONE, property.VIEW);
1493			// 		} else {
1494			// 			pitem_src = 'javascript:;';
1495			// 		}
1496			// 	} else {
1497			// 		pitem_src = ((property.URL=='/') ? '' : property.URL) + '/' + o.page + '/view/' + o.id;
1498			// 	}
1499			// }
1500			var isGallery = (o.type === 'gallery') ? '<img src="' + o.thumb + '" alt="" class="img-responsive" />' : '';
1501			// console.log(o);
1502			var str = '\
1503					<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 + '">\
1504						<a href="'+pitem_src+'" '+ pitem_option + '>\
1505							'+ isGallery +'\
1506							<div class="info-wrap">\
1507								<h5 class="'+ ($.inArray('title', o.field_disable) > -1 ? 'hide' : '') +'">' + o.title + '</h5>\
1508							';
1509				if(o.p_mode == 'shopping' || o.p_mode == 'gallery') str += '<p class="'+ ($.inArray('caption', o.field_disable) > -1 ? 'hide' : '') +'">' + o.cont + '</p>';
1510				else str += '<p class="'+ ($.inArray('cont', o.field_disable) > -1 ? 'hide' : '') +'">' + o.cont + '</p>';
1511								
1512				if(o.p_mode == 'shopping') {
1513					if(o.price) {
1514						str += '\
1515								<p class="price-box '+ ($.inArray('price', o.field_disable) > -1 ? 'hide' : '') +'"><span class="figure-krw">₩</span> ' + o.price + '</p>\
1516								<span></span>\
1517						';
1518					}
1519
1520					if(o.review_onoff && o.review_cnt > 0) {
1521						str += '\
1522								<ul class="review-box">\
1523									<li class="review-cnt">리뷰 <span class="sh-pcolor">' + o.review_cnt + '</span></li>\
1524									<li class="review-score">평점 <span class="sh-pcolor">' + o.review_score + '</span></li>\
1525								</ul>\
1526						';
1527					}
1528
1529			// let str = `
1530			// <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}">
1531			// 	<a href="${pitem_src}" ${pitem_option}>
1532			// 		<img src="${o.thumb}" alt="" class="img-responsive" />
1533			// 		<div class="info-wrap">
1534			// 			<h5>${htmlDecode(o.title)}</h5>
1535			// 			<p>${htmlDecode(o.cont)}</p>
1536			// `;
1537
1538					var basket_class = (o.basket_off || $.inArray('basket', o.field_disable) > -1) ? 'hide' : '';
1539					str += '\
1540							<div class="basket-box ' + basket_class + '"><span class="basket-btn">장바구니 담기</span></div>\
1541					';
1542				}
1543				
1544				if(o.type == 'forum') {
1545					// var cate = o.cate;
1546					// if(cate == '') cate = '카테고리 없음'
1547					str += '\
1548						<p>\
1549							<span class="'+ ($.inArray('name', o.field_disable) > -1 ? 'hide' : '') +'">'+ o.name +' |</span>\
1550							<span class="'+ ($.inArray('date', o.field_disable) > -1 ? 'hide' : '') +'">'+ o.date +' |</span>\
1551							<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>\
1552							<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>\
1553						</p>\
1554					';
1555				}
1556				str += '\
1557							</div>';
1558				if(o.type == 'forum') {
1559					var thumb = (o.thumb) ? o.thumb : '//storage.googleapis.com/i.addblock.net/icon/noimage_250_black.png',
1560						empty = (o.thumb == '') ? 'empty' : '';
1561					str += '\
1562						<div class="image-wrap '+ empty +'"><image src='+ thumb +'></div>\
1563					';
1564				}
1565				str += '\
1566						</a>\
1567					</div>\
1568			';
1569			// console.log(str);
1570			return str;
1571		},
1572		// setPagination: function($obj,stx,total,page_num,view) {
1573		// 	// console.log('psearch setPagination');
1574		// 	var checkLux = (PAGE_MODE == 'c') ? LUX : property.LUX;
1575		// 	if(checkLux) stx += location.search;
1576
1577		// 	var p_url = (PAGE_MODE == 'r') ? '/render' : '',
1578		// 		page_view = 5,
1579		// 		total_page = Math.ceil(total/view),
1580		// 		start_page = (page_num%page_view) ? page_num - (page_num%page_view) + 1 : page_num - (page_view-1), 
1581		// 		end_page = start_page + (page_view-1);
1582		// 	if(end_page > total_page) end_page = total_page;
1583
1584		// 	var prev_page = ((start_page-1) == 0) ? 1 : start_page-1,
1585		// 		next_page = ((end_page+1) > total_page) ? end_page : end_page+1;
1586
1587		// 	$obj.find('li').addClass('psearch-page');
1588
1589		// 	var $first = $obj.children().first().clone(),
1590		// 		$prev = $obj.children().first().clone(),
1591		// 		$next = $obj.children().last().clone(),
1592		// 		$last = $obj.children().last().clone();
1593
1594		// 	$obj.empty();
1595		// 	$first.find('a').attr('href',p_url+'/psearch/num/1/stx/'+stx).find('i').removeClass('fa-angle-left').addClass('fa-angle-double-left');
1596		// 	$prev.find('a').attr('href',p_url+'/psearch/num/'+prev_page+'/stx/'+stx);
1597		// 	$next.find('a').attr('href',p_url+'/psearch/num/'+next_page+'/stx/'+stx);
1598		// 	$last.find('a').attr('href',p_url+'/psearch/num/'+total_page+'/stx/'+stx).find('i').removeClass('fa-angle-right').addClass('fa-angle-double-right');
1599
1600		// 	$obj.append($prev).append($next);
1601		// 	for(i=start_page; i<=end_page; i++) {
1602		// 		var active = (i == page_num) ? 'active' : '';
1603		// 		$obj.children().last().before($('<li class="psearch-page '+ active +'"><a href="'+p_url+'/psearch/num/'+i+'/stx/'+stx+'">' + i + '</a></li>'));
1604		// 	}
1605
1606		// 	if(start_page == prev_page) $obj.children().eq(0).hide();
1607		// 	if(end_page == next_page) $obj.children().last().hide();
1608
1609		// 	// if(start_page > page_view) $obj.prepend($first);
1610		// 	// if(end_page < total_page) $obj.append($last);
1611
1612		// },
1613		bindClientPagination: function($wrap){
1614			$wrap.find('.psearch-client-nav .psearch-page a').off('click').on('click', function(e){
1615				e.preventDefault();
1616
1617				var $nav = $(this).closest('.psearch-client-nav');
1618				if($nav.find('li.disabled').length && $(this).parent().hasClass('disabled')) return;
1619
1620				var key = $nav.attr('data-key');     // 예: "shopping" 또는 "all:shopping"
1621				var page = parseInt($(this).attr('data-page'), 10) || 1;
1622
1623				if (typeof key === 'string' && key.indexOf('all:') === 0) {
1624					var sectionKey = key.replace('all:', '');
1625					var secPages = $wrap.data('psearchAllSectionPages') || {};
1626					secPages[sectionKey] = page;
1627					$wrap.data('psearchAllSectionPages', secPages);
1628				} else if (typeof key === 'string') {
1629					var tabPages = $wrap.data('psearchTabPages') || {};
1630					tabPages[key] = page;
1631					$wrap.data('psearchTabPages', tabPages);
1632				} else {
1633					// 디버깅용
1634					console.warn('psearch pagination key is undefined', this);
1635				}
1636
1637				// 패널 재렌더
1638				$.psearch.rerenderPanels($wrap);
1639				$.psearch.initTabs($wrap);
1639 // 활성 탭 유지
1640			});
1641		},
1642		renderAllSection: function($wrap, sectionKey, list){
1643			var total = (list && list.length) ? list.length : 0;
1644
1645			// ✅ 전체탭에서만 쓰는 섹션이므로: 결과 없으면 아예 출력하지 않음
1646			if(total === 0) return '';
1647
1648			var pageSize = $wrap.data('psearchPageSize') || 8;
1649			var secPages = $wrap.data('psearchAllSectionPages') || {};
1650			var cur = secPages[sectionKey] || 1;
1651
1652			var totalPage = Math.ceil(total / pageSize);
1653			var sliced = list.slice((cur-1)*pageSize, cur*pageSize);
1654
1655			var title_name = (sectionKey == 'shopping') ? $.lang[LANG]['fheader.psearch.shopping']
1656							: (sectionKey == 'forum') ? $.lang[LANG]['fheader.psearch.forum']
1657							: (sectionKey == 'gallery') ? $.lang[LANG]['fheader.psearch.gallery']
1658							: $.lang[LANG]['fheader.psearch.etc'];
1659
1660			var html = '<div class="psearch-all-section" data-section="'+sectionKey+'">';
1661			html += '<div class="psearch-section-title">'+title_name+'</div>';
1662
1663			html += '<div class="row multi-columns-row" data-loop="true">';
1664			for(var i=0;i<sliced.length;i++){
1665				html += $.psearch.pItem(sliced[i]);
1666			}
1667			html += '</div>';
1668
1669			// 섹션 페이지네이션(원하는 정책대로: 1페이지도 무조건 노출이면 totalPage<=0 체크로 조정)
1670			html += $.psearch.renderSectionPagination(sectionKey, cur, totalPage);
1671
1672			html += '</div>';
1673			return html;
1674		},
1675		renderTabPanel: function($wrap, tabKey, list){
1676			var pageSize = $wrap.data('psearchPageSize') || 8;
1677			var tabPages = $wrap.data('psearchTabPages') || {};
1678			var cur = tabPages[tabKey] || 1;
1679
1680			var total = (list && list.length) ? list.length : 0;
1681			var totalPage = Math.ceil(total / pageSize);
1682			var sliced = (total > 0) ? list.slice((cur-1)*pageSize, cur*pageSize) : [];
1683
1684			var html = '<div class="psearch-panel" data-tab="'+tabKey+'" style="display:none;">';
1685
1686			if(total === 0){
1687			html += '<div class="row text-center pitem-empty">' + $.lang[LANG]["fheader.psearch.pitem-empty"] + '</div>';
1688			} else {
1689			html += '<div class="row multi-columns-row" data-loop="true">';
1690			for(var i=0;i<sliced.length;i++){
1691				html += $.psearch.pItem(sliced[i]);
1692			}
1693			html += '</div>';
1694
1695			// 탭 pagination
1696			html += $.psearch.renderTabPagination(tabKey, cur, totalPage);
1697			}
1698
1699			html += '</div>';
1700			return html;
1701		},
1702		rerenderPanels: function($wrap){
1703			var groups = $wrap.data('psearchGroups') || {};
1704			if(!groups) return;
1705
1706			// 패널 영역만 다시 그림
1707			var $panels = $wrap.find('.psearch-tab-panels');
1708			if($panels.length==0) return;
1709
1710			var html = '';
1711
1712			// all 패널
1713			html += (function(){
1714				function renderSection(sectionKey, list){
1715					return $.psearch.renderAllSection($wrap, sectionKey, list);
1716				}
1717				var h = '<div class="psearch-panel" data-tab="all" style="display:none;">';
1718				h += renderSection('shopping', groups.shopping);
1719				h += renderSection('gallery', groups.gallery);
1720				h += renderSection('forum', groups.forum);
1721				h += renderSection('etc', groups.etc);
1722				h += '</div>';
1723				return h;
1724			})();
1725
1726			// 탭 패널들
1727			html += $.psearch.renderTabPanel($wrap, 'shopping', groups.shopping);
1728			html += $.psearch.renderTabPanel($wrap, 'forum', groups.forum);
1729			html += $.psearch.renderTabPanel($wrap, 'gallery', groups.gallery);
1730			html += $.psearch.renderTabPanel($wrap, 'etc', groups.etc);
1731
1732			$panels.html(html);
1733
1734			// 클릭 바인딩 다시
1735			$.psearch.bindClientPagination($wrap);
1736		},
1737		renderSectionPagination: function(sectionKey, current, totalPage){
1738			if(totalPage <= 0) return '';
1739
1740			var pageView = 5;
1741			var start = (Math.floor((current-1)/pageView)*pageView) + 1;
1742			var end = Math.min(start + pageView - 1, totalPage);
1743			var showArrows = totalPage > pageView;
1744			var prevBlock = Math.max(1, start-1);
1745			var nextBlock = Math.min(totalPage, end+1);
1746
1747			// all 탭 섹션용 key는 "all:섹션"
1748			var html = '<nav class="text-center clear psearch-client-nav" data-key="all:'+sectionKey+'">';
1749			html += '<ul class="pagination pagination-sm psearch-pagination">';
1750
1751			if(showArrows){
1752				html += '<li class="psearch-page prev '+(start==1?'disabled':'')+'">'
1753				+ '<a href="#" data-page="'+prevBlock+'"><i class="fa fa-angle-left"></i></a></li>';
1754			}
1755
1756			for(var p=start; p<=end; p++){
1757				html += '<li class="psearch-page '+(p==current?'active':'')+'">'
1758				+ '<a href="#" data-page="'+p+'">'+p+'</a></li>';
1759			}
1760
1761			if(showArrows){
1762				html += '<li class="psearch-page next '+(end==totalPage?'disabled':'')+'">'
1763				+ '<a href="#" data-page="'+nextBlock+'"><i class="fa fa-angle-right"></i></a></li>';
1764			}
1765
1766			html += '</ul></nav>';
1767			return html;
1768		},
1769		renderTabPagination: function(tabKey, current, totalPage){
1770			if(totalPage <= 0) return '';
1771
1772			var pageView = 5;
1773			var start = (Math.floor((current-1)/pageView)*pageView) + 1;
1774			var end   = Math.min(start + pageView - 1, totalPage);
1775			var showArrows = totalPage > pageView; // 6페이지 이상일 때만 prev/next
1776			var prevBlock = Math.max(1, start-1);
1777			var nextBlock = Math.min(totalPage, end+1);
1778
1779			var html = '<nav class="text-center clear psearch-tab-navpage" data-tkey="'+tabKey+'">';
1780			html += '<ul class="pagination pagination-sm psearch-pagination">';
1781
1782			if(showArrows){
1783				html += '<li class="psearch-page prev '+(start==1?'disabled':'')+'">'
1784						+ '<a href="#" data-page="'+prevBlock+'"><i class="fa fa-angle-left"></i></a></li>';
1785			}
1786			for(var p=start; p<=end; p++){
1787				html += '<li class="psearch-page '+(p==current?'active':'')+'">'
1788					+ '<a href="#" data-page="'+p+'">'+p+'</a></li>';
1789			}
1790			if(showArrows){
1791				html += '<li class="psearch-page next '+(end==totalPage?'disabled':'')+'">'
1792						+ '<a href="#" data-page="'+nextBlock+'"><i class="fa fa-angle-right"></i></a></li>';
1793			}
1794
1795			html += '</ul></nav>';
1796			return html;
1797		},
1798		showSiteProjectSEARCH: function(view_page) {
1799			// console.log('psearch showSiteProjectSEARCH');
1800			if(PAGE_MODE == 'c') return false;
1801			$('.cl-popupBanner.openPopupBanner').addClass('zindex20');
1802
1803			var sid = property.SID,
1804				checkUsedMpcWeb = property.SETTINGS.vpMode_onoff;
1805			
1806			var active_nav = $('.el-menu header');
1807			if(window.innerWidth <= 768) active_nav = active_nav.is('.cl-nav') ? $('.clnav-sidemobile') : $('#mobile-nav');
1808
1809			var psearchWarp = active_nav.find('.psearch-overlay');
1810			if(view_page) psearchWarp = $('.psearch-view').find('.psearch-wrap');
1811
1812			psearchWarp.find('input.psearch-input').live({
1813				focus: function() {
1814				},
1815				keydown: function(key) {
1816					if(key.keyCode == 13) psearchWarp.find('.psearch-icon').click();
1817				},
1818			});
1819
1820			psearchWarp.find('.psearch-icon').live({
1821				click: function() {
1822					var psearch_wrap = $(this).closest('.psearch-body');
1823					var psearch_input = $(this).closest('.psearch-wrap').find('input.psearch-input');
1824                    var regExp = new RegExp('^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣\\?\\@\\!\\- ]*$');
1825					var stx = psearch_input.val().trim();
1826					var error_str = '';
1827
1828					if(stx.length == 0) error_str = $.lang[LANG]['psearch.input.empty'];
1829					else if(!regExp.test(stx)) error_str = $.lang[LANG]['psearch.input.regexp'];
1830
1831					if(error_str.length > 0) {
1832						if(psearch_wrap.find('.error').length > 0) psearch_wrap.find('.error').html('<i class="cl-icon alert02"></i> ' + error_str);
1833						else psearch_input.closest('.psearch-wrap').after('<span class="error"><i class="cl-icon alert02"></i> ' + error_str + '</span>');
1834						
1835						psearch_input.focus();
1836						return;
1837					} else {
1838						psearch_wrap.find('.error').remove();
1839					}
1840
1841					//check mpcWeb Mode
1842					if(checkUsedMpcWeb) {
1843						var viewportMode = property.SETTINGS.viewportMode,
1844							vpmode = (typeof $('.mobilepc_ch').attr('data-desktop-option') != 'undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : viewportMode;
1845						$.cookie('desktop-option',vpmode, { path: '/' });
1846					}
1847					
1848					var url = (PAGE_MODE=='s') ? '' : '/render',
1849						href = url + '/psearch/num/1/stx/' + encodeURIComponent(stx);
1850					location.href = href;
1851
1852				}
1853			});
1854
1855		},
1856		normalizeHref: function(href) {
1857			href = (href || '').toString().trim();
1858			if(!href) return '';
1859
1860			href = href.replace(/^\/render/i, '');
1861			href = href.split('#')[0].split('?')[0];
1862
1863			if(/^https?:\/\//i.test(href)){
1864				try { href = new URL(href).pathname; } catch(e){}
1865			}
1866
1867			href = href.replace(/\/view\/\d+$/i, '');
1868
1869			if(href && href.charAt(0) !== '/') href = '/' + href;
1870			return href;
1871		},
1872		buildMenuBreadcrumbMap: function(menuOption) {
1873			var map = {}; // key: normalized href  value: "홈 > 메인 > 서브"
1874
1875			if(!menuOption || !menuOption.length) return map;
1876
1877			for(var i=0; i<menuOption.length; i++){
1878				var m = menuOption[i];
1879				var mainName = (m && m.name) ? m.name : '';
1880				var mainHref = $.psearch.normalizeHref(m && m.href);
1881
1882				if(mainHref){
1883				map[mainHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName;
1884				}
1885
1886				var children = (m && m.children) ? m.children : [];
1887				for(var j=0; j<children.length; j++){
1888				var c = children[j];
1889				var subName = (c && c.name) ? c.name : '';
1890				var subHref = $.psearch.normalizeHref(c && c.href);
1891
1892				if(subHref){
1893					map[subHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName + ' > ' + subName;
1894				}
1895				}
1896			}
1897			return map;
1898		}
1899	}
1900
1901	$.shopping = {
1902		init: function() {
1903			// console.log('shopping init');
1904			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
1905				fheader_selec = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar');
1906
1907			if(!fheader_selec.hasClass('navbar-fheader')) return false;
1908
1909			var sid = (PAGE_MODE == 'c') ? SID : property.SID,				
1910				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE;
1911
1912			var scart = (s_validtype == 'SM') ? true : false;
1913			
1914			if(scart) $.shopping.set('on',checkEllist);
1915			else $.shopping.set('off',checkEllist);
1916		},
1917		set: function(onoff,checkEllist){
1918			var checkClnav =  $.clnav.check();
1919			if(checkClnav) return false;
1920
1921			// console.log('shopping set');
1922			var checkEllist = ( typeof checkEllist!='undefined' && checkEllist) ? checkEllist : false;
1923			fheader_selec = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar');
1924			if(!fheader_selec.hasClass('navbar-fheader')) return false;
1925
1926			if(onoff.match(/on/gi)) $.shopping.makeSiteFixedCART();
1927			else {
1928				$('#fixed-menu, #fixed-menu-sub').find('.siteCART').remove();
1929				$('#tpl-menu').find('.siteCART').remove();
1930				$('div.siteCART.micon').remove();
1931			}
1932		},
1933		makeSiteFixedCART: function() {
1934			var checkClnav =  $.clnav.check();
1935			if(checkClnav) return false;
1936
1937			// console.log('shopping makeSiteFixedCART');
1938			var checkEllist = (typeof isElviewPage != 'undefined' && isElviewPage === true) ? true : false,
1939				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'),
1940				mobile_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
1941				checkfixtype_nav = (checkEllist) ? $('.elviewhtml header.navbar') : $('.el-menu header.navbar'),
1942				checkFixTypeMenu = (typeof checkfixtype_nav.attr('data-fixtype') != 'undefined' && checkfixtype_nav.attr('data-fixtype')) ? true : false;
1943
1944			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
1945				cart_url = (PAGE_MODE == 'c' || PAGE_MODE == 'r') ? 'javascript:;' : '/_cart',
1946				content = '\
1947				<li class="siteCART">\
1948					<a href="' + cart_url + '"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a>\
1949				</li>\
1950			',
1951				mobile_content = '\
1952				<div class="siteCART micon">\
1953					<a href="' + cart_url + '"><i class="cl-icon cl_icon_cart" aria-hidden="true"></i></a>\
1954				</div>\
1955			';
1956
1957			/* Shopping Only KO Site */
1958			// var slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
1959			// if(typeof slang != 'undefined' && typeof slang.select_code != 'undefined' && slang.select_code != 'ko') {
1960			// 	$('#fixed-menu, #fixed-menu-sub').find('.siteCART').remove();
1961			// 	$('#tpl-menu').find('.siteCART').remove();
1962			// 	$('div.siteCART.micon').remove();
1963			// 	return false;
1964			// }
1965
1966			if(pc_nav.find('.siteCART').length > 0) {
1967				if(checkFixTypeMenu) pc_nav.find('.siteCART').find('a').attr('href',cart_url);
1968				else pc_nav.find('.siteCART').replaceWith(content);
1969			} else pc_nav.append(content);
1970
1971			if(mobile_nav.find('div.siteCART.micon').length>0) {
1972				if(checkFixTypeMenu) mobile_nav.find('div.siteCART.micon').find('a').attr('href',cart_url);
1973				else mobile_nav.find('div.siteCART.micon').replaceWith(mobile_content);
1974			} else {
1975				mobile_nav.find('.navbar-toggle').before(mobile_content);
1976			}
1977
1978			if(pc_nav.find('.siteCART').css('display')=='none') mobile_nav.find('.siteCART.micon').hide();
1979			
1980			var fixed_a_color = (checkFixTypeMenu) ? '' : $('.el-menu .navbar-toggle .
1980icon-bar').css('background-color');
1981			//var mobile_color = $('#mobile-nav').find('.cl-fixbtn.cl-visible').find('svg').css('fill');
1982			if(checkEllist && typeof PAGE_MODE!='undefined' && PAGE_MODE=='c') {
1983				fixed_a_color = mobile_nav.find('.navbar-toggle .icon-bar').css('background-color');
1984			}
1985			
1986
1987			if(pc_nav.closest('header').find('.cl-menu-option').length > 0) {
1988			} else {
1989				mobile_nav.find('div.siteCART.micon').css({
1990					'color': fixed_a_color,
1991					'right': '56px',
1992					'display': (checkFixTypeMenu) ? $('header.navbar-fheader').find('.siteCART.cl-fixbtn').css('display') : ''
1993				});
1994			}
1995			
1996			if(PAGE_MODE == 's') {
1997				var cart_active = Number(property.CART);
1998				// $.ajax({
1999				// 	type: 'POST',
2000				// 	url: '/_basket/check',
2001				// 	data: { sid : sid },
2002				// 	dataType: 'json',
2003				// 	async: true,
2004				// 	success: function(r) {
2005				// 		if(typeof r.error != 'undefined' && r.error) {
2006				// 			// console.log(r.error);
2007				// 			return false;
2008				// 		}
2009				// console.log(property.CART);
2010						if(Number(cart_active) > 0) {
2011							if(checkFixTypeMenu) {
2012								var cart_active_str = cart_active.toString(),
2013									$selec = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub'),
2014									fixtypeNum = $('.el-menu header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),
2015									cart_active_selec = ($selec.find('.siteCART .cart-active-txt').length>0) ? $selec.find('.cart-active-txt') : $selec.find('.cart-active'),									
2016									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' : ''),
2017									radius_arr = ['03','04','05','06','10'];
2018
2019								cart_active_selec.text(cart_active);
2020								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').show();
2021								$('.el-menu header.navbar').find('.siteCART.micon .cl_icon_cart').html('<span class="cart-active"></span>');
2022
2023								if($.inArray(fixtypeNum,radius_arr) > -1) $selec.find('.cart-active').removeClass('cartActive_2 cartActive_3').addClass(cart_active_class);
2024								
2025							} else {
2026								var cart_active = '<span class="cart-active"></span>';
2027								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cl_icon_cart').html(cart_active);
2028							}
2029							
2030						} else {
2031							var r = { member : property.UMEMBER },
2032								check_login = (typeof r.member != 'undefined') ? r.member.check_login : false;
2033
2034							// if(!check_login) $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').hide();
2035							// else $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.siteCART .cart-active').show();
2036
2037							if(checkFixTypeMenu && Number(cart_active)==0) {
2038								$('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.cart-active').hide();
2039							}
2040						}
2041				// 	}
2042				// });
2043			} else {
2044				if(PAGE_MODE=='r' && checkFixTypeMenu) $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub').find('.cart-active').remove();
2045			}
2046
2047		}
2048	}
2049
2050	$.slang = {
2051		init: function(data) {
2052            // console.log('$.slang.init()');
2053			if(typeof data != 'undefined' && data) {
2054				if(PAGE_MODE == 'c') SLANG = data;
2055				else property.SLANG = data;
2056			}
2057
2058			var slang = (PAGE_MODE == 'c')
2059					? ((typeof SLANG != 'undefined' && SLANG) ? SLANG : {})
2060					: ((typeof property != 'undefined' && property && property.SLANG) ? property.SLANG : {}),
2061				slang_lists = $.isArray(slang['lists']) ? slang['lists'] : [],
2062				s_validplan = (PAGE_MODE == 'c') ? VALIDPLAN : property.VALIDPLAN,
2063				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2064				checkFree = (!s_validplan || s_validtype == 'PK') ? true : false;
2065
2066			if(checkFree || $.isEmptyObject(slang) || slang.use_language != 'on' || slang_lists.length === 0) {
2067				$.slang.set('off');
2068			} else {
2069				$.slang.set('on');
2070			}
2071		},
2072		set: function(onoff) {
2073            // console.log('$.slang.set()');
2074			var check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false,
2075				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'),
2076				mobile_nav = (check_fh) ? $('#mobile-nav #fixed-menu') : $('.el-menu header.navbar'),
2077				checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2078
2079			if(onoff.match(/on/gi)) $.slang.make();
2080			else {
2081				$('.el-menu .siteLANG, #mobile-nav .siteLANG').remove();
2082
2083				if(pc_nav.find('.siteUM').css('display')=='none') {
2084					if(!checkFixOnSearch) {
2085						mobile_nav.parent().addClass('hide');
2086					} else {
2087						mobile_nav.parent().find('.login-content').css('pointer-events','none');
2088						mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2089					}
2090				}
2091			}
2092		},
2093		make: function() {
2094            // console.log('$.slang.make()');
2095			var slang = (PAGE_MODE == 'c')
2096					? ((typeof SLANG != 'undefined' && SLANG) ? SLANG : {})
2097					: ((typeof property != 'undefined' && property && property.SLANG) ? property.SLANG : {}),
2098				check_fh = ($('.el-menu > header.navbar').hasClass('navbar-fheader')) ? true : false,
2099				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2100				slang_data = $.isArray(slang['lists']) ? slang['lists'] : [],
2101				slang_str = (typeof slang['select'] != 'undefined') ? slang['select'] : '',
2102				slang_arrow = (slang_data.length > 1) ? '<i class="cl-icon arrow09" aria-hidden="true"></i>' : '',
2103				slang_list = '',
2104				checkFixLangTypeMenu = (typeof $('.el-menu > header.navbar').attr('data-fixlangtype') != 'undefined' && $('.el-menu > header.navbar').attr('data-fixlangtype')) ? true : false,
2105				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'),
2106				mobile_nav = (check_fh) ? $('#mobile-nav #fixed-menu') : $('.el-menu header.navbar'),
2107				fixbtnData = ($('.el-menu > header.navbar').hasClass('sidebar')) ? $.menuFixBtn.getData(pc_nav) : $.menuFixBtn.getData($('.el-menu > header.navbar')),
2108				checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2109				
2110			if(slang_data.length === 0) {
2111				$.slang.set('off');
2112				return;
2113			}
2114
2115
2116			$.each(slang_data, function(i,o) {
2117				var active = (o['name'] == slang_str) ? 'active' : '';
2118
2119				/* Shopping Only KO Site */
2120				// if(active && o['code'] != 'ko') {
2121				// 	pc_nav.find('.makeSiteSEARCH').remove();
2122				// 	pc_nav.find('.siteCART').remove();
2123				// }
2124
2125				slang_list += '\
2126						<li class="' + active + '"><a href="javascript:;" data-code="' + o['code'] + '">' + o['name'] + '</a></li>\
2127				';
2128			});
2129
2130			/*SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG;*/
2131			var content = (checkFixLangTypeMenu) ? ($('.el-menu > header.navbar').hasClass('sidebar') ? $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false) : $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'])) : '\
2132				<li class="siteLANG dropdown">\
2133					<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>\
2134					<ul class="dropdown-menu">\
2135						' + slang_list + '\
2136					</ul>\
2137				</li>\
2138				',
2139				mobile_content = (checkFixLangTypeMenu) ? $.menuFixBtn.fixLangSet(fixbtnData['fixlangtypeNum'],false,'',true) : ((check_fh) ? '\
2140								<li class="siteLANG dropdown">\
2141									<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>\
2142									<div class="dropdown-menu-wrap" id="m-dropdown-wrap-lang">\
2143										<span class="dropdown-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Change Multilingual Site"></span></span>\
2144										<ul class="dropdown-menu">\
2145											' + slang_list + '\
2146										</ul>\
2147									</div>\
2148								</li>\
2149								':'\
2150								<div class="siteLANG micon dropdown">\
2151									<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>\
2152								</div>\
2153								'),
2154				mobile_dropdown_menu = '\
2155				<div class="siteLANG-dmenu-wrap">\
2156					<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2157					<ul class="dropdown-menu">\
2158						' + slang_list + '\
2159					</ul>\
2160				</div>\
2161			';
2162
2163			if(pc_nav.find('.siteLANG').length > 0) {
2164				pc_nav.find('.siteLANG').replaceWith(content);
2165				if($('.el-menu >
2165 header.navbar').hasClass('sidebar')) {
2166					pc_nav.find('.fh-line').remove();
2167					pc_nav.parents('.menu-inner').after('<hr class="fh-line" />');
2168				} 
2169			} else {
2170				pc_nav.find('.siteLANG.cl-fixbtn').remove();
2171				if(checkFixLangTypeMenu && $('.el-menu > header.navbar').hasClass('sidebar')) {
2172					pc_nav.find('.fh-line').remove();
2173					$('.el-menu > header.navbar').find('.menu-inner').after(content);
2174					pc_nav.parents('.menu-inner').after('<hr class="fh-line" />');
2175				} else pc_nav.append(content);
2176			}
2177			if(pc_nav.find('.siteUM').css('display')=='none') {
2178				if(!checkFixOnSearch) {
2179					mobile_nav.parent().addClass('hide');
2180				} else {
2181					mobile_nav.parent().find('.login-content').css('pointer-events','none');
2182					mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2183				}
2184			}
2185		
2186			if(check_fh) {
2187				if(checkFixLangTypeMenu) {
2188					if(mobile_nav.find('.cl-fixbtn.siteLANG').length==0) {
2189						$('#mobile-nav').append(mobile_content);
2190						$('#mobile-nav').find('.cl-fixbtn.siteLANG.dropup .dropdown-backdrop').remove();
2191					}
2192
2193					var mobile_color = mobile_nav.find('.siteSEARCH.cl-fixbtn svg').css('fill');
2194					
2195					$('#mobile-nav').find('.siteLANG.cl-fixbtn a').css({
2196						'color':mobile_color,
2197						'border-color':mobile_color
2198					})
2199
2200					$('#mobile-nav').find('.siteLANG.cl-fixbtn a svg').css('fill',mobile_color);
2201				} else {
2202					if(mobile_nav.find('.siteLANG').length > 0) mobile_nav.find('.siteLANG').replaceWith(mobile_content);
2203					else mobile_nav.append(mobile_content);
2204				}
2205			} else {
2206				if(mobile_nav.find('div.siteLANG.micon').length>0) mobile_nav.find('div.siteLANG.micon').replaceWith(mobile_content);
2207				else mobile_nav.find('.navbar-toggle').before(mobile_content);
2208
2209				if($('div.siteLANG-dmenu-wrap').length>0) $('div.siteLANG-dmenu-wrap').replaceWith(mobile_dropdown_menu);
2210				else if($('div.siteUM-dmenu-wrap').length>0) $('div.siteUM-dmenu-wrap').after(mobile_dropdown_menu);
2211				else $('#tpl-menu').parent().after(mobile_dropdown_menu);
2212
2213				mobile_nav.find('div.siteLANG.micon').css({
2214					'color': $('.el-menu .navbar-toggle .icon-bar').css('background-color'),
2215					'right': '56px',
2216				});
2217			}
2218		}
2219	} /*slang end*/
2220
2221
2222	$.umember = {		
2223		init: function(um_used, um_lang, um_display, callback) {
2224			// console.log('umember init');
2225			
2226			if(typeof um_used != 'undefined' && um_used) {
2227				if(PAGE_MODE == 'c') SITEUM = um_used;
2228				else property.SITEUM = um_used;
2229			}
2230
2231			if(typeof um_lang != 'undefined' && um_lang) {
2232				if(PAGE_MODE == 'c') SITEUMLANG = um_lang;
2233				else property.SITEUMLANG = um_lang;
2234			}
2235
2236			if(typeof um_display != 'undefined' && um_display) {
2237				if(PAGE_MODE == 'c') SITEUMDISPLAY = um_display;
2238				else property.SITEUMDISPLAY = um_display;
2239			}
2240
2241			var s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2242				check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false;
2243
2244			if(s_um == 0 || (typeof s_um == 'string' && s_um == '0')) {
2245				if(check_fh) {
2246					$('#fixed-menu, #fixed-menu-sub').find('.siteUM').remove();
2247					$('#mobile-nav').find('.siteUM').remove();
2248					$('#mobile-nav').find('.mobilenav_top').addClass('hide');
2249				} else {
2250					$('#tpl-menu').find('.siteUM').remove();
2251					$('div.siteUM.micon').remove();
2252					$('div.siteUM-dmenu-wrap').remove();
2253				}
2254				if(typeof callback == 'function') { callback(); }
2255			} else {
2256				if(check_fh) $.umember.makeSiteFixedUM(callback);
2257				else $.umember.makeSiteUM(callback);
2258			}
2259		},
2260		setUM: function(onoff,callback) {
2261			// console.log('umember setUM');
2262			var check_fh = ($('.el-menu header.navbar').hasClass('navbar-fheader')) ? true : false;
2263			// menu ver2 : navbar-simple(mobile design)
2264			// menu ver3 : navbar-fheader(+shopping cart, mobile slide nav)
2265
2266			if(onoff.match(/on/gi)) {
2267				if(check_fh) $.umember.makeSiteFixedUM(callback);
2268				else $.umember.makeSiteUM(callback);
2269			} else {
2270				if(check_fh) {
2271					$('#fixed-menu, #fixed-menu-sub').find('.siteUM').remove();
2272					$('#mobile-nav').find('.siteUM').remove();
2273				} else {
2274					$('#tpl-menu').find('.siteUM').remove();
2275					$('div.siteUM.micon').remove();
2276					$('div.siteUM-dmenu-wrap').remove();
2277				}
2278
2279				if(typeof callback == 'function') {
2280					callback();
2281				}
2282			}
2283		},
2284		makeSiteFixedUM: function(callback) {
2285			// console.log('umember makeSiteFixedUM');
2286			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
2287				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2288				s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2289				s_um_lang = (PAGE_MODE == 'c') ? SITEUMLANG : property.SITEUMLANG,
2290				s_um_display = (PAGE_MODE == 'c') ? SITEUMDISPLAY : property.SITEUMDISPLAY,
2291				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE;
2292
2293			if( s_validtype != 'BN' && s_validtype != 'SM' ||
2294				s_validtype == 'BN' && s_um == '-1'
2295			) {
2296				$.umember.setUM('off',callback);
2297				return false;
2298			}
2299
2300			if(s_validtype == 'SM' && s_um_display == 'join') s_um_display = 'login';
2301
2302			if(PAGE_MODE == 'c') {
2303				if(typeof callback == 'function') {
2304					callback();
2305				}
2306				return false;
2307			}
2308
2309			var display = (s_um == 1) ? 'login' : s_um_display,
2310				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2311				str = (s_um == 1) ? $.lang[LANG]['manager.site-um.login'] : ((s_um_display) ? $.lang[s_um_lang]['manager.site-um.'+s_um_display] : '');
2312			
2313			// $.post('/umember/login/check', { sid : sid }, function(r) {
2314				var r = { member : property.UMEMBER };
2315
2316				var check_login = (typeof r.member != 'undefined') ? r.member.check_login : false, 
2317					check_admin = (typeof r.member != 'undefined') ? r.member.check_adm : false, 
2318					check_uadmin = (typeof r.member != 'undefined') ? r.member.check_uadm : false,
2319					check_groot = (typeof r.member != 'undefined') ? r.member.check_groot : false,
2320					uadmin_type = (typeof r.member != 'undefined') ? r.member.uadmin_type : '',
2321					check_id_type = (typeof r.member != 'undefined') ? r.member.id_type : '',
2322 					login_id = (typeof r.member != 'undefined') ? r.member.id : '',
2323 					login_nick = (typeof r.member.nick != 'undefined') ? r.member.nick : login_id,
2324 					login_profile = (typeof r.member.profile != 'undefined') ? r.member.profile : '//storage.googleapis.com/i.addblock.net/defaultImg.png',
2325 					f_color = ($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? 'style="color:' + $('.el-menu ul.navbar-nav > li > a').css('color') + ';"' : '',
2326 					checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false,
2327 					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,
2328 					fixtype_menu_color = (checkFixTypeMenu) ? (($('.el-menu .navbar-fheader').hasClass('mobile-design-clear')) ? 'style="color:' + $('.el-menu #tpl-menu > li > a').css('color') + ';"' : '') : f_color,
2329 					checkFixOnSearch = (typeof $('.el-menu header.navbar').attr('data-fixon') != 'undefined' && $('.el-menu header.navbar').attr('data-fixon').indexOf('search')>-1) ? true : false;
2330					
2331				var hostAry = window.location.hostname.split('.'),
2332					isCoKr = hostAry[2] == 'co' && hostAry[3] == 'kr',
2333					checkDomain = (hostAry[1] != 'creatorlink' && hostAry[1] != 'addblock') ? true : false,
2334					checkPort = (location.port) ? ':'+location.port : '',
2335					host = (!checkDomain) ? (!isCoKr ? `${hostAry[1]}.${hostAry[2]}` : 'creatorlink.co.kr') : 'creatorlink.net',
2336					host_url = (s_service.indexOf('gabia') > -1) ? '//creatorlink-gabia.com' : '//'+host+checkPort,
2337					menu_url = {
2338						'dashboard': (check_uadmin) ? '/_admin/dashboard' : host_url + '/dashboard',
2339						'member'   : (check_uadmin) ? '/_admin/member' : host_url + '/manager/member',
2340					};
2341
2342				var menu_dashboard_str = (check_admin || check_uadmin) ? '\
2343							<li><a href="' + menu_url['dashboard'] + '" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2344							' : '',
2345					menu_member_str = (check_admin) ? '\
2346							<li><a href="' + host_url + '/manager/member/" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.manage'] + '</a></li>\
2347							' : '',
2348					menu_mygabia_str = (s_service.indexOf('gabia') > -1 && (check_admin || (check_uadmin && check_groot))) ? '\
2349							<li><a href="https://www.gabia.com/mygabia/service" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.mypage.gabia'] + '</a></li>\
2350							' : '',
2351					menu_mypage_str = (check_admin) ? '' : ((checkFixTypeMenu) ? '\
2352							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2353							<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>\
2354							' : '<li><a class="mypage" href="javascript:;">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>');
2355
2356				if(checkDomain && check_admin) {
2357					menu_dashboard_str = '\
2358							<li><a class="dashboard cl-umMenu" href="javascript:;" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2359							';
2360				}
2361
2362				if(s_validtype == 'SM') {
2363					if(checkFixTypeMenu) {
2364						var propertySettings = (PAGE_MODE!='c' && typeof property.SETTINGS!='undefined') ? property.SETTINGS : {},
2365							smSettings = (PAGE_MODE!='c' && typeof property.SMSETTINGS!='undefined') ? property.SMSETTINGS : {},
2366							point_settings = (PAGE_MODE!='c' && typeof property.POINGSETTINGS!='undefined') ? property.POINGSETTINGS : {},
2367							point_user = (PAGE_MODE!='c' && typeof point_settings.point_use != 'undefined' && point_settings.point_use) ? point_settings.point_use : '',
2368							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>') : '',
2369							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>' : '',
2370							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>' : '';
2371						
2372						menu_mypage_str = (check_admin) ? '' : '\
2373								<li><a class="myorderlist cl-umMenu" href="/_mypage">' + $.lang[LANG]['manager.site-um.mypage.orderlist'] + '</a></li>' 
2374								+ wishlist_btn_str + coupon_btn_str + point_useStr + '\
2375								<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2376								<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>\
2377						';
2378					} else {
2379						menu_mypage_str = (check_admin) ? '' : '\
2380								<li><a class="mypage" href="javascript:;">' + $.lang[LANG]['manager.site-um.mypage.SM'] + '</a></li>\
2381						';
2382					}
2383				}
2384
2385				if(login_id == 'naverpaytest') {
2386					menu_mypage_str = '';
2387				}
2388
2389				var SLANG = (PAGE_MODE == 'c') ? SLANG : property.SLANG,
2390					lang_str = LANG;
2391
2392				if((typeof SLANG != 'undefined' && typeof SLANG.select_code != 'undefined' && SLANG.select_code)
2393			                || (!$.isEmptyObject(SLANG) && SLANG.use_language == 'on' && SLANG.select_code)) {
2394			        lang_str = (SLANG['select_code'].toLowerCase()!='ko') ? 'en' : LANG;
2395			    } 
2396			  
2397				var login_url = (s_validtype == 'SM') ? '/_login' : 'javascript:;',	
2398					login_content_dropdown_class = (checkFixTypeMenu) ? 'dropdown-toggle' : '',
2399					login_content_dropdown = (checkFixTypeMenu) ? 'data-toggle="dropdown" data-target="#m-dropdown-wrap-um"' : '',
2400					login_svg = (checkFixTypeMenu) ? clSVG('arrow_next',16,16) : '',
2401					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>' : '\
2402					<div class="login-content '+login_content_dropdown_class+'" '+login_content_dropdown+'>\
2403						<div class="login-profile">\
2404							<img src="' + login_profile + '" alt="" class="img-responsive" />\
2405						</div>\
2406						<div class="login-nick"  ' + fixtype_menu_color + '><span>' + login_nick + '</span> 님</div>\
2407					</div>',
2408					menu_str = menu_dashboard_str + menu_member_str + menu_mygabia_str + menu_mypage_str,
2409					pc_dropdown = (check_login) ? '\
2410					<ul class="dropdown-menu">\
2411							' + menu_str + '\
2412							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2413						</ul>\
2414						' : '',
2415					content = (!check_login) ? '\
2416					<li class="siteUM"><a href="javascript:;" class="' + display + '"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>' : '\
2417					<li class="siteUM dropdown">\
2418						<a href="javascript:;" class="dropdown-toggle"><i class="cl-icon cl_icon_profile_on02" aria-hidden="true"></i></a>\
2419						'+ pc_dropdown +'\
2420					</li>\
2421					',
2422					mobile_dropdown = (check_login) ? '\
2423					<div class="dropdown-menu-wrap" id="m-dropdown-wrap-um">\
2424						<span class="dropdown-close"><img src="//storage.googleapis.com/i.addblock.net/fa-close-modal-white.png" alt="Close Member Menu"></span></span>\
2425						<ul class="dropdown-menu">\
2426							' + menu_str + '\
2427							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2428						</ul>\
2429					</div>\
2430					' : '',
2431					mobile_content = (!check_login) ? '\
2432					<li class="siteUM"><a href="javascript:;" class="' + display + '"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a></li>' : '\
2433					<li class="siteUM dropdown">\
2434						<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>\
2435						'+ mobile_dropdown +'\
2436					</li>\
2437					';
2438
2439				// IE ERROR_promise__H.20210603
2440				// var successSiteUMLogin = new Promise(function(resolve, reject) {
2441				var successSiteUMLogin = function() {
2442					var deferred = $.Deferred();
2443
2444					var pc_nav = $('.el-menu header.navbar #fixed-menu, .el-menu header.navbar #fixed-menu-sub'),
2445						mobile_nav = $('#mobile-nav #fixed-menu'),
2446						checkFixTypeMenu = (typeof $('.el-menu header.navbar').attr('data-fixtype') != 'undefined' && $('.el-menu header.navbar').attr('data-fixtype')) ? true : false;
2447
2448					if(pc_nav.find('.siteUM').length > 0) {
2449						if(checkFixTypeMenu) {
2450							setLoginLogoutAttribute(check_login,pc_nav,display);
2451							if(check_login) pc_nav.find('.siteUM').find('.cl-logout').after(pc_dropdown);										
2452						} else pc_nav.find('.siteUM').replaceWith(content);
2453					} else {
2454						if(pc_nav.find('.siteSEARCH').length > 0) pc_nav.find('.siteSEARCH').after(content);
2455						else if(pc_nav.find('.siteCART').length > 0) pc_nav.find('.siteCART').before(content);
2456						else if(pc_nav.find('.siteLANG').length > 0) pc_nav.find('.siteLANG').before(content);
2457						else pc_nav.append(content);
2458					}
2459
2460					if(mobile_nav.find('.siteUM').length > 0) {
2461						if(checkFixTypeMenu) {
2462							setLoginLogoutAttribute(check_login,mobile_nav,display);
2463							if(check_login) mobile_nav.prepend(mobile_dropdown);
2464						} else mobile_nav.find('.siteUM').replaceWith(mobile_content);
2465					} else {
2466						if(mobile_nav.find('.siteSEARCH').length > 0) mobile_nav.find('.siteSEARCH').after(mobile_content);
2467						else if(mobile_nav.find('.siteCART').length > 0) mobile_nav.find('.siteCART').before(mobile_content);
2468						else if(mobile_nav.find('.siteLANG').length > 0) mobile_nav.find('.siteLANG').before(mobile_content);
2469						else mobile_nav.append(mobile_content);
2470					}
2471
2472					
2473					if(mobile_nav.closest('#mobile-nav').find('.login-content').length > 0) mobile_nav.closest('#mobile-nav').find('.login-content').replaceWith(login_content);
2474					else mobile_nav.before(login_content);
2475
2476					if(pc_nav.find('.siteUM').css('display')=='none') {
2477						if(!checkFixOnSearch) {
2478							mobile_nav.parent().addClass('hide');
2479						} else {
2480							mobile_nav.parent().find('.login-content').css('pointer-events','none');
2481							mobile_nav.parent().find('.login-content').children().css('visibility','hidden');
2482						}
2483					}
2484
2485					// var loginStr = (checkFixTypeMenu && !check_login) ? mobile_nav.find('.siteUM').removeClass('dropdown').find('.cl-login').clone() : '';
2486
2487					// if(checkFixTypeMenu && (mobile_nav.closest('#mobile-nav').find('.login-content').length > 0) && !check_login) {
2488					// 	$('.mobilenav_top .login-content').html(loginStr);
2489					// } 
2490
2491				// IE ERROR_promise__H.20210603
2492				// 	resolve();
2493				// });
2494					deferred.resolve();
2495					return deferred.promise();
2496				}
2497
2498
2499				// IE ERROR_promise__H.20210603
2500				// successSiteUMLogin.then(function(value) {
2501				successSiteUMLogin().then(function(value) {
2502					if(typeof callback == 'function') {
2503						callback();
2504					}
2505				});
2506
2507
2508			// },'json');
2509
2510
2511		},
2512		makeSiteUM: function(callback) {
2513			// console.log('umember makeSiteUM');
2514			var sid = (PAGE_MODE == 'c') ? SID : property.SID,
2515				s_validtype = (PAGE_MODE == 'c') ? VALIDTYPE : property.VALIDTYPE,
2516				s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
2517				s_um_lang = (PAGE_MODE == 'c') ? SITEUMLANG : property.SITEUMLANG,
2518				s_um_display = (PAGE_MODE == 'c') ? SITEUMDISPLAY : property.SITEUMDISPLAY,
2519				s_service = (PAGE_MODE == 'c') ? SERVICE : property.SERVICE;
2520
2521			if( s_validtype != 'BN' && s_validtype != 'SM' ||
2522				s_validtype == 'BN' && s_um == '-1') {
2523				$.umember.setUM('off',callback);
2524				return false;
2525			}
2526
2527			if(s_validtype == 'SM' && s_um_display == 'join') s_um_display = 'login';
2528
2529			var display = (s_um == 1) ? 'login' : s_um_display,
2530				caret = ($('.el-menu > header.navbar').hasClass('sidebar')) ? 'fa fa-caret-right fa-1' : 'fa fa-caret-down fa-1',
2531				str = (s_um == 1) ? $.lang[LANG]['manager.site-um.login'] : ((s_um_display) ? $.lang[s_um_lang]['manager.site-um.'+s_um_display] : '');
2532
2533			$.post('/umember/login/check', { sid : sid }, function(r) {
2534				var check_login = (typeof r.member != 'undefined') ? r.member.check_login : false, 
2535					check_admin = (typeof r.member != 'undefined') ? r.member.check_adm : false, 
2536					check_uadmin = (typeof r.member != 'undefined') ? r.member.check_uadm : false,
2537					uadmin_type = (typeof r.member != 'undefined') ? r.member.uadmin_type : '',
2538					check_id_type = (typeof r.member != 'undefined') ? r.member.id_type : '',
2539 					login_id = (typeof r.member != 'undefined') ? r.member.id : '',
2540 					login_nick = (typeof r.member.nick != 'undefined') ? r.member.nick : login_
2540id;
2541
2542                var hostAry = window.location.hostname.split('.'),
2543					isCoKr = hostAry[2] == 'co' && hostAry[3] == 'kr',
2544                    checkDomain = (hostAry[1] != 'creatorlink' && hostAry[1] != 'addblock') ? true : false,
2545                    checkPort = (location.port) ? ':'+location.port : '',
2546					host = (!checkDomain) ? (!isCoKr ? `${hostAry[1]}.${hostAry[2]}` : 'creatorlink.co.kr') : 'creatorlink.net',
2547                    host_url = (s_service.indexOf('gabia') > -1) ? '//creatorlink-gabia.com' : '//'+host+checkPort,
2548					menu_url = {
2549					'dashboard': (check_uadmin) ? '/_admin/dashboard' : host_url + '/dashboard',
2550					'member'   : (check_uadmin) ? '/_admin/member' : host_url + '/manager/member',
2551				};
2552
2553				var menu_dashboard_str = (check_admin || check_uadmin) ? '\
2554							<li><a href="' + menu_url['dashboard'] + '" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2555							' : '',
2556					menu_member_str = (check_admin) ? '\
2557							<li><a href="' + host_url + '/manager/member" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.manage'] + '</a></li>\
2558							' : '',
2559					menu_mygabia_str = (s_service.indexOf('gabia') > -1 && (check_admin || (check_uadmin && check_groot))) ? '\
2560							<li><a href="https://www.gabia.com/mygabia/service" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.mypage.gabia'] + '</a></li>\
2561							' : '',
2562					menu_mypage_str = (check_admin) ? '' : '\
2563							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2564							<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>\
2565							';
2566
2567				if(checkDomain && check_admin) {
2568					menu_dashboard_str = '\
2569							<li><a class="dashboard cl-umMenu" href="javascript:;" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2570							';
2571				}
2572
2573				if(s_validtype == 'SM') {
2574					var propertySettings = (PAGE_MODE!='c' && typeof property.SETTINGS!='undefined') ? property.SETTINGS : {},
2575						smSettings = (PAGE_MODE!='c' && typeof property.SMSETTINGS!='undefined') ? property.SMSETTINGS : {},
2576						point_settings = (PAGE_MODE!='c' && typeof property.POINGSETTINGS!='undefined') ? property.POINGSETTINGS : {},
2577						point_user = (PAGE_MODE!='c' && typeof point_settings.point_use != 'undefined' && point_settings.point_use) ? point_settings.point_use : '',
2578						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>') : '';
2579						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>' : '',
2580						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>' : '';
2581					
2582					menu_mypage_str = (check_admin) ? '' : '\
2583							<li><a class="myorderlist cl-umMenu" href="/_mypage">' + $.lang[LANG]['manager.site-um.mypage.orderlist'] + '</a></li>'
2584							+ wishlist_btn_str + coupon_btn_str + point_useStr + '\
2585							<li><a class="mypost cl-umMenu" href="/_mypost">' + $.lang[LANG]['manager.site-um.mypage.post'] + '</a></li>\
2586							<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>\
2587					';
2588				}
2589
2590				var menu_str = menu_dashboard_str + menu_member_str + menu_mygabia_str + menu_mypage_str,
2591					content = (!check_login) ? '<li class="siteUM"><a class="' + display + '" href="javascript:;"><span class="glyphicon glyphicon-user"></span> ' + str + '</a></li>' : '\
2592					<li class="siteUM dropdown">\
2593						<a href="javascript:;" class="dropdown-toggle">' + login_nick + ' <i class="' + caret + '" aria-hidden="true"></i></a>\
2594						<ul class="dropdown-menu">\
2595							' + menu_str + '\
2596							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2597						</ul>\
2598					</li>\
2599					',
2600					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>' : '\
2601					<div class="siteUM micon dropdown">\
2602						<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>\
2603					</div>\
2604					',
2605					mobile_dropdown_menu = '\
2606					<div class="siteUM-dmenu-wrap">\
2607						<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2608						<ul class="dropdown-menu">\
2609							' + menu_str + '\
2610							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2611						</ul>\
2612					</div>\
2613				';
2614
2615				if(check_id_type == 'creatorlink' && !check_admin && login_id) { //creatorlink member
2616					var mypage_url = (s_service.indexOf('gabia') > -1) ? '//www.gabia.com/mygabia/service' : '//'+host_url+'/mypage',
2617						mypage_name = (s_service.indexOf('gabia') > -1) ? $.lang[LANG]['manager.site-um.mypage.gabia'] : $.lang[LANG]['manager.site-um.mypage'];
2618
2619					content = '\
2620					<li class="siteUM dropdown">\
2621						<a href="javascript:;" class="dropdown-toggle">' + login_nick + ' <i class="' + caret + '" aria-hidden="true"></i></a>\
2622						<ul class="dropdown-menu">\
2623							<li><a href="' + host_url + '/dashboard" target="_blank" class="cl-umMenu">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2624					';
2625
2626					if(!check_uadmin) content +='\
2627							<li><a href="' + mypage_url + '" target="_blank" class="cl-umMenu">' + mypage_name + '</a></li>\
2628					';
2629					content += '\
2630							<li><a class="logout cl-umMenu" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2631						</ul>\
2632					</li>\
2633					';
2634					mobile_content = '\
2635					<div class="siteUM micon dropdown">\
2636						<a href="javascript:;" class="dropdown-toggle" data-target=".siteUM-dmenu-wrap"><i class="cl-icon cl_icon_profile" aria-hidden="true"></i></a>\
2637					</div>\
2638					';
2639					mobile_dropdown_menu = '\
2640					<div class="siteUM-dmenu-wrap">\
2641						<!--<span class="dropdown-close"><span class="icon-bar"></span><span class="icon-bar"></span></span>-->\
2642						<ul class="dropdown-menu">\
2643							<li><a href="' + host_url + '/dashboard" target="_blank">' + $.lang[LANG]['manager.site-um.dashboard'] + '</a></li>\
2644							<li><a href="' + mypage_url + '" target="_blank">' + $.lang[LANG]['manager.site-um.mypage'] + '</a></li>\
2645							<li><a class="logout" href="javascript:;">' + $.lang[LANG]['manager.site-um.logout'] + '</a></li>\
2646						</ul>\
2647					</div>\
2648					';
2649				} 
2650
2651
2652				// IE ERROR_promise__H.20210603
2653				// var successSiteUMLogin = new Promise(function(resolve, reject) {
2654				var successSiteUMLogin = function() {
2655					var deferred = $.Deferred();
2656
2657					if($('#tpl-menu').find('.siteUM').length > 0) $('#tpl-menu').find('.siteUM').replaceWith(content);
2658					else {
2659						if($('#tpl-menu').find('.siteLANG').length > 0 ) $('#tpl-menu').find('.siteLANG').before(content);
2660						else $('#tpl-menu').append(content);
2661					}
2662
2663					if($('div.siteUM.micon').length>0) $('div.siteUM.micon').replaceWith(mobile_content);
2664					else $('.el-menu .navbar-toggle').before(mobile_content);
2665
2666					if($('div.siteUM-dmenu-wrap').length>0) $('div.siteUM-dmenu-wrap').replaceWith(mobile_dropdown_menu);
2667					else $('#tpl-menu').parent().after(mobile_dropdown_menu);
2668
2669					var check_slang = (PAGE_MODE == 'c') ? SLANG : property.SLANG;
2670					$('.el-menu .navbar-header div.siteUM.micon').css({
2671						'color': $('.el-menu .navbar-toggle .icon-bar').css('background-color'),
2672						'right': ($.isEmptyObject(check_slang)) ? '56px' : '91px',
2673					});
2674
2675				// IE ERROR_promise__H.20210603
2676				// 	resolve();
2677				// });
2678					deferred.resolve();
2679					return deferred.promise();
2680				}
2681
2682				// IE ERROR_promise__H.20210603
2683				// successSiteUMLogin.then(function(value) {
2684				successSiteUMLogin().then(function(value) {
2685					if(typeof callback == 'function') {
2686						callback();
2687					}
2688				});
2689			},'json');
2690
2691		},
2692		showMngModal: function(sid, content, id, backdrop, showcallback, showncallback, hiddencallback, callback, closecallback) {
2693			// console.log('umember showMngModal');
2694			var container = $(content),
2695				backdrop = (typeof backdrop == 'undefined') ? false : true;
2696
2697			$('body').append(container);
2698			var newInstance = jQuery.extend(true, {}, container);
2699			var modalElement = newInstance.find('#' + id);
2700
2701			modalElement.attr('data-sid',sid);
2702
2703			if(backdrop) modalElement.modal({ backdrop : 'static'});
2704			else modalElement.modal();
2705
2706			modalElement.on('show.bs.modal', function(e) {
2707				if(typeof showcallback == 'function') showcallback();
2708			});
2709
2710			modalElement.on('shown.bs.modal', function(e) {
2711				var modal = document.querySelector('.modal');
2712				modal.style.position = 'absolute';
2713				setTimeout(function() {
2714					modal.style.position = 'fixed';
2715				},0);
2716				if(window.innerWidth <= 768) $.mobileToggleMenu.close();
2717				if(typeof showncallback == 'function') showncallback();
2718			});
2719
2720			modalElement.on('hidden.bs.modal', function(e) {
2721				var flat_modal_id = $(this).attr('id');
2722				$('.editor-navbar').css('z-index','1040');
2723				var this_modal = $('#'+flat_modal_id).closest('.flat-modal');
2724				this_modal.next('.modal-backdrop').remove();
2725				this_modal.remove();
2726
2727				if($('.modal-backdrop').length) {
2728					setTimeout(function() {
2729						$('body').addClass('modal-open');    
2730					},10);                
2731				}
2732				$('body').removeClass('no-fixed');
2733
2734				if(typeof hiddencallback == "function") hiddencallback();
2735			});
2736
2737			newInstance.find('.ok-button-dialog').bind('click', function () {
2738				if(typeof callback == 'function')
2739					callback();
2740			});
2741
2742			newInstance.find('.close-button-dialog').bind('click', function () {
2743				if(typeof closecallback == 'function')
2744					closecallback();
2745			});
2746
2747			return modalElement;
2748		},
2749		showJoinModal: function(sid,mode) {
2750			console.log('umember showJoinModal');
2751			mode = (typeof mode != 'undefined' && mode) ? '-' + mode : '';
2752
2753			if($('#join-modal' + mode).length > 0) return false;
2754			if($('#login-modal').length > 0) $('#login-modal').delay(3000).modal('hide');
2755
2756			$.post('/umember/get/type/join', { sid : sid, field : '*' }, function(data) {
2757				if(typeof data.error != 'undefined' && data.error) {
2758					alert(data.error);
2759					return false;
2760				}
2761				
2762				COLLECTION_REGEX = $.parseJSON(data['regExp']);
2763
2764				var content = $.umember.makeJoinModalContent(sid,data,mode);
2765				$.umember.showMngModal(sid, content, 'join-modal' + mode, false,
2766										function() { $.umember.joinModalInit(mode); }, 
2767										function() { $.umember.joinModalKeyFunc(mode); }, '', '', '');
2768				
2769			}, 'json');
2770		},
2771		makeJoinCollectionsTypeVal: function(oval_i,oval_type,oval_v,org_field,optional_class,check_page,val) {
2772			var str = '';
2773
2774			check_page = (typeof check_page != 'undefined' && check_page) ? check_page : '';
2775			val = (typeof val != 'undefined' && val) ? val : '';
2776	
2777			switch (oval_type) {
2778				case 'memo':
2779					str += '\
2780						<textarea class="cl-s-form-control" name="'+org_field+'" cols="120" rows="10" id="cl-etc-input-val-memo">'+oval_v+'</textarea>\
2781					';
2782					break;
2783				case 'radio':
2784					var oval_checked = ((check_page=='mypage') && (oval_v==val)) ? 'checked' : '';
2785					str += '\
2786						<div class="newcheckbox">\
2787							<label>\
2788								<div class="newcheckboxSvgRadio">\
2789									<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+'>\
2790									<svg viewBox="0 0 18 18" width="18" height="18">\
2791										<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 
27910-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
2792									</svg>\
2793									<svg class="active" viewBox="0 0 18 18" width="18" height="18">\
2794										<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"/>\
2795										<circle cx="9" cy="9" r="6"/>\
2796									</svg>\
2797								</div>\
2798								<span>'+oval_v+'</span>\
2799							</label>\
2800						</div>\
2801					';
2802					
2803					break;				
2804					
2805				case 'check':
2806					var oval_checked = ((check_page=='mypage') && (oval_v==val)) ? 'checked' : '';
2807						if(check_page=='mypage' && (val.indexOf('`') > -1)) {
2808							if(val.indexOf(oval_v) > -1) {
2809								oval_checked = 'checked';
2810							}
2811						}
2812						str += '\
2813						<div class="newcheckbox">\
2814							<label>\
2815								<div class="newcheckboxSvg">\
2816									<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+'>\
2817									<svg viewBox="0 0 16 16" width="16" height="16">\
2818										<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>\
2819										<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>\
2820									</svg>\
2821									<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
2822										<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
2823										<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>\
2824									</svg>\
2825								</div>\
2826								<span>'+oval_v+'</span>\
2827							</label>\
2828						</div>\
2829						';
2830					
2831					break;
2832
2833				case 'select':
2834					var selected = ((check_page=='mypage') && (oval_v==val)) ? 'selected' : '';
2835					str += '\
2836						<option value="'+oval_v+'" '+selected+'>'+oval_v+'</option>\
2837					';
2838					
2839					break;
2840
2841				case 'fupload':
2842					str += $.umember.fileHtmlRender(org_field, {
2843						val : val,
2844						type : "type1",
2845					})
2846					break;
2847
2848				default:
2849					break;
2850			}
2851				if(org_field=='etc7') {
2852				console.log(oval_v);
2853				}
2854			return str;
2855						
2856		},
2857		makeJoinConditionsStr: function(sid,data,key,mode) {
2858			// console.log('umember makeJoinConditionsStr');
2859			switch(key) {
2860				case 'captcha' :
2861					return `
2862								<div class="kcaptcha-wrap clearfix ${(data['captcha'] == '1') ? '' : 'hide'}">
2863									<div class="col-xs-4 col-sm-4 col-md-4 no-padding kcaptcha-box">
2864										<p id="write_option"><img src="" id="kcaptcha" alt=""/></p>
2865									</div>
2866									<div class="col-xs-8 col-sm-8 col-md-8 text-left kcaptcha-key-wrap">
2867										<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']}" />
2868										<a class="kcaptcha-change hand small">${$.lang[LANG]['manager.join.cl.captcha-change']}</a>
2869									</div>
2870								</div>
2871					`;
2872					break;
2873
2874				case 'collections':
2875					var collections_html = '';
2876					$.each(data['collections'], function(field,o) {
2877						if(field == 'email') return;
2878						if(o['used']) {
2879							var org_field = (field == 'addr') ? field + '1' : field,
2880								optional = o['optional'],
2881								name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+org_field],
2882								optional_class = (optional) ? 'optional' : '',
2883								key_func = '',
2884								add_input = '',
2885								jcollection_val_str = '',
2886								fupload_label = '',
2887 								etc_val_type = ['memo','radio','check','select','fupload'];
2888
2889							if(field == 'birth') {
2890								name = $.lang[LANG]['siteum.mypage.Birth'];
2891								key_func = 'onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)"';
2892								key_func = 'onkeydown="auto_date_format(event, this)"';
2893							}
2894						
2895							var star = (optional) ? '<span class="input-star">*</span>' : '';
2896							if(field.indexOf('etc')>-1 && etc_val_type.includes(o['type'])) {
2897								var o_val = o['val'],
2898									o_val_arr = ((o_val.indexOf('`') > -1) && (o['type']=='radio' || o['type']=='check' || o['type']=='select'|| o['type']=='fupload')) ? o_val.split('`') : [o_val],
2899									description_class = (o['description_used']=='true' && (o['type']=='memo')) ? 'use_descr' : '';
2900
2901								add_input = '\
2902								<div class="cl-s-join-collections-etcwrap cl-s-form-wrap '+(o['type']=='fupload' ? 'nodata' : '') +' '+ optional_class + '" data-jcoltype="'+o['type']+'">';
2903								add_input += '\
2904									<div class="cl-s-etc">\
2905										<span class="cl-s-etc-name">'+ name + star +'</span>\
2906										';
2907								add_input += (o['description_used']=='true') ? '<span class="cl-s-etc-description">'+ o['description'] +'</span>' : '';
2908								add_input += '\
2909									</div>\
2910									';
2911
2912								add_input += '\
2913									<div class="cl-s-etc-val '+description_class+'">\
2914								';
2915
2916								if(o['type']=='select') {
2917									add_input += '\
2918									<div class="cl-s-form-group cl-s-form-group-select">\
2919										<select class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required">\
2920											<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
2921									';
2922								} 
2923								if(o_val_arr.length > 0) {
2924									$.each(o_val_arr, function(oval_i,oval_v){
2925										jcollection_val_str += $.umember.makeJoinCollectionsTypeVal(oval_i,o['type'],oval_v,org_field,optional_class);
2926									});
2927								} 
2928								
2929								if(o['type']=='select') {
2930									jcollection_val_str += '\
2931										</select>\
2932										<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>\
2933									</div>\
2934									';
2935								}
2936								jcollection_val_str += '</div></div>';
2937								
2938							} else {
2939								add_input = '\
2940											<div class="cl-s-form-wrap ' + optional_class + '">\
2941												<div class="cl-s-form-group">\
2942													<input type="text" class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required" value="" ' + key_func + '>\
2943													<label for="input" class="cl-s-control-label">' + name + star + '</label>\
2944												</div>\
2945											</div>\
2946									';
2947								
2948								if(field == 'addr') {
2949									var addr_modal = (mode.indexOf('shopping') > -1 || o['addrsearch']) ? 'readonly onfocus="addrSearchModal(\'input\')" ' : '';
2950									add_input = '\
2951											<div class="cl-s-form-wrap ' + optional_class + '">\
2952												<div class="cl-s-form-group">\
2953													<input type="hidden" class="cl-s-form-control" name="postcode" id="input-postcode" value="">\
2954													<input type="text" class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required" value="" ' + addr_modal + '>\
2955													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr1'] + star + '</label>\
2956												</div>\
2957											</div>\
2958											<div class="cl-s-form-wrap">\
2959												<div class="cl-s-form-group">\
2960													<input type="text" class="cl-s-form-control" name="addr2" id="input-addr2" required="required" value="">\
2961													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr2'] + '</label>\
2962												</div>\
2963											</div>\
2964									';
2965								}
2966
2967								if(field == 'gender') {
2968									add_input = '\
2969											<div class="cl-s-form-wrap ' + optional_class + '">\
2970												<div class="cl-s-form-group">\
2971													<select class="cl-s-form-control" name="'+org_field+'" id="input-' + org_field + '" required="required">\
2972														<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
2973														<option value="01">'+$.lang[LANG]['manager.list.info.gender.01']+'</option>\
2974														<option value="02">'+$.lang[LANG]['manager.list.info.gender.02']+'</option>\
2975													</select>\
2976													<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>\
2977													<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.gender'] + star + '</label>\
2978												</div>\
2979											</div>\
2980									';
2981								}
2982
2983								//if(mode == 'shopping_social' && !optional) add_input = '';
2984								if(mode == 'shopping_social' && !o['used']) add_input = '';
2985
2986
2987								if(mode.indexOf('cert') > -1) {
2988									switch (field) {
2989										case 'name':
2990										case 'gender':
2991										case 'birth':
2992										case 'tel':
2993											add_input = '<input id="input-' + org_field + '" type="hidden" name="' + org_field + '" value="">';
2994											break;
2995									}
2996								}
2997							}
2998
2999							collections_html += add_input + jcollection_val_str;
3000
3001						}
3002					});
3003					return collections_html;
3004					break;
3005
3006				default:
3007					return data[key];
3008					break;
3009			}
3010
3011		},
3012		makeJoinModalContent: function(sid,data,mode) {
3013			// console.log('umember makeJoinModalContent');
3014			if(PAGE_MODE == 's') { // 게시사이트 다국어 회원가입 페이지 한글과 섞
3014여나오는 부분 방지
3015				if(property.SLANG.select_code == undefined) {
3016					LANG = 'ko';
3017				} else {
3018					if(property.SLANG.select_code == 'ko') LANG = 'ko';
3019					else LANG = 'en';
3020				}
3021			}
3022			var collections = $.umember.makeJoinConditionsStr(sid,data,'collections',mode),
3023				captcha = $.umember.makeJoinConditionsStr(sid,data,'captcha',mode),
3024				privacy_type = (LANG == 'ko') ? 'privacy-join' : 'privacy',
3025				approval = (typeof data.approval != 'undefined' && data.approval) ? data.approval : 'hand',
3026				mode2 = data.mode2;
3027
3028			var sns_input = (mode == 'shopping_social' || (mode == 'shopping_cert' && mode2 == 'shopping_sns')) ? 'readonly="true"' : '',
3029				content = '\
3030					<div class="cl-s-form-wrap optional">\
3031						<div class="cl-s-form-group">\
3032							<input type="text" class="cl-s-form-control" name="email" id="input-email" required="required" value="" '+sns_input+'>\
3033							<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.email'] + '<span class="input-star">*</span></label>\
3034						</div>\
3035					</div>\
3036			';
3037
3038			if(mode == 'shopping_social' || (mode == 'shopping_cert' && mode2 == 'shopping_sns')) {
3039				content += collections;
3040				var register_form_arr = {
3041					'content' : content
3042				}
3043			} else {
3044				content += '\
3045						<div class="cl-s-form-wrap optional">\
3046							<div class="cl-s-form-group">\
3047								<input type="password" class="cl-s-form-control" name="password" id="input-password" required="required" value="">\
3048								<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password'] + '<span class="input-star">*</span></label>\
3049							</div>\
3050						</div>\
3051						<div class="cl-s-form-wrap optional">\
3052							<div class="cl-s-form-group">\
3053								<input type="password" class="cl-s-form-control" name="password_checked" id="input-password-checked" required="required" value="">\
3054								<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password-check'] + '<span class="input-star">*</span></label>\
3055							</div>\
3056						</div>\
3057						<div class="cl-s-form-description">' + $.lang[LANG]['siteum.login.password.description'] + '</div>\
3058						' + collections + '\
3059				';
3060				var register_form_arr = {
3061					'content' : content,
3062					'captcha' : captcha
3063				}
3064			}
3065			return register_form_arr;
3066		},
3067		joinModalInit: function(mode) {
3068			// console.log('umember joinModalInit');
3069			mode = (mode) ? '-' + mode : '';
3070			var joinModal = $('#join-modal' + mode);
3071
3072			joinModal.find('.form-group').each(function() {
3073				$(this).removeClass('focus');
3074				$(this).find('.error').remove();
3075				$(this).find('input.form-control').val('');
3076				$(this).find('#join-textarea').html('');
3077			});
3078			
3079			joinModal.find('#wr_key').val('');
3080		},
3081		joinModalKeyFunc: function(mode) {
3082			// console.log('umember joinModalKeyFunc');
3083			mode = (mode) ? '-' + mode : '';
3084			var joinModal = $('#join-modal' + mode);
3085
3086			if(!joinModal.find('.kcaptcha-wrap').hasClass('hide')) {
3087				load_kcaptcha();
3088				joinModal.find('#wr_key').live({
3089					keyup: function() {
3090						if($(this).val().trim().length > 0) { $(this).next('.error').remove(); }
3091					}
3092				});
3093			}
3094
3095			joinModal.find('input.form-control').live({
3096				focus: function() {
3097					$(this).closest('.form-group').addClass('focus').siblings().removeClass('focus');
3098				}, 
3099				blur: function() {
3100					$(this).closest('.form-group').removeClass('focus');
3101				},
3102				keydown: function(key) {
3103					if(key.keyCode == 13) $('#uJoin').click();
3104				},
3105				keyup: function() {
3106					var groupEl = $(this).closest('.form-group'),
3107						errorEL = $(this).next().next('.error'),
3108						field = $(this).attr('id').trim().replace(/input-/,''),
3109						reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
3110						reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
3111						reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
3112
3113					if(field=='password' || field == 'password-checked') {
3114						var pwEl = joinModal.find('#input-password'),
3115							pw2El = joinModal.find('#input-password-checked'),
3116							error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
3117
3118						if(pwEl.val() == pw2El.val()) { 
3119							pw2El.next().next('.error').remove();
3120						} else {
3121							if(pw2El.val().length > 0) {
3122								if(pw2El.next().next('.error').length > 0) pw2El.next().next('.error').removeClass('empty').text(error_str);
3123								else pw2El.closest('.form-group').append('<span class="error">'+ error_str + '</span>');
3124							}
3125						}	
3126					}
3127
3128					if(reg_has && errorEL.length > 0) { 
3129
3130						var reg = new RegExp(reg_pattern);
3131						if(reg.test($(this).val())) errorEL.remove();
3132						else {
3133							if(errorEL.hasClass('empty')) errorEL.removeClass('empty').text(reg_ex);
3134						}
3135
3136					}
3137
3138				}
3139			});
3140		},
3141		showLoginModal: function(sid) {
3142			// console.log('umember showLoginModal');
3143			if($('#join-modal').length > 0 ) $('#join-modal').delay(3000).modal('hide');
3144			if($('#forgotpw-modal').length > 0 ) $('#forgotpw-modal').delay(3000).modal('hide');
3145
3146			var content = $.umember.makeLoginModalContent();
3147			$.umember.showMngModal(sid, content, 'login-modal', false,
3148									function() { $.umember.LoginModalInit(); }, 
3149									function() { $.umember.loginModalKeyFunc(); }, '', '', '');
3150		},
3151		makeLoginModalContent: function() {
3152			// console.log('umember makeLoginModalContent');
3153			var s_um = (PAGE_MODE == 'c') ? SITEUM : property.SITEUM,
3154				join_btn = (s_um == 1) ? '' : '<div class="btn-join siteUM"><span class="join hand">' + $.lang[LANG]['manager.site-um.join.3'] + '</span></div>',
3155				privacy_type = (LANG == 'ko') ? 'privacy-join' : 'privacy';
3156	
3157			var loginModal_html = '\
3158				<div class="flat-modal mng-login-modal mng-siteUM-modal">\
3159					<div class="modal modal-default fade" id="login-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3160						<div class="modal-dialog" role="document">\
3161							<div class="modal-content">\
3162								<div class="modal-header">\
3163									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3164										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3165									</button>\
3166									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['header.login'] + '</h5>\
3167								</div>\
3168								<div class="modal-body">\
3169									<span class="form-group optional initial">\
3170										<input class="form-control" type="text" id="input-id" placeholder="' + $.lang[LANG]['siteum.login.id'] + '"/>\
3171										<label for="input-id">\
3172											<i class="fa fa-asterisk"></i>\
3173											<span>id</span>\
3174										</label>\
3175									</span>\
3176									<span class="form-group optional initial">\
3177										<input class="form-control" type="password" id="input-password" placeholder="' + $.lang[LANG]['siteum.login.password'] + '"/>\
3178										<label for="input-password">\
3179											<i class="fa fa-asterisk"></i>\
3180											<span>password</span>\
3181										</label>\
3182									</span>\
3183								</div>\
3184								<div class="modal-footer">\
3185									<button type="button" class="btn btn-primary" id="uLogin">' + $.lang[LANG]['manager.site-um.login'] + '</button>\
3186									' + join_btn + '\
3187									<p class="modal-change-wrap siteUM"><span class="forgot-pw hand">' + $.lang[LANG]['siteum.forgot.id-pw'] + '</span></p>\
3188								</div>\
3189							</div>\
3190						</div>\
3191					</div>\
3192				</div>\
3193				';
3194
3195
3196			return loginModal_html;
3197		},
3198		loginModalInit: function(mode) {
3199			mode = (mode) ? '-' + mode : '';
3200			var loginModal = $('#login-modal'+mode);
3201
3202			loginModal.find('.form-group').each(function() {
3203				$(this).removeClass('focus');
3204				$(this).find('.error').remove();
3205				$(this).find('input.form-control').val('');
3206			});
3207		},
3208		loginModalKeyFunc: function(mode) {
3209			mode = (mode) ? '-' + mode : '';
3210			var loginModal = $('#login-modal'+mode);
3211
3212			loginModal.find('input.form-control').live({
3213				focus:   function(e) { $(this).closest('.form-group').addClass('focus').siblings().removeClass('focus'); }, 
3214				blur: 	 function(e) { $(this).closest('.form-group').removeClass('focus'); },
3215				keydown: function(e) { 
3216					if($('.dsgn-body').hasClass('mobile-nav-active')) $('.el-menu header.n
3216avbar-fheader .navbar-toggle').click();
3217					if(e.keyCode == 13) $('#uLogin').click(); 
3218				},
3219				keyup: function(e) {
3220					var groupEl = $(this).closest('.form-group'),
3221						errorEL = $(this).next().next('.error');
3222					if($(this).val().length > 0) errorEL.remove();
3223				}
3224			});
3225		},
3226		showForgotIDModal: function(sid) {
3227			if($('#forgotpw-modal').length > 0 ) $('#forgotpw-modal').delay(3000).modal('hide');
3228
3229			var content = $.umember.makeForgotIDModalContent();
3230			$.umember.showMngModal(sid, content, 'forgotid-modal', false, function() {
3231					$('#forgotid-modal').find('.error').remove();
3232					$('#forgotid-modal').find('input.form-control').val('');
3233					$('#forgotid-modal .modal-body').children().removeAttr('style');
3234					$('#forgotid-modal .modal-footer').children('button').removeAttr('style');
3235					$('#forgotid-modal').find('.forgot-id-result').text('');
3236				}, function() {
3237					$('#forgotid-modal').find('input.form-control').live({
3238						keydown: function(key) { if(key.keyCode == 13) $('#uForgotID').click(); },
3239						keyup: function() {
3240							$('#forgotid-modal .modal-body').children().removeAttr('style');
3241							$('#forgotid-modal .modal-footer').children('button').removeAttr('style');
3242							$('#forgotid-modal').find('.forgot-id-result').text('');
3243							var regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
3244								errorEL = $(this).closest('.form-group').find('.error');
3245
3246							if(!regexp.test($(this).val())) errorEL.text($.lang[LANG]['siteum.regexp.check.email']);
3247							else errorEL.remove();
3248						}
3249					});
3250				}, '', '', '');
3251		},
3252		makeForgotIDModalContent: function() {
3253			var forgotIDModal_html = '\
3254				<div class="flat-modal mng-forgotid-modal mng-siteUM-modal">\
3255					<div class="modal modal-default fade" id="forgotid-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3256						<div class="modal-dialog" role="document">\
3257							<div class="modal-content">\
3258								<div class="modal-header">\
3259									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3260										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3261									</button>\
3262									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['siteum.forgot.id.link'] + '</h5>\
3263								</div>\
3264								<div class="modal-body">\
3265									<div>' + $.lang[LANG]['siteum.forgot.id.description'] + '</div>\
3266									<span class="form-group">\
3267										<input class="form-control" type="text" id="input-email" placeholder="' + $.lang[LANG]['siteum.forgot.pw.input-email'] + '"/>\
3268									</span>\
3269									<div class="forgot-id-result"></div>\
3270								</div>\
3271								<div class="modal-footer">\
3272									<button type="button" class="btn btn-primary" id="uForgotID">' + $.lang[LANG]['siteum.forgot.id.btn'] + '</button>\
3273									<p class="modal-change-wrap siteUM"> <span class="forgot-pw hand">' + $.lang[LANG]['siteum.forgot.pw.link'] + '</span></p>\
3274									<p class="modal-change-wrap siteUM"> <span class="login hand">' + $.lang[LANG]['manager.site-um.login'] + '</span></p>\
3275								</div>\
3276							</div>\
3277						</div>\
3278					</div>\
3279				</div>\
3280			';
3281
3282			return forgotIDModal_html;
3283		},
3284		showForgotPWModal: function(sid) {
3285			if($('#login-modal').length > 0 ) $('#login-modal').delay(3000).modal('hide');
3286			if($('#forgotid-modal').length > 0 ) $('#forgotid-modal').delay(3000).modal('hide');
3287
3288			var content = $.umember.makeForgotPWModalContent();
3289			$.umember.showMngModal(sid, content, 'forgotpw-modal', false, function() {
3290					$('#forgotpw-modal').find('.focus').removeClass('focus');
3291					$('#forgotpw-modal').find('.error').remove();
3292					$('#forgotpw-modal').find('input.form-control').val('');
3293				}, function() {
3294					$('#forgotpw-modal').find('input.form-control').live({
3295						foucs: function() { $(this).closest('.form-group').addClass('focus').siblings().removeClass('focus'); },
3296						blur: function() { $(this).closest('.form-group').removeClass('focus'); },
3297						keydown: function(key) { if(key.keyCode == 13) $('#uForgotPW').click(); },
3298						keyup: function() { 
3299							var regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
3300								field = $(this).attr('id').trim().replace(/input-/,''),
3301								errorEL = $(this).closest('.form-group').find('.error');
3302
3303							if(field == 'email' && !regexp.test($(this).val())) errorEL.text($.lang[LANG]['siteum.regexp.check.email']);
3304							else errorEL.remove();
3305						}
3306					});
3307				}, '', '', '');
3308		},
3309		makeForgotPWModalContent: function() {
3310			var forgotPWModal_html = '\
3311				<div class="flat-modal mng-forgotpw-modal mng-siteUM-modal">\
3312					<div class="modal modal-default fade" id="forgotpw-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">\
3313						<div class="modal-dialog" role="document">\
3314							<div class="modal-content">\
3315								<div class="modal-header">\
3316									<button type="button" class="close" data-dismiss="modal" aria-label="Close">\
3317										<span aria-hidden="true"><img src="https://storage.googleapis.com/i.addblock.net/fa-close-siteUM-modal.png" alt="close"></span>\
3318									</button>\
3319									<h5 class="modal-title" id="exampleModalLabel">' + $.lang[LANG]['siteum.forgot.pw.title'] + '</h5>\
3320								</div>\
3321								<div class="modal-body">\
3322									<div>' + $.lang[LANG]['siteum.forgot.pw.description'] + '</div>\
3323									<span class="form-group">\
3324										<input class="form-control" type="text" id="input-id" placeholder="' + $.lang[LANG]['manager.list.info.id'] + '"/>\
3325									</span>\
3326									<span class="form-group">\
3327										<input class="form-control" type="text" id="input-email" placeholder="' + $.lang[LANG]['siteum.forgot.pw.input-email'] + '"/>\
3328									</span>\
3329								</div>\
3330								<div class="modal-footer">\
3331									<button type="button" class="btn btn-primary" id="uForgotPW">' + $.lang[LANG]['siteum.forgot.pw.btn'] + '</button>\
3332									<p class="modal-change-wrap siteUM"> <span class="forgot-id hand">' + $.lang[LANG]['siteum.forgot.id.link'] + '</span></p>\
3333									<p class="modal-change-wrap siteUM"> <span class="login hand">' + $.lang[LANG]['manager.site-um.login'] + '</span></p>\
3334								</div>\
3335							</div>\
3336						</div>\
3337					</div>\
3338				</div>\
3339			';
3340
3341			return forgotPWModal_html;
3342		},
3343		showMypageModal: function(sid) {
3344			if($('.mng-siteUM-modal').length > 0 ) $('.mng-siteUM-modal').children().first().modal('hide');
3345
3346			$.getJSON('/umember/get/type/mypage', function(data) {
3347				if(typeof data.error != 'undefined' && data.error) {
3348					alert(data.error);
3349					return false;
3350				}
3351				// COLLECTION_REGEX = $.parseJSON(data['regExp']);
3352				COLLECTION_REGEX = data['regExp'];
3353
3354				var content = $.umember.makeMypageContent(sid,data,'');
3355				$('body').find('.dsgn-body').append('<link rel="stylesheet" href="/css/manager.css" type="text/css" class="manager_css">');
3356				$.umember.showMngModal(sid, content, 'mypage-modal', false,
3357										function() { }, 
3358										function() { }, 
3359										function() { $('body .dsgn-body').find('link.manager_css').remove(); }, '', '');
3360			});
3361		},
3362		
3363		makeMypageConditionsStr: function(sid,data,mode,cert) {
3364			if(typeof cert === 'undefined' || !cert) cert = 'N';
3365
3366			var collections = '',
3367				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', 'grade_notice_type', 'period_label', 'period_guide_label', 'next_apply_label', 'renewal_label'];
3368				
3369			$.each(data, function(field,o) {
3370				if (field != 'um_sns_key') {
3371					if($.inArray(field,make_pass) == -1) {
3372						var name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+field],
3373							optional = (o['optional']) ? o['optional'] : false,
3374							optional_class = (optional) ? 'optional' : '',
3375							prev_val = (field == 'email' || field == 'nick') ? 'data-prev="' + o['value'] + '"' : '',
3376							etc_val_type = ['memo','radio','check','select','fupload'],
3377							cl_val_str = '',
3378							add_input = '',
3379							jcollection_val_str = '';
3380							 // 간결하게 삼항 연산자로 리팩토링
3381							 
3382							 var filecount_data = o['type'] === 'fupload' && o['value'] ? 'isdata' : o['type'] === 'fupload' ? 'nodata' : '';
3383
3384						var star = (optional) ? '<span class="input-star">*</span>' : '';
3385				
3386						if(field.indexOf('etc')>-1 && etc_val_type.includes(o['type'])) {
3387							var o_val = o['value'],
3388								o_val_arr = ((o['jcol_val'].indexOf('`') > -1) && (o['type']=='radio' || o['type']=='check' || o['type']=='select')) ? o['jcol_val'].split('`') : [o_val],
3389								description_class = (o['description_used']=='true' && (o['type']=='memo')) ? 'use_descr' : '';
3390
3391							add_input = '\
3392							<div class="cl-s-join-collections-etcwrap cl-s-form-wrap '+filecount_data+' '+ optional_class + '" data-jcoltype="'+o['type']+'">';
3393									
3394							var text_class = (o_val && (o['type']=='memo')) ? 'textarea-active' : '';
3395							add_input += '\
3396								<div class="cl-s-etc '+text_class+'">\
3397									<span class="cl-s-etc-name">'+ name + star +'</span>\
3398									';
3399							add_input += (o['description_used']=='true') ? '<span class="cl-s-etc-description">'+ o['description'] +'</span>' : '';
3400							add_input += '\
3401								</div>\
3402								';
3403
3404							add_input += '\
3405								<div class="cl-s-etc-val '+description_class+'">\
3406							';
3407
3408							if(o['type']=='select') {
3409								add_input += '\
3410								<div class="cl-s-form-group cl-s-form-group-select">\
3411									<select class="cl-s-form-control" name="'+field+'" id="input-' + field + '" required="required">\
3412										<option value="">'+$.lang[LANG]['manager.list.info.gender.select']+'</option>\
3413								';
3414							} 
3415
3416							if(o_val_arr.length > 0) {
3417								$.each(o_val_arr, function(oval_i,oval_v){			
3418									jcollection_val_str += $.umember.makeJoinCollectionsTypeVal(oval_i,o['type'],oval_v,field,optional_class,'mypage',o_val);
3419								});
3420							} 
3421
3422							if(o['type']=='select') {
3423								jcollection_val_str += '\
3424									</select>\
3425									<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>\
3426								</div>\
3427								';
3428							}
3429							jcollection_val_str += '</div></div>';
3430							
3431						} else {
3432							add_input += '\
3433							<div class="cl-s-form-wrap ' + optional_class + '">\
3434								<div class="cl-s-form-group">\
3435									<input type="text" class="cl-s-form-control" name="'+field+'" id="input-' + field + '" required="required" value="' + o['value'] + '" ' + prev_val + '>\
3436									<label for="input" class="cl-s-control-label">' + name + star + '</label>\
3437								</div>\
3438							</div>\
3439						';
3440						
3441						}
3442						if(field == 'birth') {
3443							var birth = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+field];
3444
3445							add_input = '\
3446								<div class="cl-s-form-wrap ' + optional_class + '">\
3447									<div class="cl-s-form-group">\
3448										<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)">\
3449										<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.mypage.Birth'] + star + ' </label>\
3450									</div>\
3451								</div>\
3452							';
3453						} else if(field == 'addr') {
3454							
3455							
3456							if(  mode && mode === 'business'){
3457								var o_postcode = (o['value'][0]) ? o['value'][0].trim() : '',
3458									o_addr1 = (o['value'][1]) ? o['value'][1].trim() : '',
3459									o_addr2 = (o['value'][2]) ? o['value'][2].trim() : '',
3460									addr_has_clas = (o_postcode || o_addr1) ? 'has-value' : '',
3461									addr_modal = (mode == 'shopping' || o['addrsearch']) ? 'readonly onfocus="addrSearchModal(\'input\')" ' : '';
3462
3463								add_input = '\
3464										<div class="cl-s-form-wrap ' + optional_class + '">\
3465											<div class="cl-s-form-group">\
3466												<input type="hidden" class="cl-s-form-control" name="postcode" id="input-postcode" value="' + o_postcode + '">\
3467												<input type="text" class="cl-s-form-control '+addr_has_clas+'" name="addr1" id="input-addr1" required="required" value="' + o_addr1 + '" ' + addr_modal + '>\
3468												<label for="input" class="cl-s-control-label">' + name + star + '</label>\
3469											</div>\
3470										</div>\
3471										<div class="cl-s-form-wrap">\
3472											<div class="cl-s-form-group">\
3473												<input type="text" class="cl-s-form-control" name="addr2" id="input-addr2" required="required" value="' + o_addr2 + '">\
3474												<label for="input" class="cl-s-control-label">' + $.lang[LANG]['manager.list.info.addr2'] + '</label>\
3475											</div>\
3476										</div>\
3477								';								
3478							} else if(mode && mode === 'shopping') {
3479								var sm_name    = '', 
3480									sm_tel     = '', 
3481									sm_addr0   = '', 
3482									sm_addr0_empty ='',
3483									sm_addr1   = '', 
3484									sm_addr2   = '', 
3485									sm_isalias = '',
3486									sm_isalias_empty = '',
3487									aliasText = '',
3488									sm_nodata  = '';
3489									btn_text =''
3490									  
3491								if (data['sm_addr'] && data['sm_addr']['is_default'] === 0) {
3492									sm_nodata = 'emptyFlag';
3493									btn_text = '추가하기';
3494								} else{
3495									const sm = data?.sm_addr || {};
3496
3497									sm_name    = sm.name?.trim?.() || '';
3498									sm_tel     = sm.tel?.trim?.() || '';
3499									
3500									addrText   = sm.value?.[0]?.trim?.() || '';
3501									sm_addr0   = addrText ? '[' + addrText + ']' : '';
3502									sm_addr0_empty = sm_addr0 ? '' : 'hide';
3503
3504									sm_addr1   = sm.value?.[1]?.trim?.() || '';
3505									sm_addr2   = sm.value?.[2]?.trim?.() || '';
3506									aliasText = sm.alias?.trim?.() || '';  // 먼저 alias 문자열 뽑기
3507									sm_isalias = aliasText ? '(' + aliasText + ')' : '';  // 괄호 처리
3508									sm_isalias_empty = aliasText ? '' : 'hide';  // 클래스 처리
3509
3510
3511									btn_text = '변경하기';
3512  
3513								}		
3514					 
3515								var valueCheckEl = "";
3516								(valueCheckEl = sm_nodata ? '<input type="text" class="cl-s-form-control hide" required="required" value="">' : '' );
3517								add_input = '\
3518								<div class="cl-s-form-wrap sm-parent '+sm_nodata+'">\
3519									<div class="cl-s-form-wrap '+(sm_nodata ? optional_class : "") +'">\
3520										<div class="cl-s-form-group">\
3521											<div class="cl-s-form-control flexbox">\
3522											'+valueCheckEl+'\
3523												<label for="input" class="cl-s-control-label">배송지 정보<span class="input-star '+ (optional_class ? '' : 'hide') +'">*</span></label>\
3524												<div class="cl-s-form-wrap btn-load-addresses mypage" data-action="getList">\
3525													<div class="cl-s-form-group EditBtn">\
3526													<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>\
3527													</div>\
3528													<div class="cl-s-form-group ">\
3529													<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>\
3530													</div>\
3531												</div>\
3532											</div>\
3533											<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>\
3534											\
3535											<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>\
3536											<div class="cl-s-form-control"><div class="sm-tel">'+sm_tel+'</div></div>\
3537											<div class="cl-s-form-control noaddress" style="text-align:center; padding:20px; color:#999;">등록된 배송지가 없습니다.</div>\
3538										</div>\
3539									</div>\
3540								</div>\
3541								';		
3542							}
3543
3544						} else if(field == 'gender') {
3545							add_input = '\
3546									<div class="cl-s-form-wrap ' + optional_class + '">\
3547										<div class="cl-s-form-group">\
3548											<select class="cl-s-form-control" name="gender" id="input-gender" required="required">\
3549												<option value="">선택</option>';
3550							if(o['value'] == '01') {
3551								add_input += '\
3552												<option value="01" selected>남</option>\
3553												<option value="02">여</option>';
3554							} else if(o['value'] == '02') {
3555								add_input += '\
3556												<option value="01">남</option>\
3557												<option value="02" selected>여</option>';
3558							} else {
3559								add_input += '\
3560												<option value="01">남</option>\
3561												<option value="02">여</option>';
3562							}
3563							add_input += '\
3564											</select>\
3565											<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>\
3566											<label for="input" class="cl-s-control-label">' + name + star +'</label>\
3567										</div>\
3568									</div>\
3569							';
3570						}
3571
3572						if(cert == 'Y') {
3573							switch (field) {
3574								case 'name':
3575								case 'gender':
3576								case 'birth':
3577								case 'tel':
3578									var value = (o['value'])? o['value']:'';
3579									add_input = '<input id="input-' + field + '" type="hidden" name="' + field + '" value="' + value + '">';
3580									break;
3581							}
3582						}
3583						
3584						collections += add_input + jcollection_val_str;
3585
3586					}
3587				}
3588			});
3589			return collections;
3590		},
3591		makeMypageContent: function(sid,data,mode,cert) {
3592			if(typeof cert === 'undefined' || !cert) cert = 'N';
3593			
3594			var collections = $.umember.makeMypageConditionsStr(sid,data,mode,cert),
3595				s_validtype = (typeof VALIDTYPE != 'undefined') ? VALIDTYPE : property.VALIDTYPE;
3596
3597			var default_info = '\
3598				<div class="profile-wrap cl-s-profile-box col-xs-12 col-sm-12 col-md-12 no-padding">\
3599					<div class="profile-image-wrap profile-image-box">\
3600						<svg viewBox="0 0 110 110">\
3601							<pattern id="profileMyImg" patternUnits="userSpaceOnUse" width="110" height="110">\
3602								<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="' + data['image'] + '" x="0" width="110" height="110"></image>\
3603							</pattern>\
3604							<circle cx="55" cy="56" r="54" fill="url(#profileMyImg)" stroke="#ededed"></circle>\
3605						</svg>\
3606					</div>\
3607					<div class="profile-text-wrap">\
3608						<div class="cl-s-form-wrap cl-s-info-id" disabled>\
3609							<input type="hidden" class="cl-s-form-control" name="id" id="input-id" required="required" value="' + data['id']['value'] + '">\
3610							<span class="id-text">' + data['id']['value'] + '</span>\
3611						</div>\
3612						<label for="profileMyImgFileupload">' + $.lang[LANG]['siteum.mypage.change.image'] + '</label>\
3613						<input id="profileMyImgFileupload" class="modal-upload-button um-image-upload" type="file" name="files[]" data-sid="' + sid + '" data-uid="' + data['id']['value'] + '" />\
3614						<p class="cl-s-image-size">' + $.lang[LANG]['manager.mypage.profile.image.note'] + ' ' + $.lang[LANG]['manager.mypage.profile.image.size'] + '</p>\
3615					</div>\
3616				</div>\
3617				<div class="clearfix"></div>\
3618				';
3619
3620			var mypage_avatar = '\
3621				<div class="profile-wrap cl-s-profile-box col-xs-12 col-sm-12 col-md-12 no-padding">\
3622					<div class="profile-image-wrap profile-image-box">\
3623						<svg viewBox="0 0 110 110">\
3624							<pattern id="profileMyImg" patternUnits="userSpaceOnUse" width="110" height="110">\
3625								<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="' + data['image'] + '" x="0" width="110" height="110"></image>\
3626							</pattern>\
3627							<circle cx="55" cy="56" r="54" fill="url(#profileMyImg)" stroke="#ededed"></circle>\
3628						</svg>\
3629					</div>\
3630				</div>\
3631				<div class="clearfix"></div>\
3632				';
3633
3634			var content = '\
3635				<div class="cl-s-form-wrap">\
3636					<div class="cl-s-form-group">\
3637						<input type="password" class="cl-s-form-control" name="password" id="input-password" required="required" value="">\
3638						<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password.myinfo'] + '</label>\
3639					</div>\
3640				</div>\
3641				<div class="cl-s-form-wrap">\
3642					<div class="cl-s-form-group">\
3643						<input type="password" class="cl-s-form-control" name="password_checked" id="input-password-checked" required="required" value="">\
3644						<label for="input" class="cl-s-control-label">' + $.lang[LANG]['siteum.login.password-check'] + '</label>\
3645					</div>\
3646				</div>\
3647				<div class="cl-s-form-description">' + $.lang[LANG]['siteum.login.password.description'] + '</div>\
3648			';
3649
3650			return { content: content, collections: collections, default_info: default_info, mypage_avatar:mypage_avatar };
3651		},
3652		showMyImageUploadModal: function(sid,uid,src) {
3653			var content = '\
3654				<div class="flat-modal mng-mypage-modal">\
3655					<div class="modal modal-default fade" id="my-image-modal" tabindex="-1" role="dialog" aria-labelledby="mySmallMod
3655alLabel" aria-hidden="true" data-sid="' + sid + '" data-uid="' + uid + '">\
3656						<div class="modal-dialog w385">\
3657							<div class="modal-content">\
3658								<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>\
3659								<div class="modal-body">\
3660									<div class="profile-image-wrap no-opacity">\
3661										<div>\
3662											<span class="top"></span>\
3663											<span class="bottom"></span>\
3664										</div>\
3665										<img class="my-image img-responsive" src="' + src + '" alt="profile image" />\
3666									</div>\
3667									<p>' + $.lang[LANG]['manager.mypage.profile.image.note'] + ' <strong>' + $.lang[LANG]['manager.mypage.profile.image.size'] + '</strong></p>\
3668								</div>\
3669								<div id="progress" class="progress">\
3670									<div class="progress-bar progress-bar-success"></div>\
3671								</div>\
3672								<div class="modal-footer">\
3673									<button type="button" class="btn btn-default" data-dismiss="modal">' + $.lang[LANG]['config.close'] + '</button>\
3674									<span class="btn btn-primary fileinput-button">\
3675										<span>' + $.lang[LANG]['manager.mypage.profile.image.apply'] + '</span>\
3676										<input id="profileUMFileupload" class="modal-upload-button um-image-upload" type="file" name="files[]" data-sid="' + sid + '" data-uid="' + uid + '" >\
3677									</span>\
3678								</div>\
3679							</div>\
3680						</div>\
3681					</div>\
3682				</div>\
3683			';
3684
3685			$.umember.showMngModal(sid, content, 'my-image-modal', false, '', '', '', '', '');				
3686		},
3687		fileurlcreate : function(cl_val) {
3688			// 단일 파일 URL 생성 함수
3689			// cl_val을 받아서 다운로드 링크와 파일 정보를 반환
3690			var result = {
3691				download_link: '',
3692				file_links: '',
3693				file_data: '',
3694				file_info: {
3695					name: '',
3696					size: '',
3697					url: '',
3698					size_display: ''
3699				}
3700			};
3701			
3702			if(cl_val && cl_val.trim() !== '') {
3703				// 단일 파일 처리 - 첫 번째 파일만 사용
3704				var file_data = cl_val.split(',')[0];
3705				result.file_data = file_data;
3706				
3707				if(file_data && file_data.trim() !== '') {
3708					var explode_v = file_data.split('||');
3709					// console.log('fileurlcreate explode_v:', explode_v); // 디버깅용
3710					
3711					// 현재 데이터 구조에 맞게 수정
3712					// explode_v[0]: 파일명, explode_v[1]: 파일 크기, explode_v[2]: URL
3713					var link_url = explode_v[2] || '';
3714					var link_url_arr = link_url.split('/');
3715					var true_file_name = link_url_arr[link_url_arr.length - 1];
3716					
3717					if(explode_v[0]) {
3718						// 파일 크기 계산 (explode_v[1]에서 크기 추출)
3719						var flink_s = (explode_v[1]) ? parseFloat(explode_v[1].replace(/[^0-9\.]/g, '')) : 0;
3720						var flink_unit = (explode_v[1] && explode_v[1].indexOf('MB') > -1) ? 'MB' : 'KB';
3721						var flink_size = (flink_unit === 'MB') ? flink_s : flink_s;
3722						// view.html의 round($flink_size,2)와 동일하게 소수점 2자리까지 표시
3723						var flink_str = (explode_v[1]) ? parseFloat(flink_size.toFixed(2)) + flink_unit : '';
3724						
3725						var current_sid = (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '');
3726						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">';
3727						
3728						result.download_link = download_link;
3729						result.file_links = download_link;
3730						result.file_info = {
3731							name: explode_v[0],
3732							size: explode_v[1] || '',
3733							url: link_url,
3734							size_display: flink_str
3735						};
3736					}
3737				}
3738			}
3739			
3740			return result;
3741		},
3742		fileHtmlRender : function(orgfield,option){// 그리기 담당 메서드
3743 			// 온 값에따라 그리는거 달라지기 
3744			option = $.extend({
3745				val : "",
3746				type : "",
3747				type2_downlink : ""	
3748
3749				
3750			},  option);
3751			
3752			// option.val에서 파일 정보 파싱 (파일명||파일크기||파일경로 형태)
3753			var fileName = '';
3754			var fileSize = '';
3755			var filePath = '';
3756			var fileSizeDisplay = '';
3757			var fileSizeUnit = 'KB';
3758			var hasValidFile = false;
3759			// option.val이 있고 파일 정보 형식이 맞는지 확인
3760			if (option.val && option.val.indexOf('||') > -1) {
3761				var fileData = option.val.split('||');
3762				if (fileData.length >= 3) {
3763					fileName = fileData[0];
3764					fileSize = fileData[1];
3765					filePath = fileData[2];
3766					filePaths = (filePath && filePath.indexOf('/') > -1 ? [filePath.split('/').pop()] : []);
3767					// 파일명과 경로가 모두 있는 경우에만 유효한 파일로 판단
3768					if (fileName && filePath) {
3769						hasValidFile = true;
3770						
3771						// 파일 크기 단위 처리
3772						if (fileSize.indexOf('KB') > -1) {
3773							fileSize = parseFloat(fileSize.replace('KB', ''));
3774							fileSizeUnit = 'KB';
3775						} else if (fileSize.indexOf('MB') > -1) {
3776							fileSize = parseFloat(fileSize.replace('MB', ''));
3777							fileSizeUnit = 'MB';
3778						} else {
3779							fileSize = parseFloat(fileSize);
3780							fileSizeUnit = 'KB';
3781						}
3782						
3783						// 파일 크기 표시 형식 조정
3784						if (fileSizeUnit === 'KB' && fileSize > 1024) {
3785							fileSizeDisplay = (fileSize / 1024).toFixed(2) + 'MB';
3786						} else {
3787							fileSizeDisplay = fileSize.toFixed(2) + fileSizeUnit;
3788						}
3789					}
3790				}
3791			}
3792			
3793			var temphtml = '';
3794
3795			if(option.type == 'type1') {
3796				if (hasValidFile) {
3797					// 파일이 있는 경우
3798					temphtml +=	'\
3799					<div class="cl-s-form-group">\
3800						<input type="text" class="cl-s-form-control valueCheck"  value="' + option.val + '" required="required" name="'+orgfield+'" id="input-' + orgfield + '">\
3801						<div class="cl-s-form-control-register">\
3802							<p class="file-title text hide">첨부된 파일이 없습니다.</p>\
3803							<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>\
3804							<div class="file-row display-flex align-items-center">\
3805								<div class="r-flex-left">\
3806									<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>\
3807									<div>\
3808										<p class="file-name">'+fileName+'</p>\
3809									</div>\
3810								</div>\
3811								<div class="r-flex-right">\
3812									<p class="file-size">'+fileSizeDisplay+'</p>\
3813									<span class="form-file-delete" data-src="'+filePaths+'">\
3814									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15" width="15" height="15"><g>
3814<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>\
3815									</span>\
3816								</div>\
3817							</div>\
3818						</div>\
3819					</div>\
3820					';
3821				} else {
3822					// 파일이 없는 경우
3823					temphtml +=	'\
3824					<div class="cl-s-form-group">\
3825						<input type="text" class="cl-s-form-control valueCheck"  value=""  required="required" name="'+orgfield+'" id="input-' + orgfield + '">\
3826						<div class="cl-s-form-control-register"  >\
3827							<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>\
3828						</div>\
3829					</div>\
3830					';
3831				}
3832			} else if(option.type == 'type2') {
3833				if(!option.val){
3834					temphtml += '\
3835					<div class="type2 cl-common-form-wrap nonplace-holder  '+ (option.val ? 'isdata' : 'nodata') +'" data-jcoltype="fupload" id="member-'+ orgfield + '">\
3836						<div class="cl-common-form-group">\
3837									<div class="cl-s-form-group">\
3838										<input type="text" class="member-info-input form-control cl-s-form-control valueCheck"  value=""  required="required" name="member-'+orgfield+'" id="member-' + orgfield + '">\
3839										<div class="cl-s-form-control-register"  >\
3840										<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>\
3841										</div>\
3842									</div>\
3843					</div>';					
3844				} else {
3845					temphtml += '\
3846					<div class="type2 cl-common-form-wrap nonplace-holder  '+ (option.val ? 'isdata' : 'nodata') +'" data-jcoltype="fupload" id="member-'+ orgfield + '">\
3847						<div class="cl-common-form-group">\
3848									<div class="cl-s-form-group">\
3849										<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 + '">\
3850										<div class="cl-s-form-control-register"  >\
3851																<div class="file-row file-info-layout">\
3852																	<div class="file-left-area">\
3853																		<p class="file-name">'+fileName+'</p>\
3854																	</div>\
3855																	<div class="file-right-area">\
3856																		<span class="file-size">'+fileSizeDisplay+'</span>\
3857																		'+$.umember.fileurlcreate(option.val).download_link+'\
3858																			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
3859																				<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"/>\
3860																			</svg>\
3861																		</a>\
3862																		<span class="form-file-delete" data-src="'+filePaths+'">\
3863																			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
3864																				<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"/>\
3865																			</svg>\
3866																		</span>\
3867																	</div>\
3868																</div>\
3869										<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>
3869' + $.lang[LANG]['register.fileUpload.btn.text'] + '</label></div>\
3870										</div>\
3871									</div>\
3872					</div>';						
3873				}
3874			}
3875
3876			return temphtml;
3877		}
3878	} /*umember end*/
3879
3880
3881
3882	$(document).on("click", "label[r-fupload-type='file.upload']", function () {
3883		var currentPage = ""
3884		if($(this).closest('.info-modal').length > 0) currentPage = "info";
3885		else if ($(this).closest(".register_form-wrap").length > 0) currentPage = "register";
3886		else if ($(this).closest(".account-info").length > 0) currentPage = "mypage";
3887
3888
3889		var REGISTER_MAX_FILE_NUMBER = 1;
3890
3891    $(" div[data-jcoltype='fupload'] input[type='file']").fileupload({        
3892        url: '/template/register_fupload/upload-file',
3893        dataType: 'json',
3894        async: true,
3895        pasteZone: null,
3896        formData: function() {
3897            // sid 값을 가져오기 위한 로직
3898            var current_sid = (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '');
3899            return [
3900                {name: 'sid', value: current_sid}
3901            ];
3902        },			
3903        change : function (e, data) { // 파일 선택 후 확인 버튼 클릭할때 change 조건들 통과해야 함
3904            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){
3905				//		    $(this).showModalFlat($.lang[LANG]['manager.list.member.block.title'], modal_content, true, true, function() {
3906
3907                var modal = $(this).showModalFlat('',$.lang[LANG]['register.file.upload.limit'], modal_content, true, true, function() {
3908                    $(document).on('keydown', function(e) {
3909                        if(e.keyCode == 27) modal.modal('hide');
3910                    });
3911                }, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
3912                return false; 
3913            }
3914			// console.log("afaf");
3915			var maxsize = "";
3916			if(typeof property != 'undefined' && property) maxsize = (property.VALIDPLAN && $.inArray(property.VALIDTYPE,['BN','SM']) > -1) ? 104857600 : 10485760;
3917			else if(typeof VALIDTYPE != 'undefined' && VALIDTYPE) maxsize = ($.inArray(VALIDTYPE,["BUSNESS","SHOPPING"]) > -1) ? 104857600 : 10485760;
3918			// console.log(maxsize);
3919            var flag = true;
3920            $.each(data.files, function(idx, file) {
3921                var filesize = file.size;
3922                if(file.size > maxsize) {
3923                    filesize = (filesize/1024/1024).toFixed(1);
3924                    if(maxsize == 104857600) err = $.lang[LANG]['editor.upload.max.100'] + $.lang[LANG]['editor.upload.max.2'];
3925                    else err = $.lang[LANG]['editor.upload.max.1'] + $.lang[LANG]['editor.upload.max.2'];
3926				
3927					$('.flat-modal').addClass('hide');
3928					$('.modal-backdrop').addClass('hide');
3929					
3930					var modal = $(this).showModalFlat('', err,true,false,function(){
3931						
3932						$(document).on('keydown', function(e) {
3933                            if(e.keyCode == 27) modal.modal('hide');
3934                        });
3935						$('.flat-modal').removeClass('hide');
3936						$('.modal-backdrop').removeClass('hide');
3937
3938					},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3939						$('.flat-modal').removeClass('hide');
3940						$('.modal-backdrop').removeClass('hide');
3941
3942					});
3943					
3944
3945                    flag = false;
3946                    return false;
3947                }
3948            });
3949
3950            if(!flag) return false;
3951        },
3952        add: function(e,data) { // 서버에 업로드 일단 함
3953            var r = $.upload_add(e,data,'register_flink');
3954			// r 객체에 submit이 false이고 err 메시지가 있는 경우 에러 팝업을 띄우는 처리 예시입니다.
3955			if (r && r.submit === false && r.err) {
3956				$('.flat-modal').addClass('hide');
3957				$('.modal-backdrop').addClass('hide');
3958			}
3959
3960            if(r.submit) {
3961                $('#loading').css('left','-100%');
3962                $.processON();
3963                data.submit();
3964				
3965                // var jqXHR = data.submit();
3966            } else {
3967				
3968				
3969
3970				var modal = $(this).showModalFlat('', r.err,true,false,function(){
3971					$(document).on('keydown', function(e) {
3972                        if(e.keyCode == 27) modal.modal('hide');
3973                    });
3974					$('.flat-modal').removeClass('hide');
3975					$('.modal-backdrop').removeClass('hide');
3976
3977				},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
3978					$('.flat-modal').removeClass('hide');
3979					$('.modal-backdrop').removeClass('hide');
3980
3981				});				
3982            }
3983        },
3984        done: function (e, data) {
3985            if(typeof data.result.error != 'undefined' && data.result.error) {
3986                // alert(data.result.error);
3987
3988				var modal = $(this).showModalFlat('', data.result.error,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                // $('.progress .progress-bar').css('width','0%');
4002                $.processOFF();
4003                return;
4004            }
4005            if(typeof data.result.file == 'undefined' || !data.result.file || typeof data.result.uploaded == 'undefined' || !data.result.uploaded) {
4006              
4007
4008				var modal = $(this).showModalFlat('', $.lang[LANG]['form.file.upload.disabled'],true,false,function(){
4009						
4010					$(document).on('keydown', function(e) {
4011                        if(e.keyCode == 27) modal.modal('hide');
4012                    });
4013					$('.flat-modal').removeClass('hide');
4014					$('.modal-backdrop').removeClass('hide');
4015
4016				},'ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn',false,function(){
4017					$('.flat-modal').removeClass('hide');
4018					$('.modal-backdrop').removeClass('hide');
4019
4020				});					
4021                $.processOFF();
4022                return;
4023            }
4024
4025            if(data.result.uploaded) {
4026                var flink_s = (data.result.uploaded.file_size) ? Number(data.result.uploaded.file_size) : 0,
4027                    flink_unit = (flink_s > 1024) ? 'MB' : 'KB',
4028                    flink_size = (flink_s > 1024) ? flink_s/1024 : flink_s;
4029                    
4030                var uploaded = data.result.uploaded;
4031                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>';
4032                if(uploaded.file_type.indexOf('image/') > -1 && uploaded.thumbnail_url) {
4033                    thumb = '<img src="' + uploaded.thumbnail_url + '">';
4034                }
4035                
4036                //$(this).closest(".cl-s-etc-val").find("input[type='text']").remove();
4037                $(this).closest("[data-jcoltype='fupload']").find(".valueCheck").val(data.result.uploaded.orig_name + '||' + data.result.uploaded.file_size + 'KB' + '||' + data.result.file);
4038                $(this).closest(".cl-s-form-wrap").removeClass("empty");
4039				
4040				switch(currentPage){
4041					case "mypage" : 
4042					case "register" : 
4043						var fileRow = '\
4044						<div class="file-row display-flex align-items-center">\
4045							<div class="r-flex-left">\
4046								<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>\
4047								<div>\
4048									<p class="file-name">'+uploaded.orig_name+'</p>\
4049								</div>\
4050							</div>\
4051							<div class="r-flex-right">\
4052									<p class="file-size">'+flink_size.toFixed(2) + flink_unit+'</p>\
4053								<span class="form-file-delete" data-src="'+uploaded.file_name+'">\
4054									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15" width="15" height="15"><g>
4054<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>\
4055								</span>\
4056							</div>\
4057						</div>\
4058						';
4059					break; 		
4060								
4061					case "info" :
4062						// 파일 정보를 조합하여 다운로드 링크 생성
4063						var file_info_str = uploaded.orig_name + '||' + uploaded.file_size + 'KB' + '||' + data.result.file;
4064						var fileResult = $.umember.fileurlcreate(file_info_str);
4065						var download_link = fileResult.download_link;
4066						
4067						var fileRow = '\
4068						<div class="file-row file-info-layout">\
4069							<div class="file-left-area">\
4070								<p class="file-name">'+uploaded.orig_name+'</p>\
4071							</div>\
4072							<div class="file-right-area">\
4073								<span class="file-size">'+flink_size.toFixed(2) + flink_unit+'</span>\
4074								'+download_link+'\
4075									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
4076										<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"/>\
4077									</svg>\
4078								</a>\
4079								<span class="form-file-delete" data-src="'+uploaded.file_name+'">\
4080									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">\
4081										<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"/>\
4082									</svg>\
4083								</span>\
4084							</div>\
4085						</div>\
4086						';
4087					break; 	
4088				}	
4089                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register").append(fileRow);
4090				$(this).closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').addClass('hide');
4091
4092				$(this).closest("[data-jcoltype='fupload']").addClass('isdata');
4093				$(this).closest("[data-jcoltype='fupload']").removeClass('nodata');
4094            }
4095            
4096             if($(this).closest("[data-jcoltype='fupload']").find('.file-row').length >= REGISTER_MAX_FILE_NUMBER) {
4097                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register").find('label').addClass('disabled');
4098                $(this).closest("[data-jcoltype='fupload'] .cl-s-form-control-register ").find('input[type="file"]').prop('disabled', true);
4099
4100				var $inputElement = $(this).closest("[data-jcoltype='fupload']").find('.valueCheck');
4101				$inputElement.attr('data-etcidx', '');
4102				$inputElement.attr('data-id', '');
4103				$inputElement.attr('data-file-name', '');				
4104            }
4105            $.processOFF();
4106            // $('#loading').css('left','50%');
4107        },
4108    }).prop('disabled', !$.support.fileInput)
4109        .parent().addClass($.support.fileInput ? undefined : 'disabled');
4110	});
4111
4112	$(document).on("click", "div[data-jcoltype='fupload'] .form-file-delete", function() {
4113		var REGISTER_MAX_FILE_NUMBER = 1;
4114		var $elem = $(this);
4115
4116		var $label = $(this).closest("[data-jcoltype='fupload']").find('label');
4117		var $inputFile = $(this).closest("[data-jcoltype='fupload']").find('input[type="file"]');
4118		var etcIdx = $(this).closest("[data-jcoltype='fupload']").find('.valueCheck').attr('name');
4119		etcIdx = etcIdx.replace('member-', '');
4120		var directDeleteFlag = false;
4121		var $closestForm = $(this).closest('form[name="myinfo_form"]');
4122		var id = "";
4123
4124		if( $closestForm.length > 0 && $closestForm.attr('action') === '/_myinfo_proc') {
4125			directDeleteFlag = true;
4126			id = $(this).closest($closestForm).find('[name="email"]').val();
4127		} else if (($(this).closest(".mng-modal-body").length > 0)){
4128			directDeleteFlag = true;
4129			id = $(this).closest(".mng-modal-body").find(".member-info-input").val();
4130		}
4131
4132		if(directDeleteFlag) {
4133
4134			var $inputElement = $elem.closest("[data-jcoltype='fupload']").find('.valueCheck');
4135			$inputElement.attr('data-etcidx', etcIdx);
4136			$inputElement.attr('data-id', id || '');
4137			$inputElement.attr('data-file-name', $elem.data('src'));
4138			
4139			// 파일 업로드 상태 업데이트
4140			var fileRowCnt = $elem.closest("[data-jcoltype='fupload']").find('.file-row').length;
4141			$elem.closest("[data-jcoltype='fupload']").find(".valueCheck").attr('value', '');
4142			
4143			$elem.closest("[data-jcoltype='fupload']").addClass('nodata');
4144			$elem.closest("[data-jcoltype='fupload']").removeClass('isdata');
4145			$elem.closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').removeClass('hide');
4146
4147			if($elem.closest("[data-jcoltype='fupload']").hasClass("type2")) {
4148				$elem.closest("[data-jcoltype='fupload']").removeClass("isdata");
4149				$elem.closest("[data-jcoltype='fupload']").addClass("nodata");
4150			}
4151			if(fileRowCnt - 1 < REGISTER_MAX_FILE_NUMBER) {
4152				$label.removeClass('disabled');
4153				$inputFile.prop('disabled', false);
4154			}
4155			$elem.closest('.file-row').remove();
4156			
4157			// 확인 메시지
4158			
4159		} else {
4160			if(confirm(directDeleteFlag ? $.lang[LANG]['upload.file.confirm.delete'] : $.lang[LANG]['form.file.confirm.delete'])) {
4161			
4162 			$.ajax({
4163				url:"/template/register_fupload/delete-file",
4164				type:"post",
4165				async: true,
4166				beforeSend: function() {
4167					$.processON();
4168				},
4169				data:{
4170					"s": $elem.data("src"),
4171					"directDeleteflag" : directDeleteFlag ,
4172					"etcIdx" : etcIdx,
4173					"id" : id || "",
4174					"sid": (typeof property !== 'undefined' && property.SID) ? property.SID : (typeof SID !== 'undefined' ? SID : '')
4175				},
4176				dataType:"json",
4177				success:function() {
4178					var fileRowCnt = $elem.closest("[data-jcoltype='fupload']").find('.file-row').length;
4179					$elem.closest("[data-jcoltype='fupload']").find(".valueCheck").attr('value', '');
4180					if(fileRowCnt > 1) {
4181						$elem.closest("[data-jcoltype='fupload']").find('.file-uploaded-number').text('(' + (fileRowCnt - 1) + '/' + REGISTER_MAX_FILE_NUMBER + ')');
4182					} else {
4183						$elem.closest("[data-jcoltype='fupload']").addClass('nodata');
4184						$elem.closest("[data-jcoltype='fupload']").removeClass('isdata');
4185						$elem.closest("[data-jcoltype='fupload']").find('label[r-fupload-type="file.upload"]').removeClass('hide');
4186
4187						if($elem.closest("[data-jcoltype='fupload']").hasClass("type2")) {
4188							$elem.closest("[data-jcoltype='fupload']").removeClass("isdata");
4189							$elem.closest("[data-jcoltype='fupload']").addClass("nodata");
4190						}
4191					}
4192					
4193					if(fileRowCnt - 1 < REGISTER_MAX_FILE_NUMBER) {
4194						$label.removeClass('disabled');
4195						$inputFile.prop('disabled', false);
4196					}
4197				},
4198				complete: function() {
4199					$elem.closest('.file-row').remove();
4200					$.processOFF();
4201				}
4202			});
4203		 }
4204		}			
4205	});		
4206	// $.fixbtnConfig = {
4207	// 	html: function(e){
4208	// 		// console.log('fixbtnConfig html');
4209
4210	// 		var $this = ($('.siteLANG').has(e.target).length || $(e.target).hasClass('siteLANG')) ? $('.el-menu .siteLANG') : $(e.target),
4211	// 			fixbtnPosition = $.fixbtnConfig.position($this),
4212	// 			checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false,
4213	// 			fh_type = $('header.navbar[data-fixtype]').attr('data-fh-type'),	
4214	// 			fixtypeNum = $('header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),		
4215	// 			fixtypeArr = ['01','02','03','08'],
4216	// 			edit_html = '<div class="fixbtn_wrap"><span class="fixbtn_edit">' + clSVG('block-config',15,15) + '</span></div>',
4217	// 			checktarget = $.fixbtnConfig.checkTarget($this);
4218				
4219	// 		if(checktarget.indexOf('FixedMenu')>-1) {
4220	// 			if(checkSidebar) $('.navbar-fheader[data-fixtype] .cl-fixed-menu').prepend(edit_html);
4221	// 			else $('.navbar-fheader[data-fixtype] .cl-fixed-menu').before(edit_html);
4222	// 		} else {
4223	// 			$('.element [data-fixtype^="sidebar_"] .siteLANG.cl-fixbtn').prepend(edit_html);
4224	// 		}
4225			
4226	// 		$('.fixbtn_wrap').css('left',fixbtnPosition.left+'px');
4227			
4228	// 		if(checkSidebar && $.inArray(fixtypeNum, fixtypeArr) > -1) $('.fixbtn_wrap').css('top',fixbtnPosition.top+'px');
4229	// 		if(!checkSidebar) $('.fixbtn_wrap').css('height',fixbtnPosition.height+'px');
4230	// 		if(!checkSidebar && (fh_type=='top')) $('header.navbar[data-fixtype]').find('.cl-fixed-menu').css('padding-left','50px');
4231	// 	},
4232	// 	position: function($this){
4233	// 		// console.log('fixbtnConfig position');
4234	// 	    if((window.innerWidth < 769 && typeof MODE == 'undefined')) return false; 
4235	// 	    var height_arr = {},
4236	// 	    	fh_type = ($('c').attr('data-fh-type')) ? $('header.navbar[data-fixtype]').attr('data-fh-type') : 'top',
4237	// 	    	fixtextalign = ($('header.navbar[data-fixtype]').attr('data-fixtextalign')) ? $('header.navbar[data-fixtype]').attr('data-fixtextalign') : 'center',
4238	// 	        fixtypeNum = $('header.navbar').attr('data-fixtype').replace(/(top|sidebar)\_/gi,''),
4239	// 	        fixtypeArr = ['01','02','03','08'],
4240	// 	        checkSlang = ($('.cl-fixbtn.siteLANG').length > 0) ? true : false,
4241	// 	        checkFixedMenu = ($('.cl-fixed-menu').length > 0) ? true : false,
4242	// 	        checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false,
4243	// 	        checktarget = $.fixbtnConfig.checkTarget($this);
4244
4245	// 			$this = (checktarget.indexOf('FixedMenu')>-1) ? $('.element header.navbar[data-fixtype] .cl-fixed-menu') : $('.element [data-fixtype^="sidebar_"] .siteLANG.cl-fixbtn');
4246
4247	// 	    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') : '',
4248	// 	    	width_val = ($cl_fixbtn) ? $cl_fixbtn.width() : 0,
4249    //             clfixbtn_eq = (fixtextalign=='left' && checkSidebar && !$this.hasClass('siteLANG')) ? ($cl_fixbtn ? $cl_fixbtn.last() : $cl_fixbtn.first()) : ($this.hasClass('siteLANG') ? '' : $cl_fixbtn.first()),
4250    //             $selector = $this.hasClass('siteLANG') ? $this.find('.cl-lang').offset().left.toFixed(0) : 
4251	// 	        			( $cl_fixbtn ? ((clfixbtn_eq.find('> a:visible').length>0) ? clfixbtn_eq.find('> a:visible').offset().left.toFixed(0) : 0) : 0),
4252	//    			leftPosCal = (checkSidebar) ? 50 : 47,
4253	// 	        top_cal = '';
4254
4255	//    			$selector = Number($selector);
4256
4257   	// 		//사이드바 세로디자인 확장기능버튼(01,02,03,08) => a 태그 width 최대값 구하기
4258   	// 		if(checkSidebar && ($.inArray(fixtypeNum, fixtypeArr) > -1) && !$this.hasClass('siteLANG')) {  
4259	//         	var width_arr = [],
4260	//         		selector_arr = [];
4261
4262    //             $cl_fixbtn.find('> a:visible').each(function(){
4263    //             	var w_val = $(this).width();
4264    //             	if(!top_cal) top_cal = Number(($(this).parents('li.cl-fixbtn.cl-visible').height() - 25) / 2);
4265            
4266    //             	width_arr.push(w_val);
4267    //             	selector_arr.push($(this));
4268    //             });
4269
4270    //             var w_max = Math.max(...width_arr),
4271    //             	w_index = width_arr.indexOf(w_max);
4272	
4273    //         	$selector = Number($(selector_arr[w_index]).offset().left.toFixed(0));      
4274            	     	
4275    //         	width_val = w_max;
4276    //         } 
4277          	
4278    //         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),
4279	// 	        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());
4280	       
4281	// 	    height_arr = {
4282	// 	        'left' : fixed_left,
4283	// 	        'height' : fixed_height,
4284	// 	        'top' : top_cal
4285	// 	    }
4286
4287	// 	    return height_arr;
4288	// 	},
4289	// 	checkTarget : function($this) {
4290	// 		// console.log('fixbtnConfig checkTarget');
4291	// 		var checkTarget = '',
4292	// 			checkSidebar = ($('.navbar-fheader').hasClass('sidebar')) ? true : false;
4293
4294	// 		if(checkSidebar) {
4295	// 	    	checkTarget = ($this.has($('.siteLANG')).length>0 || $this.hasClass('siteLANG')) ? 'sidebarSiteLang' : 'sidebarFixedMenu';
4296	// 	    } else {	
4297	// 	    	checkTarget = 'topFixedMenu'
4298	// 	    }
4299
4300	// 	    return checkTarget;
4301	// 	}
4302	// }
4303
4304	var setLoginLogoutAttribute = function(check_login,nav,display) {
4305		if(!check_login) {
4306			nav.find('.siteUM').removeClass('dropdown').find('.cl-login').show().removeClass(display).addClass(display);
4307			nav.find('.siteUM').find('.cl-logout').hide();
4308		} else {
4309			nav.find('.siteUM').find('.cl-login').hide();				
4310			nav.find('.siteUM').find('.cl-logout').show();
4311			nav.find('.siteUM').find('.dropdown-menu').remove();
4312		}
4313	}
4314
4315	var getJoinCollectionsList = function(sid) {
4316		var returnHtml = '';
4317		$.ajax({
4318			url: '/umember/collections',
4319			type: 'post',
4320			data: { sid : sid },
4321			dataType: 'html',
4322			success: function (list_html) {
4323				// $('.order-list-area').html(list_html);
4324				returnHtml += list_html;
4325			}, error: function () {
4326	
4327			}, complete: function () {
4328				// $.processOFF();
4329			}
4330		});
4331	   
4332		return returnHtml;
4333	}	
4334	
4335	/***********************************************************************************************************************************member-config page START*/
4336	var activePrev = $('#join-activate').selectpicker('val');
4337	$('#join-activate, #join-language, #join-approval, #join-display, #join-captcha').live('change', function () {
4338		var key = $(this).attr('id').replace(/join-/gi,''),
4339			val = ($(this).is('select')) ? $(this).val() : $(this).prop('checked');
4340
4341		$.ajax({
4342			type: 'POST',
4343			url: '/umember/update/type/condition',
4344			data: { sid : SID, key : key, val : val },
4345			dataType: 'json',
4346			async: true,
4347			success: function(data) {
4348				if(typeof data.error != 'undefined' && data.error) {
4349					alert(data.error);
4350					return false;
4351				}
4352				if(data.cert_use !== undefined && data.cert_use) {
4353					$('#join-activate').selectpicker('val', activePrev);
4354		            var modal_str = $.lang[LANG]['manager.cert.disable.option.txt'];
4355		            $(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');
4356		            return false;
4357				}
4358				activePrev = val;
4359
4360				if(val == '0') {
4361					$('#section-top-menu li').addClass('disabled-cert');
4362				} else {
4363					$('#section-top-menu li').removeClass('disabled-cert');
4364				}
4365			}
4366		});
4367	});
4368
4369	$(document).off('click', '.mng-settings[data-type="collection"] .collection-item-used, .mng-settings[data-type="collection"] .collection-item-optional')
4370			   .on('click', '.mng-settings[data-type="collection"] .collection-item-used, .mng-settings[data-type="collection"] .collection-item-optional', function() {
4371		if($(this).closest('.checkboxs').hasClass('disabled')) {
4372			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');
4373			return false;
4374		}
4375
4376		var cl_val = $(this).prop('checked'),
4377			item_seq = $(this).parents('.collection-item').attr('data-seq'),
4378			jcol_name = $(this).parents('.collection-item').find('.collection-name').text(),
4379			update_data = {},
4380			jcol_data = {},
4381			d_index = 0,
4382			check_class = $(this).attr('class').replace(/collection-item-/gi,'');
4383
4384		check_class = (check_class=='optional') ? 'require' : check_class;
4385				
4386		jcol_data[0] = {
4387			seq : item_seq,
4388			[check_class] : cl_val.toString()
4389		}
4390
4391		if (check_class === 'used' && cl_val.toString() === 'false' && $(this).closest('.use-option-check').find('.collection-item-optional').prop('checked') === true) {
4392			jcol_data[0]['require'] = 'false';
4393			$(this).closest('.use-option-check').find('.collection-item-optional').prop('checked', false);
4394		}
4395		if (check_class === 'require' && cl_val.toString() === 'true' && $(this).closest('.use-option-check').find('.collection-item-used').prop('checked') === false) {
4396			jcol_data[0]['used'] = 'true';
4397			$(this).closest('.use-option-check').find('.collection-item-used').prop('checked', true);
4398		}
4399		
4400		$.ajax({
4401			type: 'POST',
4402			url: '/umember/setJoinCollections/type/jcol_update',
4403			data: { sid: SID, update_data: jcol_data },
4404			dataType: 'json',
4405			async: true,
4406			success: function(data) {
4407				if(typeof data.error != 'undefined' && data.error) {
4408					alert(data.error);
4409					return false;
4410				}
4411
4412				var slog_val = check_class+'.'+cl_val.toString(),
4413					slog_field = {'field_name':jcol_name};
4414				setSiteLogs('um.config.collection.new',slog_val,slog_field,'um.config.collection.new');
4415			},
4416			complete: function () {
4417				$.processOFF();
4418			}
4419		});
4420	});
4421	
4422	$('.cl-s-join-collections-etcwrap[data-jcoltype="memo"] textarea').live({
4423		focus : function(e){
4424			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').addClass('etc-mouseEnter');
4425			if($(this).val()) {
4426				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active').addClass('textarea-active');
4427			} else {
4428				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active');
4429			}
4430		},
4431		focusout : function(e) {
4432			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('etc-mouseEnter');
4433			$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active-text').addClass('textarea-active-text');
4434			if($(this).val()) {
4435				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active').addClass('textarea-active');
4436			} else {
4437				$(this).parents('.cl-s-join-collections-etcwrap').find('.cl-s-etc').removeClass('textarea-active');
4438			}
4439		}
4440		
4441	});
4442
4443	$('.mng-member .mng-settings[data-type="collection"] .collection-add').live('click',function() {
4444
4445		if($('.mng-member .collection-content').find('.collection-item.additem').length>0) {
4446			return false;
4447		}
4448		// if($('.mng-member .collection-content').find('.collection-update').length>0) {
4449		// 	$('.mng-member .collection-content .collection-update').find('input').focus();
4450		// 	return false;
4451		// }
4452	
4453		if($('.mng-member .collection-content').find('.collection-item').length==15) $(this).hide();
4454		if($('.mng-member .collection-content').find('.collection-item').length>16) {
4455			var modal = $(this).showModalFlat('DELETE FIELD', $.lang[LANG]['manager.join.cl.item.max-add'], true, false, '', 'ok');
4456			return false;
4457		}
4458
4459		var cl_etc_arr = $('.mng-member .collection-content .collection-item').map(function() { 
4460							var cl_type = $(this).attr('data-type');
4461							if(cl_type.match(/^etc/)) return cl_type.replace('etc','');
4462						}).get().sort(),
4463			cl_etc = $('.collection-content .collection-item').length-6;
4464
4465		for (var i = 0; i < 10; i++) {
4466			if(typeof cl_etc_arr[i] == 'undefined' || parseInt(cl_etc_arr[i]) != (i+1) ) {
4467				cl_etc = i+1; 
4468				break;
4469			}
4470		}
4471
4472		var str = collectionItem('',cl_etc);
4473		
4474        $('.mng-member .collection-content').append(str)
4475		
4476		
4477		$('.mng-member .collection-content').find('.collection-item[data-etc="' + cl_etc + '"] .collection-edit').click();
4478		$('.collection-type-selectbox select[name="jcollection-select-type"]').selectpicker();		
4479		
4480		$('.collection-item.additem').find('.collection-config').removeClass('hide').addClass('hide');
4481		collectionSortable('.mng-member .collection-item');
4482		
4483	});
4484
4485
4486	
4487
4488    $('.mng-member .mng-settings[data-type="collection"] .collection-edit').live('click', function() {
4489		if($('.mng-member .collection-content').find('.collection-update').length > 0 ) {
4490			return false;
4491		}
4492		var selectCl = $(this).closest('.collection-item'),
4493			cl_name = selectCl.find('.collection-name').text(),
4494			input_text = addCollectionInput(cl_name);
4495
4496		selectCl.removeClass('collection-status-edit').addClass('collection-status-edit');
4497		$('.mng-member .collection-content').removeClass('collection-status-disabled').addClass('collection-status-disabled');
4498		$(this).parents('.collection-item').siblings().find('.collection-config > .icons').removeClass('hide').addClass('hide');
4499		// $(input_text).prependTo(selectCl.find('.collection-info'));
4500		// $(input_text).prependTo(selectCl);
4501
4502		// $(this).parents('.collection-item').find('.collection-info .collection-name').hide();
4503		// $('.mng-member .collection-content').find('.collection-item').css('pointer-events','none');
4504		// $('.mng-member .collection-content').find('.collection-update-cancel, .collection-update-save, .collection-update-name').css('pointer-events','auto');
4505		// $('.mng-member .collection-update .collection-update-name').focus();
4506		$('#join-collections,#mjoin-collections').sortable({cancel: '.collection-item' });
4507	});
4508
4509	$('.mng-member .mng-settings[data-type="collection"] .collection-delete').live('click', function() {
4510		var selectCl = $(this).closest('.collection-item'),
4511			cl_etc = (typeof selectCl.attr('data-etc') != 'undefined' && selectCl.attr('data-etc')) ? selectCl.attr('data-etc') : '',
4512			cl_field = 'etc' + cl_etc,
4513			cl_name = selectCl.find('.collection-name').text(),
4514			item_seq = $(this).parents('.collection-item').attr('data-seq');
4515
4516		var del_modal = $(this).showModalFlat($.lang[LANG]['manager.join.cl.item.delete.title'], $.lang[LANG]['manager.join.cl.item.delete'], true, true, function() {
4517			selectCl.addClass('delete_item');
4518
4519			$.processON();
4520
4521			$.ajax({
4522				type: 'POST',
4523				url: '/umember/setJoinCollections/type/jcol_delete',
4524				data: { sid: SID, d_seq : item_seq },
4525				dataType: 'json',
4526				async: true,
4527				success: function(data) {
4528					if(typeof data.error != 'undefined' && data.error) {
4529						alert(data.error);
4530						return false;
4531					}
4532			
4533					$('.mng-member .collection-content').find('.collection-item[data-etc="'+cl_etc+'"]').remove();
4534					if($('.mng-member .collection-content').find('.collection-item').length<16) {
4535						$('.mng-member .collection-add').show();
4536					}
4537					
4538					del_modal.modal('hide');
4539
4540					setSiteLogs('um.config.collection','delete',{'field_name':cl_name,'field':cl_field},'um.config.collection');
4541
4542				},
4543				complete: function () {
4544					$.processOFF();
4545				}
4546			});
4547		}, 'cancel',$.lang[LANG]['manager.join.cl.item.delete.btn.delete'],'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
4548	});
4549
4550
4551	$('.mng-member .mng-settings[data-type="collection"] .collection-update-cancel').live('click', function() {
4552		if($('.mng-member .collection-content').find('.collection-item').length<16) $('.mng-member .collection-add').show();
4553		if(!$(this).closest('.collection-item').find('.collection-name').text()) {
4554			$(this).closest('.collection-item').remove();
4555		}
4556		$(this).parents('.collection-item').find('.collection-info .collection-name').show();
4557		$('.mng-member .collection-content').find('.config-error').remove();
4558		$('.mng-member .collection-content').find('.collection-item').removeAttr('style');
4559		$(this).closest('.collection-update').remove();
4560		collectionSortable();
4561	});
4562
4563	$('.mng-member .collection-update-save').live('click', function(e) {
4564		var selectCl = $(this).closest('.collection-item'),
4565			cl_etc = (typeof selectCl.attr('data-etc') != 'undefined' && selectCl.attr('data-etc')) ? selectCl.attr('data-etc') : '',
4566			cl_field = 'etc' + cl_etc,
4567			cl_type = selectCl.find('.collection-item-type-select').val(),
4568			cl_name = selectCl.find('.collection-update-name').val().trim(),
4569			cl_prev = selectCl.find('.collection-name').text().trim(),
4570			regexp = /^[ㄱ-ㅎ가-힣ㅏ-ㅣa-zA-Z0-9\# ]+$/i,
4571			error_str = '';
4572
4573
4574		$('.collection-content .config-error').remove();
4575		$(this).parents('.collection-item').find('.collection-info .collection-name').show();
4576
4577		if(cl_prev == cl_name) {
4578			if(selectCl.hasClass('additem')) {
4579				error_str = $.lang[LANG]['manager.join.cl.item.name.enter'];
4580			} else {
4581				$('.collection-content').find('.collection-item').removeAttr('style');
4582				$('.collection-content').find('.collection-update').remove();
4583				return false;
4584			}
4585		}
4586
4587
4588		if(cl_name.length == 0) error_str = $.lang[LANG]['board.enter-group-name'];
4589		else if(checkEmojis(cl_name)) error_str = $.lang[LANG]['config.unable.emoji'];
4590		else if(!regexp.test(cl_name)) error_str = $.lang[LANG]['board.allowed-chars'];
4591		else if(cl_name.length>20) error_str = $.lang[LANG]['board.enter-max-chars'];
4592		else if(cl_prev == cl_name) {
4593			if(selectCl.hasClass('additem')) {
4594				error_str = $.lang[LANG]['manager.join.cl.item.name.enter'];
4595			} else {
4596				$('.collection-content').find('.collection-item').removeAttr('style');
4597				$('.collection-content').find('.collection-update').remove();
4598				return false;
4599			}
4600		} else {
4601			var cl_name_list = $('.collection-content').find('.collection-name').map(function() { return $(this).text().trim(); }).get();
4602			if($.inArray(cl_name,cl_name_list) > -1) {
4603				error_str = $.lang[LANG]['manager.join.cl.item.name.inuse'];
4604			}
4605		}
4606
4607		if(error_str.length > 0) {
4608			e.preventDefault();
4609			$(this).parents('.collection-item').find('.collection-info .collection-name').hide();
4610			selectCl.append('<div class="config-error collection-edit">' + error_str + '</div>');
4611			return false;
4612		}
4613			
4614		var collections = {};
4615		$('.mng-member .collection-content').children('.collection-item').each(function() {
4616			var field = $(this).attr('data-type'),
4617				name = (field == cl_field) ? cl_name : $(this).find('.collection-name').text().trim(),
4618				type = (field == cl_field) ? cl_type : $(this).find('.collection-item-type-select').val(),
4619				used = $(this).find('.collection-item-used').prop('checked'),
4620				optional = $(this).find('.collection-item-optional').prop('checked');
4621
4622			collections[field] = {
4623				'used'	: used,
4624				'optional'	: optional,
4625				'name'	: name,
4626				'type'	: type
4627			};
4628		});
4629		
4630		$.ajax({
4631			type: 'POST',
4632			url: '/umember/update/type/condition',
4633			data: { sid: SID, key: 'collections_all', val: JSON.stringify(collections) },
4634			dataType: 'json',
4635			async: true,
4636			success: function(data) {
4637				if(typeof data.error != 'undefined' && data.error) {
4638					alert(data.error);
4639					return false;
4640				}
4641
4642				if(selectCl.hasClass('additem')) {
4643					selectCl.removeClass('additem');
4644					selectCl.find('#collection-item-used-additem').removeAttr('id').attr('id','collection-item-used-'+cl_field);
4645					// selectCl.find('label[for="collection-item-used-additem"]').removeAttr('for').attr('for','collection-item-used-'+cl_field);
4646					selectCl.find('#collection-item-optional-additem').removeAttr('id').attr('id','collection-item-optional-'+cl_field);
4647					// selectCl.find('label[for="collection-item-optional-additem"]').removeAttr('for').attr('for','collection-item-optional-'+cl_field);
4648				}
4649				selectCl.find('.collection-name').text(cl_name);
4650
4651				$('.collection-content').find('.config-error').remove();
4652				$('.collection-content').find('.collection-item').removeAttr('style');
4653				selectCl.find('.collection-update').remove();
4654				collectionSortable();
4655
4656
4657				var checkAdd = (cl_prev == '') ? true : false,
4658					slog_val = (checkAdd) ? 'add' : 'edit',
4659					slog_field = (checkAdd) ? {'field_name':cl_name,'field':cl_field} : {'field_name':cl_prev,'field':cl_field,'before':cl_prev,'after':cl_name};
4660				setSiteLogs('um.config.collection',slog_val,slog_field,'um.config.collection');
4661
4662			}
4663		});
4664	});
4665
4666
4667	$('#config-acces-terms, #config-privacy, #config-privacy-join, #config-privacy-nonmem, #config-description').live('blur', function(e) {
4668		var blur_id = $(this).attr('id'),
4669			key = blur_id.replace(/config-/gi,'').replace(/-/gi,'_'),
4670			val = $(this).val().trim(),
4671			mng_settings_el = $(this).closest('.mng-settings');
4672
4673		if(key.charAt(0) == 'm') key = key.substring(1,key.length);
4674
4675		$.ajax({
4676			type: 'POST',
4677			url: '/umember/update/type/condition',
4678			data: { sid : SID, key : key, val : val },
4679			dataType: 'json',
4680			async: true,
4681			success: function(data) {
4682				if(typeof data.error != 'undefined' && data.error) {
4683					alert(data.error);
4684					return false;
4685				}
4686				mngShowToast('check', $.lang[LANG]['manager.check.save.text'] , mng_settings_el);
4687
4688				if(typeof data.val  != 'undefined' && val == '') {
4689					$('#'+blur_id).val(data.val);
4690				}
4691			}
4692		});
4693
4694	});
4695
4696
4697	/*가입 수집 항목 : type 변경 기능(추후) 사용되는 부분.*/
4698	$('.mng-settings[data-type="collection"] .collection-toggle').live('click', function() {
4699	    $(this).closest('.collection-item').toggleClass('item-content-open');
4700	    if($(this).closest('.collection-item').hasClass('item-content-open')) {
4701	        $(this).removeClass('fa-angle-down').addClass('fa-angle-up');
4702	        // $(this).closest('.collection-item').find('.collection-item-content').removeAttr('style');
4703	    } else {
4704	        $(this).removeClass('fa-angle-up').addClass('fa-angle-down');
4705	        // $(this).closest('.collection-item').find('.collection-item-content').css('display','none');
4706	    }
4707	});
4708
4709
4710    $('.mng-siteUM-modal .profile-image-wrap,#my-image-modal .profile-image-wrap').live({
4711		click: function() {
4712			var checkFirstStep = ($(this).find('#profileMyImg').length > 0) ? false : true;
4713			if(checkFirstStep) $('.mng-siteUM-modal .my-image-edit').click();
4714			else $('#profileUMFileupload').click();
4715		}
4716	});
4717
4718    $('#profileUMFileupload').live({
4719		click: function() {
4720			
4721			var sid = $('#my-image-modal').attr('data-sid'),
4722				uid = $('#my-image-modal').attr('data-uid');
4723
4724			$(this).fileupload({
4725				url: '/umember/update/type/myimage/sid/'+sid+'/uid/'+uid,
4726				dataType: 'json',
4727				pasteZone: null,
4728				async: true,
4729				add: function(e, data) {
4730					$('#loading').css('left','-100%');
4731					$.processON();
4732					data.submit();
4733				}, 
4734				done: function(e, data) {
4735					if(typeof data.result.error != 'undefined' && data.result.error) {
4736						alert(data.result.error);
4737						$('.progress .progress-bar').css('width','0%');
4738						$.processOFF();
4739						return;
4740					}
4741					if(data.result.src) {
4742						$('.profile-image-wrap .my-image').prop('src',data.result.src);
4743						if($('.dashboard._admin_dashboard').length > 0) $('#dashboard-image-top image').attr('xlink:href',data.result.src);
4744						if($('#mobile-nav').length > 0) $('#mobile-nav .login-profile img').prop('src',data.result.src);
4745					}
4746                    $.processOFF();
4747					$('#loading').css('left','50%');
4748				},
4749				progressall: function(e, data) {
4750					var progress = parseInt(data.loaded / data.total * 100, 10);
4751					$('.progress .progress-bar').css(
4752						'width',
4753						progress + '%'
4754					);
4755				},
4756			}).prop('disabled', !$.support.fileInput)
4757				.parent().addClass($.support.fileInput ? undefined : 'disabled');
4758
4759		}
4760	});
4761
4762
4763	$('#uJoin').live('click', function() {
4764		var joinModal = $('#join-modal'),
4765			approval = $(this).attr('data-approval'),
4766			input_data = {};
4767
4768		if($(this).closest('#join-modal-preview').length != 0) {
4769			$(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
4770			return false; 
4771		}
4772
4773		joinModal.find('.form-group').each(function(i) { 
4774			var inputEL = $(this).find('input.form-control'),
4775				errorEL = $(this).find('.error'),
4776				field 	= inputEL.attr('id').trim().replace(/input-/,''),
4777				val		= inputEL.val(), 
4778				optional = $(this).hasClass('optional'),
4779				empty_class = (optional && val.trim().length == 0) ? 'empty' : '',
4780				error_str =   (optional && val.trim().length == 0) ? $.lang[LANG]['manager.check.required.message'] : '';
4781
4782			if(!error_str && val.trim().length > 0) {
4783				switch(field) {
4784					case 'password-checked': 
4785						if(joinModal.find('#input-password').val().trim() != val.trim()) {
4786							error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
4787						}
4788						break;
4789
4790					default:
4791						if(typeof  COLLECTION_REGEX[field] != 'undefined' &&  COLLECTION_REGEX[field]) {
4792							var pattern = COLLECTION_REGEX[field]['pattern_j'],
4793								reg = new RegExp(pattern);
4794							if(!reg.test(val)) error_str = COLLECTION_REGEX[field]['error'];
4795						}
4796						break;
4797				}
4798			}
4799
4800
4801			if(error_str.length > 0) {
4802				if(errorEL.length > 0) errorEL.text(error_str);
4803				else $(this).append('<span class="error ' + empty_class + '">' + error_str + '</span>');
4804
4805				if(joinModal.find('.focus').length == 0) inputEL.focus();
4806			} else {
4807				errorEL.remove();
4808				if(field == 'id') val = val.toLowerCase();
4809				if(field == 'password') val = hex_md5(val);
4810				if(field == 'email') val = val.toLowerCase();
4811
4812				if(field != 'password-checked') input_data[field] = val;
4813			}
4814
4815			input_data['wr_key'] = $("#wr_key").val();
4816		});
4817
4818		if(!joinModal.find('.kcaptcha-wrap').hasClass('hide')) {
4819			var captcha = joinModal.find('#wr_key'),
4820				val = captcha.val(),
4821				captcha_error = captcha.next('label.error'),
4822				error_str = '';
4823
4824			if( val.trim().length == 0 ) {
4825				error_str = $.lang[LANG]['manager.join.regexp.captcha'];
4826			} else if( val && (Base64.encode(val.trim()) != md5_norobot_key)) {
4827				error_str = $.lang[LANG]['manager.join.regexp.captcha.wrong'];
4828			} 
4829
4830			if( error_str.length > 0 ) {
4831				if(captcha_error.length > 0) captcha_error.text(error_str);
4832				else captcha.after('<label class="error">' +  error_str + '</label>');
4833				
4834				if(joinModal.find('.focus').length == 0) captcha.focus();
4835			} else {
4836				captcha_error.remove();
4837			}
4838		}
4839
4840
4841		if(joinModal.find('.error').length == 0) {
4842
4843			var sid = joinModal.attr('data-sid');
4844			$.post('/umember/join/update', { sid : sid, data : JSON.stringify(input_data) }, function(data) {
4845				if(typeof data.error != 'undefined' && data.error) {
4846					$.each(data.error, function(key,str) {
4847						if(joinModal.find('#input-'+key).length > 0 ) {
4848							joinModal.find('#input-'+key).focus();
4849							joinModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4850						} else { alert(str,'/manager/member'); return false; }
4851					});
4852					if(joinModal.find('.error').length > 0) return false;
4853				}
4854				
4855				if(typeof userSiteJoinCallback == 'function')
4856			    			userSiteJoinCallback();
4857			    		
4858				var okModal = $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.join.success.'+approval], true, false, '', $.lang[LANG]['config.close']);
4859				$.umember.joinModalInit();
4860				joinModal.modal('hide');
4861			},'json');
4862
4863		}
4864
4865
4866	});
4867
4868
4869	$('.view-join-textarea').live('click', function() {
4870		var sid = $(this).closest('.modal-default').attr('data-sid'),
4871			type = $(this).attr('data-type').replace(/-/gi,'_');
4872
4873		$.post('/umember/get/type/join', { sid : sid, field : type }, function(data) {
4874			if(typeof data.error != 'undefined' && data.error) {
4875				alert(data.error);
4876				return false;
4877			}
4878
4879			$('#join-textarea').html(data);
4880			if($('#join-textarea').css('display') == 'none') $('#join-textarea').fadeIn();
4881
4882		}, 'json');
4883
4884	});
4885
4886
4887	$('#uLogin').live('click', function() {
4888		var loginModal = $('#login-modal'),
4889			input_data = {};
4890
4891		loginModal.find('.form-group').each(function(i) { 
4892			var inputEL = $(this).find('input.form-control'),
4893				errorEL = $(this).find('.error'),
4894				field 	= inputEL.attr('id').trim().replace(/input-/,''),
4895				val		= inputEL.val(),
4896				error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.'+field+'.input'] : '';
4897
4898			if(error_str.length > 0 ) {
4899				if(errorEL.length > 0) errorEL.text(error_str);
4900				else $(this).append('<span class="error">' + error_str + '</span>');
4901
4902				if(loginModal.find('.focus').length == 0) inputEL.focus();
4903			} else {
4904				errorEL.remove();
4905				if(field == 'id') val = val.trim().toLowerCase();
4906				if(field == 'password') val = hex_md5(val);
4907				input_data[field] = val;
4908			}
4909		});
4910
4911		if(loginModal.find('.error').length == 0) {
4912
4913			var sid = loginModal.attr('data-sid');
4914			$.post('/umember/login/in', { sid : sid, data : JSON.stringify(input_data) }, function(data) {
4915
4916				if(typeof data.error != 'undefined' && data.error) {
4917					$.each(data.error, function(key,str) {
4918						if(loginModal.find('#input-'+key).length > 0 ) {
4919							loginModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4920						} else { alert(str,'/manager/member'); return false; }
4921					});
4922					if(loginModal.find('.error').length > 0) return false;
4923				}
4924
4925				$.umember.loginModalInit();
4926				$.umember.init();
4927				loginModal.modal('hide');
4928
4929				if(data.member.check_login) {
4930					if(typeof data.ss_url != 'undefined' && data.ss_url) {
4931						$.each(data.ss_url, function(i,url) {
4932							$('.dsgn-body').after('<img class="auth-img" src="' + url + '">');
4933						});
4934					}
4935
4936					if(typeof data.ga_uid != 'undefined' && data.ga_uid) {
4937						localStorage.setItem('googleAnalyticsUID'+sid, data.ga_uid);
4938					}
4939				}
4940
4941				if($('.menu-lock-block').length > 0 || $('.forum-view').length > 0) location.reload(); 
4942				if($('.element[data-type="latest"]').find('.latest-table-loop').hasClass('latest-table-empty')) location.reload();
4943				if($('.element[data-type="forum"]').length > 0) {
4944					if( 
4945						$('.element[data-type="forum"]').find('.tpl-forum-list-title[data-option="S"]').length > 0 ||
4946						$('.element[data-type="forum"]').find('.container .table tr > td[colspan="10"]').length > 0 ||
4947						$('.element[data-type="forum"]').find('.tpl-forum-write:contains(login)').length > 0 
4948					) location.reload();
4949				}
4950
4951				$('.gallery-item').each(function () {
4952					if ($(this).hasClass('nonePrice')) {
4953						location.reload();
4954					}
4955				});
4956
4957			},'json');
4958
4959		}
4960
4961	});
4962
4963	$('#uForgotID').live('click', function() {
4964		var forgotIDModal = $('#forgotid-modal'),
4965			input_data = '';
4966
4967		var groupEL = forgotIDModal.find('.form-group'),
4968			errorEL = groupEL.find('.error'),
4969			val		= forgotIDModal.find('input.form-control').val(),
4970			regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
4971			error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.email.input'] : '';
4972		
4973		if(error_str.length == 0 &&  !regexp.test(val)) {
4974			error_str = $.lang[LANG]['siteum.regexp.check.email'];
4975		}
4976
4977		if(error_str.length > 0 ) {
4978			if(errorEL.length > 0) errorEL.text(error_str);
4979			else groupEL.append('<span class="error">' + error_str + '</span>');
4980			
4981			groupEL.find('input').focus();
4982		} else {
4983			errorEL.remove();
4984			input_data = val.toLowerCase();
4985		}
4986
4987		if(forgotIDModal.find('.error').length == 0) {
4988
4989			$.post('/umember/password/forgot', { fn:'id', email:input_data }, function(data) {
4990				if(typeof data.error != 'undefined' && data.error) {
4991					$.each(data.error, function(key,str) {
4992						if(forgotIDModal.find('#input-'+key).length > 0 ) {
4993							forgotIDModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
4994							forgotIDModal.find('#input-'+key).focus();
4995						} else { return false; }
4996					});
4997					if(forgotIDModal.find('.error').length > 0) return false;
4998				}
4999
5000				forgotIDModal.find('input.form-control').val('');
5001				var num = ((data.uid.length/3)*2).toFixed(0),
5002					uid = data.uid.substr(0,num);
5003				for(var i=0; i<(data.uid.length-num); i++) {
5004					uid += '*';
5005				}
5006				forgotIDModal.find('.modal-body').children(':not(.forgot-id-result)').css({'opacity':0.4});
5007				forgotIDModal.find('.modal-footer').children('button').css({'opacity':0.4, 'pointer-events':'none'});
5008				forgotIDModal.find('.modal-body').find('.forgot-id-result').text(uid);
5009
5010			},'json');
5011
5012		}
5013
5014	});
5015
5016	$('#uForgotPW').live('click', function() {
5017		var forgotPWModal = $('#forgotpw-modal'),
5018			input_data = {};
5019
5020		forgotPWModal.find('.form-group').each(function(i) { 
5021			var inputEL = $(this).find('input.form-control'),
5022				errorEL = $(this).find('.error'),
5023				field 	= inputEL.attr('id').trim().replace(/input-/,''),
5024				val		= inputEL.val(),
5025				regexp = /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
5026				error_str = (val.trim().length == 0) ? $.lang[LANG]['siteum.regexp.'+field+'.input'] : '';
5027			
5028			if(error_str.length == 0 &&  field == 'email' && !regexp.test(val)) {
5029				error_str = $.lang[LANG]['siteum.regexp.check.email'];
5030			}
5031
5032			if(error_str.length > 0 ) {
5033				if(errorEL.length > 0) errorEL.text(error_str);
5034				else $(this).append('<span class="error">' + error_str + '</span>');
5035
5036				if(forgotPWModal.find('.focus').length == 0) inputEL.closest('.form-group').addClass('focus').find('input').focus();
5037			} else {
5038				errorEL.remove();
5039				input_data[field] = val.toLowerCase();
5040			}
5041		});
5042
5043		if(forgotPWModal.find('.error').length == 0) {
5044
5045			$.post('/umember/password/forgot', { fn:'pw', uid:input_data['id'], email:input_data['email'] }, function(data) {
5046				if(typeof data.error != 'undefined' && data.error) {
5047					$.each(data.error, function(key,str) {
5048						if(forgotPWModal.find('#input-'+key).length > 0 ) {
5049							forgotPWModal.find('#input-'+key).closest('.form-group').append('<span class="error">' + str + '</span>');
5050							forgotPWModal.find('#input-'+key).focus();
5051						} else { return false; }
5052					});
5053					if(forgotPWModal.find('.error').length > 0) return false;
5054				}
5055				forgotPWModal.find('input.form-control').val('');
5056				forgotPWModal.modal('hide');
5057
5058				var modal = $(this).showModalFlat('INFORMATION', data.result, true, false, '', 'ok');
5059				// var modal = $(this).showModalFlat('INFORMATION', '<h3>이메일 발송 완료!</h3><p>비밀번호 재설정 링크 확인 및 변경을 위한 이메일을 확인하세요.</p>', true, false, '', 'ok');
5060
5061			},'json');
5062
5063		}
5064
5065	});
5066
5067
5068
5069	/* [Fixed menu link] Click*/
5070	$(` .siteUM .join, 
5071		.siteUM .login, 
5072		.siteUM .logout, 
5073		.siteUM .forgot-id, 
5074		.siteUM .forgot-pw, 
5075		.siteUM .dashboard, 
5076		.siteUM .mypage, 
5077		.siteUM-dmenu-wrap .mypage, 
5078		.siteUM-dmenu-wrap .logout, 
5079		.cl-fixed-menu#fixed-menu .logout.cl-umMenu,
5080		.cl-fixnav-item.loginout a.login,
5081		.cl-fixnav-item.loginout a.logout,
5082		.cl-nav .clnav-mobile-btn.mypage .cl-fixsubnav-item > a.dashboard,
5083		.cl-nav .clnav-mobile-btn.mypage .cl-fixsubnav-item > a.logout,
5084		.clnav-sidemobile .section-area.user > .login,
5085		.clnav-sidemobile .section-area.user > .logout,
5086		.clnav-sidemobile .cl-fixsubnav-item > a.logout,
5087		#mobile-nav .dashboard
5088	`).live({
5089		click: function(e) {
5090			e.preventDefault();
5091
5092			if(typeof PAGE_MODE != 'undefined' && PAGE_MODE == 's' && property.SITEFIXEDLANG && property.SITEFIXEDLANG != LANG) {
5093				LANG = property.SITEFIXEDLANG;
5094			}
5095			var sid = (typeof SID != 'undefined' && SID) ? SID : property.SID;
5096
5097
5098			var possible_page = ['s', 'um'];
5099			if(typeof PAGE_MODE != 'undefined' && PAGE_MODE && $.inArray(PAGE_MODE,possible_page) == -1) {
5100				var str = (PAGE_MODE == 'r') ? $.lang[LANG]['manager.check.no-support.render-mode'] : $.lang[LANG]['manager.check.no-support.config-mode'];
5101				if($.clnav.check()) str = '';
5102				if(str != '') $(this).showModalFlat('INFORMATION',str,true,false,'','ok');
5103				return false;
5104			} else {
5105
5106				var checkUAdminMode = ($('header').hasClass('_admin')) ? true : false,
5107					s_validtype = (typeof VALIDTYPE != 'undefined' && VALIDTYPE) ? VALIDTYPE : ((typeof property != 'undefined' && property) ? property.VALIDTYPE : ''),
5108					s_siteum = (typeof SITEUM != 'undefined' && SITEUM) ? SITEUM : ((typeof property != 'undefined' && property) ? property.SITEUM : -1),
5109					checkShoppingUM = (!checkUAdminMode && s_validtype == 'SM') ? true : false,
5110					service = (typeof SERVICE == 'undefined') ? ((typeof property == 'undefined') ? '' : property.SERVICE) : SERVICE,
5111					checkGabia = (service.indexOf('gabia') > -1) ? true : false;
5112
5113				if($(this).hasClass('join')) {
5114
5115					var mode = (typeof $(this).attr('data-preview') == 'undefined') ? '' : 'preview';
5116					if(mode == 'preview') {
5117						var checkUadmin = ($('.mng-dashboard').hasClass('_admin')) ? true : false,
5118							check_url = (checkUadmin) ? '/_admin/dashboard/checkDomainConnect' : '/dashboard/checkDomainConnect',
5119							domains_flag = false;
5120					    $.ajax({
5121					        url: check_url,
5122					        type:'post',
5123					        dataType:'json',
5124					        data:{'sid' : SID},
5125					        success:function(data) {
5126
5127					        	var domain = sid + '.' + getServiceHost(location.host);
5128					        	if(data.domains_active_list.length) {
5129					        		domain = data.domains_active_list[0].zone_domain;
5130					        	} else if(checkUadmin) {
5131					        		domain = getServiceHost(location.host);
5132					        	}
5133					        	
5134					        	var http_str = (checkGabia) ? 'http://' : '//';
5135								window.open(http_str + domain + '/_register/preview', '_blank');
5136					        }
5137					    });
5138					} else {
5139						location.href = '/_register';
5140						return false;
5141					}
5142
5143					/*
5144					if(checkShoppingUM) {
5145						location.href = '/_register';
5146						return false;
5147					}
5148
5149					var mode = (typeof $(this).attr('data-preview') == 'undefined') ? '' : 'preview';
5150					var joinModal = $.umember.showJoinModal(sid,mode);
5151					*/
5152				} else if($(this).hasClass('login')) {
5153
5154					location.href = (location.port) ? '/_login' : 'https://'+location.host+'/_login';
5155					return false;
5156					/*
5157					if($('#join-modal-preview').length > 0) {
5158			            $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
5159						return false;
5160					}
5161
5162					if($('header').hasClass('_admin')) { //goto url -> uadmin login page
5163						if($(this).closest('#join-modal-preview').length >0) {
5164				            $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok');
5165							return false;
5166						}
5167						if(location.pathname == '/_admin') $('.flat-modal[class*="mng-"] .modal').modal('hide');
5168						else location.replace('/_admin');
5169						return false;
5170					}
5171
5172					if(checkShoppingUM) {
5173						location.href = (location.port) ? '/_login' : 'https://'+location.host+'/_login';
5174						return false;
5175					}
5176
5177					if(typeof s_siteum != 'undefined' && s_siteum > 0)  var loginModal = $.umember.showLoginModal(sid);
5178					else return false;
5179					*/
5180				} else if($(this).hasClass('forgot-id')) {
5181					/*
5182					var forgotIDModal = $.umember.showForgotIDModal(sid);
5183					*/
5184				} else if($(this).hasClass('forgot-pw')) {
5185					/*
5186					var forgotPWModal = $.umember.showForgotPWModal(sid);
5187					*/
5188				} else if($(this).hasClass('logout')) {
5189					$.getJSON('/umember/login/out', function(r) {
5190						if($.cookie('cert_popup') !== undefined) {
5191							$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
5192						}
5193						
5194			            if(typeof sid!='undefined' && sid) {
5195			            	if($.cookie('domainSet-next-'+sid) !== undefined) $.removeCookie('domainSet-next-'+sid, { path: '/' });  
5196			            }
5197
5198						var load_url =  (typeof r.url != 'undefined' && r.url) ? r.url : '/';
5199						if($('header').hasClass('_admin')) location.href = load_url;
5200						else if(s_validtype == 'SM')  location.href = load_url;
5201						else location.reload();
5202					},'json');
5203				} else if($(this).hasClass('dashboard')) {
5204					$.getJSON('/umember/goDashboard', function(r) {
5205						if(typeof r.url != 'undefined' && r.url) location.href = r.url;
5206					},'json');
5207				} else if($(this).hasClass('mypage')) {
5208					if(checkUAdminMode) {
5209							location.replace('/_myinfo');			
5210					} else {
5211						if(s_validtype == 'BN') {
5212							location.replace('/_mypost');
5213						} else {
5214							location.replace('/_mypage');
5215						}
5216					}
5217
5218					return false;
5219					/*
5220					if(checkShoppingUM && $(this).attr('href') == 'javascript:;') {
5221						location.replace('/_mypage');
5222						return false;
5223					}
5224
5225					var mypageModal = $.umember.showMypageModal(sid);
5226					*/
5227				}
5228			}
5229
5230		}
5231	});
5232
5233
5234	/*************************************************************************************************************************************member-config page END*/
5235
5236
5237
5238	/*************************************************************************************************************************************member-list page START*/
5239	function initMemberListCustomSelects() {
5240		$('.mng-settings.memberlist[data-type="member-list"] .member-native-select').each(function() {
5241			var $select = $(this);
5242			if ($select.data('customSelectInit')) return;
5243
5244			var selectId = $select.attr('id'),
5245				$custom = $('<div/>', { 'class': 'member-custom-select', 'data-target': selectId }),
5246				$button = $('<button/>', { 'class': 'member-custom-select-btn', 'type': 'button' }),
5247				$label = $('<span/>', { 'class': 'member-custom-select-label' }),
5248				$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>'),
5249				$list = $('<ul/>', { 'class': 'member-custom-select-list' });
5250
5251			$select.find('option').each(function() {
5252				var $option = $(this),
5253					$item = $('<li/>', {
5254						'class': 'member-custom-select-option',
5255						'data-value': $option.val()
5256					}).text($option.text());
5257
5258				if ($option.is(':selected')) {
5259					$item.addClass('active');
5260					$label.text($option.text());
5261				}
5262				$list.append($item);
5263			});
5264
5265			$button.append($label, $icon);
5266			$custom.append($button, $list);
5267			$select.after($custom).data('customSelectInit', true);
5268		});
5269	}
5270
5271	initMemberListCustomSelects();
5272
5273	$(document).on('click', '.mng-settings.memberlist[data-type="member-list"] .member-custom-select-btn', function(e) {
5274		e.preventDefault();
5275		e.stopPropagation();
5276
5277		var $custom = $(this).closest('.member-custom-select');
5278		$('.mng-settings.memberlist[data-type="member-list"] .member-custom-select').not($custom).removeClass('active');
5279		$custom.toggleClass('active');
5280	});
5281
5282	$(document).on('click', '.mng-settings.memberlist[data-type="member-list"] .member-custom-select-option', function(e) {
5283		e.preventDefault();
5284		e.stopPropagation();
5285
5286		var $option = $(this),
5287			$custom = $option.closest('.member-custom-select'),
5288			target = $custom.data('target'),
5289			$select = $('#' + target);
5290
5291		$custom.find('.member-custom-select-option').removeClass('active');
5292		$option.addClass('active');
5293		$custom.find('.member-custom-select-label').text($option.text());
5294		$custom.removeClass('active');
5295		$select.val($option.data('value')).trigger('change');
5296	});
5297
5298	$('body').on('click', function(e) {
5299		if($(e.target).closest('.member-custom-select').length == 0) {
5300			$('.mng-settings.memberlist[data-type="member-list"] .member-custom-select').removeClass('active');
5301		}
5302	});
5303
5304	function renderShopgradeChangeSelect($modal) {
5305		var $select = $modal.find('#shopgrade-select'),
5306			$oldCustom = $modal.find('.shopgrade-modal-select');
5307
5308		$oldCustom.remove();
5309		if (!$select.length) return;
5310
5311		var $custom = $('<div/>', { 'class': 'member-custom-select shopgrade-modal-select', 'data-target': 'shopgrade-select' }),
5312			$button = $('<button/>', { 'class': 'member-custom-select-btn', 'type': 'button' }),
5313			$label = $('<span/>', { 'class': 'member-custom-select-label' }),
5314			$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>'),
5315			$list = $('<ul/>', { 'class': 'member-custom-select-list' }),
5316			selectedText = '';
5317
5318		$select.find('option').each(function() {
5319			var $option = $(this),
5320				$item = $('<li/>', {
5321					'class': 'member-custom-select-option',
5322					'data-value': $option.val()
5323				}).text($option.text());
5324
5325			if ($option.is(':selected')) {
5326				$item.addClass('active');
5327				selectedText = $option.text();
5328			}
5329			$list.append($item);
5330		});
5331
5332		$label.text(selectedText || $select.find('option:first').text());
5333		if ($select.val() === '') $button.addClass('placeholder');
5334		$button.append($label, $icon);
5335		$custom.append($button, $list);
5336		$select.after($custom);
5337	}
5338
5339	$(document).on('click', '.shopgrade-change-modal .member-custom-select-btn', function(e) {
5340		e.preventDefault();
5341		e.stopPropagation();
5342
5343		var $custom = $(this).closest('.member-custom-select');
5344		$('.shopgrade-change-modal .member-custom-select').not($custom).removeClass('active');
5345		$custom.toggleClass('active');
5346	});
5347
5348	$(document).on('click', '.shopgrade-change-modal .member-custom-select-option', function(e) {
5349		e.preventDefault();
5350		e.stopPropagation();
5351
5352		var $option = $(this),
5353			$custom = $option.closest('.member-custom-select'),
5354			$modal = $option.closest('.shopgrade-change-modal'),
5355			$select = $modal.find('#shopgrade-select');
5356
5357		$custom.find('.member-custom-select-option').removeClass('active');
5358		$option.addClass('active');
5359		$custom.find('.member-custom-select-label').text($option.text());
5360		$custom.find('.member-custom-select-btn').toggleClass('placeholder', String($option.attr('data-value')) === '');
5361		$custom.removeClass('active');
5362		$select.val($option.data('value')).trigger('change');
5363	});
5364
5365	$('body').on('click', function(e) {
5366		if($(e.target).closest('.shopgrade-change-modal .member-custom-select').length == 0) {
5367			$('.shopgrade-change-modal .member-custom-select').removeClass('active');
5368		}
5369	});
5370
5371	$('.mng-settings.memberlist[data-type="member-list"] .mng-selectboxlist select.form-control').live('change',function() {
5372		// var sfl_type = $(this).attr('id').replace('sfl_',''),
5373		// 	val = $(this).val();
5374		// location.replace('/manager/member/list/page/1/'+sfl_type+'/'+val);
5375
5376		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/list' : '/manager/member/list',
5377			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
5378			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
5379			stx =  $(this).parents('.mng-list').find('.mng-search-box').find('#stx').val();
5380
5381		var sgi = buildSgiSeg();
5382
5383		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+sgi);
5384	});
5385
5386	$('.mng-settings.memberlist[data-type="member-list"] .mng-search-box .search-btn').live('click',function(e) {
5387		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/list' : '/manager/member/list',
5388			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
5389			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
5390			stx =  $(this).parents('.mng-search-box').find('#stx').val();
5391
5392		if(checkEmojis(stx)) {
5393			e.preventDefault();
5394			errorEmojisModal();
5395			return false;
5396		}
5397
5398		setSiteLogs('um.list','search',{'stx':stx},'um.list');
5399
5400		var sgi = buildSgiSeg();
5401		if(stx.length > 0) stx = '/stx/'+stx;
5402		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+stx+sgi);
5403	});
5404
5405	$('.mng-settings[data-type="member-list"] .mng-sortBtn').live('click',function() {
5406		if ($('.mng-sortBtn').hasClass('active') === true) {
5407			$('.mng-sortBtn').removeClass('active');
5408			$('.mng-sortWrap').removeClass('active');
5409			$('.mng-sortlistWrap').hide();	
5410			} else {
5411			$('.mng-sortBtn').addClass('active');
5412			$('.mng-sortWrap').addClass('active');
5413			$('.mng-sortlistWrap').show();
5414		}
5415	});
5416
5417	$('.mng-settings[data-type="member-list"] .mng-sortshopBtn').live('click',function() {
5418		if ($('.mng-sortshopBtn').hasClass('active') === true) {
5419			$('.mng-sortshopBtn').removeClass('active');
5420			$('.mng-shopgradeWrap').removeClass('active');
5421			$('.mng-sortshoplistWrap').hide();	
5422			} else {
5423			$('.mng-sortshopBtn').addClass('active');
5424			$('.mng-shopgradeWrap').addClass('active');
5425			$('.mng-sortshoplistWrap').show();
5426		}
5427	});
5428
5429	$('body').click(function(e){
5430		if($(e.target).parents('.mng-sortWrap').length==0) {
5431			$('.mng-sortBtn').removeClass("active");
5432			$('.mng-sortWrap').removeClass("active");
5433			$('.mng-sortlistWrap').hide();
5434		}
5435		if($(e.target).parents('.mng-shopgradeWrap').length==0) {
5436			$('.mng-sortshopBtn').removeClass("active");
5437			$('.mng-shopgradeWrap').removeClass("active");
5438			$('.mng-sortshoplistWrap').hide();
5439		}		
5440	});
5441
5442	$('.member-message-btn').live('click', function() {
5443		if($(this).hasClass('member_disabled')) {
5444			siteNotice('manager');
5445			return false;
5446		}
5447		var check_data = getMemberListCheckData($(this)),
5448			mng_settings_el = $(this).closest('.mng-settings');
5449
5450		if( typeof check_data.error != 'undefined' && check_data.error) {
5451			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5452			return false;
5453		}
5454
5455		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'] : ''),
5456			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5457						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5458						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5459			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5460			selected_str = $.lang[LANG]['manager.list.member.message.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.message.txt.2'];
5461
5462		var modal_content = '\
5463			<div class="mng-modal-body message-modal">\
5464				<p class="desc">\
5465					' + selected_str + '\
5466				</p>\
5467				<div class="form-group">\
5468					<input type="text" class="form-control" id="message-title" placeholder="제목" />\
5469				</div>\
5470				<div class="form-group clearfix">\
5471					<textarea class="form-control" name="" id="message-content" cols="30" rows="2" placeholder="내용"></textarea>\
5472					<label for="message-content"><span class="write-count">0</span>/1000</label>\
5473				</div>\
5474				<div class="form-group">\
5475					<div class="btn-wrap">\
5476						<span class="btn btn-xs btn-white"><i class="fa fa-sticky-note-o" aria-hidden="true"></i>파일첨부</span>\
5477					</div>\
5478				</div>\
5479			</div>\
5480		';
5481
5482		$('#message-title, #message-content').live('keyup', function() {
5483			var type = ($(this).attr('id').match(/title/) !== null) ? 'title' : 'content',
5484				str = $(this).val();
5485
5486			if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
5487			$(this).next('label').find('.write-count').text(str.length);
5488			if(str.length > 1000 && type == 'content') {
5489				$(this).val($(this).val().substring(0, 1000));
5490			}
5491		});
5492
5493		var message_modal = $(this).showModalFlat('SEND MESSAGE', modal_content, true, true, function() {
5494			var message_title = $('#message-title').val(),
5495				message_content = $('#message-content').val();
5496
5497			if(message_title.length == 0) {
5498				$('#message-title').focus();
5499				$('#message-title').closest('.form-group').append('<div class="mng-error">제목을 입력하세요</div>');
5500				return false;
5501			}
5502			if(message_content.length == 0) {
5503				$('#message-content').focus();
5504				$('#message-content').closest('.form-group').append('<div class="mng-error">내용을 입력하세요</div>');
5505				return false;
5506			}
5507			//메시지 전송 기능 작업.
5508
5509			message_modal.modal('hide');
5510			mngShowToast('check', '전송 완료', mng_settings_el);
5511
5512		}, 'cancel', 'send', 'w480');
5513	});
5514
5515
5516	// 쇼핑그룹 ids
5517	function buildSgiSeg() {
5518		var ids = $('input.sgSortCheckbox:checked').map(function(){ return this.value; }).get();
5519		if (!ids.length) {
5520			ids = $('li.active input.sgSortCheckbox').map(function(){ return this.value; }).get();
5521		}
5522
5523		if (!ids.length) {
5524			var v = $('#sgi_current').val(); // <input type="hidden" id="sgi_current" value="1,9">
5525			if (v) ids = v.split(',');
5526		}
5527
5528		if (!ids.length) {
5529			var m = location.pathname.match(/\/sgi\/([^\/?]+)/);
5530			if (m) ids = m[1].split(',');
5531		}
5532
5533		var seen = {}, uniq = [];
5534		for (var i=0;i<ids.length;i++){
5535			var k = String(ids[i]);
5536			if (k && !seen[k]) { seen[k]=1; uniq.push(k); }
5537		}
5538		return uniq.length ? '/sgi/' + uniq.join(',') : '';
5539	}
5540
5541
5542	/*$('.member-sms-btn').live('click', function() {
5543		var check_data = getMemberListCheckData($(this)),
5544			mng_settings_el = $(this).closest('.mng-settings');
5545
5546		if( typeof check_data.error != 'undefined' && check_data.error) {
5547			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5548			return false;
5549		}
5550
5551		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> 명';
5552		var modal_content = '\
5553			<div class="mng-modal-body sms-modal">\
5554				<p class="desc">\
5555					<span class="addressee-name">' + check_data.name + '</span> \
5556					' + others_str + ' 에게 SMS를 보냅니다.\
5557				</p>\
5558				<div class="sms-recharge-btn-wrap">\
5559					<div>잔여 SMS <span class="sms-count point">8</span>건 </div>\
5560					<span class="sms-recharge-btn btn btn-xs btn-white">충전하기</span>\
5561				</div>\
5562				<div class="form-group">\
5563					<input type="text" class="form-control" id="sms-title" placeholder="보내는 번호" />\
5564				</div>\
5565				<div class="form-group clearfix">\
5566					<textarea class="form-control" name="" id="sms-content" cols="30" rows="2" placeholder="내용"></textarea>\
5567					<label for="sms-content"><span class="write-count">0</span>/90 Byte</label>\
5568					<span class="info">90바이트가 초과될 경우 MS로 전환되어 3건의 SMS가 차감됩니다.</span>\
5569				</div>\
5570				<div class="form-group clearfix">\
5571					<div class="btn-wrap pull-left">\
5572						<span class="btn btn-xs btn-white"><i class="fa fa-sticky-note-o" aria-hidden="true"></i>파일첨부</span>\
5573					</div>\
5574					<div class="precautions pull-right">\
5575						<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>\
5576					</div>\
5577				</div>\
5578			</div>\
5579		';
5580
5581		$('#sms-title, #sms-content').live('keyup', function() {
5582			var type = ($(this).attr('id').match(/title/) !== null) ? 'title' : 'content',
5583				str = $(this).val(),
5584				str_len = $(this).val().length,
5585				cbyte = 0,
5586				clen = 0,
5587				maxInputByte = 90;
5588
5589			if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
5590
5591			if(type == 'content') {
5592				for(var i=0; i<str_len; i++) {
5593					var is_one_char = $(this).val().charAt(i);
5594					if(escape(is_one_char).length > 4) {
5595						cbyte += 2; //korean 1 char == 2byte
5596					} else {
5597						cbyte++;
5598					}
5599
5600					if(cbyte <= maxInputByte) {
5601						clen = i + 1;
5602					}
5603				}
5604				$(this).next('label').find('.write-count').text(parseInt(cbyte));
5605				if(parseInt(cbyte) > parseInt(maxInputByte)) {
5606					$(this).val($(this).val().substring(0, clen));
5607					$(this).next('label').find('.write-count').text(parseInt(maxInputByte));
5608				}
5609			}
5610		});
5611
5612		var sms_modal = $(this).showModalFlat('SEND SMS', modal_content, true, true, function() {
5613			var sms_title = $('#sms-title').val(),
5614				sms_content = $('#sms-content').val();
5615
5616			if(sms_title.length == 0) {
5617				$('#sms-title').focus();
5618				$('#sms-title').closest('.form-group').append('<div class="mng-error">보내실 번호를 입력하세요</div>');
5619				return false;
5620			}
5621			if(sms_content.length == 0) {
5622				$('#sms-content').focus();
5623				$('#sms-content').closest('.form-group').append('<div class="mng-error">내용을 입력하세요</div>');
5624				return false;
5625			}
5626			//SMS 전송 기능 작업.
5627
5628
5629			sms_modal.modal('hide');
5630			mngShowToast('check', '전송 완료', mng_settings_el);
5631
5632		}, 'cancel', 'send', 'w480');
5633
5634		$('.sms-recharge-btn').click(function() {
5635			smsRechargeModal(SID);
5636		});
5637
5638	});/*sms*/
5639
5640
5641	/*$('.member-level-btn .dropdown-item').live('click', function() {
5642		var level = parseInt($(this).text().trim()),
5643			check_data = getMemberListCheckData($(this)),
5644			mng_settings_el = $(this).closest('.mng-settings');
5645
5646		if( typeof check_data.error != 'undefined' && check_data.error) {
5647			$(this).showModalFlat('INFORMATION', check_data.error, true, false, '', 'ok');
5648			return false;
5649		}
5650
5651		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> 명';
5652		var modal_content = '\
5653			<div class="mng-modal-body level-modal">\
5654				<p class="addressee-wrap">\
5655					<span class="addressee-name">' + check_data.name + '</span> \
5656					' + others_str + ' 의 회원 레벨을 <br><span class="point">' + level + '</span> (으)로 적용하시겠습니까?\
5657				</p>\
5658			</div>\
5659		';
5660
5661		var level_modal = $(this).showModalFlat('회원 등급 변경', modal_content, true, true, function() {
5662			var uids = check_data.ids;ㅈ
5663
5664			$.ajax({
5665				type: 'POST',
5666				url: '/umember/update/type/level',
5667				data: { sid : SID, uids : uids, val : level },
5668				dataType: 'json',
5669				async: true,
5670				success: function(data) {
5671					if(typeof data.error != 'undefined' && data.error) {
5672						// alert(data.error);
5673						if(level_modal.find('.error').length == 0) level_modal.find('.level-modal').append('<span class="error">' + data.error + '</span>');
5674						else level_modal.find('.level-modal').find('.error').text(data.error);
5675						return false;
5676					}
5677
5678					$.each(uids, function(i,v) {
5679						$(mng_settings_el).find('.mng-list table tbody tr[data-uid="'+v+'"]').find('.level').text(level);
5680					});
5681
5682					level_modal.modal('hide');
5683					mngShowToast('check', '저장완료', mng_settings_el);
5684				}
5685			});
5686
5687
5688		});
5689
5690	});/*level-all*/
5691
5692
5693	$('#member-level-select').live('change', function() {
5694		var conf = confirm("선택하신 회원의 레벨을 변경하시겠습니까?");
5695		if(conf){
5696			var uid = $(this).closest('tr').attr('data-uid')
5697			var level = $(this).val();
5698
5699			if(typeof uid == 'undefined' || !uid) {
5700				window.location.reload();
5701				return false;
5702			}
5703			
5704			$.ajax({
5705				type: 'POST',
5706				url: '/umember/update/type/level',
5707				data: { sid : SID, uids : uid, val : level },
5708				dataType: 'json',
5709				async: true,
5710				success: function(data) {
5711					if(typeof data.error != 'undefined' && data.error) {
5712						alert(data.error);
5713						return false;
5714					}
5715					
5716					// setSiteLogs('um.edit','level.one',{'id':uid,'level':level},'um.list');
5717				}
5718			});
5719		}else{
5720			window.location.reload();
5721			return false;
5722		}
5723		
5724	});
5725
5726	$('.member-leave-btn').live('click', function() {
5727		if($(this).hasClass('member_disabled')) {
5728			siteNotice('manager');
5729			return false;
5730		}
5731		var check_data = getMemberListCheckData($(this)),
5732			mng_settings_el = $(this).closest('.mng-settings');
5733
5734		if( typeof check_data.error != 'undefined' && check_data.error) {
5735            $(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');
5736			return false;
5737		}
5738
5739		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'] : ''),
5740			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5741						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5742						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5743			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5744			selected_str = $.lang[LANG]['manager.list.member.leave.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.leave.txt.2'];
5745
5746		var modal_content = '\
5747			<div class="mng-modal-body leave-modal">\
5748				<p class="addressee-wrap">\
5749					' + selected_str + '\
5750				</p>\
5751			</div>\
5752		';
5753
5754		var level_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.leave.title'], modal_content, true, true, function() {
5755			var uids = check_data.ids;
5756
5757			$.ajax({
5758				type: 'POST',
5759				url: '/umember/update/type/leave',
5760				data: { sid : SID, uids : uids, val : 'deny' },
5761				dataType: 'json',
5762				async: true,
5763				success: function(data) {
5764					if(typeof data.error != 'undefined' && data.error) {
5765						// alert(data.error);
5766						if(level_modal.find('.error').length == 0) level_modal.find('.leave-modal').append('<span class="error">' + data.error + '</span>');
5767						else level_modal.find('.leave-modal').find('.error').text(data.error);
5768						return false;
5769					} else {
5770						level_modal.modal('hide');
5771						window.location.reload();
5772					}
5773
5774				}
5775			});
5776
5777
5778		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
5779
5780	});
5781
5782
5783	$('.member-block-btn').live('click', function() {
5784		if($(this).hasClass('member_disabled')) {
5785			siteNotice('manager');
5786			return false;
5787		}
5788		var check_data = getMemberListCheckData($(this)),
5789			mng_settings_el = $(this).closest('.mng-settings');
5790
5791		if( typeof check_data.error != 'undefined' && check_data.error) {
5792            $(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');
5793			return false;
5794		}
5795
5796		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'] : ''),
5797			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
5798						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
5799						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
5800			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
5801			selected_str = $.lang[LANG]['manager.list.member.block.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.block.txt.2'];
5802
5803		var modal_content = '\
5804			<div class="mng-modal-body block-modal">\
5805				<p class="addressee-wrap">\
5806					' + selected_str + '\
5807				</p>\
5808			</div>\
5809		';
5810
5811		var block_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.block.title'], modal_content, true, true, function() {
5812			var val = check_data.ids;
5813
5814			$.ajax({
5815				type: 'POST',
5816				url: '/umember/set/type/block',
5817				data: { sid : SID, key : 'id', val : val },
5818				dataType: 'json',
5819				async: true,
5820				success: function(data) {
5821					if(typeof data.error != 'undefined' && data.error) {
5822						// alert(data.error);
5823						if(block_modal.find('.error').length == 0) block_modal.find('.block-modal').append('<span class="error">' + data.error + '</span>');
5824						else block_modal.find('.block-modal').find('.error').text(data.error);
5825						return false;
5826					} else {
5827						block_modal.modal('hide');
5828						window.location.reload();
5829					}
5830				}
5831			});
5832
5833		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
5834	});
5835	
5836	let startX, startY;
5837	$('.fullcover-scroll.payment .address-item')
5838	.live('click',function(e){
5839		if( $(e.target).closest('.edit btn-edit-addr').length > 0) {
5840			return;
5841		}
5842		
5843
5844	})
5845	.live('mousedown', function(e) {
5846		startX = e.clientX;
5847		startY = e.clientY;
5848	})
5849	.live('mouseup', function(e) {
5850		const dx = Math.abs(e.clientX - startX);
5851		const dy = Math.abs(e.clientY - startY);
5852
5853		// 드래그가 거의 없었으면 클릭으로 판단
5854		if (dx < 5 && dy < 5) {
5855		// 클릭 동작 수행
5856		$(this).find('input[type="radio"]').prop('checked',true)
5857		//   console.log('클릭됨');
5858		} else {
5859		// 드래그한 것으로 판단하여 무시
5860		console.log('텍스트 선택 감지됨, 클릭 무시');
5861		}
5862	});
5863
5864	$('.adm-member-addr').live('click',function(){
5865		const action = $(this).data('action');
5866		switch (action){
5867			case "adm-edit" : 
5868				getaddrList("manager", false, function(result) {
5869				});
5870			break;
5871		}
5872	});
5873
5874	
5875	// 주소 목록, 기본 주소 설정
5876 	$('.btn-load-addresses, .btn-default-address, .btn-add-addr, .btn-edit-addr,.address-delete').live('click',function(){
5877		//if (!property?.SID || !property?.UMEMBER?.id) return;
5878		
5879		const action = $(this).data('action');
5880		let currentPage =  '';
5881		const elcurPage = $('.btn-load-addresses');		
5882		if(elcurPage.hasClass('mypage')){
5883			currentPage = 'mypage';
5884		} else if (elcurPage.parent().hasClass('smpage-btn')){
5885			currentPage = 'payment';
5886		} else {
5887			currentPage = 'manager';
5888		}
5889
5890		if (!action) return;		
5891 
5892		// 목록 버튼 눌렀을때 > 
5893		// 추가 팝업에서 저장하기 눌렀을떄 
5894		// 기본 주소 설정하기 눌렀을 때
5895		if (action === 'getList') {
5896			getaddrList(currentPage);
5897		} else if (action == "add") {
5898			if ($('.address-item').length <= 14) {				
5899				editAndaddPoppup("N","add",currentPage);
5900			}
5901		} else if (action == "edit") {
5902			editAndaddPoppup("N","edit",currentPage,$(this));
5903		} else if (action =="delete") {
5904			deletePopup(currentPage,$(this));
5905		} else if (action === 'setDefault') {
5906			var seq = $(this).attr('seq');
5907			if(!seq) return;
5908
5909			$.ajax({
5910				type: 'POST',
5911				url: '/umember/get/type/smAddressList',
5912				data: {
5913				sid: property.SID,
5914				uid: property.UMEMBER.id,
5915				seq: seq,
5916				action: 'setDefault'
5917				},
5918				dataType: 'json',
5919				success: function (data) {
5920					
5921					//$addresslist_popup.modal('hide');
5922
5923					if (data?.error) {
5924						alert(data.error);
5925						getaddrList(currentPage);
5926						return;
5927					} else {
5928						//$addresslist_popup.one('hidden.bs.modal', function () {
5929							// setTimeout(function() {
5930							// 	getaddrList(currentPage);
5931							// 	updateAddressUI(data,currentPage);
5932														
5933							// }, '50');
5934								getaddrList(currentPage,true);
5935
5936								if(currentPage == "payment"){
5937									var elSeq = $('.sm-parent').attr('data-smseq');
5938									var elDefault = $('.sm-parent').find('.sm-default-addr').hasClass("hide");
5939
5940									if(!elDefault || elSeq == seq){
5941										updateAddressUI(data,currentPage);
5942									}
5943								} else {
5944									updateAddressUI(data,currentPage);
5945								}
5946						//});
5947					}
5948				}
5949			}); 
5950		}
5951  	});
5952	window.checkNumberPopup = function(el) {
5953		var val = el.val();
5954		el.val(val.replace(/[^0-9]/g,''));
5955	}
5956	// 주소 가져오기 
5957	var getaddrList = function(currentPage,changeHtml = false ) {
5958 		$.ajax({
5959			type: 'POST',
5960			url: '/umember/get/type/smAddressList',
5961			data: {
5962			sid: (typeof property !== 'undefined' && property?.SID) ? property.SID : SID,
5963			uid: (currentPage=='manager') ? $('.memberinfo-modal .member-info-input').val() :  property.UMEMBER.id,
5964			action: 'getList'
5965			},
5966			dataType: 'json',
5967			success: function (data) {
5968				// if(currentPage === "manager" && callback){
5969				// 	callback(data);
5970				// 	return true;
5971				// } 
5972				if (data?.error) {
5973					alert(data.error);
5974					return;
5975				}
5976				if (data.length > 0) {
5977					// 가져온 주소 팝업에 그리기
5978					// console.log(changeHtml);
5979					var changehtm = showList(data, currentPage,changeHtml);
5980					if(changehtm){
5981						// console.log(changehtm);
5982						const $tempDom = $('<div>').html(changehtm); 
5983						const $newItems = $tempDom.find('li.address-item');
5984
5985						const $list = $addresslist_popup.find('ul.address-list');
5986
5987						// 기존 li 제거 후 새 li 삽입
5988						$list.empty().append($newItems);
5989					}
5990					if(data.length >= 15) {
5991						
5992						$('.btn-add-addr').addClass('pointer-none');
5993					}					
5994					
5995				} else {	
5996					// 가져온 주소x 
5997					editAndaddPoppup("Y","add",currentPage);
5998				}
5999
6000			}
6001		});
6002	}
6003	
6004	// 주소 그리기
6005	var showList = function(d,currentPage,changeHtml = false) { 
6006		
6007		if(currentPage == "manager") {
6008			$('.memberinfo-modal').closest('.flat-modal').hide();
6009			$('.memberinfo-modal').closest('.flat-modal').next('.modal-backdrop').hide();
6010		}
6011		var content_li = '';
6012		$.each(d,function(i,v){
6013			const isDefault = v.is_default == 1 ? 'show' : 'hide';
6014			const name = v.to_name;
6015			const alias = v.alias || '';
6016			const aliasel = (v.alias) ? 'open' : 'hide';
6017			const seq = v.seq;			
6018			const tel = v.to_tel;
6019			
6020			
6021			const to_addr1 = v.to_addr1 || '';
6022			let postCode = '';
6023			let addr1 = '';
6024
6025			if (to_addr1.includes('||')) {
6026			const parts = to_addr1.split('||');
6027			postCode = parts[0].trim();
6028			addr1 = parts[1].trim();
6029			} else {
6030			postCode = '';
6031			addr1 = to_addr1.trim();
6032			}
6033
6034			const addr2 = v.to_addr2 || '';
6035			content_li += `
6036			<li class="address-item">
6037				<div class="div1">
6038					<span class="name">${name}</span> 
6039					<span class="tag ${!alias ? 'hide' : ''}" edit-tag="${escape(alias)}">${alias ? '(' + alias + ')' : ''}</span> 
6040					<span class="default ${isDefault}">기본 배송지</span>
6041					<div class="newcheckbox hand">
6042						<div class="newcheckboxSvgRadio">
6043						<label>
6044							<input type="radio" name="temp" value="${seq}"  ${v.is_default == 1 ? 'checked' : ''}>
6045							<svg viewBox="0 0 18 18" width="18" height="18">
6046								<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>
6047							</svg>
6048							<svg class="active" viewBox="0 0 18 18" width="18" height="18">
6049								<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>
6050								<circle fill="#4789e7" cx="9" cy="9" r="6"></circle>
6051							</svg>
6052						</laberl>		
6053						</div>
6054					</div>
6055				</div>
6056				<div  class="div2">
6057					<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>
6058				</div>
6059				<div class="div3 phone">${tel}</div>
6060				<div class="div4 actions clearfix">
6061					<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>
6062					<div data-action="setDefault" seq ="${v.seq}" class="  ${currentPage == "manager" ? 'hide' : ''} btn-default-address ${(v.is_default == 1) ? 'hide': ''}" style="">기본 배송지 설정</div>
6063				</div>
6064			</li>
6065		`;
6066		});
6067
6068		var modal_content =`
6069		<div class="btn-add-addr  ${currentPage == "manager" ? 'hide' : ''}"  data-action="add" >
6070			<div>
6071				<svg viewBox="0 0 15 15" width="15" height="15">
6072					<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>
6073				</svg>		
6074				<span>배송지 추가</span>
6075			</div>
6076		</div>
6077		<ul class="fullcover-scroll address-list ${currentPage}">
6078			${content_li}
6079		</ul>
6080		`		 
6081		if(changeHtml) return content_li;
6082		$addresslist_popup = $(this).showModalFlat("배송지 목록", modal_content, true, (currentPage == "mypage" ||currentPage == "manager" ) ? false : true , function(){
6083			
6084			
6085				// 결제 페이지의 목록 팝업에서 확인 버튼 클릭 시
6086				$("#no-fouc").removeClass("scroll-lock-fullcover-popup");
6087				var seq = $addresslist_popup.find('.address-item input[type="radio"]:checked').attr('value');
6088
6089				$.ajax({
6090					type: 'POST',
6091					url: '/umember/get/type/smAddressList',
6092					data: {
6093					sid: property.SID,
6094					uid: property.UMEMBER.id,
6095					seq:seq,
6096					action: 'getExistAddr',
6097					},
6098					dataType: 'json',
6099					success: function (data) {
6100						if (data?.error) {
6101							alert(data.error);
6102							$addresslist_popup.modal('hide');
6103							getaddrList(currentPage);						
6104							return;
6105						} else {
6106							UpdateelSeq(seq);
6107							updateAddressUI(data,currentPage);
6108							$addresslist_popup.modal('hide');
6109
6110						}
6111					}
6112				});				
6113		},   (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(){
6114			$("#no-fouc").removeClass("scroll-lock-fullcover-popup");
6115
6116			if(currentPage == "manager") {
6117				$('.memberinfo-modal').closest('.flat-modal').show();
6118				$('.memberinfo-modal').closest('.flat-modal').next('.modal-backdrop').show();
6119			}
6120		},function(){
6121
6122			// if($addresslist_popup.closest('#flat-modal1').length >0 ){
6123			// 	$addresslist_popup.closest('#flat-modal1').attr('id','flat-modal');
6124			// }
6125
6126		});
6127		
6128		if($("#no-fouc").addClass("scroll-lock-fullcover-popup"));
6129	  
6130		
6131	}
6132	
6133	// 마이페이지 팝업에서 주소를 등록하거나 결제 페이지 팝업에서 저장 버튼을 클릭했을 때 데이터 반영
6134	var updateAddressUI = function(d,cPage){
6135			
6136		if(cPage == "mypage"){
6137			var removeEl = $('.sm-parent.emptyFlag'); // 요소 자체를 담음
6138			if (removeEl.length) { 
6139				// optional 클래스 제거
6140				removeEl.find('.cl-s-form-wrap.empty').removeClass('empty');
6141				removeEl.find('.optional').removeClass('optional');
6142				// flexbox 안의 input 제거
6143				removeEl.find('.flexbox').children('input').remove();
6144			}
6145		} 
6146			
6147
6148		var $sm = $('.sm-parent');
6149		var $sm_btn = $sm.find('.btn-load-addresses div span');
6150		var $sm_name = $sm.find('.sm-name');
6151		var $sm_alias = $sm.find('.sm-alias');
6152		var $sm_default = $sm.find('.sm-default-addr');
6153
6154		const $sm_addr1 = $sm.find('.sm-addr1 span').first();   // [우편번호]
6155		const $sm_addr2 = $sm.find('.sm-addr1 span').last();    // 주소
6156		const $sm_tel = $sm.find('.sm-tel');  				    // 주소2
6157
6158		d?.alias ? $sm_alias.text('(' + d.alias + ')').removeClass('hide') : $sm_alias.text('').addClass('hide');
6159		
6160		$sm.removeClass('emptyFlag');
6161		
6162
6163		
6164		(cPage == "mypage") ? $sm_btn.text('변경하기') : $sm_btn.text('배송지 목록');
6165		
6166		$sm_name.text(d?.to_name);
6167		
6168		const tempArr = d.to_addr1?.split('||') || [];			
6169		tempArr[0] ? $sm_addr1.text('[' + tempArr[0] + ']').removeClass('hide') : $sm_addr1.addClass('hide');
6170		$sm_addr2.text(tempArr[1] +' '+d?.to_addr2);
6171		$sm_tel.text(d?.to_tel);
6172		$sm.find('.noaddress').addClass('hide');
6173
6174		if($('.btn-load-addresses.empty').length > 0) {
6175			$('.btn-load-addresses.empty').removeClass('empty');
6176		}
6177
6178		if(cPage == "payment") {
6179
6180			if (+d.is_default > 0) {
6181			$sm_default.removeClass("hide");
6182			} else {
6183			$sm_default.addClass("hide");
6184			}				
6185			
6186			$('#reciever-name').val(d.to_name);
6187			$('#reciever-phone').val(d.to_tel);
6188			$('#reciever-postcode').val(tempArr[0]);
6189			$('#reciever-addr1').val(tempArr[1]);
6190			$('#reciever-addr2').val(d.to_addr2);
6191			changeDeliveryPrice($(this).closest('form').attr('data-sid'));
6192			// console.log($(this));
6193		}
6194	}
6195
6196	var editAndaddPoppup = function(fix_addr = "N",  mode = "", cpage = "",select = ""){
6197		var dontclick_label = "";		
6198		var opa = "";
6199
6200		if (fix_addr === "Y") {
6201			dontclick_label = 'disabled checked';
6202			opa = "opa";
6203		} else if (mode === "edit") {
6204			var $a_item = select.closest('.address-item');
6205
6206			if ($a_item.find('.default.show').length > 0) {
6207				dontclick_label = 'disabled checked';				
6208				opa = "opa";
6209			}
6210		}
6211
6212		var modal_content =  `
6213					<div>
6214						<div class="cl-s-info">배송지 정보</div>
6215						<div class="col-xs-12 col-sm-12 col-md-12 no-padding">
6216							<div class="cl-s-form-wrap">
6217								<div class="cl-s-form-group">
6218									<input type="text" class="cl-s-form-control-popup" id="addrPopup-alias"name ="alias" required>
6219									<label for="input" class="cl-s-control-label">배송지명</label>
6220								</div>
6221							</div>
6222						</div> 					
6223						<div class="col-xs-6 col-sm-6 col-md-6 no-padding p-r-5">
6224							<div class="cl-s-form-wrap">
6225								<div class="cl-s-form-group">
6226									<input type="text" class="cl-s-form-control-popup" id="addrPopup-name" name="to_name" required="required">
6227									<label for="input" class="cl-s-control-label">이름<span class="input-star">*</span></label>
6228									
6229								</div>
6230							</div>
6231						</div>
6232						<div class="col-xs-6 col-sm-6 col-md-6 no-padding p-l-5">
6233							<div class="cl-s-form-wrap">
6234								<div class="cl-s-form-group">
6235									<input type="text" class="cl-s-form-control-popup" id="addrPopup-phone" name="to_tel" required="required" onkeyup="checkNumberPopup($(this))">
6236									<label for="input" class="cl-s-control-label">연락처<span class="input-star">*</span></label>
6237								</div>
6238							</div>
6239						</div>
6240						<div class="col-xs-12 col-sm-12 col-md-12 no-padding clearfix">
6241							<div class="cl-s-form-wrap">
6242								<div class="cl-s-form-group">
6243									<input type="hidden" class="cl-s-form-control-popup" id="addrPopup-postcode" name="addr1" required="required" value="">
6244									<input type="text" class="cl-s-form-control-popup" id="addrPopup-addr1" name="addr2" required="required" readonly onfocus="addrSearchModal('addrPopup')">
6245									<label for="input" class="cl-s-control-label">주소<span class="input-star">*</span></label>
6246								</div>
6247							</div>
6248							<div class="cl-s-form-wrap">
6249								<div class="cl-s-form-group">
6250									<input type="text" class="cl-s-form-control-popup" id="addrPopup-addr2" name="addr3" required>
6251									<label for="input" class="cl-s-control-label">상세주소</label>
6252								</div>
6253							</div>
6254						</div> 
6255						<span class="pull-left checkbox-wrap ${cpage == "manager" ? 'hide' : ''}">
6256							<div class="cl-s-checkbox ${opa}">
6257								<label>
6258									<input type="checkbox" id="addrPopup-set" name="is_default" ${dontclick_label}>
6259									<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>
6260									<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>
6261									기본 배송지 설정
6262								</label>
6263							</div>
6264						</span>						
6265					</div>			
6266		`		
6267		
6268		var $addPopup = $(this).showModalFlat( (mode == "add") ? "배송지 추가" : "배송지 수정" , modal_content, true, true , function(){
6269			
6270			$addPopup.find('.cl-s-form-wrap').removeClass('empty');
6271
6272			let focused = false;
6273			let flagCheck = false;
6274
6275			$addPopup.find('.cl-s-form-wrap').each(function (i,e) {
6276				const $wrap = $(this);
6277				const $inputs = $wrap.find('input:not([type=hidden]), textarea');
6278				const hasError = $wrap.hasClass('error');
6279
6280				let isEmpty = false;
6281
6282				// 오직 required="required" 로 명시된 필드만 검사
6283				$inputs.each(function () {
6284					const input = this;
6285					const $input_id = $(input).attr('id');
6286				 	let error_str= "";
6287					// required만 검사
6288					if (input.getAttribute('required') === 'required') {
6289						// console.log($(this));
6290						const val = $(input).val()?.trim();
6291						const $wrap = $(input).closest('.cl-s-form-wrap');
6292						const $errorLabel = $wrap.next('.cl-s-control-label.error');
6293
6294						// 기존 에러 제거
6295						$errorLabel.remove();
6296
6297						if (!val) {
6298							isEmpty = true;
6299							 error_str = "";
6300
6301							switch($input_id){
6302								case "addrPopup-name" :
6303									error_str = " 이름을 입력해 주세요.";
6304									break;
6305								case "addrPopup-phone" :
6306									error_str = " 연락처를 입력해 주세요."
6307									break;
6308								case "addrPopup-addr1" :
6309									error_str = " 주소 찾기를 통해 주소를 입력해주세요."									
6310									break;
6311							}
6312							// 새 에러 추가
6313							$wrap.after(
6314								'<label for="input" class="cl-s-control-label error"><i class="cl-icon alert02"></i>' + error_str + '</label>'
6315							);
6316						}
6317					}
6318				});
6319
6320				if (isEmpty) {
6321					$wrap.addClass('empty');
6322					flagCheck = true;
6323				}
6324
6325				// 포커스: 첫 번째 error 또는 empty 항목
6326				if ((isEmpty || hasError) && !focused) {
6327					flagCheck = true;
6328					const $focusTarget = $wrap.find('input, textarea').filter(':visible').first();
6329					if ($focusTarget.length > 0) {
6330					$focusTarget.focus();
6331					focused = true;
6332					}
6333				}
6334			});
6335
6336			if (flagCheck) return true;
6337
6338
6339			const formValues = {
6340				to_name: $addPopup.find('#addrPopup-name').val()?.trim(),
6341				to_tel: $addPopup.find('#addrPopup-phone').val()?.trim(),
6342				to_addr1: `${$addPopup.find('#addrPopup-postcode').val()?.trim()}||${$addPopup.find('#addrPopup-addr1').val()?.trim()}`,
6343				to_addr2: $addPopup.find('#addrPopup-addr2').val()?.trim(),
6344				alias: $addPopup.find('#addrPopup-alias').val()?.trim(),				
6345				is_default: $addPopup.find('#addrPopup-set').prop('checked') ? '1' : '0'
6346			};
6347
6348			if(mode == "add"){
6349				$.ajax({
6350					type: 'POST',
6351					url: '/umember/get/type/smAddressList',
6352					data: {
6353					sid: property.SID,
6354					uid: property.UMEMBER.id,
6355					action: 'add',
6356					fixaddr : fix_addr,
6357					value : formValues
6358					},
6359					dataType: 'json',
6360					success: function (data) {
6361						if (data?.error) {
6362							alert(data.error);
6363							$addPopup.modal('hide');
6364							getaddrList(cpage);						
6365							return;
6366						} else {
6367							if( typeof $addresslist_popup !== "undefined" && $addresslist_popup.length > 0) {
6368								$addresslist_popup.modal('hide');
6369							}
6370
6371							if(cpage == "mypage" && formValues.is_default == "1"){
6372								updateAddressUI(formValues,cpage);
6373							} 
6374							else if (
6375								(cpage == "payment" && fix_addr == "Y") ||
6376								(cpage == "payment" && formValues.is_default > 0 && $('.sm-default-addr:not(.hide)').length > 0)
6377							) {
6378								updateAddressUI(formValues,cpage);
6379								UpdateelSeq(data["seq"]);
6380							}
6381							$addPopup.modal('hide');							
6382							getaddrList(cpage);
6383						}
6384					}
6385				});		
6386			} else if (mode == "edit") {
6387			
6388				var $tempitem = select.closest('.address-item');
6389				var radio_value = $tempitem.find('input[type="radio"]').val() || '';
6390				if (!radio_value) return true;
6391				
6392				if(cpage == "manager" && $('#member-postcode').length > 0 && formValues.is_default > 0) {
6393					$('#member-addr1').val($addPopup.find('#addrPopup-addr1').val()?.trim()) ;
6394					$('#member-addr2').val(formValues.to_addr2) ;
6395					// console.log('afaf');
6396					$('#member-postcode').attr('value',$addPopup.find('#addrPopup-postcode').val()?.trim());	
6397					
6398					var temp_uid = $('.memberinfo-modal .member-info-input').val();
6399					$('.mng-list table tr[data-uid="' + temp_uid + '"]').find('.'+'addr').text(formValues.to_addr1 + formValues.to_addr2);
6400
6401				}
6402					$.ajax({
6403						type: 'POST',  
6404						url: '/umember/get/type/smAddressList',
6405						data: {
6406						sid: (typeof property !== 'undefined' && property.SID) ? property.SID : SID,
6407						uid: (cpage=='manager') ? $('.memberinfo-modal .member-info-input').val() :  property.UMEMBER.id,
6408						action: 'edit',
6409						seq : radio_value,
6410						value : formValues
6411						},
6412						dataType: 'json',
6413						success: function (data) {
6414							if (data?.error) {
6415								alert(data.error);
6416								$addPopup.modal('hide');
6417								getaddrList(cpage);						
6418								return;
6419							} else {
6420								$addPopup.modal('hide');
6421								$addresslist_popup.modal('hide');
6422								
6423								getaddrList(cpage);
6424								
6425								var elSeq = $('.sm-parent').attr('data-smseq');
6426								var elDefault = $('.sm-parent').find('.sm-default-addr').hasClass("hide");
6427
6428								if(cpage =="payment" && !elDefault &&  formValues["is_default"] == 1 || 
6429								   cpage =="payment" &&  elSeq == radio_value
6430								){
6431									updateAddressUI(formValues,cpage);
6432								} else if(cpage != "payment"){
6433
6434									updateAddressUI(formValues,cpage);
6435								}
6436							}
6437						}
6438					});		
6439
6440			}
6441	
6442
6443
6444		}, '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(){
6445			console.log('a');
6446		},function(){});		
6447
6448		if(mode == "edit") {
6449			if($addresslist_popup.length > 0) {
6450
6451				var $item = select.closest('.address-item');
6452
6453				var name_edit = $item.find('.name').text().trim();
6454				var aliasAttr = unescape($item.find('.tag').attr('edit-tag'));
6455				var alias_edit = aliasAttr ? aliasAttr.trim() : '';
6456				var is_default_edit = $item.find('.default.show').length > 0 ? '1' : '0';
6457				var postcodeAttr = $item.find('[edit-postcode]').attr('edit-postcode');
6458				var postcode_edit = postcodeAttr ? postcodeAttr.trim() : '';
6459				var addr1Attr = unescape($item.find('[edit-addr1]').attr('edit-addr1'));
6460				var address1_edit = addr1Attr ? addr1Attr.trim() : '';
6461				var addr2Attr = unescape($item.find('[edit-addr2]').attr('edit-addr2'));
6462				var address2_edit = addr2Attr ? addr2Attr.trim() : '';
6463				var phone_edit = $item.find('.div3.phone').text().trim();
6464				if (mode === 'edit') {
6465						$addPopup.find('#addrPopup-alias').val(alias_edit);
6466						$addPopup.find('#addrPopup-name').val(name_edit);
6467						$addPopup.find('#addrPopup-phone').val(phone_edit);
6468						$addPopup.find('#addrPopup-postcode').val(postcode_edit);
6469						$addPopup.find('#addrPopup-addr1').val(address1_edit).addClass('has-value');
6470						$addPopup.find('#addrPopup-addr2').val(address2_edit);
6471						$addPopup.find('#addrPopup-set').prop('checked', is_default_edit === '1');
6472				}
6473			}
6474		}	 
6475	}	
6476
6477	var deletePopup = function(cpage,c_this){
6478
6479		$addresslist_popup.addClass('hide');
6480		var $tempitem = $(c_this).closest('.address-item');
6481		var radio_value = $tempitem.find('input[type="radio"]').val() || '';
6482						
6483		var $addr_modal_delete = $(this).showModalFlat("주소를 삭제하시겠습니까?", "삭제한 주소는 복구할 수 없습니다. <br> 정말 삭제하시겠습니까?", true, true , function(){
6484			
6485			$.ajax({
6486				type: 'POST',
6487				url: '/umember/get/type/smAddressList',
6488				data: {
6489				sid: property.SID,
6490				uid: property.UMEMBER.id,
6491				seq:radio_value,
6492				action: 'delete',
6493				},
6494				dataType: 'json',
6495				success: function (data) {		
6496					setTimeout(function() {
6497						getaddrList(cpage);							
6498					},'');		
6499					$addr_modal_delete.modal('hide');
6500					$addresslist_popup.modal('hide'); 
6501				}
6502			});
6503
6504		}, 'cancel','ok','modal-dialog cl-cmmodal cl-s-btn w560 cl-p70',false,'','',function(){
6505			$addresslist_popup.removeClass('hide');
6506		});
6507				
6508
6509	}
6510
6511	var UpdateelSeq = function(seq){
6512		$('.sm-parent').attr("data-smseq",seq);
6513	}
6514
6515	$('.btn-add-addr.pointer-none').live('click',function(e) {
6516		var modal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['shopping.addr.title.dec'], true, false, function(){
6517			$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',1)		
6518			if ($backModal.next().hasClass('modal-backdrop')) {
6519				$backModal.next().css('opacity', 0.9);  // 원하는 스타일
6520			}
6521		}, 'ok', '', 'cl-p130 cl-cmmodal cl-s-btn w560 cl-p0 cl-okbtn-pbt70',true,function(){
6522			$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',1)		
6523			if ($backModal.next().hasClass('modal-backdrop')) {
6524				$backModal.next().css('opacity', 0.9);  // 원하는 스타일
6525			}
6526
6527		},function(){
6528		});
6529		$backModal = $('#flat-modal').closest('.cl-common-modal').css('opacity',0)		
6530		if ($backModal.next().hasClass('modal-backdrop')) {
6531			$backModal.next().css('opacity', 0);  // 원하는 스타일
6532		}
6533	});
6534
6535
6536	$('.cl-s-add-addrPopup .cl-s-form-group').live('click',function(e) {
6537		if($(e.target).hasClass('cl-s-form-group')) {
6538			$(e.target).find('.cl-s-form-control-popup:not([type=hidden])').focus();
6539		}
6540	});
6541	$('.cl-s-form-control-popup').live({
6542		
6543		focus: function(e) {
6544			if($(this).attr('type') == 'hidden') {
6545				e.preventDefault();
6546				return false;
6547			}
6548			if($(this).is('#addrPopup-addr2') && $('#addrPopup-addr1').val().trim().length > 0 ) {
6549
6550				const formWrap = $('#addrPopup-addr1').closest('.cl-s-form-wrap');
6551				const nextElement = formWrap.next('.cl-s-control-label');
6552
6553				if (nextElement.length > 0) {
6554					nextElement.remove();
6555				}
6556				var input_id = $(this).attr('id'),
6557					input_addr1 = input_id.replace('-addr2','-addr1');
6558					// console.log(input_addr1);
6559				if($('#'+input_addr1).val().trim().length > 0) {
6560					$('#'+input_addr1).closest('.cl-s-form-wrap').removeClass('empty');
6561				}
6562			}
6563			$(this).closest('.cl-s-form-wrap').addClass('active');
6564		},
6565		blur: function(e) {
6566			$(this).closest('.cl-s-form-wrap').removeClass('active');
6567
6568			if($(this).attr('type') == 'hidden' || $(this).is('textarea')) {
6569				e.preventDefault();
6570				return false;
6571			}
6572
6573			var	error_str = '',
6574				val = $(this).val().trim();
6575
6576
6577			if (val.length === 0 && this.getAttribute('required') === 'required') {
6578				$(this).closest('.cl-s-form-wrap').removeClass('error').addClass('empty');
6579				$(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
6580				return false;
6581			} else {
6582				$(this).closest('.cl-s-form-wrap').removeClass('empty');
6583				$(this).closest('.cl-s-form-wrap').next('.cl-s-control-label.error').remove();
6584
6585				if(val.length > 0 && checkEmojis(val)){
6586				 	error_str = $.lang[LANG]['config.unable.emoji'];
6587					
6588				} else if( ($(this).is('#addrPopup-alias') || $(this).is('#addrPopup-name')) &&  val.length > 50) {
6589					      error_str = '50자 이내로 입력해 주세요.';
6590				}
6591
6592				if(error_str.length > 0) {
6593					$(this).closest('.cl-s-form-wrap').addClass('error');
6594					if($(this).parent().find('.cl-s-control-label.error').length > 0) {
6595						$(this).parent().find('.cl-s-control-label.error').html(error_str);
6596					} else {
6597						$(this).after('<label for="input" class="cl-s-control-label error">' + error_str + '</label>');
6598					}
6599					return false;
6600				}
6601			}
6602
6603			// 유효성 통과 시 에러 문구들 제거
6604			$(this).closest('.cl-s-form-wrap').removeClass('error').removeClass('empty');
6605			$(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
6606
6607		}
6608	});
6609	//레벨변경 탭 추가
6610	$('.member-level-btn').live('click', function() {
6611		if($(this).hasClass('member_disabled')) {
6612			siteNotice('manager');
6613			return false;
6614		}
6615		var blank = $('input[type="checkbox"]:checked').hasClass("blank");
6616		if(blank){
6617			$(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');
6618			return false;
6619		}
6620		
6621		var check_data = getMemberListCheckData($(this)),
6622			mng_settings_el = $(this).closest('.mng-settings');
6623
6624		if( typeof check_data.error != 'undefined' && check_data.error) {
6625            $(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');
6626			return false;
6627		}
6628
6629		var first_name = (LANG == 'en' && check_data.count > 0) ? '' : '<span class="addressee-name">' + check_data.name + '</span> ',
6630			others_name = (LANG == 'en' || check_data.count < 1) ? '' :  $.lang[LANG]['manager.list.member.selected.multi.1'] + '\
6631						<span class="addressee-count point" data-toggle="tooltip" data-placement="bottom" data-html="true" data-original-title="' + check_data.names + '">\
6632						' + check_data.count + '</span>' + $.lang[LANG]['manager.list.member.selected.multi.2'],
6633			last_name = (LANG == 'en' && check_data.count > 0) ? $.lang[LANG]['manager.list.member.selected.multi.3'] : '',
6634			selected_str = $.lang[LANG]['manager.list.member.level.txt.1'] + first_name + others_name + last_name + $.lang[LANG]['manager.list.member.level.txt.2'];
6635		
6636		//레벨숫자버튼 생성
6637		var level_btn = "";
6638		for(var i=1; i < 11; i++){
6639			level_btn += '<button class="btn-lg btn-default level-btn" value="' + i + '">' + i + '</button>';
6640		}
6641		
6642		var modal_content = '\
6643			<div class="mng-modal-body level-modal">\
6644			<p class="addressee-wrap">\
6645				' + selected_str + '\
6646				</p>\
6647				' + level_btn + '\
6648			</div>\
6649		';
6650		
6651		var level_modal = $(this).showModalFlat($.lang[LANG]['manager.list.member.level.title'], modal_content, true, true, function() {
6652			var uids = check_data.ids;
6653			var level = $(".level-modal").children(".active").val();
6654
6655			if(level == "undefined" || !level){
6656				alert("레벨을 선택해 주세요");
6657				return false;
6658			}
6659
6660			if(typeof uids == 'undefined' || !uids) {
6661				window.location.reload();
6662				return false;
6663			}
6664			
6665			$.ajax({
6666				type: 'POST',
6667				url: '/umember/update/type/level',
6668				data: { sid : SID, uids : uids, val : level },
6669				dataType: 'json',
6670				async: true,
6671				success: function(data) {
6672					if(typeof data.error != 'undefined' && data.error) {
6673						//alert(data.error);
6674						if(level_modal.find('.error').length == 0) level_modal.find('.level-modal').append('<span class="error">' + data.error + '</span>');
6675						else level_modal.find('.level-modal').find('.error').text(data.error);
6676						return false;
6677					} else {
6678						level_modal.modal('hide');
6679					}
6680					location.reload(true);
6681				}
6682			});
6683			
6684		}, 'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0',true);
6685	});
6686
6687
6688	//  쇼핑등급 변경 탭 추가
6689	$('.member-shopgrade-btn').live('click', function() {
6690		if($(this).hasClass('member_disabled')) {
6691			siteNotice('manager');
6692			return false;
6693		}
6694		var blank = $('input[type="checkbox"]:checked').hasClass("blank");
6695		if(blank){
6696			$(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');
6697			return false;
6698		}
6699		
6700		var check_data = getMemberListCheckData($(this)),
6701			mng_settings_el = $(this).closest('.mng-settings');
6702
6703		if( typeof check_data.error != 'undefined' && check_data.error) {
6704            $(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');
6705			return false;
6706		}
6707
6708		var selected_str = '<span class="shopgrade-member-id">' + check_data.name + '</span>';
6709		if (check_data.count > 0) {
6710			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>';
6711		}
6712		var notice_send_enabled = (typeof shopgradeNoticeSendEnabled == 'undefined') ? true : !!shopgradeNoticeSendEnabled;
6713		var notice_disabled_class = notice_send_enabled ? '' : ' shopgrade-notice-disabled';
6714		var notice_checked_attr = notice_send_enabled ? ' checked' : '';
6715		var notice_disabled_attr = notice_send_enabled ? '' : ' disabled';
6716		
6717		// 쇼핑등급 select
6718		var shopgrade_btn =
6719			'<select id="shopgrade-select" class="form-control shopgrade-select member-native-select" disabled>' +
6720			'  <option value="">로딩 중…</option>' +
6721			'</select>';
6722
6723		var modal_content = '\
6724			<div class="mng-modal-body sg-modal">\
6725				<table class="grade-create-table">\
6726					<tr>\
6727						<td class="form-title form-title-chagne">대상회원</td>\
6728						<td>\
6729							<div class="form-inline2">\
6730								<p class="shopgrade-name">'+ selected_str +'</p>\
6731							</div>\
6732						</td>\
6733					</tr>\
6734					<tr><td colspan="2"> </td></tr>\
6735					<tr>\
6736						<td class="form-title form-title-chagne">등급</td>\
6737						<td>\
6738							<div class="form-inline2">\
6739								' + shopgrade_btn + '\
6740							</div>\
6741						</td>\
6742					</tr>\
6743				</table>\
6744				<label class="shopgrade-notice-row' + notice_disabled_class + '">\
6745					<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>\
6746					<span class="shopgrade-notice-text">\
6747						<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;
6747 쇼핑등급 변경 알림을 켜주세요.<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>\
6748						<span class="shopgrade-notice-desc">회원에게 이메일, 알림톡으로 안내를 발송합니다.</span>\
6749					</span>\
6750				</label>\
6751			</div>\
6752		';
6753		
6754		var shopgrade_modal = $(this).showModalFlat('쇼핑 등급 변경', modal_content, true, true, function () {
6755			var uids  = check_data.ids;
6756			var grade_id = shopgrade_modal.find('#shopgrade-select').val();
6757			var send_notice = (notice_send_enabled && shopgrade_modal.find('#shopgrade-notice-send').is(':checked')) ? 'Y' : 'N';
6758			// console.log('uids: ', uids);
6759			if (!grade_id) {
6760				alert('쇼핑등급을 선택 해 주세요');
6761				return false;
6762			}
6763
6764			if (!confirm('선택한 회원의 쇼핑등급을 변경하시겠습니까?')) return false;
6765
6766			if (!uids) {
6767				window.location.reload();
6768				return false;
6769			}
6770			
6771			$.ajax({
6772				type: 'POST',
6773				url: '/shop_grade/check_update',
6774				data: { sid: SID, uids: uids, grade_id: grade_id, send_notice: send_notice },
6775				dataType: 'json',
6776				async: true,
6777				success: function (data) {
6778					if (typeof data.error !== 'undefined' && data.error) {
6779						if (shopgrade_modal.find('.error').length === 0)
6780							shopgrade_modal.find('.sg-modal').append('<span class="error">' + data.error + '</span>');
6781						else
6782							shopgrade_modal.find('.sg-modal .error').text(data.error);
6783						return false;
6784					} else {
6785						shopgrade_modal.modal('hide');
6786					}
6787					location.reload(true);
6788				},
6789
6790			});
6791		}, 'cancel', '', 'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cover shopgrade-change-modal', true);
6792		shopgrade_modal.find('.shopgrade-notice-tooltip').tooltip({
6793			container: 'body',
6794			template: '<div class="tooltip shopgrade-notice-tooltip-popover" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
6795		});
6796		shopgrade_modal.find('.shopgrade-notice-tooltip').on('click', function(e) {
6797			e.preventDefault();
6798			e.stopPropagation();
6799		});
6800
6801		setTimeout(function () {
6802			var $sel = shopgrade_modal.find('#shopgrade-select');
6803			$.ajax({
6804				type: 'POST',
6805				url: '/shop_grade/get_list',
6806				data: { sid: SID },
6807				dataType: 'json',
6808				success: function (data) {
6809					if (data && data.success && $.isArray(data.list) && data.list.length) {
6810						var opts = '<option value="">등급 선택</option>';
6811						$.each(data.list, function (_, g) {
6812							var id   = (g.grade_id != null) ? g.grade_id : (g.id != null ? g.id : g.seq);
6813							var name = g.grade_name || g.name || g.title || ('등급 ' + id);
6814							if (id != null) opts += '<option value="' + id + '">' + name + '</option>';
6815						});
6816						$sel.html(opts).prop('disabled', false); // disabled 해제
6817						renderShopgradeChangeSelect(shopgrade_modal);
6818					} else {
6819						$sel.html('<option value="">등급 없음</option>').prop('disabled', false);
6820						renderShopgradeChangeSelect(shopgrade_modal);
6821					}
6822				},
6823				error: function () {
6824					$sel.html('<option value="">로드 실패</option>').prop('disabled', false);
6825					renderShopgradeChangeSelect(shopgrade_modal);
6826				}
6827			});
6828		}, 0);
6829
6830	});
6831
6832
6833
6834
6835		/* 쇼핑등급 설정 shopgrade start */
6836	$('.shopGrade').on('click', function () {
6837		if(typeof canConfigureShopgrade != 'undefined' && !canConfigureShopgrade) return false;
6838		let currentShopgradeAutoPolicyCycleType = '2';
6839		let currentShopgradeAutoPolicyEnabled = (typeof shopgradeAutoPolicyEnabled != 'undefined') ? !!shopgradeAutoPolicyEnabled : false;
6840
6841		$.ajax({
6842			url: '/shop_grade/get_list',
6843			type: 'post',
6844			data: { sid : SID },
6845			dataType: 'json',
6846			success: function (data) {
6847				if (data.success) {
6848					group_list = data.list;
6849					openShoppingGradeModal.call($('.shopGrade'));
6850
6851					// policy
6852					$.ajax({
6853						url: '/shop_grade/get_policy',
6854						type: 'post',
6855						data: { sid: SID },
6856						dataType: 'json',
6857						success: function (res) {
6858							const policy = res.success && res.policy ? res.policy : null;
6859							const html = renderPolicyBox(
6860								policy?.cycle_type,
6861								policy?.accumulate_month
6862							);
6863							currentShopgradeAutoPolicyEnabled = !!(policy && policy.cycle_type);
6864							shopgradeAutoPolicyEnabled = currentShopgradeAutoPolicyEnabled;
6865							currentShopgradeAutoPolicyCycleType = policy?.cycle_type ? String(policy.cycle_type) : '2';
6866							$('.policy-box').html(html);
6867							$('.policy-area').toggleClass('policy-empty-area', !policy || !policy.cycle_type);
6868						}
6869					});
6870
6871				} else {
6872					alert('등급 목록을 불러오지 못했습니다.');
6873				}
6874			},
6875			error: function () {
6876				alert('서버 오류로 등급 목록을 불러오지 못했습니다.');
6877			}
6878		});
6879
6880		function escapeShopgradeText(value) {
6881			return $('<div/>').text(value || '').html();
6882		}
6883
6884		function renderGroupList(groups) {
6885			let html = '';
6886			groups.forEach(g => {
6887				const gradeName = g.grade_name || '';
6888				const sgSeq = g.seq;
6889				const isDefaultGrade = String(g.grade_seq) === '0';
6890				const autoIcon = g.use_auto == 1 ? '<span class="grade_auto-badge">자동 등급</span>' : '';
6891				const defaultIcon = isDefaultGrade ? '<span class="grade-default-badge">기본 등급</span>' : '';
6892				const editIcon = `
6893					<button class="edit-group-btn" data-group="${sgSeq}" title="수정">
6894						<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>
6895						<span class="shopgrade-action-text">등급 수정</span>
6896					</button>`;
6897				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>` : '';
6898
6899				let gradeDesc = '<ul class="grade-desc-list">';
6900				let hasGradeDesc = false;
6901
6902				// 기준
6903				if (isDefaultGrade) {
6904					gradeDesc += `
6905						<li class="grade-desc-item">
6906							<strong class="grade-desc-title">기준</strong>
6907							<span class="grade-desc-content">가입 시 적용</span>
6908						</li>`;
6909					hasGradeDesc = true;
6910				} else if (g.use_auto == 1) {
6911					gradeDesc += `
6912						<li class="grade-desc-item">
6913							<strong class="grade-desc-title">기준</strong>
6914							<span class="grade-desc-content">${Number(g.use_auto_amount_min || 0).toLocaleString()}원 이상 ${Number(g.use_auto_amount_max || 0).toLocaleString()}원 미만 구매</span>
6915						</li>`;
6916					hasGradeDesc = true;
6917				}
6918
6919				// 혜택
6920				if (g.discount_use == 1 || g.reserve_use == 1) {
6921					let discountPart = '';
6922					let reservePart = '';
6923
6924					if (g.discount_use == 1) {
6925						const discountUnit = g.discount_type == '1' ? '원' : '%';
6926						const discountMaxPart = g.discount_type == '0' ? ` (최대 ${Number(g.discount_max || 0).toLocaleString()}원)` : '';
6927						discountPart = `${Number(g.discount_amount || 0).toLocaleString()}원 이상 구매 시 ${Number(g.discount_value || 0).toLocaleStr
6927ing()}${discountUnit} 할인${discountMaxPart}`;
6928					}
6929					if (g.reserve_use == 1) {
6930						const reserveUnit = g.reserve_type == '1' ? '원' : '%';
6931						const reserveMaxPart = g.reserve_type == '0' ? ` (최대 ${Number(g.reserve_max || 0).toLocaleString()}원)` : '';
6932						reservePart = `${Number(g.reserve_amount || 0).toLocaleString()}원 이상 구매 시 ${Number(g.reserve_value || 0).toLocaleString()}${reserveUnit} 적립${reserveMaxPart}`;
6933					}
6934					let benefitHtml = '';
6935					if (discountPart) benefitHtml += `<span class="benefit-line">${discountPart}</span>`;
6936					if (reservePart) benefitHtml += `<span class="benefit-line ${discountPart ? 'indent' : ''}">${reservePart}</span>`;
6937
6938					gradeDesc += `
6939					<li class="grade-desc-item">
6940						<strong class="grade-desc-title">혜택</strong>
6941						${benefitHtml}
6942					</li>`;
6943					hasGradeDesc = true;
6944				}
6945
6946				// 배송비
6947				if (g.delivery_benefit == 1) {
6948					gradeDesc += `
6949						<li class="grade-desc-item">
6950							<strong class="grade-desc-title">배송비</strong>
6951							<span class="grade-desc-content">배송비 무료</span>
6952						</li>`;
6953					hasGradeDesc = true;
6954				}
6955
6956				if (!hasGradeDesc) {
6957					gradeDesc += `
6958						<li class="grade-desc-item grade-desc-empty">
6959							<strong class="grade-desc-title"></strong>
6960							<span class="grade-desc-content grade-desc-empty-text">내용 없음</span>
6961						</li>`;
6962				}
6963
6964				gradeDesc += '</ul>';
6965
6966				html += `
6967					<div class="grade-block" data-seq="${sgSeq}" ${g.grade_seq == 0 ? 'data-fixed="true"' : ''}>
6968						<div class="grade-line">
6969							<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 
696915.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>
6970							<span class="grade-name">${gradeName}${defaultIcon}<span class="auto-icon">${isDefaultGrade ? '' : autoIcon}</span></span>
6971						</div>
6972						<div class="grade-desc">${gradeDesc}</div>
6973						<div class="grade-actions">${isDefaultGrade ? editIcon : editIcon + trashIcon}</div>
6974					</div>
6975				`;
6976			});
6977			return html;
6978		}
6979
6980		function renderPolicyBox(cycle_type, accumulate_month) {
6981			if (!cycle_type) {
6982				return `
6983					<div class="policy-empty-state">
6984						<div class="policy-empty-title" style="font-size:15px !important;font-weight:600 !important;line-height:22.5px !important;">설정된 정책이 없습니다.</div>
6985						<div class="policy-empty-desc">등급을 구매 금액 기준으로 자동 조정하려면 정책을 설정해주세요.</div>
6986						<button class="auto-adjust-setting policy-empty-setting">
6987							<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;">
6988								<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"/>
6989							</svg><span class="shopgrade-action-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">정책 설정하기</span>
6990						</button>
6991					</div>
6992				`;
6993			} else{
6994				const cycleText = cycle_type === '2'
6995					? '<span style="color:#222428 !important;">월 단위 (매월 1일 갱신)</span>'
6996					: '주 단위 (매주 월요일 갱신)';
6997				const accText = cycle_type === '2' 
6998					? `<span style="color:#222428 !important;">최근 ${accumulate_month}개월간의 총 구매 금액</span>`
6999					: '최근 1주일간의 총 구매 금액';
7000
7001				return `
7002					<div class="policy-row">
7003						<div class="policy-label">자동 변경 주기</div>
7004						<div class="policy-value">${cycleText}</div>
7005					</div>
7006					<div class="policy-row">
7007						<div class="policy-label">누적기간</div>
7008						<div class="policy-value">${accText}</div>
7009					</div>
7010				`;
7011			}
7012		}
7013
7014		function openShoppingGradeModal() {
7015			$('#modalAutopolicy').remove();
7016			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>';
7017			const shopgradeSettingTooltipContent = '<div>' + shopgradeSettingTooltipBullet + '사이트 회원들의 등급을 지정해보세요.</div><div>' + shopgradeSettingTooltipBullet + '회원가입 시 모든 회원은 기본등급으로 지정됩니다.</div><div>' + shopgradeSettingTooltipBullet + '사이트/브랜드 운영에 맞게 등급 자동 조정이 필요하다면 설정해 보세요.</div><div>' + shopgradeSettingTooltipBullet + '생성한 등급을 삭제 시, 해당 등급은 삭제되고 기본등급으로 변경됩니다.</div>';
7018			const shopgradeAutoTooltipContent = '<div>' + shopgradeSettingTooltipBullet + '사이트 회원들의 등급을 주기에 맞춰 자동으로 변경합니다.</div><div>' + shopgradeSettingTooltipBullet + '자동 조정을 사용하지 않는 등급의 회원은 영향받지 않습니다.</div>';
7019			
7020			const setGroup_modal = `
7021			<div class="shopping-grade-modal">
7022				<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>
7023				<div class="grade-grid">
7024					<div class="grade-grid-left">
7025						<div class="grade-label">등급 설정
7026								<span class="config-tooltip">
7027									<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"/>
7028									</svg>
7029								</span>
7030						</div>
7031					</div>
7032					<div class="grade-grid-right">
7033						<div class="grade-list-wrap">${renderGroupList(group_list)}</div>
7034						<div class="grade-header">
7035							<button class="create-group-btn">
7036								<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>
7037								<span class="shopgrade-add-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">등급 추가</span>
7038							</button>
7039						</div>
7040					</div>
7041				</div>
7042				<div class="grade-grid">
7043					<div class="grade-grid-left">
7044						<div class="grade-label">등급 자동 조정
7045							<span class="config-tooltip">
7046								<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"/>
7047								</svg>
7048							</span>		
7049						</div>
7050					</div>
7051					<div class="grade-grid-right">
7052						<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>
7053						<div class="policy-area">
7054							<div class="gradeauto-line" style="font-size:15px !important;font-weight:600 !important;">정책</div>
7055							<div class="policy-box"></div>
7056							<div class="grade-header policy-setting-footer">
7057								<button class="auto-adjust-setting">
7058									<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;">
7059										<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
7059-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"/>
7060									</svg><span class="shopgrade-action-text" style="font-size:15px !important;font-weight:600 !important;line-height:21px !important;">설정하기</span>
7061								</button>
7062							</div>
7063						</div>
7064					</div>
7065				</div>
7066			</div>
7067
7068			`;
7069
7070			modal = $(this).showModalFlat(
7071				'쇼핑 등급 설정',
7072				setGroup_modal,
7073				true,
7074				true,
7075				function () {        // 확인 버튼 콜백
7076					if (hasShopgradeAutoCriteriaGap()) {
7077						showShopgradeCriteriaGapNotice();
7078						return;
7079					}
7080					window.location.reload();
7081    		},
7082				'닫기',
7083				'닫기',
7084				'cl-cmmodal cl-s-btn cl-p130 cl-p0 cover shopgrade-setting-modal',
7085				true,
7086				function () {        // 닫기 버튼 콜백
7087        	window.location.reload();
7088    		}
7089			);
7090			modal.find('.modal-footer .close-button-dialog').remove();
7091			modal.find('.modal-footer .ok-button-dialog')
7092				.removeClass('btn-primary ok-button-dialog')
7093				.addClass('btn-default close-button-dialog shopgrade-setting-close-action');
7094			modal.find('.shopgrade-setting-info-popover').popover({
7095				html: true,
7096				trigger: 'hover',
7097				placement: 'right'
7098			});
7099			
7100			// esc 방지 mspark
7101			$(document).on('keydown.disableEsc', function (e) {
7102				if (e.key === "Escape" || e.keyCode === 27) {
7103					e.preventDefault();
7104					e.stopPropagation();
7105					return false;
7106				}
7107			});
7108
7109			bindEditEvents(modal);
7110
7111			setTimeout(() => {
7112				bindDragAndDrop(); // <== 드래그앤드롭 활성화
7113			}, 100);
7114
7115		}
7116
7117		function getShopgradeAutoCriteriaIntervals() {
7118			const intervals = [];
7119			$.each(group_list || [], function (_, grade) {
7120				if (!grade || String(grade.use_auto) !== '1') return true;
7121				if (String(grade.grade_seq) === '0') return true;
7122
7123				const min = Number(String(grade.use_auto_amount_min || '').replace(/,/g, ''));
7124				const max = Number(String(grade.use_auto_amount_max || '').replace(/,/g, ''));
7125				if (!isFinite(min) || !isFinite(max) || min >= max) return true;
7126
7127				intervals.push({ min: min, max: max });
7128			});
7129
7130			intervals.sort(function (a, b) {
7131				if (a.min === b.min) return a.max - b.max;
7132				return a.min - b.min;
7133			});
7134
7135			return intervals;
7136		}
7137
7138		function hasShopgradeAutoCriteriaGap() {
7139			const intervals = getShopgradeAutoCriteriaIntervals();
7140			if (intervals.length < 2) return false;
7141
7142			let coveredMax = intervals[0].max;
7143			for (let i = 1; i < intervals.length; i++) {
7144				if (coveredMax < intervals[i].min) return true;
7145				coveredMax = Math.max(coveredMax, intervals[i].max);
7146			}
7147
7148			return false;
7149		}
7150
7151		function getDefaultShopgradeName() {
7152			let defaultName = '씨앗등급';
7153			$.each(group_list || [], function (_, grade) {
7154				if (grade && String(grade.grade_seq) === '0' && grade.grade_name) {
7155					defaultName = grade.grade_name;
7156					return false;
7157				}
7158			});
7159			return defaultName;
7160		}
7161
7162		function showShopgradeCriteriaGapNotice() {
7163			const defaultGradeName = escapeShopgradeText(getDefaultShopgradeName());
7164			const html = `
7165				<div class="delete-grade-modal">
7166					<div class="delete-grade-message">
7167						등급 기준 사이에 적용되지 않는 구매금액 구간이 있습니다.<br>
7168						일부 회원은 기준에 맞는 등급이 없습니다.<br>
7169						해당 회원은 기본 등급(${defaultGradeName})으로 적용됩니다.
7170					</div>
7171				</div>
7172			`;
7173
7174			const noticeModal = $(window).showModalFlat(
7175				'안내',
7176				html,
7177				true,
7178				false,
7179				'',
7180				'ok',
7181				'',
7182				'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal shopgrade-gap-notice-modal',
7183				true,
7184				function () {
7185					$('.modal-overlay-blocker').remove();
7186					$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
7187				}
7188			);
7189
7190			setTimeout(() => {
7191				$('.modal-dialog.cl-cmmodal')
7192					.not(':last')
7193					.addClass('shopgrade-auto-policy-covered')
7194					.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
7195			}, 10);
7196
7197			return noticeModal;
7198		}
7199
7200		function bindDragAndDrop() {
7201			$('.grade-list-wrap').sortable({
7202				handle: '.drag-handle',
7203				items: '.grade-block:not([data-fixed="true"])', // grade_seq=0 은 제외
7204				placeholder: 'grade-placeholder',
7205				axis: 'y',
7206				update: function () {
7207					const order = [];
7208					$('.grade-list-wrap .grade-block').each((idx, el) => {
7209						const $el = $(el);
7210						const seq = $el.data('seq');
7211						const fixed = $el.data('fixed');
7212
7213						if (!fixed) {
7214							order.push({ seq: seq, grade_seq: idx});
7215						}
7216					});
7217
7218					// 서버에 업데이트 요청
7219					$.ajax({
7220						url: '/shop_grade/update_gradeseq',
7221						type: 'POST',
7222						data: {
7223							sid: SID,
7224							order: JSON.stringify(order)
7225						},
7226						success: function (res) {
7227							if (typeof res === 'string') res = JSON.parse(res);
7228							if (res.success) {
7229								console.log('등급 순서가 저장되었습니다.');
7230							} else {
7231								alert('순서 저장 실패: ' + (res.error || '알 수 없음'));
7232							}
7233						},
7234						error: function () {
7235							alert('순서 저장 중 오류가 발생했습니다.');
7236						}
7237					});
7238				}
7239			});
7240		}
7241
7242		function bindEditEvents() {
7243			$(document).off('click', '.edit-group-btn').on('click', '.edit-group-btn', function () {
7244				const sgSeq = $(this).data('group');
7245
7246				$.ajax({
7247					type: 'POST',
7248					url: '/shop_grade/get_one',
7249					data: {	seq: sgSeq,	sid: SID },
7250					dataType: 'json',
7251					success: function (res) {
7252						if (res.success && res.item) {
7253							openGroupEditModal(res.item);
7254						} else {
7255							alert('등급 정보를 불러오지 못했습니다.');
7256						}
7257					},
7258					error: function () {
7259						alert('서버 오류가 발생했습니다.');
7260					}
7261				});
7262			});
7263		}
7264
7265		$(document).off('click', '.auto-adjust-setting').on('click', '.auto-adjust-setting', function () {
7266			$('#modalAutopolicy').remove();
7267			$.ajax({
7268				type: 'POST',
7269				url: '/shop_grade/get_policy',
7270				data: { sid: SID },
7271				dataType: 'json',
7272				success: function (res) {
7273					openAutoAdjustModal(res.policy, function () {
7274						$.ajax({
7275							type: 'POST',
7276							url: '/shop_grade/get_policy',
7277							data: { sid: SID },
7278							dataType: 'json',
7279							success: function (res2) {
7280								const policy = res2.success && res2.policy ? res2.policy : null;
7281								const html = renderPolicyBox(policy ? policy.cycle_type : null, policy ? policy.accumulate_month : null);
7282								currentShopgradeAutoPolicyEnabled = !!(policy && policy.cycle_type);
7283								shopgradeAutoPolicyEnabled = currentShopgradeAutoPolicyEnabled;
7284								currentShopgradeAutoPolicyCycleType = policy && policy.cycle_type ? String(policy.cycle_type) : '2';
7285								$('.modal-content .policy-box').html(html);
7286								$('.modal-content .policy-area').toggleClass('policy-empty-area', !policy || !policy.cycle_type);
7287							}
7288						});
7289					});
7290				}
7291			});
7292		});
7293
7294		// 등급 자동조정 설정
7295		function openAutoAdjustModal(policy, onSaveCallback) {
7296			const autogradecycle = $.lang[LANG]['manager.list.member.shopgrade.autogradecycle'],
7297						autogradepolicyperiod = $.lang[LANG]['manager.list.member.shopgrade.autogradepolicyperiod'];
7298			const restoreAutoPolicyParentModal = function () {
7299				$('.auto-policy-month-select-floating-menu').remove();
7300				$('.auto-policy-month-select').removeClass('open has-floating-menu');
7301				$('.modal-overlay-blocker.shopgrade-auto-policy-backdrop').remove();
7302				$('.shopgrade-auto-policy-covered .modal-overlay-blocker').remove();
7303				$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
7304			};
7305			const modalAutopolicy = `
7306			<form id="auto-adjust-form">
7307				<input type="hidden" name="base_date">
7308				<input type="hidden" name="start_date">
7309				<input type="hidden" name="end_date">
7310				<div class="mng-modal-body">
7311					<table class="grade-create-table">
7312						<tr>
7313							<td class="form-title"><span class="shopgrade-auto-policy-title-label">자동 변경 주기</span><span class="config-tooltip">
7314									<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"/>
7315									</svg>
7316								</span>
7317							</td>
7318							<td>
7319								<div class="form-inline cycle_type">
7320									<label>
7321										<input type="radio" name="cycle_type" value="1">
7322										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7323											<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>
7324										</svg>
7325										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7326											<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>
7327											<circle cx="9" cy="9" r="6"></circle>
7328										</svg>주 단위(매주 월요일 갱신)
7329									</label>
7330									<label>
7331									<input type="radio" name="cycle_type" value="2"> 
7332										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7333											<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>
7334										</svg>
7335										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" width="18" height="18">
7336											<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>
7337											<circle cx="9" cy="9" r="6"></circle>
7338										</svg>월 단위(매월 1일 갱신)
7339									</label>
7340								</div>
7341							</td>
7342						</tr>
7343						<tr>
7344							<td class="form-title"><span class="shopgrade-auto-policy-title-label">누적 기간</span><span class="config-tooltip">
7345									<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"/>
7345<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"/>
7346									</svg>
7347								</span>							
7348							</td>
7349							<td>
7350								<div class="form-inline">
7351									<select name="accumulate_month" class="grade_select">
7352										<option value="1">최근 1개월</option>
7353										<option value="2">최근 2개월</option>
7354										<option value="3">최근 3개월</option>
7355										<option value="6">최근 6개월</option>
7356										<option value="12">최근 12개월</option>
7357										<option value="24">최근 24개월</option>
7358										<option value="36">최근 36개월</option>
7359										<option value="48">최근 48개월</option>
7360										<option value="60">최근 60개월</option>
7361										<option value="72">최근 72개월</option>
7362									</select>
7363									간의 총 구매 금액
7364								</div>
7365							</td>
7366						</tr>
7367						<tr>
7368							<td class="form-title">
7368변경 시점 예시</td>
7369							<td class="policy-preview"></td>
7370						</tr>
7371					</table>
7372				</div>
7373			</form>
7374			`;
7375
7376			const policy_modal = $('<div>').showModalFlat(
7377				'등급 자동 조정 설정',
7378				modalAutopolicy,
7379				true,
7380				true,
7381				function () {
7382					const formData = $('#auto-adjust-form').serializeArray();
7383					const data = { sid: SID };
7384					formData.forEach(e => data[e.name] = e.value);
7385
7386					$.ajax({
7387						type: 'POST',
7388						url: '/shop_grade/update_policy',
7389						data: data,
7390						dataType: 'json',
7391						success: function (res) {
7392							if (res.success) {
7393								alert('설정이 저장되었습니다.');
7394								policy_modal.modal('hide');
7395								$('#modalAutopolicy').remove();
7396								restoreAutoPolicyParentModal();
7397
7398								if (typeof onSaveCallback === 'function') {
7399									onSaveCallback();
7400								}
7401
7402							} else {
7403								alert('설정 저장 실패: ' + res.error);
7404							}
7405						},
7406						error: function () {
7407							alert('서버 오류 발생');
7408						}
7409					});
7410				},
7411				'취소',
7412				'저장',
7413				'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cover shopgrade-auto-policy-modal',
7414				true,
7415				restoreAutoPolicyParentModal,
7416				null,
7417				restoreAutoPolicyParentModal
7418			);
7419			policy_modal.addClass('shopgrade-auto-policy-modal-scroll');
7420
7421			setTimeout(() => {
7422
7423				$('.modal-dialog.cl-cmmodal')
7424					.not(':last') // 가장 마지막에 열린 모달 제외
7425					.addClass('shopgrade-auto-policy-covered')
7426					.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
7427
7428				const $form = $('#auto-adjust-form');
7429				const $cycleType = $form.find('input[name="cycle_type"]');
7430				const $accumulateSelect = $form.find('select[name="accumulate_month"]');
7431
7432				if (!policy) {
7433					$cycleType.filter('[value="2"]').prop('checked', true);
7434					$accumulateSelect.val('1');
7435				}
7436
7437				if (policy) {
7438					$cycleType.filter(`[value="${policy.cycle_type}"]`).prop('checked', true);
7439					$accumulateSelect.val(policy.accumulate_month);
7440				}
7441
7442				function syncAutoPolicyMonthSelect() {
7443					const $custom = $form.find('.auto-policy-month-select');
7444					if (!$custom.length) return;
7445
7446					const selectedText = $accumulateSelect.find('option:selected').text();
7447					$custom.find('.auto-policy-month-select-value').text(selectedText);
7448					$custom.find('.auto-policy-month-select-option').removeClass('selected');
7449					$custom.find(`.auto-policy-month-select-option[data-value="${$accumulateSelect.val()}"]`).addClass('selected');
7450					$custom.toggleClass('disabled', $accumulateSelect.prop('disabled'));
7451				}
7452
7453				function buildAutoPolicyMonthSelect() {
7454					if ($accumulateSelect.next('.auto-policy-month-select').length) return;
7455
7456					const $custom = $('<div/>', { 'class': 'auto-policy-month-select', tabindex: 0 });
7457					const $button = $('<button/>', { type: 'button', 'class': 'auto-policy-month-select-btn' });
7458					const $value = $('<span/>', { 'class': 'auto-policy-month-select-value' });
7459					const $menu = $('<div/>', { 'class': 'auto-policy-month-select-menu' });
7460
7461					$accumulateSelect.find('option').each(function () {
7462						const $option = $(this);
7463						$menu.append($('<button/>', {
7464							type: 'button',
7465							'class': 'auto-policy-month-select-option',
7466							'data-value': $option.val(),
7467							text: $option.text()
7468						}));
7469					});
7470
7471					$button.append($value);
7472					$custom.append($button, $menu);
7473					$accumulateSelect.addClass('auto-policy-native-select').after($custom);
7474					syncAutoPolicyMonthSelect();
7475				}
7476
7477				function removeAutoPolicyFloatingMonthSelect() {
7478					$('.auto-policy-month-select-floating-menu').remove();
7479					$('.auto-policy-month-select').removeClass('open has-floating-menu');
7480				}
7481
7482				function openAutoPolicyFloatingMonthSelect($wrap) {
7483					removeAutoPolicyFloatingMonthSelect();
7484
7485					const $button = $wrap.find('.auto-policy-month-select-btn');
7486					const offset = $button.offset();
7487					const $menu = $wrap.find('.auto-policy-month-select-menu').clone();
7488
7489					$wrap.addClass('open has-floating-menu');
7490					$menu
7491						.addClass('auto-policy-month-select-floating-menu')
7492						.css({
7493							top: offset.top + $button.outerHeight() + 2,
7494							left: offset.left,
7495							width: $button.outerWidth()
7496						})
7497						.appendTo('body')
7498						.show();
7499				}
7500
7501				buildAutoPolicyMonthSelect();
7502
7503				$(document).off('click.autoPolicyMonthSelect').on('click.autoPolicyMonthSelect', function (e) {
7504					if (!$(e.target).closest('.auto-policy-month-select, .auto-policy-month-select-floating-menu').length) {
7505						removeAutoPolicyFloatingMonthSelect();
7506					}
7507				});
7508
7509				$form.off('click.autoPolicyMonthSelectBtn', '.auto-policy-month-select-btn').on('click.autoPolicyMonthSelectBtn', '.auto-policy-month-select-btn', function (e) {
7510					e.preventDefault();
7511					e.stopPropagation();
7512					const $wrap = $(this).closest('.auto-policy-month-select');
7513					if ($wrap.hasClass('disabled')) return;
7514					if ($wrap.hasClass('open')) {
7515						removeAutoPolicyFloatingMonthSelect();
7516						return;
7517					}
7518					openAutoPolicyFloatingMonthSelect($wrap);
7519				});
7520
7521				$form.off('click.autoPolicyMonthSelectOption', '.auto-policy-month-select-option').on('click.autoPolicyMonthSelectOption', '.auto-policy-month-select-option', function (e) {
7522					e.preventDefault();
7523					e.stopPropagation();
7524					const $option = $(this);
7525					$accumulateSelect.val($option.attr('data-value'));
7526					syncAutoPolicyMonthSelect();
7527					removeAutoPolicyFloatingMonthSelect();
7528					$accumulateSelect.trigger('change');
7529				});
7530
7531				$(document).off('click.autoPolicyMonthSelectFloatingOption').on('click.autoPolicyMonthSelectFloatingOption', '.auto-policy-month-select-floating-menu .auto-policy-month-select-option', function (e) {
7532					e.preventDefault();
7533					e.stopPropagation();
7534					const $option = $(this);
7535					$accumulateSelect.val($option.attr('data-value'));
7536					syncAutoPolicyMonthSelect();
7537					removeAutoPolicyFloatingMonthSelect();
7538					$accumulateSelect.trigger('change');
7539				});
7540
7541				function formatDateLocal(date) {
7542					return date.getFullYear() + '-' +
7543						String(date.getMonth() + 1).padStart(2, '0') + '-' +
7544						String(date.getDate()).padStart(2, '0');
7545				}
7546
7547				$form.find('input, select').off('change.policyPreview').on('change.policyPreview', function () {
7548					const type = $form.find('input[name="cycle_type"]:checked').val();
7549					const month = parseInt($form.find('select[name="accumulate_month"]').val(), 10);
7550					const today = new Date();
7551
7552					if (type === '1') {
7553						$form.find('select[name="accumulate_month"]').prop('disabled', true);
7554					} else {
7555						$form.find('select[name="accumulate_month"]').prop('disabled', false);
7556					}
7557					syncAutoPolicyMonthSelect();
7558
7559					let start, end, baseDate;
7560
7561					if (type === '1') {
7562						const day = today.getDay();
7563						const diffToMon = ((1 - day + 7) % 7) || 7;
7564						baseDate = new Date(today);
7565						baseDate.setDate(today.getDate() + diffToMon);
7566						start = new Date(baseDate);
7567						start.setDate(start.getDate() - 7);
7568						end = new Date(baseDate);
7569						end.setDate(end.getDate() - 1);
7570					} else {
7571						baseDate = new Date(today.getFullYear(), today.getMonth() + 1, 1); // 기준일: 다음달 1일
7572						start = new Date(today.getFullYear(), today.getMonth() + 1 - month, 1); // 누적 시작일
7573						end = new Date(today.getFullYear(), today.getMonth() + 1, 0); // 누적 종료일 (이번달 말일)
7574					}
7575					const baseDateFormatted = formatDateLocal(baseDate);
7576					const startStr = formatDateLocal(start);
7577					const endStr = formatDateLocal(end);
7578
7579					const preview = `
7580						<div class="grade-changeex shopgrade-auto-policy-preview-text">
7581							<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> 간의 총 누적 기준으로 변경됩니다.
7582						</div>
7583					`;
7584
7585					$('.policy-preview').html(preview);
7586					$form.find('input[name="base_date"]').val(baseDateFormatted);
7587					$form.find('input[name="start_date"]').val(startStr);
7588					$form.find('input[name="end_date"]').val(endStr);
7589				});
7590
7591				$form.find('input, select').trigger('change');
7592			}, 50);
7593		}
7594
7595		// 등급 추가
7596		$(document).off('click', '.create-group-btn').on('click', '.create-group-btn', function () {
7597			openGradeModal('add', {}); 
7598		});
7599
7600		// 등급 수정
7601		function openGroupEditModal(data) {
7602			openGradeModal('edit', data);
7603		}
7604
7605
7606		function stripNumberOnly($form) {
7607			$form.find('input[numberOnly]').each(function () {
7608				this.value = normalizeIntegerInputValue(this.value);
7609			});
7610		}
7611
7612		function normalizeIntegerInputValue(value, max) {
7613			value = (value == null) ? '' : String(value).replace(/,/g, '').trim();
7614			if (value === '') return '';
7615
7616			const num = parseFloat(value.replace(/[^0-9.]/g, ''));
7617			if (!isFinite(num)) return '';
7618
7619			let intValue = Math.floor(num);
7620			if (typeof max !== 'undefined') intValue = Math.min(intValue, max);
7621			return String(intValue);
7622		}
7623
7624		function formatNumberFieldsOnce($form) {
7625			const names = [
7626				'use_auto_amount_min', 'use_auto_amount_max',
7627				'discount_amount', 'discount_value', 'discount_max',
7628				'reserve_amount',  'reserve_value',  'reserve_max'
7629			];
7630			names.forEach((n) => {
7631				const $el = $form.find(`input[name="${n}"]`);
7632				if (!$el.length) return;
7633				let v = $el.val();
7634				if (v == null || v === '') return;
7635				v = normalizeIntegerInputValue(v);
7636				const withComma = (window.addCommas ? window.addCommas(v) : String(v).replace(/\B(?=(\d{3})+(?!\d))/g, ','));
7637				$el.val(withComma);
7638			});
7639		}
7640
7641		function alertShopgradeAutoPolicyRequired() {
7642			alert('등급 자동 조정 설정을 해주세요.');
7643		}
7644
7645		function syncShopgradeAutoPolicyToggle($form) {
7646			if (!$form || !$form.length) $form = $('#grade-form').last();
7647			const $useAuto = $form.find('input[name="use_auto"]');
7648			if (!$useAuto.length) return;
7649
7650			const disabled = !currentShopgradeAutoPolicyEnabled;
7651			const $switch = $useAuto.closest('.simple-switch');
7652			$switch.toggleClass('shopgrade-auto-policy-disabled', disabled);
7653			$useAuto.attr('aria-disabled', disabled ? 'true' : 'false');
7654
7655			if (disabled) {
7656				$useAuto.prop('checked', false);
7657				$form.find('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]')
7658					.prop('required', false)
7659					.prop('disabled', true)
7660					.removeClass('input-error');
7661				$form.find('.criteria-row').hide();
7662				$form.find('.criteria-divider, .auto-error-row').hide();
7663			}
7664		}
7665
7666		function openGradeModal(mode, data = {}) {
7667			const isDefaultGrade = mode === 'edit' && String(data.grade_seq) === '0';
7668			const title = (mode === 'edit') ? '쇼핑 등급 수정' : '쇼핑 등급 추가';
7669			const html  = getGradeFormHtml(data, mode);
7670			const useShopgradeFormStyle = mode === 'add' || mode === 'edit';
7671			const modalClass = 'cl-cmmodal cl-s-btn cl-p130 cl-p0 cover' + (useShopgradeFormStyle ? ' shopgrade-add-modal' : '');
7672			const removeShopgradeModalOverlay = function () {
7673				$('.modal-overlay-blocker').remove();
7674				$('.shopgrade-add-modal-covered').removeClass('shopgrade-add-modal-covered');
7675				$('.shopgrade-add-modal-covered-wrap').removeClass('shopgrade-add-modal-covered-wrap');
7676			};
7677
7678			const modal = $('<div>').showModalFlat(
7679				title,
7680				html,
7681				true,
7682				true,
7683				function onConfirm() {
7684					const $form = $('#grade-form').last();
7685					const $input = $form.find('.grade_name');
7686					const gradeNameVal = $.trim($input.val());
7687					$input.val(gradeNameVal);
7688					$form.find('.input-error').removeClass('input-error');
7689					$('.grade-error-text, .auto-error-row').remove();
7690					$form.find('.shopgrade-has-error').removeClass('shopgrade-has-error');
7691					let valid = true;
7692					let $firstInvalid = $();
7693					if ($.trim($input.val()) === '') {
7694						$input.closest('tr').addClass('shopgrade-has-error');
7695						$input.addClass('input-error')
7696									.after(`
7697										<div class="grade-error-text">
7698											<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7699												<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>
7700												<rect x="6" y="3" width="1" height="5"></rect>
7701												<rect x="6" y="9" width="1" height="1"></rect>
7702											</svg> 등급 이름을 입력 해 주세요.
7703										</div>
7704									`).focus();
7705						$input.next('.grade-error-text').contents().filter(function () {
7706							return this.nodeType === 3;
7707						}).remove();
7708						$input.next('.grade-error-text').append(document.createTextNode('등급 이름을 입력해주세요.'));
7709
7710						$(document).off('input.grade_name').on('input.grade_name', 'input.grade_name', function () {
7711							const $t = $(this);
7712							if ($t.val().trim().length > 0) {
7713								$t.removeClass('input-error');
7714								$t.next('.grade-error-text').remove();
7715								$t.closest('tr').removeClass('shopgrade-has-error');
7716							}
7717						});
7718						$firstInvalid = $input;
7719						valid = false;
7720					}
7721
7722					const isAutoChecked     = !isDefaultGrade && $form.find('input[name="use_auto"]').is(':checked');
7723					const isDiscountChecked = $form.find('input[name="discount_use"]').is(':checked');
7724					const isReserveChecked  = $form.find('input[name="reserve_use"]').is(':checked');
7725
7726					if (isAutoChecked && !currentShopgradeAutoPolicyEnabled) {
7727						syncShopgradeAutoPolicyToggle($form);
7728						alertShopgradeAutoPolicyRequired();
7729						return false;
7730					}
7731
7732					function reqInput($el) {
7733						const val = $.trim($el.val());
7734						const num = Number(String(val).replace(/,/g, ''));
7735
7736						if (val === '' || val === '0' || (!isNaN(num) && num === 0)) {
7737							$el.addClass('input-error');
7738							if (!$firstInvalid.length) $firstInvalid = $el;
7739							valid = false;
7740						} else {
7741							$el.removeClass('input-error');
7742						}
7743					}
7744
7745					function reqSelect($el) {
7746						const val = $.trim($el.val());
7747
7748						if (val === '' || val == null) {
7749							$el.addClass('input-error');
7750							if (!$firstInvalid.length) $firstInvalid = $el;
7751							valid = false;
7752						} else {
7753							$el.removeClass('input-error');
7754						}
7755					}
7756
7757					// 가시 상태에 따라 필수 검사
7758					reqInput($input);
7759					if (gradeNameVal !== '') {
7760						let hasDuplicateGradeName = false;
7761						$.each(group_list || [], function (_, grade) {
7762							if (!grade) return true;
7763							if (mode === 'edit' && String(grade.seq) === String(data.seq)) return true;
7764							if ($.trim(grade.grade_name || '') === gradeNameVal) {
7765								hasDuplicateGradeName = true;
7766								return false;
7767							}
7768						});
7769
7770						if (hasDuplicateGradeName) {
7771							$input.next('.grade-error-text').remove();
7772							$input.closest('tr').addClass('shopgrade-has-error');
7773							$input.addClass('input-error').after(`
7774								<div class="grade-error-text">
7775									<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7776										<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>
7777										<rect x="6" y="3" width="1" height="5"></rect>
7778										<rect x="6" y="9" width="1" height="1"></rect>
7779									</svg>
7780								</div>
7781							`);
7782							$input.next('.grade-error-text').append(document.createTextNode('이미 생성된 등급이름 입니다.'));
7783							if (!$firstInvalid.length) $firstInvalid = $input;
7784							valid = false;
7785						}
7786					}
7787
7788					if (isAutoChecked) {
7789						reqInput($form.find('input[name="use_auto_amount_min"]'));
7790						reqInput($form.find('input[name="use_auto_amount_max"]'));
7791					}
7792					if (isDiscountChecked) {
7793						reqInput($form.find('input[name="discount_amount"]'));
7794						reqInput($form.find('input[name="discount_value"]'));
7795						reqSelect($form.find('select[name="discount_type"]'));
7796						if ($form.find('select[name="discount_type"]').val() === '0') {
7797							reqInput($form.find('input[name="discount_max"]'));
7798						}
7799					}
7800					if (isReserveChecked) {
7801						reqInput($form.find('input[name="reserve_amount"]'));
7802						reqInput($form.find('input[name="reserve_value"]'));
7803						reqSelect($form.find('select[name="reserve_type"]'));
7804						if ($form.find('select[name="reserve_type"]').val() === '0') {
7805							reqInput($form.find('input[name="reserve_max"]'));
7806						}
7807					}
7808
7809					if (isAutoChecked) {
7810						const $autoMin = $form.find('input[name="use_auto_amount_min"]');
7811						const $autoMax = $form.find('input[name="use_auto_amount_max"]');
7812						const autoMinVal = $.trim($autoMin.val());
7813						const autoMaxVal = $.trim($autoMax.val());
7814						const autoMin = Number(String(autoMinVal).replace(/,/g, ''));
7815						const autoMax = Number(String(autoMaxVal).replace(/,/g, ''));
7816						let hasAutoOverlap = false;
7817
7818						if (autoMinVal !== '' && autoMaxVal !== '' && autoMin > 0 && autoMax > 0 && autoMin < autoMax) {
7819							$.each(group_list || [], function (_, grade) {
7820								if (!grade || String(grade.use_auto) !== '1') return true;
7821								if (String(grade.grade_seq) === '0') return true;
7822								if (mode === 'edit' && String(grade.seq) === String(data.seq)) return true;
7823
7824								const gradeMin = Number(String(grade.use_auto_amount_min || 0).replace(/,/g, ''));
7825								const gradeMax = Number(String(grade.use_auto_amount_max || 0).replace(/,/g, '')) || 1000000000000;
7826								if (autoMin < gradeMax && autoMax > gradeMin) {
7827									hasAutoOverlap = true;
7828									return false;
7829								}
7830							});
7831						}
7832
7833						if (hasAutoOverlap) {
7834							$('.auto-error-row').remove();
7835							$form.find('.criteria-row').after(`
7836								<div class="auto-error-text auto-error-row">
7837									<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7838										<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>
7839										<rect x="6" y="3" width="1" height="5"></rect>
7840										<rect x="6" y="9" width="1" height="1"></rect>
7841									</svg> 중복된 기준의 쇼핑등급이 존재합니다.
7842								</div>
7843							`);
7844							$form.find('.auto-error-row').last().contents().filter(function () {
7845								return this.nodeType === 3;
7846							}).remove();
7847							$form.find('.auto-error-row').last().append(document.createTextNode('동일한 기준의 쇼핑등급이 존재합니다.'));
7848							$autoMin.add($autoMax).addClass('input-error');
7849							if (!$firstInvalid.length) $firstInvalid = $autoMin;
7850							valid = false;
7851						}
7852					}
7853					if (!valid) {
7854						if ($firstInvalid.length) $firstInvalid.focus();
7855						return false;
7856					}
7857
7858					// 서버 전송 전 숫자 정제
7859					stripNumberOnly($form);
7860					const formData = new FormData($form[0]);
7861					formData.append('sid', SID);
7862					if (mode === 'edit' && typeof data.seq !== 'undefined') {
7863						formData.append('seq', data.seq);
7864					}
7865					if (isDefaultGrade) {
7866						if (typeof formData.set === 'function') {
7867							formData.set('use_auto', '0');
7868							formData.set('use_auto_amount_min', '0');
7869							formData.set('use_auto_amount_max', '0');
7870						} else {
7871							formData.append('use_auto_amount_min', '0');
7872							formData.append('use_auto_amount_max', '0');
7873						}
7874					}
7875					if ($form.find('select[name="discount_type"]').val() === '1') {
7876						if (typeof formData.set === 'function') formData.set('discount_max', '0');
7877						else formData.append('discount_max', '0');
7878					}
7879					if ($form.find('select[name="reserve_type"]').val() === '1') {
7880						if (typeof formData.set === 'function') formData.set('reserve_max', '0');
7881						else formData.append('reserve_max', '0');
7882					}
7883
7884					const url = (mode === 'edit')
7885						? '/shop_grade/update/type/edit'
7886						: '/shop_grade/update/type/add';
7887
7888					// 상태 트리거(뷰 갱신)
7889					$form.find('input[name="use_auto"]').trigger('change');
7890					$form.find('input[name="discount_use"]').trigger('change');
7891					$form.find('input[name="reserve_use"]').trigger('change');
7892
7893					$.ajax({
7894						type: 'POST',
7895						url,
7896						data: formData,
7897						processData: false,
7898						contentType: false,
7899						dataType: 'json',
7900						success: function (res) {
7901							if ((mode === 'edit' && res.success) || (mode === 'add' && !res.error)) {
7902								alert(mode === 'edit' ? '수정되었습니다.' : '저장되었습니다.');
7903								modal.modal('hide');
7904								removeShopgradeModalOverlay();
7905								refreshGradeList();
7906								return;
7907							}
7908
7909							// 에러 처리
7910							const err = res.error;
7911							if (err === 'auto_policy_required') {
7912								syncShopgradeAutoPolicyToggle($form);
7913								alertShopgradeAutoPolicyRequired();
7914								return;
7915							}
7916							if (err === 'grade_name') {
7917								const $in = $form.find('.grade_name');
7918								$in.next('.grade-error-text').remove();
7919								$in.closest('tr').addClass('shopgrade-has-error');
7920								$in.addClass('input-error').after(`
7921									<div class="grade-error-text">
7922										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7923											<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>
7924											<rect x="6" y="3" width="1" height="5"></rect>
7925											<rect x="6" y="9" width="1" height="1"></rect>
7926										</svg> 중복된 등급 이름 입니다.
7927									</div>
7928								`).focus();
7929								$in.next('.grade-error-text').contents().filter(function () {
7930									return this.nodeType === 3;
7931								}).remove();
7932								$in.next('.grade-error-text').append(document.createTextNode('이미 생성된 등급이름 입니다.'));
7933								$(document).off('input.grade_name').on('input.grade_name', 'input.grade_name', function () {
7934									const $t = $(this);
7935									if ($t.val().trim().length > 0) {
7936										$t.removeClass('input-error');
7937										$t.next('.grade-error-text').remove();
7938										$t.closest('tr').removeClass('shopgrade-has-error');
7939									}
7940								});
7941								return;
7942							}
7943
7944							if (err === 'use_auto') {
7945								$('.auto-error-row').remove();
7946								const $autoMin = $form.find('input[name="use_auto_amount_min"]');
7947								const $autoMax = $form.find('input[name="use_auto_amount_max"]');
7948								const autoMinVal = $.trim($autoMin.val());
7949								const autoMaxVal = $.trim($autoMax.val());
7950								if (autoMinVal === '' || autoMaxVal === '') {
7951									$autoMin.add($autoMax).filter(function () {
7952										return $.trim($(this).val()) === '';
7953									}).addClass('input-error');
7954									return;
7955								}
7956								$form.find('.criteria-row').after(`
7957									<div class="auto-error-text auto-error-row">
7958										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7959											<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>
7960											<rect x="6" y="3" width="1" height="5"></rect>
7961											<rect x="6" y="9" width="1" height="1"></rect>
7962										</svg> 중복된 기준의 쇼핑등급이 존재합니다.
7963									</div>
7964								`);
7965								$form.find('.auto-error-row').last().contents().filter(function () {
7966									return this.nodeType === 3;
7967								}).remove();
7968								$form.find('.auto-error-row').last().append(document.createTextNode('동일한 기준의 쇼핑등급이 존재합니다.'));
7969								$autoMin.add($autoMax).addClass('input-error');
7970								return;
7971							}
7972
7973							if (err === 'invalid_range') {
7974								$('.auto-error-row').remove();
7975								$form.find('.criteria-row').after(`
7976									<div class="auto-error-text auto-error-row">
7977										<svg viewBox="0 0 13 13" width="13" height="13" fill="currentColor">
7978											<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>
7979											<rect x="6" y="3" width="1" height="5"></rect>
7980											<rect x="6" y="9" width="1" height="1"></rect>
7981										</svg> 최소값이 최대값보다 크거나 같습니다.
7982									</div>
7983								`);
7984								$form.find('.auto-error-row').last().contents().filter(function () {
7985									return this.nodeType === 3;
7986								}).remove();
7987								$form.find('.auto-error-row').last().append(document.createTextNode('최소값이 최대값보다 크거나 같습니다.'));
7988								$form.find('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]').addClass('input-error');
7989								return;
7990							}
7991
7992							if (err === 'nama_full') {
7993								alert('쇼핑등급은 최대 20개까지만 등록할 수 있습니다.');
7994								return;
7995							}
7996
7997							alert(res.error || '처리에 실패했습니다.');
7998						},
7999						error: function () {
8000							alert('서버 오류가 발생했습니다.');
8001						}
8002					});
8003				},
8004				'취소',
8005				'저장',
8006				modalClass,
8007				true,
8008				removeShopgradeModalOverlay,
8009				'',
8010				removeShopgradeModalOverlay
8011			);
8012
8013			if (useShopgradeFormStyle) {
8014				modal.addClass('shopgrade-add-modal-scroll');
8015				$('.modal-dialog.shopgrade-setting-modal')
8016					.addClass('shopgrade-add-modal-covered')
8017					.closest('.modal')
8018					.addClass('shopgrade-add-modal-covered-wrap');
8019				modal.find('.config-tooltip svg.sg-grade-use')
8020					.attr({
8021						'xmlns': 'http://www.w3.org/2000/svg',
8022						'viewBox': '0 0 13 13',
8023						'width': '13',
8024						'height': '13'
8025					})
8026					.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"/>');
8027				modal.find('#grade-form input[type="text"]').not('.grade_name').attr('placeholder', '0');
8028				modal.find('select[name="discount_type"], select[name="reserve_type"]').each(function () {
8029					var $select = $(this);
8030					var $wonOption = $select.find('option[value="1"]');
8031					var $percentOption = $select.find('option[value="0"]');
8032					if ($wonOption.length && $percentOption.length) {
8033						$wonOption.insertBefore($percentOption);
8034					}
8035				});
8036				modal.find('.modal-footer .close-button-dialog').text('취소');
8037				modal.find('.delivery-benefit-toggle-row').closest('tr').addClass('delivery-benefit-row');
8038				modal.find('.grade-create-table tr:has(td[colspan] hr)').addClass('shopgrade-hr-row');
8039				var $criteriaRow = modal.find('.criteria-row');
8040				$criteriaRow.closest('tr').addClass('auto-grade-row');
8041				var $autoMin = $criteriaRow.find('input[name="use_auto_amount_min"]');
8042				var $autoMax = $criteriaRow.find('input[name="use_auto_amount_max"]');
8043				var criteriaCycleText = currentShopgradeAutoPolicyCycleType === '1' ? '매주' : '매월';
8044				if ($criteriaRow.length && $autoMin.length && $autoMax.length) {
8045					$criteriaRow.empty().append(
8046						$('<div/>', { 'class': 'form-inline3 criteria-title' }).append(
8047							document.createTextNode('등급 충족 기준 : '),
8048							$('<span/>', { 'class': 'criteria-cycle', text: criteriaCycleText })
8049						),
8050						$('<div/>', { 'class': 'criteria-amount-row criteria-amount-line' }).append(
8051							$('<span/>', { 'class': 'criteria-label', text: '구매 금액' }),
8052							$('<span/>', { 'class': 'criteria-input-wrap' }).append($autoMin),
8053							$('<span/>', { 'class': 'criteria-unit', text: '원 이상,' }),
8054							$('<span/>', { 'class': 'criteria-input-wrap' }).append($autoMax),
8055							$('<span/>', { 'class': 'criteria-unit', text: '원 미만' })
8056						)
8057					);
8058				}
8059			}
8060
8061			// 모달 겹침 방지 오버레이
8062			setTimeout(() => {
8063				const $coveredModals = $('.modal-dialog.cl-cmmodal').not(':last');
8064				if (useShopgradeFormStyle) {
8065					$coveredModals.filter('.shopgrade-setting-modal')
8066						.addClass('shopgrade-add-modal-covered')
8067						.closest('.modal')
8068						.addClass('shopgrade-add-modal-covered-wrap');
8069				} else {
8070					$coveredModals.append('<div class="modal-overlay-blocker"></div>');
8071				}
8072				const $gradeForm = $('#grade-form').last();
8073				formatNumberFieldsOnce($gradeForm);
8074				$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');
8075				syncShopgradeAutoPolicyToggle($gradeForm);
8076				if (useShopgradeFormStyle) {
8077					modal.find('.discount-benefit-row:not(.discount-max-row), .reserve-benefit-row:not(.reserve-max-row)').each(function () {
8078						var $row = $(this);
8079						var isDiscountRow = $row.hasClass('discount-benefit-row');
8080						$row.closest('tr').addClass(isDiscountRow ? 'discount-benefit-form-row' : 'reserve-benefit-form-row');
8081						var isEnabled = isDiscountRow
8082							? modal.find('input[name="discount_use"]').is(':checked')
8083							: modal.find('input[name="reserve_use"]').is(':checked');
8084						var $amount = $row.find('.pos-relative').first().detach();
8085						var $value = $row.find('input.input-ms').first().detach();
8086						var $select = $row.find('select').first().detach();
8087						var $label = $row.find('span').last().detach();
8088						var $amountUnit = $amount.children('.pos-span, .pos-span1, .pos-span2').last();
8089						var $conditionSpan = $amount.children('span').not('.pos-span, .pos-span1, .pos-span2').last();
8090						var amountUnitText = $.trim($amountUnit.text());
8091						var amountConditionText = $.trim($amount.contents().filter(function () {
8092							return this.nodeType === 3;
8093						}).text());
8094						if (!amountConditionText && $conditionSpan.length) {
8095							amountConditionText = $.trim($conditionSpan.text());
8096						}
8097						$conditionSpan.remove();
8098						$amountUnit.remove();
8099						$amount.contents().filter(function () {
8100							return this.nodeType === 3;
8101						}).remove();
8102						var conditionText = amountConditionText || $.trim($row.contents().filter(function () {
8103							return this.nodeType === 3;
8104						}).text());
8105						if (amountUnitText) {
8106							conditionText = amountUnitText + (conditionText ? ' ' + conditionText : '');
8107						}
8108						$row.empty().addClass('shopgrade-benefit-line').append(
8109							$amount,
8110							$('<span/>', { 'class': 'benefit-condition', text: conditionText }),
8111							$value,
8112							$select,
8113							$label
8114						);
8115						$row.css('display', isEnabled ? 'grid' : 'none');
8116					});
8117					modal.find('.discount-max-row, .reserve-max-row').each(function () {
8118						var $row = $(this);
8119						var isDiscountRow = $row.hasClass('discount-max-row');
8120						var isEnabled = isDiscountRow
8121							? modal.find('input[name="discount_use"]').is(':checked')
8122							: modal.find('input[name="reserve_use"]').is(':checked');
8123						var $maxLabel = $row.find('.max-label').first().detach();
8124						var $maxInput = $row.find('.pos-relative').first().detach();
8125						$maxInput.children('.pos-span, .pos-span1, .pos-span2').last().addClass('benefit-max-unit');
8126						$row.empty().addClass('shopgrade-benefit-max-line').append(
8127							$('<span/>', { 'class': 'benefit-condition' }),
8128							$maxLabel,
8129							$maxInput,
8130							$('<span/>', { 'class': 'benefit-unit-placeholder' })
8131						);
8132						var isPercent = isDiscountRow
8133							? modal.find('select[name="discount_type"]').val() === '0'
8134							: modal.find('select[name="reserve_type"]').val() === '0';
8135						$row.css('display', (isEnabled && isPercent) ? 'grid' : 'none');
8136					});
8137					$gradeForm.find('input[name="discount_use"], input[name="reserve_use"], select[name="discount_type"], select[name="reserve_type"]').trigger('change');
8138					modal.find('select[name="discount_type"], select[name="reserve_type"]').each(function () {
8139						var $select = $(this);
8140						if ($select.next('.shopgrade-type-select').length) return;
8141						var $custom = $('<div/>', { 'class': 'shopgrade-type-select', tabindex: 0 });
8142						var $button = $('<button/>', { type: 'button', 'class': 'shopgrade-type-select-btn' });
8143						var $value = $('<span/>', { 'class': 'shopgrade-type-select-value', text: $select.find('option:selected').text() });
8144						var $menu = $('<div/>', { 'class': 'shopgrade-type-select-menu' });
8145						$select.find('option').each(function () {
8146							var $option = $(this);
8147							$menu.append($('<button/>', {
8148								type: 'button',
8149								'class': 'shopgrade-type-select-option' + ($option.is(':selected') ? ' selected' : ''),
8150								'data-value': $option.val(),
8151								text: $option.text()
8152							}));
8153						});
8154						$button.append($value);
8155						$custom.append($button, $menu);
8156						$select.addClass('shopgrade-native-type-select').after($custom);
8157					});
8158					syncShopgradeBenefitRows($gradeForm);
8159				}
8160			}, 10);
8161		}
8162
8163
8164
8165		function normalizeGradeFormData(data = {}, mode = 'edit') {
8166			const isAddMode = mode === 'add';
8167			const isDefaultGrade = mode === 'edit' && String(data.grade_seq) === '0';
8168			const emptyIfNull = (value, fallback = '') => {
8169				return (value === null || typeof value === 'undefined' || value === 'null') ? fallback : value;
8170			};
8171			const isEmptyValue = (value) => {
8172				return value === null || typeof value === 'undefined' || value === '' || value === 'null';
8173			};
8174			const isEmptyNumberValue = (value) => {
8175				return isEmptyValue(value) || String(value) === '0';
8176			};
8177			const emptyIfNoNumber = (value) => {
8178				return isEmptyNumberValue(value) ? '' : normalizeIntegerInputValue(value);
8179			};
8180			const hasNoBenefitSettings = (fields) => {
8181				return fields.every((field) => isEmptyNumberValue(data[field]));
8182			};
8183			const defaultBenefitType = isAddMode ? '0' : '1';
8184			return {
8185				seq: emptyIfNull(data.seq),
8186				grade_seq: emptyIfNull(data.grade_seq),
8187				grade_name: emptyIfNull(data.grade_name),
8188				use_auto: isDefaultGrade ? 0 : (hasNoBenefitSettings(['use_auto_amount_min', 'use_auto_amount_max']) ? 0 : emptyIfNull(data.use_auto, 0)),
8189				use_auto_amount_min: isDefaultGrade ? '' : emptyIfNoNumber(data.use_auto_amount_min),
8190				use_auto_amount_max: isDefaultGrade ? '' : emptyIfNoNumber(data.use_auto_amount_max),
8191				discount_use: isAddMode ? 1 : (hasNoBenefitSettings(['discount_amount', 'discount_value', 'discount_max']) ? 0 : emptyIfNull(data.discount_use, 0)),
8192				discount_amount: emptyIfNoNumber(data.discount_amount),
8193				discount_value: emptyIfNoNumber(data.discount_value),
8194				discount_type: emptyIfNull(data.discount_type, defaultBenefitType),
8195				discount_max: emptyIfNoNumber(data.discount_max),
8196				reserve_use: isAddMode ? 1 : (hasNoBenefitSettings(['reserve_amount', 'reserve_value', 'reserve_max']) ? 0 : emptyIfNull(data.reserve_use, 0)),
8197				reserve_amount: emptyIfNoNumber(data.reserve_amount),
8198				reserve_value: emptyIfNoNumber(data.reserve_value),
8199				reserve_type: emptyIfNull(data.reserve_type, defaultBenefitType),
8200				reserve_max: emptyIfNoNumber(data.reserve_max),
8201				delivery_benefit: isAddMode ? 1 : emptyIfNull(data.delivery_benefit, 0)
8202			};
8203		}
8204
8205		function getGradeFormHtml(data = {}, mode = 'edit') {
8206			const {
8207				grade_seq = '',
8208				grade_name = '',
8209				use_auto = 0,
8210				use_auto_amount_min = '',
8211				use_auto_amount_max = '',
8212				discount_use = 1,
8213				discount_amount = '',
8214				discount_value = '',
8215				discount_type = '0',
8216				discount_max = '',
8217				reserve_use = 1,
8218				reserve_amount = '',
8219				reserve_value = '',
8220				reserve_type = '0',
8221				reserve_max = '',
8222				delivery_benefit = 0
8223			} = normalizeGradeFormData(data, mode);
8224			const isDefaultGrade = mode === 'edit' && String(grade_seq) === '0';
8225
8226			const slAutouse   = '&#8226;&nbsp;앞에서 설정한 등급 자동 조정이 반영됩니다. 해당 등급은 사용을 원치 않을 경우 자동으로 등급 변경이 되지 않습니다.<br><br>&#8226;&nbsp;충족 기준은 총 실결제금액에서 각종 할인,쿠폰,적립금, 배송비 등 혜택이 제외된 금액) 기준 입니다.',
8227						slAddbenefit= $.lang[LANG]['manager.list.member.shopgrade.addbenefit'],
8228						slSavebenefit=$.lang[LANG]['manager.list.member.shopgrade.s
8228avebenefit'],
8229						slDelibenefit=$.lang[LANG]['manager.list.member.shopgrade.delibenefit'];
8230
8231			return `
8232				<form id="grade-form">
8233					<div class="mng-modal-body">
8234						<table class="grade-create-table">
8235							<tr>
8236								<td class="form-title">등급 이름</td>
8237								<td>
8238									<div class="form-inline">
8239										<input type="text" name="grade_name" class="grade_name" required
8240													placeholder="등급 이름을 입력 해 주세요." value="${grade_name}">
8241									</div>
8242								</td>
8243							</tr>
8244
8245							${isDefaultGrade ? '' : `
8246							<tr>
8247								<td class="form-title">자동 등급 사용
8248									<span class="config-tooltip">
8249										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8250												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slAutouse}">
8251											<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"/>
8252											<rect x="6" y="9" width="1" height="1"/>
8253											<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"/>
8254										</svg>
8255									</span>
8256								</td>
8257								<td>
8258									<div class="toggle-switch">
8259										<label class="simple-switch">
8260											<input type="checkbox" name="use_auto" class="simple-switch-input" value="1" ${(use_auto == 1 && currentShopgradeAutoPolicyEnabled) ? 'checked' : ''}>
8261											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8262											<span class="simple-switch-handle"></span>
8263										</label>
8264									</div>
8265
8266									<div class="criteria-row" style="display: ${use_auto == 1 ? 'block' : 'none'};">
8267										<div class="form-inline3">등급 충족 기준 : <span class="criteria-cycle">${currentShopgradeAutoPolicyCycleType === '1' ? '매주' : '매월'}</span></div>
8268										<div class="form-inline">
8269											구매 금액
8270											<div class="pos-relative">
8271												<input type="text" name="use_auto_amount_min" class="input-ss" numberOnly data-keep-comma value="${use_auto_amount_min}">
8272												<span class="pos-span1">원 이상,</span>
8273												<input type="text" name="use_auto_amount_max" class="input-ss" numberOnly data-keep-comma value="${use_auto_amount_max}">
8274												<span class="pos-span2">원 미만</span>
8275											</div>
8276										</div>
8277									</div>
8278								</td>
8279							</tr>
8280							`}
8281
8282							<tr><td colspan="2"><hr></td></tr>
8283
8284							<tr>
8285								<td class="form-title">추가 할인 혜택
8286									<span class="config-tooltip">
8287										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8288												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slAddbenefit}">
8289											<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"/>
8290											<rect x="6" y="9" width="1" height="1"/>
8291											<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"/>
8292										</svg>
8293									</span>
8294								</td>
8295								<td>
8296									<div class="toggle-switch">
8297										<label class="simple-switch">
8298											<input type="checkbox" name="discount_use" class="simple-switch-input" value="1" ${discount_use == 1 ? 'checked' : ''}>
8299											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8300											<span class="simple-switch-handle"></span>
8301										</label>
8302									</div>
8303
8304									<div class="form-inline3 discount-benefit-row" style="display: ${discount_use == 1 ? '' : 'none'};">
8305										<div class="pos-relative">
8306											<input type="text" name="discount_amount" class="input-mm" numberOnly data-keep-comma value="${discount_amount}">
8307											<span class="pos-span">원</span>
8308											<span>이상 구매 시</span>
8309										</div>
8310										<input type="text" name="discount_value" class="input-ms" numberOnly data-keep-comma value="${discount_value}">
8311										<select name="discount_type">
8312											<option value="0" ${discount_type == '0' ? 'selected' : ''}>%</option>
8313											<option value="1" ${discount_type == '1' ? 'selected' : ''}>원</option>
8314										</select>
8315										<span>
8315할인</span>
8316									</div>
8317
8318									<div class="form-inline1 discount-benefit-row discount-max-row" style="display: ${(discount_use == 1 && discount_type == '0') ? '' : 'none'};">
8319										<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>
8320										<div class="pos-relative">
8321											<input type="text" name="discount_max" class="input-mm" numberOnly data-keep-comma value="${discount_max}">
8322											<span class="pos-span">원</span>
8323										</div>
8324									</div>
8325								</td>
8326							</tr>
8327
8328							<tr>
8329								<td class="form-title">추가 적립 혜택
8330									<span class="config-tooltip">
8331										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8332												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slSavebenefit}">
8333											<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"/>
8334											<rect x="6" y="9" width="1" height="1"/>
8335											<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"/>
8336										</svg>
8337									</span>
8338								</td>
8339								<td>
8340									<div class="toggle-switch">
8341										<label class="simple-switch">
8342											<input type="checkbox" name="reserve_use" class="simple-switch-input" value="1" ${reserve_use == 1 ? 'checked' : ''}>
8343											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8344											<span class="simple-switch-handle"></span>
8345										</label>
8346									</div>
8347
8348									<div class="form-inline3 reserve-benefit-row" style="display: ${reserve_use == 1 ? '' : 'none'};">
8349										<div class="pos-relative">
8350											<input type="text" name="reserve_amount" class="input-mm" numberOnly data-keep-comma value="${reserve_amount}">
8351											<span class="pos-span">원</span>
8352											<span>이상 구매 시</span>
8353										</div>
8354										<input type="text" name="reserve_value" class="input-ms" numberOnly data-keep-comma value="${reserve_value}">
8355										<select name="reserve_type">
8356											<option value="0" ${reserve_type == '0' ? 'selected' : ''}>%</option>
8357											<option value="1" ${reserve_type == '1' ? 'selected' : ''}>원</option>
8358										</select>
8359										<span>적립</span>
8360									</div>
8361
8362									<div class="form-inline1 reserve-benefit-row reserve-max-row" style="display: ${(reserve_use == 1 && reserve_type == '0') ? '' : 'none'};">
8363										<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>
8364										<div class="pos-relative">
8365											<input type="text" name="reserve_max" class="input-mm" numberOnly data-keep-comma value="${reserve_max}">
8366											<span class="pos-span">원</span>
8367										</div>
8368									</div>
8369								</td>
8370							</tr>
8371
8372							<tr>
8373								<td class="form-title">배송비 무료
8374									<span class="config-tooltip">
8375										<svg class="sg-grade-use" viewBox="0 0 13 13" width="13" height="13" tabindex="0"
8376												data-toggle="tooltip" data-placement="right" data-html="true" data-original-title="${slDelibenefit}">
8377											<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"/>
8378											<rect x="6" y="9" width="1" height="1"/>
8379											<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.
837966 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"/>
8380										</svg>
8381									</span>
8382								</td>
8383								<td>
8384									<div class="delivery-benefit-toggle-row">
8385									<div class="toggle-switch">
8386										<label class="simple-switch">
8387											<input type="checkbox" name="delivery_benefit" class="simple-switch-input delivery-toggle" value="1" ${delivery_benefit == 1 ? 'checked' : ''}>
8388											<span class="simple-switch-label" data-on="On" data-off="Off"></span>
8389											<span class="simple-switch-handle"></span>
8390										</label>
8391									</div>
8392									</div>
8393								</td>
8394							</tr>
8395
8396						</table>
8397					</div>
8398				</form>
8399			`;
8400		}
8401
8402
8403		$(document).off('blur.keepComma', 'input[numberOnly][data-keep-comma]').on('blur.keepComma', 'input[numberOnly][data-keep-comma]', function () {
8404			var v = $(this).val();
8405			v = (typeof removeCommas === 'function') ? removeCommas(v) : String(v).replace(/,/g, '');
8406			if (typeof addCommas === 'function') {
8407				$(this).val(addCommas(v));
8408			} else {
8409				$(this).val(String(v).replace(/\B(?=(\d{3})+(?!\d))/g, ','));
8410			}
8411		});
8412
8413		function stripNumberOnly($form) {
8414			$form.find('input[numberOnly]').each(function () {
8415				this.value = (typeof removeCommas === 'function')
8416					? removeCommas(this.value)
8417					: String(this.value).replace(/,/g, '');
8418			});
8419		}
8420
8421		$(function () {
8422			$('input[numberOnly]').each(function () {
8423				var v = $(this).val();
8424				if (v) {
8425					v = v.replace(/,/g, ''); // 혹시 기존 콤마 제거
8426					$(this).val(v.replace(/\B(?=(\d{3})+(?!\d))/g, ",")); // 천단위 콤마 찍기
8427				}
8428			});
8429		});
8430
8431
8432
8433		function getShopgradeCriteriaDisplay() {
8434			return $(window).width() <= 767 ? 'flex' : 'block';
8435		}
8436
8437		$(document).off('change', '.simple-switch-input').on('change', '.simple-switch-input', function (e) {
8438			const $tr = $(this).closest('tr');
8439
8440			if ($tr.find('td:first').text().includes('자동')) {
8441				if ($(this).attr('name') === 'use_auto' && !currentShopgradeAutoPolicyEnabled) {
8442					const $form = $(this).closest('#grade-form');
8443					syncShopgradeAutoPolicyToggle($form);
8444					if (e.originalEvent) alertShopgradeAutoPolicyRequired();
8445					return false;
8446				}
8447				const checked = $(this).is(':checked');
8448				$('.criteria-row').css('display', checked ? getShopgradeCriteriaDisplay() : 'none');
8449				$('.criteria-divider, .auto-error-row').toggle(checked);
8450			}
8451		});
8452
8453		$(document).off('click.shopgradeAutoPolicy', '#grade-form .shopgrade-auto-policy-disabled')
8454			.on('click.shopgradeAutoPolicy', '#grade-form .shopgrade-auto-policy-disabled', function (e) {
8455				e.preventDefault();
8456				e.stopImmediatePropagation();
8457				const $form = $(this).closest('#grade-form');
8458				syncShopgradeAutoPolicyToggle($form);
8459				alertShopgradeAutoPolicyRequired();
8460				return false;
8461			});
8462
8463		$(window).off('resize.shopgradeCriteria').on('resize.shopgradeCriteria', function () {
8464			$('.shopgrade-add-modal .criteria-row:visible').css('display', getShopgradeCriteriaDisplay());
8465		});
8466
8467		function syncShopgradeBenefitRows($form) {
8468			if (!$form || !$form.length) $form = $('#grade-form').last();
8469
8470			var $discountType = $form.find('select[name="discount_type"]');
8471			var $discountUse = $form.find('input[name="discount_use"]');
8472			var $discountMax = $form.find('input[name="discount_max"]');
8473			var showDiscountRows = $discountUse.is(':checked');
8474			var showDiscountMax = showDiscountRows && $discountType.val() === '0';
8475
8476			$form.find('tr.discount-benefit-form-row')
8477				.toggleClass('shopgrade-benefit-off', !showDiscountRows);
8478			$form.find('.discount-benefit-row').not('.discount-max-row')
8479				.toggleClass('shopgrade-benefit-hidden', !showDiscountRows)
8480				.css('display', showDiscountRows ? 'grid' : 'none');
8481
8482			$form.find('.discount-max-row')
8483				.toggleClass('shopgrade-benefit-hidden shopgrade-max-hidden', !showDiscountMax)
8484				.css('display', showDiscountMax ? 'grid' : 'none');
8485			$form.find('input[name="discount_amount"], input[name="discount_value"], select[name="discount_type"]')
8486				.prop('required', showDiscountRows)
8487				.prop('disabled', !showDiscountRows);
8488			$discountMax.prop('required', showDiscountMax).prop('disabled', !showDiscountMax);
8489			if (!showDiscountRows) {
8490				$form.find('input[name="discount_amount"], input[name="discount_value"], input[name="discount_max"]').removeClass('input-error');
8491			} else if (!showDiscountMax) {
8492				$discountMax.removeClass('input-error').val('');
8493			}
8494
8495			var $reserveType = $form.find('select[name="reserve_type"]');
8496			var $reserveUse = $form.find('input[name="reserve_use"]');
8497			var $reserveMax = $form.find('input[name="reserve_max"]');
8498			var showReserveRows = $reserveUse.is(':checked');
8499			var showReserveMax = showReserveRows && $reserveType.val() === '0';
8500
8501			$form.find('tr.reserve-benefit-form-row')
8502				.toggleClass('shopgrade-benefit-off', !showReserveRows);
8503			$form.find('.reserve-benefit-row').not('.reserve-max-row')
8504				.toggleClass('shopgrade-benefit-hidden', !showReserveRows)
8505				.css('display', showReserveRows ? 'grid' : 'none');
8506
8507			$form.find('.reserve-max-row')
8508				.toggleClass('shopgrade-benefit-hidden shopgrade-max-hidden', !showReserveMax)
8509				.css('display', showReserveMax ? 'grid' : 'none');
8510			$form.find('input[name="reserve_amount"], input[name="reserve_value"], select[name="reserve_type"]')
8511				.prop('required', showReserveRows)
8512				.prop('disabled', !showReserveRows);
8513			$reserveMax.prop('required', showReserveMax).prop('disabled', !showReserveMax);
8514			if (!showReserveRows) {
8515				$form.find('input[name="reserve_amount"], input[name="reserve_value"], input[name="reserve_max"]').removeClass('input-error');
8516			} else if (!showReserveMax) {
8517				$reserveMax.removeClass('input-error').val('');
8518			}
8519		}
8520
8521		$(document).off('click.shopgradeTypeSelect').on('click.shopgradeTypeSelect', function (e) {
8522			if (!$(e.target).closest('.shopgrade-type-select').length) {
8523				$('.shopgrade-type-select').removeClass('open');
8524			}
8525		});
8526
8527		$(document).off('click.shopgradeTypeSelectBtn', '.shopgrade-type-select-btn').on('click.shopgradeTypeSelectBtn', '.shopgrade-type-select-btn', function (e) {
8528			e.preventDefault();
8529			e.stopPropagation();
8530			var $wrap = $(this).closest('.shopgrade-type-select');
8531			$('.shopgrade-type-select').not($wrap).removeClass('open');
8532			$wrap.toggleClass('open');
8533		});
8534
8535		$(document).off('click.shopgradeTypeSelectOption', '.shopgrade-type-select-option').on('click.shopgradeTypeSelectOption', '.shopgrade-type-select-option', function (e) {
8536			e.preventDefault();
8537			e.stopPropagation();
8538			var $option = $(this);
8539			var $wrap = $option.closest('.shopgrade-type-select');
8540			var $select = $wrap.prev('select.shopgrade-native-type-select');
8541			var selectedValue = $option.attr('data-value');
8542			var $form = $select.closest('#grade-form');
8543			$select.val(selectedValue);
8544			if ($select[0]) {
8545				$select[0].dispatchEvent(new Event('change', { bubbles: true }));
8546			} else {
8547				$select.trigger('change');
8548			}
8549			syncShopgradeBenefitRows($form);
8550			$wrap.find('.shopgrade-type-select-value').text($option.text());
8551			$wrap.find('.shopgrade-type-select-option').removeClass('selected');
8552			$option.addClass('selected');
8553			$wrap.removeClass('open');
8554		});
8555
8556		let isComposing = false;
8557
8558		// 공통 필터링 함수
8559		function filterGroupName($input) {
8560			let val = $input.val();
8561			val = val.replace(/[^a-zA-Z가-힣 ]/g, '');
8562			if (val.length > 40) val = val.substring(0, 40);
8563			$input.val(val);
8564		}
8565
8566		// 조합 입력 시작
8567		$(document).on('compositionstart', '.grade_name', function () {
8568			isComposing = true;
8569		});
8570
8571		// 조합 입력 끝났을 때 필터링
8572		$(document).on('compositionend', '.grade_name', function () {
8573			isComposing = false;
8574			filterGroupName($(this));
8575		});
8576
8577		// 일반 입력 중일 때 (영문 입력 등)
8578		$(document).on('input', '.grade_name', function () {
8579			if (!isComposing) {
8580				filterGroupName($(this));
8581			}
8582		});
8583
8584		$(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) {
8585			const $target = $(this);
8586			const $form = $target.closest('#grade-form');
8587			const isUserChange = !!e.originalEvent;
8588
8589			if ($target.hasClass('input-mm') || $target.hasClass('input-ms') || $target.hasClass('input-ss')) {
8590				$target.val(normalizeIntegerInputValue($target.val(), 99999999));
8591			}
8592
8593			if ($target.attr('name') === 'discount_type' ||	$target.attr('name') === 'discount_value') {
8594				const $type = $form.find('select[name="discount_type"]');
8595				const $value = $form.find('input[name="discount_value"]');
8596				const $discountMax = $form.find('input[name="discount_max"]');
8597				const isPercent = $type.val() === '0';
8598				$value.attr(isPercent ? { min: 0, max: 100 } : { min: 0, max: 99999999 });
8599
8600				if ($target.attr('name') === 'discount_type' && isUserChange) {
8601					$value.removeClass('input-error').val('');
8602					$discountMax.removeClass('input-error').val('');
8603				} else if ($target.attr('name') === 'discount_value') {
8604					$value.val(normalizeIntegerInputValue($value.val(), isPercent ? 100 : 99999999));
8605				}
8606
8607				syncShopgradeBenefitRows($form);
8608			}
8609
8610			if ($target.attr('name') === 'reserve_type' || $target.attr('name') === 'reserve_value') {
8611				const $type = $form.find('select[name="reserve_type"]');
8612				const $value = $form.find('input[name="reserve_value"]');
8613				const $reserveMax = $form.find('input[name="reserve_max"]');
8614				const isPercent = $type.val() === '0';
8615				$value.attr(isPercent ? { min: 0, max: 100 } : { min: 0, max: 99999999 });
8616
8617				if ($target.attr('name') === 'reserve_type' && isUserChange) {
8618					$value.removeClass('input-error').val('');
8619					$reserveMax.removeClass('input-error').val('');
8620				} else if ($target.attr('name') === 'reserve_value') {
8621					$value.val(normalizeIntegerInputValue($value.val(), isPercent ? 100 : 99999999));
8622				}
8623
8624				syncShopgradeBenefitRows($form);
8625			}
8626		});
8627
8628		// 1. 자동 등급 체크 상태에 따라 기준 필드 required 여부 설정
8629		$(document).on('change', 'input[name="use_auto"]', function () {
8630				const isChecked = $(this).is(':checked');
8631				$('input[name="use_auto_amount_min"], input[name="use_auto_amount_max"]')
8632						.prop('required', isChecked)
8633						.prop('disabled', !isChecked);
8634		});
8635
8636		// 2. 할인 혜택 필드 제어
8637		$(document).on('change', 'input[name="discount_use"]', function () {
8638				const $form = $(this).closest('#grade-form');
8639				syncShopgradeBenefitRows($form);
8640		});
8641
8642		// 3. 적립 혜택 필드 제어
8643		$(document).on('change', 'input[name="reserve_use"]', function () {
8644				const $form = $(this).closest('#grade-form');
8645				syncShopgradeBenefitRows($form);
8646		});
8647
8648		$(document).off('input.shopgradeRequired change.shopgradeRequired', '#grade-form input, #grade-form select')
8649			.on('input.shopgradeRequired change.shopgradeRequired', '#grade-form input, #grade-form select', function () {
8650				const $field = $(this);
8651				const val = $.trim($field.val());
8652				if (val !== '' && val !== '0') {
8653					$field.removeClass('input-error');
8654					if ($field.hasClass('grade_name')) {
8655						$field.next('.grade-error-text').remove();
8656						$field.closest('tr').removeClass('shopgrade-has-error');
8657					}
8658				}
8659			});
8660
8661
8662		// 등급 삭제
8663		$(document).off('click', '.delete-group-btn').on('click', '.delete-group-btn', function () {
8664			const gradeSeq = $(this).data('sgseq');
8665			const gradeName = $(this).data('gradename');
8666
8667			// 등급에 포함된 회원 수 조회
8668			$.ajax({
8669				type: 'POST',
8670				url: '/shop_grade/shopgrade_member_count',
8671				dataType: 'json',
8672				data: { sid: SID, grade_id: gradeSeq },
8673				success: function (res) {
8674					const memberCount = res.count || 0;
8675
8676					if (memberCount > 0) {
8677						const warnModal = $(this).showModalFlat(
8678							'쇼핑 등급 삭제',
8679							`
8680							<div class="delete-grade-modal">
8681								<div class="delete-grade-name-row">
8682									<span class="delete-grade-name-label">등급명</span>
8683									<span class="delete-grade-name-value">[ ${gradeName} ]</span>
8684								</div>
8685								<div class="delete-grade-message">
8686									이 등급에 회원이 <strong>${memberCount}</strong>명 있습니다.<br>
8687									<span class="delete-grade-danger">삭제</span> 하면 기본 등급으로 내려갑니다.
8688								</div>
8689							</div>
8690							`,
8691							true,
8692							true,
8693							function () {
8694								$.ajax({ // 기존 씨앗으로 리셋
8695									type: 'POST',
8696									url: '/shop_grade/shopgrade_member_reset',
8697									dataType: 'json',
8698									data: { sid: SID, grade_id: gradeSeq },
8699									success: function (resetRes) {
8700										$.ajax({
8701											type: 'POST',
8702											url: '/shop_grade/update/type/delete',
8703											dataType: 'json',
8704											data: { sid: SID, seq: gradeSeq },
8705											success: function (res) {
8706												if (res.success) {
8707													alert('삭제되었습니다.');
8708													warnModal.modal('hide');
8709													$('.modal-overlay-blocker').remove();
8710													$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8711													refreshGradeList();
8712												} else {
8713													alert('삭제 실패: ' + res.error);
8714												}
8715											}
8716										});
8717									}
8718								});
8719							},
8720							'취소',
8721							'삭제',
8722							'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal',
8723							true,
8724							function () {
8725								$('.modal-overlay-blocker').remove();
8726								$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8727							}
8728						);
8729
8730						setTimeout(() => {
8731							$('.modal-dialog.cl-cmmodal')
8732								.not(':last')
8733								.addClass('shopgrade-auto-policy-covered')
8734								.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
8735						}, 10);
8736
8737					} else {
8738
8739						const confirmModal = $(this).showModalFlat(
8740							'쇼핑 등급 삭제',
8741							`
8742							<div class="delete-grade-modal">
8743								<div class="delete-grade-name-row">
8744									<span class="delete-grade-name-label">등급명</span>
8745									<span class="delete-grade-name-value">[ ${gradeName} ]</span>
8746								</div>
8747								<div class="delete-grade-message">
8748									삭제된 쇼핑 등급은 복구 불가능합니다.<br>
8749									쇼핑 등급을 <span class="delete-grade-danger">삭제</span> 하시겠습니까?
8750								</div>
8751							</div>
8752							`,
8753							true,
8754							true,
8755							function () {
8756								$.ajax({
8757									type: 'POST',
8758									url: '/shop_grade/update/type/delete',
8759									dataType: 'json',
8760									data: { sid: SID, seq: gradeSeq },
8761									success: function (res) {
8762										if (res.success) {
8763											alert('삭제되었습니다.');
8764											confirmModal.modal('hide');
8765											$('.modal-overlay-blocker').remove();
8766											$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8767											refreshGradeList();
8768										} else {
8769											alert('삭제 실패: ' + res.error);
8770										}
8771									}
8772								});
8773							},
8774							'취소',
8775							'삭제',
8776							'cl-cmmodal cl-s-btn cl-p0 shopgrade-delete-confirm-modal',
8777							true,
8778							function () {
8779								$('.modal-overlay-blocker').remove();
8780								$('.shopgrade-auto-policy-covered').removeClass('shopgrade-auto-policy-covered');
8781							}
8782						);
8783
8784						setTimeout(() => {
8785							$('.modal-dialog.cl-cmmodal')
8786								.not(':last')
8787								.addClass('shopgrade-auto-policy-covered')
8788								.append('<div class="modal-overlay-blocker shopgrade-auto-policy-backdrop"></div>');
8789						}, 10);
8790					}
8791				}
8792			});
8793		});
8794
8795		// 등급 리스트 새로고침
8796		function refreshGradeList() {
8797			$.ajax({
8798				type: 'POST',
8799				url: '/shop_grade/get_list',
8800				dataType: 'json',
8801				data: { sid: SID },
8802				success: function (res) {
8803					if (res.success) {
8804						group_list = res.list;
8805						const newListHtml = renderGroupList(group_list);
8806						modal.find('.grade-list-wrap').html(newListHtml);
8807						bindEditEvents(modal);
8808					}
8809				}
8810			});
8811		}
8812
8813
8814		});
8815		/* 쇼핑등급 설정 end */
8816
8817		function hasShopgradeSettingOpenParam() {
8818			var params = new URLSearchParams(window.location.search || '');
8819			return params.get('open_shopgrade_setting') == '1';
8820		}
8821
8822		function removeShopgradeSettingOpenParam() {
8823			if(typeof history == 'undefined' || typeof history.replaceState != 'function') return;
8824
8825			var url = new URL(window.location.href);
8826			url.searchParams.delete('open_shopgrade_setting');
8827			history.replaceState({}, document.title, url.pathname + url.search + url.hash);
8828		}
8829
8830		function openShopgradeSettingModalFromUrl() {
8831			if(!hasShopgradeSettingOpenParam()) return;
8832
8833			removeShopgradeSettingOpenParam();
8834			setTimeout(function() {
8835				var $btn = $('.shopgrade-setting-btn.shopGrade').not('.shopping_disabled, .ss_user_noActive').first();
8836				if($btn.length == 0) $btn = $('.shopGrade').not('.shopping_disabled, .ss_user_noActive').first();
8837				if(typeof canConfigureShopgrade != 'undefined' && !canConfigureShopgrade) return;
8838				if($btn.length > 0) $btn.trigger('click');
8839			}, 300);
8840		}
8841
8842		openShopgradeSettingModalFromUrl();
8843
8844
8845
8846
8847
8848
8849
8850
8851	$('input[type="checkbox"].cl-etc-input-val').live('click',function(){ 
8852		if($(this).is(":checked")===true) {
8853			
8854			console.log($(this).prop('checked'));
8855			$(this).prop('checked',true);
8856		} else {
8857			
8858			console.log($(this).prop('checked'));
8859			$(this).prop('checked',false);
8860		}
8861	
8862	});
8863	
8864	$('.member-info').live('click', function() {
8865		var isGabia = ($('.dashboard_u.gabia').length > 0) ? true : false,
8866			checkViewMode = ($(this).find('.collection-view').length > 0) ? true : false,
8867			uid = $(this).closest('tr').attr('data-uid'),
8868			mng_settings_el = $(this).closest('.mng-settings'),
8869			list_type = mng_settings_el.attr('data-type'),
8870			list_str = '',
8871			no_active_btn = $('div[data-ssuser]').attr('data-ssuser');
8872
8873		$.post('/umember/lists/type/memberinfo', { sid : SID, val : uid }, function(data) {
8874			if(typeof data.error != 'undefined' && data.error) {
8875				alert(data.error);
8876				return false;
8877			}
8878			var page_type = $('.mng-settings').attr('data-type'),
8879				slog_p = '';
8880			if(typeof page_type != 'undefined' && page_type) {
8881				if(page_type == 'member-waitlist') setSiteLogs('um.wait','info',{'id':uid},'um.waitlist');
8882				else setSiteLogs('um.list','info',{'id':uid},'um.list');
8883			}
8884			var cert_use = $('.memberlist-table').attr('data-cert');
8885			$.each(data, function(k,o) {
8886				if(isGabia && $.inArray(k, ['cert_date','cert_adult_date']) > -1) return true;				
8887				var cl_name = (o['name']) ? o['name'] : $.lang[LANG]['manager.list.info.'+k],
8888					cl_type = (o['type']) ? o['type'] : 'text',
8889					cl_val = (o['value']) ? o['value'].replace(/\"/g,'&quot;').replace(/\'/g,'&#39;').replace(/\</g,'&lt;').replace(/\>/g,'&gt;') : '',
8890					pass_field = ['no','addr2','umseq'],
8891					disabled_field = ['id','approvaldate'],
8892                    cl_jcol_list_type = ((o['type']=='check') || (o['type']=='radio')) ? 'cl-etc-list-type' : '';
8893
8894				list_str += ($.inArray(k,pass_field) > -1) ? '' : '\
8895					<div class="form-group">\
8896						<label class="memW-title control-label '+cl_jcol_list_type+' " id="member-'+ k + '-label">'+ cl_name + '</label>\
8897						<div class="memW-info-wrap">\
8898				';
8899
8900				if(k=='birth') cl_val = (cl_val=='0000-00-00') ? '' : cl_val;
8901				
8902				switch(k) {
8903					case 'no':
8904					case 'addr2': 
8905					case 'umseq': 
8906						break;
8907
8908					case 'addr1':
8909						var addr2_str = (data['addr2']['value']) ? '||' + data['addr2']['value'] : '|| ',
8910							addr_str = (cl_val.indexOf('||') === -1) ? ' || '+cl_val+addr2_str : cl_val+addr2_str,
8911							addr = addr_str.split('||'),
8912							plan_type = (typeof property != 'undefined' && property) ? property.VALIDTYPE : VALIDTYPE,
8913							checkSM = (typeof plan_type != 'undefined' && (plan_type == 'SM' || plan_type == 'SHOPPING')) ? true : false,
8914							usedAddrSearchModal = (checkSM || o['addrsearch']) ? 'readonly onclick="addrSearchModal(\'member\')"' : '';
8915							;
8916							
8917						var sm_addr =  (data && data.umseq) ? data.umseq : '',
8918							sm_name =  (sm_addr && sm_addr.to_name) ? sm_addr.to_name : '',							
8919							sm_alias = (sm_addr && sm_addr.alias) ? sm_addr.alias : '',
8920							sm_tel = (sm_addr && sm_addr.to_tel) ? sm_addr.to_tel : '',
8921							addr_list_btn ='';
8922							addr_default_html = '';
8923							if(sm_addr || checkSM) {
8924								
8925								addr_list_btn += '\
8926								<div class="cl-s-form-wrap btn-load-addresses adm-member-addr '+(!sm_addr? 'hide' : '' )+' " data-action="adm-edit">\
8927									<div class="cl-s-form-group "><span>배송지 목록</span>\
8928									</div>\
8929								</div>';		
8930								
8931								addr_default_html += '\
8932								<div class="sm-parent '+ (!sm_addr ? 'emptyFlag' : '') +'">\
8933									<div class="cl-s-form-wrap">\
8934										<div class="cl-s-form-group">\
8935											<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>\
8936											<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>\
8937											<div class="cl-s-form-control"><div class="sm-tel">'+sm_tel+'</div></div>\
8938											<div class="cl-s-form-control noaddress" style="text-align:center; padding:20px; color:#999;">등록된 배송지가 없습니다.</div>\
8939										</div>\
8940									</div>\
8941								</div>\
8942								';
8943							}
8944							 
8945						if(list_type == 'member-list') {
8946							if(sm_addr || checkSM) { list_str += addr_list_btn; }
8947
8948							list_str += '\
8949								<input class="hide" id="member-postcode" type="hidden" value="' + addr[0].trim() + '">\
8950								<div class="cl-common-form-wrap nonplace-holder">\
8951			   						<div class="cl-common-form-group">\
8952                                       	<input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + addr[1].trim() + '" ' + usedAddrSearchModal + ' name="member-'+ k + '" required="required">\
8953			 						</div>\
8954			   					</div>\
8955			   					<div class="cl-common-form-wrap nonplace-holder">\
8956			   						<div class="cl-common-form-group">\
8957                                       	<input class="member-info-input form-control" id="member-addr2" type="text" value="' + escapeHtml(addr[2].trim()) + '" name="member-addr2" required="required">\
8958			 						</div>\
8959			   					</div>\
8960							';
8961
8962							if (sm_addr || checkSM) { list_str += addr_default_html;}							
8963						} else {
8964							list_str += '\
8965								<input class="hide" id="member-postcode" type="hidden" value="' + addr[0].trim() + '">\
8966								<span id="member-'+ k + '" '+usedAddrSearchModal+'>'
8967									+ addr[1].trim() + ((addr[2].trim() != '') ? '<br>'+addr[2].trim() : '') +
8968								'</span>\
8969							';
8970						}
8971						break;
8972					case 'gender':
8973						if(list_type == 'member-list') {
8974							var disabled = (cert_use == 'Y' || cert_use == 'A' || checkViewMode) ? ' disabled':'';
8975							list_str += '\
8976								<select class="form-control" name="member-'+ k + '" id="member-'+ k+ '"'+disabled+'>\
8977									<option value="">선택</option>';
8978							if(o['value'] == '01') {
8979								list_str += '\
8980									<option value="01" selected>남</option>\
8981									<option value="02">여</option>';
8982							} else if(o['value'] == '02') {
8983								list_str += '\
8984									<option value="01">남</option>\
8985									<option value="02" selected>여</option>';
8986							} else {
8987								list_str += '\
8988									<option value="01">남</option>\
8989									<option value="02">여</option>';
8990							}
8991							list_str += '\
8992								</select>\
8993								<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>\
8994							';
8995						} else {
8996							var gender_val = (cl_val)? ((cl_val == '01')? '남':'여'):'';
8997							list_str += '\
8998								<span id="member-'+ k + '">'
8999									+ gender_val +
9000								'</span>\
9001								';
9002						}
9003							
9004						break;
9005					case 'memo':
9006						var m_count = cl_val.length,
9007							checkReadonly = (checkViewMode) ? 'readonly' : '';
9008						if(list_type == 'member-list') {
9009							list_str += '\
9010								<textarea class="form-control" name="member-'+ k + '" id="member-'+ k+ '" rows="3" '+checkReadonly+'>' + cl_val + '</textarea>\
9011								<label for="member-'+ k + '"><span class="write-count">' + m_count + '</span>/1000</label>\
9012								';
9013						} else {
9014							list_str += '\
9015								<span id="member-'+ k+ '">' + cl_val + '</span>';
9016						}
9017						break;
9018
9019					case 'birth':
9020						if(list_type == 'member-list') {
9021							var disabled = (cert_use == 'Y' || cert_use == 'A') ? ' disabled':'';
9022							list_str += '\
9023								<div class="cl-common-form-wrap nonplace-holder">\
9024			   						<div class="cl-common-form-group'+disabled+'">\
9025	                                       <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+'>\
9026			 						</div>\
9027			   					</div>\
9028							';
9029						} else {
9030							list_str += '\
9031								<span id="member-'+ k + '" class="birthKeyCheck" onkeyup="auto_date_format(event, this)" onkeypress="auto_date_format(event, this)">'
9032									+ cl_val +
9033								'</span>\
9034							';
9035						}
9036
9037						break;
9038
9039					case 'cert_date':
9040					case 'cert_adult_date':
9041						if(list_type == 'member-list') {
9042							list_str += '\
9043		                            <div class="cl-common-form-wrap nonplace-holder member-'+ k + '-wrap">';
9044		                        if(cl_val != '' && cl_val != '0000-00-00 00:00:00') {
9045				   				list_str += '\
9046				   						<div class="cl-common-form-group">\
9047		                                    <input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + cl_val + '" name="member-'+ k + '" required="required" ' + prev_val + ' disabled>\
9048				 						</div>';
9049					 			}
9050				 			list_str += '\
9051				   					</div>\
9052								';
9053						} else {
9054							if(cl_val != '' && cl_val != '0000-00-00 00:00:00') {
9055								list_str += '\
9056									<span id="member-'+ k + '">'
9057										+ cl_val +
9058									'</span>\
9059								';
9060							}
9061						}
9062
9063						break;
9064					default:
9065						var disabled = ($.inArray(k,disabled_field) > -1) ? 'disabled' : '',
9066							prev_val = (k == 'email' || k == 'nick') ? 'data-prev="' + cl_val + '"' : '',
9067							cl_type_str = '';
9068
9069						if(list_type == 'member-list') {
9070							if($.inArray(k, ['name', 'tel']) > -1 && (cert_use == 'Y' || cert_use == 'A')) disabled = 'disabled';
9071							var list_jcolval = [o['jcol_val']];
9072							if((cl_type=='select') || (cl_type=='check') || (cl_type=='radio')) {
9073								list_jcolval =  (o['jcol_val'].indexOf('`') > -1) ? o['jcol_val'].split('`') : list_jcolval;
9074							}
9075							switch (cl_type) {
9076								case 'memo':
9077									cl_type_str += '<textarea class="form-control" name="member-'+ k + '" id="member-'+ k+ '" rows="3">' + cl_val + '</textarea>';
9078									break;
9079								case 'select':									
9080									if(list_jcolval.length > 0) {
9081										cl_type_str += '\
9082										<select class="form-control etc-select" name="member-'+ k + '" id="member-'+ k+ '"'+disabled+'>\
9083											<option value="">선택</option>';
9084										$.each(list_jcolval, function(i,v) {
9085											var selected = (v==cl_val) ? 'selected' : '';
9086											cl_type_str += '\
9087											<option value="'+v+'" '+selected+'>'+v+'</option>\
9088											';
9089										});
9090										cl_type_str += '\
9091										</select>\
9092										<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>\
9093										';
9094									}
9095									
9096									break;
9097
9098								case 'radio':
9099									if(list_jcolval.length > 0) {
9100										$.each(list_jcolval, function(i,v) {
9101											var checked = (v==cl_val) ? 'checked' : '';
9102											cl_type_str += '\
9103											<div class="newcheckbox cl-etc-jcoltype">\
9104												<label>\
9105													<div class="newcheckboxSvgRadio">\
9106														<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+'>\
9107														<svg viewBox="0 0 18 18" width="18" height="18">\
9108															<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 
91080-4.41 3.59-8 8-8s8 3.59 8 8C17 13.41 13.41 17 9 17z"/>\
9109														</svg>\
9110														<svg class="active" viewBox="0 0 18 18" width="18" height="18">\
9111															<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"/>\
9112															<circle cx="9" cy="9" r="6"/>\
9113														</svg>\
9114													</div>\
9115													<span>'+v+'</span>\
9116												</label>\
9117											</div>\
9118											';
9119										});		
9120									}
9121
9122									break;	
9123
9124                                case 'check':
9125                                    if(list_jcolval.length > 0) {
9126                                        $.each(list_jcolval, function(i,v) {
9127											var checked = ((cl_val.indexOf('`') > -1) && (cl_val.indexOf(v.trim()) > -1)) ? 'checked' : (v==cl_val ? 'checked' : '');
9128											cl_type_str += '\
9129												<div class="newcheckbox cl-etc-jcoltype">\
9130													<label>\
9131														<div class="newcheckboxSvg">\
9132															<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+'>\
9133															<svg viewBox="0 0 16 16" width="16" height="16">\
9134																<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>\
9135																<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>\
9136															</svg>\
9137															<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
9138																<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
9139																<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>\
9140															</svg>\
9141														</div>\
9142														<span>'+v+'</span>\
9143													</label>\
9144												</div>\
9145											';
9146                                        });	
9147                                    }
9148                                   
9149                                    break;
9150
9151								case 'fupload':
9152									var fileResult = $.umember.fileurlcreate(cl_val);
9153									var download_link = fileResult.download_link;
9154									var file_data = fileResult.file_data;
9155									cl_type_str += $.umember.fileHtmlRender(k, {
9156										val : file_data || '',
9157										type : "type2",
9158										type2_downlink : download_link,
9159									})
9160
9161									break;
9162                    
9163								default:
9164									cl_type_str += '\
9165									<div class="cl-common-form-wrap nonplace-holder" id="member-'+ k + '">\
9166										<div class="cl-common-form-group '+disabled+'">\
9167											<input class="member-info-input form-control" id="member-'+ k + '" type="text" value="' + cl_val + '" ' + disabled + ' name="member-'+ k + '" required="required" ' + prev_val + '>\
9168										</div>\
9169									</div>';
9170									break;
9171							}
9172
9173							list_str += cl_type_str;
9174
9175						} else {
9176							if((cl_type=='select') || (cl_type=='check') || (cl_type=='radio')) {
9177								cl_val =  (cl_val.indexOf('`') > -1) ? cl_val.replace(/`/gi,',') : cl_val;
9178							}
9179							 
9180							if(cl_type=='fupload' && cl_val) {
9181								var templink = $.umember.fileurlcreate(cl_val|| '');
9182
9183								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>'
9184								cl_val = ''
9185								+ '<div class="fupload-cell">'
9186								+   '<span class="file-name">' + templink.file_info.name + '</span>'
9187								+     templink.download_link  // <a href="... " class="file-download-btn" target="_blank">
9188								+       tempdownicon          // <svg ...>
9189								+     '</a>'
9190								+ '</div>';								
9191							}
9192							
9193							list_str += '\
9194								<span id="member-'+ k + '">'
9195									+ cl_val +
9196								'</span>\
9197							';
9198						}
9199						break;
9200				}
9201				list_str += ($.inArray(k,pass_field) > -1) ? '' : '\
9202				</div>\
9203				</div>\
9204				';
9205			});
9206			
9207			var modal_view = (checkViewMode) ? 'readonly' : '',
9208				modal_content = '\
9209			<div class="mng-modal-body info-modal '+modal_view+'" data-uid="' + uid + '" data-list-type="' + list_type + '">\
9210				<div class="form-horizontal">\
9211					' + list_str + '\
9212				</div>\
9213			</div>\
9214			';
9215			if(list_type == 'member-list') {
9216				var closed_txt = (checkViewMode) ? 'close' : 'cancel';
9217				var info_modal = $(this).showModalFlat($.lang[LANG]['manager.member.details.title'], modal_content, true, !checkViewMode, function() {
9218
9219					var info_data = {},
9220						regExp_arr = ['name','nick','email','tel','birth'],
9221						regexp = {
9222							name: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9223							nick: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9224							email: /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
9225							tel: /^[0-9-+]*$/,
9226							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])$/,
9227						},
9228						check_error = false,
9229						slog_more = '',
9230						slog_more_array = {},
9231						etc_Array = [],
9232						etc_i= 0;
9233						
9234					$('.info-modal').find('.form-control:not([disabled])').each(function(i) {
9235						var type = $(this).attr('id').replace(/(member\-)|(\-\d)/gi,''),
9236							type_str = $(this).closest('.form-group').find('.control-label').text(),
9237							error_str = '',
9238							etc_type_arr = etc_Array[type];
9239							
9240                        if($(this).parents('.newcheckbox').hasClass('cl-etc-jcoltype')) {
9241							
9242							if($(this).is(":checked")) {								
9243								val = $(this).val().trim();
9244								var check_jcol_first = false;
9245								if((typeof $(this).parents('.form-group').attr('data-jcolval')=='undefined') || (!$(this).parents('.form-group').attr('data-jcolval'))) {
9246									check_jcol_first = true;
9247									$(this).parents('.form-group').attr('data-jcolval',val);
9248								}
9249
9250								var jcolVal = $(this).parents('.form-group').attr('data-jcolval');
9251								if($(this).parents('.form-group').find('.cl-etc-input-val:checked').length>1 && val && !check_jcol_first) {
9252									val = jcolVal + '`' + val;
9253									val = val.replace(/\`$/gi, ''); 
9254									$(this).parents('.form-group').attr('data-jcolval',val);
9255								} 
9256							} else {
9257								if($(this).parents('.form-group').find('.cl-etc-input-val:checked').length==0) val = '';
9258							}
9259
9260                        } else val = $(this).val().trim();
9261					
9262						if(typeof $(this).parents('.form-group').attr('data-jcolval') != 'undefined' && $(this).parents('.form-group').attr('data-jcolval')) {
9263							val = $(this).parents('.form-group').attr('data-jcolval');
9264						}					
9265
9266						var emoji_val = (type.indexOf('addr') > -1) ? $('#member-addr1').val().trim() + ' ' + $('#member-addr2').val().trim() : val;
9267						if(checkEmojis(emoji_val)) error_str = $.lang[LANG]['config.unable.emoji'];
9268						else {
9269							// if(type == 'addr1') slog_more += type_str+' : '+val;
9270							// else if(type == 'addr2') slog_more += ' '+val+'<br>';
9271							// else slog_more += type_str+' : '+val+'<br>';
9272							
9273							if((val.length == 0 && type != 'email') || regExp_arr.indexOf(type) == -1) {
9274								
9275								if(type == 'addr1') val = $('#member-postcode').val() + ' || ' + val;																
9276								info_data[type] = val;
9277
9278								if(type=='addr2') {
9279									slog_more_array[type_str] = info_data['addr1'] + ' ' + val;
9280								} else slog_more_array[type_str] = val;
9281								
9282								return true;
9283							}
9284							if(!regexp[type].test(val)) {
9285								error_str = $.lang[LANG]['siteum.regexp.check.'+type];
9286								if(val.length == 0 && type == 'email') error_str = $.lang[LANG]['manager.check.required.message'];
9287							} else if(type == 'nick' && (val.length < 1 || val.length > 20)) {
9288								error_str = $.lang[LANG]['siteum.regexp.check.nick'];
9289							} else {
9290								$(this).closest('.form-group').removeClass('has-error');
9291								$(this).parent().find('.mng-error').remove();
9292								info_data[type] = val;
9293								slog_more_array[type_str] = val;								
9294							}
9295
9296							
9297							
9298						}
9299						var this_group = $(this).closest('.form-group');
9300						if(error_str.length > 0) {
9301							var error_icon = '\
9302									<svg class="error-icon" viewBox="0 0 13 13" width="13" height="13">\
9303										<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"/>\
9304										<rect x="6" y="3" width="1" height="5"/>\
9305										<rect x="6" y="9" width="1" height="1"/>\
9306									</svg>\
9307							';
9308
9309							this_group.addClass('has-error');
9310							if(this_group.find('.mng-error').length > 0 ) this_group.find('.mng-error').html(error_icon + error_str);
9311							else this_group.append('<span class="mng-error">' + error_icon + error_str + '</span>');
9312
9313							if($(this).closest('.form-horizontal').find('.has-error').length == 0) $(this).focus();
9314						}
9315					}).promise().done(function() {
9316						
9317						check_error = ($('.info-modal').find('.has-error').length == 0) ? true : false;
9318						if(!check_error) {
9319							$('.info-modal').find('.has-error').first().find('input').focus();
9320							return false; 
9321						} else {
9322							// deletes 클래스가 있는 파일들 수집
9323							var deletedFiles = [];
9324							$('.info-modal .valueCheck[data-etcidx]').each(function() {
9325								var $inputElement = $(this);
9326								
9327								deletedFiles.push({
9328									file_name: $inputElement.attr('data-file-name'),
9329									etcIdx: $inputElement.attr('data-etcidx'),
9330									id: $inputElement.attr('data-id')
9331								});
9332							});
9333							$.processON();
9334							
9335							$.ajax({
9336								type: 'POST',
9337								url: '/umember/update/type/member',
9338								data: { sid : SID, val: JSON.stringify(info_data), uid : uid ,addrnoupdate : data.umseq,deleted_files: JSON.stringify(deletedFiles)},
9339								dataType: 'json',
9340								async: true,
9341								success: function(data) {
9342										
9343									if(typeof data.error != 'undefined' && data.error) {
9344										$.each(data.error, function(key,str) {
9345											if(info_modal.find('#member-'+key).length > 0 ) {
9346												info_modal.find('#member-'+key).focus();
9347												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);
9348												else info_modal.find('#member-'+key).closest('.form-group').append('<span class="mng-error">' + str + '</span>');
9349											} else { alert(str); return false; }
9350										});
9351										$.processOFF();
9352
9353										if(info_modal.find('.mng-error').length > 0) return false;
9354									}
9355									$.processOFF(); // 성공 시에도 processOFF 호출
9356
9357									slog_more += '\
9358									<div class="slog-jcol-wrap">\
9359										<ul class="slog-jcol-ul">\
9360										';
9361										$.each(slog_more_array, function(key,v){
9362											v = (v.indexOf('`')>-1) ? v.replace(/`/gi,', ') : v;					
9363											slog_more += '\
9364											<li class="slog-jcol-li">\
9365												<div class="slog-jcol-title">'+key+'</div>\
9366												<div class="slog-jcol-contents">'+v+'</div>\
9367											</li>\
9368											';
9369										});
9370					
9371									slog_more += '\
9372											</ul>\
9373										</div>\
9374									';
9375
9376									//console.log(slog_more);
9377									setSiteLogs('um.edit','info',{'id':uid,'more':slog_more},'um.list');
9378
9379									info_modal.find('.mng-error').remove();									
9380									info_data.addr = info_data.addr1+' '+info_data.addr2;
9381									console.log(info_data);
9382									$.each(info_data, function(k, v) {
9383										if(k == 'gender') {
9384											v = (v == '01')? '남':'여';
9385										}
9386										$('.mng-list table tr[data-uid="' + uid + '"]').find('.'+k).text(v);
9387									});
9388
9389									info_modal.modal('hide');
9390								},
9391								error: function(xhr, status, error) {
9392									console.error('AJAX 요청 실패:', error);
9393									$.processOFF(); // 에러 시에도 processOFF 호출
9394								}
9395							});
9396						}
9397
9398					});
9399
9400				}, closed_txt, 'save', 'memberinfo-modal cl-cmmodal cl-s-btn cover', true, '', function() {
9401					
9402					var regexp = {
9403							name: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9404							nick: /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣 ]*$/i,
9405							email: /^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i,
9406							tel: /^[0-9-+]*$/,
9407							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])$/,
9408						};
9409
9410					var info_recheck_regexp = function(input,event_type) {
9411						var type = $(input).attr('id').replace(/member-/i,''),
9412							val = $(input).val().trim(),
9413							emoji_val = (type.indexOf('addr') > -1) ? $('#member-addr1').val().trim() + ' ' + $('#member-addr2').val().trim() : '',
9414							error_str = '';
9415
9416						if(checkEmojis(emoji_val)) error_str = $.lang[LANG]['config.unable.emoji'];
9417						else if(regexp.hasOwnProperty(type)) {
9418							if(!regexp[type].test(val)) error_str = $.lang[LANG]['siteum.regexp.check.'+type];
9419							else {
9420								var checkDuplicate = (	event_type == 'blur' &&
9421														$.inArray(type, ['email','nick']) > -1 &&
9422														typeof $(input).attr('data-prev') != 'undefined' && 
9423														$(input).attr('data-prev').trim().toLowerCase() != val.toLowerCase()
9424													) ? true : false;
9425								if(type == 'email' && $('input#member-id').val().trim().toLowerCase() == val.toLowerCase()) checkDuplicate = false;
9426								else if(type == 'nick' && ($('input#member-nick').val().trim().length < 1 || $('input#member-nick').val().trim().length > 20)) {
9427									checkDuplicate = false;
9428									error_str = $.lang[LANG]['siteum.regexp.check.nick'];
9429								}
9430								if(checkDuplicate) {
9431									var splan = (typeof VALIDTYPE != 'undefined' && VALIDTYPE) ? VALIDTYPE : '';
9432									$.post('/umember/join/used_check', { sid : SID, field : type, data : val, splan : splan }, function(check_result) {
9433										if(typeof check_result.error != 'undefined' && check_result.error) {
9434											error_str = check_result.error;
9435										}
9436									}, 'json');
9437								}
9438							}
9439						}
9440
9441							
9442						if(error_str.length > 0) {
9443							var error_html = '<span class="mng-error">\
9444									<svg class="error-icon" viewBox="0 0 13 13" width="13" height="13">\
9445										<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"/>\
9446										<rect x="6" y="3" width="1" height="5"/>\
9447										<rect x="6" y="9" width="1" height="1"/>\
9448									</svg>' + error_str + '</span>\
9449							';
9450
9451							$(input).closest('.form-group').addClass('has-error');
9452							if($(input).closest('.form-group').find('.mng-error').length > 0) $(input).closest('.form-group').find('.mng-error').replaceWith(error_html);
9453							else $(input).closest('.form-group').append(error_html);
9454						} else {
9455							$(input).closest('.form-group').removeClass('has-error').find('.mng-error').remove();
9456						}
9457					}
9458
9459					$('.info-modal .form-control').live({
9460						keyup : function(e) { info_recheck_regexp($(this),'keyup');	},
9461						blur  : function(e) { info_recheck_regexp($(this),'blur');	}
9462					});
9463
9464				});
9465
9466
9467				$('#member-memo').live('keyup', function() {
9468					var str = $(this).val();
9469					if(str.length > 0) $(this).closest('.form-group').find('.mng-error').remove();
9470					$(this).next('label').find('.write-count').text(str.length);
9471					if(str.length > 1000) {
9472						$(this).val($(this).val().substring(0, 1000));
9473					}
9474				});
9475				if(no_active_btn) $('.memberinfo-modal.cl-cmmodal .ok-button-dialog.btn-sm').addClass(no_active_btn);
9476			} else { // only show__
9477				var info_modal = $(this).showModalFlat($.lang[LANG]['manager.member.details.title'], modal_content, true, false, '', 'ok', '', 'member-waitlist cl-cmmodal cl-s-btn cover');
9478				if(no_active_btn) $('.member-waitlist.cl-cmmodal .ok-button-dialog.btn-sm').addClass(no_active_btn);
9479			}
9480
9481
9482		}, 'json');
9483
9484	});
9485
9486	/***************************************************************************************************************************************member-list page END*/
9487
9488
9489
9490
9491
9492	/*********************************************************************************************************************************member-waitlist page START*/
9493	$('.approval-btn, .deny-btn').live('click', function() {
9494		if($(this).hasClass('member_disabled')) {
9495			siteNotice('manager');
9496			return false;
9497		}
9498		var position = $(this).closest('td'),
9499			uno = $(this).closest('tr').attr('data-uno'),
9500			uid = $(this).closest('tr').attr('data-uid'),
9501			result = ($(this).hasClass('approval-btn')) ? 'hand' : 'deny',
9502			wait_cnt = parseInt($(this).closest('.mng-wrap').find('.wait-count').text()),
9503			isDeny = $(this).hasClass('deny-btn') ? true : false,
9504			applyhtml = '';
9505
9506		if(isDeny) $(this).parents('tr[data-uno="'+uno+'"]').find('.member-info').addClass('hide');
9507
9508		$.post('/umember/update/type/approval', { sid : SID, val : result, uid : uid, uno : uno }, function(data) {
9509			if(typeof data.error != 'undefined' && data.error) {
9510				alert(data.error);
9511				return false;
9512			}
9513			
9514			applyhtml += '\
9515						<span>'+$.lang[LANG]['manager.wait-list.approval.'+result]+'</span>\
9516						<span>('+data.result.um_approvaldate+')</span>\
9517						';
9518			$('.mng-settings[data-type="member-waitlist"]').find('.wait-count').text(wait_cnt-1);
9519			position.html(applyhtml).addClass('approval-status');
9520		}, 'json');
9521
9522	});
9523	/***********************************************************************************************************************************member-waitlist page END*/
9524
9525	/********************************************************************************************************************************member-blocklist page START*/
9526	
9527	$('.block-add-btn').live('click', function() {
9528		if($(this).hasClass('member_disabled')) {
9529			siteNotice('manager');
9530			return false;
9531		}
9532		var mng_settings_el = $(this).closest('.mng-settings'),
9533			add_content = '\
9534			<div class="form-row">\
9535				<div class="form-inline clearfix">\
9536					<div class="form-group col-sm-5">\
9537						<select id="block-type" class="form-control" name="block-type" placeholder="Search">\
9538							<option value="id">회원 아이디</option>\
9539							<option value="ip">IP</option>\
9540						</select>\
9541					</div>\
9542					<div class="form-group col-sm-7"><input class="form-control" type="text" id="block-data"/></div>\
9543				</div>\
9544			</div>\
9545		';
9546
9547		var modal = $(this).showModalFlat('Block data add', add_content, true, true, function() {
9548			var key = modal.find('#block-type').val(),
9549				val = modal.find('#block-data').val().trim(),
9550				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;
9551
9552			if(key === null) {
9553				modal.find('#block-type').click();
9554				return false;
9555			} else if(modal.find('.error').length > 0) {
9556				modal.find('#block-data').focus();
9557				return false;
9558			} else if (modal.find('#block-data').val().trim().length == 0) {
9559				modal.find('#block-data').focus();
9560				modal.find('#block-data').parent().append('<span class="error">내용을 입력하세요</span>');
9561				return false;
9562			} else if (key == 'ip' && !regExp_ip.test(val)) {
9563				modal.find('#block-data').focus();
9564				modal.find('#block-data').parent().append('<span class="error">ip 형식이 올바르지 않습니다.</span>');
9565				return false;
9566			}
9567
9568				$.ajax({
9569					type: 'POST',
9570					url: '/umember/set/type/block',
9571					data: { sid : SID, key : key, val : val },
9572					dataType: 'json',
9573					async: true,
9574					success: function(data) {
9575
9576						if(typeof data.error != 'undefined' && data.error) {
9577							if(modal.find('.error').length == 0) modal.find('#block-data').focus().parent().append('<span class="error">' + data.error + '</span>');
9578							else modal.find('#block-data').focus().next('.error').text(data.error);
9579							return false;
9580						} else {
9581							modal.modal('hide');
9582							window.location.reload();
9583						}
9584
9585					}
9586				});
9587
9588
9589		}, 'cancel','save', 'block-add-modal');
9590
9591		$('#block-data').live({
9592			keyup: function() {
9593				$(this).parent().find('.error').remove();
9594			}
9595		});
9596
9597
9598	});
9599
9600	$('.block-clear-btn').live('click', function() {
9601		if($(this).hasClass('member_disabled')) {
9602			siteNotice('manager');
9603			return false;
9604		}
9605		var block_type = $(this).closest('tr').find('.type').attr('data-type'),
9606			block_val = $(this).closest('tr').find('.val').text().trim(),
9607			block_id = $(this).closest('tr').find('.id').text().trim(),
9608			block_data = $(this).closest('tr').attr('data-id'),
9609			is_uadmin = $(this).parents('.mng-member').attr('data-uadmin');
9610
9611		if(block_data == 0) return false;
9612		else {
9613			var modal_content = '\
9614				<div class="mng-modal-body clear-modal">\
9615					<p class="addressee-wrap">\
9616						'  + $.lang[LANG]['manager.block-list.block.clear.txt.1'] + '\
9617						<span class="addressee-name">' + block_id + '</span> \
9618						' + $.lang[LANG]['manager.block-list.block.clear.txt.2'] + '\
9619					</p>\
9620				</div>\
9621				';	
9622
9623			var modal = $(this).showModalFlat($.lang[LANG]['manager.block-list.block.clear.title'], modal_content, true, true, function() {
9624
9625				$.ajax({
9626					type: 'POST',
9627					url: '/umember/delete/type/block',
9628					data: { sid : SID, val : block_data, block_type : block_type, block_val : block_val },
9629					async: true,
9630					success: function(data) {
9631						if(typeof data.error != 'undefined' && data.error) {
9632							alert(data.error);
9633							return false;
9634						} else {
9635							var cntTr = $(this).parents('table').length;
9636
9637							if(cntTr > 0) window.location.reload();
9638							else location.href = is_uadmin+'/member/blocklist';							
9639						}
9640					}
9641				});
9642
9643			},'cancel','','cl-cmmodal cl-s-btn w560 cl-p130 cl-p0');
9644
9645		}
9646
9647	});
9648
9649	/**********************************************************************************************************************************member-blocklist page END*/
9650
9651
9652	/********************************************************************************************************************************member-leavelist page START*/
9653	$('.leavelist .mng-selectboxlist select.form-control').live('change',function() {
9654		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/leavelist' : '/manager/member/leavelist',
9655			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
9656			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
9657			stx =  $(this).parents('.mng-list').find('.mng-search-box').find('#stx').val();
9658
9659		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view);
9660	});
9661
9662	$('.leavelist .mng-search-box .search-btn').live('click',function(e) {
9663		var url_str = ($('header').hasClass('_admin')) ?  '/_admin/member/leavelist' : '/manager/member/leavelist',
9664			sfl_sort = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_sort').val(),
9665			sfl_view = $(this).parents('.mng-list').find('.mng-subMenu-list').find('#sfl_view').val(),
9666			stx =  $(this).parents('.mng-search-box').find('#stx').val();
9667
9668		if(checkEmojis(stx)) {
9669			e.preventDefault();
9670			errorEmojisModal();
9671			return false;
9672		}
9673
9674		setSiteLogs('um.leavelist','search',{'stx':stx},'um.leavelist');
9675
9676		if(stx.length > 0) stx = '/stx/'+stx;
9677		location.replace(url_str+'/page/1/sort/'+sfl_sort+'/view/'+sfl_view+stx);
9678	});
9679
9680	function escapeHtml(str) {
9681		return str
9682			.replace(/&/g, '&amp;')
9683			.replace(/"/g, '&quot;')
9684			.replace(/'/g, '&#39;')
9685			.replace(/</g, '&lt;')
9686			.replace(/>/g, '&gt;');
9687	}
9688	/**********************************************************************************************************************************member-leavelist page END*/
9689
9690
9691	/****************************************************************************************************************************************Mypage Modal START*/	
9692	$('.my-cl-edit').live({
9693		click: function() {
9694			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap'),
9695				sid = $('#mypage-modal').attr('data-sid'),
9696				uid = $('#mypage-modal').attr('data-uid');
9697
9698			var clInput = function(type, value) {
9699				if(type == 'id') return;
9700				var str = '\
9701						<div class="input-group my-cl-update-wrap">\
9702				';
9703
9704				$.each(value, function(i,v) {
9705
9706					if(type == 'addr') {
9707						var plan_type = (typeof property != 'undefined' && property) ? property.VALIDTYPE : VALIDTYPE,
9708							checkSM = (typeof plan_type != 'undefined' && (plan_type == 'SM' || plan_type == 'SHOPPING')) ? true : false,
9709							usedAddrSearchModal = (checkSM && i==1) ? 'readonly onclick="addrSearchModal(\'my-input\')"' : '';
9710							field_name = (i == 0) ? 'postcode' : type + i,
9711							hide_class = (i == 0) ? 'hide' : '';
9712
9713						str += '\
9714								<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 + '>\
9715						';
9716					} else {
9717						str += '\
9718								<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 + '"/>\
9719						';
9720					}
9721
9722				});
9723				str += '\
9724						</div>\
9725				';
9726				return str;
9727			}
9728			$(this).hide();
9729			cl.find('.my-cl-cancel,.my-cl-save').show();
9730			cl.addClass('update-mode');
9731			cl.children().each(function() {
9732				var type = $(this).attr('data-type'),
9733					value = $(this).find('.my-data').map(function() { return $(this).text().trim(); }).get(),
9734					input_text = clInput(type,value);
9735
9736				if(type != 'id') $(input_text).prependTo($(this).find('.mng-panel-body'));
9737				if(cl.children('.focus').length == 0) $(this).addClass('focus').find('input').focus();
9738			});
9739
9740
9741
9742		}
9743	});
9744
9745	$('.my-cl-cancel').live({
9746		click: function() {
9747			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap');
9748
9749			cl.find('.mng-error').remove();
9750			cl.find('.my-cl-cancel,.my-cl-save').hide();
9751			cl.find('.my-cl-edit').show();
9752			cl.removeClass('update-mode');
9753			cl.children().each(function() {
9754				$(this).find('.my-cl-update-wrap').remove();
9755			});
9756		}
9757	});
9758
9759	$('.my-cl-save').live({
9760		click: function() {
9761			var cl = $('.mng-settings[data-type="profile"]').find('.cl-wrap'),
9762				sid = $('#mypage-modal').attr('data-sid'),
9763				uid = $('#mypage-modal').attr('data-uid'),
9764				cl_data = {},
9765				check_error = false;
9766
9767			if(cl.find('.has-error').length > 0) cl.find('.has-error').addClass('foucs').find('.my-cl-update').first().focus();
9768
9769			var recheck_regexp = function(input) {
9770				var field = input.attr('data-type'),
9771					val = input.val(),
9772					reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
9773					reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
9774					reg = new RegExp(reg_pattern),
9775					reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
9776
9777				if(reg_has && !reg.test(val)) {
9778					input.closest('.mng-panel-body').find('.mng-error').text(reg_ex);
9779				} else {
9780					input.closest('.mng-panel').removeClass('has-error').find('.mng-error').remove();
9781				}
9782			}
9783
9784			$('#mypage-modal .mng-settings[data-type="profile"] .my-cl-update').live({
9785				focus: function(e) { $(this).closest('.mng-panel').addClass('focus').siblings().removeClass('foucs'); },
9786				keyup : function(e) { recheck_regexp($(this)); },
9787				blur  : function(e) { $(this).closest('.mng-panel').removeClass('focus'); }
9788			});
9789
9790			cl.children('.mng-panel:not([data-type="id"])').each(function() {
9791				var field = $(this).attr('data-type'),
9792					optional = $(this).hasClass('optional') ? true : false,
9793					value = $(this).find('.my-cl-update').map(function() { return $(this).val().trim(); }).get(),
9794					this_cl = $(this),
9795					// prev_value = $(this).find('.my-data').map(function() { return $(this).text().trim(); }).get(),
9796					error_str = '',
9797					reg_has = (typeof COLLECTION_REGEX[field] != 'undefined' && COLLECTION_REGEX[field]) ? true : false,
9798					reg_pattern = (reg_has) ? COLLECTION_REGEX[field]['pattern_j'] : '',
9799					reg = new RegExp(reg_pattern),
9800					reg_ex = (reg_has) ? COLLECTION_REGEX[field]['ex'] : '';
9801
9802				$.each(value, function(i,v) {
9803
9804					if(field == 'addr' && i == 0) return true;
9805
9806					var field_name = (field == 'addr') ? field + i : field,
9807						this_wrap = this_cl.find('.mng-panel-body'); 
9808
9809					if(optional && v.length==0 && i==0) error_str = $.lang[LANG]['manager.check.required.message'];
9810					else if(reg_has && !reg.test(v)) {
9811						error_str = (v.length == 0 && !optional) ? '' : COLLECTION_REGEX[field]['error'];
9812					}
9813					
9814					if(error_str.length > 0)  {
9815						this_cl.addClass('has-error');
9816						if(this_wrap.find('.mng-error').length > 0) this_wrap.find('.mng-error').text(error_str);
9817						else this_wrap.append('<span class="mng-error">' + error_str + '</span>');
9818
9819						if(cl.find('.mng-panel.focus').length == 0) this_cl.find('.my-input-'+field_name).focus();
9820					} else {
9821						this_cl.removeClass('has-error');
9822						this_wrap.find('.mng-error').remove();
9823
9824						if(field == 'addr' && i == 1) {
9825							var postcode = $('#my-input-postcode').val();
9826							v = (typeof postcode != 'undefined' && postcode) ? postcode.trim() + '|| ' + v : ' || ' + v;
9827						}
9828
9829						cl_data[field_name] = v;
9830					}
9831				});
9832			}).promise().done(function() {
9833				var check_error = (cl.find('.has-error').length == 0) ? true : false;
9834
9835				if(!check_error) {
9836					cl.find('.has-error').first().first('input').focus();
9837				} else {
9838					$.ajax({
9839						type: 'POST',
9840						url: '/umember/update/type/member',
9841						data: { sid : sid, val: JSON.stringify(cl_data), uid : uid },
9842						dataType: 'json',
9843						async: true,
9844						success: function(data) {
9845							// if(typeof data.error != 'undefined' && data.error) {
9846							// 	alert(data.error);
9847							// 	return false;
9848							// }
9849							if(typeof data.error != 'undefined' && data.error) {
9850								$.each(data.error, function(key,str) {
9851									if(cl.find('#my-input-'+key).length > 0 ) {
9852										cl.find('#my-input-'+key).focus();
9853										cl.find('#my-input-'+key).closest('.mng-panel-body').append('<span class="mng-error">' + str + '</span>');
9854									} else { alert(str); return false; }
9855								});
9856								if(cl.find('.mng-error').length > 0) return false;
9857							}
9858							cl.find('.mng-error').remove();
9859
9860							cl.find('.my-cl-cancel,.my-cl-save').hide();
9861							cl.find('.my-cl-edit').show();
9862							cl.removeClass('update-mode');
9863							$.each(cl_data,function(k,v) {
9864
9865								if(k == 'addr1') {
9866									var addr_arr = v.split('||'),
9867										postcode_str = (addr_arr[0]) ? addr_arr[0].trim() : '';
9868									cl.find('.my-postcode').text(postcode_str);
9869									v = (addr_arr[1]) ? addr_arr[1].trim() : '';
9870								}
9871
9872								cl.find('.my-'+k).text(v);
9873
9874								if(k == 'nick') {
9875									if($('._admin_dashboard .site-info .site-data .site-username').length > 0) {
9876										$('._admin_dashboard .site-info .site-data .site-username').text(v).attr('data-user-name',v);
9877									}
9878									if($('#mobile-nav').length > 0) $('#mobile-nav .login-nick span').text(v);
9879								}
9880							});
9881							cl.find('.my-cl-update-wrap').remove();
9882						}
9883					});
9884				}
9885
9886			});
9887
9888
9889		}
9890	});
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901	$('.mng-siteUM-modal .my-image-edit').live({
9902		click: function() {
9903			var sid = $('#mypage-modal').attr('data-sid'),
9904				uid = $('#mypage-modal').attr('data-uid'),
9905				src = $('.mng-settings[data-type="profile"]').find('.my-image').attr('src');
9906
9907			$.umember.showMyImageUploadModal(sid, uid, src);
9908		}
9909	});
9910
9911
9912	$('.mng-siteUM-modal .my-password-save').live({
9913		click: function() {
9914			var mypageModal = $('#mypage-modal'),
9915				myPasswordWrap = mypageModal.find('.mng-settings[data-type="password-change"]'),
9916				mng_settings_el = $(this).closest('.mng-settings');
9917
9918			myPasswordWrap.find('input.form-control').each(function() {
9919				var field = $(this).attr('id').trim().replace(/input-/,''),
9920					val = $(this).val(),
9921					errorEL = $(this).next('.mng-error'),
9922					error_str = '',
9923					reg_has = (field != 'new-password-checked') ? true : false,
9924					reg_pattern = (reg_has) ? COLLECTION_REGEX['password']['pattern_j'] : '',
9925					reg = new RegExp(reg_pattern),
9926					reg_error = (reg_has) ? COLLECTION_REGEX['password']['error'] : '';
9927
9928				if(val.length == 0) error_str = $.lang[LANG]['siteum.regexp.password.input'];
9929				else {
9930					if(reg_has && !reg.test($(this).val()) ) error_str = reg_error;
9931					else if( field == 'new-password-checked' && ($(this).val() != myPasswordWrap.find('#input-new-password').val())) error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
9932				}
9933
9934				if(error_str.length > 0) {
9935					if(errorEL.length > 0 ) errorEL.addClass('empty').text(error_str);
9936					else $(this).after('<span class="mng-error empty">'+ $.lang[LANG]['siteum.regexp.password.input'] + '</span>');
9937
9938					if(myPasswordWrap.find('.mng-panel-body.focus').length == 0) $(this).focus();
9939					else { myPasswordWrap.find('.mng-panel-body.focus input').focus(); }
9940				} else {
9941					errorEL.remove();
9942					$(this).closest('.mng-panel-body').removeClass('focus');
9943				} 
9944			});
9945
9946
9947			if(myPasswordWrap.find('.mng-error').length == 0) {
9948				var uid = mypageModal.find('.my-id').text(),
9949					pw = hex_md5(myPasswordWrap.find('#input-password').val()),
9950					new_pw = hex_md5(myPasswordWrap.find('#input-new-password').val());
9951
9952				$.post('/umember/password/change', { uid : uid, pw : pw, new_pw : new_pw }, function(data) {
9953					if(typeof data.error != 'undefined' && data.error) {
9954						$.each(data.error, function(key,str) {
9955							if(mypageModal.find('#input-'+key).length > 0) {
9956								mypageModal.find('#input-'+key).closest('.mng-panel-body').append('<span class="mng-error">' + str + '</span>');
9957								mypageModal.find('#input-'+key).focus();
9958							} else { alert(str,'/manager/member'); return false; }
9959						});
9960						if(mypageModal.find('.mng-error').length > 0) return false;
9961					}
9962					mypageModal.find('input.form-control').val('');
9963					mngShowToast('check', $.lang[LANG]['siteum.forgot.pw.success'], mng_settings_el);
9964
9965				}, 'json');
9966			}
9967
9968
9969
9970
9971		}
9972	});
9973
9974	$('.mng-siteUM-modal .mng-settings[data-type="password-change"] input.form-control').live({
9975		focus: function() {
9976			$(this).closest('.mng-panel-body').addClass('focus').siblings().removeClass('focus');
9977		}, 
9978		blur: function() {
9979			$(this).closest('.mng-panel-body').removeClass('focus');
9980		},
9981		keyup: function() {
9982
9983			var field = $(this).attr('id').trim().replace(/input-/,''),
9984				groupEl = $(this).closest('.mng-panel-body'),
9985				errorEL = $(this).next('.mng-error'),
9986				reg_pw = (field == 'new-password-checked') ? field : 'password',
9987				reg_has = (typeof COLLECTION_REGEX[reg_pw] != 'undefined' && COLLECTION_REGEX[reg_pw]) ? true : false,
9988				reg_pattern = (reg_has) ? COLLECTION_REGEX[reg_pw]['pattern_j'] : '',
9989				reg_ex = (reg_has) ? COLLECTION_REGEX[reg_pw]['ex'] : '';
9990
9991			if(field == 'new-password' || field == 'new-password-checked') {
9992				var pwEl = $('.mng-settings[data-type="password-change"]').find('#input-new-password'),
9993					pw2El = $('.mng-settings[data-type="password-change"]').find('#input-new-password-checked'),
9994					error_str = $.lang[LANG]['siteum.regexp.pw.invalid'];
9995
9996				if(pwEl.val() == pw2El.val()) { 
9997					pw2El.next('.mng-error').remove();
9998				} else {
9999					if(pw2El.val().length > 0) {
10000						if(pw2El.next('.mng-error').length > 0) pw2El.next('.mng-error').removeClass('empty').text(error_str);
10001						else pw2El.closest('.mng-panel-body').append('<span class="mng-error">'+ error_str + '</span>');
10002					}
10003				}
10004
10005			}
10006
10007			if(reg_has && errorEL.length > 0) { 
10008				var reg = new RegExp(reg_pattern);
10009				if(reg.test($(this).val())) errorEL.remove();
10010				else { errorEL.removeClass('empty').text(reg_ex); }
10011			}
10012
10013		}
10014	});
10015
10016	$('.mng-siteUM-modal .my-account-remove').live({
10017		click: function() {
10018			var sid = $('#mypage-modal').attr('data-sid'),
10019				uid = $('#mypage-modal').attr('data-uid');
10020
10021			var content = '\
10022				<div class="mng-in-flat-modal-wrap">\
10023					<div class="my-account-remove-info text-left">\
10024						<strong>' + $.lang[LANG]['manager.mypage.my-remove.txt.1'] + '</strong>\
10025						<ol>\
10026							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.2'] + '</li>\
10027							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.3'] + '</li>\
10028							<li>' + $.lang[LANG]['manager.mypage.my-remove.txt.4'] + '</li>\
10029						</ol>\
10030					</div>\
10031					<div class="my-account-remove-check clearfix">\
10032						<div class="checkboxs hand">\
10033							<input type="checkbox" class="my-account-remove-agree" id="my-account-remove-agree">\
10034							<strong>' + $.lang[LANG]['manager.mypage.my-remove.agree.txt'] + '</strong>\
10035						</div>\
10036					</div>\
10037				</div>\
10038			';
10039
10040			$('.my-account-remove-agree').live({
10041				click: function() {
10042					if($(this).prop('checked')) $(this).closest('.my-account-remove-check').find('.mng-error').remove();
10043				}
10044			});
10045
10046			$('.my-account-remove-input-password').live({
10047				keyup: function() {
10048					if($(this).val().length > 0) $(this).closest('.form-group').find('.mng-error').remove();
10049				}
10050			});
10051
10052			var agreeModal = $(this).showModalFlat('DELETE ACCOUNT', content, true, true, function() {
10053				var checked = agreeModal.find('#my-account-remove-agree').prop('checked'),
10054					errorEL = agreeModal.find('.my-account-remove-check').find('.mng-error'),
10055					error_str = (!checked) ? $.lang[LANG]['manager.mypage.my-remove.agree.check'] : '';
10056
10057				if(!checked) {
10058					if(errorEL.length > 0) errorEL.text(error_str);
10059					else $('.my-account-remove-check').append('<span class="mng-error">' + error_str + '</span>');
10060					return false;
10061				}
10062
10063				var udata_content = '\
10064					<div class="mng-in-flat-modal-wrap padding-top-0">\
10065						<p style="margin-bottom: 15px;">' + $.lang[LANG]['manager.mypage.my-remove.description'] + '</p>\
10066						<span class="form-group">\
10067							<input class="form-control" type="password" id="input-password" placeholder="' + $.lang[LANG]['siteum.regexp.password.input'] + '">\
10068						</span>\
10069					</div>\
10070				';
10071
10072				var removeModal = $(this).showModalFlat('DELETE ACCOUNT', udata_content, true, true, function() {
10073					var pw = removeModal.find('#input-password').val();
10074
10075					if(pw.length == 0) {
10076						if(removeModal.find('.mng-error').length > 0) removeModal.find('.mng-error').text($.lang[LANG]["siteum.regexp.password.input"]);
10077						else removeModal.find('.form-group').append('<span class="mng-error">' + $.lang[LANG]["siteum.regexp.password.input"] + '</span>');
10078
10079						removeModal.find('#input-password').focus();
10080						return false;
10081					} else {
10082						$.processON('Deleting....');
10083						var remove_data = {
10084							'id' : uid,
10085							'password' : hex_md5(pw),
10086						};
10087
10088						removeModal.find('.mng-error').remove();
10089						$.post('/umember/login/remove', { data : JSON.stringify(remove_data) }, function(data) {
10090							if(typeof data.error != 'undefined' && data.error) {
10091								$.processOFF();
10092								$.each(data.error, function(key,str) {
10093									if(removeModal.find('#input-'+key).length > 0 ) {
10094										removeModal.find('#input-'+key).closest('.form-group').append('<span class="mng-error">' + str + '</span>');
10095										removeModal.find('#input-'+key).focus();
10096									} else { alert(str); return false; }
10097								});
10098								if(removeModal.find('.mng-error').length > 0) return false;
10099							}
10100
10101							removeModal.modal('hide');
10102							agreeModal.modal('hide');
10103							$('#mypage-modal').modal('hide');
10104							$.umember.init();
10105							setTimeout(function() {
10106								$.processOFF();
10107								var successModal = $(this).showModalFlat('INFORMATION', $.lang[LANG]['manager.mypage.my-remove.success'], true, false, '', 'ok');
10108							}, '1000');
10109
10110						}, 'json');
10111					}
10112
10113					
10114				}, 'cancel', 'manager.mypage.my-remove.last-btn', 'mng-mypage-modal'); /*removeModal:: END*/
10115
10116
10117
10118			}, 'cancel', '', 'w480 mng-mypage-modal'); /*agreeModal:: END*/
10119
10120
10121		}
10122	});
10123
10124
10125	
10126
10127	/******************************************************************************************************************************************Mypage Modal END*/
10128
10129});
10130
10131// psearch 모바일 탭 좌우 그라데이션 추가 ***********************************************************************************************************************
10132document.addEventListener('DOMContentLoaded', () => {
10133	const wrap = document.querySelector('.dsgn-body .psearch-body .psearch-tabs');
10134	const nav  = wrap && wrap.querySelector('.dsgn-body .psearch-body .psearch-tab-nav, .psearch-tab-nav');
10135	if (!wrap || !nav) return;
10136
10137	const MOBILE_MQ = window.matchMedia('(max-width: 767px)');
10138	const isOverflowing = () => nav.scrollWidth > nav.clientWidth + 1;
10139
10140	/* =========================
10141	   1) 모바일 그라데이션(페이드)
10142	========================= */
10143	const updateFade = () => {
10144		const max = nav.scrollWidth - nav.clientWidth;
10145
10146		if (!MOBILE_MQ.matches || max <= 1) {
10147			wrap.classList.remove('has-left', 'has-right');
10148			return;
10149		}
10150
10151		wrap.classList.toggle('has-left', nav.scrollLeft > 1);
10152		wrap.classList.toggle('has-right', nav.scrollLeft < max - 1);
10153	};
10154
10155	nav.addEventListener('scroll', updateFade, { passive: true });
10156	window.addEventListener('resize', updateFade);
10157	MOBILE_MQ.addEventListener?.('change', updateFade);
10158	requestAnimationFrame(() => requestAnimationFrame(updateFade));
10159
10160
10161	/* =========================
10162	   2) PC(마우스) 드래그 스크롤 (클릭 살리는 버전)
10163	   - threshold 이상 움직였을 때만 drag로 전환
10164	   - 그때만 setPointerCapture + preventDefault
10165	========================= */
10166	const DRAG_THRESHOLD = 6;
10167
10168	let pointerId = null;
10169	let down = false;
10170	let dragging = false;
10171	let startX = 0;
10172	let startLeft = 0;
10173	let moved = 0;
10174	let suppressClick = false;
10175
10176	nav.addEventListener('pointerdown', (e) => {
10177		if (e.pointerType !== 'mouse') return;
10178		if (!isOverflowing()) return;
10179		if (e.button !== 0) return;
10180
10181		down = true;
10182		dragging = false;
10183		suppressClick = false;
10184		moved = 0;
10185
10186		pointerId = e.pointerId;
10187		startX = e.clientX;
10188		startLeft = nav.scrollLeft;
10189	});
10190
10191	nav.addEventListener('pointermove', (e) => {
10192		if (!down) return;
10193		if (e.pointerId !== pointerId) return;
10194
10195		const dx = e.clientX - startX;
10196		moved = Math.max(moved, Math.abs(dx));
10197
10198		// threshold 넘어가는 순간 드래그 모드로 전환
10199		if (!dragging && moved >= DRAG_THRESHOLD) {
10200			dragging = true;
10201			suppressClick = true;
10202			nav.classList.add('is-dragging');
10203			nav.setPointerCapture?.(pointerId);
10204		}
10205
10206		if (dragging) {
10207			nav.scrollLeft = startLeft - dx;
10208			e.preventDefault(); // 드래그 중에만 텍스트 선택 방지
10209			updateFade();
10210		}
10211	});
10212
10213	const endPointer = () => {
10214		if (!down) return;
10215		down = false;
10216
10217		if (dragging) {
10218			nav.classList.remove('is-dragging');
10219		}
10220
10221		dragging = false;
10222		pointerId = null;
10223
10224		// 드래그 직후 클릭 1회만 막고 다음 클릭은 정상
10225		if (suppressClick) {
10226			setTimeout(() => { suppressClick = false; }, 0);
10227		}
10228	};
10229
10230	nav.addEventListener('pointerup', endPointer);
10231	nav.addEventListener('pointercancel', endPointer);
10232	window.addEventListener('blur', endPointer);
10233
10234	// 진짜 드래그였던 경우에만 클릭 차단
10235	nav.addEventListener('click', (e) => {
10236		if (suppressClick) {
10237			e.preventDefault();
10238			e.stopPropagation();
10239		}
10240	}, true);
10241
10242
10243	/* =========================
10244	   3) 동적 배경색 → 그라데이션 색 자동 추출
10245	========================= */
10246	const applyDynamicBg = () => {
10247		const bg = getComputedStyle(wrap).backgroundColor;
10248
10249		if (bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent') {
10250			let parent = wrap.parentElement;
10251			while (parent) {
10252				const parentBg = getComputedStyle(parent).backgroundColor;
10253				if (parentBg !== 'rgba(0, 0, 0, 0)' && parentBg !== 'transparent') {
10254					wrap.style.setProperty('--tab-bg', parentBg);
10255					return;
10256				}
10257				parent = parent.parentElement;
10258			}
10259		} else {
10260			wrap.style.setProperty('--tab-bg', bg);
10261		}
10262	};
10263
10264	applyDynamicBg();
10265	window.addEventListener('resize', applyDynamicBg);
10266});
10267// psearch 모바일 탭 좌우 그라데이션 추가 end ****************************************************************************************************************
10268
10269/***********************************************************************************************************************************member-config page START*/
10270var collectionSortable = function(cancel) {
10271	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';
10272
10273	$('#join-collections,#mjoin-collections').sortable({
10274		items: '.collection-item:not(.fix[data-type="email"])',
10275		handle: '.icon-move',
10276		cancel: cancel,
10277		scroll: true,
10278		placeholder: 'collection-item-placeholder',
10279		update: function(event,ui) {
10280			$.processON();
10281
10282			var update_data = {},
10283				new_data = {},
10284				d_index = 0;
10285			
10286			$('#join-collections').children('.collection-item').each(function(i,v){
10287				var org_idx = $(this).attr('data-idx'),
10288					new_idx = $(this).index(),
10289					item_seq = $(this).attr('data-seq');
10290				
10291				if(org_idx!=new_idx) {
10292					$(this).attr('data-idx',new_idx);
10293					update_data[d_index] = {
10294						seq : item_seq,
10295						idx : new_idx
10296					}
10297					d_index++;
10298				}				
10299			});							
10300		
10301			$.ajax({
10302				type: 'POST',
10303				url: '/umember/setJoinCollections/type/jcol_update',
10304				data: { sid: SID, update_data: update_data },
10305				dataType: 'json',
10306				async: true,
10307				success: function(data) {
10308					if(typeof data.error != 'undefined' && data.error) {
10309						alert(data.error);
10310						return false;
10311					}
10312			
10313					var slog_field = {'field_name':$(ui.item).find('.collection-name').text().trim(),'field':$(ui.item).attr('data-type')};
10314					setSiteLogs('um.config.collection','sort',slog_field,'um.config.collection');
10315				},
10316				complete: function () {
10317					$.processOFF();
10318				}
10319			});
10320		}
10321	}).disableSelection();
10322
10323}
10324
10325var collectionItem = function(name,etc) {
10326	var types = '';
10327
10328	$.each(COLLECTION_TYPES, function(k,v) {
10329		types = types + '<option value="' + k + '" '+((k == 'text') ? 'selected' : '')+'>' + v + '</option>';
10330	});
10331
10332	var jcollection_select_type = ['text','memo','radio','check','select','fupload'],
10333		collectionAdd = (!name) ? 'additem' : '',
10334		str = '\
10335		<div class="collection-item ' + collectionAdd + '" data-type="etc' + etc + '" data-etc="' + etc + '" data-orgjcoltype="text" data-jcoltype="" data-seq="">\
10336			<div class="collection-info">\
10337				<span class="icons icon-move cl-sort-handle hand">\
10338					<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>\
10339				</span>\
10340				<span class="collection-name">' + name + '</span>\
10341			</div>\
10342			<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']+'">\
10343			<div class="collection-config">\
10344				<div class="icons hand">\
10345					<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>\
10346				</div>\
10347				<div class="icons hand">\
10348					<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>\
10349				</div>\
10350				<div class="use-option-check">\
10351					<div class="checkboxs hand newcheckbox">\
10352						<label>\
10353							<div class="newcheckboxSvg">\
10354								<input type="checkbox" class="collection-item-used" id="collection-item-used-additem"/>\
10355								<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>\
10356								<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>\
10357								<!--<label for="collection-item-used-additem"></label>-->\
10358							</div>\
10359						</label>\
10360					</div>\
10361					<div class="checkboxs hand newcheckbox">\
10362						<label>\
10363							<div class="newcheckboxSvg">\
10364								<input type="checkbox" class="collection-item-optional" id="collection-item-optional-additem"/>\
10365								<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>\
10366								<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>\
10367								<!--<label for="collection-item-optional-additem"></label>-->\
10368							</div>\
10369						</label>\
10370					</div>\
10371				</div>\
10372			</div>\
10373			<div class="clear"></div>\
10374			<div class="collection-item-content" style="display:none;">\
10375				<div class="collection-item-content-wrap">\
10376					<div class="collection-type-selectbox common-selectbox">\
10377						<select name="jcollection-select-type" class="setting-small-input selectpicker dropdown jcollection-select">\
10378					';
10379					$.each(jcollection_select_type, function(i,v){
10380						var selected = (v=='text') ? 'selected' : '';
10381		str +=			'<option class="jcollection-type-opt" value="'+v+'" '+selected+'>'+$.lang[LANG]['manager.config.siteUM.jcollections.'+v]+'</option>';
10382					});
10383		
10384		str +=		'\
10385						</select>\
10386						<svg viewBox="0 0 8 4" width="8" height="4"><polygon points="0 0 4 4 8 0 "></polygon></svg>\
10387					</div>	\
10388					<span class="collection-type-info hand">\
10389						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
10389<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>\
10390					</span>\
10391				</div>\
10392				<div class="description-wrap hide">\
10393					<div class="description-input hide">\
10394						<div class="cl-common-form-wrap nonplace-holder">\
10395							<div class="cl-common-form-group">\
10396								<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']+'">\
10397							</div>\
10398						</div>\
10399					</div>\
10400					<div class="newcheckbox hand">\
10401						<label>\
10402							<div class="newcheckboxSvg">\
10403								<input type="checkbox" class="" id="collection-description" name="description" value="">\
10404								<svg viewBox="0 0 16 16" width="16" height="16">\
10405									<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>\
10406									<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>\
10407								</svg>\
10408								<svg class="active" viewBox="0 0 16 16" width="16" height="16">\
10409									<rect x="2" y="2" class="st6" width="12" height="12"></rect>\
10410									<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>\
10411								</svg>\
10412							</div>\
10413							'+$.lang[LANG]['manager.config.siteUM.jcollections.description.text']+'\
10414						</label>\
10415					</div>\
10416				</div>\
10417				<div class="jcol-btn-wrap">\
10418					<div class="jcol-btn-cancel jcol-btn hand">\
10419						'+$.lang[LANG]['manager.config.jcollection.item.btn.cancel']+'\
10420					</div>\
10421					<div class="jcol-btn-save jcol-btn hand">\
10422						'+$.lang[LANG]['manager.config.jcollection.item.btn.save']+'\
10423					</div>\
10424				</div>\
10425			</div>\
10426		</div>\
10427	';
10428	return str;
10429}
10430
10431var addCollectionInput = function(cl_name) {
10432	var cl_name = (typeof cl_name == 'undefined' || !cl_name) ? '' : cl_name,
10433		str = '\
10434		<div class="collection-update">\
10435			<div class="input-group">\
10436				<input type="text" class="collection-update-name form-control" placeholder="' + $.lang[LANG]['manager.join.cl.item.name.enter'] + '" value="' + cl_name + '"/>\
10437				<span class="input-group-btn">\
10438					<button class="collection-update-save btn btn-active">\
10439						<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>\
10440					</button>\
10441				</span>\
10442				<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>\
10443			</div>\
10444		</div>\
10445	';
10446	return str;
10447}
10448
10449//keyup birth
10450var auto_date_format = function( e, oThis ){        
10451    var num_arr = [ 
10452        97, 98, 99, 100, 101, 102, 103, 104, 105, 96,
10453        48, 49, 50, 51, 52, 53, 54, 55, 56, 57
10454    ]      
10455
10456    var key_code = ( e.which ) ? e.which : e.keyCode;
10457
10458    if((num_arr.indexOf( Number( key_code ) ) != -1) || (key_code != 229) || (key_code != 0)){
10459	    var len = oThis.value.length;
10460	    if( len == 4 && (key_code != 8)) oThis.value += '-';
10461	    if( len == 7 && (key_code != 8)) oThis.value += '-';
10462    }
10463}
10464
10465var myinfoChangeBtn = function(e) {
10466    var sid = (typeof $(e).attr('data-sid')!='undefined') ? $(e).attr('data-sid') : property['SID'];
10467    if(property.UMEMBER.check_sns) {
10468        $(location).attr('href','/_myinfo');
10469        return false;
10470    }
10471
10472    var str = '\
10473        <div>\
10474            <div class="cl-s-form-wrap">\
10475                <div class="cl-s-form-group">\
10476                    <input type="password" class="cl-s-form-control" id="check-password" required="required">\
10477                    <label for="input" class="cl-s-control-label">'+ $.lang[LANG]['manager.mypage.personal.info.pw.input'] +'</label>\
10478                </div>\
10479            </div>\
10480        </div>\
10481    ';
10482
10483    $('.flat-modal .modal').modal('hide');
10484    var checkMyinfoPwMdoal = $(e).showModalFlat($.lang[LANG]['manager.mypage.personal.info.pw.title'],str,true,true,function () {
10485
10486        var pw_val = $('#check-password').val().trim();
10487        if(!pw_val) {
10488            $('#check-password').closest('.cl-s-form-wrap').addClass('empty');
10489            $('#check-password').focus();
10490            return false;
10491        } else if(checkEmojis(pw_val)) {
10492            $('#check-password').focus();
10493            return false;
10494        }
10495        
10496        $.post('/_check_mypw', { sid:sid, pw:hex_md5(pw_val) }, function(data) {
10497            if(typeof data.error != 'undefined' && data.error) {
10498                $('#check-password').closest('.cl-s-form-wrap').removeClass('empty').addClass('error');
10499                if($('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').length > 0) {
10500                    $('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').html(data.error);
10501                } else {
10502                    $('#check-password').after('<label for="input" class="cl-s-control-label error">' + data.error + '</label>');
10503                }
10504                $('#check-password').val('').focus();
10505                return false;
10506            } else {
10507                checkMyinfoPwMdoal.modal('hide');
10508                $(location).attr('href','/_myinfo');
10509            }
10510        },'json');
10511
10512    },'닫기',$.lang[LANG]['manager.mypage.personal.info.pw.btn'],'cl-s-product-pw cl-modal cl-s-btn w620',false,'', function() {
10513
10514        $('.cl-s-product-pw .cl-s-form-group').on('click',function(e) {
10515            if($(e.target).hasClass('cl-s-form-group')) {
10516                $(e.target).find('.cl-s-form-control:not([type=hidden])').focus();
10517            }
10518        });
10519
10520        $('.cl-s-product-pw .cl-s-form-control').on({
10521            keyup: function(e) {
10522                if($(this).val().trim().length == 0) {
10523                    $(this).closest('.cl-s-form-wrap').removeClass('error');
10524                    $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10525                }
10526            },
10527            focus: function(e) {
10528                $(this).closest('.cl-s-form-wrap').addClass('active');
10529            },
10530            blur: function(e) {
10531                $(this).closest('.cl-s-form-wrap').removeClass('active');
10532
10533                var val = $(this).val().trim();
10534                if(val.length == 0) {
10535                    $(this).closest('.cl-s-form-wrap').removeClass('error').addClass('empty');
10536                    $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10537                    return false;
10538                } else if(checkEmojis(val)) {
10539                    $('#check-password').closest('.cl-s-form-wrap').removeClass('empty').addClass('error');
10540                    if($('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').length > 0) {
10541                        $('#check-password').closest('.cl-s-form-wrap').find('.cl-s-control-label.error').html($.lang[LANG]['config.unable.emoji']);
10542                    } else {
10543                        $('#check-password').after('<label for="input" class="cl-s-control-label error">' + $.lang[LANG]['config.unable.emoji'] + '</label>');
10544                    }
10545                    $('#check-password').val('').focus();
10546                    return false;
10547                }
10548
10549                $(this).closest('.cl-s-form-wrap').removeClass('error').removeClass('empty');
10550                $(this).closest('.cl-s-form-wrap').find('.cl-s-control-label.error').remove();
10551            }
10552        });
10553
10554    });
10555}
10556
10557/*
10558var smsRechargeModal = function(sid) {
10559	var recharge_plan = {
10560		'plan-5000': { name : '5,000원', content: '250건', price: '20원'},
10561		'plan-10000': { name : '10,000원', content: '500건', price: '20원'},
10562		'plan-20000': { name : '20,000원', content: '1100건<span class="additional">(보너스 100건 포함)</span>', price: '18.2원'},
10563		'plan-30000': { name : '30,000원', content: '1800건<span class="additional">(보너스 300건 포함)</span>', price: '16.7원'},
10564		'plan-50000': { name : '50,000원', content: '3100건<span class="additional">(보너스 600건 포함)</span>', price: '16.1원'},
10565	}
10566	var modal_content = '\
10567		<div class="mng-modal-body recharge-modal">\
10568			<div class="row">\
10569				<div class="recharge-head clearfix">\
10570					<div class="col-xs-4 col-sm-4 col-md-4 plan">금액별(VAT별도)</div>\
10571					<div class="col-xs-4 col-sm-4 col-md-6 content">충전 SMS 건수</div>\
10572					<div class="col-xs-4 col-sm-4 col-md-2 price">단가</div>\
10573				</div>\
10574	';
10575	$.each(recharge_plan, function(i,v) {
10576		modal_content = modal_content + '\
10577				<div class="recharge-item clearfix">\
10578					<div class="col-xs-4 col-sm-4 col-md-4 plan">\
10579						<div class="radio-inline">\
10580							<input type="radio" id="recharge-'+ i + '" name="recharge-plan" value="'+ i +'">\
10581							<label for="recharge-' + i + '">' + v['name'] + '</label>\
10582						</div>\
10583					</div>\
10584					<div class="col-xs-4 col-sm-4 col-md-6 content">' + v['content'] + '</div>\
10585					<div class="col-xs-4 col-sm-4 col-md-2 price">' + v['price'] + '</div>\
10586				</div>\
10587		';
10588	});
10589	modal_content = modal_content + '\
10590				<div class="recharge-payment clearfix">\
10591					<div class="col-xs-4 col-sm-4 col-md-3">결제방법</div>\
10592					<div class="col-xs-4 col-sm-4 col-md-9">\
10593						<div class="radio-group">\
10594							<div class="radio-inline">\
10595								<input type="radio" class="payment-method-radio" id="payment-method-card" name="payment-method-radio" value="card">\
10596								<label for="payment-method-card">신용카드</label>\
10597							</div>\
10598							<div class="radio-inline">\
10599								<input type="radio" class="payment-method-radio" id="payment-method-vbank" name="payment-method-radio" value="vbank">\
10600								<label for="payment-method-vbank">가상계좌</label>\
10601							</div>\
10602						</div>\
10603					</div>\
10604				</div>\
10605			</div>\
10606		</div>\
10607	';
10608
10609	var recharge_modal = $(this).showModalFlat('문자메시지(SMS) 충전', modal_content, true, true, function() {
10610		
10611		//문자메시지(SMS) 충전 기능 작업.
10612
10613
10614		recharge_modal.modal('hide');
10615	}, 'cancel', '충전하기', 'w480');
10616
10617}
10618/*sms*/
10619
10620var setJcolError = function(col_item, error_selector, error_text) {	
10621	var error_str = '\
10622		<div class="error_wrap '+error_selector+'-error">\
10623			<span class="error_svg">\
10624				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 13" width="13" height="13">
10624<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>\
10625			</span>\
10626			<span class="error_str">\
10627			'+$.lang[LANG]['manager.config.jcollection.item.error.'+error_text]+'\
10628			</span>\
10629		</div>';
10630		
10631	col_item.find('.'+error_selector+'.empty').removeClass('jcol_error').addClass('jcol_error');
10632
10633	return error_str;
10634	
10635}
10636
10637var getJcollectionItemOptionVal = function(t) {
10638	var opt_str = '';
10639	$.each(t.find('.jcollection-item-option'), function(i,v) {
10640		var opt_name = $(this).find('.jcol-option-name').val().trim(),
10641			split_str = (i==(t.find('.jcollection-item-option').length-1)) ? '' : '`',
10642			error_str = '';
10643
10644		// if(!opt_name) {
10645		// 	$(this).find('.jcol-option-name').removeClass('empty').addClass('empty');
10646			
10647		// 	error_str = setJcolError(t, 'jcol-option-name', 'opt_name');
10648		// 	$(this).find('.error_wrap.jcol-option-name-error').remove();			
10649		// 	$(this).find('.jcol-option-name').after(error_str);
10650			
10651		// 	return false;
10652		// } else {
10653		// 	$(this).find('.jcol-option-name').removeClass('empty').removeClass('jcol_error');
10654		// 	$(this).find('.error_wrap.jcol-option-name-error').remove();
10655		// }
10656
10657		// t.removeClass('empty');
10658		opt_str += opt_name + split_str;
10659	});
10660
10661	return opt_str;
10662};
10663
10664var setJoinCollectionData = function(t, sid){
10665	/*
10666		sid : sid
10667		mb_id : mb_id
10668		collection_type : email/addr/...etc1...
10669		used : true / false
10670		require : optional
10671		name : name
10672		type : type 	(text(단문형), memo(장문형), radio(단일선택형), check(다중선택형), select(목록선택형))
10673		idx : idx
10674		val : val      
10675		regdate : regdate
10676	*/
10677
10678	var data = {};
10679
10680	t.each(function(i,v) {
10681		var collection_type = (typeof $(this).attr('data-collectiontype')!='undefined') ? $(this).attr('data-collectiontype') : 'etc1',
10682			seq = (typeof $(this).attr('data-seq') != 'undefined') ? $(this).attr('data-seq') : '',
10683			used = (typeof $(this).attr('data-used') != 'undefined') ? $(this).attr('data-used') : 'false',
10684			require = (typeof $(this).attr('data-require')!='undefined') ? $(this).attr('data-require') : 'false',
10685			name = (typeof $(this).attr('data-name')!='undefined') ? (!$(this).attr('data-name') ? $(this).find('.jcollection_item_input').val() : $(this).attr('data-name')) : '',
10686			type = (typeof $(this).attr('data-type')!='undefined') ? $(this).attr('data-type') : 'text',
10687			idx = (typeof $(this).attr('data-idx')!='undefined') ? $(this).attr('data-idx') : '0',
10688			val = '';
10689
10690		val = getJcollectionItemOptionVal($(this));
10691		
10692		used = (used===false) ? 'false' : 'true';
10693		require = (require===false) ? 'false' : 'true';
10694		
10695		data[collection_type] = {
10696			sid : sid,
10697			seq : seq,
10698			collection_type : collection_type,
10699			used : used,
10700			require : require,
10701			name : name,
10702			type : type,
10703			idx : idx,
10704			val : val
10705		}
10706	});
10707	console.log(data);
10708
10709	return data;	
10710}
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726/*************************************************************************************************************************************member-config page END*/
10727
10728
10729
10730
10731/*************************************************************************************************************************************member-list page START*/
10732	
10733var getMemberListCheckData = function(el) {
10734	var select_count = el.closest('.mng-list').find('tr.active td.no input[type="checkbox"]:checked').length - 1,
10735		select_ids = el.closest('.mng-list').find('tr.active').map(function() {  return $(this).find('td.id').text().trim(); }).get(),
10736		select_name = '',
10737		select_names = '';
10738
10739	if(select_count < 0) return { error: $.lang[LANG]['manager.list.member.selected.empty'] };
10740	el.closest('.mng-list').find('tr.active').map(function(i) { 
10741		if(i==0) select_name = $(this).find('td.id').text().trim();
10742		else select_names = select_names + ((select_names.length > 0) ? ', ' : '') + $(this).find('td.id').text().trim(); 
10743	});
10744
10745	var result = {
10746		count	: select_count,
10747		ids 	: select_ids,
10748		name	: select_name,
10749		names	: select_names
10750	};
10751
10752	return result;
10753}
10754
10755// var dissmissCert = function(el, uid) {
10756// 	var id = $(el).attr('id');
10757// 	var dismiss = '';
10758// 	if(id == 'member-cert_date-button') {
10759// 		dismiss = 'cert';
10760// 	} else if (id == 'member-cert_adult_date-button') {
10761// 		dismiss = 'adult';
10762// 	}
10763
10764// 	$.ajax({
10765// 		type: 'POST',
10766// 		url: '/umember/update/type/dismiss_cert',
10767// 		data: { sid : SID, uid : uid, dismiss : dismiss },
10768// 		dataType: 'json',
10769// 		async: true,
10770// 		success: function(data) {
10771// 			if(data.affected_rows > 0) {
10772// 				var modalTitle = '';
10773// 				if(data.um_cert == 'N') {
10774// 					modalTitle = '본인인증이 해제되었습니다.';
10775// 					$('.member-cert_date-wrap').html('');
10776// 				} else if (data.um_cert_adult == 'N') {
10777// 					modalTitle = '성인인증이 해제되었습니다.';
10778// 					$('.member-cert_adult_date-wrap').html('');
10779// 				}
10780// 				$(this).showModalFlat(modalTitle, '해당 계정의 인증이 해제되어 인증 이전 상태로 복구되었습니다.', true, false, function() {
10781// 					location.reload();
10782// 				}, 'ok', 'cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-close-btn');
10783// 			} else {
10784// 				alert('error');
10785// 			}
10786// 		}
10787// 	});
10788// }
10789/*************************************************************************************************************************************member-list page   END*/
10790
10791var mngShowToast = function(icon,message,el,time) {
10792	console.log('mngShowToast')
10793	if($('.mng-toast-wrap').length > 0 ) $('.mng-toast-wrap.remove').remove();
10794	if(typeof time == 'undefined') time = 800;
10795	var icon = "fa fa-"+icon,
10796		toast = '\
10797		<div class="mng-toast-wrap">\
10798			<div class="mng-toast">\
10799				<span class="mng-toast-icon"><i class="' + icon + '"></i></span>\
10800				<span class="mng-toast-message">' + message + ' </span>\
10801			</div>\
10802		</div>\
10803	';
10804
10805	el.find('.mng-title, .mng-wrap').addClass('mng-toast-showing').animate({
10806		'opacity': 0.3,
10807		'pointer-events': 'none'
10808	}, { 
10809		duration: '.5s', 
10810		easing: 'easeInOutCubic'
10811	},50).delay(time).fadeIn(100, function() { 
10812		$(this).animate({
10813			'opacity': 1, 
10814			'pointer-events': 'auto'
10815		}, {
10816			duration: '.5s', 
10817			easing: 'easeInOutCubic'
10818		}, 100).removeClass('mng-toast-showing'); 
10819	});
10820
10821	$(toast).appendTo(el).css({
10822		'opacity': 0,
10823		'margin-top': '-10px'
10824	}).animate({
10825		'opacity': 1,
10826		'margin-top': '0px'
10827	}, {
10828		duration: '.7s',
10829		easing: 'easeInOutCubic'
10830	},50).delay(time).fadeOut(100, function() { $(this).addClass('remove'); });
10831
10832}
10833
10834var howToApplyCert = function() {
10835	var mobile = (window.innerWidth<768) ? 'm.' : '',
10836	str = '\
10837			<div class="guide-top lang-'+LANG+'">\
10838				<h3 class="modal-title guidetitle">'+$.lang[LANG]['manager.cert.guide.title']+'</h3>\
10839				<div class="guide-menu">\
10840					<ul>';
10841					for (var i=0;i<3;i++) {
10842						var menuactive = (i==0) ? 'active' : '';
10843						str = str + '<li class="hand '+menuactive+'">';
10844						if(i==2) str = str + '<div class="line left"></div>';
10845						else if(i==1) {
10846							str = str +'\
10847								<div class="line left"></div>\
10848								<div class="line right"></div>\
10849							';	
10850						}
10851						str = str + '<p>'+$.lang[LANG]['manager.cert.guide.step.'+mobile+i]+'</p>';
10852						if(i==0) str = str + '<div class="line right"></div>';
10853						str = str + '</li>';
10854					};
10855		str +=	'\
10856					</ul>\
10857				</div>\
10858			</div>\
10859			<div class="guide-wrap">\
10860				<div class="step">\
10861					<div id="step1">\
10862						<h3>'+$.lang[LANG]['manager.cert.guide.step.1.title']+'</h3>\
10863						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.1']+'</h4>\
10864						<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.1']+'</p>\
10865						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.2']+'</h4>\
10866						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_01_'+LANG+'.jpg">\
10867			';
10868			if(LANG == 'ko') {
10869				str +=	'\
10870						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.1.sub.title.3']+'</h4>\
10871						<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.3']+'</p>\
10872						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_02_'+LANG+'.jpg">\
10873				';	
10874			}
10875			str +=	'\
10876					</div>\
10877					<hr class="line">\
10878					<div id="step2">\
10879						<h3>'+$.lang[LANG]['manager.cert.guide.step.2.title']+'</h3>\
10880						<div class="step2-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.1']+'</div>\
10881						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_03_'+LANG+'.jpg">\
10882						<div class="step2-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.2']+'</div>\
10883						<div class="step2-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.3']+'</div>\
10884				';
10885			if(LANG == 'ko') {
10886				str +=	'\
10887					 	<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_04_'+LANG+'.jpg">';
10888			} else {
10889				str +=	'\
10890						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_05_'+LANG+'.jpg">\
10891				';
10892			}
10893			str +=	'\
10894					 	<div class="step2-step text-left">\
10895					 		<span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.4']+'\
10896					 	';
10897			if(LANG != 'ko') {
10898				str +=	'<p>'+$.lang[LANG]['manager.cert.guide.step.1.sub.3']+'</p>\
10899				';	
10900			}
10901			str += '\
10902					 	</div>';
10903			if(LANG == 'ko') {
10904				str += '\
10905						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_05_'+LANG+'.jpg">';
10906			}
10907			str += '\
10908					 	<div class="step2-step text-left"><span>STEP 05.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.5']+'</div>\
10909					 	<div class="step2-step text-left">\
10910					 		<span>STEP 06.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.6']+'\
10911					 		<p>'+$.lang[LANG]['manager.cert.guide.step.2.txt.6.sub']+'</p>\
10912					 	</div>\
10913					 	<div class="step2-step text-left"><span>STEP 07.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.7']+'</div>\
10914						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_06_'+LANG+'.jpg">\
10915						<div class="step2-step text-left"><span>STEP 08.</span>'+$.lang[LANG]['manager.cert.guide.step.2.txt.8']+'</div>\
10916						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_07_'+LANG+'.jpg">\
10917					</div>\
10918					<hr class="line">\
10919					<div id="step3">\
10920						<h3>'+$.lang[LANG]['manager.cert.guide.step.3.title']+'</h3>\
10921						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.1']+'</h4>\
10922						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-1']+'</p>\
10923						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-2']+'</div>\
10924						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_08_'+LANG+'.jpg">\
10925						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-3']+'</div>\
10926						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_09_'+LANG+'.jpg">\
10927						<div class="step3-step text-left"><span>
10927STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-4']+'</div>\
10928						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_10_'+LANG+'.jpg">\
10929						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.1-5']+'</div>\
10930						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_11_'+LANG+'.jpg">\
10931						\
10932						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.2']+'</h4>\
10933						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-1']+'</p>\
10934						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-2']+'</div>\
10935						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_12_'+LANG+'.jpg">\
10936						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-3']+'</div>\
10937						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_13_'+LANG+'.jpg">\
10938						<div class="step3-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-4']+'</div>\
10939						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_14_'+LANG+'.jpg">\
10940						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.2-5']+'</div>\
10941						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_15_'+LANG+'.jpg">\
10942						\
10943						<h4 class="text-left">'+$.lang[LANG]['manager.cert.guide.step.3.sub.title.3']+'</h4>\
10944						<p>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-1']+'</p>\
10945						<div class="step3-step text-left"><span>STEP 01.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-2']+'</div>\
10946						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_16_'+LANG+'.jpg">\
10947						<div class="step3-step text-left"><span>STEP 02.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-3']+'</div>\
10948						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_17_'+LANG+'.jpg">\
10949						<div class="step3-step text-left"><span>STEP 03.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-4']+'</div>\
10950						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_18_'+LANG+'.jpg">\
10951						<div class="step3-step text-left"><span>STEP 04.</span>'+$.lang[LANG]['manager.cert.guide.step.3.txt.3-5']+'</div>\
10952						<img class="img-responsive" src="//storage.googleapis.com/i.addblock.net/member/cert_guide/'+LANG+'/verification_guide_19_'+LANG+'.jpg">\
10953					</div>\
10954				</div>\
10955				<div class="modal-footer guideClose">\
10956					<button type="button" class="btn btn-default btn-sm close-button-dialog clostbtnfalse" data-dismiss="modal">'+$.lang[LANG]['config.close']+'</button>\
10957				</div>\
10958			</div>\
10959			';
10960
10961	var certApplyGuideModal = $(this).showModalFlat('',str,true,false,'','close','','guidePopup cl-cmmodal cl-s-btn cover w700 cert-guide-modal', false ,'',function() {
10962		$(window).resize(function () {
10963			var mobile = (window.innerWidth<768) ? 'm.' : '';
10964
10965			$('.cert-guide-modal .guide-menu li').each(function(i) {
10966				$(this).find('p').html($.lang[LANG]['manager.cert.guide.step.'+mobile+i]);
10967			});
10968		});
10969		$.guidePopup.scrollevent();
10970	});
10971}

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.