PageSourceSearch

https://huegang.com/js/render.1790659391.js

js huegang.com collected 2026-10-05 04:49:05 UTC 591,247 bytes, 13,675 lines download raw bytes

1var isAosBlock = false;
2var isgalleryView = false;
3var pageLoad = true;
4var menuClickMove = false;
5
6function parseShoppingGradeSettings(settings) {
7	if (!settings) return {};
8	if (typeof settings === 'object') return settings;
9	if (typeof settings === 'string') {
10		try {
11			return JSON.parse(settings);
12		} catch (e) {
13			return {};
14		}
15	}
16	return {};
17}
18
19function normalizeShoppingGradeChmod(chmod) {
20	if (typeof chmod === 'string') {
21		try {
22			chmod = JSON.parse(chmod);
23		} catch (e) {
24			chmod = chmod ? chmod.split(',') : [];
25		}
26	}
27	return $.isArray(chmod) ? $.map(chmod, function(v) { return String(v); }) : [];
28}
29
30function isShoppingGradeAdminMember(member) {
31	return member && (member.check_adm == 1 || member.check_uadm == 1);
32}
33
34function isShoppingGradeBlocked(product, blockSettings, property) {
35	var isAdmin = isShoppingGradeAdminMember(property && property.UMEMBER ? property.UMEMBER : null) || isShoppingGradeAdminPreview();
36	var isShoppingGradePlan = property && property.VALIDPLAN && property.VALIDTYPE == 'SM';
37	var settings = parseShoppingGradeSettings(blockSettings);
38	var parentSettings = parseShoppingGradeSettings(product && product.parent_elsettings);
39	var blockMemberOnly = settings.member_only == 'ON';
40	var parentMemberOnly = parentSettings.member_only == 'ON';
41	var chmod = [];
42	var userGrades = [];
43
44	if (blockMemberOnly) chmod = chmod.concat(normalizeShoppingGradeChmod(settings.gallery_page_chmod));
45	if (parentMemberOnly) chmod = chmod.concat(normalizeShoppingGradeChmod(parentSettings.gallery_page_chmod));
46	chmod = $.map(chmod, function(v) { return String(v); });
47
48	if (property && property.UMGRADE) {
49		if (typeof property.UMGRADE.seq != 'undefined' && property.UMGRADE.seq !== null) userGrades.push(String(property.UMGRADE.seq));
50		if (typeof property.UMGRADE.grade_id != 'undefined' && property.UMGRADE.grade_id !== null) userGrades.push(String(property.UMGRADE.grade_id));
51	}
52
53	if (isAdmin) return false;
54	if (!isShoppingGradePlan) return false;
55	if (product && product.shopping_grade_hidden == 'ON') return true;
56	if (!chmod.length) return false;
57
58	for (var i = 0; i < userGrades.length; i++) {
59		if ($.inArray(userGrades[i], chmod) > -1) return false;
60	}
61
62	return true;
63}
64
65function getShoppingGradeBlockedMessage(product) {
66	var msg = product && product.shopping_grade_hidden_msg ? product.shopping_grade_hidden_msg : '해당 등급 고객 전용 상품입니다.';
67	return normalizeShoppingGradeBlockedMessage(msg);
68}
69
70function normalizeShoppingGradeBlockedMessage(msg) {
71	if (!msg) return '해당 등급 고객 전용 상품입니다.';
72	msg = msg.replace(/,\s*/g, ' ');
73	return msg;
74}
75
76function isShoppingGradeEditorPreview() {
77	return property
78		&& property.PUBLISH === false
79		&& property.LOAD === 'RENDER'
80		&& property.VALIDTYPE === 'SM';
81}
82
83function isShoppingGradeAdminPreview() {
84	return isShoppingGradeEditorPreview()
85		&& property.UMEMBER
86		&& isShoppingGradeAdminMember(property.UMEMBER);
87}
88
89function hasShoppingGradeDiscount(grade) {
90	return grade && String(grade.discount_use) == '1' && Number(grade.discount_value || 0) > 0;
91}
92
93function getBestShoppingGradePreviewDiscountGrade(grades) {
94	var rateGrade = null,
95		rateValue = null,
96		fixedGrade = null,
97		fixedValue = null;
98
99	$.each(grades || [], function(i, grade) {
100		if(!hasShoppingGradeDiscount(grade)) return true;
101
102		var discountValue = Number(grade.discount_value || 0);
103		if(String(grade.discount_type) == '0') {
104			if(rateValue === null || discountValue > rateValue) {
105				rateValue = discountValue;
106				rateGrade = grade;
107			}
108		} else if(fixedValue === null || discountValue > fixedValue) {
109			fixedValue = discountValue;
110			fixedGrade = grade;
111		}
112	});
113
114	var selectedGrade = rateGrade || fixedGrade;
115	if(!selectedGrade) return null;
116
117	selectedGrade = $.extend({}, selectedGrade);
118	selectedGrade.__preview_ignore_min = 'Y';
119	return selectedGrade;
120}
121
122function getShoppingGradePreviewDiscountGrade(fallbackGrade) {
123	if (hasShoppingGradeDiscount(property && property.UMGRADE ? property.UMGRADE : null)) return property.UMGRADE;
124	if (!isShoppingGradeAdminPreview()) {
125		return (!$.isArray(fallbackGrade) && hasShoppingGradeDiscount(fallbackGrade)) ? fallbackGrade : null;
126	}
127
128	if ($.isArray(fallbackGrade)) {
129		return getBestShoppingGradePreviewDiscountGrade(fallbackGrade);
130	}
131
132	return hasShoppingGradeDiscount(fallbackGrade) ? $.extend({}, fallbackGrade, {__preview_ignore_min:'Y'}) : null;
133}
134
135function getShoppingGradeProductGradeOnOff(product) {
136	if(!product) return 'OFF';
137	if(typeof product.grade_onoff != 'undefined' && product.grade_onoff !== null && product.grade_onoff !== '') {
138		return product.grade_onoff == 'ON' ? 'ON' : 'OFF';
139	}
140
141	var settings = parseShoppingGradeSettings(product.gsettings);
142	return (typeof settings.grade_onoff != 'undefined' && settings.grade_onoff == 'ON') ? 'ON' : 'OFF';
143}
144
145function isShoppingGradeProductGradePriceEnabled(product) {
146	return getShoppingGradeProductGradeOnOff(product) == 'ON';
147}
148
149function calcShoppingGradeDisplayPrice(price, grade) {
150	if (!hasShoppingGradeDiscount(grade) || price <= 0) return null;
151	if (grade.__preview_ignore_min != 'Y' && price < Number(grade.discount_amount || 0)) return null;
152
153	var discountAmount = 0;
154	if (String(grade.discount_type) === '0') {
155		discountAmount = Math.floor(price * (Number(grade.discount_value || 0) / 100));
156		if (Number(grade.discount_max || 0) > 0 && discountAmount > Number(grade.discount_max || 0)) {
157			discountAmount = Number(grade.discount_max || 0);
158		}
159	} else {
160		discountAmount = Number(grade.discount_value || 0);
161	}
162
163	var gradePrice = price - discountAmount;
164	if (gradePrice < 0) gradePrice = 0;
165	return (discountAmount > 0 && gradePrice < price) ? gradePrice : null;
166}
167
168function isShoppingGradePriceHidden(item) {
169	return item && item.price_hidden == 'ON' && !isShoppingGradeAdminPreview();
170}
171
172var RENDER = {
173    init: function (property) {
174		var History = window.History; 
175		var b = property,
176			URI = (b.PUBLISH) ? '/' : '/render',
177			param = (b.PUBLISH) ? '/publish/true' : '',
178			selectEL = '',
179			galleryEL = new Object();
180		var CERT_USERID = '';
181		
182			this.b = b;
183			this.b.pageContent = {};
184			this.b.pageContent[b.PAGE] = b.INITPAGE;
185			this.b.pageConf = {};
186			this.b.pageConf[b.PAGE] = b.PAGECONF || {
187				islock: b.ISLOCK,
188				overlay: b.HEADER,
189				pageScript: '',
190				meta: null,
191				og_others: null
192			};
193			this.b.pageBlocksType = {};
194			this.b.URL = URI;
195			this.b.param = param;
196			this.history = window.History;
197			this.b.MENULIST = [];
198			this.galleryEL = galleryEL;
199			this.b.certOpenChk = false;
200			_this = this;
201
202			var applyPageConf = function(data) {
203				if(!data) return true;
204				if(typeof data.url != 'undefined' && data.url) {
205					location.href = data.url;
206					return false;
207				}
208
209				if(typeof data.islock != 'undefined') b.ISLOCK = data.islock;
210				if(typeof data.overlay != 'undefined') b.HEADER = (data.overlay) ? true : false;
211
212				var isSidebar = $('.el-menu > header').hasClass('sidebar');
213				var isHeaderOldVer = !$.clnav.check();
214				if(isHeaderOldVer) {
215					if(b.HEADER && !b.VIEW && !isSidebar) {
216						$('.header-empty').css('height',0);
217						$('.header.el-menu').removeClass('fixed');
218						$('header.navbar').addClass('transparent');
219					} else {
220						$('header.navbar').removeClass('transparent');
221					}
222				}
223
224				if(typeof data.pageScript != 'undefined') {
225					$('#pageScript').remove();
226					if(data.pageScript) $('body').append(data.pageScript);
227				}
228				if(data.meta != null) {
229					$.each(data.meta, function(k,v) {
230						$('meta[name="' + k + '"]').attr('content',v);
231						if(k == 'title') {
232							$(document).prop('title', htmlspecialchars_decode(v));
233						}
234					});
235				}
236				if(data.og_others != null) {
237					$.each(data.og_others, function(ok,ov) {
238						var og_property = ok.replace(/\_\_/gi,':');
239						if(ov != '') {
240							if($('meta[property="' + og_property + '"]').length > 0) $('meta[property="' + og_property + '"]').attr('content',ov);
241							else $('meta[property^="og:"]').eq($('meta[property^="og:"]').length - 1).after('<meta property="' + og_property + '" content="' + ov + '" data-dynamic="true"/>');
242						} else {
243							if($('meta[property="' + og_property + '"]').length > 0) $('meta[property="' + og_property + '"]').remove();
244						}
245					});
246				}
247
248				return true;
249			};
250
251			var getPageContentsUrl = function(page) {
252				var contentsParam = param;
253				contentsParam = (page == 'index,template' && contentsParam.indexOf('/org/') == -1) ? contentsParam + '/org/' + page : contentsParam;
254				contentsParam = (b.PUBLISH) ? contentsParam : contentsParam + '/render/true';
255				return '/template/contents/sid/' + b.SID + '/page/' + encodeURIComponent(page) + contentsParam;
256			};
257
258			var isRenderFormSubmitAllowed = function() {
259				if(window.location.pathname.match(/^\/render(\/|$)/) === null) return true;
260				return (b.PREVIEW_FORM_SUBMIT === true || b.PREVIEW_FORM_SUBMIT === 'true');
261			};
262
263			var cachePageContentsResult = function(page, data) {
264				if(!data) return;
265				if(data.conf) b.pageConf[page] = data.conf;
266				if(typeof data.blocks_type != 'undefined') b.pageBlocksType[page] = data.blocks_type;
267				if(typeof data.contents != 'undefined' && page != 'index,template') b.pageContent[page] = data.contents;
268				if(data.initContent !== undefined) property.INITPAGE = JSON.parse(data.initContent);
269			};
270
271			var loadPageMoveConf = function(page, isForumView) {
272				var deferred = $.Deferred();
273				if(b.pageConf.hasOwnProperty(page)) {
274					deferred.resolve(b.pageConf[page]);
275					return deferred.promise();
276				}
277
278				if(!isForumView) {
279					$.ajax({
280						url: getPageContentsUrl(page),
281						data: { siteum: b.SITEUM },
282						dataType: 'json',
283						type: 'GET',
284						async: true,
285						cache: false,
286						success: function(data) {
287							if(typeof data.url != 'undefined' && data.url) {
288								deferred.resolve(data);
289								return false;
290							}
291							if(typeof data.error != 'undefined' && data.error) {
292								deferred.resolve({});
293								return false;
294							}
295
296							cachePageContentsResult(page, data);
297							deferred.resolve(data.conf || {});
298						},
299						error: function() {
300							deferred.reject();
301						}
302					});
303				} else {
304					$.ajax({
305						url: '/template/conf',
306						data: { sid : b.SID, page : page, publish : b.PUBLISH, siteum : b.SITEUM },
307						dataType: 'json',
308						type: 'POST',
309						async: true,
310						cache: false,
311						success: function(data) {
312							if(!(typeof data.url != 'undefined' && data.url)) b.pageConf[page] = data;
313							deferred.resolve(data);
314						},
315						error: function() {
316							deferred.reject();
317						}
318					});
319				}
320
321				return deferred.promise();
322			};
323    	$(window).ready(function() {
324    		if(b.VALIDPLAN && $.inArray(b.VALIDTYPE, ['BN','SM']) > -1 && (b.CERT_USE == 'Y' || b.CERT_USE == 'A')) {
325    			if(b.CERT_USE == 'Y') {
326    				if(b.UMEMBER.check_login == true) isUserCertified(history);
327    			} else {
328    				isUserCertified(history);
329    			}
330    		}	
331
332    		if(!b.VALIDPLAN && b.CERT_USE == 'A') {
333    			isUserCertified(history);
334    		}
335
336			var checkIOS = ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1) || (navigator.userAgent.indexOf('iPad') != -1)) ? true : false;
337			if(checkIOS) $('body').addClass('ios-bg-attachment-scroll');
338    	
339	        (function(window){
340	            var History = window.History;
341	            if ( !History.enabled ) {
342	                return false;
343	            }
344
345	            History.Adapter.bind(window,'statechange',function(){
346					$('.error_404.new_design').remove();
347
348	                var State = History.getState(),
349	                	cUrl = new getLocation(State.url),
350	                	loc = cUrl.pathname,
351	                	uri = (b.PUBLISH) ? loc.replace(/^\//,'').replace(/\/$/,'') : loc.replace(/\/*(render)\/*/,''),
352	                	uri = uri.replace('/view/',','),
353	                	s = uri.split(','),							
354	                	bookmark = '';
355						
356						if (b && b.MODOO === true) {
357								const inSubmenu = Array.isArray(b.SMENU) &&
358								b.SMENU.some(menu =>
359									Array.isArray(menu.children) &&
360									menu.children.some(child =>
361									child.name.replace(/ /g, "-") === decodeURI(uri)
362									)
363								);
364								if (inSubmenu) {
365									//console.log('현재 페이지 서브메뉴 존재');
366									$('.cl-nav-section.sub').show();
367								} else {
368									//console.log('현재 페이지 서브메뉴 없음');
369									$('.cl-nav-section.sub').hide();
370								}
371						}
372
373					if(uri.match(/^(psearch|\_checkout|\_forgot|\_mypayment|\_lang)\//gi) !== null) {
374	                	location.href = '/'+uri;
375	                	return false;
376	                }
377
378					if(uri.match(/^_product\//gi) !== null) {
379						uri = (b.PUBLISH) ? uri : 'render/' + uri;
380						location.href = '/'+uri;
381						return false;
382					}
383					// naverLogCallback(function() {
384					// 	if("naver_log" in b.SETTINGS) {
385					// 		if (!wcs_add) var wcs_add={};
386					// 		wcs_add["wa"] = b.SETTINGS.naver_log;
387					// 		if (!_nasa) var _nasa={};
388					// 		wcs_do(_nasa);
389					// 	}
390					// });
391	                if($('.cl-flat-modal').length > 0) $('.cl-flat-modal .modal').modal('hide');
392
393	                if(uri == b.URL || uri == '') {
394	                	uri = (b.ONE) ? 'index' : b.MENULINK[0];
395	                }
396
397	                (typeof s[1] != 'undefined') ? b.VIEW = s[1] : b.VIEW = '';
398	                b.PAGE = decodeURI(uri);
399	                if(b.PAGE.indexOf('@')>-1) {
400	                	var tmp = b.PAGE.split('@');
401	                	b.PAGE = tmp[0];
402	                	bookmark = tmp[1];
403	                }
404
405	                if((b.PAGE).indexOf(',')>-1) {
406	                	var tmp = b.PAGE.split(',');
407	                	b.VIEW = tmp[1];
408	                }
409					
410					$('.el-footer').css('visibility', 'hidden');
411					$.processON();
412					
413			    	getParent(s[0],b.VIEW,b.PAGE);
414					var pageMove = true;
415						
416			    	if(b.VIEW && s[0] != 'forum' && s[0] != 'psearch' && b.COUNT == 0 && !b.PUBLISH) {
417			    		$(this).showModalFlat('INFORMATION','Page not found',true,false,'','ok');
418			    		History.back();
419			    		pageMove = false;
420			    	}
421			    	if(pageMove) {
422						clearDsgnbody();
423			    		pageLoad = true;
424			    		var is_templates = checkTemplateSite(b.SID),
425							menuVer06 = ($('.el-menu .cl-menu-option').length > 0) ? true : false;
426
427			    		var menu_name = (b.VIEW) ? b.PAGE.split(',') : [b.PAGE],
428			    			tmp_url = (is_templates || b.PUBLISH === false) ? '/render' : '',
429							tmp_href = 'a[href="'+tmp_url+'/' + menu_name[0]+'"]',
430			    			pagemenu_link = '#tpl-menu.nav li '+tmp_href;
431
432			    		if(!$(pagemenu_link).parent().hasClass('active')) {
433			              	$('#tpl-menu li').removeClass('active').removeClass('open');
434
435			              	$(pagemenu_link).parent().addClass('active');
436			              	if($(pagemenu_link).closest('.dropdown-menu').length>0) {
437			                  	if($('body').width() > 768) {
438			                  		$(pagemenu_link).closest('.dropdown').addClass('active');
439			                  	} else {
440			                  		$(pagemenu_link).closest('.dropdown').addClass('open');
441			                  	}
442			              	} else {
443			                	if($('.el-menu > header').hasClass('navbar-fheader')) $('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
444				                else {
445				                  if($('body').width() <= 768) $('#tpl-menu li.dropdown ul.dropdown-menu').hide();
446				                }
447			              	}
448			            }
449
450						if(menuVer06) {
451							$('.el-menu .cl-moption-row').removeClass('active');
452							$('.el-menu .cl-moption-row '+tmp_href).closest('.cl-moption-row').addClass('active');
453							if($('.el-menu .cl-moption-row '+tmp_href).closest('.cl-moption-row[data-parent]').length > 0) $('.el-menu .cl-moption-row '+tmp_href).closest('.cl-moption-col').find('.cl-moption-row:not([data-parent])').addClass('active');
454
455							$('#mobile-nav li.menu-has-children').removeClass('open');
456							$('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
457							$('#mobile-nav '+tmp_href).closest('li.menu-has-children').addClass('open');
458							$('#mobile-nav '+tmp_href).closest(' ul.dropdown-menu').show();
459						}
460
461
462			            if($('.shopping-more-wrap').length > 0) $('.shopping-more-wrap').remove();
463			            // console.log('pageMove', $.cookie('prev-forum-view'));
464			            if(s[0] != 'forum' && $.cookie('prev-forum-view') === undefined) {
465			            	// console.log('forum cookie');
466			            	$.each(document.cookie.split(';'), function(index, cookie) {
467								var name = cookie.split('=')[0].trim();
468								if (name.indexOf('forum_') === 0) {
469					                $.removeCookie(name, {path:'/'})
470									// document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
471								}
472							});
473				            }
474				            $.removeCookie('prev-forum-view', {path:'/'});
475							var continuePageDraw = function() {
476									$('body').find('.galProjectCss').remove();
477									if($('.popup').length) $('.popup').remove(); //clear Popup;
478									if(b.SETTINGS.noError404 === true && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) { // page move
479									window.location.href = '/';
480									return false;
481								}
482								showPageCallback(showPage, function() {
483									var pgmove_vMode = (typeof $('.mobilepc_ch').attr('data-desktop-option')!='undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : '';
484									pgmove_vMode = $.mpcWeb.mpcGetVpmode(pgmove_vMode,b.SETTINGS);
485									if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
486										if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) $.mpcWeb.mpcWebhtml(pgmove_vMode,b.pageContent[b.PAGE],b.SETTINGS.zoom,'pagemove');
487									}
488
489									setTimeout(function() {
490										if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
491											if(b.ONE && !b.VIEW || (b.PAGE == b.MENULINK[0]) && !b.VIEW) setSitePopup();
492											$.siteBanner.init(true,true);
493										}
494
495										if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
496											if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
497												$.fnav.draw(b.SETTINGS.fnav);
498											}
499											if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
500												var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
501												if(!(b.PARENT.page != null && (quick_type=='mobile'))) {
502													$.quickmenu.init(b.SID, b.PUBLISH,quick_type);
503													mobileWebQuickmenuPosition(b,quick_type);
504												} else {
505													$(`.quick-menu-${b.SID}`).remove();
506												}
507											}
508										}
509										if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
510											if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
511												mobileWebfnavCheck(pgmove_vMode);
512											}
513										}
514										
515										// 원페이지, 갤러리 상세페이지에서 메뉴 클릭 시 페이지 이동 후 해당 메뉴로 이동하지 않고 상단 고정 Issue Fix (https://flow.team/l/1x7rX)
516										if(typeof b.SID != 'undefined' && b.SID && b.SID == 'ronixinc') {
517											if(location.hash) {
518												var hash = decodeURIComponent(location.hash.substring(1));  
519												console.log('해시 감지:', hash);
520												
521												setTimeout(function() {
522													var $block = $('.link-to-' + hash);
523													
524													if($block.length > 0) {
525														var blockTop = $block.offset().top;
526														var currentScroll = $(window).scrollTop();
527														var threshold = 100;
528														
529														if(Math.abs(blockTop - currentScroll) > threshold) {
530															console.log('스크롤 필요:', {current: currentScroll, target: blockTop});
531															moveLinkPage(hash);
532														} else {
533															console.log('이미 근처에 있음, 스크롤 생략');
534														}
535													} else {
536														console.error('블록 없음:', '.link-to-' + hash);
537													}
538												}, 500);
539											}
540										}
541
542									}, 500);
543								});
544
545								if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
546									setTimeout(function() {
547										moveGallery($.cookie('gallery-item'));
548									},500);
549								} else if(typeof $.cookie('gallery') != 'undefined' && b.VIEW == '') {
550									setTimeout(function() {
551										moveGallery($.cookie('gallery'));
552									},500);
553								} else if(typeof $.cookie('forum-item') != 'undefined' && b.VIEW == '') {
554									// console.log('fm_view', $.cookie('forum_content_view'));
555									setTimeout(function() {
556										if(typeof $.cookie('forum_content_view') != 'undefined'){
557											var fm_view = $.cookie('forum_content_view');
558											var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
559											var pid = (fv)? fv[0]:'';
560											var row_id = (fv)? fv[1]:'';
561
562											scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
563											$.removeCookie('forum-item', { path: '/' });
564											
565											$('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
566											// $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
567										} else {
568											scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
569											$.removeCookie('forum-item', { path: '/' });
570										}
571									}, 500);
572								} else {
573									var url = window.location;
574									setTimeout(function() {
575										moveScroll(0,url.href);
576									},300);
577								}
578								if(typeof b.SETTINGS.google != 'undefined' && b.SETTINGS.google.length > 0) {
579									var https_check = (location.protocol=='https:') ? 'https:' : 'http:',
580										host_url = b.URL +  b.PAGE;
581
582									host_url = (b.PARENT && b.PARENT.mode=='project') ? (host_url.replace(/,/g,"/view/")) : host_url;  
583
584									if(b.SETTINGS.google.indexOf('UA-') > -1) ga('send', 'pageview', location.pathname);
585									else if(b.SETTINGS.google.indexOf('G-') > -1) {
586										gtag('config', b.SETTINGS.google, {
587											page_title: b.TITLE,
588											page_location: https_check + '//'+ b.HOST + host_url,
589											page_path: host_url
590										});
591									}
592									//else gtag('config', b.SETTINGS.google , {page_path : location.pathname});
593									//console.log(https_check + '//'+ b.HOST + host_url);
594									// console.log('google analytics send, pageview');
595								}
596								if(typeof b.SETTINGS.npay_setting != 'undefined' && b.SETTINGS.npay_setting.onoff == true && b.SETTINGS.npay_setting.naver_log.length > 0) {
597									wcs_do();
598									// console.log('naverpay log');
599								} else {
600									if(typeof b.SETTINGS.naver_log != 'undefined' && b.SETTINGS.naver_log.length > 0) {
601										wcs.inflow();
602										wcs_do(_nasa);
603										// console.log('naver analytics send, pageview');
604									}
605								}
606								if(typeof b.SETTINGS.gtag_event != 'undefined' && typeof b.SETTINGS.gtag_event.page != 'undefined' && b.SETTINGS.gtag_event.page.length > 0) {
607									if(typeof b.SETTINGS.gtag_event.type != 'undefined' && b.SETTINGS.gtag_event.type == 'event' && b.SETTINGS.gtag_event.page == b.PAGE) {
608										// console.log(b.SETTINGS.gtag_event);
609										var v0 = b.SETTINGS.gtag_event.val[0],
610											v1 = b.SETTINGS.gtag_event.val[1],
611											v2 = b.SETTINGS.gtag_event.val[2];
612
613										gtag(b.SETTINGS.gtag_event.type,v0,{v1:v2});
614										// gtag(b.SETTINGS.gtag_event.type, b.SETTINGS.gtag_event.val[0], { b.SETTINGS.gtag_event.val[1] : b.SETTINGS.gtag_event.val[2] });
615									}
616								
617								}
618
619								// menu ver3 : fheader
620								setTimeout(function() {
621									if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
622								},400);
623
624
625								// favicon refresh
626								var favicon = b.RESOURCE + '/' + b.SID + '/' + b.SID + '-favicon.ico?_' + new Date().getTime();
627								changeFavicon(favicon);
628
629									if(typeof pageMoveCallback == 'function') pageMoveCallback();
630									formTranslate(LANG);
631
632								};
633
634							loadPageMoveConf(b.PAGE, (s[0] == 'forum' && b.VIEW)).done(function(data) {
635								if(applyPageConf(data) === false) return false;
636								continuePageDraw();
637							}).fail(function() {
638								$.processOFF();
639							});
640							}
641		            });
642
643				History.Adapter.bind(window, 'popstate', function() { // history.js suggests statechange but it has a bug with urls with hashes not firing statechange
644	                var State = History.getState(),
645	                	cUrl = new getLocation(State.url),
646	                	bUrl = new getLocation(window.location.href);
647
648	                if(b.ONE) {
649	                	if(cUrl.href!=window.location.href) {
650	                		if(b.PAGE!='index') {
651	                			var link = (!b.PUBLISH) ? '/render/index' : bUrl.pathname;
652								var url = new getLocation(link);
653					        	golink(_this,url);
654								history.pushState('', '', link + bUrl.hash);
655	                		} else {
656	                			// if(bUrl.hash) {
657	                			// 	var go = (bUrl.hash).replace('#','');
658	                			// 	moveLinkPage(go);
659	                			// }
660	                		}
661	                	}
662	                }
663				});
664
665	        })(window);
666
667		    $('.dsgn-body').addClass('mode-render');
668	    	//$.modalON();
669
670			if(typeof b.SETTINGS == 'undefined') return;
671			// if(typeof b.SETTINGS.rightClick == 'undefined' || b.SETTINGS.rightClick === false) return;
672			if(!b.VALIDTYPE || b.VALIDTYPE == 'PK' || typeof b.SETTINGS.rightClick == 'undefined' || b.SETTINGS.rightClick === false) {
673				b.SETTINGS.rightClick = false;
674				return;
675			}
676		    $('body').on('contextmenu', function(event){ return false; });
677			$('body').on('selectstart', '.element, .forum-view, .comment-list', function(event){ return false; });
678	    	$('body').on('dragstart', '.element, .forum-view, .comment-list',  function(event){ return false; });
679
680	    	// MutationObserver의 콜백 함수 정의
681			const observerCallback = function(mutationsList) {
682			  	for (const mutation of mutationsList) {
683			    	if (mutation.type === 'childList') {
684			      		// DOM 변화가 감지되면 AOS.refresh 호출
685			      		AOS.refresh();
686			    	}
687			  	}
688			};
689			// MutationObserver 인스턴스 생성
690			const observer = new MutationObserver(observerCallback);
691			// 관찰할 옵션 정의
692			const config = { 
693			  	childList: true, 
694			  	subtree: true
695			};
696			// 감지할 요소 선택
697			const targetNode = document.querySelector('.dsgn-body');
698			if (targetNode) {
699			  	observer.observe(targetNode, config);
700			}
701	    });
702
703		Pace.on('done', function() {
704			/*shopping more create*/
705			if($('.shopping-wrap').length && $('.shopping-wrap').height() >= 800 && $('.shopping-more').length == 0) {
706				var more_txt = (LANG == 'ko') ? '상품정보 더보기' : 'MORE';
707				var review_chk = ($('.cl-s-product-review').length > 0) ? true : false,
708					qna_chk = ($('.cl-s-product-qna').length > 0) ? true : false;
709				var colorSet = shopping_more_color,
710					sm_font = (!colorSet) ? '' : colorSet.color,
711					sm_bgColor = (!colorSet) ? '' : colorSet.background_color,
712					sm_border = (!colorSet) ? '' : colorSet.border_color;
713				$('.shopping-wrap').css('max-height','800px')
714								   .css('overflow','hidden')
715								   .after('<div class="shopping-more-wrap"><div class="shopping-more">'+more_txt+'</div></div>');
716				$('.shopping-wrap').removeClass('open');
717				if(sm_font) $('.shopping-more').css('color',sm_font);
718				if(sm_bgColor) $('.shopping-more').css('background-color',sm_bgColor);
719				if(sm_border) $('.shopping-more').css('border-color',sm_border);
720				if(!review_chk && !qna_chk) $('.shopping-more-wrap').css('padding-bottom','100px');
721			}
722			
723			var header_h = $('header').outerHeight();
724			var menu_logo = $('.menu-logo-top');
725			var menu_logo_h = (menu_logo.length > 0) ? menu_logo.outerHeight() : 0;
726			$('.dsgn-body')[0].style.setProperty('--menu-logo-height', menu_logo_h+'px');
727			$('.dsgn-body')[0].style.setProperty('--header-height', header_h+'px');
728
729			setTimeout(function() { 
730				$('body').removeClass('pace-disable'); 
731			},500);
732			if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
733				moveGallery($.cookie('gallery-item'));
734			}
735			$.modalOFF();
736			if(!property.ONE) {
737				moveScroll(0);
738			} else {
739				// onepage index movescroll
740				if(b.PAGE=='index' && b.MODE == 'publish' && !menuClickMove) {
741					var bUrl = new getLocation(window.location.href),
742						moveId = (bUrl.pathname).replace('/','');
743					if(moveId != 'index') moveLinkPage(moveId);
744				}
745			}
746
747			$.each($('.element'), function(k,v) {
748				var checkNotSupported = false,
749					not_supported_mode = '',
750					check_video_version = true,
751					bg_vid_gfyposter = (typeof $(this).find('.bgvid source.display').attr('src') != 'undefined') ? $(this).find('.bgvid source.display').attr('src') : '',
752					vid_regex = /gfycat\.com/gi;
753			
754				if($(this).attr('data-type') == 'video' && typeof $(this).attr('data-playtype') == 'undefined' && (vid_regex.test(bg_vid_gfyposter))) {
755					check_video_version = false;
756					checkNotSupported = true;
757					not_supported_mode = $(this).attr('data-type'),
758					el_seq = $(this).attr('data-id');
759				
760					if(checkNotSupported) {
761						var upgrade_check = (!check_video_version) ? false : true;
762						$.notSupported.set(property.SID, el_seq, not_supported_mode, upgrade_check);
763					}
764				}
765			});
766
767		});
768
769		// naverLogCallback(function() {
770		// 	if("naver_log" in b.SETTINGS) {
771		// 		if (!wcs_add) var wcs_add={};
772		// 		wcs_add["wa"] = b.SETTINGS.naver_log;
773		// 		if (!_nasa) var _nasa={};
774		// 		wcs_do(_nasa);
775		// 	}
776		// });
777		
778		if(typeof pageMoveCallback == 'function') pageMoveCallback();
779		formTranslate(LANG);
780
781	    $('.dsgn-body').addClass('mode-render');
782
783		var is_templates = (typeof property.SID != 'undefined') ? checkTemplateSite(property.SID) : false;
784
785		//갤러리 블럭에서 카테고리가 비었습니다 문구가 영문 템플릿에서 한글로 나오는 이슈로 아래 코드 추가, 문제 시 삭제 or 위치변경
786		if(is_templates && property.SID.indexOf('_en') > -1) LANG = 'en';
787
788	    if(property.VALIDPLAN || is_templates) {
789			$('body,.dsgn-body').removeClass('with-creatorlink');
790	    } else {
791	    	$('body,.dsgn-body').addClass('with-creatorlink');
792	    }
793	    // $('button.navbar-toggle').addClass('hide');
794    	// (b.WRAP) ? $('.dsgn-body').addClass('tiny') : $('.dsgn-body').removeClass('tiny');
795
796		var $tag = $('header');
797
798		// 중복된 .header.el-menu 래퍼가 이미 존재하는지 확인
799		var $parent = $tag.parent();
800		if ($parent.is('.header.el-menu')) {
801			// 이미 header를 감싸고 있는데 또 .header.el-menu가 감싸고 있다면, 외부 .header.el-menu 제거
802			if ($parent.parent().is('.header.el-menu')) {
803				$parent.unwrap();
804			}
805		} else {
806			// 감싸는 div가 없을 경우만 새로 감쌈
807			var _ready = (!$.isEmptyObject(property.SETTINGS.modoo || {})) ? '_ready' : '';
808			var _elmenu = $('<div>', {
809				'class': 'header el-menu ' + _ready,
810				'data-el': 'el-menu',
811				'data-id': 'menu',
812				'data-name': 'menu'
813			});
814			$tag.wrap(_elmenu);
815		}
816
817		if($tag.is('.cl-nav')) $('.dsgn-body').before($('.header.el-menu'));
818
819		changeBrokenImages($tag);
820
821		$tag.removeClass('tpl-menu');
822		if(b.ONE){
823			if(b.VIEW) $tag.find('#site-home').attr('href',URI).removeClass('mini-home');
824			else $tag.find('#site-home').attr('href','javascript:;').addClass('mini-home');
825		} else $tag.find('#site-home').attr('href',URI).removeClass('mini-home');
826
827
828		var isHeaderOldVer = !$.clnav.check();
829		var isSidebar = $tag.hasClass('sidebar');
830		var isSiteLock = b.SITELOCK;
831		if(isHeaderOldVer) {
832			if(isSidebar) {
833				$('.dsgn-body').addClass('sidebar');
834				$('.header.el-menu').addClass('sidebar');		
835			} else if(b.HEADER) {
836				$('header.navbar').addClass('transparent');
837			}
838
839			header_fixed = $('header.navbar').height();
840			if($('header.navbar').css('background-color')=='rgba(0, 0, 0, 0)'
841				&& $('header.navbar').css('background-image')=='none'
842			) {
843				$('header.navbar').css('background-color',$('dsgn-body').css('background-color'));
844			}
845		}
846
847
848		if(isSidebar) {
849			if($tag.hasClass('hide') && $('.dsgn-body').hasClass('sidebar'))
850				$('.dsgn-body').removeClass('sidebar');
851
852			// console.log(isSiteLock);
853			if(isSiteLock == 'true') {
854				$('.dsgn-body').addClass('site_lock');
855			} else {
856				$('.dsgn-body').removeClass('site_lock');
857			}
858		}
859		
860		// footer
861		$('.footer-' + b.SID).addClass('el-footer').addClass('element').attr('data-type','footer');
862
863	    $(window).on('scroll',function() {
864	    	if($('.dsgn-body').hasClass('mobile-nav-active')) return false;
865
866			if($(this).scrollTop() > 200) {
867				$('#goto-top').addClass('show');
868			} else {
869				$('#goto-top').removeClass('show');
870			}
871
872	        if($('.dsgn-body').hasClass('sidebar')==false) {
873	            fixedMenu();
874	        }
875
876	        if($(this).scrollTop() == 0 && $('header').hasClass('navbar-fheader')) {
877				setTimeout(function() { $.fheader.position(); }, 200);
878			}
879	        scrollspy();
880			
881	        //parallax();
882
883	    });
884
885		$(window).on('orientationchange',function(){
886			if($('.blueimp-gallery-display').length) {
887				var $slide = $('.blueimp-gallery .slides .slide'),
888					play = $('.blueimp-gallery-playing').length,
889					idx = 0;
890				$.each($slide, function(i,v) {
891		        	var trans = $(this).attr('style');
892		        	if(trans.indexOf('translate(0px, 0px)') > 0) {
893		        		idx = $(this).attr('data-index');
894		        	}
895				});
896
897				var gallery = $('.blueimp-gallery-display').attr('id');
898
899				$('#' + gallery + ' .close').click();
900				$.processON();
901				setTimeout(function() { 
902					$.processOFF() ; 
903					$('.gallery-item[data-index="' + idx + '"] a[data-gallery="#' + gallery + '"]').click(); 
904					$('.layout-grid').eq(idx).find('a[data-gallery="#' + gallery + '"]').click(); 
905					if(play) $('#' + gallery + ' .play-pause').click();
906				}, 1000);
907			}
908		});
909
910		var currentWindowWidth = $(window).width();
911		$(window).resize(function () {
912			$('.config-image-view').hide();
913			if($('body').width() <= 768 && $('.dsgn-body').hasClass('sidebar')) {
914				if($('header.navbar').hasClass('sidebar')) {
915					cssSidebar('off');
916				}
917				//$('.dsgn-body').removeClass('sidebar').addClass('removed-sidebar');
918			} else if ($('body').width() > 768 /*&& $('.dsgn-body').hasClass('removed-sidebar')*/) {
919				if($('header.navbar').hasClass('sidebar')) {
920					cssSidebar('on');
921				}
922				//$('.dsgn-body').removeClass('removed-sidebar').addClass('sidebar');
923				var top = ($('.creatorlink-header').length == 1) ? '55px' : '0px';
924				$('.el_0').css('margin-top',top);
925				if($('.header-empty').length > 0) $('.header-empty').remove();
926			}
927
928            if( $('.header-empty').length > 0 && $('.header-empty').height() != $('.el-menu').height() ) {
929            	$('.header-empty').css('height',$('.el-menu').height()+'px');
930            }
931
932			// menu ver3 : fheader
933			if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
934			
935	        if($('body').width() <= 768) {
936	            if($('#tpl-menu li.active.dropdown').length > 0) $('#tpl-menu li.active.dropdown').removeClass('active');
937	        } else {
938	            if($('#tpl-menu li.active').closest('ul').hasClass('dropdown-menu')) $('#tpl-menu li.active').closest('li.dropdown').addClass('active');
939	            $('#tpl-menu ul.dropdown-menu').removeAttr('style');
940	        }
941
942			if($('.element[data-type="video"] .lyoption[data-lyh]').length > 0) setLayoutHeight();
943
944	        var vpmode_opt = $('.mobilepc_ch').attr('data-desktop-option'),
945     	 	   	vpmode = vpmode_opt ? vpmode_opt : b.SETTINGS.viewportMode,
946         	    vpModeOnoff = (property.SETTINGS.vpMode_onoff === true) ? true : false,
947         	    checkFnav = ($('.fnav').length > 0 && vpmode=='mobile_web') ? true : false,
948         	    WebType = $.mpcWeb.mpcCheckWebType();
949
950	        if($('.fnav').length > 0) {
951	            if($('body').width() <= 480) {
952	            	if($('#cl-music-player-icon').length > 0) $('#goto-top,#cl-music-player-icon').addClass('movedOne');
953	            } 
954	        }
955
956	        if(vpModeOnoff && WebType == 'MOBILE') {
957				$.mpcWeb.mpcMusicandGoTop(checkFnav,vpmode);
958				var device_type = ($('body').width() > 768) ? 'pc' : 'mobile';
959				if(typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][device_type.toLowerCase()]!='bottom_default') {
960					var mpc_height = $('.mobilepc_ch').innerHeight(),
961						add_height = ($('#cl-music-player-icon').length > 0) ? 45 : 30;
962					$(`.quick-menu-${b.sid}.quickmenu`).css('bottom', mpc_height + add_height);	
963				}
964			}
965
966	        fixedMenu();
967	        scrollspy();
968			$('.element[data-type="video"], .element[data-type="others"]').each(function() {
969				resizeVideoIframe($(this));
970			});
971
972			//premium gallery setFixedscroll
973			if($('.element[data-feature*=fixedscroll]').length > 0) gjs01SetFixedscroll($('.element[data-feature*=fixedscroll]').eq(0));
974	        
975	        if($('.fr-view').length) {
976	            setForumWrap();
977	        }
978
979	        if($('.blueimp-gallery-display').length) {
980	            if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement) {
981	                return; 
982	            }
983
984		        var $slide = $('.blueimp-gallery .slides .slide'),
985		            play = $('.blueimp-gallery-playing').length,
986		            idx = 0;
987		        $.each($slide, function(i,v) {
988		            var trans = $(this).attr('style');
989		            if(trans.indexOf('translate(0px, 0px)') > 0) {
990		                idx = $(this).attr('data-index');
991		            }
992		        });
993
994		        var gallery = $('.blueimp-gallery-display').attr('id');
995
996		        $('#' + gallery + ' .close').click();
997		        $.processON();
998		        setTimeout(function() { 
999		            $.processOFF() ; 
1000		            $('.gallery-item[data-index="' + idx + '"] a[data-gallery="#' + gallery + '"]').click(); 
1001		            $('.layout-grid').eq(idx).find('a[data-gallery="#' + gallery + '"]').click(); 
1002		            if(play) $('#' + gallery + ' .play-pause').click();
1003		        }, 1000);
1004		    }
1005	        sitePopupResize();
1006
1007	        if($('.element[data-type="contact"][data-type2="franchise map"]').length > 0) {
1008	        	let newWidth = $(window).width();
1009	        	if (currentWindowWidth !== newWidth) {
1010			        $('.element[data-type="contact"][data-type2="franchise map"]').each(function(idx, v){
1011		        		var el = $(v);
1012		        		fmapMobilePaging(el);
1013		        	});
1014			    }
1015			    
1016			    currentWindowWidth = newWidth;
1017	        }
1018
1019			// if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
1020			// 	var device_type = ($('body').width() > 768) ? 'pc' : 'mobile';
1021			// 	alert('resize')
1022			// 	$.quickmenu.setHTML($.quickmenu['quickmenu'], device_type);
1023			// }
1024
1025			var header_h = $('header').outerHeight();
1026			$('.dsgn-body')[0].style.setProperty('--header-height', header_h+'px');
1027
1028	        var checkFixTypeMenu = (typeof $('header.navbar-fheader').attr('data-fixtype') != 'undefined' && $('header.navbar-fheader').attr('data-fixtype')) ? true : false;
1029			if(b.VALIDPLAN && checkFixTypeMenu) {
1030	            if(window.innerWidth < 769) {
1031		            $('header.navbar[data-fixtype]').find('.navbar-brand').css('line-height','');
1032		            return false;
1033		        }
1034				setTimeout(function(){
1035					setFixedMenuCss(false);
1036				},80);
1037	        }
1038			if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh();
1039	    });
1040	    this.liveUpdate(b.SMENU);
1041
1042	    var checkToggleShow = (!b.MENUCHECK.main && window.innerWidth > 768) ? false : true,
1043			loc_pathname = window.location.pathname,
1044	    	is_render = (loc_pathname.match(/^\/render/g)) ? true : false,
1045	    	is_templates = (typeof b.SID != 'undefined') ? checkTemplateSite(b.SID) : false;
1046	    // if(is_render && !is_templates) {
1047		// 	if(window.parent && window.parent != this && $('#previewmain', window.parent.document).length > 0) {
1048		// 		if($('#previewmain', window.parent.document).find('.preview-hand .active').is('#desktop, #tablet') && !b.MENUCHECK.main) checkToggleShow = false;
1049		// 	}
1050	    // }
1051	    // if(checkToggleShow) $('button.navbar-toggle').css('visibility','visible');
1052
1053		//cross-origin 오류수정
1054		if (is_render && !is_templates) {
1055			try {
1056				if (window.parent && window.parent !== window && $('#previewmain', window.parent.document).length > 0) {
1057					if ($('#previewmain', window.parent.document).find('.preview-hand .active').is('#desktop, #tablet') && !b.MENUCHECK.main) {
1058						checkToggleShow = false;
1059					}
1060				}
1061			} catch (e) {
1062				console.warn('parent document 접근 불가(cross-origin)', e);
1063			}
1064		}
1065
1066		if (checkToggleShow) {
1067			$('button.navbar-toggle').css('visibility', 'visible');
1068		}
1069
1070
1071		if(b.PAGE == 'psearch') $.psearch.view();
1072
1073		$('[data-imglink="true"][attr-link]').live('click',function(){
1074	    	if($(this).is('[attr-link=""]')) return false;
1075
1076		    var imgtarget = $(this).attr('data-target'),
1077		        imgshlink = $(this).attr('data-shlink'),
1078		        imgblank = $(this).attr('data-blank');
1079
1080		    if(imgblank == '_blank') {
1081		        var openNewWindow = window.open('about:blank');
1082		            openNewWindow.location.href=imgshlink; 
1083		    } else {
1084		        location.href=imgshlink;
1085		    }
1086		});
1087
1088		$('.menu-inner').on('scroll', function() {
1089	        $(this).next('.fh-line').show();
1090	        if($(this).scrollTop()==0) $(this).next('.fh-line').hide();
1091	    });
1092
1093	    $("#mobile-nav #tpl-menu").on('scroll', function() {
1094	       	$(this).next('.fh-line').show();
1095	       	if($(this).scrollTop()==0) $(this).next('.fh-line').hide();
1096	    });
1097
1098		$('.sitePopupTodayHide, .sitePopupClose').live({
1099			click: function() {
1100				if($(this).hasClass('sitePopupTodayHide')) $(this).find('input').click();
1101				var selectedPopup = $(this).closest('.modal-popup').attr('id');
1102				$('#' + selectedPopup).find('.popup-close').click();
1103			}
1104		});
1105
1106		$('.popup-close').live({
1107		    click: function() {
1108		        var selectedPopup = $(this).closest('.modal-popup').attr('id'),
1109		            idx = $(this).closest('.modal-popup').attr('data-idx'),
1110		            ptime = $(this).closest('.modal-popup').attr('data-time'),
1111		            isTodayHide = $(this).closest('.modal-popup').find('.sitePopupTodayHide input').prop('checked'),
1112		            date = new Date();
1113		            
1114		        var ptime_val = {
1115					'always'    : 0,
1116					'onlyone'   : 365 * 24 * 60 * 60 * 1000,
1117					'week'      : 7 * 24 * 60 * 60 * 1000, 
1118					'day'       : 24 * 60 * 60 * 1000, 
1119					'12hour'    : 12 * 60 * 60 * 1000, 
1120					'6hour'     : 6 * 60 * 60 * 1000, 
1121					'2hour'     : 2 * 60 * 60 * 1000, 
1122					'1hour'     : 60 * 60 * 1000, 
1123					'30min'     : 30 * 60 * 1000, 
1124					'10min'     : 10 * 60 * 1000
1125		        };
1126
1127		        if(isTodayHide) {
1128		        	date.setTime(date.getTime() + ptime_val['day']);
1129		        } else { 
1130		        	date.setTime(date.getTime() + ptime_val[ptime]);
1131		        }
1132		        $('#' + selectedPopup).fadeOut();
1133		        if(isTodayHide || (typeof ptime !='undefined' && ptime != 'always' && ptime != '')) { $.cookie(selectedPopup, true, { path: '/', expires: date}); }
1134		        else { $.removeCookie(selectedPopup, { path: '/' }); }
1135		    }
1136		});
1137
1138		var decodeMoveScrollUrl = function(value) {
1139            if(typeof value == 'undefined' || !value) return '';
1140
1141            var url = String(value);
1142
1143            try {
1144                var decoded = decodeURIComponent(url);
1145                if(decoded !== url) return decoded;
1146            } catch(e) {}
1147
1148            try {
1149                var escaped = escape(url);
1150                if(escaped.indexOf('%u') === -1) return decodeURIComponent(escaped);
1151            } catch(e) {}
1152
1153            return url;
1154        };
1155
1156		function moveScroll(interval, loc) {
1157			if(typeof $.cookie('forum_content_view') != 'undefined') {
1158		    	if(window.location.href.indexOf('/forum/view/') == -1) $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
1159		    	return false;
1160		    }
1161			var this_url = (typeof loc == 'undefined') ? document.URL : loc;
1162			var url = decodeMoveScrollUrl(this_url);
1163		    link = url.split('#').pop();
1164
1165		    if($.inArray(link,b.MENULINK) > -1 && b.ONE && !b.VIEW) {
1166		        moveLinkPage(link,interval);
1167		        $.removeCookie('gallery', { path: '/' });
1168		        $.removeCookie('gallery-item', { path : '/' });
1169		    } else if (url.match(/\@/g)) {
1170		        link = url.split('\@').pop();
1171		        var bookmark_link = url.substr(url.lastIndexOf('/')+1);
1172		        if(link) moveLinkPage(bookmark_link,800,true);
1173		    } else {
1174		    	$(window).scrollTop(0);
1175		    	setTimeout(function() {
1176					if(location.hash) {
1177						var hashArr = location.hash.split('#');
1178						var hash = hashArr[1];
1179						var hashseq = hashArr[2];
1180						if(hash && $('.element[data-name="' + hash + '"]').length) {
1181							var header_check = $("header").attr("data-fh-type");
1182							if (header_check != "sidebar") { var header_height = $("header").outerHeight(true); }	
1183							else {var header_height = 0;}														
1184							// $(window).scrollTop($('.element[data-name="' + hash + '"]').offset().top - header_height);
1185
1186							if($('.tpl-forum-list-cont[data-id="' + hashseq + '"]').length == 0) {
1187								var offset_top = $('.element[data-name="' + hash + '"]').find('.list-item').offset().top;
1188								var win = $(window);
1189								var winHeight = win.height();
1190								win.scrollTop(offset_top - (winHeight / 2) + (header_height / 2));
1191							} else {
1192								var offset_top = $('.tpl-forum-list-cont[data-id="' + hashseq + '"]').closest('.list-item').offset().top - header_height;
1193								var screen_half = ($(window).height() - header_height) / 2;
1194								// $(window).scrollTop(offset_top)
1195								$(window).scrollTop(offset_top - screen_half)
1196							}	
1197
1198							// console.log($('.tpl-forum-list-cont[data-id="72334"]').length);
1199						}
1200					}
1201				});
1202		    }
1203		}
1204
1205		var moveBookmark = function(page, bookmark, interval, target) {
1206			var page_arr = (typeof page == 'undefined') ? new Array() : page.split('\,');
1207			var view = (page_arr.length > 1) ? page_arr[1] : '';
1208
1209			interval = (typeof interval == 'undefined') ? 1200 : interval;
1210			target = (typeof target == 'undefined') ? '' : target;
1211
1212			if( (view != '' && view == b.VIEW && !target) || (view == '' && !b.VIEW && page_arr[0] == b.PAGE && !target) ) {
1213				moveLinkPage(page_arr[0]+bookmark,interval,true);
1214			} else {
1215				var linkUrl = '';
1216				if(b.ONE) {
1217					linkUrl = (view.length>0) ? '/index/view/' + view : '/index';
1218					linkUrl = (!b.PUBLISH) ? '/render' + linkUrl + bookmark : linkUrl + bookmark;
1219				} else {
1220					var url_str = (view.length>0) ? page_arr[0] + '/view/' + view : page;
1221					linkUrl = (URI=='/') ? '/' + url_str + bookmark : URI + '/' + url_str + bookmark;  
1222				}
1223
1224				if(target) {
1225					var openLinkPage = window.open('about:blank');
1226					openLinkPage.location.href=linkUrl;
1227				} else {
1228					var url = new getLocation(linkUrl);		        	
1229					golink(_this,url);
1230					// location.replace(linkUrl);
1231				}
1232
1233			}
1234		}
1235
1236		var moveLinkPage = function(link, interval, isblock) {
1237		    link = decodeURIComponent(link);
1238			if(typeof interval == 'undefined') interval = 1200;
1239			if(typeof isblock == 'undefined') isblock = '';
1240
1241		    var isBookmark = false;
1242			var bookmark_arr = new Array();
1243			if(link.match(/\@/g)) { 
1244				isBookmark = true;
1245				bookmark_arr = link.split('\@');
1246
1247				var check_link = true;
1248				var is_visible_menu = false;
1249				$.each(b.SMENU, function (idx, obj) {
1250					if(is_o_page == obj.name.replace(/ /g,'-')) {
1251						if(!obj.link) check_link = false;
1252						if(obj.display == 'on') is_visible_menu = false;
1253					}
1254					if(obj.children) {
1255						$.each(obj.children, function (i, v){
1256							if(is_o_page == v.name.replace(/ /g,'-')) {
1257								if(!v.link) check_link = false;
1258								if(v.display == 'on') is_visible_menu = false;
1259							}
1260						});
1261					}
1262				});
1263
1264				var is_here = ($('.element[data-bookmark="' + bookmark_arr[1] + '"]').length > 0 ) ? true : false;
1265				var is_page = (b.PAGE.toLowerCase() == bookmark_arr[0].toLowerCase() || b.VIEW && b.VIEW == bookmark_arr[0]) ? true : false;
1266				var is_o_page = (bookmark_arr[0].indexOf(',') > -1 && !b.VIEW) ? bookmark_arr[0].substring(0, bookmark_arr[0].indexOf(',')) : (b.VIEW) ? 'index' : bookmark_arr[0];
1267				// var is_visible_menu = ($.inArray(is_o_page,b.MENULINK)>-1) ? true : false;
1268				// var check_link = ( $('#tpl-menu li a[href*="'+is_o_page+'"]').length > 0 && $('#tpl-menu li a[href*="'+is_o_page+'"]').text().trim().replace(/ /gi,'-') == is_o_page ) ? false : true;
1269				var is_link = (check_link && is_visible_menu && is_o_page != 'INTRO') ? true : false;
1270				var is_visible = (check_link && is_visible_menu && is_o_page != 'INTRO') ? true : false;
1271
1272				if( ( !is_visible_menu && is_o_page!='index' ) ||
1273					( /*!is_page &&*/ ( is_link || is_visible ) ) ||
1274					( is_page && !is_here ) 
1275				)  { 
1276					if(is_visible_menu == false) ;
1277					else return false; 
1278				}
1279				link = 'element[data-bookmark="' + bookmark_arr[1] + '"]';
1280				
1281			} else {
1282			    link = (isblock == '') ? 'link-to-' + link : link;
1283			}
1284
1285			var moveTarget = $(`.${link}`);
1286			if(moveTarget.length == 0) return;
1287
1288			if($.clnav.check()) {
1289				goToElement(`.${link}`);
1290			} else {
1291				// oldver
1292				var header_fixed = ($('.dsgn-body').width() < 769) ? $('.el-menu .navbar-header').height() - 1 : $('#tpl-menu').height();
1293				if ($('header').hasClass('navbar-fheader')) header_fixed = $('header.navbar').outerHeight() - 1;
1294
1295				var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
1296				if ($('header.navbar').hasClass('disableOffset') && !$('.' + link).hasClass('el_0')) offset = 0;
1297				offset = (window.innerWidth > 768) ? offset : -header_fixed;
1298
1299				var sTop = moveTarget.offset().top + offset;
1300				if(moveTarget.is('[data-aos]') && !moveTarget.hasClass('aos-animate')) {
1301					const tr = moveTarget.css('transform');
1302					let moveY = 0;
1303					if (tr && tr !== "none") {
1304						const vals = tr.match(/-?\d+\.?\d*/g);
1305						moveY = parseFloat(vals[13] || vals[5] || 0); // 이미 음수/양수 포함됨
1306
1307						sTop -= moveY;
1308					}
1309				}
1310				sTop = (isAosBlock && moveTarget.hasClass('el_0') == false && $('.menu-logo-top').length > 0 && $('.menu-logo-top').css('display')=='block') ? sTop + $('.menu-logo-top').outerHeight() : sTop;
1311
1312				var duration = (typeof $('#tpl-menu').attr('data-duration') != 'undefined') ? parseInt($('#tpl-menu').attr('data-duration')) : ((isBookmark) ? 500 : 1000);
1313				if(clCheckBrowser('safari') && clCheckBrowser('mobile') || moveTarget.hasClass('el_0')) duration = 0;
1314				$('html, body').stop(true, false).animate({
1315					scrollTop: sTop
1316				}, duration, 'easeInOutQuart', function() {
1317					if(isAosBlock) {
1318						$.each($('.element'), function() {
1319							var aos = $(this).attr('data-aos-ch');
1320							$(this).attr('data-aos',aos);
1321							$(this).removeAttr('data-aos-ch');
1322						});
1323					}
1324				});
1325
1326				var menuStr = (!isBookmark) ? link.replace('link-to-','') : bookmark_arr[0];
1327				setTimeout(function() {
1328					$('header #tpl-menu li a[href=#' + menuStr + ']').closest('li').addClass('active').siblings().removeClass('active');
1329					if($('#mobile-nav #tpl-menu li').length) $('#mobile-nav #tpl-menu li a[href=#' + menuStr + ']').closest('li').addClass('active').siblings().removeClass('active');
1330				},1100);
1331			}
1332		}
1333
1334		var getParent = function(parent,id,page) {
1335		    if(id) {
1336		    	parent = (parent == 'forum') ? parent : 'project';
1337				$.ajax({
1338					url:'/template/get/parent/' + parent + '/id/' + id + '/sid/' + _this.b.SID + '/page/' + encodeURIComponent(page) + _this.b.param,
1339					type:'get',
1340					async:false,
1341                	cache: false,
1342					dataType:'json',
1343					success:function(data) {
1344						property.PRODINFO = (data.prod_onoff == "on") ? data.PRODINFO : '';
1345						_this.b.PARENT = data.PARENT;
1346						_this.b.COUNT = data.COUNT;
1347					}
1348				});
1349		    } else {
1350				property.PRODINFO = "";
1351				_this.b.PARENT = {};
1352				_this.b.COUNT = 0;
1353		    }
1354		}
1355
1356		var showPageCallback = function(func,callback) {
1357		    func(b.MCSS, b.MSTYLE, b.MTAG, true);
1358		    if(typeof callback=='function') {
1359		    	callback();
1360		    }
1361		}
1362
1363		var showPage = function (css, style, tag, prop) {
1364			if($('.fmcss').length > 0) $('.fmcss').remove();
1365		    $.each(style.children,function(k,v) {
1366		        if(k!='.dsgn-body') {
1367		            delete style.children[k];
1368		        }
1369		    });
1370    		elFooter();
1371
1372			var isSidebar = $('.el-menu > header').hasClass('sidebar');
1373			var isHeaderOldVer = !$.clnav.check();
1374			if(isHeaderOldVer) {
1375				if(b.HEADER && b.PARENT.mode == 'shopping') b.HEADER = false;
1376				if(b.HEADER && !isSidebar) $('header.navbar').addClass('transparent');
1377	
1378				header_fixed = $('header.navbar').height();
1379				if($('header.navbar').css('background-color')=='rgba(0, 0, 0, 0)'
1380					&& $('header.navbar').css('background-image')=='none'
1381				) {
1382					$('header.navbar').css('background-color',$('dsgn-body').css('background-color'));
1383				}
1384			}
1385
1386		    if(b.SETTINGS.sitePermit === 3) {
1387		    	var checkSiteLock = isSitePasswordLock();
1388		    } 
1389
1390		    var is_lock_block = 'active';
1391			isMenuLock(function() {
1392				if(b.ISLOCK == 'true' && is_lock_block == '' || b.ISLOCK != 'true') elPush(prop);
1393				else {
1394					$('.el-footer').css('visibility', 'visible');
1395					$.processOFF();
1396				}
1397			});
1398
1399			// menu active
1400			/* 190710 -  menu or sub-menu 일부 같을때 첫번째 메뉴에 active error 생겨서 주석 처리. */
1401			// if(b.PARENT.page) {
1402			// 	$('#tpl-menu li').find('a:contains("' + b.PARENT.page + '")').parent().addClass('active');
1403			// } else {
1404			// 	if(b.ONE) {
1405			// 		if(b.SMENU[0].display == 'off') $('#tpl-menu li').first().addClass('active');
1406			// 	} else if(b.PAGE) {
1407			// 		$('#tpl-menu li').find('a:contains("' + b.PAGE + '")').parent().addClass('active');
1408			// 	}
1409			// };
1410
1411		    RENDER.setLoginout(b.LOGINOUT, b.SID, b.PUBLISH, b.PROFILEIMG);
1412		    $('body,html').animate({scrollTop: 0}, 300,'easeInOutQuart');
1413		}
1414
1415		var loadPush = function(data) {
1416			// console.log(' page draw 02:: loadPush');
1417			window._blockMasonryResizeTargets = [];
1418
1419			// premium block
1420			$('body,html').removeClass('aos-height aos-overflowX');
1421			$('body').removeClass('overflow-hidden');
1422			$('body').removeAttr('data-gjs');
1423
1424			var deferred = $.Deferred();
1425			var pageID = b.PAGE.split(','),
1426				chgBG = false,
1427				tmpTag = '',
1428				currentPAGE = b.PAGE,
1429				default_t_css = '', default_m_css = '';
1430
1431			var is_templates = checkTemplateSite(b.SID);
1432			
1433			var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false,
1434				checkShoppingView = (b.VIEW && b.PARENT.mode == 'shopping') ? true : false,
1435				page_pos = 0,
1436				site_settings = (typeof b.SETTINGS != 'undefined' && b.SETTINGS) ? b.SETTINGS : {};
1437
1438			if($('body').hasClass('openPopupBanner') && b.MENULINK[0] != currentPAGE) {
1439				$.siteBanner.init(false,true);
1440			}
1441			if(typeof $.clnav.s != 'undefined') $.clnav.init();
1442
1443	        $('#el-empty').empty();
1444	        $('.gallery-popup, .psearch-block').remove();
1445	        b.COUNT = data.length;
1446
1447			var check_modoo = $('.dsgn-body').hasClass('modoo') ? true : false,
1448				fl_data = {};
1449				
1450			if(check_modoo) {
1451				fl_data = draw_floating();
1452			}
1453
1454			function drawData(idx, val) {
1455				// console.log(`drawData(${idx}, ${val})`);
1456				page_pos += 1;
1457				var tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES');
1458				var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
1459				var block_lang = (typeof settings.blocklang != 'undefined' && settings.blocklang) ? settings.blocklang : LANG;
1460				var checkGalleryListSample = false;
1461				var checkGalleryListEmpty = true;
1462				var fontload = [];
1463
1464				if(val.type == 'project' && val.eltag.charAt(0) == '\<') tag = val.eltag;
1465
1466				if(typeof val.fonts != 'undefined') {
1467					$.each(val.fonts, function(i,v) {
1468						if(b.ELFONTS.indexOf(i) < 0 && v) {
1469							b.ELFONTS.push(i);
1470							$('#loadfonts').append(v);
1471						}
1472					});
1473				}
1474				if(typeof val.webfonts != 'undefined' && val.webfonts) {
1475					$.each(val.webfonts, function(i2,v2) {
1476						if(b.ELFONTS.indexOf(i2) < 0 && v2) {
1477							b.ELFONTS.push(i2);
1478							WebFont.load({ google : { families : [ v2 ], display:'swap' }});
1479						}
1480					})
1481				}
1482
1483				if($.inArray(val.type, ['gallery','shopping']) > -1) {
1484					if($('#el-empty').length === 0) $('body').append('<div id="el-empty" class="opacity: 0;"></div>');
1485					$('#el-empty').append($(tag));
1486					$('#el-empty').find('[data-loop="true"]').html('');
1487
1488					var nodes = $(tag).find('[data-loop="true"]').children('.grid'),
1489						p = $('#el-empty').children(),
1490						g = p.clone().removeClass().addClass('galleryPL'+val.seq).addClass('gallery-popup'),
1491						i = [],
1492						view = $(tag).find('[data-loop="true"]').data('view'),
1493						g_number = $(tag).find("[data-loop='true']").data('gallery-no'),
1494						total = 0;
1495
1496					var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
1497					var glm = $(tag).find('.loadmore-wrap');
1498
1499					$('#el-empty').after(g);
1500					$(g).after('<div class="gallery-empty"></div>');
1501
1502					galleryEL[val.seq] = {
1503						'seq' : val.seq,
1504						'elname' : val.elname,
1505						'eltag' : tag,
1506						'folder' : val.folder,
1507						'mode' : val.mode,
1508						'elsettings' : val.elsettings,
1509						'feature' : val.feature,
1510						'type' : val.type,
1511						'type2' : val.type2,
1512						'searches' : val.searches
1513					};
1514
1515					if(typeof view == 'undefined') view = 10;
1516					var cookie_page = 1,
1517						cookie_view = view,
1518						cookie_gallery_category = '',
1519						is_gc_cookie = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined' && $.cookie('gallery-category-'+val.seq).length > 0) ? true : false;
1520            		var cookie_gallery_orderby = 'recent';
1521
1522					var category_onoff = (typeof settings.category_display != 'undefined' && settings.category_display) ? settings.category_display : 'OFF';
1523					var gallery_sort = (typeof settings.gallery_sort != 'undefined' && settings.gallery_sort) ? settings.gallery_sort : 'default';
1524					if(val.mode != 'shopping' && gallery_sort == 'product') gallery_sort = 'default';
1525					// var adultonly_onoff = (typeof settings.adult_only != 'undefined' && settings.adult_only) ? settings.adult_only : 'OFF';
1526					
1527					if(typeof $.cookie('loadmore-' + val.seq) != 'undefined' && $.cookie('loadmore-' + val.seq).length > 0) {
1528						cookie_page = $.cookie('loadmore-'+val.seq);
1529						cookie_gallery_category = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined') ? $.cookie('gallery-category-'+val.seq) : '';
1530	                    cookie_gallery_orderby = (typeof $.cookie('gallery-orderby-' + val.seq) != 'undefined') ? $.cookie('gallery-orderby-' + val.seq) : '';
1531						cookie_view = cookie_page * view;
1532					} else { 
1533						var checkCateHomeHide = (category_onoff == 'ON' &&
1534												typeof settings.category != 'undefined' && settings.category && 
1535												typeof settings.category_home_hide != 'undefined' && settings.category_home_hide) ? true : false;
1536						if(checkCateHomeHide) {
1537							var gc = settings.category.replace(/\|/g,'').split(',');
1538							cookie_gallery_category = gc[0];
1539							is_gc_cookie = true;
1540
1541							$.cookie('gallery-catehome-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
1542						}
1543					}
1544					
1545					if(val.seq == 'all_products') {
1546					// 	cookie_page = (typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products') != '')? $.cookie('gallery-page-all_products') : 1;
1547						cookie_gallery_category = getAllProductsSortVal(settings);
1548					// 	cookie_view = cookie_page * view;
1549					} else {
1550						if(!property.VIEW) $.removeCookie('gallery-page-all_products', { path: '/' });
1551					}
1552					
1553					$.cookie('gallery-page-' + val.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
1554					$.cookie('gallery-category-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
1555	                $.cookie('gallery-orderby-' + val.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
1556					$.removeCookie('loadmore-' + val.seq, { path : '/' });  
1557
1558					var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false,
1559						checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof settings.gframe_title_visible != 'undefined' && settings.gframe_title_visible == 'OFF')) ? true : false;
1560
1561					var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
1562					var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
1563
1564					var uri = getSearchURL();
1565					if (isObjectEmpty(uri) && _this.b.LUX && val.mode == 'shopping') {
1566						uri = val.searches.uri;
1567					}
1568					// if(uri.category_no == '') {
1569					// 	uri.category_no = (typeof settings.lux_category_no != 'undefined') ? settings.lux_category_no : '';
1570					// }
1571					
1572					var res;
1573					
1574					$.ajax({
1575						url: '/template/gallery/list/pid/' + val.seq + '/sid/' + b.SID + '/spage/' + currentPAGE + '/view/' + cookie_view + param,
1576						data: { g_mode: val.mode,  visible: true, sfl: 'category', stx: cookie_gallery_category, uri : uri, only : val.only_category, orderby: cookie_gallery_orderby},
1577						dataType: 'json',
1578						type: 'POST',
1579						async: false,
1580						cache: false,
1581						success: function (data) {
1582							var check_only_cate = (typeof data.only_category != 'undefined' && data.only_category === true) ? true : false;
1583							if(check_only_cate) {
1584								localStorage.setItem('searches',JSON.stringify(new Array(val.searches.uri[0])));
1585							}
1586	
1587							res = data;
1588							$.each(data.list, function (idx, v) {
1589								i.push(v);
1590							});
1591							total = (typeof data.total.list_total == 'undefined') ?  data.total : data.total.list_total;
1592							cookie_view = ( cookie_view > total ) ? total : cookie_view;
1593							// cookie_view = (cookie_view < total) ? cookie_view : total;
1594
1595							if( total > 0 ) checkGalleryListEmpty = false;
1596							if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
1597								var loop_count = nodes.length, item_index = 0;
1598								var elem = [];
1599								$.each(data.list,function(index,v) {
1600									loop_pos = index%loop_count;
1601									c = nodes[loop_pos];
1602                                	var isTitle = (v.title.length > 0) ? true:false;
1603
1604									$(c).find('.non_text').removeClass('non_text');
1605									if(val.mode != 'shopping') {
1606										if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
1607										if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
1608									}
1609
1610									v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
1611									v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
1612
1613									$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
1614									
1615									var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
1616										img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
1617										img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
1618
1619									var folder = (val.folder == 0) ? '' : val.folder + '/',
1620										src = getServeImage(v.image,val.folder,img_path),
1621										src_s0 = getServeImage(v.image,'0',img_path);
1622									if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
1623									if(val.mode == 'shopping') {
1624										if($(c).find('img').length > 0) $(c).find('img').attr('alt',v.title);
1625									} else {										
1626 									    alt_replace	= v.alt.replace(/\s+|\n+/g, '-');  
1627		    	          				alt_replace.replace(/-+/g, '-')	
1628										if($(c).find('img').length > 0) $(c).find('img').attr('alt',alt_replace);										
1629									}
1630									ensureGalleryResponsiveImageClass($(c));
1631									if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
1632
1633									if(checkGallerySVG) {
1634										var gimgSVG = $(c).find('.gimg-svg-wrap svg');
1635										gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+index);
1636										gimgSVG.find('image').attr('xlink:href', src);
1637										gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+index+')');
1638									}
1639
1640									var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
1641										glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
1642
1643									if(glink) {
1644										if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
1645											var bookmark_seq = glink.replace(/^\@/g,'');
1646											if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
1647												glink = '';
1648												glink_target = '';
1649											}
1650										} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
1651											glink_target = '';
1652										} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
1653										} else {																					// link-type: link-out      ==> a[attr-link]
1654											if(checkBase64Encode(glink)) glink = Base64.decode(glink);
1655										}
1656									}
1657
1658									var entry =	(property && property.CONTENTS && property.CONTENTS['el' + v.pid]) || (property && property.CONTENTS && property.CONTENTS[String(v.pid)]) || null;
1659									var elsettingsRaw = entry && entry.element ? entry.element.elsettings : null;
1660									var elsettingsObj = elsettingsRaw;
1661
1662									if (typeof elsettingsRaw === 'string') {
1663										try { elsettingsObj = JSON.parse(elsettingsRaw); }
1664										catch (e) { console.error('[ERR] elsettings JSON 파싱 실패:', e, elsettingsRaw); elsettingsObj = {}; }
1665									}
1666
1667									var gallery_page_chmod = elsettingsObj && elsettingsObj.gallery_page_chmod || null;
1668									var umgrade = property && property.UMGRADE ? (property.UMGRADE.seq || property.UMGRADE.grade_id || null) : null;
1669									if (typeof gallery_page_chmod === 'string') {
1670										try { gallery_page_chmod = JSON.parse(gallery_page_chmod); }
1671										catch (e) { gallery_page_chmod = gallery_page_chmod ? gallery_page_chmod.split(',') : []; }
1672									}
1673									gallery_page_chmod = $.isArray(gallery_page_chmod) ? $.map(gallery_page_chmod, function(v) { return String(v); }) : [];
1674									umgrade = (umgrade !== null && typeof umgrade != 'undefined') ? String(umgrade) : null;
1675
1676									// console.log({ gallery_page_chmod, umgrade });
1677
1678									$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
1679									$(c).removeClass('noneShoppingGrade').removeAttr('data-shopping-grade-msg');
1680									if (isShoppingGradePriceHidden(v) && property['SITEUM'] >= 1) {
1681										$(c).addClass('gallery-item').addClass('nonePrice');
1682										$(c).find('a').attr('href', '#');
1683									} else {
1684										if(isShoppingGradeBlocked(v, val.seq == 'all_products' ? settings : elsettingsObj, property)) { //쇼핑등급
1685											$(c).addClass('gallery-item').addClass('noneShoppingGrade');
1686											$(c).attr('data-shopping-grade-msg', getShoppingGradeBlockedMessage(v));
1687											$(c).find('a').attr('href', '#');
1688										} else {
1689											if(glink) {
1690												var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
1691												$(c).find('a').attr('href',glink_val);
1692
1693												if(glink.match(/^\@/g)) {
1694													$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
1695												} else if(glink.match(/^flink\@[0-9]/g) !== null) {
1696													$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
1697												// IE ERROR_includes__H.20210603
1698												// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
1699												} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
1700													$(c).find('a').attr('data-user-link',glink_val);
1701												} else {
1702													$(c).find('a').attr('attr-link',glink);
1703												}
1704											} else {
1705												if (val.mode == 'gallery') {
1706													src_s0 = src_s0 + '?gpos='+v.pos;
1707
1708													$(c).find('a').attr('href', src_s0);
1709													$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
1710												} else {
1711													if(val.seq == 'all_products') {
1712														$(c).find('a').attr('href', v.product_url);
1713													} else {
1714														if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
1715														else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
1716							
1717														// $(c).find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/' + v.seq);
1718													}		
1719												}
1720											}
1721										}
1722									}
1723
1724									if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
1725									else $(c).find('a').removeAttr('target');
1726
1727									if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
1728									else $(c).find('a').attr('data-title', v.title);
1729
1730									// if(adultonly_onoff == 'ON') $(c).addClass('adultonly');
1731
1732									// caption
1733									var ftitle = $(c).find('h5.figure'),
1734										fcaption = $(c).find('p.figure').not('.comment'),
1735										fdatetime = $(c).find('.figure.datetime'),
1736										fhashtag = $(c).find('.figure.hashtag'),
1737										fbrand = $(c).find('.figure.brand'),
1738										fprice = $(c).find('.figure.price'),
1739										freview = $(c).find('.figure.review'),
1740										fcomment = $(c).find('.figure.comment'),
1741										flike = $(c).find('.figure.like'),
1742										fbasket = $(c).find('.figure.basket');
1743
1744									$(c).find('figcaption').removeClass('hide');
1745									if (v.title || v.caption) {					
1746										var gallery_caption = v.caption;
1747										gallery_caption = gallery_caption.replace(/\n/g,'<br />');
1748
1749										ftitle.html(v.title);
1750										fcaption.html(gallery_caption);
1751										if(fdatetime.length > 0) fdatetime.text(v.datetime);
1752										if(fhashtag.length > 0) fhashtag.text(v.hashtag);
1753									}
1754
1755			                        if(g_number) {
1756			                            var g_index = String(index + 1),
1757			                                g_num = g_index.padStart(g_number, '0');
1758			                            $(c).find('.figure.number').text(g_num);
1759			                        }
1760
1761									if(fbrand.length > 0) {
1762										var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
1763										fbrand.html(v.brand_name);
1764									}
1765
1766									if(val.mode == 'shopping' || val.seq == 'all_products') {
1767										fcomment.addClass('hide');
1768										flike.addClass('hide');
1769										v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
1770										v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
1771										var productGradeOnOff = getShoppingGradeProductGradeOnOff(v);
1772										$(c).attr('data-editor-grade-price-enabled', productGradeOnOff).attr('data-config-grade-price-enabled', productGradeOnOff);
1773										var checkPriceHidden = isShoppingGradePriceHidden(v),
1774											base_gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
1775											base_gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
1776											gallery_price = base_gallery_price,
1777											gallery_sale_price = base_gallery_sale_price,
1778											gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
1779											grade_price_display = settings.grade_price_display == 'ON',
1780											grade_discount_grade = getShoppingGradePreviewDiscountGrade(data.grade),
1781											grade_discount_applied = false,
1782											grade_gallery_price = 0,
1783											product_soldout = '품절',
1784											product_no_sale = (typeof settings.sh_soldout == 'string') ? settings.sh_soldout : '구매불가',
1785											product_status = '';
1786										if (
1787											!checkPriceHidden &&
1788											isShoppingGradeProductGradePriceEnabled(v)
1789										) {
1790											grade_gallery_price = calcShoppingGradeDisplayPrice(base_gallery_price, grade_discount_grade);
1791											grade_discount_applied = grade_gallery_price !== null;
1792										}
1793										if(v.status == 'off' && !checkPriceHidden) {
1794											product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
1795										} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
1796											product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
1797										}
1798
1799										$(c).find('.cl-sh-soldout').remove();
1800										if(product_status != '') $(c).attr('data-soldout',true);
1801										else $(c).removeAttr('data-soldout');
1802
1803										$(c).find('.product-badge').remove();
1804										product_status += drawBadgeList(v.use_badge, data.badge_settings);
1805
1806										$(c).find('.cl-sh-limit').remove();
1807										if(v.status == 'lim') {
1808		                                    if(v.sale_now == false) {
1809		                                        var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
1810					                            if(freview.length > 0) {
1811					                                freview.after(product_limit);
1812					                            } else {
1813					                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
1814					                            }
1815		                                    }
1816		                                }
1817
1818										if($(c).find('ul.figure.price').length > 0) {
1819											// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
1820											// 	off_str = (price_off > 0) ? price_off + '% ' : ''
1821											var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
1822											if(!_this.b.LUX) off_str = gallery_sale_per;
1823											if(!off_str && gallery_sale_price > 0 && gallery_price > 0 && gallery_price < gallery_sale_price) {
1824												var price_off = Math.round(((gallery_sale_price - gallery_price) / gallery_sale_price) * 100);
1825												off_str = (price_off > 0) ? price_off + '% ' : '';
1826											}
1827											//Ver2
1828											if(!checkPriceHidden) {
1829												var $priceWrap = $(c).find('ul.figure.price'),
1830													$priceVal = $priceWrap.find('.price-val'),
1831													$priceSale = $priceWrap.find('.price-sale'),
1832													$priceSalePer = $priceWrap.find('.price-sale-per');
1833												$priceWrap.find('.sp-price, .grade-discount-price').remove();
1834												if($priceSale.length > 0 && $priceSalePer.length == 0) {
1835													$priceSale.after('<li class="price-sale-per hide"></li>');
1836													$priceSalePer = $priceWrap.find('.price-sale-per');
1837												}
1838												$priceWrap.css({display:'', flexDirection:'', alignItems:''});
1839												$priceVal.css({order:'', display:''});
1840												$priceSale.css({order:'', display:'', marginRight:''});
1841												$priceSalePer.css({order:'', display:'', marginLeft:'', marginTop:''});
1842													$priceVal.html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
1843												$priceVal.removeClass('hide');
1844
1845												if(gallery_sale_price > 0 && gallery_price < gallery_sale_price) {
1846													$priceSale.html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
1847														$priceSalePer.html(off_str);
1848													$priceSale.removeClass('hide');
1849														$priceSalePer.removeClass('hide');
1850													if(!grade_discount_applied && _this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
1851														$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
1852													}
1853												} else {
1854													$priceSale.addClass('hide').html('');
1855													$priceSalePer.addClass('hide').html('');
1856
1857												}
1858												
1859												if(grade_price_display && grade_discount_applied) {
1860													$priceWrap.append('<li class="grade-discount-price"><span class="grade-discount-price-value">₩' + grade_gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + '</span><span class="grade-discount-price-label">나의 할인가</span></li>');
1861												}
1862
1863												$(c).find('ul.figure.price .price-unit-pricing').remove();
1864												if(v.product_unit_str) {
1865													$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
1866												}
1867											} else {
1868												$(c).find('ul.figure.price .price-val').html('₩0');
1869												$(c).find('ul.figure.price .price-val').addClass('hide');
1870											}
1871											if(val.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
1872											if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
1873
1874											var badge_size = getBadgeSize(data.badge_settings);
1875											$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
1876											$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
1877											if(badge_size) {
1878												$(c).find('.cl-sh-soldout').addClass(badge_size);
1879												$(c).find('.cl-sh-limit').addClass(badge_size);
1880											}
1881										} else {
1882											//Ver1
1883											if(fprice.length == 0) fprice = fcaption;
1884											
1885											if(checkPriceHidden) fprice.html('');
1886											else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
1887										}
1888
1889										if($(c).find('ul.figure.review').length > 0) {
1890											var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
1891											if(gallery_review > 0) {
1892												$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
1893												$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
1894												$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
1895											} else {
1896												$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
1897												$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
1898											}
1899										}
1900
1901										if(fbasket.length > 0) {
1902											var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
1903												checkOldverBasket = (typeof settings.field_oldver != 'undefined' && settings.field_oldver && settings.field_oldver.indexOf('basket') > -1) ? true : false,
1904												checkDisabledBasket = (typeof settings.field_disable != 'undefined' && settings.field_disable && settings.field_disable.indexOf('basket') > -1) ? true : false;
1905											if(v.basket_off || v.shopping_grade_hidden == 'ON') fbasket.addClass('cannotby hide');
1906											else if(val.seq == 'all_products') fbasket.removeClass('hide');
1907											else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
1908											else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
1909											else fbasket.removeClass('hide');
1910										}
1911
1912									} else {
1913										fbrand.addClass('hide');
1914										fprice.addClass('hide');
1915										freview.addClass('hide');
1916										fbasket.addClass('hide');
1917
1918										if ( checkUseComment 
1919											&& settings.comment_display == 'ON'
1920											&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('comment') > -1)
1921											&& fcomment.length > 0
1922											&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
1923										) {
1924											fcomment.removeClass('hide');
1925											fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
1926										} else {
1927											fcomment.addClass('hide');
1928											fcomment.find('.figure-comment-cnt').empty();
1929										}
1930			
1931										if ( checkUseLike 
1932											&& (settings.like_display !== undefined && settings.like_display != 'N')
1933											&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('like') > -1)
1934											&& flike.length > 0
1935										) {
1936											flike.removeClass('hide').find('.figure-like-cnt').html(0);
1937											if(v.like !== undefined) {
1938												flike.find('.figure-like-cnt').html(v.like.cnt);
1939												if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
1940											}
1941										} else {
1942											flike.addClass('hide');
1943										}
1944									}
1945									
1946									if(val.mode == 'gallery') {
1947										if(index < cookie_view) {
1948											$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
1949										} else {
1950											$(c).find('figure').remove();
1951											$(g).find('[data-loop="true"]').append($(c)[0].outerHTML);
1952										}
1953										if (total == 2) {
1954											$(c).find('figure').remove();
1955											$('.gallery-empty').append($(c)[0].outerHTML);
1956										}
1957									} else {
1958										$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
1959									}
1960
1961								});
1962								
1963							} else {
1964								checkGalleryListSample = true;
1965								if(val.mode=='project' && b.TEMPLATE == false) {
1966									nodes.addClass('gallery-item');
1967									nodes.find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/template').removeAttr('data-gallery').find('img').attr('data-index',0);
1968								}
1969
1970								if(b.TEMPLATE !== false) {
1971									if ( checkUseComment 
1972										&& settings.comment_display == 'ON'
1973										&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('comment') > -1)
1974									) {
1975										nodes.find('.figure.comment').removeClass('hide');
1976									} else {
1977										nodes.find('.figure.comment').addClass('hide');
1978									}
1979		
1980									if ( checkUseLike 
1981										&& (settings.like_display !== undefined && settings.like_display != 'N')
1982										&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('like') > -1)
1983									) {
1984										nodes.find('.figure.like').removeClass('hide');
1985									} else {
1986										nodes.find('.figure.like').addClass('hide');
1987									}
1988								}
1989
1990								$(p).find('[data-loop="true"]').append(nodes);
1991							}
1992							if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
1993
1994							tag = $(p)[0].outerHTML;
1995
1996							if (val.mode == 'gallery' && total == 2) {
1997								$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
1998									$(g).find('[data-loop="true"]').append(v);
1999								});
2000							}
2001							$('#el-empty').empty();
2002							$('.gallery-empty').remove();
2003						}
2004					});
2005				} else {
2006					if(typeof pageID[1] != 'undefined' && idx==0 && pageID[1] != 'template' && b.COUNT==0) {
2007						d = document.createElement('div');
2008						$(d).addClass('temp-element').html(tag);
2009						var pTitle = (b.PARENT.title) ? b.PARENT.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
2010							pCaption = (b.PARENT.caption) ? b.PARENT.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
2011						pCaption = pCaption.replace(/\n/g, '<br />');
2012
2013						$(d).find('.data-date').text(b.PARENT.datetime);
2014						$(d).find('.data-category').text(b.PARENT.category);
2015						$(d).find('h5.figure').text(pTitle);
2016						$(d).find('p.figure').not('.comment').html(pCaption);
2017
2018						tag = $(d).html();
2019						$(d).remove();
2020						tmpTag = tag;
2021					}
2022				}
2023
2024				//add style
2025				var $style_tag = $('<style type="text/css"></style>');
2026				$style_tag.attr('id','el_'+idx+'css');
2027				if(typeof val.elcss != 'undefined') {
2028					$style_tag.html(htmlspecialchars_decode(val.elcss));
2029					$('.header').before($style_tag);
2030				}
2031
2032				//change carousel id
2033				var $tag = $(tag);
2034				$tag.find('video').attr({'playsinline': '','webkit-playsinline': ''});
2035				$.each($tag.find('[data-edit="true"]'), function(i,v) {
2036					var source = $(this).outerHTML();
2037					source = source.replace(/&lt;&nbsp;/g,'&lt;').replace(/&nbsp;&gt;/g,'&gt;').replace(/data-attr-bookmark/g,'attr-bookmark');
2038					$(this).replaceWith(source);
2039				});
2040				
2041				if(typeof total == 'undefined') total = 0;
2042
2043				msny = (val.feature=='masonry') ? true : false;
2044				var blocklang = '';
2045
2046				if(val.type == 'video') {
2047					if($tag.find('.video-gallery-url').length > 0) val.mode = 'zoom';
2048					else val.mode = 'thumb';
2049					resizeVideoIframe($tag);
2050				}
2051
2052	            if (val.type == 'video' || val.type == 'others') {
2053	                var checkFullscreen = (typeof settings.fullscreen != 'undefined' && settings.fullscreen == 'ON') ? true : false;
2054	                if(checkFullscreen) {
2055	                    $tag.find('.video-wrap').addClass('video-fullscreen');
2056	                }
2057	            }
2058
2059				slideEffectClassAdd($tag);
2060
2061				let $last_el = ($('.fnav').length) ? $('.fnav') : $('.el-footer');
2062				$last_el.before(`<template class="elementAddPoint" data-id="${val.seq}"></template>`);
2063
2064				//페이지 이동
2065				$tag.addClass('el_' + idx)
2066					.attr('data-id', val.seq)
2067					.attr('data-el','el_' + idx)
2068					.attr('data-pos', idx+1)
2069					.attr('data-name', val.elname)
2070					.attr('data-msny', msny)
2071					.attr('data-type', val.type)
2072					.attr('data-type2', val.type2)
2073					.attr('data-feature', val.feature)
2074					.attr('data-mode', val.mode)
2075					.attr('data-width', val.folder)
2076					.attr('data-overlap',val.overlap)
2077					.attr('data-case', settings?.blockorg || val.name);
2078				if(val.type == 'form' && typeof val.form_done != 'undefined') $tag.attr('data-form-done', val.form_done);
2079
2080				setBlockAOS($tag,{block:settings, skipRefresh:true});
2081
2082				if($tag.hasClass('modoo')) {
2083					if(window.innerWidth <= 768 && $tag.find('._spotHomesite').hasClass('is_bottom')) {
2084						$tag.find('._spotHomesite').removeClass('is_bottom');
2085					}
2086
2087					if($tag.find('._sectionSpot').hasClass('type_full') && window.innerWidth > 768) {
2088						var A = $tag.find('._areaLogin').length ? true : false,
2089							C = window.innerHeight;
2090	
2091						if (A) {
2092							C -= 50;
2093						}
2094						
2095						$tag.find("._sectionSpot .swiper-wrapper").css("height", C);
2096						$tag.find("._sectionSpot .swiper-slide").css("height", C);
2097						$tag.find("._sectionSpot ._imgCover").css("height", C).each(function(F, G) {
2098							var D = $(G);
2099							var E = D.attr("data-lazy-background-img-src");
2100							D.css({
2101								backgroundImage: "url(" + E + ")",
2102								filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + E + '}", sizingMethod="scale")'
2103							});
2104						});
2105						if (!$tag.find("._spotHomesite").hasClass("is_bottom")) {
2106							$tag.find("._spotHomesite").css("height", C);
2107						}
2108					}
2109
2110					if($tag.find('.page-container-mobile').length > 0) {
2111						if(window.innerWidth <= 768) $tag.find('[data-role="page-container"]._content').hide();
2112						else $tag.find('[data-role="page-container"]._content').show();
2113					} 
2114
2115					if($tag.parents('body').is('.clnav-overlap-OFF') && $tag.is('[data-el="el_0"]')) {
2116						$tag.find('._spotHomesite .site_info').append(fl_data.el_html);
2117					}
2118				}
2119				
2120				var checkNotSupported = (!is_templates) ? $.notSupported.check(val.type,val.type2,val.feature) : false;
2121				if(checkNotSupported) {
2122					$tag.html('').attr('class',`hide element ${val.elname} el_${idx}`);
2123					$last_el = ($('.fnav').length) ? $('.fnav').before($tag) : $('.el-footer').before($tag);
2124					$(`#el_${idx}css, #js_${idx}`).remove();
2125					return Promise.resolve();
2126				}
2127
2128				if(typeof settings.blocklang != 'undefined') {
2129					blocklang = settings.blocklang;
2130					$tag.attr('data-blocklang',blocklang);
2131				}
2132
2133				if(val.type == 'contact') {
2134					setContactSubmitSecurity($tag, val.seq, settings, block_lang);
2135				}
2136
2137				if (val.type == 'sync') {
2138					showHideSyncField($tag, settings);
2139
2140					var sync_list_total = (typeof val.sync !='undefined' && typeof val.sync.list != 'undefined' && (val.sync.list).length > 0) ? (val.sync.list).length : 0;
2141					if($tag.find('.slick-page-label').length > 0) {
2142						var page_label = sync_list_total;
2143						if(val.type2 == 'imgpitem' && sync_list_total == 0) page_label = $tag.find('.slick .item').length;
2144
2145	                    $tag.find('.slick-page-label .slick-page-now').text(1);
2146	                    $tag.find('.slick-page-label .slick-page-total').text(page_label);
2147					}
2148
2149					if($tag.find('.sync-option').length > 0) {
2150						var sync_css = CSSJSON.toJSON(htmlspecialchars_decode(val.elcss)),
2151							sync_s = style.get(sync_css,val.elname);
2152						if(typeof sync_s.__display_count != 'undefined') {
2153							var display_cnt = Number(sync_s.__display_count) || 10;
2154							$tag.find(`.sync-item:gt(${display_cnt-1}
2154)`).addClass('hide');
2155
2156							if($tag.find('.sync-page-label').length > 0) {
2157								var sync_p_cnt = $tag.find('.sync-row .sync-item').length,
2158									sync_p_total = Math.ceil(sync_p_cnt / display_cnt);
2159								$tag.find('.sync-page .sync-page-now').text(1);
2160								$tag.find('.sync-page .sync-page-total').text(sync_p_total);
2161									
2162								if(sync_p_total == 1) $tag.find('.sync-page-wrap').hide();
2163								else $tag.find('.sync-page-wrap').show();
2164							}
2165						}
2166					}
2167
2168					var sync_loadmore_lang = block_lang;
2169					if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) sync_loadmore_lang = settings.loadmore_lang.toLowerCase();
2170					$tag.find('.sync-page-more-str').text($.lang[sync_loadmore_lang]['config.loadmore']);
2171				}
2172								
2173				if(checkGalleryView) {
2174					if(val.page == 'fixedblock_'+b.PARENT.pid) $tag.addClass('el-fixedblock');
2175					else $tag.removeClass('el-fixedblock');
2176
2177					$tag.attr('data-pos', page_pos);
2178					// if(b.LUX && (val.orgpos == '1' || $tag.is('.lux-product-block'))) $tag.attr('data-ppos', (val.pos*1) + 1);
2179					// else $tag.attr('data-ppos', val.pos);
2180					$tag.attr('data-ppos', val.pos);
2181					$tag.attr('data-posby', val.elnew);
2182				}
2183
2184				if(val.type == 'contact' && val.page == 'fixedcontact') {
2185					$.fixedContact.init($tag);
2186	            }
2187
2188				if(val.type=='forum' || val.type=='latest') $tag.addClass('preloading');
2189
2190				var checkPageblock = (val.seq === 'all_products' || (val.orgpos == 1 && val.orgpage)) ? true : false;
2191				if(b.ONE && checkPageblock) {
2192					$tag.attr('data-pagename', val.orgpage);
2193					$tag.addClass('link-to-'+JSON.parse('"'+val.orgpage.replace(/ /g,'-')+'"'));
2194				}
2195
2196				$tag.addClass('element');
2197				$last_el = ($('.fnav').length) ? $('.fnav') : $('.el-footer');
2198
2199				if($tag.hasClass('error_404')==false) {
2200					if($tag.hasClass('el-footer')==false) {
2201						if($tag.hasClass('cl-s-product-detail')==false) {
2202							if(typeof setBlockAOS == 'function') setBlockAOS($tag,{block:settings, skipRefresh:true});
2203							else aosAddblock(site_settings,settings,$tag);
2204						}
2205					}
2206				}
2207
2208				var data_aos_attr = '';
2209				if($tag.is('[data-aos]')) {
2210					data_aos_attr = $tag.attr('data-aos');
2211					$tag.removeAttr('data-aos');
2212					$tag.addClass('aos-init')
2213				}
2214
2215				$last_el.before($tag);
2216				setOldVerBlockView($tag,val);
2217
2218				if(data_aos_attr) {
2219					$tag.removeClass('aos-animate');
2220					$tag.addClass('render-aos');
2221
2222					$tag.attr('data-aos-dummy', data_aos_attr);
2223				}
2224				
2225				if(val.type == 'calendar'){
2226					var currentDate = new Date(),
2227						getYear = currentDate.getFullYear(),
2228						getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"),
2229						yearMonth = getYear + '-' + getMonth;
2230					$.cl_calendar.init(val.sid, val.seq, yearMonth, val);
2231				}
2232
2233				if(val.type == 'sns' && typeof val.type2 != 'undefined' && val.type2 == 'feed') {
2234					$tag.find('.data-feed-load-more').attr('data-feed-el',val.elname);
2235					$tag.find('.data-feed-load-more').removeAttr('style');
2236					$tag.find('.show-posts').removeClass('show-posts');
2237
2238					if(val.mode == 'site') {
2239						if(!$.isEmptyObject(b.SOCIAL)) {
2240							var load_sns = {};
2241							if(!$.isEmptyObject(b.SOCIAL.instagram) && typeof settings.sns_instagram != 'undefined' && settings.sns_instagram == 'ON') load_sns['instagram'] = b.SOCIAL.instagram;
2242							if(!$.isEmptyObject(b.SOCIAL.twitter) && typeof settings.sns_twitter != 'undefined' && settings.sns_twitter == 'ON') load_sns['twitter'] = b.SOCIAL.twitter;
2243							
2244							if(!$.isEmptyObject(load_sns)) {
2245								loadingElement(val.elname,'loading posts...');
2246								updateFeed(val.elname, load_sns, settings, function() {
2247									$('.'+val.elname+' .listprogress').remove();
2248								});
2249							}
2250						}
2251					} else {
2252						// SNS FEED:: before version
2253						if(typeof settings.sns != 'undefined' &&  settings.sns.twitter) {
2254							loadingElement(val.elname,'loading posts...');
2255							updateFeed(val.elname,settings.sns);
2256						}
2257					}
2258				}
2259
2260				if(val.type == 'others' && typeof val.type2 != 'undefined' && val.type2 == 'countdown') {
2261					var el_dday = $tag.find('[data-dday="true"]'),
2262						cd_date = (el_dday.attr('data-countdown')) ? el_dday.attr('data-countdown') : new Date(),
2263						dateformat  = { days : '%D', hours: '%H', minutes: '%M', seconds: '%S' },
2264						dateendformat  = { days : '00', hours: '00', minutes: '00', seconds: '00' };
2265					
2266					if( typeof settings.countdown != 'undefined' && settings.countdown ) {  //set - block setting date 
2267						cd_date = settings.countdown;
2268					}
2269					if( !el_dday.attr('data-countdown') && typeof countdown == 'object' ) { //set - example date
2270						cd_date.setTime(cd_date.getTime() + (35*24*60*60*1000));
2271					}
2272					cd_date = moment(cd_date).format('YYYY/MM/DD HH:mm:ss');
2273
2274					el_dday.countdown(cd_date, function(event) {
2275						$(this).find('.date-item[data-datetype]').each(function(i) {
2276							var dd_type = $(this).attr('data-datetype'),
2277								dd_format = $(this).attr('data-format'),
2278								dd_endformat = $(this).attr('data-finish');
2279
2280							if(typeof dd_format == 'undefined' || !dd_format) dd_format = dateformat[dd_type];
2281							if(typeof dd_endformat == 'undefined' || !dd_endformat) dd_endformat = dateendformat[dd_type];
2282
2283							if(event.elapsed) $(this).text(dd_endformat);
2284							else $(this).text(event.strftime(dd_format));
2285						});
2286					});
2287
2288                	if($tag.find('[data-bg-video="true"]').length > 0) resizeVideoIframe($tag);
2289				}
2290
2291				if(typeof settings.bookmark != 'undefined' && settings.bookmark) {
2292					$tag.attr('data-bookmark',val.seq);
2293				}
2294
2295				if(val.type == 'gallery') {
2296					// gallery frame add
2297					if(val.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), val.seq, val.type, val.elsettings);
2298					
2299					(checkGalleryListEmpty) ? $tag.addClass('emptyGallery') : $tag.removeClass('emptyGallery');
2300
2301					$tag.attr('data-category',category_onoff);
2302					$tag.attr('data-gallery-sort',gallery_sort);
2303
2304					if(category_onoff == 'ON'|| gallery_sort == 'product') {
2305						initGToolbar($tag, {id:val.seq, settings:settings});
2306					}
2307
2308					var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'ON',
2309						title_onoff = (typeof settings.gframe_title_visible != 'undefined' && settings.gframe_title_visible == 'OFF') ? 'OFF' : 'ON';
2310        				like = (typeof settings.like_display != 'undefined' && settings.like_display) ? settings.like_display : 'N';
2311
2312					$tag.find('[data-gallery]').attr({'data-img-original':img_onoff, 'data-gallery-title':title_onoff, 'data-gallery-like':like});
2313					if(!title_onoff) $tag.find('[data-gallery]').attr('data-title','');
2314
2315					if(isShoppingGradePriceHidden(val)) {
2316						$tag.find('.figure.price').html('');
2317					}
2318
2319					showHideGalleryField($tag,settings);
2320					reloadBlockMasonry('init', $tag);
2321
2322					var $glmBtnWrap = $tag.find('.loadmore-wrap'),
2323						$glmBtn = $tag.find('.loadmore-wrap .gallery-loadmore'),
2324						checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false,
2325						glm_lang = LANG;
2326
2327					if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) glm_lang = settings.loadmore_lang.toLowerCase();
2328					else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
2329					var glm_txt = $.lang[glm_lang]['config.loadmore'];
2330
2331					if($glmBtnWrap.length == 0) {
2332						// gallery loadmore btn - default (ver1)
2333						if(checkLoadmore) {
2334							var glm_class = (val.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
2335								glm_btn = '<div class="' + glm_class + '" data-loadmore="true" data-selector=".gallery-loadmore" data-total="' + total + '" data-id="' + val.seq + '" data-page="' + (Number(cookie_page)+1) + '" data-view="' + view + '" data-folder="' + val.folder + '" data-mode="' + val.mode + '">' + glm_txt +' &nbsp;(<span class="display">' + cookie_view + '</span> / ' + number_format(total) + ')</div>';
2336
2337							if($tag.find('.gallery-loadmore[data-id="'+val.seq+'"]').length > 0) $('.gallery-loadmore[data-id="'+val.seq+'"]').replaceWith(glm_btn);
2338							else $tag.append(glm_btn);
2339						} else $tag.find('.gallery-loadmore').remove();
2340
2341					} else {
2342						// gallery loadmore btn - custom (ver2)
2343						if(checkLoadmore) {
2344							if(val.feature=='masonry') $glmBtn.addClass('masonry-layout');
2345							else $glmBtn.removeClass('masonry-layout');
2346							$glmBtn.attr('data-loadmore','true').attr('data-id',val.seq).attr('data-total',total).attr('data-page',Number(cookie_page)+1).attr('data-view',view).attr('data-folder',val.folder).attr('data-mode',val.mode);
2347							$glmBtn.find('.label').text(glm_txt);
2348							$glmBtn.find('.display .view').text(cookie_view);
2349							$glmBtn.find('.display .total').text(total);
2350							$glmBtnWrap.removeClass('hide').fadeIn();
2351						} else {
2352							$glmBtnWrap.fadeOut().addClass('hide');
2353							$glmBtn.removeAttr('data-loadmore').removeAttr('data-id').removeAttr('data-total').removeAttr('data-page').removeAttr('data-view').removeAttr('data-folder').removeAttr('data-mode').removeClass('masonry-layout');
2354							$glmBtn.find('.label').text(glm_txt);
2355							$glmBtn.find('.display .view').text('0');
2356							$glmBtn.find('.display .total').text('0');
2357						}
2358					}
2359
2360					//갤러리블럭 모바일 가로 갯수 설정 시 클래스추가
2361					var gal_css = CSSJSON.toJSON(htmlspecialchars_decode(val.elcss)),
2362						gal_s = style.get(gal_css,val.elname),
2363						gal_case = $tag.attr('data-case'),
2364						gal_id = $tag.attr('data-id'),
2365						gal_name = $tag.attr('data-name');
2366					if(gal_s.__layout_m_on == 1 && gal_case != 'gallery61') {
2367						$tag.addClass('el-col-m'+gal_s.__layout_col_mc);
2368					} else if(gal_s.__layout_m_on == 1 && gal_case == 'gallery61') {
2369						$tag.addClass('el-col-m'+gal_s.__swiper_view_mc);
2370						setTimeout(function() {
2371							elGalleryJS[gal_id].gjs_load(document.querySelector('.'+gal_name));
2372						});
2373					}
2374				}
2375
2376				if(val.type == 'sync') {
2377					var sync_source = _this.syncUpdate($tag, val);
2378					$tag.html(sync_source);
2379
2380					if($tag.find('[data-sync-loop="true"]').length > 0) {
2381						if(val.type2 == 'tab') $tag.find('[data-sync-loop="true"] > li[data-list-no="1"]').attr('data-list-no','');
2382						if(val.type2 == 'imgpitem' && sync_list_total > 0) $tag.find('[data-sync-loop="true"] > li:not([data-idx])').remove();
2383						$tag.find('[data-sync-loop="true"] > li').eq(0).addClass('active').siblings().removeClass('active');
2384					}
2385				}
2386
2387				// tab block 우선순위 check
2388				if(val.type == 'tabs') {
2389					var $tabs = $tag.find(".tab-box .tab:not(.hover)"),
2390						$initial_tab = ($tabs.filter('.checked').length > 0) ? $tabs.filter('.checked').first() : $tabs.filter('.active').first();
2391					if($initial_tab.length == 0) $initial_tab = $tabs.eq(0);
2392					if($tabs.filter('.checked').length > 0) {
2393						$tabs.removeClass('active');
2394						$initial_tab.addClass('active');
2395						$tag.find('.tab-editor').removeClass('active');
2396						$tag.find('.tab-editor.tabs' + $initial_tab.attr('data-order')).addClass('active');
2397					}
2398					var el = $tag.attr('data-name'),
2399						len = $tabs.length,
2400						motion_style = $tag.attr("tab-motion-style"),
2401						tab_counted = $tag.attr("tab-count"),
2402						mobile_tab_count = $tag.attr("mobile-tab-count"),
2403						tab_count = ($(window).width() < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : tab_counted,
2404						mobile_tab_line = $tag.attr("mobile-tab-line"),
2405						tab_case = $tag.attr("data-case"),
2406						motion = $tag.attr("tab-motion"),
2407						priority = Number($initial_tab.attr('data-order')) || 1,
2408						navigation_use = $tag.attr("navigation-use");
2409					tabArrow(el);
2410					if(navigation_use == '1' || ($(window).width() < 991 && mobile_tab_line == '1' && len > Number(tab_count))) {
2411						if(motion_style == 1) {
2412							var motion = (((priority + 1) - Number(tab_count)) >= 0) ? priority - Number(tab_count) : 0;
2413						} else {
2414							var motion = Math.ceil(Number(priority) / Number(tab_count)) - 1;
2415						}
2416						$tag.attr('tab-motion', motion);
2417						tabMotion(el, motion, "", len, motion_style, tab_count, tab_case);
2418					}
2419				}
2420
2421				if(val.seq == 'all_products') {
2422	                if (b.ONE) $tag.addClass('link-to-전체상품');
2423					setGToolbarAllProducts($tag, settings, val.total.list_total);
2424				}
2425
2426				if($tag.has('input.gjs').length) {
2427					var gjs_status = (typeof elGalleryJS[val.seq] != 'undefined') ? 'reload-block' : 'load-block';
2428					setGalleryJS(gjs_status,$tag);
2429				}
2430				
2431	            if(val.type == 'forum') {
2432	            	var view = $tag.find('[data-loop="true"]').attr('data-view');
2433	                if(typeof view == 'undefined') view = 10;
2434	                if(typeof $.cookie('forum_' + val.seq) != 'undefined' && $.cookie('forum_' + val.seq)) {
2435	                	$.forum.init(val.seq,b.PAGE,view,$.cookie('forum_' + val.seq),$.cookie('forum_'+ val.seq +'_sfl'),$.cookie('forum_'+ val.seq +'_stx'),$.cookie('forum_'+ val.seq +'_scate'));	          
2436	                } else {
2437	                	$.forum.init(val.seq,b.PAGE,view);
2438					}
2439	                	
2440	                $.removeCookie('forum', { path : '/' });
2441	                $.removeCookie('forum_'+val.seq, { path : '/' });
2442	                $.removeCookie('forum_'+val.seq+'_sfl', { path : '/' });
2443	                $.removeCookie('forum_'+val.seq+'_stx', { path : '/' });
2444	                $.removeCookie('forum_'+val.seq+'_scate', { path : '/' });
2445
2446					if(val.type2 == 'guestbook') {						
2447	                    if(settings.input_updown == 'U') {                    	
2448	                        $tag.find('.default_top').removeClass('flex-value-order2').addClass('flex-value-order1');
2449	                        $tag.find('.default_bottom').removeClass('flex-value-order1').addClass('flex-value-order2');	                    
2450	                    } 
2451	                    else {
2452	                    	if (typeof settings.input_updown == 'undefined') {//블럭 추가 당시 세팅값 없을 때
2453                        	$tag.find('.default_top').removeClass('flex-value-order2').addClass('flex-value-order1');
2454                        	$tag.find('.default_bottom').removeClass('flex-value-order1').addClass('flex-value-order2');                            
2455                        	} else {
2456	                        $tag.find('.default_top').removeClass('flex-value-order1').addClass('flex-value-order2');
2457	                        $tag.find('.default_bottom').removeClass('flex-value-order2').addClass('flex-value-order1');
2458	                    	}
2459	                	}
2460	                }
2461				}
2462
2463				if(b.LUX && typeof res != 'undefined') {
2464					shopHeaderDisplay($tag.find('.shop-filter-header'),res);
2465				}
2466
2467				if(val.type == 'latest') {
2468					var latest_data = (typeof settings.latest_data != 'undefined' && settings.latest_data) ? settings.latest_data : {};
2469					$.latest.init(val.seq, latest_data);
2470					$tag.removeClass('preloading');
2471				}
2472
2473				if(val.type == 'review') {
2474					galleryEL[val.seq] = {
2475						'seq' : val.seq,
2476						'elname' : val.elname,
2477						'eltag' : tag,
2478						'folder' : val.folder,
2479						'mode' : val.mode,
2480						'elsettings' : val.elsettings,
2481						'feature' : val.feature,
2482						'type' : val.type,
2483						'type2' : val.type2,
2484						'searches' : val.searches
2485					};
2486					var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
2487					$.reviewContents.init(val.seq, gallery_data);
2488				}
2489
2490				if(b.VIEW) {
2491					var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'OFF';
2492					$tag.find('img[data-attach="true"]').attr('data-img-original',img_onoff);
2493
2494					setGalleryReturnItemCookie(b.PARENT);
2495					var c_g_p = (typeof $.cookie('gallery-page-' + b.PARENT.pid) != 'undefined') ? $.cookie('gallery-page-' + b.PARENT.pid) : 1;
2496					$.cookie('gallery',b.PARENT.pid, { path: '/', expires: 12 * 60 * 60 * 1000 });
2497					$.cookie('loadmore-' + b.PARENT.pid, c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
2498					if(typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products')) {
2499						c_g_p = (typeof $.cookie('gallery-page-all_products') != 'undefined') ? $.cookie('gallery-page-all_products') : 1;
2500						$.cookie('gallery','all_products', { path: '/', expires: 12 * 60 * 60 * 1000 });
2501						$.cookie('loadmore-all_products', c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
2502					}
2503				}
2504
2505				$tag.find('[data-fixed-width]').each(function() {
2506					$(this).css('width',$(this).attr('data-fixed-width')+'px');
2507				});
2508
2509
2510				$tag.find('[data-map="true"]:not(iframe)').each(function() {
2511					var map_url = $(this).attr('data-url');
2512					if(typeof map_url != 'undefined' && map_url) {
2513						var map_iframe = getMapURL(map_url,'html');
2514						$(this).replaceWith(map_iframe);
2515						if(map_iframe.indexOf('google-map disabled') === -1) $(this).next('.map-undefined').remove();
2516					}
2517				});
2518
2519				if(val.type == 'contact' && val.type2 == 'franchise map') {
2520					$.each($tag.find('[data-fmap-loop="true"] .item .item-name'), function(i, v) {
2521                        let itemName = $(v).html();
2522                        itemName = itemName.replace(/&lt;&nbsp;/g, '&lt;').replace(/&nbsp;&gt;/g, '&gt;');
2523                        $(v).html(itemName);
2524                    });
2525
2526                    var $mapItem = $tag.find('[data-fmap-loop="true"] > .item.selected');
2527                    drawMap($mapItem, $tag);
2528                    fmapMobilePaging($tag);
2529                } else {
2530                	if($tag.find('[data-map_kind="kakao"]').length && (typeof kakao == 'undefined' || typeof kakao.maps == 'undefined' || 
2530kakao.maps == null || property.VALIDPLAN == '')) {
2531						$tag.find('[data-map_kind="kakao"]').html('지도연결해제됨. Javascript키 확인');
2532						$tag.find('[data-map_kind="kakao"]').html('<iframe class="google-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.5659473821083!2d127.0282496015659!3d37.494568!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1598c361b2b%3A0xdbf9af292beff3c!2z6rCV64Ko!5e0!3m2!1sko!2skr!4v1637303748377!5m2!1sko!2skr" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"></iframe>');
2533					} else {
2534						$tag.find('[data-map_kind="kakao"]').each(function() {
2535							var container = this;
2536	                        var lat = $(this).data("lat");
2537	                        var lng = $(this).data("lng");
2538	                        var zoomInOut = $(this).data("zoominout");
2539	                        var mapTitle = $(this).data("maptitle");
2540	                        var mapContent = $(this).data("mapcontent");
2541	                        var useTitle = $(this).data("usetitle");
2542	                        var useContent = $(this).data("usecontent");
2543
2544	                        if (typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
2545	                        if (typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
2546	                        if (typeof mapContent == 'undefined' || !mapContent) mapContent = '';
2547	                        if (typeof useTitle == 'undefined' || !useTitle) useTitle = false;
2548	                        if (typeof useContent == 'undefined' || !useContent) useContent = false;
2549	                        
2550	                        var options = { center: new kakao.maps.LatLng(lat, lng), level: 3 };
2551	                        var c_map = new kakao.maps.Map(container, options);
2552	                        var marker = new kakao.maps.Marker({ position: new kakao.maps.LatLng(lat, lng), map: c_map });
2553	                        
2554							if(zoomInOut == true) {
2555								// var mapTypeControl = new kakao.maps.MapTypeControl();
2556								// c_map.addControl(mapTypeControl, kakao.maps.ControlPosition.TOPRIGHT);
2557								// var zoomControl = new kakao.maps.ZoomControl();
2558								// c_map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);
2559								var zoomControlHtml = '';
2560								zoomControlHtml += '\
2561									<div class="zoom-control" style="margin-top: 8px; margin-right: 8px; right: 0; width: 30px; position: absolute; background-color: #fff; z-index: 1; border-radius: 3px; box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.16);">\
2562										<div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
2563											<svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 11h-4V7c0-.55-.45-1-1-1s-1 .45-1 1v4H7c-.55 0-1 .45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1v-4h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
2564										</div>\
2565										<div class="slider-wrap-container" style="height: 130px;">\
2566											<div class="slider-wrap small" style="text-align: center; height: 100%;">\
2567												<div style="max-height: 100%;" class="zoom-control-slider"></div>\
2568											</div>\
2569										</div>\
2570										<div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
2571											<svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 13H7c-.55 0-1-.45-1-1s.45-1 1-1h10c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>\
2572										</div>\
2573									</div>\
2574								';
2575								var $zoomController = $(zoomControlHtml);
2576								$(container).append($zoomController);
2577								var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
2578									'orientation': 'vertical',
2579									'min' : 1,
2580									'max' : 14,
2581									'step' : 1,
2582									'value' : 3,
2583									'handle' : '<div>dfafasdfas</div>',
2584									// 'reversed' : true,
2585									'tooltip' : 'hide',
2586								}).on('slide', function(data) {
2587									c_map.setLevel(data.value);
2588									c_map.setCenter(marker.getPosition());
2589								}).on('slideStop', function(data) {
2590									c_map.setLevel(data.value);
2591									c_map.setCenter(marker.getPosition());
2592								});
2593
2594								$zoomController.find('.btn-zoom-control').on('click', function() {
2595									if($(this).data('inout') == 'I') {
2596										c_map.setLevel(c_map.getLevel() - 1);
2597										zoom_slider.slider('setValue', c_map.getLevel());
2598									} else if($(this).data('inout' == 'O')) {
2599										c_map.setLevel(c_map.getLevel() + 1);
2600										zoom_slider.slider('setValue', c_map.getLevel());
2601									}
2602								});
2603
2604								kakao.maps.event.addListener(c_map, 'zoom_changed', function() {
2605									zoom_slider.slider('setValue', c_map.getLevel());
2606								});
2607							}
2608
2609							if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
2610								var iwContent = '';
2611								if(useTitle == true && mapTitle) {
2612									iwContent = '<div class="title">' + mapTitle + '</div>';
2613								}
2614								if(useContent == true && mapContent) {
2615									iwContent += '<div class="content">' + mapContent + '</div>';
2616								}
2617								// var infowindow = new kakao.maps.InfoWindow({
2618								//     position: marker.getPosition(),
2619								//     content : iwContent
2620								// });
2621								// infowindow.open(c_map, marker);
2622								if(iwContent) {
2623									iwContent = '<div class="contact-map-info-window"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0C4.69 0 2 2.69 2 6s1 4 6 10c5-6 6-6.69 6-10s-2.69-6-6-6zm0 8.3a2.3 2.3 0 1 1 0-4.6 2.3 2.3 0 0 1 0 4.6z"></path></svg>
2623' + iwContent + '</div>';
2624									var infoWindow = $(iwContent);
2625									$(container).append(infoWindow);
2626									// infoWindow.css('bottom', 'calc(-100% + ' + (infoWindow.outerHeight() + 36) + 'px)');  
2627								}
2628							}
2629							$(window).on("resize", function() {
2630								c_map.setCenter(marker.getPosition());
2631							});
2632						});
2633					}
2634
2635					if($tag.find('[data-map_kind="naver"]').length && (typeof naver == 'undefined' || typeof naver.maps == 'undefined' || naver.maps == null || property.VALIDPLAN == '')) {
2636						$tag.find('[data-map_kind="naver"]').html('지도연결해제됨. Client ID 확인');
2637						$tag.find('[data-map_kind="naver"]').html('<iframe class="google-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.5659473821083!2d127.0282496015659!3d37.494568!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1598c361b2b%3A0xdbf9af292beff3c!2z6rCV64Ko!5e0!3m2!1sko!2skr!4v1637303748377!5m2!1sko!2skr" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"></iframe>');
2638					} else {
2639						$tag.find('[data-map_kind="naver"]').each(function() {
2640							var container = this;
2641							var lat = $(this).data("lat");
2642							var lng = $(this).data("lng");
2643							var options = { center: new naver.maps.LatLng(lat, lng), zoom: 17};
2644							var c_map = new naver.maps.Map(container, options);
2645							var marker = new naver.maps.Marker({ position: new naver.maps.LatLng(lat, lng), map: c_map});
2646							var zoomInOut = $(this).data("zoominout");
2647							var mapTitle = $(this).data("maptitle");
2648							var mapContent = $(this).data("mapcontent");
2649							var useTitle = $(this).data("usetitle");
2650							var useContent = $(this).data("usecontent");
2651							if(typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
2652							if(typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
2653							if(typeof mapContent == 'undefined' || !mapContent) mapContent = '';
2654							if(typeof useTitle == 'undefined' || !useTitle) useTitle = false;
2655							if(typeof useContent == 'undefined' || !useContent) useContent = false;
2656							if(zoomInOut == true) {
2657								// options.zoomControl = true;
2658								var zoomControlHtml = '';
2659								zoomControlHtml += '\
2660									<div class="zoom-control" style="margin-top: 8px; margin-right: 8px; right: 0; width: 30px; position: absolute; background-color: #fff; z-index: 1; border-radius: 3px; box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.16);">\
2661										<div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
2662											<svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 11h-4V7c0-.55-.45-1-1-1s-1 .45-1 1v4H7c-.55 0-1 .45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1v-4h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
2663										</div>\
2664										<div class="slider-wrap-container" style="height: 130px;">\
2665											<div class="slider-wrap small" style="text-align: center; height: 100%;">\
2666												<div style="max-height: 100%;" class="zoom-control-slider"></div>\
2667											</div>\
2668										</div>\
2669										<div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
2670											<svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 13H7c-.55 0-1-.45-1-1s.45-1 1-1h10c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>\
2671										</div>\
2672									</div>\
2673								';
2674								var $zoomController = $(zoomControlHtml);
2675								$(container).append($zoomController);
2676								var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
2677									'orientation': 'vertical',
2678									'min' : 6,
2679									'max' : 21,
2680									'step' : 1,
2681									'value' : 17,
2682									'handle' : '<div>dfafasdfas</div>',
2683									'reversed' : true,
2684									'tooltip' : 'hide',
2685								}).on('slide', function(data) {
2686									c_map.setZoom(data.value);
2687									c_map.setCenter(marker.getPosition());
2688								}).on('slideStop', function(data) {
2689									c_map.setZoom(data.value);
2690									c_map.setCenter(marker.getPosition());
2691								});
2692								$zoomController.find('.btn-zoom-control').on('click', function() {
2693									if($(this).data('inout') == 'I') {
2694										c_map.setZoom(c_map.getZoom() + 1);
2695										zoom_slider.slider('setValue', c_map.getZoom());
2696									} else if($(this).data('inout' == 'O')) {
2697										c_map.setZoom(c_map.getZoom() - 1);
2698										zoom_slider.slider('setValue', c_map.getZoom());
2699									}
2700								});
2701
2702								naver.maps.Event.addListener(c_map, 'zoom_changed', function(zoom) {
2703									zoom_slider.slider('setValue', c_map.getZoom());
2704								});
2705							}
2706
2707							if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
2708								var iwContent = '';
2709								if(useTitle == true && mapTitle) {
2710									iwContent = '<div class="title">' + mapTitle + '</div>';
2711								}
2712								if(useContent == true && mapContent) {
2713									iwContent += '<div class="content">' + mapContent + '</div>';
2714								}
2715
2716								if(iwContent) {
2717									iwContent = '<div class="contact-map-info-window"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0C4.69 0 2 2.69 2 6s1 4 6 10c5-6 6-6.69 6-10s-2.69-6-6-6zm0 8.3a2.3 2.3 0 1 1 0-4.6 2.3 2.3 0 0 1 0 4.6z"></path></svg>
2717' + iwContent + '</div>';
2718									var infoWindow = $(iwContent);
2719									$(container).append(infoWindow);
2720									// infoWindow.css('bottom', 'calc(-100% + ' + (infoWindow.outerHeight() + 36) + 'px)');  
2721								}
2722								// var infowindow = new naver.maps.InfoWindow({
2723								//     content : iwContent
2724								// });
2725								// infowindow.open(c_map, marker);
2726							}
2727							$(window).on("resize", function() {
2728								c_map.setCenter(marker.getPosition());
2729							});
2730						});
2731					}
2732                }
2733
2734				if(val.type == 'form' || (val.type == 'contact' && val.type2 == 'franchise bar')) {
2735					$.forms.init(val.seq);
2736				}
2737
2738				if(val.type == 'showcase') {
2739					if($tag.hasClass('carousel') && $tag.find('.item').length > 1 && $tag.find('.control-box .carousel-control').hasClass('hide')) {
2740						$tag.find('.control-box .carousel-control').removeClass('hide');
2741					}
2742				}
2743
2744				//video block ::: gallery
2745				if(val.type == 'video') {
2746					if($tag.find('.video-gallery-url').length>0) { //재생방식 : 확대보기 
2747						$.each($tag.find('.item'),function(i,v){
2748							if(val.mode=='zoom') appendGalleryFrame($(this).parents('.element'),val.seq,val.type);
2749						});
2750
2751	                    // let lsw = document.querySelector('.element[data-id="' + val.seq + '"] .swiper');
2752		                // if(lsw && lsw.swiper) {
2753	                    //     let slider_motion = $('.element[data-id="' + val.seq + '"]').attr('data-slider-motion');
2754
2755		                // 	$('#gframe-' + val.seq).on('opened', function(event, slide){
2756				        //     	console.log('gallery opend', slider_motion);
2757	                    //         if(slider_motion != 'stop') {
2758	                    //             lsw.swiper.autoplay.stop();
2759	                    //         }
2760		                //     }).on('closed', function (event){
2761				        //     	console.log('gallery closed');
2762	                    //         if(slider_motion != 'stop') {
2763	                    //             lsw.swiper.autoplay.start();
2764		                //         }
2765		                //     });
2766						// }
2767					}
2768
2769					resizeVideoIframe($tag);
2770				}
2771
2772				//add script
2773				if(val.eljs){
2774					var js_string = val.eljs;
2775					var $script_tag = $('<script type="text/javascript" id="js_' + idx + '"></script>');
2776					$script_tag.html(js_string);
2777					$('.dsgn-body').append($script_tag);
2778				}
2779
2780				if($tag.find('.slick').length > 0) {
2781					if (val.type == 'sync' && typeof syncSlickFn == 'function') syncSlickFn('.' + val.elname);
2782					else if($tag.is('[data-clslick]') && typeof clSlickFn == 'function') clSlickFn('.' + val.elname);
2783				}
2784
2785				// log 
2786				if(typeof settings['google_track'] != 'undefined') {
2787					$('.dsgn-body').append("<script type='text/javascript' src='//www.googleadservices.com/pagead/conversion_async.js'></script>");
2788				}
2789
2790				//add style
2791				var jcss = CSSJSON.toJSON(val.elcss);
2792
2793				var element_mh = jcss?.children[`.${val.elname}`]?.attributes['min-height'] ?? '';
2794				if (element_mh && /%$/.test(element_mh)) {
2795					const converted_mh = element_mh.replace('%', '');
2796					$tag.css('min-height',`${converted_mh}vh`);
2797				}
2798
2799				var elpd = style.getPadding(jcss,val.elname);
2800				var pt = parseInt(elpd.top);
2801				var pb = parseInt(elpd.bottom);
2802					
2803				if(pt>0||pb>0){
2804					default_t_css = default_t_css + '\n 	.'+val.elname + '{';
2805					if(Math.ceil(pt*0.8)>0)
2806					default_t_css = default_t_css + 'padding-top: '+Math.ceil(pt*0.8) + 'px!important;';
2807					if(Math.ceil(pb*0.8)>0)
2808					default_t_css = default_t_css + 'padding-bottom: '+Math.ceil(pb*0.8) + 'px!important;';
2809					default_t_css = default_t_css + '}';
2810
2811					default_m_css = default_m_css + '\n 	.'+val.elname + '{';
2812					if(Math.ceil(pt*0.5)>0)
2813					default_m_css = default_m_css + 'padding-top: '+Math.ceil(pt*0.5) + 'px!important;';
2814					if(Math.ceil(pb*0.5)>0)
2815					default_m_css = default_m_css + 'padding-bottom: '+Math.ceil(pb*0.5) + 'px!important;';
2816					default_m_css = default_m_css + '}';
2817				}
2818				if(idx == data.length-1){
2819					var css = '@media only screen and (max-width:767px) {' + default_t_css + '\n}\n';
2820					css = css + '@media only screen and (max-width:480px) {' + default_m_css + '\n}';
2821
2822					if($('#el-paddingcss').length == 0) $('.dsgn-body').find('#el_'+(data.length-1)+'css').after('<style id="el-paddingcss">'+css+'</style>');
2823					else $('#el-paddingcss').append(css);
2824				}
2825				
2826				if(val.type == 'product') {
2827					if(val.is_wishlist == true) {
2828						$('.product-detail-btn .btn-myfav .btn-myfav-icon').addClass('on');
2829					} else {
2830						$('.product-detail-btn .btn-myfav .btn-myfav-icon').removeClass('on');
2831					}
2832				}
2833
2834				if($.inArray(val.type, ['contents', 'text', 'image', 'video']) > -1) {
2835					let ecs = enableContentsSlider(val.seq, val.type, settings);
2836					if(typeof settings.list_type != 'undefined' && settings.list_type == 's' && ecs) {
2837	                    $.contentsSlider.ready(val.seq).then(() => {$.contentsSlider.init(val.seq, settings)});
2838	                }
2839				}
2840
2841				return new Promise(function(resolve) { setTimeout(resolve) });
2842			}
2843
2844			if(check_modoo) {
2845				m_floating(fl_data);
2846			}
2847			var dataloop = async function(data) {
2848				var promises = data.map(async function(val, idx) {
2849					return await drawData(idx, val)
2850				});
2851				return await Promise.all(promises);
2852			}
2853
2854			if(checkGalleryView) setViewPageStyle();
2855			dataloop(data).then(function() {
2856				$('.el-footer').css('visibility', 'visible');
2857				$.processOFF();
2858
2859				document.querySelectorAll('.element video').forEach(function(video) {
2860					if(video.readyState > 0) video.classList.add('loaded');
2861					video.addEventListener('loadeddata', function() {
2862						this.classList.add('loaded');
2863					});
2864				});
2865
2866				$('.dsgn-body').fitVids();
2867				$('.carousel').carousel({
2868					pause: 'none'
2869				});
2870				
2871				$('[data-aos-dummy]').each(function() {
2872					$(this).attr('data-aos', $(this).attr('data-aos-dummy')).removeAttr('data-aos-dummy');
2873				});
2874				setTimeout(function() {
2875					$('.element[data-aos]').removeClass('render-aos').addClass('aos-animate');
2876					AOS.init({ disableMutationObserver: true });
2877				});
2878				changeBrokenImages('.element');
2879				
2880				$('.element').each(function(i,v){
2881					var $tag = $(v);
2882					var elFonts = $tag.css('font-family');
2883					elFonts = elFonts + ",'Nanum Gothic'";
2884					elFonts = elFonts.replace(/"/g, '\'');
2885					$tag.css('font-family', ($tag.css('font-family') + ",'Nanum Gothic'").replace(/"/g, '\''));
2886				});
2887				$('html').toggleClass('gtoolbar-sticky-ON', $('.cl-gtoolbar[data-sticky="ON"]').length > 0 ? true : false);
2888
2889				if(b.VIEW) {
2890					// prev next
2891					$('.data-page-prev').addClass('active');
2892					$('.data-page-next').addClass('active');
2893
2894					if(b.PARENT.prev === null) $('.data-page-prev').removeClass('active');
2895					if(b.PARENT.next === null) $('.data-page-next').removeClass('active');
2896
2897					if(b.PARENT.mode == 'shopping') {
2898						$('.data-page-prev, .data-page-next').removeClass('active');
2899						if(b.PARENT.prev) $('.data-page-prev').addClass('active');
2900						if(b.PARENT.next) $('.data-page-next').addClass('active');
2901
2902						if(typeof property.PRODINFO === 'object') $.products.display_info();
2903						if($('#review-onoff').val() == 'true') $.products.review(b.VIEW,b.PAGE);
2904						if($('#qna-onoff').val() == 'true') $.products.qna(b.VIEW,b.PAGE);
2905					} else {
2906						if($(`.page-comments[data-id="${b.VIEW}"]`).length == 0) _this.displayComment();
2907
2908						// initViewPageToolbar().then(function(pageToolbar){
2909						// 	setViewPageToolbar();
2910		                // });
2911						initViewPageBottom();
2912					}
2913				}
2914
2915				var isPage = false;
2916				$.each(b.MENULIST, function(i,k) {
2917					isPage = (k.toUpperCase() == b.PAGE.toUpperCase()) ? true : isPage;
2918				});
2919			
2920				// if(!b.ONE && !b.VIEW && !isPage) location.replace(URL);
2921				
2922				// menu ver3 : fheader
2923				if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
2924
2925				// shopping wrap remove
2926				if($('.shopping-wrap').length || $('.shopping-more-wrap').length) {
2927					$('.shopping-wrap').remove();
2928					$('.shopping-more-wrap').remove();
2929				}
2930
2931				// shopping wrap create
2932				if(!$('.dsgn-body').hasClass('mode-config') && $('.cl-s-product-detail').length > 0 && $('div[data-el*="el_"]').length > 1) {
2933					if(shopping_more == 'ON') {
2934						var prod_content = $('div[data-el*="el_"]').not('.cl-s-product-detail').addClass('hide');
2935						$('.product.cl-s-product-detail').after('<div class="shopping-wrap open"></div>');
2936						$('.shopping-wrap').html(prod_content);
2937						$('div[data-el*="el_"]').each(function(idx, v) {
2938							$(this).removeClass('hide');
2939							if($('.shopping-wrap').height() > 800) return false;
2940						});
2941					}
2942				}
2943				/*shopping more create*/
2944				if($('.shopping-wrap').length && $('.shopping-wrap').height() >= 800 && $('.shopping-more').length == 0) {
2945					var more_txt = (LANG == 'ko') ? '상품정보 더보기' : 'MORE';
2946					var colorSet = shopping_more_color,
2947						sm_font = (!colorSet) ? '' : colorSet.color,
2948						sm_bgColor = (!colorSet) ? '' : colorSet.background_color,
2949						sm_border = (!colorSet) ? '' : colorSet.border_color;
2950					var review_chk = ($('.cl-s-product-review').length > 0) ? true : false,
2951						qna_chk = ($('.cl-s-product-qna').length > 0) ? true : false;
2952
2953					$('.shopping-wrap').css('max-height','800px')
2954									   .css('overflow','hidden')
2955									   .after('<div class="shopping-more-wrap"><div class="shopping-more">'+more_txt+'</div></div>');
2956					$('.shopping-wrap').removeClass('open');
2957					if(sm_font) $('.shopping-more').css('color',sm_font);
2958					if(sm_bgColor) $('.shopping-more').css('background-color',sm_bgColor);
2959					if(sm_border) $('.shopping-more').css('border-color',sm_border);
2960					if(!review_chk && !qna_chk) $('.shopping-more-wrap').css('padding-bottom','100px');
2961				}
2962
2963				$('.el-footer').show();                
2964
2965				if($('.element a[data-popup][data-popup-name]').length > 0 && (!b.VALIDPLAN || b.VALIDTYPE == 'PK')) {
2966					$('.element a[data-popup][data-popup-name]').addClass('disabled');
2967				}
2968
2969				if($('.element[data-layout]').length > 0) {
2970					setLayoutHeight();
2971				}
2972				// if($('.element[data-parallax="true"]').length > 0) setParallax();
2973				if(typeof setBlockParallax == 'function') setBlockParallax($('.element'));
2974				if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh(100);
2975				
2976				if(typeof fbq == 'function' && b.VALIDTYPE == 'SM') {
2977					if(b.VIEW) {
2978						var checkProduct = (b.PAGE.match(/^forum,/g) === null && typeof b.PARENT != 'undefined' && typeof b.PARENT.mode != 'undefined' && b.PARENT.mode == 'shopping') ? true : false,
2979							mn = (b.ONE) ? b.PARENT.opage : b.PARENT.ppage;
2980						if(checkProduct && typeof callbackEvtViewContent == 'function') callbackEvtViewContent(mn,b.PARENT.seq,b.PARENT.title,$('.total-price').text().replace(/[^0-9]/g,''));
2981					} else {
2982						var checkProductList = ($('.element[data-type="gallery"][data-mode="shopping"]').length > 0) ? true : false;
2983						if(checkProductList && typeof callbackEvtLead == 'function') callbackEvtLead(b.PAGE);
2984					}
2985				}
2986
2987				deferred.resolve();
2988			});
2989
2990			return deferred.promise();
2991		}
2992
2993		var elPush = function (prop) {
2994		    /* prop - reorder list hide */
2995		    var pageID = b.PAGE.split(','),
2996		        chgBG = false,
2997		        tmpTag = '',
2998		        currentPAGE = '',
2999		        default_t_css = '', default_m_css = '';
3000		    var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false;
3001		    var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
3002		    	footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON',
3003		    	checkFooterDisplay = (footer_display != 'OFF') ? true : false;
3004
3005				currentPAGE = b.PAGE;
3006				var contentsParam = (currentPAGE=='index,template' && param.indexOf('/org/') == -1) ? param + '/org/' + b.PAGE : param;
3007
3008			if(b.VALIDPLAN && $.inArray(b.VALIDTYPE, ['BN','SM']) > -1 && b.CERT_USE == 'Y') {
3009    			if(b.CERT_USE == 'Y') {
3010    				if(b.UMEMBER.check_login == true) isUserCertified(history);
3011    			}
3012    		}
3013	        if(pageID[0] == 'forum' && b.VIEW) {
3014		    	clearDsgnbody();
3015
3016				var preloading = loadingScript({'forum':true});
3017				preloading.done(function() {
3018					var ps_fmview = $.forum.view(b.VIEW);
3019					ps_fmview.done(function(data) {
3020						_this.displayComment(data);
3021						if(b.VIEW) setViewPageToolbar();
3022						$('.el-footer').show().css('visibility', 'visible');
3023						$.processOFF();
3024						$('.dsgn-body').animate({scrollTop: 0}, 0,'easeInOutQuart'); 
3025					}).fail(function(error_msg) {
3026						// console.log(error_msg);
3027						$.processOFF();
3028					});
3029				});
3030				return false;
3031	        }
3032
3033				if(b.pageContent.hasOwnProperty(currentPAGE)) {
3034					var loadCachedContents = function() {
3035						var loadingContents = loadPush(b.pageContent[currentPAGE]);
3036						loadingContents.then(function() {
3037							$('.el-footer').css('visibility', 'visible');
3038							$.processOFF();
3039						});
3040					};
3041					if(b.pageBlocksType.hasOwnProperty(currentPAGE)) {
3042						var preloading = loadingScript(b.pageBlocksType[currentPAGE]);
3043						preloading.then(loadCachedContents);
3044					} else {
3045						loadCachedContents();
3046					}
3047		        } else {
3048					contentsParam = (b.PUBLISH) ? contentsParam : contentsParam + '/render/true';
3049					if(checkGalleryView) $('.el-footer').addClass('hide');
3050					$.ajax({
3051						url: '/template/contents/sid/' + b.SID + '/page/' + encodeURIComponent(currentPAGE) + contentsParam,
3052						data: { siteum: b.SITEUM },
3053						dataType: 'json',
3054						type: 'GET',
3055						async: true,
3056					success: function(data) {
3057						if(typeof data.error != 'undefined' || data.error) {
3058							if(currentPAGE!='index,template') {
3059								alert($.lang[LANG]['page.not.found']);
3060								location.replace('/');
3061							}
3062							}
3063							if(currentPAGE!='index,template') b.pageContent[currentPAGE] = data.contents;
3064							if(data.conf) b.pageConf[currentPAGE] = data.conf;
3065							if(typeof data.blocks_type != 'undefined') b.pageBlocksType[currentPAGE] = data.blocks_type;
3066							if(data.initContent !== undefined) property.INITPAGE = JSON.parse(data.initContent);
3067						
3068						var preloading = loadingScript(data.blocks_type);
3069						preloading.then(function() {
3070							var loadingContents = loadPush(data.contents);
3071							loadingContents.then(function() {
3072								$('.el-footer').css('visibility', 'visible');
3073								if(checkFooterDisplay && $('.el-footer').hasClass('hide')) $('.el-footer').removeClass('hide');
3074								$.processOFF();
3075							});
3076						});
3077					}
3078				});
3079	        }
3080		}
3081
3082		var scrollspy = function() {
3083		    if(!b.ONE) return false;
3084		    var top = 0,
3085		        active = '';
3086
3087		    // top = ($('.dsgn-body').hasClass('sidebar')) ? 0 : $('.el-menu header').outerHeight();
3088
3089		    $.each(b.MENULINK,function(i,v) {
3090
3091		        var $el = ($.inArray(v,property.MENULIST) > -1) ? $('.link-to-'+v) : '';
3092		        if($el.length>0) {
3093		            var offset = $el.offset();
3094		           top = ($('.dsgn-body').hasClass('sidebar')) ? 0 : $('.el-menu header').outerHeight();
3095		            if((Math.floor(offset.top) - $(document).scrollTop())<= top) {		            	
3096		            	active = v;
3097		            }
3098		        }
3099
3100		    });
3101
3102		    
3103			if(!$('#tpl-menu li a[href="#'+active+'"]').parent().hasClass('active')) {
3104				
3105				$('#tpl-menu li').removeClass('active').removeClass('open');
3106				
3107				$('#tpl-menu li a[href="#'+active+'"]').parent().addClass('active');
3108				if( $('#tpl-menu li a[href="#'+active+'"]').closest('.dropdown-menu').length>0 ) {
3109					if($('body').width() > 768) $('#tpl-menu li a[href="#'+active+'"]').closest('.dropdown').addClass('active');
3110					else {
3111						//원페이지일 때 769~783 해상도에서 갤러리 위에 마우스 올리면 하위메뉴 열리는 현상 있어서 모바일에서만 open 클래스 추가 되도록 #mobile-nav 코드 추가.
3112						$('#mobile-nav #tpl-menu li a[href="#'+active+'"]').closest('.dropdown').addClass('open');
3113					}
3114				}
3115			}
3116
3117		    if($(document).scrollTop() + $('body').height() == $('body').prop('scrollHeight')) {
3118		    	
3119		        var last = b.MENULINK[b.MENULINK.length-1],
3120		            $el = ($.inArray(last,property.MENULIST) > -1) ? $('.link-to-'+last) : '';
3121
3122		        if($el.length>0) {
3123		            if($el.offset().top>top) {
3124		                $('#tpl-menu li').removeClass('active').removeClass('open');
3125		                
3126		                if($(document).scrollTop()!=0) 
3127		                	$('#tpl-menu li a[href="#'+last+'"]').parent().addClass('active');
3128
3129						if($('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown-menu').length>0) {
3130							if($('body').width() > 768) $('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown').addClass('active');
3131							else $('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown').addClass('open');
3132						}
3133		            }
3134		        }
3135		    }
3136
3137		}
3138
3139		var fixedMenu = function() {
3140			if($.clnav.check()) return;
3141
3142			if($('header.navbar').hasClass('navbar-fheader')) { // menu ver3 : fheader 
3143				if($('body').is('[data-gjs^="fixedscroll"]')) {
3144					return false;
3145				}
3146
3147				var isSidebar = $('.el-menu > header').hasClass('sidebar');
3148				if($(document).scrollTop() > $('header.navbar').height()) {
3149					if(window.innerWidth > 768) {
3150						$('.menu-logo-top').hide();
3151						$('.el-menu').addClass('fixed-fheader');
3152					}
3153					if(b.HEADER && !isSidebar)  $('header.navbar').removeClass('transparent');
3154				} else if($(document).scrollTop() <= $('header.navbar').height()) {
3155					$('.el-menu').removeClass('fixed-fheader');
3156					$('.menu-logo-top').show();
3157					
3158					if(b.HEADER && !isSidebar) {
3159						$('header.navbar').addClass('transparent');
3160						$('.dsgn-body').css('padding-top','0px');
3161					}
3162				}
3163
3164				return false;
3165			}
3166
3167		    header_fixed = $('.header.el-menu').height();
3168		    var user_menu = $('.el-menu');
3169			var menu_color = $('header.navbar').css('background-color');
3170			var menu_bg_img = (typeof $('header.navbar').css('background-image') != 'undefined') ? $('header.navbar').css('background-image') : 'none';
3171			var menu_bg_position = (typeof $('header.navbar').css('background-position') != 'undefined') ? $('header.navbar').css('background-position') : 'center center';
3172			var menu_bg_repeat = (typeof $('header.navbar').css('background-repeat') != 'undefined') ? $('header.navbar').css('background-repeat') : 'no-repeat';
3173			var menu_bg_size = (typeof $('header.navbar').css('background-size') != 'undefined') ? $('header.navbar').css('background-size') : 'cover';
3174
3175		    if($(document).scrollTop() > header_fixed && user_menu.hasClass('fixed')==false && !$('.dsgn-body').hasClass('sidebar')) {
3176		        user_menu.fadeOut('fast', function() {
3177		            $(this).addClass('fixed').fadeIn('fast');
3178		            $('.fixed').addClass('fixed-position');
3179		            if(!b.HEADER || $('header.navbar').hasClass('sidebar') ) {
3180	                	var topval = ($('.creatorlink-header').length==1) ? '55px' : '0';
3181		            	$('.el_0').css('margin-top',topval);
3182		                var $header_empty = $('<div class="header-empty"></div>');
3183		                if($(".header-empty").length==0) {
3184		                	var topval = ($('.creatorlink-header').length==1) ? '55px' : '0';
3185			                $header_empty.css({
3186			                    'background-color' : $('header.navbar').css('background-color'),
3187								'background-image' : menu_bg_img,
3188								'background-position' : menu_bg_position,
3189								'background-repeat' : menu_bg_repeat,
3190								'background-size' : menu_bg_size,
3191			                    //'position' : 'relative',
3192			                    'width' : '100%',
3193			                    'height' : header_fixed+'px',
3194			                    'top' : topval,
3195			                    'z-index' : '1'
3196			                });
3197			                $('.dsgn-body').prepend($header_empty);
3198			            }
3199       		        	$('.header-empty').css('position','relative');
3200		            } else {
3201		            	$('header.navbar').removeClass('transparent');
3202		            }
3203		            if(window.innerWidth > 768) $('.menu-logo-top').hide();
3204		        });        
3205		    } else if($(document).scrollTop() < header_fixed && user_menu.hasClass('fixed') && !$('.dsgn-body').hasClass('sidebar')){
3206		        user_menu.fadeOut('fast', function(){
3207			        $('.header-empty').css('position','absolute');
3208		            $('.fixed').addClass('fixed-position');
3209		            user_menu.removeClass('fixed').fadeIn('fast');
3210		            if(!b.HEADER  || $('header.navbar').hasClass('sidebar') ) {
3211		            	$('.el_0').css('top','0');
3212		            } else {
3213		            	$('header.navbar').addClass('transparent');
3214		            	if($('.creatorlink-header').length == 1) $('div.header.fixed-position').addClass('top-zero');
3215		            }
3216		            $('.menu-logo-top').show();
3217		        });
3218		    }
3219		}
3220
3221		var elFooter = function() {
3222			if(typeof b.pageContent[b.PAGE] == 'undefined' && $('.error_404.new_design').length > 0) $('.error_404.new_design').remove();
3223			if($('.el-footer').length > 0) {
3224				setTimeout(function() { 
3225					if($('.element:not(.el-footer)').length < 1 && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) {
3226						if($('.error_404.new_design').length == 0) {
3227							$('style#el-footercss').after(error_style);
3228							$('.element.el-footer').before(error_html); //404 error
3229						}
3230					}
3231					$('.el-footer').show(); 
3232				}, 300);
3233				return false;
3234			}
3235			
3236			if(b.FTAG == '') b.FTAG = '<div class="footer-' + b.SID + '"></div>';
3237		    $footer = $(b.FTAG);
3238		    $footer.find('.link-site-home').prop('href',URI); 
3239		    $footer.addClass('element')
3240		           .addClass('el-footer')
3241		           .addClass('hide')
3242		           .attr('data-type','footer')
3243		           .attr('data-el','el-footer')
3244		           .attr('data-id','footer')
3245		           .attr('data-name','footer-' + b.SID);
3246
3247		    $footer.appendTo($('.dsgn-body'));
3248		    $('.dsgn-body').prepend('<style id="el-footercss">' + b.FCSS + '</style>');
3249
3250			/*180822 add*/
3251			// before v1 creatorlink-box remove
3252			if($('.el-footer').find('.creatorlink-box').length > 0 ) {
3253				if($('.el-footer').find('.creatorlink-box').prev().hasClass('col-md-10')) $('.el-footer').find('.creatorlink-box').prev().removeClass('col-md-10').addClass('col-md-12');
3254				$('.el-footer').find('.creatorlink-box').remove();
3255			}
3256			// before v2 creatorlink-footer remove
3257			if( $('.el-footer').find('.creatorlink-footer').length > 0) {
3258				$('.el-footer').find('.creatorlink-footer').remove();
3259			}
3260
3261			// made it with Creatorlink
3262			if(!b.VALIDPLAN || b.VALIDTYPE == 'PK') {
3263				var is_templates = checkTemplateSite(b.SID);
3264				if(!is_templates) {
3265					$('.goto-top').addClass('moved');
3266					setMadeWithCreatorlink();
3267				}	
3268			}
3269
3270			setCLEscrowFooter(b.SID, b.VALIDTYPE, b.SETTINGS.sm_escrow);
3271
3272		 	var isfooterAttach = typeof $footer.attr('data-flogo') == 'undefined' ? false : $footer.attr('data-flogo'),
3273	 		   	checkFixTypeMenu = (typeof $('header.navbar-fheader').attr('data-fixtype') != 'undefined' && $('header.navbar-fheader').attr('data-fixtype')) ? true : false;
3274
3275	    	if(isfooterAttach) {
3276				if(b.ONE){
3277					if(b.VIEW) $footer.find('#site-home-footer').attr('href',URI).removeClass('mini-home');
3278					else $footer.find('#site-home-footer').attr('href','javascript:;').addClass('mini-home');
3279				} else $footer.find('#site-home-footer').attr('href',URI).removeClass('mini-home');
3280			}
3281
3282	    	/*var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
3283        		footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON';
3284
3285			if(footer_display=='OFF') $('.footer-'+b.SID+'.el-footer').hide();*/
3286
3287			/*180822  delete - powered by Creatorlink
3288			// before creatorlink-box remove
3289			if($('.el-footer').find('.creatorlink-box').length > 0 ) { 
3290				if($('.el-footer').find('.creatorlink-box').prev().hasClass('col-md-10')) $('.el-footer').find('.creatorlink-box').prev().removeClass('col-md-10').addClass('col-md-12');
3291				$('.el-footer').find('.creatorlink-box').remove();
3292			}
3293
3294			if($('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').length == 1 &&
3295				$('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').hasClass('col-md-10') ) {
3296				$('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').removeClass('col-md-10').addClass('col-md-12');
3297			}
3298
3299			if(typeof b.VALIDPLAN != 'undefined' && b.VALIDPLAN && b.VALIDTYPE != 'PK') {
3300				if( $('.el-footer').find('.creatorlink-footer').length > 0 ) $('.el-footer').find('.creatorlink-footer').remove();
3301			} else {
3302				var el_f_style = $('.el-footer').attr('style');
3303				if(typeof el_f_style != 'undefined' && 
3304					(el_f_style.indexOf('display') > -1 || el_f_style.indexOf('opacity') > -1 || el_f_style.indexOf('z-index') > -1) ) $('.el-footer').removeAttr('style');
3305				if($('.el-footer').css('display') == 'none') $('.el-footer').css('display','block');
3306				if($('.el-footer').css('opacity') < 1) $('.el-footer').css('opacity',1);
3307				if($('.el-footer').css('z-index') != 'auto') $('.el-footer').css('opacity','auto');
3308
3309				if( $('.el-footer').find('.creatorlink-footer').length == 0) setFooterCretorlinkBox();
3310				setFooterLink();
3311			}
3312			*/
3313			if($('.element:not(.el-footer)').length < 1 && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW && b.PAGE != 'psearch') {
3314				show404();
3315			}
3316
3317			changeBrokenImages($footer);
3318
3319		    if(!b.FTAG || b.FOOTER) {
3320		        // $footer.hide();
3321		    } else {
3322		    	if(b.VIEW && b.PARENT.mode == 'shopping' && $(document).width() < 768) {
3323		    		$('.el-footer').css('margin-bottom','55px');
3324		    	}
3325
3326		    	var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
3327		        	footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON';
3328
3329	        	if(footer_display!='OFF') {
3330			    	setTimeout(function() {
3331			    		$footer.removeClass('hide');
3332			    	},300);
3333			    }
3334
3335			    setTimeout(function(){
3336					if(checkFixTypeMenu) {
3337						if(b.VALIDPLAN) setFixedMenuCss(false);
3338						else {
3339							$('.el-menu header.navbar[data-fixtype]').find('#tpl-menu').css({
3340								'width': '100%'
3341							});
3342						}
3343					} 
3344			    },80);
3345		    }
3346		}
3347
3348		function setDefaultValue(value) {
3349			return (typeof value == 'undefined') ? '' : value;
3350		}
3351
3352		function setDefaultValueEtc(type, el) {
3353			type = (typeof el.attr('data-contact-etc-type') != 'undefined' && el.attr('data-contact-etc-type') ) ? el.attr('data-contact-etc-type') : type;
3354            
3355            var input_type = ['text','email','number','tel','url'];
3356            if($.inArray(type,input_type)) {
3357				return (typeof el.val() == 'undefined') ? '' : el.val();
3358			} else if(type == 'checkbox') {
3359				return ( el.prop('checked') ) ? 'O' : 'X';
3360			} else if(type == "radio") {
3361				return el.find('input:radio:checked').val();
3362			} else if(type == 'selectbox') {
3363				var result = (el.find('option').length > 0 ) ? el.find('option:checked').val() : el.find('.active').find('.opval').text();
3364				return result;
3365			} else {
3366				return 'etc article';
3367			}
3368		}
3369
3370		$(document).off('contactSubmitSecurityUpdate.render').on('contactSubmitSecurityUpdate.render', function(e, $contactEL, pid, settings, blocklang) {
3371			setContactSubmitSecurity($contactEL, pid, settings, blocklang);
3372		});
3373
3374		function setDefaultForm(el) {
3375			var ch_lang = getLang($(el + ' [form-idx]'), b.SID);
3376    		var type2 = $(el).attr('data-type2');
3377			
3378			$(el + ' [form-idx]').val('');
3379			$(el + ' [form-idx]').find('.form-date').val('');
3380			$(el + ' [form-idx]').find('.form-date').removeAttr('style')
3381			$(el).find('input:checkbox').removeAttr('checked');
3382			$(el).find('input:radio').removeAttr('checked');
3383			$(el).find('.checkbox-inline').removeClass('checked');
3384    		$(el).find('.radio-inline').removeClass('checked');
3385			$(el + ' [form-type="file.upload"]').find('label .file-uploaded-number').text('(0/10)');
3386			$(el + ' [form-type="file.upload"]').find('input[type="file"]').val('');
3387            $(el + ' [form-type="file.upload"]').find('input[type="text"]').val('');
3388            $(el + ' [form-type="file.upload"]').find('.file-title').text($.lang[ch_lang]['form.file.nofile']);
3389
3390            if($(el + ' [form-type="file.upload"]').find('.file-row').length > 0) {
3391            	$(el + ' [form-type="file.upload"]').find('.file-row').remove();
3392            	$(el + ' [form-type="file.upload"]').find('.file-uploaded-number').text('(0/10)');
3393		    	$(el + ' [form-type="file.upload"]').find('.file-title').removeClass('hide');
3394            }
3395
3396            if(type2 == 'form' && $(el).attr('data-captcha') != 'false' && $(el).find('input.input-captcha').length > 0) {
3397            	$(el).find('input.input-captcha').val('');
3398            	load_form_kcaptcha($(el), $(el).attr('data-id'));
3399            }
3400
3401            if($(el).attr('data-type2') == 'franchise bar') {
3402		        $(el).find('.view-privacy').removeClass('active');
3403		        $(el).find('.franchise-form-select').each(function() {
3404		            var defaultText = $(this).attr('form-name') || $(this).find('select.franchise-form-select-native option:first').text();
3405		            $(this).find('select.franchise-form-select-native').val('');
3406		            $(this).find('.franchise-form-select-label').text(defaultText).removeClass('selected');
3407		            $(this).find('.dropdown-menu li').removeClass('active');
3408		        });
3409		        // $(el).find('.form-privacy textarea').hide();
3410		    }
3411		}
3412
3413		function setDefaultContactForm(el) {
3414			$(el + ' [data-contact-firstname]').val('');
3415			$(el + ' [data-contact-lastname]').val('');
3416			$(el + ' [data-contact-email]').val('');
3417			$(el + ' [data-contact-website]').val('');
3418			$(el + ' [data-contact-phone]').val('');
3419			$(el + ' [data-contact-subject]').val('');
3420			$(el + ' [data-contact-message]').val('');
3421			$(el).find('input:checkbox').removeAttr('checked');
3422			$(el).find('input:radio').removeAttr('checked');
3423			$(el + ' [form-type="file.upload"]').find('input[type="file"]').val('');
3424            $(el + ' [form-type="file.upload"]').find('input[type="text"]').val('');
3425            $(el + ' [form-type="file.upload"]').find('.file-title').text("첨부된 파일이 없습니다.");
3426
3427			if($(el).attr('data-captcha') == 'true' && $(el).find('input.input-captcha').length > 0) {
3428				$(el).find('input.input-captcha').val('');
3429				$(el).find('.form-captcha .error').remove();
3430				load_form_kcaptcha($(el), $(el).attr('data-id'));
3431			}
3432		}
3433
3434		function setDefaultContactFormEtc(el) {
3435			$(el).find('[data-contact-etc]').each(function(i) {
3436				var type = (typeof $(this).attr('data-contact-etc-type') != 'undefined' && $(this).attr('data-contact-etc-type') ) ? $(this).attr('data-contact-etc-type') : $(this).attr('type');
3437				
3438				var input_type = ['text','email','number','tel','url'];
3439				if($.inArray(type,input_type)) {
3440					$(this).val('');
3441				} else if(type == "checkbox") {
3442					$(this).removeAttr('checked');
3443				} else if(type == "radio") {
3444					$(this).find('input:radio').first().click();
3445				} else if(type == "selectbox") {
3446					if($(this).find('option').length > 0) {
3447						$(this).find('option:first').attr('selected','selected');
3448					} else {
3449						$(this).find('.active').removeClass('active');
3450						$(this).find('li').first().addClass('active');
3451					}
3452				}
3453			});
3454		}
3455
3456		var ieLineClamp = function() {
3457		    if(isIE()) {
3458		        $('[data-ie-clamp]').each(function(index, element) {
3459		            var clamp = $(this).attr('data-ie-clamp').split(','),
3460		                line = new Array();
3461
3462		            $.each(clamp,function(k,v) {
3463		                line.push(v);
3464		            });
3465
3466		            for(i=line.length; i<3; i++) line[i] = 0;
3467		            var idx = getScreenIndex();
3468		            var apply = line[idx];
3469
3470		            // console.log($(element).text());
3471		            //safeClamp(element, apply);
3472		            $clamp(element, {clamp:apply, useNativeClamp:false });
3473		        });
3474		    }
3475		}
3476
3477		var safeClamp = function (selector, lines) {
3478			lines = lines || 3; // a default
3479			$(selector).each( function() {
3480				if($(this).text()) {
3481					$clamp( this, { clamp: lines, useNativeClamp:false  });
3482				}
3483			});
3484		}
3485
3486		$('.data-page-back, .toolbar-btn.back').live({
3487		    click : function() {
3488				var pPage = b.PARENT.page,
3489					page = b.PAGE.split(',');
3490					inMenu = ($.inArray(pPage,b.MENULIST) == -1 && page[0] != '_product') ? false : true;
3491
3492				if(!inMenu) {
3493					$(this).showModalFlat('INFORMATION','이동할 수 없습니다',true,false,'','ok');
3494					return false;
3495				} else {
3496					setGalleryReturnItemCookie(b.PARENT);
3497					if($.cookie('gallery') !== undefined && $.cookie('gallery') == 'all_products') {
3498						var c_g_p = (typeof $.cookie('gallery-page-all_products') != 'undefined') ? $.cookie('gallery-page-all_products') : 1;
3499				    	$.cookie('gallery', 'all_products', { path: '/', expires: 12 * 60 * 60 * 1000 });
3500				    	$.cookie('loadmore-all_products', c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
3501				    	
3502				    	var url_replace = (b.URL == '/') ? '' : b.URL;
3503				    	if(b.ONE) {
3504				    		_this.history.pushState(null,b.TITLE,url_replace + '/index#전체상품');
3505				    	} else {
3506				    		_this.history.pushState(null,b.TITLE,url_replace + '/전체상품');
3507				    	}
3508					} else {
3509						var c_g_p = (typeof $.cookie('gallery-page-' + b.PARENT.pid) != 'undefined') ? $.cookie('gallery-page-' + b.PARENT.pid) : 1;
3510				    	$.cookie('gallery',b.PARENT.pid, { path: '/', expires: 12 * 60 * 60 * 1000 });
3511				    	$.cookie('loadmore-' + b.PARENT.pid, c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
3512				    	
3513				    	var url_replace = (b.URL == '/') ? '' : b.URL;
3514				    	if(b.ONE) {
3515				    		_this.history.pushState(null,b.TITLE,url_replace + '/index#' + b.PARENT.page);
3516				    	} else {
3517				    		var page = b.PAGE.split(',');
3518				    		if(page[1]=='template') {
3519					    		_this.history.pushState(null,b.TITLE,url_replace + '/' + page[0]);
3520				    		} else {
3521					    		_this.history.pushState(null,b.TITLE,url_replace + '/' + b.PARENT.page);
3522				    		}		    		
3523				    	}
3524					}
3525					
3526			    }
3527		    }
3528		});
3529
3530	    $('#config-mode-view').click(function() {
3531	    	location.href = '//' + b.HOST + b.REFERER;
3532	    });
3533
3534		$('body')
3535			.on('click','.mini-home, #goto-top, #quick-menu-top', function(event) { 
3536				event.preventDefault(); 
3537				$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3538			})
3539			.on('click','#quick-menu-bottom', function(event) { 
3540				event.preventDefault(); 
3541				$('body,html').animate({scrollTop: document.body.scrollHeight}, 900,'easeInOutQuart'); 
3542			});
3543
3544		var moveGallerySibling = function(seq, gallerySettings, page) {
3545			var settings = {};
3546			if(gallerySettings) {
3547				try {
3548					settings = (typeof gallerySettings == 'string') ? $.parseJSON(gallerySettings) : gallerySettings;
3549				} catch(e) {
3550					settings = {};
3551				}
3552			}
3553
3554			var glink = (settings && settings.glink) ? settings.glink : '';
3555			if(!glink || b.PARENT.mode != 'project') {
3556				var url_replace = (b.URL == '/') ? '' : b.URL;
3557				_this.history.pushState(null,b.TITLE,url_replace + '/' + page + '/view/' + seq);
3558				return;
3559			}
3560
3561			try {
3562				if(checkBase64Encode(decodeURIComponent(glink))) glink = Base64.decode(decodeURIComponent(glink));
3563				else if(checkBase64Encode(glink)) glink = Base64.decode(glink);
3564			} catch(e) {
3565				if(checkBase64Encode(glink)) glink = Base64.decode(glink);
3566			}
3567
3568			var target = (settings.glink_target == '_blank') ? '_blank' : '';
3569			var linkModal = $(this).showModalFlat(
3570				$.lang[LANG]['config.information'],
3571				$.lang[LANG]['gallery.sibling.link.confirm'],
3572				true,
3573				true,
3574				function() {
3575					var linkUrl = makeLinkUrl(glink, b.ONE, b.VIEW);
3576					var $link = $('<a></a>').attr('href', linkUrl).css('display', 'none');
3577
3578					if(glink.match(/^\@/g) !== null) {
3579						$link.attr('attr-bookmark', glink.replace(/^\@/g, ''));
3580					} else if(glink.match(/^flink\@[0-9]/gi) !== null) {
3581						$link.attr('attr-flink', glink.replace(/^flink\@/gi, ''));
3582					} else if($.inArray(glink.replace(/^\//g, '').replace(/ /g, '-'), b.MENULIST) > -1) {
3583						$link.attr('data-user-link', linkUrl);
3584					} else {
3585						$link.attr('attr-link', glink);
3586					}
3587
3588					if(target) $link.attr('target', target);
3589					$('body').append($link);
3590					$link[0].click();
3591					setTimeout(function() { $link.remove(); }, 0);
3592					linkModal.modal('hide');
3593				},
3594				'cancel',
3595				'ok'
3596			);
3597		};
3598
3599		$('.data-page-prev').live({
3600		    click : function(e) {
3601		        var page = b.PAGE.split(',');
3602		    	if(!$(this).hasClass('active') || b.PARENT.prev === null) return false;
3603		    	if(typeof b.PARENT.page == 'string' && $.inArray(b.PARENT.page,b.MENULIST) == -1 && page[0] != '_product') return false;
3604		    	if(b.PARENT.prev)
3605					moveGallerySibling(b.PARENT.prev, b.PARENT.prev_gsettings, page[0]);
3606		    }
3607		});
3608
3609		$('.data-page-next').live({
3610		    click : function() {
3611		        var page = b.PAGE.split(',');
3612		    	if(!$(this).hasClass('active') || b.PARENT.next === null) return false;
3613		    	if(typeof b.PARENT.page == 'string' && $.inArray(b.PARENT.page,b.MENULIST) == -1 && page[0] != '_product') return false;
3614		    	if(b.PARENT.next)
3615					moveGallerySibling(b.PARENT.next, b.PARENT.next_gsettings, page[0]);
3616		    }
3617		});
3618
3619		// [oldver Menu nav link] Click
3620		$(`#tpl-menu.nav > li:not(.siteUM,.siteLANG) a:not([href="javascript:;"]):not([href*="flink@"]),
3621			.cl-moption > .cl-moption-col > .cl-moption-row > a:not([href="javascript:;"]):not([href*="flink@"]),
3622			.el-menu header.navbar a#site-home
3623		`).live({
3624		    click : function(e) {
3625		    	e.preventDefault();
3626				if(typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple')) { 
3627					return false; 
3628				}
3629				if(typeof $(this).attr('data-toggle') != 'undefined') { return false; }
3630
3631				$.each($.cookie(), function(i,v) {
3632					if(i.indexOf('gallery-category-') > -1) {
3633						var gallery_seq = i.replace('gallery-category-','');
3634						var gcate_home = (typeof $.cookie('gallery-catehome-' + gallery_seq) == 'undefined') ? '' : $.cookie('gallery-catehome-' + gallery_seq);
3635						$.cookie(i, gcate_home, { path : '/', expires: 12 * 60 * 60 * 1000 });
3636					}
3637					if(i.indexOf('gallery-page-') > -1) $.cookie(i, 1, { path : '/', expires: 12 * 60 * 60 * 1000 });
3638					if(i.indexOf('loadmore-') > -1) $.cookie(i, 1, { path : '/', expires: 0 });
3639				});
3640
3641				$.removeCookie('gallery', { path: '/' });
3642				$.removeCookie('gallery-item', { path : '/' });
3643				$.removeCookie('forum', { path : '/' });
3644				$.removeCookie('forum-item', { path : '/' });
3645
3646				var isClickMoption = ($(this).closest('.cl-moption-col').length > 0) ? true : false;
3647				var isClickSiteHome = (typeof $(this).attr('id') != 'undefined' && $(this).attr('id') == 'site-home') ? true : false;
3648
3649				var menuVer06 = ($('.el-menu .cl-menu-option').length > 0) ? true : false;
3650				var menuVer03 = ($('.el-menu > header').hasClass('navbar-fheader')) ? true : false;
3651				var menuVer02 = (!menuVer03 && $('.el-menu > header').hasClass('navbar-simple')) ? true : false;
3652				var menuVer01 = (!menuVer03 && !menuVer02) ? true : false;
3653
3654				if($('body').width() < 769)  {
3655					var clickNavbarToggle = ( (menuVer03 && $('.navbar-toggle').css('visibility') == 'hidden') && !isClickSiteHome ||
3656											  (menuVer02 && !isClickSiteHome) ||
3657											  menuVer01
3658											) ? true : false;
3659					if(clickNavbarToggle) $('.navbar-toggle').click();
3660				}
3661
3662				if(isClickMoption && !property.ONE) $(this).closest('header').find('.cl-menu-option').removeClass('open');
3663				if(!isClickSiteHome) {
3664					if($(this).hasClass('loginout')) {
3665						if(b.URL == '/render') {
3666							$(this).showModalFlat('INFORMATION','미리보기에서는 제공되지 않습니다.',true,false,'','ok');
3667							return false;
3668						}
3669						$('#loginModal').modal('show');
3670						$('#loginModal').css('z-index',1042);
3671						$('.modal-backdrop.fade.in').css('z-index', 1041);
3672					} else {
3673						$('#tpl-menu li').removeClass('active').removeClass('open');
3674						$(this).parent().addClass('active');
3675
3676						if($(this).closest('.dropdown-menu').length>0) {
3677							if($('body').width() > 768) {
3678								$(this).closest('.dropdown').addClass('active').siblings().removeClass('active');
3679							} else {
3680								if(menuVer03) {
3681									$(this).closest('.menu-has-children').addClass('open').siblings().removeClass('open');
3682									$('#tpl-menu .menu-has-children:not(.open) ul.dropdown-menu').hide();
3683								} else {
3684									$(this).closest('.dropdown').addClass('open').siblings().removeClass('open');
3685									$('#tpl-menu .dropdown:not(.open) ul.dropdown-menu').hide();
3686								}
3687							}
3688						} else {
3689							if(menuVer03) $('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
3690							else {
3691								if($('body').width() < 768) $('#tpl-menu li.dropdown ul.dropdown-menu').hide();
3692							}
3693						}
3694
3695						if(menuVer06) {
3696							$('.el-menu .cl-moption-row').removeClass('active');
3697							if($(this).is(':not([attr-bookmark])')) {
3698								$(this).closest('.cl-moption-row').addClass('active');
3699								if($(this).closest('.cl-moption-row[data-parent]').length > 0) $(this).closest('.cl-moption-col').find('.cl-moption-row:not([data-parent])').addClass('active');
3700							}
3701						}
3702					}
3703				}
3704
3705				var loc = $(this).attr('href');
3706				var uri = (b.PUBLISH) ? loc : loc.replace('/render/','');
3707				var bookmark = $(this).attr('attr-bookmark');
3708				if(typeof bookmark !='undefined' && bookmark) return false;
3709
3710				var blank = $(this).attr('target');
3711				if(typeof blank != 'undefined' && (blank == '_blank' || blank == 'blank')) {
3712					window.open(loc);
3713					e.stopPropagation();
3714					return false;
3715				}
3716
3717				if(loc.match('^(mailto:|tel:|sms:|callto:|facetime:|skype:|sip:)')) {
3718					window.location.href = loc;
3719					return false;
3720				}
3721
3722				if(b.ONE!='1') {
3723					if(loc == 'javascript:;') return false;
3724
3725					if(uri == '/render' || uri == '/') {
3726						uri = b.MENULINK[0];
3727						$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3728					}
3729
3730					if(loc.match(/\@/g) === null && loc.match(/\//g) === null || loc.match(/\?clgc\=/g) !== null) {
3731						window.location.href = loc;
3732						return false;
3733					}
3734					var url = new getLocation(loc);
3735					golink(_this,url);
3736					// _this.history.pushState(null,b.TITLE,(b.PUBLISH) ? "/" + uri : "/render/" + uri);
3737				} else {
3738					if(loc == 'javascript:;') loc = '#';
3739
3740					var hash = '';
3741					if(_this.b.PUBLISH) {
3742						if(loc.indexOf('/index/view/') > -1 && b.ONE) ;
3743						else loc = loc.replace('/index','');
3744					} else {
3745						if(loc.indexOf('/index/view/') > -1 && b.ONE) ;
3746						else loc = loc.replace('/render/index','');
3747					}
3748					hash = loc;
3749
3750					var fstr = loc.charAt(0);
3751					var pathname = window.location.pathname;
3752					switch(fstr) {
3753						case '#':
3754							if(_this.b.PAGE == 'index') {
3755								if(pathname.charAt(1) == '_' && pathname.match(/^\/\_lang\//gi) === null) {
3756									loc = (_this.b.PUBLISH) ? '/'+loc : '/render/'+loc;	
3757									window.location.href = loc;
3758								} else {
3759									if($(this).hasClass('mini-home')) {
3760										$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3761										history.pushState('', '', hash);
3762										return false;
3763									}
3764									var urlType = (b.PUBLISH) ? '/index' : '/render';
3765									_this.history.pushState(null,b.TITLE,urlType + hash);
3766								}
3767							} else {
3768								loc = (_this.b.PUBLISH) ? '/index' : '/render/index';
3769								_this.history.pushState(null,b.TITLE,loc);
3770								history.pushState('', '', loc + hash);
3771							}
3772							break;
3773						case '@':
3774
3775							break;
3776						case '/':
3777							if(loc == '/render' || loc == '/') {
3778								loc = (_this.b.PUBLISH) ? '/index' : '/render/index';	
3779								$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3780							}
3781							
3782							var url = new getLocation(loc);
3783							golink(_this,url);
3784							break;
3785						default:
3786							// var url = new getLocation(loc);
3787							// golink(_this,url);
3788							window.location.href = loc;
3789							break;
3790					}
3791	
3792					// window.location.href = loc;
3793				}
3794			}
3795		});
3796
3797		// [oldver Menu nav link] Click (onepage)
3798		$(`.nav li a[href*=#]:not([href="javascript:;"]), 
3799			.cl-moption > .cl-moption-col > .cl-moption-row > a[href*=#]:not([href="javascript:;"])
3800		`).live({
3801		    click : function(e) {
3802				if(typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple')) {
3803					e.preventDefault();
3804					return false;
3805				}
3806		        menuClickMove = true;
3807
3808		        var link = $(this).attr('href').replace('#','');
3809		        if(link.substring(0,1) == '/') link = link.substring(1,link.length);
3810		        if(b.MENULINK.indexOf(link) > -1) moveLinkPage(link);
3811		    }
3812		});
3813
3814		$('.navbar-simple .nav li a .fa').live('click', function(e) {
3815			if($(this).closest('header').hasClass('navbar-simple')) {
3816				$(this).closest('a').next('ul.dropdown-menu').slideToggle(200).closest('li').toggleClass('open').siblings().removeClass('open').find('ul.dropdown-menu').slideUp(200);
3817				e.preventDefault();
3818				return false;
3819			} 
3820		});
3821
3822		$('.navbar-simple .nav li a.dropdown-toggle[href="javascript:;"]').live('click', function(e) {
3823			e.preventDefault();
3824			if($('body').width() < 768) $(this).find('.fa').click();
3825			return false;
3826		});
3827
3828		$('body').on('click', '.micon', function(e) { $('#goto-top').removeClass('show'); });
3829
3830		$('body').on('touchstart.dropdown.data-api, click','header .siteUM-dmenu-wrap, header .siteLANG-dmenu-wrap', function(e) {
3831			if(e.target.className.indexOf('siteUM-dmenu-wrap') > -1 || e.target.className.indexOf('siteLANG-dmenu-wrap') > -1) {
3832				if($(this).hasClass('open')) {
3833					$(this).removeClass('open');
3834					$('#goto-top').addClass('show');
3835				}
3836			} 
3837		});
3838
3839		$('body').on('touchstart.dropdown.data-api, click', 'header.navbar-simple .navbar-collapse.in', function(e) {
3840			if(e.target.className.indexOf('navbar-collapse') > -1) {
3841				$('.navbar-toggle').click();
3842			}
3843		});
3844
3845
3846		$('.fr-custom-button[data-external-link], .fr-fic[data-external-link]').live({
3847			click: function() {
3848				if($(this).is('[data-external-link=""]')) return false;
3849				var link = $(this).attr('data-external-link');
3850				if($(this).attr('target') != '_blank') {
3851					location.href = link;
3852				} else {
3853					window.open(link);
3854				}
3855			}
3856		});
3857
3858		$('[data-type="gallery"] [data-loop="true"] > .grid').live({
3859			touchstart: function() {
3860				galleryStartHover();
3861			},
3862			touchend: function() {
3863				galleryCloseHover();
3864			},
3865			click: function() {
3866				galleryMovelink();
3867			}
3868		});
3869
3870		$(document).on('click','.cl-gtoolbar .cl-gcate-item > a, .cl-gtoolbar .cl-gsort-item > a', function(e) {
3871			var $clickTarget = $(this);
3872			var $clickItem = $clickTarget.closest('.cl-gcate-item, .cl-gsort-item');
3873			var $clickList = $clickTarget.closest('.cl-gcate-list, .cl-gsort-list');
3874			var $clickNav = $clickTarget.closest('.cl-gcate, .cl-gsort');
3875			var $clickGToolbar = $clickTarget.closest('.cl-gtoolbar');
3876			var $clickBlock = ($clickGToolbar.closest('.elem').length > 0) ? $clickGToolbar.closest('.elem').find('.element[data-type="gallery"]') : $clickGToolbar.closest('.element[data-type="gallery"]');
3877
3878			var isCategory = $clickNav.is('.cl-gcate');
3879			var isSort = $clickNav.is('.cl-gsort');
3880
3881			if ($clickItem.hasClass('active')) return;
3882
3883			if(isCategory) {
3884				if($clickNav.hasClass('empty')) {
3885					$clickTarget.blur();
3886					return false;
3887				}
3888
3889				if($clickItem.hasClass('total')) {
3890					return false;
3891				}
3892			}
3893
3894			$clickItem.addClass('active').siblings().removeClass('active');
3895			if(isSort) {
3896				var click_label = $clickTarget.text().trim();
3897				$clickGToolbar.find('.cl-gsort-active').html(click_label);
3898				$clickNav.removeClass('open');
3899			}
3900
3901			var pid = $clickBlock.attr('data-id');
3902			var idx = $clickTarget.attr('data-idx');
3903			var orderby = $clickGToolbar.find('.cl-gsort-item.active > a').attr('data-orderby') || 'recent';
3904			var sfl = 'category';
3905			var stx = $clickGToolbar.find('.cl-gcate-item.active > a').not('[data-idx="0"]').text() || '';
3906
3907			if (pid == 'all_products') {
3908				sfl = 'orderby';
3909				stx = $(this).attr('data-orderby');
3910				orderby = stx;
3911			}
3912
3913			$('#el-empty').empty();
3914			$('#el-empty').after('<div class="gallery-empty"></div>');
3915
3916			setTimeout(function() {
3917				goToElement($clickBlock);
3918			}, 0);
3919
3920			var val = _this.galleryEL[pid];
3921			var tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES');
3922			var elsettings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
3923			var block_lang = ($(tag).attr('data-blocklang')) ? $(tag).attr('data-blocklang') : LANG;
3924			var checkGalleryListSample = false;
3925			var checkGalleryListEmpty = true;
3926
3927			$('#el-empty').append($(tag));
3928			$('#el-empty').find('[data-loop="true"]').html('');
3929
3930			var nodes = $(tag).find('[data-loop="true"]').children('.grid');
3931			initGalleryField(nodes);
3932	
3933			var g_number = $(tag).find("[data-loop='true']").data('gallery-no');
3934			var view = $(tag).find('[data-loop="true"]').data('view');
3935			var p = $('#el-empty').children();
3936			var i = [];
3937			var total = 0;
3938			var display = 0;
3939
3940			var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
3941			var glm = $(tag).find('.loadmore-wrap');
3942
3943			if(typeof view == 'undefined') view = 10;
3944			var cookie_page = 1;
3945			var cookie_view = view;
3946			var cookie_gallery_category = (typeof stx != 'undefined') ? stx : '';
3947			var is_gc_cookie = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined' && $.cookie('gallery-category-'+val.seq).length > 0) ? true : false;
3948			var cookie_gallery_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
3949
3950			// $.cookie('gallery',val.seq, { path: '/', expires: 12 * 60 * 60 * 1000 });
3951			// $.cookie('loadmore-' + val.seq, cookie_page, { path: '/', expires: 12 * 60 * 60 * 1000 });
3952			$.cookie('gallery-page-' + val.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
3953			$.cookie('gallery-category-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
3954			$.cookie('gallery-orderby-' + val.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
3955			$.removeCookie('loadmore-' + val.seq, { path : '/' });
3956			$.removeCookie('gallery', { path : '/' });
3957
3958			$('.galleryPL'+val.seq).find('[data-loop="true"]').empty();
3959
3960			var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false;
3961			var checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof elsettings.gframe_title_visible != 'undefined' && elsettings.gframe_title_visible == 'OFF')) ? true : false;
3962
3963			var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
3964			var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
3965
3966			$.ajax({
3967				url: '/template/gallery/list/pid/' + val.seq + '/sid/' + b.SID + '/spage/' + b.PAGE + '/view/' + cookie_view + '/publish/' + b.PUBLISH + param,
3968				data: { g_mode: val.mode, visible: true, sfl: sfl, stx: stx, orderby: cookie_gallery_orderby },
3969				dataType: 'json',
3970				type: 'POST',
3971				async: false,
3972				cache: false,
3973				success: function (data) {
3974					$.each(data.list, function (idx, value) {
3975						i.push(value);
3976					});
3977
3978					total = (typeof data.total.list_total != 'undefined') ? data.total.list_total : data.total;
3979					display = data.list.length;
3980
3981					if( total > 0 ) checkGalleryListEmpty = false;
3982					if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
3983						var loop_count = nodes.length, item_index = 0;
3984						var elem = [];
3985						$.each(data.list,function(index,v) {
3986							loop_pos = index%loop_count;
3987							c = nodes[loop_pos];
3988							var isTitle = (v.title.length > 0) ? true:false;
3989
3990							$(c).find('.non_text').removeClass('non_text');
3991							if(val.mode != 'shopping') {
3992								if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
3993								if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
3994							}
3995
3996							v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
3997							v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
3998
3999							$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
4000
4001							var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
4002								img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
4003								img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
4004
4005							var folder = (val.folder == 0) ? '' : val.folder + '/',
4006								src = getServeImage(v.image,val.folder,img_path),
4007								src_s0 = getServeImage(v.image,'0',img_path);
4008							if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
4009							ensureGalleryResponsiveImageClass($(c));
4010							if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
4011							if(checkGallerySVG) {
4012								var gimgSVG = $(c).find('.gimg-svg-wrap svg');
4013								gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+index);
4014								gimgSVG.find('image').attr('xlink:href', src);
4015								gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+index+')');
4016							}
4017							
4018							var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
4019								glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
4020
4021							if(glink) {
4022								if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
4023									var bookmark_seq = glink.replace(/^\@/g,'');
4024									if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
4025										glink = '';
4026										glink_target = '';
4027									}
4028								} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
4029									glink_target = '';
4030								} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
4031								} else {																					// link-type: link-out      ==> a[attr-link]
4032									if(checkBase64Encode(glink)) glink = Base64.decode(glink);
4033								}
4034							}
4035
4036							$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
4037							var gallery_page_chmod = elsettings && elsettings.gallery_page_chmod || null;
4038							var umgrade = property && property.UMGRADE ? (property.UMGRADE.seq || property.UMGRADE.grade_id || null) : null;
4039							if (typeof gallery_page_chmod === 'string') {
4040								try { gallery_page_chmod = JSON.parse(gallery_page_chmod); }
4041								catch (e) { gallery_page_chmod = gallery_page_chmod ? gallery_page_chmod.split(',') : []; }
4042							}
4043							gallery_page_chmod = $.isArray(gallery_page_chmod) ? $.map(gallery_page_chmod, function(v) { return String(v); }) : [];
4044							umgrade = (umgrade !== null && typeof umgrade != 'undefined') ? String(umgrade) : null;
4045							$(c).removeClass('noneShoppingGrade').removeAttr('data-shopping-grade-msg');
4046							if (isShoppingGradePriceHidden(v) && property['SITEUM'] >= 1) {
4047								$(c).addClass('gallery-item').addClass('nonePrice');
4048								$(c).find('a').attr('href', '#');
4049							} else {
4050								if(isShoppingGradeBlocked(v, elsettings, property)) {
4051									$(c).addClass('gallery-item').addClass('noneShoppingGrade');
4052									$(c).attr('data-shopping-grade-msg', getShoppingGradeBlockedMessage(v));
4053									$(c).find('a').attr('href', '#');
4054								} else if(glink) {
4055									var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
4056									$(c).find('a').attr('href',glink_val);
4057
4058									if(glink.match(/^\@/g)) {
4059										$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
4060									} else if(glink.match(/^flink\@[0-9]/g) !== null) {
4061										$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
4062									// IE ERROR_includes__H.20210603
4063									// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
4064									} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
4065										$(c).find('a').attr('data-user-link',glink_val);
4066									} else {
4067										$(c).find('a').attr('attr-link',glink);
4068									}
4069								} else {
4070									if (val.mode == 'gallery') {
4071										src_s0 = src_s0 + '?gpos='+v.pos;
4072
4073										$(c).find('a').attr('href', src_s0);
4074										$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
4075									} else {
4076										if(val.seq == 'all_products') {
4077											$(c).find('a').attr('href', v.product_url);
4078										} else {
4079											if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
4080											else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
4081			
4082											// $(c).find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/' + v.seq);
4083										}
4084									}
4085								}
4086							}
4087
4088							if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
4089							else $(c).find('a').removeAttr('target');
4090
4091							if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
4092							else $(c).find('a').attr('data-title', v.title);
4093
4094							// caption
4095							var ftitle = $(c).find('h5.figure'),
4096								fcaption = $(c).find('p.figure').not('.comment'),
4097								fdatetime = $(c).find('.figure.datetime'),
4098								fhashtag = $(c).find('.figure.hashtag'),
4099								fbrand = $(c).find('.figure.brand'),
4100								fprice = $(c).find('.figure.price'),
4101								freview = $(c).find('.figure.review'),
4102								fcomment = $(c).find('.figure.comment'),
4103								flike = $(c).find('.figure.like'),
4104								fbasket = $(c).find('.figure.basket');
4105
4106							$(c).find('figcaption').removeClass('hide');
4107							if (v.title || v.caption) {
4108								var gallery_caption = v.caption;
4109								gallery_caption = gallery_caption.replace(/\n/g,'<br />');
4110
4111								ftitle.html(v.title);
4112								fcaption.html(gallery_caption);
4113								if(fdatetime.length > 0) fdatetime.text(v.datetime);
4114								if(fhashtag.length > 0) fhashtag.text(v.hashtag);
4115							}
4116
4117							if(g_number) {
4118								var g_index = String(index + 1),
4119									g_num = g_index.padStart(g_number, '0');
4120								$(c).find('.figure.number').text(g_num);
4121							}
4122
4123							if(fbrand.length > 0) {
4124								var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
4125								fbrand.html(v.brand_name);
4126							}
4127
4128							if(val.mode == 'shopping' || val.seq == 'all_products') {
4129								fcomment.addClass('hide');
4130								flike.addClass('hide');
4131								v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
4132								v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
4133								var productGradeOnOff = getShoppingGradeProductGradeOnOff(v);
4134								$(c).attr('data-editor-grade-price-enabled', productGradeOnOff).attr('data-config-grade-price-enabled', productGradeOnOff);
4135								var checkPriceHidden = isShoppingGradePriceHidden(v),
4136									base_gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
4137									base_gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
4138									gallery_price = base_gallery_price,
4139									gallery_sale_price = base_gallery_sale_price,
4140									gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
4141									grade_price_display = elsettings.grade_price_display == 'ON',
4142									grade_discount_grade = getShoppingGradePreviewDiscountGrade(data.grade),
4143									grade_discount_applied = false,
4144									grade_gallery_price = 0,
4145									product_soldout = '품절',
4146									product_no_sale = (typeof elsettings.sh_soldout == 'string') ? elsettings.sh_soldout : '구매불가',
4147									product_status = '';
4148								if (
4149									!checkPriceHidden &&
4150									isShoppingGradeProductGradePriceEnabled(v)
4151								) {
4152									grade_gallery_price = calcShoppingGradeDisplayPrice(base_gallery_price, grade_discount_grade);
4153									grade_discount_applied = grade_gallery_price !== null;
4154								}
4155								if(v.status == 'off' && !checkPriceHidden) {
4156									product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
4157								} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
4158									product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
4159								}
4160								$(c).find('.cl-sh-soldout').remove();
4161								if(product_status != '') $(c).attr('data-soldout',true);
4162								else $(c).removeAttr('data-soldout');
4163
4164								$(c).find('.product-badge').remove();
4165								product_status += drawBadgeList(v.use_badge, data.badge_settings);
4166
4167								$(c).find('.cl-sh-limit').remove();
4168								if(v.status == 'lim') {
4169									if(v.sale_now == false) {
4170										var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
4171										if(freview.length > 0) {
4172											freview.after(product_limit);
4173										} else {
4174											$(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
4175										}
4176									}
4177								}
4178
4179								// $(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
4180								// if (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON' && property['SITEUM'] >= 1) {
4181								// 	console.log(222);
4182								// 	$(c).addClass('gallery-item').addClass('nonePrice');
4183								// 	$(c).find('a').attr('href', '#');
4184								// } else {
4185								// 	console.log(22222);
4186								// 	if(glink) {
4187								// 		var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
4188								// 		$(c).find('a').attr('href',glink_val);
4189
4190								if($(c).find('ul.figure.price').length > 0) {
4191									// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
4192									// 	off_str = (price_off > 0) ? price_off + '% ' : ''
4193									var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
4194									if(!_this.b.LUX) off_str = gallery_sale_per;
4195									if(!off_str && gallery_sale_price > 0 && gallery_price > 0 && gallery_price < gallery_sale_price) {
4196										var price_off = Math.round(((gallery_sale_price - gallery_price) / gallery_sale_price) * 100);
4197										off_str = (price_off > 0) ? price_off + '% ' : '';
4198									}
4199									//Ver2
4200									if(!checkPriceHidden) {
4201										var $priceWrap = $(c).find('ul.figure.price'),
4202											$priceVal = $priceWrap.find('.price-val'),
4203											$priceSale = $priceWrap.find('.price-sale'),
4204											$priceSalePer = $priceWrap.find('.price-sale-per');
4205										$priceWrap.find('.sp-price, .grade-discount-price').remove();
4206										if($priceSale.length > 0 && $priceSalePer.length == 0) {
4207											$priceSale.after('<li class="price-sale-per hide"></li>');
4208											$priceSalePer = $priceWrap.find('.price-sale-per');
4209										}
4210										$priceWrap.css({display:'', flexDirection:'', alignItems:''});
4211										$priceVal.css({order:'', display:''});
4212										$priceSale.css({order:'', display:'', marginRight:''});
4213										$priceSalePer.css({order:'', display:'', marginLeft:'', marginTop:''});
4214											$priceVal.html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
4215										$priceVal.removeClass('hide');
4216
4217										if(gallery_sale_price > 0 && gallery_price  < gallery_sale_price) {
4218											$priceSale.html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
4219												$priceSalePer.html(off_str);
4220											$priceSale.removeClass('hide');
4221												$priceSalePer.removeClass('hide');
4222											if(!grade_discount_applied && _this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
4223												$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
4224											}
4225										} else {
4226											$priceSale.addClass('hide').html('');
4227											$priceSalePer.addClass('hide').html('');
4228
4229										}
4230
4231										if(grade_price_display && grade_discount_applied) {
4232											$priceWrap.append('<li class="grade-discount-price"><span class="grade-discount-price-value">₩' + grade_gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + '</span><span class="grade-discount-price-label">나의 할인가</span></li>');
4233										}
4234
4235										$(c).find('ul.figure.price .price-unit-pricing').remove();
4236										if(v.product_unit_str) {
4237											$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
4238										}
4239									} else {
4240										$(c).find('ul.figure.price .price-val').html('₩0');
4241										$(c).find('ul.figure.price .price-val').addClass('hide');
4242									}
4243									if(val.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
4244									if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
4245
4246									var badge_size = getBadgeSize(data.badge_settings);
4247									$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
4248									$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
4249									if(badge_size) {
4250										$(c).find('.cl-sh-soldout').addClass(badge_size);
4251										$(c).find('.cl-sh-limit').addClass(badge_size);
4252									}
4253								} else {
4254									//Ver1
4255									if(fprice.length == 0) fprice = fcaption;
4256									
4257									if(checkPriceHidden) fprice.html('');
4258									else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
4259								}
4260
4261								if($(c).find('ul.figure.review').length > 0) {
4262									var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
4263									if(gallery_review > 0) {
4264										$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
4265										$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
4266										$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
4267									} else {
4268										$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
4269										$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
4270									}
4271								}
4272
4273								if(fbasket.length > 0) {
4274									var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
4275										checkOldverBasket = (typeof elsettings.field_oldver != 'undefined' && elsettings.field_oldver && elsettings.field_oldver.indexOf('basket') > -1) ? true : false,
4276										checkDisabledBasket = (typeof elsettings.field_disable != 'undefined' && elsettings.field_disable && elsettings.field_disable.indexOf('basket') > -1) ? true : false;
4277									if(v.basket_off || v.shopping_grade_hidden == 'ON') fbasket.addClass('cannotby hide');
4278									else if(val.seq == 'all_products') fbasket.removeClass('hide');
4279									else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
4280									else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
4281									else fbasket.removeClass('hide');
4282								}
4283
4284							} else {
4285								fbrand.addClass('hide');
4286								fprice.addClass('hide');
4287								freview.addClass('hide');
4288								fbasket.addClass('hide');
4289
4290								if ( checkUseComment 
4291									&& elsettings.comment_display == 'ON'
4292									&& !(elsettings.field_disable !== undefined && elsettings.field_disable.indexOf('comment') > -1)
4293									&& fcomment.length > 0
4294									&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
4295								) {
4296									fcomment.removeClass('hide');
4297									fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
4298								} else {
4299									fcomment.addClass('hide');
4300									fcomment.find('.figure-comment-cnt').empty();
4301								}
4302	
4303								if ( checkUseLike 
4304									&& (elsettings.like_display !== undefined && elsettings.like_display != 'N')
4305									&& !(elsettings.field_disable !== undefined && elsettings.field_disable.indexOf('like') > -1)
4306									&& flike.length > 0
4307								) {
4308									flike.removeClass('hide').find('.figure-like-cnt').html(0);
4309									if(v.like !== undefined) {
4310										flike.find('.figure-like-cnt').html(v.like.cnt);
4311										if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
4312									}
4313								} else {
4314									flike.addClass('hide');
4315								}
4316							}
4317							
4318							if(checkUseLike == false) flike.html('');
4319
4320							if(val.mode == 'gallery') {
4321								if(index < cookie_view) {
4322									$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
4323								} else {
4324									$(c).find('figure').remove();
4325									$('.galleryPL'+val.seq).find('[data-loop="true"]').append($(c)[0].outerHTML);
4326								}
4327								if (total == 2) {
4328									$(c).find('figure').remove();
4329									$('.gallery-empty').append($(c)[0].outerHTML);
4330								}
4331							} else {
4332								$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
4333							}
4334						});
4335					} else {
4336						if(idx == '0') {
4337							checkGalleryListSample = true;
4338							nodes.find('a')
4339								.addClass('emptyGalleryItem')
4340								.attr('href', '/config/page/' + b.PAGE + '/view/template')
4341								.removeAttr('data-gallery')
4342								.removeAttr('data-user-link')
4343								.removeAttr('attr-bookmark')
4344								.removeAttr('attr-flink')
4345								.removeAttr('attr-link')
4346								.find('img')
4347								.attr('data-index',0);
4348							$(p).find('[data-loop="true"]').append(nodes);
4349						}
4350
4351						$.cookie('gallery-category-'+val.seq,'',{ path: '/', expires: 12 * 60 * 60 * 1000 });
4352						$.cookie('gallery-orderby-' + val.seq, '', { path: '/', expires: 12 * 60 * 60 * 1000 });
4353					}
4354					if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
4355					tag = $(p)[0].outerHTML;
4356
4357					if (val.mode == 'gallery' && total == 2) {
4358						$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
4359							var gallerySeq = $(v).attr('data-seq');
4360							if($('.galleryPL'+val.seq).find('.gallery-item[data-seq='+gallerySeq+']').length == 0) $('.galleryPL'+val.seq).find('[data-loop="true"]').append($(v).attr('data-index', i+2));
4361						});
4362					}
4363			
4364					if (val.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), val.seq, val.type, val.elsettings);
4365					$('#el-empty').empty();
4366					$('.gallery-empty').remove();
4367				}
4368			});
4369
4370			var $tag = $(tag);
4371			var $galleryEL = $('.element[data-id="' + val.seq + '"]');
4372			var g_settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
4373
4374			changeBrokenImages($tag);
4375			$.each($tag.find('[data-edit="true"]'), function() {
4376				var source = $(this).html();
4377				source = source.replace(/&lt;&nbsp;/g,'&lt;').replace(/&nbsp;&gt;/g,'&gt;');
4378				$(this).html(source);
4379			});
4380
4381
4382			if(total > 0) $galleryEL.find('[data-loop="true"]').replaceWith($tag.find('[data-loop="true"]'));
4383			else $galleryEL.find('[data-loop="true"]').empty();
4384			if(checkGalleryListSample && total == 0) $gallery_items.find('.emptyGalleryItem').attr('data-gallery','');
4385			showHideGalleryField($galleryEL, g_settings);
4386			reloadBlockMasonry('init',$galleryEL);
4387
4388			var $glmBtnWrap = $galleryEL.find('.loadmore-wrap');
4389			var $glmBtn = $galleryEL.find('.loadmore-wrap .gallery-loadmore');
4390			var checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false;
4391			var glm_lang = LANG;
4392			if(typeof g_settings.loadmore_lang != 'undefined' && g_settings.loadmore_lang && $.inArray(g_settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) glm_lang = g_settings.loadmore_lang.toLowerCase();
4393			else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
4394			var glm_txt = $.lang[glm_lang]['config.loadmore'];
4395
4396			if($glmBtnWrap.length == 0) {
4397				// gallery loadmore btn - default (ver1)
4398				if(checkLoadmore) {
4399					var glm_class = (val.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
4400						glm_btn = '<div class="' + glm_class + '" data-loadmore="true" data-selector=".gallery-loadmore" data-total="' + total + '" data-id="' + val.seq + '" data-page="2" data-view="' + view + '" data-folder="' + val.folder + '" data-mode="' + val.mode + '">' + glm_txt +' &nbsp;(<span class="display">' + cookie_view + '</span> / ' + number_format(total) + ')</div>';
4401
4402					if($galleryEL.find('.gallery-loadmore').length > 0) $galleryEL.find('.gallery-loadmore').replaceWith(glm_btn);
4403					else $galleryEL.append(glm_btn);
4404				} else $galleryEL.find('.gallery-loadmore').remove();
4405
4406			} else {
4407				// gallery loadmore btn - custom (ver2)
4408				if(checkLoadmore) {
4409					if(val.feature=='masonry') $glmBtn.addClass('masonry-layout');
4410					else $glmBtn.removeClass('masonry-layout');
4411					$glmBtn.attr('data-loadmore','true').attr('data-id',val.seq).attr('data-total',total).attr('data-page',2).attr('data-view',view).attr('data-folder',val.folder).attr('data-mode',val.mode);
4412					$glmBtn.find('.label').text(glm_txt);
4413					$glmBtn.find('.display .view').text(cookie_view);
4414					$glmBtn.find('.display .total').text(total);
4415					$glmBtnWrap.removeClass('hide').fadeIn();
4416				} else {
4417					$glmBtnWrap.fadeOut().addClass('hide');
4418					$glmBtn.removeAttr('data-loadmore').removeAttr('data-id').removeAttr('data-total').removeAttr('data-page').removeAttr('data-view').removeAttr('data-folder').removeAttr('data-mode').removeClass('masonry-layout');
4419					$glmBtn.find('.label').text(glm_txt);
4420					$glmBtn.find('.display .view').text('0');
4421					$glmBtn.find('.display .total').text('0');
4422				}
4423			}
4424
4425			if($galleryEL.has('input.gjs').length) setGalleryJS('change-loop',$galleryEL);
4426
4427			if($galleryEL.find('*[data-direffect="true"]').length > 0 ) {
4428				setTimeout(function() {
4429					$galleryEL.find('.grid').each(function() {
4430						$(this).hoverdir();
4431					});
4432				}, 400);
4433			}
4434		});
4435
4436		$(':not(.review-sample-block) .review-sort-nav .toggle-dropdown').live({
4437		    click: function(e) {
4438		        $(this).closest('.review-sort-nav').toggleClass('open');
4439		    }
4440		});
4441
4442		$(':not(.review-sample-block) .review-sort-nav li a').live({
4443		    click: function() {
4444	        	if ($(this).closest('li').hasClass('active')) return;
4445
4446	        	var review_block_id = $(this).closest('.element').attr('data-id');
4447	        	var idx = $(this).attr('data-idx'),
4448		            orderby = $(this).attr('data-orderby');
4449	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav li').removeClass('active');
4450	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav li').eq(idx).addClass('active');
4451	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav .active-sort').text($(this).text().trim());
4452	            $(this).closest('.review-sort-nav').removeClass('open');
4453
4454	        	var val = _this.galleryEL[review_block_id];
4455            	var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
4456            	var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
4457            	var cookie_review_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
4458
4459            	$.cookie('review-orderby-' + review_block_id, cookie_review_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
4460            	$.reviewContents.init(review_block_id, gallery_data);
4461		    }
4462		});
4463
4464		$(':not(.review-sample-block) .review-data-loadmore').live({
4465		    click: function() {
4466		    	var review_block_id = $(this).attr('data-id'),
4467					page_num = (typeof $(this).attr('data-page') != 'undefined') ? Number($(this).attr('data-page')) : 1,
4468					view = (typeof $(this).attr('data-view') != 'undefined') ? Number($(this).attr('data-view')) : 6,
4469					$review_elLoadmore = $(this),
4470					$review_el = $('.element[data-id="' + review_block_id + '"]'),
4471					$rContainer = $review_el.find('.container'),
4472					$rLoop = $review_el.find('[data-loop="true"]'),
4473		            $ro = $review_el.find('.review-sort-nav li.active a'),
4474		            orderby = ($ro.length > 0) ? $ro.attr('data-orderby') : 'recent';
4475
4476		        var val = _this.galleryEL[review_block_id];
4477            	var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
4478            	var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
4479            	// var cookie_review_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
4480
4481            	$.cookie('review-orderby-' + review_block_id, orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
4482            	$.reviewContents.update(review_block_id, gallery_data, orderby, page_num);
4483		    }
4484		});
4485
4486		// menu ver3 : fheader - #mobile-nav show/hide function
4487		$(document).on('click', 'ul li.siteSEARCH > a.psearch-btn, ul li.siteSEARCH .psearch-overlay.open, ul li.siteSEARCH .psearch-input', function(e) {
4488			e.preventDefault();
4489			var taret_nav = $('.el-menu header');
4490			if(window.innerWidth <= 768) taret_nav = $('#mobile-nav');
4491			var check_psearch_area = (taret_nav.find('.psearch-wrap').is(e.target) || taret_nav.find('.psearch-wrap').has(e.target).length > 0) ? true : false;
4492	
4493			if(!check_psearch_area) {
4494				taret_nav.find('.psearch-overlay').toggleClass('open');
4495				setTimeout(function() {
4496					$.psearch.showSiteProjectSEARCH(false);
4497					taret_nav.find('.psearch-overlay').find('input.psearch-input').focus();
4498				},300);
4499			}
4500			return false;
4501		});
4502		$(document).on('click', '#fixed-menu li.siteCART > a[href="javascript:;"], #fixed-menu-sub li.siteCART > a[href="javascript:;"]', function(e) {
4503			e.preventDefault();
4504			$(this).showModalFlat('INFORMATION',$.lang[LANG]['menu.cart.no-support.render'],true,false,'','ok');
4505			return false;
4506		});
4507		$(document).on('click', '.siteLANG ul a, .siteLANG-dmenu-wrap ul li a', function(e) {
4508			if(LANGLINK) return;
4509			e.preventDefault();
4510			var sid = (typeof SID != 'undefined' && SID) ? SID : property.SID;
4511			var slang_code = $(this).attr('data-code');
4512			var slang_str = $(this).text().trim();
4513
4514			changeLanguage(slang_code);
4515		});
4516		$(document).on('click', '#mobile-nav .login-content:not(.siteUM)', function(e) {
4517			e.preventDefault();
4518			$('#mobile-nav #fixed-menu .siteUM a i').click();
4519			return false;
4520		});
4521		$(document).on('click', '#mobile-nav .nav li.menu-has-children > a[href="javascript:;"]', function(e) {
4522			e.preventDefault();
4523			$(this).prev('.fa').click();
4524			return false;
4525		});
4526		$(document).on('click', '#mobile-nav ul li.menu-has-children i', function(e) {
4527			if($(this).closest('li.menu-has-children').hasClass('open')) {
4528				$(this).closest('li.menu-has-children').removeClass('open');
4529				$(this).nextAll('ul').eq(0).slideToggle(200);
4530				// $(this).next().removeClass('menu-item-active');
4531				$(this).toggleClass('fa-chevron-down fa-chevron-up');
4532			} else {
4533				$(this).closest('li.menu-has-children').addClass('open').siblings('li.open').find('i').click();
4534				$(this).nextAll('ul').eq(0).slideToggle(200);
4535				// $(this).next().toggleClass('menu-item-active');
4536				$(this).toggleClass('fa-chevron-down fa-chevron-up');
4537			}
4538		});
4539		$(document).on('click', 'header.navbar-fheader .navbar-toggle', function(e) {
4540			if( window.innerWidth > 768 &&
4541				$(this).closest('header').find('.cl-menu-option').length > 0 && 
4542				$(this).closest('header').find('.cl-menu-option').is('[data-moption="ntoggle"],.nfullDrop')
4543			) {
4544				e.preventDefault();
4545				return false;
4546			}
4547
4548			if($('.dsgn-body').hasClass('mobile-nav-active')) {
4549				//close mobile menu
4550				$('header.navbar-fheader .navbar-toggle').css({'visibility':'visible'});
4551				$('.dsgn-body').removeClass('mobile-nav-active');
4552				$('#mobile-body-overly').removeClass('in');
4553				$('#mobile-nav .siteLANG.cl-fixbtn').hide();
4554			} else {
4555				//show mobile menu
4556				$('header.navbar-fheader .navbar-toggle').css({'visibility':'hidden'});
4557				$('.dsgn-body').addClass('mobile-nav-active');
4558				$('#mobile-body-overly').addClass('in');
4559				$('#mobile-nav .siteLANG.cl-fixbtn').show();
4560			}
4561		});
4562		$(document).on('click', '#mobile-nav-toggle', function(e) {
4563			$('header.navbar-fheader .navbar-toggle').click();
4564		});
4565
4566		$('header.navbar-simple .navbar-toggle').live('click',function(e) {
4567			var check = $(this).hasClass('collapsed') ? false : true;
4568			if(check) {
4569				var p_t = $('.el-menu header').height() + 'px';
4570
4571				$('.element').each(function(){ $(this).addClass('blur-filter'); });
4572				$('.el-menu').addClass('blur-filter');
4573
4574				if($('body').height() > ($('.el-menu').find('#tpl-menu').height() + 80)) $('.el-menu').find('#tpl-menu').addClass('center-position');
4575				else $('.el-menu').find('#tpl-menu').removeClass('center-position');
4576				
4577				$('.dsgn-body').bind('touchmove');
4578				$('#goto-top').removeClass('show');
4579			} else {
4580				$('.element').each(function(){ $(this).removeClass('blur-filter'); });
4581				$('.el-menu').removeClass('blur-filter');
4582		        $('.dsgn-body').unbind('touchmove');
4583				$('#goto-top').addClass('show');
4584			}
4585		});
4586
4587		$('.element[data-type="gallery"]').live({
4588			mouseenter : function() {
4589				$(this).find('[data-direffect="true"] .grid').each(function() {
4590					$(this).hoverdir();
4591				});
4592			}
4593		});	
4594
4595		$('.creatorlink-header .data-user > ul > li').live({
4596			click : function() {
4597				$(this).closest('.pull-right').toggleClass('open');
4598				if($(this).closest('.pull-right').hasClass('open')) {
4599					$('.popover').show();
4600				} else {
4601					$('.popover').hide();
4602				}
4603			}
4604		});
4605
4606		/* [Input URL link] Click ==> link-type: link-out*/
4607		$('a[href*=#][attr-link]').live({
4608			click : function(e) {
4609				if($(this).is('[attr-link=""]') 
4610					|| $(this).is('[data-imglink="true"]')
4611					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4612				) {
4613					e.preventDefault();
4614					return false;
4615				} 
4616
4617				$.removeCookie('gallery', { path: '/' });
4618				$.removeCookie('gallery-item', { path : '/' });
4619				$.removeCookie('forum', { path : '/' });
4620				$.removeCookie('forum-item', { path : '/' });
4621				
4622				if($(this).attr('target') != '_blank') {
4623					var link = $(this).attr('href').replace('#','');
4624					if(link.length > 0 && link != '/') {
4625						var regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
4626						var regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
4627						var ismenulink = (b.MENULINK.indexOf(link) > -1) ? true : false;
4628						var isoutlink = (regex2.test(link) || regex.test(link)) ? true : false;
4629						if (ismenulink) {
4630							if ($('.dsgn-body').width() < 769) {
4631								setTimeout(function() {
4632									moveLinkPage(link);
4633								}, 250);
4634							} else {
4635								moveLinkPage(link);
4636							}
4637						} else if(!isoutlink && $('.' + link).length) {
4638							moveLinkPage(link, 1200, true);
4639						}
4640
4641
4642						if(b.MENULINK.indexOf(link) > -1) {
4643							if($('.dsgn-body').width() < 769) {
4644								setTimeout(function() {
4645									moveLinkPage(link);
4646								},250);
4647							} else {
4648								moveLinkPage(link);
4649							}
4650						} else if($('.' + link).length) {
4651							moveLinkPage(link,1200,true);
4652						}
4653					}
4654				}
4655		    }
4656		    
4657		});
4658
4659		/* [Menu link] Click ==> link-type: link-menu or link-inner*/
4660		$('*[data-user-link]').live('click',function(e) {
4661			if(	$.clnav.check()
4662				&& $(this).parent().hasClass('cl-nav-item')
4663				&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4664			) {
4665				/* .cl-nav[data-behavior="overflow-nowrap"] */
4666				if ($.clnav.d.isDrag) {
4667					e.preventDefault();
4668					e.stopImmediatePropagation();
4669					return false;
4670				}
4671			}
4672
4673			if(	$(this).is('[data-user-link=""]') 
4674				|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4675			) {
4676				e.preventDefault();
4677				return false;
4678			}
4679
4680			var $targetEle = $(this).closest('.element[data-el]');
4681			var datatype = $targetEle.attr('data-type') ?? '';
4682			var isimglink = $targetEle && $targetEle.length && $targetEle.hasClass('imglink');
4683			var hasalink = $(this).hasClass('sha_link');
4684			var isshlink = $(this).is('[data-shlink]');
4685
4686			var userLink = ((datatype == 'showcase') && isimglink && isshlink) ? $(this).attr('data-shlink') : $(this).attr('href');
4687			if (typeof userLink == 'undefined') return false;
4688
4689			var target = '';
4690			if ((typeof $(this).attr('target') != 'undefined') 
4691				|| (typeof $(this).attr('data-blank') != 'undefined')
4692			) {
4693				if ((datatype == 'showcase') && isimglink && isshlink) {
4694					target = $(this).attr('data-blank');
4695				} else {
4696					target = $(this).attr('target');
4697				}
4698			}
4699
4700			e.preventDefault();
4701			$.removeCookie('gallery', { path: '/' });
4702			$.removeCookie('gallery-item', { path: '/' });
4703			$.removeCookie('forum', { path: '/' });
4704			$.removeCookie('forum-item', { path: '/' });
4705
4706			//latest block - table header click, set click table
4707			if(typeof $(this).attr('data-lt-header') != 'undefined') {
4708				var type = $(this).closest('.latest-table').attr('data-type');
4709				var pid = $(this).closest('.latest-table').attr('data-pid');
4710				var clickEL = (type == 'gallery') ? $('.gallery-item[data-seq="'+pid+'"]') : $('.element[data-id="' + pid + '"]');
4711				var checkThisPage = (b.ONE && clickEL.length > 0) ? true : false;
4712
4713				if(checkThisPage) {
4714					if(type == 'forum') {
4715						scrollToBlock('.element[data-id="' + pid + '"]', 1000);
4716						return false;
4717					} else if(type == 'gallery') {
4718						moveGallery(pid);
4719						return false;
4720					}
4721				} else {
4722					$.cookie(type+'-item',pid, { path: '/' });
4723				}
4724			} else {
4725				if (typeof $(this).attr('data-forum-type') !== 'undefined' && $(this).attr('data-forum-type') == 'qna') {
4726					var type = $(this).closest('.latest-table').attr('data-type');
4727					var pid = $(this).closest('.latest-table').attr('data-pid');
4728					var clickEL = $('.element[data-id="' + pid + '"]');
4729					var checkThisPage = (b.ONE && clickEL.length > 0) ? true : false;
4730					var page_num = $(this).attr('data-page');
4731					var row_id = $(this).closest('.latest-post-list-title').attr('data-id');
4732					if (checkThisPage) {
4733						scrollToBlock('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="' + row_id + '"]', 1000);
4734						$('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="' + row_id + '"]').click();
4735						// $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
4736						return false;
4737					} else {
4738						$.cookie(type + '-item', pid, { path: '/' });
4739						$.cookie('forum_content_view', pid + '&' + row_id, { path: '/', expires: 12 * 60 * 60 * 1000 });
4740						$.forum.setForumCookie(pid, page_num, '', '', '');
4741					};
4742				}
4743			}
4744
4745			//psearch - project item(pitem) click, set click parent
4746			if($(this).closest('.psearch-view').length > 0) {
4747				if(typeof $(this).attr('data-psearch-seq') != 'undefined') {
4748					$.cookie('gallery-item',$(this).attr('data-psearch-seq'), { path: '/' });
4749				} else {
4750					$.cookie('gallery',$(this).attr('data-psearch-pid'), { path: '/' });
4751				}
4752
4753				if(b.ONE && typeof $(this).attr('data-user-link') != 'undefined' &&  $(this).attr('data-user-link') == 'index') {
4754					location.replace('/');
4755					return false;
4756				}
4757			}
4758
4759			if (b.ONE) {
4760				if (userLink.charAt(0) == '/') {
4761					var linkRegExp = /\/view\//gi;
4762					var linkMatch = userLink.match(linkRegExp);
4763					if (linkMatch && linkMatch[0]) {
4764						var url = ((b.URL == '/') ? '' : b.URL) + userLink;
4765						if (target == '_blank') {
4766							var openNewWindow = window.open('about:blank');
4767							openNewWindow.location.href = url;
4768						} else {
4769							location.href = url;
4770						}
4771						return false;
4772					}
4773
4774					userLink = userLink.charAt(0).replace('/', '') + userLink.slice(1);
4775					if (b.VIEW || target == '_blank') {
4776						var url = ((b.URL == '/') ? '' : b.URL) + '#' + userLink;
4777						if (b.VIEW && target != '_blank') {
4778							// location.href = url;
4779							url = new getLocation(url);
4780							golink(_this,url);
4781						} else {
4782							var openNewWindow = window.open('about:blank');
4783							openNewWindow.location.href = url;
4784						}
4785					} else {
4786						// if (b.ONE && b.MENULINK.indexOf(userLink) === -1) {
4787						// 	var modal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['editor.link.menu.invalid'], true, false, '', 'ok', '', 'cl-cmmodal cl-s-btn w560 cl-p130 cl-p0 cl-okbtn-pbt70');
4788						// 	return false;
4789						// }
4790						moveLinkPage(userLink);
4791					}
4792				} else {
4793					alert('Invalid URL');
4794					return false;
4795				}
4796			} else {
4797				var url = ((b.URL == '/') ? '' : b.URL) + userLink;
4798				if (target == '_blank' || target == 'blank') {
4799					var openNewWindow = window.open('about:blank');
4800					openNewWindow.location.href = url;
4801				} else {
4802					// location.href = url;
4803					url = new getLocation(url);
4804					golink(_this,url);
4805				}
4806			}
4807		});
4808		
4809		/* [Block Bookmark link] Click ==> link-type: link-bookmark*/
4810		$('a[attr-bookmark],*[data-imglink="true"][attr-bookmark],.fr-custom-button[attr-bookmark],.fr-fic[attr-bookmark],[data-type="showcase"] .item[attr-bookmark]').live({
4811			click : function(e) {
4812				e.preventDefault();
4813
4814				var checkSidemobile = ($(this).closest('.clnav-sidemobile').length > 0) ? true : false;
4815				if(checkSidemobile) $.clnav.setMode('sidemobile-open',false);
4816
4817				if($.clnav.check()
4818					&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4819				) {
4820					/* .cl-nav[data-behavior="overflow-nowrap"] */
4821					if ($.clnav.d.isDrag) {
4822						e.stopImmediatePropagation();
4823						return false;
4824					}
4825				}
4826
4827				if(	$(this).is('[attr-bookmark=""]') 
4828					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4829				) {
4830					return false;
4831				}
4832
4833				var $aEle = $(this);
4834				var $targetEle = $(this).closest('.element[data-el]');
4835				var datatype = $targetEle.attr('data-type') ?? '';
4836				var isimglink = $targetEle && $targetEle.length && $targetEle.hasClass('imglink');
4837				var hasalink = $(this).hasClass('sha_link');
4838				var isshlink = $(this).is('[data-shlink]');
4839
4840				var link = ((datatype == 'showcase') && isimglink && isshlink) ? $(this).attr('data-shlink').replace(/^\@/g, '') : $(this).attr('href').replace(/^\@/g, '');
4841				if(typeof link == 'undefined') return false;
4842
4843				var target = '';
4844				if ((typeof $(this).attr('target') != 'undefined') 
4845					|| (typeof $(this).attr('data-blank') != 'undefined')
4846				) {
4847					if ((datatype == 'showcase') && isimglink && isshlink) {
4848						target = $(this).attr('data-blank');
4849					} else {
4850						target = $(this).attr('target');
4851					}
4852				}
4853
4854				$.removeCookie('gallery', { path: '/' });
4855				$.removeCookie('gallery-item', { path : '/' });
4856				$.removeCookie('forum', { path : '/' });
4857				$.removeCookie('forum-item', { path : '/' });
4858
4859				var blockBookmarkList = (typeof b.SETTINGS.blockBookmarkList != 'undefined' && b.SETTINGS.blockBookmarkList) ? b.SETTINGS.blockBookmarkList : {};
4860				var hideArray = blockBookmarkList?.hide || [];
4861				if (hideArray.length > 0 && hideArray.includes(link)) {
4862					return false;
4863				}
4864
4865				if (typeof $(this).attr('attr-bookmark') != 'undefined' && (link != $(this).attr('attr-bookmark'))) link = $(this).attr('attr-bookmark');
4866				if($('.element[data-bookmark="' + link + '"]').length > 0 && target != '_blank') {
4867					moveLinkPage(b.PAGE + '\@' + link, 1200, true);
4868				} else {
4869					if (typeof b.SETTINGS.blockBookmarkList == 'undefined' || !b.SETTINGS.blockBookmarkList || typeof b.SETTINGS.blockBookmarkList['bookmark' + link] == 'undefined') {
4870						$aEle.find('img[data-attach="true"]').unwrap();
4871						return false;
4872					}
4873
4874					$.post('/template/bookmarkBlock', {sid: b.SID, seq: link, publish : b.PUBLISH}, function(data) {
4875						if(data.length == 0) {
4876							// console.log('Block Link Click :( Undefined block');
4877							return false;
4878						}
4879
4880						var d = data[0];
4881						if(typeof d.orgpage == 'undefined' || d.orgpage.length == 0) d.orgpage = d.page;
4882
4883						var	org_title = d.orgpage.replace(/-/g,' ');
4884						var bb_o_page = (d.page.match(/^index/g) !== null ) ? org_title : d.page;
4885						var bb_page = (bb_o_page.match(/\,/g) !== null) ? bb_o_page.substring(0,d.page.indexOf('\,')) : bb_o_page;
4886
4887						var check_link = true;
4888						var is_visible_menu = false;
4889						$.each(b.SMENU, function (idx, obj) {
4890							if(bb_page == obj.name.replace(/ /g,'-')) {
4891								if(!obj.link) check_link = false;
4892								if(obj.display == 'on') is_visible_menu = false;
4893							}
4894							if(obj.children) {
4895								$.each(obj.children, function (i, v){
4896									if(bb_page == v.name.replace(/ /g,'-')) {
4897										if(!v.link) check_link = false;
4898										if(v.display == 'on') is_visible_menu = false;
4899									}
4900								});
4901							}
4902						});
4903
4904						var is_here = ($('.element[data-bookmark="' + link + '"]').length > 0 ) ? true : false;
4905						var is_page = (b.PAGE.toLowerCase()==d.page.toLowerCase()) ? true : false;
4906						// var is_visible_menu = ($.inArray(bb_page,b.MENULINK)>-1) ? true : false;
4907						// var check_link = ( $('#tpl-menu li a[href*="'+bb_page+'"]').length > 0 && $('#tpl-menu li a[href*="'+bb_page+'"]').text().trim().replace(/ /gi,'-') == bb_page ) ? false : true;
4908						var is_link = ( check_link && is_visible_menu && org_title != 'INTRO' ) ? true : false;
4909						var is_visible = (check_link && is_visible_menu && org_title != 'INTRO') ? true : false;
4910						var clearBookmarkGalleryCategory = function() {
4911							if(typeof d.gpid == 'undefined' || !d.gpid) return;
4912
4913							$.cookie('gallery-category-' + d.gpid, '', { path : '/', expires: 12 * 60 * 60 * 1000 });
4914						};
4915
4916						if( ( !is_visible_menu && bb_page!='index' ) || 
4917							( typeof d.glivisible!='undefined' && d.glivisible ) ||
4918							( /*( (is_here && target=='_blank') || !is_page ) &&*/ ( is_link || is_visible ) ) ||
4919							( !is_here && is_page )
4920						)  {
4921								if(is_visible_menu == false) {
4922									if(b.SID == 'chansolpf') clearBookmarkGalleryCategory();
4923									moveBookmark(d.page, '\@' + link, 1200, target);
4924								} else {
4925									$aEle.find('img[data-attach="true"]').unwrap();
4926									return false;
4927								}
4928						} else {
4929							if(b.SID == 'chansolpf') clearBookmarkGalleryCategory();
4930							moveBookmark(d.page, '\@' + link, 1200, target);
4931						}
4932
4933					}, 'json');
4934				}
4935
4936			}
4937		});
4938
4939		$('[data-type="showcase"] .item[attr-link]').live('click',function(e) {
4940			var link = $(this).attr('href');
4941			var target = $(this).attr('target');
4942			var $targetEle = $(this).closest('.element[data-el]');
4943			var datatype = $targetEle.attr('data-type') ?? '';
4944
4945			if ((datatype == 'showcase') && $(e.target).closest('button, a').length > 0) {
4946				return;
4947			}
4948
4949			if (link) {
4950				if (target === '_blank') {
4951					window.open(link);
4952				} else {
4953					location.href = link;
4954				}
4955			}
4956		});
4957
4958		/* [File link] Click ==> link-type: link-file*/
4959		$('a[attr-flink], .fr-custom-button[attr-flink], .fr-fic[attr-flink]').live({
4960			click : function(e) {
4961				e.preventDefault();
4962
4963				if($.clnav.check()
4964					&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4965				) {
4966					/* .cl-nav[data-behavior="overflow-nowrap"] */
4967					if ($.clnav.d.isDrag) {
4968						e.stopImmediatePropagation();
4969						return false;
4970					}
4971				}
4972
4973				if(	$(this).is('[attr-flink=""]')
4974					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4975					|| (!property.VALIDPLAN || property.VALIDTYPE == 'PK')
4976				) {
4977					return false;
4978				}
4979
4980				var id = $(this).attr('attr-flink');
4981				if(typeof id == 'undefined' || !id) { 
4982					return false;
4983				} else {
4984					// direct download
4985					// var flink_url = location.protocol + '//' + location.host +'/down/flink/' + id;
4986					// window.open(flink_url);
4987
4988					// modal open
4989					$.getJSON('/down/flink/get/id/' + id , {}, function (data) {
4990						checkError(data);
4991						if(typeof data.data == 'object' && !$.isEmptyObject(data.data)) {
4992							var flink_link = data.data;
4993							var flinkDownModal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['editor.link.file.download.check'], true, true, function() {
4994								var flink_url = location.protocol + '//' + location.host +'/down/flink/' + id + '/sid/' + flink_link.sid + '/s/' + encodeURIComponent(flink_link.file) + '/name/' + encodeURIComponent(flink_link.name);
4995								window.open(flink_url);
4996								flinkDownModal.modal('hide');
4997							}, 'cancel', 'ok');
4998						} else {
4999							return false;
5000						}
5001					}, 'json');
5002				}
5003
5004			}
5005		});
5006
5007		$('.element img[data-attach="true"][data-img-original="ON"]').live({
5008			click: function(e) {
5009				$(this).mouseenter();
5010			},
5011			mouseenter : function(e) {
5012				if(!selectEL || typeof selectEL == 'undefined') {
5013					selectEL = $(this).closest('.element').attr('data-el');
5014				}
5015				if(typeof selectEL == 'undefined') return false;
5016
5017				var offset = $(this).offset(),
5018			        left = $(this).width() + offset.left-25,
5019					top = offset.top;
5020				var index = $('.' + selectEL + ' img[data-attach="true"]').index(this);
5021
5022				if(b.VIEW) {
5023					var src = $(this).prop('src').split('/'),
5024						file = src[src.length-1];
5025		            if(src.indexOf('googleusercontent') > -1) {
5026		            	file = src;
5027		            }
5028					$('.config-image-view').css({ top : top + 'px', left : left + 'px' }).attr('data-src',$(this).prop('src')).attr('data-index',index).show();
5029				}
5030			},
5031			mouseleave : function(e) {
5032				$('.config-image-view').hide();
5033			}
5034		});
5035
5036		$('.config-image-view').live({
5037			mousemove : function(e) { $('.config-image-view').show(); },
5038			mouseout : function(e) { $('.config-image-view').show(); }
5039		});
5040
5041	    $('.config-image-view').on({
5042			click: function (e) {
5043				$('.config-image-view').hide();
5044
5045				var src = $(this).attr('data-src').split('/'),
5046					file = src[src.length-1],
5047	                free = (src[4]=='free') ? true : false;
5048
5049	            var img_src = $(this).attr('data-src')
5050	            if(img_src.indexOf('googleusercontent') > -1) {
5051	            	file = img_src;
5052	            }
5053	            file = Base64.encode(file);
5054				if(b.SID && file) {
5055					$('.tooltip.in').removeClass('in');
5056			  		$(this).attr("href","/image/original/sid/" + b.SID + "/file/" + file + '/free/' + free);
5057				} else {
5058					// console.log('None:: sid or src');
5059					return false;
5060				}
5061	        }
5062	    });
5063
5064		$('[data-lock-password]').live({
5065			'keydown.autocomplete': function(e) {
5066			    if (e.keyCode == 13) {
5067			    	$('[data-lock-submit]').click();
5068				}
5069			},
5070			'keyup': function() {
5071				if ($(this).val()) {
5072					$('[data-lock-submit]').addClass('btn-primary');
5073				} else {
5074					$('[data-lock-submit]').removeClass('btn-primary');
5075				}
5076			}
5077		});
5078
5079		$('.form-control[type="number"]').live('keydown', function(e) {
5080			if (e.keyCode == 109 || e.keyCode == 189) {
5081				return false;
5082			}
5083		});
5084
5085		var getSubmitCaptchaLang = function($parent) {
5086			var blocklang = $parent.attr('data-blocklang') || $parent.data('blocklang') || LANG;
5087			if(typeof $.lang == 'undefined' || typeof $.lang[blocklang] == 'undefined') blocklang = LANG;
5088			return blocklang;
5089		}
5090
5091		var getSubmitCaptchaText = function(blocklang, key, fallback) {
5092			if(typeof $.lang != 'undefined' && typeof $.lang[blocklang] != 'undefined' && typeof $.lang[blocklang][key] != 'undefined') return $.lang[blocklang][key];
5093			if(typeof $.lang != 'undefined' && typeof $.lang[LANG] != 'undefined' && typeof $.lang[LANG][key] != 'undefined') return $.lang[LANG][key];
5094			return fallback;
5095		}
5096
5097		var isSubmitCaptchaUserLoggedIn = function() {
5098			var pageMode = (typeof PAGE_MODE != 'undefined') ? PAGE_MODE : '',
5099				umember = (pageMode == 'c') ? ((typeof UMEMBER != 'undefined') ? UMEMBER : {}) : ((typeof property != 'undefined' && typeof property.UMEMBER != 'undefined') ? property.UMEMBER : {}),
5100				umemberActivate = (pageMode == 'c') ? ((typeof UMEMBER_ACTIVATE != 'undefined') ? Number(UMEMBER_ACTIVATE) : 0) : ((typeof property != 'undefined' && typeof property.UMEMBER_ACTIVATE != 'undefined') ? Number(property.UMEMBER_ACTIVATE) : 0),
5101				checkLogin = (pageMode == 'c') ? true : !!umember.check_login;
5102
5103			if(pageMode == 's' && umemberActivate == 0 && umember.id_type == 'creatorlink') {
5104				checkLogin = (umember.id !== undefined && umember.id) ? true : false;
5105			}
5106
5107			return checkLogin;
5108		}
5109
5110		var isSubmitCaptchaRequired = function($parent) {
5111			if(isSubmitCaptchaUserLoggedIn()) return false;
5112			if($parent.attr('data-type') == 'form') return false;
5113			return ($parent.attr('data-captcha') == 'true');
5114		}
5115
5116		var getInlineFormCaptcha = function($parent) {
5117			if($parent.attr('data-type') != 'form') return '';
5118			if(isSubmitCaptchaUserLoggedIn()) return '';
5119			return $.trim($parent.find('.form-captcha .input-captcha').val());
5120		}
5121
5122		var getSubmitCaptchaHTML = function(blocklang) {
5123			var captchaTip = getSubmitCaptchaText(blocklang, 'form.item.captcha-tip', '');
5124
5125			return '\
5126				<div class="form-group form-captcha">\
5127					<div class="kcaptcha-wrap display-flex">\
5128						<div class="kcaptcha-box">\
5129							<img src="//storage.googleapis.com/i.addblock.net/forum/captcha_sample_Img.jpg" class="kcaptcha-img" alt="' + captchaTip + '" title="' + captchaTip + '">\
5130						</div>\
5131						<div class="text-left kcaptcha-key-wrap">\
5132							<input type="text" name="wr_key" class="col-xs-12 col-sm-12 col-md-12 ed input-bg-opacity input-captcha" placeholder="' + getSubmitCaptchaText(blocklang, 'form.item.captcha.placeholder', 'CAPTCHA') + '" autocomplete="off">\
5133							<a href="#" class="kcaptcha-change hand small fsize12"><svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6 12C4.33 12 2.92 11.42 1.75 10.25C0.58 9.08 0 7.67 0 6C0 4.33 0.58 2.92 1.75 1.75C2.92 0.58 4.33 0 6 0C6.9 0 7.74 0.19 8.51 0.56C9.28 0.93 9.94 1.44 10.5 2.06V0H12V5H7V3.5H9.73C9.33 2.89 8.8 2.4 8.15 2.04C7.5 1.68 6.78 1.5 6 1.5C4.75 1.5 3.69 1.94 2.81 2.81C1.93 3.68 1.5 4.75 1.5 6C1.5 7.25 1.94 8.31 2.81 9.19C3.68 10.07 4.75 10.5 6 10.5C7.17 10.5 8.17 10.11 9 9.34C9.83 8.57 10.31 7.62 10.44 6.5H11.98C11.85 8.06 11.22 9.36 10.08 10.42C8.94 11.48 7.58 12 6 12Z" fill="#8E9095"/></svg>
5133' + getSubmitCaptchaText(blocklang, 'form.item.captcha-change', 'Refresh') + '</a>\
5134						</div>\
5135					</div>\
5136				</div>\
5137			';
5138		}
5139
5140		var showSubmitCaptchaError = function($modal, blocklang, errorKey) {
5141			if(!$modal || $modal.length == 0) return;
5142
5143			var message = getSubmitCaptchaText(blocklang, errorKey, '');
5144			if(!message) message = getSubmitCaptchaText(blocklang, 'form.item.captcha.wrong', 'Invalid CAPTCHA code.');
5145
5146			$modal.find('.form-captcha .error').remove();
5147			$modal.find('.form-captcha').append('<div class="error">' + message + '</div>').addClass('required');
5148			$modal.find('.input-captcha').focus();
5149		}
5150
5151		var reloadSubmitCaptcha = function($modal, pid) {
5152			if(!$modal || $modal.length == 0) return;
5153			$modal.find('.input-captcha').val('');
5154			$modal.find('.form-captcha .error').remove();
5155			$modal.find('.form-captcha').removeClass('required');
5156			load_form_kcaptcha($modal, pid);
5157		}
5158
5159		var hideSubmitCaptchaModal = function($modal) {
5160			if(!$modal || $modal.length == 0) return;
5161			$modal.find('input:focus, textarea:focus, select:focus').blur();
5162			$modal.modal('hide');
5163		}
5164
5165		var showSubmitCaptchaModal = function($parent, pid, callback) {
5166			var blocklang = getSubmitCaptchaLang($parent);
5167			var modal = $(document.body).showModalFlat(
5168				getSubmitCaptchaText(blocklang, 'form.item.captcha.title', '보안 확인'),
5169				getSubmitCaptchaHTML(blocklang),
5170				true,
5171				true,
5172				function() {
5173					var captcha = $.trim(modal.find('.input-captcha').val());
5174					if(captcha == '') {
5175						showSubmitCaptchaError(modal, blocklang, 'config.wrong-captcha');
5176						return false;
5177					}
5178
5179					if(typeof callback == 'function') callback(captcha, modal, blocklang);
5180				},
5181				'cancel',
5182				'ok',
5183				'cl-cmmodal cl-s-btn w560 cl-p70 cl-p0 form-captcha-submit-modal',
5184				true
5185			);
5186
5187			reloadSubmitCaptcha(modal, pid);
5188			modal.find('.kcaptcha-change').off('click.submitCaptcha').on('click.submitCaptcha', function(e) {
5189				e.preventDefault();
5190				reloadSubmitCaptcha(modal, pid);
5191			});
5192			modal.find('.input-captcha').off('keydown.submitCaptcha').on('keydown.submitCaptcha', function(e) {
5193				if(e.keyCode == 13) {
5194					modal.find('.ok-button-dialog').click();
5195					return false;
5196				}
5197			}).focus();
5198
5199			return modal;
5200		}
5201
5202		$('[data-form-submit]').live('click', function() {
5203			var is_templates = checkTemplateSite(b.SID),
5204				is_render = (window.location.pathname.match(/^\/render(\/|$)/) !== null);
5205			if(is_render && !isRenderFormSubmitAllowed()) return false;
5206			if($('#flat-modal').length || is_templates) return false;
5207			if($('#flat-modal').length) return;
5208			var $parent = $(this).closest('.element'),
5209				$items = $parent.find('[form-idx]'),
5210				values = {},
5211				pid = $parent.attr('data-id'),
5212				submit = true,
5213				el = '.' + $(this).parents('.element').attr('data-name');
5214
5215			if($parent.find('.required').length > 0) {
5216				$parent.find('.form-inline').removeClass('required required-mr required-privacy');
5217				$parent.find('.form-group').removeClass('required');
5218			}
5219
5220			$parent.find('.error').remove();
5221			$.each($items, function(i,v) {
5222				var idx = $(this).attr('form-idx'),
5223					name = $(this).attr('form-name'),
5224					type = $(this).attr('form-type'),
5225					require = $(this).attr('form-require'),
5226					seq = $(this).attr('form-seq');
5227
5228				switch(type) {
5229					case "radio":
5230					case "check":
5231					case "radio.image":
5232					case "check.image":
5233						if(type == 'radio' || type == 'radio.image') {
5234							var val = $(this).find(':radio[name]:checked').val();
5235							values[seq] = (typeof val == 'undefined') ? '' : val;
5236						} else {
5237							values[seq] = $(this).find(':checkbox[name]:checked').map(function() { return this.value; } ).get().join();
5238						}
5239
5240						if(typeof require != 'undefined' && require) {
5241							if(!values[seq]) {
5242								formRequireDisplay($(this),i+1);
5243								submit = false;
5244							}
5245						}
5246						break;
5247					case "date":
5248						var date = $(this).find('input').map(function() { return this.value.replace(/-/g, ''); } ).get(),
5249							valid = true;
5250
5251						$.each(date, function(k,d) {
5252							if(d=='') valid = false;
5253						});
5254
5255						if(typeof require != 'undefined' && require) {
5256							if(valid == false) {
5257								formRequireDisplay($(this),i+1);
5258								submit = false;
5259							}
5260						}
5261						values[seq] = date.join('');
5262						break;	
5263					case "date2":
5264						var date = $(v).find('input').val();
5265						if($(v).find('input').length > 1 && $(v).find('.date-yyyy').length > 0) { //old
5266							var ymd = $(v).find('.date-yyyy').val() + '-' + $(v).find('.date-mm').val() + '-' + $(v).find('.date-dd').val();
5267							var time = $(v).find('.date-hh').val() + ':' + $(v).find('.date-ii').val();
5268							date = ymd + ' ' + time;
5269						}
5270						values[seq] = date;
5271						if(typeof require != 'undefined' && require) {
5272							if(!values[seq]) {
5273								formRequireDisplay($(this),i+1);
5274								submit = false;
5275							}
5276						}
5277						
5278						break;
5279					case "file.upload":
5280						var fileArr = new Array();
5281						$(this).find('input[type="hidden"]').each(function(idx, v) {
5282							var f = '#FILE#||' + $(v).val();
5283							fileArr.push(f);
5284						});
5285
5286						var val = fileArr.join(',');
5287                        values[seq] = (typeof val == 'undefined') ? '' : val;
5288
5289                        if(typeof require != 'undefined' && require) {
5290                            if(!values[seq].replace('#FILE#||', '')) {
5291                                formRequireDisplay($(this),i+1);
5292                                submit = false;
5293                            }
5294                        }
5295						break;
5296					default :
5297						var itemValue = $(this).hasClass('franchise-form-select') ? $(this).find('select.franchise-form-select-native').val() : $(this).val();
5298						values[seq] = (typeof itemValue == 'undefined' || itemValue === null) ? '' : itemValue.toString().trim();
5299						if(values[seq] && checkEmojis(values[seq])) {
5300							formRequireDisplay($(this),i+1,'emoji');
5301							submit = false;
5302						} else if(typeof require != 'undefined' && require) {
5303							if(!values[seq]) {
5304								formRequireDisplay($(this),i+1);
5305								submit = false;
5306							}
5307						}
5308						break;
5309				}
5310			});
5311
5312			var $privacy = $parent.find('.form-privacy'),
5313				check;
5314
5315			if($privacy.css('display')!='none') {
5316				check = $privacy.find('.check-privacy').prop('checked');
5317				if(check === false) {
5318					formRequireDisplay($privacy.find('.check-privacy'),'privacy');
5319					submit = false;
5320				}
5321			}
5322
5323			if($parent.attr('data-type') == 'form') {
5324				var $captcha = $parent.find('.form-captcha');
5325				var formCaptcha = '';
5326
5327				if($captcha.length > 0) {
5328					formCaptcha = $captcha.find('.input-captcha').val();
5329					if(formCaptcha == '') {
5330						formRequireDisplay($captcha.find('.input-captcha'),'captcha');
5331						submit = false;
5332					}
5333				}
5334			} else {
5335				var captcha_display = isSubmitCaptchaRequired($parent);
5336				$parent.find('.form-captcha').remove();
5337			}
5338
5339			if(!$parent.hasClass('el-fixedcontact') && $('.form-inline .error').length > 0) {
5340				var $error = $parent.find('.error');
5341				var header_height = $('.navbar-fheader').height();
5342				$.each($error, function(i,v) {
5343					if(i==0) {
5344						var $form_group = $(v).parent().find('[form-type]');
5345						var type = $form_group.attr('form-type');
5346						var privacy = $(v).parent().hasClass('form-privacy');
5347						if($.inArray(type, ['radio', 'check', 'radio.image', 'check.image']) > -1 || privacy) {
5348							var form_offset = $(v).parents('.form-group').offset();
5349							$("html, body").animate({scrollTop: ($parent.attr('data-type') == 'form')? form_offset.top-header_height : $parent.offset().top-header_height});
5350						} else {
5351							$(v).parent().find('.form-control').first().focus();
5352						}
5353					}
5354				});
5355			}
5356
5357				if(submit) {
5358					var completeSubmitForm = function(doneText) {
5359						var message = doneText;
5360						if(!message) message = $parent.attr('data-form-done');
5361						if(!message && typeof $.lang != 'undefined' && typeof LANG != 'undefined' && $.lang[LANG]) {
5362							message = $.lang[LANG]['forms.submit.done'];
5363						}
5364						if(!message) message = (typeof LANG != 'undefined' && LANG == 'ko') ? '신청 완료되었습니다.' : 'Your submission has been received';
5365
5366						$(this).showModalFlat('INFORMATION', message, true, false, '', 'ok', '', 'cl-modal cl-none-title cl-cmmodal cl-p130 cl-s-btn w560','','',function(){
5367							if(typeof formCallback == 'function') formCallback(pid);
5368						});
5369
5370						setDefaultForm(el);
5371					};
5372					var submitForm = function(formCaptcha, captchaModal, captchaBlocklang) {
5373						$.processON();
5374						$.ajax({
5375							url: '/template/forms/submit',
5376							data: { sid : b.SID, pid : pid, values : values, check : check, captcha : formCaptcha, block_type: 'form' },
5377							dataType: 'json',
5378							type: 'POST',
5379							async: true,
5380							cache: false,
5381							success: function (data) {
5382								checkError(data);
5383
5384								if(typeof data.error != 'undefined' && data.error != '') {
5385								// $(this).showModalFlat('', data.error,true,false,'','ok','','cl-cmmodal cl-s-btn w560 cl-p130 cl-t80 cl-modal cl-none-title cl-close-btn','','',function() {
5386								// 	$(document).on('keydown', function(e) {
5387								// 		if(e.keyCode == 27) modal.modal('hide');
5388								// 	});
5389								// });
5390								return false;
5391							}
5392
5393								if(typeof data.captcha_error != 'undefined' && data.captcha_error != '') {
5394									if(captchaModal && captchaModal.length > 0) {
5395										reloadSubmitCaptcha(captchaModal, pid);
5396										showSubmitCaptchaError(captchaModal, captchaBlocklang, data.captcha_error);
5397									} else if($parent.attr('data-type') == 'form' && $parent.find('.form-captcha').length > 0) {
5398										reloadSubmitCaptcha($parent, pid);
5399										showSubmitCaptchaError($parent, getSubmitCaptchaLang($parent), data.captcha_error);
5400									} else {
5401										alert($.lang[LANG][data.captcha_error]);
5402									}
5403									return false;
5404								}
5405
5406								if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5407								completeSubmitForm.call(this, data.done);
5408							},
5409							error: function(xhr) {
5410								// DB 저장 후 알림 발송 지연으로 502가 반환되는 경우 제출 완료 상태로 처리한다.
5411								if(xhr && xhr.status == 502) {
5412									if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5413									completeSubmitForm.call(this);
5414								}
5415							},
5416							complete: function() {
5417								$.processOFF();
5418							}
5419						},'json');
5420					};
5421
5422					if(captcha_display) {
5423						showSubmitCaptchaModal($parent, pid, function(captcha, captchaModal, captchaBlocklang) {
5424							submitForm(captcha, captchaModal, captchaBlocklang);
5425						});
5426					} else {
5427						submitForm(getInlineFormCaptcha($parent), null, getSubmitCaptchaLang($parent));
5428					}
5429				}
5430			});
5431
5432		var formRequireDisplay = function($obj,idx,error_type) {
5433			if(typeof error_type == 'undefined') error_type = '';
5434
5435			var isModoo = $obj.parents('.element').hasClass('modoo');
5436
5437			var blang = $obj.parents('.element').attr('data-lang'),
5438				sdefault = '';
5439
5440			var $el = $obj.parents('.element');
5441
5442			if(typeof property.SLANG.select != 'undefined') {
5443				var _lang = property.SLANG.select;
5444				if(_lang.indexOf('한국어') > -1) {
5445					sdefault = '필수 입력 사항';
5446				} else if(_lang.indexOf('English') > -1) {
5447					sdefault = 'Required';
5448				} else if(_lang.indexOf('日本語') > -1) {
5449					sdefault = '必須';
5450				} else {
5451					sdefault = 'Required';
5452				}
5453			} else sdefault = '필수 입력 사항';
5454
5455
5456			if(error_type == 'emoji') {
5457				sdefault = $.lang[LANG]['config.unable.emoji'];
5458			}
5459			
5460			var $parent = (isModoo) ? $obj.parents('.box') : $obj.parents('.form-group'),
5461				$html = $('<div class="error">' + sdefault + '</div>');
5462			$parent.append($html);
5463			if($obj.parents('.form-inline').find('.error').length==1) {
5464				if(isNumber(idx)) $('body').scrollTo($('[form-idx="' + idx + '"]'), 0, { offset : -150 } );
5465				else  $('body').scrollTo($parent, 0, { offset : -150 } );
5466			}
5467			if($el.attr('data-type') == 'contact' && $el.attr('data-type2') == 'franchise bar') {
5468				$parent.addClass('required');
5469				$el.find('.form-inline').addClass('required');
5470
5471				if($parent.hasClass('form-privacy')) {
5472					$el.find('.form-inline').addClass('required-privacy');
5473				} else {
5474					if(idx > 2) {
5475						$el.find('.form-inline').addClass('required-mr');
5476					}
5477				}
5478			}
5479		}
5480
5481		$('.date-yyyy').live('keyup', function(e) {
5482			var val = $(this).val();
5483			if(val.length>=4) {
5484				if((e.target.selectionStart).length) ;
5485				else {
5486					if(isNaN(parseInt(val))) {
5487						$(this).val('1900');
5488					}
5489					$(this).parents('.form-group').find('.date-mm').focus();
5490				}
5491			}				
5492		}).live('blur', function(e) {
5493			var val = $(this).val();
5494			if(isNaN(parseInt(val))) {
5495				$(this).val('1900');
5496			} else {
5497				if(parseInt(val)<1900) {
5498					$(this).val('1900');
5499				}
5500			}
5501		});
5502
5503		$('.date-mm, .date-dd, .date-hh, .date-ii').live('keyup', function(e) {
5504			var val = $(this).val();
5505			if(val.length>=2) {
5506				if((e.target.selectionStart).length) ;
5507				else {
5508					if(isNaN(parseInt(val))) {
5509						$(this).val('00');
5510					}
5511					if($(this).hasClass('date-mm')) {
5512						$(this).parents('.form-group').find('.date-dd').focus();
5513					} else if($(this).hasClass('date-dd')) {
5514						$(this).parents('.form-group').find('.date-hh').focus();
5515					} else if($(this).hasClass('date-hh')) {
5516						$(this).parents('.form-group').find('.date-ii').focus();
5517					} else if($(this).hasClass('date-ii')) {
5518						// $(this).parents('.form-group').next().find('input').focus();
5519					}
5520				}
5521			}				
5522		}).live('blur', function(e) {
5523			var val = $(this).val();
5524			if(isNaN(parseInt(val))) {
5525				$(this).val('01');
5526			} else {
5527				if(val.length==1) {
5528					$(this).val('0' + val);
5529				} else {
5530					if($(this).hasClass('date-mm') && parseInt(val)>12) {
5531						$(this).val('12');
5532					} else if($(this).hasClass('date-dd') && parseInt(val)>31) {
5533						$(this).val('31');
5534					} else if($(this).hasClass('date-hh') && parseInt(val)>23) {
5535						$(this).val('00');
5536					} else if($(this).hasClass('date-ii') && parseInt(val)>59) {
5537						$(this).val('00');
5538					}
5539				}
5540			}
5541		});
5542
5543		$('[data-lock-submit]').live('click', function() { 
5544			var el = $(this).closest('.form-inline');
5545			var pw = el.find('[data-lock-password]').val().trim();
5546			if(pw.length == 0 ) {
5547				el.find('[data-lock-password]').focus();
5548				el.find('.error-text').text('! ' + $.lang[LANG]['config.enter-password']);
5549				return false;
5550			}
5551
5552			$.modalON();
5553			let lockType = $(this).attr('data-lock');
5554			var url = (lockType == 'site')? '/template/siteLockController/type/pw_check':'/template/menuLockController/type/pw_check';
5555			$.post(url, {s: b.SMENU, sid: b.SID, page: b.PAGE, pw: pw, publish : b.PUBLISH}, function(data) {
5556				checkError(data);
5557				$.modalOFF();
5558				if(data.result) {
5559					if(lockType == 'site' && data.ss_site_lock) {
5560						localStorage.setItem('ss_' + b.SID + '_site_lock', data.ss_site_lock);
5561						localStorage.setItem('last_activity', data.last_activity);
5562					}
5563					window.location.reload(true);
5564				} else {
5565					el.find('[data-lock-password]').focus();
5566					el.find('.error-text').text('! ' + $.lang[LANG]['siteum.regexp.pw.invalid']);
5567				}
5568			}, 'json');
5569		});
5570
5571		$('[data-contact-submit]').live('click',function(e) {
5572			var is_templates = checkTemplateSite(b.SID),
5573				is_render = (window.location.pathname.match(/^\/render(\/|$)/) !== null);
5574			if(is_render && !isRenderFormSubmitAllowed()) return false;
5575			// if($('#flat-modal').length || window.location != window.parent.location) return;
5576
5577			//템플릿 추가 화면에서만 버튼 동작 안 되게끔 처리
5578			if($('#flat-modal').length || is_templates) return;
5579			
5580			$.modalON();
5581
5582		    var el = '.' + $(this).parents('.element').attr('data-name'),
5583		    	el_id = $(this).parents('.element').attr('data-id'),
5584		    	google_track = $(this).attr('data-google-track'),
5585		    	google_track_run = false,
5586		    	daum_track = $(this).attr('data-daum-track'),
5587		    	daum_track_run = false,
5588		    	naver_track = $(this).attr('data-naver-track'),
5589		    	naver_track_run = false;
5590
5591			var hasEmoji = false;
5592			$(el+' .form-group .form-control:not([readonly])').each(function() {
5593				if(checkEmojis($(this).val().trim())) {
5594					hasEmoji = true;
5595					return false;
5596				}
5597			});
5598
5599			if(hasEmoji) {
5600				e.preventDefault();
5601				$.modalOFF();
5602				errorEmojisModal();
5603				return false;
5604			}
5605
5606			google_track_run = (typeof google_track != 'undefined') ? true : false;
5607			daum_track_run = (typeof daum_track != 'undefined') ? true : false;
5608			naver_track_run = (typeof naver_track != 'undefined') ? true : false;
5609
5610		    if($(el).length==0 || $(el).length>1) {
5611		        alert('Invalid form data');
5612		        return false;
5613		    }
5614
5615
5616		    var firstname = ($(el + ' [data-contact-firstname]').length >0 ) ? setDefaultValue($(el + ' [data-contact-firstname]').val().trim()) : '',
5617		    	lastname = 	($(el + ' [data-contact-lastname]').length > 0) ? setDefaultValue($(el + ' [data-contact-lastname]').val().trim()) : '',
5618		    	email = 	($(el + ' [data-contact-email]').length > 0) ? setDefaultValue($(el + ' [data-contact-email]').val().trim()) : '',
5619		    	web = 		($(el + ' [data-contact-website]').length > 0) ? setDefaultValue($(el + ' [data-contact-website]').val().trim()) : '',
5620		    	phone = 	($(el + ' [data-contact-phone]').length > 0) ? setDefaultValue($(el + ' [data-contact-phone]').val().trim()) : '' ,
5621		    	subject = 	($(el + ' [data-contact-subject]').length > 0) ? setDefaultValue($(el + ' [data-contact-subject]').val().trim()) : '',
5622		    	message = 	($(el + ' [data-contact-message]').length > 0) ? setDefaultValue($(el + ' [data-contact-message]').val().trim()) : '',
5623		    	etc = {};
5624    		$(el + ' [data-contact-etc]').each(function(i) {
5625				var key = $(this).attr('data-contact-etc');
5626				etc[key] = setDefaultValueEtc($(this).attr('type'),$(this));
5627			});
5628
5629		    var require_firstname 	= $(el + ' [data-contact-firstname]').attr('data-required'),
5630		    	require_lastname 	= $(el + ' [data-contact-lastname]').attr('data-required'),
5631		    	require_email		= $(el + ' [data-contact-email]').attr('data-required'),
5632		    	require_web			= $(el + ' [data-contact-website]').attr('data-required'),
5633		    	require_phone		= $(el + ' [data-contact-phone]').attr('data-required'),
5634		    	require_subject 	= $(el + ' [data-contact-subject]').attr('data-required');
5635
5636		    /*default:: required[email,message] | optional[firstname,lastname,web,phone,subject]  // data-optional='true'->optional, 'false'->required */
5637		    var optional_firstname  = $(el + ' [data-contact-firstname]').attr('data-optional'),
5638		    	optional_lastname   = $(el + ' [data-contact-lastname]').attr('data-optional'),
5639		    	optional_email		= $(el + ' [data-contact-email]').attr('data-optional'),
5640		    	optional_web		= $(el + ' [data-contact-web]').attr('data-optional'),
5641		    	optional_phone		= $(el + ' [data-contact-phone]').attr('data-optional'),
5642		    	optional_subject	= $(el + ' [data-contact-subject]').attr('data-optional'),
5643		    	optional_message	= $(el + ' [data-contact-message]').attr('data-optional');
5644		    var optional_etc		= {};
5645
5646    		$(el + ' [data-contact-etc]').each(function(i) {
5647				var key = $(this).attr('data-contact-etc');
5648				optional_etc[key] = $(this).attr('data-optional');
5649			});
5650
5651				var $parent = $(this).parents('.element'),
5652					el = '.' + $(this).parents('.element').attr('data-name'),
5653					contprivacy = $(el+' .form-group.contact-privacy-area').css('display'),
5654					contprivacy_display = (typeof contprivacy == 'undefined' || contprivacy == 'none') ? false : true,
5655					privacy_check = $parent.find('.contact-checkbox-text'),
5656					privacy_chk = privacy_check.is(":checked"),
5657					captcha_display = isSubmitCaptchaRequired($parent),
5658					check = true,
5659					check_option = [];
5660
5661				$parent.find('.form-captcha').remove();
5662
5663				if(!firstname) {
5664					var name_text = ($(el + ' [data-contact-lastname]').length > 0) ? 'first name' : 'name';
5665		    	if(typeof optional_firstname != 'undefined' && optional_firstname == 'false') check = true;
5666		    	else if ($(el + ' [data-contact-firstname]').length == 0) check 
5666= true;
5667		    	else check = false;
5668
5669		    	var str = ($(el + ' [data-contact-firstname]').length > 0 && $(el + ' [data-contact-firstname]').attr('data-contact-firstname').length > 0) ? $(el + ' [data-contact-firstname]').attr('data-contact-firstname') : name_text;
5670		    	if(!check) check_option.push(str);
5671		    }
5672
5673		    if($(el + ' [data-contact-lastname]').length > 0 && !lastname) {
5674		    	if(typeof optional_lastname != 'undefined' && optional_lastname == 'false') check = true;
5675		    	else if ($(el + ' [data-contact-lastname]').length == 0) check = true;
5676		    	else check = false;
5677		    	
5678		    	var str = ($(el + ' [data-contact-lastname]').attr('data-contact-lastname').length > 0) ? $(el + ' [data-contact-lastname]').attr('data-contact-lastname') : 'last name';
5679		    	if(!check) check_option.push(str);
5680		    }
5681
5682		    /*if((!firstname && typeof optional_firstname != 'undefined' && optional_firstname == "false") || (!lastname && typeof optional_lastname != 'undefined' && optional_lastname == "false")) {
5683		    	var str = ($(el + ' [data-contact-firstname]').attr('data-contact-firstname').length > 0) ? $(el + ' [data-contact-firstname]').attr('data-contact-firstname') : 'name';
5684		    	check_option.push(str);
5685		    }*/
5686		    
5687		    if(!web && typeof optional_web != 'undefined' && optional_web == 'false') {
5688		    	var str = ($(el + ' [data-contact-web]').attr('data-contact-web').length > 0) ? $(el + ' [data-contact-web]').attr('data-contact-web') : 'web';
5689		    	check_option.push(str);
5690		    }
5691
5692		    if(!phone && typeof optional_phone != 'undefined' && optional_phone == 'false') {
5693		    	var str = ($(el + ' [data-contact-phone]').attr('data-contact-phone').length > 0) ? $(el + ' [data-contact-phone]').attr('data-contact-phone') : 'phone';
5694		    	check_option.push(str);
5695		    }
5696
5697		    if(!subject && typeof optional_subject != 'undefined' && optional_subject == 'false') {
5698		    	var str = ($(el + ' [data-contact-subject]').attr('data-contact-subject').length > 0) ? $(el + ' [data-contact-subject]').attr('data-contact-subject') : 'subject';
5699		    	check_option.push(str);
5700		    }
5701
5702		    if(!email) {
5703		    	if(typeof optional_email != 'undefined' && optional_email == 'true') check = true;
5704		    	else if ($(el + ' [data-contact-email]').length == 0) check = true;
5705		    	else check = false;
5706		    	
5707		    	var str = ($(el + ' [data-contact-email]').attr('data-contact-email').length > 0) ? $(el + ' [data-contact-email]').attr('data-contact-email') : 'email';
5708		    	if(!check) check_option.push(str);
5709		    }
5710		    if(!message) {
5711		    	if(typeof optional_message != 'undefined' && optional_message == 'true') check = true;
5712		    	else check = false;
5713
5714		    	var str = ($(el + ' [data-contact-message]').attr('data-contact-message').length > 0) ? $(el + ' [data-contact-message]').attr('data-contact-message') : 'message';
5715		    	if(!check) check_option.push(str);
5716		    }
5717
5718		   	$.each(etc,function(k,v){
5719		   		if(!etc[k] && typeof optional_etc[k] != 'undefined' & optional_etc[k] == 'false') {
5720		   			check_option.push(k);
5721		   		}
5722		   	});
5723
5724		   	check = ((check_option.length == 0) && ((contprivacy_display == false) || (privacy_chk == true))) ? true : false;
5725
5726		    if(require_firstname == 'true' && !firstname) {
5727		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-firstname]').attr('placeholder') + $.lang[LANG]['check.required'], true, false, '', 'ok');
5728		    	return false;
5729		    }
5730
5731		    if(require_lastname == 'true' && !lastname) {
5732		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-lastname]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5733		    	return false;
5734		    }
5735
5736		    if(require_web == 'true' && !web) {
5737		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-website]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5738		    	return false;
5739		    }
5740
5741		    if(require_phone == 'true' && !phone) {
5742		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-phone]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5743		    	return false;
5744		    }
5745
5746		    if(require_subject == 'true' && !subject) {
5747		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-subject]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5748		    	return false;
5749		    }
5750
5751		    if(check) {
5752			var submitContact = function(contactCaptcha, captchaModal, captchaBlocklang) {
5753				$.modalON();
5754				$.post('/template/update/type/contact',{
5755					id : b.SID,
5756					seq : el_id,
5757					s : 'message',
5758					firstname : firstname,
5759					lastname : lastname,
5760					email : email,
5761					web : web,
5762					phone : phone,
5763					subject : subject,
5764					message : message,
5765					etc : JSON.stringify(etc),
5766						captcha : contactCaptcha,
5767						block_type: 'contact',
5768				}, function(data) {
5769					checkError(data);
5770						if(typeof data.captcha_error != 'undefined' && data.captcha_error != '') {
5771							$.modalOFF();
5772							if(captchaModal && captchaModal.length > 0) {
5773								reloadSubmitCaptcha(captchaModal, el_id);
5774								showSubmitCaptchaError(captchaModal, captchaBlocklang, data.captcha_error);
5775							} else {
5776								alert($.lang[LANG][data.captcha_error]);
5777							}
5778							return false;
5779						}
5780
5781					if(typeof data.error == 'undefined' || data.error == '') {
5782						var ch_lang = getLang($(el), b.SID),
5783							submit_txt = (typeof data.submitStr != 'undefined' && data.submitStr) ? data.submitStr : $.lang[ch_lang]['message.sent'];
5784
5785						if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5786						$(document.body).showModalFlat('INFORMATION',submit_txt,true,false, '', 'ok', '', 'cl-modal cl-none-title cl-cmmodal cl-p130 cl-s-btn w560');
5787						setDefaultContactForm(el);
5788						setDefaultContactFormEtc(el);
5789						if(typeof contactCallback == 'function')
5790							contactCallback(el_id);
5791					}
5792				},'json');
5793				    setTimeout(function() {
5794					    $.modalOFF();
5795				    },1000);
5796			};
5797
5798			if(captcha_display) {
5799				$.modalOFF();
5800				showSubmitCaptchaModal($parent, el_id, function(captcha, captchaModal, captchaBlocklang) {
5801					submitContact(captcha, captchaModal, captchaBlocklang);
5802				});
5803			} else {
5804				submitContact('', null, getSubmitCaptchaLang($parent));
5805			}
5806		    } else {
5807		    	$.modalOFF();
5808		    	var check_str = '';
5809		    	$.each(check_option,function(k,v) {
5810		    		check_str = (check_str) ? check_str + ' / ': '';
5811		    		check_str = check_str + v;
5812	            });
5813	            
5814		    	if(check_str) {
5815		    		var modal = $(this).showModalFlat('INFORMATION',check_str+ $.lang[LANG]['message.check.required'],true,false, '', 'ok', '', 'cl-modal cl-none-title cl-cmmodal cl-p130 cl-s-btn w560');
5816		    	} else {
5817		    		var modal = $(this).showModalFlat('INFORMATION',$.lang[LANG]['message.privacy.check.required'],true,false, '', 'ok');
5818		    	}
5819		    	
5820		    }					    
5821		});	
5822	
5823		$('.contact-privacy-text').live('click',function() {
5824			var contactEL = $(this).parents('.element'),
5825				contactPriavcy = $(contactEL).find('.form-inline .contact-privacy-area .contact-privacy-box'),
5826				checkType = (typeof $(contactEL).attr('data-type') != 'undefined' && $(contactEL).attr('data-type') == 'contact') ? true : false;
5827
5828			if(checkType && contactPriavcy.length > 0) {
5829				if(contactPriavcy.css('display') == 'none') contactPriavcy.show();
5830				else contactPriavcy.hide();
5831			}
5832		});
5833		
5834		$('.element .gallery-loadmore').live({
5835		    click: function(e) {
5836				if(typeof $(this).data('id') == 'undefined' || typeof $(this).data('page') == 'undefined') {
5837					e.preventDefault();
5838					return false;
5839				}
5840
5841				var id = $(this).attr('data-id'),
5842					gpage = (typeof $(this).attr('data-page') != 'undefined') ? Number($(this).attr('data-page')) : 1,
5843					view = (typeof $(this).attr('data-view') != 'undefined') ? Number($(this).attr('data-view')) : 6,
5844					mode = $(this).attr('data-mode'),
5845					$galleryELLoadmore = $(this),
5846					$galleryEL = $('.element[data-id="' + id + '"]'),
5847					$gContainer = $galleryEL.find('.container'),
5848					$gLoop = $galleryEL.find('[data-loop="true"]'),
5849					$gtoolbar = getGToolbar($galleryEL),
5850					$gc =  $gtoolbar.find('.cl-gcate-list .cl-gcate-item.active'),
5851		            $go = $gtoolbar.find('.cl-gsort-list .cl-gsort-item.active a'),
5852					sfl = ($gc.index() > 0) ? 'category' : '',
5853					stx = (sfl) ? $gc.text().trim() : '',
5854		            orderby = ($go.length > 0) ? $go.attr('data-orderby') : 'recent';
5855
5856		        var val = galleryEL[id],
5857		        	tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES'),
5858		        	g_settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {},
5859		        	folder = (typeof val.folder != 'undefined' && val.folder > 0) ? val.folder : '',
5860		        	isMasonry = $galleryELLoadmore.hasClass('masonry-layout'),
5861		        	block_lang = (typeof g_settings.blocklang != 'undefined') ? g_settings.blocklang : LANG;
5862
5863				var nodes = $gLoop.clone().children('.grid');
5864				initGalleryField(nodes);
5865
5866				var g_number = $gLoop.data('gallery-no'),
5867					total = 0,
5868					items = 0,
5869					gallery_item = '';
5870
5871				var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
5872				var glm = $(tag).find('.loadmore-wrap');
5873
5874				var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false,
5875					checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof g_settings.gframe_title_visible != 'undefined' && g_settings.gframe_title_visible == 'OFF')) ? true : false;
5876
5877				if(id == 'all_products') {
5878		       		sfl = 'orderby';
5879		       		stx = (typeof $gc.find('a').attr('data-orderby') != 'undefined') ? $gc.find('a').attr('data-orderby') : $('.allProducts-sort-list>li:first-child').find('a').attr('data-orderby');
5880		       	}				
5881
5882		       	var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
5883				   var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
5884				var uri = getSearchURL();
5885				// if(uri.category_no == '') {
5886				// 	uri.category_no = (typeof g_settings.lux_category_no != 'undefined') ? g_settings.lux_category_no : '';
5887				// }
5888				if (isObjectEmpty(uri) && _this.b.LUX) {
5889					uri = val.searches.uri;
5890				}
5891	
5892		        $.ajax({
5893		            url: '/template/gallery/list/pid/' + id + '/sid/' + property.SID + '/spage/' + property.PAGE + '/page/' + gpage + '/view/' + view + '/publish/' + property.PUBLISH,
5894					data: { g_mode: mode, visible: true, sfl: sfl, stx: stx, orderby: orderby, total: true, uri : uri },
5895					dataType: 'json',
5896					type: 'POST',
5897		            async: false,
5898		            cache: false,
5899		            success: function (data) {
5900		            	$.cookie('gallery-page-' + id, gpage, { path: '/', expires: 12 * 60 * 60 * 1000 });
5901		                $.cookie('gallery-category-' + id, stx, { path: '/', expires: 12 * 60 * 60 * 1000 });
5902	                    $.cookie('gallery-orderby-' + id, orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
5903						if($galleryEL.is('[data-gjs]') && gpage > 1) setLoadmoreGalleryJS($galleryEL.attr('data-gjs'),id,true);
5904
5905		                var loop_count = nodes.length;
5906
5907                        total = (typeof data.total.list_total != 'undefined') ? data.total.list_total : data.total;
5908		                items = data.list.length;
5909
5910		                var g_popup_remove = $('.galleryPL'+id+'.gallery-popup').find('.gallery-item');
5911		                $.each(g_popup_remove,function(i,v) {
5912		                	if(items > i) $(this).remove();
5913		                });
5914
5915		                $.each(data.list,function(i,v) {
5916		                    loop_pos = i%loop_count;
5917		                    c = nodes[loop_pos];
5918		                    item_index = ((gpage-1)*view) + i;
5919                            var isTitle = (v.title.length > 0) ? true:false,
5920                                isCaption = (v.caption.length > 0) ? true:false;
5921
5922							$(c).addClass('gallery-item').attr('data-index',item_index).attr('data-gpos',v.pos).attr('data-seq',v.seq);
5923							
5924                            var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
5925						        img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
5926						        img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
5927
5928							var src = getServeImage(v.image,val.folder,img_path),
5929								src_s0 = getServeImage(v.image,'0',img_path);
5930							if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
5931							ensureGalleryResponsiveImageClass($(c));
5932							if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
5933							if(checkGallerySVG) {
5934								var gimgSVG = $(c).find('.gimg-svg-wrap svg');
5935								gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+item_index);
5936								gimgSVG.find('image').attr('xlink:href', src);
5937								gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+item_index+')');
5938							}
5939							
5940							var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
5941								glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
5942
5943							if(glink) {
5944								if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
5945									var bookmark_seq = glink.replace(/^\@/g,'');
5946									if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
5947										glink = '';
5948										glink_target = '';
5949									}
5950								} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
5951									glink_target = '';
5952								} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
5953								} else {																					// link-type: link-out      ==> a[attr-link]
5954									if(checkBase64Encode(glink)) glink = Base64.decode(glink);
5955								}
5956							}
5957
5958							$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
5959							var gallery_page_chmod = g_settings && g_settings.gallery_page_chmod || null;
5960							var umgrade = property && property.UMGRADE ? (property.UMGRADE.seq || property.UMGRADE.grade_id || null) : null;
5961							if (typeof gallery_page_chmod === 'string') {
5962								try { gallery_page_chmod = JSON.parse(gallery_page_chmod); }
5963								catch (e) { gallery_page_chmod = gallery_page_chmod ? gallery_page_chmod.split(',') : []; }
5964							}
5965							gallery_page_chmod = $.isArray(gallery_page_chmod) ? $.map(gallery_page_chmod, function(v) { return String(v); }) : [];
5966							umgrade = (umgrade !== null && typeof umgrade != 'undefined') ? String(umgrade) : null;
5967							$(c).removeClass('noneShoppingGrade').removeAttr('data-shopping-grade-msg');
5968							if (isShoppingGradePriceHidden(v) && property['SITEUM'] >= 1) {
5969								$(c).addClass('gallery-item').addClass('nonePrice');
5970								$(c).find('a').attr('href', '#');
5971							} else {
5972								if(isShoppingGradeBlocked(v, g_settings, property)) {
5973									$(c).addClass('gallery-item').addClass('noneShoppingGrade');
5974									$(c).attr('data-shopping-grade-msg', getShoppingGradeBlockedMessage(v));
5975									$(c).find('a').attr('href', '#');
5976								} else if(glink) {
5977									var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
5978									$(c).find('a').attr('href',glink_val);
5979
5980									if(glink.match(/^\@/g)) {
5981										$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
5982									} else if(glink.match(/^flink\@[0-9]/g)) {
5983										$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
5984									// IE ERROR_includes__H.20210603
5985									// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
5986									} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
5987										$(c).find('a').attr('data-user-link',glink_val);
5988									} else {
5989										$(c).find('a').attr('attr-link',glink);
5990									}
5991                                } else {
5992									if (val.mode == 'gallery') {
5993										src_s0 = src_s0 + '?gpos='+v.pos;
5994
5995										$(c).find('a').attr('href', src_s0);
5996										$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
5997									} else {
5998										if(val.seq == 'all_products') {
5999											$(c).find('a').attr('href', v.product_url);
6000											$(c).removeClass('nonePrice');
6001										} else {
6002											if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
6003											else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
6004			
6005											// $(c).find('a').attr('href', ((b.URL=='/') ? '' : b.URL) + '/' + b.PAGE + '/view/' + v.seq);
6006										}
6007									}
6008	                            }
6009	                        }
6010
6011		                    if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
6012		                    else $(c).find('a').removeAttr('target');
6013
6014							$(c).find('.non_text').removeClass('non_text');
6015							
6016							if(mode != 'shopping') {
6017								if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
6018								if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
6019							}
6020
6021							if(v.title.length==0) v.title = $.lang[block_lang]['editor.block.gallery.sample.title'];
6022							if(v.caption.length==0) v.caption = $.lang[block_lang]['editor.block.gallery.sample.caption'];
6023
6024							if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
6025							else $(c).find('a').attr('data-title', v.title);
6026
6027							if(mode != 'shopping' && isCaption && $(c).find('p.figure.caption').length == 0) {
6028								var $captionParent = ($(c).find('.fig_price').length > 0) ? $(c).find('.fig_price').first() : $(c).find('figcaption').first(),
6029									captionClass = 'figure caption';
6030								if($captionParent.length > 0) $captionParent.prepend('<p class="' + captionClass + '"></p>');
6031							}
6032
6033		                    // caption
6034		                    var ftitle = $(c).find('h5.figure'),
6035		                        fcaption = $(c).find('p.figure').not('.comment'),
6036		                        fdatetime = $(c).find('.figure.datetime'),
6037		                        fhashtag = $(c).find('.figure.hashtag'),
6038		                        fbrand = $(c).find('.figure.brand'),
6039		                        fprice = $(c).find('.figure.price'),
6040								freview = $(c).find('.figure.review'),
6041								fcomment = $(c).find('.figure.comment'),
6042								flike = $(c).find('.figure.like'),
6043								fbasket = $(c).find('.figure.basket');
6044
6045		                    $(c).find('figcaption').removeClass('hide');
6046							if(v.title || v.caption) {
6047								var gallery_caption = v.caption;
6048								gallery_caption = gallery_caption.replace(/\n/g,'<br />');
6049
6050								ftitle.html(v.title);
6051								fcaption.html(gallery_caption);
6052								if(mode != 'shopping' && !isCaption) $(c).find('p.figure.caption').remove();
6053								if(fdatetime.length > 0) fdatetime.text(v.datetime);
6054								if(fhashtag.length > 0) fhashtag.text(v.hashtag);
6055							}
6056							
6057	                        if(g_number) {
6058	                            var g_index = String(item_index + 1),
6059	                                g_num = g_index.padStart(g_number, '0');
6060	                            $(c).find('.figure.number').text(g_num);
6061	                        }
6062
6063							if(fbrand.length > 0) {
6064								var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
6065								fbrand.html(v.brand_name);
6066							}
6067
6068							if(mode == 'shopping' || id == 'all_products') {
6069								fcomment.addClass('hide');
6070								flike.addClass('hide');
6071								
6072								v.price = parseFloat(v.price);
6073								v.sale = parseFloat(v.sale);
6074								var productGradeOnOff = getShoppingGradeProductGradeOnOff(v);
6075								$(c).attr('data-editor-grade-price-enabled', productGradeOnOff).attr('data-config-grade-price-enabled', productGradeOnOff);
6076								var checkPriceHidden = isShoppingGradePriceHidden(v),
6077									base_gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
6078									base_gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
6079									gallery_price = base_gallery_price,
6080									gallery_sale_price = base_gallery_sale_price,
6081									gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
6082									grade_price_display = g_settings.grade_price_display == 'ON',
6083									grade_discount_grade = getShoppingGradePreviewDiscountGrade(data.grade),
6084									grade_discount_applied = false,
6085									grade_gallery_price = 0,
6086									product_soldout = '품절',
6087									product_no_sale = (typeof g_settings.sh_soldout == 'string') ? g_settings.sh_soldout : '구매불가',
6088									product_status = '';
6089								if (
6090									!checkPriceHidden &&
6091									isShoppingGradeProductGradePriceEnabled(v)
6092								) {
6093									grade_gallery_price = calcShoppingGradeDisplayPrice(base_gallery_price, grade_discount_grade);
6094									grade_discount_applied = grade_gallery_price !== null;
6095								}
6096								if(v.status == 'off' && !checkPriceHidden) {
6097									product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
6098								} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
6099									product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
6100								}
6101
6102								$(c).find('.cl-sh-soldout').remove();
6103								if(product_status != '') $(c).attr('data-soldout',true);
6104								else $(c).removeAttr('data-soldout');
6105
6106								$(c).find('.product-badge').remove();
6107								product_status += drawBadgeList(v.use_badge, data.badge_settings);
6108
6109								$(c).find('.cl-sh-limit').remove();
6110								if(v.status == 'lim') {
6111                                    if(v.sale_now == false) {
6112                                        var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
6113			                            if(freview.length > 0) {
6114			                                freview.after(product_limit);
6115			                            } else {
6116			                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
6117			                            }
6118                                    }
6119                                }
6120
6121								if($(c).find('ul.figure.price').length > 0) {
6122									// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
6123	                                //     off_str = (price_off > 0) ? price_off + '% ' : ''
6124									var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
6125									if(!_this.b.LUX) off_str = gallery_sale_per;
6126									if(!off_str && gallery_sale_price > 0 && gallery_price > 0 && gallery_price < gallery_sale_price) {
6127										var price_off = Math.round(((gallery_sale_price - gallery_price) / gallery_sale_price) * 100);
6128										off_str = (price_off > 0) ? price_off + '% ' : '';
6129									}
6130									//Ver02
6131									if(!checkPriceHidden) {
6132										var $priceWrap = $(c).find('ul.figure.price'),
6133											$priceVal = $priceWrap.find('.price-val'),
6134											$priceSale = $priceWrap.find('.price-sale'),
6135											$priceSalePer = $priceWrap.find('.price-sale-per');
6136										$priceWrap.find('.sp-price, .grade-discount-price').remove();
6137										if($priceSale.length >
6137 0 && $priceSalePer.length == 0) {
6138											$priceSale.after('<li class="price-sale-per hide"></li>');
6139											$priceSalePer = $priceWrap.find('.price-sale-per');
6140										}
6141										$priceWrap.css({display:'', flexDirection:'', alignItems:''});
6142										$priceVal.css({order:'', display:''});
6143										$priceSale.css({order:'', display:'', marginRight:''});
6144										$priceSalePer.css({order:'', display:'', marginLeft:'', marginTop:''});
6145											$priceVal.html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
6146										$priceVal.removeClass('hide');
6147
6148										if(gallery_sale_price > 0 && gallery_price  < gallery_sale_price) {
6149											$priceSale.html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
6150												$priceSalePer.html(off_str);
6151											$priceSale.removeClass('hide');
6152												$priceSalePer.removeClass('hide');
6153											if(!grade_discount_applied && _this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
6154												$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
6155											}
6156										} else {
6157											$priceSale.addClass('hide').html('');
6158											$priceSalePer.addClass('hide').html('');
6159
6160										}
6161										
6162                                        if(grade_price_display && grade_discount_applied) {
6163                                            $priceWrap.append('<li class="grade-discount-price"><span class="grade-discount-price-value">₩' + grade_gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + '</span><span class="grade-discount-price-label">나의 할인가</span></li>');
6164                                        }
6165
6166                                        $(c).find('ul.figure.price .price-unit-pricing').remove();
6167                                        if(v.product_unit_str) {
6168                                            $(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
6169                                        }
6170									} else {
6171                                        $(c).find('ul.figure.price .price-val').html('₩0');
6172                                        $(c).find('ul.figure.price .price-val').addClass('hide');
6173									}
6174									if(id == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
6175									if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
6176
6177									var badge_size = getBadgeSize(data.badge_settings);
6178									$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
6179									$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
6180									if(badge_size) {
6181										$(c).find('.cl-sh-soldout').addClass(badge_size);
6182										$(c).find('.cl-sh-limit').addClass(badge_size);
6183									}
6184								} else {
6185									//Ver01
6186									if(fprice.length == 0) fprice = fcaption;
6187
6188									if(checkPriceHidden) fprice.html('');
6189									else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
6190								}
6191
6192								if($(c).find('ul.figure.review').length > 0) {
6193									var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
6194									if(gallery_review > 0) {
6195										$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
6196										$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
6197										$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
6198									} else {
6199										$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
6200										$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
6201									}
6202								}
6203
6204								if(fbasket.length > 0) {
6205									var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
6206										checkOldverBasket = (typeof g_settings.field_oldver != 'undefined' && g_settings.field_oldver && g_settings.field_oldver.indexOf('basket') > -1) ? true : false,
6207										checkDisabledBasket = (typeof g_settings.field_disable != 'undefined' && g_settings.field_disable && g_settings.field_disable.indexOf('basket') > -1) ? true : false;
6208									if(v.basket_off || v.shopping_grade_hidden == 'ON') fbasket.addClass('cannotby hide');
6209									else if(id == 'all_products') fbasket.removeClass('hide');
6210									else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
6211									else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
6212									else fbasket.removeClass('hide');
6213								}
6214
6215
6216							} else {
6217								fbrand.addClass('hide');
6218								fprice.addClass('hide');
6219								freview.addClass('hide')
6220								fbasket.addClass('hide');
6221
6222								if ( checkUseComment 
6223									&& g_settings.comment_display == 'ON'
6224									&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('comment') > -1)
6225									&& fcomment.length > 0
6226									&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
6227								) {
6228									fcomment.removeClass('hide');
6229									fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
6230								} else {
6231									fcomment.addClass('hide');
6232									fcomment.find('.figure-comment-cnt').empty();
6233								}
6234	
6235								if ( checkUseLike 
6236									&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
6237									&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('like') > -1)
6238									&& flike.length > 0
6239								) {
6240									flike.removeClass('hide').find('.figure-like-cnt').html(0);
6241									if(v.like !== undefined) {
6242										flike.find('.figure-like-cnt').html(v.like.cnt);
6243										if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
6244									}
6245								} else {
6246									flike.addClass('hide');
6247								}
6248							}
6249
6250                            if(checkUseLike == false) flike.html('');
6251
6252							if(isMasonry) {
6253								gallery_item = gallery_item + $(c)[0].outerHTML;
6254							} else {
6255								if(checkLoadmoreInLoop) $gLoop.find('.loadmore-wrap').before($(c)[0].outerHTML);
6256								else $gLoop.append($(c)[0].outerHTML);
6257							}
6258		                });
6259		            }
6260		        });
6261				changeBrokenImages($galleryEL);
6262
6263				if(isMasonry) {
6264					$('.gallery-loadmore[data-id="' + id + '"]').before('<div class="gallery-loading-status"><div class="loading-dots"></div></div>');
6265					showHideGalleryField($galleryEL,g_settings);
6266					reloadBlockMasonry('add',$galleryEL,$(gallery_item));
6267				} else {
6268					showHideGalleryField($galleryEL,g_settings);
6269				}
6270
6271				var cookie_page = gpage,
6272					new_view = (view > total) ? total : view,
6273					cookie_view = ( (cookie_page*new_view) > total ) ? total : cookie_page*new_view;
6274
6275				$galleryEL.find('.display').text(cookie_view);
6276
6277				var $glmBtnWrap = $galleryELLoadmore.closest('.loadmore-wrap'),
6278					$glmBtn = $galleryEL.find('.loadmore-wrap .gallery-loadmore'),
6279					checkLoadmore = (total > view && total > cookie_view) ? true : false;
6280				
6281				if($glmBtnWrap.length == 0) {
6282					// gallery loadmore btn - default (ver1)
6283					if(checkLoadmore) $galleryELLoadmore.attr('data-page', cookie_page + 1);
6284					else $galleryELLoadmore.remove();
6285				} else {
6286					// gallery loadmore btn - custom (ver2)
6287					if(checkLoadmore) {
6288						$glmBtn.attr('data-page', cookie_page + 1);
6289						$glmBtnWrap.removeClass('hide').fadeIn();
6290					} else {
6291						$glmBtnWrap.fadeOut().addClass('hide');
6292						$glmBtn.removeAttr('data-loadmore').removeAttr('data-id').removeAttr('data-total').removeAttr('data-page').removeAttr('data-view').removeAttr('data-folder').removeAttr('data-mode').removeClass('masonry-layout');
6293						$glmBtn.find('.display .view').text('0');
6294						$glmBtn.find('.display .total').text('0');
6295					}
6296				}
6297
6298				if($galleryEL.has('input.gjs').length) setGalleryJS('add-loop',$galleryEL);
6299				
6300				if($galleryEL.find('*[data-direffect="true"]').length > 0 ) {
6301					setTimeout(function() {
6302						$galleryEL.find('.grid').each(function() {
6303							$(this).hoverdir();
6304						});
6305					}, 400);
6306				}
6307			}
6308		});
6309
6310		$('.gallery-loadmore, .data-feed-load-more').live('touchstart', function (e) {
6311			var g_color = $(this).css('color'),
6312				g_bgcolor = $(this).css('background-color'),
6313				g_bdcolor = $(this).css('border-color');
6314
6315			if(isMobile()) {
6316				$(this).css('color', g_color);
6317				$(this).css('background-color', g_bgcolor);
6318				$(this).css('border-color', g_bdcolor);
6319			}
6320		});
6321		
6322		$('.gallery-item a[title]').live('mouseenter', function () {
6323		    $(this).tooltip('destroy');
6324		});
6325
6326		$('.gallery-item a:not([attr-flink])').live({
6327			click : function(e) {
6328		    	e.preventDefault();
6329				if($(e.target).is('.figure.basket') || $(e.target).is('.basket-btn')) return false;
6330
6331				var loc = $(this).attr('href'),
6332					mode = $(this).attr('data-gallery'),
6333					menu_link = $(this).attr('data-user-link'),
6334					bookmark = $(this).attr('attr-bookmark'),
6335					blank = $(this).attr('target'),
6336					user_link = $(this).attr('attr-link');
6337
6338				if( (typeof mode!='undefined' && mode.length>0) ||
6339					(typeof menu_link!='undefined' && menu_link.length>0) ||
6340					// (typeof user_link!='undefined' && user_link.length>0) ||
6341					(typeof bookmark!='undefined' && bookmark.length>0) 
6342				) return;
6343
6344				if(typeof blank!='undefined' && blank.length) {
6345					var url = (typeof user_link != 'undefined' && user_link.match('^(tel:|mailto:|sms:)') === null) ? makeLinkUrl(user_link, b.ONE, b.VIEW) : loc;
6346					var openNewWindow = window.open(url);
6347				} else {
6348					if(typeof user_link != 'undefined' && user_link) {
6349						location.href=loc;
6350					} else {
6351						var url = new getLocation(loc);
6352						golink(_this,url);
6353					}
6354		    	}
6355
6356		    	// 	uri = (b.PUBLISH) ? loc : loc.replace('/render/',''),
6357		    	// 	attr = $(this).attr('attr-link');
6358
6359		    	// if(typeof attr!='undefined' && attr) return;
6360	    		// _this.history.pushState(null,b.TITLE,(b.PUBLISH) ? '/' : '/render/' + uri);
6361			}
6362		});
6363		$('.gallery-item .figure.like').live('click', function(e){
6364			e.preventDefault();
6365			return false;
6366		});
6367		$('.gallery-item .figure.basket, .pitem .basket-box').live('click', function(e) {
6368			e.preventDefault();
6369			var checkPsearch = ($(this).closest('.pitem').length > 0) ? true : false;
6370			if(b.PUBLISH) {
6371				if(!checkPsearch && $(this).closest('.gallery-item').hasClass('nonePrice')) {
6372					$(this).closest('.nonePrice').click();
6373					return false;
6374				}
6375
6376				var tmp_pid = (checkPsearch) ? $(this).closest('.pitem').attr('data-pid') : $(this).closest('.element').attr('data-id'),
6377					tmp_seq = (checkPsearch) ? $(this).closest('.pitem').attr('data-gid') : $(this).closest('.gallery-item').attr('data-seq');
6378				$.quickbasket.init(b.SID,tmp_pid,tmp_seq);
6379			} else {
6380				$(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['manager.check.no-support.render-mode'], true, false, '', 'ok', '', 'cl-cmmodal cl-s-btn w560 cl-p70 cl-p0');
6381				return false;
6382			}
6383		});
6384
6385		// tab-box left-right button event
6386		$(document).on('click', '.left-arrow .arrow:not(.hide) .before', function(e){ 
6387			var horizontal = $(this).closest('.tabs').attr('tab-horizontal'),
6388				motion = Number($(this).closest('.tabs').attr('tab-motion')),
6389				len = $(this).closest('.container').find('.tab-box .tab:not(.hover)').length,
6390				motion_style = $(this).closest('.tabs').attr('tab-motion-style'),
6391				tab_counted = $(this).closest('.tabs').attr('tab-count'),
6392				mobile_tab_count = $(this).closest('.tabs').attr('mobile-tab-count'),
6393				tab_interval_w = ($(window).width() < 768 && Number($(this).closest('.tabs').attr('tab-interval-w')) > 8) ? Number($(this).closest('.tabs').attr('tab-interval-w')) * 0.8 : $(this).closest('.tabs').attr('tab-interval-w'),
6394				w = $(window).width(),
6395				tab_count = (w < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : $(this).closest('.tabs').attr('tab-count'),
6396				tab_case = $(this).closest('.tabs').attr('data-case');
6397			
6398			if(!$(this).closest('.tabs').attr('tab-motion') || $(this).closest('.tabs').attr('tab-motion') == 'undefined') return false;
6399	
6400			if(horizontal == 1) { // 가로형
6401				var	tab_each = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w),
6402					max_width = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth(true)) * len,
6403					tab_width = (Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w)) * tab_count,
6404					length = max_width / tab_width,
6405					mo = Number(len) - tab_count;
6406				// console.log('motion:' + motion + ', len: ' + len + ', tab_count: ' + tab_count + ', tab_each: ' + tab_each + ', max_width: ' + max_width + ', tab_width: ' + tab_width + ',length: ' + length + ',mo: ' + mo);
6407			} 
6408	
6409			if(motion_style == 1) { // 한칸씩 이동
6410				motion = motion - 1;
6411				if(motion < 0) motion = 0;
6412				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6413	
6414				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_each, len, motion_style, tab_count, tab_case, tab_counted);
6415	
6416			} else { // 한페이지씩 이동
6417				motion = motion - 1;
6418				if(motion < 0) motion = 0;
6419				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6420	
6421				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_width, length, motion_style, tab_count, tab_case, tab_counted);
6422			}
6423			
6424		});
6425		$(document).on('click', '.right-arrow .arrow:not(.hide) .after', function(e){ 
6426			var horizontal = $(this).closest('.tabs').attr('tab-horizontal'),
6427				motion = Number($(this).closest('.tabs').attr('tab-motion')),
6428				len = $(this).closest('.container').find('.tab-box .tab:not(.hover)').length,
6429				motion_style = $(this).closest('.tabs').attr('tab-motion-style'),
6430				tab_counted = $(this).closest('.tabs').attr('tab-count'),
6431				mobile_tab_count = $(this).closest('.tabs').attr('mobile-tab-count'),
6432				tab_interval_w = ($(window).width() < 768 && Number($(this).closest('.tabs').attr('tab-interval-w')) > 8) ? Number($(this).closest('.tabs').attr('tab-interval-w')) * 0.8 : $(this).closest('.tabs').attr('tab-interval-w'),
6433				w = $(window).width(),
6434				tab_count = (w < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : $(this).closest('.tabs').attr('tab-count'),
6435				tab_case = $(this).closest('.tabs').attr('data-case');
6436			
6437			if(!$(this).closest('.tabs').attr('tab-motion') || $(this).closest('.tabs').attr('tab-motion') == 'undefined') return false;
6438	
6439			if(horizontal == 1) { // 가로형
6440				var	tab_each = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w),
6441					max_width = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth(true)) * len,
6442					tab_width = (Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w)) * tab_count,
6443					length = max_width / tab_width,
6444					mo = Number(len) - tab_count;
6445				// console.log('motion:' + motion + ', len: ' + len + ', tab_count: ' + tab_count + ', tab_each: ' + tab_each + ', max_width: ' + max_width + ', tab_width: ' + tab_width + ',length: ' + length + ',mo: ' + mo);
6446			} 
6447	
6448			if(motion_style == 1) { // 한칸씩 이동
6449				motion = motion + 1;
6450				if(motion > mo) motion = mo;
6451				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6452	
6453				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_each, len, motion_style, tab_count, tab_case, tab_counted);
6454	
6455			} else { // 한페이지씩 이동
6456				motion = motion + 1;
6457				if(motion >= length) motion = Math.ceil(length) - 1;
6458				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6459	
6460				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_width, length, motion_style, tab_count, tab_case, tab_counted);
6461			}
6462		});
6463		$(document).on('click', '.tab-box .tab', function(){
6464			var w = $(document).outerWidth(),
6465				horizontal = $(this).closest('.tabs').attr('tab-horizontal');
6466			if(w < 767 && $(this).find('.tab-editor').hasClass('active')) {
6467				$(this).find('.tab-editor').removeClass('active');
6468			} else {
6469				var editor = $(this).index() + 1,
6470					order = $(this).attr('data-order');
6471					// num = $('.tab-editor.active.t'+order).outerHeight();
6472	
6473				$(this).siblings().removeClass('active');
6474				$(this).addClass('active');
6475	
6476				if(horizontal == 0) { // 세로형
6477					$(this).closest('.tab-box').find('.tab .tab-editor').removeClass('active');
6478					$(this).closest('.tab-box').find('.tab .tab-editor.tabs'+order).addClass('active');
6479				} else { // 가로형
6480					$(this).closest('.tab-width').siblings('.editor-box').children('.tab-editor').removeClass('active');
6481					$(this).closest('.tab-width').siblings('.editor-box').children('.tab-editor.tabs'+order).addClass('active');
6482				}
6483			}
6484		});
6485
6486		$('.tab-wrapper .tab-box .tab').live({
6487			click: function() {
6488				$(this).removeClass('hover');
6489			},
6490			mouseover: function() {
6491				$('.tab-wrapper .tab-box .tab:not(.hide)').removeClass('hover');
6492				if(!$(this).hasClass('active'))	$(this).addClass('hover');
6493			},
6494			mouseout: function() {
6495				$('.tab-wrapper .tab-box .tab:not(.hide)').removeClass('hover');
6496			}
6497		});
6498
6499		$('.userELallProducts .cl-gsort-list li').live({
6500			mouseover: function() {
6501				$(this).addClass('hover');
6502				$(this).siblings().removeClass('hover');
6503			},
6504			mouseout: function() {
6505				$('.userELallProducts .cl-gsort-list li').removeClass('hover');
6506			}
6507		});
6508
6509		//calendar 블럭
6510		let currentDate = new Date();
6511		let currentEvent = null;
6512		let lastEventsList = null;
6513		let lastEventsWeekday = null;
6514		let calendarElsettings = new Map();
6515		let googleColor = new Map();
6516		const monthCache = new Map();
6517		const inflight    = new Map();
6518
6519		//calendar textarea//
6520		const SEL = '.calendar-modal-body .modal-field.content textarea';
6521		function getMax() {
6522			const w = window.innerWidth || document.documentElement.clientWidth;
6523			if (w >= 1200) return 500;   // 1200px 이상
6524			if (w >= 768)  return 400;   // 1199~768px
6525			return 320;                  // 767px 이하
6526		}
6527		function fit($ta) {
6528			const el = $ta[0];
6529			const min = parseFloat(getComputedStyle(el).minHeight) || 120;
6530			const MAX = getMax();
6531
6532			$ta.css('height', 'auto');
6533
6534			const sh = el.scrollHeight; 
6535			const h  = Math.max(min, Math.min(sh, MAX));
6536
6537			$ta.css({
6538				height: h + 'px',
6539				overflowY: sh > MAX ? 'auto' : 'hidden'
6540			});
6541		}
6542		function refitAll() {
6543			$(SEL).filter(':visible').each(function () {
6544				fit($(this));
6545			});
6546		}
6547		function debounce(fn, wait = 120) {
6548			let t; 
6549			return function () {
6550				clearTimeout(t);
6551				t = setTimeout(() => fn.apply(this, arguments), wait);
6552			};
6553		}
6554		let lastMax = getMax();
6555		$(window).on('resize.autogrow orientationchange.autogrow', debounce(function () {
6556			const curMax = getMax();
6557			if (curMax !== lastMax) {
6558				lastMax = curMax;
6559				refitAll();
6560			}
6561		}));
6562		$(document).on('input change', SEL, function () {
6563			fit($(this));
6564		});
6565		////////////////////////////////////////////////////////////////////////////////////
6566
6567		$.cl_calendar = {
6568			active : '',
6569			events : [],
6570			instances : {},
6571			// currentDate : new Date(),
6572			init : function(sid, pid, yearMonth, c) { 
6573				if(typeof sid == 'undefined' || typeof pid == 'undefined') {
6574					alert('Undefined SID,PID');
6575					return false;
6576				}
6577
6578				$(`[data-type="calendar"][data-id="${pid}"]`).removeClass('_calendar'); //_calendar가 html붙어버릴경우
6579
6580				// pid 별로 관리되는 인스턴스 생성
6581				if(!$.cl_calendar.instances[pid]) {
6582					$.cl_calendar.instances[pid] = {
6583						currentDate: new Date(),
6584						events: []
6585					};
6586				}
6587				$.cl_calendar.instances[pid].config = c;
6588
6589				var instance = $.cl_calendar.instances[pid];
6590
6591				if(typeof yearMonth !== 'undefined' && yearMonth != '') {
6592					var parts = yearMonth.split('-');
6593					instance.currentDate = new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, 1);
6594				}
6595				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
6596				var y = instance.currentDate.getFullYear();
6597				var m = String(instance.currentDate.getMonth() + 1).padStart(2, '0');
6598				var ym = (yearMonth && yearMonth !== '') ? yearMonth : (y + '-' + m);
6599
6600				if(data_type != '') {
6601					$.ajax({
6602						url: '/template/get_calendar',
6603						data: { sid: sid, pid: pid, yearMonth: ym, data_type: data_type },
6604						type: 'POST',
6605						dataType: 'json',
6606						success: function (data) {
6607							checkError(data);
6608							var inst = $.cl_calendar.instances[pid];
6609
6610							var dataArr = Array.isArray(data) ? data : [];
6611
6612							inst.events = dataArr;
6613							$.cl_calendar.draw(pid, data_type, c);
6614
6615							// --- 모바일 이벤트 렌더링 (선택 월 기준) ---
6616							var $root = $('.element[data-id="' + pid + '"]');
6617							if ($root.find('.mobile-events').length === 0) {
6618								$root.find('.notice').before('<div class="mobile-events"></div>');
6619							}
6620							var $mobile = $root.find('.mobile-events').empty();
6621
6622							var currentYear = inst.currentDate.getFullYear();
6623							var currentMonth = inst.currentDate.getMonth() + 1;
6624
6625							var countThisMonth = 0;
6626							var eventMap = {};
6627
6628							$.each(dataArr, function (i, v) {
6629								var d = new Date(v.s_date);
6630								var year = d.getFullYear();
6631								var month = d.getMonth() + 1;
6632
6633								if (year === currentYear && month === currentMonth) {
6634									countThisMonth++;
6635									var dateKey = v.s_date; // 'YYYY-MM-DD'
6636									var time = (v.fulltime === 'Y') ? '종일' : (v.s_time + ' ~ ' + v.e_time);
6637									if (!eventMap[dateKey]) eventMap[dateKey] = [];
6638									eventMap[dateKey].push(
6639										'<div class="event-memo"><span class="event-time">' + time + '</span>' + (v.memo || '') + '</div>'
6640									);
6641								}
6642							});
6643
6644							var html = '';
6645							if (countThisMonth === 0) {
6646								html += ''
6647								+ '<div class="event-date"></div>'
6648								+ '<div class="event-memo"><span class="event-time noschedule">이번달 일정이 없습니다.</span></div><br>';
6649							} else {
6650								var sortedDates = Object.keys(eventMap).sort();
6651								$.each(sortedDates, function (i, date) {
6652									html += '<div class="event-date">' + date_string(date) + '</div>';
6653									$.each(eventMap[date], function (j, memoHtml) { html += memoHtml; });
6654									html += '<br>';
6655								});
6656							}
6657
6658							$mobile.append(html);
6659						}
6660					});
6661				} else {
6662					var elsettings = JSON.parse(c.elsettings);
6663					instance.readChmod = elsettings.read_chmod;
6664					// instance.canShowAll = calendarShow(elsettings);
6665					calendarElsettings.set(pid, calendarShow(elsettings));
6666					fetchMonth(pid, ym, data_type)
6667						.then(function(evts) {
6668							$.cl_calendar.instances[pid].events = evts || [];
6669							monthCache.set(ym, evts || []);
6670							$.cl_calendar.draw(pid, data_type, c);
6671						}).catch(function() {
6672							$.cl_calendar.draw(pid, data_type, c);
6673						});
6674				}
6675
6676				
6677				
6678			},
6679			draw: function(pid, type, c) {
6680				if(type) {
6681					if (!$.cl_calendar.instances[pid]) {
6682						// console.error(`draw called but instance for pid=${pid} is not initialized yet`);
6683						return;
6684					}
6685					var instance = $.cl_calendar.instances[pid];
6686					const year = instance.currentDate.getFullYear();
6687					const month = instance.currentDate.getMonth();
6688
6689					const firstDay = new Date(year, month, 1);
6690					const lastDay = new Date(year, month + 1, 0);
6691					const firstDayOfWeek = firstDay.getDay();
6692					const prevLastDay = new Date(year, month, 0).getDate();
6693					$('.userEL'+pid+' .days').empty();
6694
6695					for (let i = firstDayOfWeek - 1; i >= 0; i--) {
6696						const day = prevLastDay - i;
6697						const curDate = new Date(year, month - 1, day);
6698						const dateString = formatDate(curDate);
6699						const dayElement = createDayElement(curDate, dateString, true, pid);
6700						$('.userEL'+pid+' .days').append(dayElement);
6701					}
6702
6703					for (let i = 1; i <= lastDay.getDate(); i++) {
6704						const curDate = new Date(year, month, i);
6705						const dateString = formatDate(curDate);
6706						const dayElement = createDayElement(curDate, dateString, false, pid);
6707						$('.userEL'+pid+' .days').append(dayElement);
6708					}
6709
6710					const totalCellsNeeded = Math.ceil((firstDayOfWeek + lastDay.getDate()) / 7) * 7;
6711					const nextMonthschedule = totalCellsNeeded - (firstDayOfWeek + lastDay.getDate());
6712					
6713					for (let i = 1; i <= nextMonthschedule; i++) {
6714						const curDate = new Date(year, month + 1, i);
6715						const dateString = formatDate(curDate);
6716						const dayElement = createDayElement(curDate, dateString, true, pid);
6717						$('.userEL'+pid+' .days').append(dayElement);
6718					}
6719
6720					var data_case = $('.userEL'+pid).attr('data-case'); //calendar1 check
6721					if(data_case == 'calendar1') {
6722						$('.userEL'+pid+' .date_wrap').siblings('.date_bullet').remove();
6723						$('.userEL'+pid+' .date_wrap').remove();
6724						$('.userEL'+pid+' .controls').append('<div class="date_wrap"><a href="javascript:void(0)" class="date _selectedCalendar" data-type="yearMonth" data-val="'+(year+'.'+(month + 1))+'">'+(year+'.'+String(month + 1).padStart(2, "0"))+'</a></div>');
6725					}
6726				} else {
6727					initCalendar(pid, c);
6728				}
6729			},
6730			write: function(dateAttr, el) {
6731				selectedDate = dateAttr;
6732				openEventModal(dateAttr, el);
6733			},
6734			modify: function(dateAttr, el, pid) {
6735				if (!$.cl_calendar.instances[pid]) {
6736					// console.error(`Calendar instance for pid=${pid} is not initialized yet`);
6737					return;
6738				}
6739				selectedDate = dateAttr;
6740				openEventList(dateAttr, $.cl_calendar.instances[pid].events, el);
6741			},
6742			save: function(pid, el) {
6743				el = '.'+el+' ';
6744				const eventId = $(el+'#eventId').val();
6745				const eventSeq = $(el+'#eventSeq').val();
6746				const eventSid = $(el+'#eventSid').val();
6747				const eventFulltime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? 'Y' : 'N';
6748				const eventStartDate = $(el+'#eventStartDate').val();
6749				const eventStartTime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? '' : $(el+'#eventStartTime').val();
6750				const eventEndDate = $(el+'#eventEndDate').val();
6751				const eventEndTime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? '' : $(el+'#eventEndTime').val();
6752				const eventMemo = $(el+'#eventMemo').val();
6753				
6754				// 유효성 검사
6755				if (!eventStartDate || (eventFulltime != 'Y' && !eventStartTime) || !eventEndDate || (eventFulltime != 'Y' && !eventEndTime) || !eventMemo) {
6756					alert('필수 항목을 모두 입력해주세요.');
6757					return;
6758				}
6759				
6760				// 종료일시가 시작일시보다 늦은지 확인
6761				const startDateTime = new Date(`${eventStartDate}T${eventStartTime}`);
6762				const endDateTime = new Date(`${eventEndDate}T${eventEndTime}`);
6763				
6764				if (endDateTime <= startDateTime) {
6765					alert('종료 일시는 시작 일시보다 나중이어야 합니다.');
6766					return;
6767				}
6768				
6769				// 이벤트 객체 생성
6770				const eventData = {
6771					sid: b.SID,
6772					seq: (eventSeq) ? eventSeq : '',
6773					pid: pid,
6774					month: eventStartDate.substring(0, 7),
6775					sdate: eventStartDate,
6776					stime: eventStartTime,
6777					edate: eventEndDate,
6778					etime: eventEndTime,
6779					fulltime: eventFulltime,
6780					notice: '',
6781					memo: eventMemo,
6782					check: 1
6783				};
6784
6785				if(eventData['sid'] == '' || eventData['sid'] == undefined) return false;
6786				
6787				var url = '/template/calendar';
6788				// if(eventSeq) {
6789				// 	url = '/template/modify_calendar';
6790				// } else {
6791				// 	url = '/template/calendar';
6792				// }
6793
6794				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
6795				$.ajax({
6796					url: url,
6797					data: { data: eventData },
6798					type: 'POST',
6799					dataType: 'json',
6800					success: function(data) {
6801						checkError(data);
6802						$.cl_calendar.instances[pid].events = data || [];
6803						$.cl_calendar.draw(pid, data_type);
6804					},
6805					error: function (xhr, status, error) {
6806						
6807					}
6808				});
6809				
6810				// 폼 초기화
6811				$(el+'#eventForm')[0].reset();
6812				$(el+'#eventId').val('');
6813				$(el+'.modal-schedule').fadeOut(300);
6814			}
6815		}
6816
6817		// 날짜 셀 클릭 이벤트 (동적으로 생성된 요소에 대한 이벤트 처리)
6818		$(document).on('click', '.calendar .day_wrap', function() {
6819			// console.log(1212);
6820			var dateAttr = $(this).data('date'),
6821				isEvent = $(this).find('.event').length,
6822				el = '.' + $(this).closest('.calendar').attr('data-name'),
6823				pid = $(this).closest('.calendar').attr('data-id');
6824
6825			var getYear = currentDate.getFullYear(),
6826				getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"), // getMonth는 0~11이므로 +1
6827				yearMonth = getYear + '-' + getMonth;
6828
6829			if(isEvent > 0) {
6830				var parts = dateAttr.split('-');
6831				var yearMonth = parts[0] + '-' + parts[1];
6832				$.cl_calendar.init(b.SID, pid, yearMonth);
6833				$.cl_calendar.modify(dateAttr, el, pid);
6834			}
6835		});
6836
6837		$(document).on('click', '.calendar ._prev_month_btn', function () {
6838			var pid = $(this).closest('.calendar').attr('data-id');
6839
6840			// 여기!
6841			var instance = $.cl_calendar.instances[pid];
6842			instance.currentDate.setMonth(instance.currentDate.getMonth() - 1);
6843
6844			var getYear = instance.currentDate.getFullYear(),
6845				getMonth = String(instance.currentDate.getMonth() + 1).padStart(2, "0"),
6846				yearMonth = getYear + '-' + getMonth,
6847				ym = getYear + '.' + getMonth;
6848
6849			$(this).siblings('.date_bullet').remove();
6850    		$(this).siblings('.date_wrap').remove();
6851    		$(this).parent('.controls').append('<div class="date_wrap"><a href="javascript:void(0)" class="date _selectedCalendar" data-type="yearMonth" data-val="'+ym+'">'+ym+'</a></div>');
6852
6853			$.cl_calendar.init(b.SID, pid, yearMonth);
6854		});
6855
6856		$(document).on('click', '.calendar ._next_month_btn', function () {
6857			var pid = $(this).closest('.calendar').attr('data-id');
6858
6859			var instance = $.cl_calendar.instances[pid];
6860			instance.currentDate.setMonth(instance.currentDate.getMonth() + 1);
6861
6862			var getYear = instance.currentDate.getFullYear(),
6863				getMonth = String(instance.currentDate.getMonth() + 1).padStart(2, "0"),
6864				yearMonth = getYear + '-' + getMonth,
6865				ym = getYear + '.' + getMonth;
6866
6867			$(this).siblings('.date_bullet').remove();
6868    		$(this).siblings('.date_wrap').remove();
6869    		$(this).parent('.controls').append('<div class="date_wrap"><a href="javascript:void(0)" class="date _selectedCalendar" data-type="yearMonth" data-val="'+ym+'">'+ym+'</a></div>');
6870
6871			$.cl_calendar.init(b.SID, pid, yearMonth);
6872		});
6873
6874		$(document).on('click', '.calendar ._today_btn', function() {
6875			var pid = $(this).closest('.calendar').attr('data-id');
6876			var instance = $.cl_calendar.instances[pid];
6877			instance.currentDate = new Date();
6878
6879			var ym = instance.currentDate.getFullYear() + '.' + String(instance.currentDate.getMonth() + 1).padStart(2, "0");
6880			$(this).parent('.calendar_btn_area').siblings('.date_bullet').remove();
6881			$(this).parent('.calendar_btn_area').siblings('.date_wrap').remove();
6882			$(this).closest('.controls').append('<div class="date_wrap"><a href="javascript:void(0)" class="date _selectedCalendar" data-type="yearMonth" data-val="'+ym+'">'+ym+'</a></div>');
6883			
6884			var yearMonth = instance.currentDate.getFullYear() + '-' + String(instance.currentDate.getMonth() + 1).padStart(2, "0");
6885			$.cl_calendar.init(b.SID, pid, yearMonth);
6886		});
6887
6888		// 모달 닫기 버튼 클릭 이벤트
6889		$(document).on('click','.calendar #cancelBtn, .calendar .modal-close', function() {
6890			closeEventModal();
6891		});
6892
6893		// 모달 외부 클릭 시 닫기
6894		$(document).on('click', '.calendar .modal-schedule', function(e) {
6895			if ($(e.target).hasClass('modal-schedule')) {
6896				closeEventModal();
6897			}
6898		});
6899
6900		$(document).on('click','.calendar .date._selectedCalendar',function(){
6901			var el = '.userEL' + $(this).closest('.calendar').attr('data-id');
6902
6903			// 현재 선택된 년월 추출
6904			var currentYM = $(this).attr('data-val');
6905			var parts = currentYM.split('.');
6906			var selectedYear = parts[0];
6907			var selectedMonth = parts[1].padStart(2, '0');
6908
6909			// 이미 열려있다면 제거
6910			if($('.date_list_area._yearMonthList').length > 0){
6911				$('.date_list_area._yearMonthList').remove();
6912				return;
6913			}
6914
6915			// 왼쪽 연도 리스트
6916			let currentYear = currentDate.getFullYear();
6917			let startYear = currentYear - 8;
6918			let endYear = currentYear + 8;
6919
6920			let years = '';
6921			for(let year = startYear; year <= endYear; year++) {
6922				let isSelected = (year == selectedYear) ? ' selected' : '';
6923				years += `<div class="year_item${isSelected}" data-year="${year}">${year}</div>`;
6924			}
6925
6926			let months = '';
6927			for(let month=1; month<=12; month++){
6928				let mm = month.toString().padStart(2, '0');
6929				let isSelected = (mm == selectedMonth) ? ' selected' : '';
6930				months += `<a href="#" class="month_item${isSelected}" data-month="${mm}" data-year="${selectedYear}">${mm}</a>`;
6931			}
6932
6933			// HTML 동적 삽입
6934			let html = `
6935			<div class="mobile_back"><button class="mobile_close">✕</button></div>
6936			<div class="date_list_area _calendarList _yearMonthList">
6937				<div class="year_month_wrap">
6938					<div class="year_list">${years}</div>
6939					<div class="month_list">${months}</div>
6940				</div>
6941				<div class="calendar_confirm_area">
6942					<button type="button" class="btn_cancel">취소</button>
6943					<button type="button" class="btn_confirm">확인</button>
6944				</div>
6945			</div>`;
6946
6947			$(this).after(html);
6948
6949			// 연도 리스트 스크롤 중앙
6950			var selectedYearEl = $(el+' .year_item.selected')[0];
6951			if(selectedYearEl) {
6952				selectedYearEl.scrollIntoView({block: "center", behavior: "smooth"});
6953			}
6954
6955			// 월 리스트 스크롤 중앙
6956			var selectedMonthEl = $(el+' .month_item.selected')[0];
6957			if(selectedMonthEl) {
6958				selectedMonthEl.scrollIntoView({block: "center", behavior: "smooth"});
6959			}
6960
6961			// 연도 클릭하면 월 리스트 갱신
6962			$(el+' .year_item').on('click', function(){
6963				let selectedYear = $(this).data('year');
6964				$(el+' .year_item').removeClass('selected');
6965				$(this).addClass('selected');
6966
6967				let monthsHtml = '';
6968				for(let month=1; month<=12; month++){
6969					let mm = month.toString().padStart(2, '0');
6970					monthsHtml += `<a href="#" class="month_item" data-month="${mm}" data-year="${selectedYear}">${mm}</a>`;
6971				}
6972				$(el+' .month_list').html(monthsHtml);
6973
6974				// 월 클릭 다시 바인딩
6975				bindMonthClick();
6976			});
6977
6978			function bindMonthClick(){
6979				$(el+' .month_item').on('click', function(e){
6980					e.preventDefault();
6981					$(el+' .month_item').removeClass('selected');
6982					$(this).addClass('selected');
6983					$(el+' .date._selectedCalendar').data('tempYear', $(this).data('year'));
6984					$(el+' .date._selectedCalendar').data('tempMonth', $(this).data('month'));
6985				});
6986			}
6987			bindMonthClick();
6988
6989			// 취소
6990			$(el+' .btn_cancel, '+el+' .mobile_close').on('click', function(){
6991				$(el+' .mobile_back').remove();
6992				$(el+' .date_list_area._yearMonthList').remove();
6993			});
6994
6995			// 확인
6996			$(el+' .btn_confirm').on('click', function(){
6997				let year = $(el+' .date._selectedCalendar').data('tempYear');
6998				let month = $(el+' .date._selectedCalendar').data('tempMonth');
6999				var pid = $(this).closest('.calendar').attr('data-id'),
7000					yearMonth = year + '-' + month;
7001				
7002				if(year && month){
7003					$(el+' .date._selectedCalendar').text(`${year}.${month}`).attr('data-val', `${year}-${month}`);
7004				}
7005				$(el+' .date_list_area._yearMonthList').remove();
7006
7007				$.cl_calendar.init(b.SID, pid, yearMonth);
7008			});
7009		});
7010
7011		// 날짜/시간선택 ampm
7012		$(document).off('click.clockToggle').on('click.clockToggle', '.calendar .calendarModal .timeselector .select:not(.ampm) .selector', function(e){
7013			e.preventDefault();
7014			e.stopPropagation();
7015			const $sel   = $(this).closest('.select');
7016			const $field = $sel.closest('.modal-field');
7017
7018			// ★ 드롭 닫힘을 잠시 무력화하는 락
7019			$field.data('dropOpenLock', true);
7020			setTimeout(()=>{ $field.removeData('dropOpenLock'); }, 150);
7021
7022			$sel.find('.drop').toggle();
7023			$sel.siblings('.select').children('.drop').hide();
7024		});
7025		$(document).on('click.clockCloseOnPick', '.calendar .calendarModal .timeselector .select .drop li', function (e) {
7026			e.stopPropagation();
7027			const $sel = $(this).closest('.select');
7028			setTimeout(() => { $sel.find('.drop').hide(); }, 0);
7029		});
7030		$(document).on('click.clockWidgetArea', '.calendar .bootstrap-datetimepicker-widget', function (e) {
7031			if ($(e.target).closest('.custom-clock .select').length === 0) {
7032				$(this).find('.custom-clock .select .drop').hide();
7033			}
7034		});
7035		$(document).on('click', '.calendar .calendarModal .timeselector .select.ampm .selector', function () {
7036			const $sel   = $(this);
7037			const $field = $sel.closest('.modal-field');
7038			const $input = $field.find('input.daytime');
7039			const dp     = getDp($field, $input);
7040			if (!dp) return;
7041
7042			const m = dp.date() ? dp.date().clone() : moment();
7043			const curType  = ($sel.attr('data-value') || $sel.attr('data-type') || (m.hour() >= 12 ? 'pm' : 'am')).toLowerCase();
7044			const nextType = (curType === 'am') ? 'pm' : 'am';
7045
7046			let H = m.hour();
7047			if (nextType === 'am') { if (H >= 12) H -= 12; } else { if (H < 12) H += 12; }
7048			m.hour(H).second(0);
7049			dp.date(m);
7050
7051			$sel.text(($.lang?.[$field.closest('.calendar').hasClass('en')?'en':'ko']?.['sc.banner.'+nextType]) || nextType.toUpperCase())
7052				.attr({'data-value': nextType, 'data-type': nextType});
7053
7054			$sel.closest('.custom-clock').find('.select .drop').hide();
7055		});
7056		$(document).on('click', '.calendar .calendarModal .timeselector .select.hour .drop li', function () {
7057			const $li    = $(this);
7058			const $field = $li.closest('.modal-field');
7059			const $input = $field.find('input.daytime');
7060			const dp     = getDp($field, $input);
7061			if (!dp) return;
7062
7063			const m = dp.date() ? dp.date().clone() : moment();
7064
7065			const $ampmSel = $li.closest('.timeselector').find('.select.ampm .selector');
7066			const ampm = ($ampmSel.attr('data-value') || $ampmSel.attr('data-type') || (m.hour() >= 12 ? 'pm' : 'am')).toLowerCase();
7067
7068			const hourStr = $li.attr('data-value') || $li.text().trim();
7069			const h12     = parseInt(hourStr, 10) || 12;
7070			const h24     = (ampm === 'pm') ? (h12 % 12) + 12 : (h12 % 12);
7071
7072			m.hour(h24).second(0);
7073			dp.date(m);
7074
7075			const pad = (n)=> (n<10 ? '0'+n : ''+n);
7076			$li.closest('.select.hour').children('.selector').text(pad((h24 % 12) || 12))
7077				.attr('data-type', hourStr);
7078
7079			$li.closest('.custom-clock').find('.select .drop').hide();
7080		});
7081		$(document).on('click', '.calendar .calendarModal .timeselector .select.minute .drop li', function () {
7082			const $li    = $(this);
7083			const $field = $li.closest('.modal-field');
7084			const $input = $field.find('input.daytime');
7085			const dp     = getDp($field, $input);
7086			if (!dp) return;
7087
7088			const minStr = $li.attr('data-value') || $li.text().trim();
7089			let mm = parseInt(minStr, 10); if (isNaN(mm)) mm = 0;
7090
7091			const m = dp.date() ? dp.date().clone() : moment();
7092			m.minute(Math.max(0, Math.min(59, mm))).second(0);
7093			dp.date(m);
7094
7095			const pad = (n)=> (n<10 ? '0'+n : ''+n);
7096			$li.closest('.select.minute').children('.selector').text(pad(mm)).attr('data-type', pad(mm));
7097
7098			// $li.closest('.custom-clock').find('.select .select .drop').hide();
7099			$li.closest('.custom-clock').find('.select .drop').hide();
7100		});
7101
7102
7103		/////// calendar2//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
7104		function calendarOverlayIn(pid) {
7105			$('.userEL'+pid).addClass('modal-open');
7106		}
7107		function calendarOverlayOut(pid) {
7108			$('.userEL'+pid).removeClass('modal-open');
7109		}
7110		function nowTime(){ return new Date(); }
7111		
7112		function readMomentFromField($field){
7113			const $input = $field.find('input.daytime');
7114			const dp = getDp($field, $input);
7115			if (dp && dp.date && dp.date()) return dp.date().clone();
7116			const raw = $input.attr('data-raw') || $input.val();
7117			return raw ? moment(parseToDate(raw)) : null;
7118		}
7119
7120		/** End 필드의 커스텀 clock에서 Start보다 이전 시간들을 disabled 처리 */
7121		function applyEndTimeDisables($endField){
7122			const $overlay = $endField.closest('.calendar-modal-overlay');
7123			const $sField  = $overlay.find('.modal-field.sdate');
7124			const start    = readMomentFromField($sField);
7125			if (!start) return;                           // 시작이 없으면 제한 없음
7126
7127			const $endInput = $endField.find('input.daytime');
7128			const dpEnd     = getDp($endField, $endInput);
7129			const end       = dpEnd && dpEnd.date ? dpEnd.date().clone() : null;
7130
7131			// 1) minDate는 '날짜 단위'로, '변경될 때만' 세팅 (불필요한 리렌더 방지)
7132			if (dpEnd && typeof dpEnd.minDate === 'function') {
7133				const wantMin = start.clone().startOf('day');
7134				let curMin = null;
7135				try { curMin = dpEnd.minDate && dpEnd.minDate(); } catch(e){}
7136				if (!curMin || !moment.isMoment(curMin) || !curMin.isSame(wantMin, 'day')) {
7137				dpEnd.minDate(wantMin);
7138				}
7139			}
7140
7141			const $clock = $endField.find('.custom-clock');
7142			if (!$clock.length) return;
7143
7144			const ampmSel = ($clock.find('.select.ampm .selector').attr('data-type') || ((end && end.hour()>=12) ? 'pm' : 'am')).toLowerCase();
7145			const h12Sel  = parseInt($clock.find('.select.hour .selector').text(), 10) || 12;
7146			const mSel    = parseInt($clock.find('.select.minute .selector').text(), 10) || 0;
7147			const sameDay = end ? end.isSame(start, 'day') : true;
7148			const toH24   = (h12, ap) => (ap==='pm' ? (h12%12)+12 : (h12%12));
7149
7150			// 2) equal-case 강제 리페인트는 '시간/분 드롭이 열려 있을 때만'
7151			//    (= 날짜(day) 셀 클릭 중엔 절대 실행하지 않음)
7152			const timeDropOpen = $endField.find('.custom-clock .select .drop:visible').length > 0;
7153			if (dpEnd && end && start && end.isSame(start) && timeDropOpen) {
7154				$endField.data('suppressDropAutoHide', true);
7155				if (typeof dpEnd.viewDate === 'function') dpEnd.viewDate(end.clone());
7156				dpEnd.date(end.clone().add(1,'ms'));
7157				dpEnd.date(end.clone());
7158				setTimeout(() => { $endField.removeData('suppressDropAutoHide'); }, 80);
7159			}
7160
7161			// 1) AM/PM 드롭 항목
7162			$clock.find('.select.ampm .drop li').each(function(){
7163				const v = ($(this).attr('data-value')||'am').toLowerCase();
7164				const h24 = toH24(h12Sel, v);
7165				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mSel).second(0);
7166				const dis = sameDay && cand.isBefore(start);
7167				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
7168			});
7169
7170			// 2) 시간 드롭 항목
7171			$clock.find('.select.hour .drop li').each(function(){
7172				const h12 = parseInt($(this).attr('data-value') || $(this).text(), 10) || 12;
7173				const h24 = toH24(h12, ampmSel);
7174				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mSel).second(0);
7175				const dis = sameDay && cand.isBefore(start);
7176				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
7177			});
7178
7179			// 3) 분 드롭 항목
7180			$clock.find('.select.minute .drop li').each(function(){
7181				const mm  = parseInt($(this).attr('data-value') || $(this).text(), 10) || 0;
7182				const h24 = toH24(h12Sel, ampmSel);
7183				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mm).second(0);
7184				const dis = sameDay && cand.isBefore(start);
7185				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
7186			});
7187		}
7188
7189		function isAllDayByField($hostField){
7190			const $overlay = $hostField.closest('.calendar-modal-overlay');
7191			return $overlay.find('.all .all-day').is(':checked');
7192		}
7193
7194		function ensureCustomClock($hostField, locale) {
7195			const $overlay = $hostField.closest('.calendar-modal-overlay');
7196			if (!$overlay.length || !$overlay.is(':visible')) return;
7197
7198			const dp = getDp($hostField, $hostField.find('input.daytime'));
7199
7200			let $widget = null;
7201			if (dp) {
7202				try {
7203				const w = (typeof dp.widget === 'function') ? dp.widget() : dp.widget;
7204				if (w) $widget = (w.jquery ? w : $(w));
7205				} catch (e) { /* no-op */ }
7206			}
7207			if (!$widget || !$widget.length) {
7208				$widget = $hostField.find('.bootstrap-datetimepicker-widget:visible').last();
7209				if (!$widget.length) $widget = $('.bootstrap-datetimepicker-widget:visible').last();
7210			}
7211			if (!$widget || !$widget.length || !$widget.is(':visible')) return;
7212
7213			let $list = $widget.find('ul.list-unstyled').first();
7214			let $timeArea = $widget.find('li.timepicker, .timepicker').last();
7215			if (!$list.length && $timeArea.length) $list = $timeArea.closest('ul.list-unstyled');
7216			if (!$list.length) $list = $widget;
7217
7218			// 이미 생성되어 있으면 종료
7219			if ($list.find('.custom-clock-li, .custom-clock').length) return;
7220
7221			const allDay = isAllDayByField($hostField);
7222
7223			// 위젯의 기본 timepicker DOM은 all-day면 숨겨둡니다
7224			if ($timeArea.length) $timeArea.remove();
7225
7226			const cur = (dp && dp.date) ? dp.date() : moment();
7227			const H = cur.hour(), M = cur.minute();
7228			const LANG = locale;
7229			const amLabel  = ($.lang?.[LANG]?.['sc.banner.am']) || 'AM';
7230			const pmLabel  = ($.lang?.[LANG]?.['sc.banner.pm']) || 'PM';
7231			const ampmType = (H >= 12) ? 'pm' : 'am';
7232			const h12 = ((H % 12) || 12);
7233			const pad = (n)=> (n<10 ? '0'+n : ''+n);
7234
7235			// 공통: 취소/저장 버튼 블럭 (시계 유무 상관없이 필요)
7236			const buttonsHtml = `
7237				<tr>
7238				<td class="btnbox">
7239					<div class="calendar-period-btn">
7240					<span class="calendar-period-close">${($.lang?.[LANG]?.['config.cancel']) || 'Cancel'}</span>
7241					</div>
7242					<div class="calendar-period-btn">
7243					<span class="calendar-period-save">${($.lang?.[LANG]?.['config.save']) || 'Save'}</span>
7244					</div>
7245				</td>
7246				</tr>`;
7247
7248			let bodyHtml = '';
7249			if (!allDay) {
7250				// ── 시계 + 버튼 (기존과 동일)
7251				let lisHour = ''; for (let i=1;i<=12;i++) lisHour += `<li data-value="${pad(i)}">${pad(i)}</li>`;
7252				let lisMin  = ''; for (let j=0;j<=59;j++) lisMin  += `<li data-value="${pad(j)}">${pad(j)}</li>`;
7253				bodyHtml = `
7254				<tr class="timeselector">
7255					<td class="btnbox">
7256					<div>
7257						<ul class="select ampm">
7258						<li class="selector" data-type="${ampmType}">${ampmType==='pm'?pmLabel:amLabel}</li>
7259						<ul class="drop"><li data-value="am">${amLabel}</li><li data-value="pm">${pmLabel}</li></ul>
7260						</ul>
7261						<ul class="select hour">
7262						<li class="selector">${pad(h12)}</li>
7263						<ul class="drop">${lisHour}</ul>
7264						</ul>
7265						<ul class="separator"> : </ul>
7266						<ul class="select minute">
7267						<li class="selector">${pad(M)}</li>
7268						<ul class="drop">${lisMin}</ul>
7269						</ul>
7270					</div>
7271					</td>
7272				</tr>
7273				${buttonsHtml}`;
7274			} else {
7275				// ── 버튼만 (달력 + 버튼)
7276				bodyHtml = buttonsHtml;
7277			}
7278
7279			const clockLi = $(`
7280				<li class="custom-clock-li">
7281				<div class="custom-clock ${allDay ? 'clock-compact' : 'clock-full'}">
7282					<table class="table-condensed">
7283					${bodyHtml}
7284					</table>
7285				</div>
7286				</li>`);
7287
7288			const $timeLi = $list.find('li.timepicker, .timepicker').last();
7289			if ($timeLi.length) $timeLi.after(clockLi); else $list.append(clockLi);
7290
7291			const $clock = clockLi.find('.custom-clock');
7292
7293			// 버튼 동작
7294			$clock.off('click.clockBtns')
7295			.on('click.clockBtns', '.calendar-period-save', function () {
7296				const $hostField = $(this).closest('.modal-field');
7297				const $input     = $hostField.find('input.daytime');
7298				const $overlay   = $hostField.closest('.calendar-modal-overlay');
7299				const locale     = $overlay.closest('.calendar').hasClass('en') ? 'en' : 'ko';
7300				const dpStart    = getDp($hostField, $input);
7301				const isAllDay   = isAllDayByField($hostField);
7302
7303				if (dpStart && dpStart.date()) {
7304				$hostField.data('commitFlag', true);
7305
7306				// 저장 시 표시/데이터 형식 분기
7307				let m = dpStart.date().clone();
7308				if (isAllDay) m = m.startOf('day'); // 날짜만 의미
7309
7310				// start 저장 로직 유지 + end 보정
7311				if ($hostField.hasClass('sdate')) {
7312					const $endField = $overlay.find('.modal-field.edate');
7313					const $endInput = $endField.find('input.daytime');
7314					const dpEnd     = getDp($endField, $endInput);
7315
7316					// end 값 읽기
7317					let end = dpEnd && dpEnd.date() ? dpEnd.date().clone() : null;
7318					if (!end) {
7319						const rawEnd = $endInput.attr('data-raw') || $endInput.val();
7320						if (rawEnd) end = moment(parseToDate(rawEnd));
7321					}
7322
7323					// start > end이면 end 자동 보정 (all-day면 같은 날짜, 시간은 의미 없음)
7324					if (!end || m.isAfter(end)) {
7325						// const newEnd = isAllDay ? m.clone() : m.clone().add(1, 'hours');
7326						const newEnd = isAllDay ? m.clone() : m.clone();
7327						if (dpEnd && typeof dpEnd.date === 'function') dpEnd.date(newEnd.clone());
7328
7329						const rawStrEnd   = isAllDay ? newEnd.format('YYYY-MM-DD') : newEnd.format('YYYY-MM-DD HH:mm');
7330						const dispEndHTML = formatDateLocalized(rawStrEnd, locale, 1);
7331						const dispEndTEXT = formatDateLocalized(rawStrEnd, locale);
7332
7333						$endInput.attr('data-raw', rawStrEnd).val(dispEndTEXT).removeClass('empty');
7334
7335						const $endView = $endField.find('.daytime-html');
7336						if ($endView.length) {
7337							$endView.attr('data-raw', rawStrEnd).html(dispEndHTML);
7338						}
7339
7340						$endField.data('commitFlag', true);
7341					}
7342				} else if ($hostField.hasClass('edate')) {
7343					const $startField = $overlay.find('.modal-field.sdate');
7344					const $startInput = $startField.find('input.daytime');
7345					const dpStartInstance = getDp($startField, $startInput);   // sdate
7346					const $endField = $overlay.find('.modal-field.edate');
7347					const $endInput = $endField.find('input.daytime');
7348					const dpEnd = dpStart; // hostField=edate
7349
7350					// 1) 시작(moment) 읽기
7351					let start = dpStartInstance && dpStartInstance.date() ? dpStartInstance.date().clone() : null;
7352					if (!start) {
7353						const rawStart = $startInput.attr('data-raw') || $startInput.val();
7354						if (rawStart) start = moment(parseToDate(rawStart));
7355					}
7356
7357					// 2) end 후보를 "커스텀 시계 선택값"으로 직접 조립
7358					const isAllDay = isAllDayByField($hostField);
7359					const gran = isAllDay ? 'day' : 'minute';
7360					const norm = d => d ? d.clone().seconds(0).milliseconds(0) : null;
7361
7362					let endCandidate;
7363					if (isAllDay) {
7364						// 종일은 날짜만 비교하면 되므로, dp의 날짜(또는 start)로 조립
7365						endCandidate = (dpEnd && dpEnd.date ? dpEnd.date().clone() : (start || moment())).startOf('day');
7366					} else {
7367						// 커스텀 시계에서 AM/PM, 시, 분 읽기
7368						const $clock   = $hostField.find('.custom-clock');
7369						const ap       = ($clock.find('.select.ampm .selector').attr('data-type') || 'am').toLowerCase();
7370						const h12Str   = $clock.find('.select.hour .selector').text().trim() || '12';
7371						const minStr   = $clock.find('.select.minute .selector').text().trim() || '00';
7372						const toH24    = (h12, ap) => ap==='pm' ? (h12%12)+12 : (h12%12);
7373						const h24      = toH24(parseInt(h12Str,10)||12, ap);
7374						const mm       = Math.max(0, Math.min(59, parseInt(minStr,10)||0));
7375
7376						// 같은 "날짜" 위에 시간만 덮어쓰기 (dpEnd가 있으면 그 날짜 사용, 없으면 start 날짜 사용)
7377						const base = (dpEnd && dpEnd.date ? dpEnd.date().clone() : (start || moment()));
7378						endCandidate = base.clone().hours(h24).minutes(mm).seconds(0).milliseconds(0);
7379					}
7380
7381					const startNorm    = norm(start);
7382					const endNorm      = norm(endCandidate);
7383
7384					// 3) 저장 시점 보정: end < start면 end = start
7385					const correctedEnd = (startNorm && endNorm && endNorm.isBefore(startNorm, gran))
7386						? startNorm.clone()
7387						: endNorm.clone();
7388
7389					// 4) 위젯/뷰 갱신은 correctedEnd 기준
7390					if (dpEnd && typeof dpEnd.date === 'function') {
7391						$hostField.data('suppressHide', true);
7392						if (typeof dpEnd.minDate === 'function') dpEnd.minDate(startNorm ? startNorm.clone().startOf('day') : false);
7393						if (typeof dpEnd.viewDate === 'function') dpEnd.viewDate(correctedEnd.clone());
7394						dpEnd.date(correctedEnd.clone()); // (필요시 1ms 흔들기 추가 가능)
7395						setTimeout(() => { $hostField.removeData('suppressHide'); }, 0);
7396					}
7397
7398					// 5) 표기/저장도 correctedEnd만 사용
7399					const rawStrEnd   = isAllDay ? correctedEnd.format('YYYY-MM-DD')
7400												: correctedEnd.format('YYYY-MM-DD HH:mm');
7401					const dispEndHTML = formatDateLocalized(rawStrEnd, locale, 1);
7402					const dispEndTEXT = formatDateLocalized(rawStrEnd, locale);
7403
7404					$endInput.attr('data-raw', rawStrEnd).val(dispEndTEXT).removeClass('empty');
7405					const $endView = $hostField.find('.daytime-html');
7406					if ($endView.length) $endView.attr('data-raw', rawStrEnd).html(dispEndHTML);
7407
7408					try { applyEndTimeDisables($hostField); } catch(e){}
7409					try { if (typeof paintActiveDay === 'function') paintActiveDay($hostField, correctedEnd.clone()); } catch(e){}
7410
7411					$hostField.data('commitFlag', true);
7412				}
7413
7414				// 현재 열려있는 이 피커 닫기
7415				if (dpStart && dpStart.hide) dpStart.hide();
7416				}
7417			})
7418			.on('click.clockBtns', '.calendar-period-close', function () {
7419				const $hostField = $(this).closest('.modal-field');
7420				$hostField.data('commitFlag', false);
7421				const dp = getDp($hostField, $hostField.find('input.daytime'));
7422				dp && dp.hide && dp.hide();
7423			});
7424		}
7425
7426		function closeOtherPickers($overlay, $currentField){
7427			$overlay.find('.modal-field').each(function(){
7428				if (this === $currentField[0]) return;
7429				const dp = $(this).data('DateTimePicker');
7430				if (dp && typeof dp.hide === 'function') dp.hide();
7431			});
7432			$overlay.find('.custom-clock .select .drop').hide();
7433		}
7434
7435		function getDp($field, $input){
7436			return $field.data('DateTimePicker') || $input.data('DateTimePicker');
7437		}
7438
7439		$(document).on('click', '.calendar .modal-field .daytime', function(e) {
7440			e.stopPropagation();
7441			const $input   = $(this);
7442			const $field   = $input.closest('.modal-field');
7443			const $overlay = $input.closest('.calendar-modal-overlay');
7444			const $cal     = $input.closest('.calendar');
7445			const locale   = $cal.hasClass('en') ? 'en' : 'ko';
7446			const lang     = locale;
7447
7448			closeOtherPickers($overlay, $field);
7449
7450			var allDay = $field.siblings('.all').find('.all-day').is(':checked');
7451			const periodOptions = {
7452				format: allDay ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm',
7453				dayViewHeaderFormat: 'YYYY. MM',
7454				minDate: false,
7455				disabledDates: false,
7456				useCurrent: false,
7457				focusOnShow: false,
7458				keepOpen: true,
7459				debug: true,
7460				allowInputToggle: true,
7461				sideBySide: false,
7462				locale: lang,
7463				ignoreReadonly: true,
7464				widgetParent: $field,
7465				widgetPositioning: { horizontal: 'auto', vertical: 'bottom' }
7466			};
7467
7468			let dp = $field.data('DateTimePicker');
7469			if (dp) {
7470				if (typeof dp.show === 'function') dp.show();
7471				else { try { $field.datetimepicker('show'); } catch(e){} }
7472				ensureCustomClock($field, locale);
7473				return;
7474			}
7475
7476			if (typeof $field.datetimepicker !== 'function') {
7477				console.error('bootstrap-datetimepicker가 로드되지 않았습니다.');
7478				return;
7479			}
7480
7481			$field.datetimepicker(periodOptions)
7482				.on('dp.show', function(){
7483					if (!$('.calendar-dp-overlay').length) {
7484						$('<div class="calendar-dp-overlay"></div>').appendTo('.calendar-modal-body');
7485					}
7486
7487					closeOtherPickers($overlay, $field);
7488
7489					const dp   = $field.data('DateTimePicker');
7490					const raw  = $input.attr('data-raw');
7491					const origDisplay = $input.val();
7492					const origRaw     = raw || '';
7493					const base        = raw ? moment(parseToDate(raw)) : (dp && dp.date() ? dp.date().clone() : moment(nowTime()));
7494
7495					$field.data('origDisplay', origDisplay);
7496					$field.data('origRaw',     origRaw);
7497					$field.data('origDate',    base.clone());
7498					$field.data('commitFlag',  false);
7499
7500					if (dp && (!dp.date() || !dp.date().isSame(base))) dp.date(base.clone());
7501
7502					setTimeout(() => {
7503						ensureCustomClock($field, locale);
7504						if ($field.hasClass('edate')) applyEndTimeDisables($field); 
7505					}, 0);
7506				})
7507
7508				.on('dp.change', function(){
7509					const $field = $(this);
7510					const locale = $field.closest('.calendar').hasClass('en') ? 'en' : 'ko';
7511
7512					setTimeout(() => {
7513						ensureCustomClock($field, locale);
7514						if ($field.hasClass('edate')) applyEndTimeDisables($field);
7515
7516						// ★ 프로그램적 변경(equals 리페인트) or 드롭 방금 열림 → 닫기 스킵
7517						if ($field.data('suppressDropAutoHide') || $field.data('dropOpenLock')) return;
7518
7519						// 평소에는 닫기
7520						$field.find('.custom-clock .select .drop').hide();
7521					}, 0);
7522				})
7523
7524				.on('dp.hide', function(){
7525					const $field    = $(this);
7526					const $input    = $field.find('input.daytime');
7527					const $view     = $field.find('.daytime-html'); // 표시용 span
7528					const dp        = $field.data('DateTimePicker');
7529					const committed = !!$field.data('commitFlag');
7530					const origDate  = $field.data('origDate');
7531					const origDisp  = $field.data('origDisplay');
7532					const origRaw   = $field.data('origRaw');
7533
7534					const localeCur = $field.closest('.calendar').hasClass('en') ? 'en' : 'ko';
7535
7536					$('.calendar-dp-overlay').remove();
7537
7538					if (!committed) {
7539						if (dp && origDate) dp.date(origDate.clone());
7540
7541						const isAllDayNow = isAllDayByField($field);
7542						const rollbackIso = origRaw || (origDate ? (isAllDayNow ? origDate.format('YYYY-MM-DD') : origDate.format('YYYY-MM-DD HH:mm')) : null);
7543
7544						if (rollbackIso) {
7545							// ⬇⬇ 여기: HTML/텍스트를 함수의 3번째 인자로 직접 분기
7546							const dispHTML = formatDateLocalized(rollbackIso, localeCur, 1);   // span용(HTML)
7547							const dispTEXT = formatDateLocalized(rollbackIso, localeCur);  // input용(텍스트)
7548
7549							$input.attr('data-raw', rollbackIso).val(dispTEXT).removeClass('empty');
7550							if ($view.length) $view.attr('data-raw', rollbackIso).html(dispHTML);
7551
7552						} else {
7553							if (typeof origDisp !== 'undefined') $input.val(origDisp);
7554							if (typeof origRaw  !== 'undefined') $input.attr('data-raw', origRaw);
7555
7556							if ($view.length) {
7557								if (typeof origRaw !== 'undefined') {
7558									// ⬇⬇ 여기: 표시용은 HTML로
7559									const dispHTML0 = formatDateLocalized(origRaw, localeCur, 1);
7560									$view.attr('data-raw', origRaw).html(dispHTML0);
7561								} else if (typeof origDisp !== 'undefined') {
7562									$view.text(origDisp);
7563								} else {
7564									$view.text('');
7565								}
7566							}
7567						}
7568					} else {
7569						const m = dp && dp.date() ? dp.date().clone() : null;
7570						if (m) {
7571							const isAllDayNow = isAllDayByField($field);
7572							const iso      = isAllDayNow ? m.format('YYYY-MM-DD') : m.format('YYYY-MM-DD HH:mm');
7573							const dispHTML = formatDateLocalized(iso, localeCur, 1);   // span용(HTML)
7574							const dispTEXT = formatDateLocalized(iso, localeCur);  // input용(텍스트)
7575
7576							$input.attr('data-raw', iso).val(dispTEXT).removeClass('empty');
7577							if ($view.length) $view.attr('data-raw', iso).html(dispHTML);
7578						}
7579					}
7580
7581					$field.removeData('origDisplay')
7582							.removeData('origRaw')
7583							.removeData('origDate')
7584							.removeData('commitFlag');
7585
7586					$field.find('.custom-clock .select .drop').hide();
7587			});
7588
7589			const inst = $field.data('DateTimePicker');
7590			if (inst && typeof inst.show === 'function') inst.show();
7591			else { try { $field.datetimepicker('show'); } catch(e){} }
7592		});
7593
7594		$(document).on('click', '.calendar .col-box', function(e) {
7595			var isOpen = $(this).closest('.cfull-box').hasClass('open');
7596			if(isOpen) {
7597				$(this).closest('.cfull-box').removeClass('open');
7598			} else {
7599				$(this).closest('.cfull-box').addClass('open');
7600			}
7601		});
7602
7603		$(document).on('click', '.calendar .scheduleColor', function() {
7604			var colorpick = $(this).attr('data-color');
7605			$(this).closest('.ccol-box').siblings('.col-box').find('.scheduleColorPicker').css('background-color', colorpick).attr('data-color', colorpick);
7606			$(this).closest('.cfull-box').removeClass('open');
7607		});
7608
7609		$(document).on('click', function(e) {
7610			if (!$(e.target).closest('.col-box').length) {
7611				$('.cfull-box').removeClass('open');
7612			}
7613		});
7614
7615		// 닫기 버튼
7616		$(document).on('click', '.calendar .modal-close', function(){
7617			var pid = $(this).closest('.calendar').attr('data-id');
7618			$(this).closest(".calendar-modal-overlay").fadeOut(200, function(){
7619				$(this).remove();
7620			});
7621			calendarOverlayOut(pid);
7622		});
7623
7624		$(document).on('click', '.calendar .all-day', function(e) {
7625			e.stopPropagation();
7626			var checked = ($(this).is(':checked')) ? true : false,
7627				$overlay = $(this).closest('.calendar-modal-overlay'),
7628				locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko',
7629				sdate1 = $overlay.find('.sdate .start').val(),
7630				sdate2 = $overlay.find('.sdate .start').attr('data-raw'),
7631				edate1 = $overlay.find('.edate .end').val(),
7632				edate2 = $overlay.find('.edate .end').attr('data-raw'),
7633				sdate1_only = sdate1 ? (sdate1.split(' ')[0] + ' ' + sdate1.split(' ')[1]) : '',
7634				sdate2_only = sdate2 ? sdate2.split(' ')[0] : '',
7635				edate1_only = edate1 ? (edate1.split(' ')[0] + ' ' + edate1.split(' ')[1]) : '',
7636				edate2_only = edate2 ? edate2.split(' ')[0] : '',
7637				time_lang_start = (locale == 'en') ? ' 12:00 PM' : ' 오후 12:00';
7638				time_lang_end = (locale == 'en') ? ' 1:00 PM' : ' 오후 1:00';
7639
7640			// 1) 표시 문자열/원시값 동기화 (기존 로직 유지)
7641			if(checked) {
7642				$overlay.find('.sdate .start').val(sdate1_only);
7643				$overlay.find('.sdate .start').attr('data-raw', sdate2_only);
7644				$overlay.find('.edate .end').val(edate1_only);
7645				$overlay.find('.edate .end').attr('data-raw', edate2_only);
7646				$overlay.find('.stimepicker .tt').remove();
7647        		$overlay.find('.etimepicker .tt').remove();
7648			} else {
7649				$overlay.find('.sdate .start').val(sdate1_only + time_lang_start);
7650				$overlay.find('.sdate .start').attr('data-raw', sdate2_only + ' 12:00');
7651				$overlay.find('.edate .end').val(edate1_only + time_lang_end);
7652				$overlay.find('.edate .end').attr('data-raw', edate2_only + ' 13:00');
7653				$overlay.find('.stimepicker').append('<span class="tt">' + time_lang_start + '</span>');
7654				$overlay.find('.etimepicker').append('<span class="tt">' + time_lang_end + '</span>');
7655			}
7656
7657			$overlay.find('.modal-field.sdate, .modal-field.edate').each(function(){
7658				const $field = $(this);
7659				const $input = $field.find('input.daytime');
7660				const dp     = getDp($field, $input);
7661
7662				if (!dp) return;
7663
7664				// 위젯 얻기
7665				let $widget = null;
7666				try {
7667				const w = (typeof dp.widget === 'function') ? dp.widget() : dp.widget;
7668				if (w) $widget = (w.jquery ? w : $(w));
7669				} catch (err) {}
7670
7671				// 현재 위젯이 화면에 떠 있을 때만 ensureCustomClock으로 시간영역 표시/숨김 반영
7672				if ($widget && $widget.length && $widget.is(':visible')) {
7673					ensureCustomClock($field, locale);
7674				}
7675			});
7676		});
7677
7678		$(document).on('click', '.calendar .schedule_list .del, .calendar .modal-delete', function() {
7679			var mode = $(this).hasClass('modal-delete'),
7680        		locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko';
7681				
7682			if (confirm($.lang[locale]['config.calendar.delete'])) {
7683				if(mode) {
7684					var sid = b.SID,
7685						pid = $(this).closest('.calendar').attr('data-id'),
7686						seq = $(this).closest('.calendar-modal-container').find('.calendar-modal-body').find('.seq').val(),
7687						yearMonth = $(this).closest('.calendar-modal-overlay').find('.calendar-modal-container.view .calendar-modal-body .sdate .start').attr('data-raw').substring(0, 7);
7688				} else {
7689					var sid = $(this).siblings('.sid').val(),
7690						seq = $(this).siblings('.seq').val(),
7691						pid = $(this).siblings('.pid').val(),
7692						yearMonth = $('.schedule_list .sdate').val().substring(0, 7);
7693				}
7694				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
7695
7696				$.ajax({
7697					url: '/template/delete_calendar',
7698					data: { sid: sid, pid: pid, seq: seq, yearMonth: yearMonth },
7699					type: 'POST',
7700					dataType: 'json',
7701					success: function(data) {
7702						checkError(data);
7703						const instance = $.cl_calendar.instances[pid];
7704						// instance.events = data || [];
7705						if (mode) {
7706							$(".calendar-modal-overlay").fadeOut(300);
7707						} else {
7708							$('.modal-overlay-modify').fadeOut(300);
7709						}
7710
7711						if (data_type !== '') {
7712							$.cl_calendar.init(b.SID, pid, yearMonth);
7713						} else {
7714							// ✅ 핵심: 수정 영향권(전/당/다음달)만 캐시 무효화
7715							invalidateAround(pid, yearMonth);
7716
7717							//서버가 돌려준 최신 data(3개월치)를 즉시 캐시에 병합
7718							upsertMonthCacheFromServer(pid, data);
7719
7720							// ✅ 동적 events 소스를 유지한 채로 최신 데이터 다시 요청
7721							if (instance && instance.calendar) {
7722								const v = instance.calendar.view;
7723								const needKeys = monthsInRange(v.currentStart, v.currentEnd);
7724								const pidMap = monthCache.get(pid) || new Map();
7725								const missing = needKeys.filter(k => !pidMap.has(k));
7726								const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
7727								const after = () => instance.calendar.refetchEvents();
7728
7729								if (missing.length) {
7730									Promise.all(missing.map(k =>
7730 fetchMonth(pid, k, dt))).finally(after);
7731								} else {
7732									after();
7733								}
7734							} else {
7735								initCalendar(pid);
7736							}
7737						}
7738						calendarOverlayOut(pid);
7739					}
7740				});
7741			}
7742		});
7743
7744		$(document).on('click', '.calendar .go-modify', function() {
7745			var pid = $(this).closest('.calendar-modal-container').find('.pid').val();
7746			if(currentEvent) showCalendarModalEdit(pid, 1, currentDate, currentEvent);
7747			else console.log('선택된 이벤트 없음');
7748		});
7749
7750		// 저장 버튼
7751		let isSaving = false;
7752		$(document).on('click', '.calendar .modal-save, .calendar .modal-modify', function(e) {
7753			e.preventDefault();
7754			e.stopImmediatePropagation();
7755
7756			if (isSaving) return false;
7757
7758			const locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko';
7759			const $btn = $(this);
7760			const $overlay = $btn.closest('.calendar-modal-overlay');
7761
7762			if ($overlay.data('saving') === true) return false;
7763
7764			$overlay.data('saving', true);
7765			const $buttons = $overlay.find('.modal-save, .modal-modify').prop('disabled', true).addClass('is-disabled');
7766
7767			var mode = $btn.hasClass('modal-modify'),
7768				pid = $btn.closest('.calendar').attr('data-id'),
7769				data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
7770
7771			var title = $btn.closest('.calendar-modal-container').find('.modal-title .ctitle').val(),
7772                color = $btn.closest('.calendar-modal-container').find('.scheduleColorPicker').attr('data-color'),
7773				seq = $btn.parent().siblings('.calendar-modal-body').find('.seq').val(),
7774				sdate = $btn.parent().siblings('.calendar-modal-body').find('.sdate .start').attr('data-raw'),
7775        		edate = $btn.parent().siblings('.calendar-modal-body').find('.edate .end').attr('data-raw'),
7776				fulltime = ($btn.parent().siblings('.calendar-modal-body').find('.all .all-day').prop('checked')) ? 'Y' : 'N',
7777				content = $btn.parent().siblings('.calendar-modal-body').find('.content textarea').val(),
7778				pass = $btn.parent().siblings('.calendar-modal-body').find('.pass').val();
7779
7780			if (!title) {
7781				alert($.lang[locale]['config.calendar.enter-title']);
7782				$overlay.data('saving', false);
7783        		$buttons.prop('disabled', false).removeClass('is-disabled');
7784				return false;
7785			}
7786			if (pass == 'N') {
7787				alert($.lang[locale]['config.calendar.enter-date']);
7788				$overlay.data('saving', false);
7789        		$buttons.prop('disabled', false).removeClass('is-disabled');
7790				return false;
7791			}
7792
7793			var timeRegex = /\s\d{1,2}:\d{2}$/; 
7794			if (fulltime === 'N' && (!timeRegex.test(sdate) || !timeRegex.test(edate))) {
7795				alert($.lang[locale]['config.calendar.enter-time']);
7796				$overlay.data('saving', false);
7797        		$buttons.prop('disabled', false).removeClass('is-disabled');
7798				return false;
7799			}
7800
7801			isSaving = true;
7802			$buttons.prop('disabled', true).addClass('is-disabled');
7803
7804			$(".calendar-modal-overlay").fadeOut(200, function() { $(this).remove(); });
7805			calendarOverlayOut(pid);
7806
7807			const eventData = {
7808				sid: b.SID,
7809				seq: seq,
7810				pid: pid,
7811				month: sdate.substring(0, 7),
7812				sdate: sdate,
7813				stime: (sdate.split(' ')[1]) ? sdate.split(' ')[1] : '00:00',
7814				edate: edate,
7815				etime: (edate.split(' ')[1]) ? edate.split(' ')[1] : '00:00',
7816				fulltime: fulltime,
7817				memo: content,
7818				title: title,
7819				color: color,
7820				check: 2
7821			};
7822
7823			$.ajax({
7824				url: '/template/calendar',
7825				data: { data: eventData, mode: mode, yearMonth: eventData['month'], data_type : data_type },
7826				type: 'POST',
7827				dataType: 'json',
7828				success: function(data) {
7829					checkError(data);
7830					const instance = $.cl_calendar.instances[pid];
7831					instance.events = data || [];
7832
7833					if (data_type != '') {
7834						$.cl_calendar.init(b.SID, pid, sdate.substring(0, 7));
7835					} else {
7836						// ✅ 핵심: 수정 영향권(전/당/다음달)만 캐시 무효화
7837						invalidateAround(pid, sdate.substring(0, 7));
7838
7839						// 서버가 돌려준 최신 data(3개월치)를 즉시 캐시에 병합
7840						upsertMonthCacheFromServer(pid, data);
7841
7842						// ✅ 동적 events 소스를 유지한 채로 최신 데이터 다시 요청
7843						if (instance && instance.calendar) {
7844							const v = instance.calendar.view;
7845							const needKeys = monthsInRange(v.currentStart, v.currentEnd);
7846							const pidMap = monthCache.get(pid) || new Map();
7847							const missing = needKeys.filter(k => !pidMap.has(k));
7848							const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
7849							if (missing.length) {
7850								Promise.all(missing.map(k =>
7850 fetchMonth(pid, k, dt)))
7851								.finally(() => instance.calendar.refetchEvents());
7852							} else {
7853								instance.calendar.refetchEvents();
7854							}
7855						} else {
7856							initCalendar(pid);
7857						}
7858						isSaving = false;
7859						$buttons.prop('disabled', false).removeClass('is-disabled');
7860					}
7861
7862					$(".calendar-modal-overlay").fadeOut(200, function() { $(this).remove(); });
7863					calendarOverlayOut(pid);
7864				},
7865				error: function(xhr, status, error) {
7866					console.error("이벤트 저장 실패:", error);
7867				}
7868			});
7869		});
7870
7871		function openEventModal(dateString) {
7872			selectedDate = dateString;
7873			
7874			// 폼 초기화
7875			$('#eventForm')[0].reset();
7876			$('#eventId').val('');
7877			$('#eventStartDate').val(dateString);
7878			$('#eventEndDate').val(dateString);
7879			
7880			// 종료일은 시작일 이후만 선택 가능하도록 설정
7881			$('#eventEndDate').attr('min', dateString);
7882			
7883			// 모달 표시
7884			$('#eventModal').fadeIn(300);
7885		}
7886
7887		function htmlEscape(str) {
7888			return String(str)
7889				.replace(/&/g, "&amp;")
7890				.replace(/</g, "&lt;")
7891				.replace(/>/g, "&gt;")
7892				.replace(/"/g, "&quot;")
7893				.replace(/'/g, "&#39;");
7894		}
7895
7896		// 모달 열기(값이 있을때)
7897		function openEventList(dateString, eventData, el) {
7898			var dayOfWeek = getDayOfWeek(dateString);
7899
7900			var match = [];
7901			for(var i=0; i < eventData.length; i++) {
7902				if(dateString == eventData[i].s_date) {
7903					match.push(eventData[i]);
7904				}
7905			}
7906			
7907			var html = '',
7908			itemCount = 0;
7909			html += '\
7910				<div class="modal-container">\
7911					<div class="modal-header">\
7912						<div class="modal-title">'+ dateString +'&nbsp;&nbsp;&nbsp;'+ dayOfWeek +'</div>\
7913						<button class="modal-close">&times;</button>\
7914					</div>\
7915					<hr>\
7916					<div class="modal-body">\
7917						<ul class="scd_list">\
7918					';
7919			if(match.length == 1) {
7920				var stime = match[0].s_time.substring(0,5),
7921					etime = match[0].e_time.substring(0,5),
7922					fulltime = (match[0].fulltime == 'N') ? stime +' ~ '+ etime : '';
7923				html += '<li data-index="" data-seq="" data-pid="" class="schedule_list _schedule_list">\
7924							<div class="info">\
7925								<span class="datetime">'+ dateString +'('+ dayOfWeek +') '+ fulltime +'</span>\
7926								<input type="hidden" name="sid" class="sid" value="'+ match[0].sid +'">\
7927								<input type="hidden" name="seq" class="seq" value="'+ match[0].seq +'">\
7928								<input type="hidden" name="pid" class="pid" value="'+ match[0].pid +'">\
7929								<input type="hidden" name="sdate" class="sdate" value="'+ match[0].s_date +'">\
7930								<input type="hidden" name="stime" class="stime" value="'+ match[0].s_time +'">\
7931								<input type="hidden" name="edate" class="edate" value="'+ match[0].e_date +'">\
7932								<input type="hidden" name="etime" class="etime" value="'+ match[0].e_time +'">\
7933								<input type="hidden" name="memo" class="memo" value="'+ htmlEscape(match[0].memo) +'">\
7934								<input type="hidden" name="fulltime" class="fulltime" value="'+ match[0].fulltime +'">\
7935							</div>\
7936							<p class="txt">'+ htmlEscape(match[0].memo) +'</p>\
7937						</li>';
7938				itemCount = 1;
7939			} else if(match.length > 1) {
7940				for(var j=0; j < match.length; j++) {
7941					var stime = match[j].s_time.substring(0,5),
7942						etime = match[j].e_time.substring(0,5),
7943						fulltime = (match[j].fulltime == 'N') ? stime +' ~ '+ etime : '';
7944					html += '<li data-index="" data-seq="" data-pid="" class="schedule_list _schedule_list">\
7945							<div class="info">\
7946								<span class="datetime">'+ dateString +'('+ dayOfWeek +') '+ fulltime +'</span>\
7947								<input type="hidden" name="sid" class="sid" value="'+ match[j].sid +'">\
7948								<input type="hidden" name="seq" class="seq" value="'+ match[j].seq +'">\
7949								<input type="hidden" name="pid" class="pid" value="'+ match[j].pid +'">\
7950								<input type="hidden" name="sdate" class="sdate" value="'+ match[j].s_date +'">\
7951								<input type="hidden" name="stime" class="stime" value="'+ match[j].s_time +'">\
7952								<input type="hidden" name="edate" class="edate" value="'+ match[j].e_date +'">\
7953								<input type="hidden" name="etime" class="etime" value="'+ match[j].e_time +'">\
7954								<input type="hidden" name="memo" class="memo" value="'+ htmlEscape(match[j].memo) +'">\
7955								<input type="hidden" name="fulltime" class="fulltime" value="'+ match[j].fulltime +'">\
7956							</div>\
7957							<p class="txt">'+ htmlEscape(match[j].memo) +'</p>\
7958						</li>';
7959					itemCount++;
7960				}
7961			}
7962			html += '</ul></div>\
7963				</div>\
7964			';
7965			if (itemCount <= 1) {
7966				$(el + ' #eventModalModify').addClass('few-items');
7967			} else if (itemCount <= 3) {
7968				$(el + ' #eventModalModify').addClass('mid-items');
7969			} else {
7970				$(el + ' #eventModalModify').addClass('many-items');
7971			}
7972			$(el+' #eventModalModify').empty();
7973			$(el+' #eventModalModify').html(html);
7974			$(el+' #eventModalModify').fadeIn(300);
7975		}
7976
7977		// 모달 닫기 함수
7978		function closeEventModal() {
7979			$('.modal-schedule').fadeOut(300);
7980			selectedDate = null;
7981			currentEventId = null;
7982		}
7983
7984		function formatDate(date) {
7985			const year = date.getFullYear();
7986			const month = String(date.getMonth() + 1).padStart(2, '0');
7987			const day = String(date.getDate()).padStart(2, '0');
7988			return `${year}-${month}-${day}`;
7989		}
7990
7991		function getDayOfWeek(dateString) {
7992			const days = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'];
7993			const date = new Date(dateString);  // 문자열을 Date 객체로 변환
7994			return days[date.getDay()]; // 0(일) ~ 6(토)에 해당하는 요일 반환
7995		}
7996
7997		function createDayElement(date, dateString, isOtherMonth, pid) {
7998			if (!$.cl_calendar.instances[pid]) {
7999				// console.error(`draw called but instance for pid=${pid} is not initialized yet`);
8000				return;
8001			}
8002			var mode = $('.userEL'+pid).attr('data-type2');
8003			const day = date.getDate();
8004			const dayOfWeek = date.getDay();
8005			const isToday = date.toDateString() === new Date().toDateString(); // 예제에서는 3월 18일이 오늘
8006			let className = 'day_wrap _day_wrap';
8007			if (dayOfWeek === 0) className += ' sunday';
8008			if (dayOfWeek === 6) className += ' saturday';
8009			if (isOtherMonth) className += ' other-month';
8010			if (isToday) className += ' today';
8011			
8012			const today_class = (isToday) ? 'today' : '';
8013			const today_themebg = (isToday && mode != 'mwd') ? 'theme_background' : '';
8014			const today_themebd = (isToday) ? 'theme_border' : '';
8015
8016			const dayElement = $('<div>', { 
8017				class: className,
8018				'data-date': dateString
8019			});
8020			
8021			// 일자 표시
8022			const dayNumber = $('<span>', { 
8023				class: `num _dateNum  ${today_themebg}`, 
8024				text: day 
8025			});
8026
8027			// 오늘 표시
8028			if (isToday) {
8029				if(mode == 'mwd') dayNumber.html(`${day}`);
8030        		else dayNumber.html(`<div class="today-indicator">${day}</div>`);
8031			}
8032			// console.log(today_class);
8033			dayElement.append(dayNumber);
8034			dayElement.find('._dateNum').wrap(`<a class="day_num ${today_class} ${today_themebd}"></a>`);
8035			// dayElement.find('.day_num').append('<span class="theme_border"></span>');
8036
8037			var count = 0;
8038			const events = $.cl_calendar.instances[pid].events;
8039			for (var i = 0; i < events.length; i ++) {
8040				if(dateString == events[i].s_date) {
8041					var time = '',
8042						settings = JSON.parse(events[i].settings || '{}');
8043					if(events[i].fulltime == 'Y') time = '종일일정';
8044					else time = events[i].s_time.substring(0, 5) + '-' + events[i].e_time.substring(0, 5);
8045					if(mode == 'mwd') {
8046						dayElement.find('.day_num').append('<div class="event-item" data-seq="'+ events[i].seq +'" style="background-color:'+ settings.color+';">'+ settings.title +'</div>');
8047					} else {
8048						dayElement.find('.day_num').append('<div class="event">'+ time +'</div>');
8049						dayElement.find('.day_num').append('<div class="event_memo">'+ events[i].memo +'</div>');
8050					}
8051					count++;
8052				}
8053			}
8054			if(mode != 'mwd') {
8055
8056				if(count == 1) {
8057					dayElement.find('.day_num').append('<div class="event_mobile">'+ count +'</div>');
8058				} else if(count > 1) {
8059					dayElement.find('.day_num .event').remove();
8060					dayElement.find('.day_num .event_memo').remove();
8061					dayElement.find('.day_num').append('<div class="event more">일정'+ count +'</div>');
8062					dayElement.find('.day_num').append('<div class="event_mobile">' + count +'</div>');
8063				}
8064			}
8065			
8066			return dayElement;
8067		}
8068
8069		function showCalendarModalView(pid, data, fromList) {
8070			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8071			$(".calendar-modal-overlay").remove();
8072
8073			var isGoogle = !!(data.extendedProps && data.extendedProps.isGoogle);
8074			let fulltime = data.extendedProps.fulltime;
8075			if (isGoogle && (fulltime === undefined || fulltime === '' || fulltime === null)) {
8076				// extendedProps에 없으면 event 객체의 allDay로 다시 보정
8077				fulltime = data.allDay ? 'Y' : 'N';
8078			}
8079
8080			let timeShow = '', startShow = '', endShow = '', rawStart = '', rawEnd = '';
8081			if (data.allDay) {
8082				if (data.extendedProps.fulltime === 'Y') { // 종일 범위
8083					rawStart = data.extendedProps.start_date;          // "YYYY-MM-DD"
8084                    rawEnd   = data.extendedProps.end_date;            // "YYYY-MM-DD"
8085					timeShow  = formatRangeLocalized(rawStart, rawEnd, locale, { allDay: true });
8086					startShow = formatDateLocalized(rawStart, locale);
8087					endShow   = formatDateLocalized(rawEnd,   locale);
8088				} else { // 연속 일정(시간 포함)
8089					rawStart = `${data.extendedProps.start_date} ${data.extendedProps.s_time}`;
8090					rawEnd   = `${data.extendedProps.end_date} ${data.extendedProps.e_time}`;
8091					timeShow  = formatRangeLocalized(rawStart, rawEnd, locale);
8092					startShow = formatDateLocalized(rawStart, locale);
8093					endShow   = formatDateLocalized(rawEnd,   locale);
8094				}
8095			} else { // 하루 일정(시간 지정)
8096				rawStart = `${data.extendedProps.start_date} ${data.extendedProps.s_time}`;
8097				rawEnd   = `${data.extendedProps.end_date} ${data.extendedProps.e_time}`;
8098				timeShow  = formatRangeLocalized(rawStart, rawEnd, locale);
8099				startShow = formatDateLocalized(rawStart, locale);
8100				endShow   = formatDateLocalized(rawEnd,   locale);
8101			}
8102
8103			const displayStartText = formatDateLocalized(rawStart, locale, 1);
8104    		const displayEndText   = formatDateLocalized(rawEnd, locale, 1);
8105
8106			let backButtonHtml = fromList ? `<button class="back-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M14.35 17.29 7.06 10l7.29-7.29-.7-.71-8 8 .7.71 7.3 7.29.7-.71z"/></svg></button>` : ``; 
8107			let modalHeaderClass = fromList ? '' : 'no-back';
8108			var footerButtonsHtml = '',
8109				textTitle = '';
8110			if (!isGoogle) {
8111				footerButtonsHtml = `
8112					<button class="modal-delete">${$.lang[locale]['config.delete']}</button>
8113					<button class="go-modify">${$.lang[locale]['config.modify']}</button>
8114				`;
8115				textTitle = data._def.title;
8116			} else {
8117				textTitle = (data._def.title == 'undefined') ? (locale == 'ko') ? '(제목 없음)' : '(No title)' : data._def.title;
8118			}
8119
8120			let modalHtml = `
8121				<div class="calendar-modal-overlay" style="display:none;">
8122					<div class="calendar-modal-container view">
8123						<div class="calendar-modal-header">
8124							${backButtonHtml}
8125							<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M17.85 17.15 10.7 10l7.15-7.15c.2-.19.2-.51.01-.71-.19-.2-.51-.2-.71-.01l-.01.01-7.15 7.15-7.14-7.14a.504.504 0 0 0-.71.01c-.19.19-.19.5 0 .69L9.29 10l-7.15 7.15c-.2.19-.2.51-.01.71.19.2.51.2.71.01l.01-.01L10 10.71l7.15 7.15c.19.2.51.2.71.01.2-.19.2-.51.01-.71l-.01-.01Z"/></svg></button>
8126						</div>
8127						<div class="calendar-modal-body">
8128							<input type="hidden" class="pid" value="${pid}">
8129							<input type="hidden" class="seq" value="${data.extendedProps.seq}">
8130							<input type="hidden" id='sale-start-datetime' value="">
8131							<div class="col-box">
8132								<input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color: ${data.backgroundColor}" readonly>
8133								<span class="modal-title">${textTitle}</span>
8134							</div>
8135							<div class="date-box">
8136								<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M14 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5Z" style="fill:#cool-grey ;"/><path d="M10 2c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Zm0 15c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7c0 3.86-3.14 7-7 7Z" style="fill:#cool-grey ;"/></svg></label>
8137								<div class="modal-field sdate">
8138									<span class="daytime daytime-html start stimepicker" data-raw="${rawStart}" readonly>${displayStartText}</span>
8139								</div>
8140								<span class="middle"> ~ </span>
8141								<div class="modal-field edate">
8142									<span class="daytime daytime-html end etimepicker" data-raw="${rawEnd}" readonly>${displayEndText}</span>
8143								</div>
8144							</div>
8145							<div class="modal-field content">
8146								<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M2 5h16v1H2z"/><path d="M2 9h16v1H2z"/><path d="M2 13h8v1H2z"/><path d="M50 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5"/><path d="M46 3c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Z"/></svg></label>
8147								<span>${nl2br(data.extendedProps.memo) || '&nbsp;'}</span>
8148							</div>
8149						</div>`;
8150				if(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8151					modalHtml += `
8152						<div class="calendar-modal-footer">
8153							${footerButtonsHtml}
8154						</div>`;
8155					}
8156				modalHtml += `
8157					</div>
8158					<div class="calendar-modal-container mobile">
8159						<div class="calendar-modal-header ${modalHeaderClass}">
8160							${fromList ? `<button class="back-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="m17.35 2.71-.7-.71-9.3 9.29-.7.71 10 10 .7-.71L8.06 12l9.29-9.29z"/></svg></button>` : ``}
8161							<div class="text-right">`;
8162			if(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8163				if(!isGoogle) {
8164					modalHtml += `<button class="mod go-modify"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="m21.27 2.95-.21-.21c-.47-.47-1.1-.73-1.77-.73-.66 0-1.3.26-1.77.73L3.25 17 2 22l5-1.25L21.27 6.48c.98-.98.98-2.56 0-3.53ZM6.43 19.75l-2.91.73.73-2.91L15.56 6.26l2.18 2.18-11.3 11.3ZM20.48 5.7l-2.04 2.04-2.18-2.18 2.04-2.04c.26-.26.61-.41.98-.41s.72.15.98.41l.21.21c.54.54.54 1.42 0 1.96Z"/></svg></button>
8165									<button class="del modal-delete"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M16.17 4.5V2H7.83v2.5h-5v1.25H4.5v12.92C4.5 20.51 5.99 22 7.83 22h8.33c1.84 0 3.33-1.49 3.33-3.33V5.75h1.67V4.5h-5ZM9.08 3.25h5.83V4.5H9.08V3.25Zm9.17 15.42c0 1.15-.93 2.08-2.08 2.08H7.83c-1.15 0-2.08-.93-2.08-2.08V5.75h12.5v12.92Z" class="st0"/><path d="M9.08 8.67h1.25v9.17H9.08zM13.67 8.67h1.25v9.17h-1.25z"/></svg></button>
8166								`;
8167				}
8168			}
8169			modalHtml += `<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
8169<path d="M21 3.71 20.29 3 12 11.29 3.71 3 3 3.71 11.29 12 3 20.29l.71.71L12 12.71 20.29 21l.71-.71L12.71 12 21 3.71z"/></svg></button>
8170							</div>
8171						</div>
8172						<div class="calendar-modal-body">
8173							<input type="hidden" class="pid" value="${pid}">
8174							<input type="hidden" class="seq" value="${data.extendedProps.seq}">
8175							<div class="title">
8176								<div class="title-left ${(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) ? '' : 'notadm'}">
8177									<input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color: ${data.backgroundColor}" readonly>
8178									<span class="modal-title">${textTitle}</span>
8179								</div>
8180							</div>
8181							<div class="modal-field mdate">
8182								<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M14 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5Z" style="fill:#cool-grey ;"/><path d="M10 2c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Zm0 15c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7c0 3.86-3.14 7-7 7Z" style="fill:#cool-grey ;"/></svg></label>
8183								<div class="date-box">
8184									<div class="modal-field sdate">
8185										<span class="daytime daytime-html start stimepicker" data-raw="${rawStart}" readonly>${displayStartText}</span>
8186									</div>
8187									<span class="middle"> ~ </span>
8188									<div class="modal-field edate">
8189										<span class="daytime daytime-html end etimepicker" data-raw="${rawEnd}" readonly>${displayEndText}</span>
8190									</div>
8191								</div>
8192							</div>
8193							<div class="modal-field mcontent">
8194								<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M2 5h16v1H2z"/><path d="M2 9h16v1H2z"/><path d="M2 13h8v1H2z"/><path d="M50 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5"/><path d="M46 3c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Z"/></svg></label>
8195								<span>${nl2br(data.extendedProps.memo) || '&nbsp;'}</span>
8196							</div>
8197						</div>
8198					</div>
8199				</div>`;
8200
8201			const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
8202			$modalWrapper.append(modalHtml);
8203			calendarOverlayIn(pid);
8204			$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
8205
8206			if (fromList) {
8207				$modalWrapper.off('click', '.back-button').on('click', '.back-button', function () {
8208					$(".calendar-modal-overlay").remove();
8209					if (lastEventsList) {
8210						openMoreEventsModal(pid, lastEventsList, lastEventsWeekday);
8211					}
8212				});
8213			}
8214		}
8215
8216		function parseToDate(str) {
8217			if (!str) return new Date();
8218			if (str.includes('T')) return new Date(str);
8219			const [d, t] = str.trim().split(' ');
8220			const [yy, mm, dd] = d.split('-').map(Number);
8221			if (!t) return new Date(yy, mm - 1, dd, 0, 0);
8222			const [HH, MM] = t.split(':').map(Number);
8223			return new Date(yy, mm - 1, dd, HH, MM);
8224		}
8225
8226		function formatDateLocalized(rawStr, locale, isInput) {
8227			isInput = (isInput == undefined || isInput == '') ? false : true;
8228			const dt = parseToDate(rawStr);
8229			const year = dt.getFullYear();
8230			const month = String(dt.getMonth() + 1).padStart(2, '0');
8231			const day = String(dt.getDate()).padStart(2, '0');
8232			const koDays = ['일','월','화','수','목','금','토'];
8233			const enDays = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
8234			const weekday = (locale === 'en') ? enDays[dt.getDay()] : koDays[dt.getDay()];
8235			const hasTime = String(rawStr).includes(':') || String(rawStr).includes('T');
8236
8237			const dateStr = (locale === 'en') 
8238				? `${month}.${day}.${year}` 
8239				: `${year}.${month}.${day}`;
8240
8241			if (!hasTime) return `${dateStr} (${weekday})`;
8242
8243			let H = dt.getHours();
8244			const mm = String(dt.getMinutes()).padStart(2, '0');
8245			let h12 = H % 12; if (h12 === 0) h12 = 12;
8246
8247			if (locale === 'en') {
8248				const ampm = (H < 12) ? 'AM' : 'PM';
8249				if(isInput) return `${weekday} ${dateStr} <span class='tt'>${h12}:${mm} ${ampm}</span>`;
8250        		else return `${weekday} ${dateStr} ${h12}:${mm} ${ampm}`;
8251			} else {
8252				const ampm = (H < 12) ? '오전' : '오후';
8253				if(isInput) return `${dateStr} (${weekday}) <span class='tt'>${ampm} ${h12}:${mm}</span>`;
8254        		else return `${dateStr} (${weekday}) ${ampm} ${h12}:${mm}`;
8255			}
8256		}
8257
8258		function formatTimeOnly(rawStr, locale) {
8259			const dt = parseToDate(rawStr);
8260			let H = dt.getHours();
8261			const mm = String(dt.getMinutes()).padStart(2, '0');
8262			let h12 = H % 12; if (h12 === 0) h12 = 12;
8263
8264			if (locale === 'en') {
8265				const ampm = (H < 12) ? 'AM' : 'PM';
8266				return `${h12}:${mm} ${ampm}`;
8267			} else {
8268				const ampm = (H < 12) ? '오전' : '오후';
8269				return `${ampm} ${h12}:${mm}`;
8270			}
8271		}
8272
8273		// 범위 포맷: 같은 날이면 "왼쪽=전체, 오른쪽=시간만", 다른 날이면 양쪽 모두 전체
8274		function formatRangeLocalized(startRaw, endRaw, locale, {allDay=false} = {}) {
8275			const s = parseToDate(startRaw);
8276			const e = parseToDate(endRaw);
8277
8278			const sameDay = (s.getFullYear() === e.getFullYear() &&
8279							s.getMonth() === e.getMonth() &&
8280							s.getDate() === e.getDate());
8281
8282			if (allDay) {
8283				// 종일 범위: 날짜만
8284				const left  = formatDateLocalized(startRaw.split(' ')[0], locale);
8285				const right = formatDateLocalized(endRaw.split(' ')[0], locale);
8286				return `${left} ~ ${right}`;
8287			}
8288
8289			if (sameDay) {
8290				const left  = formatDateLocalized(startRaw, locale);
8291				const right = formatTimeOnly(endRaw, locale);
8292				return `${left} ~ ${right}`;
8293			} else {
8294				const left  = formatDateLocalized(startRaw, locale);
8295				const right = formatDateLocalized(endRaw,   locale);
8296				return `${left} ~ ${right}`;
8297			}
8298		}
8299
8300		function swallowNextTapOnce(ttl = 400){
8301			const stop = (e) => {
8302				e.preventDefault();
8303				e.stopPropagation();
8304				e.stopImmediatePropagation && e.stopImmediatePropagation();
8305				cleanup();
8306			};
8307			const cleanup = () => {
8308				document.removeEventListener('click', stop, true);
8309				document.removeEventListener('pointerup', stop, true);
8310				document.removeEventListener('touchend', stop, true);
8311			};
8312			document.addEventListener('click', stop, true);
8313			document.addEventListener('pointerup', stop, true);
8314			document.addEventListener('touchend', stop, true);
8315			setTimeout(cleanup, ttl);
8316		}
8317
8318		function showCalendarModalEdit(pid, mode, date, data) {
8319			// console.log('edit');
8320			swallowNextTapOnce();
8321			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8322			var data = (typeof data != 'undefined') ? data : '';
8323
8324			$(".calendar-modal-overlay").remove();
8325
8326			if(mode == 0) {
8327				// console.log(date);
8328				var startDate = '',
8329					endDate = '',
8330					checked = '';
8331				startDate = date[0];
8332				endDate = date[1];
8333				checked = (date[2] == 1) ? 'checked' : '';
8334
8335				const displayStart = formatDateLocalized(startDate, locale);
8336        		const displayEnd   = formatDateLocalized(endDate, locale);
8337				const displayStartText = formatDateLocalized(startDate, locale, 1);
8338        		const displayEndText   = formatDateLocalized(endDate, locale, 1);
8339        
8340				var modalHtml = `
8341					<div class="calendar-modal-overlay" style="display:none;">
8342						<div class="calendar-modal-container">
8343							<div class="calendar-modal-header">
8344								<div class="cfull-box">
8345									<div class="col-box"><input type="text" class="scheduleColorPicker" data-color="#fcbf54" style="background-color: #fcbf54;" readonly></div>
8346									<div class="ccol-box">
8347										<input type="text" data-color="#ff6f61" class="scheduleColor sc1" readonly>
8348										<input type="text" data-color="#f63824" class="scheduleColor sc2" readonly>
8349										<input type="text" data-color="#ee6c3b" class="scheduleColor sc3" readonly>
8350										<input type="text" data-color="#fcbf54" class="scheduleColor sc4" readonly>
8351										<input type="text" data-color="#14c285" class="scheduleColor sc5" readonly>
8352										<input type="text" data-color="#1d9f54" class="scheduleColor sc6" readonly><br>
8353										<input type="text" data-color="#3498db" class="scheduleColor sc7" readonly>
8354										<input type="text" data-color="#022b79" class="scheduleColor sc8" readonly>
8355										<input type="text" data-color="#9b59b6" class="scheduleColor sc9" readonly>
8356										<input type="text" data-color="#e91e63" class="scheduleColor sc10" readonly>
8357										<input type="text" data-color="#566573" class="scheduleColor sc11" readonly>
8358										<input type="text" data-color="#95a5a6" class="scheduleColor sc12" readonly>
8359									</div>
8360								</div>
8361								<span class="modal-title"><input type="text" class="ctitle" value="" placeholder="${$.lang[locale]['config.calendar.title.placeholder']}" maxlength="200"></span>
8362								<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21 3.71 20.29 3 12 11.29 3.71 3 3 3.71 11.29 12 3 20.29l.71.71L12 12.71 20.29 21l.71-.71L12.71 12 21 3.71z"/></svg></button>
8363							</div>
8364							<div class="calendar-modal-body">
8365								<input type="hidden" class="pass" value="Y">
8366								<input type="hidden" id='sale-start-datetime' value="">
8367								<div class="modal-field all">
8368									<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M14 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5Z" style="fill:#cool-grey ;"/><path d="M10 2c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Zm0 15c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7c0 3.86-3.14 7-7 7Z" style="fill:#cool-grey ;"/></svg></label>
8369									<label for="all-day">${$.lang[locale]['config.calendar.fulltime']}</label>
8370									<span class="bc-tp-btn switch-wrap">
8371										<label class="switch prop-wrap">
8372											<input type="checkbox" class="switch-input all-day" id="all-day" data-el="${selectEL}" ${checked}>
8373											<span class="switch-label" data-on="On" data-off="Off"></span>
8374											<span class="switch-handle"></span>
8375										</label>
8376									</span>
8377								</div>
8378								<div class="date-box">
8379									<div class="modal-field sdate">
8380										<label>&nbsp;</label>
8381										<input class="daytime start" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayStart}" data-raw="${startDate}" readonly>
8382										<span class="daytime daytime-html start stimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${startDate}" readonly>${displayStartText}</span>
8383									</div>
8384									<span class="middle"> ~ </span>
8385									<div class="modal-field edate">
8386										<input class="daytime end" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayEnd}" data-raw="${endDate}" readonly>
8387										<span class="daytime daytime-html end etimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${endDate}" readonly>${displayEndText}</span>
8388									</div>
8389								</div>
8390								<div class="modal-field content">
8391									<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M2 5h16v1H2z"/><path d="M2 9h16v1H2z"/><path d="M2 13h8v1H2z"/><path d="M50 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5"/><path d="M46 3c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Z"/></svg></label>
8392									<textarea placeholder="${$.lang[locale]['config.calendar.content.placeholder']}"></textarea>
8393								</div>
8394							</div>
8395							<div class="calendar-modal-footer">
8396								<button class="modal-save">${$.lang[locale]['config.save']}</button>
8397							</div>
8398						</div>
8399					</div>`;
8400
8401			} else {
8402				var startDate, endDate;
8403				if(data.extendedProps.fulltime == 'Y') {
8404					startDate = data.extendedProps.start_date;
8405					endDate = data.extendedProps.end_date;
8406				} else {
8407					startDate = data.extendedProps.start_date + ' ' + data.extendedProps.s_time,
8408            		endDate = data.extendedProps.end_date + ' ' + data.extendedProps.e_time;
8409				}
8410
8411				const displayStart = formatDateLocalized(startDate, locale);
8412        		const displayEnd   = formatDateLocalized(endDate, locale);
8413				const displayStartText = formatDateLocalized(startDate, locale, 1);
8414        		const displayEndText   = formatDateLocalized(endDate, locale, 1);
8415
8416				var modalHtml = `
8417					<div class="calendar-modal-overlay" style="display:none;">
8418						<div class="calendar-modal-container">
8419							<div class="calendar-modal-header">
8420								<button class="back-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
8420<path d="m17.35 2.71-.7-.71-9.3 9.29-.7.71 10 10 .7-.71L8.06 12l9.29-9.29z"/></svg></button>
8421								<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21 3.71 20.29 3 12 11.29 3.71 3 3 3.71 11.29 12 3 20.29l.71.71L12 12.71 20.29 21l.71-.71L12.71 12 21 3.71z"/></svg></button>
8422							</div>
8423							<div class="calendar-modal-body">
8424								<input type="hidden" class="pass" value="Y">
8425								<input type="hidden" class="seq" value="${data.extendedProps.seq}">
8426								<input type="hidden" id='sale-start-datetime' value="">
8427								<div class="title-modify">
8428									<div class="cfull-box">
8429										<div class="col-box"><input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color:${data.backgroundColor};" readonly></div>
8430										<div class="ccol-box">
8431											<input type="text" data-color="#ff6f61" class="scheduleColor sc1" readonly>
8432											<input type="text" data-color="#f63824" class="scheduleColor sc2" readonly>
8433											<input type="text" data-color="#ee6c3b" class="scheduleColor sc3" readonly>
8434											<input type="text" data-color="#fcbf54" class="scheduleColor sc4" readonly>
8435											<input type="text" data-color="#14c285" class="scheduleColor sc5" readonly>
8436											<input type="text" data-color="#1d9f54" class="scheduleColor sc6" readonly><br>
8437											<input type="text" data-color="#3498db" class="scheduleColor sc7" readonly>
8438											<input type="text" data-color="#022b79" class="scheduleColor sc8" readonly>
8439											<input type="text" data-color="#9b59b6" class="scheduleColor sc9" readonly>
8440											<input type="text" data-color="#e91e63" class="scheduleColor sc10" readonly>
8441											<input type="text" data-color="#566573" class="scheduleColor sc11" readonly>
8442											<input type="text" data-color="#95a5a6" class="scheduleColor sc12" readonly>
8443										</div>
8444									</div>
8445									<span class="modal-title"><input type="text" class="ctitle" value="${data._def.title}" placeholder="${$.lang[locale]['config.calendar.title.placeholder']}" maxlength="200"></span>
8446								</div>
8447								<div class="modal-field all">
8448									<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M14 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5Z" style="fill:#cool-grey ;"/><path d="M10 2c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Zm0 15c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7c0 3.86-3.14 7-7 7Z" style="fill:#cool-grey ;"/></svg></label>
8449									<label for="all-day">${$.lang[locale]['config.calendar.fulltime']}</label>
8450									<span class="bc-tp-btn switch-wrap">
8451										<label class="switch prop-wrap">
8452											<input type="checkbox" class="switch-input all-day" id="all-day" data-el="${selectEL}" ${(data.extendedProps.fulltime == 'Y') ? 'checked' : ''}>
8453											<span class="switch-label" data-on="On" data-off="Off"></span>
8454											<span class="switch-handle"></span>
8455										</label>
8456									</span>
8457								</div>
8458								<div class="date-box">
8459									<div class="modal-field sdate">
8460										<label>&nbsp;</label>
8461										<input class="daytime start" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayStart}" data-raw="${startDate}" readonly>
8462										<span class="daytime daytime-html start stimepicker" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${startDate}" readonly>${displayStartText}</span>
8463									</div>
8464									<span class="middle"> ~ </span>
8465									<div class="modal-field edate">
8466										<input class="daytime end" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayEnd}" data-raw="${endDate}" readonly>
8467										<span class="daytime daytime-html end etimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${endDate}" readonly>${displayEndText}</span>
8468									</div>
8469								</div>
8470								<div class="modal-field content">
8471									<label><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M2 5h16v1H2z"/><path d="M2 9h16v1H2z"/><path d="M2 13h8v1H2z"/><path d="M50 9.5h-3.5V5c0-.28-.22-.5-.5-.5s-.5.22-.5.5v5c0 .28.22.5.5.5h4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5"/><path d="M46 3c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8Z"/></svg></label>
8472                            		<textarea placeholder="${$.lang[locale]['config.calendar.content.placeholder']}">${data.extendedProps.memo}</textarea>
8473								</div>
8474							</div>
8475							<div class="calendar-modal-footer">
8476								<button class="modal-modify">${$.lang[locale]['config.save']}</button>
8477							</div>
8478						</div>
8479					</div>`;
8480			}
8481
8482			$('.userEL'+pid).find(".calendarModal").append(modalHtml);
8483			calendarOverlayIn(pid);
8484			$('.userEL'+pid).find(".calendar-modal-overlay").fadeIn(200);
8485			$('.userEL'+pid).find('.ctitle').focus();
8486			refitAll();
8487		}
8488
8489		function formatTime(time, locale) {
8490			let [hour, minute] = time.split(':').map(Number);
8491
8492			let period = hour < 12 ? $.lang[locale]['config.calendar.am'] : $.lang[locale]['config.calendar.pm'];
8493			let hour12 = hour % 12 || 12;
8494			let minuteText = minute.toString().padStart(2, '0');
8495
8496			return `${period} ${hour12}:${minuteText}`;
8497		}
8498
8499		function toDateStr(d) {
8500			if (!d) return '';
8501			const y = d.getFullYear();
8502			const m = String(d.getMonth() + 1).padStart(2, '0');
8503			const day = String(d.getDate()).padStart(2, '0');
8504			return `${y}-${m}-${day}`;
8505		}
8506
8507		function fmtHMFromDate(d, locale) {
8508			if (!d) return '';
8509			const hour = d.getHours();
8510			const minute = String(d.getMinutes()).padStart(2,'0');
8511			if (locale === 'ko') {
8512				const period = hour < 12 ? $.lang[locale]['config.calendar.am'] : $.lang[locale]['config.calendar.pm'];
8513				const hour12 = hour % 12 || 12;
8514				return `${period} ${hour12}:${minute}`;
8515			}
8516			return new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit' }).format(d);
8517		}
8518
8519		function openMoreEventsModal(pid, events, weekday) {
8520			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8521			if (!Array.isArray(events)) {
8522				events = [events];
8523			}
8524
8525			lastEventsList = events;
8526			lastEventsWeekday = weekday;
8527			const dayNum = weekday[0].getDate();
8528
8529			const filteredEvents = events.filter(ev => !(ev.classNames && ev.classNames.includes('holiday-event')));
8530
8531			const sorted = filteredEvents.slice().sort((a, b) => {
8532				const isMulti = (ev) => {
8533					const sd = ev.extendedProps?.start_date;
8534					const ed = ev.extendedProps?.end_date;
8535					if (sd && ed && sd !== ed) return true; 
8536					if (ev.allDay && ev.start && ev.end) return (ev.end - ev.start) >= 86400000;
8537					return false;
8538				};
8539
8540				const am = isMulti(a), bm = isMulti(b);
8541				if (am !== bm) return am ? -1 : 1;   
8542
8543				const as = a.start ? a.start.getTime() : 0;
8544				const bs = b.start ? b.start.getTime() : 0;
8545				if (as !== bs) return as - bs;
8546
8547				const ae = a.end ? a.end.getTime() : Number.POSITIVE_INFINITY;
8548				const be = b.end ? b.end.getTime() : Number.POSITIVE_INFINITY;
8549				if (ae !== be) return ae - be;
8550
8551				return (a.title || '').localeCompare(b.title || '');
8552			});
8553
8554			const googleColorRaw = (googleColor && googleColor.get(pid)) || '';
8555    		const googleColorHex = googleColorRaw ? (googleColorRaw.startsWith('#') ? googleColorRaw : ('#' + googleColorRaw)) : ''; 
8556
8557			$(".calendar-modal-overlay").remove();
8558			let modalHtml = `
8559				<div class="calendar-modal-overlay" style="display:none;">
8560					<div class="calendar-modal-container">
8561						<div class="calendar-modal-header">
8562							<h4>${dayNum} <span>${weekday[1]}</span></h4>
8563							<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M17.85 17.15 10.7 10l7.15-7.15c.2-.19.2-.51.01-.71-.19-.2-.51-.2-.71-.01l-.01.01-7.15 7.15-7.14-7.14a.504.504 0 0 0-.71.01c-.19.19-.19.5 0 .69L9.29 10l-7.15 7.15c-.2.19-.2.51-.01.71.19.2.51.2.71.01l.01-.01L10 10.71l7.15 7.15c.19.2.51.2.71.01.2-.19.2-.51.01-.71l-.01-.01Z"/></svg></button>
8564						</div>
8565						<div class="calendar-modal-body">
8566							<input type="hidden" id='sale-start-datetime' value="">
8567							<div class="schedule-list">
8568								<ul>
8569			`;
8570
8571			for (let i = 0; i < sorted.length; i++) {
8572				var ev = sorted[i];
8573				const locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8574
8575				let sdate = ev.extendedProps?.start_date || '';
8576				let edate = ev.extendedProps?.end_date || '';
8577				let fulltimeFlag = ev.extendedProps?.fulltime; // 'Y' 또는 'N' 기대
8578
8579				const isAllDay = (fulltimeFlag === 'Y') || (!!ev.allDay);
8580
8581				if (!sdate && ev.start) sdate = toDateStr(ev.start);
8582
8583				if (!edate) {
8584					if (ev.end) {
8585						if (isAllDay) {
8586							const d = new Date(ev.end);
8587							d.setDate(d.getDate() - 1);
8588							edate = toDateStr(d);
8589						} else {
8590							edate = toDateStr(ev.end);
8591						}
8592					} else {
8593						edate = sdate; // 끝이 없으면 시작과 동일
8594					}
8595				}
8596
8597				let	schedule_time = '';
8598				if (sdate !== edate) {
8599					if (isAllDay) {
8600						schedule_time = `${sdate.slice(5)} ~ ${edate.slice(5)}`;
8601					} else {
8602						schedule_time = `${sdate.slice(5)} ${fmtHMFromDate(ev.start, locale)} ~ ${edate.slice(5)} ${fmtHMFromDate(ev.end, locale)}`;
8603					}
8604				} else {
8605					schedule_time = isAllDay ? '' : `${fmtHMFromDate(ev.start, locale)} ~ ${fmtHMFromDate(ev.end, locale)}`;
8606				}
8607
8608				const isFullLabel = isAllDay ? $.lang[locale]['config.calendar.fulltime'] : fmtHMFromDate(ev.start, locale);
8609				const isGoogle = !!ev.extendedProps?.isGoogle;
8610				const noTitleText = (locale === 'ko') ? '(제목 없음)' : '(No title)';
8611				const rawTitle = (typeof ev.title === 'string' && ev.title) || (ev._def && typeof ev._def.title === 'string' && ev._def.title) || (ev.extendedProps && typeof ev.extendedProps.summary === 'string' && ev.extendedProps.summary) || '';
8612				const titleSafe = rawTitle.trim() !== 'undefined' ? rawTitle : noTitleText;
8613				const bgColor = (() => {
8614					const own = ev.backgroundColor || ev.borderColor || '';
8615					if (isGoogle) {
8616						return own || googleColorHex || '#4789e7';
8617					}
8618					return own || '#4789e7';
8619				})();
8620
8621				modalHtml += `
8622					<li class="schedule-view" data-index="${i}">
8623					<div class="left-wrap">
8624						<input type="text" class="scheduleColorPicker color2"
8625						data-color="${bgColor}"
8626						style="background-color:${bgColor}" readonly>
8627						<span>${isFullLabel}</span>
8628					</div>
8629					<div class="right-wrap">
8630						<div class="schedule-title">${titleSafe} ${isGoogle ? '' : ''}</div>
8631						<div class="schedule-time">${schedule_time}</div>
8632					</div>
8633					</li>
8634				`;
8635			}
8636
8637			modalHtml += `
8638								</ul>
8639							</div>
8640						</div>`;
8641			if (property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8642				modalHtml += `<div class="schedule-plus-box">
8643								<button class="schedule-plus pc">${$.lang[locale]['config.calendar.schedule-plus']}</button>
8644                    			<button class="schedule-plus mobile"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M18 9h-7V2H9v7H2v2h7v7h2v-7h7V9z"/></svg></button>
8645							</div>`;
8646			}
8647			modalHtml += `</div></div>`;
8648
8649			const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
8650			$modalWrapper.append(modalHtml);
8651			calendarOverlayIn(pid);
8652			$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
8653
8654			$modalWrapper.off('click', '.schedule-view').on('click', '.schedule-view', function () {
8655				const index = $(this).data('index');
8656				const eventData = sorted[index];
8657				currentEvent = eventData;
8658
8659				showCalendarModalView(pid, eventData, true); 
8660			});
8661
8662			$modalWrapper.off('click', '.schedule-plus').on('click', '.schedule-plus', function () {
8663				const year = weekday[0].getFullYear();
8664				const month = String(weekday[0].getMonth() + 1).padStart(2, '0');
8665				const day = String(weekday[0].getDate()).padStart(2, '0');
8666				var startDate = `${year}-${month}-${day} 12:00`;
8667				var endDate = `${year}-${month}-${day} 13:00`;
8668				var date = [startDate, endDate];
8669				showCalendarModalEdit(pid, 0, date);
8670			});
8671		}
8672
8673		// function openMoreEventsModal(pid, events, weekday) {
8674		// 	var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8675		// 	if (!Array.isArray(events)) {
8676		// 		events = [events];
8677		// 	}
8678
8679		// 	lastEventsList = events;
8680		// 	lastEventsWeekday = weekday;
8681		// 	const dayNum = weekday[0].getDate();
8682
8683		// 	const filteredEvents = events.filter(ev => !(ev.classNames && ev.classNames.includes('holiday-event')));
8684
8685		// 	const sorted = filteredEvents.slice().sort((a, b) => {
8686		// 		const isMulti = (ev) => {
8687		// 			const sd = ev.extendedProps?.start_date;
8688		// 			const ed = ev.extendedProps?.end_date;
8689		// 			if (sd && ed && sd !== ed) return true; 
8690		// 			if (ev.allDay && ev.start && ev.end) return (ev.end - ev.start) >= 86400000;
8691		// 			return false;
8692		// 		};
8693
8694		// 		const am = isMulti(a), bm = isMulti(b);
8695		// 		if (am !== bm) return am ? -1 : 1;   
8696
8697		// 		const as = a.start ? a.start.getTime() : 0;
8698		// 		const bs = b.start ? b.start.getTime() : 0;
8699		// 		if (as !== bs) return as - bs;
8700
8701		// 		const ae = a.end ? a.end.getTime() : Number.POSITIVE_INFINITY;
8702		// 		const be = b.end ? b.end.getTime() : Number.POSITIVE_INFINITY;
8703		// 		if (ae !== be) return ae - be;
8704
8705		// 		return (a.title || '').localeCompare(b.title || '');
8706		// 	});
8707
8708		// 	$(".calendar-modal-overlay").remove();
8709		// 	let modalHtml = `
8710		// 		<div class="calendar-modal-overlay" style="display:none;">
8711		// 			<div class="calendar-modal-container">
8712		// 				<div class="calendar-modal-header">
8713		// 					<h4>${dayNum} <span>${weekday[1]}</span></h4>
8714		// 					<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M17.85 17.15 10.7 10l7.15-7.15c.2-.19.2-.51.01-.71-.19-.2-.51-.2-.71-.01l-.01.01-7.15 7.15-7.14-7.14a.504.504 0 0 0-.71.01c-.19.19-.19.5 0 .69L9.29 10l-7.15 7.15c-.2.19-.2.51-.01.71.19.2.51.2.71.01l.01-.01L10 10.71l7.15 7.15c.19.2.51.2.71.01.2-.19.2-.51.01-.71l-.01-.01Z"/></svg></button>
8715		// 				</div>
8716		// 				<div class="calendar-modal-body">
8717		// 					<input type="hidden" id='sale-start-datetime' value="">
8718		// 					<div class="schedule-list">
8719		// 						<ul>
8720		// 	`;
8721
8722		// 	for (let i = 0; i < sorted.length; i++) {
8723		// 		var ev = sorted[i],
8724		// 			sdate = ev.extendedProps.start_date,
8725		// 			edate = ev.extendedProps.end_date,
8726		// 			schedule_time = '';
8727		// 		if(sdate != edate) {
8728		// 			schedule_time = sdate.split('-')[1] + '.' + sdate.split('-')[2] + ' ' + formatTime(ev.extendedProps.s_time, locale) +' ~ ' + edate.split('-')[1] + '.' + edate.split('-')[2] + ' ' + formatTime(ev.extendedProps.e_time, locale);
8729		// 		} else {
8730		// 			schedule_time = (ev.extendedProps.fulltime == 'Y') ? '' : `${formatTime(ev.extendedProps.s_time, locale)} ~ ${formatTime(ev.extendedProps.e_time, locale)}`;
8731		// 		}
8732		// 		const isFull = (ev.extendedProps.fulltime == 'Y') ? $.lang[locale]['config.calendar.fulltime'] : formatTime(ev.extendedProps.s_time, locale);
8733
8734		// 		modalHtml += `
8735		// 			<li class="schedule-view" data-index="${i}">
8736		// 				<div class="left-wrap">
8737		// 					<input type="text" class="scheduleColorPicker color2"
8738		// 						data-color="${ev.backgroundColor}"
8739		// 						style="background-color: ${ev.backgroundColor}" readonly>
8740		// 					<span>${isFull}</span>
8741		// 				</div>
8742		// 				<div class="right-wrap">
8743		// 					<div class="schedule-title">${ev._def.title}</div>
8744		// 					<div class="schedule-time">
8745		// 						${schedule_time}
8746		// 					</div>
8747		// 				</div>
8748		// 			</li>
8749		// 		`;
8750		// 	}
8751
8752		// 	modalHtml += `
8753		// 						</ul>
8754		// 					</div>
8755		// 				</div>`;
8756		// 	if (property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8757		// 		modalHtml += `<div class="schedule-plus-box">
8758		// 						<button class="schedule-plus pc">${$.lang[locale]['config.calendar.schedule-plus']}</button>
8759        //             			<button class="schedule-plus mobile"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path d="M18 9h-7V2H9v7H2v2h7v7h2v-7h7V9z"/></svg></button>
8760		// 					</div>`;
8761		// 	}
8762		// 	modalHtml += `</div></div>`;
8763
8764		// 	const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
8765		// 	$modalWrapper.append(modalHtml);
8766		// 	calendarOverlayIn(pid);
8767		// 	$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
8768
8769		// 	$modalWrapper.off('click', '.schedule-view').on('click', '.schedule-view', function () {
8770		// 		const index = $(this).data('index');
8771		// 		const eventData = sorted[index];
8772		// 		currentEvent = eventData;
8773
8774		// 		showCalendarModalView(pid, eventData, true); 
8775		// 	});
8776
8777		// 	$modalWrapper.off('click', '.schedule-plus').on('click', '.schedule-plus', function () {
8778		// 		const year = weekday[0].getFullYear();
8779		// 		const month = String(weekday[0].getMonth() + 1).padStart(2, '0');
8780		// 		const day = String(weekday[0].getDate()).padStart(2, '0');
8781		// 		var startDate = `${year}-${month}-${day} 12:00`;
8782		// 		var endDate = `${year}-${month}-${day} 13:00`;
8783		// 		var date = [startDate, endDate];
8784		// 		showCalendarModalEdit(pid, 0, date);
8785		// 	});
8786		// }
8787
8788		function buildFcEvents(events) {
8789			function addDaysStr(ymd, days) {
8790				// ymd가 없거나 이상하면 오늘을 기준으로 보정
8791				if (!ymd || typeof ymd !== 'string' || ymd.length < 8) {
8792				const t = new Date();
8793				t.setDate(t.getDate() + (days || 0));
8794				const yy = t.getFullYear();
8795				const mm = String(t.getMonth() + 1).padStart(2, '0');
8796				const dd = String(t.getDate()).padStart(2, '0');
8797				return `${yy}-${mm}-${dd}`;
8798				}
8799				const [y, m, d] = ymd.split('-').map(Number);
8800				const dt = new Date((y || new Date().getFullYear()), (m ? m - 1 : 0), (d || 1));
8801				dt.setDate(dt.getDate() + (days || 0));
8802				const yy = dt.getFullYear();
8803				const mm = String(dt.getMonth() + 1).padStart(2, '0');
8804				const dd = String(dt.getDate()).padStart(2, '0');
8805				return `${yy}-${mm}-${dd}`;
8806			}
8807
8808			// 허용: "9:05", "23:45", "23:45:00" (앞뒤 공백 허용)
8809			const TIME_RX = /^\s*\d{1,2}:\d{2}(?::\d{2})?\s*$/;
8810			const toHM = (t) => {
8811				if (!t || typeof t !== 'string') return '00:00';
8812				const parts = t.trim().split(':');   // ["HH","mm"] 또는 ["HH","mm","ss"]
8813				const Hn = parseInt(parts[0], 10);
8814				const Mn = parseInt(parts[1] ?? '0', 10);
8815				const HH = isFinite(Hn) ? String(Hn).padStart(2, '0') : '00';
8816				const MM = isFinite(Mn) ? String(Mn).padStart(2, '0') : '00';
8817				return `${HH}:${MM}`;
8818			};
8819
8820			const mapped = (events || []).map(e => {
8821				let settings = {};
8822				try { settings = JSON.parse(e?.settings || '{}'); } catch {}
8823
8824				const isHoliday = e?.seq && String(e.seq).startsWith('holiday_');
8825
8826				// 날짜 확보: s_date/e_date → start/end → 오늘
8827				let sDate = (e?.s_date || '').slice(0, 10);
8828				let eDate = (e?.e_date || '').slice(0, 10);
8829
8830				if (!sDate && typeof e?.start === 'string') sDate = e.start.slice(0, 10);
8831				if (!eDate && typeof e?.end   === 'string') eDate = e.end.slice(0, 10);
8832				if (!sDate) {
8833				const t = new Date();
8834				sDate = `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`;
8835				}
8836				if (!eDate) eDate = sDate;
8837
8838				// 시간 정규화
8839				const sHasTime = TIME_RX.test(e?.s_time || '');
8840				const eHasTime = TIME_RX.test(e?.e_time || '');
8841				const sTime = sHasTime ? toHM(e.s_time) : '00:00';
8842				const eTime = eHasTime ? toHM(e.e_time) : (sHasTime ? toHM(e.s_time) : '00:00');
8843
8844				// fulltime 플래그
8845				const fullTFlag = (e?.fulltime === 'Y');
8846
8847				// 시간이 둘 다 있으면 무조건 timed, 아니면 fullTFlag/날짜 범위로 all-day
8848				const isTimed = (sHasTime && eHasTime) && !fullTFlag;
8849				const fullT = !isTimed && (fullTFlag || sDate < eDate);
8850
8851				// ── 공휴일(배경)
8852				if (isHoliday) {
8853				const endPlus1 = addDaysStr(eDate, 1);
8854				return {
8855					id: `holiday_${sDate}_${settings.title || e.title}`,
8856					title: e?.title || settings.title || '',
8857					start: `${sDate}T00:00`,
8858					end:   `${endPlus1}T00:00`,
8859					allDay: true,
8860					display: 'background',
8861					classNames: ['holiday-event'],
8862					start_date: sDate,
8863					end_date: eDate,
8864				};
8865				}
8866
8867				let startISO, endISO, allDayFlag;
8868
8869				if (isTimed) {
8870					allDayFlag = false;
8871					startISO = `${sDate}T${sTime}`;
8872					endISO   = `${eDate}T${eTime}`;
8873
8874					// Invalid Date 방지: 유효하지 않으면 보정
8875					let s = new Date(startISO);
8876					let t = new Date(endISO);
8877					if (isNaN(s.getTime())) s = new Date(`${sDate}T00:00`);
8878					if (isNaN(t.getTime())) t = new Date(`${eDate}T${eTime || '00:00'}`);
8879
8880					// end < start → 동일 시각(0-duration)
8881					if (t.getTime() < s.getTime()) t = new Date(s.getTime());
8882
8883					// 같은 날짜인데 end가 다음날 00:00 경계로 넘어가면 23:59로 클램프
8884					const sameYMD = (a, b) => a.getFullYear()===b.getFullYear() && a.getMonth()===b.getMonth() && a.getDate()===b.getDate();
8885					if (!sameYMD(s, t) && sDate === eDate && t.getHours() === 0 && t.getMinutes() === 0) {
8886						t = new Date(s); t.setHours(23, 59, 0, 0);
8887					}
8888
8889					// (선택) 0-duration 렌더 꼬임 방지 +1분
8890					if (t.getTime() === s.getTime()) t = new Date(t.getTime() + 60 * 1000);
8891
8892					// ISO 재조립
8893					const yy = t.getFullYear();
8894					const mm = String(t.getMonth() + 1).padStart(2, '0');
8895					const dd = String(t.getDate()).padStart(2, '0');
8896					const HH = String(t.getHours()).padStart(2, '0');
8897					const MI = String(t.getMinutes()).padStart(2, '0');
8898					endISO = `${yy}-${mm}-${dd}T${HH}:${MI}`;
8899				} else {
8900					// all-day: end는 익스클루시브(+1일)
8901					allDayFlag = true;
8902					startISO = `${sDate}T00:00`;
8903					const endPlus1 = addDaysStr(eDate, 1);
8904					endISO   = `${endPlus1}T00:00`;
8905				}
8906
8907				const isMulti = (sDate && eDate && sDate !== eDate) || (allDayFlag && sDate !== eDate);
8908
8909				return {
8910				title: e?.title || settings.title || '',
8911				start: startISO,
8912				end:   endISO,
8913				allDay: allDayFlag,
8914				color: settings.color || '#4789e7',
8915				multiOrder: isMulti ? 0 : 1,
8916				memo: e?.memo,
8917				pid: e?.pid,
8918				seq: e?.seq,
8919				s_time: e?.s_time,
8920				e_time: e?.e_time,
8921				start_date: sDate,
8922				end_date: eDate,
8923				fulltime: e?.fulltime,
8924				classNames: []
8925				};
8926			});
8927
8928			// 인터페이스 유지
8929			// console.log(calendarElsettings)
8930			let pid = null;
8931
8932			if (Array.isArray(events) && events.length > 0) {
8933				pid = events[0].pid || null;
8934			}
8935
8936			const calendarFlag = (pid && calendarElsettings.get(pid) === true);
8937			return calendarFlag ? mapped : mapped.filter(ev => ev.classNames.includes('holiday-event'));
8938		}
8939
8940		function getClickedDateStrAccurate(info) {
8941			const stack = (info.jsEvent && document.elementsFromPoint)
8942				? document.elementsFromPoint(info.jsEvent.clientX, info.jsEvent.clientY)
8943				: [];
8944
8945			const cell = stack.find(el => el && el.getAttribute && el.getAttribute('data-date'));
8946
8947			if (cell) return cell.getAttribute('data-date');
8948
8949			const byClosest = info.el.closest('.fc-daygrid-day[data-date], .fc-timegrid-col[data-date], [data-date]');
8950			if (byClosest) return byClosest.getAttribute('data-date');
8951
8952			return (info.event.startStr || '').split('T')[0];
8953		}
8954
8955		function ymKey(d){ return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`; }
8956
8957		function ymAdd(ym, delta) {
8958			const [y, m] = ym.split('-').map(Number);
8959			const n = y * 12 + (m - 1) + delta;
8960			const yy = Math.floor(n / 12), mm = (n % 12) + 1;
8961			return `${yy}-${String(mm).padStart(2, '0')}`;
8962		}
8963
8964		function monthsBetweenInclusive(sYmd, eYmd) {
8965			const out = [];
8966			const [sy, sm] = sYmd.split('-').map(Number);
8967			const [ey, em] = eYmd.split('-').map(Number);
8968			let y = sy, m = sm;
8969			while (y < ey || (y === ey && m <= em)) {
8970				out.push(`${y}-${String(m).padStart(2, '0')}`);
8971				m++;
8972				if (m === 13) { m = 1; y++; }
8973			}
8974			return out;
8975		}
8976
8977		function invalidateAround(pid, ym) { // ym: 'YYYY-MM'
8978			const pidMap = monthCache.get(pid);
8979			if (!pidMap) return;
8980
8981			const [y, m] = ym.split('-').map(Number);
8982			const prev = new Date(y, m - 2, 1);
8983			const cur  = new Date(y, m - 1, 1);
8984			const next = new Date(y, m, 1);
8985
8986			[prev, cur, next].forEach(d => {
8987				const key = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
8988				pidMap.delete(key);
8989			});
8990		}
8991
8992		// 서버에서 내려온 3개월치 data를 달별로 분배해서 병합
8993		function upsertMonthCacheFromServer(pid, serverEvents) {
8994			if (!serverEvents) return;
8995			let pidMap = monthCache.get(pid);
8996			if (!pidMap) {
8997				pidMap = new Map();
8998				monthCache.set(pid, pidMap);
8999			}
9000
9001			const mapped = buildFcEvents(serverEvents) || [];  // ★ 동일 포맷으로 맞춤
9002			const bucket = new Map(); // key: 'YYYY-MM' -> ev[]
9003			for (const ev of mapped) {
9004				// 시작/끝 계산 (all-day 및 00:00 경계 보정)
9005				const s0 = new Date(ev.start);
9006				const e0 = new Date(ev.end);
9007				const s  = new Date(s0);
9008				const e  = new Date(e0);
9009
9010				// 종일(Y) 또는 end가 00:00:00인 경우 표시용 inclusive 보정
9011				if (ev.fulltime === 'Y' || ev.allDay) {
9012				e.setDate(e.getDate() - 1);
9013				} else if (e0.getHours() === 0 && e0.getMinutes() === 0 && e0.getSeconds() === 0) {
9014				e.setMilliseconds(e.getMilliseconds() - 1);
9015				}
9016
9017				const cur = new Date(s.getFullYear(), s.getMonth(), 1);
9018				const last = new Date(e.getFullYear(), e.getMonth(), 1);
9019				while (cur <= last) {
9020				const key = ymKey(cur);
9021				if (!bucket.has(key)) bucket.set(key, []);
9022				bucket.get(key).push(ev);
9023				cur.setMonth(cur.getMonth() + 1);
9024				}
9025			}
9026
9027			for (const [key, arr] of bucket.entries()) {
9028				const prev = pidMap.get(key) || [];
9029				const seen = new Set();
9030				const merged = [];
9031				for (const item of [...prev, ...arr]) {
9032				const k = `${item.id || item.seq || item.title}|${item.start}|${item.end}|${item.allDay ? 1 : 0}`;
9033				if (!seen.has(k)) { seen.add(k); merged.push(item); }
9034				}
9035				pidMap.set(key, merged);
9036			}
9037		}
9038
9039		function monthsAround(ym) {
9040			const [y, m] = ym.split('-').map(Number);
9041			const prev = new Date(y, m - 2, 1);
9042			const cur  = new Date(y, m - 1, 1);
9043			const next = new Date(y, m, 1);
9044			return [prev, cur, next].map(d => `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`);
9045		}
9046
9047		// 전/당/다음 달 캐시 무효화
9048		function invalidateAround(pid, ym) {
9049			const pidMap = monthCache.get(pid);
9050			if (!pidMap) return;
9051
9052			const [y, m] = ym.split('-').map(Number);
9053			const prev = new Date(y, m - 2, 1);  // 전월
9054			const cur  = new Date(y, m - 1, 1);  // 당월
9055			const next = new Date(y, m, 1);      // 다음월
9056
9057			[prev, cur, next].forEach(d => {
9058				const key = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
9059				pidMap.delete(key);
9060			});
9061		}
9062
9063		function monthsInRange(start, end){
9064			const arr = [];
9065			const d = new Date(start.getFullYear(), start.getMonth(), 1);
9066			while (d <= end) { arr.push(ymKey(d)); d.setMonth(d.getMonth()+1); }
9067			return arr;
9068		}
9069
9070		// 세 달(전월/해당월/다음월)을 한 번에 받아 캐시에 분산 저장
9071		function fetchMonth(pid, yearMonth, data_type) {
9072			let pidCache = monthCache.get(pid);
9073			let pidInflight = inflight.get(pid);
9074			if (!pidCache) { pidCache = new Map(); monthCache.set(pid, pidCache); }
9075			if (!pidInflight) { pidInflight = new Map(); inflight.set(pid, pidInflight); }
9076
9077			// 이미 캐시되어 있으면 재사용
9078			if (pidCache.has(yearMonth)) return Promise.resolve(pidCache.get(yearMonth));
9079			// 동일 YM에 대한 진행중 요청이 있으면 그것을 공유
9080			if (pidInflight.has(yearMonth)) return pidInflight.get(yearMonth);
9081
9082			const prevYM = ymAdd(yearMonth, -1);
9083			const nextYM = ymAdd(yearMonth, +1);
9084
9085			// 🔹 병합 유틸
9086			const dedupe = (list) => {
9087				const seen = new Set();
9088				const out = [];
9089				for (const ev of list) {
9090				const k = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
9091				if (!seen.has(k)) { seen.add(k); out.push(ev); }
9092				}
9093				return out;
9094			};
9095			const mergeSet = (cache, ym, arr) => {
9096				const prev = cache.get(ym) || [];
9097				const merged = dedupe(prev.concat(arr || []));
9098				cache.set(ym, merged);
9099			};
9100
9101			const p = new Promise((resolve, reject) => {
9102				$.ajax({
9103				url: '/template/get_calendar',
9104				type: 'POST',
9105				dataType: 'json',
9106				data: { sid: b.SID, pid, yearMonth, data_type },
9107				success: function(raw) {
9108					checkError(raw);
9109					// 서버 → FC 이벤트로 변환
9110					const all = buildFcEvents(raw) || [];
9111
9112					// 🔹 월 버킷팅
9113					const buckets = new Map();
9114					const put = (ym, ev) => {
9115					if (!buckets.has(ym)) buckets.set(ym, []);
9116					buckets.get(ym).push(ev);
9117					};
9118
9119					for (const ev of all) {
9120					const sStr = ev.start_date || (ev.start?.slice(0, 10)) || '';
9121					let eStr   = ev.end_date   || '';
9122
9123					if (!sStr) continue;
9124
9125					// end 보정 (종일: exclusive → inclusive / 00:00 경계 보정)
9126					if (!eStr) {
9127						if (ev.allDay && ev.end) eStr = addDaysStr(ev.end.slice(0, 10), -1);
9128						else if (ev.end)         eStr = ev.end.slice(0, 10);
9129						else                     eStr = sStr;
9130					} else {
9131						// 선택: 서버 end_date가 'YYYY-MM-DD' 00:00:00 의미라면 하루 빼기
9132						// 만약 서버 end_date가 이미 inclusive라면 이 블록은 제거하세요.
9133						// (현재 로직은 allDay에서만 -1 처리하므로 그대로 두는 게 안전)
9134					}
9135
9136					// 🔹 s~e 사이 모든 YM 버킷에 푸시
9137					const sYM = sStr.slice(0, 7);
9138					const eYM = eStr.slice(0, 7);
9139					for (const ym of monthsBetweenInclusive(sYM, eYM)) {
9140						put(ym, ev);
9141					}
9142					}
9143
9144					// 🔹 set → mergeSet 로 변경 (덮어쓰기 금지)
9145					mergeSet(pidCache, prevYM,   buckets.get(prevYM));
9146					mergeSet(pidCache, yearMonth, buckets.get(yearMonth));
9147					mergeSet(pidCache, nextYM,   buckets.get(nextYM));
9148
9149					// inflight 해제 (요청 공유했던 3개월 키 모두 제거)
9150					pidInflight.delete(prevYM);
9151					pidInflight.delete(yearMonth);
9152					pidInflight.delete(nextYM);
9153
9154					resolve(pidCache.get(yearMonth));
9155				},
9156				error: function(xhr, status, err) {
9157					pidInflight.delete(prevYM);
9158					pidInflight.delete(yearMonth);
9159					pidInflight.delete(nextYM);
9160					reject(err);
9161				}
9162				});
9163			});
9164
9165			// 동일 요청 공유 (3개월 모두 같은 Promise 공유)
9166			pidInflight.set(prevYM, p);
9167			pidInflight.set(yearMonth, p);
9168			pidInflight.set(nextYM, p);
9169
9170			return p;
9171		}
9172
9173		function calendarShow(elsettings) {
9174			return (
9175				property.UMEMBER.check_adm == true || 
9176				property.UMEMBER.check_uadm == true || 
9177				elsettings.read_chmod == 'all' || 
9178				(elsettings.read_chmod == 'admin' && property.UMEMBER.check_adm == true) || 
9179				(elsettings.read_chmod == 'admin' && property.UMEMBER.check_uadm == true) || 
9180				(elsettings.read_chmod == 'member' && property.UMEMBER.check_login == true) 
9181			);
9182		}
9183
9184		// 주/일 캘린더 공휴일 추가
9185		function headerRoot(view) {
9186			if (view && view.calendar && view.calendar.el) return view.calendar.el;
9187			if (view && view.el) return view.el;
9188			return document;
9189		}
9190		function fmtDate(d) {
9191			const y = d.getFullYear();
9192			const m = String(d.getMonth() + 1).padStart(2, '0');
9193			const dd = String(d.getDate()).padStart(2, '0');
9194			return `${y}-${m}-${dd}`;
9195		}
9196		function stripTime(d) {
9197			if (!(d instanceof Date)) return null;
9198			return new Date(d.getFullYear(), d.getMonth(), d.getDate());
9199		}
9200		function clearHolidayHeaderLabels(view) {
9201			const root = headerRoot(view);
9202			const header = root.querySelector('.fc-col-header');
9203			if (!header) return;
9204			header.querySelectorAll('.holiday-label').forEach(n => n.remove());
9205			header.querySelectorAll('.fc-col-header-cell-cushion.holiday-box')
9206					.forEach(el => el.classList.remove('holiday-box'));
9207		}
9208		function addHolidayHeaderLabel(view, dateStr, title) {
9209			const root = headerRoot(view);
9210			const header = root.querySelector('.fc-col-header');
9211			if (!header) return;
9212
9213			const th = header.querySelector(`[data-date="${dateStr}"]`);
9214			if (!th) return;
9215
9216			const inner = th.querySelector('.fc-scrollgrid-sync-inner') || th;
9217
9218			const cushion =
9219				inner.querySelector('.fc-col-header-cell-cushion') ||
9220				th.querySelector('.fc-col-header-cell-cushion') ||
9221				inner; 
9222			if (cushion && !cushion.classList.contains('holiday-box')) {
9223				cushion.classList.add('holiday-box');
9224			}
9225
9226			const exists = Array.from(inner.querySelectorAll('.holiday-label'))
9227				.some(el => el.textContent === (title || ''));
9228			if (!exists) {
9229				const label = document.createElement('span');
9230				label.className = 'holiday-label';
9231				label.textContent = title || '';
9232				inner.appendChild(label);
9233			}
9234		}
9235		function isHolidayEvent(ev) {
9236			const classes = ev.classNames || ev.extendedProps?.classNames || [];
9237			const hasHoliday = Array.isArray(classes) ? classes.includes('holiday-event') : (typeof classes === 'string' && classes.indexOf('holiday-event') > -1);
9238			return hasHoliday && ev.display === 'background';
9239		}
9240		function rebuildHolidayHeaderLabels(calendar) {
9241			const view = calendar.view;
9242			const vt = view?.type;
9243			if (!(vt === 'timeGridWeek' || vt === 'timeGridDay')) {
9244				clearHolidayHeaderLabels(view);
9245				return;
9246			}
9247
9248			const visibleStart = stripTime(view.activeStart);
9249			const visibleEnd   = stripTime(view.activeEnd); 
9250			if (!visibleStart || !visibleEnd) return;
9251
9252			clearHolidayHeaderLabels(view);
9253
9254			const map = {}; 
9255
9256			calendar.getEvents().forEach(ev => {
9257				if (!isHolidayEvent(ev)) return;
9258
9259				const evStart = stripTime(ev.start);
9260				if (!evStart) return; 
9261
9262				let evEnd = stripTime(ev.end);
9263				if (!evEnd) {
9264					evEnd = new Date(evStart);
9265					evEnd.setDate(evEnd.getDate() + 1);
9266				}
9267
9268				const s = new Date(Math.max(evStart.getTime(), visibleStart.getTime()));
9269				const e = new Date(Math.min(evEnd.getTime(), visibleEnd.getTime()));
9270				if (s >= e) return;
9271
9272				for (let d = new Date(s); d < e; d.setDate(d.getDate() + 1)) {
9273				const dateStr = fmtDate(d);
9274				(map[dateStr] ||= new Set()).add(ev.title || '');
9275				}
9276			});
9277
9278			Object.entries(map).forEach(([dateStr, titles]) => {
9279				titles.forEach(title => addHolidayHeaderLabel(view, dateStr, title));
9280			});
9281		}
9282		function setupHolidayHeaderHooks(calendar) {
9283			let t;
9284			const refresh = () => {
9285				clearTimeout(t);
9286				t = setTimeout(() => requestAnimationFrame(() => {
9287				rebuildHolidayHeaderLabels(calendar);
9288				rebuildMonthHolidayBoxes(calendar);
9289				}), 30);
9290			};
9291
9292			calendar.on('datesSet',   refresh);
9293			calendar.on('eventAdd',   refresh);
9294			calendar.on('eventChange',refresh);
9295			calendar.on('eventRemove',refresh);
9296			calendar.on('loading', (isLoading) => { if (!isLoading) refresh(); });
9297
9298			requestAnimationFrame(refresh);
9299		}
9300		//월간 공휴일
9301		function clearMonthHolidayBoxes(view) {
9302		const root = headerRoot(view);
9303		if (!root) return;
9304		root.querySelectorAll('.fc-daygrid-day-top.holiday-box')
9305			.forEach(n => n.classList.remove('holiday-box'));
9306		}
9307
9308		function rebuildMonthHolidayBoxes(calendar) {
9309			const view = calendar.view;
9310			if (!view || !view.type.startsWith('dayGrid')) {
9311				clearMonthHolidayBoxes(view);
9312				return;
9313			}
9314
9315			const locale = calendar.getOption("locale");
9316			if (locale != "ko") {
9317				clearMonthHolidayBoxes(view);
9318				return;
9319			}
9320
9321			const visibleStart = stripTime(view.activeStart);
9322			const visibleEnd   = stripTime(view.activeEnd); 
9323			if (!visibleStart || !visibleEnd) return;
9324
9325			clearMonthHolidayBoxes(view);
9326
9327			const hasHolidayMap = {}; 
9328			calendar.getEvents().forEach(ev => {
9329				if (!isHolidayEvent(ev) || !ev.start) return;
9330
9331				const evStart = stripTime(ev.start);
9332				let evEnd     = stripTime(ev.end);
9333				if (!evEnd) { evEnd = new Date(evStart); evEnd.setDate(evEnd.getDate() + 1); }
9334
9335				const s = new Date(Math.max(evStart.getTime(), visibleStart.getTime()));
9336				const e = new Date(Math.min(evEnd.getTime(),   visibleEnd.getTime()));
9337				if (s >= e) return;
9338
9339				for (let d = new Date(s); d < e; d.setDate(d.getDate() + 1)) {
9340				hasHolidayMap[fmtDate(d)] = true;
9341				}
9342			});
9343
9344			const root = headerRoot(view);
9345			root.querySelectorAll('.fc-daygrid-day').forEach(td => {
9346				const dateStr = td.getAttribute('data-date');
9347				if (!dateStr) return;
9348				const top = td.querySelector('.fc-daygrid-day-top');
9349				if (!top) return;
9350				if (hasHolidayMap[dateStr]) top.classList.add('holiday-box');
9351			});
9352		}
9353
9354		function fmt(dt) {
9355			const y  = dt.getFullYear();
9356			const m  = String(dt.getMonth() + 1).padStart(2, '0');
9357			const d  = String(dt.getDate()).padStart(2, '0');
9358			const hh = String(dt.getHours()).padStart(2, '0');
9359			const mm = String(dt.getMinutes()).padStart(2, '0');
9360			return `${y}-${m}-${d} ${hh}:${mm}`;
9361		}
9362
9363		function toYMDLocal(d) {
9364			if (!d) return '';
9365			const yy = d.getFullYear();
9366			const mm = String(d.getMonth() + 1).padStart(2, '0');
9367			const dd = String(d.getDate()).padStart(2, '0');
9368			return `${yy}-${mm}-${dd}`;
9369		}
9370
9371
9372		function initCalendar(pid, c, retryCount = 0) {
9373			var c = (typeof c != 'undefined') ? c : '';
9374			// console.log(pid);
9375			const MAX_RETRIES = 5;
9376			var containerEl = document.querySelector('.userEL' + pid + ' .calendar-container');
9377			var lang = document.querySelector('.calendar[data-id="' + pid + '"]').classList.contains('en');
9378    
9379			var language = 'ko';
9380			if(lang) language = 'en';
9381			else language = 'ko';
9382
9383			if (!containerEl) {
9384				if (retryCount < MAX_RETRIES) {
9385					setTimeout(() => initCalendar(pid, c, retryCount + 1), 300);
9386				} else {
9387					console.warn('initCalendar: containerEl을 찾을 수 없어 초기화를 중단합니다.');
9388				}
9389				return;
9390			}
9391
9392			containerEl.innerHTML = '';
9393
9394			var calendarEl = document.createElement('div');
9395			calendarEl.id = 'fc-calendar-' + pid;
9396			containerEl.appendChild(calendarEl);
9397
9398			var instance = $.cl_calendar.instances[pid],
9399				maxEvent = parseInt(containerEl.getAttribute('data-view')),
9400				elsettings = '',
9401				view_mode = 'dayGridMonth'; // 기본값
9402
9403			elsettings = JSON.parse(c.elsettings);
9404			if(elsettings.open_mwd == 'month') view_mode = 'dayGridMonth';
9405			else if(elsettings.open_mwd == 'week') view_mode = 'timeGridWeek';
9406			else if(elsettings.open_mwd == 'day') view_mode = 'timeGridDay';
9407
9408			const color = elsettings.google_color ? elsettings.google_color.trim() : '#4789e7';
9409			googleColor.set(pid, color);
9410			// console.log(`pid:${pid} => color:${color}`);
9411
9412			if(view_mode == 'timeGridWeek' && window.innerWidth < 768) {
9413				view_mode = 'dayGridMonth';
9414			}
9415
9416			//구글캘린더 연동
9417			const googleShow = (calendarElsettings.get(pid) === true);
9418			const eventSources = [
9419				function(fetchInfo, success, failure) {
9420					const data_type = ($('.userEL' + pid).attr('data-modoo-type')) || '';
9421					const keys = monthsInRange(fetchInfo.start, fetchInfo.end); // YYYY-MM 배열
9422
9423					// 각 월을 fetchMonth로 보장(캐시가 있으면 내부에서 스킵하게 구현)
9424					Promise.all(
9425						keys.map(k => fetchMonth(pid, k, data_type))
9426					)
9427					.then(() => {
9428						// 캐시에서 해당 범위의 이벤트 전부 모으기
9429						const pidCache = monthCache.get(pid) || new Map();
9430						const all = [];
9431						keys.forEach(k => {
9432							const arr = pidCache.get(k);
9433							if (arr && arr.length) all.push(...arr);
9434						});
9435
9436						const src = all;
9437
9438						const seen = new Set();
9439						const uniq = [];
9440						for (const ev of src) {
9441							const key = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
9442							if (!seen.has(key)) {
9443								seen.add(key);
9444								uniq.push(ev);
9445							}
9446						}
9447
9448						success(uniq);
9449					})
9450					.catch(failure);
9451				}
9452			];
9453
9454			// ✅ 2️⃣ 조건문으로 구글 캘린더/공휴일 캘린더를 추가
9455			const userCalendarId = elsettings.google_id; // 사용자 입력 또는 DB값
9456			const google_color = elsettings.google_color;
9457			const holidayCalendarId = 'ko.south_korea#[email protected]';
9458			const apiKey = elsettings.google_api;
9459			const googleSyncOn = String(elsettings.google_sync || '0') === '1';
9460
9461			function fmtHHMM(date) {
9462				if (!date) return '';
9463				const hh = String(date.getHours()).padStart(2, '0');
9464				const mm = String(date.getMinutes()).padStart(2, '0');
9465				return `${hh}:${mm}`;
9466			}
9467
9468			if (googleSyncOn && userCalendarId && userCalendarId.trim() !== '' && apiKey && googleShow) {
9469				eventSources.push({
9470					// 🔹 gcal 플러그인 대신 직접 Google Calendar API 호출
9471					events: function(fetchInfo, success, failure) {
9472						const params = new URLSearchParams({
9473							key: apiKey,
9474							timeMin: fetchInfo.startStr,
9475							timeMax: fetchInfo.endStr,
9476							singleEvents: 'true',
9477							orderBy: 'startTime'
9478						});
9479
9480						const url = `https://www.googleapis.com/calendar/v3/calendars/${
9481							encodeURIComponent(userCalendarId)
9482						}/events?${params.toString()}`;
9483
9484						fetch(url)
9485							.then(res => {
9486								if (!res.ok) throw new Error('Google Calendar API error: ' + res.status);
9487								return res.json();
9488							})
9489							.then(data => {
9490								const items = data.items || [];
9491								const googleColorHex = google_color || '#4789e7';
9492
9493								const fcEvents = items
9494									.filter(ev => ev.visibility !== 'private')  // 비공개는 아예 제외
9495									.map(ev => {
9496										const isAllDay = !!ev.start.date;
9497										const startStr = ev.start.dateTime || ev.start.date;
9498										const endStr   = (ev.end && (ev.end.dateTime || ev.end.date)) || startStr;
9499
9500										const start = startStr ? new Date(startStr) : null;
9501										const end   = endStr   ? new Date(endStr)   : null;
9502
9503										let start_date = '',
9504											end_date   = '',
9505											s_time     = '',
9506											e_time     = '',
9507											fulltime   = isAllDay ? 'Y' : 'N',
9508											memo       = '';
9509
9510										if (start) {
9511										start_date = fmtDate(start);
9512
9513										if (isAllDay) {
9514											if (end) {
9515											const d = new Date(end);
9516											d.setDate(d.getDate() - 1);
9517											end_date = fmtDate(d);
9518											} else {
9519											end_date = start_date;
9520											}
9521											s_time = '';
9522											e_time = '';
9523										} else {
9524											end_date = end ? fmtDate(end) : start_date;
9525											s_time   = fmtHHMM(start);
9526											e_time   = end ? fmtHHMM(end) : '';
9527										}
9528										}
9529
9530										// 🔹 제목 없는 이벤트 처리
9531										const hasTitle = ev.summary && ev.summary.trim().length > 0;
9532										const title    = hasTitle ? ev.summary.trim() : (language == 'ko') ? '(제목 없음)' : '(No title)';
9533
9534										// description → memo
9535										memo = (ev.description && typeof ev.description === 'string')
9536										? ev.description
9537										: '';
9538
9539										const googleColorHex = google_color || '#4789e7';
9540
9541										return {
9542											id: ev.id,
9543											title,                 // ✅ 여기서 (제목 없음)까지 세팅
9544											start: startStr,
9545											end: endStr,
9546											allDay: isAllDay,
9547											backgroundColor: googleColorHex,
9548											borderColor: googleColorHex,
9549											extendedProps: {
9550												...ev,
9551												isGoogle: true,
9552												start_date,
9553												end_date,
9554												s_time,
9555												e_time,
9556												fulltime,
9557												memo,
9558												backgroundColor: googleColorHex
9559											}
9560										};
9561									});
9562
9563								success(fcEvents);
9564							})
9565							.catch(err => {
9566								console.error('Google Calendar fetch error', err);
9567								failure(err);
9568							});
9569					},
9570
9571					// 아래 옵션들은 그대로 유지해도 됨
9572					color: google_color || '#4789e7',
9573					className: 'personal-events'
9574				});
9575			}
9576
9577			var calendar = new FullCalendar.Calendar(calendarEl, {
9578				initialView: view_mode,
9579				eventSources: eventSources,
9580				locale: language,
9581				locales: [
9582					{
9583						code: 'en',
9584						buttonText: {
9585							today: 'Today',
9586							month: 'Month',
9587							week: 'Week',
9588							day: 'Day',
9589							list: 'List',
9590							// 뷰별로 더 구체화도 가능
9591							dayGridMonth: 'Month',
9592							timeGridWeek: 'Week',
9593							timeGridDay: 'Day',
9594							listWeek: 'List',
9595						}
9596						},
9597						{
9598						code: 'ko',
9599						buttonText: {
9600							today: '오늘',
9601							month: '월',
9602							week: '주',
9603							day: '일',
9604							list: '목록',
9605							dayGridMonth: '월',
9606							timeGridWeek: '주',
9607							timeGridDay: '일',
9608							listWeek: '목록',
9609						}
9610					}
9611				],
9612				selectable: true,
9613				fixedWeekCount: false,
9614				showNonCurrentDates: true,
9615				eventDisplay: 'block',
9616				contentHeight: 'auto',
9617				expandRows: true,
9618				headerToolbar: {
9619					left: 'dayGridMonth,timeGridWeek,timeGridDay',
9620					center: 'prev,title,next',
9621					right: 'today'
9622				},
9623				nowIndicator: true,
9624				windowResize: function(arg) {
9625					const cal = arg.view.calendar;
9626					const isWeek = arg.view.type === 'timeGridWeek';
9627					const w = window.innerWidth;
9628
9629					if (w <= 768 && isWeek) {
9630						cal.changeView('dayGridMonth');
9631					}
9632				},
9633				views: {
9634					dayGridMonth: {
9635						// dayMaxEventRows: maxEvent,
9636                		dayMaxEvents: maxEvent, 
9637						moreLinkDidMount: function(args) { args.el.removeAttribute('title'); },
9638						moreLinkContent: function(args) { 
9639							var locale = args.view.calendar.getOption("locale");
9640							if (locale === "ko") {
9641								return { html: `+${args.num}개<span class="more"> 더보기</span>` };
9642							} else {
9643								return { html: `+${args.num} <span class="more">more</span>` };
9644							}
9645						},
9646						moreLinkClick: function(info) {
9647							var locale = info.view.dateEnv.locale.codes[0];
9648							info.jsEvent.preventDefault();
9649							info.jsEvent.stopPropagation();
9650							const dateObj = info.date;
9651							var weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][dateObj.getDay()];
9652							if(locale == 'ko') weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][dateObj.getDay()];
9653							else weekdayStr = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][dateObj.getDay()];
9654							var weekday = [dateObj, weekdayStr];
9655							const events = info.allSegs.map(seg => seg.event);
9656
9657							openMoreEventsModal(pid, events, weekday);
9658
9659						},
9660					},
9661					timeGridWeek: {
9662						slotEventOverlap: false, 
9663						eventOverlap: false,
9664						eventMaxStack: 10,
9665                		moreLinkContent() { return { html: '' } },
9666						titleFormat: function(arg) {
9667							const start = new Date(arg.date.marker);
9668							const end = new Date(start);
9669							end.setDate(end.getDate() + 6);
9670							end.setHours(23, 59, 59, 999);
9671
9672							const now = new Date();
9673
9674							const baseDate = (now >= start && now <= end) ? now : start;
9675
9676							const locale = (arg.localeCodes && arg.localeCodes[0]) || "en";
9677
9678							if (locale === "ko") {
9679								const y = baseDate.getFullYear();
9680								const m = String(baseDate.getMonth() + 1).padStart(2, "0");
9681								return `${y}년 ${m}월`;
9682							} else {
9683								return new Intl.DateTimeFormat(locale, {
9684								month: "long",
9685								year: "numeric",
9686								}).format(baseDate);
9687							}
9688						},
9689						dayHeaderContent: function(arg) {
9690							var d = arg.date?.marker || arg.date;
9691							var locale = arg.view.dateEnv.locale.codes[0];
9692							if (locale == 'ko') {
9693								const dayNumber = d.getDate();
9694								const weekDayKo = new Intl.DateTimeFormat('ko', { weekday: 'short' }).format(d);
9695								return {
9696									html: `<span class="round">${dayNumber}</span> ${weekDayKo}`,
9697								};
9698							} else {
9699								const dayNumber = d.getDate();
9700								const weekDayEn = new Intl.DateTimeFormat('en', { weekday: 'short' }).format(d);
9701								return {
9702									html: `<span class="round">${dayNumber}</span> ${weekDayEn}`,
9703								};
9704							}
9705						}
9706					},
9707					timeGridDay: {
9708						slotEventOverlap: false, 
9709						eventOverlap: false,
9710						eventMaxStack: 10,
9711                		moreLinkContent() { return { html: '' } },
9712						titleFormat: { year: 'numeric', month: 'long' },
9713						dayHeaderContent: function(arg) {
9714							const dateObj = arg.date; 
9715							const dayNumber = dateObj.getDate(); 
9716
9717							var locale = arg.view.dateEnv.locale.codes[0];
9718							if (locale === "ko") {
9719								const weekNames = ["일", "월", "화", "수", "목", "금", "토"];
9720								const weekDay = weekNames[dateObj.getDay()];
9721								return {
9722									html: `<span class="round">${dayNumber}</span> ${weekDay}`,
9723								};
9724							} else {
9725								const weekDay = new Intl.DateTimeFormat("en", { weekday: "short" }).format(dateObj);
9726								return {
9727									html: `<span class="round">${dayNumber}</span> ${weekDay}`,
9728								};
9729							}
9730						}
9731					},
9732					timeGrid: {
9733                		allDayText: (!lang) ? '하루종일' : 'All day'
9734            		}
9735				},
9736				// events: function(fetchInfo, success, failure) {
9737				// 	const data_type = ($('.userEL' + pid).attr('data-modoo-type')) || '';
9738				// 	const keys = monthsInRange(fetchInfo.start, fetchInfo.end); // YYYY-MM 배열
9739
9740				// 	// 각 월을 fetchMonth로 보장(캐시가 있으면 내부에서 스킵하게 구현)
9741				// 	Promise.all(
9742				// 		keys.map(k =>
9742 fetchMonth(pid, k, data_type))
9743				// 	)
9744				// 	.then(() => {
9745				// 		// 캐시에서 해당 범위의 이벤트 전부 모으기
9746				// 		const pidCache = monthCache.get(pid) || new Map();
9747				// 		const all = [];
9748				// 		keys.forEach(k => {
9749				// 			const arr = pidCache.get(k);
9750				// 			if (arr && arr.length) all.push(...arr);
9751				// 		});
9752
9753				// 		const src = all;
9754
9755				// 		const seen = new Set();
9756				// 		const uniq = [];
9757				// 		for (const ev of src) {
9758				// 			const key = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
9759				// 			if (!seen.has(key)) {
9760				// 				seen.add(key);
9761				// 				uniq.push(ev);
9762				// 			}
9763				// 		}
9764
9765				// 		success(uniq);
9766				// 	})
9767				// 	.catch(failure);
9768				// },
9769				eventOrder: ['multiOrder', 'start', 'duration', 'title'],
9770				// eventOrder: 'start',
9771				eventDidMount: function(info) {
9772					// 구글 이벤트만 색 덧칠
9773					if (info.event.extendedProps?.isGoogle) {
9774						const col = (googleColor && googleColor.get(pid)) || '';
9775						if (col) {
9776							info.el.style.backgroundColor = col;
9777							info.el.style.borderColor = col;
9778
9779							// 월간 뷰의 작은 점에도 반영 (dot 모드일 경우)
9780							const dot = info.el.querySelector('.fc-daygrid-event-dot');
9781							if (dot) {
9782								dot.style.backgroundColor = col;
9783								dot.style.borderColor = col;
9784							}
9785						}
9786					}
9787
9788					if (info.event.display === 'background' && info.event.classNames.includes('holiday-event')) {
9789						const viewType = info.view.type;
9790						if (viewType === 'timeGridWeek' || viewType === 'timeGridDay') {
9791							const start = new Date(info.event.start);
9792							const end   = new Date(info.event.end);
9793							for (let d = new Date(start); d < end; d.setDate(d.getDate() + 1)) {
9794								const y = d.getFullYear();
9795								const m = String(d.getMonth() + 1).padStart(2, '0');
9796								const day = String(d.getDate()).padStart(2, '0');
9797								const dateStr = `${y}-${m}-${day}`;
9798								addHolidayHeaderLabel(info.view.el, dateStr, info.event.title || '');
9799							}
9800						}
9801
9802						const cell = info.el.closest('.fc-daygrid-day');
9803						if (cell) {
9804							const harnessCount = cell.querySelectorAll('.fc-daygrid-bg-harness').length;
9805							if (harnessCount > 1) {
9806								const labels = cell.querySelectorAll('.holiday-label');
9807								labels.forEach((label, idx) => { label.classList.add(`multi_${idx + 1}`); });
9808							}
9809						}
9810					}
9811
9812					if (info.event.extendedProps.seq) {
9813						info.el.setAttribute('data-seq', info.event.extendedProps.seq);
9814					}
9815
9816					const durationHours = (info.event.end - info.event.start) / (1000 * 60 * 60);
9817					if (durationHours > 1) {
9818						const afterDiv = document.createElement('div');
9819						afterDiv.classList.add('event-overlay');
9820						afterDiv.style.position = 'absolute';
9821						afterDiv.style.top = '50px'; 
9822						afterDiv.style.left = '0';
9823						afterDiv.style.right = '0';
9824						afterDiv.style.height = `calc(100% - 50px)`;
9825						// afterDiv.style.backgroundColor = '#4789e71a';
9826						afterDiv.style.pointerEvents = 'none';
9827						info.el.appendChild(afterDiv);
9828					}
9829				},
9830				dateClick: function(info) {
9831					// console.log('dateClick');
9832
9833					//현재시간기준 30분단위로 시작시간 설정
9834					const STEP_MIN = 30;
9835
9836					function ceilToNextSlot(base, stepMin) {
9837						const d = new Date(base);
9838						d.setSeconds(0,0);
9839						let m = d.getMinutes();
9840						const r = m % stepMin;
9841						if (r !== 0) m += (stepMin - r);
9842						else m += stepMin;
9843						if (m >= 60) { d.setHours(d.getHours()+1); m -= 60; }
9844						d.setMinutes(m);
9845						return d;
9846					}
9847
9848					const start = new Date(info.date);
9849					let time;
9850
9851					if (info.view.type === 'dayGridMonth') {
9852						const next = ceilToNextSlot(new Date(), STEP_MIN);
9853						const s = new Date(
9854							start.getFullYear(), start.getMonth(), start.getDate(),
9855							next.getHours(), next.getMinutes(), 0, 0
9856						);
9857						const e = new Date(s); e.setHours(e.getHours() + 1);
9858						time = [fmt(s), fmt(e), 0];
9859					} else {
9860						const s = new Date(info.start);
9861						const e = new Date(info.start); e.setMinutes(e.getMinutes() + 30);
9862						const isAllDay = (info.startStr.includes('T')) ? 0 : 1;
9863						time = isAllDay ? [info.startStr, info.startStr, 1] : [fmt(s), fmt(e), 0];
9864					}
9865					if(isMobile() && (property.UMEMBER.check_adm || property.UMEMBER.check_uadm))  showCalendarModalEdit(pid, 0, time);
9866				},
9867				select: function(info) {
9868					// console.log('select');
9869
9870					//현재시간기준 30분단위로 시작시간 설정
9871					const STEP_MIN = 30;
9872
9873					function ceilToNextSlot(base, stepMin) {
9874						const d = new Date(base);
9875						d.setSeconds(0,0);
9876						let m = d.getMinutes();
9877						const r = m % stepMin;
9878						if (r !== 0) m += (stepMin - r);
9879						else m += stepMin;
9880						if (m >= 60) { d.setHours(d.getHours()+1); m -= 60; }
9881						d.setMinutes(m);
9882						return d;
9883					}
9884
9885					const start = new Date(info.start);
9886					let time;
9887
9888					if (info.view.type === 'dayGridMonth') {
9889						const next = ceilToNextSlot(new Date(), STEP_MIN); 
9890						const s = new Date(
9891							start.getFullYear(), start.getMonth(), start.getDate(),
9892							next.getHours(), next.getMinutes(), 0, 0
9893						);
9894						const e = new Date(s); e.setHours(e.getHours() + 1);
9895						time = [fmt(s), fmt(e), 0];
9896					} else {
9897						const s = new Date(info.start);
9898						const e = new Date(info.start); e.setMinutes(e.getMinutes() + 30);
9899						const isAllDay = (info.startStr.includes('T')) ? 0 : 1;
9900						time = isAllDay ? [info.startStr, info.startStr, 1] : [fmt(s), fmt(e), 0];
9901					}
9902					if(!isMobile() && property.UMEMBER.check_adm || property.UMEMBER.check_uadm) showCalendarModalEdit(pid, 0, time);
9903				},
9904				eventClick: function(info) {
9905					info.jsEvent.preventDefault();
9906            		info.jsEvent.stopPropagation();
9907					var locale = info.view.dateEnv.locale.codes[0];
9908					const clickedDateStr = getClickedDateStrAccurate(info);
9909					const clickedDate = new Date(clickedDateStr);
9910					var weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][clickedDate.getDay()];
9911					if(locale == 'ko') weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][clickedDate.getDay()];
9912					else weekdayStr = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][clickedDate.getDay()];
9913					const weekday = [clickedDate, weekdayStr];
9914
9915					const calendar = info.view.calendar;
9916					const allEvents = calendar.getEvents();
9917
9918					const eventsOnSameDay = allEvents.filter(ev => {
9919
9920						const isGoogle = !!ev.extendedProps?.isGoogle;
9921
9922						if (isGoogle) {
9923							// ---- 구글 이벤트 전용 날짜 계산 (로컬 기준) ----
9924							const s = ev.start ? new Date(ev.start) : null;
9925							let   e = ev.end   ? new Date(ev.end)   : null;
9926
9927							if (!s) return false;
9928
9929							// end 없으면 start와 같은 날로 취급
9930							if (!e) e = new Date(s);
9931
9932							// allDay 인 경우, FullCalendar는 end를 "exclusive"로 쓰므로 마지막 날 = end - 1일
9933							if (ev.allDay && ev.end) {
9934								e.setDate(e.getDate() - 1);
9935							}
9936
9937							const startStr = toYMDLocal(s);   // ✅ 로컬 날짜
9938							const endStr   = toYMDLocal(e);   // ✅ 로컬 날짜
9939
9940							return (clickedDateStr >= startStr && clickedDateStr <= endStr);
9941						}
9942
9943						// ---- 기존(내부) 이벤트 로직 그대로 유지, 날짜 계산만 toYMDLocal로 정리 ----
9944						const startStrBase = (ev.extendedProps.start_date || ev.startStr || '').split('T')[0];
9945
9946						let startStr = startStrBase;
9947						if (!startStr && ev.start) {
9948							startStr = toYMDLocal(ev.start);   // 안전장치
9949						}
9950
9951						let endInclStr;
9952						if (ev.extendedProps.end_date) {
9953							endInclStr = ev.extendedProps.end_date;
9954						} else if (ev.allDay) {
9955							if (ev.end) {
9956								const dayDiff = Math.ceil((ev.end - ev.start) / 86400000);
9957								if (dayDiff >= 2) {
9958									const d = new Date(ev.end);
9959									d.setDate(d.getDate() - 1);
9960									endInclStr = toYMDLocal(d);     // ✅ 여기서도 toISOString 대신 로컬
9961								} else {
9962									endInclStr = startStr;
9963								}
9964							} else {
9965								endInclStr = startStr;
9966							}
9967						} else if (ev.end) {
9968							// timed 이벤트는 endStr도 로컬 기준으로
9969							endInclStr = toYMDLocal(ev.end);
9970						} else {
9971							endInclStr = startStr;
9972						}
9973
9974						return clickedDateStr >= startStr && clickedDateStr <= endInclStr;
9975					});
9976
9977					openMoreEventsModal(pid, eventsOnSameDay, weekday);
9978				},
9979				eventContent: function(arg) {
9980					var locale = arg.view.dateEnv.locale.codes[0];
9981					const noTitleText = (locale === 'ko') ? '(제목 없음)' : '(No title)';
9982
9983					if (arg.event.classNames.includes('holiday-event')) {
9984						if (locale === 'ko') {
9985							const titleText = (arg.event.title && arg.event.title.trim() !== '') ? arg.event.title : noTitleText;
9986							return { html: `<div class="holiday-label">${titleText}</div>` };
9987						} else {
9988							return { html: '' };
9989						}
9990					}
9991
9992					const cal = arg.view.calendar;
9993					let timeText = '';
9994
9995					if (!arg.event.allDay) {
9996						const start = arg.event.start;
9997						const end = arg.event.end;
9998						const fmtOpts = {
9999							hour: 'numeric',
10000							minute: '2-digit',
10001							meridiem: 'short',
10002							hour12: true
10003						};
10004
10005						if (end && end.getTime() !== (start?.getTime() ?? 0)) {
10006							timeText = cal.formatRange(start, end, fmtOpts);
10007						} else if (start) {
10008							timeText = cal.formatDate(start, fmtOpts);
10009						}
10010					}
10011
10012					const rawTitle = (typeof arg.event.title === 'string') ? arg.event.title : '';
10013					const titleText = rawTitle.trim() !== 'undefined' ? rawTitle : noTitleText;
10014
10015					return {
10016						html: `
10017						<div class="fc-event-custom">
10018							<div class="fc-event-title">${titleText}</div>
10019							${timeText ? `<div class="fc-event-time">${timeText}</div>` : ''}
10020						</div>
10021						`
10022					};
10023				},
10024				dayCellContent: function(arg) { return arg.date.getDate(); },
10025				dayCellDidMount: function(arg) {
10026					// const dayEvents = arg.view.calendar.getEvents().filter(event => {
10027					// 	return moment(event.start).format('YYYY-MM-DD') === moment(arg.date).format('YYYY-MM-DD') 
10028					// 		&& event.classNames.includes('holiday-event');
10029					// });
10030
10031					// if (dayEvents.length > 0) {
10032					// 	const eventsContainer = arg.el.querySelector('.fc-daygrid-day-top');
10033					// 	if (eventsContainer) {
10034					// 	eventsContainer.classList.add('holiday-box');
10035					// 	}
10036					// }
10037				},
10038				datesSet: function(arg) {
10039					clearHolidayHeaderLabels(arg.view.el);
10040
10041					if (arg.view.type === 'timeGridWeek' || arg.view.type === 'timeGridDay') {
10042						const events = arg.view.calendar.getEvents().filter(ev =>
10043						ev.display === 'background' && ev.classNames.includes('holiday-event')
10044						);
10045						for (const ev of events) {
10046							const start = new Date(ev.start);
10047							const end   = new Date(ev.end);
10048							for (let d = new Date(start); d < end; d.setDate(d.getDate() + 1)) {
10049								const y = d.getFullYear();
10050								const m = String(d.getMonth() + 1).padStart(2, '0');
10051								const day = String(d.getDate()).padStart(2, '0');
10052								addHolidayHeaderLabel(arg.view.el, `${y}-${m}-${day}`, ev.title || '');
10053							}
10054						}
10055					}
10056				}
10057			});
10058
10059			calendar.on('datesSet', (arg) => { //월 초기 노출 개수
10060				// ▼ 부족 월 프리페치 (prev/next 이동 시 캐시에 없는 달만 보충)
10061				if (!calendar.__prefetching) {
10062					const keys = monthsInRange(arg.start, arg.end); // ['YYYY-MM', ...]
10063					const pidMap = monthCache.get(pid) || new Map();
10064					const missing = keys.filter(k => !pidMap.has(k));
10065
10066					if (missing.length) {
10067						calendar.__prefetching = true;
10068						const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
10069						Promise.all(missing.map(k => fetchMonth(pid, k, dt)))
10070						.then(() => arg.view.calendar.refetchEvents())
10071						.finally(() => { calendar.__prefetching = false; });
10072					}
10073				}
10074			});
10075
10076			calendar.render();
10077			setupHolidayHeaderHooks(calendar);
10078			$.cl_calendar.instances[pid].calendar = calendar;
10079
10080			$(`[data-type="calendar"][data-id="${pid}"]`).addClass('_calendar');
10081		}//calendar end
10082
10083		// $('.gallery-item').live('click', function(e) {
10084		// 	if($(this).find('[attr-flink]').length > 0 ) {
10085		// 		e.preventDefault();
10086		// 		return false;
10087		// 	}
10088
10089		// 	if($(e.target).hasClass('like') || $(e.target).closest('.figure').hasClass('like')) {
10090		//         e.preventDefault(); 
10091		//         return false;
10092		//     }
10093			
10094		// 	var $el = $(this).parents('.element');
10095		// 	var pid = $el.attr('data-id');
10096		//     $('.blueimp-gallery').addClass('blueimp-gallery-controls');
10097		//     $('.blueimp-gallery a.zoom-in').remove();
10098		// 	$('.blueimp-gallery a.gallery-like').addClass('hide').removeClass('active').removeAttr('data-like');
10099
10100		// 	var gid = $(this).find('a').attr('data-gallery');
10101		//     var totalSlide = $(gid).find('.slide').length;
10102		//     $('.blueimp-gallery .slide-index .total-slide').text(totalSlide);
10103
10104		//     if($(this).find('a').attr('data-img-original') == 'ON') {
10105		// 	    $('.blueimp-gallery a.close').after('<a class="zoom-in" data-id="' + pid + '"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M24 22.94l-6.42-6.42C19.08 14.76 20 12.49 20 10c0-5.52-4.48-10-10-10S0 4.48 0 10s4.48 10 10 10c2.49 0 4.76-0.92 6.52-2.42L22.94 24 24 22.94zM1.5 10c0-4.69 3.81-8.5 8.5-8.5 4.69 0 8.5 3.81 8.5 8.5s-3.81 8.5-8.5 8.5C5.31 18.5 1.5 14.69 1.5 10z"/><polygon points="10.75 6 9.25 6 9.25 9.25 6 9.25 6 10.75 9.25 10.75 9.25 14 10.75 14 10.75 10.75 14 10.75 14 9.25 10.75 9.25 "/></svg></a>');
10106		// 	}
10107			
10108		// 	$(gid).off('slide').off('slideend');
10109		// 	$(gid).on('slide', function (event, index, slide) {
10110		// 		if($(this).find('a').attr('data-gallery-like') != 'N') $('.blueimp-gallery a.gallery-like').removeAttr('data-like').addClass('hide');
10111	    //     }).on('slideend', function(event, index, slide){
10112        // 		$('.blueimp-gallery .slide-index .current-slide').text(index+1);
10113	    //     	if($(this).find('a').attr('data-gallery-like') != 'N') {
10114	    //     		var itemSeq = $el.find('.gallery-item').eq(index).attr('data-seq');
10115		//             if(itemSeq == undefined) {
10116		//                 itemSeq = $('.galleryPL'+pid+'.gallery-popup .gallery-item[data-index='+index+']').attr('data-seq');
10117		//             }
10118		// 			var l_position = setTimeout(function(){
10119		//                 if(!$(slide).hasClass('slide-loading')) {
10120		//                     galleryLikePosition(gid, slide, itemSeq);
10121		//                     clearTimeout(l_position);
10122		//                 }
10123		//             }, 600);
10124	    //     	}
10125	    //     });
10126		// 	$('.blueimp-gallery').find('h3.title').html($(this).find('a').attr('data-title'));
10127
10128		//    	$.cookie('gallery-item', $(this).attr('data-seq'), { path : '/', expires: 12 * 60 * 60 * 1000 });
10129		//    	if(b.PARENT.prev != null) $('.data-page-prev').addClass('active');
10130		//    	if(b.PARENT.next != null) $('.data-page-next').addClass('active');
10131		// 	e.stopPropagation();
10132		// });
10133
10134		// $('body').on('click','.blueimp-gallery a.zoom-in', function(e) {
10135		//     var idx = 0,
10136		//         eid = $(this).attr('data-id');
10137		//     $('#gframe-' + eid + ' .slide').each(function(i,v) {
10138		//         var trans = $(v).attr('style');
10139		//         if(trans.indexOf('translate(0px, 0px)') > -1 || trans.indexOf('transform: translate(0px) translateZ(0px)') > -1) {
10140		//             idx=i;
10141		//         }
10142		//     });
10143		//     // var src = $('#gframe-' + eid + ' .slide[data-index="' + idx + '"] > img').attr('src');
10144
10145		//     // $('.blueimp-gallery a.zoom-in').attr('href',src).attr('target','_blank');
10146		//     e.stopPropagation();
10147		// });
10148``
10149		$('.element[data-type="contact"] .google-map .gm-fullscreen-control').live('click', function(e) {
10150			$(this).toggleClass('gm-open');
10151
10152			if(!$(this).hasClass('gm-open')) {
10153				var el = $(this).closest('.element').attr('data-el');
10154				scrollToBlock('.'+el,300);
10155			}
10156		});
10157
10158		$('#mobile-nav .siteLANG.cl-fixbtn.cl-visible .cl-lang').live({
10159			click: function(e) {
10160				if($('#mobile-nav .siteLANG.cl-fixbtn.cl-visible .dropdown-menu-wrap').hasClass('open')) {
10161					$('#mobile-nav #tpl-menu').css({
10162						'position':'relative',
10163						'z-index':'-1'
10164					});
10165				} else {
10166					$('#mobile-nav #tpl-menu').css({
10167						'position':'',
10168						'z-index':''
10169					});
10170				}
10171			}
10172		});
10173
10174		$('#mobile-nav .dropdown-menu-wrap.open').live({
10175			click: function(e) {
10176				$('#mobile-nav .menu-has-children .dropdown-menu a').css('pointer-events','');
10177				$('#mobile-nav .menu-has-children i.fa-chevron-down').css('z-index','')
10178			}
10179		});
10180	
10181
10182		/* page count */
10183		if(Object.keys(b.CONTENTS).length) {
10184			var ps_elupdate = this.contentUpdate(b.CONTENTS),
10185				vpmode = (typeof $('.mobilepc_ch').attr('data-desktop-option') != 'undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : b.SETTINGS.viewportMode;
10186
10187			ps_elupdate.done(function(r_data) {
10188				elFooter();
10189                if(typeof r_data != 'undefined' && typeof r_data.showOnlyFooter != 'undefined' && r_data.showOnlyFooter) {
10190                	return false;
10191                }
10192				if(b.COUNT) {
10193					if(b.PARENT.mode == 'shopping') {
10194						if(typeof property.PRODINFO === 'object') $.products.display_info();
10195						if($('#review-onoff').val() == 'true') $.products.review(b.VIEW,b.PAGE);
10196						if($('#qna-onoff').val() == 'true') $.products.qna(b.VIEW,b.PAGE);
10197					} else {
10198						if(b.VIEW) _this.displayComment();
10199					}
10200				}
10201			
10202				$('[data-aos-dummy]').each(function() {
10203					$(this).attr('data-aos', $(this).attr('data-aos-dummy')).removeAttr('data-aos-dummy');
10204				});
10205			// }).then(function() {
10206		        // if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10207		        // 	console.log(b.SETTINGS.zoom);
10208		        // 	$.mpcWeb.mpcWebhtml(vpmode,b.CONTENTS,b.SETTINGS.zoom);
10209		        // }
10210			}).then(function() {
10211				if(b.VIEW && b.PARENT.mode != 'shopping') {
10212					// initViewPageToolbar().then(function(pageToolbar){
10213	                //     setViewPageToolbar();
10214	                // });
10215					initViewPageBottom();
10216				}
10217	    	}).then(function() {
10218                if(typeof b.SETTINGS.hideScrollTop != 'undefined' && b.SETTINGS.hideScrollTop == true)  $('#goto-top').addClass('hide');
10219				if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
10220					var ismodeSm = ($('.cl-s-page').hasClass('mode-shopping')) ? true : false;
10221					if(!ismodeSm && b.ONE && !b.VIEW || b.PAGE == b.MENULINK[0] && !b.VIEW)	setSitePopup();
10222					$.siteBanner.init(true,true);
10223
10224					if(b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM') {
10225						if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
10226							$.fnav.draw(b.SETTINGS.fnav);
10227						}
10228					
10229						if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {	
10230							var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
10231						
10232							if(!(b.PARENT.page != null && (quick_type=='mobile'))) {
10233								if($('.menu-lock-block').length>0) return false;
10234								if(!(ismodeSm && (quick_type=='mobile'))) {
10235									$.quickmenu.init(b.SID, b.PUBLISH,quick_type);
10236									mobileWebQuickmenuPosition(b,quick_type);
10237								}
10238								
10239							}			
10240						}
10241
10242					}
10243				}
10244
10245				if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10246					mobileWebfnavCheck(vpmode);
10247				}
10248
10249				if($('#page-loading-css').length > 0) {
10250					if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
10251					$('#page-loading-css').remove(); 
10252				}
10253	    	});
10254		} 
10255		else {
10256			var checkUrl = b.PAGE.split(","),
10257				vpmode = '';
10258				vpmode = $.mpcWeb.mpcGetVpmode(vpmode,b.SETTINGS);
10259
10260			isMenuLock(function() {
10261				if(b.SETTINGS.noError404 === true && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) { // refresh
10262					window.location.href = '/';
10263					return false;
10264				}
10265				
10266				if($('#page-loading-css').length > 0) {
10267					if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
10268					$('#page-loading-css').remove(); 
10269				}
10270
10271				if(property.ISLOCK == 'false') {
10272					if(property.COUNT==0) {
10273						elFooter();
10274						if(checkUrl[0] == "forum" && b.VIEW) {				
10275							if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10276								$.mpcWeb.mpcWebhtml(vpmode,b.CONTENTS,b.SETTINGS.zoom);
10277							}
10278							var ps_fmview = $.forum.view(b.VIEW);
10279							ps_fmview.done(function(data) {
10280								if($(`.page-comments[data-id="${b.VIEW}"]`).length == 0) _this.displayComment(data);
10281
10282								setTimeout(function() {
10283									if(b.VIEW) setViewPageToolbar();
10284									if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
10285										if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) $.fnav.draw(b.SETTINGS.fnav);
10286									}
10287									if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10288										$.mpcWeb.mpcWebhtml(vpmode,'',b.SETTINGS.zoom);
10289										mobileWebfnavCheck(vpmode);
10290									}
10291								}, 100);
10292
10293							}).fail(function(error_msg) {
10294								// console.log(error_msg);
10295							});
10296						}
10297
10298						if(property.PAGE == 'psearch') {
10299							vpmode = $.mpcWeb.mpcGetVpmode(vpmode,property.SETTINGS);
10300
10301							if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) $.mpcWeb.mpcWebhtml(vpmode,property.CONTENTS,property.SETTINGS.zoom);
10302
10303							setTimeout(function() {
10304								if(property.VALIDPLAN && (property.VALIDTYPE == 'BN' || property.VALIDTYPE == 'SM')) {
10305									if(typeof property.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(property.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) $.fnav.draw(property.SETTINGS.fnav);
10306								}
10307								if(typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) {
10308									mobileWebfnavCheck(vpmode);
10309								}
10310							}, 500);
10311						}
10312
10313						var ismodeSm = ($('.cl-s-page').hasClass('mode-shopping')) ? true : false;
10314						if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
10315							if(!ismodeSm && b.ONE && !b.VIEW || b.PAGE == b.MENULINK[0] && !b.VIEW) setSitePopup(); 
10316							$.siteBanner.init(true,true);
10317						}
10318						if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
10319							if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
10320								$.fnav.draw(b.SETTINGS.fnav);
10321							}
10322
10323							if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
10324								var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
10325								if(!(b.PARENT.page != null && (quick_type=='mobile'))) $.quickmenu.init(b.SID, b.PUBLISH,quick_type);
10326							}
10327						}
10328
10329						if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10330							$.mpcWeb.mpcWebhtml(vpmode,'',b.SETTINGS.zoom);
10331							mobileWebfnavCheck(vpmode);
10332						}
10333
10334					}
10335				} else {
10336					elFooter();
10337				}
10338			});
10339		}
10340
10341		window._musicUserInteracted = false;
10342		$(document).one('click scroll touchstart keydown', function() {
10343			window._musicUserInteracted = true;
10344		});
10345
10346	    $(window).load(function() {
10347
10348	    	$('#no-fouc').css('opacity','1');
10349	        if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
10350	        	moveGallery($.cookie('gallery-item'));
10351	        }
10352	        
10353	        if(typeof $.cookie('forum_content_view') == 'undefined'){
10354		        moveScroll(0);
10355		    }
10356		    _this.loaded();
10357
10358            if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
10359			    var musicPlay = true;
10360			    if(typeof b.SETTINGS.musicStop != 'undefined' && (b.SETTINGS.musicStop === true || b.SETTINGS.musicStop == 'true'))
10361			    	musicPlay = false;
10362
10363			    if(typeof b.SETTINGS.musicUse != 'undefined' && (b.SETTINGS.musicUse === true || b.SETTINGS.musicUse == 'true')){
10364 					if( (typeof b.SITELOCK != 'undefined' && b.SITELOCK == 'true' ) || b.certOpenChk == true) {
10365						musicPlay = false;
10366					} else {
10367						$.musicON(musicPlay);
10368					}				
10369				}
10370
10371				// JH 주석1 : 위 내용 주석 후 아래 주석 풀기
10372				// if(typeof b.SETTINGS.musicUse != 'undefined' && (b.SETTINGS.musicUse === true || b.SETTINGS.musicUse == 'true'))
10373				// $.musicON(musicPlay);
10374					
10375				if(musicPlay == false) $.musicPause();
10376			}
10377
10378			var used_disk_value = b.USED_DISK / 1024,
10379				used_disk = Math.ceil(used_disk_value); // byte으로 가져와서 megsabyte으로 변한다
10380
10381			if(Number(b.DISK_SPACE) != -1 && (used_disk > b.DISK_SPACE) && (b.MB_LEVEL != 10)) setlimitdiskPopup();
10382
10383			// menu sidebar - height overflow
10384			if($('body').width() > 768) {
10385				$('header.navbar-li:not([data-fixtype]) #fixed-menu > li.dropdown').live({
10386					mouseenter: function(e) {
10387						var this_bottom = $(this).find('.cl-icon').position().top + $(this).find('.cl-icon').height();
10388						$(this).find('.dropdown-menu').css({
10389							'top': this_bottom+'px',
10390						});
10391					},
10392					mouseleave: function(e) {
10393						$(this).find('.dropdown-menu').removeAttr('style');
10394					}
10395				});
10396
10397				$('header.navbar-li[data-fixtype] #fixed-menu > li.dropdown').live({
10398					mouseenter: function(e) {
10399						var dropdown_cover = '<div class="dropdown_cover"></div>',
10400							this_bottom = 0,
10401			                is_fhAlign = (typeof $('.el-menu header.navbar[data-fixtype]').find('.container').attr('data-fh-align') != 'undefined') ? true : false,                         
10402			                checkSidebar = ($('.el-menu header.navbar').hasClass('sidebar')) ? true : false,
10403			                $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') : '',
10404			                visible_aHght = ($(this).find(' > a:visible').length>0) ? $(this).parents('.cl-fixed-menu').find('li.cl-fixbtn').height() : 10;
10405			                	
10406						var height_arr = [],
10407			        		height_max = '';
10408
10409		        		$cl_fixbtn.find('> a:visible').each(function(){
10410		        			var fixbtn_height = ($(this).find('.cl-icon').length>0) ? $(this).find('.cl-icon').height() : $(this).height(),
10411		        				fixbtn_fsize = Number($(this).css('font-size').replace(/px/gi,''));
10412
10413								// console.log($(this).height());
10414								// console.log($(this).parents('li.cl-fixbtn').height());
10415	        				if($(this).height() != $(this).parents('li.cl-fixbtn').height()) {
10416	        					fixbtn_height = ($(this).find('.cl-icon').height() > $(this).height()) ? $(this).find('.cl-icon').height() : 
10417		        				(($(this).find('.cl-icon').height() + fixbtn_fsize < $(this).height()) ? fixbtn_fsize : $(this).outerHeight());
10418	        				} 
10419		        		
10420        					height_arr.push(fixbtn_height);
10421		        		});
10422
10423		        		height_max = Math.max(...height_arr);
10424				
10425						var li_Hght = 0;
10426						$(this).parents('.cl-fixed-menu').find('li.cl-fixbtn').each(function(i,v){
10427							var li_display = $(this).css('display');
10428							if(li_display!='none') {
10429								li_Hght = Number($(this).height());
10430								return false;
10431							}
10432						});
10433
10434		        		var li_Hght_half = Number((li_Hght/2).toFixed(0)),
10435		        			height_max_half = Number((height_max/2).toFixed(0)),
10436		        			ul_height_max_cal = li_Hght_half - height_max_half;
10437		        		
10438		        		ul_height_max_cal = (ul_height_max_cal <= 0 && ul_height_max_cal>-3) ? 0 : ul_height_max_cal;
10439	        			this_bottom = ul_height_max_cal + Number(height_max.toFixed(0)) + 5;
10440
10441		             	//if(!is_fhAlign && !checkSidebar && $(this).hasClass('siteLANG')) { this_bottom -= ul_height_max_cal;}
10442
10443						if(checkSidebar) {
10444							var fixtype = $('.el-menu header.navbar').attr('data-fixtype'),
10445								fixtype_check_arr = ['01','02','03','08'];
10446							this_bottom = ($.inArray(fixtype,fixtype_check_arr)>-1) ? this_bottom : visible_aHght;
10447						} 
10448						
10449						if(!checkSidebar) {
10450			                $(this).find('.dropdown-menu').before(dropdown_cover);
10451			            }
10452					
10453			            $(this).find('.dropdown-menu').css({
10454							'top': this_bottom+'px'
10455						});
10456
10457
10458					},
10459					mouseleave: function(e) {
10460						$(this).find('.dropdown-menu').removeAttr('style');
10461            			$(this).find('.dropdown_cover').remove();
10462					}
10463				});
10464
10465				$('.sidebar .nav li.dropdown').live({
10466					mouseenter: function(e) {
10467						var checkSubMenuPosition = $(this).find('.dropdown-menu').css('position');
10468						if(checkSubMenuPosition == 'absolute') {
10469							var this_top = $(this).offset().top - $(document).scrollTop();
10470							if($(this).closest('header').parent('#element-display').length > 0) this_top -= $(this).closest('header').parent('#element-display').offset().top;
10471							
10472							$(this).find('.dropdown-menu').css({
10473								'position': 'fixed',
10474								'top': this_top+'px',
10475								'left': '260px'
10476							});
10477						}
10478					},
10479					mouseleave: function(e) {
10480						$(this).find('.dropdown-menu').removeAttr('style');
10481					}
10482				});
10483			} else {
10484				$('header.navbar-li #fixed-menu > li.dropdown').find('.dropdown-menu').removeAttr('style');
10485				$('header.sidebar #tpl-menu > li.dropdown').find('.dropdown-menu').removeAttr('style');
10486			}
10487
10488
10489			if(typeof $.cookie('ci_goto-gallery') != 'undefined' && $.cookie('ci_goto-gallery')) {
10490				var goto_gallery = '.element[data-id="' + $.cookie('ci_goto-gallery') + '"]',
10491					cookie_domain =  (property.HOST.indexOf(':') > -1) ? property.HOST.substring(0,property.HOST.indexOf(':')) : property.HOST;
10492				if($(goto_gallery).length > 0) {
10493					scrollToBlock(goto_gallery, 1000);
10494				}
10495				$.cookie('ci_goto-gallery', '', { domain: '.' + cookie_domain,expires: -1 });
10496				$.cookie('ci_goto-gallery-cate', '', { domain: '.' + cookie_domain,expires: -1 });
10497			}
10498
10499			if(isAosBlock) {
10500				$('body,html').addClass('aos-height aos-overflowX');
10501				if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
10502			} else {
10503				$('body,html').removeClass('aos-height aos-overflowX');
10504			}
10505
10506			if(typeof fbq == 'function' && b.VALIDTYPE == 'SM') {
10507				if(b.VIEW) {
10508					var checkProduct = (b.PAGE.match(/^forum,/g) === null && typeof b.PARENT != 'undefined' && typeof b.PARENT.mode != 'undefined' && b.PARENT.mode == 'shopping') ? true : false,
10509						mn = (b.ONE) ? b.PARENT.opage : b.PARENT.ppage;
10510					if(checkProduct && typeof callbackEvtViewContent == 'function') callbackEvtViewContent(mn,b.PARENT.seq,b.PARENT.title,$('.total-price').text().replace(/[^0-9]/g,''));
10511				} else {
10512					var checkProductList = ($('.element[data-type="gallery"][data-mode="shopping"]').length > 0) ? true : false;
10513					if(checkProductList && typeof callbackEvtLead == 'function') callbackEvtLead(b.PAGE);
10514				}
10515			}
10516
10517	    });
10518    },
10519    contentUpdate : function(contents) {
10520    	// console.log(' page draw 01:: contentUpdate');
10521	    var deferred = $.Deferred();
10522    	var b = this.b,
10523    		_this = this,
10524    		idx = 0;
10525    	
10526    	var checkSiteLock = isSitePasswordLock();
10527		checkSiteLock.then(function() {
10528			isMenuLock(function() {
10529				var default_t_css = '', default_m_css  = '';
10530				var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false,
10531					page_pos = 0,
10532					site_settings = (typeof b.SETTINGS != 'undefined' && b.SETTINGS) ? b.SETTINGS : {},
10533					vpmode = '';
10534                var is_templates = checkTemplateSite(b.SID);
10535				vpmode = $.mpcWeb.mpcGetVpmode(vpmode,b.SETTINGS);
10536				if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10537					$.mpcWeb.mpcWebhtml(vpmode,b.CONTENTS,b.SETTINGS.zoom);
10538				}
10539
10540				if(checkGalleryView) setViewPageStyle();
10541
10542				var check_modoo = $('.dsgn-body').hasClass('modoo') ? true : false,
10543					fl_data = {};
10544					
10545				if(check_modoo || property?.SETTINGS?.modoo?.floating ) { 
10546					fl_data = draw_floating();
10547				}
10548
10549				$.each(contents, function(i,v) {
10550		    		page_pos += 1;
10551					// console.log(`i: ${i}, v: `);console.log(v);
10552		    		var c = v.element,
10553		    			$el = $('.' + c.elname),
10554						settings = (c.elsettings == '' || typeof c.elsettings == 'undefined') ? {} : $.parseJSON(c.elsettings),
10555						block_lang = (typeof settings.blocklang != 'undefined') ? settings.blocklang : LANG
10556		    			msny = (c.feature=='masonry') ? true : false;
10557
10558					if(c.type == 'video') {
10559						c.mode = ($el.find('.video-gallery-url').length > 0) ? 'zoom' : 'thumb';
10560					}
10561
10562		            //처음 접속 시
10563		            $el.addClass('el_' + idx)
10564		            	.addClass('element')
10565		                .attr('data-id', c.seq)
10566		                .attr('data-el','el_' + idx)
10567		                .attr('data-pos', c.pos)
10568		                .attr('data-name', c.elname)
10569		                .attr('data-msny', msny)
10570		                .attr('data-type', c.type)
10571		                .attr('data-type2', c.type2)
10572						.attr('data-feature', c.feature)
10573		                .attr('data-mode', c.mode)
10574		                .attr('data-width', c.folder)
10575		                .attr('data-overlap',c.overlap)
10576		                .attr('data-case', settings?.blockorg || c.name);
10577					if(c.type == 'form' && typeof c.form_done != 'undefined') $el.attr('data-form-done', c.form_done);
10578
10579					setBlockAOS($el,{block:settings, skipRefresh:true});
10580
10581					if($el.hasClass('modoo')) {
10582						if(window.innerWidth <= 768 && $el.find('._spotHomesite').hasClass('is_bottom')) {
10583							$el.find('._spotHomesite').removeClass('is_bottom');
10584						}
10585
10586						if($el.find('._sectionSpot').hasClass('type_full') && window.innerWidth > 768) {
10587							var A = $el.find('._areaLogin').length ? true : false,
10588								C = window.innerHeight;
10589		
10590							if (A) {
10591								C -= 50;
10592							}
10593							
10594							$el.find("._sectionSpot .swiper-wrapper").css("height", C);
10595							$el.find("._sectionSpot .swiper-slide").css("height", C);
10596							$el.find("._sectionSpot ._imgCover").css("height", C).each(function(F, G) {
10597								var D = $(G);
10598								var E = D.attr("data-lazy-background-img-src");
10599								D.css({
10600									backgroundImage: "url(" + E + ")",
10601									filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + E + '}", sizingMethod="scale")'
10602								});
10603							});
10604							if (!$el.find("._spotHomesite").hasClass("is_bottom")) {
10605								$el.find("._spotHomesite").css("height", C);
10606							}
10607						}
10608						if($el.find('.page-container-mobile').length > 0) {
10609							if(window.innerWidth <= 768) $el.find('[data-role="page-container"]._content').hide();
10610							else $el.find('[data-role="page-container"]._content').show();
10611						}
10612
10613						if($el.parents('body').is('.clnav-overlap-OFF') && $el.is('[data-el="el_0"]')) {
10614							$el.find('._spotHomesite .site_info').append(fl_data.el_html);
10615						}
10616					}
10617
10618					if(c.type == 'contact') {
10619						setContactSubmitSecurity($el, c.seq, settings, block_lang);
10620					}
10621
10622
10623					var checkPageblock = (c.seq === 'all_products' || (c.orgpos == 1 && c.orgpage)) ? true : false;
10624					if (b.ONE && checkPageblock) {
10625						$el.attr('data-pagename', JSON.parse('"' + c.orgpage + '"'));
10626						$el.addClass('link-to-'+JSON.parse('"'+c.orgpage.replace(/ /g,'-')+'"'));
10627					}
10628
10629					var checkNotSupported = (!is_templates) ? $.notSupported.check(v.element.type,v.element.type2,v.element.feature) : false;
10630					if(checkNotSupported) {
10631						$(`.${v.element.elname}`).html('').attr('class',`hide element ${v.element.elname} el_${idx}`);
10632						$(`#el_${idx}css, #js_${idx}`).remove();
10633						idx++;
10634						return;
10635					}
10636
10637					$el.find('video').attr({'playsinline': '','webkit-playsinline': ''});
10638					if(c.type == 'video' || c.type == 'others') {
10639						var checkFullscreen = (typeof settings.fullscreen != 'undefined' && settings.fullscreen == 'ON') ? true : false;
10640						if(checkFullscreen) $el.find('.video-wrap').addClass('video-fullscreen');
10641					}
10642
10643		            if($el.length > 1 && c.type == 'showcase') {
10644			            $($el).each(function(i, v) {
10645			           		if(i>0) v.dataset['el'] = '';
10646			            });
10647		            }
10648					
10649					if($el.hasClass('error_404')==false) {
10650						if($el.hasClass('el-footer')==false) {
10651							if($el.hasClass('cl-s-product-detail')==false) {
10652								if(typeof setBlockAOS == 'function') setBlockAOS($el,{block:settings, skipRefresh:true});
10653								else aosAddblock(site_settings,settings,$el);
10654							}						
10655						}
10656					}
10657
10658					var data_aos_attr = '';
10659					if($el.is('[data-aos]')) {
10660						data_aos_attr = $el.attr('data-aos');
10661						$el.removeAttr('data-aos');
10662						$el.addClass('aos-init')
10663					}
10664
10665	              	var blocklang = '';
10666					if(typeof settings.blocklang != 'undefined') {
10667		                blocklang = settings.blocklang;
10668		                $el.attr('data-blocklang',blocklang);
10669		            }
10670
10671					if (c.type == 'sync') {
10672						showHideSyncField($el, settings);
10673	
10674						var sync_list_total = (typeof v.element.sync !='undefined' && typeof v.element.sync.list != 'undefined' && (v.element.sync.list).length > 0) ? (v.element.sync.list).length : 0;
10675						if($el.find('.slick-page-label').length > 0) {
10676							var page_label = sync_list_total;
10677							if(c.type2 == 'imgpitem' && sync_list_total == 0) page_label = $el.find('.slick .item').length;
10678
10679							$el.find('.slick-page-label .slick-page-now').text(1);
10680							$el.find('.slick-page-label .slick-page-total').text(page_label);
10681						}
10682
10683						if($el.find('.sync-option').length > 0) {
10684							var sync_css = CSSJSON.toJSON(htmlspecialchars_decode(c.elcss)),
10685								sync_s = style.get(sync_css,c.elname);
10686							if(typeof sync_s.__display_count != 'undefined') {
10687								var display_cnt = Number(sync_s.__display_count) || 10;
10688								$el.find(`.sync-item:gt(${display_cnt-1})`).addClass('hide');
10689
10690								if($el.find('.sync-page-label').length > 0) {
10691									var sync_p_cnt = $el.find('.sync-row .sync-item').length,
10692										sync_p_total = Math.ceil(sync_p_cnt / display_cnt);
10693									$el.find('.sync-page .sync-page-now').text(1);
10694									$el.find('.sync-page .sync-page-total').text(sync_p_total);
10695									
10696									if(sync_p_total == 1) $el.find('.sync-page-wrap').hide();
10697									else $el.find('.sync-page-wrap').show();
10698								}
10699							}
10700						}
10701
10702						var sync_loadmore_lang = block_lang;
10703						if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) sync_loadmore_lang = settings.loadmore_lang.toLowerCase();
10704						$el.find('.sync-page-more-str').text($.lang[sync_loadmore_lang]['config.loadmore']);
10705					}
10706
10707					if(checkGalleryView) {
10708						if(c.page == 'fixedblock_'+b.PARENT.pid) $el.addClass('el-fixedblock');
10709						else $el.removeClass('el-fixedblock');
10710
10711						$el.attr('data-pos', page_pos);
10712						// if(b.LUX && (c.orgpos == '1' || $el.is('.lux-product-block'))) $el.attr('data-ppos', (c.pos*1) + 1);
10713						// else $el.attr('data-ppos', c.pos);
10714						$el.attr('data-ppos', c.pos);
10715						$el.attr('data-posby', c.elnew);
10716					}
10717
10718					if(c.type == 'contact' && c.page == 'fixedcontact') {
10719						$.fixedContact.init($el);
10720		            }
10721
10722		            // b.ISLOCK = (!b.VALIDPLAN) ? 'false' : b.ISLOCK;
10723		            if(b.ISLOCK == 'false') $el.removeClass('hide');
10724		            else $el.addClass('locked');
10725
10726		            if(c.type == 'forum' || c.type == 'latest' || c.type == 'sync') $el.addClass('preloading');
10727
10728					var elFonts = $el.css('font-family');
10729					elFonts = elFonts + ",'Nanum Gothic'";
10730					var reFonts = elFonts.replace(/"/g, "\'");
10731					$el.css('font-family',reFonts);
10732
10733		            //add style
10734		            var jcss = CSSJSON.toJSON(c.elcss);
10735
10736					var element_mh = jcss?.children[`.${c.elname}`]?.attributes['min-height'] ?? '';
10737					if (element_mh && /%$/.test(element_mh)) {
10738						const converted_mh = element_mh.replace('%', '');
10739						$el.css('min-height',`${converted_mh}vh`);
10740					}
10741
10742		            var elpd = style.getPadding(jcss,c.elname);
10743		            var pt = parseInt(elpd.top);
10744		            var pb = parseInt(elpd.bottom);
10745		                
10746		            if(pt>0||pb>0){
10747		                default_t_css = default_t_css + '\n 	.'+c.elname + '{';
10748		                if(Math.ceil(pt*0.8)>0)
10749		                default_t_css = default_t_css + 'padding-top: '+Math.ceil(pt*0.8) + 'px!important;';
10750		                if(Math.ceil(pb*0.8)>0)
10751		                default_t_css = default_t_css + 'padding-bottom: '+Math.ceil(pb*0.8) + 'px!important;';
10752		                default_t_css = default_t_css + '}';
10753
10754		                default_m_css = default_m_css + '\n 	.'+c.elname + '{';
10755		                if(Math.ceil(pt*0.5)>0)
10756		                default_m_css = default_m_css + 'padding-top: '+Math.ceil(pt*0.5) + 'px!important;';
10757		                if(Math.ceil(pb*0.5)>0)
10758		                default_m_css = default_m_css + 'padding-bottom: '+Math.ceil(pb*0.5) + 'px!important;';
10759		                default_m_css = default_m_css + '}';
10760		            }
10761		            
10762		            if(idx == Object.keys(b.CONTENTS).length-1){
10763		                var css = '@media only screen and (max-width:767px) {' + default_t_css + '\n}\n';
10764		               	css = css + '@media only screen and (max-width:480px) {' + default_m_css + '\n}';
10765
10766		                if($('#el-paddingcss').length == 0) $('.dsgn-body').find('#el_'+(Object.keys(b.CONTENTS).length-1)+'css').after('<style id="el-paddingcss">'+css+'</style>');
10767		                else $('#el-paddingcss').append(css);
10768		            }
10769
10770		            var settings = (c.elsettings == '' || typeof c.elsettings == 'undefined') ? {} : $.parseJSON(c.elsettings);
10771
10772					if(typeof settings.bookmark != 'undefined' && settings.bookmark) {
10773						$el.attr('data-bookmark',c.seq);
10774					}
10775					
10776					if(b.VIEW && (c.type == 'project' || c.type == 'product')) {
10777						$el.find('.data-page-prev').addClass('active');
10778						$el.find('.data-page-next').addClass('active');
10779
10780	                    if(b.PARENT.prev == null) $el.find('.data-page-prev').removeClass('active');
10781	                    if(b.PARENT.next == null) $el.find('.data-page-next').removeClass('active');
10782
10783	                    //상세페이지 배경 style 추가
10784	                    // if(c.type == 'project') setGalleryProjectCss(b.PARENT,b.PARENT['elcss']);	                	
10785	                }
10786
10787	                if(b.VIEW) {
10788		            	var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'OFF';
10789		            	$el.find('img[data-attach="true"]').attr('data-img-original',img_onoff);
10790	                }
10791
10792					//video block ::: gallery
10793			        if(c.type == 'video') {
10794			            if($el.find('.video-gallery-url').length > 0) { //재생방식 : 확대보기 
10795			                $.each($el.find('.item'),function(i,v){
10796			                    if(c.mode=='zoom') appendGalleryFrame($(this).parents('.element'),c.seq,c.type);
10797			                });
10798
10799		                    // let lsw = document.querySelector('.element[data-id="' + c.seq + '"] .swiper');
10800		                    // if(lsw && lsw.swiper) {
10801		                    //     let slider_motion = $('.element[data-id="' + c.seq + '"]').attr('data-sli
10801der-motion');
10802
10803		                    // 	$('#gframe-' + c.seq).on('opened', function(event){
10804					        //     	console.log('gallery opend', $(this).data('gallery'), typeof $(this).data('gallery').index);
10805		                    //         if(slider_motion != 'stop') {
10806		                    //             lsw.swiper.autoplay.stop();
10807		                    //         }
10808			                //     }).on('closed', function (event){
10809					        //     	console.log('gallery closed');
10810		                    //         if(slider_motion != 'stop') {
10811		                    //             lsw.swiper.autoplay.start();
10812		                    //         }
10813			                //     });
10814		                    // }
10815			            }			            
10816
10817						resizeVideoIframe($el);
10818			        }
10819
10820					if(c.type == 'forum') {
10821						var page_num = 1
10822						if (typeof $.cookie('forum_' + v.element.seq) != 'undefined' && $.cookie('forum_' + v.element.seq)) {
10823							page_num = $.cookie('forum_' + v.element.seq);
10824						} 
10825						_this.forumUpdate(v.element.seq, page_num, v.view, c.page, v.list);
10826					} else if(c.type == 'gallery') {
10827	                    _this.galleryEL[c.seq] = {
10828	                    	'seq' : c.seq,
10829	                    	'elname' : c.elname,
10830	                    	'eltag' : c.eltag,
10831	                    	'folder' : c.folder,
10832	                    	'mode' : c.mode,
10833	                    	'elsettings' : c.elsettings,
10834	                    	'feature' : c.feature,
10835	                    	'type' : c.type,
10836	                    	'type2' : c.type2,
10837							'searches' : c.searches
10838	                    };
10839
10840						_this.galleryUpdate(c,v);
10841                        if(c.only_category) {
10842                            localStorage.setItem('searches',JSON.stringify(new Array(c.searches.uri[0])));
10843                        }
10844
10845						if (isShoppingGradePriceHidden(c)) {
10846							$el.find('.figure.price').html('');
10847						}
10848
10849						//갤러리블럭 모바일 가로 갯수 설정 시 클래스추가
10850						var gal_css = CSSJSON.toJSON(htmlspecialchars_decode(c.elcss)),
10851							gal_s = style.get(gal_css,c.elname),
10852							gal_case = $el.attr('data-case');
10853						if(gal_s.__layout_m_on == 1 && gal_case != 'gallery61') {
10854							$el.addClass('el-col-m'+gal_s.__layout_col_mc);
10855						} else if(gal_s.__layout_m_on == 1 && gal_case == 'gallery61') {
10856							$el.addClass('el-col-m'+gal_s.__swiper_view_mc);
10857						}
10858					} else if(c.type == 'sync') {
10859						var sync_source = _this.syncUpdate($el,v.element);
10860						$el.html(sync_source);
10861
10862						if($el.find('[data-sync-loop="true"]').length > 0) {
10863							if(c.type2 == 'tab') $el.find('[data-sync-loop="true"] > li[data-list-no="1"]').attr('data-list-no','');
10864							if(c.type2 == 'imgpitem' && sync_list_total > 0) $el.find('[data-sync-loop="true"] > li:not([data-idx])').remove();
10865							$el.find('[data-sync-loop="true"] > li').eq(0).addClass('active').siblings().removeClass('active');
10866						}
10867						
10868					} else if(c.type == 'tabs') {
10869						// tab block 우선순위 check
10870						var $tabs = $el.find(".tab-box .tab:not(.hover)"),
10871							$initial_tab = ($tabs.filter('.checked').length > 0) ? $tabs.filter('.checked').first() : $tabs.filter('.active').first();
10872						if($initial_tab.length == 0) $initial_tab = $tabs.eq(0);
10873						if($tabs.filter('.checked').length > 0) {
10874							$tabs.removeClass('active');
10875							$initial_tab.addClass('active');
10876							$el.find('.tab-editor').removeClass('active');
10877							$el.find('.tab-editor.tabs' + $initial_tab.attr('data-order')).addClass('active');
10878						}
10879						var el = $el.attr('data-name'),
10880							len = $tabs.length,
10881							motion_style = $el.attr("tab-motion-style"),
10882							tab_counted = $el.attr("tab-count"),
10883							mobile_tab_count = $el.attr("mobile-tab-count"),
10884							tab_count = ($(window).width() < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : tab_counted,
10885							mobile_tab_line = $el.attr("mobile-tab-line"),
10886							tab_case = $el.attr("data-case"),
10887							motion = $el.attr("tab-motion"),
10888							priority = Number($initial_tab.attr('data-order')) || 1,
10889							navigation_use = $el.attr("navigation-use");
10890						tabArrow(el);
10891						if(navigation_use == '1' || ($(window).width() < 991 && mobile_tab_line == '1' && len > Number(tab_count))) {
10892							if(motion_style == 1) {
10893								var motion = (((priority + 1) - Number(tab_count)) >= 0) ? priority - Number(tab_count) : 0;
10894							} else {
10895								var motion = Math.ceil(Number(priority) / Number(tab_count)) - 1;
10896							}
10897							$el.attr('tab-motion', motion);
10898							tabMotion(el, motion, "", len, motion_style, tab_count, tab_case);
10899						}
10900
10901					} else if(c.type == 'sns' && c.type2 == 'feed') {
10902		                $el.find('.data-feed-load-more').attr('data-feed-el',c.elname);
10903		                $el.find('.data-feed-load-more').removeAttr('style');
10904		                $el.find('.show-posts').removeClass('show-posts');
10905
10906		                if(c.mode == 'site') {
10907							if(!$.isEmptyObject(b.SOCIAL)) {
10908								var load_sns = {};
10909								if(!$.isEmptyObject(b.SOCIAL.instagram) && typeof settings.sns_instagram != 'undefined' && settings.sns_instagram == 'ON') load_sns['instagram'] = b.SOCIAL.instagram;
10910								if(!$.isEmptyObject(b.SOCIAL.twitter) && typeof settings.sns_twitter != 'undefined' && settings.sns_twitter == 'ON') load_sns['twitter'] = b.SOCIAL.twitter;
10911
10912								if(!$.isEmptyObject(load_sns)) {
10913									loadingElement(c.elname,'loading posts...');
10914									updateFeed(c.elname, load_sns, settings, function() {
10915										$('.'+c.elname+' .listprogress').remove();
10916									});
10917								}
10918							}
10919		                } else {
10920							// SNS FEED:: before version
10921							if(typeof settings.sns != 'undefined' && settings.sns.twitter) {
10922								loadingElement(c.elname,'loading posts...');
10923								updateFeed(c.elname,settings.sns);
10924							}
10925		                }
10926
10927					} else if(c.type == 'others' && c.type2 == 'countdown') {
10928		                var el_dday = $el.find('[data-dday="true"]'),
10929		                	cd_date = (el_dday.attr('data-countdown')) ? el_dday.attr('data-countdown') : new Date(),
10930		                    dateformat  = { days : '%D', hours: '%H', minutes: '%M', seconds: '%S' },
10931		                    dateendformat  = { days : '00', hours: '00', minutes: '00', seconds: '00' };
10932						
10933						if( typeof settings.countdown != 'undefined' && settings.countdown ) {  //set - block setting date 
10934	                        cd_date = settings.countdown;
10935		                }
10936		                if( !el_dday.attr('data-countdown') && typeof cd_date == 'object' ) { //set - example date
10937		                    cd_date.setTime(cd_date.getTime() + (35*24*60*60*1000));
10938		                }
10939			            cd_date = moment(cd_date).format('YYYY/MM/DD HH:mm:ss');
10940			            
10941						el_dday.countdown(cd_date, function(event) {
10942							$(this).find('.date-item[data-datetype]').each(function(i) {
10943								var dd_type = $(this).attr('data-datetype'),
10944									dd_format = $(this).attr('data-format'),
10945									dd_endformat = $(this).attr('data-finish');
10946
10947								if(typeof dd_format == 'undefined' || !dd_format) dd_format = dateformat[dd_type];
10948								if(typeof dd_endformat == 'undefined' || !dd_endformat) dd_endformat = dateendformat[dd_type];
10949
10950								if(event.elapsed) $(this).text(dd_endformat);
10951								else $(this).text(event.strftime(dd_format));
10952							});
10953						});
10954                		if($el.find('[data-bg-video="true"]').length > 0) resizeVideoIframe($el);
10955					}
10955 else if (c.type == 'latest') {
10956						var latest_data = (typeof settings.latest_data != 'undefined' && settings.latest_data) ? settings.latest_data : {};
10957						$.latest.init(c.seq,latest_data);					
10958					} else if (c.type == 'review') {
10959						_this.galleryEL[c.seq] = {
10960							'seq' : c.seq,
10961							'elname' : c.elname,
10962							'eltag' : c.eltag,
10963							'folder' : c.folder,
10964							'mode' : c.mode,
10965							'elsettings' : c.elsettings,
10966							'feature' : c.feature,
10967							'type' : c.type,
10968							'type2' : c.type2,
10969							'searches' : c.searches
10970						};
10971		                var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
10972                		$.reviewContents.init(c.seq, gallery_data);
10973		            } else if (c.type == 'form' || (c.type == 'contact' && c.type2 == 'franchise bar')) {
10974						$.forms.init(c.seq);
10975		            } else if (c.type == 'contact') {
10976		            	if(c.type2 == 'franchise map') {
10977		            		$.each($el.find('[data-fmap-loop="true"] .item .item-name'), function(i, v) {
10978		                        let itemName = $(v).html();
10979		                        itemName = itemName.replace(/&lt;&nbsp;/g, '&lt;').replace(/&nbsp;&gt;/g, '&gt;');
10980		                        $(v).html(itemName);
10981		                    });
10982		                    
10983		            		var $mapItem = $el.find('[data-fmap-loop="true"] > .item.selected');
10984                    		drawMap($mapItem, $el);
10985                    		fmapMobilePaging($el);
10986		            	}
10987		            } else if (c.type == 'calendar') {
10988						var currentDate = new Date(),
10989							getYear = currentDate.getFullYear(),
10990							getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"),
10991							yearMonth = getYear + '-' + getMonth;
10992						$.cl_calendar.init(c.sid, c.seq, yearMonth, c);
10993					} else if (c.type == 'showcase') {
10994						if($el.hasClass('carousel') && $el.find('.item').length > 1 && $el.find('.control-box .carousel-control').hasClass('hide')) {
10995							$el.find('.control-box .carousel-control').removeClass('hide');
10996						}
10997
10998						slideEffectClassAdd($el);
10999					}
11000
11001					if($el.find('.slick').length > 0) {
11002						if (c.type == 'sync' && typeof syncSlickFn == 'function') syncSlickFn('.' + c.elname);
11003						else if($el.is('[data-clslick]') && typeof clSlickFn == 'function') clSlickFn('.' + c.elname);
11004					}
11005
11006					if(data_aos_attr) {
11007						$el.removeClass('aos-animate');
11008						$el.addClass('render-aos');
11009						setTimeout(function(){
11010							$el.removeClass('render-aos').addClass('aos-animate');
11011						})
11012						$el.attr('data-aos-dummy', data_aos_attr)
11013					}
11014
11015					// console.log(c.seq, c.type, settings);
11016					if($.inArray(c.type, ['contents', 'text', 'image', 'video', 'sns']) > -1) {
11017	            		let ecs = enableContentsSlider(c.seq, c.type, settings);
11018						if(typeof settings.list_type != 'undefined' && settings.list_type == 's' && ecs) {
11019							// console.log('enable slider');
11020		                    $.contentsSlider.ready(c.seq).then(() => {$.contentsSlider.init(c.seq, settings)});
11021		                }
11022		            }
11023
11024					changeBrokenImages($el);
11025
11026		            idx++;
11027		    	});
11028
11029				
11030				// $('.tag.preloading').replaceWith(function () {
11031				//     return $(this).html();
11032				// });
11033
11034				if(check_modoo) {
11035					m_floating(fl_data);
11036				}  else if (property?.SETTINGS?.modoo?.floating) { // 모두 사이트 메뉴 디자인 변경 시 dsgn-body에 modoo가 포함되지 않아 모바일에서 퀵메뉴 안 보이는 문제 해결					        
11037					m_floating(fl_data);
11038				}
11039
11040				$('.preloading').removeClass('preloading');
11041				document.querySelectorAll('.element video').forEach(function(video) {
11042					if(video.readyState > 0) video.classList.add('loaded');
11043					video.addEventListener('loadeddata', function() {
11044						this.classList.add('loaded');
11045					});
11046				});
11047
11048				// b.ISLOCK = (!b.VALIDPLAN) ? 'false' : b.ISLOCK;
11049				if(b.ISLOCK == 'true') {
11050					$('.locked').remove();
11051					return deferred.resolve({'showOnlyFooter':true});
11052				}
11053				
11054            	if($('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').length && (typeof kakao == 'undefined' || typeof kakao.maps == 'undefined' || 
11054kakao.maps == null || property.VALIDPLAN == '')) {
11055	                $('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').html('지도연결해제됨. Javascript키 확인');
11056	                $('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').html('<iframe class="google-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.5659473821083!2d127.0282496015659!3d37.494568!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1598c361b2b%3A0xdbf9af292beff3c!2z6rCV64Ko!5e0!3m2!1sko!2skr!4v1637303748377!5m2!1sko!2skr" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"></iframe>');
11057	            } else {
11058					$('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').each(function() {
11059						var container = this;
11060                        var lat = $(this).data("lat");
11061                        var lng = $(this).data("lng");
11062                        var zoomInOut = $(this).data("zoominout");
11063                        var mapTitle = $(this).data("maptitle");
11064                        var mapContent = $(this).data("mapcontent");
11065                        var useTitle = $(this).data("usetitle");
11066                        var useContent = $(this).data("usecontent");
11067
11068                        if (typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
11069                        if (typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
11070                        if (typeof mapContent == 'undefined' || !mapContent) mapContent = '';
11071                        if (typeof useTitle == 'undefined' || !useTitle) useTitle = false;
11072                        if (typeof useContent == 'undefined' || !useContent) useContent = false;
11073                        
11074                        var options = { center: new kakao.maps.LatLng(lat, lng), level: 3 };
11075                        var c_map = new kakao.maps.Map(container, options);
11076                        var marker = new kakao.maps.Marker({ position: new kakao.maps.LatLng(lat, lng), map: c_map });
11077
11078		                if(zoomInOut == true) {
11079	                        var zoomControlHtml = '';
11080	                        zoomControlHtml += '\
11081	                            <div class="zoom-control" style="margin-top: 8px; margin-right: 8px; right: 0; width: 30px; position: absolute; background-color: #fff; z-index: 1; border-radius: 3px; box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.16);">\
11082	                                <div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
11083	                                    <svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 11h-4V7c0-.55-.45-1-1-1s-1 .45-1 1v4H7c-.55 0-1 .45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1v-4h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
11084	                                </div>\
11085	                                <div class="slider-wrap-container" style="height: 130px;">\
11086	                                    <div class="slider-wrap small" style="text-align: center; height: 100%;">\
11087	                                        <div style="max-height: 100%;" class="zoom-control-slider"></div>\
11088	                                    </div>\
11089	                                </div>\
11090	                                <div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
11091	                                    <svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 13H7c-.55 0-1-.45-1-1s.45-1 1-1h10c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>\
11092	                                </div>\
11093	                            </div>\
11094	                        ';
11095	                        var $zoomController = $(zoomControlHtml);
11096	                        $(container).append($zoomController);
11097	                        var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
11098	                            'orientation': 'vertical',
11099	                            'min' : 1,
11100	                            'max' : 14,
11101	                            'step' : 1,
11102	                            'value' : 3,
11103	                            'handle' : '<div>dfafasdfas</div>',
11104	                            // 'reversed' : true,
11105	                            'tooltip' : 'hide',
11106	                        }).on('slide', function(data) {
11107	                            c_map.setLevel(data.value);
11108	                            c_map.setCenter(marker.getPosition());
11109	                        }).on('slideStop', function(data) {
11110	                            c_map.setLevel(data.value);
11111	                            c_map.setCenter(marker.getPosition());
11112	                        });
11113
11114	                        $zoomController.find('.btn-zoom-control').on('click', function() {
11115	                            if($(this).data('inout') == 'I') {
11116	                                c_map.setLevel(c_map.getLevel() - 1);
11117	                                zoom_slider.slider('setValue', c_map.getLevel());
11118	                            } else if($(this).data('inout' == 'O')) {
11119	                                c_map.setLevel(c_map.getLevel() + 1);
11120	                                zoom_slider.slider('setValue', c_map.getLevel());
11121	                            }
11122	                        });
11123
11124			                kakao.maps.event.addListener(c_map, 'zoom_changed', function() {
11125			                    zoom_slider.slider('setValue', c_map.getLevel());
11126			                });
11127		                }
11128
11129		                if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
11130		                    var iwContent = '';
11131		                    if(useTitle == true && mapTitle) {
11132		                        iwContent = '<div class="title">' + mapTitle + '</div>';
11133		                    }
11134		                    if(useContent == true && mapContent) {
11135		                        iwContent += '<div class="content">' + mapContent + '</div>';
11136		                    }
11137	                        if(iwContent) {
11138	                            iwContent = '<div class="contact-map-info-window"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0C4.69 0 2 2.69 2 6s1 4 6 10c5-6 6-6.69 6-10s-2.69-6-6-6zm0 8.3a2.3 2.3 0 1 1 0-4.6 2.3 2.3 0 0 1 0 4.6z"></path></svg>
11138' + iwContent + '</div>';
11139	                            var infoWindow = $(iwContent);
11140	                            $(container).append(infoWindow);
11141	                        }
11142		                }
11143						$(window).on("resize", function() {
11144							c_map.relayout();
11145							c_map.setCenter(marker.getPosition());
11146						});
11147					});
11148				}
11149
11150	            if($('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').length && (typeof naver == 'undefined' || typeof naver.maps == 'undefined' || naver.maps == null || property.VALIDPLAN == '')) {
11151	                $('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').html('지도연결해제됨. Client ID 확인');
11152	                $('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').html('<iframe class="google-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.5659473821083!2d127.0282496015659!3d37.494568!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1598c361b2b%3A0xdbf9af292beff3c!2z6rCV64Ko!5e0!3m2!1sko!2skr!4v1637303748377!5m2!1sko!2skr" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"></iframe>');
11153	            } else {
11154					$('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').each(function() {
11155						var container = this;
11156						var lat = $(this).data("lat");
11157						var lng = $(this).data("lng");
11158						var options = { center: new naver.maps.LatLng(lat, lng), zoom: 17};
11159		                var zoomInOut = $(this).data("zoominout");
11160		                var zoom = $(this).data("zoom");
11161		                var mapTitle = $(this).data("maptitle");
11162		                var mapContent = $(this).data("mapcontent");
11163		                var useTitle = $(this).data("usetitle");
11164		                var useContent = $(this).data("usecontent");
11165		                if(typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
11166		                if(typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
11167		                if(typeof mapContent == 'undefined' || !mapContent) mapContent = '';
11168		                if(typeof useTitle == 'undefined' || !useTitle) useTitle = false;
11169		                if(typeof useContent == 'undefined' || !useContent) useContent = false;
11170						var c_map = new naver.maps.Map(container, options);
11171						var marker = new naver.maps.Marker({ position: new naver.maps.LatLng(lat, lng), map: c_map});
11172
11173		                if(zoomInOut == true) {
11174	                        var zoomControlHtml = '';
11175	                        zoomControlHtml += '\
11176	                            <div class="zoom-control" style="margin-top: 8px; margin-right: 8px; right: 0; width: 30px; position: absolute; background-color: #fff; z-index: 1; border-radius: 3px; box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.16);">\
11177	                                <div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
11178	                                    <svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 11h-4V7c0-.55-.45-1-1-1s-1 .45-1 1v4H7c-.55 0-1 .45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1v-4h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
11179	                                </div>\
11180	                                <div class="slider-wrap-container" style="height: 130px;">\
11181	                                    <div class="slider-wrap small" style="text-align: center; height: 100%;">\
11182	                                        <div style="max-height: 100%;" class="zoom-control-slider"></div>\
11183	                                    </div>\
11184	                                </div>\
11185	                                <div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
11186	                                    <svg style="fill: #6b6b6b; margin: 3px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 13H7c-.55 0-1-.45-1-1s.45-1 1-1h10c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>\
11187	                                </div>\
11188	                            </div>\
11189	                        ';
11190	                        var $zoomController = $(zoomControlHtml);
11191	                        $(container).append($zoomController);
11192	                        var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
11193	                            'orientation': 'vertical',
11194	                            'min' : 6,
11195	                            'max' : 21,
11196	                            'step' : 1,
11197	                            'value' : 17,
11198	                            'handle' : '<div>dfafasdfas</div>',
11199	                            'reversed' : true,
11200	                            'tooltip' : 'hide',
11201	                        }).on('slide', function(data) {
11202	                            c_map.setZoom(data.value);
11203	                            c_map.setCenter(marker.getPosition());
11204	                        }).on('slideStop', function(data) {
11205	                            c_map.setZoom(data.value);
11206	                            c_map.setCenter(marker.getPosition());
11207	                        });
11208
11209	                        $zoomController.find('.btn-zoom-control').on('click', function() {
11210	                            if($(this).data('inout') == 'I') {
11211	                                c_map.setZoom(c_map.getZoom() + 1);
11212	                                zoom_slider.slider('setValue', c_map.getZoom());
11213	                            } else if($(this).data('inout' == 'O')) {
11214	                                c_map.setZoom(c_map.getZoom() - 1);
11215	                                zoom_slider.slider('setValue', c_map.getZoom());
11216	                            }
11217	                        });
11218
11219	                        naver.maps.Event.addListener(c_map, 'zoom_changed', function(zoom) {
11220	                            zoom_slider.slider('setValue', c_map.getZoom());
11221	                        });
11222		                }
11223		                
11224		                if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
11225		                    var iwContent = '';
11226		                    if(useTitle == true && mapTitle) {
11227		                        iwContent = '<div class="title">' + mapTitle + '</div>';
11228		                    }
11229		                    if(useContent == true && mapContent) {
11230		                        iwContent += '<div class="content">' + mapContent + '</div>';
11231		                    }
11232	                        if(iwContent) {
11233	                            iwContent = '<div class="contact-map-info-window"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0C4.69 0 2 2.69 2 6s1 4 6 10c5-6 6-6.69 6-10s-2.69-6-6-6zm0 8.3a2.3 2.3 0 1 1 0-4.6 2.3 2.3 0 0 1 0 4.6z"></path></svg>
11233' + iwContent + '</div>';
11234	                            var infoWindow = $(iwContent);
11235	                            $(container).append(infoWindow);
11236	                        }
11237		                }
11238						$(window).on("resize", function() {
11239							// c_map.relayout();
11240							c_map.setCenter(marker.getPosition());
11241						});
11242					});
11243				}
11244
11245				$('.element [data-map="true"]:not(iframe)').each(function() {
11246					var map_url = $(this).attr('data-url');
11247					if(typeof map_url != 'undefined' && map_url) {
11248						var map_iframe = getMapURL(map_url,'html');
11249						$(this).replaceWith(map_iframe);
11250						if(map_iframe.indexOf('google-map disabled') === -1) $(this).next('.map-undefined').remove();
11251					}
11252				});
11253                
11254				if($('.element a[data-popup][data-popup-name]').length > 0 && (!b.VALIDPLAN || b.VALIDTYPE == 'PK')) {
11255					$('.element a[data-popup][data-popup-name]').addClass('disabled');
11256				}			
11257				if($('.element[data-layout]').length > 0) {
11258	                setLayoutHeight();
11259	            }
11260	            // if($('.element[data-parallax="true"]').length > 0 && $('.element[data-parallax-type="scroll"]').length > 0) setParallax();
11261				if(typeof setBlockParallax == 'function') setBlockParallax($('.element'));
11262
11263		    	$('.dsgn-body').fitVids();
11264
11265				if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh();
11266				$('html').toggleClass('gtoolbar-sticky-ON', $('.cl-gtoolbar[data-sticky="ON"]').length > 0 ? true : false);
11267				deferred.resolve();
11268		    });			
11269		});
11270		//parallax();
11271	    return deferred.promise();
11272    },
11273    setLoginout : function (show, sid, site, profileimg) {
11274		if(show=='1') {
11275			$.getJSON('/template/checkLogin', function(data) {
11276				if(data.user && site) {
11277					if($('#tpl-menu').find('.loginout')) $('#tpl-menu').find('.loginout').remove();
11278					setLoginoutNav(sid, function() {
11279						getProfileMember();
11280						getProfileAuthor(sid,profileimg);
11281						$('.el_0').css('margin-top','55px');
11282					});
11283				} else {
11284					$('#tpl-menu').append('<li class="loginout"><a href="javascript:;" title="CREATORLINK login"><i class="fa fa-user"></i></a></li>'); 
11285				}
11286			});
11287	    }
11288    },
11289    liveUpdate : function(obj) {
11290    	// console.log('liveUpdate');
11291
11292    	var b = this.b;
11293		$.psearch = $.psearch || {};
11294		if(typeof $.psearch.normalizeHref != 'function') {
11295			$.psearch.normalizeHref = function(href) {
11296				href = (href || '').toString().trim();
11297				if(!href) return '';
11298
11299				href = href.replace(/^\/render/i, '');
11300				href = href.split('#')[0].split('?')[0];
11301
11302				if(/^https?:\/\//i.test(href)) {
11303					try { href = new URL(href).pathname; } catch(e) {}
11304				}
11305
11306				href = href.replace(/\/view\/\d+$/i, '');
11307
11308				if(href && href.charAt(0) !== '/') href = '/' + href;
11309				return href;
11310			};
11311		}
11312		if(typeof $.psearch.buildMenuBreadcrumbMap != 'function') {
11313			$.psearch.buildMenuBreadcrumbMap = function(menuOption) {
11314				var map = {};
11315				if(!menuOption || !menuOption.length) return map;
11316
11317				for(var i = 0; i < menuOption.length; i++) {
11318					var m = menuOption[i];
11319					var mainName = (m && m.name) ? m.name : '';
11320					var mainHref = $.psearch.normalizeHref(m && m.href);
11321
11322					if(mainHref) {
11323						map[mainHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName;
11324					}
11325
11326					var children = (m && m.children) ? m.children : [];
11327					for(var j = 0; j < children.length; j++) {
11328						var c = children[j];
11329						var subName = (c && c.name) ? c.name : '';
11330						var subHref = $.psearch.normalizeHref(c && c.href);
11331
11332						if(subHref) {
11333							map[subHref] = $.lang[LANG]['editor.resource.icon.home'] + ' > ' + mainName + ' > ' + subName;
11334						}
11335					}
11336				}
11337				return map;
11338			};
11339		}
11340
11341		var checkSidebar = $('.el-menu > header').hasClass('sidebar'),
11342			checkClnav =  $.clnav.check(),
11343			menu_class = {
11344				'navlist': (checkClnav) ? 'cl-nav-list ' : '',
11345				'navitem': (checkClnav) ? 'cl-nav-item ' : '',
11346				'subnavlist': (checkClnav) ? 'cl-subnav-list ' : '',
11347				'subnavitem': (checkClnav) ? 'cl-subnav-item ' : '',
11348			},
11349			menu = (checkClnav) ? $('.el-menu > header.cl-nav .cl-nav-list') : $('#tpl-menu'),
11350	        idx = 0,
11351	        regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/,
11352	        regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
11353	    menu.empty();
11354    	
11355		if($('.fmcss').length > 0) $('.fmcss').remove(); //forum background css
11356
11357	    $.each(obj, function (idx, obj) {
11358	    	if(obj.name == '전체상품') {
11359	    		if(b.LUX || b.VALIDTYPE != 'SM' || !b.SLANG || (typeof b.SLANG.select_code !== 'undefined' && b.SLANG.select_code != 'ko')){
11360	    			return true;
11361	    		}
11362	    	}
11363	    	
11364	        b.MENULIST.push(obj.name.replace(/ /g,'-'));
11365	        if(obj.children) {
11366	            $.each(obj.children, function (idx, obj){
11367	                b.MENULIST.push(obj.name.replace(/ /g,'-'));
11368	            });
11369	        }
11370	    });
11371
11372		if(b.ONE) {
11373			linkUrl = (b.VIEW) ? '/#' : '#';
11374			linkUrl = (b.VIEW && !b.PUBLISH) ? '/render/index#' : linkUrl;
11375		} else {
11376			linkUrl = (b.URL=='/') ? '/' : b.URL + '/';  
11377		}
11378
11379		for (i = 0; i < obj.length; i++) {
11380            var link = obj[i].name;
11381			if(b.MENULIST.includes(link.replace(/ /g, '-'))) link = link.replace(/ /g, '-');
11382			
11383            if(link == '전체상품') {
11384	            if(b.LUX || b.VALIDTYPE != 'SM' || !b.SLANG || (typeof b.SLANG.select_code !== 'undefined' && b.SLANG.select_code != 'ko')) {
11385	                continue;
11386	            }
11387	        }
11388
11389			var parent = b.PAGE.split(','),
11390				link_text = '', 
11391				target = '', 
11392				name = (checkClnav) ? `<span class="cl-nav-name">${obj[i].name}</span>` : obj[i].name,
11393				isInner = '',
11394				isBookmark = '', 
11395				isFlink = '';
11396
11397			if(i==0) {
11398				if(obj[i].display=='on') {
11399					b.MENUCHECK.intro = true;
11400					b.MENULINK.push(link);
11401				}
11402				continue;
11403			}
11404
11405			if(obj[i].name =='전체상품') {
11406	            obj[i].link = '';
11407	        }
11408
11409			var active = (link == b.PAGE || link == parent[0]) ? 'active' : '',
11410				sub = obj[i].children.length;
11411
11412			if (obj[i].display == 'on') {
11413				b.MENUCHECK.main = true;
11414
11415				var menuoption_child = [];
11416				var checkLink = (obj[i].link) ? true : false,
11417					checkLinkInner = (checkLink && $.inArray(obj[i].link.replace(/ /g,'-'), b.MENULIST) > -1) ? true : false,
11418					checkLinkBookmark = (typeof obj[i].link !='undefined' && obj[i].link.match(/^\@/g) !== null) ? true : false,
11419					checkLinkFile = (typeof obj[i].link !='undefined' && obj[i].link.match(/^flink\@[0-9]/gi) !== null) ? true : false,
11420					checkLinkFolder = (typeof obj[i].link !='undefined' && obj[i].link === 'folder-menu') ? true : false;
11421
11422				link = (checkLink) ? ((checkLinkInner) ? obj[i].link.replace(/ /g,'-') : obj[i].link) : link;
11423				isInner = (checkLinkInner) ? obj[i].link.replace(/ /g,'-') : '';
11424				isBookmark = (checkLinkBookmark) ? ` attr-bookmark="${link.replace(/^\@/g,'')}"` : '';
11425				isFlink = (checkLinkFile) ? ` attr-flink="${link.replace(/^flink\@/gi,'')}"` : '';
11426				isFolder = (checkLinkFolder) ? ` attr-folder="true"` : '';
11427				target = (obj[i].ltarget == '_blank') ? 'target="_blank"' : '';
11428
11429				if(checkLink && !checkLinkInner && !checkLinkBookmark) {												// link-type: link-out      ==> a[attr-link]
11430					if(checkBase64Encode(link)) link = Base64.decode(link);
11431				}
11432
11433				if(link == 'folder-menu') {
11434					link_text = 'javascript:;';
11435					target = '';
11436					if(typeof menu.closest('.navbar-menu-'+b.SID).attr('data-submenu') != 'undefined') target = ' data-toggle="dropdown" aria-expanded="false" data-submenu="true" ';
11437				} else {
11438					if(!checkLink) b.MENULINK.push(link);
11439					link_text = (b.MENULIST.includes(link)) ? linkUrl + link : (!regex2.test(link) && regex.test(link)) ? '//' + link : link;
11440				}
11441
11442	            if (sub) {
11443	                var sub_menu = '',
11444	                    sub_show = 0;
11445
11446	                sub_menu = `<ul class="${menu_class['subnavlist']} dropdown-menu">\r\n`;
11447	                for (j = 0; j < obj[i].children.length; j++) {
11448	                    var child = obj[i].children,
11449							checkChildLink = (child[j].link) ? true : false,
11450							checkChildLinkInner = (checkChildLink && b.MENULIST.includes(child[j].link.replace(/ /g, '-'))) ? true : false,
11451							checkChildLinkBookmark = (typeof child[j].link!='undefined' && child[j].link.match(/^\@/g) !== null) ? true : false,
11452							checkChildLinkFile = (typeof child[j].link!='undefined' && child[j].link.match(/^flink\@[0-9]/gi) !== null) ? true : false,
11453							child_link = (checkChildLink) ? ((checkChildLinkInner) ? child[j].link.replace(/ /g,'-') : child[j].link) : '',
11454							child_isInner = (checkChildLinkInner) ? child[j].link.replace(/ /g,'-') : '',
11455							child_isBookmark = (checkChildLinkBookmark) ? ` attr-bookmark="${child_link.replace(/^\@/g,'')}"` : '',
11456							child_isFlink = (checkChildLinkFile) ? ` attr-flink="${child_link.replace(/^flink\@/gi,'')}"` : '',
11457							sub_link = (child_link) ? child_link : child[j].name.replace(/ /g, "-"),
11458							sub_target = (child[j].ltarget == '_blank') ? 'target="_blank"' : '',
11459							sub_name = (checkClnav) ? `<span class="cl-subnav-name">${child[j].name}</span>` : child[j].name,
11460							sub_active = '', 
11461							sub_link_text = '';
11462
11463						if(checkChildLink && !checkChildLinkInner && !checkChildLinkBookmark) {							// link-type: link-out      ==> a[attr-link]
11464							if(checkBase64Encode(child_link)) sub_link = Base64.decode(child_link);
11465						}
11466
11467						var page_arr = (b.VIEW) ? b.PAGE.split(',') : [b.PAGE];
11468						if (!active && (sub_link == page_arr[0] || link == parent[0])) {
11469							sub_active = 'active';
11470							active = 'open';
11471							if(!checkClnav && $('body').width() > 768) active = 'active';
11472						}	                    	
11473
11474	                    if (child[j].display == 'on') {
11475							b.MENUCHECK.sub = true;
11476							if(!checkChildLink) b.MENULINK.push(child[j].name.replace(/ /g, '-'));
11477	                        sub_link_text = ($.inArray(sub_link,b.MENULIST) > -1) ? linkUrl+sub_link : (!regex2.test(sub_link) && regex.test(sub_link)) ? '//'+sub_link : sub_link;
11478							sub_menu += `
11479								<li class="${menu_class['subnavitem'] + sub_active}"><a href="${sub_link_text}" ${sub_target + child_isBookmark + child_isFlink}>${sub_name}</a></li>\r\n
11480							`;
11481	                        sub_show++;
11482
11483							menuoption_child.push({
11484								'idx0': b.MENUOPTION.length,
11485								'idx1': menuoption_child.length,
11486								'name': child[j].name,
11487								'active': sub_active,
11488								'href': sub_link_text,
11489								'target': sub_target,
11490								'isinner': child_isInner,
11491								'isbookmark': child_isBookmark,
11492								'isflink': child_isFlink,
11493								'depth': 1,
11494								'topmobile': child[j].topmobile,
11495							});
11496	                    }
11497	                }
11498	                sub_menu = sub_menu +'</ul>\r\n';
11499	                var caret = (checkSidebar) ? ' <i class="fa fa-caret-right fa-1" aria-hidden="true"></i>' : ' <i class="fa fa-caret-down fa-1" aria-hidden="true"></i>';
11500	                
11501					if (sub_show) {
11502                		var sub_menu_open = (typeof menu.closest('.navbar-menu-'+b.SID).attr('data-submenu') != 'undefined' && menu.closest('.navbar-menu-'+b.SID).attr('data-submenu') == 'open' && active != 'open') ? 'open' : '';
11503						menu.append(`\r\n<li class="${menu_class['navitem'] + active + sub_menu_open} dropdown"><a href="${link_text}" class="dropdown-toggle" ${target + isBookmark + isFlink}>${name + caret}</a></li>\r\n`);
11504	                } else {
11505	                	menu.append(`\r\n<li class="${menu_class['navitem'] + active}"><a href="${link_text}" ${target + isBookmark + isFlink}>${name}</a></li>\r\n`);
11506	                }
11507	                if(sub_show) menu.find('.dropdown:last').append(sub_menu);
11508	            } else {
11509	            	menu.append(`\r\n<li class="${menu_class['navitem'] + active}"><a href="${link_text}" ${target + isBookmark + isFlink}>${name}</a></li>\r\n`);
11510	            } 
11511
11512				b.MENUOPTION.push({
11513					'idx0': b.MENUOPTION.length,
11514					'name': obj[i].name,
11515					'active': active,
11516					'href': link_text,
11517					'target': target,
11518					'isinner': isInner,
11519					'isbookmark': isBookmark,
11520					'isflink': isFlink,
11521					'isfolder': isFolder,
11522					'depth': 0,
11523					'children': menuoption_child,
11524					'topmobile': obj[i].topmobile,
11525				});
11526
11527	            idx++;
11528	        }
11529		}
11530
11531
11532		// menu ver3 : fheader
11533		//              - Add #fixed-menu, #mobile-nav
11534		//              - Set mobile-design
11535		if ($.clnav.check()) $.clnav.init();
11536		else if ($('header.navbar').hasClass('navbar-fheader')) $.fheader.init();
11537
11538		if(	typeof b.VALIDPLAN != 'undefined' && b.VALIDPLAN && 
11539			typeof b.VALIDTYPE != 'undefined' && b.VALIDTYPE != 'PK'
11540		) {
11541			if(b.VALIDTYPE == 'SM') {
11542				$.umember.init(b.SITEUM,b.SITEUMLANG,b.SITEUMDISPLAY, function() { 
11543					$.psearch.init();
11544					$.shopping.init();
11545					$.slang.init(b.SLANG);
11546				});
11547			} else if(b.VALIDTYPE == 'BN') {
11548				$.umember.init(b.SITEUM,b.SITEUMLANG,b.SITEUMDISPLAY, function() { 
11549					$.slang.init(b.SLANG); 
11550				});
11551			} else {
11552				$.slang.init(b.SLANG);
11553			}
11554		} else {
11555			$.slang.init();
11556		}
11557
11558		// menu ver3 : fheader
11559		//             - Set site page top padding
11560		//             - Set menu config btn position
11561		if ($('header.navbar').hasClass('navbar-fheader')) $.fheader.set();
11562		property.MENU_BREADCRUMB_MAP = $.psearch.buildMenuBreadcrumbMap(b.MENUOPTION);
11563
11564	    $('header .navbar-nav').removeClass('hide').removeClass('preloading');
11565	    $('body,html').animate({scrollTop: 0}, 300,'easeInOutQuart');
11566
11567	},
11568	syncUpdate : function($el,data) {
11569		$('#el-empty').empty().append($el.outerHTML());
11570		var $sync = $('#el-empty'),
11571			nodes = $sync.find('.item'),
11572			$sync_row = ($sync.find('.sync-option').length > 0) ? $sync.find('.sync-row') : $sync.find('.slick'),
11573            $sync_loop = $sync.find('[data-sync-loop="true"]'),
11574            checkSyncGalleryFrame = false,
11575            checkSyncHtmlReplace = false,
11576            sync_gallery = {},
11577            p = _this.b.RESOURCE + '/' + _this.b.SID + '/';
11578		
11579		checkSyncHtmlReplace = ($sync.find('input.sync-option').length > 0 && $sync.find('.layout-container').length == 0) ? true : false;
11580		setOldVerBlockView($sync,data);
11581
11582		if(typeof data.sync !='undefined' && typeof data.sync.list != 'undefined' && (data.sync.list).length) {
11583			$sync_row.empty();
11584			var nodes_count = nodes.length;
11585			$.each(data.sync.list, function(i,v) {
11586				var nodes_pos = i % nodes_count,
11587					$item = $(nodes[nodes_pos]);
11588				var imgbg_check = (typeof $item.find('.img-bg').attr('style') == 'undefined') ? false : true,
11589					href = '/' + v.page + '/view/' + v.seq,
11590					alink = (_this.b.PUBLISH) ? href : '/render' + href;
11591
11592                switch(v.type) {
11593                    case "gallery":
11594                        var img = getServeImage(v.image,'0',p);
11595                        (v.mode == 'project') ?
11596                            $item.find('a').attr('href', alink) :
11597                            $item.find('a').attr('href', img).attr('data-gallery','').attr('data-title',v.title); 
11598                        break;
11599                    case "shopping":
11600                    	if(typeof data.sync.member_only[v.pid] != 'undefined' && data.sync.member_only[v.pid] == 'ON') {
11601                        	if(_this.b.UMEMBER.check_login == true) {
11602                        		$item.find('a').attr('href',alink);
11603                        	} else {
11604                        		$item.find('a').attr('href','javascript:member_only_item();');
11605                        	}
11606                        } else $item.find('a').attr('href',alink);
11607                        break;
11608
11609                    case "lux":
11610                        $item.find('a').attr('href',(_this.b.PUBLISH) ? '/_product/' + v.seq : '/render/_product/' + v.seq);
11611                        break;
11612                }
11613                var brand_name = (v.brand_name != 'undefined' && v.brand_name && v.brand_name != '-') ? v.brand_name : '';
11614				$item.find('img').attr('src',v.image);
11615				$item.find('.brand').html(brand_name);
11616				$item.find('.name').html(v.title);
11617				$item.find('.caption').html(v.caption);
11618
11619                if(v.type == 'gallery' && v.mode == 'gallery') {
11620                    checkSyncGalleryFrame = true;
11621                    sync_gallery.elsettings = v.elsettings;
11622                    sync_gallery.type = 'gallery';
11623                }
11624                if(typeof data.sync.member_only[v.pid] != 'undefined' && data.sync.member_only[v.pid] == 'ON' && _this.b.UMEMBER.check_login == false) {
11625                    $item.find('.price').addClass('hidden');
11626                    $item.find('.sale').addClass('hidden');
11627                    $item.find('.price-sale').addClass('hidden');
11628	                } else {
11629	                    var syncGsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {};
11630	                    var syncBlockSettings = {};
11631	                    if (data && data.element && data.element.elsettings) {
11632	                        try {
11633	                            syncBlockSettings = (typeof data.element.elsettings == 'string') ? $.parseJSON(data.element.elsettings) : data.element.elsettings;
11634	                        } catch(e) {
11635	                            syncBlockSettings = {};
11636	                        }
11637	                    }
11638	                    var baseSyncPrice = (v.price !== '') ? Number(v.price) : 0;
11639	                    var baseSyncSalePrice = (v.sale > 0 && v.sale >
11639 baseSyncPrice) ? Number(v.sale) : 0;
11640	                    var syncPrice = baseSyncPrice;
11641	                    var syncSalePrice = baseSyncSalePrice;
11642	                    var syncSaleLabel = (v.sale_rate > 0) ? v.sale_rate + '%' : '';
11643	                    var syncGradePrice = 0;
11644	                    var syncGradeApplied = false;
11645	                    var syncGradeDisplay = syncBlockSettings.grade_price_display == 'ON';
11646	                    var syncGrade = getShoppingGradePreviewDiscountGrade(data.grade);
11647	                    var productGradeOnOff = getShoppingGradeProductGradeOnOff(v);
11648	                    $item.attr('data-editor-grade-price-enabled', productGradeOnOff).attr('data-config-grade-price-enabled', productGradeOnOff);
11649
11650	                    if (
11651	                        baseSyncPrice > 0 &&
11652	                        isShoppingGradeProductGradePriceEnabled(v)
11653	                    ) {
11654	                        syncGradePrice = calcShoppingGradeDisplayPrice(baseSyncPrice, syncGrade);
11655	                        syncGradeApplied = syncGradePrice !== null;
11656	                    }
11657
11658	                $item.find('.price').text('₩' + number_format(syncPrice));
11659
11660                    if(syncSaleLabel) {
11661                        $item.find('.sale').removeClass('hide hidden').text(syncSaleLabel);
11662                    } else {
11663                        if($item.find('.sale').parent().hasClass('img-content')) $item.find('.sale').addClass('hide');
11664                        else $item.find('.sale').addClass('hidden');
11665                        $item.find('.sale').text('');
11666                    }
11667					$item.find('.price-unit-pricing').remove();
11668					if(v.product_unit_str) {
11669						var tmp_unit_selector = ($item.find('ul.price-wrap').length > 0) ? `ul.price-wrap` : `.content`,
11670							tmp_unit_wrap = ($item.find('ul.price-wrap').length > 0) ? `li` : `div`;
11671						$item.find(tmp_unit_selector).append(`<${tmp_unit_wrap} class="price-unit-pricing">${v.product_unit_str}</${tmp_unit_wrap}>`); // 단위당 가격
11672					}
11673
11674					if(syncSalePrice > 0 && syncSalePrice > syncPrice) {
11675                        $item.find('.price-sale').removeClass('hidden hide').text('₩' + number_format(syncSalePrice));
11676                    } else {
11677	                    $item.find('.price-sale').addClass('hidden').text('');
11678                    }
11679
11680					$item.find('.grade-discount-price').remove();
11681					if(syncGradeDisplay && syncGradeApplied) {
11682						var syncGradeWrap = ($item.find('ul.price-wrap').length > 0) ? 'ul.price-wrap' : '.content',
11683							syncGradeTag = ($item.find('ul.price-wrap').length > 0) ? 'li' : 'div';
11684						$item.find(syncGradeWrap).append('<' + syncGradeTag + ' class="grade-discount-price"><span class="grade-discount-price-value">₩' + syncGradePrice.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + '</span><span class="grade-discount-price-label">나의 할인가</span></' + syncGradeTag + '>');
11685					}
11686                }
11687
11688                if(imgbg_check) $item.find('.img-bg').attr('style','background-image: url("' + v.image + '"');
11689				if($item.find('.sync-label-number').length > 0) $item.find('.sync-label-number').text(i+1);
11690                if(v.soldout) $item.find('.soldout').removeClass('hidden');
11691				$sync_row.append($item.outerHTML());
11692
11693				if(data.type2 == 'imgpitem' && $sync_loop.length > 0) {
11694					if($sync_loop.children('li').eq(i).length == 0) $sync_loop.append($sync_loop.children('li').eq(0).clone().removeClass('active'));
11695					$sync_loop.children('li').eq(i).attr('data-idx',i);
11696				}
11697                checkSyncHtmlReplace = true;				
11698			});
11699
11700            if(checkSyncGalleryFrame && typeof sync_gallery.type != 'undefined') {
11701                appendGalleryFrame($sync, data.seq, sync_gallery.type, sync_gallery.elsettings);
11702            }
11703            if(checkSyncHtmlReplace) tag = $sync.html();			
11704		}
11705		var r = $('#el-empty > .element:eq(0)').html();
11706		$('#el-empty').empty();
11707		// console.log(r);
11708		return r;		
11709	},
11710	galleryUpdate : function(el,data) {
11711		// console.log(`galleryUpdate: el`,el);
11712		var _this = this;
11713		$('#el-empty').append($(data.source));
11714		$('#el-empty').find('[data-loop="true"]').html('');
11715
11716		var checkGalleryListSample = false,
11717			checkGalleryListEmpty = true,
11718			source = data.source,
11719			nodes = $(source).find('[data-loop="true"]').children('.grid'),
11720			p = $('#el-empty').children(),
11721			g = p.clone().removeClass().addClass('galleryPL'+el.seq).addClass('gallery-popup'),
11722            i = [],
11723            view = $(source).find('[data-loop="true"]').data('view'),
11724            g_number = $(tag).find("[data-loop='true']").data('gallery-no'),
11725            total = (typeof data.total != 'undefined' && data.total) ? data.total : 0;
11726
11727        $('#el-empty').after(g);
11728        $(g).after('<div class="gallery-empty"></div>');
11729
11730        if(typeof view == 'undefined') view = 10;
11731
11732        var g_settings = (typeof el.elsettings == 'undefined' || el.elsettings == '') ? {} : $.parseJSON(el.elsettings),
11733        	cookie_page = 1,
11734            cookie_view = view,
11735            cookie_gallery_category = '',
11736            is_gc_cookie = (typeof $.cookie('gallery-category-'+el.seq) != 'undefined' && $.cookie('gallery-category-'+el.seq).length > 0) ? true : false,
11737            block_lang = (typeof g_settings.blocklang != 'undefined') ? g_settings.blocklang : LANG,
11738            field_oldver = (typeof g_settings.field_oldver != 'undefined' && g_settings.field_oldver.length > 0) ? g_settings.field_oldver : [];
11739            field_disable = (typeof g_settings.field_disable != 'undefined' && g_settings.field_disable.length > 0) ? g_settings.field_disable : [];
11740        var cookie_gallery_orderby = 'recent';
11741
11742		var category_onoff = (typeof g_settings.category_display != 'undefined' && g_settings.category_display) ? g_settings.category_display : 'OFF';
11743        var gallery_sort = (typeof g_settings.gallery_sort != 'undefined' && g_settings.gallery_sort) ? g_settings.gallery_sort : 'default';
11744		if(el.mode != 'shopping' && gallery_sort == 'product') gallery_sort = 'default';
11745
11746		// var adultonly_onoff = (typeof g_settings.adult_only != 'undefined' && g_settings.adult_only) ? g_settings.adult_only : 'OFF';
11747        if(	category_onoff == 'ON' &&
11748        	typeof $.cookie('ci_goto-gallery') != 'undefined' && $.cookie('ci_goto-gallery') == el.seq &&
11749        	typeof $.cookie('ci_goto-gallery-cate') != 'undefined' && g_settings.category.indexOf('|' + $.cookie('ci_goto-gallery-cate') + '|') > -1 &&
11750        	typeof g_settings.category != 'undefined' && g_settings.category 
11751    	) {
11752        	cookie_gallery_category = $.cookie('ci_goto-gallery-cate');
11753        	is_gc_cookie = true;
11754        } else if($.cookie('loadmore-' + el.seq)) {
11755			cookie_page = $.cookie('loadmore-'+el.seq);
11756			cookie_gallery_category = (typeof $.cookie('gallery-category-'+el.seq) != 'undefined') ? $.cookie('gallery-category-'+el.seq) : '';
11757            cookie_gallery_orderby = (typeof $.cookie('gallery-orderby-' + el.seq) != 'undefined') ? $.cookie('gallery-orderby-' + el.seq) : '';
11758			cookie_view = cookie_page * view;
11759        } else { 
11760			var checkCateHomeHide = (category_onoff == 'ON' &&
11761									typeof g_settings.category != 'undefined' && g_settings.category && 
11762									typeof g_settings.category_home_hide != 'undefined' && g_settings.category_home_hide) ? true : false;
11763			if(checkCateHomeHide) {
11764				var gc = g_settings.category.replace(/\|/g,'').split(',');
11765				cookie_gallery_category = gc[0];
11766				is_gc_cookie = true;
11767
11768				$.cookie('gallery-catehome-' + el.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
11769			}
11770        }
11771
11772        if(el.seq == 'all_products') {
11773        	// cookie_page = (typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products') != '')? $.cookie('gallery-page-all_products') : 1;
11774        	cookie_gallery_category = getAllProductsSortVal(g_settings);
11775        	// cookie_view = cookie_page * view;
11776        } else {
11777        	if(!property.VIEW) $.removeCookie('gallery-page-all_products', { path: '/' });
11778        }
11779
11780		$.cookie('gallery-page-' + el.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
11781		$.cookie('gallery-category-' + el.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
11782	    $.cookie('gallery-orderby-' + el.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
11783        $.removeCookie('loadmore-' + el.seq, { path : '/' });
11784
11785        var checkLoadmoreInLoop = ($(source).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
11786        var glm = $(source).find('.loadmore-wrap');
11787
11788		var checkGallerySVG = ($(source).find('.gimg-svg-wrap').length > 0) ? true : false,
11789			checkGFrameTitleOFF = (el.mode == 'gallery' && (typeof g_settings.gframe_title_visible != 'undefined' && g_settings.gframe_title_visible == 'OFF')) ? true : false;
11790
11791		var param = (el.page=='index,template' && property.param.indexOf('/org/') == -1) ? property.param + '/org/' + el.page : property.param;
11792		var post_data = { g_mode: el.mode, visible: true, sfl: 'category', stx: cookie_gallery_category };
11793
11794		if(el.seq == 'all_products') {
11795			post_data = { g_mode: el.mode, visible: true, sfl: 'orderby', stx: cookie_gallery_category };
11796		}
11797
11798		var g_data = {
11799			'list' : property.CONTENTS['el' + el.seq]['list'],
11800			'total' : property.CONTENTS['el' + el.seq]['total']
11801		}
11802
11803		var checkUseComment = checkUseCommentFunc(el.mode, el.eltag);
11804		var checkUseLike = checkUseLikeFunc(el.mode, el.eltag);
11805		
11806		$.each(g_data.list, function (idx, v) {
11807			i.push(v);
11808		});
11809		
11810		total = (typeof g_data.total.list_total != 'undefined') ? g_data.total.list_total : g_data.total;
11811		// total = (typeof g_data.total.list_total != 'undefined') ? g_data.total.list_total : 0;
11812		cookie_view = (cookie_view < total) ? cookie_view : total;
11813
11814		if( total > 0 ) checkGalleryListEmpty = false;
11815		if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
11816			var loop_count = nodes.length, item_index = 0, elem = [];
11817			$.each(g_data.list,function(index,v) {
11818				// console.log(v);
11819				loop_pos = index%loop_count;
11820				c = nodes[loop_pos];
11821				var isTitle = (v.title.length > 0) ? true:false;
11822				$(c).find('.non_text').removeClass('non_text');
11823
11824				if(el.mode != 'shopping') {
11825					if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
11826					if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
11827				}
11828
11829				v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
11830				v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
11831
11832				$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
11833				
11834
11835				var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
11836					img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
11837					img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
11838				
11839				var folder = (typeof data.element.folder == 'undefined' || data.element.folder == 0) ? '' : data.element.folder + '/',
11840					src = getServeImage(v.image,data.element.folder,img_path),
11841					src_s0 = getServeImage(v.image,'0',img_path);
11842				if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
11843
11844				if(el.mode == 'shopping') {
11845					if($(c).find('img').length > 0) $(c).find('img').attr('alt',v.title);
11846				} else if(typeof v.alt != 'undefined') {
11847				    alt_replace	= v.alt.replace(/\s+|\n+/g, '-');  
11848      				alt_replace.replace(/-+/g, '-')	
11849					if($(c).find('img').length > 0) $(c).find('img').attr('alt',alt_replace);						
11850				}
11851				ensureGalleryResponsiveImageClass($(c));
11852
11853				if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
11854				if(checkGallerySVG) {
11855					var gimgSVG = $(c).find('.gimg-svg-wrap svg');
11856					gimgSVG.find('pattern').attr('id','gimgSvg_'+el.elname+'_'+index);
11857					gimgSVG.find('image').attr('xlink:href', src);
11858					gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+el.elname+'_'+index+')');					
11859				}
11860
11861				var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
11862					glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
11863
11864				if(glink) {
11865					if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
11866						var bookmark_seq = glink.replace(/^\@/g,'');
11867						if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
11868							glink = '';
11869							glink_target = '';
11870						}
11871					} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
11872						glink_target = '';
11873					} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
11874					} else {																					// link-type: link-out      ==> a[attr-link]
11875						if(checkBase64Encode(glink)) glink = Base64.decode(glink);
11876					}
11877				}
11878
11879				$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
11880
11881				// var gallery_page_chmod = JSON.parse(property.CONTENTS['el' + v.pid]['element']['elsettings']).gallery_page_chmod,
11882				// 	umgrade = property.UMGRADE['grade_seq'];
11883				var entry =	(property && property.CONTENTS && property.CONTENTS['el' + v.pid]) || (property && property.CONTENTS && property.CONTENTS[String(v.pid)]) || null;
11884				var elsettingsRaw = entry && entry.element ? entry.element.elsettings : null;
11885				var elsettingsObj = elsettingsRaw;
11886
11887				if (typeof elsettingsRaw === 'string') {
11888					try { elsettingsObj = JSON.parse(elsettingsRaw); }
11889					catch (e) { console.error('[ERR] elsettings JSON 파싱 실패:', e, elsettingsRaw); elsettingsObj = {}; }
11890				}
11891
11892				var gallery_page_chmod = elsettingsObj && elsettingsObj.gallery_page_chmod || null;
11893				var umgrade = property && property.UMGRADE ? (property.UMGRADE.seq || property.UMGRADE.grade_id || null) : null;
11894				if (typeof gallery_page_chmod === 'string') {
11895					try { gallery_page_chmod = JSON.parse(gallery_page_chmod); }
11896					catch (e) { gallery_page_chmod = gallery_page_chmod ? gallery_page_chmod.split(',') : []; }
11897				}
11898				gallery_page_chmod = $.isArray(gallery_page_chmod) ? $.map(gallery_page_chmod, function(v) { return String(v); }) : [];
11899				umgrade = (umgrade !== null && typeof umgrade != 'undefined') ? String(umgrade) : null;
11900
11901				$(c).removeClass('noneShoppingGrade').removeAttr('data-shopping-grade-msg');
11902				if (isShoppingGradePriceHidden(v) && property['SITEUM'] >= 1) {
11903					$(c).addClass('gallery-item').addClass('nonePrice');
11904					$(c).find('a').attr('href', '#');
11905				} else {
11906
11907					if(isShoppingGradeBlocked(v, el.seq == 'all_products' ? g_settings : elsettingsObj, property)) { //쇼핑등급
11908						$(c).addClass('gallery-item').addClass('noneShoppingGrade');
11909						$(c).attr('data-shopping-grade-msg', getShoppingGradeBlockedMessage(v));
11910						$(c).find('a').attr('href', '#');
11911					} else {
11912						if(glink) {
11913							var glink_val = makeLinkUrl(glink, _this.b.ONE, _this.b.VIEW);
11914							$(c).find('a').attr('href',glink_val);
11915
11916							if(glink.match(/^\@/g) !== null) {
11917								$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
11918							} else if(glink.match(/^flink\@[0-9]/g) !== null) {
11919								$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
11920							// IE ERROR_includes__H.20210603
11921							// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
11922							} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
11923								$(c).find('a').attr('data-user-link',glink_val);
11924							} else {
11925								$(c).find('a').attr('attr-link',glink);
11926							}
11927						} else {
11928							if (el.mode == 'gallery') {
11929								src_s0 = src_s0 + '?gpos='+v.pos;
11930
11931								$(c).find('a').attr('href', src_s0);
11932								$(c).find('a').attr('data-gallery', '#gframe-' + el.seq);
11933							} else {
11934								if(el.seq == "all_products") {
11935									$(c).find('a').attr('href', v.product_url);
11936								} else {
11937									if(typeof URI == 'function') URI = '/';
11938									if(_this.b.LUX && el.mode == 'shopping') $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
11939									else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
11940								}
11941							}
11942						}
11943					}
11944				}
11945
11946				if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
11947				else $(c).find('a').removeAttr('target');
11948
11949				if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
11950				else $(c).find('a').attr('data-title', v.title);
11951
11952				// if(adultonly_onoff == 'ON') $(c).addClass('adultonly');
11953
11954				// caption
11955				var ftitle = $(c).find('h5.figure'),
11956					fcaption = $(c).find('p.figure').not('.comment'),
11957					fdatetime = $(c).find('.figure.datetime'),
11958					fhashtag = $(c).find('.figure.hashtag'),
11959					fbrand = $(c).find('.figure.brand'),
11960					fprice = $(c).find('.figure.price'),
11961					freview = $(c).find('.figure.review'),
11962					fcomment = $(c).find('.figure.comment'),
11963					flike = $(c).find('.figure.like'),
11964					fbasket = $(c).find('.figure.basket');
11965
11966				$(c).find('figcaption').removeClass('hide');
11967				
11968				if (v.title || v.caption) {
11969					var gallery_caption = v.caption;
11970					gallery_caption = gallery_caption.trim().replace(/\n/g,'<br />');
11971					
11972					ftitle.html(v.title);
11973					fcaption.html(gallery_caption);
11974					if(fdatetime.length > 0) fdatetime.text(v.datetime);
11975					if(fhashtag.length > 0) fhashtag.text(v.hashtag);
11976				}
11977
11978				if(g_number) {
11979					var g_index = String(index + 1),
11980						g_num = g_index.padStart(g_number, '0');
11981					$(c).find('.figure.number').text(g_num);
11982				}
11983
11984				if(fbrand.length > 0) {
11985					var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
11986					fbrand.html(v.brand_name);
11987				}
11988
11989				if(el.mode == 'shopping' || el.seq == 'all_products') {
11990					fcomment.addClass('hide');
11991					flike.addClass('hide');
11992
11993						v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
11994						v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
11995						var productGradeOnOff = getShoppingGradeProductGradeOnOff(v);
11996						$(c).attr('data-editor-grade-price-enabled', productGradeOnOff).attr('data-config-grade-price-enabled', productGradeOnOff);
11997
11998						var checkPriceHidden = isShoppingGradePriceHidden(v),
11999							base_gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
12000							base_gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
12001							gallery_price = base_gallery_price,
12002							gallery_sale_price = base_gallery_sale_price,
12003							gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
12004							grade_price_display = g_settings.grade_price_display == 'ON',
12005							grade_discount_grade = getShoppingGradePreviewDiscountGrade(data.grade),
12006							grade_discount_applied = false,
12007							grade_gallery_price = 0,
12008							product_soldout = '품절',
12009							product_no_sale = (typeof g_settings.sh_soldout == 'string') ? g_settings.sh_soldout : '구매불가',
12010							product_status = '';
12011						if (
12012							!checkPriceHidden &&
12013							isShoppingGradeProductGradePriceEnabled(v)
12014						) {
12015							grade_gallery_price = calcShoppingGradeDisplayPrice(base_gallery_price, grade_discount_grade);
12016							grade_discount_applied = grade_gallery_price !== null;
12017						}
12018					if(v.status == 'off' && !checkPriceHidden) {
12019						product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
12020					} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
12021						product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
12022					}
12023
12024					$(c).find('.cl-sh-soldout').remove();
12025					if(product_status != '') $(c).attr('data-soldout',true);
12026					else $(c).removeAttr('data-soldout');
12027
12028					$(c).find('.product-badge').remove();
12029					product_status += drawBadgeList(v.use_badge, data.badge_settings);
12030
12031					$(c).find('.cl-sh-limit').remove();
12032					if(v.status == 'lim') {
12033                        if(v.sale_now == false) {
12034                            var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
12035                            if(freview.length > 0) {
12036                                freview.after(product_limit);
12037                            } else {
12038                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
12039                            }
12040                        }
12041                    }
12042
12043					if($(c).find('ul.figure.price').length > 0) {
12044						// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
12045						//         off_str = (price_off > 0) ? price_off + '% ' : ''
12046									var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
12047									if(!_this.b.LUX) off_str = gallery_sale_per;
12048									if(!off_str && gallery_sale_price > 0 && gallery_price > 0 && gallery_price < gallery_sale_price) {
12049										var price_off = Math.round(((gallery_sale_price - gallery_price) / gallery_sale_price) * 100);
12050										off_str = (price_off > 0) ? price_off + '% ' : '';
12051									}
12052									//Ver2
12053									if(!checkPriceHidden) {
12054										var $priceWrap = $(c).find('ul.figure.price'),
12055											$priceVal = $priceWrap.find('.price-val'),
12056											$priceSale = $priceWrap.find('.price-sale'),
12057											$priceSalePer = $priceWrap.find('.price-sale-per');
12058										$priceWrap.find('.sp-price, .grade-discount-price').remove();
12059										if($priceSale.length > 0 && $priceSalePer.length == 0) {
12060											$priceSale.after('<li class="price-sale-per hide"></li>');
12061											$priceSalePer = $priceWrap.find('.price-sale-per');
12062										}
12063										$priceWrap.css({display:'', flexDirection:'', alignItems:''});
12064										$priceVal.css({order:'', display:''});
12065										$priceSale.css({order:'', display:'', marginRight:''});
12066										$priceSalePer.css({order:'', display:'', marginLeft:'', marginTop:''});
12067											$priceVal.html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
12068										$priceVal.removeClass('hide');
12069
12070										if(gallery_sale_price > 0 && gallery_price < gallery_sale_price) {
12071											$priceSale.html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
12072												$priceSalePer.html(off_str);
12073											$priceSale.removeClass('hide');
12074												$priceSalePer.removeClass('hide');
12075											if(!grade_discount_applied && _this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
12076												$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
12077											}
12078										} else {
12079											$priceSale.addClass('hide').html('');
12080											$priceSalePer.addClass('hide').html('');
12081
12082										}
12083							
12084							if(grade_price_display && grade_discount_applied) {
12085								$priceWrap.append('<li class="grade-discount-price"><span class="grade-discount-price-value">₩' + grade_gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + '</span><span class="grade-discount-price-label">나의 할인가</span></li>');
12086							}
12087
12088							$(c).find('ul.figure.price .price-unit-pricing').remove();
12089							if(v.product_unit_str) {
12090								$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
12091							}
12092						} else {
12093							$(c).find('ul.figure.price .price-val').html('₩0');
12094							$(c).find('ul.figure.price .price-val').addClass('hide');
12095						}
12096						if(el.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
12097						if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
12098
12099						var badge_size = getBadgeSize(data.badge_settings);
12100						$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
12101						$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
12102						if(badge_size) {
12103							$(c).find('.cl-sh-soldout').addClass(badge_size);
12104							$(c).find('.cl-sh-limit').addClass(badge_size);
12105						}
12106					} else {
12107						//Ver1
12108						if(fprice.length == 0) fprice = fcaption;
12109						if(checkPriceHidden) fprice.html('');
12110						else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
12111					}
12112
12113					if($(c).find('ul.figure.review').length > 0) {
12114						var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
12115						if(gallery_review > 0) {
12116							$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
12117							$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
12118							$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
12119						} else {
12120							$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
12121							$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
12122						}
12123					}
12124
12125					if(fbasket.length > 0) {
12126						var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
12127							checkOldverBasket = (typeof field_oldver != 'undefined' && field_oldver && field_oldver.indexOf('basket') > -1) ? true : false,
12128							checkDisabledBasket = (typeof field_disable != 'undefined' && field_disable && field_disable.indexOf('basket') > -1) ? true : false;
12129						if(v.basket_off || v.shopping_grade_hidden == 'ON') fbasket.addClass('cannotby hide');
12130						else if(el.seq == 'all_products') fbasket.removeClass('hide');
12131						else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
12132						else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
12133						else fbasket.removeClass('hide');
12134					}
12135
12136				} else {
12137					fbrand.addClass('hide');
12138					fprice.addClass('hide');
12139					freview.addClass('hide');
12140					fbasket.addClass('hide');
12141
12142					if ( checkUseComment 
12143						&& g_settings.comment_display == 'ON'
12144						&& !(field_disable !== undefined && field_disable.indexOf('comment') > -1)
12145						&& fcomment.length > 0
12146						&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
12147					) {
12148						fcomment.removeClass('hide');
12149						fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
12150					} else {
12151						fcomment.addClass('hide');
12152						fcomment.find('.figure-comment-cnt').empty();
12153					}
12154
12155					if ( checkUseLike 
12156						&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
12157						&& !(field_disable !== undefined && field_disable.indexOf('like') > -1)
12158						&& flike.length > 0
12159					) {
12160						flike.removeClass('hide').find('.figure-like-cnt').html(0);
12161						if(v.like !== undefined) {
12162							flike.find('.figure-like-cnt').html(v.like.cnt);
12163							if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
12164						}
12165					} else {
12166						flike.addClass('hide');
12167					}
12168				}
12169				
12170				if(checkUseLike == false) flike.html('');
12171
12172				if(el.mode == 'gallery') {
12173					if(index < data.view) {
12174						$(p).find('[data-loop="true"]').append($(c)[0].outerHTML); 
12175					} else {
12176						$(c).find('figure').remove();
12177						$(g).find('[data-loop="true"]').append($(c)[0].outerHTML);
12178					}
12179					if (total == 2) {
12180						$(c).find('figure').remove();
12181						$('.gallery-empty').append($(c)[0].outerHTML);
12182					}
12183				} else {
12184					$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
12185				}
12186			});
12187		} else {
12188			checkGalleryListSample = true;
12189			if(el.mode=='project' && _this.b.TEMPLATE == false) {
12190				nodes.addClass('gallery-item');
12191				nodes.find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/template').removeAttr('data-gallery').find('img').attr('data-index',0);
12192			}
12193			if(_this.b.TEMPLATE !== false) {
12194				if ( checkUseComment 
12195					&& g_settings.comment_display == 'ON'
12196					&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('comment') > -1)
12197				) {
12198					nodes.find('.figure.comment').removeClass('hide');
12199				} else {
12200					nodes.find('.figure.comment').addClass('hide');
12201				}
12202
12203				if ( checkUseLike 
12204					&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
12205					&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('like') > -1)
12206				) {
12207					nodes.find('.figure.like').removeClass('hide');
12208				} else {
12209					nodes.find('.figure.like').addClass('hide');
12210				}
12211			}
12212			$(p).find('[data-loop="true"]').append(nodes);
12213
12214			if(_this.b.LUX) {
12215				category_onoff = 'ON';
12216				checkGalleryListSample = false;
12217			}
12218		}
12219		if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
12220
12221        var tag = $(p)[0].outerHTML;
12222        var $galleryEL = $('.element[data-id="' + el.seq + '"]');
12223
12224		if (el.mode == 'gallery' && total == 2) {
12225			$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
12226				$(g).find('[data-loop="true"]').append(v);
12227			});
12228		}
12229
12230		if (el.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), el.seq, el.type, g_settings);
12231		$galleryEL.html($(tag).html()).removeClass('preloading');
12232		setOldVerBlockView($galleryEL,el);
12233
12234		$('#el-empty').empty();
12235		$('.gallery-empty').remove();
12236
12237		var $tag = $galleryEL.find('.shop-filter-header');
12238		if($tag.length) shopHeaderDisplay($tag,data);
12239
12240		$galleryEL.attr('data-category',category_onoff);
12241		$galleryEL.attr('data-gallery-sort',gallery_sort);
12242		
12243		if(category_onoff == 'ON' || gallery_sort == 'product') {
12244			initGToolbar($galleryEL, { id: el.seq, settings: g_settings });
12245		}
12246
12247		showHideGalleryField($galleryEL,g_settings);
12248		reloadBlockMasonry('init',$galleryEL);
12249
12250		var $glmBtnWrap = $galleryEL.find('.loadmore-wrap');
12251		var $glmBtn = $galleryEL.find('.loadmore-wrap .gallery-loadmore');
12252		var checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false;
12253		var glm_lang = LANG;
12254
12255		if(typeof g_settings.loadmore_lang != 'undefined' && g_settings.loadmore_lang && $.inArray(g_settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) glm_lang = g_settings.loadmore_lang.toLowerCase();
12256		else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
12257		var glm_txt = $.lang[glm_lang]['config.loadmore'];
12258
12259		if($glmBtnWrap.length == 0) {
12260			// gallery loadmore btn - default (ver1)
12261			if(checkLoadmore) {
12262				var glm_class = (el.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
12263				glm_btn = '<div class="' + glm_class + '" data-loadmore="true" data-selector=".gallery-loadmore" data-total="' + total + '" data-id="' + el.seq + '" data-page="' + (Number(cookie_page)+1) + '" data-view="' + view + '" data-folder="' + el.folder + '" data-mode="' + el.mode + '">' + glm_txt +' &nbsp;(<span class="display">' + cookie_view + '</span> / ' + number_format(total) + ')</div>';
12264
12265				if($galleryEL.find('.gallery-loadmore').length > 0) $galleryEL.find('.gallery-loadmore').replaceWith(glm_btn);
12266				else $galleryEL.append(glm_btn);
12267			} else $galleryEL.find('.gallery-loadmore').remove();
12268
12269		} else {
12270			// gallery loadmore btn - custom (ver2)
12271			if(checkLoadmore) {
12272				if(el.feature=='masonry') $glmBtn.addClass('masonry-layout');
12273				else $glmBtn.removeClass('masonry-layout');
12274				$glmBtn.attr('data-loadmore','true').attr('data-id',el.seq).attr('data-total',total).attr('data-page',Number(cookie_page)+1).attr('data-view',view).attr('data-folder',el.folder).attr('data-mode',el.mode);
12275				$glmBtn.find('.label').text(glm_txt);
12276				$glmBtn.find('.display .view').text(cookie_view);
12277				$glmBtn.find('.display .total').text(total);
12278				$glmBtnWrap.removeClass('hide').fadeIn();
12279			} else {
12280				$glmBtnWrap.fadeOut().addClass('hide');
12281				$glmBtn.removeAttr('data-loadmore').removeAttr('data-id').removeAttr('data-total').removeAttr('data-page').removeAttr('data-view').removeAttr('data-folder').removeAttr('data-mode').removeClass('masonry-layout');
12282				$glmBtn.find('.label').text(glm_txt);
12283				$glmBtn.find('.display .view').text('0');
12284				$glmBtn.find('.display .total').text('0');
12285			}
12286		}
12287
12288		if(el.seq == 'all_products') {
12289			if(property.ONE) $galleryEL.addClass('link-to-전체상품');
12290			setGToolbarAllProducts($galleryEL, g_settings, el.total.list_total);
12291		}
12292
12293		if($galleryEL.has('input.gjs').length) setGalleryJS('load-loop',$galleryEL);
12294	},
12295	forumUpdate : function(pid,page_num,view,page,data) {
12296		if(page_num > 1) {
12297			$.forum.init(pid, page, view, page_num,'', '', '');
12298		} else {
12299			$.forum.set(pid, page_num, view, page, '', '', '',data);
12300		}
12301	},
12302	displayComment : function(viewData) {
12303		if (typeof viewData == 'undefined' || !viewData) viewData = {};
12304		var checkUrl = this.b.PAGE.split(',');
12305		var type = (checkUrl[0] == 'forum') ? 'F' : 'P';
12306		var check_view_empty = (this.b.VIEW && this.b.COUNT == 1 && $('.error_404.element[data-name="error_404"]').length == 1) ? true : false;
12307		if(type == "P" 
12308			&& (this.b.COUNT == 0 || check_view_empty)
12309		) {
12310			$('.error_404.element[data-name="error_404"] *[data-lang]').each(function() {
12311				$(this).html($.lang[LANG][$(this).attr('data-lang')]);
12312			});
12313			return false;
12314		}
12315
12316	    var option = (this.b.PARENT.settings) ? jQuery.parseJSON(this.b.PARENT.settings) : {};  
12317
12318	    if(type == 'F') {
12319			if($.isEmptyObject(viewData) && this.b.PARENT.settings) viewData = {elsettings: jQuery.parseJSON(this.b.PARENT.settings)};
12320			let tmp_elsettings = getOrDefault(viewData,'elsettings',{});
12321	    	let tmp_fmsettings = getOrDefault(viewData,'fm_settings',{});
12322
12323			let comment_display = 'ON';
12324			if(getOrDefault(tmp_fmsettings,'comment_display','') != '') comment_display = tmp_fmsettings.comment_display;
12325			else if(getOrDefault(tmp_elsettings,'comment_display','') != '') comment_display = tmp_elsettings.comment_display;
12326
12327		    if(comment_display == 'OFF') return false;
12328	    } else {
12329			if(typeof option.comment_display == 'undefined' || option.comment_display == 'OFF') return false;
12330	    }
12331	     
12332	    $.comment.init();
12333	},
12334	loaded : function() {
12335		var b = _this.b;
12336		if($('body').width() <= 768 && $('.dsgn-body').hasClass('sidebar')) {
12337			if($('header.navbar').hasClass('sidebar')) {
12338				cssSidebar('off');
12339			}
12340			//$('.dsgn-body').removeClass('sidebar').addClass('removed-sidebar');
12341		} else if ($('body').width() > 768 /*&& $('.dsgn-body').hasClass('removed-sidebar')*/) {
12342			if($('header.navbar').hasClass('sidebar')) {
12343				cssSidebar('on');
12344			}
12345			//$('.dsgn-body').removeClass('removed-sidebar').addClass('sidebar');
12346		}
12347
12348		$('.carousel').live('click',function(){
12349		    $('.carousel').carousel('cycle');
12350		});
12351
12352		$('.carousel').live({
12353			click: function() {
12354				$('.carousel').carousel('cycle');
12355			},
12356			hover:  function(){
12357				$('.carousel').carousel('cycle');
12358			}
12359		});
12360
12361        $('.carousel').carousel({
12362        	pause: 'none'
12363        });
12364
12365        $('[data-fixed-width]').each(function() {
12366            $(this).css('width',$(this).attr('data-fixed-width')+'px');
12367        });
12368        
12369        SCREEN = getScreen();
12370        var targetUrl = document.URL,
12371        	isMoveLink = targetUrl.match(/#/g);
12372
12373        $('.menu-logo-top').show();
12374
12375    	if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
12376    		moveGallery($.cookie('gallery-item'));
12377    	} else if(typeof $.cookie('forum-item') != 'undefined' && b.VIEW == '') {
12378    		// console.log('loaded', 'fm_view', $.cookie('forum_content_view'));	
12379    		if(typeof $.cookie('forum_content_view') != 'undefined'){
12380                var fm_view = $.cookie('forum_content_view');
12381                var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
12382                var pid = (fv)? fv[0]:'';
12383                var row_id = (fv)? fv[1]:'';
12384
12385                setTimeout(function(){
12386                	scrollToBlock('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
12387                }, 500);
12388    			$.removeCookie('forum-item', { path : '/' });
12389
12390                $('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
12391            } else {
12392            	scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
12393    			$.removeCookie('forum-item', { path : '/' });
12394            }
12395    	}   
12396
12397    	if($('body').width() > 768) {
12398    		$('.form-date').attr('type','text');
12399    		$('.form-date').attr('maxlength','2');
12400    		$('.date-yyyy').attr('maxlength','4');
12401    	}
12402
12403        $.modalOFF();
12404	},
12405	loadPage : function(page) {
12406
12407	}
12408}
12409
12410var aosAddblock = function(site_settings,settings,$el) {
12411	if($el.is('[data-type="gallery"][data-type2="premium"]') 
12412		|| $el.has('input.gjs').length 
12413		|| $el.is('.el-fixedcontact[data-type="contact"][data-type2="franchise bar"]')
12414	) {
12415		$el.attr('data-aosinfo',false);
12416		return false;
12417	}
12418
12419	var block_aos_site =  (typeof site_settings.block_aos != 'undefined' && site_settings.block_aos) ? site_settings.block_aos : {},
12420		block_aosAll_site =  (typeof block_aos_site['all'] != 'undefined' && block_aos_site['all']) ? block_aos_site['all'] : {},
12421		aos_time_site = (typeof block_aosAll_site.t != 'undefined' && block_aosAll_site.t) ? block_aosAll_site.t : '',
12422		aos_motion_site = (typeof block_aosAll_site.m != 'undefined' && block_aosAll_site.m) ? block_aosAll_site.m : '',
12423		aos_duration_site = (typeof block_aosAll_site.d != 'undefined' && block_aosAll_site.d) ? block_aosAll_site.d : '700';
12424
12425	var block_aos_page =  (typeof settings.block_aos != 'undefined' && settings.block_aos) ? settings.block_aos : {},
12426		aos_time_page = (typeof block_aos_page.t != 'undefined' && block_aos_page.t) ? block_aos_page.t : '',
12427		aos_motion_page = (typeof block_aos_page.m != 'undefined' && block_aos_page.m) ? block_aos_page.m : '',
12428		aos_duration_page = (typeof block_aos_page.d != 'undefined' && block_aos_page.d) ? block_aos_page.d : '700';
12429
12430
12431    if(block_aos_site && (aos_time_site > aos_time_page) && aos_motion_site!='no-motion' && 
12432    	$('body').find('.menu-lock-block').length<1 && $('body').find('.site-lock-block').length<1) { 
12433        $el.attr('data-aos',aos_motion_site)
12434        	.attr('data-aos-duration',aos_duration_site)
12435
12436    	if(aos_motion_site == 'fade-zoom-in' || aos_motion_page =='fade-zoom-in') {	            
12437	    	$el.attr('data-aos-easing','ease-in-back');
12438		}
12439		isAosBlock = true;
12440		$el.attr('data-aosinfo',true);
12441    } else {
12442        if($.isEmptyObject(block_aos_page) == false && (aos_time_site < aos_time_page) && aos_motion_page!='no-motion' && 
12443        	$('body').find('.menu-lock-block').length<1 && $('body').find('.site-lock-block').length<1) {
12444            $el.attr('data-aos',aos_motion_page)
12445            	.attr('data-aos-duration',aos_duration_page);
12446        	if(aos_motion_site == 'fade-zoom-in' || aos_motion_page =='fade-zoom-in') {	            
12447		    	$el.attr('data-aos-easing','ease-in-back');
12448			}
12449        	isAosBlock = true;
12450        	$el.attr('data-aosinfo',true);
12451        } else $el.attr('data-aosinfo',false);
12452    }
12453
12454	if(isAosBlock) {
12455		$('body,html').addClass('aos-height aos-overflowX');
12456	} else {
12457		$('body,html').removeClass('aos-height aos-overflowX');
12458	}
12459}
12460
12461var mobileWebfnavCheck = function(vpmode) {
12462	var checkFnav = ($('.fnav').length > 0 && vpmode=="mobile_web") ? true : false,
12463		WebType = isMobile();
12464                
12465	if(checkFnav && WebType) {
12466		$('.fnav.fnav-mobile-fnav').css('margin-bottom','53px');
12467		$('.element.el-footer').css('margin-bottom','100px');
12468	} else {
12469		$('.mobilepc_ch').css('margin-bottom','0px');
12470		$('.element.el-footer').css('margin-bottom','0px');
12471	}	
12472	
12473	if(WebType) {
12474		$('.element.el-footer').addClass('mpcwebheight');	
12475		$.mpcWeb.mpcMusicandGoTop(checkFnav,vpmode); 
12476	}
12477}
12478var mobileProductBtnPosition = function(property,device_type) {
12479	var quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight();
12480
12481	if(device_type=='mobile') {
12482		var quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight(),
12483			productBtn_height = $('.m-product-btn').innerHeight(),
12484			productBtn_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? quick_height : '';
12485
12486		if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') $('.m-product-btn, .product-detail-btn').css('bottom',productBtn_position);
12487		else $(`.quick-menu-${property.SID}.quickmenu`).css('bottom',productBtn_height+30);
12488
12489	}
12490}
12491
12492var mobileWebQuickmenuPosition = function(property,device_type) {
12493	var check_music = (typeof property.SETTINGS.musicUse != 'undefined' && (property.SETTINGS.musicUse === true || property.SETTINGS.musicUse == 'true')) ? true : false,
12494		el_fixedheight = (typeof $.cookie(`fixedcontact-${property.SID}`) != 'undefined' && $.cookie(`fixedcontact-${property.SID}`) == 'off') ? 0 : $('.element.el-fixedcontact').innerHeight(),
12495		el_fixedonoffHeight = 22,
12496		quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight(),
12497		mpc_height = (typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) ? $('.mobilepc_ch').innerHeight() : 0,
12498		check_mpc = (typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) ? true : false,
12499		quick_position = 12,
12500		gotop_position = 0,
12501		gotoTop_position = '';
12502
12503	el_fixedblockheight = el_fixedheight + el_fixedonoffHeight;
12504
12505	if($('.element.el-fixedcontact').length>0) {
12506		if(device_type=='pc') {
12507			gotop_position = el_fixedblockheight + 33;
12508		} else {
12509			var fixed_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? quick_height : '';
12510			quick_position = (check_music) ? el_fixedblockheight + 45 : el_fixedblockheight + 30;
12511			quick_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? 0 : quick_position;
12512			
12513			if(check_mpc) {
12514				var webtype = $.mpcWeb.mpcCheckWebType();
12515				if(webtype=='MOBILE') {											
12516					quick_position = (check_music) ? mpc_height + el_fixedblockheight + 45 : mpc_height + el_fixedblockheight + 10;
12517					if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') {
12518						quick_position = mpc_height;
12519						fixed_position = fixed_position + mpc_height;
12520					}
12521				}
12522			} 
12523			$('.element.el-fixedcontact').css('bottom',fixed_position);	
12524		}
12525	} else {
12526		gotop_position = (device_type=='pc') ? 42 : gotop_position;
12527		quick_position = '';
12528		if(check_mpc) {
12529			var webtype = $.mpcWeb.mpcCheckWebType();
12530			if(webtype=='MOBILE') {	
12531				if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') {
12532					quick_position = mpc_height;
12533				}
12534				else quick_position = (check_music) ? mpc_height + 45 : mpc_height + 30;
12535			}
12536		} 
12537	}
12538
12539	if(device_type=='pc') {
12540		$('#goto-top').css('bottom',gotop_position);
12541		quick_position = gotop_position + $('#goto-top').outerHeight() + 30;
12542
12543		if(check_mpc) {
12544			var webtype = $.mpcWeb.mpcCheckWebType();
12545			if(device_type=='pc' && webtype=='MOBILE') {
12546				quick_position = quick_position + mpc_height;
12547				$('.element.el-fixedcontact').css('bottom','');	
12548				$('#goto-top').css('bottom',gotop_position + mpc_height);
12549			}
12550		}
12551		
12552	} 
12553	
12554	$(`.quick-menu-${property.SID}.quickmenu`).css('bottom',quick_position);	
12555}
12556
12557var quickMenuMusicPosition = function(property) {
12558	var sid = (typeof property != 'undefined') ? property.SID : SID,
12559		vpModeOnoff = (property.SETTINGS.vpMode_onoff === true) ? true : false,
12560		webType = $.mpcWeb.mpcCheckWebType(),
12561		quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
12562
12563	var el_fixedheight = (typeof $.cookie(`fixedcontact-${sid}`) != 'undefined' && $.cookie(`fixedcontact-${sid}`) == 'off') ? 0 : $('.element.el-fixedcontact').innerHeight(),
12564		mpc_height = (vpModeOnoff && webType == 'MOBILE') ? $('.mobilepc_ch').innerHeight() : 0,
12565		el_fixedonoffHeight = 22,                
12566		el_fixedblockheight = 0,
12567		quick_position = 0,
12568		music_position = 5;
12569
12570	el_fixedblockheight = el_fixedheight + el_fixedonoffHeight;
12571	
12572
12573	if($('.element.el-fixedcontact').length > 0) {
12574		if(quick_type=='pc') {
12575			music_position = el_fixedheight + 5;
12576		} else {
12577			var quick_height = (typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][quick_type]=='bottom_default') ? $(`.quick-menu-${sid}.quickmenu`).innerHeight() : 0;
12578			music_position = quick_height + el_fixedblockheight + 5;                    
12579			quick_position = music_position + $('#cl-music-player-icon').outerHeight() + 5;
12580	
12581			if(vpModeOnoff && webType == 'MOBILE') {	
12582				quick_position = mpc_height + quick_position;
12583			} 
12584			
12585			if(typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][quick_type]!='bottom_default') $(`.quick-menu-${sid}.quickmenu`).css('bottom',quick_position);	
12586		}  
12587
12588		if(vpModeOnoff && webType == 'MOBILE') {	
12589			music_position = music_position + mpc_height;		
12590			quick_position = mpc_height + quick_position;
12591		} 
12592	} 
12593	$('#cl-music-player-icon, #cl-music-container').css('bottom',music_position);
12594}
12595
12596var setlimitdiskPopup = function() {
12597	var icon = '<i class="site-space-icon fa fa-exclamation-circle"></i>',
12598		str = '<div class="site-space-disk">\
12599					<p>
12599'+$.lang[LANG]['plan.disk-space.popup.limit.contents']+'</p>\
12600				</div>\
12601				';
12602
12603	$(this).showModalFlat(icon + $.lang[LANG]['plan.disk-space.popup.limit.title'], str,false,false).addClass('flat-site-spacelimit-modal');
12604	$('.modal-backdrop.in').css('opacity','0');
12605}
12606
12607var setSitePopup = function() {
12608    if(typeof property.SETTINGS != 'undefined' && property.SETTINGS.showPopup === true && typeof property.SETTINGS.sitePopup != 'undefined' && property.SITELOCK != 'true') {
12609        sitePopupOpen();
12610    }
12611}
12612
12613var sitePopupOpen = function(idx,data) {
12614	var site_popup = (typeof data != 'undefined' & data) ? data : new Array();
12615	if(site_popup.length == 0)  site_popup = (typeof property.SETTINGS.sitePopup != 'undefined' && property.SETTINGS.sitePopup) ? property.SETTINGS.sitePopup : site_popup;
12616	if(site_popup.length > 0) {
12617        $('.refresh-popup').show().removeAttr('style');
12618        var isShow = true;
12619
12620		if(typeof idx != 'undefined') {
12621			if($('#'+property.SID+'Popup'+idx).length == 0) isShow = false;
12622			else $('#'+property.SID+'Popup'+idx).fadeIn();
12623		} else {
12624
12625			if($('.site-popup .modal-popup').length > 0) { 
12626				$('.site-popup .modal-popup').fadeIn();
12627			} else { 
12628				isShow = false; 
12629			}
12630		}
12631
12632		if(!isShow) {
12633	        var modal = $(this).showPopupModal(site_popup,property.SID);
12634	        return modal;
12635	    }
12636	}
12637}
12638
12639var sitePopupResize = function() {
12640
12641	if($('.popup').find('.modal-popup').length == 0) return false;
12642	
12643	var img_w = new Array(),
12644		total_w = 0,
12645		add_w = 0,
12646		d_m = ($('.popup-modal').hasClass('popupimg-overflow-y')) ? 30 : 15;
12647		d_top = $('.header.el-menu').outerHeight() + 15,
12648		d_left = 0,
12649		x = 0, y = 0, y_r = 0;
12650
12651	$('.modal-popup').each(function(i) {
12652		if($(this).css('display') != 'none') {
12653			img_w[i] = $(this).width();
12654			total_w += img_w[i] + d_m;
12655		}
12656	});
12657
12658
12659	var isOverflow = ($('.dsgn-body').width() < (Number($('.popup-modal').children().eq(0).css('left').replace('px',''))+total_w)) ? true : false,
12660		display_i = -1;
12661
12662	if(isOverflow) { $('.popup-modal').addClass('popupimg-overflow-y');
12663	} else { $('.popup-modal').removeClass('popupimg-overflow-y'); }
12664
12665	$('.modal-popup').each(function(i) {
12666		if($(this).css('display') != 'none') {
12667			display_i++;
12668
12669			if(isOverflow) {
12670				x = (display_i==0) ? d_top : d_top + (display_i*30);
12671				y = d_left + ((display_i+1)*30);
12672				y_r = 120 - y;
12673
12674				img_w[i] = 'auto';
12675			} else {
12676				d_left = ($('.dsgn-body').width() - total_w)/2;
12677
12678				x = d_top;
12679				y = d_left + add_w + (i*15);
12680			}
12681			add_w = add_w + $(this).width();
12682
12683			var css_val = (isOverflow) ? {'top': x +'px', 'left': y+'px', 'right': y_r+'px', 'margin-left': '0px', 'width': img_w[i], 'max-width': $(this).width()} : {'top': x +'px', 'left': y+'px' , 'width': img_w[i]};
12684			$(this).css(css_val);
12685		}
12686	});
12687
12688}
12689
12690
12691var activeEL = function(el) {
12692    if(typeof el == 'undefined' || el=='') return;
12693    // header_fixed = $('header.navbar').height();
12694    // var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
12695    // $('body').scrollTo('.'+el,0,{offset:offset});
12696   	scrollToBlock('.'+el);
12697}
12698
12699var setLoginoutNav = function (sid, callback) {
12700	$('.creatorlink-header').remove();
12701	$('#tpl-menu li.loginout').remove();
12702	var str = '<div class="creatorlink-header">\n';
12703	str = str + '<div class="logo-text col-md-4 col-sm-6">\n';
12704	str = str + '	<a href="http://creatorlink.net"><img src="https://storage.googleapis.com/i.addblock.net/main/site_creatorlink_logo.png" alt="" /></a>\n';
12705	str = str + '</div>\n';
12706	str = str + '<div class="data-site col-md-4 col-sm-6 col-xs-6">\n';
12707	str = str + '	<ul>\n';
12708	str = str + '		<li class="profile-img"></li>\n';
12709	str = str + '		<li><span class="text">' + sid + '</span></li>\n';
12710	str = str + '	</ul>\n';
12711	str = str + '</div>\n';
12712	str = str + '<div class="data-user col-md-4 col-sm-6 col-xs-6">\n';
12713	str = str + '	<ul class="pull-right">\n';
12714	str = str + '		<li class="profile-img"></li>\n';
12715	str = str + '		<li><span class="caret"></span></li>\n';
12716	str = str + '	</ul>\n';
12717	str = str + '	<div class="message"></div>\n';
12718	str = str + '</div>\n';
12719	str = str + '</div>\n';
12720	str = str + '\n';
12721	str = str + '\n';
12722	$('.header.el-menu').before(str);
12723	var top = ($('header').hasClass('transparent')) ? '0' : '55px';
12724	$('.header.el-menu').css('top',top);
12725	if(top == '0') $('.creatorlink-header + .popover + .fixed-position').css('top','0');
12726
12727	if(typeof callback == 'function') callback();
12728}
12729
12730var getProfileAuthor = function(sid,img) {
12731	var imgstr = (img == 'https://storage.googleapis.com/i.addblock.net/member/profile_default.jpg') ? 'https://storage.googleapis.com/i.addblock.net/member/profile_default_top.png' : img;
12732	var str = 		'<span class="hexagon">\n';
12733		str = str + '	<svg viewBox="0 0 32 32">\n';
12734		str = str + '		<pattern id="pfimg-" + sid +"" patternUnits="userSpaceOnUse" width="32" height="32">\n';
12735		str = str + '			<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href=""+imgstr+"" x="-2px" y="-2px" width="36" height="36"></image>\n';
12736		str = str + '		</pattern>\n';
12737		str = str + '		<polygon points="16 0 30 8 30 24 16 32 2 24 2 8" fill="url(#pfimg-" + sid +")"></polygon>\n';
12738		str = str + '	</svg>\n';
12739		str = str + '</span>\n';
12740	$('.data-site .profile-img').append(str);
12741}
12742
12743var getProfileMember = function() {
12744	$.getJSON('/template/checkLogin', function(data) {
12745		// if(!data.user) { }
12746		var imgstr = (data.myimg == 'https://storage.googleapis.com/i.addblock.net/member/profile_default.jpg') ? 'https://storage.googleapis.com/i.addblock.net/member/profile_default_top.png' : data.myimg;
12747		var str = 		'<span class="hexagon">\n';
12748			str = str + '	<svg viewBox="0 0 32 32">\n';
12749			str = str + '		<pattern id="pfimg-" + data.user +"" patternUnits="userSpaceOnUse" width="32" height="32">\n';
12750			str = str + '			<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href=""+imgstr+"" x="-2px" y="-2px" width="36" height="36"></image>\n';
12751			str = str + '		</pattern>\n';
12752			str = str + '		<polygon points="16 0 30 8 30 24 16 32 2 24 2 8" fill="url(#pfimg-" + data.user +")"></polygon>\n';
12753			str = str + '	</svg>\n';
12754			str = str + '</span>\n';
12755		$('.data-user .profile-img').append(str);
12756		$('.data-user .profile-img').addClass('user-'+data.name);
12757		$('.data-user .user-name').append('<span>'+data.name+'</span>');
12758		// $('.data-user .logoutlink').before('<span>You&apos;re logged in as '+data.name+' </span>');
12759
12760		var str3_mysite = '';
12761		if($('.data-site ul li span.text').text() == data.sid) {
12762			$('.data-site').text('');
12763			var isNewmessage = (data.newCount == 0 ) ? false : true;
12764			var str2 = 		'<ul class="sub-menu pull-right">\n';
12765				str2 = str2 + '	<li class="newCount">\n';
12766				str2 = str2 + '		<a href="/message/lists"><i class="fa fa-envelope"></i>\n';
12767				if(isNewmessage) str2 = str2 + '<span class="badge">"+data.newCount+"</span>\n';
12768				str2 = str2 + '</a>\n';
12769				str2 = str2 + '	</li>\n';
12770				str2 = str2 + '</ul>\n';
12771			$(".data-user .message").append(str2);
12772		} else {
12773			str3_mysite = '		<div class="item"><a href="http://'+data.sid+'.creatorlink.net"><img src="https://storage.googleapis.com/i.addblock.net/main/icon_mysite.png"/><img src="https://storage.googleapis.com/i.addblock.net/main/icon_mysite_active.png" class="active"/>'+ $.lang[LANG]['header.mysite'] + '</a></div>\n';
12774		}
12775
12776		var str3 = 		'<div class="popover bottom" id="pop"+data.name+"">\n';
12777			str3 = str3 + '	<div class="arrow"></div>\n';
12778			str3 = str3 + '	<div class="popover-content">\n';
12779			str3 = str3 + '		<div class="user-name">"+data.name+"</div>\n';
12780			str3 = str3 + str3_mysite;
12781			str3 = str3 + '		<div class="item"><a href="http://creatorlink.net"><img src="https://storage.googleapis.com/i.addblock.net/main/icon_dashboard.png"/><img src="https://storage.googleapis.com/i.addblock.net/main/icon_dashboard_active.png" class="active"/>'+ $.lang[LANG]['header.dashboard'] + '</a></div>\n';
12782			str3 = str3 + '		<div class="item"><a href="/mypage" ><img src="https://storage.googleapis.com/i.addblock.net/main/icon_acc.png"/><img src="https://storage.googleapis.com/i.addblock.net/main/icon_acc_active.png" class="active"/>'+ $.lang[LANG]['header.mypage'] +'</a></div>\n';
12783			str3 = str3 + '		<div class="item"><a href="/profile/myboard" ><img src="https://storage.googleapis.com/i.addblock.net/main/icon_qna.png"/><img src="https://storage.googleapis.com/i.addblock.net/main/icon_qna_active.png" class="active"/>'+ $.lang[LANG]['header.cts'] +'</a></div>\n';
12784			str3 = str3 + '		<div class="item user-logout"><a href="/member/login/out" class="logoutlink"><img src="https://storage.googleapis.com/i.addblock.net/main/icon_logout.png"/><img src="https://storage.googleapis.com/i.addblock.net/main/icon_logout_active.png" class="active"/>'+ $.lang[LANG]['header.logout'] + '</a></div>\n';
12785			str3 = str3 + '	</div>\n';
12786			str3 = str3 + '	</div>\n';
12787		$('.creatorlink-header').after(str3);
12788
12789	});
12790}
12791
12792var pageHeight = function() {
12793    $('.page-comments').css('margin-top','0px');
12794    $('.el-footer').css('margin-top','0px');
12795    var docHeight = $('.dsgn-body').height();
12796    $('.dsgn-body').wrapInner('<div class="dsgn-body-wrap"></div>');
12797    var dsgnHeight = $('.dsgn-body-wrap').height();
12798    var diff = docHeight - dsgnHeight;
12799    $('.dsgn-body > .dsgn-body-wrap').contents().unwrap();
12800    return (diff>0) ? diff : 0;
12801}
12802
12803var setHeight = function(height) {
12804	if(typeof property.VIEW == 'undefined' || property.VIEW == "") return false;
12805    if(height>0) {
12806        height = (typeof MODE == 'undefined') ? height : height-35;
12807        if($('.page-comments').length) {
12808            $('.page-comments').css('margin-top',height+'px');
12809		} else if($('.page-bottomlist').length) {
12810			$('.page-bottomlist').css('margin-top',height+'px');
12811        } else if($('.el-footer').length) {
12812            $('.el-footer').css('margin-top',height+'px');
12813        }
12814    }
12815}
12816
12817var makeLinkUrl = function(link, one, view) {
12818	var link_url = '',
12819		link_val = '',
12820		is_menu = ($.inArray(link.replace(/^\//g, '').replace(/ /g, '-'), property.MENULIST) > -1) ? true : false,
12821		regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/,
12822		regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
12823
12824	if (one) {
12825    	link_url = (view) ? '/#' : '#';
12826    	link_url = (view && !property.PUBLISH) ? '/render/index#' : link_url;
12827    	if(is_menu) link_url = '/';
12828	} else {
12829        link_url = (property.URI=='/' || is_menu) ? '/' : property.URI + '/'; 
12830	}
12831
12832	if (link) {
12833		if (link.match(/^\@/g) !== null) { // link-type: link-bookmark ==> a[attr-bookmark]
12834			var bookmark_seq = link.replace(/^\@/g, '');
12835			if (typeof property.SETTINGS.blockBookmarkList == 'undefined' || typeof property.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
12836				return '';
12837			}
12838		} else if (link.match(/^flink\@[0-9]/gi) !== null) { // link-type: link-file     ==> a[attr-flink]
12839			return link;
12840		} else if ($.inArray(link.replace(/^\//g, '').replace(/ /g, '-'), property.MENULIST) > -1) { // link-type: link-menu     ==> a[data-user-link]
12841			link_val = link_url + link.replace(/ /g, '-');
12842		} else { // link-type: link-out      ==> a[attr-link]
12843			if(checkBase64Encode(decodeURIComponent(link))) link = Base64.decode(decodeURIComponent(link));
12844			else if (checkBase64Encode(link)) link = Base64.decode(link);
12845
12846			if(!regex2.test(link) && regex.test(link)) link_val = '//' + link;
12847		}
12848
12849		if(link_val == '') link_val = link;
12850	}
12851	return link_val;
12852}
12853
12854var checkError = function(data) {
12855    if(typeof data.error != 'undefined' && data.error) {
12856        alert(data.error);
12857        if(data.error=='No user data') {
12858            location.href='/member/login';
12859        }
12860        return true;
12861    }
12862    return false;
12863}
12864
12865var funcCallback = function(func,callback) {
12866    func();
12867    if(typeof callback=='function') {
12868        callback();
12869    }
12870}
12871
12872var closeClnavMega = function() {
12873	if(typeof $.clnav == 'undefined') return;
12874	if($('.cl-nav[data-layout="meganav"]').length == 0) return;
12875	if(!$('body').is('[data-clnav-mega="open"]')) return;
12876
12877	$.clnav.setMode('mega-open', false);
12878}
12879
12880var cssSidebar = function(onoff) {
12881	var width = (onoff == 'on') ? '260px' : '',
12882		dsgn_css = CSSJSON.toJSON($('#dsgn-body').text());
12883
12884	if(width) {
12885		if(typeof dsgn_css['children']['.dsgn-body.sidebar'] == 'undefined') {
12886			dsgn_css['children']['.dsgn-body.sidebar'] = {'children' : {}, 'attributes' : { 'padding-left' : width, 'padding-top': '0px' }};
12887		}
12888	} else {
12889		if(typeof dsgn_css['children']['.dsgn-body.sidebar'] != 'undefined') {
12890			delete dsgn_css['children']['.dsgn-body.sidebar'];
12891		}
12892	}
12893
12894	$('#dsgn-body').text(CSSJSON.toCSS(dsgn_css));
12895}
12896
12897var getScreen = function() {
12898    var wid = window.innerWidth;
12899
12900    var screen_size = 0;
12901    if (0 < wid && wid < 480) {
12902        screen_size = 320;
12903    } else if(wid <= 480 && wid <768) {
12904        screen_size = 480;
12905    } else if (768 <= wid && wid < 992) {
12906        screen_size = 768;
12907    } else if (992 <= wid && wid < 1200 ) {
12908        screen_size = 992;
12909    } else if (wid >= 1200) {
12910        screen_size = 1200;
12911    }
12912
12913    return screen_size;
12914}
12915
12916var getScreenIndex = function() {
12917    var idx = 0;
12918    switch(SCREEN) {
12919        case 320:
12920        case 480:
12921            idx = 2;
12922            break;
12923        case 769:
12924            idx = 1;
12925            break;
12926
12927        case 992:
12928        case 1200:
12929            idx = 0;
12930            break;
12931
12932        default : idx = 0; break;
12933    }
12934    return idx;
12935}
12936var setGalleryReturnItemCookie = function(parent) {
12937	if(typeof parent == 'undefined' || !parent) return;
12938	var mode = (typeof parent.mode != 'undefined') ? parent.mode : '',
12939		seq = (typeof parent.seq != 'undefined') ? parent.seq : '';
12940
12941	if($.inArray(mode, ['project', 'shopping']) == -1 || !seq) return;
12942	$.cookie('gallery-item', seq, { path: '/', expires: 12 * 60 * 60 * 1000 });
12943}
12944var moveGallery = function(element) {
12945    var $item = $(`.gallery-item[data-seq="${element}"]`);
12946    if ($item.length == 0) {
12947		if($(`.element[data-id="${element}"]`).length > 0) $item = $(`.element[data-id="${element}"]`);
12948    	else return;
12949    }
12950
12951	if($.clnav.check()) {
12952		goToElement($item);
12953	} else {
12954		var header_fixed = $('header.navbar').height();
12955		var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
12956		if($('header.navbar').hasClass('disableOffset') && !$item.hasClass('el_0')) offset = 0;
12957
12958		if (property.SID != 'undefined' && property.SID == 'kdomeshelter'){
12959			offset -= 300;
12960		}
12961
12962		var sTop = $item.offset().top + offset;
12963		$('html, body').animate({scrollTop: sTop}, 500, 'easeInOutQuart');
12964
12965		$.removeCookie('gallery', { path: '/' });
12966		$.removeCookie('gallery-item', { path : '/' });
12967	}
12968}
12969
12970var scrollToBlock = function(el, duration) {
12971	if(typeof duration == 'undefined') duration = 1200;
12972	if(typeof el == 'undefined' || !el || $(el).length == 0) return;
12973
12974	if($.clnav.check()) {
12975		goToElement(el);
12976	} else {
12977		var header_fixed = $('header.navbar').outerHeight();
12978		var offset = $('.dsgn-body').scrollTop();
12979		if(!$('.dsgn-body').hasClass('sidebar') && !$('header.navbar').hasClass('disableOffset')) offset -= header_fixed;
12980		var sTop = $(el).offset().top + offset;
12981		$('html, body').animate({ scrollTop: sTop }, duration, 'easeInOutQuart');
12982	}
12983}
12984
12985var clearDsgnbody = function() {
12986	closeClnavMega();
12987
12988	const removeSelectors = [
12989		'style[id^="el_"]:not([id*=el__])',
12990		'script[id^="js_"]:not([id*=el__])',
12991		'.element[data-id="all_products"]',
12992		'.psearch-view',
12993		'.menu-lock-block',
12994		'.site-lock-block',
12995		'.config-image-view',
12996		'.forum-view',
12997		'.page-toolbars',
12998		'.page-comments',
12999		'.page-bottomlist',
13000	].join(',');
13001	$(removeSelectors).remove();
13002	$('.el-footer').hide();
13003
13004	var element = $('div.element[class*="el_"]:not([class*=el__]):not(.el-footer)');
13005	element.each(function() {
13006		const $el = $(this);
13007		const $parentElem = $el.closest('.elem');
13008
13009		if($parentElem.length) {
13010			$parentElem.remove();
13011		} else {
13012			$el.remove();
13013		}
13014	});
13015}
13016
13017var ensureGalleryResponsiveImageClass = function($scope) {
13018	$scope.find('img').each(function() {
13019		var removeAttrs = [];
13020		if(this.attributes) {
13021			$.each(this.attributes, function(i, attr) {
13022				if(attr && attr.name !== 'class' && attr.name.indexOf('img-responsive') > -1) removeAttrs.push(attr.name);
13023			});
13024		}
13025		for(var i = 0; i < removeAttrs.length; i++) this.removeAttribute(removeAttrs[i]);
13026		$(this).addClass('img-responsive');
13027	});
13028}
13029
13030var golink = function(_this,link) {
13031	var wloc = window.location,
13032		local_link = (wloc.hostname == link.hostname) ? true : false,
13033		local_arr = ['/_register', '/_login'];
13034
13035	if(local_link && $.inArray(link.pathname,local_arr) == -1) {
13036    	var loc = link.pathname,
13037    		uri = (_this.b.PUBLISH) ? loc : loc.replace('/render/','');
13038
13039    	if((uri == '/render' || uri == '/') && !_this.b.ONE) {
13040    		uri = '';
13041    		$.each(_this.b.SMENU,function(i,v) {
13042    			var menu_name = (v.name).replace(' ','-');
13043    			var checkMenuName = (uri == menu_name) ? true : false,
13044    				checkMenuLink = (typeof v.link != 'undefined' && v.link) ? true : false;
13045
13046    			if(checkMenuName && checkMenuLink) {
13047    				uri = (v.link).replace(' ','-');
13048    			}
13049    		});
13050    		
13051    	}
13052
13053    	var go = (_this.b.PUBLISH) ? '/' + uri + link.hash: '/render/' + uri + link.hash;
13054		// 명품 쇼핑 검색 파라미터 처리
13055		if((link.search).length) go = go + link.search;
13056		_this.history.pushState(null,_this.b.TITLE,go);
13057
13058		if(typeof $.cookie('forum-item') != 'undefined') {
13059			// console.log('fm_view', $.cookie('forum_content_view'));
13060			setTimeout(function() {
13061	    		if(typeof $.cookie('forum_content_view') != 'undefined'){
13062                    var fm_view = $.cookie('forum_content_view');
13063                    var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
13064                    var pid = (fv)? fv[0]:'';
13065                    var row_id = (fv)? fv[1]:'';
13066
13067                    scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
13068	    			$.removeCookie('forum-item', { path : '/' });
13069
13070                    $('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
13071                    // $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
13072                } else {
13073                	scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
13074	    			$.removeCookie('forum-item', { path : '/' });
13075                }
13076			}, 300);
13077		}
13078	} else {
13079		location.href = link.href;
13080	}
13081}
13082
13083
13084function draw_floating() {
13085    var fl_section_html = '',
13086		fl_bottom_html = '',
13087		fl_circle_html = '',
13088		el_html = '',
13089		data = {};
13090 
13091    $.each($('.floating_item li'), function(fi, fv){
13092        var fl_class = $(this).find('.icon').attr('class'),
13093            cid = ($(this).find('a').attr('data-cid')) ? $(this).find('a').attr('data-cid') : '',
13094            fl_link = ($(this).find('a').attr('data-link')) ? $(this).find('a').attr('data-link') : '',
13095            type = ($(this).find('a').attr('data-type')) ? $(this).find('a').attr('data-type') : '',
13096            data = ($(this).find('a').attr('data-data')) ? $(this).find('a').attr('data-data') : '',
13097            name = ($(this).find('a').attr('data-name')) ? $(this).find('a').attr('data-name') : '',
13098            regexp = /[0-9]+/,
13099            fl_url = (type=='defaultPhone') ? 'tel:'+property.TEL_LINK : data;
13100
13101            if(type=='top') return true;
13102            fl_icon_num = (type=='defaultPhone') ? '' : `${regexp.exec(fl_class)}`;
13103			// fl_link = (type=='address' || type=='page_move' || type=='storefarm') ? fl_link : '';
13104			fl_url = (type=='defaultPhone') ? fl_url : fl_link;
13105			fl_url = (type=='link') ? data : fl_url;
13106			fl_url = (type=='email') ? 'mailto:'+data : fl_url;
13107			fl_url = (type=='reservation') ? data : fl_url;
13108			fl_url = (type=='page_move' && data=='홈') ? '/' : fl_url;
13109			fl_url = (type=='sms') ? 'tel:'+ data : fl_url;
13110			fl_url = (type=='defaultPhone2') ? 'tel:'+ data : fl_url;
13111			if(fl_url.includes('pf.kakao')) {
13112				fl_url = (fl_url.includes('http://pf.kakao') || fl_url.includes('https://pf.kakao')) ? fl_url : fl_url = 'https://' + fl_url;
13113			}
13114         
13115        fl_section_html += `
13116        <li class="" data-type="${type}" data-name="${name}" data-cid="${cid}" data-link="${fl_url}">
13117            <a class="btn btn_ic${fl_icon_num}" href="${fl_url}">
13118                <div class="in">${name}
13119                    <span class="ic theme_background"></span>
13120                </div>
13121            </a>
13122        </li>
13123        `;
13124        
13125		var floating_open_sid = ['hyundae09']; // modoo 모바일 플로팅메뉴 open요청
13126		if($.inArray(property.SID, floating_open_sid) > -1) {
13127			fl_icon_num = (type=='defaultPhone') ? '1' : fl_icon_num;
13128			fl_bottom_html += `
13129			<a class="link_item _button_navi" href="${fl_url}" data-type="${type}">
13130				<span class=" icon icon${fl_icon_num}"></span>
13131			</a>
13132			`;
13133			fl_circle_html += `
13134			<a class="link_item _button_navi _bizPhone float-navi-button" href="${fl_url}" data-type="${type}">
13135				<span class=" icon icon${fl_icon_num} theme_background"></span>
13136			</a>
13137			`;
13138
13139		} else {
13140			fl_icon_num = (type=='defaultPhone') ? '1' : fl_icon_num;
13141			fl_bottom_html += `
13142			<a class="link_item _button_navi" href="${fl_url}" data-type="${type}">
13143				<span class=" text _text">${name}</span><span class=" icon icon${fl_icon_num}"></span>
13144			</a>
13145			`;
13146			fl_circle_html += `
13147			<a class="link_item _button_navi _bizPhone float-navi-button mfl_hide" href="${fl_url}" data-type="${type}">
13148				<span class="text _text">${name}</span><span class=" icon icon${fl_icon_num} theme_background"></span>
13149			</a>
13150			`;
13151		}
13152
13153		// console.log(fl_url);
13154    });
13155
13156    el_html += `
13157        <div class="btn_wrap m_floating">
13158			<ul class="btn_list">
13159				${fl_section_html}
13160			</ul>
13161		</div>
13162    `;
13163
13164	data = {
13165		'fl_bottom_html' : fl_bottom_html,
13166		'fl_circle_html' : fl_circle_html,
13167		'el_html' : el_html
13168	}
13169
13170	// 메뉴 디자인 변경시 모두 퀵메뉴랑 기존 탑버튼 위치 겹치는 문제 발생하여 기존 크링 탑버튼 숨김처리
13171	if(!$('._floating').hasClass('hide') && $('.floating_item li').length > 0) {
13172		$('.goto-top').hide().addClass('hide').css('pointer-events','none');
13173		    
13174	}
13175	return data;
13176}
13177    
13178
13179function m_floating(fl_data) {
13180	if($.isEmptyObject(fl_data)) return false;
13181	var	settings = (typeof property.SETTINGS !='undefined' && property.SETTINGS) ? property.SETTINGS : {},
13182		settings_modoo = (typeof settings.modoo !='undefined' && settings.modoo) ? settings.modoo : {},
13183		settings_mfloating = (typeof settings_modoo.mfloating !='undefined' && settings_modoo.mfloating) ? settings_modoo.mfloating : '';
13184
13185	if(settings_mfloating!='' && settings_mfloating && $('ul.floating_item._floating.modoo').length>0 && !$('._floating').hasClass('hide')) {
13186		var modoo_fnav_html = (settings_mfloating=='bottom') ? `
13187			<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
13188				<div class="floating_item floating_bottom _float_buttons">
13189					${fl_data.fl_bottom_html}
13190					<button type="button" class="btn_top _top_btn" data-type="top">
13191						<span class="blind">TOP</span><span class="icon_top"></span>
13192					</button>
13193				</div>
13194			</div>		
13195		` : `
13196		<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
13197			<div class="dimmed _bg_dimmed"></div>
13198			<div class="floating_item _float_buttons">
13199				${fl_data.fl_circle_html}
13200				<button type="button" class="btn_menu _toggle_btn" style="-webkit-tap-highlight-color: transparent;">
13201					<span class="icon nicon_more4 _icon_area theme_background"></span>
13202				</button>
13203			</div>
13204		</div>`
13205		;
13206
13207
13208		var floating_open_sid = ['hyundae09']; // modoo 모바일 플로팅메뉴 open요청
13209		if($.inArray(property.SID, floating_open_sid) > -1) {
13210			modoo_fnav_html = `
13211				<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
13212					<div class="floating_item _float_buttons">
13213						${fl_data.fl_circle_html}
13214						<button type="button" class="btn_menu _toggle_btn" style="-webkit-tap-highlight-color: transparent;">
13215							<span class="icon nicon_more4 _icon_area theme_background"></span>
13216						</button>
13217					</div>
13218				</div>`;
13219		}
13220		//$('.dsgn-body.modoo').append(modoo_fnav_html); 기존 코드
13221		
13222		if ($('.dsgn-body.modoo').length > 0) {
13223			$('.dsgn-body.modoo').append(modoo_fnav_html);
13224		} else if (property?.SETTINGS?.modoo?.floating) { // 모두 사이트 메뉴 디자인 변경 시 dsgn-body에 modoo가 포함되지 않아 모바일에서 퀵메뉴 안 보이는 문제 해결
13225			$('.dsgn-body').append(modoo_fnav_html);
13226		} 
13227		
13228	}
13229	
13230}
13231
13232function isMenuLock(callback) {
13233	var deferred = $.Deferred();
13234    var is_lock_block = 'active', r;
13235    var display_target = (property.VIEW) ? '.cl-s-product-detail, .lux-product-block, .cl-s-product-review, .cl-s-product-qna, .page-comments, .page-bottomlist' : '';
13236
13237    // if(property.VALIDPLAN && property.ISLOCK == 'true') { 
13238    if(property.ISLOCK == 'true') {
13239    	r = $.post('/template/menuLockController/type/lock_check', {s: property.SMENU, sid: property.SID, page: property.PAGE, publish : property.PUBLISH}, function(data) {
13240			var lock_type = data.lock_type,
13241				lock_error_type = (typeof data.error_data != 'undefined' && data.error_data.type) ? '.' + data.error_data.type : '';
13242			
13243			if(!data.error && data.result) { 
13244				property.ISLOCK = 'false';
13245			} else {
13246				// var checkGotoURL = '';
13247				// if((property.SITEUM == '1' || property.SITEUM == '2') && lock_error_type == '') checkGotoURL = '/_login';
13248				// else if(property.SITEUM == '2'&&  $.inArray(lock_error_type,['.unlikesite','.creatorlink']) > -1) checkGotoURL = '/_register';
13249				// if(checkGotoURL) {
13250				// 	location.href = checkGotoURL;
13251				// 	return false;
13252				// }
13253
13254				var text = $.lang[LANG]['render.menu-lock.' + lock_type + '.text'];
13255				if (typeof data.menuLockMsg !== 'undefined' && data.menuLockMsg) {
13256					text = data.menuLockMsg;
13257				}
13258
13259				if (lock_type=='umlevel') {
13260					if(lock_error_type == '' && property.SITEUM == '1') lock_error_type = '.onlylogin';
13261
13262					text = $.lang[LANG]['render.menu-lock.' + lock_type + '.text' + lock_error_type ];
13263					if(lock_error_type == '.lowerlevel') text = text.replace(/\#/gi, data.error_data.umlevel);
13264				} else if (lock_type == 'grade') {
13265					if(lock_error_type == '.nonmember' || (lock_error_type == '' && property.SITEUM == '1')) {
13266						if(property.PAGE!='_login' && property.PAGE!='_register' && property.PAGE!='_forgot') {
13267							location.href='/_login';
13268							return false;
13269						}
13270						lock_error_type = '.onlylogin';
13271					}
13272
13273					text = $.lang[LANG]['render.menu-lock.' + lock_type + '.text' + lock_error_type ];
13274					if(typeof text == 'undefined') {
13275						text = $.lang[LANG]['render.menu-lock.umlevel.text' + lock_error_type] || $.lang[LANG]['render.menu-lock.umlevel.text.onlylogin'] || $.lang[LANG]['render.menu-lock.umlevel.text'];
13276					}
13277					if(lock_error_type == '.lowerlevel') text = text.replace(/\#/gi, data.error_data.grade);
13278				}
13279
13280				var str = '\
13281							<div class="menu-lock-block">\
13282								<div class="inner-box text-center">\
13283									<div class="form-inline" role="form">\
13284										<div class="text">\
13285											<p> ' + text + ' </p>\
13286										</div>';
13287					if(lock_type=='password') {
13288						str = str + '\
13289										<div class="form-group">\
13290											<input class="form-control" type="password" placeholder="password" data-lock-password=""/>\
13291											<label class="error-text"></label>\
13292										</div>\
13293										<div class="form-group">\
13294											<span class="btn" data-edit="true" data-selector=".btn" data-lock-submit="">'+$.lang[LANG]['render.lock.password.submit']+'</span>\
13295										</div>\
13296						';
13297					}
13298					str = str + '\
13299									</div>\
13300								</div>\
13301							</div>\
13302				';
13303				if($.clnav.check()) {
13304					$('.dsgn-body').prepend(htmlspecialchars_decode(str));
13305				} else {
13306					$('.header.el-menu').after(htmlspecialchars_decode(str));
13307				}
13308		        $('#page-loading-css').remove();
13309			}
13310		    if(typeof callback == 'function') {
13311		    	callback();
13312
13313		    	if(display_target) {
13314					setTimeout(function() {
13315				    	if(property.ISLOCK == 'true') $(display_target).addClass('hide');
13316				    	else $(display_target).removeClass('hide');
13317					},20);
13318		    	}
13319		    }
13320
13321    	},'json');
13322    } else {
13323	    if(typeof callback == 'function') {
13324	    	callback();
13325			setTimeout(function() {
13326				$('.header.el-menu.hide').removeClass('hide');
13327				if(display_target) $(display_target).removeClass('hide');
13328			},20);
13329	    }
13330	}
13331
13332	deferred.resolve();
13333	return deferred.promise();
13334}
13335
13336function isSitePasswordLock() {
13337	var deferred = $.Deferred();
13338	let last_activity = localStorage.getItem("last_activity");
13339	let ss_site_lock = localStorage.getItem('ss_' + property.SID + '_site_lock');
13340    
13341    if (last_activity && ss_site_lock) {
13342    	let timeDiff = Math.floor(Date.now() / 1000) - Number(last_activity);
13343    	// console.log(Math.floor(Date.now() / 1000), Number(last_activity), timeDiff);
13344    	if (timeDiff > 3600) {
13345	    	// console.log('localStorage clear');
13346	        localStorage.removeItem('last_activity');
13347	        localStorage.removeItem('ss_' + property.SID + '_site_lock');
13348	        setTimeout(function(){
13349	        	location.href = '/';
13350	        });
13351	    }
13352    }
13353
13354	if(property.SETTINGS.sitePermit == undefined) {
13355		property.SETTINGS.sitePermit = 1;
13356	}
13357
13358	if(property.SETTINGS.sitePermit == 3) {
13359		let pw = (ss_site_lock)? ss_site_lock : '';
13360		r = $.post('/template/siteLockController/type/lock_check', {sid: property.SID, publish : property.PUBLISH, pw: pw}, function(data) {
13361			var lock_error_type = (typeof data.error_data != 'undefined' && data.error_data.type) ? '.' + data.error_data.type : '';
13362			if(!data.error && data.result) { 
13363				property.SETTINGS.sitePermit = 1;
13364			} else {
13365				var str = '\
13366					<div class="site-lock-block passwordonly">\
13367						<div class="inner-box text-center">\
13368							<div class="form-inline" role="form">\
13369								<div class="text">\
13370									<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="625 326 116 116" width="114" height="114"><path d="M700.5 379.5h-36v-12c0-9.92 8.08-18 18-18s18 8.08 18 18v12zm-34-2h32v-10c0-8.82-7.18-16-16-16s-16 7.18-16 16v10z"/><path d="M700.88 415.5h-36.75c-4.2 0-7.63-3.42-7.63-7.63v-22.75c0-4.2 3.42-7.63 7.63-7.63h1.38v2h-1.38c-3.1 0-5.63 2.52-5.63 5.63v22.75c0 3.1 2.52 5.63 5.63 5.63h36.75c3.1 0 5.63-2.52 5.63-5.63v-22.75c0-3.1-2.52-5.63-5.63-5.63h-1.38v-2h1.38c4.2 0 7.63 3.42 7.63 7.63v22.75c-.01 4.21-3.43 7.63-7.63 7.63z"/>
13370<path d="M665.5 377.5h34v2h-34z"/><path d="M683 442c-31.98 0-58-26.02-58-58s26.02-58 58-58 58 26.02 58 58-26.02 58-58 58zm0-114c-30.88 0-56 25.12-56 56s25.12 56 56 56 56-25.12 56-56-25.12-56-56-56z"/><circle cx="683" cy="393" r="4"/><path d="M683 403c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1s1 .45 1 1v9c0 .55-.45 1-1 1z"/></svg>';
13371						if(typeof data.sitelock_text != 'undefined' && data.sitelock_text) {
13372							str += '<p class="title">'+data.sitelock_text+'</p>';
13373						} else {
13374							str += '<p class="title">'+$.lang[LANG]['render.site-lock.password.text']+'</p>';
13375						}
13376						str += '</div>\
13377								<div class="form-group">\
13378									<div>\
13379										<input type="password" placeholder="'+$.lang[LANG]['render.site-lock.password.placeholder']+'" data-lock-password=""/>\
13380										<label class="error-text"></label>\
13381									</div>\
13382									<span class="btn" data-edit="true" data-selector=".btn" data-lock="site" data-lock-submit="">\
13383									<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="676 378.59 13 9.41" width="13" height="9"><path d="m681 388-5-5 1.41-1.41 3.59 3.58 6.59-6.58L689 380z"></path></svg>\
13384									</span>\
13385								</div>\
13386							</div>\
13387						</div>\
13388					</div>\
13389				';
13390				if($.clnav.check()) {
13391					$('.dsgn-body').prepend(htmlspecialchars_decode(str));
13392				} else {
13393					$('.header.el-menu').after(htmlspecialchars_decode(str));
13394				}
13395			}
13396			if(data.reload === true && data.result) {
13397				setTimeout(function(){
13398					location.reload();
13399				});
13400			}
13401		}, 'json');
13402	}
13403	
13404    deferred.resolve();
13405	return deferred.promise();
13406}
13407
13408function isUserCertified(history) {
13409	var referrer = (document.referrer !== undefined)? document.referrer.replace(/^https?:\/\//, ''):'';
13410	var seg = referrer.split('/');
13411
13412	if(property.CERT_USE == 'A' && property.VALIDTYPE != 'BN' && property.VALIDTYPE != 'SM') { //요금제 만료
13413		var str = '\
13414			<div class="site-lock-block">\
13415				<div class="inner-box text-center">\
13416					<div class="form-inline">\
13417						<div class="text">\
13418							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 118 118" width="118" height="118"><path d="M76.88 52.5h-.38v-10c0-9.92-8.08-18-18-18s-18 8.08-18 18v10h-.38c-4.2 0-7.62 3.42-7.62 7.62v22.75c0 4.2 3.42 7.62 7.62 7.62h36.75c4.2 0 7.62-3.42 7.62-7.62V60.12c.01-4.2-3.41-7.62-7.61-7.62zm-34.38-10c0-8.82 7.18-16 16-16s16 7.18 16 16v10h-32v-10zm40 40.38c0 3.1-2.52 5.62-5.62 5.62H40.12c-3.1 0-5.62-2.52-5.62-5.62V60.12c0-3.1 2.52-5.62 5.62-5.62h36.76c3.1 0 5.62 2.52 5.62 5.62v22.76z"/><path d="M59 1C27.02 1 1 27.02 1 59s26.02 58 58 58 58-26.02 58-58S90.98 1 59 1zm0 114C28.12 115 3 89.88 3 59S28.12 3 59 3s56 25.12 56 56-25.12 56-56 56z"/><path d="M59 64c-2.21 0-4 1.79-4 4 0 1.86 1.28 3.41 3 3.86V77c0 .55.45 1 1 1s1-.45 1-1v-5.14c1.72-.45 3-2 3-3.86 0-2.21-1.79-4-4-4z"/></svg>\
13419							<p class="title">'+$.lang[LANG]['siteum.site.access.limit']+'</p>\
13420						</div>\
13421					</div>\
13422				</div>\
13423			</div>\
13424		';
13425
13426		if($.clnav.check()) {
13427			$('.dsgn-body').prepend(htmlspecialchars_decode(str));
13428		} else {
13429			$('.header.el-menu').after(htmlspecialchars_decode(str));
13430		}
13431		return false;
13432	}
13433
13434	r = $.post('/template/isUserCertified', {sid: property.SID, publish : property.PUBLISH}, function(data) {
13435		var cert_form = '';
13436
13437		// JH 주석2 : 문제 시 아래 주석
13438		if(property.CERT_USE == 'A' && typeof data.cert_adult != 'undefined' && data.cert_adult == 'N') {
13439			_this.b.certOpenChk = true;
13440		}
13441		
13442
13443		if((property.CERT_USE == 'Y' && data.cert != 'Y') || (property.CERT_USE == 'A' && data.cert_adult != 'Y')) {
13444			// V2: ordr_idxx는 서버(cert_req)에서 생성 — 프런트 init_orderid() 불필요
13445			cert_form = '\
13446				<form name="form_auth" method="post" action="/cert_req">\
13447			        <input type="hidden" name="param_opt_1" value="myinfo"/>\
13448			        <input type="hidden" name="param_opt_2" value="'+data.userid+'"/>\
13449				</form>\
13450				<form name="myinfo_form" method="post" action="/_myinfo_proc">\
13451				<input type="hidden" id="cert_data" name="cert_data" value="">\
13452					<input type="hidden" id="input-name" name="name" value="'+data.name+'">\
13453					<input type="hidden" id="input-birth" name="birth" value="'+data.birth+'">\
13454					<input type="hidden" id="input-tel" name="tel" value="'+data.tel+'">\
13455					<input type="hidden" id="input-gender" name="gender" value="'+data.gender+'">\
13456					<input type="hidden" id="input-email" name="email" value="'+data.email+'">\
13457					<input type="hidden" id="input-id" name="id" value="'+data.userid+'">\
13458				</form>\
13459			';
13460
13461			if(property.CERT_USE == 'Y'){
13462				if(property.SETTINGS.sitePermit == '2Y') {
13463					if(!data.userid){
13464						if(property.ONE && !property.VIEW) { //onepage site
13465							var onpage_seq = property.pageContent.index[0]['seq'];
13466							if(onpage_seq!='login' && onpage_seq!='register' && onpage_seq!='forgot'){
13467								location.href='/_login';
13468							}
13469						} else {
13470							if(property.PAGE!='_login' && property.PAGE!='_register' && property.PAGE!='_forgot') {
13471								location.href='/_login';
13472							}
13473						}
13474						
13475					} else {
13476						var str = '\
13477						<div class="site-lock-block useronly">\
13478							<div class="inner-box text-center">\
13479								<div class="form-inline">\
13480									<div class="text">\
13481									'+cert_form+'\
13482										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="120" height="120"><defs/><g><circle cx="-220.9" cy="60" r="24" class="cls-9"/></g><g/><g><circle cx="60" cy="24" r="22" style="fill:#dbdbdb;"/><path d="M54 52h12c16.56 0 30 13.44 30 30v12c0 4.42-3.58 8-8 8H32c-4.42 0-8-3.58-8-8V82c0-16.56 13.44-30 30-30Z" style="fill:#dbdbdb;"/><path d="m97.34 71.03 3.8 2.58c.67.46 1.43.77 2.23.92l4.51.86a5.95 5.95 0 0 1 4.73 4.73l.86 4.51c.15.8.47 1.56.92 2.23l2.58 3.8a5.942 5.942 0 0 1 0 6.68l-2.58 3.8c-.46.67-.77 1.43-.92 2.23l-.86 4.51a5.95 5.95 0 0 1-4.73 4.73l-4.51.86c-.8.15-1.56.47-2.23.92l-3.8 2.58a5.942 5.942 0 0 1-6.68 0l-3.8-2.58c-.67-.46-1.43-.77-2.23-.92l-4.51-.86a5.95 5.95 0 0 1-4.73-4.73l-.86-4.51c-.15-.8-.47-1.56-.92-2.23l-2.58-3.8a5.942 5.942 0 0 1 0-6.68l2.58-3.8c.46-.67.77-1.43.92-2.23l.86-4.51a5.95 5.95 0 0 1 4.73-4.73l4.51-.86c.8-.15 1.56-.47 2.23-.92l3.8-2.58a5.942 5.942 0 0 1 6.68 0Z" style="fill:#4D94FA"/><path d="M94 74c.39 0 .77.12 1.09.34l3.8 2.58c1.13.77 2.39 1.29 3.74 1.55l4.51.86c.79.15 1.39.76 1.54 1.54l.86 4.51c.26 1.35.78 2.6 1.55 3.74l2.58 3.8c.45.66.45 1.52 0 2.18l-2.58 3.8a9.941 9.941 0 0 0-1.55 3.74l-.86 4.51c-.15.79-.76 1.39-1.54 1.54l-4.51.86c-1.35.26-2.6.78-3.74 1.55l-3.8 2.58c-.32.22-.7.34-1.09.34s-.77-.12-1.09-.34l-3.8-2.58a9.941 9.941 0 0 0-3.74-1.55l-4.51-.86c-.79-.15-1.39-.76-1.54-1.54l-.86-4.51c-.26-1.35-.78-2.6-1.55-3.74l-2.58-3.8c-.45-.66-.45-1.52 0-2.18l2.58-3.8a9.941 9.941 0 0 0 1.55-3.74l.86-4.51c.15-.79.76-1.39 1.54-1.54l4.51-.86c1.35-.26 2.6-.78 3.74-1.55l3.8-2.58c.32-.22.7-.34 1.09-.34m0-4c-1.17 0-2.33.34-3.34 1.03l-3.8 2.58c-.67.46-1.43.77-2.23.92l-4.51.86a5.95 5.95 0 0 0-4.73 4.73l-.86 4.51c-.15.8-.47 1.56-.92 2.23l-2.58 3.8a5.942 5.942 0 0 0 0 6.68l2.58 3.8c.46.67.77 1.43.92 2.23l.86 4.51a5.95 5.95 0 0 0 4.73 4.73l4.51.86c.8.15 1.56.47 2.23.92l3.8 2.58c1.01.69 2.18 1.03 3.34 1.03s2.33-.34 3.34-1.03l3.8-2.58c.67-.46 1.43-.77 2.23-.92l4.51-.86a5.95 5.95 0 0 0 4.73-4.73l.86-4.51c.15-.8.47-1.56.92-2.23l2.58-3.8a5.942 5.942 0 0 0 0-6.68l-2.58-3.8c-.46-.67-.77-1.43-.92-2.23l-.86-4.51a5.95 5.95 0 0 0-4.73-4.73l-4.51-.86c-.8-.15-1.56-.47-2.23-.92l-3.8-2.58A5.919 5.919 0 0 0 94 70Z" style="fill: #4789e7;"/><path d="M91.59 101.71c-.51 0-1.02-.2-1.41-.59l-6.59-6.59c-.78-.78-.78-2.05 0-2.83s2.05-.78 2.83 0l5.17 5.17 10-10c.78-.78 2.05-.78 2.83 0s.78 2.05 0 2.83l-11.41 11.41c-.39.39-.9.59-1.41.59Z" style="fill:#fff"/></g></svg>\
13483										<p class="title">'+$.lang[LANG]['siteum.cert.user']+'</p>\
13484										'+$.lang[LANG]['siteum.cert.user.txt']+'\
13485										<button class="btn cl-s-btn cl-s-btn-full btn-cert" onclick="return auth_type_check(true);">\
13486										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
13486<path d="M22 0H10C7.79 0 6 1.79 6 4v24c0 2.21 1.79 4 4 4h12c2.21 0 4-1.79 4-4V4c0-2.21-1.79-4-4-4zm2 28c0 1.1-.9 2-2 2H10c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h12c1.1 0 2 .9 2 2v24z"/><path d="M18 4h-4c-.55 0-1 .45-1 1s.45 1 1 1h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
13487										'+$.lang[LANG]['siteum.cert.user.btn']+'</button>\
13488										<a class="btn cl-s-btn cl-s-btn-primary cl-s-btn-full logout" href="javascript:;">'+ $.lang[LANG]['siteum.cert.user.exit'] +'</a>\
13489									</div>\
13490								</div>\
13491							</div>\
13492						</div>\
13493						';
13494						if($.clnav.check()) {
13495							$('.dsgn-body').prepend(htmlspecialchars_decode(str));
13496						} else {
13497							$('.header.el-menu').after(htmlspecialchars_decode(str));
13498						}
13499
13500						$(document).on('click', '.btn.logout', function(e){
13501							e.preventDefault();
13502							$.getJSON('/umember/login/out', function(r) {
13503								if($.cookie('cert_popup') !== undefined) {
13504									$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
13505								}							
13506								location.reload();
13507							},'json');
13508						});
13509					}
13510				} else {
13511					if($.inArray(property.PAGE, ['_register', '_login', '_forgot', '_mypost', '_myinfo']) == -1) {
13512						var modal_content = '<p class="text-center">' + $.lang[LANG]['siteum.cert.identify.verification.txt.1'] + '</p>\
13513							<div class="info">\
13514							' + $.lang[LANG]['siteum.cert.identify.verification.txt.2'] + '\
13515							</div>';
13516
13517						if(data.cert == 'N') {
13518				        	modal_content += cert_form;
13519							$(this).showModalFlat($.lang[LANG]['siteum.cert.identify.verification'], modal_content, true, true, function() {
13520								auth_type_check(true);
13521							}, $.lang[LANG]['siteum.cert.identify.colse.btn'], $.lang[LANG]['siteum.cert.identify.verification.btn'],'modal-dialog cl-cmmodal cl-s-btn w560 cl-p70 cl-modal cl-close-btn user-not-cert-modal', false, function(){ //close
13522								$.getJSON('/umember/login/out', function(r) {
13523									location.href = r.url;
13524									// location.href = '/';
13525								},'json');
13526							}, '', function() { //hide
13527								$.getJSON('/umember/login/out', function(r) {
13528									location.href = r.url;
13529									// location.href = '/';
13530								},'json');
13531							});
13532						}
13533					}
13534				}
13535			} else if(property.CERT_USE == 'A') {
13536				if(!data.userid){
13537					if(property.ONE && !property.VIEW) { //onepage site
13538						var onpage_seq = property.pageContent.index[0]['seq'];
13539						if(onpage_seq!='login' && onpage_seq!='register' && onpage_seq!='forgot'){
13540							location.href='/_login';
13541						}
13542					} else {
13543						if(property.PAGE!='_login' && property.PAGE!='_register' && property.PAGE!='_forgot') {
13544							location.href='/_login';
13545						}
13546					}
13547					
13548				} else {
13549					var str = '\
13550					<div class="site-lock-block adultonly">\
13551						<div class="inner-box text-center">\
13552							<div class="form-inline">\
13553								<div class="text">\
13554								'+cert_form+'\
13555									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="120" height="120"><path class="st54" d="M49.68 82.35h-4.82V41.79l-8 4.89v-4.76l8.57-5.52h4.25v45.95z"/><path class="st54" d="M80.58 44.77c.42 1.35.78 3.33 1.08 5.94.3 2.6.44 5.83.44 9.68 0 2.71-.18 5.34-.54 7.9-.36 2.56-.98 4.92-1.87 7.08-.97 2.24-2.34 4.04-4.09 5.4-1.76 1.35-3.99 2.03-6.7 2.03-1.86 0-3.54-.31-5.05-.92-1.5-.61-2.74-1.38-3.71-2.32a9.926 9.926 0 0 1-2.13-3.43c-.49-1.31-.73-2.52-.73-3.62h5.65c0 .51.1 1.2.29 2.06.19.87.52 1.6.98 2.19.46.59 1.11 1.1 1.94 1.52.83.42 1.79.63 2.89.63 1.48 0 2.78-.53 3.9-1.59s1.98-2.41 2.57-4.06c.59-1.65 1.03-3.37 1.3-5.17s.41-3.5.41-5.11v-2.41c-.85 1.23-1.9 2.22-3.17 2.98-1.61.97-3.28 1.46-5.01 1.46-2.12 0-3.9-.32-5.36-.95-1.46-.63-2.76-1.61-3.9-2.92-1.06-1.27-1.86-2.86-2.41-4.76s-.83-3.87-.83-5.9c0-1.99.29-3.92.86-5.81.57-1.88 1.39-3.48 2.44-4.79 1.14-1.27 2.55-2.21 4.22-2.83 1.67-.61 3.33-.92 4.98-.92 1.61 0 3.24.32 4.89.95s3.05 1.59 4.19 2.86c1.06 1.32 1.88 2.93 2.47 4.83zm-19.17 5.78c0 1.44.17 2.8.51 4.09.34 1.29.85 2.42 1.52 3.4.68.97 1.5 1.71 2.48 2.22.97.51 1.99.76 3.05.76 1.02 0 2.01-.25 2.98-.76.97-.51 1.82-1.25 2.54-2.22.63-.97 1.13-2.1 1.49-3.4.36-1.29.54-2.66.54-4.09 0-1.44-.18-2.8-.54-4.09-.36-1.29-.86-2.42-1.49-3.4a8.128 8.128 0 0 0-2.54-2.19c-.97-.53-1.97-.79-2.98-.79-1.06 0-2.07.26-3.05.79a7.51 7.51 0 0 0-2.48 2.19c-.68.97-1.19 2.11-1.52 3.4a15.97 15.97 0 0 0-.51 4.09z"/><path class="st54" d="M119 58h-9v-9h-4v9h-9v4h9v9h4v-9h9z"/><path d="M100.91 81C93.26 95.83 77.8 106 60 106c-25.36 0-46-20.64-46-46s20.64-46 46-46c17.8 0 33.26 10.17 40.91 25h4.47C97.44 21.88 80.11 10 60 10c-27.61 0-50 22.39-50 50s22.39 50 50 50c20.11 0 37.44-11.88 45.38-29h-4.47z" fill="#e00"/></svg>\
13556									<p class="title">'+$.lang[LANG]['siteum.cert.adult']+'</p>\
13557									'+$.lang[LANG]['siteum.cert.adult.txt']+'\
13558									<button class="btn cl-s-btn cl-s-btn-full btn-cert" onclick="return auth_type_check(true);">\
13559									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
13559<path d="M22 0H10C7.79 0 6 1.79 6 4v24c0 2.21 1.79 4 4 4h12c2.21 0 4-1.79 4-4V4c0-2.21-1.79-4-4-4zm2 28c0 1.1-.9 2-2 2H10c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h12c1.1 0 2 .9 2 2v24z"/><path d="M18 4h-4c-.55 0-1 .45-1 1s.45 1 1 1h4c.55 0 1-.45 1-1s-.45-1-1-1z"/></svg>\
13560									'+$.lang[LANG]['siteum.cert.adult.btn']+'</button>\
13561									<a class="btn cl-s-btn cl-s-btn-primary cl-s-btn-full logout" href="javascript:;">'+ $.lang[LANG]['manager.site-um.logout'] +'</a>\
13562								</div>\
13563							</div>\
13564						</div>\
13565					</div>\
13566					';
13567					if($.clnav.check()) {
13568						$('.dsgn-body').prepend(htmlspecialchars_decode(str));
13569					} else {
13570						$('.header.el-menu').after(htmlspecialchars_decode(str));
13571					}
13572
13573					$(document).on('click', '.btn.logout', function(e){
13574						e.preventDefault();
13575						$.getJSON('/umember/login/out', function(r) {
13576							if($.cookie('cert_popup') !== undefined) {
13577								$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
13578							}							
13579							location.reload();
13580						},'json');
13581					});
13582				}
13583	    	}
13584		}
13585	}, 'json');
13586}
13587
13588function call_auth_data(frm) {
13589	auth_data(frm);
13590}
13591
13592var fonts_ko = ["@Korean", "IBM Plex Sans KR", "KoPub Batang", "Black Han Sans", "Gmarket Sans", "Godo", "Kukdetopokki", "Nanum Gothic", "Nanum Gothic Coding", "Nanum Myeongjo", "Nanum Barun Gothic", "Nanum Pen Script", "Nanum Barun Pen", "Nanum Brush Script", "Nanum Square", "Nanum Square Round", "Daraehand", "Dohyeon", "Recipekorea", "Monsori", "Noto Sans KR", "Noto Serif CJK KR", "BB Tree Gothic","BB Tree Namu",  "BB Tree Hand", "Seoul Namsan", "Seoul Hangang", "Suit", "Spoqa Han Sans", "S CoreDream", "Yeonsung", "Oseong and HanEum", "Iropke Batang", "EASTARJET", "Jalnan", "Jeju Gothic", "Jeju Myeongjo", "Jeju Hallasan", "Jua", "Youth", "Pretendard", "Hangyule", "Hanna"],
13593    fonts_en = ["@English", "Abel", "Abril Fatface", "Alegreya", "Aliquam", "Archivo", "Belleza", "Cardo", "Chakra Petch", "Caveat", "Cookie", "Cutive Mono", "Dancing Script", "Dosis", "Fredoka One", "Great Vibes", "Ibarra Real Nova", "Inter", "Jost", "Krona One", "Lato", "League Spartan", "Libre Baskerville", "Lora", "Montserrat", "Muli", "Nixie One", "Noto Sans", "Open sans", "Oswald", "Parisienne", "Playball", "Playfair Display", "Poppins", "PT Sans", "PT Serif", "Questrial", "Quicksand", "Raleway", "Roboto", "Roboto Slab", "Space Mono", "Source Code Pro", "Staatliches", "Stalemate", "Titillium Web"],
13594    fonts_ja = ["@Japanese", "Hannari", "Hokkori", "IoEI", "JKG", "MS Gothic", "MS Mincho", "Noto Sans JP", "Noto Serif JP"],
13595    fonts_th = ["@Thai", "Cyclin", "Hai Heritage Pro", "HFF Thai Dye", "Owah Tagu Siam NF"],
13596    fonts_ar = ["@Arabic", "Aceh Darusalam", "Amiri", "ArabDances", "Boecklins Universe", "Catharsis Bedouin", "Himchuli", "Kanisah", "Satyajit"],
13597    fonts_cr = ["@Cyrillic", "20db", "Alpha Echo", "Anonymous Pro", "Arsenal", "Bebas Neue", "Bitter", "Charis SIL", "Fira Mono", "Lato CR"],
13598    fonts_he = ["@Hebrew", "Alef", "Ezra SIL", "MendelSiddurMW"],
13599    fonts_ch = ["@Chinese", "cwTeXHei", "cwTeXKai", "cwTeXMing", "cwTeXYen", "Noto Sans SC", "Noto Sans TC", "Noto Serif SC", "Noto Serif TC"],
13600    fonts_vi = ["@Vietnamese", "Han Nom Gothic"];
13601    FONTS = [];
13602
13603for(i=0; i<UFONTS.length; i++){
13604    var fonts = eval('fonts_'+UFONTS[i]);
13605    FONTS = arrayUnique(fonts.concat(FONTS));
13606}
13607
13608function galleryStartHover() {
13609    $(this).find('figure').addClass('hover');
13610};
13611function galleryCloseHover() {
13612    $(this).find('figure').removeClass('hover');
13613};
13614function galleryMovelink() {
13615	$(this).find('a').click();
13616};
13617
13618$(function () {
13619	$(document).on('click', '.modoo._floating_area[data-mfltype^="ci"] ._toggle_btn', function(){
13620		var navi_btn = $('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button');
13621
13622		if(navi_btn.hasClass('mfl_hide')) {
13623			$('.modoo._floating_area[data-mfltype^="ci"]').removeClass('fl_open').addClass('fl_open');
13624			$('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button').removeClass('mfl_hide');
13625			$(this).removeClass('float-navi-open').addClass('float-navi-open');
13626			$(this).find('._icon_area').removeClass('nicon_more4').addClass('nicon_close');
13627		} else {
13628			$('.modoo._floating_area[data-mfltype^="ci"]').removeClass('fl_open');
13629			$('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button').addClass('mfl_hide');
13630			$(this).removeClass('float-navi-open');
13631			$(this).find('._icon_area').removeClass('nicon_close').addClass('nicon_more4');
13632		}
13633		
13634	});
13635
13636	$(document).on('click', '.nonePrice', function () {
13637		alert('로그인 후 이용이 가능합니다.');
13638		if (property['VALIDTYPE'] != 'SM') {
13639			$('.login .cl_icon_profile').click();
13640		} else {
13641			location.href='/_login';
13642		}
13643		return false;
13644	});
13645
13646	$(document).on('click', '.noneShoppingGrade, .noneShoppingGrade a', function(e) {
13647		e.preventDefault();
13648		e.stopImmediatePropagation();
13649		var msg = $(this).closest('.noneShoppingGrade').attr('data-shopping-grade-msg') || '해당 등급 고객 전용 상품입니다.';
13650		alert(normalizeShoppingGradeBlockedMessage(msg));
13651		return false;
13652	});
13653
13654});
13655
13656var naverLogCallback = function(callback) {
13657	if($('#naverLogload').length == 0) {
13658		var head= document.getElementsByTagName('head')[0];
13659		var script= document.createElement('script');
13660		script.type= 'text/javascript';
13661		script.id= 'naverLogload';
13662		script.src= '//wcs.naver.net/wcslog.js';
13663		script.addEventListener('load', callback);
13664		head.appendChild(script)
13665	} else {
13666		if(typeof callback == 'function') {
13667			callback();
13668		}
13669	}
13670}
13671
13672var member_only_item = function() {
13673	alert('로그인 후 이용이 가능합니다');
13674	location.href = "/_login";
13675}

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.