PageSourceSearch

https://koreapetfoodinc.com/js/render.1790038088.js

js koreapetfoodinc.com collected 2026-09-24 14:46:39 UTC 558,896 bytes, 12,978 lines download raw bytes

1var isAosBlock = false; 
2var isgalleryView = false;
3var pageLoad = true;
4var menuClickMove = false;
5
6var RENDER = {
7    init: function (property) {
8		var History = window.History; 
9		var b = property,
10			URI = (b.PUBLISH) ? '/' : '/render',
11			param = (b.PUBLISH) ? '/publish/true' : '',
12			selectEL = '',
13			galleryEL = new Object();
14		var CERT_USERID = '';
15		
16			this.b = b;
17			this.b.pageContent = {};
18			this.b.pageContent[b.PAGE] = b.INITPAGE;
19			this.b.pageConf = {};
20			this.b.pageConf[b.PAGE] = b.PAGECONF || {
21				islock: b.ISLOCK,
22				overlay: b.HEADER,
23				pageScript: '',
24				meta: null,
25				og_others: null
26			};
27			this.b.pageBlocksType = {};
28			this.b.URL = URI;
29			this.b.param = param;
30			this.history = window.History;
31			this.b.MENULIST = [];
32			this.galleryEL = galleryEL;
33			this.b.certOpenChk = false;
34			_this = this;
35
36			var applyPageConf = function(data) {
37				if(!data) return true;
38				if(typeof data.url != 'undefined' && data.url) {
39					location.href = data.url;
40					return false;
41				}
42
43				if(typeof data.islock != 'undefined') b.ISLOCK = data.islock;
44				if(typeof data.overlay != 'undefined') b.HEADER = (data.overlay) ? true : false;
45
46				var isSidebar = $('.el-menu > header').hasClass('sidebar');
47				var isHeaderOldVer = !$.clnav.check();
48				if(isHeaderOldVer) {
49					if(b.HEADER && !b.VIEW && !isSidebar) {
50						$('.header-empty').css('height',0);
51						$('.header.el-menu').removeClass('fixed');
52						$('header.navbar').addClass('transparent');
53					} else {
54						$('header.navbar').removeClass('transparent');
55					}
56				}
57
58				if(typeof data.pageScript != 'undefined') {
59					$('#pageScript').remove();
60					if(data.pageScript) $('body').append(data.pageScript);
61				}
62				if(data.meta != null) {
63					$.each(data.meta, function(k,v) {
64						$('meta[name="' + k + '"]').attr('content',v);
65						if(k == 'title') {
66							$(document).prop('title', htmlspecialchars_decode(v));
67						}
68					});
69				}
70				if(data.og_others != null) {
71					$.each(data.og_others, function(ok,ov) {
72						var og_property = ok.replace(/\_\_/gi,':');
73						if(ov != '') {
74							if($('meta[property="' + og_property + '"]').length > 0) $('meta[property="' + og_property + '"]').attr('content',ov);
75							else $('meta[property^="og:"]').eq($('meta[property^="og:"]').length - 1).after('<meta property="' + og_property + '" content="' + ov + '" data-dynamic="true"/>');
76						} else {
77							if($('meta[property="' + og_property + '"]').length > 0) $('meta[property="' + og_property + '"]').remove();
78						}
79					});
80				}
81
82				return true;
83			};
84
85			var getPageContentsUrl = function(page) {
86				var contentsParam = param;
87				contentsParam = (page == 'index,template' && contentsParam.indexOf('/org/') == -1) ? contentsParam + '/org/' + page : contentsParam;
88				contentsParam = (b.PUBLISH) ? contentsParam : contentsParam + '/render/true';
89				return '/template/contents/sid/' + b.SID + '/page/' + encodeURIComponent(page) + contentsParam;
90			};
91
92			var isRenderFormSubmitAllowed = function() {
93				if(window.location.pathname.match(/^\/render(\/|$)/) === null) return true;
94				return (b.PREVIEW_FORM_SUBMIT === true || b.PREVIEW_FORM_SUBMIT === 'true');
95			};
96
97			var cachePageContentsResult = function(page, data) {
98				if(!data) return;
99				if(data.conf) b.pageConf[page] = data.conf;
100				if(typeof data.blocks_type != 'undefined') b.pageBlocksType[page] = data.blocks_type;
101				if(typeof data.contents != 'undefined' && page != 'index,template') b.pageContent[page] = data.contents;
102				if(data.initContent !== undefined) property.INITPAGE = JSON.parse(data.initContent);
103			};
104
105			var loadPageMoveConf = function(page, isForumView) {
106				var deferred = $.Deferred();
107				if(b.pageConf.hasOwnProperty(page)) {
108					deferred.resolve(b.pageConf[page]);
109					return deferred.promise();
110				}
111
112				if(!isForumView) {
113					$.ajax({
114						url: getPageContentsUrl(page),
115						data: { siteum: b.SITEUM },
116						dataType: 'json',
117						type: 'GET',
118						async: true,
119						cache: false,
120						success: function(data) {
121							if(typeof data.url != 'undefined' && data.url) {
122								deferred.resolve(data);
123								return false;
124							}
125							if(typeof data.error != 'undefined' && data.error) {
126								deferred.resolve({});
127								return false;
128							}
129
130							cachePageContentsResult(page, data);
131							deferred.resolve(data.conf || {});
132						},
133						error: function() {
134							deferred.reject();
135						}
136					});
137				} else {
138					$.ajax({
139						url: '/template/conf',
140						data: { sid : b.SID, page : page, publish : b.PUBLISH, siteum : b.SITEUM },
141						dataType: 'json',
142						type: 'POST',
143						async: true,
144						cache: false,
145						success: function(data) {
146							if(!(typeof data.url != 'undefined' && data.url)) b.pageConf[page] = data;
147							deferred.resolve(data);
148						},
149						error: function() {
150							deferred.reject();
151						}
152					});
153				}
154
155				return deferred.promise();
156			};
157    	$(window).ready(function() {
158    		if(b.VALIDPLAN && $.inArray(b.VALIDTYPE, ['BN','SM']) > -1 && (b.CERT_USE == 'Y' || b.CERT_USE == 'A')) {
159    			if(b.CERT_USE == 'Y') {
160    				if(b.UMEMBER.check_login == true) isUserCertified(history);
161    			} else {
162    				isUserCertified(history);
163    			}
164    		}	
165
166    		if(!b.VALIDPLAN && b.CERT_USE == 'A') {
167    			isUserCertified(history);
168    		}
169
170			var checkIOS = ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1) || (navigator.userAgent.indexOf('iPad') != -1)) ? true : false;
171			if(checkIOS) $('body').addClass('ios-bg-attachment-scroll');
172    	
173	        (function(window){
174	            var History = window.History;
175	            if ( !History.enabled ) {
176	                return false;
177	            }
178
179	            History.Adapter.bind(window,'statechange',function(){
180					$('.error_404.new_design').remove();
181
182	                var State = History.getState(),
183	                	cUrl = new getLocation(State.url),
184	                	loc = cUrl.pathname,
185	                	uri = (b.PUBLISH) ? loc.replace(/^\//,'').replace(/\/$/,'') : loc.replace(/\/*(render)\/*/,''),
186	                	uri = uri.replace('/view/',','),
187	                	s = uri.split(','),							
188	                	bookmark = '';
189						
190						if (b && b.MODOO === true) {
191								const inSubmenu = Array.isArray(b.SMENU) &&
192								b.SMENU.some(menu =>
193									Array.isArray(menu.children) &&
194									menu.children.some(child =>
195									child.name.replace(/ /g, "-") === decodeURI(uri)
196									)
197								);
198								if (inSubmenu) {
199									//console.log('현재 페이지 서브메뉴 존재');
200									$('.cl-nav-section.sub').show();
201								} else {
202									//console.log('현재 페이지 서브메뉴 없음');
203									$('.cl-nav-section.sub').hide();
204								}
205						}
206
207					if(uri.match(/^(psearch|\_checkout|\_forgot|\_mypayment|\_lang)\//gi) !== null) {
208	                	location.href = '/'+uri;
209	                	return false;
210	                }
211
212					if(uri.match(/^_product\//gi) !== null) {
213						uri = (b.PUBLISH) ? uri : 'render/' + uri;
214						location.href = '/'+uri;
215						return false;
216					}
217					// naverLogCallback(function() {
218					// 	if("naver_log" in b.SETTINGS) {
219					// 		if (!wcs_add) var wcs_add={};
220					// 		wcs_add["wa"] = b.SETTINGS.naver_log;
221					// 		if (!_nasa) var _nasa={};
222					// 		wcs_do(_nasa);
223					// 	}
224					// });
225	                if($('.cl-flat-modal').length > 0) $('.cl-flat-modal .modal').modal('hide');
226
227	                if(uri == b.URL || uri == '') {
228	                	uri = (b.ONE) ? 'index' : b.MENULINK[0];
229	                }
230
231	                (typeof s[1] != 'undefined') ? b.VIEW = s[1] : b.VIEW = '';
232	                b.PAGE = decodeURI(uri);
233	                if(b.PAGE.indexOf('@')>-1) {
234	                	var tmp = b.PAGE.split('@');
235	                	b.PAGE = tmp[0];
236	                	bookmark = tmp[1];
237	                }
238
239	                if((b.PAGE).indexOf(',')>-1) {
240	                	var tmp = b.PAGE.split(',');
241	                	b.VIEW = tmp[1];
242	                }
243					
244					$('.el-footer').css('visibility', 'hidden');
245					$.processON();
246					
247			    	getParent(s[0],b.VIEW,b.PAGE);
248					var pageMove = true;
249						
250			    	if(b.VIEW && s[0] != 'forum' && s[0] != 'psearch' && b.COUNT == 0 && !b.PUBLISH) {
251			    		$(this).showModalFlat('INFORMATION','Page not found',true,false,'','ok');
252			    		History.back();
253			    		pageMove = false;
254			    	}
255			    	if(pageMove) {
256						clearDsgnbody();
257			    		pageLoad = true;
258			    		var is_templates = checkTemplateSite(b.SID),
259							menuVer06 = ($('.el-menu .cl-menu-option').length > 0) ? true : false;
260
261			    		var menu_name = (b.VIEW) ? b.PAGE.split(',') : [b.PAGE],
262			    			tmp_url = (is_templates || b.PUBLISH === false) ? '/render' : '',
263							tmp_href = 'a[href="'+tmp_url+'/' + menu_name[0]+'"]',
264			    			pagemenu_link = '#tpl-menu.nav li '+tmp_href;
265
266			    		if(!$(pagemenu_link).parent().hasClass('active')) {
267			              	$('#tpl-menu li').removeClass('active').removeClass('open');
268
269			              	$(pagemenu_link).parent().addClass('active');
270			              	if($(pagemenu_link).closest('.dropdown-menu').length>0) {
271			                  	if($('body').width() > 768) {
272			                  		$(pagemenu_link).closest('.dropdown').addClass('active');
273			                  	} else {
274			                  		$(pagemenu_link).closest('.dropdown').addClass('open');
275			                  	}
276			              	} else {
277			                	if($('.el-menu > header').hasClass('navbar-fheader')) $('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
278				                else {
279				                  if($('body').width() <= 768) $('#tpl-menu li.dropdown ul.dropdown-menu').hide();
280				                }
281			              	}
282			            }
283
284						if(menuVer06) {
285							$('.el-menu .cl-moption-row').removeClass('active');
286							$('.el-menu .cl-moption-row '+tmp_href).closest('.cl-moption-row').addClass('active');
287							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');
288
289							$('#mobile-nav li.menu-has-children').removeClass('open');
290							$('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
291							$('#mobile-nav '+tmp_href).closest('li.menu-has-children').addClass('open');
292							$('#mobile-nav '+tmp_href).closest(' ul.dropdown-menu').show();
293						}
294
295
296			            if($('.shopping-more-wrap').length > 0) $('.shopping-more-wrap').remove();
297			            // console.log('pageMove', $.cookie('prev-forum-view'));
298			            if(s[0] != 'forum' && $.cookie('prev-forum-view') === undefined) {
299			            	// console.log('forum cookie');
300			            	$.each(document.cookie.split(';'), function(index, cookie) {
301								var name = cookie.split('=')[0].trim();
302								if (name.indexOf('forum_') === 0) {
303					                $.removeCookie(name, {path:'/'})
304									// document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
305								}
306							});
307				            }
308				            $.removeCookie('prev-forum-view', {path:'/'});
309							var continuePageDraw = function() {
310									$('body').find('.galProjectCss').remove();
311									if($('.popup').length) $('.popup').remove(); //clear Popup;
312									if(b.SETTINGS.noError404 === true && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) { // page move
313									window.location.href = '/';
314									return false;
315								}
316								showPageCallback(showPage, function() {
317									var pgmove_vMode = (typeof $('.mobilepc_ch').attr('data-desktop-option')!='undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : '';
318									pgmove_vMode = $.mpcWeb.mpcGetVpmode(pgmove_vMode,b.SETTINGS);
319									if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
320										if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) $.mpcWeb.mpcWebhtml(pgmove_vMode,b.pageContent[b.PAGE],b.SETTINGS.zoom,'pagemove');
321									}
322
323									setTimeout(function() {
324										if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
325											if(b.ONE && !b.VIEW || (b.PAGE == b.MENULINK[0]) && !b.VIEW) setSitePopup();
326											$.siteBanner.init(true,true);
327										}
328
329										if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
330											if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
331												$.fnav.draw(b.SETTINGS.fnav);
332											}
333											if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
334												var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
335												if(!(b.PARENT.page != null && (quick_type=='mobile'))) {
336													$.quickmenu.init(b.SID, b.PUBLISH,quick_type);
337													mobileWebQuickmenuPosition(b,quick_type);
338												} else {
339													$(`.quick-menu-${b.SID}`).remove();
340												}
341											}
342										}
343										if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
344											if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
345												mobileWebfnavCheck(pgmove_vMode);
346											}
347										}
348										
349										// 원페이지, 갤러리 상세페이지에서 메뉴 클릭 시 페이지 이동 후 해당 메뉴로 이동하지 않고 상단 고정 Issue Fix (https://flow.team/l/1x7rX)
350										if(typeof b.SID != 'undefined' && b.SID && b.SID == 'ronixinc') {
351											if(location.hash) {
352												var hash = decodeURIComponent(location.hash.substring(1));  
353												console.log('해시 감지:', hash);
354												
355												setTimeout(function() {
356													var $block = $('.link-to-' + hash);
357													
358													if($block.length > 0) {
359														var blockTop = $block.offset().top;
360														var currentScroll = $(window).scrollTop();
361														var threshold = 100;
362														
363														if(Math.abs(blockTop - currentScroll) > threshold) {
364															console.log('스크롤 필요:', {current: currentScroll, target: blockTop});
365															moveLinkPage(hash);
366														} else {
367															console.log('이미 근처에 있음, 스크롤 생략');
368														}
369													} else {
370														console.error('블록 없음:', '.link-to-' + hash);
371													}
372												}, 500);
373											}
374										}
375
376									}, 500);
377								});
378
379								if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
380									setTimeout(function() {
381										moveGallery($.cookie('gallery-item'));
382									},500);
383								} else if(typeof $.cookie('gallery') != 'undefined' && b.VIEW == '') {
384									setTimeout(function() {
385										moveGallery($.cookie('gallery'));
386									},500);
387								} else if(typeof $.cookie('forum-item') != 'undefined' && b.VIEW == '') {
388									// console.log('fm_view', $.cookie('forum_content_view'));
389									setTimeout(function() {
390										if(typeof $.cookie('forum_content_view') != 'undefined'){
391											var fm_view = $.cookie('forum_content_view');
392											var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
393											var pid = (fv)? fv[0]:'';
394											var row_id = (fv)? fv[1]:'';
395
396											scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
397											$.removeCookie('forum-item', { path: '/' });
398											
399											$('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
400											// $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
401										} else {
402											scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
403											$.removeCookie('forum-item', { path: '/' });
404										}
405									}, 500);
406								} else {
407									var url = window.location;
408									setTimeout(function() {
409										moveScroll(0,url.href);
410									},300);
411								}
412								if(typeof b.SETTINGS.google != 'undefined' && b.SETTINGS.google.length > 0) {
413									var https_check = (location.protocol=='https:') ? 'https:' : 'http:',
414										host_url = b.URL +  b.PAGE;
415
416									host_url = (b.PARENT && b.PARENT.mode=='project') ? (host_url.replace(/,/g,"/view/")) : host_url;  
417
418									if(b.SETTINGS.google.indexOf('UA-') > -1) ga('send', 'pageview', location.pathname);
419									else if(b.SETTINGS.google.indexOf('G-') > -1) {
420										gtag('config', b.SETTINGS.google, {
421											page_title: b.TITLE,
422											page_location: https_check + '//'+ b.HOST + host_url,
423											page_path: host_url
424										});
425									}
426									//else gtag('config', b.SETTINGS.google , {page_path : location.pathname});
427									//console.log(https_check + '//'+ b.HOST + host_url);
428									// console.log('google analytics send, pageview');
429								}
430								if(typeof b.SETTINGS.npay_setting != 'undefined' && b.SETTINGS.npay_setting.onoff == true && b.SETTINGS.npay_setting.naver_log.length > 0) {
431									wcs_do();
432									// console.log('naverpay log');
433								} else {
434									if(typeof b.SETTINGS.naver_log != 'undefined' && b.SETTINGS.naver_log.length > 0) {
435										wcs.inflow();
436										wcs_do(_nasa);
437										// console.log('naver analytics send, pageview');
438									}
439								}
440								if(typeof b.SETTINGS.gtag_event != 'undefined' && typeof b.SETTINGS.gtag_event.page != 'undefined' && b.SETTINGS.gtag_event.page.length > 0) {
441									if(typeof b.SETTINGS.gtag_event.type != 'undefined' && b.SETTINGS.gtag_event.type == 'event' && b.SETTINGS.gtag_event.page == b.PAGE) {
442										// console.log(b.SETTINGS.gtag_event);
443										var v0 = b.SETTINGS.gtag_event.val[0],
444											v1 = b.SETTINGS.gtag_event.val[1],
445											v2 = b.SETTINGS.gtag_event.val[2];
446
447										gtag(b.SETTINGS.gtag_event.type,v0,{v1:v2});
448										// gtag(b.SETTINGS.gtag_event.type, b.SETTINGS.gtag_event.val[0], { b.SETTINGS.gtag_event.val[1] : b.SETTINGS.gtag_event.val[2] });
449									}
450								
451								}
452
453								// menu ver3 : fheader
454								setTimeout(function() {
455									if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
456								},400);
457
458
459								// favicon refresh
460								var favicon = b.RESOURCE + '/' + b.SID + '/' + b.SID + '-favicon.ico?_' + new Date().getTime();
461								changeFavicon(favicon);
462
463									if(typeof pageMoveCallback == 'function') pageMoveCallback();
464									formTranslate(LANG);
465
466								};
467
468							loadPageMoveConf(b.PAGE, (s[0] == 'forum' && b.VIEW)).done(function(data) {
469								if(applyPageConf(data) === false) return false;
470								continuePageDraw();
471							}).fail(function() {
472								$.processOFF();
473							});
474							}
475		            });
476
477				History.Adapter.bind(window, 'popstate', function() { // history.js suggests statechange but it has a bug with urls with hashes not firing statechange
478	                var State = History.getState(),
479	                	cUrl = new getLocation(State.url),
480	                	bUrl = new getLocation(window.location.href);
481
482	                if(b.ONE) {
483	                	if(cUrl.href!=window.location.href) {
484	                		if(b.PAGE!='index') {
485	                			var link = (!b.PUBLISH) ? '/render/index' : bUrl.pathname;
486								var url = new getLocation(link);
487					        	golink(_this,url);
488								history.pushState('', '', link + bUrl.hash);
489	                		} else {
490	                			// if(bUrl.hash) {
491	                			// 	var go = (bUrl.hash).replace('#','');
492	                			// 	moveLinkPage(go);
493	                			// }
494	                		}
495	                	}
496	                }
497				});
498
499	        })(window);
500
501		    $('.dsgn-body').addClass('mode-render');
502	    	//$.modalON();
503
504			if(typeof b.SETTINGS == 'undefined') return;
505			// if(typeof b.SETTINGS.rightClick == 'undefined' || b.SETTINGS.rightClick === false) return;
506			if(!b.VALIDTYPE || b.VALIDTYPE == 'PK' || typeof b.SETTINGS.rightClick == 'undefined' || b.SETTINGS.rightClick === false) {
507				b.SETTINGS.rightClick = false;
508				return;
509			}
510		    $('body').on('contextmenu', function(event){ return false; });
511			$('body').on('selectstart', '.element, .forum-view, .comment-list', function(event){ return false; });
512	    	$('body').on('dragstart', '.element, .forum-view, .comment-list',  function(event){ return false; });
513
514	    });
515
516		Pace.on('done', function() {
517			/*shopping more create*/
518			if($('.shopping-wrap').length && $('.shopping-wrap').height() >= 800 && $('.shopping-more').length == 0) {
519				var more_txt = (LANG == 'ko') ? '상품정보 더보기' : 'MORE';
520				var review_chk = ($('.cl-s-product-review').length > 0) ? true : false,
521					qna_chk = ($('.cl-s-product-qna').length > 0) ? true : false;
522				var colorSet = shopping_more_color,
523					sm_font = (!colorSet) ? '' : colorSet.color,
524					sm_bgColor = (!colorSet) ? '' : colorSet.background_color,
525					sm_border = (!colorSet) ? '' : colorSet.border_color;
526				$('.shopping-wrap').css('max-height','800px')
527								   .css('overflow','hidden')
528								   .after('<div class="shopping-more-wrap"><div class="shopping-more">'+more_txt+'</div></div>');
529				$('.shopping-wrap').removeClass('open');
530				if(sm_font) $('.shopping-more').css('color',sm_font);
531				if(sm_bgColor) $('.shopping-more').css('background-color',sm_bgColor);
532				if(sm_border) $('.shopping-more').css('border-color',sm_border);
533				if(!review_chk && !qna_chk) $('.shopping-more-wrap').css('padding-bottom','100px');
534			}
535			
536			var header_h = $('header').outerHeight();
537			var menu_logo = $('.menu-logo-top');
538			var menu_logo_h = (menu_logo.length > 0) ? menu_logo.outerHeight() : 0;
539			$('.dsgn-body')[0].style.setProperty('--menu-logo-height', menu_logo_h+'px');
540			$('.dsgn-body')[0].style.setProperty('--header-height', header_h+'px');
541
542			setTimeout(function() { 
543				$('body').removeClass('pace-disable'); 
544			},500);
545			if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
546				moveGallery($.cookie('gallery-item'));
547			}
548			$.modalOFF();
549			if(!property.ONE) {
550				moveScroll(0);
551			} else {
552				// onepage index movescroll
553				if(b.PAGE=='index' && b.MODE == 'publish' && !menuClickMove) {
554					var bUrl = new getLocation(window.location.href),
555						moveId = (bUrl.pathname).replace('/','');
556					if(moveId != 'index') moveLinkPage(moveId);
557				}
558			}
559
560			$.each($('.element'), function(k,v) {
561				var checkNotSupported = false,
562					not_supported_mode = '',
563					check_video_version = true,
564					bg_vid_gfyposter = (typeof $(this).find('.bgvid source.display').attr('src') != 'undefined') ? $(this).find('.bgvid source.display').attr('src') : '',
565					vid_regex = /gfycat\.com/gi;
566			
567				if($(this).attr('data-type') == 'video' && typeof $(this).attr('data-playtype') == 'undefined' && (vid_regex.test(bg_vid_gfyposter))) {
568					check_video_version = false;
569					checkNotSupported = true;
570					not_supported_mode = $(this).attr('data-type'),
571					el_seq = $(this).attr('data-id');
572				
573					if(checkNotSupported) {
574						var upgrade_check = (!check_video_version) ? false : true;
575						$.notSupported.set(property.SID, el_seq, not_supported_mode, upgrade_check);
576					}
577				}
578			});
579
580		});
581
582		// naverLogCallback(function() {
583		// 	if("naver_log" in b.SETTINGS) {
584		// 		if (!wcs_add) var wcs_add={};
585		// 		wcs_add["wa"] = b.SETTINGS.naver_log;
586		// 		if (!_nasa) var _nasa={};
587		// 		wcs_do(_nasa);
588		// 	}
589		// });
590		
591		if(typeof pageMoveCallback == 'function') pageMoveCallback();
592		formTranslate(LANG);
593
594	    $('.dsgn-body').addClass('mode-render');
595
596		var is_templates = (typeof property.SID != 'undefined') ? checkTemplateSite(property.SID) : false;
597
598		//갤러리 블럭에서 카테고리가 비었습니다 문구가 영문 템플릿에서 한글로 나오는 이슈로 아래 코드 추가, 문제 시 삭제 or 위치변경
599		if(is_templates && property.SID.indexOf('_en') > -1) LANG = 'en';
600
601	    if(property.VALIDPLAN || is_templates) {
602			$('body,.dsgn-body').removeClass('with-creatorlink');
603	    } else {
604	    	$('body,.dsgn-body').addClass('with-creatorlink');
605	    }
606	    // $('button.navbar-toggle').addClass('hide');
607    	// (b.WRAP) ? $('.dsgn-body').addClass('tiny') : $('.dsgn-body').removeClass('tiny');
608
609		var $tag = $('header');
610		changeBrokenImages($tag);
611
612		$tag.removeClass('tpl-menu');
613		if(b.ONE){
614			if(b.VIEW) $tag.find('#site-home').attr('href',URI).removeClass('mini-home');
615			else $tag.find('#site-home').attr('href','javascript:;').addClass('mini-home');
616		} else $tag.find('#site-home').attr('href',URI).removeClass('mini-home');
617
618
619		var isHeaderOldVer = !$.clnav.check();
620		var isSidebar = $tag.hasClass('sidebar');
621		var isSiteLock = b.SITELOCK;
622		if(isHeaderOldVer) {
623			if(isSidebar) {
624				$('.dsgn-body').addClass('sidebar');
625				$('.header.el-menu').addClass('sidebar');		
626			} else if(b.HEADER) {
627				$('header.navbar').addClass('transparent');
628			}
629
630			header_fixed = $('header.navbar').height();
631			if($('header.navbar').css('background-color')=='rgba(0, 0, 0, 0)'
632				&& $('header.navbar').css('background-image')=='none'
633			) {
634				$('header.navbar').css('background-color',$('dsgn-body').css('background-color'));
635			}
636		}
637
638
639		if(isSidebar) {
640			if($tag.hasClass('hide') && $('.dsgn-body').hasClass('sidebar'))
641				$('.dsgn-body').removeClass('sidebar');
642
643			// console.log(isSiteLock);
644			if(isSiteLock == 'true') {
645				$('.dsgn-body').addClass('site_lock');
646			} else {
647				$('.dsgn-body').removeClass('site_lock');
648			}
649		}
650		
651		// footer
652		$('.footer-' + b.SID).addClass('el-footer').addClass('element').attr('data-type','footer');
653
654	    $(window).on('scroll',function() {
655	    	if($('.dsgn-body').hasClass('mobile-nav-active')) return false;
656
657			if($(this).scrollTop() > 200) {
658				$('#goto-top').addClass('show');
659			} else {
660				$('#goto-top').removeClass('show');
661			}
662
663	        if($('.dsgn-body').hasClass('sidebar')==false) {
664	            fixedMenu();
665	        }
666
667	        if($(this).scrollTop() == 0 && $('header').hasClass('navbar-fheader')) {
668				setTimeout(function() { $.fheader.position(); }, 200);
669			}
670	        scrollspy();
671			
672	        //parallax();
673
674	    });
675
676		$(window).on('orientationchange',function(){
677			if($('.blueimp-gallery-display').length) {
678				var $slide = $('.blueimp-gallery .slides .slide'),
679					play = $('.blueimp-gallery-playing').length,
680					idx = 0;
681				$.each($slide, function(i,v) {
682		        	var trans = $(this).attr('style');
683		        	if(trans.indexOf('translate(0px, 0px)') > 0) {
684		        		idx = $(this).attr('data-index');
685		        	}
686				});
687
688				var gallery = $('.blueimp-gallery-display').attr('id');
689
690				$('#' + gallery + ' .close').click();
691				$.processON();
692				setTimeout(function() { 
693					$.processOFF() ; 
694					$('.gallery-item[data-index="' + idx + '"] a[data-gallery="#' + gallery + '"]').click(); 
695					$('.layout-grid').eq(idx).find('a[data-gallery="#' + gallery + '"]').click(); 
696					if(play) $('#' + gallery + ' .play-pause').click();
697				}, 1000);
698			}
699		});
700
701		var currentWindowWidth = $(window).width();
702		$(window).resize(function () {
703			$('.config-image-view').hide();
704			if($('body').width() <= 768 && $('.dsgn-body').hasClass('sidebar')) {
705				if($('header.navbar').hasClass('sidebar')) {
706					cssSidebar('off');
707				}
708				//$('.dsgn-body').removeClass('sidebar').addClass('removed-sidebar');
709			} else if ($('body').width() > 768 /*&& $('.dsgn-body').hasClass('removed-sidebar')*/) {
710				if($('header.navbar').hasClass('sidebar')) {
711					cssSidebar('on');
712				}
713				//$('.dsgn-body').removeClass('removed-sidebar').addClass('sidebar');
714				var top = ($('.creatorlink-header').length == 1) ? '55px' : '0px';
715				$('.el_0').css('margin-top',top);
716				if($('.header-empty').length > 0) $('.header-empty').remove();
717			}
718
719            if( $('.header-empty').length > 0 && $('.header-empty').height() != $('.el-menu').height() ) {
720            	$('.header-empty').css('height',$('.el-menu').height()+'px');
721            }
722
723			// menu ver3 : fheader
724			if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
725			
726	        if($('body').width() <= 768) {
727	            if($('#tpl-menu li.active.dropdown').length > 0) $('#tpl-menu li.active.dropdown').removeClass('active');
728	        } else {
729	            if($('#tpl-menu li.active').closest('ul').hasClass('dropdown-menu')) $('#tpl-menu li.active').closest('li.dropdown').addClass('active');
730	            $('#tpl-menu ul.dropdown-menu').removeAttr('style');
731	        }
732
733			if($('.element[data-type="video"] .lyoption[data-lyh]').length > 0) setLayoutHeight();
734
735	        var vpmode_opt = $('.mobilepc_ch').attr('data-desktop-option'),
736     	 	   	vpmode = vpmode_opt ? vpmode_opt : b.SETTINGS.viewportMode,
737         	    vpModeOnoff = (property.SETTINGS.vpMode_onoff === true) ? true : false,
738         	    checkFnav = ($('.fnav').length > 0 && vpmode=='mobile_web') ? true : false,
739         	    WebType = $.mpcWeb.mpcCheckWebType();
740
741	        if($('.fnav').length > 0) {
742	            if($('body').width() <= 480) {
743	            	if($('#cl-music-player-icon').length > 0) $('#goto-top,#cl-music-player-icon').addClass('movedOne');
744	            } 
745	        }
746
747	        if(vpModeOnoff && WebType == 'MOBILE') {
748				$.mpcWeb.mpcMusicandGoTop(checkFnav,vpmode);
749				var device_type = ($('body').width() > 768) ? 'pc' : 'mobile';
750				if(typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][device_type.toLowerCase()]!='bottom_default') {
751					var mpc_height = $('.mobilepc_ch').innerHeight(),
752						add_height = ($('#cl-music-player-icon').length > 0) ? 45 : 30;
753					$(`.quick-menu-${b.sid}.quickmenu`).css('bottom', mpc_height + add_height);	
754				}
755			}
756
757	        fixedMenu();
758	        scrollspy();
759			$('.element[data-type="video"], .element[data-type="others"]').each(function() {
760				resizeVideoIframe($(this));
761			});
762
763			//premium gallery setFixedscroll
764			if($('.element[data-feature*=fixedscroll]').length > 0) gjs01SetFixedscroll($('.element[data-feature*=fixedscroll]').eq(0));
765	        
766	        if($('.fr-view').length) {
767	            setForumWrap();
768	        }
769
770	        if($('.blueimp-gallery-display').length) {
771	            if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement) {
772	                return; 
773	            }
774
775		        var $slide = $('.blueimp-gallery .slides .slide'),
776		            play = $('.blueimp-gallery-playing').length,
777		            idx = 0;
778		        $.each($slide, function(i,v) {
779		            var trans = $(this).attr('style');
780		            if(trans.indexOf('translate(0px, 0px)') > 0) {
781		                idx = $(this).attr('data-index');
782		            }
783		        });
784
785		        var gallery = $('.blueimp-gallery-display').attr('id');
786
787		        $('#' + gallery + ' .close').click();
788		        $.processON();
789		        setTimeout(function() { 
790		            $.processOFF() ; 
791		            $('.gallery-item[data-index="' + idx + '"] a[data-gallery="#' + gallery + '"]').click(); 
792		            $('.layout-grid').eq(idx).find('a[data-gallery="#' + gallery + '"]').click(); 
793		            if(play) $('#' + gallery + ' .play-pause').click();
794		        }, 1000);
795		    }
796	        sitePopupResize();
797
798	        if($('.element[data-type="contact"][data-type2="franchise map"]').length > 0) {
799	        	let newWidth = $(window).width();
800	        	if (currentWindowWidth !== newWidth) {
801			        $('.element[data-type="contact"][data-type2="franchise map"]').each(function(idx, v){
802		        		var el = $(v);
803		        		fmapMobilePaging(el);
804		        	});
805			    }
806			    
807			    currentWindowWidth = newWidth;
808	        }
809
810			// if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
811			// 	var device_type = ($('body').width() > 768) ? 'pc' : 'mobile';
812			// 	alert('resize')
813			// 	$.quickmenu.setHTML($.quickmenu['quickmenu'], device_type);
814			// }
815
816			var header_h = $('header').outerHeight();
817			$('.dsgn-body')[0].style.setProperty('--header-height', header_h+'px');
818
819	        var checkFixTypeMenu = (typeof $('header.navbar-fheader').attr('data-fixtype') != 'undefined' && $('header.navbar-fheader').attr('data-fixtype')) ? true : false;
820			if(b.VALIDPLAN && checkFixTypeMenu) {
821	            if(window.innerWidth < 769) {
822		            $('header.navbar[data-fixtype]').find('.navbar-brand').css('line-height','');
823		            return false;
824		        }
825				setTimeout(function(){
826					setFixedMenuCss(false);
827				},80);
828	        }
829			if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh();
830	    });
831	    this.liveUpdate(b.SMENU);
832
833	    var checkToggleShow = (!b.MENUCHECK.main && window.innerWidth > 768) ? false : true,
834			loc_pathname = window.location.pathname,
835	    	is_render = (loc_pathname.match(/^\/render/g)) ? true : false,
836	    	is_templates = (typeof b.SID != 'undefined') ? checkTemplateSite(b.SID) : false;
837	    // if(is_render && !is_templates) {
838		// 	if(window.parent && window.parent != this && $('#previewmain', window.parent.document).length > 0) {
839		// 		if($('#previewmain', window.parent.document).find('.preview-hand .active').is('#desktop, #tablet') && !b.MENUCHECK.main) checkToggleShow = false;
840		// 	}
841	    // }
842	    // if(checkToggleShow) $('button.navbar-toggle').css('visibility','visible');
843
844		//cross-origin 오류수정
845		if (is_render && !is_templates) {
846			try {
847				if (window.parent && window.parent !== window && $('#previewmain', window.parent.document).length > 0) {
848					if ($('#previewmain', window.parent.document).find('.preview-hand .active').is('#desktop, #tablet') && !b.MENUCHECK.main) {
849						checkToggleShow = false;
850					}
851				}
852			} catch (e) {
853				console.warn('parent document 접근 불가(cross-origin)', e);
854			}
855		}
856
857		if (checkToggleShow) {
858			$('button.navbar-toggle').css('visibility', 'visible');
859		}
860
861
862		if(b.PAGE == 'psearch') $.psearch.view();
863
864		$('[data-imglink="true"][attr-link]').live('click',function(){
865	    	if($(this).is('[attr-link=""]')) return false;
866
867		    var imgtarget = $(this).attr('data-target'),
868		        imgshlink = $(this).attr('data-shlink'),
869		        imgblank = $(this).attr('data-blank');
870
871		    if(imgblank == '_blank') {
872		        var openNewWindow = window.open('about:blank');
873		            openNewWindow.location.href=imgshlink; 
874		    } else {
875		        location.href=imgshlink;
876		    }
877		});
878
879		$('.menu-inner').on('scroll', function() {
880	        $(this).next('.fh-line').show();
881	        if($(this).scrollTop()==0) $(this).next('.fh-line').hide();
882	    });
883
884	    $("#mobile-nav #tpl-menu").on('scroll', function() {
885	       	$(this).next('.fh-line').show();
886	       	if($(this).scrollTop()==0) $(this).next('.fh-line').hide();
887	    });
888
889		$('.sitePopupTodayHide, .sitePopupClose').live({
890			click: function() {
891				if($(this).hasClass('sitePopupTodayHide')) $(this).find('input').click();
892				var selectedPopup = $(this).closest('.modal-popup').attr('id');
893				$('#' + selectedPopup).find('.popup-close').click();
894			}
895		});
896
897		$('.popup-close').live({
898		    click: function() {
899		        var selectedPopup = $(this).closest('.modal-popup').attr('id'),
900		            idx = $(this).closest('.modal-popup').attr('data-idx'),
901		            ptime = $(this).closest('.modal-popup').attr('data-time'),
902		            isTodayHide = $(this).closest('.modal-popup').find('.sitePopupTodayHide input').prop('checked'),
903		            date = new Date();
904		            
905		        var ptime_val = {
906					'always'    : 0,
907					'onlyone'   : 365 * 24 * 60 * 60 * 1000,
908					'week'      : 7 * 24 * 60 * 60 * 1000, 
909					'day'       : 24 * 60 * 60 * 1000, 
910					'12hour'    : 12 * 60 * 60 * 1000, 
911					'6hour'     : 6 * 60 * 60 * 1000, 
912					'2hour'     : 2 * 60 * 60 * 1000, 
913					'1hour'     : 60 * 60 * 1000, 
914					'30min'     : 30 * 60 * 1000, 
915					'10min'     : 10 * 60 * 1000
916		        };
917
918		        if(isTodayHide) {
919		        	date.setTime(date.getTime() + ptime_val['day']);
920		        } else { 
921		        	date.setTime(date.getTime() + ptime_val[ptime]);
922		        }
923		        $('#' + selectedPopup).fadeOut();
924		        if(isTodayHide || (typeof ptime !='undefined' && ptime != 'always' && ptime != '')) { $.cookie(selectedPopup, true, { path: '/', expires: date}); }
925		        else { $.removeCookie(selectedPopup, { path: '/' }); }
926		    }
927		});
928
929		var decodeMoveScrollUrl = function(value) {
930            if(typeof value == 'undefined' || !value) return '';
931
932            var url = String(value);
933
934            try {
935                var decoded = decodeURIComponent(url);
936                if(decoded !== url) return decoded;
937            } catch(e) {}
938
939            try {
940                var escaped = escape(url);
941                if(escaped.indexOf('%u') === -1) return decodeURIComponent(escaped);
942            } catch(e) {}
943
944            return url;
945        };
946
947		var moveScroll = function(interval, loc) {
948			if(typeof $.cookie('forum_content_view') != 'undefined') {
949		    	if(window.location.href.indexOf('/forum/view/') == -1) $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
950		    	return false;
951		    }
952			var this_url = (typeof loc == 'undefined') ? document.URL : loc;
953			var url = decodeMoveScrollUrl(this_url);
954		    link = url.split('#').pop();
955
956		    if($.inArray(link,b.MENULINK) > -1 && b.ONE && !b.VIEW) {
957		        moveLinkPage(link,interval);
958		        $.removeCookie('gallery', { path: '/' });
959		        $.removeCookie('gallery-item', { path : '/' });
960		    } else if (url.match(/\@/g)) {
961		        link = url.split('\@').pop();
962		        var bookmark_link = url.substr(url.lastIndexOf('/')+1);
963		        if(link) moveLinkPage(bookmark_link,800,true);
964		    } else {
965		    	$(window).scrollTop(0);
966		    	setTimeout(function() {
967					if(location.hash) {
968						var hashArr = location.hash.split('#');
969						var hash = hashArr[1];
970						var hashseq = hashArr[2];
971						if(hash && $('.element[data-name="' + hash + '"]').length) {
972							var header_check = $("header").attr("data-fh-type");
973							if (header_check != "sidebar") { var header_height = $("header").outerHeight(true); }	
974							else {var header_height = 0;}														
975							// $(window).scrollTop($('.element[data-name="' + hash + '"]').offset().top - header_height);
976
977							if($('.tpl-forum-list-cont[data-id="' + hashseq + '"]').length == 0) {
978								var offset_top = $('.element[data-name="' + hash + '"]').find('.list-item').offset().top;
979								var win = $(window);
980								var winHeight = win.height();
981								win.scrollTop(offset_top - (winHeight / 2) + (header_height / 2));
982							} else {
983								var offset_top = $('.tpl-forum-list-cont[data-id="' + hashseq + '"]').closest('.list-item').offset().top - header_height;
984								var screen_half = ($(window).height() - header_height) / 2;
985								// $(window).scrollTop(offset_top)
986								$(window).scrollTop(offset_top - screen_half)
987							}	
988
989							// console.log($('.tpl-forum-list-cont[data-id="72334"]').length);
990						}
991					}
992				});
993		    }
994		}
995
996		var moveBookmark = function(page, bookmark, interval, target) {
997			var page_arr = (typeof page == 'undefined') ? new Array() : page.split('\,');
998			var view = (page_arr.length > 1) ? page_arr[1] : '';
999
1000			interval = (typeof interval == 'undefined') ? 1200 : interval;
1001			target = (typeof target == 'undefined') ? '' : target;
1002
1003			if( (view != '' && view == b.VIEW && !target) || (view == '' && !b.VIEW && page_arr[0] == b.PAGE && !target) ) {
1004				moveLinkPage(page_arr[0]+bookmark,interval,true);
1005			} else {
1006				var linkUrl = '';
1007				if(b.ONE) {
1008					linkUrl = (view.length>0) ? '/index/view/' + view : '/index';
1009					linkUrl = (!b.PUBLISH) ? '/render' + linkUrl + bookmark : linkUrl + bookmark;
1010				} else {
1011					var url_str = (view.length>0) ? page_arr[0] + '/view/' + view : page;
1012					linkUrl = (URI=='/') ? '/' + url_str + bookmark : URI + '/' + url_str + bookmark;  
1013				}
1014
1015				if(target) {
1016					var openLinkPage = window.open('about:blank');
1017					openLinkPage.location.href=linkUrl;
1018				} else {
1019					var url = new getLocation(linkUrl);		        	
1020					golink(_this,url);
1021					// location.replace(linkUrl);
1022				}
1023
1024			}
1025		}
1026
1027		var moveLinkPage = function(link, interval, isblock) {
1028		    link = decodeURIComponent(link);
1029			if(typeof interval == 'undefined') interval = 1200;
1030			if(typeof isblock == 'undefined') isblock = '';
1031
1032		    var isBookmark = false;
1033			var bookmark_arr = new Array();
1034			if(link.match(/\@/g)) { 
1035				isBookmark = true;
1036				bookmark_arr = link.split('\@');
1037
1038				var check_link = true;
1039				var is_visible_menu = false;
1040				$.each(b.SMENU, function (idx, obj) {
1041					if(is_o_page == obj.name.replace(/ /g,'-')) {
1042						if(!obj.link) check_link = false;
1043						if(obj.display == 'on') is_visible_menu = false;
1044					}
1045					if(obj.children) {
1046						$.each(obj.children, function (i, v){
1047							if(is_o_page == v.name.replace(/ /g,'-')) {
1048								if(!v.link) check_link = false;
1049								if(v.display == 'on') is_visible_menu = false;
1050							}
1051						});
1052					}
1053				});
1054
1055				var is_here = ($('.element[data-bookmark="' + bookmark_arr[1] + '"]').length > 0 ) ? true : false;
1056				var is_page = (b.PAGE.toLowerCase() == bookmark_arr[0].toLowerCase() || b.VIEW && b.VIEW == bookmark_arr[0]) ? true : false;
1057				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];
1058				// var is_visible_menu = ($.inArray(is_o_page,b.MENULINK)>-1) ? true : false;
1059				// 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;
1060				var is_link = (check_link && is_visible_menu && is_o_page != 'INTRO') ? true : false;
1061				var is_visible = (check_link && is_visible_menu && is_o_page != 'INTRO') ? true : false;
1062
1063				if( ( !is_visible_menu && is_o_page!='index' ) ||
1064					( /*!is_page &&*/ ( is_link || is_visible ) ) ||
1065					( is_page && !is_here ) 
1066				)  { 
1067					if(is_visible_menu == false) ;
1068					else return false; 
1069				}
1070				link = 'element[data-bookmark="' + bookmark_arr[1] + '"]';
1071				
1072			} else {
1073			    link = (isblock == '') ? 'link-to-' + link : link;
1074			}
1075
1076			var moveTarget = $(`.${link}`);
1077			if(moveTarget.length == 0) return;
1078
1079			if($.clnav.check()) {
1080				goToElement(`.${link}`);
1081			} else {
1082				// oldver
1083				var header_fixed = ($('.dsgn-body').width() < 769) ? $('.el-menu .navbar-header').height() - 1 : $('#tpl-menu').height();
1084				if ($('header').hasClass('navbar-fheader')) header_fixed = $('header.navbar').outerHeight() - 1;
1085
1086				var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
1087				if ($('header.navbar').hasClass('disableOffset') && !$('.' + link).hasClass('el_0')) offset = 0;
1088				offset = (window.innerWidth > 768) ? offset : -header_fixed;
1089
1090				var sTop = moveTarget.offset().top + offset;
1091				if(moveTarget.is('[data-aos]') && !moveTarget.hasClass('aos-animate')) {
1092					const tr = moveTarget.css('transform');
1093					let moveY = 0;
1094					if (tr && tr !== "none") {
1095						const vals = tr.match(/-?\d+\.?\d*/g);
1096						moveY = parseFloat(vals[13] || vals[5] || 0); // 이미 음수/양수 포함됨
1097
1098						sTop -= moveY;
1099					}
1100				}
1101				sTop = (isAosBlock && moveTarget.hasClass('el_0') == false && $('.menu-logo-top').length > 0 && $('.menu-logo-top').css('display')=='block') ? sTop + $('.menu-logo-top').outerHeight() : sTop;
1102
1103				var duration = (typeof $('#tpl-menu').attr('data-duration') != 'undefined') ? parseInt($('#tpl-menu').attr('data-duration')) : ((isBookmark) ? 500 : 1000);
1104				if(clCheckBrowser('safari') && clCheckBrowser('mobile') || moveTarget.hasClass('el_0')) duration = 0;
1105				$('html, body').stop(true, false).animate({
1106					scrollTop: sTop
1107				}, duration, 'easeInOutQuart');
1108
1109				var menuStr = (!isBookmark) ? link.replace('link-to-','') : bookmark_arr[0];
1110				setTimeout(function() {
1111					$('header #tpl-menu li a[href=#' + menuStr + ']').closest('li').addClass('active').siblings().removeClass('active');
1112					if($('#mobile-nav #tpl-menu li').length) $('#mobile-nav #tpl-menu li a[href=#' + menuStr + ']').closest('li').addClass('active').siblings().removeClass('active');
1113				},1100);
1114			}
1115		}
1116
1117		var getParent = function(parent,id,page) {
1118		    if(id) {
1119		    	parent = (parent == 'forum') ? parent : 'project';
1120				$.ajax({
1121					url:'/template/get/parent/' + parent + '/id/' + id + '/sid/' + _this.b.SID + '/page/' + encodeURIComponent(page) + _this.b.param,
1122					type:'get',
1123					async:false,
1124                	cache: false,
1125					dataType:'json',
1126					success:function(data) {
1127						property.PRODINFO = (data.prod_onoff == "on") ? data.PRODINFO : '';
1128						_this.b.PARENT = data.PARENT;
1129						_this.b.COUNT = data.COUNT;
1130					}
1131				});
1132		    } else {
1133				property.PRODINFO = "";
1134				_this.b.PARENT = {};
1135				_this.b.COUNT = 0;
1136		    }
1137		}
1138
1139		var showPageCallback = function(func,callback) {
1140		    func(b.MCSS, b.MSTYLE, b.MTAG, true);
1141		    if(typeof callback=='function') {
1142		    	callback();
1143		    }
1144		}
1145
1146		var showPage = function (css, style, tag, prop) {
1147			if($('.fmcss').length > 0) $('.fmcss').remove();
1148		    $.each(style.children,function(k,v) {
1149		        if(k!='.dsgn-body') {
1150		            delete style.children[k];
1151		        }
1152		    });
1153    		elFooter();
1154
1155			var isSidebar = $('.el-menu > header').hasClass('sidebar');
1156			var isHeaderOldVer = !$.clnav.check();
1157			if(isHeaderOldVer) {
1158				if(b.HEADER && b.PARENT.mode == 'shopping') b.HEADER = false;
1159				if(b.HEADER && !b.VIEW && !isSidebar)  $('header.navbar').addClass('transparent');
1160	
1161				header_fixed = $('header.navbar').height();
1162				if($('header.navbar').css('background-color')=='rgba(0, 0, 0, 0)'
1163					&& $('header.navbar').css('background-image')=='none'
1164				) {
1165					$('header.navbar').css('background-color',$('dsgn-body').css('background-color'));
1166				}
1167			}
1168
1169		    if(b.SETTINGS.sitePermit === 3) {
1170		    	var checkSiteLock = isSitePasswordLock();
1171		    } 
1172
1173		    var is_lock_block = 'active';
1174			isMenuLock(function() {
1175				if(b.ISLOCK == 'true' && is_lock_block == '' || b.ISLOCK != 'true') elPush(prop);
1176				else {
1177					$('.el-footer').css('visibility', 'visible');
1178					$.processOFF();
1179				}
1180			});
1181
1182			// menu active
1183			/* 190710 -  menu or sub-menu 일부 같을때 첫번째 메뉴에 active error 생겨서 주석 처리. */
1184			// if(b.PARENT.page) {
1185			// 	$('#tpl-menu li').find('a:contains("' + b.PARENT.page + '")').parent().addClass('active');
1186			// } else {
1187			// 	if(b.ONE) {
1188			// 		if(b.SMENU[0].display == 'off') $('#tpl-menu li').first().addClass('active');
1189			// 	} else if(b.PAGE) {
1190			// 		$('#tpl-menu li').find('a:contains("' + b.PAGE + '")').parent().addClass('active');
1191			// 	}
1192			// };
1193
1194		    RENDER.setLoginout(b.LOGINOUT, b.SID, b.PUBLISH, b.PROFILEIMG);
1195		    $('body,html').animate({scrollTop: 0}, 300,'easeInOutQuart');
1196		}
1197
1198		var loadPush = function(data) {
1199			// console.log(' page draw 02:: loadPush');
1200			window._blockMasonryResizeTargets = [];
1201
1202			$('body').removeAttr('data-gjs');
1203
1204			var deferred = $.Deferred();
1205			var pageID = b.PAGE.split(',');
1206			var chgBG = false;
1207			var tmpTag = '';
1208			var currentPAGE = b.PAGE;
1209			var default_t_css = '';
1210			var default_m_css = '';
1211
1212			if(pageID.length === 1) $('.clViewPageStyle').remove();
1213
1214			var is_templates = checkTemplateSite(b.SID);
1215			
1216			var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false;
1217			var checkShoppingView = (b.VIEW && b.PARENT.mode == 'shopping') ? true : false;
1218			var page_pos = 0;
1219			var site_settings = (typeof b.SETTINGS != 'undefined' && b.SETTINGS) ? b.SETTINGS : {};
1220
1221			if($('body').hasClass('openPopupBanner') && b.MENULINK[0] != currentPAGE) {
1222				$.siteBanner.init(false,true);
1223			}
1224			if(typeof $.clnav.s != 'undefined') $.clnav.init();
1225
1226	        $('#el-empty').empty();
1227	        $('.gallery-popup, .psearch-block').remove();
1228	        b.COUNT = data.length;
1229
1230			var check_modoo = $('.dsgn-body').hasClass('modoo') ? true : false,
1231				fl_data = {};
1232				
1233			if(check_modoo) {
1234				fl_data = draw_floating();
1235			}
1236
1237			function drawData(idx, val) {
1238				// console.log(`drawData(${idx}, ${val})`);
1239				page_pos += 1;
1240				var tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES');
1241				var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
1242				var block_lang = (typeof settings.blocklang != 'undefined' && settings.blocklang) ? settings.blocklang : LANG;
1243				var checkGalleryListSample = false;
1244				var checkGalleryListEmpty = true;
1245				var fontload = [];
1246
1247				if(val.type == 'project' && val.eltag.charAt(0) == '\<') tag = val.eltag;
1248
1249				if(typeof val.fonts != 'undefined') {
1250					$.each(val.fonts, function(i,v) {
1251						if(b.ELFONTS.indexOf(i) < 0 && v) {
1252							b.ELFONTS.push(i);
1253							$('#loadfonts').append(v);
1254						}
1255					});
1256				}
1257				if(typeof val.webfonts != 'undefined' && val.webfonts) {
1258					$.each(val.webfonts, function(i2,v2) {
1259						if(b.ELFONTS.indexOf(i2) < 0 && v2) {
1260							b.ELFONTS.push(i2);
1261							WebFont.load({ google : { families : [ v2 ], display:'swap' }});
1262						}
1263					})
1264				}
1265
1266				if($.inArray(val.type, ['gallery','shopping']) > -1) {
1267					if($('#el-empty').length === 0) $('body').append('<div id="el-empty" class="opacity: 0;"></div>');
1268					$('#el-empty').append($(tag));
1269					$('#el-empty').find('[data-loop="true"]').html('');
1270
1271					var nodes = $(tag).find('[data-loop="true"]').children('.grid'),
1272						p = $('#el-empty').children(),
1273						g = p.clone().removeClass().addClass('galleryPL'+val.seq).addClass('gallery-popup'),
1274						i = [],
1275						view = $(tag).find('[data-loop="true"]').data('view'),
1276						g_number = $(tag).find("[data-loop='true']").data('gallery-no'),
1277						total = 0;
1278
1279					var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
1280					var glm = $(tag).find('.loadmore-wrap');
1281
1282					$('#el-empty').after(g);
1283					$(g).after('<div class="gallery-empty"></div>');
1284
1285					galleryEL[val.seq] = {
1286						'seq' : val.seq,
1287						'elname' : val.elname,
1288						'eltag' : tag,
1289						'folder' : val.folder,
1290						'mode' : val.mode,
1291						'elsettings' : val.elsettings,
1292						'feature' : val.feature,
1293						'type' : val.type,
1294						'type2' : val.type2,
1295						'searches' : val.searches
1296					};
1297
1298					if(typeof view == 'undefined') view = 10;
1299					var cookie_page = 1,
1300						cookie_view = view,
1301						cookie_gallery_category = '',
1302						is_gc_cookie = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined' && $.cookie('gallery-category-'+val.seq).length > 0) ? true : false;
1303            		var cookie_gallery_orderby = 'recent';
1304
1305					var category_onoff = (typeof settings.category_display != 'undefined' && settings.category_display) ? settings.category_display : 'OFF';
1306					var gallery_sort = (typeof settings.gallery_sort != 'undefined' && settings.gallery_sort) ? settings.gallery_sort : 'default';
1307					if(val.mode != 'shopping' && gallery_sort == 'product') gallery_sort = 'default';
1308					// var adultonly_onoff = (typeof settings.adult_only != 'undefined' && settings.adult_only) ? settings.adult_only : 'OFF';
1309					
1310					if(typeof $.cookie('loadmore-' + val.seq) != 'undefined' && $.cookie('loadmore-' + val.seq).length > 0) {
1311						cookie_page = $.cookie('loadmore-'+val.seq);
1312						cookie_gallery_category = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined') ? $.cookie('gallery-category-'+val.seq) : '';
1313	                    cookie_gallery_orderby = (typeof $.cookie('gallery-orderby-' + val.seq) != 'undefined') ? $.cookie('gallery-orderby-' + val.seq) : '';
1314						cookie_view = cookie_page * view;
1315					} else { 
1316						var checkCateHomeHide = (category_onoff == 'ON' &&
1317												typeof settings.category != 'undefined' && settings.category && 
1318												typeof settings.category_home_hide != 'undefined' && settings.category_home_hide) ? true : false;
1319						if(checkCateHomeHide) {
1320							var gc = settings.category.replace(/\|/g,'').split(',');
1321							cookie_gallery_category = gc[0];
1322							is_gc_cookie = true;
1323
1324							$.cookie('gallery-catehome-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
1325						}
1326					}
1327					
1328					if(val.seq == 'all_products') {
1329					// 	cookie_page = (typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products') != '')? $.cookie('gallery-page-all_products') : 1;
1330						cookie_gallery_category = getAllProductsSortVal(settings);
1331					// 	cookie_view = cookie_page * view;
1332					} else {
1333						if(!property.VIEW) $.removeCookie('gallery-page-all_products', { path: '/' });
1334					}
1335					
1336					$.cookie('gallery-page-' + val.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
1337					$.cookie('gallery-category-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
1338	                $.cookie('gallery-orderby-' + val.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
1339					$.removeCookie('loadmore-' + val.seq, { path : '/' });  
1340
1341					var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false,
1342						checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof settings.gframe_title_visible != 'undefined' && settings.gframe_title_visible == 'OFF')) ? true : false;
1343
1344					var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
1345					var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
1346
1347					var uri = getSearchURL();
1348					if (isObjectEmpty(uri) && _this.b.LUX && val.mode == 'shopping') {
1349						uri = val.searches.uri;
1350					}
1351					// if(uri.category_no == '') {
1352					// 	uri.category_no = (typeof settings.lux_category_no != 'undefined') ? settings.lux_category_no : '';
1353					// }
1354					
1355					var res;
1356					
1357					$.ajax({
1358						url: '/template/gallery/list/pid/' + val.seq + '/sid/' + b.SID + '/spage/' + currentPAGE + '/view/' + cookie_view + param,
1359						data: { g_mode: val.mode,  visible: true, sfl: 'category', stx: cookie_gallery_category, uri : uri, only : val.only_category, orderby: cookie_gallery_orderby},
1360						dataType: 'json',
1361						type: 'POST',
1362						async: false,
1363						cache: false,
1364						success: function (data) {
1365							var check_only_cate = (typeof data.only_category != 'undefined' && data.only_category === true) ? true : false;
1366							if(check_only_cate) {
1367								localStorage.setItem('searches',JSON.stringify(new Array(val.searches.uri[0])));
1368							}
1369	
1370							res = data;
1371							$.each(data.list, function (idx, v) {
1372								i.push(v);
1373							});
1374							total = (typeof data.total.list_total == 'undefined') ?  data.total : data.total.list_total;
1375							cookie_view = ( cookie_view > total ) ? total : cookie_view;
1376							// cookie_view = (cookie_view < total) ? cookie_view : total;
1377
1378							if( total > 0 ) checkGalleryListEmpty = false;
1379							if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
1380								var loop_count = nodes.length, item_index = 0;
1381								var elem = [];
1382								$.each(data.list,function(index,v) {
1383									loop_pos = index%loop_count;
1384									c = nodes[loop_pos];
1385                                	var isTitle = (v.title.length > 0) ? true:false;
1386
1387									$(c).find('.non_text').removeClass('non_text');
1388									if(val.mode != 'shopping') {
1389										if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
1390										if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
1391									}
1392
1393									v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
1394									v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
1395
1396									$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
1397									
1398									var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
1399										img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
1400										img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
1401
1402									var folder = (val.folder == 0) ? '' : val.folder + '/',
1403										src = getServeImage(v.image,val.folder,img_path),
1404										src_s0 = getServeImage(v.image,'0',img_path);
1405									if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
1406									if(val.mode == 'shopping') {
1407										if($(c).find('img').length > 0) $(c).find('img').attr('alt',v.title);
1408									} else {										
1409 									    alt_replace	= v.alt.replace(/\s+|\n+/g, '-');  
1410		    	          				alt_replace.replace(/-+/g, '-')	
1411										if($(c).find('img').length > 0) $(c).find('img').attr('alt',alt_replace);										
1412									}
1413									ensureGalleryResponsiveImageClass($(c));
1414									if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
1415
1416									if(checkGallerySVG) {
1417										var gimgSVG = $(c).find('.gimg-svg-wrap svg');
1418										gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+index);
1419										gimgSVG.find('image').attr('xlink:href', src);
1420										gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+index+')');
1421									}
1422
1423									var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
1424										glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
1425
1426									if(glink) {
1427										if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
1428											var bookmark_seq = glink.replace(/^\@/g,'');
1429											if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
1430												glink = '';
1431												glink_target = '';
1432											}
1433										} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
1434											glink_target = '';
1435										} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
1436										} else {																					// link-type: link-out      ==> a[attr-link]
1437											if(checkBase64Encode(glink)) glink = Base64.decode(glink);
1438										}
1439									}
1440
1441									$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
1442									if (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON' && property['SITEUM'] >= 1) {
1443										$(c).addClass('gallery-item').addClass('nonePrice');
1444										$(c).find('a').attr('href', '#');
1445									} else {
1446										if(glink) {
1447											var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
1448											$(c).find('a').attr('href',glink_val);
1449
1450											if(glink.match(/^\@/g)) {
1451												$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
1452											} else if(glink.match(/^flink\@[0-9]/g) !== null) {
1453												$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
1454											// IE ERROR_includes__H.20210603
1455											// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
1456											} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
1457												$(c).find('a').attr('data-user-link',glink_val);
1458											} else {
1459												$(c).find('a').attr('attr-link',glink);
1460											}
1461										} else {
1462											if (val.mode == 'gallery') {
1463												src_s0 = src_s0 + '?gpos='+v.pos;
1464
1465												$(c).find('a').attr('href', src_s0);
1466												$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
1467											} else {
1468												if(val.seq == 'all_products') {
1469													$(c).find('a').attr('href', v.product_url);
1470												} else {
1471													if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
1472													else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
1473						
1474													// $(c).find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/' + v.seq);
1475												}		
1476											}
1477										}
1478									}
1479
1480									if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
1481									else $(c).find('a').removeAttr('target');
1482
1483									if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
1484									else $(c).find('a').attr('data-title', v.title);
1485
1486									// if(adultonly_onoff == 'ON') $(c).addClass('adultonly');
1487
1488									// caption
1489									var ftitle = $(c).find('h5.figure'),
1490										fcaption = $(c).find('p.figure').not('.comment'),
1491										fdatetime = $(c).find('.figure.datetime'),
1492										fhashtag = $(c).find('.figure.hashtag'),
1493										fbrand = $(c).find('.figure.brand'),
1494										fprice = $(c).find('.figure.price'),
1495										freview = $(c).find('.figure.review'),
1496										fcomment = $(c).find('.figure.comment'),
1497										flike = $(c).find('.figure.like'),
1498										fbasket = $(c).find('.figure.basket');
1499
1500									$(c).find('figcaption').removeClass('hide');
1501									if (v.title || v.caption) {					
1502										var gallery_caption = v.caption;
1503										gallery_caption = gallery_caption.replace(/\n/g,'<br />');
1504
1505										ftitle.html(v.title);
1506										fcaption.html(gallery_caption);
1507										if(fdatetime.length > 0) fdatetime.text(v.datetime);
1508										if(fhashtag.length > 0) fhashtag.text(v.hashtag);
1509									}
1510
1511			                        if(g_number) {
1512			                            var g_index = String(index + 1),
1513			                                g_num = g_index.padStart(g_number, '0');
1514			                            $(c).find('.figure.number').text(g_num);
1515			                        }
1516
1517									if(fbrand.length > 0) {
1518										var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
1519										fbrand.html(v.brand_name);
1520									}
1521
1522									if(val.mode == 'shopping' || val.seq == 'all_products') {
1523										fcomment.addClass('hide');
1524										flike.addClass('hide');
1525										v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
1526										v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
1527										var checkPriceHidden = (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON') ? true : false,
1528											gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
1529											gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
1530											gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
1531											product_soldout = '품절',
1532											product_no_sale = (typeof settings.sh_soldout == 'string') ? settings.sh_soldout : '구매불가',
1533											product_status = '';
1534										if(v.status == 'off' && !checkPriceHidden) {
1535											product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
1536										} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
1537											product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
1538										}
1539
1540										$(c).find('.cl-sh-soldout').remove();
1541										if(product_status != '') $(c).attr('data-soldout',true);
1542										else $(c).removeAttr('data-soldout');
1543
1544										$(c).find('.product-badge').remove();
1545										product_status += drawBadgeList(v.use_badge, data.badge_settings);
1546
1547										$(c).find('.cl-sh-limit').remove();
1548										if(v.status == 'lim') {
1549		                                    if(v.sale_now == false) {
1550		                                        var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
1551					                            if(freview.length > 0) {
1552					                                freview.after(product_limit);
1553					                            } else {
1554					                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
1555					                            }
1556		                                    }
1557		                                }
1558
1559										if($(c).find('ul.figure.price').length > 0) {
1560											// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
1561											// 	off_str = (price_off > 0) ? price_off + '% ' : ''
1562											var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
1563											if(!_this.b.LUX) off_str = gallery_sale_per;
1564											//Ver2
1565											if(!checkPriceHidden) {
1566												$(c).find('ul.figure.price .price-val').html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
1567												$(c).find('ul.figure.price .price-val').removeClass('hide');
1568
1569												if(gallery_sale_price > 0 && gallery_price < gallery_sale_price) {
1570													$(c).find('ul.figure.price .price-sale').html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
1571													$(c).find('ul.figure.price .price-sale-per').html(off_str);
1572													$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').removeClass('hide');
1573													if(_this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
1574														$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
1575													}
1576												} else {
1577													$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').addClass('hide').html('');
1578												}
1579
1580												$(c).find('ul.figure.price .price-unit-pricing').remove();
1581												if(v.product_unit_str) {
1582													$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
1583												}
1584											} else {
1585												$(c).find('ul.figure.price .price-val').html('₩0');
1586												$(c).find('ul.figure.price .price-val').addClass('hide');
1587											}
1588											if(val.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
1589											if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
1590
1591											var badge_size = getBadgeSize(data.badge_settings);
1592											$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
1593											$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
1594											if(badge_size) {
1595												$(c).find('.cl-sh-soldout').addClass(badge_size);
1596												$(c).find('.cl-sh-limit').addClass(badge_size);
1597											}
1598										} else {
1599											//Ver1
1600											if(fprice.length == 0) fprice = fcaption;
1601											
1602											if(checkPriceHidden) fprice.html('');
1603											else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
1604										}
1605
1606										if($(c).find('ul.figure.review').length > 0) {
1607											var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
1608											if(gallery_review > 0) {
1609												$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
1610												$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
1611												$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
1612											} else {
1613												$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
1614												$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
1615											}
1616										}
1617
1618										if(fbasket.length > 0) {
1619											var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
1620												checkOldverBasket = (typeof settings.field_oldver != 'undefined' && settings.field_oldver && settings.field_oldver.indexOf('basket') > -1) ? true : false,
1621												checkDisabledBasket = (typeof settings.field_disable != 'undefined' && settings.field_disable && settings.field_disable.indexOf('basket') > -1) ? true : false;
1622											if(v.basket_off) fbasket.addClass('cannotby hide');
1623											else if(val.seq == 'all_products') fbasket.removeClass('hide');
1624											else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
1625											else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
1626											else fbasket.removeClass('hide');
1627										}
1628
1629									} else {
1630										fbrand.addClass('hide');
1631										fprice.addClass('hide');
1632										freview.addClass('hide');
1633										fbasket.addClass('hide');
1634
1635										if ( checkUseComment 
1636											&& settings.comment_display == 'ON'
1637											&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('comment') > -1)
1638											&& fcomment.length > 0
1639											&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
1640										) {
1641											fcomment.removeClass('hide');
1642											fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
1643										} else {
1644											fcomment.addClass('hide');
1645											fcomment.find('.figure-comment-cnt').empty();
1646										}
1647			
1648										if ( checkUseLike 
1649											&& (settings.like_display !== undefined && settings.like_display != 'N')
1650											&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('like') > -1)
1651											&& flike.length > 0
1652										) {
1653											flike.removeClass('hide').find('.figure-like-cnt').html(0);
1654											if(v.like !== undefined) {
1655												flike.find('.figure-like-cnt').html(v.like.cnt);
1656												if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
1657											}
1658										} else {
1659											flike.addClass('hide');
1660										}
1661									}
1662									
1663									if(val.mode == 'gallery') {
1664										if(index < cookie_view) {
1665											$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
1666										} else {
1667											$(c).find('figure').remove();
1668											$(g).find('[data-loop="true"]').append($(c)[0].outerHTML);
1669										}
1670										if (total == 2) {
1671											$(c).find('figure').remove();
1672											$('.gallery-empty').append($(c)[0].outerHTML);
1673										}
1674									} else {
1675										$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
1676									}
1677
1678								});
1679								
1680							} else {
1681								checkGalleryListSample = true;
1682								if(val.mode=='project' && b.TEMPLATE == false) {
1683									nodes.addClass('gallery-item');
1684									nodes.find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/template').removeAttr('data-gallery').find('img').attr('data-index',0);
1685								}
1686
1687								if(b.TEMPLATE !== false) {
1688									if ( checkUseComment 
1689										&& settings.comment_display == 'ON'
1690										&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('comment') > -1)
1691									) {
1692										nodes.find('.figure.comment').removeClass('hide');
1693									} else {
1694										nodes.find('.figure.comment').addClass('hide');
1695									}
1696		
1697									if ( checkUseLike 
1698										&& (settings.like_display !== undefined && settings.like_display != 'N')
1699										&& !(settings.field_disable !== undefined && settings.field_disable.indexOf('like') > -1)
1700									) {
1701										nodes.find('.figure.like').removeClass('hide');
1702									} else {
1703										nodes.find('.figure.like').addClass('hide');
1704									}
1705								}
1706
1707								$(p).find('[data-loop="true"]').append(nodes);
1708							}
1709							if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
1710
1711							tag = $(p)[0].outerHTML;
1712
1713							if (val.mode == 'gallery' && total == 2) {
1714								$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
1715									$(g).find('[data-loop="true"]').append(v);
1716								});
1717							}
1718							$('#el-empty').empty();
1719							$('.gallery-empty').remove();
1720						}
1721					});
1722				} else {
1723					if(typeof pageID[1] != 'undefined' && idx==0 && pageID[1] != 'template' && b.COUNT==0) {
1724						d = document.createElement('div');
1725						$(d).addClass('temp-element').html(tag);
1726						var pTitle = (b.PARENT.title) ? b.PARENT.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
1727							pCaption = (b.PARENT.caption) ? b.PARENT.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
1728						pCaption = pCaption.replace(/\n/g, '<br />');
1729
1730						$(d).find('.data-date').text(b.PARENT.datetime);
1731						$(d).find('.data-category').text(b.PARENT.category);
1732						$(d).find('h5.figure').text(pTitle);
1733						$(d).find('p.figure').not('.comment').html(pCaption);
1734
1735						tag = $(d).html();
1736						$(d).remove();
1737						tmpTag = tag;
1738					}
1739				}
1740
1741				//add style
1742				var $style_tag = $('<style type="text/css"></style>');
1743				$style_tag.attr('id','el_'+idx+'css');
1744				if(typeof val.elcss != 'undefined') {
1745					$style_tag.html(htmlspecialchars_decode(val.elcss));
1746					$('.header').before($style_tag);
1747				}
1748
1749				//change carousel id
1750				var $tag = $(tag);
1751				$tag.find('video').attr({'playsinline': '','webkit-playsinline': ''});
1752				$.each($tag.find('[data-edit="true"]'), function(i,v) {
1753					var source = $(this).outerHTML();
1754					source = source.replace(/&lt;&nbsp;/g,'&lt;').replace(/&nbsp;&gt;/g,'&gt;').replace(/data-attr-bookmark/g,'attr-bookmark');
1755					$(this).replaceWith(source);
1756				});
1757				
1758				if(typeof total == 'undefined') total = 0;
1759
1760				msny = (val.feature=='masonry') ? true : false;
1761				var blocklang = '';
1762
1763				if(val.type == 'video') {
1764					if($tag.find('.video-gallery-url').length > 0) val.mode = 'zoom';
1765					else val.mode = 'thumb';
1766					resizeVideoIframe($tag);
1767				}
1768
1769	            if (val.type == 'video' || val.type == 'others') {
1770	                var checkFullscreen = (typeof settings.fullscreen != 'undefined' && settings.fullscreen == 'ON') ? true : false;
1771	                if(checkFullscreen) {
1772	                    $tag.find('.video-wrap').addClass('video-fullscreen');
1773	                }
1774	            }
1775
1776				slideEffectClassAdd($tag);
1777
1778				const $last_el = ($('.fnav').length) ? $('.fnav') : $('.el-footer');
1779				$last_el.before(`<template class="elementAddPoint" data-id="${val.seq}"></template>`);
1780
1781				//페이지 이동
1782				$tag.addClass('el_' + idx)
1783					.attr('data-id', val.seq)
1784					.attr('data-el','el_' + idx)
1785					.attr('data-pos', idx+1)
1786					.attr('data-name', val.elname)
1787					.attr('data-case', settings?.blockorg || val.name)
1788					.attr('data-msny', msny)
1789					.attr('data-type', val.type)
1790					.attr('data-type2', val.type2)
1791					.attr('data-feature', val.feature)
1792					.attr('data-mode', val.mode)
1793					.attr('data-width', val.folder)
1794					.attr('data-overlap',val.overlap);
1795				if(val.type == 'form' && typeof val.form_done != 'undefined') $tag.attr('data-form-done', val.form_done);
1796
1797				setBlockAOS($tag,{block:settings, skipRefresh:true});
1798
1799				if($tag.hasClass('modoo')) {
1800					if(window.innerWidth <= 768 && $tag.find('._spotHomesite').hasClass('is_bottom')) {
1801						$tag.find('._spotHomesite').removeClass('is_bottom');
1802					}
1803
1804					if($tag.find('._sectionSpot').hasClass('type_full') && window.innerWidth > 768) {
1805						var A = $tag.find('._areaLogin').length ? true : false,
1806							C = window.innerHeight;
1807	
1808						if (A) {
1809							C -= 50;
1810						}
1811						
1812						$tag.find("._sectionSpot .swiper-wrapper").css("height", C);
1813						$tag.find("._sectionSpot .swiper-slide").css("height", C);
1814						$tag.find("._sectionSpot ._imgCover").css("height", C).each(function(F, G) {
1815							var D = $(G);
1816							var E = D.attr("data-lazy-background-img-src");
1817							D.css({
1818								backgroundImage: "url(" + E + ")",
1819								filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + E + '}", sizingMethod="scale")'
1820							});
1821						});
1822						if (!$tag.find("._spotHomesite").hasClass("is_bottom")) {
1823							$tag.find("._spotHomesite").css("height", C);
1824						}
1825					}
1826
1827					if($tag.find('.page-container-mobile').length > 0) {
1828						if(window.innerWidth <= 768) $tag.find('[data-role="page-container"]._content').hide();
1829						else $tag.find('[data-role="page-container"]._content').show();
1830					} 
1831
1832					if($tag.parents('body').is('.clnav-overlap-OFF') && $tag.is('[data-el="el_0"]')) {
1833						$tag.find('._spotHomesite .site_info').append(fl_data.el_html);
1834					}
1835				}
1836
1837				var checkNotSupported = (!is_templates) ? $.notSupported.check(val.type,val.type2,val.feature) : false;
1838				if(checkNotSupported) {
1839					$tag.html('').attr('class',`hide element ${val.elname} el_${idx}`);
1840					$(`template.elementAddPoint[data-id="${val.seq}"]`).replaceWith($tag);
1841					$(`#el_${idx}css, #js_${idx}`).remove();
1842					return Promise.resolve();
1843				}
1844
1845				if(typeof settings.blocklang != 'undefined') {
1846					blocklang = settings.blocklang;
1847					$tag.attr('data-blocklang',blocklang);
1848				}
1849
1850				if(val.type == 'contact') {
1851					setContactSubmitSecurity($tag, val.seq, settings, block_lang);
1852				}
1853
1854				if (val.type == 'sync') {
1855					showHideSyncField($tag, settings);
1856
1857					var sync_list_total = (typeof val.sync !='undefined' && typeof val.sync.list != 'undefined' && (val.sync.list).length > 0) ? (val.sync.list).length : 0;
1858					if($tag.find('.slick-page-label').length > 0) {
1859						var page_label = sync_list_total;
1860						if(val.type2 == 'imgpitem' && sync_list_total == 0) page_label = $tag.find('.slick .item').length;
1861
1862	                    $tag.find('.slick-page-label .slick-page-now').text(1);
1863	                    $tag.find('.slick-page-label .slick-page-total').text(page_label);
1864					}
1865
1866					if($tag.find('.sync-option').length > 0) {
1867						var sync_css = CSSJSON.toJSON(htmlspecialchars_decode(val.elcss)),
1868							sync_s = style.get(sync_css,val.elname);
1869						if(typeof sync_s.__display_count != 'undefined') {
1870							var display_cnt = Number(sync_s.__display_count) || 10;
1871							$tag.find(`.sync-item:gt(${display_cnt-1}
1871)`).addClass('hide');
1872
1873							if($tag.find('.sync-page-label').length > 0) {
1874								var sync_p_cnt = $tag.find('.sync-row .sync-item').length,
1875									sync_p_total = Math.ceil(sync_p_cnt / display_cnt);
1876								$tag.find('.sync-page .sync-page-now').text(1);
1877								$tag.find('.sync-page .sync-page-total').text(sync_p_total);
1878									
1879								if(sync_p_total == 1) $tag.find('.sync-page-wrap').hide();
1880								else $tag.find('.sync-page-wrap').show();
1881							}
1882						}
1883					}
1884
1885					var sync_loadmore_lang = block_lang;
1886					if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) sync_loadmore_lang = settings.loadmore_lang.toLowerCase();
1887					$tag.find('.sync-page-more-str').text($.lang[sync_loadmore_lang]['config.loadmore']);
1888				}
1889								
1890				if(checkGalleryView) {
1891					if(val.page == 'fixedblock_'+b.PARENT.pid) $tag.addClass('el-fixedblock');
1892					else $tag.removeClass('el-fixedblock');
1893
1894					$tag.attr('data-pos', page_pos);
1895					// if(b.LUX && (val.orgpos == '1' || $tag.is('.lux-product-block'))) $tag.attr('data-ppos', (val.pos*1) + 1);
1896					// else $tag.attr('data-ppos', val.pos);
1897					$tag.attr('data-ppos', val.pos);
1898					$tag.attr('data-posby', val.elnew);
1899				}
1900
1901				if(val.type == 'contact' && val.page == 'fixedcontact') {
1902					$.fixedContact.init($tag);
1903	            }
1904
1905				if(val.type=='forum' || val.type=='latest') $tag.addClass('preloading');
1906
1907				var checkPageblock = (val.seq === 'all_products' || (val.orgpos == 1 && val.orgpage)) ? true : false;
1908				if(b.ONE && checkPageblock) {
1909					$tag.attr('data-pagename', val.orgpage);
1910					$tag.addClass('link-to-'+JSON.parse('"'+val.orgpage.replace(/ /g,'-')+'"'));
1911				}
1912
1913				$tag.addClass('element');
1914
1915
1916				$(`template.elementAddPoint[data-id="${val.seq}"]`).replaceWith($tag.closest('.elem, .element'));
1917				setOldVerBlockView($tag,val);
1918
1919				if(val.type == 'calendar'){
1920					var currentDate = new Date(),
1921						getYear = currentDate.getFullYear(),
1922						getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"),
1923						yearMonth = getYear + '-' + getMonth;
1924					$.cl_calendar.init(val.sid, val.seq, yearMonth, val);
1925				}
1926
1927				if(val.type == 'sns' && typeof val.type2 != 'undefined' && val.type2 == 'feed') {
1928					$tag.find('.data-feed-load-more').attr('data-feed-el',val.elname);
1929					$tag.find('.data-feed-load-more').removeAttr('style');
1930					$tag.find('.show-posts').removeClass('show-posts');
1931
1932					if(val.mode == 'site') {
1933						if(!$.isEmptyObject(b.SOCIAL)) {
1934							var load_sns = {};
1935							if(!$.isEmptyObject(b.SOCIAL.instagram) && typeof settings.sns_instagram != 'undefined' && settings.sns_instagram == 'ON') load_sns['instagram'] = b.SOCIAL.instagram;
1936							if(!$.isEmptyObject(b.SOCIAL.twitter) && typeof settings.sns_twitter != 'undefined' && settings.sns_twitter == 'ON') load_sns['twitter'] = b.SOCIAL.twitter;
1937							
1938							if(!$.isEmptyObject(load_sns)) {
1939								loadingElement(val.elname,'loading posts...');
1940								updateFeed(val.elname, load_sns, settings, function() {
1941									$('.'+val.elname+' .listprogress').remove();
1942								});
1943							}
1944						}
1945					} else {
1946						// SNS FEED:: before version
1947						if(typeof settings.sns != 'undefined' &&  settings.sns.twitter) {
1948							loadingElement(val.elname,'loading posts...');
1949							updateFeed(val.elname,settings.sns);
1950						}
1951					}
1952				}
1953
1954				if(val.type == 'others' && typeof val.type2 != 'undefined' && val.type2 == 'countdown') {
1955					var el_dday = $tag.find('[data-dday="true"]'),
1956						cd_date = (el_dday.attr('data-countdown')) ? el_dday.attr('data-countdown') : new Date(),
1957						dateformat  = { days : '%D', hours: '%H', minutes: '%M', seconds: '%S' },
1958						dateendformat  = { days : '00', hours: '00', minutes: '00', seconds: '00' };
1959					
1960					if( typeof settings.countdown != 'undefined' && settings.countdown ) {  //set - block setting date 
1961						cd_date = settings.countdown;
1962					}
1963					if( !el_dday.attr('data-countdown') && typeof countdown == 'object' ) { //set - example date
1964						cd_date.setTime(cd_date.getTime() + (35*24*60*60*1000));
1965					}
1966					cd_date = moment(cd_date).format('YYYY/MM/DD HH:mm:ss');
1967
1968					el_dday.countdown(cd_date, function(event) {
1969						$(this).find('.date-item[data-datetype]').each(function(i) {
1970							var dd_type = $(this).attr('data-datetype'),
1971								dd_format = $(this).attr('data-format'),
1972								dd_endformat = $(this).attr('data-finish');
1973
1974							if(typeof dd_format == 'undefined' || !dd_format) dd_format = dateformat[dd_type];
1975							if(typeof dd_endformat == 'undefined' || !dd_endformat) dd_endformat = dateendformat[dd_type];
1976
1977							if(event.elapsed) $(this).text(dd_endformat);
1978							else $(this).text(event.strftime(dd_format));
1979						});
1980					});
1981
1982                	if($tag.find('[data-bg-video="true"]').length > 0) resizeVideoIframe($tag);
1983				}
1984
1985				if(typeof settings.bookmark != 'undefined' && settings.bookmark) {
1986					$tag.attr('data-bookmark',val.seq);
1987				}
1988
1989				if(val.type == 'gallery') {
1990					// gallery frame add
1991					if(val.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), val.seq, val.type, val.elsettings);
1992					
1993					(checkGalleryListEmpty) ? $tag.addClass('emptyGallery') : $tag.removeClass('emptyGallery');
1994
1995					$tag.attr('data-category',category_onoff);
1996					$tag.attr('data-gallery-sort',gallery_sort);
1997
1998					if(category_onoff == 'ON'|| gallery_sort == 'product') {
1999						initGToolbar($tag, {id:val.seq, settings:settings});
2000					}
2001
2002					var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'ON',
2003						title_onoff = (typeof settings.gframe_title_visible != 'undefined' && settings.gframe_title_visible == 'OFF') ? 'OFF' : 'ON';
2004        				like = (typeof settings.like_display != 'undefined' && settings.like_display) ? settings.like_display : 'N';
2005
2006					$tag.find('[data-gallery]').attr({'data-img-original':img_onoff, 'data-gallery-title':title_onoff, 'data-gallery-like':like});
2007					if(!title_onoff) $tag.find('[data-gallery]').attr('data-title','');
2008
2009					if(typeof val.price_hidden != 'undefined' && val.price_hidden == 'ON') {
2010						$tag.find('.figure.price').html('');
2011					}
2012
2013					showHideGalleryField($tag,settings);
2014					reloadBlockMasonry('init', $tag);
2015
2016					var $glmBtnWrap = $tag.find('.loadmore-wrap'),
2017						$glmBtn = $tag.find('.loadmore-wrap .gallery-loadmore'),
2018						checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false,
2019						glm_lang = LANG;
2020
2021					if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) glm_lang = settings.loadmore_lang.toLowerCase();
2022					else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
2023					var glm_txt = $.lang[glm_lang]['config.loadmore'];
2024
2025					if($glmBtnWrap.length == 0) {
2026						// gallery loadmore btn - default (ver1)
2027						if(checkLoadmore) {
2028							var glm_class = (val.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
2029								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>';
2030
2031							if($tag.find('.gallery-loadmore[data-id="'+val.seq+'"]').length > 0) $('.gallery-loadmore[data-id="'+val.seq+'"]').replaceWith(glm_btn);
2032							else $tag.append(glm_btn);
2033						} else $tag.find('.gallery-loadmore').remove();
2034
2035					} else {
2036						// gallery loadmore btn - custom (ver2)
2037						if(checkLoadmore) {
2038							if(val.feature=='masonry') $glmBtn.addClass('masonry-layout');
2039							else $glmBtn.removeClass('masonry-layout');
2040							$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);
2041							$glmBtn.find('.label').text(glm_txt);
2042							$glmBtn.find('.display .view').text(cookie_view);
2043							$glmBtn.find('.display .total').text(total);
2044							$glmBtnWrap.removeClass('hide').fadeIn();
2045						} else {
2046							$glmBtnWrap.fadeOut().addClass('hide');
2047							$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');
2048							$glmBtn.find('.label').text(glm_txt);
2049							$glmBtn.find('.display .view').text('0');
2050							$glmBtn.find('.display .total').text('0');
2051						}
2052					}
2053
2054					//갤러리블럭 모바일 가로 갯수 설정 시 클래스추가
2055					var gal_css = CSSJSON.toJSON(htmlspecialchars_decode(val.elcss)),
2056						gal_s = style.get(gal_css,val.elname),
2057						gal_case = $tag.attr('data-case'),
2058						gal_id = $tag.attr('data-id'),
2059						gal_name = $tag.attr('data-name');
2060					if(gal_s.__layout_m_on == 1 && gal_case != 'gallery61') {
2061						$tag.addClass('el-col-m'+gal_s.__layout_col_mc);
2062					} else if(gal_s.__layout_m_on == 1 && gal_case == 'gallery61') {
2063						$tag.addClass('el-col-m'+gal_s.__swiper_view_mc);
2064						setTimeout(function() {
2065							elGalleryJS[gal_id].gjs_load(document.querySelector('.'+gal_name));
2066						});
2067					}
2068				}
2069
2070				if(val.type == 'sync') {
2071					var sync_source = _this.syncUpdate($tag, val);
2072					$tag.html(sync_source);
2073
2074					if($tag.find('[data-sync-loop="true"]').length > 0) {
2075						if(val.type2 == 'tab') $tag.find('[data-sync-loop="true"] > li[data-list-no="1"]').attr('data-list-no','');
2076						if(val.type2 == 'imgpitem' && sync_list_total > 0) $tag.find('[data-sync-loop="true"] > li:not([data-idx])').remove();
2077						$tag.find('[data-sync-loop="true"] > li').eq(0).addClass('active').siblings().removeClass('active');
2078					}
2079				}
2080
2081				// tab block 우선순위 check
2082				if(val.type == 'tabs') {
2083					var $tabs = $tag.find(".tab-box .tab:not(.hover)"),
2084						$initial_tab = ($tabs.filter('.checked').length > 0) ? $tabs.filter('.checked').first() : $tabs.filter('.active').first();
2085					if($initial_tab.length == 0) $initial_tab = $tabs.eq(0);
2086					if($tabs.filter('.checked').length > 0) {
2087						$tabs.removeClass('active');
2088						$initial_tab.addClass('active');
2089						$tag.find('.tab-editor').removeClass('active');
2090						$tag.find('.tab-editor.tabs' + $initial_tab.attr('data-order')).addClass('active');
2091					}
2092					var el = $tag.attr('data-name'),
2093						len = $tabs.length,
2094						motion_style = $tag.attr("tab-motion-style"),
2095						tab_counted = $tag.attr("tab-count"),
2096						mobile_tab_count = $tag.attr("mobile-tab-count"),
2097						tab_count = ($(window).width() < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : tab_counted,
2098						mobile_tab_line = $tag.attr("mobile-tab-line"),
2099						tab_case = $tag.attr("data-case"),
2100						motion = $tag.attr("tab-motion"),
2101						priority = Number($initial_tab.attr('data-order')) || 1,
2102						navigation_use = $tag.attr("navigation-use");
2103					tabArrow(el);
2104					if(navigation_use == '1' || ($(window).width() < 991 && mobile_tab_line == '1' && len > Number(tab_count))) {
2105						if(motion_style == 1) {
2106							var motion = (((priority + 1) - Number(tab_count)) >= 0) ? priority - Number(tab_count) : 0;
2107						} else {
2108							var motion = Math.ceil(Number(priority) / Number(tab_count)) - 1;
2109						}
2110						$tag.attr('tab-motion', motion);
2111						tabMotion(el, motion, "", len, motion_style, tab_count, tab_case);
2112					}
2113				}
2114
2115				if(val.seq == 'all_products') {
2116	                if (b.ONE) $tag.addClass('link-to-전체상품');
2117					setGToolbarAllProducts($tag, settings, val.total.list_total);
2118				}
2119
2120				if($tag.has('input.gjs').length) {
2121					var gjs_status = (typeof elGalleryJS[val.seq] != 'undefined') ? 'reload-block' : 'load-block';
2122					setGalleryJS(gjs_status,$tag);
2123				}
2124				
2125	            if(val.type == 'forum') {
2126	            	var view = $tag.find('[data-loop="true"]').attr('data-view');
2127	                if(typeof view == 'undefined') view = 10;
2128	                if(typeof $.cookie('forum_' + val.seq) != 'undefined' && $.cookie('forum_' + val.seq)) {
2129	                	$.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'));	          
2130	                } else {
2131	                	$.forum.init(val.seq,b.PAGE,view);
2132					}
2133	                	
2134	                $.removeCookie('forum', { path : '/' });
2135	                $.removeCookie('forum_'+val.seq, { path : '/' });
2136	                $.removeCookie('forum_'+val.seq+'_sfl', { path : '/' });
2137	                $.removeCookie('forum_'+val.seq+'_stx', { path : '/' });
2138	                $.removeCookie('forum_'+val.seq+'_scate', { path : '/' });
2139
2140					if(val.type2 == 'guestbook') {						
2141	                    if(settings.input_updown == 'U') {                    	
2142	                        $tag.find('.default_top').removeClass('flex-value-order2').addClass('flex-value-order1');
2143	                        $tag.find('.default_bottom').removeClass('flex-value-order1').addClass('flex-value-order2');	                    
2144	                    } 
2145	                    else {
2146	                    	if (typeof settings.input_updown == 'undefined') {//블럭 추가 당시 세팅값 없을 때
2147                        	$tag.find('.default_top').removeClass('flex-value-order2').addClass('flex-value-order1');
2148                        	$tag.find('.default_bottom').removeClass('flex-value-order1').addClass('flex-value-order2');                            
2149                        	} else {
2150	                        $tag.find('.default_top').removeClass('flex-value-order1').addClass('flex-value-order2');
2151	                        $tag.find('.default_bottom').removeClass('flex-value-order2').addClass('flex-value-order1');
2152	                    	}
2153	                	}
2154	                }
2155				}
2156
2157				if(b.LUX && typeof res != 'undefined') {
2158					shopHeaderDisplay($tag.find('.shop-filter-header'),res);
2159				}
2160
2161				if(val.type == 'latest') {
2162					var latest_data = (typeof settings.latest_data != 'undefined' && settings.latest_data) ? settings.latest_data : {};
2163					$.latest.init(val.seq, latest_data);
2164					$tag.removeClass('preloading');
2165				}
2166
2167				if(val.type == 'review') {
2168					galleryEL[val.seq] = {
2169						'seq' : val.seq,
2170						'elname' : val.elname,
2171						'eltag' : tag,
2172						'folder' : val.folder,
2173						'mode' : val.mode,
2174						'elsettings' : val.elsettings,
2175						'feature' : val.feature,
2176						'type' : val.type,
2177						'type2' : val.type2,
2178						'searches' : val.searches
2179					};
2180					var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
2181					$.reviewContents.init(val.seq, gallery_data);
2182				}
2183
2184				if(b.VIEW) {
2185					var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'OFF';
2186					$tag.find('img[data-attach="true"]').attr('data-img-original',img_onoff);
2187
2188					setGalleryReturnItemCookie(b.PARENT);
2189					var c_g_p = (typeof $.cookie('gallery-page-' + b.PARENT.pid) != 'undefined') ? $.cookie('gallery-page-' + b.PARENT.pid) : 1;
2190					$.cookie('gallery',b.PARENT.pid, { path: '/', expires: 12 * 60 * 60 * 1000 });
2191					$.cookie('loadmore-' + b.PARENT.pid, c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
2192					if(typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products')) {
2193						c_g_p = (typeof $.cookie('gallery-page-all_products') != 'undefined') ? $.cookie('gallery-page-all_products') : 1;
2194						$.cookie('gallery','all_products', { path: '/', expires: 12 * 60 * 60 * 1000 });
2195						$.cookie('loadmore-all_products', c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
2196					}
2197				}
2198
2199				$tag.find('[data-fixed-width]').each(function() {
2200					$(this).css('width',$(this).attr('data-fixed-width')+'px');
2201				});
2202
2203
2204				$tag.find('[data-map="true"]:not(iframe)').each(function() {
2205					var map_url = $(this).attr('data-url');
2206					if(typeof map_url != 'undefined' && map_url) {
2207						var map_iframe = getMapURL(map_url,'html');
2208						$(this).replaceWith(map_iframe);
2209						if(map_iframe.indexOf('google-map disabled') === -1) $(this).next('.map-undefined').remove();
2210					}
2211				});
2212
2213				if(val.type == 'contact' && val.type2 == 'franchise map') {
2214					$.each($tag.find('[data-fmap-loop="true"] .item .item-name'), function(i, v) {
2215                        let itemName = $(v).html();
2216                        itemName = itemName.replace(/&lt;&nbsp;/g, '&lt;').replace(/&nbsp;&gt;/g, '&gt;');
2217                        $(v).html(itemName);
2218                    });
2219
2220                    var $mapItem = $tag.find('[data-fmap-loop="true"] > .item.selected');
2221                    drawMap($mapItem, $tag);
2222                    fmapMobilePaging($tag);
2223                } else {
2224                	if($tag.find('[data-map_kind="kakao"]').length && (typeof kakao == 'undefined' || typeof kakao.maps == 'undefined' || 
2224kakao.maps == null || property.VALIDPLAN == '')) {
2225						$tag.find('[data-map_kind="kakao"]').html('지도연결해제됨. Javascript키 확인');
2226						$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>');
2227					} else {
2228						$tag.find('[data-map_kind="kakao"]').each(function() {
2229							var container = this;
2230	                        var lat = $(this).data("lat");
2231	                        var lng = $(this).data("lng");
2232	                        var zoomInOut = $(this).data("zoominout");
2233	                        var mapTitle = $(this).data("maptitle");
2234	                        var mapContent = $(this).data("mapcontent");
2235	                        var useTitle = $(this).data("usetitle");
2236	                        var useContent = $(this).data("usecontent");
2237
2238	                        if (typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
2239	                        if (typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
2240	                        if (typeof mapContent == 'undefined' || !mapContent) mapContent = '';
2241	                        if (typeof useTitle == 'undefined' || !useTitle) useTitle = false;
2242	                        if (typeof useContent == 'undefined' || !useContent) useContent = false;
2243	                        
2244	                        var options = { center: new kakao.maps.LatLng(lat, lng), level: 3 };
2245	                        var c_map = new kakao.maps.Map(container, options);
2246	                        var marker = new kakao.maps.Marker({ position: new kakao.maps.LatLng(lat, lng), map: c_map });
2247	                        
2248							if(zoomInOut == true) {
2249								// var mapTypeControl = new kakao.maps.MapTypeControl();
2250								// c_map.addControl(mapTypeControl, kakao.maps.ControlPosition.TOPRIGHT);
2251								// var zoomControl = new kakao.maps.ZoomControl();
2252								// c_map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);
2253								var zoomControlHtml = '';
2254								zoomControlHtml += '\
2255									<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);">\
2256										<div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
2257											<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>\
2258										</div>\
2259										<div class="slider-wrap-container" style="height: 130px;">\
2260											<div class="slider-wrap small" style="text-align: center; height: 100%;">\
2261												<div style="max-height: 100%;" class="zoom-control-slider"></div>\
2262											</div>\
2263										</div>\
2264										<div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
2265											<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>\
2266										</div>\
2267									</div>\
2268								';
2269								var $zoomController = $(zoomControlHtml);
2270								$(container).append($zoomController);
2271								var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
2272									'orientation': 'vertical',
2273									'min' : 1,
2274									'max' : 14,
2275									'step' : 1,
2276									'value' : 3,
2277									'handle' : '<div>dfafasdfas</div>',
2278									// 'reversed' : true,
2279									'tooltip' : 'hide',
2280								}).on('slide', function(data) {
2281									c_map.setLevel(data.value);
2282									c_map.setCenter(marker.getPosition());
2283								}).on('slideStop', function(data) {
2284									c_map.setLevel(data.value);
2285									c_map.setCenter(marker.getPosition());
2286								});
2287
2288								$zoomController.find('.btn-zoom-control').on('click', function() {
2289									if($(this).data('inout') == 'I') {
2290										c_map.setLevel(c_map.getLevel() - 1);
2291										zoom_slider.slider('setValue', c_map.getLevel());
2292									} else if($(this).data('inout' == 'O')) {
2293										c_map.setLevel(c_map.getLevel() + 1);
2294										zoom_slider.slider('setValue', c_map.getLevel());
2295									}
2296								});
2297
2298								kakao.maps.event.addListener(c_map, 'zoom_changed', function() {
2299									zoom_slider.slider('setValue', c_map.getLevel());
2300								});
2301							}
2302
2303							if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
2304								var iwContent = '';
2305								if(useTitle == true && mapTitle) {
2306									iwContent = '<div class="title">' + mapTitle + '</div>';
2307								}
2308								if(useContent == true && mapContent) {
2309									iwContent += '<div class="content">' + mapContent + '</div>';
2310								}
2311								// var infowindow = new kakao.maps.InfoWindow({
2312								//     position: marker.getPosition(),
2313								//     content : iwContent
2314								// });
2315								// infowindow.open(c_map, marker);
2316								if(iwContent) {
2317									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>
2317' + iwContent + '</div>';
2318									var infoWindow = $(iwContent);
2319									$(container).append(infoWindow);
2320									// infoWindow.css('bottom', 'calc(-100% + ' + (infoWindow.outerHeight() + 36) + 'px)');  
2321								}
2322							}
2323							$(window).on("resize", function() {
2324								c_map.setCenter(marker.getPosition());
2325							});
2326						});
2327					}
2328
2329					if($tag.find('[data-map_kind="naver"]').length && (typeof naver == 'undefined' || typeof naver.maps == 'undefined' || naver.maps == null || property.VALIDPLAN == '')) {
2330						$tag.find('[data-map_kind="naver"]').html('지도연결해제됨. Client ID 확인');
2331						$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>');
2332					} else {
2333						$tag.find('[data-map_kind="naver"]').each(function() {
2334							var container = this;
2335							var lat = $(this).data("lat");
2336							var lng = $(this).data("lng");
2337							var options = { center: new naver.maps.LatLng(lat, lng), zoom: 17};
2338							var c_map = new naver.maps.Map(container, options);
2339							var marker = new naver.maps.Marker({ position: new naver.maps.LatLng(lat, lng), map: c_map});
2340							var zoomInOut = $(this).data("zoominout");
2341							var mapTitle = $(this).data("maptitle");
2342							var mapContent = $(this).data("mapcontent");
2343							var useTitle = $(this).data("usetitle");
2344							var useContent = $(this).data("usecontent");
2345							if(typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
2346							if(typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
2347							if(typeof mapContent == 'undefined' || !mapContent) mapContent = '';
2348							if(typeof useTitle == 'undefined' || !useTitle) useTitle = false;
2349							if(typeof useContent == 'undefined' || !useContent) useContent = false;
2350							if(zoomInOut == true) {
2351								// options.zoomControl = true;
2352								var zoomControlHtml = '';
2353								zoomControlHtml += '\
2354									<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);">\
2355										<div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
2356											<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>\
2357										</div>\
2358										<div class="slider-wrap-container" style="height: 130px;">\
2359											<div class="slider-wrap small" style="text-align: center; height: 100%;">\
2360												<div style="max-height: 100%;" class="zoom-control-slider"></div>\
2361											</div>\
2362										</div>\
2363										<div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
2364											<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>\
2365										</div>\
2366									</div>\
2367								';
2368								var $zoomController = $(zoomControlHtml);
2369								$(container).append($zoomController);
2370								var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
2371									'orientation': 'vertical',
2372									'min' : 6,
2373									'max' : 21,
2374									'step' : 1,
2375									'value' : 17,
2376									'handle' : '<div>dfafasdfas</div>',
2377									'reversed' : true,
2378									'tooltip' : 'hide',
2379								}).on('slide', function(data) {
2380									c_map.setZoom(data.value);
2381									c_map.setCenter(marker.getPosition());
2382								}).on('slideStop', function(data) {
2383									c_map.setZoom(data.value);
2384									c_map.setCenter(marker.getPosition());
2385								});
2386								$zoomController.find('.btn-zoom-control').on('click', function() {
2387									if($(this).data('inout') == 'I') {
2388										c_map.setZoom(c_map.getZoom() + 1);
2389										zoom_slider.slider('setValue', c_map.getZoom());
2390									} else if($(this).data('inout' == 'O')) {
2391										c_map.setZoom(c_map.getZoom() - 1);
2392										zoom_slider.slider('setValue', c_map.getZoom());
2393									}
2394								});
2395
2396								naver.maps.Event.addListener(c_map, 'zoom_changed', function(zoom) {
2397									zoom_slider.slider('setValue', c_map.getZoom());
2398								});
2399							}
2400
2401							if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
2402								var iwContent = '';
2403								if(useTitle == true && mapTitle) {
2404									iwContent = '<div class="title">' + mapTitle + '</div>';
2405								}
2406								if(useContent == true && mapContent) {
2407									iwContent += '<div class="content">' + mapContent + '</div>';
2408								}
2409
2410								if(iwContent) {
2411									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>
2411' + iwContent + '</div>';
2412									var infoWindow = $(iwContent);
2413									$(container).append(infoWindow);
2414									// infoWindow.css('bottom', 'calc(-100% + ' + (infoWindow.outerHeight() + 36) + 'px)');  
2415								}
2416								// var infowindow = new naver.maps.InfoWindow({
2417								//     content : iwContent
2418								// });
2419								// infowindow.open(c_map, marker);
2420							}
2421							$(window).on("resize", function() {
2422								c_map.setCenter(marker.getPosition());
2423							});
2424						});
2425					}
2426                }
2427
2428				if(val.type == 'form' || (val.type == 'contact' && val.type2 == 'franchise bar')) {
2429					$.forms.init(val.seq);
2430				}
2431
2432				if(val.type == 'showcase') {
2433					if($tag.hasClass('carousel') && $tag.find('.item').length > 1 && $tag.find('.control-box .carousel-control').hasClass('hide')) {
2434						$tag.find('.control-box .carousel-control').removeClass('hide');
2435					}
2436				}
2437
2438				//video block ::: gallery
2439				if(val.type == 'video') {
2440					if($tag.find('.video-gallery-url').length>0) { //재생방식 : 확대보기 
2441						$.each($tag.find('.item'),function(i,v){
2442							if(val.mode=='zoom') appendGalleryFrame($(this).parents('.element'),val.seq,val.type);
2443						});
2444
2445	                    // let lsw = document.querySelector('.element[data-id="' + val.seq + '"] .swiper');
2446		                // if(lsw && lsw.swiper) {
2447	                    //     let slider_motion = $('.element[data-id="' + val.seq + '"]').attr('data-slider-motion');
2448
2449		                // 	$('#gframe-' + val.seq).on('opened', function(event, slide){
2450				        //     	console.log('gallery opend', slider_motion);
2451	                    //         if(slider_motion != 'stop') {
2452	                    //             lsw.swiper.autoplay.stop();
2453	                    //         }
2454		                //     }).on('closed', function (event){
2455				        //     	console.log('gallery closed');
2456	                    //         if(slider_motion != 'stop') {
2457	                    //             lsw.swiper.autoplay.start();
2458		                //         }
2459		                //     });
2460						// }
2461					}
2462
2463					resizeVideoIframe($tag);
2464				}
2465
2466				//add script
2467				if(val.eljs){
2468					var js_string = val.eljs;
2469					var $script_tag = $('<script type="text/javascript" id="js_' + idx + '"></script>');
2470					$script_tag.html(js_string);
2471					$('.dsgn-body').append($script_tag);
2472				}
2473
2474				if($tag.find('.slick').length > 0) {
2475					if (val.type == 'sync' && typeof syncSlickFn == 'function') syncSlickFn('.' + val.elname);
2476					else if($tag.is('[data-clslick]') && typeof clSlickFn == 'function') clSlickFn('.' + val.elname);
2477				}
2478
2479				// log 
2480				if(typeof settings['google_track'] != 'undefined') {
2481					$('.dsgn-body').append("<script type='text/javascript' src='//www.googleadservices.com/pagead/conversion_async.js'></script>");
2482				}
2483
2484				//add style
2485				var jcss = CSSJSON.toJSON(val.elcss);
2486
2487				var element_mh = jcss?.children[`.${val.elname}`]?.attributes['min-height'] ?? '';
2488				if (element_mh && /%$/.test(element_mh)) {
2489					const converted_mh = element_mh.replace('%', '');
2490					$tag.css('min-height',`${converted_mh}vh`);
2491				}
2492
2493				var elpd = style.getPadding(jcss,val.elname);
2494				var pt = parseInt(elpd.top);
2495				var pb = parseInt(elpd.bottom);
2496					
2497				if(pt>0||pb>0){
2498					default_t_css = default_t_css + '\n 	.'+val.elname + '{';
2499					if(Math.ceil(pt*0.8)>0)
2500					default_t_css = default_t_css + 'padding-top: '+Math.ceil(pt*0.8) + 'px!important;';
2501					if(Math.ceil(pb*0.8)>0)
2502					default_t_css = default_t_css + 'padding-bottom: '+Math.ceil(pb*0.8) + 'px!important;';
2503					default_t_css = default_t_css + '}';
2504
2505					default_m_css = default_m_css + '\n 	.'+val.elname + '{';
2506					if(Math.ceil(pt*0.5)>0)
2507					default_m_css = default_m_css + 'padding-top: '+Math.ceil(pt*0.5) + 'px!important;';
2508					if(Math.ceil(pb*0.5)>0)
2509					default_m_css = default_m_css + 'padding-bottom: '+Math.ceil(pb*0.5) + 'px!important;';
2510					default_m_css = default_m_css + '}';
2511				}
2512				if(idx == data.length-1){
2513					var css = '@media only screen and (max-width:767px) {' + default_t_css + '\n}\n';
2514					css = css + '@media only screen and (max-width:480px) {' + default_m_css + '\n}';
2515
2516					if($('#el-paddingcss').length == 0) $('.dsgn-body').find('#el_'+(data.length-1)+'css').after('<style id="el-paddingcss">'+css+'</style>');
2517					else $('#el-paddingcss').append(css);
2518				}
2519				
2520				if(val.type == 'product') {
2521					if(val.is_wishlist == true) {
2522						$('.product-detail-btn .btn-myfav .btn-myfav-icon').addClass('on');
2523					} else {
2524						$('.product-detail-btn .btn-myfav .btn-myfav-icon').removeClass('on');
2525					}
2526				}
2527
2528				if($.inArray(val.type, ['contents', 'text', 'image', 'video']) > -1) {
2529					let ecs = enableContentsSlider(val.seq, val.type, settings);
2530					if(typeof settings.list_type != 'undefined' && settings.list_type == 's' && ecs) {
2531	                    $.contentsSlider.ready(val.seq).then(() => {$.contentsSlider.init(val.seq, settings)});
2532	                }
2533				}
2534
2535				return new Promise(function(resolve) { setTimeout(resolve) });
2536			}
2537
2538			if(check_modoo) {
2539				m_floating(fl_data);
2540			}
2541			var dataloop = async function(data) {
2542				var promises = data.map(async function(val, idx) {
2543					return await drawData(idx, val)
2544				});
2545				return await Promise.all(promises);
2546			}
2547
2548			if(checkGalleryView) setViewPageStyle();
2549			dataloop(data).then(function() {
2550				$('.el-footer').css('visibility', 'visible');
2551				$.processOFF();
2552
2553				document.querySelectorAll('.element video').forEach(function(video) {
2554					if(video.readyState > 0) video.classList.add('loaded');
2555					video.addEventListener('loadeddata', function() {
2556						this.classList.add('loaded');
2557					});
2558				});
2559
2560				$('.dsgn-body').fitVids();
2561				$('.carousel').carousel({
2562					pause: 'none'
2563				});
2564
2565				changeBrokenImages('.element');
2566				
2567				$('.element').each(function(i,v){
2568					var $tag = $(v);
2569					var elFonts = $tag.css('font-family');
2570					elFonts = elFonts + ",'Nanum Gothic'";
2571					elFonts = elFonts.replace(/"/g, '\'');
2572					$tag.css('font-family', ($tag.css('font-family') + ",'Nanum Gothic'").replace(/"/g, '\''));
2573				});
2574				$('html').toggleClass('gtoolbar-sticky-ON', $('.cl-gtoolbar[data-sticky="ON"]').length > 0 ? true : false);
2575
2576				if(b.VIEW) {
2577					// prev next
2578					$('.data-page-prev').addClass('active');
2579					$('.data-page-next').addClass('active');
2580
2581					if(b.PARENT.prev === null) $('.data-page-prev').removeClass('active');
2582					if(b.PARENT.next === null) $('.data-page-next').removeClass('active');
2583
2584					if(b.PARENT.mode == 'shopping') {
2585						$('.data-page-prev, .data-page-next').removeClass('active');
2586						if(b.PARENT.prev) $('.data-page-prev').addClass('active');
2587						if(b.PARENT.next) $('.data-page-next').addClass('active');
2588
2589						if(typeof property.PRODINFO === 'object') $.products.display_info();
2590						if($('#review-onoff').val() == 'true') $.products.review(b.VIEW,b.PAGE);
2591						if($('#qna-onoff').val() == 'true') $.products.qna(b.VIEW,b.PAGE);
2592					} else {
2593						if($(`.page-comments[data-id="${b.VIEW}"]`).length == 0) _this.displayComment();
2594
2595						// initViewPageToolbar().then(function(pageToolbar){
2596						// 	setViewPageToolbar();
2597		                // });
2598						initViewPageBottom();
2599					}
2600				}
2601
2602				var isPage = false;
2603				$.each(b.MENULIST, function(i,k) {
2604					isPage = (k.toUpperCase() == b.PAGE.toUpperCase()) ? true : isPage;
2605				});
2606			
2607				// if(!b.ONE && !b.VIEW && !isPage) location.replace(URL);
2608				
2609				// menu ver3 : fheader
2610				if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
2611
2612				// shopping wrap remove
2613				if($('.shopping-wrap').length || $('.shopping-more-wrap').length) {
2614					$('.shopping-wrap').remove();
2615					$('.shopping-more-wrap').remove();
2616				}
2617
2618				// shopping wrap create
2619				if(!$('.dsgn-body').hasClass('mode-config') && $('.cl-s-product-detail').length > 0 && $('div[data-el*="el_"]').length > 1) {
2620					if(shopping_more == 'ON') {
2621						var prod_content = $('div[data-el*="el_"]').not('.cl-s-product-detail').addClass('hide');
2622						$('.product.cl-s-product-detail').after('<div class="shopping-wrap open"></div>');
2623						$('.shopping-wrap').html(prod_content);
2624						$('div[data-el*="el_"]').each(function(idx, v) {
2625							$(this).removeClass('hide');
2626							if($('.shopping-wrap').height() > 800) return false;
2627						});
2628					}
2629				}
2630				/*shopping more create*/
2631				if($('.shopping-wrap').length && $('.shopping-wrap').height() >= 800 && $('.shopping-more').length == 0) {
2632					var more_txt = (LANG == 'ko') ? '상품정보 더보기' : 'MORE';
2633					var colorSet = shopping_more_color,
2634						sm_font = (!colorSet) ? '' : colorSet.color,
2635						sm_bgColor = (!colorSet) ? '' : colorSet.background_color,
2636						sm_border = (!colorSet) ? '' : colorSet.border_color;
2637					var review_chk = ($('.cl-s-product-review').length > 0) ? true : false,
2638						qna_chk = ($('.cl-s-product-qna').length > 0) ? true : false;
2639
2640					$('.shopping-wrap').css('max-height','800px')
2641									   .css('overflow','hidden')
2642									   .after('<div class="shopping-more-wrap"><div class="shopping-more">'+more_txt+'</div></div>');
2643					$('.shopping-wrap').removeClass('open');
2644					if(sm_font) $('.shopping-more').css('color',sm_font);
2645					if(sm_bgColor) $('.shopping-more').css('background-color',sm_bgColor);
2646					if(sm_border) $('.shopping-more').css('border-color',sm_border);
2647					if(!review_chk && !qna_chk) $('.shopping-more-wrap').css('padding-bottom','100px');
2648				}
2649
2650				$('.el-footer').show();                
2651
2652				if($('.element a[data-popup][data-popup-name]').length > 0 && (!b.VALIDPLAN || b.VALIDTYPE == 'PK')) {
2653					$('.element a[data-popup][data-popup-name]').addClass('disabled');
2654				}
2655
2656				if($('.element[data-layout]').length > 0) {
2657					setLayoutHeight();
2658				}
2659		        setBlockParallax($('.element'));
2660				if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh(100);
2661				
2662				if(typeof fbq == 'function' && b.VALIDTYPE == 'SM') {
2663					if(b.VIEW) {
2664						var checkProduct = (b.PAGE.match(/^forum,/g) === null && typeof b.PARENT != 'undefined' && typeof b.PARENT.mode != 'undefined' && b.PARENT.mode == 'shopping') ? true : false,
2665							mn = (b.ONE) ? b.PARENT.opage : b.PARENT.ppage;
2666						if(checkProduct && typeof callbackEvtViewContent == 'function') callbackEvtViewContent(mn,b.PARENT.seq,b.PARENT.title,$('.total-price').text().replace(/[^0-9]/g,''));
2667					} else {
2668						var checkProductList = ($('.element[data-type="gallery"][data-mode="shopping"]').length > 0) ? true : false;
2669						if(checkProductList && typeof callbackEvtLead == 'function') callbackEvtLead(b.PAGE);
2670					}
2671				}
2672
2673				deferred.resolve();
2674			});
2675
2676			return deferred.promise();
2677		}
2678
2679		var elPush = function (prop) {
2680		    /* prop - reorder list hide */
2681		    var pageID = b.PAGE.split(','),
2682		        chgBG = false,
2683		        tmpTag = '',
2684		        currentPAGE = '',
2685		        default_t_css = '', default_m_css = '';
2686		    var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false;
2687		    var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
2688		    	footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON',
2689		    	checkFooterDisplay = (footer_display != 'OFF') ? true : false;
2690
2691				currentPAGE = b.PAGE;
2692				var contentsParam = (currentPAGE=='index,template' && param.indexOf('/org/') == -1) ? param + '/org/' + b.PAGE : param;
2693
2694			if(b.VALIDPLAN && $.inArray(b.VALIDTYPE, ['BN','SM']) > -1 && b.CERT_USE == 'Y') {
2695    			if(b.CERT_USE == 'Y') {
2696    				if(b.UMEMBER.check_login == true) isUserCertified(history);
2697    			}
2698    		}
2699	        if(pageID[0] == 'forum' && b.VIEW) {
2700		    	clearDsgnbody();
2701
2702				var preloading = loadingScript({'forum':true});
2703				preloading.done(function() {
2704					var ps_fmview = $.forum.view(b.VIEW);
2705					ps_fmview.done(function(data) {
2706						_this.displayComment(data);
2707						if(b.VIEW) setViewPageToolbar();
2708						$('.el-footer').show().css('visibility', 'visible');
2709						$.processOFF();
2710						$('.dsgn-body').animate({scrollTop: 0}, 0,'easeInOutQuart'); 
2711					}).fail(function(error_msg) {
2712						// console.log(error_msg);
2713						$.processOFF();
2714					});
2715				});
2716				return false;
2717	        }
2718
2719				if(b.pageContent.hasOwnProperty(currentPAGE)) {
2720					var loadCachedContents = function() {
2721						var loadingContents = loadPush(b.pageContent[currentPAGE]);
2722						loadingContents.then(function() {
2723							$('.el-footer').css('visibility', 'visible');
2724							$.processOFF();
2725						});
2726					};
2727					if(b.pageBlocksType.hasOwnProperty(currentPAGE)) {
2728						var preloading = loadingScript(b.pageBlocksType[currentPAGE]);
2729						preloading.then(loadCachedContents);
2730					} else {
2731						loadCachedContents();
2732					}
2733		        } else {
2734					contentsParam = (b.PUBLISH) ? contentsParam : contentsParam + '/render/true';
2735					if(checkGalleryView) $('.el-footer').addClass('hide');
2736					$.ajax({
2737						url: '/template/contents/sid/' + b.SID + '/page/' + encodeURIComponent(currentPAGE) + contentsParam,
2738						data: { siteum: b.SITEUM },
2739						dataType: 'json',
2740						type: 'GET',
2741						async: true,
2742					success: function(data) {
2743						if(typeof data.error != 'undefined' || data.error) {
2744							if(currentPAGE!='index,template') {
2745								alert($.lang[LANG]['page.not.found']);
2746								location.replace('/');
2747							}
2748							}
2749							if(currentPAGE!='index,template') b.pageContent[currentPAGE] = data.contents;
2750							if(data.conf) b.pageConf[currentPAGE] = data.conf;
2751							if(typeof data.blocks_type != 'undefined') b.pageBlocksType[currentPAGE] = data.blocks_type;
2752							if(data.initContent !== undefined) property.INITPAGE = JSON.parse(data.initContent);
2753						
2754						var preloading = loadingScript(data.blocks_type);
2755						preloading.then(function() {
2756							var loadingContents = loadPush(data.contents);
2757							loadingContents.then(function() {
2758								$('.el-footer').css('visibility', 'visible');
2759								if(checkFooterDisplay && $('.el-footer').hasClass('hide')) $('.el-footer').removeClass('hide');
2760								$.processOFF();
2761							});
2762						});
2763					}
2764				});
2765	        }
2766		}
2767
2768		var scrollspy = function() {
2769		    if(!b.ONE) return false;
2770		    var top = 0,
2771		        active = '';
2772
2773		    // top = ($('.dsgn-body').hasClass('sidebar')) ? 0 : $('.el-menu header').outerHeight();
2774
2775		    $.each(b.MENULINK,function(i,v) {
2776
2777		        var $el = ($.inArray(v,property.MENULIST) > -1) ? $('.link-to-'+v) : '';
2778		        if($el.length>0) {
2779		            var offset = $el.offset();
2780		           top = ($('.dsgn-body').hasClass('sidebar')) ? 0 : $('.el-menu header').outerHeight();
2781		            if((Math.floor(offset.top) - $(document).scrollTop())<= top) {		            	
2782		            	active = v;
2783		            }
2784		        }
2785
2786		    });
2787
2788		    
2789			if(!$('#tpl-menu li a[href="#'+active+'"]').parent().hasClass('active')) {
2790				
2791				$('#tpl-menu li').removeClass('active').removeClass('open');
2792				
2793				$('#tpl-menu li a[href="#'+active+'"]').parent().addClass('active');
2794				if( $('#tpl-menu li a[href="#'+active+'"]').closest('.dropdown-menu').length>0 ) {
2795					if($('body').width() > 768) $('#tpl-menu li a[href="#'+active+'"]').closest('.dropdown').addClass('active');
2796					else {
2797						//원페이지일 때 769~783 해상도에서 갤러리 위에 마우스 올리면 하위메뉴 열리는 현상 있어서 모바일에서만 open 클래스 추가 되도록 #mobile-nav 코드 추가.
2798						$('#mobile-nav #tpl-menu li a[href="#'+active+'"]').closest('.dropdown').addClass('open');
2799					}
2800				}
2801			}
2802
2803		    if($(document).scrollTop() + $('body').height() == $('body').prop('scrollHeight')) {
2804		    	
2805		        var last = b.MENULINK[b.MENULINK.length-1],
2806		            $el = ($.inArray(last,property.MENULIST) > -1) ? $('.link-to-'+last) : '';
2807
2808		        if($el.length>0) {
2809		            if($el.offset().top>top) {
2810		                $('#tpl-menu li').removeClass('active').removeClass('open');
2811		                
2812		                if($(document).scrollTop()!=0) 
2813		                	$('#tpl-menu li a[href="#'+last+'"]').parent().addClass('active');
2814
2815						if($('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown-menu').length>0) {
2816							if($('body').width() > 768) $('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown').addClass('active');
2817							else $('#tpl-menu li a[href="#'+last+'"]').closest('.dropdown').addClass('open');
2818						}
2819		            }
2820		        }
2821		    }
2822
2823		}
2824
2825		var fixedMenu = function() {
2826			if($.clnav.check()) return;
2827
2828			if($('header.navbar').hasClass('navbar-fheader')) { // menu ver3 : fheader 
2829				if($('body').is('[data-gjs^="fixedscroll"]')) {
2830					return false;
2831				}
2832
2833				var isSidebar = $('.el-menu > header').hasClass('sidebar');
2834				if($(document).scrollTop() > $('header.navbar').height()) {
2835					if(window.innerWidth > 768) {
2836						$('.menu-logo-top').hide();
2837						$('.el-menu').addClass('fixed-fheader');
2838					}
2839					if(b.HEADER && !isSidebar)  $('header.navbar').removeClass('transparent');
2840				} else if($(document).scrollTop() <= $('header.navbar').height()) {
2841					$('.el-menu').removeClass('fixed-fheader');
2842					$('.menu-logo-top').show();
2843					
2844					if(b.HEADER && !b.VIEW && !isSidebar) {
2845						$('header.navbar').addClass('transparent');
2846						$('.dsgn-body').css('padding-top','0px');
2847					}
2848				}
2849
2850				return false;
2851			}
2852
2853		    header_fixed = $('.header.el-menu').height();
2854		    var user_menu = $('.el-menu');
2855			var menu_color = $('header.navbar').css('background-color');
2856			var menu_bg_img = (typeof $('header.navbar').css('background-image') != 'undefined') ? $('header.navbar').css('background-image') : 'none';
2857			var menu_bg_position = (typeof $('header.navbar').css('background-position') != 'undefined') ? $('header.navbar').css('background-position') : 'center center';
2858			var menu_bg_repeat = (typeof $('header.navbar').css('background-repeat') != 'undefined') ? $('header.navbar').css('background-repeat') : 'no-repeat';
2859			var menu_bg_size = (typeof $('header.navbar').css('background-size') != 'undefined') ? $('header.navbar').css('background-size') : 'cover';
2860
2861		    if($(document).scrollTop() > header_fixed && user_menu.hasClass('fixed')==false && !$('.dsgn-body').hasClass('sidebar')) {
2862		        user_menu.fadeOut('fast', function() {
2863		            $(this).addClass('fixed').fadeIn('fast');
2864		            $('.fixed').addClass('fixed-position');
2865		            if(!b.HEADER || $('header.navbar').hasClass('sidebar') ) {
2866	                	var topval = ($('.creatorlink-header').length==1) ? '55px' : '0';
2867		            	$('.el_0').css('margin-top',topval);
2868		                var $header_empty = $('<div class="header-empty"></div>');
2869		                if($(".header-empty").length==0) {
2870		                	var topval = ($('.creatorlink-header').length==1) ? '55px' : '0';
2871			                $header_empty.css({
2872			                    'background-color' : $('header.navbar').css('background-color'),
2873								'background-image' : menu_bg_img,
2874								'background-position' : menu_bg_position,
2875								'background-repeat' : menu_bg_repeat,
2876								'background-size' : menu_bg_size,
2877			                    //'position' : 'relative',
2878			                    'width' : '100%',
2879			                    'height' : header_fixed+'px',
2880			                    'top' : topval,
2881			                    'z-index' : '1'
2882			                });
2883			                $('.dsgn-body').prepend($header_empty);
2884			            }
2885       		        	$('.header-empty').css('position','relative');
2886		            } else {
2887		            	$('header.navbar').removeClass('transparent');
2888		            }
2889		            if(window.innerWidth > 768) $('.menu-logo-top').hide();
2890		        });        
2891		    } else if($(document).scrollTop() < header_fixed && user_menu.hasClass('fixed') && !$('.dsgn-body').hasClass('sidebar')){
2892		        user_menu.fadeOut('fast', function(){
2893			        $('.header-empty').css('position','absolute');
2894		            $('.fixed').addClass('fixed-position');
2895		            user_menu.removeClass('fixed').fadeIn('fast');
2896		            if(!b.HEADER  || $('header.navbar').hasClass('sidebar') ) {
2897		            	$('.el_0').css('top','0');
2898		            } else {
2899		            	$('header.navbar').addClass('transparent');
2900		            	if($('.creatorlink-header').length == 1) $('div.header.fixed-position').addClass('top-zero');
2901		            }
2902		            $('.menu-logo-top').show();
2903		        });
2904		    }
2905		}
2906
2907		var elFooter = function() {
2908			if(typeof b.pageContent[b.PAGE] == 'undefined' && $('.error_404.new_design').length > 0) $('.error_404.new_design').remove();
2909			if($('.el-footer').length > 0) {
2910				setTimeout(function() { 
2911					if($('.element:not(.el-footer)').length < 1 && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) {
2912						if($('.error_404.new_design').length == 0) {
2913							$('style#el-footercss').after(error_style);
2914							$('.element.el-footer').before(error_html); //404 error
2915						}
2916					}
2917					$('.el-footer').show(); 
2918				}, 300);
2919				return false;
2920			}
2921			
2922			if(b.FTAG == '') b.FTAG = '<div class="footer-' + b.SID + '"></div>';
2923		    $footer = $(b.FTAG);
2924		    $footer.find('.link-site-home').prop('href',URI); 
2925		    $footer.addClass('element')
2926		           .addClass('el-footer')
2927		           .addClass('hide')
2928		           .attr('data-type','footer')
2929		           .attr('data-el','el-footer')
2930		           .attr('data-id','footer')
2931		           .attr('data-name','footer-' + b.SID);
2932
2933		    $footer.appendTo($('.dsgn-body'));
2934		    $('.dsgn-body').prepend('<style id="el-footercss">' + b.FCSS + '</style>');
2935
2936			/*180822 add*/
2937			// before v1 creatorlink-box remove
2938			if($('.el-footer').find('.creatorlink-box').length > 0 ) {
2939				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');
2940				$('.el-footer').find('.creatorlink-box').remove();
2941			}
2942			// before v2 creatorlink-footer remove
2943			if( $('.el-footer').find('.creatorlink-footer').length > 0) {
2944				$('.el-footer').find('.creatorlink-footer').remove();
2945			}
2946
2947			// made it with Creatorlink
2948			if(!b.VALIDPLAN || b.VALIDTYPE == 'PK') {
2949				var is_templates = checkTemplateSite(b.SID);
2950				if(!is_templates) {
2951					$('.goto-top').addClass('moved');
2952					setMadeWithCreatorlink();
2953				}	
2954			}
2955
2956			setCLEscrowFooter(b.SID, b.VALIDTYPE, b.SETTINGS.sm_escrow);
2957
2958		 	var isfooterAttach = typeof $footer.attr('data-flogo') == 'undefined' ? false : $footer.attr('data-flogo'),
2959	 		   	checkFixTypeMenu = (typeof $('header.navbar-fheader').attr('data-fixtype') != 'undefined' && $('header.navbar-fheader').attr('data-fixtype')) ? true : false;
2960
2961	    	if(isfooterAttach) {
2962				if(b.ONE){
2963					if(b.VIEW) $footer.find('#site-home-footer').attr('href',URI).removeClass('mini-home');
2964					else $footer.find('#site-home-footer').attr('href','javascript:;').addClass('mini-home');
2965				} else $footer.find('#site-home-footer').attr('href',URI).removeClass('mini-home');
2966			}
2967
2968	    	/*var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
2969        		footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON';
2970
2971			if(footer_display=='OFF') $('.footer-'+b.SID+'.el-footer').hide();*/
2972
2973			/*180822  delete - powered by Creatorlink
2974			// before creatorlink-box remove
2975			if($('.el-footer').find('.creatorlink-box').length > 0 ) { 
2976				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');
2977				$('.el-footer').find('.creatorlink-box').remove();
2978			}
2979
2980			if($('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').length == 1 &&
2981				$('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').hasClass('col-md-10') ) {
2982				$('.el-footer').find('*[data-edit="true"]').first().closest('.row').children('div').removeClass('col-md-10').addClass('col-md-12');
2983			}
2984
2985			if(typeof b.VALIDPLAN != 'undefined' && b.VALIDPLAN && b.VALIDTYPE != 'PK') {
2986				if( $('.el-footer').find('.creatorlink-footer').length > 0 ) $('.el-footer').find('.creatorlink-footer').remove();
2987			} else {
2988				var el_f_style = $('.el-footer').attr('style');
2989				if(typeof el_f_style != 'undefined' && 
2990					(el_f_style.indexOf('display') > -1 || el_f_style.indexOf('opacity') > -1 || el_f_style.indexOf('z-index') > -1) ) $('.el-footer').removeAttr('style');
2991				if($('.el-footer').css('display') == 'none') $('.el-footer').css('display','block');
2992				if($('.el-footer').css('opacity') < 1) $('.el-footer').css('opacity',1);
2993				if($('.el-footer').css('z-index') != 'auto') $('.el-footer').css('opacity','auto');
2994
2995				if( $('.el-footer').find('.creatorlink-footer').length == 0) setFooterCretorlinkBox();
2996				setFooterLink();
2997			}
2998			*/
2999			if($('.element:not(.el-footer)').length < 1 && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW && b.PAGE != 'psearch') {
3000				show404();
3001			}
3002
3003			changeBrokenImages($footer);
3004
3005		    if(!b.FTAG || b.FOOTER) {
3006		        // $footer.hide();
3007		    } else {
3008		    	if(b.VIEW && b.PARENT.mode == 'shopping' && $(document).width() < 768) {
3009		    		$('.el-footer').css('margin-bottom','55px');
3010		    	}
3011
3012		    	var block_display = (typeof b.SETTINGS.block_display != 'undefined' && b.SETTINGS.block_display) ? b.SETTINGS.block_display : {},
3013		        	footer_display = (typeof block_display.footer_display != 'undefined' && block_display.footer_display) ? block_display.footer_display : 'ON';
3014
3015	        	if(footer_display!='OFF') {
3016			    	setTimeout(function() {
3017			    		$footer.removeClass('hide');
3018			    	},300);
3019			    }
3020
3021			    setTimeout(function(){
3022					if(checkFixTypeMenu) {
3023						if(b.VALIDPLAN) setFixedMenuCss(false);
3024						else {
3025							$('.el-menu header.navbar[data-fixtype]').find('#tpl-menu').css({
3026								'width': '100%'
3027							});
3028						}
3029					} 
3030			    },80);
3031		    }
3032		}
3033
3034		function setDefaultValue(value) {
3035			return (typeof value == 'undefined') ? '' : value;
3036		}
3037
3038		function setDefaultValueEtc(type, el) {
3039			type = (typeof el.attr('data-contact-etc-type') != 'undefined' && el.attr('data-contact-etc-type') ) ? el.attr('data-contact-etc-type') : type;
3040            
3041            var input_type = ['text','email','number','tel','url'];
3042            if($.inArray(type,input_type)) {
3043				return (typeof el.val() == 'undefined') ? '' : el.val();
3044			} else if(type == 'checkbox') {
3045				return ( el.prop('checked') ) ? 'O' : 'X';
3046			} else if(type == "radio") {
3047				return el.find('input:radio:checked').val();
3048			} else if(type == 'selectbox') {
3049				var result = (el.find('option').length > 0 ) ? el.find('option:checked').val() : el.find('.active').find('.opval').text();
3050				return result;
3051			} else {
3052				return 'etc article';
3053			}
3054		}
3055
3056		$(document).off('contactSubmitSecurityUpdate.render').on('contactSubmitSecurityUpdate.render', function(e, $contactEL, pid, settings, blocklang) {
3057			setContactSubmitSecurity($contactEL, pid, settings, blocklang);
3058		});
3059
3060		function setDefaultForm(el) {
3061			var ch_lang = getLang($(el + ' [form-idx]'), b.SID);
3062    		var type2 = $(el).attr('data-type2');
3063			
3064			$(el + ' [form-idx]').val('');
3065			$(el + ' [form-idx]').find('.form-date').val('');
3066			$(el + ' [form-idx]').find('.form-date').removeAttr('style')
3067			$(el).find('input:checkbox').removeAttr('checked');
3068			$(el).find('input:radio').removeAttr('checked');
3069			$(el).find('.checkbox-inline').removeClass('checked');
3070    		$(el).find('.radio-inline').removeClass('checked');
3071			$(el + ' [form-type="file.upload"]').find('label .file-uploaded-number').text('(0/10)');
3072			$(el + ' [form-type="file.upload"]').find('input[type="file"]').val('');
3073            $(el + ' [form-type="file.upload"]').find('input[type="text"]').val('');
3074            $(el + ' [form-type="file.upload"]').find('.file-title').text($.lang[ch_lang]['form.file.nofile']);
3075
3076            if($(el + ' [form-type="file.upload"]').find('.file-row').length > 0) {
3077            	$(el + ' [form-type="file.upload"]').find('.file-row').remove();
3078            	$(el + ' [form-type="file.upload"]').find('.file-uploaded-number').text('(0/10)');
3079		    	$(el + ' [form-type="file.upload"]').find('.file-title').removeClass('hide');
3080            }
3081
3082            if(type2 == 'form' && $(el).attr('data-captcha') != 'false' && $(el).find('input.input-captcha').length > 0) {
3083            	$(el).find('input.input-captcha').val('');
3084            	load_form_kcaptcha($(el), $(el).attr('data-id'));
3085            }
3086
3087            if($(el).attr('data-type2') == 'franchise bar') {
3088		        $(el).find('.view-privacy').removeClass('active');
3089		        $(el).find('.franchise-form-select').each(function() {
3090		            var defaultText = $(this).attr('form-name') || $(this).find('select.franchise-form-select-native option:first').text();
3091		            $(this).find('select.franchise-form-select-native').val('');
3092		            $(this).find('.franchise-form-select-label').text(defaultText).removeClass('selected');
3093		            $(this).find('.dropdown-menu li').removeClass('active');
3094		        });
3095		        // $(el).find('.form-privacy textarea').hide();
3096		    }
3097		}
3098
3099		function setDefaultContactForm(el) {
3100			$(el + ' [data-contact-firstname]').val('');
3101			$(el + ' [data-contact-lastname]').val('');
3102			$(el + ' [data-contact-email]').val('');
3103			$(el + ' [data-contact-website]').val('');
3104			$(el + ' [data-contact-phone]').val('');
3105			$(el + ' [data-contact-subject]').val('');
3106			$(el + ' [data-contact-message]').val('');
3107			$(el).find('input:checkbox').removeAttr('checked');
3108			$(el).find('input:radio').removeAttr('checked');
3109			$(el + ' [form-type="file.upload"]').find('input[type="file"]').val('');
3110            $(el + ' [form-type="file.upload"]').find('input[type="text"]').val('');
3111            $(el + ' [form-type="file.upload"]').find('.file-title').text("첨부된 파일이 없습니다.");
3112
3113			if($(el).attr('data-captcha') == 'true' && $(el).find('input.input-captcha').length > 0) {
3114				$(el).find('input.input-captcha').val('');
3115				$(el).find('.form-captcha .error').remove();
3116				load_form_kcaptcha($(el), $(el).attr('data-id'));
3117			}
3118		}
3119
3120		function setDefaultContactFormEtc(el) {
3121			$(el).find('[data-contact-etc]').each(function(i) {
3122				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');
3123				
3124				var input_type = ['text','email','number','tel','url'];
3125				if($.inArray(type,input_type)) {
3126					$(this).val('');
3127				} else if(type == "checkbox") {
3128					$(this).removeAttr('checked');
3129				} else if(type == "radio") {
3130					$(this).find('input:radio').first().click();
3131				} else if(type == "selectbox") {
3132					if($(this).find('option').length > 0) {
3133						$(this).find('option:first').attr('selected','selected');
3134					} else {
3135						$(this).find('.active').removeClass('active');
3136						$(this).find('li').first().addClass('active');
3137					}
3138				}
3139			});
3140		}
3141
3142		var ieLineClamp = function() {
3143		    if(isIE()) {
3144		        $('[data-ie-clamp]').each(function(index, element) {
3145		            var clamp = $(this).attr('data-ie-clamp').split(','),
3146		                line = new Array();
3147
3148		            $.each(clamp,function(k,v) {
3149		                line.push(v);
3150		            });
3151
3152		            for(i=line.length; i<3; i++) line[i] = 0;
3153		            var idx = getScreenIndex();
3154		            var apply = line[idx];
3155
3156		            // console.log($(element).text());
3157		            //safeClamp(element, apply);
3158		            $clamp(element, {clamp:apply, useNativeClamp:false });
3159		        });
3160		    }
3161		}
3162
3163		var safeClamp = function (selector, lines) {
3164			lines = lines || 3; // a default
3165			$(selector).each( function() {
3166				if($(this).text()) {
3167					$clamp( this, { clamp: lines, useNativeClamp:false  });
3168				}
3169			});
3170		}
3171
3172		$('.data-page-back, .toolbar-btn.back').live({
3173		    click : function() {
3174				var pPage = b.PARENT.page;
3175				var page = b.PAGE.split(',');
3176				var inMenu = ($.inArray(pPage,b.MENULIST) == -1 && page[0] != '_product') ? false : true;
3177
3178				if(!inMenu) {
3179					$(this).showModalFlat('INFORMATION','이동할 수 없습니다',true,false,'','ok');
3180					return false;
3181				} else {
3182					setGalleryReturnItemCookie(b.PARENT);
3183					if($.cookie('gallery') !== undefined && $.cookie('gallery') == 'all_products') {
3184						var c_g_p = (typeof $.cookie('gallery-page-all_products') != 'undefined') ? $.cookie('gallery-page-all_products') : 1;
3185				    	$.cookie('gallery', 'all_products', { path: '/', expires: 12 * 60 * 60 * 1000 });
3186				    	$.cookie('loadmore-all_products', c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
3187
3188				    	var url_replace = (b.URL == '/') ? '' : b.URL;
3189				    	if(b.ONE) {
3190				    		_this.history.pushState(null,b.TITLE,url_replace + '/index#전체상품');
3191				    	} else {
3192				    		_this.history.pushState(null,b.TITLE,url_replace + '/전체상품');
3193				    	}
3194					} else {
3195						var c_g_p = (typeof $.cookie('gallery-page-' + b.PARENT.pid) != 'undefined') ? $.cookie('gallery-page-' + b.PARENT.pid) : 1;
3196				    	$.cookie('gallery',b.PARENT.pid, { path: '/', expires: 12 * 60 * 60 * 1000 });
3197				    	$.cookie('loadmore-' + b.PARENT.pid, c_g_p, { path: '/', expires: 12 * 60 * 60 * 1000 });
3198				    	
3199				    	var url_replace = (b.URL == '/') ? '' : b.URL;
3200				    	if(b.ONE) {
3201				    		_this.history.pushState(null,b.TITLE,url_replace + '/index#' + b.PARENT.page);
3202				    	} else {
3203				    		var page = b.PAGE.split(',');
3204				    		if(page[1]=='template') {
3205					    		_this.history.pushState(null,b.TITLE,url_replace + '/' + page[0]);
3206				    		} else {
3207					    		_this.history.pushState(null,b.TITLE,url_replace + '/' + b.PARENT.page);
3208				    		}		    		
3209				    	}
3210					}
3211					
3212			    }
3213		    }
3214		});
3215
3216	    $('#config-mode-view').click(function() {
3217	    	location.href = '//' + b.HOST + b.REFERER;
3218	    });
3219
3220		$('body')
3221			.on('click','.mini-home, #goto-top, #quick-menu-top', function(event) { 
3222				event.preventDefault(); 
3223				$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3224			})
3225			.on('click','#quick-menu-bottom', function(event) { 
3226				event.preventDefault(); 
3227				$('body,html').animate({scrollTop: document.body.scrollHeight}, 900,'easeInOutQuart'); 
3228			});
3229
3230		var moveGallerySibling = function(seq, gallerySettings, page) {
3231			var settings = {};
3232			if(gallerySettings) {
3233				try {
3234					settings = (typeof gallerySettings == 'string') ? $.parseJSON(gallerySettings) : gallerySettings;
3235				} catch(e) {
3236					settings = {};
3237				}
3238			}
3239
3240			var glink = (settings && settings.glink) ? settings.glink : '';
3241			if(!glink || b.PARENT.mode != 'project') {
3242				var url_replace = (b.URL == '/') ? '' : b.URL;
3243				_this.history.pushState(null,b.TITLE,url_replace + '/' + page + '/view/' + seq);
3244				return;
3245			}
3246
3247			try {
3248				if(checkBase64Encode(decodeURIComponent(glink))) glink = Base64.decode(decodeURIComponent(glink));
3249				else if(checkBase64Encode(glink)) glink = Base64.decode(glink);
3250			} catch(e) {
3251				if(checkBase64Encode(glink)) glink = Base64.decode(glink);
3252			}
3253
3254			var target = (settings.glink_target == '_blank') ? '_blank' : '';
3255			var linkModal = $(this).showModalFlat(
3256				$.lang[LANG]['config.information'],
3257				$.lang[LANG]['gallery.sibling.link.confirm'],
3258				true,
3259				true,
3260				function() {
3261					var linkUrl = makeLinkUrl(glink, b.ONE, b.VIEW);
3262					var $link = $('<a></a>').attr('href', linkUrl).css('display', 'none');
3263
3264					if(glink.match(/^\@/g) !== null) {
3265						$link.attr('attr-bookmark', glink.replace(/^\@/g, ''));
3266					} else if(glink.match(/^flink\@[0-9]/gi) !== null) {
3267						$link.attr('attr-flink', glink.replace(/^flink\@/gi, ''));
3268					} else if($.inArray(glink.replace(/^\//g, '').replace(/ /g, '-'), b.MENULIST) > -1) {
3269						$link.attr('data-user-link', linkUrl);
3270					} else {
3271						$link.attr('attr-link', glink);
3272					}
3273
3274					if(target) $link.attr('target', target);
3275					$('body').append($link);
3276					$link[0].click();
3277					setTimeout(function() { $link.remove(); }, 0);
3278					linkModal.modal('hide');
3279				},
3280				'cancel',
3281				'ok'
3282			);
3283		};
3284
3285		$('.data-page-prev').live({
3286		    click : function(e) {
3287		        var page = b.PAGE.split(',');
3288		    	if(!$(this).hasClass('active') || b.PARENT.prev === null) return false;
3289		    	if(typeof b.PARENT.page == 'string' && $.inArray(b.PARENT.page,b.MENULIST) == -1 && page[0] != '_product') return false;
3290		    	if(b.PARENT.prev)
3291					moveGallerySibling(b.PARENT.prev, b.PARENT.prev_gsettings, page[0]);
3292		    }
3293		});
3294
3295		$('.data-page-next').live({
3296		    click : function() {
3297		        var page = b.PAGE.split(',');
3298		    	if(!$(this).hasClass('active') || b.PARENT.next === null) return false;
3299		    	if(typeof b.PARENT.page == 'string' && $.inArray(b.PARENT.page,b.MENULIST) == -1 && page[0] != '_product') return false;
3300		    	if(b.PARENT.next)
3301					moveGallerySibling(b.PARENT.next, b.PARENT.next_gsettings, page[0]);
3302		    }
3303		});
3304
3305		// [oldver Menu nav link] Click
3306		$(`#tpl-menu.nav > li:not(.siteUM,.siteLANG) a:not([href="javascript:;"]):not([href*="flink@"]),
3307			.cl-moption > .cl-moption-col > .cl-moption-row > a:not([href="javascript:;"]):not([href*="flink@"]),
3308			.el-menu header.navbar a#site-home
3309		`).live({
3310		    click : function(e) {
3311		    	e.preventDefault();
3312				if(typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple')) { 
3313					return false; 
3314				}
3315				if(typeof $(this).attr('data-toggle') != 'undefined') { return false; }
3316
3317				$.each($.cookie(), function(i,v) {
3318					if(i.indexOf('gallery-category-') > -1) {
3319						var gallery_seq = i.replace('gallery-category-','');
3320						var gcate_home = (typeof $.cookie('gallery-catehome-' + gallery_seq) == 'undefined') ? '' : $.cookie('gallery-catehome-' + gallery_seq);
3321						$.cookie(i, gcate_home, { path : '/', expires: 12 * 60 * 60 * 1000 });
3322					}
3323					if(i.indexOf('gallery-page-') > -1) $.cookie(i, 1, { path : '/', expires: 12 * 60 * 60 * 1000 });
3324					if(i.indexOf('loadmore-') > -1) $.cookie(i, 1, { path : '/', expires: 0 });
3325				});
3326
3327				$.removeCookie('gallery', { path: '/' });
3328				$.removeCookie('gallery-item', { path : '/' });
3329				$.removeCookie('forum', { path : '/' });
3330				$.removeCookie('forum-item', { path : '/' });
3331
3332				var isClickMoption = ($(this).closest('.cl-moption-col').length > 0) ? true : false;
3333				var isClickSiteHome = (typeof $(this).attr('id') != 'undefined' && $(this).attr('id') == 'site-home') ? true : false;
3334
3335				var menuVer06 = ($('.el-menu .cl-menu-option').length > 0) ? true : false;
3336				var menuVer03 = ($('.el-menu > header').hasClass('navbar-fheader')) ? true : false;
3337				var menuVer02 = (!menuVer03 && $('.el-menu > header').hasClass('navbar-simple')) ? true : false;
3338				var menuVer01 = (!menuVer03 && !menuVer02) ? true : false;
3339
3340				if($('body').width() < 769)  {
3341					var clickNavbarToggle = ( (menuVer03 && $('.navbar-toggle').css('visibility') == 'hidden') && !isClickSiteHome ||
3342											  (menuVer02 && !isClickSiteHome) ||
3343											  menuVer01
3344											) ? true : false;
3345					if(clickNavbarToggle) $('.navbar-toggle').click();
3346				}
3347
3348				if(isClickMoption && !property.ONE) $(this).closest('header').find('.cl-menu-option').removeClass('open');
3349				if(!isClickSiteHome) {
3350					if($(this).hasClass('loginout')) {
3351						if(b.URL == '/render') {
3352							$(this).showModalFlat('INFORMATION','미리보기에서는 제공되지 않습니다.',true,false,'','ok');
3353							return false;
3354						}
3355						$('#loginModal').modal('show');
3356						$('#loginModal').css('z-index',1042);
3357						$('.modal-backdrop.fade.in').css('z-index', 1041);
3358					} else {
3359						$('#tpl-menu li').removeClass('active').removeClass('open');
3360						$(this).parent().addClass('active');
3361
3362						if($(this).closest('.dropdown-menu').length>0) {
3363							if($('body').width() > 768) {
3364								$(this).closest('.dropdown').addClass('active').siblings().removeClass('active');
3365							} else {
3366								if(menuVer03) {
3367									$(this).closest('.menu-has-children').addClass('open').siblings().removeClass('open');
3368									$('#tpl-menu .menu-has-children:not(.open) ul.dropdown-menu').hide();
3369								} else {
3370									$(this).closest('.dropdown').addClass('open').siblings().removeClass('open');
3371									$('#tpl-menu .dropdown:not(.open) ul.dropdown-menu').hide();
3372								}
3373							}
3374						} else {
3375							if(menuVer03) $('#mobile-nav li.menu-has-children ul.dropdown-menu').hide();
3376							else {
3377								if($('body').width() < 768) $('#tpl-menu li.dropdown ul.dropdown-menu').hide();
3378							}
3379						}
3380
3381						if(menuVer06) {
3382							$('.el-menu .cl-moption-row').removeClass('active');
3383							if($(this).is(':not([attr-bookmark])')) {
3384								$(this).closest('.cl-moption-row').addClass('active');
3385								if($(this).closest('.cl-moption-row[data-parent]').length > 0) $(this).closest('.cl-moption-col').find('.cl-moption-row:not([data-parent])').addClass('active');
3386							}
3387						}
3388					}
3389				}
3390
3391				var loc = $(this).attr('href');
3392				var uri = (b.PUBLISH) ? loc : loc.replace('/render/','');
3393				var bookmark = $(this).attr('attr-bookmark');
3394				if(typeof bookmark !='undefined' && bookmark) return false;
3395
3396				var blank = $(this).attr('target');
3397				if(typeof blank != 'undefined' && (blank == '_blank' || blank == 'blank')) {
3398					window.open(loc);
3399					e.stopPropagation();
3400					return false;
3401				}
3402
3403				if(loc.match('^(mailto:|tel:|sms:|callto:|facetime:|skype:|sip:)')) {
3404					window.location.href = loc;
3405					return false;
3406				}
3407
3408				if(b.ONE!='1') {
3409					if(loc == 'javascript:;') return false;
3410
3411					if(uri == '/render' || uri == '/') {
3412						uri = b.MENULINK[0];
3413						$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3414					}
3415
3416					if(loc.match(/\@/g) === null && loc.match(/\//g) === null || loc.match(/\?clgc\=/g) !== null) {
3417						window.location.href = loc;
3418						return false;
3419					}
3420					var url = new getLocation(loc);
3421					golink(_this,url);
3422					// _this.history.pushState(null,b.TITLE,(b.PUBLISH) ? "/" + uri : "/render/" + uri);
3423				} else {
3424					if(loc == 'javascript:;') loc = '#';
3425
3426					var hash = '';
3427					if(_this.b.PUBLISH) {
3428						if(loc.indexOf('/index/view/') > -1 && b.ONE) ;
3429						else loc = loc.replace('/index','');
3430					} else {
3431						if(loc.indexOf('/index/view/') > -1 && b.ONE) ;
3432						else loc = loc.replace('/render/index','');
3433					}
3434					hash = loc;
3435
3436					var fstr = loc.charAt(0);
3437					var pathname = window.location.pathname;
3438					switch(fstr) {
3439						case '#':
3440							if(_this.b.PAGE == 'index') {
3441								if(pathname.charAt(1) == '_' && pathname.match(/^\/\_lang\//gi) === null) {
3442									loc = (_this.b.PUBLISH) ? '/'+loc : '/render/'+loc;	
3443									window.location.href = loc;
3444								} else {
3445									if($(this).hasClass('mini-home')) {
3446										$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3447										history.pushState('', '', hash);
3448										return false;
3449									}
3450									var urlType = (b.PUBLISH) ? '/index' : '/render';
3451									_this.history.pushState(null,b.TITLE,urlType + hash);
3452								}
3453							} else {
3454								loc = (_this.b.PUBLISH) ? '/index' : '/render/index';
3455								_this.history.pushState(null,b.TITLE,loc);
3456								history.pushState('', '', loc + hash);
3457							}
3458							break;
3459						case '@':
3460
3461							break;
3462						case '/':
3463							if(loc == '/render' || loc == '/') {
3464								loc = (_this.b.PUBLISH) ? '/index' : '/render/index';	
3465								$('body,html').animate({scrollTop: 0}, 900,'easeInOutQuart'); 
3466							}
3467							
3468							var url = new getLocation(loc);
3469							golink(_this,url);
3470							break;
3471						default:
3472							// var url = new getLocation(loc);
3473							// golink(_this,url);
3474							window.location.href = loc;
3475							break;
3476					}
3477	
3478					// window.location.href = loc;
3479				}
3480			}
3481		});
3482
3483		// [oldver Menu nav link] Click (onepage)
3484		$(`.nav li a[href*=#]:not([href="javascript:;"]), 
3485			.cl-moption > .cl-moption-col > .cl-moption-row > a[href*=#]:not([href="javascript:;"])
3486		`).live({
3487		    click : function(e) {
3488				if(typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple')) {
3489					e.preventDefault();
3490					return false;
3491				}
3492		        menuClickMove = true;
3493
3494		        var link = $(this).attr('href').replace('#','');
3495		        if(link.substring(0,1) == '/') link = link.substring(1,link.length);
3496		        if(b.MENULINK.indexOf(link) > -1) moveLinkPage(link);
3497		    }
3498		});
3499
3500		$('.navbar-simple .nav li a .fa').live('click', function(e) {
3501			if($(this).closest('header').hasClass('navbar-simple')) {
3502				$(this).closest('a').next('ul.dropdown-menu').slideToggle(200).closest('li').toggleClass('open').siblings().removeClass('open').find('ul.dropdown-menu').slideUp(200);
3503				e.preventDefault();
3504				return false;
3505			} 
3506		});
3507
3508		$('.navbar-simple .nav li a.dropdown-toggle[href="javascript:;"]').live('click', function(e) {
3509			e.preventDefault();
3510			if($('body').width() < 768) $(this).find('.fa').click();
3511			return false;
3512		});
3513
3514		$('body').on('click', '.micon', function(e) { $('#goto-top').removeClass('show'); });
3515
3516		$('body').on('touchstart.dropdown.data-api, click','header .siteUM-dmenu-wrap, header .siteLANG-dmenu-wrap', function(e) {
3517			if(e.target.className.indexOf('siteUM-dmenu-wrap') > -1 || e.target.className.indexOf('siteLANG-dmenu-wrap') > -1) {
3518				if($(this).hasClass('open')) {
3519					$(this).removeClass('open');
3520					$('#goto-top').addClass('show');
3521				}
3522			} 
3523		});
3524
3525		$('body').on('touchstart.dropdown.data-api, click', 'header.navbar-simple .navbar-collapse.in', function(e) {
3526			if(e.target.className.indexOf('navbar-collapse') > -1) {
3527				$('.navbar-toggle').click();
3528			}
3529		});
3530
3531
3532		$('.fr-custom-button[data-external-link], .fr-fic[data-external-link]').live({
3533			click: function() {
3534				if($(this).is('[data-external-link=""]')) return false;
3535				var link = $(this).attr('data-external-link');
3536				if($(this).attr('target') != '_blank') {
3537					location.href = link;
3538				} else {
3539					window.open(link);
3540				}
3541			}
3542		});
3543
3544		$('[data-type="gallery"] [data-loop="true"] > .grid').live({
3545			touchstart: function() {
3546				galleryStartHover();
3547			},
3548			touchend: function() {
3549				galleryCloseHover();
3550			},
3551			click: function() {
3552				galleryMovelink();
3553			}
3554		});
3555
3556		$(document).on('click','.cl-gtoolbar .cl-gcate-item > a, .cl-gtoolbar .cl-gsort-item > a', function(e) {
3557			var $clickTarget = $(this);
3558			var $clickItem = $clickTarget.closest('.cl-gcate-item, .cl-gsort-item');
3559			var $clickList = $clickTarget.closest('.cl-gcate-list, .cl-gsort-list');
3560			var $clickNav = $clickTarget.closest('.cl-gcate, .cl-gsort');
3561			var $clickGToolbar = $clickTarget.closest('.cl-gtoolbar');
3562			var $clickBlock = ($clickGToolbar.closest('.elem').length > 0) ? $clickGToolbar.closest('.elem').find('.element[data-type="gallery"]') : $clickGToolbar.closest('.element[data-type="gallery"]');
3563
3564			var isCategory = $clickNav.is('.cl-gcate');
3565			var isSort = $clickNav.is('.cl-gsort');
3566
3567			if ($clickItem.hasClass('active')) return;
3568
3569			if(isCategory) {
3570				if($clickNav.hasClass('empty')) {
3571					$clickTarget.blur();
3572					return false;
3573				}
3574
3575				if($clickItem.hasClass('total')) {
3576					return false;
3577				}
3578			}
3579
3580			$clickItem.addClass('active').siblings().removeClass('active');
3581			if(isSort) {
3582				var click_label = $clickTarget.text().trim();
3583				$clickGToolbar.find('.cl-gsort-active').html(click_label);
3584				$clickNav.removeClass('open');
3585			}
3586		
3587			var pid = $clickBlock.attr('data-id');
3588			var idx = $clickTarget.attr('data-idx');
3589			var orderby = $clickGToolbar.find('.cl-gsort-item.active > a').attr('data-orderby') || 'recent';
3590			var sfl = 'category';
3591			var stx = $clickGToolbar.find('.cl-gcate-item.active > a').not('[data-idx="0"]').text() || '';
3592
3593			if (pid == 'all_products') {
3594				sfl = 'orderby';
3595				stx = $(this).attr('data-orderby');
3596				orderby = stx;
3597			}
3598
3599			$('#el-empty').empty();
3600			$('#el-empty').after('<div class="gallery-empty"></div>');
3601
3602			var val = _this.galleryEL[pid];
3603			var tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES');
3604			var elsettings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
3605			var block_lang = ($(tag).attr('data-blocklang')) ? $(tag).attr('data-blocklang') : LANG;
3606			var checkGalleryListSample = false;
3607			var checkGalleryListEmpty = true;
3608
3609			$('#el-empty').append($(tag));
3610			$('#el-empty').find('[data-loop="true"]').html('');
3611
3612			var nodes = $(tag).find('[data-loop="true"]').children('.grid');
3613			initGalleryField(nodes);
3614	
3615			var g_number = $(tag).find("[data-loop='true']").data('gallery-no');
3616			var view = $(tag).find('[data-loop="true"]').data('view');
3617			var p = $('#el-empty').children();
3618			var i = [];
3619			var total = 0;
3620			var display = 0;
3621
3622			var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
3623			var glm = $(tag).find('.loadmore-wrap');
3624
3625			if(typeof view == 'undefined') view = 10;
3626			var cookie_page = 1;
3627			var cookie_view = view;
3628			var cookie_gallery_category = (typeof stx != 'undefined') ? stx : '';
3629			var is_gc_cookie = (typeof $.cookie('gallery-category-'+val.seq) != 'undefined' && $.cookie('gallery-category-'+val.seq).length > 0) ? true : false;
3630			var cookie_gallery_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
3631
3632			// $.cookie('gallery',val.seq, { path: '/', expires: 12 * 60 * 60 * 1000 });
3633			// $.cookie('loadmore-' + val.seq, cookie_page, { path: '/', expires: 12 * 60 * 60 * 1000 });
3634			$.cookie('gallery-page-' + val.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
3635			$.cookie('gallery-category-' + val.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
3636			$.cookie('gallery-orderby-' + val.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
3637			$.removeCookie('loadmore-' + val.seq, { path : '/' });
3638			$.removeCookie('gallery', { path : '/' });
3639
3640			$('.galleryPL'+val.seq).find('[data-loop="true"]').empty();
3641
3642			var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false;
3643			var checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof elsettings.gframe_title_visible != 'undefined' && elsettings.gframe_title_visible == 'OFF')) ? true : false;
3644
3645			var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
3646			var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
3647
3648			$.ajax({
3649				url: '/template/gallery/list/pid/' + val.seq + '/sid/' + b.SID + '/spage/' + b.PAGE + '/view/' + cookie_view + '/publish/' + b.PUBLISH + param,
3650				data: { g_mode: val.mode, visible: true, sfl: sfl, stx: stx, orderby: cookie_gallery_orderby },
3651				dataType: 'json',
3652				type: 'POST',
3653				async: false,
3654				cache: false,
3655				success: function (data) {
3656					$.each(data.list, function (idx, value) {
3657						i.push(value);
3658					});
3659
3660					total = (typeof data.total.list_total != 'undefined') ? data.total.list_total : data.total;
3661					display = data.list.length;
3662
3663					if( total > 0 ) checkGalleryListEmpty = false;
3664					if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
3665						var loop_count = nodes.length, item_index = 0;
3666						var elem = [];
3667						$.each(data.list,function(index,v) {
3668							loop_pos = index%loop_count;
3669							c = nodes[loop_pos];
3670							var isTitle = (v.title.length > 0) ? true:false;
3671
3672							$(c).find('.non_text').removeClass('non_text');
3673							if(val.mode != 'shopping') {
3674								if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
3675								if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
3676							}
3677
3678							v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
3679							v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
3680
3681							$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
3682
3683							var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
3684								img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
3685								img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
3686
3687							var folder = (val.folder == 0) ? '' : val.folder + '/',
3688								src = getServeImage(v.image,val.folder,img_path),
3689								src_s0 = getServeImage(v.image,'0',img_path);
3690							if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
3691							ensureGalleryResponsiveImageClass($(c));
3692							if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
3693							if(checkGallerySVG) {
3694								var gimgSVG = $(c).find('.gimg-svg-wrap svg');
3695								gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+index);
3696								gimgSVG.find('image').attr('xlink:href', src);
3697								gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+index+')');
3698							}
3699							
3700							var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
3701								glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
3702
3703							if(glink) {
3704								if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
3705									var bookmark_seq = glink.replace(/^\@/g,'');
3706									if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
3707										glink = '';
3708										glink_target = '';
3709									}
3710								} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
3711									glink_target = '';
3712								} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
3713								} else {																					// link-type: link-out      ==> a[attr-link]
3714									if(checkBase64Encode(glink)) glink = Base64.decode(glink);
3715								}
3716							}
3717
3718							$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
3719							if (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON' && property['SITEUM'] >= 1) {
3720								$(c).addClass('gallery-item').addClass('nonePrice');
3721								$(c).find('a').attr('href', '#');
3722							} else {
3723								if(glink) {
3724									var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
3725									$(c).find('a').attr('href',glink_val);
3726
3727									if(glink.match(/^\@/g)) {
3728										$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
3729									} else if(glink.match(/^flink\@[0-9]/g) !== null) {
3730										$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
3731									// IE ERROR_includes__H.20210603
3732									// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
3733									} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
3734										$(c).find('a').attr('data-user-link',glink_val);
3735									} else {
3736										$(c).find('a').attr('attr-link',glink);
3737									}
3738								} else {
3739									if (val.mode == 'gallery') {
3740										src_s0 = src_s0 + '?gpos='+v.pos;
3741
3742										$(c).find('a').attr('href', src_s0);
3743										$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
3744									} else {
3745										if(val.seq == 'all_products') {
3746											$(c).find('a').attr('href', v.product_url);
3747										} else {
3748											if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
3749											else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
3750			
3751											// $(c).find('a').attr('href', ((URI=='/') ? '' : URI) + '/' + b.PAGE + '/view/' + v.seq);
3752										}
3753									}
3754								}
3755							}
3756
3757							if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
3758							else $(c).find('a').removeAttr('target');
3759
3760							if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
3761							else $(c).find('a').attr('data-title', v.title);
3762
3763							// caption
3764							var ftitle = $(c).find('h5.figure'),
3765								fcaption = $(c).find('p.figure').not('.comment'),
3766								fdatetime = $(c).find('.figure.datetime'),
3767								fhashtag = $(c).find('.figure.hashtag'),
3768								fbrand = $(c).find('.figure.brand'),
3769								fprice = $(c).find('.figure.price'),
3770								freview = $(c).find('.figure.review'),
3771								fcomment = $(c).find('.figure.comment'),
3772								flike = $(c).find('.figure.like'),
3773								fbasket = $(c).find('.figure.basket');
3774
3775							$(c).find('figcaption').removeClass('hide');
3776							if (v.title || v.caption) {
3777								var gallery_caption = v.caption;
3778								gallery_caption = gallery_caption.replace(/\n/g,'<br />');
3779
3780								ftitle.html(v.title);
3781								fcaption.html(gallery_caption);
3782								if(fdatetime.length > 0) fdatetime.text(v.datetime);
3783								if(fhashtag.length > 0) fhashtag.text(v.hashtag);
3784							}
3785
3786							if(g_number) {
3787								var g_index = String(index + 1),
3788									g_num = g_index.padStart(g_number, '0');
3789								$(c).find('.figure.number').text(g_num);
3790							}
3791
3792							if(fbrand.length > 0) {
3793								var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
3794								fbrand.html(v.brand_name);
3795							}
3796
3797							if(val.mode == 'shopping' || val.seq == 'all_products') {
3798								fcomment.addClass('hide');
3799								flike.addClass('hide');
3800								v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
3801								v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
3802								var checkPriceHidden = (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON') ? true : false,
3803									gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
3804									gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
3805									gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
3806									product_soldout = '품절',
3807									product_no_sale = (typeof elsettings.sh_soldout == 'string') ? elsettings.sh_soldout : '구매불가',
3808									product_status = '';
3809								if(v.status == 'off' && !checkPriceHidden) {
3810									product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
3811								} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
3812									product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
3813								}
3814								$(c).find('.cl-sh-soldout').remove();
3815								if(product_status != '') $(c).attr('data-soldout',true);
3816								else $(c).removeAttr('data-soldout');
3817
3818								$(c).find('.product-badge').remove();
3819								product_status += drawBadgeList(v.use_badge, data.badge_settings);
3820
3821								$(c).find('.cl-sh-limit').remove();
3822								if(v.status == 'lim') {
3823									if(v.sale_now == false) {
3824										var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
3825										if(freview.length > 0) {
3826											freview.after(product_limit);
3827										} else {
3828											$(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
3829										}
3830									}
3831								}
3832
3833								if($(c).find('ul.figure.price').length > 0) {
3834									// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
3835									// 	off_str = (price_off > 0) ? price_off + '% ' : ''
3836									var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
3837									if(!_this.b.LUX) off_str = gallery_sale_per;
3838									//Ver2
3839									if(!checkPriceHidden) {
3840										$(c).find('ul.figure.price .price-val').html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
3841										$(c).find('ul.figure.price .price-val').removeClass('hide');
3842
3843										if(gallery_sale_price > 0 && gallery_price  < gallery_sale_price) {
3844											$(c).find('ul.figure.price .price-sale').html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
3845											$(c).find('ul.figure.price .price-sale-per').html(off_str);
3846											$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').removeClass('hide');
3847											if(_this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
3848												$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
3849											}
3850										} else {
3851											$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').addClass('hide').html('');
3852										}
3853
3854										$(c).find('ul.figure.price .price-unit-pricing').remove();
3855										if(v.product_unit_str) {
3856											$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
3857										}
3858									} else {
3859										$(c).find('ul.figure.price .price-val').html('₩0');
3860										$(c).find('ul.figure.price .price-val').addClass('hide');
3861									}
3862									if(val.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
3863									if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
3864
3865									var badge_size = getBadgeSize(data.badge_settings);
3866									$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
3867									$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
3868									if(badge_size) {
3869										$(c).find('.cl-sh-soldout').addClass(badge_size);
3870										$(c).find('.cl-sh-limit').addClass(badge_size);
3871									}
3872								} else {
3873									//Ver1
3874									if(fprice.length == 0) fprice = fcaption;
3875									
3876									if(checkPriceHidden) fprice.html('');
3877									else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
3878								}
3879
3880								if($(c).find('ul.figure.review').length > 0) {
3881									var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
3882									if(gallery_review > 0) {
3883										$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
3884										$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
3885										$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
3886									} else {
3887										$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
3888										$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
3889									}
3890								}
3891
3892								if(fbasket.length > 0) {
3893									var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
3894										checkOldverBasket = (typeof elsettings.field_oldver != 'undefined' && elsettings.field_oldver && elsettings.field_oldver.indexOf('basket') > -1) ? true : false,
3895										checkDisabledBasket = (typeof elsettings.field_disable != 'undefined' && elsettings.field_disable && elsettings.field_disable.indexOf('basket') > -1) ? true : false;
3896									if(v.basket_off) fbasket.addClass('cannotby hide');
3897									else if(val.seq == 'all_products') fbasket.removeClass('hide');
3898									else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
3899									else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
3900									else fbasket.removeClass('hide');
3901								}
3902
3903							} else {
3904								fbrand.addClass('hide');
3905								fprice.addClass('hide');
3906								freview.addClass('hide');
3907								fbasket.addClass('hide');
3908
3909								if ( checkUseComment 
3910									&& elsettings.comment_display == 'ON'
3911									&& !(elsettings.field_disable !== undefined && elsettings.field_disable.indexOf('comment') > -1)
3912									&& fcomment.length > 0
3913									&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
3914								) {
3915									fcomment.removeClass('hide');
3916									fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
3917								} else {
3918									fcomment.addClass('hide');
3919									fcomment.find('.figure-comment-cnt').empty();
3920								}
3921	
3922								if ( checkUseLike 
3923									&& (elsettings.like_display !== undefined && elsettings.like_display != 'N')
3924									&& !(elsettings.field_disable !== undefined && elsettings.field_disable.indexOf('like') > -1)
3925									&& flike.length > 0
3926								) {
3927									flike.removeClass('hide').find('.figure-like-cnt').html(0);
3928									if(v.like !== undefined) {
3929										flike.find('.figure-like-cnt').html(v.like.cnt);
3930										if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
3931									}
3932								} else {
3933									flike.addClass('hide');
3934								}
3935							}
3936							
3937							if(checkUseLike == false) flike.html('');
3938
3939							if(val.mode == 'gallery') {
3940								if(index < cookie_view) {
3941									$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
3942								} else {
3943									$(c).find('figure').remove();
3944									$('.galleryPL'+val.seq).find('[data-loop="true"]').append($(c)[0].outerHTML);
3945								}
3946								if (total == 2) {
3947									$(c).find('figure').remove();
3948									$('.gallery-empty').append($(c)[0].outerHTML);
3949								}
3950							} else {
3951								$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
3952							}
3953						});
3954					} else {
3955						if(idx == '0') {
3956							checkGalleryListSample = true;
3957							nodes.find('a')
3958								.addClass('emptyGalleryItem')
3959								.attr('href', '/config/page/' + b.PAGE + '/view/template')
3960								.removeAttr('data-gallery')
3961								.removeAttr('data-user-link')
3962								.removeAttr('attr-bookmark')
3963								.removeAttr('attr-flink')
3964								.removeAttr('attr-link')
3965								.find('img')
3966								.attr('data-index',0);
3967							$(p).find('[data-loop="true"]').append(nodes);
3968						}
3969
3970						$.cookie('gallery-category-'+val.seq,'',{ path: '/', expires: 12 * 60 * 60 * 1000 });
3971						$.cookie('gallery-orderby-' + val.seq, '', { path: '/', expires: 12 * 60 * 60 * 1000 });
3972					}
3973					if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
3974					tag = $(p)[0].outerHTML;
3975
3976					if (val.mode == 'gallery' && total == 2) {
3977						$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
3978							var gallerySeq = $(v).attr('data-seq');
3979							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));
3980						});
3981					}
3982			
3983					if (val.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), val.seq, val.type, val.elsettings);
3984					$('#el-empty').empty();
3985					$('.gallery-empty').remove();
3986				}
3987			});
3988
3989			var $tag = $(tag);
3990			var $galleryEL = $('.element[data-id="' + val.seq + '"]');
3991			var g_settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
3992
3993			changeBrokenImages($tag);
3994			$.each($tag.find('[data-edit="true"]'), function() {
3995				var source = $(this).html();
3996				source = source.replace(/&lt;&nbsp;/g,'&lt;').replace(/&nbsp;&gt;/g,'&gt;');
3997				$(this).html(source);
3998			});
3999
4000
4001			if(total > 0) $galleryEL.find('[data-loop="true"]').replaceWith($tag.find('[data-loop="true"]'));
4002			else $galleryEL.find('[data-loop="true"]').empty();
4003			if(checkGalleryListSample && total == 0) $gallery_items.find('.emptyGalleryItem').attr('data-gallery','');
4004			showHideGalleryField($galleryEL, g_settings);
4005			reloadBlockMasonry('init',$galleryEL);
4006
4007			var $glmBtnWrap = $galleryEL.find('.loadmore-wrap');
4008			var $glmBtn = $galleryEL.find('.loadmore-wrap .gallery-loadmore');
4009			var checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false;
4010			var glm_lang = LANG;
4011			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();
4012			else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
4013			var glm_txt = $.lang[glm_lang]['config.loadmore'];
4014
4015			if($glmBtnWrap.length == 0) {
4016				// gallery loadmore btn - default (ver1)
4017				if(checkLoadmore) {
4018					var glm_class = (val.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
4019						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>';
4020
4021					if($galleryEL.find('.gallery-loadmore').length > 0) $galleryEL.find('.gallery-loadmore').replaceWith(glm_btn);
4022					else $galleryEL.append(glm_btn);
4023				} else $galleryEL.find('.gallery-loadmore').remove();
4024
4025			} else {
4026				// gallery loadmore btn - custom (ver2)
4027				if(checkLoadmore) {
4028					if(val.feature=='masonry') $glmBtn.addClass('masonry-layout');
4029					else $glmBtn.removeClass('masonry-layout');
4030					$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);
4031					$glmBtn.find('.label').text(glm_txt);
4032					$glmBtn.find('.display .view').text(cookie_view);
4033					$glmBtn.find('.display .total').text(total);
4034					$glmBtnWrap.removeClass('hide').fadeIn();
4035				} else {
4036					$glmBtnWrap.fadeOut().addClass('hide');
4037					$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');
4038					$glmBtn.find('.label').text(glm_txt);
4039					$glmBtn.find('.display .view').text('0');
4040					$glmBtn.find('.display .total').text('0');
4041				}
4042			}
4043
4044			if($galleryEL.has('input.gjs').length) setGalleryJS('change-loop',$galleryEL);
4045
4046			if($galleryEL.find('*[data-direffect="true"]').length > 0 ) {
4047				setTimeout(function() {
4048					$galleryEL.find('.grid').each(function() {
4049						$(this).hoverdir();
4050					});
4051				}, 400);
4052			}
4053			
4054			setTimeout(function() {
4055				goToElement(`.${$galleryEL.attr('data-el')}`);
4056			}, 0);
4057		});
4058
4059		$(':not(.review-sample-block) .review-sort-nav .toggle-dropdown').live({
4060		    click: function(e) {
4061		        $(this).closest('.review-sort-nav').toggleClass('open');
4062		    }
4063		});
4064
4065		$(':not(.review-sample-block) .review-sort-nav li a').live({
4066		    click: function() {
4067	        	if ($(this).closest('li').hasClass('active')) return;
4068
4069	        	var review_block_id = $(this).closest('.element').attr('data-id');
4070	        	var idx = $(this).attr('data-idx'),
4071		            orderby = $(this).attr('data-orderby');
4072	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav li').removeClass('active');
4073	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav li').eq(idx).addClass('active');
4074	            $('.element[data-id="'+review_block_id+'"] .review-sort-nav .active-sort').text($(this).text().trim());
4075	            $(this).closest('.review-sort-nav').removeClass('open');
4076
4077	        	var val = _this.galleryEL[review_block_id];
4078            	var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
4079            	var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
4080            	var cookie_review_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
4081
4082            	$.cookie('review-orderby-' + review_block_id, cookie_review_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
4083            	$.reviewContents.init(review_block_id, gallery_data);
4084		    }
4085		});
4086
4087		$(':not(.review-sample-block) .review-data-loadmore').live({
4088		    click: function() {
4089		    	var review_block_id = $(this).attr('data-id'),
4090					page_num = (typeof $(this).attr('data-page') != 'undefined') ? Number($(this).attr('data-page')) : 1,
4091					view = (typeof $(this).attr('data-view') != 'undefined') ? Number($(this).attr('data-view')) : 6,
4092					$review_elLoadmore = $(this),
4093					$review_el = $('.element[data-id="' + review_block_id + '"]'),
4094					$rContainer = $review_el.find('.container'),
4095					$rLoop = $review_el.find('[data-loop="true"]'),
4096		            $ro = $review_el.find('.review-sort-nav li.active a'),
4097		            orderby = ($ro.length > 0) ? $ro.attr('data-orderby') : 'recent';
4098
4099		        var val = _this.galleryEL[review_block_id];
4100            	var settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
4101            	var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
4102            	// var cookie_review_orderby = (typeof orderby != 'undefined')? orderby : 'recent';
4103
4104            	$.cookie('review-orderby-' + review_block_id, orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
4105            	$.reviewContents.update(review_block_id, gallery_data, orderby, page_num);
4106		    }
4107		});
4108
4109		// menu ver3 : fheader - #mobile-nav show/hide function
4110		$(document).on('click', 'ul li.siteSEARCH > a.psearch-btn, ul li.siteSEARCH .psearch-overlay.open, ul li.siteSEARCH .psearch-input', function(e) {
4111			e.preventDefault();
4112			var taret_nav = $('.el-menu header');
4113			if(window.innerWidth <= 768) taret_nav = $('#mobile-nav');
4114			var check_psearch_area = (taret_nav.find('.psearch-wrap').is(e.target) || taret_nav.find('.psearch-wrap').has(e.target).length > 0) ? true : false;
4115	
4116			if(!check_psearch_area) {
4117				taret_nav.find('.psearch-overlay').toggleClass('open');
4118				setTimeout(function() {
4119					$.psearch.showSiteProjectSEARCH(false);
4120					taret_nav.find('.psearch-overlay').find('input.psearch-input').focus();
4121				},300);
4122			}
4123			return false;
4124		});
4125		$(document).on('click', '#fixed-menu li.siteCART > a[href="javascript:;"], #fixed-menu-sub li.siteCART > a[href="javascript:;"]', function(e) {
4126			e.preventDefault();
4127			$(this).showModalFlat('INFORMATION',$.lang[LANG]['menu.cart.no-support.render'],true,false,'','ok');
4128			return false;
4129		});
4130		$(document).on('click', '.siteLANG ul a, .siteLANG-dmenu-wrap ul li a', function(e) {
4131			if(LANGLINK) return;
4132			e.preventDefault();
4133			var sid = (typeof SID != 'undefined' && SID) ? SID : property.SID;
4134			var slang_code = $(this).attr('data-code');
4135			var slang_str = $(this).text().trim();
4136
4137			changeLanguage(slang_code);
4138		});
4139		$(document).on('click', '#mobile-nav .login-content:not(.siteUM)', function(e) {
4140			e.preventDefault();
4141			$('#mobile-nav #fixed-menu .siteUM a i').click();
4142			return false;
4143		});
4144		$(document).on('click', '#mobile-nav .nav li.menu-has-children > a[href="javascript:;"]', function(e) {
4145			e.preventDefault();
4146			$(this).prev('.fa').click();
4147			return false;
4148		});
4149		$(document).on('click', '#mobile-nav ul li.menu-has-children i', function(e) {
4150			if($(this).closest('li.menu-has-children').hasClass('open')) {
4151				$(this).closest('li.menu-has-children').removeClass('open');
4152				$(this).nextAll('ul').eq(0).slideToggle(200);
4153				// $(this).next().removeClass('menu-item-active');
4154				$(this).toggleClass('fa-chevron-down fa-chevron-up');
4155			} else {
4156				$(this).closest('li.menu-has-children').addClass('open').siblings('li.open').find('i').click();
4157				$(this).nextAll('ul').eq(0).slideToggle(200);
4158				// $(this).next().toggleClass('menu-item-active');
4159				$(this).toggleClass('fa-chevron-down fa-chevron-up');
4160			}
4161		});
4162		$(document).on('click', 'header.navbar-fheader .navbar-toggle', function(e) {
4163			if( window.innerWidth > 768 &&
4164				$(this).closest('header').find('.cl-menu-option').length > 0 && 
4165				$(this).closest('header').find('.cl-menu-option').is('[data-moption="ntoggle"],.nfullDrop')
4166			) {
4167				e.preventDefault();
4168				return false;
4169			}
4170
4171			if($('.dsgn-body').hasClass('mobile-nav-active')) {
4172				//close mobile menu
4173				$('header.navbar-fheader .navbar-toggle').css({'visibility':'visible'});
4174				$('.dsgn-body').removeClass('mobile-nav-active');
4175				$('#mobile-body-overly').removeClass('in');
4176				$('#mobile-nav .siteLANG.cl-fixbtn').hide();
4177			} else {
4178				//show mobile menu
4179				$('header.navbar-fheader .navbar-toggle').css({'visibility':'hidden'});
4180				$('.dsgn-body').addClass('mobile-nav-active');
4181				$('#mobile-body-overly').addClass('in');
4182				$('#mobile-nav .siteLANG.cl-fixbtn').show();
4183			}
4184		});
4185		$(document).on('click', '#mobile-nav-toggle', function(e) {
4186			$('header.navbar-fheader .navbar-toggle').click();
4187		});
4188
4189		$('header.navbar-simple .navbar-toggle').live('click',function(e) {
4190			var check = $(this).hasClass('collapsed') ? false : true;
4191			if(check) {
4192				var p_t = $('.el-menu header').height() + 'px';
4193
4194				$('.element').each(function(){ $(this).addClass('blur-filter'); });
4195				$('.el-menu').addClass('blur-filter');
4196
4197				if($('body').height() > ($('.el-menu').find('#tpl-menu').height() + 80)) $('.el-menu').find('#tpl-menu').addClass('center-position');
4198				else $('.el-menu').find('#tpl-menu').removeClass('center-position');
4199				
4200				$('.dsgn-body').bind('touchmove');
4201				$('#goto-top').removeClass('show');
4202			} else {
4203				$('.element').each(function(){ $(this).removeClass('blur-filter'); });
4204				$('.el-menu').removeClass('blur-filter');
4205		        $('.dsgn-body').unbind('touchmove');
4206				$('#goto-top').addClass('show');
4207			}
4208		});
4209
4210		$('.element[data-type="gallery"]').live({
4211			mouseenter : function() {
4212				$(this).find('[data-direffect="true"] .grid').each(function() {
4213					$(this).hoverdir();
4214				});
4215			}
4216		});	
4217
4218		$('.creatorlink-header .data-user > ul > li').live({
4219			click : function() {
4220				$(this).closest('.pull-right').toggleClass('open');
4221				if($(this).closest('.pull-right').hasClass('open')) {
4222					$('.popover').show();
4223				} else {
4224					$('.popover').hide();
4225				}
4226			}
4227		});
4228
4229		/* [Input URL link] Click ==> link-type: link-out*/
4230		$('a[href*=#][attr-link]').live({
4231			click : function(e) {
4232				if($(this).is('[attr-link=""]') 
4233					|| $(this).is('[data-imglink="true"]')
4234					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4235				) {
4236					e.preventDefault();
4237					return false;
4238				} 
4239
4240				$.removeCookie('gallery', { path: '/' });
4241				$.removeCookie('gallery-item', { path : '/' });
4242				$.removeCookie('forum', { path : '/' });
4243				$.removeCookie('forum-item', { path : '/' });
4244				
4245				if($(this).attr('target') != '_blank') {
4246					var link = $(this).attr('href').replace('#','');
4247					if(link.length > 0 && link != '/') {
4248						var regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
4249						var regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
4250						var ismenulink = (b.MENULINK.indexOf(link) > -1) ? true : false;
4251						var isoutlink = (regex2.test(link) || regex.test(link)) ? true : false;
4252						if (ismenulink) {
4253							if ($('.dsgn-body').width() < 769) {
4254								setTimeout(function() {
4255									moveLinkPage(link);
4256								}, 250);
4257							} else {
4258								moveLinkPage(link);
4259							}
4260						} else if(!isoutlink && $('.' + link).length) {
4261							moveLinkPage(link, 1200, true);
4262						}
4263
4264
4265						if(b.MENULINK.indexOf(link) > -1) {
4266							if($('.dsgn-body').width() < 769) {
4267								setTimeout(function() {
4268									moveLinkPage(link);
4269								},250);
4270							} else {
4271								moveLinkPage(link);
4272							}
4273						} else if($('.' + link).length) {
4274							moveLinkPage(link,1200,true);
4275						}
4276					}
4277				}
4278		    }
4279		    
4280		});
4281
4282		/* [Menu link] Click ==> link-type: link-menu or link-inner*/
4283		$('*[data-user-link]').live('click',function(e) {
4284			if(	$.clnav.check()
4285				&& $(this).parent().hasClass('cl-nav-item')
4286				&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4287			) {
4288				/* .cl-nav[data-behavior="overflow-nowrap"] */
4289				if ($.clnav.d.isDrag) {
4290					e.preventDefault();
4291					e.stopImmediatePropagation();
4292					return false;
4293				}
4294			}
4295
4296			if(	$(this).is('[data-user-link=""]') 
4297				|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4298			) {
4299				e.preventDefault();
4300				return false;
4301			}
4302
4303			var $targetEle = $(this).closest('.element[data-el]');
4304			var datatype = $targetEle.attr('data-type') ?? '';
4305			var isimglink = $targetEle && $targetEle.length && $targetEle.hasClass('imglink');
4306			var hasalink = $(this).hasClass('sha_link');
4307			var isshlink = $(this).is('[data-shlink]');
4308
4309			var userLink = ((datatype == 'showcase') && isimglink && isshlink) ? $(this).attr('data-shlink') : $(this).attr('href');
4310			if (typeof userLink == 'undefined') return false;
4311
4312			var target = '';
4313			if ((typeof $(this).attr('target') != 'undefined') 
4314				|| (typeof $(this).attr('data-blank') != 'undefined')
4315			) {
4316				if ((datatype == 'showcase') && isimglink && isshlink) {
4317					target = $(this).attr('data-blank');
4318				} else {
4319					target = $(this).attr('target');
4320				}
4321			}
4322
4323			e.preventDefault();
4324			$.removeCookie('gallery', { path: '/' });
4325			$.removeCookie('gallery-item', { path: '/' });
4326			$.removeCookie('forum', { path: '/' });
4327			$.removeCookie('forum-item', { path: '/' });
4328
4329			//latest block - table header click, set click table
4330			if(typeof $(this).attr('data-lt-header') != 'undefined') {
4331				var type = $(this).closest('.latest-table').attr('data-type');
4332				var pid = $(this).closest('.latest-table').attr('data-pid');
4333				var clickEL = (type == 'gallery') ? $('.gallery-item[data-seq="'+pid+'"]') : $('.element[data-id="' + pid + '"]');
4334				var checkThisPage = (b.ONE && clickEL.length > 0) ? true : false;
4335
4336				if(checkThisPage) {
4337					if(type == 'forum') {
4338						scrollToBlock('.element[data-id="' + pid + '"]', 1000);
4339						return false;
4340					} else if(type == 'gallery') {
4341						moveGallery(pid);
4342						return false;
4343					}
4344				} else {
4345					$.cookie(type+'-item',pid, { path: '/' });
4346				}
4347			} else {
4348				if (typeof $(this).attr('data-forum-type') !== 'undefined' && $(this).attr('data-forum-type') == 'qna') {
4349					var type = $(this).closest('.latest-table').attr('data-type');
4350					var pid = $(this).closest('.latest-table').attr('data-pid');
4351					var clickEL = $('.element[data-id="' + pid + '"]');
4352					var checkThisPage = (b.ONE && clickEL.length > 0) ? true : false;
4353					var page_num = $(this).attr('data-page');
4354					var row_id = $(this).closest('.latest-post-list-title').attr('data-id');
4355					if (checkThisPage) {
4356						scrollToBlock('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="' + row_id + '"]', 1000);
4357						$('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="' + row_id + '"]').click();
4358						// $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
4359						return false;
4360					} else {
4361						$.cookie(type + '-item', pid, { path: '/' });
4362						$.cookie('forum_content_view', pid + '&' + row_id, { path: '/', expires: 12 * 60 * 60 * 1000 });
4363						$.forum.setForumCookie(pid, page_num, '', '', '');
4364					};
4365				}
4366			}
4367
4368			//psearch - project item(pitem) click, set click parent
4369			if($(this).closest('.psearch-view').length > 0) {
4370				if(typeof $(this).attr('data-psearch-seq') != 'undefined') {
4371					$.cookie('gallery-item',$(this).attr('data-psearch-seq'), { path: '/' });
4372				} else {
4373					$.cookie('gallery',$(this).attr('data-psearch-pid'), { path: '/' });
4374				}
4375
4376				if(b.ONE && typeof $(this).attr('data-user-link') != 'undefined' &&  $(this).attr('data-user-link') == 'index') {
4377					location.replace('/');
4378					return false;
4379				}
4380			}
4381
4382			if (b.ONE) {
4383				if (userLink.charAt(0) == '/') {
4384					var linkRegExp = /\/view\//gi;
4385					var linkMatch = userLink.match(linkRegExp);
4386					if (linkMatch && linkMatch[0]) {
4387						var url = ((b.URL == '/') ? '' : b.URL) + userLink;
4388						if (target == '_blank') {
4389							var openNewWindow = window.open('about:blank');
4390							openNewWindow.location.href = url;
4391						} else {
4392							location.href = url;
4393						}
4394						return false;
4395					}
4396
4397					userLink = userLink.charAt(0).replace('/', '') + userLink.slice(1);
4398					if (b.VIEW || target == '_blank') {
4399						var url = ((b.URL == '/') ? '' : b.URL) + '#' + userLink;
4400						if (b.VIEW && target != '_blank') {
4401							// location.href = url;
4402							url = new getLocation(url);
4403							golink(_this,url);
4404						} else {
4405							var openNewWindow = window.open('about:blank');
4406							openNewWindow.location.href = url;
4407						}
4408					} else {
4409						// if (b.ONE && b.MENULINK.indexOf(userLink) === -1) {
4410						// 	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');
4411						// 	return false;
4412						// }
4413						moveLinkPage(userLink);
4414					}
4415				} else {
4416					alert('Invalid URL');
4417					return false;
4418				}
4419			} else {
4420				var url = ((b.URL == '/') ? '' : b.URL) + userLink;
4421				if (target == '_blank' || target == 'blank') {
4422					var openNewWindow = window.open('about:blank');
4423					openNewWindow.location.href = url;
4424				} else {
4425					// location.href = url;
4426					url = new getLocation(url);
4427					golink(_this,url);
4428				}
4429			}
4430		});
4431		
4432		/* [Block Bookmark link] Click ==> link-type: link-bookmark*/
4433		$('a[attr-bookmark],*[data-imglink="true"][attr-bookmark],.fr-custom-button[attr-bookmark],.fr-fic[attr-bookmark],[data-type="showcase"] .item[attr-bookmark]').live({
4434			click : function(e) {
4435				e.preventDefault();
4436
4437				var checkSidemobile = ($(this).closest('.clnav-sidemobile').length > 0) ? true : false;
4438				if(checkSidemobile) $.clnav.setMode('sidemobile-open',false);
4439
4440				if($.clnav.check()
4441					&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4442				) {
4443					/* .cl-nav[data-behavior="overflow-nowrap"] */
4444					if ($.clnav.d.isDrag) {
4445						e.stopImmediatePropagation();
4446						return false;
4447					}
4448				}
4449
4450				if(	$(this).is('[attr-bookmark=""]') 
4451					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4452				) {
4453					return false;
4454				}
4455
4456				var $aEle = $(this);
4457				var $targetEle = $(this).closest('.element[data-el]');
4458				var datatype = $targetEle.attr('data-type') ?? '';
4459				var isimglink = $targetEle && $targetEle.length && $targetEle.hasClass('imglink');
4460				var hasalink = $(this).hasClass('sha_link');
4461				var isshlink = $(this).is('[data-shlink]');
4462
4463				var link = ((datatype == 'showcase') && isimglink && isshlink) ? $(this).attr('data-shlink').replace(/^\@/g, '') : $(this).attr('href').replace(/^\@/g, '');
4464				if(typeof link == 'undefined') return false;
4465
4466				var target = '';
4467				if ((typeof $(this).attr('target') != 'undefined') 
4468					|| (typeof $(this).attr('data-blank') != 'undefined')
4469				) {
4470					if ((datatype == 'showcase') && isimglink && isshlink) {
4471						target = $(this).attr('data-blank');
4472					} else {
4473						target = $(this).attr('target');
4474					}
4475				}
4476
4477				$.removeCookie('gallery', { path: '/' });
4478				$.removeCookie('gallery-item', { path : '/' });
4479				$.removeCookie('forum', { path : '/' });
4480				$.removeCookie('forum-item', { path : '/' });
4481
4482				var blockBookmarkList = (typeof b.SETTINGS.blockBookmarkList != 'undefined' && b.SETTINGS.blockBookmarkList) ? b.SETTINGS.blockBookmarkList : {};
4483				var hideArray = blockBookmarkList?.hide || [];
4484				if (hideArray.length > 0 && hideArray.includes(link)) {
4485					return false;
4486				}
4487
4488				if (typeof $(this).attr('attr-bookmark') != 'undefined' && (link != $(this).attr('attr-bookmark'))) link = $(this).attr('attr-bookmark');
4489				if($('.element[data-bookmark="' + link + '"]').length > 0 && target != '_blank') {
4490					moveLinkPage(b.PAGE + '\@' + link, 1200, true);
4491				} else {
4492					if (typeof b.SETTINGS.blockBookmarkList == 'undefined' || !b.SETTINGS.blockBookmarkList || typeof b.SETTINGS.blockBookmarkList['bookmark' + link] == 'undefined') {
4493						$aEle.find('img[data-attach="true"]').unwrap();
4494						return false;
4495					}
4496
4497					$.post('/template/bookmarkBlock', {sid: b.SID, seq: link, publish : b.PUBLISH}, function(data) {
4498						if(data.length == 0) {
4499							// console.log('Block Link Click :( Undefined block');
4500							return false;
4501						}
4502
4503						var d = data[0];
4504						if(typeof d.orgpage == 'undefined' || d.orgpage.length == 0) d.orgpage = d.page;
4505
4506						var	org_title = d.orgpage.replace(/-/g,' ');
4507						var bb_o_page = (d.page.match(/^index/g) !== null ) ? org_title : d.page;
4508						var bb_page = (bb_o_page.match(/\,/g) !== null) ? bb_o_page.substring(0,d.page.indexOf('\,')) : bb_o_page;
4509
4510						var check_link = true;
4511						var is_visible_menu = false;
4512						$.each(b.SMENU, function (idx, obj) {
4513							if(bb_page == obj.name.replace(/ /g,'-')) {
4514								if(!obj.link) check_link = false;
4515								if(obj.display == 'on') is_visible_menu = false;
4516							}
4517							if(obj.children) {
4518								$.each(obj.children, function (i, v){
4519									if(bb_page == v.name.replace(/ /g,'-')) {
4520										if(!v.link) check_link = false;
4521										if(v.display == 'on') is_visible_menu = false;
4522									}
4523								});
4524							}
4525						});
4526
4527						var is_here = ($('.element[data-bookmark="' + link + '"]').length > 0 ) ? true : false;
4528						var is_page = (b.PAGE.toLowerCase()==d.page.toLowerCase()) ? true : false;
4529						// var is_visible_menu = ($.inArray(bb_page,b.MENULINK)>-1) ? true : false;
4530						// 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;
4531						var is_link = ( check_link && is_visible_menu && org_title != 'INTRO' ) ? true : false;
4532						var is_visible = (check_link && is_visible_menu && org_title != 'INTRO') ? true : false;
4533						var clearBookmarkGalleryCategory = function() {
4534							if(typeof d.gpid == 'undefined' || !d.gpid) return;
4535
4536							$.cookie('gallery-category-' + d.gpid, '', { path : '/', expires: 12 * 60 * 60 * 1000 });
4537						};
4538
4539						if( ( !is_visible_menu && bb_page!='index' ) || 
4540							( typeof d.glivisible!='undefined' && d.glivisible ) ||
4541							( /*( (is_here && target=='_blank') || !is_page ) &&*/ ( is_link || is_visible ) ) ||
4542							( !is_here && is_page )
4543						)  {
4544								if(is_visible_menu == false) {
4545									if(b.SID == 'chansolpf') clearBookmarkGalleryCategory();
4546									moveBookmark(d.page, '\@' + link, 1200, target);
4547								} else {
4548									$aEle.find('img[data-attach="true"]').unwrap();
4549									return false;
4550								}
4551						} else {
4552							if(b.SID == 'chansolpf') clearBookmarkGalleryCategory();
4553							moveBookmark(d.page, '\@' + link, 1200, target);
4554						}
4555
4556					}, 'json');
4557				}
4558
4559			}
4560		});
4561
4562		$('[data-type="showcase"] .item[attr-link]').live('click',function(e) {
4563			var link = $(this).attr('href');
4564			var target = $(this).attr('target');
4565			var $targetEle = $(this).closest('.element[data-el]');
4566			var datatype = $targetEle.attr('data-type') ?? '';
4567
4568			if ((datatype == 'showcase') && $(e.target).closest('button, a').length > 0) {
4569				return;
4570			}
4571
4572			if (link) {
4573				if (target === '_blank') {
4574					window.open(link);
4575				} else {
4576					location.href = link;
4577				}
4578			}
4579		});
4580		/* [File link] Click ==> link-type: link-file*/
4581		$('a[attr-flink], .fr-custom-button[attr-flink], .fr-fic[attr-flink]').live({
4582			click : function(e) {
4583				e.preventDefault();
4584
4585				if($.clnav.check()
4586					&& ($(this).closest('.clnav-nowrap-target').length > 0 || $(this).closest('.clnav-sidemobile').length > 0)
4587				) {
4588					/* .cl-nav[data-behavior="overflow-nowrap"] */
4589					if ($.clnav.d.isDrag) {
4590						e.stopImmediatePropagation();
4591						return false;
4592					}
4593				}
4594
4595				if(	$(this).is('[attr-flink=""]')
4596					|| (typeof e.target.className == 'string' && e.target.className.indexOf('fa') > -1 && $(this).closest('header').hasClass('navbar-simple'))
4597					|| (!property.VALIDPLAN || property.VALIDTYPE == 'PK')
4598				) {
4599					return false;
4600				}
4601
4602				var id = $(this).attr('attr-flink');
4603				if(typeof id == 'undefined' || !id) { 
4604					return false;
4605				} else {
4606					// direct download
4607					// var flink_url = location.protocol + '//' + location.host +'/down/flink/' + id;
4608					// window.open(flink_url);
4609
4610					// modal open
4611					$.getJSON('/down/flink/get/id/' + id , {}, function (data) {
4612						checkError(data);
4613						if(typeof data.data == 'object' && !$.isEmptyObject(data.data)) {
4614							var flink_link = data.data;
4615							var flinkDownModal = $(this).showModalFlat($.lang[LANG]['config.information'], $.lang[LANG]['editor.link.file.download.check'], true, true, function() {
4616								var flink_url = location.protocol + '//' + location.host +'/down/flink/' + id + '/sid/' + flink_link.sid + '/s/' + encodeURIComponent(flink_link.file) + '/name/' + encodeURIComponent(flink_link.name);
4617								window.open(flink_url);
4618								flinkDownModal.modal('hide');
4619							}, 'cancel', 'ok');
4620						} else {
4621							return false;
4622						}
4623					}, 'json');
4624				}
4625
4626			}
4627		});
4628
4629		$('.element img[data-attach="true"][data-img-original="ON"]').live({
4630			click: function(e) {
4631				$(this).mouseenter();
4632			},
4633			mouseenter : function(e) {
4634				if(!selectEL || typeof selectEL == 'undefined') {
4635					selectEL = $(this).closest('.element').attr('data-el');
4636				}
4637				if(typeof selectEL == 'undefined') return false;
4638
4639				var offset = $(this).offset(),
4640			        left = $(this).width() + offset.left-25,
4641					top = offset.top;
4642				var index = $('.' + selectEL + ' img[data-attach="true"]').index(this);
4643
4644				if(b.VIEW) {
4645					var src = $(this).prop('src').split('/'),
4646						file = src[src.length-1];
4647		            if(src.indexOf('googleusercontent') > -1) {
4648		            	file = src;
4649		            }
4650					$('.config-image-view').css({ top : top + 'px', left : left + 'px' }).attr('data-src',$(this).prop('src')).attr('data-index',index).show();
4651				}
4652			},
4653			mouseleave : function(e) {
4654				$('.config-image-view').hide();
4655			}
4656		});
4657
4658		$('.config-image-view').live({
4659			mousemove : function(e) { $('.config-image-view').show(); },
4660			mouseout : function(e) { $('.config-image-view').show(); }
4661		});
4662
4663	    $('.config-image-view').on({
4664			click: function (e) {
4665				$('.config-image-view').hide();
4666
4667				var src = $(this).attr('data-src').split('/'),
4668					file = src[src.length-1],
4669	                free = (src[4]=='free') ? true : false;
4670
4671	            var img_src = $(this).attr('data-src')
4672	            if(img_src.indexOf('googleusercontent') > -1) {
4673	            	file = img_src;
4674	            }
4675	            file = Base64.encode(file);
4676				if(b.SID && file) {
4677					$('.tooltip.in').removeClass('in');
4678			  		$(this).attr("href","/image/original/sid/" + b.SID + "/file/" + file + '/free/' + free);
4679				} else {
4680					// console.log('None:: sid or src');
4681					return false;
4682				}
4683	        }
4684	    });
4685
4686		$('[data-lock-password]').live({
4687			'keydown.autocomplete': function(e) {
4688			    if (e.keyCode == 13) {
4689			    	$('[data-lock-submit]').click();
4690				}
4691			},
4692			'keyup': function() {
4693				if ($(this).val()) {
4694					$('[data-lock-submit]').addClass('btn-primary');
4695				} else {
4696					$('[data-lock-submit]').removeClass('btn-primary');
4697				}
4698			}
4699		});
4700
4701		$('.form-control[type="number"]').live('keydown', function(e) {
4702			if (e.keyCode == 109 || e.keyCode == 189) {
4703				return false;
4704			}
4705		});
4706
4707		var getSubmitCaptchaLang = function($parent) {
4708			var blocklang = $parent.attr('data-blocklang') || $parent.data('blocklang') || LANG;
4709			if(typeof $.lang == 'undefined' || typeof $.lang[blocklang] == 'undefined') blocklang = LANG;
4710			return blocklang;
4711		}
4712
4713		var getSubmitCaptchaText = function(blocklang, key, fallback) {
4714			if(typeof $.lang != 'undefined' && typeof $.lang[blocklang] != 'undefined' && typeof $.lang[blocklang][key] != 'undefined') return $.lang[blocklang][key];
4715			if(typeof $.lang != 'undefined' && typeof $.lang[LANG] != 'undefined' && typeof $.lang[LANG][key] != 'undefined') return $.lang[LANG][key];
4716			return fallback;
4717		}
4718
4719		var isSubmitCaptchaUserLoggedIn = function() {
4720			var pageMode = (typeof PAGE_MODE != 'undefined') ? PAGE_MODE : '',
4721				umember = (pageMode == 'c') ? ((typeof UMEMBER != 'undefined') ? UMEMBER : {}) : ((typeof property != 'undefined' && typeof property.UMEMBER != 'undefined') ? property.UMEMBER : {}),
4722				umemberActivate = (pageMode == 'c') ? ((typeof UMEMBER_ACTIVATE != 'undefined') ? Number(UMEMBER_ACTIVATE) : 0) : ((typeof property != 'undefined' && typeof property.UMEMBER_ACTIVATE != 'undefined') ? Number(property.UMEMBER_ACTIVATE) : 0),
4723				checkLogin = (pageMode == 'c') ? true : !!umember.check_login;
4724
4725			if(pageMode == 's' && umemberActivate == 0 && umember.id_type == 'creatorlink') {
4726				checkLogin = (umember.id !== undefined && umember.id) ? true : false;
4727			}
4728
4729			return checkLogin;
4730		}
4731
4732		var isSubmitCaptchaRequired = function($parent) {
4733			if(isSubmitCaptchaUserLoggedIn()) return false;
4734			if($parent.attr('data-type') == 'form') return false;
4735			return ($parent.attr('data-captcha') == 'true');
4736		}
4737
4738		var getInlineFormCaptcha = function($parent) {
4739			if($parent.attr('data-type') != 'form') return '';
4740			if(isSubmitCaptchaUserLoggedIn()) return '';
4741			return $.trim($parent.find('.form-captcha .input-captcha').val());
4742		}
4743
4744		var getSubmitCaptchaHTML = function(blocklang) {
4745			var captchaTip = getSubmitCaptchaText(blocklang, 'form.item.captcha-tip', '');
4746
4747			return '\
4748				<div class="form-group form-captcha">\
4749					<div class="kcaptcha-wrap display-flex">\
4750						<div class="kcaptcha-box">\
4751							<img src="//storage.googleapis.com/i.addblock.net/forum/captcha_sample_Img.jpg" class="kcaptcha-img" alt="' + captchaTip + '" title="' + captchaTip + '">\
4752						</div>\
4753						<div class="text-left kcaptcha-key-wrap">\
4754							<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">\
4755							<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>
4755' + getSubmitCaptchaText(blocklang, 'form.item.captcha-change', 'Refresh') + '</a>\
4756						</div>\
4757					</div>\
4758				</div>\
4759			';
4760		}
4761
4762		var showSubmitCaptchaError = function($modal, blocklang, errorKey) {
4763			if(!$modal || $modal.length == 0) return;
4764
4765			var message = getSubmitCaptchaText(blocklang, errorKey, '');
4766			if(!message) message = getSubmitCaptchaText(blocklang, 'form.item.captcha.wrong', 'Invalid CAPTCHA code.');
4767
4768			$modal.find('.form-captcha .error').remove();
4769			$modal.find('.form-captcha').append('<div class="error">' + message + '</div>').addClass('required');
4770			$modal.find('.input-captcha').focus();
4771		}
4772
4773		var reloadSubmitCaptcha = function($modal, pid) {
4774			if(!$modal || $modal.length == 0) return;
4775			$modal.find('.input-captcha').val('');
4776			$modal.find('.form-captcha .error').remove();
4777			$modal.find('.form-captcha').removeClass('required');
4778			load_form_kcaptcha($modal, pid);
4779		}
4780
4781		var hideSubmitCaptchaModal = function($modal) {
4782			if(!$modal || $modal.length == 0) return;
4783			$modal.find('input:focus, textarea:focus, select:focus').blur();
4784			$modal.modal('hide');
4785		}
4786
4787		var showSubmitCaptchaModal = function($parent, pid, callback) {
4788			var blocklang = getSubmitCaptchaLang($parent);
4789			var modal = $(document.body).showModalFlat(
4790				getSubmitCaptchaText(blocklang, 'form.item.captcha.title', '보안 확인'),
4791				getSubmitCaptchaHTML(blocklang),
4792				true,
4793				true,
4794				function() {
4795					var captcha = $.trim(modal.find('.input-captcha').val());
4796					if(captcha == '') {
4797						showSubmitCaptchaError(modal, blocklang, 'config.wrong-captcha');
4798						return false;
4799					}
4800
4801					if(typeof callback == 'function') callback(captcha, modal, blocklang);
4802				},
4803				'cancel',
4804				'ok',
4805				'cl-cmmodal cl-s-btn w560 cl-p70 cl-p0 form-captcha-submit-modal',
4806				true
4807			);
4808
4809			reloadSubmitCaptcha(modal, pid);
4810			modal.find('.kcaptcha-change').off('click.submitCaptcha').on('click.submitCaptcha', function(e) {
4811				e.preventDefault();
4812				reloadSubmitCaptcha(modal, pid);
4813			});
4814			modal.find('.input-captcha').off('keydown.submitCaptcha').on('keydown.submitCaptcha', function(e) {
4815				if(e.keyCode == 13) {
4816					modal.find('.ok-button-dialog').click();
4817					return false;
4818				}
4819			}).focus();
4820
4821			return modal;
4822		}
4823
4824		$('[data-form-submit]').live('click', function() {
4825			var is_templates = checkTemplateSite(b.SID),
4826				is_render = (window.location.pathname.match(/^\/render(\/|$)/) !== null);
4827			if(is_render && !isRenderFormSubmitAllowed()) return false;
4828			if($('#flat-modal').length || is_templates) return false;
4829			if($('#flat-modal').length) return;
4830			var $parent = $(this).closest('.element'),
4831				$items = $parent.find('[form-idx]'),
4832				values = {},
4833				pid = $parent.attr('data-id'),
4834				submit = true,
4835				el = '.' + $(this).parents('.element').attr('data-name');
4836
4837			if($parent.find('.required').length > 0) {
4838				$parent.find('.form-inline').removeClass('required required-mr required-privacy');
4839				$parent.find('.form-group').removeClass('required');
4840			}
4841
4842			$parent.find('.error').remove();
4843			$.each($items, function(i,v) {
4844				var idx = $(this).attr('form-idx'),
4845					name = $(this).attr('form-name'),
4846					type = $(this).attr('form-type'),
4847					require = $(this).attr('form-require'),
4848					seq = $(this).attr('form-seq');
4849
4850				switch(type) {
4851					case "radio":
4852					case "check":
4853					case "radio.image":
4854					case "check.image":
4855						if(type == 'radio' || type == 'radio.image') {
4856							var val = $(this).find(':radio[name]:checked').val();
4857							values[seq] = (typeof val == 'undefined') ? '' : val;
4858						} else {
4859							values[seq] = $(this).find(':checkbox[name]:checked').map(function() { return this.value; } ).get().join();
4860						}
4861
4862						if(typeof require != 'undefined' && require) {
4863							if(!values[seq]) {
4864								formRequireDisplay($(this),i+1);
4865								submit = false;
4866							}
4867						}
4868						break;
4869					case "date":
4870						var date = $(this).find('input').map(function() { return this.value.replace(/-/g, ''); } ).get(),
4871							valid = true;
4872
4873						$.each(date, function(k,d) {
4874							if(d=='') valid = false;
4875						});
4876
4877						if(typeof require != 'undefined' && require) {
4878							if(valid == false) {
4879								formRequireDisplay($(this),i+1);
4880								submit = false;
4881							}
4882						}
4883						values[seq] = date.join('');
4884						break;	
4885					case "date2":
4886						var date = $(v).find('input').val();
4887						if($(v).find('input').length > 1 && $(v).find('.date-yyyy').length > 0) { //old
4888							var ymd = $(v).find('.date-yyyy').val() + '-' + $(v).find('.date-mm').val() + '-' + $(v).find('.date-dd').val();
4889							var time = $(v).find('.date-hh').val() + ':' + $(v).find('.date-ii').val();
4890							date = ymd + ' ' + time;
4891						}
4892						values[seq] = date;
4893						if(typeof require != 'undefined' && require) {
4894							if(!values[seq]) {
4895								formRequireDisplay($(this),i+1);
4896								submit = false;
4897							}
4898						}
4899						
4900						break;
4901					case "file.upload":
4902						var fileArr = new Array();
4903						$(this).find('input[type="hidden"]').each(function(idx, v) {
4904							var f = '#FILE#||' + $(v).val();
4905							fileArr.push(f);
4906						});
4907
4908						var val = fileArr.join(',');
4909                        values[seq] = (typeof val == 'undefined') ? '' : val;
4910
4911                        if(typeof require != 'undefined' && require) {
4912                            if(!values[seq].replace('#FILE#||', '')) {
4913                                formRequireDisplay($(this),i+1);
4914                                submit = false;
4915                            }
4916                        }
4917						break;
4918					default :
4919						var itemValue = $(this).hasClass('franchise-form-select') ? $(this).find('select.franchise-form-select-native').val() : $(this).val();
4920						values[seq] = (typeof itemValue == 'undefined' || itemValue === null) ? '' : itemValue.toString().trim();
4921						if(values[seq] && checkEmojis(values[seq])) {
4922							formRequireDisplay($(this),i+1,'emoji');
4923							submit = false;
4924						} else if(typeof require != 'undefined' && require) {
4925							if(!values[seq]) {
4926								formRequireDisplay($(this),i+1);
4927								submit = false;
4928							}
4929						}
4930						break;
4931				}
4932			});
4933
4934			var $privacy = $parent.find('.form-privacy'),
4935				check;
4936
4937			if($privacy.css('display')!='none') {
4938				check = $privacy.find('.check-privacy').prop('checked');
4939				if(check === false) {
4940					formRequireDisplay($privacy.find('.check-privacy'),'privacy');
4941					submit = false;
4942				}
4943			}
4944
4945			if($parent.attr('data-type') == 'form') {
4946				var $captcha = $parent.find('.form-captcha');
4947				var formCaptcha = '';
4948
4949				if($captcha.length > 0) {
4950					formCaptcha = $captcha.find('.input-captcha').val();
4951					if(formCaptcha == '') {
4952						formRequireDisplay($captcha.find('.input-captcha'),'captcha');
4953						submit = false;
4954					}
4955				}
4956			} else {
4957				var captcha_display = isSubmitCaptchaRequired($parent);
4958				$parent.find('.form-captcha').remove();
4959			}
4960
4961			if(!$parent.hasClass('el-fixedcontact') && $('.form-inline .error').length > 0) {
4962				var $error = $parent.find('.error');
4963				var header_height = $('.navbar-fheader').height();
4964				$.each($error, function(i,v) {
4965					if(i==0) {
4966						var $form_group = $(v).parent().find('[form-type]');
4967						var type = $form_group.attr('form-type');
4968						var privacy = $(v).parent().hasClass('form-privacy');
4969						if($.inArray(type, ['radio', 'check', 'radio.image', 'check.image']) > -1 || privacy) {
4970							var form_offset = $(v).parents('.form-group').offset();
4971							$("html, body").animate({scrollTop: ($parent.attr('data-type') == 'form')? form_offset.top-header_height : $parent.offset().top-header_height});
4972						} else {
4973							$(v).parent().find('.form-control').first().focus();
4974						}
4975					}
4976				});
4977			}
4978
4979				if(submit) {
4980					var completeSubmitForm = function(doneText) {
4981						var message = doneText;
4982						if(!message) message = $parent.attr('data-form-done');
4983						if(!message && typeof $.lang != 'undefined' && typeof LANG != 'undefined' && $.lang[LANG]) {
4984							message = $.lang[LANG]['forms.submit.done'];
4985						}
4986						if(!message) message = (typeof LANG != 'undefined' && LANG == 'ko') ? '신청 완료되었습니다.' : 'Your submission has been received';
4987
4988						$(this).showModalFlat('INFORMATION', message, true, false, '', 'ok', '', 'cl-modal cl-none-title cl-cmmodal cl-p130 cl-s-btn w560','','',function(){
4989							if(typeof formCallback == 'function') formCallback(pid);
4990						});
4991
4992						setDefaultForm(el);
4993					};
4994					var submitForm = function(formCaptcha, captchaModal, captchaBlocklang) {
4995						$.processON();
4996						$.ajax({
4997							url: '/template/forms/submit',
4998							data: { sid : b.SID, pid : pid, values : values, check : check, captcha : formCaptcha, block_type: 'form' },
4999							dataType: 'json',
5000							type: 'POST',
5001							async: true,
5002							cache: false,
5003							success: function (data) {
5004								checkError(data);
5005
5006								if(typeof data.error != 'undefined' && data.error != '') {
5007								// $(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() {
5008								// 	$(document).on('keydown', function(e) {
5009								// 		if(e.keyCode == 27) modal.modal('hide');
5010								// 	});
5011								// });
5012								return false;
5013							}
5014
5015								if(typeof data.captcha_error != 'undefined' && data.captcha_error != '') {
5016									if(captchaModal && captchaModal.length > 0) {
5017										reloadSubmitCaptcha(captchaModal, pid);
5018										showSubmitCaptchaError(captchaModal, captchaBlocklang, data.captcha_error);
5019									} else if($parent.attr('data-type') == 'form' && $parent.find('.form-captcha').length > 0) {
5020										reloadSubmitCaptcha($parent, pid);
5021										showSubmitCaptchaError($parent, getSubmitCaptchaLang($parent), data.captcha_error);
5022									} else {
5023										alert($.lang[LANG][data.captcha_error]);
5024									}
5025									return false;
5026								}
5027
5028								if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5029								completeSubmitForm.call(this, data.done);
5030							},
5031							error: function(xhr) {
5032								// DB 저장 후 알림 발송 지연으로 502가 반환되는 경우 제출 완료 상태로 처리한다.
5033								if(xhr && xhr.status == 502) {
5034									if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5035									completeSubmitForm.call(this);
5036								}
5037							},
5038							complete: function() {
5039								$.processOFF();
5040							}
5041						},'json');
5042					};
5043
5044					if(captcha_display) {
5045						showSubmitCaptchaModal($parent, pid, function(captcha, captchaModal, captchaBlocklang) {
5046							submitForm(captcha, captchaModal, captchaBlocklang);
5047						});
5048					} else {
5049						submitForm(getInlineFormCaptcha($parent), null, getSubmitCaptchaLang($parent));
5050					}
5051				}
5052			});
5053
5054		var formRequireDisplay = function($obj,idx,error_type) {
5055			if(typeof error_type == 'undefined') error_type = '';
5056
5057			var isModoo = $obj.parents('.element').hasClass('modoo');
5058
5059			var blang = $obj.parents('.element').attr('data-lang'),
5060				sdefault = '';
5061
5062			var $el = $obj.parents('.element');
5063
5064			if(typeof property.SLANG.select != 'undefined') {
5065				var _lang = property.SLANG.select;
5066				if(_lang.indexOf('한국어') > -1) {
5067					sdefault = '필수 입력 사항';
5068				} else if(_lang.indexOf('English') > -1) {
5069					sdefault = 'Required';
5070				} else if(_lang.indexOf('日本語') > -1) {
5071					sdefault = '必須';
5072				} else {
5073					sdefault = 'Required';
5074				}
5075			} else sdefault = '필수 입력 사항';
5076
5077
5078			if(error_type == 'emoji') {
5079				sdefault = $.lang[LANG]['config.unable.emoji'];
5080			}
5081			
5082			var $parent = (isModoo) ? $obj.parents('.box') : $obj.parents('.form-group'),
5083				$html = $('<div class="error">' + sdefault + '</div>');
5084			$parent.append($html);
5085			if($obj.parents('.form-inline').find('.error').length==1) {
5086				if(isNumber(idx)) $('body').scrollTo($('[form-idx="' + idx + '"]'), 0, { offset : -150 } );
5087				else  $('body').scrollTo($parent, 0, { offset : -150 } );
5088			}
5089			if($el.attr('data-type') == 'contact' && $el.attr('data-type2') == 'franchise bar') {
5090				$parent.addClass('required');
5091				$el.find('.form-inline').addClass('required');
5092
5093				if($parent.hasClass('form-privacy')) {
5094					$el.find('.form-inline').addClass('required-privacy');
5095				} else {
5096					if(idx > 2) {
5097						$el.find('.form-inline').addClass('required-mr');
5098					}
5099				}
5100			}
5101		}
5102
5103		$('.date-yyyy').live('keyup', function(e) {
5104			var val = $(this).val();
5105			if(val.length>=4) {
5106				if((e.target.selectionStart).length) ;
5107				else {
5108					if(isNaN(parseInt(val))) {
5109						$(this).val('1900');
5110					}
5111					$(this).parents('.form-group').find('.date-mm').focus();
5112				}
5113			}				
5114		}).live('blur', function(e) {
5115			var val = $(this).val();
5116			if(isNaN(parseInt(val))) {
5117				$(this).val('1900');
5118			} else {
5119				if(parseInt(val)<1900) {
5120					$(this).val('1900');
5121				}
5122			}
5123		});
5124
5125		$('.date-mm, .date-dd, .date-hh, .date-ii').live('keyup', function(e) {
5126			var val = $(this).val();
5127			if(val.length>=2) {
5128				if((e.target.selectionStart).length) ;
5129				else {
5130					if(isNaN(parseInt(val))) {
5131						$(this).val('00');
5132					}
5133					if($(this).hasClass('date-mm')) {
5134						$(this).parents('.form-group').find('.date-dd').focus();
5135					} else if($(this).hasClass('date-dd')) {
5136						$(this).parents('.form-group').find('.date-hh').focus();
5137					} else if($(this).hasClass('date-hh')) {
5138						$(this).parents('.form-group').find('.date-ii').focus();
5139					} else if($(this).hasClass('date-ii')) {
5140						// $(this).parents('.form-group').next().find('input').focus();
5141					}
5142				}
5143			}				
5144		}).live('blur', function(e) {
5145			var val = $(this).val();
5146			if(isNaN(parseInt(val))) {
5147				$(this).val('01');
5148			} else {
5149				if(val.length==1) {
5150					$(this).val('0' + val);
5151				} else {
5152					if($(this).hasClass('date-mm') && parseInt(val)>12) {
5153						$(this).val('12');
5154					} else if($(this).hasClass('date-dd') && parseInt(val)>31) {
5155						$(this).val('31');
5156					} else if($(this).hasClass('date-hh') && parseInt(val)>23) {
5157						$(this).val('00');
5158					} else if($(this).hasClass('date-ii') && parseInt(val)>59) {
5159						$(this).val('00');
5160					}
5161				}
5162			}
5163		});
5164
5165		$('[data-lock-submit]').live('click', function() { 
5166			var el = $(this).closest('.form-inline');
5167			var pw = el.find('[data-lock-password]').val().trim();
5168			if(pw.length == 0 ) {
5169				el.find('[data-lock-password]').focus();
5170				el.find('.error-text').text('! ' + $.lang[LANG]['config.enter-password']);
5171				return false;
5172			}
5173
5174			$.modalON();
5175			let lockType = $(this).attr('data-lock');
5176			var url = (lockType == 'site')? '/template/siteLockController/type/pw_check':'/template/menuLockController/type/pw_check';
5177			$.post(url, {s: b.SMENU, sid: b.SID, page: b.PAGE, pw: pw, publish : b.PUBLISH}, function(data) {
5178				checkError(data);
5179				$.modalOFF();
5180				if(data.result) {
5181					if(lockType == 'site' && data.ss_site_lock) {
5182						localStorage.setItem('ss_' + b.SID + '_site_lock', data.ss_site_lock);
5183						localStorage.setItem('last_activity', data.last_activity);
5184					}
5185					window.location.reload(true);
5186				} else {
5187					el.find('[data-lock-password]').focus();
5188					el.find('.error-text').text('! ' + $.lang[LANG]['siteum.regexp.pw.invalid']);
5189				}
5190			}, 'json');
5191		});
5192
5193		$('[data-contact-submit]').live('click',function(e) {
5194			var is_templates = checkTemplateSite(b.SID),
5195				is_render = (window.location.pathname.match(/^\/render(\/|$)/) !== null);
5196			if(is_render && !isRenderFormSubmitAllowed()) return false;
5197			// if($('#flat-modal').length || window.location != window.parent.location) return;
5198
5199			//템플릿 추가 화면에서만 버튼 동작 안 되게끔 처리
5200			if($('#flat-modal').length || is_templates) return;
5201			
5202			$.modalON();
5203
5204		    var el = '.' + $(this).parents('.element').attr('data-name'),
5205		    	el_id = $(this).parents('.element').attr('data-id'),
5206		    	google_track = $(this).attr('data-google-track'),
5207		    	google_track_run = false,
5208		    	daum_track = $(this).attr('data-daum-track'),
5209		    	daum_track_run = false,
5210		    	naver_track = $(this).attr('data-naver-track'),
5211		    	naver_track_run = false;
5212
5213			var hasEmoji = false;
5214			$(el+' .form-group .form-control:not([readonly])').each(function() {
5215				if(checkEmojis($(this).val().trim())) {
5216					hasEmoji = true;
5217					return false;
5218				}
5219			});
5220
5221			if(hasEmoji) {
5222				e.preventDefault();
5223				$.modalOFF();
5224				errorEmojisModal();
5225				return false;
5226			}
5227
5228			google_track_run = (typeof google_track != 'undefined') ? true : false;
5229			daum_track_run = (typeof daum_track != 'undefined') ? true : false;
5230			naver_track_run = (typeof naver_track != 'undefined') ? true : false;
5231
5232		    if($(el).length==0 || $(el).length>1) {
5233		        alert('Invalid form data');
5234		        return false;
5235		    }
5236
5237
5238		    var firstname = ($(el + ' [data-contact-firstname]').length >0 ) ? setDefaultValue($(el + ' [data-contact-firstname]').val().trim()) : '',
5239		    	lastname = 	($(el + ' [data-contact-lastname]').length > 0) ? setDefaultValue($(el + ' [data-contact-lastname]').val().trim()) : '',
5240		    	email = 	($(el + ' [data-contact-email]').length > 0) ? setDefaultValue($(el + ' [data-contact-email]').val().trim()) : '',
5241		    	web = 		($(el + ' [data-contact-website]').length > 0) ? setDefaultValue($(el + ' [data-contact-website]').val().trim()) : '',
5242		    	phone = 	($(el + ' [data-contact-phone]').length > 0) ? setDefaultValue($(el + ' [data-contact-phone]').val().trim()) : '' ,
5243		    	subject = 	($(el + ' [data-contact-subject]').length > 0) ? setDefaultValue($(el + ' [data-contact-subject]').val().trim()) : '',
5244		    	message = 	($(el + ' [data-contact-message]').length > 0) ? setDefaultValue($(el + ' [data-contact-message]').val().trim()) : '',
5245		    	etc = {};
5246    		$(el + ' [data-contact-etc]').each(function(i) {
5247				var key = $(this).attr('data-contact-etc');
5248				etc[key] = setDefaultValueEtc($(this).attr('type'),$(this));
5249			});
5250
5251		    var require_firstname 	= $(el + ' [data-contact-firstname]').attr('data-required'),
5252		    	require_lastname 	= $(el + ' [data-contact-lastname]').attr('data-required'),
5253		    	require_email		= $(el + ' [data-contact-email]').attr('data-required'),
5254		    	require_web			= $(el + ' [data-contact-website]').attr('data-required'),
5255		    	require_phone		= $(el + ' [data-contact-phone]').attr('data-required'),
5256		    	require_subject 	= $(el + ' [data-contact-subject]').attr('data-required');
5257
5258		    /*default:: required[email,message] | optional[firstname,lastname,web,phone,subject]  // data-optional='true'->optional, 'false'->required */
5259		    var optional_firstname  = $(el + ' [data-contact-firstname]').attr('data-optional'),
5260		    	optional_lastname   = $(el + ' [data-contact-lastname]').attr('data-optional'),
5261		    	optional_email		= $(el + ' [data-contact-email]').attr('data-optional'),
5262		    	optional_web		= $(el + ' [data-contact-web]').attr('data-optional'),
5263		    	optional_phone		= $(el + ' [data-contact-phone]').attr('data-optional'),
5264		    	optional_subject	= $(el + ' [data-contact-subject]').attr('data-optional'),
5265		    	optional_message	= $(el + ' [data-contact-message]').attr('data-optional');
5266		    var optional_etc		= {};
5267
5268    		$(el + ' [data-contact-etc]').each(function(i) {
5269				var key = $(this).attr('data-contact-etc');
5270				optional_etc[key] = $(this).attr('data-optional');
5271			});
5272
5273				var $parent = $(this).parents('.element'),
5274					el = '.' + $(this).parents('.element').attr('data-name'),
5275					contprivacy = $(el+' .form-group.contact-privacy-area').css('display'),
5276					contprivacy_display = (typeof contprivacy == 'undefined' || contprivacy == 'none') ? false : true,
5277					privacy_check = $parent.find('.contact-checkbox-text'),
5278					privacy_chk = privacy_check.is(":checked"),
5279					captcha_display = isSubmitCaptchaRequired($parent),
5280					check = true,
5281					check_option = [];
5282
5283				$parent.find('.form-captcha').remove();
5284
5285				if(!firstname) {
5286					var name_text = ($(el + ' [data-contact-lastname]').length > 0) ? 'first name' : 'name';
5287		    	if(typeof optional_firstname != 'undefined' && optional_firstname == 'false') check = true;
5288		    	else if ($(el + ' [data-contact-firstname]').length == 0) check 
5288= true;
5289		    	else check = false;
5290
5291		    	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;
5292		    	if(!check) check_option.push(str);
5293		    }
5294
5295		    if($(el + ' [data-contact-lastname]').length > 0 && !lastname) {
5296		    	if(typeof optional_lastname != 'undefined' && optional_lastname == 'false') check = true;
5297		    	else if ($(el + ' [data-contact-lastname]').length == 0) check = true;
5298		    	else check = false;
5299		    	
5300		    	var str = ($(el + ' [data-contact-lastname]').attr('data-contact-lastname').length > 0) ? $(el + ' [data-contact-lastname]').attr('data-contact-lastname') : 'last name';
5301		    	if(!check) check_option.push(str);
5302		    }
5303
5304		    /*if((!firstname && typeof optional_firstname != 'undefined' && optional_firstname == "false") || (!lastname && typeof optional_lastname != 'undefined' && optional_lastname == "false")) {
5305		    	var str = ($(el + ' [data-contact-firstname]').attr('data-contact-firstname').length > 0) ? $(el + ' [data-contact-firstname]').attr('data-contact-firstname') : 'name';
5306		    	check_option.push(str);
5307		    }*/
5308		    
5309		    if(!web && typeof optional_web != 'undefined' && optional_web == 'false') {
5310		    	var str = ($(el + ' [data-contact-web]').attr('data-contact-web').length > 0) ? $(el + ' [data-contact-web]').attr('data-contact-web') : 'web';
5311		    	check_option.push(str);
5312		    }
5313
5314		    if(!phone && typeof optional_phone != 'undefined' && optional_phone == 'false') {
5315		    	var str = ($(el + ' [data-contact-phone]').attr('data-contact-phone').length > 0) ? $(el + ' [data-contact-phone]').attr('data-contact-phone') : 'phone';
5316		    	check_option.push(str);
5317		    }
5318
5319		    if(!subject && typeof optional_subject != 'undefined' && optional_subject == 'false') {
5320		    	var str = ($(el + ' [data-contact-subject]').attr('data-contact-subject').length > 0) ? $(el + ' [data-contact-subject]').attr('data-contact-subject') : 'subject';
5321		    	check_option.push(str);
5322		    }
5323
5324		    if(!email) {
5325		    	if(typeof optional_email != 'undefined' && optional_email == 'true') check = true;
5326		    	else if ($(el + ' [data-contact-email]').length == 0) check = true;
5327		    	else check = false;
5328		    	
5329		    	var str = ($(el + ' [data-contact-email]').attr('data-contact-email').length > 0) ? $(el + ' [data-contact-email]').attr('data-contact-email') : 'email';
5330		    	if(!check) check_option.push(str);
5331		    }
5332		    if(!message) {
5333		    	if(typeof optional_message != 'undefined' && optional_message == 'true') check = true;
5334		    	else check = false;
5335
5336		    	var str = ($(el + ' [data-contact-message]').attr('data-contact-message').length > 0) ? $(el + ' [data-contact-message]').attr('data-contact-message') : 'message';
5337		    	if(!check) check_option.push(str);
5338		    }
5339
5340		   	$.each(etc,function(k,v){
5341		   		if(!etc[k] && typeof optional_etc[k] != 'undefined' & optional_etc[k] == 'false') {
5342		   			check_option.push(k);
5343		   		}
5344		   	});
5345
5346		   	check = ((check_option.length == 0) && ((contprivacy_display == false) || (privacy_chk == true))) ? true : false;
5347
5348		    if(require_firstname == 'true' && !firstname) {
5349		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-firstname]').attr('placeholder') + $.lang[LANG]['check.required'], true, false, '', 'ok');
5350		    	return false;
5351		    }
5352
5353		    if(require_lastname == 'true' && !lastname) {
5354		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-lastname]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5355		    	return false;
5356		    }
5357
5358		    if(require_web == 'true' && !web) {
5359		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-website]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5360		    	return false;
5361		    }
5362
5363		    if(require_phone == 'true' && !phone) {
5364		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-phone]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5365		    	return false;
5366		    }
5367
5368		    if(require_subject == 'true' && !subject) {
5369		    	$(this).showModalFlat('INFORMATION',$(el + ' [data-contact-subject]').attr('placeholder') + $.lang[LANG]['message.check.required'], true, false, '', 'ok');
5370		    	return false;
5371		    }
5372
5373		    if(check) {
5374			var submitContact = function(contactCaptcha, captchaModal, captchaBlocklang) {
5375				$.modalON();
5376				$.post('/template/update/type/contact',{
5377					id : b.SID,
5378					seq : el_id,
5379					s : 'message',
5380					firstname : firstname,
5381					lastname : lastname,
5382					email : email,
5383					web : web,
5384					phone : phone,
5385					subject : subject,
5386					message : message,
5387					etc : JSON.stringify(etc),
5388						captcha : contactCaptcha,
5389						block_type: 'contact',
5390				}, function(data) {
5391					checkError(data);
5392						if(typeof data.captcha_error != 'undefined' && data.captcha_error != '') {
5393							$.modalOFF();
5394							if(captchaModal && captchaModal.length > 0) {
5395								reloadSubmitCaptcha(captchaModal, el_id);
5396								showSubmitCaptchaError(captchaModal, captchaBlocklang, data.captcha_error);
5397							} else {
5398								alert($.lang[LANG][data.captcha_error]);
5399							}
5400							return false;
5401						}
5402
5403					if(typeof data.error == 'undefined' || data.error == '') {
5404						var ch_lang = getLang($(el), b.SID),
5405							submit_txt = (typeof data.submitStr != 'undefined' && data.submitStr) ? data.submitStr : $.lang[ch_lang]['message.sent'];
5406
5407						if(captchaModal && captchaModal.length > 0) hideSubmitCaptchaModal(captchaModal);
5408						$(document.body).showModalFlat('INFORMATION',submit_txt,true,false, '', 'ok', '', 'cl-modal cl-none-title cl-cmmodal cl-p130 cl-s-btn w560');
5409						setDefaultContactForm(el);
5410						setDefaultContactFormEtc(el);
5411						if(typeof contactCallback == 'function')
5412							contactCallback(el_id);
5413					}
5414				},'json');
5415				    setTimeout(function() {
5416					    $.modalOFF();
5417				    },1000);
5418			};
5419
5420			if(captcha_display) {
5421				$.modalOFF();
5422				showSubmitCaptchaModal($parent, el_id, function(captcha, captchaModal, captchaBlocklang) {
5423					submitContact(captcha, captchaModal, captchaBlocklang);
5424				});
5425			} else {
5426				submitContact('', null, getSubmitCaptchaLang($parent));
5427			}
5428		    } else {
5429		    	$.modalOFF();
5430		    	var check_str = '';
5431		    	$.each(check_option,function(k,v) {
5432		    		check_str = (check_str) ? check_str + ' / ': '';
5433		    		check_str = check_str + v;
5434	            });
5435	            
5436		    	if(check_str) {
5437		    		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');
5438		    	} else {
5439		    		var modal = $(this).showModalFlat('INFORMATION',$.lang[LANG]['message.privacy.check.required'],true,false, '', 'ok');
5440		    	}
5441		    	
5442		    }					    
5443		});	
5444	
5445		$('.contact-privacy-text').live('click',function() {
5446			var contactEL = $(this).parents('.element'),
5447				contactPriavcy = $(contactEL).find('.form-inline .contact-privacy-area .contact-privacy-box'),
5448				checkType = (typeof $(contactEL).attr('data-type') != 'undefined' && $(contactEL).attr('data-type') == 'contact') ? true : false;
5449
5450			if(checkType && contactPriavcy.length > 0) {
5451				if(contactPriavcy.css('display') == 'none') contactPriavcy.show();
5452				else contactPriavcy.hide();
5453			}
5454		});
5455		
5456		$('.element .gallery-loadmore').live({
5457		    click: function(e) {
5458				if(typeof $(this).data('id') == 'undefined' || typeof $(this).data('page') == 'undefined') {
5459					e.preventDefault();
5460					return false;
5461				}
5462
5463				var $gLoadmoreBtn = $(this);
5464				var id = $gLoadmoreBtn.attr('data-id');
5465				var mode = $gLoadmoreBtn.attr('data-mode');
5466				var gpage = Number($gLoadmoreBtn.attr('data-page') || 1);
5467				var view = Number($gLoadmoreBtn.attr('data-view') || 6);
5468
5469				var $gEl = $('.element[data-id="' + id + '"]');
5470				var $gContainer = $gEl.find('.container');
5471				var $gLoop = $gEl.find('[data-loop="true"]');
5472				var $gtoolbar = getGToolbar($gEl);
5473				var $gc =  $gtoolbar.find('.cl-gcate-list .cl-gcate-item.active');
5474		        var $go = $gtoolbar.find('.cl-gsort-list .cl-gsort-item.active a');
5475				var sfl = ($gc.index() > 0) ? 'category' : '';
5476				var stx = (sfl) ? $gc.text().trim() : '';
5477		        var orderby = ($go.length > 0) ? $go.attr('data-orderby') : 'recent';
5478
5479		        var val = galleryEL[id];
5480		        var tag = htmlspecialchars_decode(val.eltag,'ENT_QUOTES');
5481		        var g_settings = (typeof val.elsettings != 'undefined' && val.elsettings) ? $.parseJSON(val.elsettings) : {};
5482		        var folder = (typeof val.folder != 'undefined' && val.folder > 0) ? val.folder : '';
5483		        var isMasonry = $gLoadmoreBtn.hasClass('masonry-layout');
5484		        var block_lang = (typeof g_settings.blocklang != 'undefined') ? g_settings.blocklang : LANG;
5485
5486				var nodes = $gLoop.clone().children('.grid');
5487				initGalleryField(nodes);
5488
5489				var g_number = $gLoop.data('gallery-no');
5490				var total = 0;
5491				var items = 0;
5492				var gallery_item = '';
5493
5494				var checkLoadmoreInLoop = ($(tag).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
5495				var glm = $(tag).find('.loadmore-wrap');
5496
5497				var checkGallerySVG = ($(tag).find('.gimg-svg-wrap').length > 0) ? true : false;
5498				var checkGFrameTitleOFF = (val.mode == 'gallery' && (typeof g_settings.gframe_title_visible != 'undefined' && g_settings.gframe_title_visible == 'OFF')) ? true : false;
5499
5500				if(id == 'all_products') {
5501		       		sfl = 'orderby';
5502		       		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');
5503		       	}				
5504
5505				var checkUseComment = checkUseCommentFunc(val.mode, val.eltag);
5506				var checkUseLike = checkUseLikeFunc(val.mode, val.eltag);
5507				var uri = getSearchURL();
5508				// if(uri.category_no == '') {
5509				// 	uri.category_no = (typeof g_settings.lux_category_no != 'undefined') ? g_settings.lux_category_no : '';
5510				// }
5511				if (isObjectEmpty(uri) && _this.b.LUX) {
5512					uri = val.searches.uri;
5513				}
5514	
5515		        $.ajax({
5516		            url: '/template/gallery/list/pid/' + id + '/sid/' + property.SID + '/spage/' + property.PAGE + '/page/' + gpage + '/view/' + view + '/publish/' + property.PUBLISH,
5517					data: { g_mode: mode, visible: true, sfl: sfl, stx: stx, orderby: orderby, total: true, uri : uri },
5518					dataType: 'json',
5519					type: 'POST',
5520		            async: false,
5521		            cache: false,
5522		            success: function (data) {
5523		            	$.cookie('gallery-page-' + id, gpage, { path: '/', expires: 12 * 60 * 60 * 1000 });
5524		                $.cookie('gallery-category-' + id, stx, { path: '/', expires: 12 * 60 * 60 * 1000 });
5525	                    $.cookie('gallery-orderby-' + id, orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
5526						if($gEl.is('[data-gjs]') && gpage > 1) setLoadmoreGalleryJS($gEl.attr('data-gjs'),id,true);
5527
5528		                var loop_count = nodes.length;
5529
5530                        total = (typeof data.total.list_total != 'undefined') ? data.total.list_total : data.total;
5531		                items = data.list.length;
5532
5533		                var g_popup_remove = $('.galleryPL'+id+'.gallery-popup').find('.gallery-item');
5534		                $.each(g_popup_remove,function(i,v) {
5535		                	if(items > i) $(this).remove();
5536		                });
5537
5538		                $.each(data.list,function(i,v) {
5539		                    loop_pos = i%loop_count;
5540		                    c = nodes[loop_pos];
5541		                    item_index = ((gpage-1)*view) + i;
5542                            var isTitle = (v.title.length > 0) ? true:false,
5543                                isCaption = (v.caption.length > 0) ? true:false;
5544
5545							$(c).addClass('gallery-item').attr('data-index',item_index).attr('data-gpos',v.pos).attr('data-seq',v.seq);
5546							
5547                            var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {};
5548						    var img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/';
5549						    var img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
5550
5551							var src = getServeImage(v.image,val.folder,img_path),
5552								src_s0 = getServeImage(v.image,'0',img_path);
5553							if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
5554							ensureGalleryResponsiveImageClass($(c));
5555							if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
5556							if(checkGallerySVG) {
5557								var gimgSVG = $(c).find('.gimg-svg-wrap svg');
5558								gimgSVG.find('pattern').attr('id','gimgSvg_'+val.elname+'_'+item_index);
5559								gimgSVG.find('image').attr('xlink:href', src);
5560								gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+val.elname+'_'+item_index+')');
5561							}
5562							
5563							var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
5564								glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
5565
5566							if(glink) {
5567								if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
5568									var bookmark_seq = glink.replace(/^\@/g,'');
5569									if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
5570										glink = '';
5571										glink_target = '';
5572									}
5573								} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
5574									glink_target = '';
5575								} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
5576								} else {																					// link-type: link-out      ==> a[attr-link]
5577									if(checkBase64Encode(glink)) glink = Base64.decode(glink);
5578								}
5579							}
5580
5581							$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
5582							if (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON' && property['SITEUM'] >= 1) {
5583								$(c).addClass('gallery-item').addClass('nonePrice');
5584								$(c).find('a').attr('href', '#');
5585							} else {
5586                                if(glink) {
5587									var glink_val = makeLinkUrl(glink, b.ONE, b.VIEW);
5588									$(c).find('a').attr('href',glink_val);
5589
5590									if(glink.match(/^\@/g)) {
5591										$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
5592									} else if(glink.match(/^flink\@[0-9]/g)) {
5593										$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
5594									// IE ERROR_includes__H.20210603
5595									// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
5596									} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
5597										$(c).find('a').attr('data-user-link',glink_val);
5598									} else {
5599										$(c).find('a').attr('attr-link',glink);
5600									}
5601                                } else {
5602									if (val.mode == 'gallery') {
5603										src_s0 = src_s0 + '?gpos='+v.pos;
5604
5605										$(c).find('a').attr('href', src_s0);
5606										$(c).find('a').attr('data-gallery', '#gframe-' + val.seq);
5607									} else {
5608										if(val.seq == 'all_products') {
5609											$(c).find('a').attr('href', v.product_url);
5610											$(c).removeClass('nonePrice');
5611										} else {
5612											if(_this.b.LUX) $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
5613											else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
5614			
5615											// $(c).find('a').attr('href', ((b.URL=='/') ? '' : b.URL) + '/' + b.PAGE + '/view/' + v.seq);
5616										}
5617									}
5618	                            }
5619	                        }
5620
5621		                    if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
5622		                    else $(c).find('a').removeAttr('target');
5623
5624							$(c).find('.non_text').removeClass('non_text');
5625							
5626							if(mode != 'shopping') {
5627								if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
5628								if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
5629							}
5630
5631							if(v.title.length==0) v.title = $.lang[block_lang]['editor.block.gallery.sample.title'];
5632							if(v.caption.length==0) v.caption = $.lang[block_lang]['editor.block.gallery.sample.caption'];
5633
5634							if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
5635							else $(c).find('a').attr('data-title', v.title);
5636
5637							if(mode != 'shopping' && isCaption && $(c).find('p.figure.caption').length == 0) {
5638								var $captionParent = ($(c).find('.fig_price').length > 0) ? $(c).find('.fig_price').first() : $(c).find('figcaption').first(),
5639									captionClass = 'figure caption';
5640								if($captionParent.length >
5640 0) $captionParent.prepend('<p class="' + captionClass + '"></p>');
5641							}
5642
5643		                    // caption
5644		                    var ftitle = $(c).find('h5.figure'),
5645		                        fcaption = $(c).find('p.figure').not('.comment'),
5646		                        fdatetime = $(c).find('.figure.datetime'),
5647		                        fhashtag = $(c).find('.figure.hashtag'),
5648		                        fbrand = $(c).find('.figure.brand'),
5649		                        fprice = $(c).find('.figure.price'),
5650								freview = $(c).find('.figure.review'),
5651								fcomment = $(c).find('.figure.comment'),
5652								flike = $(c).find('.figure.like'),
5653								fbasket = $(c).find('.figure.basket');
5654
5655		                    $(c).find('figcaption').removeClass('hide');
5656							if(v.title || v.caption) {
5657								var gallery_caption = v.caption;
5658								gallery_caption = gallery_caption.replace(/\n/g,'<br />');
5659
5660								ftitle.html(v.title);
5661								fcaption.html(gallery_caption);
5662								if(mode != 'shopping' && !isCaption) $(c).find('p.figure.caption').remove();
5663								if(fdatetime.length > 0) fdatetime.text(v.datetime);
5664								if(fhashtag.length > 0) fhashtag.text(v.hashtag);
5665							}
5666							
5667	                        if(g_number) {
5668	                            var g_index = String(item_index + 1),
5669	                                g_num = g_index.padStart(g_number, '0');
5670	                            $(c).find('.figure.number').text(g_num);
5671	                        }
5672
5673							if(fbrand.length > 0) {
5674								var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
5675								fbrand.html(v.brand_name);
5676							}
5677
5678							if(mode == 'shopping' || id == 'all_products') {
5679								fcomment.addClass('hide');
5680								flike.addClass('hide');
5681								
5682								v.price = parseFloat(v.price);
5683								v.sale = parseFloat(v.sale);
5684								var checkPriceHidden = (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON') ? true : false,
5685									gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
5686									gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
5687									gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
5688									product_soldout = '품절',
5689									product_no_sale = (typeof g_settings.sh_soldout == 'string') ? g_settings.sh_soldout : '구매불가',
5690									product_status = '';
5691								if(v.status == 'off' && !checkPriceHidden) {
5692									product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
5693								} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
5694									product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
5695								}
5696
5697								$(c).find('.cl-sh-soldout').remove();
5698								if(product_status != '') $(c).attr('data-soldout',true);
5699								else $(c).removeAttr('data-soldout');
5700
5701								$(c).find('.product-badge').remove();
5702								product_status += drawBadgeList(v.use_badge, data.badge_settings);
5703
5704								$(c).find('.cl-sh-limit').remove();
5705								if(v.status == 'lim') {
5706                                    if(v.sale_now == false) {
5707                                        var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
5708			                            if(freview.length > 0) {
5709			                                freview.after(product_limit);
5710			                            } else {
5711			                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
5712			                            }
5713                                    }
5714                                }
5715
5716								if($(c).find('ul.figure.price').length > 0) {
5717									// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
5718	                                //     off_str = (price_off > 0) ? price_off + '% ' : ''
5719									var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
5720									if(!_this.b.LUX) off_str = gallery_sale_per;
5721									//Ver02
5722									if(!checkPriceHidden) {
5723										$(c).find('ul.figure.price .price-val').html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
5724										$(c).find('ul.figure.price .price-val').removeClass('hide');
5725
5726										if(gallery_sale_price > 0 && gallery_price  < gallery_sale_price) {
5727											$(c).find('ul.figure.price .price-sale').html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
5728											$(c).find('ul.figure.price .price-sale-per').html(off_str);
5729											$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').removeClass('hide');
5730											if(_this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
5731												$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
5732											}
5733										} else {
5734											$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').addClass('hide').html('');
5735										}
5736
5737										$(c).find('ul.figure.price .price-unit-pricing').remove();
5738                                        if(v.product_unit_str) {
5739                                            $(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
5740                                        }
5741									} else {
5742                                        $(c).find('ul.figure.price .price-val').html('₩0');
5743                                        $(c).find('ul.figure.price .price-val').addClass('hide');
5744									}
5745									if(id == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
5746									if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
5747
5748									var badge_size = getBadgeSize(data.badge_settings);
5749									$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
5750									$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
5751									if(badge_size) {
5752										$(c).find('.cl-sh-soldout').addClass(badge_size);
5753										$(c).find('.cl-sh-limit').addClass(badge_size);
5754									}
5755								} else {
5756									//Ver01
5757									if(fprice.length == 0) fprice = fcaption;
5758
5759									if(checkPriceHidden) fprice.html('');
5760									else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
5761								}
5762
5763								if($(c).find('ul.figure.review').length > 0) {
5764									var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
5765									if(gallery_review > 0) {
5766										$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
5767										$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
5768										$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
5769									} else {
5770										$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
5771										$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
5772									}
5773								}
5774
5775								if(fbasket.length > 0) {
5776									var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
5777										checkOldverBasket = (typeof g_settings.field_oldver != 'undefined' && g_settings.field_oldver && g_settings.field_oldver.indexOf('basket') > -1) ? true : false,
5778										checkDisabledBasket = (typeof g_settings.field_disable != 'undefined' && g_settings.field_disable && g_settings.field_disable.indexOf('basket') > -1) ? true : false;
5779									if(v.basket_off) fbasket.addClass('cannotby hide');
5780									else if(id == 'all_products') fbasket.removeClass('hide');
5781									else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
5782									else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
5783									else fbasket.removeClass('hide');
5784								}
5785
5786
5787							} else {
5788								fbrand.addClass('hide');
5789								fprice.addClass('hide');
5790								freview.addClass('hide')
5791								fbasket.addClass('hide');
5792
5793								if ( checkUseComment 
5794									&& g_settings.comment_display == 'ON'
5795									&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('comment') > -1)
5796									&& fcomment.length > 0
5797									&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
5798								) {
5799									fcomment.removeClass('hide');
5800									fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
5801								} else {
5802									fcomment.addClass('hide');
5803									fcomment.find('.figure-comment-cnt').empty();
5804								}
5805	
5806								if ( checkUseLike 
5807									&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
5808									&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('like') > -1)
5809									&& flike.length > 0
5810								) {
5811									flike.removeClass('hide').find('.figure-like-cnt').html(0);
5812									if(v.like !== undefined) {
5813										flike.find('.figure-like-cnt').html(v.like.cnt);
5814										if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
5815									}
5816								} else {
5817									flike.addClass('hide');
5818								}
5819							}
5820
5821                            if(checkUseLike == false) flike.html('');
5822
5823							if(isMasonry) {
5824								gallery_item = gallery_item + $(c)[0].outerHTML;
5825							} else {
5826								if(checkLoadmoreInLoop) $gLoop.find('.loadmore-wrap').before($(c)[0].outerHTML);
5827								else $gLoop.append($(c)[0].outerHTML);
5828							}
5829		                });
5830		            }
5831		        });
5832				changeBrokenImages($gEl);
5833
5834				if(isMasonry) {
5835					$('.gallery-loadmore[data-id="' + id + '"]').before('<div class="gallery-loading-status"><div class="loading-dots"></div></div>');
5836					showHideGalleryField($gEl,g_settings);
5837					reloadBlockMasonry('add',$gEl,$(gallery_item));
5838				} else {
5839					showHideGalleryField($gEl,g_settings);
5840				}
5841
5842				var cookie_page = gpage;
5843				var new_view = (view > total) ? total : view;
5844				var cookie_view = ( (cookie_page*new_view) > total ) ? total : cookie_page*new_view;
5845
5846				$gEl.find('.display').text(cookie_view);
5847
5848				var $glmBtnWrap = $gLoadmoreBtn.closest('.loadmore-wrap');
5849				var $glmBtn = $gEl.find('.loadmore-wrap .gallery-loadmore');
5850				var checkLoadmore = (total > view && total > cookie_view) ? true : false;
5851				
5852				if($glmBtnWrap.length == 0) {
5853					// gallery loadmore btn - default (ver1)
5854					if(checkLoadmore) $gLoadmoreBtn.attr('data-page', cookie_page + 1);
5855					else $gLoadmoreBtn.remove();
5856				} else {
5857					// gallery loadmore btn - custom (ver2)
5858					if(checkLoadmore) {
5859						$glmBtn.attr('data-page', cookie_page + 1);
5860						$glmBtnWrap.removeClass('hide').fadeIn();
5861					} else {
5862						$glmBtnWrap.fadeOut().addClass('hide');
5863						$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');
5864						$glmBtn.find('.display .view').text('0');
5865						$glmBtn.find('.display .total').text('0');
5866					}
5867				}
5868
5869				if($gEl.has('input.gjs').length) setGalleryJS('add-loop',$gEl);
5870				
5871				if($gEl.find('*[data-direffect="true"]').length > 0 ) {
5872					setTimeout(function() {
5873						$gEl.find('.grid').each(function() {
5874							$(this).hoverdir();
5875						});
5876					}, 400);
5877				}
5878			}
5879		});
5880
5881		$('.gallery-loadmore, .data-feed-load-more').live('touchstart', function (e) {
5882			var g_color = $(this).css('color'),
5883				g_bgcolor = $(this).css('background-color'),
5884				g_bdcolor = $(this).css('border-color');
5885
5886			if(isMobile()) {
5887				$(this).css('color', g_color);
5888				$(this).css('background-color', g_bgcolor);
5889				$(this).css('border-color', g_bdcolor);
5890			}
5891		});
5892		
5893		$('.gallery-item a[title]').live('mouseenter', function () {
5894		    $(this).tooltip('destroy');
5895		});
5896
5897		$('.gallery-item a:not([attr-flink])').live({
5898			click : function(e) {
5899		    	e.preventDefault();
5900				if($(e.target).is('.figure.basket') || $(e.target).is('.basket-btn')) return false;
5901
5902				var loc = $(this).attr('href'),
5903					mode = $(this).attr('data-gallery'),
5904					menu_link = $(this).attr('data-user-link'),
5905					bookmark = $(this).attr('attr-bookmark'),
5906					blank = $(this).attr('target'),
5907					user_link = $(this).attr('attr-link');
5908
5909				if( (typeof mode!='undefined' && mode.length>0) ||
5910					(typeof menu_link!='undefined' && menu_link.length>0) ||
5911					// (typeof user_link!='undefined' && user_link.length>0) ||
5912					(typeof bookmark!='undefined' && bookmark.length>0) 
5913				) return;
5914
5915				if(typeof blank!='undefined' && blank.length) {
5916					var url = (typeof user_link != 'undefined' && user_link.match('^(tel:|mailto:|sms:)') === null) ? makeLinkUrl(user_link, b.ONE, b.VIEW) : loc;
5917					var openNewWindow = window.open(url);
5918				} else {
5919					if(typeof user_link != 'undefined' && user_link) {
5920						location.href=loc;
5921					} else {
5922						var url = new getLocation(loc);
5923						golink(_this,url);
5924					}
5925		    	}
5926
5927		    	// 	uri = (b.PUBLISH) ? loc : loc.replace('/render/',''),
5928		    	// 	attr = $(this).attr('attr-link');
5929
5930		    	// if(typeof attr!='undefined' && attr) return;
5931	    		// _this.history.pushState(null,b.TITLE,(b.PUBLISH) ? '/' : '/render/' + uri);
5932			}
5933		});
5934		$('.gallery-item .figure.like').live('click', function(e){
5935			e.preventDefault();
5936			return false;
5937		});
5938		$('.gallery-item .figure.basket, .pitem .basket-box').live('click', function(e) {
5939			e.preventDefault();
5940			var checkPsearch = ($(this).closest('.pitem').length > 0) ? true : false;
5941			if(b.PUBLISH) {
5942				if(!checkPsearch && $(this).closest('.gallery-item').hasClass('nonePrice')) {
5943					$(this).closest('.nonePrice').click();
5944					return false;
5945				}
5946
5947				var tmp_pid = (checkPsearch) ? $(this).closest('.pitem').attr('data-pid') : $(this).closest('.element').attr('data-id'),
5948					tmp_seq = (checkPsearch) ? $(this).closest('.pitem').attr('data-gid') : $(this).closest('.gallery-item').attr('data-seq');
5949				$.quickbasket.init(b.SID,tmp_pid,tmp_seq);
5950			} else {
5951				$(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');
5952				return false;
5953			}
5954		});
5955
5956		// tab-box left-right button event
5957		$(document).on('click', '.left-arrow .arrow:not(.hide) .before', function(e){ 
5958			var horizontal = $(this).closest('.tabs').attr('tab-horizontal'),
5959				motion = Number($(this).closest('.tabs').attr('tab-motion')),
5960				len = $(this).closest('.container').find('.tab-box .tab:not(.hover)').length,
5961				motion_style = $(this).closest('.tabs').attr('tab-motion-style'),
5962				tab_counted = $(this).closest('.tabs').attr('tab-count'),
5963				mobile_tab_count = $(this).closest('.tabs').attr('mobile-tab-count'),
5964				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'),
5965				w = $(window).width(),
5966				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'),
5967				tab_case = $(this).closest('.tabs').attr('data-case');
5968			
5969			if(!$(this).closest('.tabs').attr('tab-motion') || $(this).closest('.tabs').attr('tab-motion') == 'undefined') return false;
5970	
5971			if(horizontal == 1) { // 가로형
5972				var	tab_each = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w),
5973					max_width = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth(true)) * len,
5974					tab_width = (Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w)) * tab_count,
5975					length = max_width / tab_width,
5976					mo = Number(len) - tab_count;
5977				// 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);
5978			} 
5979	
5980			if(motion_style == 1) { // 한칸씩 이동
5981				motion = motion - 1;
5982				if(motion < 0) motion = 0;
5983				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
5984	
5985				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_each, len, motion_style, tab_count, tab_case, tab_counted);
5986	
5987			} else { // 한페이지씩 이동
5988				motion = motion - 1;
5989				if(motion < 0) motion = 0;
5990				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
5991	
5992				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_width, length, motion_style, tab_count, tab_case, tab_counted);
5993			}
5994			
5995		});
5996		$(document).on('click', '.right-arrow .arrow:not(.hide) .after', function(e){ 
5997			var horizontal = $(this).closest('.tabs').attr('tab-horizontal'),
5998				motion = Number($(this).closest('.tabs').attr('tab-motion')),
5999				len = $(this).closest('.container').find('.tab-box .tab:not(.hover)').length,
6000				motion_style = $(this).closest('.tabs').attr('tab-motion-style'),
6001				tab_counted = $(this).closest('.tabs').attr('tab-count'),
6002				mobile_tab_count = $(this).closest('.tabs').attr('mobile-tab-count'),
6003				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'),
6004				w = $(window).width(),
6005				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'),
6006				tab_case = $(this).closest('.tabs').attr('data-case');
6007			
6008			if(!$(this).closest('.tabs').attr('tab-motion') || $(this).closest('.tabs').attr('tab-motion') == 'undefined') return false;
6009	
6010			if(horizontal == 1) { // 가로형
6011				var	tab_each = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w),
6012					max_width = Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth(true)) * len,
6013					tab_width = (Number($(this).closest('.container').find('.tab-box .tab:not(.hover)').outerWidth()) + Number(tab_interval_w)) * tab_count,
6014					length = max_width / tab_width,
6015					mo = Number(len) - tab_count;
6016				// 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);
6017			} 
6018	
6019			if(motion_style == 1) { // 한칸씩 이동
6020				motion = motion + 1;
6021				if(motion > mo) motion = mo;
6022				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6023	
6024				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_each, len, motion_style, tab_count, tab_case, tab_counted);
6025	
6026			} else { // 한페이지씩 이동
6027				motion = motion + 1;
6028				if(motion >= length) motion = Math.ceil(length) - 1;
6029				$('.'+$(this).closest('.tabs').attr('data-name')).attr('tab-motion', motion);
6030	
6031				tabMotion($(this).closest('.tabs').attr('data-name'), motion, tab_width, length, motion_style, tab_count, tab_case, tab_counted);
6032			}
6033		});
6034		$(document).on('click', '.tab-box .tab', function(){
6035			var w = $(document).outerWidth(),
6036				horizontal = $(this).closest('.tabs').attr('tab-horizontal');
6037			if(w < 767 && $(this).find('.tab-editor').hasClass('active')) {
6038				$(this).find('.tab-editor').removeClass('active');
6039			} else {
6040				var editor = $(this).index() + 1,
6041					order = $(this).attr('data-order');
6042					// num = $('.tab-editor.active.t'+order).outerHeight();
6043	
6044				$(this).siblings().removeClass('active');
6045				$(this).addClass('active');
6046	
6047				if(horizontal == 0) { // 세로형
6048					$(this).closest('.tab-box').find('.tab .tab-editor').removeClass('active');
6049					$(this).closest('.tab-box').find('.tab .tab-editor.tabs'+order).addClass('active');
6050				} else { // 가로형
6051					$(this).closest('.tab-width').siblings('.editor-box').children('.tab-editor').removeClass('active');
6052					$(this).closest('.tab-width').siblings('.editor-box').children('.tab-editor.tabs'+order).addClass('active');
6053				}
6054			}
6055		});
6056
6057		$('.tab-wrapper .tab-box .tab').live({
6058			click: function() {
6059				$(this).removeClass('hover');
6060			},
6061			mouseover: function() {
6062				$('.tab-wrapper .tab-box .tab:not(.hide)').removeClass('hover');
6063				if(!$(this).hasClass('active'))	$(this).addClass('hover');
6064			},
6065			mouseout: function() {
6066				$('.tab-wrapper .tab-box .tab:not(.hide)').removeClass('hover');
6067			}
6068		});
6069
6070		$('.userELallProducts .cl-gsort-list li').live({
6071			mouseover: function() {
6072				$(this).addClass('hover');
6073				$(this).siblings().removeClass('hover');
6074			},
6075			mouseout: function() {
6076				$('.userELallProducts .cl-gsort-list li').removeClass('hover');
6077			}
6078		});
6079
6080		//calendar 블럭
6081		let currentDate = new Date();
6082		let currentEvent = null;
6083		let lastEventsList = null;
6084		let lastEventsWeekday = null;
6085		let calendarElsettings = new Map();
6086		let googleColor = new Map();
6087		const monthCache = new Map();
6088		const inflight    = new Map();
6089
6090		//calendar textarea//
6091		const SEL = '.calendar-modal-body .modal-field.content textarea';
6092		function getMax() {
6093			const w = window.innerWidth || document.documentElement.clientWidth;
6094			if (w >= 1200) return 500;   // 1200px 이상
6095			if (w >= 768)  return 400;   // 1199~768px
6096			return 320;                  // 767px 이하
6097		}
6098		function fit($ta) {
6099			const el = $ta[0];
6100			const min = parseFloat(getComputedStyle(el).minHeight) || 120;
6101			const MAX = getMax();
6102
6103			$ta.css('height', 'auto');
6104
6105			const sh = el.scrollHeight; 
6106			const h  = Math.max(min, Math.min(sh, MAX));
6107
6108			$ta.css({
6109				height: h + 'px',
6110				overflowY: sh > MAX ? 'auto' : 'hidden'
6111			});
6112		}
6113		function refitAll() {
6114			$(SEL).filter(':visible').each(function () {
6115				fit($(this));
6116			});
6117		}
6118		function debounce(fn, wait = 120) {
6119			let t; 
6120			return function () {
6121				clearTimeout(t);
6122				t = setTimeout(() => fn.apply(this, arguments), wait);
6123			};
6124		}
6125		let lastMax = getMax();
6126		$(window).on('resize.autogrow orientationchange.autogrow', debounce(function () {
6127			const curMax = getMax();
6128			if (curMax !== lastMax) {
6129				lastMax = curMax;
6130				refitAll();
6131			}
6132		}));
6133		$(document).on('input change', SEL, function () {
6134			fit($(this));
6135		});
6136		////////////////////////////////////////////////////////////////////////////////////
6137
6138		$.cl_calendar = {
6139			active : '',
6140			events : [],
6141			instances : {},
6142			// currentDate : new Date(),
6143			init : function(sid, pid, yearMonth, c) { 
6144				if(typeof sid == 'undefined' || typeof pid == 'undefined') {
6145					alert('Undefined SID,PID');
6146					return false;
6147				}
6148
6149				$(`[data-type="calendar"][data-id="${pid}"]`).removeClass('_calendar'); //_calendar가 html붙어버릴경우
6150
6151				// pid 별로 관리되는 인스턴스 생성
6152				if(!$.cl_calendar.instances[pid]) {
6153					$.cl_calendar.instances[pid] = {
6154						currentDate: new Date(),
6155						events: []
6156					};
6157				}
6158				$.cl_calendar.instances[pid].config = c;
6159
6160				var instance = $.cl_calendar.instances[pid];
6161
6162				if(typeof yearMonth !== 'undefined' && yearMonth != '') {
6163					var parts = yearMonth.split('-');
6164					instance.currentDate = new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, 1);
6165				}
6166				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
6167				var y = instance.currentDate.getFullYear();
6168				var m = String(instance.currentDate.getMonth() + 1).padStart(2, '0');
6169				var ym = (yearMonth && yearMonth !== '') ? yearMonth : (y + '-' + m);
6170
6171				if(data_type != '') {
6172					$.ajax({
6173						url: '/template/get_calendar',
6174						data: { sid: sid, pid: pid, yearMonth: ym, data_type: data_type },
6175						type: 'POST',
6176						dataType: 'json',
6177						success: function (data) {
6178							checkError(data);
6179							var inst = $.cl_calendar.instances[pid];
6180
6181							var dataArr = Array.isArray(data) ? data : [];
6182
6183							inst.events = dataArr;
6184							$.cl_calendar.draw(pid, data_type, c);
6185
6186							// --- 모바일 이벤트 렌더링 (선택 월 기준) ---
6187							var $root = $('.element[data-id="' + pid + '"]');
6188							if ($root.find('.mobile-events').length === 0) {
6189								$root.find('.notice').before('<div class="mobile-events"></div>');
6190							}
6191							var $mobile = $root.find('.mobile-events').empty();
6192
6193							var currentYear = inst.currentDate.getFullYear();
6194							var currentMonth = inst.currentDate.getMonth() + 1;
6195
6196							var countThisMonth = 0;
6197							var eventMap = {};
6198
6199							$.each(dataArr, function (i, v) {
6200								var d = new Date(v.s_date);
6201								var year = d.getFullYear();
6202								var month = d.getMonth() + 1;
6203
6204								if (year === currentYear && month === currentMonth) {
6205									countThisMonth++;
6206									var dateKey = v.s_date; // 'YYYY-MM-DD'
6207									var time = (v.fulltime === 'Y') ? '종일' : (v.s_time + ' ~ ' + v.e_time);
6208									if (!eventMap[dateKey]) eventMap[dateKey] = [];
6209									eventMap[dateKey].push(
6210										'<div class="event-memo"><span class="event-time">' + time + '</span>' + (v.memo || '') + '</div>'
6211									);
6212								}
6213							});
6214
6215							var html = '';
6216							if (countThisMonth === 0) {
6217								html += ''
6218								+ '<div class="event-date"></div>'
6219								+ '<div class="event-memo"><span class="event-time noschedule">이번달 일정이 없습니다.</span></div><br>';
6220							} else {
6221								var sortedDates = Object.keys(eventMap).sort();
6222								$.each(sortedDates, function (i, date) {
6223									html += '<div class="event-date">' + date_string(date) + '</div>';
6224									$.each(eventMap[date], function (j, memoHtml) { html += memoHtml; });
6225									html += '<br>';
6226								});
6227							}
6228
6229							$mobile.append(html);
6230						}
6231					});
6232				} else {
6233					var elsettings = JSON.parse(c.elsettings);
6234					instance.readChmod = elsettings.read_chmod;
6235					// instance.canShowAll = calendarShow(elsettings);
6236					calendarElsettings.set(pid, calendarShow(elsettings));
6237					fetchMonth(pid, ym, data_type)
6238						.then(function(evts) {
6239							$.cl_calendar.instances[pid].events = evts || [];
6240							monthCache.set(ym, evts || []);
6241							$.cl_calendar.draw(pid, data_type, c);
6242						}).catch(function() {
6243							$.cl_calendar.draw(pid, data_type, c);
6244						});
6245				}
6246
6247				
6248				
6249			},
6250			draw: function(pid, type, c) {
6251				if(type) {
6252					if (!$.cl_calendar.instances[pid]) {
6253						// console.error(`draw called but instance for pid=${pid} is not initialized yet`);
6254						return;
6255					}
6256					var instance = $.cl_calendar.instances[pid];
6257					const year = instance.currentDate.getFullYear();
6258					const month = instance.currentDate.getMonth();
6259
6260					const firstDay = new Date(year, month, 1);
6261					const lastDay = new Date(year, month + 1, 0);
6262					const firstDayOfWeek = firstDay.getDay();
6263					const prevLastDay = new Date(year, month, 0).getDate();
6264					$('.userEL'+pid+' .days').empty();
6265
6266					for (let i = firstDayOfWeek - 1; i >= 0; i--) {
6267						const day = prevLastDay - i;
6268						const curDate = new Date(year, month - 1, day);
6269						const dateString = formatDate(curDate);
6270						const dayElement = createDayElement(curDate, dateString, true, pid);
6271						$('.userEL'+pid+' .days').append(dayElement);
6272					}
6273
6274					for (let i = 1; i <= lastDay.getDate(); i++) {
6275						const curDate = new Date(year, month, i);
6276						const dateString = formatDate(curDate);
6277						const dayElement = createDayElement(curDate, dateString, false, pid);
6278						$('.userEL'+pid+' .days').append(dayElement);
6279					}
6280
6281					const totalCellsNeeded = Math.ceil((firstDayOfWeek + lastDay.getDate()) / 7) * 7;
6282					const nextMonthschedule = totalCellsNeeded - (firstDayOfWeek + lastDay.getDate());
6283					
6284					for (let i = 1; i <= nextMonthschedule; i++) {
6285						const curDate = new Date(year, month + 1, i);
6286						const dateString = formatDate(curDate);
6287						const dayElement = createDayElement(curDate, dateString, true, pid);
6288						$('.userEL'+pid+' .days').append(dayElement);
6289					}
6290
6291					var data_case = $('.userEL'+pid).attr('data-case'); //calendar1 check
6292					if(data_case == 'calendar1') {
6293						$('.userEL'+pid+' .date_wrap').siblings('.date_bullet').remove();
6294						$('.userEL'+pid+' .date_wrap').remove();
6295						$('.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>');
6296					}
6297				} else {
6298					initCalendar(pid, c);
6299				}
6300			},
6301			write: function(dateAttr, el) {
6302				selectedDate = dateAttr;
6303				openEventModal(dateAttr, el);
6304			},
6305			modify: function(dateAttr, el, pid) {
6306				if (!$.cl_calendar.instances[pid]) {
6307					// console.error(`Calendar instance for pid=${pid} is not initialized yet`);
6308					return;
6309				}
6310				selectedDate = dateAttr;
6311				openEventList(dateAttr, $.cl_calendar.instances[pid].events, el);
6312			},
6313			save: function(pid, el) {
6314				el = '.'+el+' ';
6315				const eventId = $(el+'#eventId').val();
6316				const eventSeq = $(el+'#eventSeq').val();
6317				const eventSid = $(el+'#eventSid').val();
6318				const eventFulltime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? 'Y' : 'N';
6319				const eventStartDate = $(el+'#eventStartDate').val();
6320				const eventStartTime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? '' : $(el+'#eventStartTime').val();
6321				const eventEndDate = $(el+'#eventEndDate').val();
6322				const eventEndTime = ($(el+'#eventFulltime').val() != '' && $(el+'#eventFulltime').val() == 'Y') ? '' : $(el+'#eventEndTime').val();
6323				const eventMemo = $(el+'#eventMemo').val();
6324				
6325				// 유효성 검사
6326				if (!eventStartDate || (eventFulltime != 'Y' && !eventStartTime) || !eventEndDate || (eventFulltime != 'Y' && !eventEndTime) || !eventMemo) {
6327					alert('필수 항목을 모두 입력해주세요.');
6328					return;
6329				}
6330				
6331				// 종료일시가 시작일시보다 늦은지 확인
6332				const startDateTime = new Date(`${eventStartDate}T${eventStartTime}`);
6333				const endDateTime = new Date(`${eventEndDate}T${eventEndTime}`);
6334				
6335				if (endDateTime <= startDateTime) {
6336					alert('종료 일시는 시작 일시보다 나중이어야 합니다.');
6337					return;
6338				}
6339				
6340				// 이벤트 객체 생성
6341				const eventData = {
6342					sid: b.SID,
6343					seq: (eventSeq) ? eventSeq : '',
6344					pid: pid,
6345					month: eventStartDate.substring(0, 7),
6346					sdate: eventStartDate,
6347					stime: eventStartTime,
6348					edate: eventEndDate,
6349					etime: eventEndTime,
6350					fulltime: eventFulltime,
6351					notice: '',
6352					memo: eventMemo,
6353					check: 1
6354				};
6355
6356				if(eventData['sid'] == '' || eventData['sid'] == undefined) return false;
6357				
6358				var url = '/template/calendar';
6359				// if(eventSeq) {
6360				// 	url = '/template/modify_calendar';
6361				// } else {
6362				// 	url = '/template/calendar';
6363				// }
6364
6365				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
6366				$.ajax({
6367					url: url,
6368					data: { data: eventData },
6369					type: 'POST',
6370					dataType: 'json',
6371					success: function(data) {
6372						checkError(data);
6373						$.cl_calendar.instances[pid].events = data || [];
6374						$.cl_calendar.draw(pid, data_type);
6375					},
6376					error: function (xhr, status, error) {
6377						
6378					}
6379				});
6380				
6381				// 폼 초기화
6382				$(el+'#eventForm')[0].reset();
6383				$(el+'#eventId').val('');
6384				$(el+'.modal-schedule').fadeOut(300);
6385			}
6386		}
6387
6388		// 날짜 셀 클릭 이벤트 (동적으로 생성된 요소에 대한 이벤트 처리)
6389		$(document).on('click', '.calendar .day_wrap', function() {
6390			// console.log(1212);
6391			var dateAttr = $(this).data('date'),
6392				isEvent = $(this).find('.event').length,
6393				el = '.' + $(this).closest('.calendar').attr('data-name'),
6394				pid = $(this).closest('.calendar').attr('data-id');
6395
6396			var getYear = currentDate.getFullYear(),
6397				getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"), // getMonth는 0~11이므로 +1
6398				yearMonth = getYear + '-' + getMonth;
6399
6400			if(isEvent > 0) {
6401				var parts = dateAttr.split('-');
6402				var yearMonth = parts[0] + '-' + parts[1];
6403				$.cl_calendar.init(b.SID, pid, yearMonth);
6404				$.cl_calendar.modify(dateAttr, el, pid);
6405			}
6406		});
6407
6408		$(document).on('click', '.calendar ._prev_month_btn', function () {
6409			var pid = $(this).closest('.calendar').attr('data-id');
6410
6411			// 여기!
6412			var instance = $.cl_calendar.instances[pid];
6413			instance.currentDate.setMonth(instance.currentDate.getMonth() - 1);
6414
6415			var getYear = instance.currentDate.getFullYear(),
6416				getMonth = String(instance.currentDate.getMonth() + 1).padStart(2, "0"),
6417				yearMonth = getYear + '-' + getMonth,
6418				ym = getYear + '.' + getMonth;
6419
6420			$(this).siblings('.date_bullet').remove();
6421    		$(this).siblings('.date_wrap').remove();
6422    		$(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>');
6423
6424			$.cl_calendar.init(b.SID, pid, yearMonth);
6425		});
6426
6427		$(document).on('click', '.calendar ._next_month_btn', function () {
6428			var pid = $(this).closest('.calendar').attr('data-id');
6429
6430			var instance = $.cl_calendar.instances[pid];
6431			instance.currentDate.setMonth(instance.currentDate.getMonth() + 1);
6432
6433			var getYear = instance.currentDate.getFullYear(),
6434				getMonth = String(instance.currentDate.getMonth() + 1).padStart(2, "0"),
6435				yearMonth = getYear + '-' + getMonth,
6436				ym = getYear + '.' + getMonth;
6437
6438			$(this).siblings('.date_bullet').remove();
6439    		$(this).siblings('.date_wrap').remove();
6440    		$(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>');
6441
6442			$.cl_calendar.init(b.SID, pid, yearMonth);
6443		});
6444
6445		$(document).on('click', '.calendar ._today_btn', function() {
6446			var pid = $(this).closest('.calendar').attr('data-id');
6447			var instance = $.cl_calendar.instances[pid];
6448			instance.currentDate = new Date();
6449
6450			var ym = instance.currentDate.getFullYear() + '.' + String(instance.currentDate.getMonth() + 1).padStart(2, "0");
6451			$(this).parent('.calendar_btn_area').siblings('.date_bullet').remove();
6452			$(this).parent('.calendar_btn_area').siblings('.date_wrap').remove();
6453			$(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>');
6454			
6455			var yearMonth = instance.currentDate.getFullYear() + '-' + String(instance.currentDate.getMonth() + 1).padStart(2, "0");
6456			$.cl_calendar.init(b.SID, pid, yearMonth);
6457		});
6458
6459		// 모달 닫기 버튼 클릭 이벤트
6460		$(document).on('click','.calendar #cancelBtn, .calendar .modal-close', function() {
6461			closeEventModal();
6462		});
6463
6464		// 모달 외부 클릭 시 닫기
6465		$(document).on('click', '.calendar .modal-schedule', function(e) {
6466			if ($(e.target).hasClass('modal-schedule')) {
6467				closeEventModal();
6468			}
6469		});
6470
6471		$(document).on('click','.calendar .date._selectedCalendar',function(){
6472			var el = '.userEL' + $(this).closest('.calendar').attr('data-id');
6473
6474			// 현재 선택된 년월 추출
6475			var currentYM = $(this).attr('data-val');
6476			var parts = currentYM.split('.');
6477			var selectedYear = parts[0];
6478			var selectedMonth = parts[1].padStart(2, '0');
6479
6480			// 이미 열려있다면 제거
6481			if($('.date_list_area._yearMonthList').length > 0){
6482				$('.date_list_area._yearMonthList').remove();
6483				return;
6484			}
6485
6486			// 왼쪽 연도 리스트
6487			let currentYear = currentDate.getFullYear();
6488			let startYear = currentYear - 8;
6489			let endYear = currentYear + 8;
6490
6491			let years = '';
6492			for(let year = startYear; year <= endYear; year++) {
6493				let isSelected = (year == selectedYear) ? ' selected' : '';
6494				years += `<div class="year_item${isSelected}" data-year="${year}">${year}</div>`;
6495			}
6496
6497			let months = '';
6498			for(let month=1; month<=12; month++){
6499				let mm = month.toString().padStart(2, '0');
6500				let isSelected = (mm == selectedMonth) ? ' selected' : '';
6501				months += `<a href="#" class="month_item${isSelected}" data-month="${mm}" data-year="${selectedYear}">${mm}</a>`;
6502			}
6503
6504			// HTML 동적 삽입
6505			let html = `
6506			<div class="mobile_back"><button class="mobile_close">✕</button></div>
6507			<div class="date_list_area _calendarList _yearMonthList">
6508				<div class="year_month_wrap">
6509					<div class="year_list">${years}</div>
6510					<div class="month_list">${months}</div>
6511				</div>
6512				<div class="calendar_confirm_area">
6513					<button type="button" class="btn_cancel">취소</button>
6514					<button type="button" class="btn_confirm">확인</button>
6515				</div>
6516			</div>`;
6517
6518			$(this).after(html);
6519
6520			// 연도 리스트 스크롤 중앙
6521			var selectedYearEl = $(el+' .year_item.selected')[0];
6522			if(selectedYearEl) {
6523				selectedYearEl.scrollIntoView({block: "center", behavior: "smooth"});
6524			}
6525
6526			// 월 리스트 스크롤 중앙
6527			var selectedMonthEl = $(el+' .month_item.selected')[0];
6528			if(selectedMonthEl) {
6529				selectedMonthEl.scrollIntoView({block: "center", behavior: "smooth"});
6530			}
6531
6532			// 연도 클릭하면 월 리스트 갱신
6533			$(el+' .year_item').on('click', function(){
6534				let selectedYear = $(this).data('year');
6535				$(el+' .year_item').removeClass('selected');
6536				$(this).addClass('selected');
6537
6538				let monthsHtml = '';
6539				for(let month=1; month<=12; month++){
6540					let mm = month.toString().padStart(2, '0');
6541					monthsHtml += `<a href="#" class="month_item" data-month="${mm}" data-year="${selectedYear}">${mm}</a>`;
6542				}
6543				$(el+' .month_list').html(monthsHtml);
6544
6545				// 월 클릭 다시 바인딩
6546				bindMonthClick();
6547			});
6548
6549			function bindMonthClick(){
6550				$(el+' .month_item').on('click', function(e){
6551					e.preventDefault();
6552					$(el+' .month_item').removeClass('selected');
6553					$(this).addClass('selected');
6554					$(el+' .date._selectedCalendar').data('tempYear', $(this).data('year'));
6555					$(el+' .date._selectedCalendar').data('tempMonth', $(this).data('month'));
6556				});
6557			}
6558			bindMonthClick();
6559
6560			// 취소
6561			$(el+' .btn_cancel, '+el+' .mobile_close').on('click', function(){
6562				$(el+' .mobile_back').remove();
6563				$(el+' .date_list_area._yearMonthList').remove();
6564			});
6565
6566			// 확인
6567			$(el+' .btn_confirm').on('click', function(){
6568				let year = $(el+' .date._selectedCalendar').data('tempYear');
6569				let month = $(el+' .date._selectedCalendar').data('tempMonth');
6570				var pid = $(this).closest('.calendar').attr('data-id'),
6571					yearMonth = year + '-' + month;
6572				
6573				if(year && month){
6574					$(el+' .date._selectedCalendar').text(`${year}.${month}`).attr('data-val', `${year}-${month}`);
6575				}
6576				$(el+' .date_list_area._yearMonthList').remove();
6577
6578				$.cl_calendar.init(b.SID, pid, yearMonth);
6579			});
6580		});
6581
6582		// 날짜/시간선택 ampm
6583		$(document).off('click.clockToggle').on('click.clockToggle', '.calendar .calendarModal .timeselector .select:not(.ampm) .selector', function(e){
6584			e.preventDefault();
6585			e.stopPropagation();
6586			const $sel   = $(this).closest('.select');
6587			const $field = $sel.closest('.modal-field');
6588
6589			// ★ 드롭 닫힘을 잠시 무력화하는 락
6590			$field.data('dropOpenLock', true);
6591			setTimeout(()=>{ $field.removeData('dropOpenLock'); }, 150);
6592
6593			$sel.find('.drop').toggle();
6594			$sel.siblings('.select').children('.drop').hide();
6595		});
6596		$(document).on('click.clockCloseOnPick', '.calendar .calendarModal .timeselector .select .drop li', function (e) {
6597			e.stopPropagation();
6598			const $sel = $(this).closest('.select');
6599			setTimeout(() => { $sel.find('.drop').hide(); }, 0);
6600		});
6601		$(document).on('click.clockWidgetArea', '.calendar .bootstrap-datetimepicker-widget', function (e) {
6602			if ($(e.target).closest('.custom-clock .select').length === 0) {
6603				$(this).find('.custom-clock .select .drop').hide();
6604			}
6605		});
6606		$(document).on('click', '.calendar .calendarModal .timeselector .select.ampm .selector', function () {
6607			const $sel   = $(this);
6608			const $field = $sel.closest('.modal-field');
6609			const $input = $field.find('input.daytime');
6610			const dp     = getDp($field, $input);
6611			if (!dp) return;
6612
6613			const m = dp.date() ? dp.date().clone() : moment();
6614			const curType  = ($sel.attr('data-value') || $sel.attr('data-type') || (m.hour() >= 12 ? 'pm' : 'am')).toLowerCase();
6615			const nextType = (curType === 'am') ? 'pm' : 'am';
6616
6617			let H = m.hour();
6618			if (nextType === 'am') { if (H >= 12) H -= 12; } else { if (H < 12) H += 12; }
6619			m.hour(H).second(0);
6620			dp.date(m);
6621
6622			$sel.text(($.lang?.[$field.closest('.calendar').hasClass('en')?'en':'ko']?.['sc.banner.'+nextType]) || nextType.toUpperCase())
6623				.attr({'data-value': nextType, 'data-type': nextType});
6624
6625			$sel.closest('.custom-clock').find('.select .drop').hide();
6626		});
6627		$(document).on('click', '.calendar .calendarModal .timeselector .select.hour .drop li', function () {
6628			const $li    = $(this);
6629			const $field = $li.closest('.modal-field');
6630			const $input = $field.find('input.daytime');
6631			const dp     = getDp($field, $input);
6632			if (!dp) return;
6633
6634			const m = dp.date() ? dp.date().clone() : moment();
6635
6636			const $ampmSel = $li.closest('.timeselector').find('.select.ampm .selector');
6637			const ampm = ($ampmSel.attr('data-value') || $ampmSel.attr('data-type') || (m.hour() >= 12 ? 'pm' : 'am')).toLowerCase();
6638
6639			const hourStr = $li.attr('data-value') || $li.text().trim();
6640			const h12     = parseInt(hourStr, 10) || 12;
6641			const h24     = (ampm === 'pm') ? (h12 % 12) + 12 : (h12 % 12);
6642
6643			m.hour(h24).second(0);
6644			dp.date(m);
6645
6646			const pad = (n)=> (n<10 ? '0'+n : ''+n);
6647			$li.closest('.select.hour').children('.selector').text(pad((h24 % 12) || 12))
6648				.attr('data-type', hourStr);
6649
6650			$li.closest('.custom-clock').find('.select .drop').hide();
6651		});
6652		$(document).on('click', '.calendar .calendarModal .timeselector .select.minute .drop li', function () {
6653			const $li    = $(this);
6654			const $field = $li.closest('.modal-field');
6655			const $input = $field.find('input.daytime');
6656			const dp     = getDp($field, $input);
6657			if (!dp) return;
6658
6659			const minStr = $li.attr('data-value') || $li.text().trim();
6660			let mm = parseInt(minStr, 10); if (isNaN(mm)) mm = 0;
6661
6662			const m = dp.date() ? dp.date().clone() : moment();
6663			m.minute(Math.max(0, Math.min(59, mm))).second(0);
6664			dp.date(m);
6665
6666			const pad = (n)=> (n<10 ? '0'+n : ''+n);
6667			$li.closest('.select.minute').children('.selector').text(pad(mm)).attr('data-type', pad(mm));
6668
6669			// $li.closest('.custom-clock').find('.select .select .drop').hide();
6670			$li.closest('.custom-clock').find('.select .drop').hide();
6671		});
6672
6673
6674		/////// calendar2//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6675		function calendarOverlayIn(pid) {
6676			$('.userEL'+pid).addClass('modal-open');
6677		}
6678		function calendarOverlayOut(pid) {
6679			$('.userEL'+pid).removeClass('modal-open');
6680		}
6681		function nowTime(){ return new Date(); }
6682		
6683		function readMomentFromField($field){
6684			const $input = $field.find('input.daytime');
6685			const dp = getDp($field, $input);
6686			if (dp && dp.date && dp.date()) return dp.date().clone();
6687			const raw = $input.attr('data-raw') || $input.val();
6688			return raw ? moment(parseToDate(raw)) : null;
6689		}
6690
6691		/** End 필드의 커스텀 clock에서 Start보다 이전 시간들을 disabled 처리 */
6692		function applyEndTimeDisables($endField){
6693			const $overlay = $endField.closest('.calendar-modal-overlay');
6694			const $sField  = $overlay.find('.modal-field.sdate');
6695			const start    = readMomentFromField($sField);
6696			if (!start) return;                           // 시작이 없으면 제한 없음
6697
6698			const $endInput = $endField.find('input.daytime');
6699			const dpEnd     = getDp($endField, $endInput);
6700			const end       = dpEnd && dpEnd.date ? dpEnd.date().clone() : null;
6701
6702			// 1) minDate는 '날짜 단위'로, '변경될 때만' 세팅 (불필요한 리렌더 방지)
6703			if (dpEnd && typeof dpEnd.minDate === 'function') {
6704				const wantMin = start.clone().startOf('day');
6705				let curMin = null;
6706				try { curMin = dpEnd.minDate && dpEnd.minDate(); } catch(e){}
6707				if (!curMin || !moment.isMoment(curMin) || !curMin.isSame(wantMin, 'day')) {
6708				dpEnd.minDate(wantMin);
6709				}
6710			}
6711
6712			const $clock = $endField.find('.custom-clock');
6713			if (!$clock.length) return;
6714
6715			const ampmSel = ($clock.find('.select.ampm .selector').attr('data-type') || ((end && end.hour()>=12) ? 'pm' : 'am')).toLowerCase();
6716			const h12Sel  = parseInt($clock.find('.select.hour .selector').text(), 10) || 12;
6717			const mSel    = parseInt($clock.find('.select.minute .selector').text(), 10) || 0;
6718			const sameDay = end ? end.isSame(start, 'day') : true;
6719			const toH24   = (h12, ap) => (ap==='pm' ? (h12%12)+12 : (h12%12));
6720
6721			// 2) equal-case 강제 리페인트는 '시간/분 드롭이 열려 있을 때만'
6722			//    (= 날짜(day) 셀 클릭 중엔 절대 실행하지 않음)
6723			const timeDropOpen = $endField.find('.custom-clock .select .drop:visible').length > 0;
6724			if (dpEnd && end && start && end.isSame(start) && timeDropOpen) {
6725				$endField.data('suppressDropAutoHide', true);
6726				if (typeof dpEnd.viewDate === 'function') dpEnd.viewDate(end.clone());
6727				dpEnd.date(end.clone().add(1,'ms'));
6728				dpEnd.date(end.clone());
6729				setTimeout(() => { $endField.removeData('suppressDropAutoHide'); }, 80);
6730			}
6731
6732			// 1) AM/PM 드롭 항목
6733			$clock.find('.select.ampm .drop li').each(function(){
6734				const v = ($(this).attr('data-value')||'am').toLowerCase();
6735				const h24 = toH24(h12Sel, v);
6736				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mSel).second(0);
6737				const dis = sameDay && cand.isBefore(start);
6738				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
6739			});
6740
6741			// 2) 시간 드롭 항목
6742			$clock.find('.select.hour .drop li').each(function(){
6743				const h12 = parseInt($(this).attr('data-value') || $(this).text(), 10) || 12;
6744				const h24 = toH24(h12, ampmSel);
6745				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mSel).second(0);
6746				const dis = sameDay && cand.isBefore(start);
6747				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
6748			});
6749
6750			// 3) 분 드롭 항목
6751			$clock.find('.select.minute .drop li').each(function(){
6752				const mm  = parseInt($(this).attr('data-value') || $(this).text(), 10) || 0;
6753				const h24 = toH24(h12Sel, ampmSel);
6754				const cand = (end ? end.clone() : start.clone()).hour(h24).minute(mm).second(0);
6755				const dis = sameDay && cand.isBefore(start);
6756				$(this).toggleClass('disabled', dis).attr('aria-disabled', dis ? 'true' : null);
6757			});
6758		}
6759
6760		function isAllDayByField($hostField){
6761			const $overlay = $hostField.closest('.calendar-modal-overlay');
6762			return $overlay.find('.all .all-day').is(':checked');
6763		}
6764
6765		function ensureCustomClock($hostField, locale) {
6766			const $overlay = $hostField.closest('.calendar-modal-overlay');
6767			if (!$overlay.length || !$overlay.is(':visible')) return;
6768
6769			const dp = getDp($hostField, $hostField.find('input.daytime'));
6770
6771			let $widget = null;
6772			if (dp) {
6773				try {
6774				const w = (typeof dp.widget === 'function') ? dp.widget() : dp.widget;
6775				if (w) $widget = (w.jquery ? w : $(w));
6776				} catch (e) { /* no-op */ }
6777			}
6778			if (!$widget || !$widget.length) {
6779				$widget = $hostField.find('.bootstrap-datetimepicker-widget:visible').last();
6780				if (!$widget.length) $widget = $('.bootstrap-datetimepicker-widget:visible').last();
6781			}
6782			if (!$widget || !$widget.length || !$widget.is(':visible')) return;
6783
6784			let $list = $widget.find('ul.list-unstyled').first();
6785			let $timeArea = $widget.find('li.timepicker, .timepicker').last();
6786			if (!$list.length && $timeArea.length) $list = $timeArea.closest('ul.list-unstyled');
6787			if (!$list.length) $list = $widget;
6788
6789			// 이미 생성되어 있으면 종료
6790			if ($list.find('.custom-clock-li, .custom-clock').length) return;
6791
6792			const allDay = isAllDayByField($hostField);
6793
6794			// 위젯의 기본 timepicker DOM은 all-day면 숨겨둡니다
6795			if ($timeArea.length) $timeArea.remove();
6796
6797			const cur = (dp && dp.date) ? dp.date() : moment();
6798			const H = cur.hour(), M = cur.minute();
6799			const LANG = locale;
6800			const amLabel  = ($.lang?.[LANG]?.['sc.banner.am']) || 'AM';
6801			const pmLabel  = ($.lang?.[LANG]?.['sc.banner.pm']) || 'PM';
6802			const ampmType = (H >= 12) ? 'pm' : 'am';
6803			const h12 = ((H % 12) || 12);
6804			const pad = (n)=> (n<10 ? '0'+n : ''+n);
6805
6806			// 공통: 취소/저장 버튼 블럭 (시계 유무 상관없이 필요)
6807			const buttonsHtml = `
6808				<tr>
6809				<td class="btnbox">
6810					<div class="calendar-period-btn">
6811					<span class="calendar-period-close">${($.lang?.[LANG]?.['config.cancel']) || 'Cancel'}</span>
6812					</div>
6813					<div class="calendar-period-btn">
6814					<span class="calendar-period-save">${($.lang?.[LANG]?.['config.save']) || 'Save'}</span>
6815					</div>
6816				</td>
6817				</tr>`;
6818
6819			let bodyHtml = '';
6820			if (!allDay) {
6821				// ── 시계 + 버튼 (기존과 동일)
6822				let lisHour = ''; for (let i=1;i<=12;i++) lisHour += `<li data-value="${pad(i)}">${pad(i)}</li>`;
6823				let lisMin  = ''; for (let j=0;j<=59;j++) lisMin  += `<li data-value="${pad(j)}">${pad(j)}</li>`;
6824				bodyHtml = `
6825				<tr class="timeselector">
6826					<td class="btnbox">
6827					<div>
6828						<ul class="select ampm">
6829						<li class="selector" data-type="${ampmType}">${ampmType==='pm'?pmLabel:amLabel}</li>
6830						<ul class="drop"><li data-value="am">${amLabel}</li><li data-value="pm">${pmLabel}</li></ul>
6831						</ul>
6832						<ul class="select hour">
6833						<li class="selector">${pad(h12)}</li>
6834						<ul class="drop">${lisHour}</ul>
6835						</ul>
6836						<ul class="separator"> : </ul>
6837						<ul class="select minute">
6838						<li class="selector">${pad(M)}</li>
6839						<ul class="drop">${lisMin}</ul>
6840						</ul>
6841					</div>
6842					</td>
6843				</tr>
6844				${buttonsHtml}`;
6845			} else {
6846				// ── 버튼만 (달력 + 버튼)
6847				bodyHtml = buttonsHtml;
6848			}
6849
6850			const clockLi = $(`
6851				<li class="custom-clock-li">
6852				<div class="custom-clock ${allDay ? 'clock-compact' : 'clock-full'}">
6853					<table class="table-condensed">
6854					${bodyHtml}
6855					</table>
6856				</div>
6857				</li>`);
6858
6859			const $timeLi = $list.find('li.timepicker, .timepicker').last();
6860			if ($timeLi.length) $timeLi.after(clockLi); else $list.append(clockLi);
6861
6862			const $clock = clockLi.find('.custom-clock');
6863
6864			// 버튼 동작
6865			$clock.off('click.clockBtns')
6866			.on('click.clockBtns', '.calendar-period-save', function () {
6867				const $hostField = $(this).closest('.modal-field');
6868				const $input     = $hostField.find('input.daytime');
6869				const $overlay   = $hostField.closest('.calendar-modal-overlay');
6870				const locale     = $overlay.closest('.calendar').hasClass('en') ? 'en' : 'ko';
6871				const dpStart    = getDp($hostField, $input);
6872				const isAllDay   = isAllDayByField($hostField);
6873
6874				if (dpStart && dpStart.date()) {
6875				$hostField.data('commitFlag', true);
6876
6877				// 저장 시 표시/데이터 형식 분기
6878				let m = dpStart.date().clone();
6879				if (isAllDay) m = m.startOf('day'); // 날짜만 의미
6880
6881				// start 저장 로직 유지 + end 보정
6882				if ($hostField.hasClass('sdate')) {
6883					const $endField = $overlay.find('.modal-field.edate');
6884					const $endInput = $endField.find('input.daytime');
6885					const dpEnd     = getDp($endField, $endInput);
6886
6887					// end 값 읽기
6888					let end = dpEnd && dpEnd.date() ? dpEnd.date().clone() : null;
6889					if (!end) {
6890						const rawEnd = $endInput.attr('data-raw') || $endInput.val();
6891						if (rawEnd) end = moment(parseToDate(rawEnd));
6892					}
6893
6894					// start > end이면 end 자동 보정 (all-day면 같은 날짜, 시간은 의미 없음)
6895					if (!end || m.isAfter(end)) {
6896						// const newEnd = isAllDay ? m.clone() : m.clone().add(1, 'hours');
6897						const newEnd = isAllDay ? m.clone() : m.clone();
6898						if (dpEnd && typeof dpEnd.date === 'function') dpEnd.date(newEnd.clone());
6899
6900						const rawStrEnd   = isAllDay ? newEnd.format('YYYY-MM-DD') : newEnd.format('YYYY-MM-DD HH:mm');
6901						const dispEndHTML = formatDateLocalized(rawStrEnd, locale, 1);
6902						const dispEndTEXT = formatDateLocalized(rawStrEnd, locale);
6903
6904						$endInput.attr('data-raw', rawStrEnd).val(dispEndTEXT).removeClass('empty');
6905
6906						const $endView = $endField.find('.daytime-html');
6907						if ($endView.length) {
6908							$endView.attr('data-raw', rawStrEnd).html(dispEndHTML);
6909						}
6910
6911						$endField.data('commitFlag', true);
6912					}
6913				} else if ($hostField.hasClass('edate')) {
6914					const $startField = $overlay.find('.modal-field.sdate');
6915					const $startInput = $startField.find('input.daytime');
6916					const dpStartInstance = getDp($startField, $startInput);   // sdate
6917					const $endField = $overlay.find('.modal-field.edate');
6918					const $endInput = $endField.find('input.daytime');
6919					const dpEnd = dpStart; // hostField=edate
6920
6921					// 1) 시작(moment) 읽기
6922					let start = dpStartInstance && dpStartInstance.date() ? dpStartInstance.date().clone() : null;
6923					if (!start) {
6924						const rawStart = $startInput.attr('data-raw') || $startInput.val();
6925						if (rawStart) start = moment(parseToDate(rawStart));
6926					}
6927
6928					// 2) end 후보를 "커스텀 시계 선택값"으로 직접 조립
6929					const isAllDay = isAllDayByField($hostField);
6930					const gran = isAllDay ? 'day' : 'minute';
6931					const norm = d => d ? d.clone().seconds(0).milliseconds(0) : null;
6932
6933					let endCandidate;
6934					if (isAllDay) {
6935						// 종일은 날짜만 비교하면 되므로, dp의 날짜(또는 start)로 조립
6936						endCandidate = (dpEnd && dpEnd.date ? dpEnd.date().clone() : (start || moment())).startOf('day');
6937					} else {
6938						// 커스텀 시계에서 AM/PM, 시, 분 읽기
6939						const $clock   = $hostField.find('.custom-clock');
6940						const ap       = ($clock.find('.select.ampm .selector').attr('data-type') || 'am').toLowerCase();
6941						const h12Str   = $clock.find('.select.hour .selector').text().trim() || '12';
6942						const minStr   = $clock.find('.select.minute .selector').text().trim() || '00';
6943						const toH24    = (h12, ap) => ap==='pm' ? (h12%12)+12 : (h12%12);
6944						const h24      = toH24(parseInt(h12Str,10)||12, ap);
6945						const mm       = Math.max(0, Math.min(59, parseInt(minStr,10)||0));
6946
6947						// 같은 "날짜" 위에 시간만 덮어쓰기 (dpEnd가 있으면 그 날짜 사용, 없으면 start 날짜 사용)
6948						const base = (dpEnd && dpEnd.date ? dpEnd.date().clone() : (start || moment()));
6949						endCandidate = base.clone().hours(h24).minutes(mm).seconds(0).milliseconds(0);
6950					}
6951
6952					const startNorm    = norm(start);
6953					const endNorm      = norm(endCandidate);
6954
6955					// 3) 저장 시점 보정: end < start면 end = start
6956					const correctedEnd = (startNorm && endNorm && endNorm.isBefore(startNorm, gran))
6957						? startNorm.clone()
6958						: endNorm.clone();
6959
6960					// 4) 위젯/뷰 갱신은 correctedEnd 기준
6961					if (dpEnd && typeof dpEnd.date === 'function') {
6962						$hostField.data('suppressHide', true);
6963						if (typeof dpEnd.minDate === 'function') dpEnd.minDate(startNorm ? startNorm.clone().startOf('day') : false);
6964						if (typeof dpEnd.viewDate === 'function') dpEnd.viewDate(correctedEnd.clone());
6965						dpEnd.date(correctedEnd.clone()); // (필요시 1ms 흔들기 추가 가능)
6966						setTimeout(() => { $hostField.removeData('suppressHide'); }, 0);
6967					}
6968
6969					// 5) 표기/저장도 correctedEnd만 사용
6970					const rawStrEnd   = isAllDay ? correctedEnd.format('YYYY-MM-DD')
6971												: correctedEnd.format('YYYY-MM-DD HH:mm');
6972					const dispEndHTML = formatDateLocalized(rawStrEnd, locale, 1);
6973					const dispEndTEXT = formatDateLocalized(rawStrEnd, locale);
6974
6975					$endInput.attr('data-raw', rawStrEnd).val(dispEndTEXT).removeClass('empty');
6976					const $endView = $hostField.find('.daytime-html');
6977					if ($endView.length) $endView.attr('data-raw', rawStrEnd).html(dispEndHTML);
6978
6979					try { applyEndTimeDisables($hostField); } catch(e){}
6980					try { if (typeof paintActiveDay === 'function') paintActiveDay($hostField, correctedEnd.clone()); } catch(e){}
6981
6982					$hostField.data('commitFlag', true);
6983				}
6984
6985				// 현재 열려있는 이 피커 닫기
6986				if (dpStart && dpStart.hide) dpStart.hide();
6987				}
6988			})
6989			.on('click.clockBtns', '.calendar-period-close', function () {
6990				const $hostField = $(this).closest('.modal-field');
6991				$hostField.data('commitFlag', false);
6992				const dp = getDp($hostField, $hostField.find('input.daytime'));
6993				dp && dp.hide && dp.hide();
6994			});
6995		}
6996
6997		function closeOtherPickers($overlay, $currentField){
6998			$overlay.find('.modal-field').each(function(){
6999				if (this === $currentField[0]) return;
7000				const dp = $(this).data('DateTimePicker');
7001				if (dp && typeof dp.hide === 'function') dp.hide();
7002			});
7003			$overlay.find('.custom-clock .select .drop').hide();
7004		}
7005
7006		function getDp($field, $input){
7007			return $field.data('DateTimePicker') || $input.data('DateTimePicker');
7008		}
7009
7010		$(document).on('click', '.calendar .modal-field .daytime', function(e) {
7011			e.stopPropagation();
7012			const $input   = $(this);
7013			const $field   = $input.closest('.modal-field');
7014			const $overlay = $input.closest('.calendar-modal-overlay');
7015			const $cal     = $input.closest('.calendar');
7016			const locale   = $cal.hasClass('en') ? 'en' : 'ko';
7017			const lang     = locale;
7018
7019			closeOtherPickers($overlay, $field);
7020
7021			var allDay = $field.siblings('.all').find('.all-day').is(':checked');
7022			const periodOptions = {
7023				format: allDay ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm',
7024				dayViewHeaderFormat: 'YYYY. MM',
7025				minDate: false,
7026				disabledDates: false,
7027				useCurrent: false,
7028				focusOnShow: false,
7029				keepOpen: true,
7030				debug: true,
7031				allowInputToggle: true,
7032				sideBySide: false,
7033				locale: lang,
7034				ignoreReadonly: true,
7035				widgetParent: $field,
7036				widgetPositioning: { horizontal: 'auto', vertical: 'bottom' }
7037			};
7038
7039			let dp = $field.data('DateTimePicker');
7040			if (dp) {
7041				if (typeof dp.show === 'function') dp.show();
7042				else { try { $field.datetimepicker('show'); } catch(e){} }
7043				ensureCustomClock($field, locale);
7044				return;
7045			}
7046
7047			if (typeof $field.datetimepicker !== 'function') {
7048				console.error('bootstrap-datetimepicker가 로드되지 않았습니다.');
7049				return;
7050			}
7051
7052			$field.datetimepicker(periodOptions)
7053				.on('dp.show', function(){
7054					if (!$('.calendar-dp-overlay').length) {
7055						$('<div class="calendar-dp-overlay"></div>').appendTo('.calendar-modal-body');
7056					}
7057
7058					closeOtherPickers($overlay, $field);
7059
7060					const dp   = $field.data('DateTimePicker');
7061					const raw  = $input.attr('data-raw');
7062					const origDisplay = $input.val();
7063					const origRaw     = raw || '';
7064					const base        = raw ? moment(parseToDate(raw)) : (dp && dp.date() ? dp.date().clone() : moment(nowTime()));
7065
7066					$field.data('origDisplay', origDisplay);
7067					$field.data('origRaw',     origRaw);
7068					$field.data('origDate',    base.clone());
7069					$field.data('commitFlag',  false);
7070
7071					if (dp && (!dp.date() || !dp.date().isSame(base))) dp.date(base.clone());
7072
7073					setTimeout(() => {
7074						ensureCustomClock($field, locale);
7075						if ($field.hasClass('edate')) applyEndTimeDisables($field); 
7076					}, 0);
7077				})
7078
7079				.on('dp.change', function(){
7080					const $field = $(this);
7081					const locale = $field.closest('.calendar').hasClass('en') ? 'en' : 'ko';
7082
7083					setTimeout(() => {
7084						ensureCustomClock($field, locale);
7085						if ($field.hasClass('edate')) applyEndTimeDisables($field);
7086
7087						// ★ 프로그램적 변경(equals 리페인트) or 드롭 방금 열림 → 닫기 스킵
7088						if ($field.data('suppressDropAutoHide') || $field.data('dropOpenLock')) return;
7089
7090						// 평소에는 닫기
7091						$field.find('.custom-clock .select .drop').hide();
7092					}, 0);
7093				})
7094
7095				.on('dp.hide', function(){
7096					const $field    = $(this);
7097					const $input    = $field.find('input.daytime');
7098					const $view     = $field.find('.daytime-html'); // 표시용 span
7099					const dp        = $field.data('DateTimePicker');
7100					const committed = !!$field.data('commitFlag');
7101					const origDate  = $field.data('origDate');
7102					const origDisp  = $field.data('origDisplay');
7103					const origRaw   = $field.data('origRaw');
7104
7105					const localeCur = $field.closest('.calendar').hasClass('en') ? 'en' : 'ko';
7106
7107					$('.calendar-dp-overlay').remove();
7108
7109					if (!committed) {
7110						if (dp && origDate) dp.date(origDate.clone());
7111
7112						const isAllDayNow = isAllDayByField($field);
7113						const rollbackIso = origRaw || (origDate ? (isAllDayNow ? origDate.format('YYYY-MM-DD') : origDate.format('YYYY-MM-DD HH:mm')) : null);
7114
7115						if (rollbackIso) {
7116							// ⬇⬇ 여기: HTML/텍스트를 함수의 3번째 인자로 직접 분기
7117							const dispHTML = formatDateLocalized(rollbackIso, localeCur, 1);   // span용(HTML)
7118							const dispTEXT = formatDateLocalized(rollbackIso, localeCur);  // input용(텍스트)
7119
7120							$input.attr('data-raw', rollbackIso).val(dispTEXT).removeClass('empty');
7121							if ($view.length) $view.attr('data-raw', rollbackIso).html(dispHTML);
7122
7123						} else {
7124							if (typeof origDisp !== 'undefined') $input.val(origDisp);
7125							if (typeof origRaw  !== 'undefined') $input.attr('data-raw', origRaw);
7126
7127							if ($view.length) {
7128								if (typeof origRaw !== 'undefined') {
7129									// ⬇⬇ 여기: 표시용은 HTML로
7130									const dispHTML0 = formatDateLocalized(origRaw, localeCur, 1);
7131									$view.attr('data-raw', origRaw).html(dispHTML0);
7132								} else if (typeof origDisp !== 'undefined') {
7133									$view.text(origDisp);
7134								} else {
7135									$view.text('');
7136								}
7137							}
7138						}
7139					} else {
7140						const m = dp && dp.date() ? dp.date().clone() : null;
7141						if (m) {
7142							const isAllDayNow = isAllDayByField($field);
7143							const iso      = isAllDayNow ? m.format('YYYY-MM-DD') : m.format('YYYY-MM-DD HH:mm');
7144							const dispHTML = formatDateLocalized(iso, localeCur, 1);   // span용(HTML)
7145							const dispTEXT = formatDateLocalized(iso, localeCur);  // input용(텍스트)
7146
7147							$input.attr('data-raw', iso).val(dispTEXT).removeClass('empty');
7148							if ($view.length) $view.attr('data-raw', iso).html(dispHTML);
7149						}
7150					}
7151
7152					$field.removeData('origDisplay')
7153							.removeData('origRaw')
7154							.removeData('origDate')
7155							.removeData('commitFlag');
7156
7157					$field.find('.custom-clock .select .drop').hide();
7158			});
7159
7160			const inst = $field.data('DateTimePicker');
7161			if (inst && typeof inst.show === 'function') inst.show();
7162			else { try { $field.datetimepicker('show'); } catch(e){} }
7163		});
7164
7165		$(document).on('click', '.calendar .col-box', function(e) {
7166			var isOpen = $(this).closest('.cfull-box').hasClass('open');
7167			if(isOpen) {
7168				$(this).closest('.cfull-box').removeClass('open');
7169			} else {
7170				$(this).closest('.cfull-box').addClass('open');
7171			}
7172		});
7173
7174		$(document).on('click', '.calendar .scheduleColor', function() {
7175			var colorpick = $(this).attr('data-color');
7176			$(this).closest('.ccol-box').siblings('.col-box').find('.scheduleColorPicker').css('background-color', colorpick).attr('data-color', colorpick);
7177			$(this).closest('.cfull-box').removeClass('open');
7178		});
7179
7180		$(document).on('click', function(e) {
7181			if (!$(e.target).closest('.col-box').length) {
7182				$('.cfull-box').removeClass('open');
7183			}
7184		});
7185
7186		// 닫기 버튼
7187		$(document).on('click', '.calendar .modal-close', function(){
7188			var pid = $(this).closest('.calendar').attr('data-id');
7189			$(this).closest(".calendar-modal-overlay").fadeOut(200, function(){
7190				$(this).remove();
7191			});
7192			calendarOverlayOut(pid);
7193		});
7194
7195		$(document).on('click', '.calendar .all-day', function(e) {
7196			e.stopPropagation();
7197			var checked = ($(this).is(':checked')) ? true : false,
7198				$overlay = $(this).closest('.calendar-modal-overlay'),
7199				locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko',
7200				sdate1 = $overlay.find('.sdate .start').val(),
7201				sdate2 = $overlay.find('.sdate .start').attr('data-raw'),
7202				edate1 = $overlay.find('.edate .end').val(),
7203				edate2 = $overlay.find('.edate .end').attr('data-raw'),
7204				sdate1_only = sdate1 ? (sdate1.split(' ')[0] + ' ' + sdate1.split(' ')[1]) : '',
7205				sdate2_only = sdate2 ? sdate2.split(' ')[0] : '',
7206				edate1_only = edate1 ? (edate1.split(' ')[0] + ' ' + edate1.split(' ')[1]) : '',
7207				edate2_only = edate2 ? edate2.split(' ')[0] : '',
7208				time_lang_start = (locale == 'en') ? ' 12:00 PM' : ' 오후 12:00';
7209				time_lang_end = (locale == 'en') ? ' 1:00 PM' : ' 오후 1:00';
7210
7211			// 1) 표시 문자열/원시값 동기화 (기존 로직 유지)
7212			if(checked) {
7213				$overlay.find('.sdate .start').val(sdate1_only);
7214				$overlay.find('.sdate .start').attr('data-raw', sdate2_only);
7215				$overlay.find('.edate .end').val(edate1_only);
7216				$overlay.find('.edate .end').attr('data-raw', edate2_only);
7217				$overlay.find('.stimepicker .tt').remove();
7218        		$overlay.find('.etimepicker .tt').remove();
7219			} else {
7220				$overlay.find('.sdate .start').val(sdate1_only + time_lang_start);
7221				$overlay.find('.sdate .start').attr('data-raw', sdate2_only + ' 12:00');
7222				$overlay.find('.edate .end').val(edate1_only + time_lang_end);
7223				$overlay.find('.edate .end').attr('data-raw', edate2_only + ' 13:00');
7224				$overlay.find('.stimepicker').append('<span class="tt">' + time_lang_start + '</span>');
7225				$overlay.find('.etimepicker').append('<span class="tt">' + time_lang_end + '</span>');
7226			}
7227
7228			$overlay.find('.modal-field.sdate, .modal-field.edate').each(function(){
7229				const $field = $(this);
7230				const $input = $field.find('input.daytime');
7231				const dp     = getDp($field, $input);
7232
7233				if (!dp) return;
7234
7235				// 위젯 얻기
7236				let $widget = null;
7237				try {
7238				const w = (typeof dp.widget === 'function') ? dp.widget() : dp.widget;
7239				if (w) $widget = (w.jquery ? w : $(w));
7240				} catch (err) {}
7241
7242				// 현재 위젯이 화면에 떠 있을 때만 ensureCustomClock으로 시간영역 표시/숨김 반영
7243				if ($widget && $widget.length && $widget.is(':visible')) {
7244					ensureCustomClock($field, locale);
7245				}
7246			});
7247		});
7248
7249		$(document).on('click', '.calendar .schedule_list .del, .calendar .modal-delete', function() {
7250			var mode = $(this).hasClass('modal-delete'),
7251        		locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko';
7252				
7253			if (confirm($.lang[locale]['config.calendar.delete'])) {
7254				if(mode) {
7255					var sid = b.SID,
7256						pid = $(this).closest('.calendar').attr('data-id'),
7257						seq = $(this).closest('.calendar-modal-container').find('.calendar-modal-body').find('.seq').val(),
7258						yearMonth = $(this).closest('.calendar-modal-overlay').find('.calendar-modal-container.view .calendar-modal-body .sdate .start').attr('data-raw').substring(0, 7);
7259				} else {
7260					var sid = $(this).siblings('.sid').val(),
7261						seq = $(this).siblings('.seq').val(),
7262						pid = $(this).siblings('.pid').val(),
7263						yearMonth = $('.schedule_list .sdate').val().substring(0, 7);
7264				}
7265				var data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
7266
7267				$.ajax({
7268					url: '/template/delete_calendar',
7269					data: { sid: sid, pid: pid, seq: seq, yearMonth: yearMonth },
7270					type: 'POST',
7271					dataType: 'json',
7272					success: function(data) {
7273						checkError(data);
7274						const instance = $.cl_calendar.instances[pid];
7275						// instance.events = data || [];
7276						if (mode) {
7277							$(".calendar-modal-overlay").fadeOut(300);
7278						} else {
7279							$('.modal-overlay-modify').fadeOut(300);
7280						}
7281
7282						if (data_type !== '') {
7283							$.cl_calendar.init(b.SID, pid, yearMonth);
7284						} else {
7285							// ✅ 핵심: 수정 영향권(전/당/다음달)만 캐시 무효화
7286							invalidateAround(pid, yearMonth);
7287
7288							//서버가 돌려준 최신 data(3개월치)를 즉시 캐시에 병합
7289							upsertMonthCacheFromServer(pid, data);
7290
7291							// ✅ 동적 events 소스를 유지한 채로 최신 데이터 다시 요청
7292							if (instance && instance.calendar) {
7293								const v = instance.calendar.view;
7294								const needKeys = monthsInRange(v.currentStart, v.currentEnd);
7295								const pidMap = monthCache.get(pid) || new Map();
7296								const missing = needKeys.filter(k => !pidMap.has(k));
7297								const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
7298								const after = () => instance.calendar.refetchEvents();
7299
7300								if (missing.length) {
7301									Promise.all(missing.map(k =>
7301 fetchMonth(pid, k, dt))).finally(after);
7302								} else {
7303									after();
7304								}
7305							} else {
7306								initCalendar(pid);
7307							}
7308						}
7309						calendarOverlayOut(pid);
7310					}
7311				});
7312			}
7313		});
7314
7315		$(document).on('click', '.calendar .go-modify', function() {
7316			var pid = $(this).closest('.calendar-modal-container').find('.pid').val();
7317			if(currentEvent) showCalendarModalEdit(pid, 1, currentDate, currentEvent);
7318			else console.log('선택된 이벤트 없음');
7319		});
7320
7321		// 저장 버튼
7322		let isSaving = false;
7323		$(document).on('click', '.calendar .modal-save, .calendar .modal-modify', function(e) {
7324			e.preventDefault();
7325			e.stopImmediatePropagation();
7326
7327			if (isSaving) return false;
7328
7329			const locale = ($(this).closest('.calendar').hasClass('en')) ? 'en' : 'ko';
7330			const $btn = $(this);
7331			const $overlay = $btn.closest('.calendar-modal-overlay');
7332
7333			if ($overlay.data('saving') === true) return false;
7334
7335			$overlay.data('saving', true);
7336			const $buttons = $overlay.find('.modal-save, .modal-modify').prop('disabled', true).addClass('is-disabled');
7337
7338			var mode = $btn.hasClass('modal-modify'),
7339				pid = $btn.closest('.calendar').attr('data-id'),
7340				data_type = ($('.userEL'+pid).attr('data-modoo-type')) ? $('.userEL'+pid).attr('data-modoo-type') : '';
7341
7342			var title = $btn.closest('.calendar-modal-container').find('.modal-title .ctitle').val(),
7343                color = $btn.closest('.calendar-modal-container').find('.scheduleColorPicker').attr('data-color'),
7344				seq = $btn.parent().siblings('.calendar-modal-body').find('.seq').val(),
7345				sdate = $btn.parent().siblings('.calendar-modal-body').find('.sdate .start').attr('data-raw'),
7346        		edate = $btn.parent().siblings('.calendar-modal-body').find('.edate .end').attr('data-raw'),
7347				fulltime = ($btn.parent().siblings('.calendar-modal-body').find('.all .all-day').prop('checked')) ? 'Y' : 'N',
7348				content = $btn.parent().siblings('.calendar-modal-body').find('.content textarea').val(),
7349				pass = $btn.parent().siblings('.calendar-modal-body').find('.pass').val();
7350
7351			if (!title) {
7352				alert($.lang[locale]['config.calendar.enter-title']);
7353				$overlay.data('saving', false);
7354        		$buttons.prop('disabled', false).removeClass('is-disabled');
7355				return false;
7356			}
7357			if (pass == 'N') {
7358				alert($.lang[locale]['config.calendar.enter-date']);
7359				$overlay.data('saving', false);
7360        		$buttons.prop('disabled', false).removeClass('is-disabled');
7361				return false;
7362			}
7363
7364			var timeRegex = /\s\d{1,2}:\d{2}$/; 
7365			if (fulltime === 'N' && (!timeRegex.test(sdate) || !timeRegex.test(edate))) {
7366				alert($.lang[locale]['config.calendar.enter-time']);
7367				$overlay.data('saving', false);
7368        		$buttons.prop('disabled', false).removeClass('is-disabled');
7369				return false;
7370			}
7371
7372			isSaving = true;
7373			$buttons.prop('disabled', true).addClass('is-disabled');
7374
7375			$(".calendar-modal-overlay").fadeOut(200, function() { $(this).remove(); });
7376			calendarOverlayOut(pid);
7377
7378			const eventData = {
7379				sid: b.SID,
7380				seq: seq,
7381				pid: pid,
7382				month: sdate.substring(0, 7),
7383				sdate: sdate,
7384				stime: (sdate.split(' ')[1]) ? sdate.split(' ')[1] : '00:00',
7385				edate: edate,
7386				etime: (edate.split(' ')[1]) ? edate.split(' ')[1] : '00:00',
7387				fulltime: fulltime,
7388				memo: content,
7389				title: title,
7390				color: color,
7391				check: 2
7392			};
7393
7394			$.ajax({
7395				url: '/template/calendar',
7396				data: { data: eventData, mode: mode, yearMonth: eventData['month'], data_type : data_type },
7397				type: 'POST',
7398				dataType: 'json',
7399				success: function(data) {
7400					checkError(data);
7401					const instance = $.cl_calendar.instances[pid];
7402					instance.events = data || [];
7403
7404					if (data_type != '') {
7405						$.cl_calendar.init(b.SID, pid, sdate.substring(0, 7));
7406					} else {
7407						// ✅ 핵심: 수정 영향권(전/당/다음달)만 캐시 무효화
7408						invalidateAround(pid, sdate.substring(0, 7));
7409
7410						// 서버가 돌려준 최신 data(3개월치)를 즉시 캐시에 병합
7411						upsertMonthCacheFromServer(pid, data);
7412
7413						// ✅ 동적 events 소스를 유지한 채로 최신 데이터 다시 요청
7414						if (instance && instance.calendar) {
7415							const v = instance.calendar.view;
7416							const needKeys = monthsInRange(v.currentStart, v.currentEnd);
7417							const pidMap = monthCache.get(pid) || new Map();
7418							const missing = needKeys.filter(k => !pidMap.has(k));
7419							const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
7420							if (missing.length) {
7421								Promise.all(missing.map(k =>
7421 fetchMonth(pid, k, dt)))
7422								.finally(() => instance.calendar.refetchEvents());
7423							} else {
7424								instance.calendar.refetchEvents();
7425							}
7426						} else {
7427							initCalendar(pid);
7428						}
7429						isSaving = false;
7430						$buttons.prop('disabled', false).removeClass('is-disabled');
7431					}
7432
7433					$(".calendar-modal-overlay").fadeOut(200, function() { $(this).remove(); });
7434					calendarOverlayOut(pid);
7435				},
7436				error: function(xhr, status, error) {
7437					console.error("이벤트 저장 실패:", error);
7438				}
7439			});
7440		});
7441
7442		function openEventModal(dateString) {
7443			selectedDate = dateString;
7444			
7445			// 폼 초기화
7446			$('#eventForm')[0].reset();
7447			$('#eventId').val('');
7448			$('#eventStartDate').val(dateString);
7449			$('#eventEndDate').val(dateString);
7450			
7451			// 종료일은 시작일 이후만 선택 가능하도록 설정
7452			$('#eventEndDate').attr('min', dateString);
7453			
7454			// 모달 표시
7455			$('#eventModal').fadeIn(300);
7456		}
7457
7458		function htmlEscape(str) {
7459			return String(str)
7460				.replace(/&/g, "&amp;")
7461				.replace(/</g, "&lt;")
7462				.replace(/>/g, "&gt;")
7463				.replace(/"/g, "&quot;")
7464				.replace(/'/g, "&#39;");
7465		}
7466
7467		// 모달 열기(값이 있을때)
7468		function openEventList(dateString, eventData, el) {
7469			var dayOfWeek = getDayOfWeek(dateString);
7470
7471			var match = [];
7472			for(var i=0; i < eventData.length; i++) {
7473				if(dateString == eventData[i].s_date) {
7474					match.push(eventData[i]);
7475				}
7476			}
7477			
7478			var html = '',
7479			itemCount = 0;
7480			html += '\
7481				<div class="modal-container">\
7482					<div class="modal-header">\
7483						<div class="modal-title">'+ dateString +'&nbsp;&nbsp;&nbsp;'+ dayOfWeek +'</div>\
7484						<button class="modal-close">&times;</button>\
7485					</div>\
7486					<hr>\
7487					<div class="modal-body">\
7488						<ul class="scd_list">\
7489					';
7490			if(match.length == 1) {
7491				var stime = match[0].s_time.substring(0,5),
7492					etime = match[0].e_time.substring(0,5),
7493					fulltime = (match[0].fulltime == 'N') ? stime +' ~ '+ etime : '';
7494				html += '<li data-index="" data-seq="" data-pid="" class="schedule_list _schedule_list">\
7495							<div class="info">\
7496								<span class="datetime">'+ dateString +'('+ dayOfWeek +') '+ fulltime +'</span>\
7497								<input type="hidden" name="sid" class="sid" value="'+ match[0].sid +'">\
7498								<input type="hidden" name="seq" class="seq" value="'+ match[0].seq +'">\
7499								<input type="hidden" name="pid" class="pid" value="'+ match[0].pid +'">\
7500								<input type="hidden" name="sdate" class="sdate" value="'+ match[0].s_date +'">\
7501								<input type="hidden" name="stime" class="stime" value="'+ match[0].s_time +'">\
7502								<input type="hidden" name="edate" class="edate" value="'+ match[0].e_date +'">\
7503								<input type="hidden" name="etime" class="etime" value="'+ match[0].e_time +'">\
7504								<input type="hidden" name="memo" class="memo" value="'+ htmlEscape(match[0].memo) +'">\
7505								<input type="hidden" name="fulltime" class="fulltime" value="'+ match[0].fulltime +'">\
7506							</div>\
7507							<p class="txt">'+ htmlEscape(match[0].memo) +'</p>\
7508						</li>';
7509				itemCount = 1;
7510			} else if(match.length > 1) {
7511				for(var j=0; j < match.length; j++) {
7512					var stime = match[j].s_time.substring(0,5),
7513						etime = match[j].e_time.substring(0,5),
7514						fulltime = (match[j].fulltime == 'N') ? stime +' ~ '+ etime : '';
7515					html += '<li data-index="" data-seq="" data-pid="" class="schedule_list _schedule_list">\
7516							<div class="info">\
7517								<span class="datetime">'+ dateString +'('+ dayOfWeek +') '+ fulltime +'</span>\
7518								<input type="hidden" name="sid" class="sid" value="'+ match[j].sid +'">\
7519								<input type="hidden" name="seq" class="seq" value="'+ match[j].seq +'">\
7520								<input type="hidden" name="pid" class="pid" value="'+ match[j].pid +'">\
7521								<input type="hidden" name="sdate" class="sdate" value="'+ match[j].s_date +'">\
7522								<input type="hidden" name="stime" class="stime" value="'+ match[j].s_time +'">\
7523								<input type="hidden" name="edate" class="edate" value="'+ match[j].e_date +'">\
7524								<input type="hidden" name="etime" class="etime" value="'+ match[j].e_time +'">\
7525								<input type="hidden" name="memo" class="memo" value="'+ htmlEscape(match[j].memo) +'">\
7526								<input type="hidden" name="fulltime" class="fulltime" value="'+ match[j].fulltime +'">\
7527							</div>\
7528							<p class="txt">'+ htmlEscape(match[j].memo) +'</p>\
7529						</li>';
7530					itemCount++;
7531				}
7532			}
7533			html += '</ul></div>\
7534				</div>\
7535			';
7536			if (itemCount <= 1) {
7537				$(el + ' #eventModalModify').addClass('few-items');
7538			} else if (itemCount <= 3) {
7539				$(el + ' #eventModalModify').addClass('mid-items');
7540			} else {
7541				$(el + ' #eventModalModify').addClass('many-items');
7542			}
7543			$(el+' #eventModalModify').empty();
7544			$(el+' #eventModalModify').html(html);
7545			$(el+' #eventModalModify').fadeIn(300);
7546		}
7547
7548		// 모달 닫기 함수
7549		function closeEventModal() {
7550			$('.modal-schedule').fadeOut(300);
7551			selectedDate = null;
7552			currentEventId = null;
7553		}
7554
7555		function formatDate(date) {
7556			const year = date.getFullYear();
7557			const month = String(date.getMonth() + 1).padStart(2, '0');
7558			const day = String(date.getDate()).padStart(2, '0');
7559			return `${year}-${month}-${day}`;
7560		}
7561
7562		function getDayOfWeek(dateString) {
7563			const days = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'];
7564			const date = new Date(dateString);  // 문자열을 Date 객체로 변환
7565			return days[date.getDay()]; // 0(일) ~ 6(토)에 해당하는 요일 반환
7566		}
7567
7568		function createDayElement(date, dateString, isOtherMonth, pid) {
7569			if (!$.cl_calendar.instances[pid]) {
7570				// console.error(`draw called but instance for pid=${pid} is not initialized yet`);
7571				return;
7572			}
7573			var mode = $('.userEL'+pid).attr('data-type2');
7574			const day = date.getDate();
7575			const dayOfWeek = date.getDay();
7576			const isToday = date.toDateString() === new Date().toDateString(); // 예제에서는 3월 18일이 오늘
7577			let className = 'day_wrap _day_wrap';
7578			if (dayOfWeek === 0) className += ' sunday';
7579			if (dayOfWeek === 6) className += ' saturday';
7580			if (isOtherMonth) className += ' other-month';
7581			if (isToday) className += ' today';
7582			
7583			const today_class = (isToday) ? 'today' : '';
7584			const today_themebg = (isToday && mode != 'mwd') ? 'theme_background' : '';
7585			const today_themebd = (isToday) ? 'theme_border' : '';
7586
7587			const dayElement = $('<div>', { 
7588				class: className,
7589				'data-date': dateString
7590			});
7591			
7592			// 일자 표시
7593			const dayNumber = $('<span>', { 
7594				class: `num _dateNum  ${today_themebg}`, 
7595				text: day 
7596			});
7597
7598			// 오늘 표시
7599			if (isToday) {
7600				if(mode == 'mwd') dayNumber.html(`${day}`);
7601        		else dayNumber.html(`<div class="today-indicator">${day}</div>`);
7602			}
7603			// console.log(today_class);
7604			dayElement.append(dayNumber);
7605			dayElement.find('._dateNum').wrap(`<a class="day_num ${today_class} ${today_themebd}"></a>`);
7606			// dayElement.find('.day_num').append('<span class="theme_border"></span>');
7607
7608			var count = 0;
7609			const events = $.cl_calendar.instances[pid].events;
7610			for (var i = 0; i < events.length; i ++) {
7611				if(dateString == events[i].s_date) {
7612					var time = '',
7613						settings = JSON.parse(events[i].settings || '{}');
7614					if(events[i].fulltime == 'Y') time = '종일일정';
7615					else time = events[i].s_time.substring(0, 5) + '-' + events[i].e_time.substring(0, 5);
7616					if(mode == 'mwd') {
7617						dayElement.find('.day_num').append('<div class="event-item" data-seq="'+ events[i].seq +'" style="background-color:'+ settings.color+';">'+ settings.title +'</div>');
7618					} else {
7619						dayElement.find('.day_num').append('<div class="event">'+ time +'</div>');
7620						dayElement.find('.day_num').append('<div class="event_memo">'+ events[i].memo +'</div>');
7621					}
7622					count++;
7623				}
7624			}
7625			if(mode != 'mwd') {
7626
7627				if(count == 1) {
7628					dayElement.find('.day_num').append('<div class="event_mobile">'+ count +'</div>');
7629				} else if(count > 1) {
7630					dayElement.find('.day_num .event').remove();
7631					dayElement.find('.day_num .event_memo').remove();
7632					dayElement.find('.day_num').append('<div class="event more">일정'+ count +'</div>');
7633					dayElement.find('.day_num').append('<div class="event_mobile">' + count +'</div>');
7634				}
7635			}
7636			
7637			return dayElement;
7638		}
7639
7640		function showCalendarModalView(pid, data, fromList) {
7641			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
7642			$(".calendar-modal-overlay").remove();
7643
7644			var isGoogle = !!(data.extendedProps && data.extendedProps.isGoogle);
7645			let fulltime = data.extendedProps.fulltime;
7646			if (isGoogle && (fulltime === undefined || fulltime === '' || fulltime === null)) {
7647				// extendedProps에 없으면 event 객체의 allDay로 다시 보정
7648				fulltime = data.allDay ? 'Y' : 'N';
7649			}
7650
7651			let timeShow = '', startShow = '', endShow = '', rawStart = '', rawEnd = '';
7652			if (data.allDay) {
7653				if (data.extendedProps.fulltime === 'Y') { // 종일 범위
7654					rawStart = data.extendedProps.start_date;          // "YYYY-MM-DD"
7655                    rawEnd   = data.extendedProps.end_date;            // "YYYY-MM-DD"
7656					timeShow  = formatRangeLocalized(rawStart, rawEnd, locale, { allDay: true });
7657					startShow = formatDateLocalized(rawStart, locale);
7658					endShow   = formatDateLocalized(rawEnd,   locale);
7659				} else { // 연속 일정(시간 포함)
7660					rawStart = `${data.extendedProps.start_date} ${data.extendedProps.s_time}`;
7661					rawEnd   = `${data.extendedProps.end_date} ${data.extendedProps.e_time}`;
7662					timeShow  = formatRangeLocalized(rawStart, rawEnd, locale);
7663					startShow = formatDateLocalized(rawStart, locale);
7664					endShow   = formatDateLocalized(rawEnd,   locale);
7665				}
7666			} else { // 하루 일정(시간 지정)
7667				rawStart = `${data.extendedProps.start_date} ${data.extendedProps.s_time}`;
7668				rawEnd   = `${data.extendedProps.end_date} ${data.extendedProps.e_time}`;
7669				timeShow  = formatRangeLocalized(rawStart, rawEnd, locale);
7670				startShow = formatDateLocalized(rawStart, locale);
7671				endShow   = formatDateLocalized(rawEnd,   locale);
7672			}
7673
7674			const displayStartText = formatDateLocalized(rawStart, locale, 1);
7675    		const displayEndText   = formatDateLocalized(rawEnd, locale, 1);
7676
7677			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>` : ``; 
7678			let modalHeaderClass = fromList ? '' : 'no-back';
7679			var footerButtonsHtml = '',
7680				textTitle = '';
7681			if (!isGoogle) {
7682				footerButtonsHtml = `
7683					<button class="modal-delete">${$.lang[locale]['config.delete']}</button>
7684					<button class="go-modify">${$.lang[locale]['config.modify']}</button>
7685				`;
7686				textTitle = data._def.title;
7687			} else {
7688				textTitle = (data._def.title == 'undefined') ? (locale == 'ko') ? '(제목 없음)' : '(No title)' : data._def.title;
7689			}
7690
7691			let modalHtml = `
7692				<div class="calendar-modal-overlay" style="display:none;">
7693					<div class="calendar-modal-container view">
7694						<div class="calendar-modal-header">
7695							${backButtonHtml}
7696							<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>
7697						</div>
7698						<div class="calendar-modal-body">
7699							<input type="hidden" class="pid" value="${pid}">
7700							<input type="hidden" class="seq" value="${data.extendedProps.seq}">
7701							<input type="hidden" id='sale-start-datetime' value="">
7702							<div class="col-box">
7703								<input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color: ${data.backgroundColor}" readonly>
7704								<span class="modal-title">${textTitle}</span>
7705							</div>
7706							<div class="date-box">
7707								<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>
7708								<div class="modal-field sdate">
7709									<span class="daytime daytime-html start stimepicker" data-raw="${rawStart}" readonly>${displayStartText}</span>
7710								</div>
7711								<span class="middle"> ~ </span>
7712								<div class="modal-field edate">
7713									<span class="daytime daytime-html end etimepicker" data-raw="${rawEnd}" readonly>${displayEndText}</span>
7714								</div>
7715							</div>
7716							<div class="modal-field content">
7717								<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>
7718								<span>${nl2br(data.extendedProps.memo) || '&nbsp;'}</span>
7719							</div>
7720						</div>`;
7721				if(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
7722					modalHtml += `
7723						<div class="calendar-modal-footer">
7724							${footerButtonsHtml}
7725						</div>`;
7726					}
7727				modalHtml += `
7728					</div>
7729					<div class="calendar-modal-container mobile">
7730						<div class="calendar-modal-header ${modalHeaderClass}">
7731							${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>` : ``}
7732							<div class="text-right">`;
7733			if(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
7734				if(!isGoogle) {
7735					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>
7736									<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>
7737								`;
7738				}
7739			}
7740			modalHtml += `<button class="modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
7740<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>
7741							</div>
7742						</div>
7743						<div class="calendar-modal-body">
7744							<input type="hidden" class="pid" value="${pid}">
7745							<input type="hidden" class="seq" value="${data.extendedProps.seq}">
7746							<div class="title">
7747								<div class="title-left ${(property.UMEMBER.check_adm || property.UMEMBER.check_uadm) ? '' : 'notadm'}">
7748									<input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color: ${data.backgroundColor}" readonly>
7749									<span class="modal-title">${textTitle}</span>
7750								</div>
7751							</div>
7752							<div class="modal-field mdate">
7753								<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>
7754								<div class="date-box">
7755									<div class="modal-field sdate">
7756										<span class="daytime daytime-html start stimepicker" data-raw="${rawStart}" readonly>${displayStartText}</span>
7757									</div>
7758									<span class="middle"> ~ </span>
7759									<div class="modal-field edate">
7760										<span class="daytime daytime-html end etimepicker" data-raw="${rawEnd}" readonly>${displayEndText}</span>
7761									</div>
7762								</div>
7763							</div>
7764							<div class="modal-field mcontent">
7765								<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>
7766								<span>${nl2br(data.extendedProps.memo) || '&nbsp;'}</span>
7767							</div>
7768						</div>
7769					</div>
7770				</div>`;
7771
7772			const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
7773			$modalWrapper.append(modalHtml);
7774			calendarOverlayIn(pid);
7775			$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
7776
7777			if (fromList) {
7778				$modalWrapper.off('click', '.back-button').on('click', '.back-button', function () {
7779					$(".calendar-modal-overlay").remove();
7780					if (lastEventsList) {
7781						openMoreEventsModal(pid, lastEventsList, lastEventsWeekday);
7782					}
7783				});
7784			}
7785		}
7786
7787		function parseToDate(str) {
7788			if (!str) return new Date();
7789			if (str.includes('T')) return new Date(str);
7790			const [d, t] = str.trim().split(' ');
7791			const [yy, mm, dd] = d.split('-').map(Number);
7792			if (!t) return new Date(yy, mm - 1, dd, 0, 0);
7793			const [HH, MM] = t.split(':').map(Number);
7794			return new Date(yy, mm - 1, dd, HH, MM);
7795		}
7796
7797		function formatDateLocalized(rawStr, locale, isInput) {
7798			isInput = (isInput == undefined || isInput == '') ? false : true;
7799			const dt = parseToDate(rawStr);
7800			const year = dt.getFullYear();
7801			const month = String(dt.getMonth() + 1).padStart(2, '0');
7802			const day = String(dt.getDate()).padStart(2, '0');
7803			const koDays = ['일','월','화','수','목','금','토'];
7804			const enDays = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
7805			const weekday = (locale === 'en') ? enDays[dt.getDay()] : koDays[dt.getDay()];
7806			const hasTime = String(rawStr).includes(':') || String(rawStr).includes('T');
7807
7808			const dateStr = (locale === 'en') 
7809				? `${month}.${day}.${year}` 
7810				: `${year}.${month}.${day}`;
7811
7812			if (!hasTime) return `${dateStr} (${weekday})`;
7813
7814			let H = dt.getHours();
7815			const mm = String(dt.getMinutes()).padStart(2, '0');
7816			let h12 = H % 12; if (h12 === 0) h12 = 12;
7817
7818			if (locale === 'en') {
7819				const ampm = (H < 12) ? 'AM' : 'PM';
7820				if(isInput) return `${weekday} ${dateStr} <span class='tt'>${h12}:${mm} ${ampm}</span>`;
7821        		else return `${weekday} ${dateStr} ${h12}:${mm} ${ampm}`;
7822			} else {
7823				const ampm = (H < 12) ? '오전' : '오후';
7824				if(isInput) return `${dateStr} (${weekday}) <span class='tt'>${ampm} ${h12}:${mm}</span>`;
7825        		else return `${dateStr} (${weekday}) ${ampm} ${h12}:${mm}`;
7826			}
7827		}
7828
7829		function formatTimeOnly(rawStr, locale) {
7830			const dt = parseToDate(rawStr);
7831			let H = dt.getHours();
7832			const mm = String(dt.getMinutes()).padStart(2, '0');
7833			let h12 = H % 12; if (h12 === 0) h12 = 12;
7834
7835			if (locale === 'en') {
7836				const ampm = (H < 12) ? 'AM' : 'PM';
7837				return `${h12}:${mm} ${ampm}`;
7838			} else {
7839				const ampm = (H < 12) ? '오전' : '오후';
7840				return `${ampm} ${h12}:${mm}`;
7841			}
7842		}
7843
7844		// 범위 포맷: 같은 날이면 "왼쪽=전체, 오른쪽=시간만", 다른 날이면 양쪽 모두 전체
7845		function formatRangeLocalized(startRaw, endRaw, locale, {allDay=false} = {}) {
7846			const s = parseToDate(startRaw);
7847			const e = parseToDate(endRaw);
7848
7849			const sameDay = (s.getFullYear() === e.getFullYear() &&
7850							s.getMonth() === e.getMonth() &&
7851							s.getDate() === e.getDate());
7852
7853			if (allDay) {
7854				// 종일 범위: 날짜만
7855				const left  = formatDateLocalized(startRaw.split(' ')[0], locale);
7856				const right = formatDateLocalized(endRaw.split(' ')[0], locale);
7857				return `${left} ~ ${right}`;
7858			}
7859
7860			if (sameDay) {
7861				const left  = formatDateLocalized(startRaw, locale);
7862				const right = formatTimeOnly(endRaw, locale);
7863				return `${left} ~ ${right}`;
7864			} else {
7865				const left  = formatDateLocalized(startRaw, locale);
7866				const right = formatDateLocalized(endRaw,   locale);
7867				return `${left} ~ ${right}`;
7868			}
7869		}
7870
7871		function swallowNextTapOnce(ttl = 400){
7872			const stop = (e) => {
7873				e.preventDefault();
7874				e.stopPropagation();
7875				e.stopImmediatePropagation && e.stopImmediatePropagation();
7876				cleanup();
7877			};
7878			const cleanup = () => {
7879				document.removeEventListener('click', stop, true);
7880				document.removeEventListener('pointerup', stop, true);
7881				document.removeEventListener('touchend', stop, true);
7882			};
7883			document.addEventListener('click', stop, true);
7884			document.addEventListener('pointerup', stop, true);
7885			document.addEventListener('touchend', stop, true);
7886			setTimeout(cleanup, ttl);
7887		}
7888
7889		function showCalendarModalEdit(pid, mode, date, data) {
7890			// console.log('edit');
7891			swallowNextTapOnce();
7892			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
7893			var data = (typeof data != 'undefined') ? data : '';
7894
7895			$(".calendar-modal-overlay").remove();
7896
7897			if(mode == 0) {
7898				// console.log(date);
7899				var startDate = '',
7900					endDate = '',
7901					checked = '';
7902				startDate = date[0];
7903				endDate = date[1];
7904				checked = (date[2] == 1) ? 'checked' : '';
7905
7906				const displayStart = formatDateLocalized(startDate, locale);
7907        		const displayEnd   = formatDateLocalized(endDate, locale);
7908				const displayStartText = formatDateLocalized(startDate, locale, 1);
7909        		const displayEndText   = formatDateLocalized(endDate, locale, 1);
7910        
7911				var modalHtml = `
7912					<div class="calendar-modal-overlay" style="display:none;">
7913						<div class="calendar-modal-container">
7914							<div class="calendar-modal-header">
7915								<div class="cfull-box">
7916									<div class="col-box"><input type="text" class="scheduleColorPicker" data-color="#fcbf54" style="background-color: #fcbf54;" readonly></div>
7917									<div class="ccol-box">
7918										<input type="text" data-color="#ff6f61" class="scheduleColor sc1" readonly>
7919										<input type="text" data-color="#f63824" class="scheduleColor sc2" readonly>
7920										<input type="text" data-color="#ee6c3b" class="scheduleColor sc3" readonly>
7921										<input type="text" data-color="#fcbf54" class="scheduleColor sc4" readonly>
7922										<input type="text" data-color="#14c285" class="scheduleColor sc5" readonly>
7923										<input type="text" data-color="#1d9f54" class="scheduleColor sc6" readonly><br>
7924										<input type="text" data-color="#3498db" class="scheduleColor sc7" readonly>
7925										<input type="text" data-color="#022b79" class="scheduleColor sc8" readonly>
7926										<input type="text" data-color="#9b59b6" class="scheduleColor sc9" readonly>
7927										<input type="text" data-color="#e91e63" class="scheduleColor sc10" readonly>
7928										<input type="text" data-color="#566573" class="scheduleColor sc11" readonly>
7929										<input type="text" data-color="#95a5a6" class="scheduleColor sc12" readonly>
7930									</div>
7931								</div>
7932								<span class="modal-title"><input type="text" class="ctitle" value="" placeholder="${$.lang[locale]['config.calendar.title.placeholder']}" maxlength="200"></span>
7933								<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>
7934							</div>
7935							<div class="calendar-modal-body">
7936								<input type="hidden" class="pass" value="Y">
7937								<input type="hidden" id='sale-start-datetime' value="">
7938								<div class="modal-field all">
7939									<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>
7940									<label for="all-day">${$.lang[locale]['config.calendar.fulltime']}</label>
7941									<span class="bc-tp-btn switch-wrap">
7942										<label class="switch prop-wrap">
7943											<input type="checkbox" class="switch-input all-day" id="all-day" data-el="${selectEL}" ${checked}>
7944											<span class="switch-label" data-on="On" data-off="Off"></span>
7945											<span class="switch-handle"></span>
7946										</label>
7947									</span>
7948								</div>
7949								<div class="date-box">
7950									<div class="modal-field sdate">
7951										<label>&nbsp;</label>
7952										<input class="daytime start" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayStart}" data-raw="${startDate}" readonly>
7953										<span class="daytime daytime-html start stimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${startDate}" readonly>${displayStartText}</span>
7954									</div>
7955									<span class="middle"> ~ </span>
7956									<div class="modal-field edate">
7957										<input class="daytime end" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayEnd}" data-raw="${endDate}" readonly>
7958										<span class="daytime daytime-html end etimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${endDate}" readonly>${displayEndText}</span>
7959									</div>
7960								</div>
7961								<div class="modal-field content">
7962									<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>
7963									<textarea placeholder="${$.lang[locale]['config.calendar.content.placeholder']}"></textarea>
7964								</div>
7965							</div>
7966							<div class="calendar-modal-footer">
7967								<button class="modal-save">${$.lang[locale]['config.save']}</button>
7968							</div>
7969						</div>
7970					</div>`;
7971
7972			} else {
7973				var startDate, endDate;
7974				if(data.extendedProps.fulltime == 'Y') {
7975					startDate = data.extendedProps.start_date;
7976					endDate = data.extendedProps.end_date;
7977				} else {
7978					startDate = data.extendedProps.start_date + ' ' + data.extendedProps.s_time,
7979            		endDate = data.extendedProps.end_date + ' ' + data.extendedProps.e_time;
7980				}
7981
7982				const displayStart = formatDateLocalized(startDate, locale);
7983        		const displayEnd   = formatDateLocalized(endDate, locale);
7984				const displayStartText = formatDateLocalized(startDate, locale, 1);
7985        		const displayEndText   = formatDateLocalized(endDate, locale, 1);
7986
7987				var modalHtml = `
7988					<div class="calendar-modal-overlay" style="display:none;">
7989						<div class="calendar-modal-container">
7990							<div class="calendar-modal-header">
7991								<button class="back-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
7991<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>
7992								<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>
7993							</div>
7994							<div class="calendar-modal-body">
7995								<input type="hidden" class="pass" value="Y">
7996								<input type="hidden" class="seq" value="${data.extendedProps.seq}">
7997								<input type="hidden" id='sale-start-datetime' value="">
7998								<div class="title-modify">
7999									<div class="cfull-box">
8000										<div class="col-box"><input type="text" class="scheduleColorPicker" data-color="${data.backgroundColor}" style="background-color:${data.backgroundColor};" readonly></div>
8001										<div class="ccol-box">
8002											<input type="text" data-color="#ff6f61" class="scheduleColor sc1" readonly>
8003											<input type="text" data-color="#f63824" class="scheduleColor sc2" readonly>
8004											<input type="text" data-color="#ee6c3b" class="scheduleColor sc3" readonly>
8005											<input type="text" data-color="#fcbf54" class="scheduleColor sc4" readonly>
8006											<input type="text" data-color="#14c285" class="scheduleColor sc5" readonly>
8007											<input type="text" data-color="#1d9f54" class="scheduleColor sc6" readonly><br>
8008											<input type="text" data-color="#3498db" class="scheduleColor sc7" readonly>
8009											<input type="text" data-color="#022b79" class="scheduleColor sc8" readonly>
8010											<input type="text" data-color="#9b59b6" class="scheduleColor sc9" readonly>
8011											<input type="text" data-color="#e91e63" class="scheduleColor sc10" readonly>
8012											<input type="text" data-color="#566573" class="scheduleColor sc11" readonly>
8013											<input type="text" data-color="#95a5a6" class="scheduleColor sc12" readonly>
8014										</div>
8015									</div>
8016									<span class="modal-title"><input type="text" class="ctitle" value="${data._def.title}" placeholder="${$.lang[locale]['config.calendar.title.placeholder']}" maxlength="200"></span>
8017								</div>
8018								<div class="modal-field all">
8019									<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>
8020									<label for="all-day">${$.lang[locale]['config.calendar.fulltime']}</label>
8021									<span class="bc-tp-btn switch-wrap">
8022										<label class="switch prop-wrap">
8023											<input type="checkbox" class="switch-input all-day" id="all-day" data-el="${selectEL}" ${(data.extendedProps.fulltime == 'Y') ? 'checked' : ''}>
8024											<span class="switch-label" data-on="On" data-off="Off"></span>
8025											<span class="switch-handle"></span>
8026										</label>
8027									</span>
8028								</div>
8029								<div class="date-box">
8030									<div class="modal-field sdate">
8031										<label>&nbsp;</label>
8032										<input class="daytime start" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayStart}" data-raw="${startDate}" readonly>
8033										<span class="daytime daytime-html start stimepicker" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${startDate}" readonly>${displayStartText}</span>
8034									</div>
8035									<span class="middle"> ~ </span>
8036									<div class="modal-field edate">
8037										<input class="daytime end" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" value="${displayEnd}" data-raw="${endDate}" readonly>
8038										<span class="daytime daytime-html end etimepicker" type="text" placeholder="${$.lang[locale]['config.calendar.datetime']}" data-raw="${endDate}" readonly>${displayEndText}</span>
8039									</div>
8040								</div>
8041								<div class="modal-field content">
8042									<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>
8043                            		<textarea placeholder="${$.lang[locale]['config.calendar.content.placeholder']}">${data.extendedProps.memo}</textarea>
8044								</div>
8045							</div>
8046							<div class="calendar-modal-footer">
8047								<button class="modal-modify">${$.lang[locale]['config.save']}</button>
8048							</div>
8049						</div>
8050					</div>`;
8051			}
8052
8053			$('.userEL'+pid).find(".calendarModal").append(modalHtml);
8054			calendarOverlayIn(pid);
8055			$('.userEL'+pid).find(".calendar-modal-overlay").fadeIn(200);
8056			$('.userEL'+pid).find('.ctitle').focus();
8057			refitAll();
8058		}
8059
8060		function formatTime(time, locale) {
8061			let [hour, minute] = time.split(':').map(Number);
8062
8063			let period = hour < 12 ? $.lang[locale]['config.calendar.am'] : $.lang[locale]['config.calendar.pm'];
8064			let hour12 = hour % 12 || 12;
8065			let minuteText = minute.toString().padStart(2, '0');
8066
8067			return `${period} ${hour12}:${minuteText}`;
8068		}
8069
8070		function toDateStr(d) {
8071			if (!d) return '';
8072			const y = d.getFullYear();
8073			const m = String(d.getMonth() + 1).padStart(2, '0');
8074			const day = String(d.getDate()).padStart(2, '0');
8075			return `${y}-${m}-${day}`;
8076		}
8077
8078		function fmtHMFromDate(d, locale) {
8079			if (!d) return '';
8080			const hour = d.getHours();
8081			const minute = String(d.getMinutes()).padStart(2,'0');
8082			if (locale === 'ko') {
8083				const period = hour < 12 ? $.lang[locale]['config.calendar.am'] : $.lang[locale]['config.calendar.pm'];
8084				const hour12 = hour % 12 || 12;
8085				return `${period} ${hour12}:${minute}`;
8086			}
8087			return new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit' }).format(d);
8088		}
8089
8090		function openMoreEventsModal(pid, events, weekday) {
8091			var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8092			if (!Array.isArray(events)) {
8093				events = [events];
8094			}
8095
8096			lastEventsList = events;
8097			lastEventsWeekday = weekday;
8098			const dayNum = weekday[0].getDate();
8099
8100			const filteredEvents = events.filter(ev => !(ev.classNames && ev.classNames.includes('holiday-event')));
8101
8102			const sorted = filteredEvents.slice().sort((a, b) => {
8103				const isMulti = (ev) => {
8104					const sd = ev.extendedProps?.start_date;
8105					const ed = ev.extendedProps?.end_date;
8106					if (sd && ed && sd !== ed) return true; 
8107					if (ev.allDay && ev.start && ev.end) return (ev.end - ev.start) >= 86400000;
8108					return false;
8109				};
8110
8111				const am = isMulti(a), bm = isMulti(b);
8112				if (am !== bm) return am ? -1 : 1;   
8113
8114				const as = a.start ? a.start.getTime() : 0;
8115				const bs = b.start ? b.start.getTime() : 0;
8116				if (as !== bs) return as - bs;
8117
8118				const ae = a.end ? a.end.getTime() : Number.POSITIVE_INFINITY;
8119				const be = b.end ? b.end.getTime() : Number.POSITIVE_INFINITY;
8120				if (ae !== be) return ae - be;
8121
8122				return (a.title || '').localeCompare(b.title || '');
8123			});
8124
8125			const googleColorRaw = (googleColor && googleColor.get(pid)) || '';
8126    		const googleColorHex = googleColorRaw ? (googleColorRaw.startsWith('#') ? googleColorRaw : ('#' + googleColorRaw)) : ''; 
8127
8128			$(".calendar-modal-overlay").remove();
8129			let modalHtml = `
8130				<div class="calendar-modal-overlay" style="display:none;">
8131					<div class="calendar-modal-container">
8132						<div class="calendar-modal-header">
8133							<h4>${dayNum} <span>${weekday[1]}</span></h4>
8134							<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>
8135						</div>
8136						<div class="calendar-modal-body">
8137							<input type="hidden" id='sale-start-datetime' value="">
8138							<div class="schedule-list">
8139								<ul>
8140			`;
8141
8142			for (let i = 0; i < sorted.length; i++) {
8143				var ev = sorted[i];
8144				const locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8145
8146				let sdate = ev.extendedProps?.start_date || '';
8147				let edate = ev.extendedProps?.end_date || '';
8148				let fulltimeFlag = ev.extendedProps?.fulltime; // 'Y' 또는 'N' 기대
8149
8150				const isAllDay = (fulltimeFlag === 'Y') || (!!ev.allDay);
8151
8152				if (!sdate && ev.start) sdate = toDateStr(ev.start);
8153
8154				if (!edate) {
8155					if (ev.end) {
8156						if (isAllDay) {
8157							const d = new Date(ev.end);
8158							d.setDate(d.getDate() - 1);
8159							edate = toDateStr(d);
8160						} else {
8161							edate = toDateStr(ev.end);
8162						}
8163					} else {
8164						edate = sdate; // 끝이 없으면 시작과 동일
8165					}
8166				}
8167
8168				let	schedule_time = '';
8169				if (sdate !== edate) {
8170					if (isAllDay) {
8171						schedule_time = `${sdate.slice(5)} ~ ${edate.slice(5)}`;
8172					} else {
8173						schedule_time = `${sdate.slice(5)} ${fmtHMFromDate(ev.start, locale)} ~ ${edate.slice(5)} ${fmtHMFromDate(ev.end, locale)}`;
8174					}
8175				} else {
8176					schedule_time = isAllDay ? '' : `${fmtHMFromDate(ev.start, locale)} ~ ${fmtHMFromDate(ev.end, locale)}`;
8177				}
8178
8179				const isFullLabel = isAllDay ? $.lang[locale]['config.calendar.fulltime'] : fmtHMFromDate(ev.start, locale);
8180				const isGoogle = !!ev.extendedProps?.isGoogle;
8181				const noTitleText = (locale === 'ko') ? '(제목 없음)' : '(No title)';
8182				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) || '';
8183				const titleSafe = rawTitle.trim() !== 'undefined' ? rawTitle : noTitleText;
8184				const bgColor = (() => {
8185					const own = ev.backgroundColor || ev.borderColor || '';
8186					if (isGoogle) {
8187						return own || googleColorHex || '#4789e7';
8188					}
8189					return own || '#4789e7';
8190				})();
8191
8192				modalHtml += `
8193					<li class="schedule-view" data-index="${i}">
8194					<div class="left-wrap">
8195						<input type="text" class="scheduleColorPicker color2"
8196						data-color="${bgColor}"
8197						style="background-color:${bgColor}" readonly>
8198						<span>${isFullLabel}</span>
8199					</div>
8200					<div class="right-wrap">
8201						<div class="schedule-title">${titleSafe} ${isGoogle ? '' : ''}</div>
8202						<div class="schedule-time">${schedule_time}</div>
8203					</div>
8204					</li>
8205				`;
8206			}
8207
8208			modalHtml += `
8209								</ul>
8210							</div>
8211						</div>`;
8212			if (property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8213				modalHtml += `<div class="schedule-plus-box">
8214								<button class="schedule-plus pc">${$.lang[locale]['config.calendar.schedule-plus']}</button>
8215                    			<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>
8216							</div>`;
8217			}
8218			modalHtml += `</div></div>`;
8219
8220			const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
8221			$modalWrapper.append(modalHtml);
8222			calendarOverlayIn(pid);
8223			$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
8224
8225			$modalWrapper.off('click', '.schedule-view').on('click', '.schedule-view', function () {
8226				const index = $(this).data('index');
8227				const eventData = sorted[index];
8228				currentEvent = eventData;
8229
8230				showCalendarModalView(pid, eventData, true); 
8231			});
8232
8233			$modalWrapper.off('click', '.schedule-plus').on('click', '.schedule-plus', function () {
8234				const year = weekday[0].getFullYear();
8235				const month = String(weekday[0].getMonth() + 1).padStart(2, '0');
8236				const day = String(weekday[0].getDate()).padStart(2, '0');
8237				var startDate = `${year}-${month}-${day} 12:00`;
8238				var endDate = `${year}-${month}-${day} 13:00`;
8239				var date = [startDate, endDate];
8240				showCalendarModalEdit(pid, 0, date);
8241			});
8242		}
8243
8244		// function openMoreEventsModal(pid, events, weekday) {
8245		// 	var locale = ($('.userEL'+pid).hasClass('en')) ? 'en' : 'ko';
8246		// 	if (!Array.isArray(events)) {
8247		// 		events = [events];
8248		// 	}
8249
8250		// 	lastEventsList = events;
8251		// 	lastEventsWeekday = weekday;
8252		// 	const dayNum = weekday[0].getDate();
8253
8254		// 	const filteredEvents = events.filter(ev => !(ev.classNames && ev.classNames.includes('holiday-event')));
8255
8256		// 	const sorted = filteredEvents.slice().sort((a, b) => {
8257		// 		const isMulti = (ev) => {
8258		// 			const sd = ev.extendedProps?.start_date;
8259		// 			const ed = ev.extendedProps?.end_date;
8260		// 			if (sd && ed && sd !== ed) return true; 
8261		// 			if (ev.allDay && ev.start && ev.end) return (ev.end - ev.start) >= 86400000;
8262		// 			return false;
8263		// 		};
8264
8265		// 		const am = isMulti(a), bm = isMulti(b);
8266		// 		if (am !== bm) return am ? -1 : 1;   
8267
8268		// 		const as = a.start ? a.start.getTime() : 0;
8269		// 		const bs = b.start ? b.start.getTime() : 0;
8270		// 		if (as !== bs) return as - bs;
8271
8272		// 		const ae = a.end ? a.end.getTime() : Number.POSITIVE_INFINITY;
8273		// 		const be = b.end ? b.end.getTime() : Number.POSITIVE_INFINITY;
8274		// 		if (ae !== be) return ae - be;
8275
8276		// 		return (a.title || '').localeCompare(b.title || '');
8277		// 	});
8278
8279		// 	$(".calendar-modal-overlay").remove();
8280		// 	let modalHtml = `
8281		// 		<div class="calendar-modal-overlay" style="display:none;">
8282		// 			<div class="calendar-modal-container">
8283		// 				<div class="calendar-modal-header">
8284		// 					<h4>${dayNum} <span>${weekday[1]}</span></h4>
8285		// 					<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>
8286		// 				</div>
8287		// 				<div class="calendar-modal-body">
8288		// 					<input type="hidden" id='sale-start-datetime' value="">
8289		// 					<div class="schedule-list">
8290		// 						<ul>
8291		// 	`;
8292
8293		// 	for (let i = 0; i < sorted.length; i++) {
8294		// 		var ev = sorted[i],
8295		// 			sdate = ev.extendedProps.start_date,
8296		// 			edate = ev.extendedProps.end_date,
8297		// 			schedule_time = '';
8298		// 		if(sdate != edate) {
8299		// 			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);
8300		// 		} else {
8301		// 			schedule_time = (ev.extendedProps.fulltime == 'Y') ? '' : `${formatTime(ev.extendedProps.s_time, locale)} ~ ${formatTime(ev.extendedProps.e_time, locale)}`;
8302		// 		}
8303		// 		const isFull = (ev.extendedProps.fulltime == 'Y') ? $.lang[locale]['config.calendar.fulltime'] : formatTime(ev.extendedProps.s_time, locale);
8304
8305		// 		modalHtml += `
8306		// 			<li class="schedule-view" data-index="${i}">
8307		// 				<div class="left-wrap">
8308		// 					<input type="text" class="scheduleColorPicker color2"
8309		// 						data-color="${ev.backgroundColor}"
8310		// 						style="background-color: ${ev.backgroundColor}" readonly>
8311		// 					<span>${isFull}</span>
8312		// 				</div>
8313		// 				<div class="right-wrap">
8314		// 					<div class="schedule-title">${ev._def.title}</div>
8315		// 					<div class="schedule-time">
8316		// 						${schedule_time}
8317		// 					</div>
8318		// 				</div>
8319		// 			</li>
8320		// 		`;
8321		// 	}
8322
8323		// 	modalHtml += `
8324		// 						</ul>
8325		// 					</div>
8326		// 				</div>`;
8327		// 	if (property.UMEMBER.check_adm || property.UMEMBER.check_uadm) {
8328		// 		modalHtml += `<div class="schedule-plus-box">
8329		// 						<button class="schedule-plus pc">${$.lang[locale]['config.calendar.schedule-plus']}</button>
8330        //             			<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>
8331		// 					</div>`;
8332		// 	}
8333		// 	modalHtml += `</div></div>`;
8334
8335		// 	const $modalWrapper = $('.userEL' + pid).find(".calendarModal");
8336		// 	$modalWrapper.append(modalHtml);
8337		// 	calendarOverlayIn(pid);
8338		// 	$modalWrapper.find(".calendar-modal-overlay").fadeIn(200);
8339
8340		// 	$modalWrapper.off('click', '.schedule-view').on('click', '.schedule-view', function () {
8341		// 		const index = $(this).data('index');
8342		// 		const eventData = sorted[index];
8343		// 		currentEvent = eventData;
8344
8345		// 		showCalendarModalView(pid, eventData, true); 
8346		// 	});
8347
8348		// 	$modalWrapper.off('click', '.schedule-plus').on('click', '.schedule-plus', function () {
8349		// 		const year = weekday[0].getFullYear();
8350		// 		const month = String(weekday[0].getMonth() + 1).padStart(2, '0');
8351		// 		const day = String(weekday[0].getDate()).padStart(2, '0');
8352		// 		var startDate = `${year}-${month}-${day} 12:00`;
8353		// 		var endDate = `${year}-${month}-${day} 13:00`;
8354		// 		var date = [startDate, endDate];
8355		// 		showCalendarModalEdit(pid, 0, date);
8356		// 	});
8357		// }
8358
8359		function buildFcEvents(events) {
8360			function addDaysStr(ymd, days) {
8361				// ymd가 없거나 이상하면 오늘을 기준으로 보정
8362				if (!ymd || typeof ymd !== 'string' || ymd.length < 8) {
8363				const t = new Date();
8364				t.setDate(t.getDate() + (days || 0));
8365				const yy = t.getFullYear();
8366				const mm = String(t.getMonth() + 1).padStart(2, '0');
8367				const dd = String(t.getDate()).padStart(2, '0');
8368				return `${yy}-${mm}-${dd}`;
8369				}
8370				const [y, m, d] = ymd.split('-').map(Number);
8371				const dt = new Date((y || new Date().getFullYear()), (m ? m - 1 : 0), (d || 1));
8372				dt.setDate(dt.getDate() + (days || 0));
8373				const yy = dt.getFullYear();
8374				const mm = String(dt.getMonth() + 1).padStart(2, '0');
8375				const dd = String(dt.getDate()).padStart(2, '0');
8376				return `${yy}-${mm}-${dd}`;
8377			}
8378
8379			// 허용: "9:05", "23:45", "23:45:00" (앞뒤 공백 허용)
8380			const TIME_RX = /^\s*\d{1,2}:\d{2}(?::\d{2})?\s*$/;
8381			const toHM = (t) => {
8382				if (!t || typeof t !== 'string') return '00:00';
8383				const parts = t.trim().split(':');   // ["HH","mm"] 또는 ["HH","mm","ss"]
8384				const Hn = parseInt(parts[0], 10);
8385				const Mn = parseInt(parts[1] ?? '0', 10);
8386				const HH = isFinite(Hn) ? String(Hn).padStart(2, '0') : '00';
8387				const MM = isFinite(Mn) ? String(Mn).padStart(2, '0') : '00';
8388				return `${HH}:${MM}`;
8389			};
8390
8391			const mapped = (events || []).map(e => {
8392				let settings = {};
8393				try { settings = JSON.parse(e?.settings || '{}'); } catch {}
8394
8395				const isHoliday = e?.seq && String(e.seq).startsWith('holiday_');
8396
8397				// 날짜 확보: s_date/e_date → start/end → 오늘
8398				let sDate = (e?.s_date || '').slice(0, 10);
8399				let eDate = (e?.e_date || '').slice(0, 10);
8400
8401				if (!sDate && typeof e?.start === 'string') sDate = e.start.slice(0, 10);
8402				if (!eDate && typeof e?.end   === 'string') eDate = e.end.slice(0, 10);
8403				if (!sDate) {
8404				const t = new Date();
8405				sDate = `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`;
8406				}
8407				if (!eDate) eDate = sDate;
8408
8409				// 시간 정규화
8410				const sHasTime = TIME_RX.test(e?.s_time || '');
8411				const eHasTime = TIME_RX.test(e?.e_time || '');
8412				const sTime = sHasTime ? toHM(e.s_time) : '00:00';
8413				const eTime = eHasTime ? toHM(e.e_time) : (sHasTime ? toHM(e.s_time) : '00:00');
8414
8415				// fulltime 플래그
8416				const fullTFlag = (e?.fulltime === 'Y');
8417
8418				// 시간이 둘 다 있으면 무조건 timed, 아니면 fullTFlag/날짜 범위로 all-day
8419				const isTimed = (sHasTime && eHasTime) && !fullTFlag;
8420				const fullT = !isTimed && (fullTFlag || sDate < eDate);
8421
8422				// ── 공휴일(배경)
8423				if (isHoliday) {
8424				const endPlus1 = addDaysStr(eDate, 1);
8425				return {
8426					id: `holiday_${sDate}_${settings.title || e.title}`,
8427					title: e?.title || settings.title || '',
8428					start: `${sDate}T00:00`,
8429					end:   `${endPlus1}T00:00`,
8430					allDay: true,
8431					display: 'background',
8432					classNames: ['holiday-event'],
8433					start_date: sDate,
8434					end_date: eDate,
8435				};
8436				}
8437
8438				let startISO, endISO, allDayFlag;
8439
8440				if (isTimed) {
8441					allDayFlag = false;
8442					startISO = `${sDate}T${sTime}`;
8443					endISO   = `${eDate}T${eTime}`;
8444
8445					// Invalid Date 방지: 유효하지 않으면 보정
8446					let s = new Date(startISO);
8447					let t = new Date(endISO);
8448					if (isNaN(s.getTime())) s = new Date(`${sDate}T00:00`);
8449					if (isNaN(t.getTime())) t = new Date(`${eDate}T${eTime || '00:00'}`);
8450
8451					// end < start → 동일 시각(0-duration)
8452					if (t.getTime() < s.getTime()) t = new Date(s.getTime());
8453
8454					// 같은 날짜인데 end가 다음날 00:00 경계로 넘어가면 23:59로 클램프
8455					const sameYMD = (a, b) => a.getFullYear()===b.getFullYear() && a.getMonth()===b.getMonth() && a.getDate()===b.getDate();
8456					if (!sameYMD(s, t) && sDate === eDate && t.getHours() === 0 && t.getMinutes() === 0) {
8457						t = new Date(s); t.setHours(23, 59, 0, 0);
8458					}
8459
8460					// (선택) 0-duration 렌더 꼬임 방지 +1분
8461					if (t.getTime() === s.getTime()) t = new Date(t.getTime() + 60 * 1000);
8462
8463					// ISO 재조립
8464					const yy = t.getFullYear();
8465					const mm = String(t.getMonth() + 1).padStart(2, '0');
8466					const dd = String(t.getDate()).padStart(2, '0');
8467					const HH = String(t.getHours()).padStart(2, '0');
8468					const MI = String(t.getMinutes()).padStart(2, '0');
8469					endISO = `${yy}-${mm}-${dd}T${HH}:${MI}`;
8470				} else {
8471					// all-day: end는 익스클루시브(+1일)
8472					allDayFlag = true;
8473					startISO = `${sDate}T00:00`;
8474					const endPlus1 = addDaysStr(eDate, 1);
8475					endISO   = `${endPlus1}T00:00`;
8476				}
8477
8478				const isMulti = (sDate && eDate && sDate !== eDate) || (allDayFlag && sDate !== eDate);
8479
8480				return {
8481				title: e?.title || settings.title || '',
8482				start: startISO,
8483				end:   endISO,
8484				allDay: allDayFlag,
8485				color: settings.color || '#4789e7',
8486				multiOrder: isMulti ? 0 : 1,
8487				memo: e?.memo,
8488				pid: e?.pid,
8489				seq: e?.seq,
8490				s_time: e?.s_time,
8491				e_time: e?.e_time,
8492				start_date: sDate,
8493				end_date: eDate,
8494				fulltime: e?.fulltime,
8495				classNames: []
8496				};
8497			});
8498
8499			// 인터페이스 유지
8500			// console.log(calendarElsettings)
8501			let pid = null;
8502
8503			if (Array.isArray(events) && events.length > 0) {
8504				pid = events[0].pid || null;
8505			}
8506
8507			const calendarFlag = (pid && calendarElsettings.get(pid) === true);
8508			return calendarFlag ? mapped : mapped.filter(ev => ev.classNames.includes('holiday-event'));
8509		}
8510
8511		function getClickedDateStrAccurate(info) {
8512			const stack = (info.jsEvent && document.elementsFromPoint)
8513				? document.elementsFromPoint(info.jsEvent.clientX, info.jsEvent.clientY)
8514				: [];
8515
8516			const cell = stack.find(el => el && el.getAttribute && el.getAttribute('data-date'));
8517
8518			if (cell) return cell.getAttribute('data-date');
8519
8520			const byClosest = info.el.closest('.fc-daygrid-day[data-date], .fc-timegrid-col[data-date], [data-date]');
8521			if (byClosest) return byClosest.getAttribute('data-date');
8522
8523			return (info.event.startStr || '').split('T')[0];
8524		}
8525
8526		function ymKey(d){ return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`; }
8527
8528		function ymAdd(ym, delta) {
8529			const [y, m] = ym.split('-').map(Number);
8530			const n = y * 12 + (m - 1) + delta;
8531			const yy = Math.floor(n / 12), mm = (n % 12) + 1;
8532			return `${yy}-${String(mm).padStart(2, '0')}`;
8533		}
8534
8535		function monthsBetweenInclusive(sYmd, eYmd) {
8536			const out = [];
8537			const [sy, sm] = sYmd.split('-').map(Number);
8538			const [ey, em] = eYmd.split('-').map(Number);
8539			let y = sy, m = sm;
8540			while (y < ey || (y === ey && m <= em)) {
8541				out.push(`${y}-${String(m).padStart(2, '0')}`);
8542				m++;
8543				if (m === 13) { m = 1; y++; }
8544			}
8545			return out;
8546		}
8547
8548		function invalidateAround(pid, ym) { // ym: 'YYYY-MM'
8549			const pidMap = monthCache.get(pid);
8550			if (!pidMap) return;
8551
8552			const [y, m] = ym.split('-').map(Number);
8553			const prev = new Date(y, m - 2, 1);
8554			const cur  = new Date(y, m - 1, 1);
8555			const next = new Date(y, m, 1);
8556
8557			[prev, cur, next].forEach(d => {
8558				const key = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
8559				pidMap.delete(key);
8560			});
8561		}
8562
8563		// 서버에서 내려온 3개월치 data를 달별로 분배해서 병합
8564		function upsertMonthCacheFromServer(pid, serverEvents) {
8565			if (!serverEvents) return;
8566			let pidMap = monthCache.get(pid);
8567			if (!pidMap) {
8568				pidMap = new Map();
8569				monthCache.set(pid, pidMap);
8570			}
8571
8572			const mapped = buildFcEvents(serverEvents) || [];  // ★ 동일 포맷으로 맞춤
8573			const bucket = new Map(); // key: 'YYYY-MM' -> ev[]
8574			for (const ev of mapped) {
8575				// 시작/끝 계산 (all-day 및 00:00 경계 보정)
8576				const s0 = new Date(ev.start);
8577				const e0 = new Date(ev.end);
8578				const s  = new Date(s0);
8579				const e  = new Date(e0);
8580
8581				// 종일(Y) 또는 end가 00:00:00인 경우 표시용 inclusive 보정
8582				if (ev.fulltime === 'Y' || ev.allDay) {
8583				e.setDate(e.getDate() - 1);
8584				} else if (e0.getHours() === 0 && e0.getMinutes() === 0 && e0.getSeconds() === 0) {
8585				e.setMilliseconds(e.getMilliseconds() - 1);
8586				}
8587
8588				const cur = new Date(s.getFullYear(), s.getMonth(), 1);
8589				const last = new Date(e.getFullYear(), e.getMonth(), 1);
8590				while (cur <= last) {
8591				const key = ymKey(cur);
8592				if (!bucket.has(key)) bucket.set(key, []);
8593				bucket.get(key).push(ev);
8594				cur.setMonth(cur.getMonth() + 1);
8595				}
8596			}
8597
8598			for (const [key, arr] of bucket.entries()) {
8599				const prev = pidMap.get(key) || [];
8600				const seen = new Set();
8601				const merged = [];
8602				for (const item of [...prev, ...arr]) {
8603				const k = `${item.id || item.seq || item.title}|${item.start}|${item.end}|${item.allDay ? 1 : 0}`;
8604				if (!seen.has(k)) { seen.add(k); merged.push(item); }
8605				}
8606				pidMap.set(key, merged);
8607			}
8608		}
8609
8610		function monthsAround(ym) {
8611			const [y, m] = ym.split('-').map(Number);
8612			const prev = new Date(y, m - 2, 1);
8613			const cur  = new Date(y, m - 1, 1);
8614			const next = new Date(y, m, 1);
8615			return [prev, cur, next].map(d => `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`);
8616		}
8617
8618		// 전/당/다음 달 캐시 무효화
8619		function invalidateAround(pid, ym) {
8620			const pidMap = monthCache.get(pid);
8621			if (!pidMap) return;
8622
8623			const [y, m] = ym.split('-').map(Number);
8624			const prev = new Date(y, m - 2, 1);  // 전월
8625			const cur  = new Date(y, m - 1, 1);  // 당월
8626			const next = new Date(y, m, 1);      // 다음월
8627
8628			[prev, cur, next].forEach(d => {
8629				const key = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
8630				pidMap.delete(key);
8631			});
8632		}
8633
8634		function monthsInRange(start, end){
8635			const arr = [];
8636			const d = new Date(start.getFullYear(), start.getMonth(), 1);
8637			while (d <= end) { arr.push(ymKey(d)); d.setMonth(d.getMonth()+1); }
8638			return arr;
8639		}
8640
8641		// 세 달(전월/해당월/다음월)을 한 번에 받아 캐시에 분산 저장
8642		function fetchMonth(pid, yearMonth, data_type) {
8643			let pidCache = monthCache.get(pid);
8644			let pidInflight = inflight.get(pid);
8645			if (!pidCache) { pidCache = new Map(); monthCache.set(pid, pidCache); }
8646			if (!pidInflight) { pidInflight = new Map(); inflight.set(pid, pidInflight); }
8647
8648			// 이미 캐시되어 있으면 재사용
8649			if (pidCache.has(yearMonth)) return Promise.resolve(pidCache.get(yearMonth));
8650			// 동일 YM에 대한 진행중 요청이 있으면 그것을 공유
8651			if (pidInflight.has(yearMonth)) return pidInflight.get(yearMonth);
8652
8653			const prevYM = ymAdd(yearMonth, -1);
8654			const nextYM = ymAdd(yearMonth, +1);
8655
8656			// 🔹 병합 유틸
8657			const dedupe = (list) => {
8658				const seen = new Set();
8659				const out = [];
8660				for (const ev of list) {
8661				const k = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
8662				if (!seen.has(k)) { seen.add(k); out.push(ev); }
8663				}
8664				return out;
8665			};
8666			const mergeSet = (cache, ym, arr) => {
8667				const prev = cache.get(ym) || [];
8668				const merged = dedupe(prev.concat(arr || []));
8669				cache.set(ym, merged);
8670			};
8671
8672			const p = new Promise((resolve, reject) => {
8673				$.ajax({
8674				url: '/template/get_calendar',
8675				type: 'POST',
8676				dataType: 'json',
8677				data: { sid: b.SID, pid, yearMonth, data_type },
8678				success: function(raw) {
8679					checkError(raw);
8680					// 서버 → FC 이벤트로 변환
8681					const all = buildFcEvents(raw) || [];
8682
8683					// 🔹 월 버킷팅
8684					const buckets = new Map();
8685					const put = (ym, ev) => {
8686					if (!buckets.has(ym)) buckets.set(ym, []);
8687					buckets.get(ym).push(ev);
8688					};
8689
8690					for (const ev of all) {
8691					const sStr = ev.start_date || (ev.start?.slice(0, 10)) || '';
8692					let eStr   = ev.end_date   || '';
8693
8694					if (!sStr) continue;
8695
8696					// end 보정 (종일: exclusive → inclusive / 00:00 경계 보정)
8697					if (!eStr) {
8698						if (ev.allDay && ev.end) eStr = addDaysStr(ev.end.slice(0, 10), -1);
8699						else if (ev.end)         eStr = ev.end.slice(0, 10);
8700						else                     eStr = sStr;
8701					} else {
8702						// 선택: 서버 end_date가 'YYYY-MM-DD' 00:00:00 의미라면 하루 빼기
8703						// 만약 서버 end_date가 이미 inclusive라면 이 블록은 제거하세요.
8704						// (현재 로직은 allDay에서만 -1 처리하므로 그대로 두는 게 안전)
8705					}
8706
8707					// 🔹 s~e 사이 모든 YM 버킷에 푸시
8708					const sYM = sStr.slice(0, 7);
8709					const eYM = eStr.slice(0, 7);
8710					for (const ym of monthsBetweenInclusive(sYM, eYM)) {
8711						put(ym, ev);
8712					}
8713					}
8714
8715					// 🔹 set → mergeSet 로 변경 (덮어쓰기 금지)
8716					mergeSet(pidCache, prevYM,   buckets.get(prevYM));
8717					mergeSet(pidCache, yearMonth, buckets.get(yearMonth));
8718					mergeSet(pidCache, nextYM,   buckets.get(nextYM));
8719
8720					// inflight 해제 (요청 공유했던 3개월 키 모두 제거)
8721					pidInflight.delete(prevYM);
8722					pidInflight.delete(yearMonth);
8723					pidInflight.delete(nextYM);
8724
8725					resolve(pidCache.get(yearMonth));
8726				},
8727				error: function(xhr, status, err) {
8728					pidInflight.delete(prevYM);
8729					pidInflight.delete(yearMonth);
8730					pidInflight.delete(nextYM);
8731					reject(err);
8732				}
8733				});
8734			});
8735
8736			// 동일 요청 공유 (3개월 모두 같은 Promise 공유)
8737			pidInflight.set(prevYM, p);
8738			pidInflight.set(yearMonth, p);
8739			pidInflight.set(nextYM, p);
8740
8741			return p;
8742		}
8743
8744		function calendarShow(elsettings) {
8745			return (
8746				property.UMEMBER.check_adm == true || 
8747				property.UMEMBER.check_uadm == true || 
8748				elsettings.read_chmod == 'all' || 
8749				(elsettings.read_chmod == 'admin' && property.UMEMBER.check_adm == true) || 
8750				(elsettings.read_chmod == 'admin' && property.UMEMBER.check_uadm == true) || 
8751				(elsettings.read_chmod == 'member' && property.UMEMBER.check_login == true) 
8752			);
8753		}
8754
8755		// 주/일 캘린더 공휴일 추가
8756		function headerRoot(view) {
8757			if (view && view.calendar && view.calendar.el) return view.calendar.el;
8758			if (view && view.el) return view.el;
8759			return document;
8760		}
8761		function fmtDate(d) {
8762			const y = d.getFullYear();
8763			const m = String(d.getMonth() + 1).padStart(2, '0');
8764			const dd = String(d.getDate()).padStart(2, '0');
8765			return `${y}-${m}-${dd}`;
8766		}
8767		function stripTime(d) {
8768			if (!(d instanceof Date)) return null;
8769			return new Date(d.getFullYear(), d.getMonth(), d.getDate());
8770		}
8771		function clearHolidayHeaderLabels(view) {
8772			const root = headerRoot(view);
8773			const header = root.querySelector('.fc-col-header');
8774			if (!header) return;
8775			header.querySelectorAll('.holiday-label').forEach(n => n.remove());
8776			header.querySelectorAll('.fc-col-header-cell-cushion.holiday-box')
8777					.forEach(el => el.classList.remove('holiday-box'));
8778		}
8779		function addHolidayHeaderLabel(view, dateStr, title) {
8780			const root = headerRoot(view);
8781			const header = root.querySelector('.fc-col-header');
8782			if (!header) return;
8783
8784			const th = header.querySelector(`[data-date="${dateStr}"]`);
8785			if (!th) return;
8786
8787			const inner = th.querySelector('.fc-scrollgrid-sync-inner') || th;
8788
8789			const cushion =
8790				inner.querySelector('.fc-col-header-cell-cushion') ||
8791				th.querySelector('.fc-col-header-cell-cushion') ||
8792				inner; 
8793			if (cushion && !cushion.classList.contains('holiday-box')) {
8794				cushion.classList.add('holiday-box');
8795			}
8796
8797			const exists = Array.from(inner.querySelectorAll('.holiday-label'))
8798				.some(el => el.textContent === (title || ''));
8799			if (!exists) {
8800				const label = document.createElement('span');
8801				label.className = 'holiday-label';
8802				label.textContent = title || '';
8803				inner.appendChild(label);
8804			}
8805		}
8806		function isHolidayEvent(ev) {
8807			const classes = ev.classNames || ev.extendedProps?.classNames || [];
8808			const hasHoliday = Array.isArray(classes) ? classes.includes('holiday-event') : (typeof classes === 'string' && classes.indexOf('holiday-event') > -1);
8809			return hasHoliday && ev.display === 'background';
8810		}
8811		function rebuildHolidayHeaderLabels(calendar) {
8812			const view = calendar.view;
8813			const vt = view?.type;
8814			if (!(vt === 'timeGridWeek' || vt === 'timeGridDay')) {
8815				clearHolidayHeaderLabels(view);
8816				return;
8817			}
8818
8819			const visibleStart = stripTime(view.activeStart);
8820			const visibleEnd   = stripTime(view.activeEnd); 
8821			if (!visibleStart || !visibleEnd) return;
8822
8823			clearHolidayHeaderLabels(view);
8824
8825			const map = {}; 
8826
8827			calendar.getEvents().forEach(ev => {
8828				if (!isHolidayEvent(ev)) return;
8829
8830				const evStart = stripTime(ev.start);
8831				if (!evStart) return; 
8832
8833				let evEnd = stripTime(ev.end);
8834				if (!evEnd) {
8835					evEnd = new Date(evStart);
8836					evEnd.setDate(evEnd.getDate() + 1);
8837				}
8838
8839				const s = new Date(Math.max(evStart.getTime(), visibleStart.getTime()));
8840				const e = new Date(Math.min(evEnd.getTime(), visibleEnd.getTime()));
8841				if (s >= e) return;
8842
8843				for (let d = new Date(s); d < e; d.setDate(d.getDate() + 1)) {
8844				const dateStr = fmtDate(d);
8845				(map[dateStr] ||= new Set()).add(ev.title || '');
8846				}
8847			});
8848
8849			Object.entries(map).forEach(([dateStr, titles]) => {
8850				titles.forEach(title => addHolidayHeaderLabel(view, dateStr, title));
8851			});
8852		}
8853		function setupHolidayHeaderHooks(calendar) {
8854			let t;
8855			const refresh = () => {
8856				clearTimeout(t);
8857				t = setTimeout(() => requestAnimationFrame(() => {
8858				rebuildHolidayHeaderLabels(calendar);
8859				rebuildMonthHolidayBoxes(calendar);
8860				}), 30);
8861			};
8862
8863			calendar.on('datesSet',   refresh);
8864			calendar.on('eventAdd',   refresh);
8865			calendar.on('eventChange',refresh);
8866			calendar.on('eventRemove',refresh);
8867			calendar.on('loading', (isLoading) => { if (!isLoading) refresh(); });
8868
8869			requestAnimationFrame(refresh);
8870		}
8871		//월간 공휴일
8872		function clearMonthHolidayBoxes(view) {
8873		const root = headerRoot(view);
8874		if (!root) return;
8875		root.querySelectorAll('.fc-daygrid-day-top.holiday-box')
8876			.forEach(n => n.classList.remove('holiday-box'));
8877		}
8878
8879		function rebuildMonthHolidayBoxes(calendar) {
8880			const view = calendar.view;
8881			if (!view || !view.type.startsWith('dayGrid')) {
8882				clearMonthHolidayBoxes(view);
8883				return;
8884			}
8885
8886			const locale = calendar.getOption("locale");
8887			if (locale != "ko") {
8888				clearMonthHolidayBoxes(view);
8889				return;
8890			}
8891
8892			const visibleStart = stripTime(view.activeStart);
8893			const visibleEnd   = stripTime(view.activeEnd); 
8894			if (!visibleStart || !visibleEnd) return;
8895
8896			clearMonthHolidayBoxes(view);
8897
8898			const hasHolidayMap = {}; 
8899			calendar.getEvents().forEach(ev => {
8900				if (!isHolidayEvent(ev) || !ev.start) return;
8901
8902				const evStart = stripTime(ev.start);
8903				let evEnd     = stripTime(ev.end);
8904				if (!evEnd) { evEnd = new Date(evStart); evEnd.setDate(evEnd.getDate() + 1); }
8905
8906				const s = new Date(Math.max(evStart.getTime(), visibleStart.getTime()));
8907				const e = new Date(Math.min(evEnd.getTime(),   visibleEnd.getTime()));
8908				if (s >= e) return;
8909
8910				for (let d = new Date(s); d < e; d.setDate(d.getDate() + 1)) {
8911				hasHolidayMap[fmtDate(d)] = true;
8912				}
8913			});
8914
8915			const root = headerRoot(view);
8916			root.querySelectorAll('.fc-daygrid-day').forEach(td => {
8917				const dateStr = td.getAttribute('data-date');
8918				if (!dateStr) return;
8919				const top = td.querySelector('.fc-daygrid-day-top');
8920				if (!top) return;
8921				if (hasHolidayMap[dateStr]) top.classList.add('holiday-box');
8922			});
8923		}
8924
8925		function fmt(dt) {
8926			const y  = dt.getFullYear();
8927			const m  = String(dt.getMonth() + 1).padStart(2, '0');
8928			const d  = String(dt.getDate()).padStart(2, '0');
8929			const hh = String(dt.getHours()).padStart(2, '0');
8930			const mm = String(dt.getMinutes()).padStart(2, '0');
8931			return `${y}-${m}-${d} ${hh}:${mm}`;
8932		}
8933
8934		function toYMDLocal(d) {
8935			if (!d) return '';
8936			const yy = d.getFullYear();
8937			const mm = String(d.getMonth() + 1).padStart(2, '0');
8938			const dd = String(d.getDate()).padStart(2, '0');
8939			return `${yy}-${mm}-${dd}`;
8940		}
8941
8942
8943		function initCalendar(pid, c, retryCount = 0) {
8944			var c = (typeof c != 'undefined') ? c : '';
8945			// console.log(pid);
8946			const MAX_RETRIES = 5;
8947			var containerEl = document.querySelector('.userEL' + pid + ' .calendar-container');
8948			var lang = document.querySelector('.calendar[data-id="' + pid + '"]').classList.contains('en');
8949    
8950			var language = 'ko';
8951			if(lang) language = 'en';
8952			else language = 'ko';
8953
8954			if (!containerEl) {
8955				if (retryCount < MAX_RETRIES) {
8956					setTimeout(() => initCalendar(pid, c, retryCount + 1), 300);
8957				} else {
8958					console.warn('initCalendar: containerEl을 찾을 수 없어 초기화를 중단합니다.');
8959				}
8960				return;
8961			}
8962
8963			containerEl.innerHTML = '';
8964
8965			var calendarEl = document.createElement('div');
8966			calendarEl.id = 'fc-calendar-' + pid;
8967			containerEl.appendChild(calendarEl);
8968
8969			var instance = $.cl_calendar.instances[pid],
8970				maxEvent = parseInt(containerEl.getAttribute('data-view')),
8971				elsettings = '',
8972				view_mode = 'dayGridMonth'; // 기본값
8973
8974			elsettings = JSON.parse(c.elsettings);
8975			if(elsettings.open_mwd == 'month') view_mode = 'dayGridMonth';
8976			else if(elsettings.open_mwd == 'week') view_mode = 'timeGridWeek';
8977			else if(elsettings.open_mwd == 'day') view_mode = 'timeGridDay';
8978
8979			const color = elsettings.google_color ? elsettings.google_color.trim() : '#4789e7';
8980			googleColor.set(pid, color);
8981			// console.log(`pid:${pid} => color:${color}`);
8982
8983			if(view_mode == 'timeGridWeek' && window.innerWidth < 768) {
8984				view_mode = 'dayGridMonth';
8985			}
8986
8987			//구글캘린더 연동
8988			const googleShow = (calendarElsettings.get(pid) === true);
8989			const eventSources = [
8990				function(fetchInfo, success, failure) {
8991					const data_type = ($('.userEL' + pid).attr('data-modoo-type')) || '';
8992					const keys = monthsInRange(fetchInfo.start, fetchInfo.end); // YYYY-MM 배열
8993
8994					// 각 월을 fetchMonth로 보장(캐시가 있으면 내부에서 스킵하게 구현)
8995					Promise.all(
8996						keys.map(k => fetchMonth(pid, k, data_type))
8997					)
8998					.then(() => {
8999						// 캐시에서 해당 범위의 이벤트 전부 모으기
9000						const pidCache = monthCache.get(pid) || new Map();
9001						const all = [];
9002						keys.forEach(k => {
9003							const arr = pidCache.get(k);
9004							if (arr && arr.length) all.push(...arr);
9005						});
9006
9007						const src = all;
9008
9009						const seen = new Set();
9010						const uniq = [];
9011						for (const ev of src) {
9012							const key = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
9013							if (!seen.has(key)) {
9014								seen.add(key);
9015								uniq.push(ev);
9016							}
9017						}
9018
9019						success(uniq);
9020					})
9021					.catch(failure);
9022				}
9023			];
9024
9025			// ✅ 2️⃣ 조건문으로 구글 캘린더/공휴일 캘린더를 추가
9026			const userCalendarId = elsettings.google_id; // 사용자 입력 또는 DB값
9027			const google_color = elsettings.google_color;
9028			const holidayCalendarId = 'ko.south_korea#[email protected]';
9029			const apiKey = elsettings.google_api;
9030			const googleSyncOn = String(elsettings.google_sync || '0') === '1';
9031
9032			function fmtHHMM(date) {
9033				if (!date) return '';
9034				const hh = String(date.getHours()).padStart(2, '0');
9035				const mm = String(date.getMinutes()).padStart(2, '0');
9036				return `${hh}:${mm}`;
9037			}
9038
9039			if (googleSyncOn && userCalendarId && userCalendarId.trim() !== '' && apiKey && googleShow) {
9040				eventSources.push({
9041					// 🔹 gcal 플러그인 대신 직접 Google Calendar API 호출
9042					events: function(fetchInfo, success, failure) {
9043						const params = new URLSearchParams({
9044							key: apiKey,
9045							timeMin: fetchInfo.startStr,
9046							timeMax: fetchInfo.endStr,
9047							singleEvents: 'true',
9048							orderBy: 'startTime'
9049						});
9050
9051						const url = `https://www.googleapis.com/calendar/v3/calendars/${
9052							encodeURIComponent(userCalendarId)
9053						}/events?${params.toString()}`;
9054
9055						fetch(url)
9056							.then(res => {
9057								if (!res.ok) throw new Error('Google Calendar API error: ' + res.status);
9058								return res.json();
9059							})
9060							.then(data => {
9061								const items = data.items || [];
9062								const googleColorHex = google_color || '#4789e7';
9063
9064								const fcEvents = items
9065									.filter(ev => ev.visibility !== 'private')  // 비공개는 아예 제외
9066									.map(ev => {
9067										const isAllDay = !!ev.start.date;
9068										const startStr = ev.start.dateTime || ev.start.date;
9069										const endStr   = (ev.end && (ev.end.dateTime || ev.end.date)) || startStr;
9070
9071										const start = startStr ? new Date(startStr) : null;
9072										const end   = endStr   ? new Date(endStr)   : null;
9073
9074										let start_date = '',
9075											end_date   = '',
9076											s_time     = '',
9077											e_time     = '',
9078											fulltime   = isAllDay ? 'Y' : 'N',
9079											memo       = '';
9080
9081										if (start) {
9082										start_date = fmtDate(start);
9083
9084										if (isAllDay) {
9085											if (end) {
9086											const d = new Date(end);
9087											d.setDate(d.getDate() - 1);
9088											end_date = fmtDate(d);
9089											} else {
9090											end_date = start_date;
9091											}
9092											s_time = '';
9093											e_time = '';
9094										} else {
9095											end_date = end ? fmtDate(end) : start_date;
9096											s_time   = fmtHHMM(start);
9097											e_time   = end ? fmtHHMM(end) : '';
9098										}
9099										}
9100
9101										// 🔹 제목 없는 이벤트 처리
9102										const hasTitle = ev.summary && ev.summary.trim().length > 0;
9103										const title    = hasTitle ? ev.summary.trim() : (language == 'ko') ? '(제목 없음)' : '(No title)';
9104
9105										// description → memo
9106										memo = (ev.description && typeof ev.description === 'string')
9107										? ev.description
9108										: '';
9109
9110										const googleColorHex = google_color || '#4789e7';
9111
9112										return {
9113											id: ev.id,
9114											title,                 // ✅ 여기서 (제목 없음)까지 세팅
9115											start: startStr,
9116											end: endStr,
9117											allDay: isAllDay,
9118											backgroundColor: googleColorHex,
9119											borderColor: googleColorHex,
9120											extendedProps: {
9121												...ev,
9122												isGoogle: true,
9123												start_date,
9124												end_date,
9125												s_time,
9126												e_time,
9127												fulltime,
9128												memo,
9129												backgroundColor: googleColorHex
9130											}
9131										};
9132									});
9133
9134								success(fcEvents);
9135							})
9136							.catch(err => {
9137								console.error('Google Calendar fetch error', err);
9138								failure(err);
9139							});
9140					},
9141
9142					// 아래 옵션들은 그대로 유지해도 됨
9143					color: google_color || '#4789e7',
9144					className: 'personal-events'
9145				});
9146			}
9147
9148			var calendar = new FullCalendar.Calendar(calendarEl, {
9149				initialView: view_mode,
9150				eventSources: eventSources,
9151				locale: language,
9152				locales: [
9153					{
9154						code: 'en',
9155						buttonText: {
9156							today: 'Today',
9157							month: 'Month',
9158							week: 'Week',
9159							day: 'Day',
9160							list: 'List',
9161							// 뷰별로 더 구체화도 가능
9162							dayGridMonth: 'Month',
9163							timeGridWeek: 'Week',
9164							timeGridDay: 'Day',
9165							listWeek: 'List',
9166						}
9167						},
9168						{
9169						code: 'ko',
9170						buttonText: {
9171							today: '오늘',
9172							month: '월',
9173							week: '주',
9174							day: '일',
9175							list: '목록',
9176							dayGridMonth: '월',
9177							timeGridWeek: '주',
9178							timeGridDay: '일',
9179							listWeek: '목록',
9180						}
9181					}
9182				],
9183				selectable: true,
9184				fixedWeekCount: false,
9185				showNonCurrentDates: true,
9186				eventDisplay: 'block',
9187				contentHeight: 'auto',
9188				expandRows: true,
9189				headerToolbar: {
9190					left: 'dayGridMonth,timeGridWeek,timeGridDay',
9191					center: 'prev,title,next',
9192					right: 'today'
9193				},
9194				nowIndicator: true,
9195				windowResize: function(arg) {
9196					const cal = arg.view.calendar;
9197					const isWeek = arg.view.type === 'timeGridWeek';
9198					const w = window.innerWidth;
9199
9200					if (w <= 768 && isWeek) {
9201						cal.changeView('dayGridMonth');
9202					}
9203				},
9204				views: {
9205					dayGridMonth: {
9206						// dayMaxEventRows: maxEvent,
9207                		dayMaxEvents: maxEvent, 
9208						moreLinkDidMount: function(args) { args.el.removeAttribute('title'); },
9209						moreLinkContent: function(args) { 
9210							var locale = args.view.calendar.getOption("locale");
9211							if (locale === "ko") {
9212								return { html: `+${args.num}개<span class="more"> 더보기</span>` };
9213							} else {
9214								return { html: `+${args.num} <span class="more">more</span>` };
9215							}
9216						},
9217						moreLinkClick: function(info) {
9218							var locale = info.view.dateEnv.locale.codes[0];
9219							info.jsEvent.preventDefault();
9220							info.jsEvent.stopPropagation();
9221							const dateObj = info.date;
9222							var weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][dateObj.getDay()];
9223							if(locale == 'ko') weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][dateObj.getDay()];
9224							else weekdayStr = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][dateObj.getDay()];
9225							var weekday = [dateObj, weekdayStr];
9226							const events = info.allSegs.map(seg => seg.event);
9227
9228							openMoreEventsModal(pid, events, weekday);
9229
9230						},
9231					},
9232					timeGridWeek: {
9233						slotEventOverlap: false, 
9234						eventOverlap: false,
9235						eventMaxStack: 10,
9236                		moreLinkContent() { return { html: '' } },
9237						titleFormat: function(arg) {
9238							const start = new Date(arg.date.marker);
9239							const end = new Date(start);
9240							end.setDate(end.getDate() + 6);
9241							end.setHours(23, 59, 59, 999);
9242
9243							const now = new Date();
9244
9245							const baseDate = (now >= start && now <= end) ? now : start;
9246
9247							const locale = (arg.localeCodes && arg.localeCodes[0]) || "en";
9248
9249							if (locale === "ko") {
9250								const y = baseDate.getFullYear();
9251								const m = String(baseDate.getMonth() + 1).padStart(2, "0");
9252								return `${y}년 ${m}월`;
9253							} else {
9254								return new Intl.DateTimeFormat(locale, {
9255								month: "long",
9256								year: "numeric",
9257								}).format(baseDate);
9258							}
9259						},
9260						dayHeaderContent: function(arg) {
9261							var d = arg.date?.marker || arg.date;
9262							var locale = arg.view.dateEnv.locale.codes[0];
9263							if (locale == 'ko') {
9264								const dayNumber = d.getDate();
9265								const weekDayKo = new Intl.DateTimeFormat('ko', { weekday: 'short' }).format(d);
9266								return {
9267									html: `<span class="round">${dayNumber}</span> ${weekDayKo}`,
9268								};
9269							} else {
9270								const dayNumber = d.getDate();
9271								const weekDayEn = new Intl.DateTimeFormat('en', { weekday: 'short' }).format(d);
9272								return {
9273									html: `<span class="round">${dayNumber}</span> ${weekDayEn}`,
9274								};
9275							}
9276						}
9277					},
9278					timeGridDay: {
9279						slotEventOverlap: false, 
9280						eventOverlap: false,
9281						eventMaxStack: 10,
9282                		moreLinkContent() { return { html: '' } },
9283						titleFormat: { year: 'numeric', month: 'long' },
9284						dayHeaderContent: function(arg) {
9285							const dateObj = arg.date; 
9286							const dayNumber = dateObj.getDate(); 
9287
9288							var locale = arg.view.dateEnv.locale.codes[0];
9289							if (locale === "ko") {
9290								const weekNames = ["일", "월", "화", "수", "목", "금", "토"];
9291								const weekDay = weekNames[dateObj.getDay()];
9292								return {
9293									html: `<span class="round">${dayNumber}</span> ${weekDay}`,
9294								};
9295							} else {
9296								const weekDay = new Intl.DateTimeFormat("en", { weekday: "short" }).format(dateObj);
9297								return {
9298									html: `<span class="round">${dayNumber}</span> ${weekDay}`,
9299								};
9300							}
9301						}
9302					},
9303					timeGrid: {
9304                		allDayText: (!lang) ? '하루종일' : 'All day'
9305            		}
9306				},
9307				// events: function(fetchInfo, success, failure) {
9308				// 	const data_type = ($('.userEL' + pid).attr('data-modoo-type')) || '';
9309				// 	const keys = monthsInRange(fetchInfo.start, fetchInfo.end); // YYYY-MM 배열
9310
9311				// 	// 각 월을 fetchMonth로 보장(캐시가 있으면 내부에서 스킵하게 구현)
9312				// 	Promise.all(
9313				// 		keys.map(k =>
9313 fetchMonth(pid, k, data_type))
9314				// 	)
9315				// 	.then(() => {
9316				// 		// 캐시에서 해당 범위의 이벤트 전부 모으기
9317				// 		const pidCache = monthCache.get(pid) || new Map();
9318				// 		const all = [];
9319				// 		keys.forEach(k => {
9320				// 			const arr = pidCache.get(k);
9321				// 			if (arr && arr.length) all.push(...arr);
9322				// 		});
9323
9324				// 		const src = all;
9325
9326				// 		const seen = new Set();
9327				// 		const uniq = [];
9328				// 		for (const ev of src) {
9329				// 			const key = `${ev.id || ev.seq || ev.title}|${ev.start}|${ev.end}|${ev.allDay ? 1 : 0}`;
9330				// 			if (!seen.has(key)) {
9331				// 				seen.add(key);
9332				// 				uniq.push(ev);
9333				// 			}
9334				// 		}
9335
9336				// 		success(uniq);
9337				// 	})
9338				// 	.catch(failure);
9339				// },
9340				eventOrder: ['multiOrder', 'start', 'duration', 'title'],
9341				// eventOrder: 'start',
9342				eventDidMount: function(info) {
9343					// 구글 이벤트만 색 덧칠
9344					if (info.event.extendedProps?.isGoogle) {
9345						const col = (googleColor && googleColor.get(pid)) || '';
9346						if (col) {
9347							info.el.style.backgroundColor = col;
9348							info.el.style.borderColor = col;
9349
9350							// 월간 뷰의 작은 점에도 반영 (dot 모드일 경우)
9351							const dot = info.el.querySelector('.fc-daygrid-event-dot');
9352							if (dot) {
9353								dot.style.backgroundColor = col;
9354								dot.style.borderColor = col;
9355							}
9356						}
9357					}
9358
9359					if (info.event.display === 'background' && info.event.classNames.includes('holiday-event')) {
9360						const viewType = info.view.type;
9361						if (viewType === 'timeGridWeek' || viewType === 'timeGridDay') {
9362							const start = new Date(info.event.start);
9363							const end   = new Date(info.event.end);
9364							for (let d = new Date(start); d < end; d.setDate(d.getDate() + 1)) {
9365								const y = d.getFullYear();
9366								const m = String(d.getMonth() + 1).padStart(2, '0');
9367								const day = String(d.getDate()).padStart(2, '0');
9368								const dateStr = `${y}-${m}-${day}`;
9369								addHolidayHeaderLabel(info.view.el, dateStr, info.event.title || '');
9370							}
9371						}
9372
9373						const cell = info.el.closest('.fc-daygrid-day');
9374						if (cell) {
9375							const harnessCount = cell.querySelectorAll('.fc-daygrid-bg-harness').length;
9376							if (harnessCount > 1) {
9377								const labels = cell.querySelectorAll('.holiday-label');
9378								labels.forEach((label, idx) => { label.classList.add(`multi_${idx + 1}`); });
9379							}
9380						}
9381					}
9382
9383					if (info.event.extendedProps.seq) {
9384						info.el.setAttribute('data-seq', info.event.extendedProps.seq);
9385					}
9386
9387					const durationHours = (info.event.end - info.event.start) / (1000 * 60 * 60);
9388					if (durationHours > 1) {
9389						const afterDiv = document.createElement('div');
9390						afterDiv.classList.add('event-overlay');
9391						afterDiv.style.position = 'absolute';
9392						afterDiv.style.top = '50px'; 
9393						afterDiv.style.left = '0';
9394						afterDiv.style.right = '0';
9395						afterDiv.style.height = `calc(100% - 50px)`;
9396						// afterDiv.style.backgroundColor = '#4789e71a';
9397						afterDiv.style.pointerEvents = 'none';
9398						info.el.appendChild(afterDiv);
9399					}
9400				},
9401				dateClick: function(info) {
9402					// console.log('dateClick');
9403
9404					//현재시간기준 30분단위로 시작시간 설정
9405					const STEP_MIN = 30;
9406
9407					function ceilToNextSlot(base, stepMin) {
9408						const d = new Date(base);
9409						d.setSeconds(0,0);
9410						let m = d.getMinutes();
9411						const r = m % stepMin;
9412						if (r !== 0) m += (stepMin - r);
9413						else m += stepMin;
9414						if (m >= 60) { d.setHours(d.getHours()+1); m -= 60; }
9415						d.setMinutes(m);
9416						return d;
9417					}
9418
9419					const start = new Date(info.date);
9420					let time;
9421
9422					if (info.view.type === 'dayGridMonth') {
9423						const next = ceilToNextSlot(new Date(), STEP_MIN);
9424						const s = new Date(
9425							start.getFullYear(), start.getMonth(), start.getDate(),
9426							next.getHours(), next.getMinutes(), 0, 0
9427						);
9428						const e = new Date(s); e.setHours(e.getHours() + 1);
9429						time = [fmt(s), fmt(e), 0];
9430					} else {
9431						const s = new Date(info.start);
9432						const e = new Date(info.start); e.setMinutes(e.getMinutes() + 30);
9433						const isAllDay = (info.startStr.includes('T')) ? 0 : 1;
9434						time = isAllDay ? [info.startStr, info.startStr, 1] : [fmt(s), fmt(e), 0];
9435					}
9436					if(isMobile() && (property.UMEMBER.check_adm || property.UMEMBER.check_uadm))  showCalendarModalEdit(pid, 0, time);
9437				},
9438				select: function(info) {
9439					// console.log('select');
9440
9441					//현재시간기준 30분단위로 시작시간 설정
9442					const STEP_MIN = 30;
9443
9444					function ceilToNextSlot(base, stepMin) {
9445						const d = new Date(base);
9446						d.setSeconds(0,0);
9447						let m = d.getMinutes();
9448						const r = m % stepMin;
9449						if (r !== 0) m += (stepMin - r);
9450						else m += stepMin;
9451						if (m >= 60) { d.setHours(d.getHours()+1); m -= 60; }
9452						d.setMinutes(m);
9453						return d;
9454					}
9455
9456					const start = new Date(info.start);
9457					let time;
9458
9459					if (info.view.type === 'dayGridMonth') {
9460						const next = ceilToNextSlot(new Date(), STEP_MIN); 
9461						const s = new Date(
9462							start.getFullYear(), start.getMonth(), start.getDate(),
9463							next.getHours(), next.getMinutes(), 0, 0
9464						);
9465						const e = new Date(s); e.setHours(e.getHours() + 1);
9466						time = [fmt(s), fmt(e), 0];
9467					} else {
9468						const s = new Date(info.start);
9469						const e = new Date(info.start); e.setMinutes(e.getMinutes() + 30);
9470						const isAllDay = (info.startStr.includes('T')) ? 0 : 1;
9471						time = isAllDay ? [info.startStr, info.startStr, 1] : [fmt(s), fmt(e), 0];
9472					}
9473					if(!isMobile() && property.UMEMBER.check_adm || property.UMEMBER.check_uadm) showCalendarModalEdit(pid, 0, time);
9474				},
9475				eventClick: function(info) {
9476					info.jsEvent.preventDefault();
9477            		info.jsEvent.stopPropagation();
9478					var locale = info.view.dateEnv.locale.codes[0];
9479					const clickedDateStr = getClickedDateStrAccurate(info);
9480					const clickedDate = new Date(clickedDateStr);
9481					var weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][clickedDate.getDay()];
9482					if(locale == 'ko') weekdayStr = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'][clickedDate.getDay()];
9483					else weekdayStr = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][clickedDate.getDay()];
9484					const weekday = [clickedDate, weekdayStr];
9485
9486					const calendar = info.view.calendar;
9487					const allEvents = calendar.getEvents();
9488
9489					const eventsOnSameDay = allEvents.filter(ev => {
9490
9491						const isGoogle = !!ev.extendedProps?.isGoogle;
9492
9493						if (isGoogle) {
9494							// ---- 구글 이벤트 전용 날짜 계산 (로컬 기준) ----
9495							const s = ev.start ? new Date(ev.start) : null;
9496							let   e = ev.end   ? new Date(ev.end)   : null;
9497
9498							if (!s) return false;
9499
9500							// end 없으면 start와 같은 날로 취급
9501							if (!e) e = new Date(s);
9502
9503							// allDay 인 경우, FullCalendar는 end를 "exclusive"로 쓰므로 마지막 날 = end - 1일
9504							if (ev.allDay && ev.end) {
9505								e.setDate(e.getDate() - 1);
9506							}
9507
9508							const startStr = toYMDLocal(s);   // ✅ 로컬 날짜
9509							const endStr   = toYMDLocal(e);   // ✅ 로컬 날짜
9510
9511							return (clickedDateStr >= startStr && clickedDateStr <= endStr);
9512						}
9513
9514						// ---- 기존(내부) 이벤트 로직 그대로 유지, 날짜 계산만 toYMDLocal로 정리 ----
9515						const startStrBase = (ev.extendedProps.start_date || ev.startStr || '').split('T')[0];
9516
9517						let startStr = startStrBase;
9518						if (!startStr && ev.start) {
9519							startStr = toYMDLocal(ev.start);   // 안전장치
9520						}
9521
9522						let endInclStr;
9523						if (ev.extendedProps.end_date) {
9524							endInclStr = ev.extendedProps.end_date;
9525						} else if (ev.allDay) {
9526							if (ev.end) {
9527								const dayDiff = Math.ceil((ev.end - ev.start) / 86400000);
9528								if (dayDiff >= 2) {
9529									const d = new Date(ev.end);
9530									d.setDate(d.getDate() - 1);
9531									endInclStr = toYMDLocal(d);     // ✅ 여기서도 toISOString 대신 로컬
9532								} else {
9533									endInclStr = startStr;
9534								}
9535							} else {
9536								endInclStr = startStr;
9537							}
9538						} else if (ev.end) {
9539							// timed 이벤트는 endStr도 로컬 기준으로
9540							endInclStr = toYMDLocal(ev.end);
9541						} else {
9542							endInclStr = startStr;
9543						}
9544
9545						return clickedDateStr >= startStr && clickedDateStr <= endInclStr;
9546					});
9547
9548					openMoreEventsModal(pid, eventsOnSameDay, weekday);
9549				},
9550				eventContent: function(arg) {
9551					var locale = arg.view.dateEnv.locale.codes[0];
9552					const noTitleText = (locale === 'ko') ? '(제목 없음)' : '(No title)';
9553
9554					if (arg.event.classNames.includes('holiday-event')) {
9555						if (locale === 'ko') {
9556							const titleText = (arg.event.title && arg.event.title.trim() !== '') ? arg.event.title : noTitleText;
9557							return { html: `<div class="holiday-label">${titleText}</div>` };
9558						} else {
9559							return { html: '' };
9560						}
9561					}
9562
9563					const cal = arg.view.calendar;
9564					let timeText = '';
9565
9566					if (!arg.event.allDay) {
9567						const start = arg.event.start;
9568						const end = arg.event.end;
9569						const fmtOpts = {
9570							hour: 'numeric',
9571							minute: '2-digit',
9572							meridiem: 'short',
9573							hour12: true
9574						};
9575
9576						if (end && end.getTime() !== (start?.getTime() ?? 0)) {
9577							timeText = cal.formatRange(start, end, fmtOpts);
9578						} else if (start) {
9579							timeText = cal.formatDate(start, fmtOpts);
9580						}
9581					}
9582
9583					const rawTitle = (typeof arg.event.title === 'string') ? arg.event.title : '';
9584					const titleText = rawTitle.trim() !== 'undefined' ? rawTitle : noTitleText;
9585
9586					return {
9587						html: `
9588						<div class="fc-event-custom">
9589							<div class="fc-event-title">${titleText}</div>
9590							${timeText ? `<div class="fc-event-time">${timeText}</div>` : ''}
9591						</div>
9592						`
9593					};
9594				},
9595				dayCellContent: function(arg) { return arg.date.getDate(); },
9596				dayCellDidMount: function(arg) {
9597					// const dayEvents = arg.view.calendar.getEvents().filter(event => {
9598					// 	return moment(event.start).format('YYYY-MM-DD') === moment(arg.date).format('YYYY-MM-DD') 
9599					// 		&& event.classNames.includes('holiday-event');
9600					// });
9601
9602					// if (dayEvents.length > 0) {
9603					// 	const eventsContainer = arg.el.querySelector('.fc-daygrid-day-top');
9604					// 	if (eventsContainer) {
9605					// 	eventsContainer.classList.add('holiday-box');
9606					// 	}
9607					// }
9608				},
9609				datesSet: function(arg) {
9610					clearHolidayHeaderLabels(arg.view.el);
9611
9612					if (arg.view.type === 'timeGridWeek' || arg.view.type === 'timeGridDay') {
9613						const events = arg.view.calendar.getEvents().filter(ev =>
9614						ev.display === 'background' && ev.classNames.includes('holiday-event')
9615						);
9616						for (const ev of events) {
9617							const start = new Date(ev.start);
9618							const end   = new Date(ev.end);
9619							for (let d = new Date(start); d < end; d.setDate(d.getDate() + 1)) {
9620								const y = d.getFullYear();
9621								const m = String(d.getMonth() + 1).padStart(2, '0');
9622								const day = String(d.getDate()).padStart(2, '0');
9623								addHolidayHeaderLabel(arg.view.el, `${y}-${m}-${day}`, ev.title || '');
9624							}
9625						}
9626					}
9627				}
9628			});
9629
9630			calendar.on('datesSet', (arg) => { //월 초기 노출 개수
9631				// ▼ 부족 월 프리페치 (prev/next 이동 시 캐시에 없는 달만 보충)
9632				if (!calendar.__prefetching) {
9633					const keys = monthsInRange(arg.start, arg.end); // ['YYYY-MM', ...]
9634					const pidMap = monthCache.get(pid) || new Map();
9635					const missing = keys.filter(k => !pidMap.has(k));
9636
9637					if (missing.length) {
9638						calendar.__prefetching = true;
9639						const dt = ($('.userEL'+pid).attr('data-modoo-type')) || '';
9640						Promise.all(missing.map(k => fetchMonth(pid, k, dt)))
9641						.then(() => arg.view.calendar.refetchEvents())
9642						.finally(() => { calendar.__prefetching = false; });
9643					}
9644				}
9645			});
9646
9647			calendar.render();
9648			setupHolidayHeaderHooks(calendar);
9649			$.cl_calendar.instances[pid].calendar = calendar;
9650
9651			$(`[data-type="calendar"][data-id="${pid}"]`).addClass('_calendar');
9652		}//calendar end
9653
9654		// $('.gallery-item').live('click', function(e) {
9655		// 	if($(this).find('[attr-flink]').length > 0 ) {
9656		// 		e.preventDefault();
9657		// 		return false;
9658		// 	}
9659
9660		// 	if($(e.target).hasClass('like') || $(e.target).closest('.figure').hasClass('like')) {
9661		//         e.preventDefault(); 
9662		//         return false;
9663		//     }
9664			
9665		// 	var $el = $(this).parents('.element');
9666		// 	var pid = $el.attr('data-id');
9667		//     $('.blueimp-gallery').addClass('blueimp-gallery-controls');
9668		//     $('.blueimp-gallery a.zoom-in').remove();
9669		// 	$('.blueimp-gallery a.gallery-like').addClass('hide').removeClass('active').removeAttr('data-like');
9670
9671		// 	var gid = $(this).find('a').attr('data-gallery');
9672		//     var totalSlide = $(gid).find('.slide').length;
9673		//     $('.blueimp-gallery .slide-index .total-slide').text(totalSlide);
9674
9675		//     if($(this).find('a').attr('data-img-original') == 'ON') {
9676		// 	    $('.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>');
9677		// 	}
9678			
9679		// 	$(gid).off('slide').off('slideend');
9680		// 	$(gid).on('slide', function (event, index, slide) {
9681		// 		if($(this).find('a').attr('data-gallery-like') != 'N') $('.blueimp-gallery a.gallery-like').removeAttr('data-like').addClass('hide');
9682	    //     }).on('slideend', function(event, index, slide){
9683        // 		$('.blueimp-gallery .slide-index .current-slide').text(index+1);
9684	    //     	if($(this).find('a').attr('data-gallery-like') != 'N') {
9685	    //     		var itemSeq = $el.find('.gallery-item').eq(index).attr('data-seq');
9686		//             if(itemSeq == undefined) {
9687		//                 itemSeq = $('.galleryPL'+pid+'.gallery-popup .gallery-item[data-index='+index+']').attr('data-seq');
9688		//             }
9689		// 			var l_position = setTimeout(function(){
9690		//                 if(!$(slide).hasClass('slide-loading')) {
9691		//                     galleryLikePosition(gid, slide, itemSeq);
9692		//                     clearTimeout(l_position);
9693		//                 }
9694		//             }, 600);
9695	    //     	}
9696	    //     });
9697		// 	$('.blueimp-gallery').find('h3.title').html($(this).find('a').attr('data-title'));
9698
9699		//    	$.cookie('gallery-item', $(this).attr('data-seq'), { path : '/', expires: 12 * 60 * 60 * 1000 });
9700		//    	if(b.PARENT.prev != null) $('.data-page-prev').addClass('active');
9701		//    	if(b.PARENT.next != null) $('.data-page-next').addClass('active');
9702		// 	e.stopPropagation();
9703		// });
9704
9705		// $('body').on('click','.blueimp-gallery a.zoom-in', function(e) {
9706		//     var idx = 0,
9707		//         eid = $(this).attr('data-id');
9708		//     $('#gframe-' + eid + ' .slide').each(function(i,v) {
9709		//         var trans = $(v).attr('style');
9710		//         if(trans.indexOf('translate(0px, 0px)') > -1 || trans.indexOf('transform: translate(0px) translateZ(0px)') > -1) {
9711		//             idx=i;
9712		//         }
9713		//     });
9714		//     // var src = $('#gframe-' + eid + ' .slide[data-index="' + idx + '"] > img').attr('src');
9715
9716		//     // $('.blueimp-gallery a.zoom-in').attr('href',src).attr('target','_blank');
9717		//     e.stopPropagation();
9718		// });
9719``
9720		$('.element[data-type="contact"] .google-map .gm-fullscreen-control').live('click', function(e) {
9721			$(this).toggleClass('gm-open');
9722
9723			if(!$(this).hasClass('gm-open')) {
9724				var el = $(this).closest('.element').attr('data-el');
9725				scrollToBlock('.'+el,300);
9726			}
9727		});
9728
9729		$('#mobile-nav .siteLANG.cl-fixbtn.cl-visible .cl-lang').live({
9730			click: function(e) {
9731				if($('#mobile-nav .siteLANG.cl-fixbtn.cl-visible .dropdown-menu-wrap').hasClass('open')) {
9732					$('#mobile-nav #tpl-menu').css({
9733						'position':'relative',
9734						'z-index':'-1'
9735					});
9736				} else {
9737					$('#mobile-nav #tpl-menu').css({
9738						'position':'',
9739						'z-index':''
9740					});
9741				}
9742			}
9743		});
9744
9745		$('#mobile-nav .dropdown-menu-wrap.open').live({
9746			click: function(e) {
9747				$('#mobile-nav .menu-has-children .dropdown-menu a').css('pointer-events','');
9748				$('#mobile-nav .menu-has-children i.fa-chevron-down').css('z-index','')
9749			}
9750		});
9751	
9752
9753		/* page count */
9754		if(Object.keys(b.CONTENTS).length) {
9755			var ps_elupdate = this.contentUpdate(b.CONTENTS);
9756			var vpmode = (typeof $('.mobilepc_ch').attr('data-desktop-option') != 'undefined') ? $('.mobilepc_ch').attr('data-desktop-option') : b.SETTINGS.viewportMode;
9757
9758			ps_elupdate.done(function(r_data) {
9759				elFooter();
9760                if(typeof r_data != 'undefined' && typeof r_data.showOnlyFooter != 'undefined' && r_data.showOnlyFooter) {
9761                	return false;
9762                }
9763				if(b.COUNT) {
9764					if(b.PARENT.mode == 'shopping') {
9765						if(typeof property.PRODINFO === 'object') $.products.display_info();
9766						if($('#review-onoff').val() == 'true') $.products.review(b.VIEW,b.PAGE);
9767						if($('#qna-onoff').val() == 'true') $.products.qna(b.VIEW,b.PAGE);
9768					} else {
9769						if(b.VIEW) _this.displayComment();
9770					}
9771				}
9772			}).then(function() {
9773				if(b.VIEW && b.PARENT.mode != 'shopping') {
9774					// initViewPageToolbar().then(function(pageToolbar){
9775	                //     setViewPageToolbar();
9776	                // });
9777					initViewPageBottom();
9778				}
9779	    	}).then(function() {
9780                if(typeof b.SETTINGS.hideScrollTop != 'undefined' && b.SETTINGS.hideScrollTop == true)  $('#goto-top').addClass('hide');
9781				if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
9782					var ismodeSm = ($('.cl-s-page').hasClass('mode-shopping')) ? true : false;
9783					if(!ismodeSm && b.ONE && !b.VIEW || b.PAGE == b.MENULINK[0] && !b.VIEW)	setSitePopup();
9784					$.siteBanner.init(true,true);
9785
9786					if(b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM') {
9787						if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
9788							$.fnav.draw(b.SETTINGS.fnav);
9789						}
9790					
9791						if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {	
9792							var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
9793						
9794							if(!(b.PARENT.page != null && (quick_type=='mobile'))) {
9795								if($('.menu-lock-block').length>0) return false;
9796								if(!(ismodeSm && (quick_type=='mobile'))) {
9797									$.quickmenu.init(b.SID, b.PUBLISH,quick_type);
9798									mobileWebQuickmenuPosition(b,quick_type);
9799								}
9800								
9801							}			
9802						}
9803
9804					}
9805				}
9806
9807				if(typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
9808					mobileWebfnavCheck(vpmode);
9809				}
9810
9811				if($('#page-loading-css').length > 0) {
9812					if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
9813					$('#page-loading-css').remove(); 
9814				}
9815	    	});
9816		} 
9817		else {
9818			var checkUrl = b.PAGE.split(","),
9819				vpmode = '';
9820				vpmode = $.mpcWeb.mpcGetVpmode(vpmode,b.SETTINGS);
9821
9822			isMenuLock(function() {
9823				if(b.SETTINGS.noError404 === true && !(b.MENULIST.indexOf(b.PAGE) > -1) && !b.ONE && !b.VIEW) { // refresh
9824					window.location.href = '/';
9825					return false;
9826				}
9827				
9828				if($('#page-loading-css').length > 0) {
9829					if($('header.navbar').hasClass('navbar-fheader')) $.fheader.position();
9830					$('#page-loading-css').remove(); 
9831				}
9832
9833				if(property.ISLOCK == 'false') {
9834					if(property.COUNT==0) {
9835						elFooter();
9836						if(checkUrl[0] == "forum" && b.VIEW) {				
9837							if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
9838								$.mpcWeb.mpcWebhtml(vpmode,b.CONTENTS,b.SETTINGS.zoom);
9839							}
9840							var ps_fmview = $.forum.view(b.VIEW);
9841							ps_fmview.done(function(data) {
9842								if($(`.page-comments[data-id="${b.VIEW}"]`).length == 0) _this.displayComment(data);
9843
9844								setTimeout(function() {
9845									if(b.VIEW) setViewPageToolbar();
9846									if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
9847										if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) $.fnav.draw(b.SETTINGS.fnav);
9848									}
9849									if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
9850										$.mpcWeb.mpcWebhtml(vpmode,'',b.SETTINGS.zoom);
9851										mobileWebfnavCheck(vpmode);
9852									}
9853								}, 100);
9854
9855							}).fail(function(error_msg) {
9856								// console.log(error_msg);
9857							});
9858						}
9859
9860						if(property.PAGE == 'psearch') {
9861							vpmode = $.mpcWeb.mpcGetVpmode(vpmode,property.SETTINGS);
9862
9863							if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) $.mpcWeb.mpcWebhtml(vpmode,property.CONTENTS,property.SETTINGS.zoom);
9864
9865							setTimeout(function() {
9866								if(property.VALIDPLAN && (property.VALIDTYPE == 'BN' || property.VALIDTYPE == 'SM')) {
9867									if(typeof property.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(property.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) $.fnav.draw(property.SETTINGS.fnav);
9868								}
9869								if(typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) {
9870									mobileWebfnavCheck(vpmode);
9871								}
9872							}, 500);
9873						}
9874
9875						var ismodeSm = ($('.cl-s-page').hasClass('mode-shopping')) ? true : false;
9876						if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
9877							if(!ismodeSm && b.ONE && !b.VIEW || b.PAGE == b.MENULINK[0] && !b.VIEW) setSitePopup(); 
9878							$.siteBanner.init(true,true);
9879						}
9880						if(b.VALIDPLAN && (b.VALIDTYPE == 'BN' || b.VALIDTYPE == 'SM')) {
9881							if(typeof b.SETTINGS.fnav != 'undefined' && !$.isEmptyObject(b.SETTINGS.fnav) && (typeof b.SETTINGS.qm_onoff == 'undefined')) {
9882								$.fnav.draw(b.SETTINGS.fnav);
9883							}
9884
9885							if(typeof b.SETTINGS.qm_onoff != 'undefined' && b.SETTINGS.qm_onoff==true) {
9886								var quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
9887								if(!(b.PARENT.page != null && (quick_type=='mobile'))) $.quickmenu.init(b.SID, b.PUBLISH,quick_type);
9888							}
9889						}
9890
9891						if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
9892							$.mpcWeb.mpcWebhtml(vpmode,'',b.SETTINGS.zoom);
9893							mobileWebfnavCheck(vpmode);
9894						}
9895
9896					}
9897				} else {
9898					elFooter();
9899				}
9900			});
9901		}
9902
9903		window._musicUserInteracted = false;
9904		$(document).one('click scroll touchstart keydown', function() {
9905			window._musicUserInteracted = true;
9906		});
9907
9908	    $(window).load(function() {
9909
9910	    	$('#no-fouc').css('opacity','1');
9911	        if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
9912	        	moveGallery($.cookie('gallery-item'));
9913	        }
9914	        
9915	        if(typeof $.cookie('forum_content_view') == 'undefined'){
9916		        moveScroll(0);
9917		    }
9918		    _this.loaded();
9919
9920            if(b.VALIDPLAN && b.VALIDTYPE != 'PK') {
9921			    var musicPlay = true;
9922			    if(typeof b.SETTINGS.musicStop != 'undefined' && (b.SETTINGS.musicStop === true || b.SETTINGS.musicStop == 'true'))
9923			    	musicPlay = false;
9924
9925			    if(typeof b.SETTINGS.musicUse != 'undefined' && (b.SETTINGS.musicUse === true || b.SETTINGS.musicUse == 'true')){
9926 					if( (typeof b.SITELOCK != 'undefined' && b.SITELOCK == 'true' ) || b.certOpenChk == true) {
9927						musicPlay = false;
9928					} else {
9929						$.musicON(musicPlay);
9930					}				
9931				}
9932
9933				// JH 주석1 : 위 내용 주석 후 아래 주석 풀기
9934				// if(typeof b.SETTINGS.musicUse != 'undefined' && (b.SETTINGS.musicUse === true || b.SETTINGS.musicUse == 'true'))
9935				// $.musicON(musicPlay);
9936					
9937				if(musicPlay == false) $.musicPause();
9938			}
9939
9940			var used_disk_value = b.USED_DISK / 1024,
9941				used_disk = Math.ceil(used_disk_value); // byte으로 가져와서 megsabyte으로 변한다
9942
9943			if(Number(b.DISK_SPACE) != -1 && (used_disk > b.DISK_SPACE) && (b.MB_LEVEL != 10)) setlimitdiskPopup();
9944
9945			// menu sidebar - height overflow
9946			if($('body').width() > 768) {
9947				$('header.navbar-li:not([data-fixtype]) #fixed-menu > li.dropdown').live({
9948					mouseenter: function(e) {
9949						var this_bottom = $(this).find('.cl-icon').position().top + $(this).find('.cl-icon').height();
9950						$(this).find('.dropdown-menu').css({
9951							'top': this_bottom+'px',
9952						});
9953					},
9954					mouseleave: function(e) {
9955						$(this).find('.dropdown-menu').removeAttr('style');
9956					}
9957				});
9958
9959				$('header.navbar-li[data-fixtype] #fixed-menu > li.dropdown').live({
9960					mouseenter: function(e) {
9961						var dropdown_cover = '<div class="dropdown_cover"></div>',
9962							this_bottom = 0,
9963			                is_fhAlign = (typeof $('.el-menu header.navbar[data-fixtype]').find('.container').attr('data-fh-align') != 'undefined') ? true : false,                         
9964			                checkSidebar = ($('.el-menu header.navbar').hasClass('sidebar')) ? true : false,
9965			                $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') : '',
9966			                visible_aHght = ($(this).find(' > a:visible').length>0) ? $(this).parents('.cl-fixed-menu').find('li.cl-fixbtn').height() : 10;
9967			                	
9968						var height_arr = [],
9969			        		height_max = '';
9970
9971		        		$cl_fixbtn.find('> a:visible').each(function(){
9972		        			var fixbtn_height = ($(this).find('.cl-icon').length>0) ? $(this).find('.cl-icon').height() : $(this).height(),
9973		        				fixbtn_fsize = Number($(this).css('font-size').replace(/px/gi,''));
9974
9975								// console.log($(this).height());
9976								// console.log($(this).parents('li.cl-fixbtn').height());
9977	        				if($(this).height() != $(this).parents('li.cl-fixbtn').height()) {
9978	        					fixbtn_height = ($(this).find('.cl-icon').height() > $(this).height()) ? $(this).find('.cl-icon').height() : 
9979		        				(($(this).find('.cl-icon').height() + fixbtn_fsize < $(this).height()) ? fixbtn_fsize : $(this).outerHeight());
9980	        				} 
9981		        		
9982        					height_arr.push(fixbtn_height);
9983		        		});
9984
9985		        		height_max = Math.max(...height_arr);
9986				
9987						var li_Hght = 0;
9988						$(this).parents('.cl-fixed-menu').find('li.cl-fixbtn').each(function(i,v){
9989							var li_display = $(this).css('display');
9990							if(li_display!='none') {
9991								li_Hght = Number($(this).height());
9992								return false;
9993							}
9994						});
9995
9996		        		var li_Hght_half = Number((li_Hght/2).toFixed(0)),
9997		        			height_max_half = Number((height_max/2).toFixed(0)),
9998		        			ul_height_max_cal = li_Hght_half - height_max_half;
9999		        		
10000		        		ul_height_max_cal = (ul_height_max_cal <= 0 && ul_height_max_cal>-3) ? 0 : ul_height_max_cal;
10001	        			this_bottom = ul_height_max_cal + Number(height_max.toFixed(0)) + 5;
10002
10003		             	//if(!is_fhAlign && !checkSidebar && $(this).hasClass('siteLANG')) { this_bottom -= ul_height_max_cal;}
10004
10005						if(checkSidebar) {
10006							var fixtype = $('.el-menu header.navbar').attr('data-fixtype'),
10007								fixtype_check_arr = ['01','02','03','08'];
10008							this_bottom = ($.inArray(fixtype,fixtype_check_arr)>-1) ? this_bottom : visible_aHght;
10009						} 
10010						
10011						if(!checkSidebar) {
10012			                $(this).find('.dropdown-menu').before(dropdown_cover);
10013			            }
10014					
10015			            $(this).find('.dropdown-menu').css({
10016							'top': this_bottom+'px'
10017						});
10018
10019
10020					},
10021					mouseleave: function(e) {
10022						$(this).find('.dropdown-menu').removeAttr('style');
10023            			$(this).find('.dropdown_cover').remove();
10024					}
10025				});
10026
10027				$('.sidebar .nav li.dropdown').live({
10028					mouseenter: function(e) {
10029						var checkSubMenuPosition = $(this).find('.dropdown-menu').css('position');
10030						if(checkSubMenuPosition == 'absolute') {
10031							var this_top = $(this).offset().top - $(document).scrollTop();
10032							if($(this).closest('header').parent('#element-display').length > 0) this_top -= $(this).closest('header').parent('#element-display').offset().top;
10033							
10034							$(this).find('.dropdown-menu').css({
10035								'position': 'fixed',
10036								'top': this_top+'px',
10037								'left': '260px'
10038							});
10039						}
10040					},
10041					mouseleave: function(e) {
10042						$(this).find('.dropdown-menu').removeAttr('style');
10043					}
10044				});
10045			} else {
10046				$('header.navbar-li #fixed-menu > li.dropdown').find('.dropdown-menu').removeAttr('style');
10047				$('header.sidebar #tpl-menu > li.dropdown').find('.dropdown-menu').removeAttr('style');
10048			}
10049
10050
10051			if(typeof $.cookie('ci_goto-gallery') != 'undefined' && $.cookie('ci_goto-gallery')) {
10052				var goto_gallery = '.element[data-id="' + $.cookie('ci_goto-gallery') + '"]',
10053					cookie_domain =  (property.HOST.indexOf(':') > -1) ? property.HOST.substring(0,property.HOST.indexOf(':')) : property.HOST;
10054				if($(goto_gallery).length > 0) {
10055					scrollToBlock(goto_gallery, 1000);
10056				}
10057				$.cookie('ci_goto-gallery', '', { domain: '.' + cookie_domain,expires: -1 });
10058				$.cookie('ci_goto-gallery-cate', '', { domain: '.' + cookie_domain,expires: -1 });
10059			}
10060
10061			if(typeof fbq == 'function' && b.VALIDTYPE == 'SM') {
10062				if(b.VIEW) {
10063					var checkProduct = (b.PAGE.match(/^forum,/g) === null && typeof b.PARENT != 'undefined' && typeof b.PARENT.mode != 'undefined' && b.PARENT.mode == 'shopping') ? true : false,
10064						mn = (b.ONE) ? b.PARENT.opage : b.PARENT.ppage;
10065					if(checkProduct && typeof callbackEvtViewContent == 'function') callbackEvtViewContent(mn,b.PARENT.seq,b.PARENT.title,$('.total-price').text().replace(/[^0-9]/g,''));
10066				} else {
10067					var checkProductList = ($('.element[data-type="gallery"][data-mode="shopping"]').length > 0) ? true : false;
10068					if(checkProductList && typeof callbackEvtLead == 'function') callbackEvtLead(b.PAGE);
10069				}
10070			}
10071
10072	    });
10073    },
10074    contentUpdate : function(contents) {
10075    	// console.log(' page draw 01:: contentUpdate');
10076	    var deferred = $.Deferred();
10077    	var b = this.b,
10078    		_this = this,
10079    		idx = 0;
10080    	
10081    	var checkSiteLock = isSitePasswordLock();
10082		checkSiteLock.then(function() {
10083			isMenuLock(function() {
10084				var default_t_css = '', default_m_css  = '';
10085				var checkGalleryView = (b.VIEW && b.PAGE.match(/^forum,/g) === null) ? true : false;
10086				var page_pos = 0;
10087				var site_settings = (typeof b.SETTINGS != 'undefined' && b.SETTINGS) ? b.SETTINGS : {};
10088				var vpmode = '';
10089                var is_templates = checkTemplateSite(b.SID);
10090				vpmode = $.mpcWeb.mpcGetVpmode(vpmode,b.SETTINGS);
10091				if(b.VALIDPLAN && b.VALIDTYPE != 'PK' && typeof b.SETTINGS.viewportMode != 'undefined' && b.SETTINGS.vpMode_onoff===true) {
10092					$.mpcWeb.mpcWebhtml(vpmode,b.CONTENTS,b.SETTINGS.zoom);
10093				}
10094
10095				if(checkGalleryView) setViewPageStyle();
10096
10097				var check_modoo = $('.dsgn-body').hasClass('modoo') ? true : false,
10098					fl_data = {};
10099					
10100				if(check_modoo || property?.SETTINGS?.modoo?.floating ) { 
10101					fl_data = draw_floating();
10102				}
10103
10104				$.each(contents, function(i,v) {
10105		    		page_pos += 1;
10106					// console.log(`i: ${i}, v: `);console.log(v);
10107		    		var c = v.element;
10108		    		var $el = $('.' + c.elname);
10109					var settings = (c.elsettings == '' || typeof c.elsettings == 'undefined') ? {} : $.parseJSON(c.elsettings);
10110					var block_lang = (typeof settings.blocklang != 'undefined') ? settings.blocklang : LANG;
10111		    		var msny = (c.feature=='masonry') ? true : false;
10112
10113					if(c.type == 'video') {
10114						c.mode = ($el.find('.video-gallery-url').length > 0) ? 'zoom' : 'thumb';
10115					}
10116
10117		            //처음 접속 시
10118		            $el.addClass('el_' + idx)
10119		            	.addClass('element')
10120		                .attr('data-id', c.seq)
10121		                .attr('data-el','el_' + idx)
10122		                .attr('data-pos', c.pos)
10123		                .attr('data-name', c.elname)
10124		                .attr('data-case', settings?.blockorg || c.name)
10125		                .attr('data-msny', msny)
10126		                .attr('data-type', c.type)
10127		                .attr('data-type2', c.type2)
10128						.attr('data-feature', c.feature)
10129		                .attr('data-mode', c.mode)
10130		                .attr('data-width', c.folder)
10131		                .attr('data-overlap',c.overlap);
10132					if(c.type == 'form' && typeof c.form_done != 'undefined') $el.attr('data-form-done', c.form_done);
10133
10134					setBlockAOS($el,{block:settings, skipRefresh:true});
10135
10136					if($el.hasClass('modoo')) {
10137						if(window.innerWidth <= 768 && $el.find('._spotHomesite').hasClass('is_bottom')) {
10138							$el.find('._spotHomesite').removeClass('is_bottom');
10139						}
10140
10141						if($el.find('._sectionSpot').hasClass('type_full') && window.innerWidth > 768) {
10142							var A = $el.find('._areaLogin').length ? true : false,
10143								C = window.innerHeight;
10144		
10145							if (A) {
10146								C -= 50;
10147							}
10148							
10149							$el.find("._sectionSpot .swiper-wrapper").css("height", C);
10150							$el.find("._sectionSpot .swiper-slide").css("height", C);
10151							$el.find("._sectionSpot ._imgCover").css("height", C).each(function(F, G) {
10152								var D = $(G);
10153								var E = D.attr("data-lazy-background-img-src");
10154								D.css({
10155									backgroundImage: "url(" + E + ")",
10156									filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + E + '}", sizingMethod="scale")'
10157								});
10158							});
10159							if (!$el.find("._spotHomesite").hasClass("is_bottom")) {
10160								$el.find("._spotHomesite").css("height", C);
10161							}
10162						}
10163						if($el.find('.page-container-mobile').length > 0) {
10164							if(window.innerWidth <= 768) $el.find('[data-role="page-container"]._content').hide();
10165							else $el.find('[data-role="page-container"]._content').show();
10166						}
10167
10168						if($el.parents('body').is('.clnav-overlap-OFF') && $el.is('[data-el="el_0"]')) {
10169							$el.find('._spotHomesite .site_info').append(fl_data.el_html);
10170						}
10171					}
10172
10173					if(c.type == 'contact') {
10174						setContactSubmitSecurity($el, c.seq, settings, block_lang);
10175					}
10176
10177
10178					var checkPageblock = (c.seq === 'all_products' || (c.orgpos == 1 && c.orgpage)) ? true : false;
10179					if(b.ONE && checkPageblock) {
10180						$el.attr('data-pagename', JSON.parse('"' + c.orgpage + '"'));
10181						$el.addClass('link-to-'+JSON.parse('"'+c.orgpage.replace(/ /g,'-')+'"'));
10182					}
10183
10184					var checkNotSupported = (!is_templates) ? $.notSupported.check(v.element.type,v.element.type2,v.element.feature) : false;
10185					if(checkNotSupported) {
10186						$(`.${v.element.elname}`).html('').attr('class',`hide element ${v.element.elname} el_${idx}`);
10187						$(`#el_${idx}css, #js_${idx}`).remove();
10188						idx++;
10189						return;
10190					}
10191
10192					$el.find('video').attr({'playsinline': '','webkit-playsinline': ''});
10193					if(c.type == 'video' || c.type == 'others') {
10194						var checkFullscreen = (typeof settings.fullscreen != 'undefined' && settings.fullscreen == 'ON') ? true : false;
10195						if(checkFullscreen) $el.find('.video-wrap').addClass('video-fullscreen');
10196					}
10197
10198		            if($el.length > 1 && c.type == 'showcase') {
10199			            $($el).each(function(i, v) {
10200			           		if(i>0) v.dataset['el'] = '';
10201			            });
10202		            }
10203
10204	              	var blocklang = '';
10205					if(typeof settings.blocklang != 'undefined') {
10206		                blocklang = settings.blocklang;
10207		                $el.attr('data-blocklang',blocklang);
10208		            }
10209
10210					if (c.type == 'sync') {
10211						showHideSyncField($el, settings);
10212	
10213						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;
10214						if($el.find('.slick-page-label').length > 0) {
10215							var page_label = sync_list_total;
10216							if(c.type2 == 'imgpitem' && sync_list_total == 0) page_label = $el.find('.slick .item').length;
10217
10218							$el.find('.slick-page-label .slick-page-now').text(1);
10219							$el.find('.slick-page-label .slick-page-total').text(page_label);
10220						}
10221
10222						if($el.find('.sync-option').length > 0) {
10223							var sync_css = CSSJSON.toJSON(htmlspecialchars_decode(c.elcss)),
10224								sync_s = style.get(sync_css,c.elname);
10225							if(typeof sync_s.__display_count != 'undefined') {
10226								var display_cnt = Number(sync_s.__display_count) || 10;
10227								$el.find(`.sync-item:gt(${display_cnt-1}
10227)`).addClass('hide');
10228
10229								if($el.find('.sync-page-label').length > 0) {
10230									var sync_p_cnt = $el.find('.sync-row .sync-item').length,
10231										sync_p_total = Math.ceil(sync_p_cnt / display_cnt);
10232									$el.find('.sync-page .sync-page-now').text(1);
10233									$el.find('.sync-page .sync-page-total').text(sync_p_total);
10234									
10235									if(sync_p_total == 1) $el.find('.sync-page-wrap').hide();
10236									else $el.find('.sync-page-wrap').show();
10237								}
10238							}
10239						}
10240
10241						var sync_loadmore_lang = block_lang;
10242						if(typeof settings.loadmore_lang != 'undefined' && settings.loadmore_lang && $.inArray(settings.loadmore_lang.toLowerCase(), ['ko','en']) > -1) sync_loadmore_lang = settings.loadmore_lang.toLowerCase();
10243						$el.find('.sync-page-more-str').text($.lang[sync_loadmore_lang]['config.loadmore']);
10244					}
10245
10246					if(checkGalleryView) {
10247						if(c.page == 'fixedblock_'+b.PARENT.pid) $el.addClass('el-fixedblock');
10248						else $el.removeClass('el-fixedblock');
10249
10250						$el.attr('data-pos', page_pos);
10251						// if(b.LUX && (c.orgpos == '1' || $el.is('.lux-product-block'))) $el.attr('data-ppos', (c.pos*1) + 1);
10252						// else $el.attr('data-ppos', c.pos);
10253						$el.attr('data-ppos', c.pos);
10254						$el.attr('data-posby', c.elnew);
10255					}
10256
10257					if(c.type == 'contact' && c.page == 'fixedcontact') {
10258						$.fixedContact.init($el);
10259		            }
10260
10261		            // b.ISLOCK = (!b.VALIDPLAN) ? 'false' : b.ISLOCK;
10262		            if(b.ISLOCK == 'false') $el.removeClass('hide');
10263		            else $el.addClass('locked');
10264
10265		            if(c.type == 'forum' || c.type == 'latest' || c.type == 'sync') $el.addClass('preloading');
10266
10267					var elFonts = $el.css('font-family');
10268					elFonts = elFonts + ",'Nanum Gothic'";
10269					var reFonts = elFonts.replace(/"/g, "\'");
10270					$el.css('font-family',reFonts);
10271
10272		            //add style
10273		            var jcss = CSSJSON.toJSON(c.elcss);
10274
10275					var element_mh = jcss?.children[`.${c.elname}`]?.attributes['min-height'] ?? '';
10276					if (element_mh && /%$/.test(element_mh)) {
10277						const converted_mh = element_mh.replace('%', '');
10278						$el.css('min-height',`${converted_mh}vh`);
10279					}
10280
10281		            var elpd = style.getPadding(jcss,c.elname);
10282		            var pt = parseInt(elpd.top);
10283		            var pb = parseInt(elpd.bottom);
10284		                
10285		            if(pt>0||pb>0){
10286		                default_t_css = default_t_css + '\n 	.'+c.elname + '{';
10287		                if(Math.ceil(pt*0.8)>0)
10288		                default_t_css = default_t_css + 'padding-top: '+Math.ceil(pt*0.8) + 'px!important;';
10289		                if(Math.ceil(pb*0.8)>0)
10290		                default_t_css = default_t_css + 'padding-bottom: '+Math.ceil(pb*0.8) + 'px!important;';
10291		                default_t_css = default_t_css + '}';
10292
10293		                default_m_css = default_m_css + '\n 	.'+c.elname + '{';
10294		                if(Math.ceil(pt*0.5)>0)
10295		                default_m_css = default_m_css + 'padding-top: '+Math.ceil(pt*0.5) + 'px!important;';
10296		                if(Math.ceil(pb*0.5)>0)
10297		                default_m_css = default_m_css + 'padding-bottom: '+Math.ceil(pb*0.5) + 'px!important;';
10298		                default_m_css = default_m_css + '}';
10299		            }
10300		            
10301		            if(idx == Object.keys(b.CONTENTS).length-1){
10302		                var css = '@media only screen and (max-width:767px) {' + default_t_css + '\n}\n';
10303		               	css = css + '@media only screen and (max-width:480px) {' + default_m_css + '\n}';
10304
10305		                if($('#el-paddingcss').length == 0) $('.dsgn-body').find('#el_'+(Object.keys(b.CONTENTS).length-1)+'css').after('<style id="el-paddingcss">'+css+'</style>');
10306		                else $('#el-paddingcss').append(css);
10307		            }
10308
10309		            var settings = (c.elsettings == '' || typeof c.elsettings == 'undefined') ? {} : $.parseJSON(c.elsettings);
10310
10311					if(typeof settings.bookmark != 'undefined' && settings.bookmark) {
10312						$el.attr('data-bookmark',c.seq);
10313					}
10314					
10315					if(b.VIEW && (c.type == 'project' || c.type == 'product')) {
10316						$el.find('.data-page-prev').addClass('active');
10317						$el.find('.data-page-next').addClass('active');
10318
10319	                    if(b.PARENT.prev == null) $el.find('.data-page-prev').removeClass('active');
10320	                    if(b.PARENT.next == null) $el.find('.data-page-next').removeClass('active');
10321
10322	                    //상세페이지 배경 style 추가
10323	                    // if(c.type == 'project') setGalleryProjectCss(b.PARENT,b.PARENT['elcss']);	                	
10324	                }
10325
10326	                if(b.VIEW) {
10327		            	var img_onoff = (typeof settings.img_original_display != 'undefined' && settings.img_original_display) ? settings.img_original_display : 'OFF';
10328		            	$el.find('img[data-attach="true"]').attr('data-img-original',img_onoff);
10329	                }
10330
10331					//video block ::: gallery
10332			        if(c.type == 'video') {
10333			            if($el.find('.video-gallery-url').length > 0) { //재생방식 : 확대보기 
10334			                $.each($el.find('.item'),function(i,v){
10335			                    if(c.mode=='zoom') appendGalleryFrame($(this).parents('.element'),c.seq,c.type);
10336			                });
10337
10338		                    // let lsw = document.querySelector('.element[data-id="' + c.seq + '"] .swiper');
10339		                    // if(lsw && lsw.swiper) {
10340		                    //     let slider_motion = $('.element[data-id="' + c.seq + '"]').attr('data-sli
10340der-motion');
10341
10342		                    // 	$('#gframe-' + c.seq).on('opened', function(event){
10343					        //     	console.log('gallery opend', $(this).data('gallery'), typeof $(this).data('gallery').index);
10344		                    //         if(slider_motion != 'stop') {
10345		                    //             lsw.swiper.autoplay.stop();
10346		                    //         }
10347			                //     }).on('closed', function (event){
10348					        //     	console.log('gallery closed');
10349		                    //         if(slider_motion != 'stop') {
10350		                    //             lsw.swiper.autoplay.start();
10351		                    //         }
10352			                //     });
10353		                    // }
10354			            }			            
10355
10356						resizeVideoIframe($el);
10357			        }
10358
10359					if(c.type == 'forum') {
10360						var page_num = 1
10361						if (typeof $.cookie('forum_' + v.element.seq) != 'undefined' && $.cookie('forum_' + v.element.seq)) {
10362							page_num = $.cookie('forum_' + v.element.seq);
10363						} 
10364						_this.forumUpdate(v.element.seq, page_num, v.view, c.page, v.list);
10365					} else if(c.type == 'gallery') {
10366	                    _this.galleryEL[c.seq] = {
10367	                    	'seq' : c.seq,
10368	                    	'elname' : c.elname,
10369	                    	'eltag' : c.eltag,
10370	                    	'folder' : c.folder,
10371	                    	'mode' : c.mode,
10372	                    	'elsettings' : c.elsettings,
10373	                    	'feature' : c.feature,
10374	                    	'type' : c.type,
10375	                    	'type2' : c.type2,
10376							'searches' : c.searches
10377	                    };
10378
10379						_this.galleryUpdate(c,v);
10380                        if(c.only_category) {
10381                            localStorage.setItem('searches',JSON.stringify(new Array(c.searches.uri[0])));
10382                        }
10383
10384						if (typeof c.price_hidden != 'undefined' && c.price_hidden == 'ON') {
10385							$el.find('.figure.price').html('');
10386						}
10387
10388						//갤러리블럭 모바일 가로 갯수 설정 시 클래스추가
10389						var gal_css = CSSJSON.toJSON(htmlspecialchars_decode(c.elcss)),
10390							gal_s = style.get(gal_css,c.elname),
10391							gal_case = $el.attr('data-case');
10392						if(gal_s.__layout_m_on == 1 && gal_case != 'gallery61') {
10393							$el.addClass('el-col-m'+gal_s.__layout_col_mc);
10394						} else if(gal_s.__layout_m_on == 1 && gal_case == 'gallery61') {
10395							$el.addClass('el-col-m'+gal_s.__swiper_view_mc);
10396						}
10397					} else if(c.type == 'sync') {
10398						var sync_source = _this.syncUpdate($el,v.element);
10399						$el.html(sync_source);
10400
10401						if($el.find('[data-sync-loop="true"]').length > 0) {
10402							if(c.type2 == 'tab') $el.find('[data-sync-loop="true"] > li[data-list-no="1"]').attr('data-list-no','');
10403							if(c.type2 == 'imgpitem' && sync_list_total > 0) $el.find('[data-sync-loop="true"] > li:not([data-idx])').remove();
10404							$el.find('[data-sync-loop="true"] > li').eq(0).addClass('active').siblings().removeClass('active');
10405						}
10406						
10407					} else if(c.type == 'tabs') {
10408						// tab block 우선순위 check
10409						var $tabs = $el.find(".tab-box .tab:not(.hover)"),
10410							$initial_tab = ($tabs.filter('.checked').length > 0) ? $tabs.filter('.checked').first() : $tabs.filter('.active').first();
10411						if($initial_tab.length == 0) $initial_tab = $tabs.eq(0);
10412						if($tabs.filter('.checked').length > 0) {
10413							$tabs.removeClass('active');
10414							$initial_tab.addClass('active');
10415							$el.find('.tab-editor').removeClass('active');
10416							$el.find('.tab-editor.tabs' + $initial_tab.attr('data-order')).addClass('active');
10417						}
10418						var el = $el.attr('data-name'),
10419							len = $tabs.length,
10420							motion_style = $el.attr("tab-motion-style"),
10421							tab_counted = $el.attr("tab-count"),
10422							mobile_tab_count = $el.attr("mobile-tab-count"),
10423							tab_count = ($(window).width() < 991) ? ((typeof mobile_tab_count != 'undefined' && mobile_tab_count) ? mobile_tab_count : ((tab_counted > 4) ? 4 : tab_counted)) : tab_counted,
10424							mobile_tab_line = $el.attr("mobile-tab-line"),
10425							tab_case = $el.attr("data-case"),
10426							motion = $el.attr("tab-motion"),
10427							priority = Number($initial_tab.attr('data-order')) || 1,
10428							navigation_use = $el.attr("navigation-use");
10429						tabArrow(el);
10430						if(navigation_use == '1' || ($(window).width() < 991 && mobile_tab_line == '1' && len > Number(tab_count))) {
10431							if(motion_style == 1) {
10432								var motion = (((priority + 1) - Number(tab_count)) >= 0) ? priority - Number(tab_count) : 0;
10433							} else {
10434								var motion = Math.ceil(Number(priority) / Number(tab_count)) - 1;
10435							}
10436							$el.attr('tab-motion', motion);
10437							tabMotion(el, motion, "", len, motion_style, tab_count, tab_case);
10438						}
10439
10440					} else if(c.type == 'sns' && c.type2 == 'feed') {
10441		                $el.find('.data-feed-load-more').attr('data-feed-el',c.elname);
10442		                $el.find('.data-feed-load-more').removeAttr('style');
10443		                $el.find('.show-posts').removeClass('show-posts');
10444
10445		                if(c.mode == 'site') {
10446							if(!$.isEmptyObject(b.SOCIAL)) {
10447								var load_sns = {};
10448								if(!$.isEmptyObject(b.SOCIAL.instagram) && typeof settings.sns_instagram != 'undefined' && settings.sns_instagram == 'ON') load_sns['instagram'] = b.SOCIAL.instagram;
10449								if(!$.isEmptyObject(b.SOCIAL.twitter) && typeof settings.sns_twitter != 'undefined' && settings.sns_twitter == 'ON') load_sns['twitter'] = b.SOCIAL.twitter;
10450
10451								if(!$.isEmptyObject(load_sns)) {
10452									loadingElement(c.elname,'loading posts...');
10453									updateFeed(c.elname, load_sns, settings, function() {
10454										$('.'+c.elname+' .listprogress').remove();
10455									});
10456								}
10457							}
10458		                } else {
10459							// SNS FEED:: before version
10460							if(typeof settings.sns != 'undefined' && settings.sns.twitter) {
10461								loadingElement(c.elname,'loading posts...');
10462								updateFeed(c.elname,settings.sns);
10463							}
10464		                }
10465
10466					} else if(c.type == 'others' && c.type2 == 'countdown') {
10467		                var el_dday = $el.find('[data-dday="true"]'),
10468		                	cd_date = (el_dday.attr('data-countdown')) ? el_dday.attr('data-countdown') : new Date(),
10469		                    dateformat  = { days : '%D', hours: '%H', minutes: '%M', seconds: '%S' },
10470		                    dateendformat  = { days : '00', hours: '00', minutes: '00', seconds: '00' };
10471						
10472						if( typeof settings.countdown != 'undefined' && settings.countdown ) {  //set - block setting date 
10473	                        cd_date = settings.countdown;
10474		                }
10475		                if( !el_dday.attr('data-countdown') && typeof cd_date == 'object' ) { //set - example date
10476		                    cd_date.setTime(cd_date.getTime() + (35*24*60*60*1000));
10477		                }
10478			            cd_date = moment(cd_date).format('YYYY/MM/DD HH:mm:ss');
10479			            
10480						el_dday.countdown(cd_date, function(event) {
10481							$(this).find('.date-item[data-datetype]').each(function(i) {
10482								var dd_type = $(this).attr('data-datetype'),
10483									dd_format = $(this).attr('data-format'),
10484									dd_endformat = $(this).attr('data-finish');
10485
10486								if(typeof dd_format == 'undefined' || !dd_format) dd_format = dateformat[dd_type];
10487								if(typeof dd_endformat == 'undefined' || !dd_endformat) dd_endformat = dateendformat[dd_type];
10488
10489								if(event.elapsed) $(this).text(dd_endformat);
10490								else $(this).text(event.strftime(dd_format));
10491							});
10492						});
10493                		if($el.find('[data-bg-video="true"]').length > 0) resizeVideoIframe($el);
10494					}
10494 else if (c.type == 'latest') {
10495						var latest_data = (typeof settings.latest_data != 'undefined' && settings.latest_data) ? settings.latest_data : {};
10496						$.latest.init(c.seq,latest_data);					
10497					} else if (c.type == 'review') {
10498						_this.galleryEL[c.seq] = {
10499							'seq' : c.seq,
10500							'elname' : c.elname,
10501							'eltag' : c.eltag,
10502							'folder' : c.folder,
10503							'mode' : c.mode,
10504							'elsettings' : c.elsettings,
10505							'feature' : c.feature,
10506							'type' : c.type,
10507							'type2' : c.type2,
10508							'searches' : c.searches
10509						};
10510		                var gallery_data = (typeof settings.gallery_data != 'undefined' && settings.gallery_data) ? settings.gallery_data : {};
10511                		$.reviewContents.init(c.seq, gallery_data);
10512		            } else if (c.type == 'form' || (c.type == 'contact' && c.type2 == 'franchise bar')) {
10513						$.forms.init(c.seq);
10514		            } else if (c.type == 'contact') {
10515		            	if(c.type2 == 'franchise map') {
10516		            		$.each($el.find('[data-fmap-loop="true"] .item .item-name'), function(i, v) {
10517		                        let itemName = $(v).html();
10518		                        itemName = itemName.replace(/&lt;&nbsp;/g, '&lt;').replace(/&nbsp;&gt;/g, '&gt;');
10519		                        $(v).html(itemName);
10520		                    });
10521		                    
10522		            		var $mapItem = $el.find('[data-fmap-loop="true"] > .item.selected');
10523                    		drawMap($mapItem, $el);
10524                    		fmapMobilePaging($el);
10525		            	}
10526		            } else if (c.type == 'calendar') {
10527						var currentDate = new Date(),
10528							getYear = currentDate.getFullYear(),
10529							getMonth = String(currentDate.getMonth() + 1).padStart(2, "0"),
10530							yearMonth = getYear + '-' + getMonth;
10531						$.cl_calendar.init(c.sid, c.seq, yearMonth, c);
10532					} else if (c.type == 'showcase') {
10533						if($el.hasClass('carousel') && $el.find('.item').length > 1 && $el.find('.control-box .carousel-control').hasClass('hide')) {
10534							$el.find('.control-box .carousel-control').removeClass('hide');
10535						}
10536
10537						slideEffectClassAdd($el);
10538					}
10539
10540					if($el.find('.slick').length > 0) {
10541						if (c.type == 'sync' && typeof syncSlickFn == 'function') syncSlickFn('.' + c.elname);
10542						else if($el.is('[data-clslick]') && typeof clSlickFn == 'function') clSlickFn('.' + c.elname);
10543					}
10544
10545					if($.inArray(c.type, ['contents', 'text', 'image', 'video', 'sns']) > -1) {
10546	            		let ecs = enableContentsSlider(c.seq, c.type, settings);
10547						if(typeof settings.list_type != 'undefined' && settings.list_type == 's' && ecs) {
10548							// console.log('enable slider');
10549		                    $.contentsSlider.ready(c.seq).then(() => {$.contentsSlider.init(c.seq, settings)});
10550		                }
10551		            }
10552
10553					changeBrokenImages($el);
10554
10555		            idx++;
10556		    	});
10557
10558				// $('.tag.preloading').replaceWith(function () {
10559				//     return $(this).html();
10560				// });
10561
10562				if(check_modoo) {
10563					m_floating(fl_data);
10564				}  else if (property?.SETTINGS?.modoo?.floating) { // 모두 사이트 메뉴 디자인 변경 시 dsgn-body에 modoo가 포함되지 않아 모바일에서 퀵메뉴 안 보이는 문제 해결					        
10565					m_floating(fl_data);
10566				}
10567
10568				$('.preloading').removeClass('preloading');
10569				document.querySelectorAll('.element video').forEach(function(video) {
10570					if(video.readyState > 0) video.classList.add('loaded');
10571					video.addEventListener('loadeddata', function() {
10572						this.classList.add('loaded');
10573					});
10574				});
10575
10576				// b.ISLOCK = (!b.VALIDPLAN) ? 'false' : b.ISLOCK;
10577				if(b.ISLOCK == 'true') {
10578					$('.locked').remove();
10579					return deferred.resolve({'showOnlyFooter':true});
10580				}
10581				
10582            	if($('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').length && (typeof kakao == 'undefined' || typeof kakao.maps == 'undefined' || kakao.maps == null || property.VALIDPLAN == '')) {
10583	                $('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').html('지도연결해제됨. Javascript키 확인');
10584	                $('.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>');
10585	            } else {
10586					$('.element:not([data-type2="franchise map"]) [data-map_kind="kakao"]').each(function() {
10587						var container = this;
10588                        var lat = $(this).data("lat");
10589                        var lng = $(this).data("lng");
10590                        var zoomInOut = $(this).data("zoominout");
10591                        var mapTitle = $(this).data("maptitle");
10592                        var mapContent = $(this).data("mapcontent");
10593                        var useTitle = $(this).data("usetitle");
10594                        var useContent = $(this).data("usecontent");
10595
10596                        if (typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
10597                        if (typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
10598                        if (typeof mapContent == 'undefined' || !mapContent) mapContent = '';
10599                        if (typeof useTitle == 'undefined' || !useTitle) useTitle = false;
10600                        if (typeof useContent == 'undefined' || !useContent) useContent = false;
10601                        
10602                        var options = { center: new kakao.maps.LatLng(lat, lng), level: 3 };
10603                        var c_map = new kakao.maps.Map(container, options);
10604                        var marker = new kakao.maps.Marker({ position: new kakao.maps.LatLng(lat, lng), map: c_map });
10605
10606		                if(zoomInOut == true) {
10607	                        var zoomControlHtml = '';
10608	                        zoomControlHtml += '\
10609	                            <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);">\
10610	                                <div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
10611	                                    <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>\
10612	                                </div>\
10613	                                <div class="slider-wrap-container" style="height: 130px;">\
10614	                                    <div class="slider-wrap small" style="text-align: center; height: 100%;">\
10615	                                        <div style="max-height: 100%;" class="zoom-control-slider"></div>\
10616	                                    </div>\
10617	                                </div>\
10618	                                <div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
10619	                                    <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>\
10620	                                </div>\
10621	                            </div>\
10622	                        ';
10623	                        var $zoomController = $(zoomControlHtml);
10624	                        $(container).append($zoomController);
10625	                        var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
10626	                            'orientation': 'vertical',
10627	                            'min' : 1,
10628	                            'max' : 14,
10629	                            'step' : 1,
10630	                            'value' : 3,
10631	                            'handle' : '<div>dfafasdfas</div>',
10632	                            // 'reversed' : true,
10633	                            'tooltip' : 'hide',
10634	                        }).on('slide', function(data) {
10635	                            c_map.setLevel(data.value);
10636	                            c_map.setCenter(marker.getPosition());
10637	                        }).on('slideStop', function(data) {
10638	                            c_map.setLevel(data.value);
10639	                            c_map.setCenter(marker.getPosition());
10640	                        });
10641
10642	                        $zoomController.find('.btn-zoom-control').on('click', function() {
10643	                            if($(this).data('inout') == 'I') {
10644	                                c_map.setLevel(c_map.getLevel() - 1);
10645	                                zoom_slider.slider('setValue', c_map.getLevel());
10646	                            } else if($(this).data('inout' == 'O')) {
10647	                                c_map.setLevel(c_map.getLevel() + 1);
10648	                                zoom_slider.slider('setValue', c_map.getLevel());
10649	                            }
10650	                        });
10651
10652			                kakao.maps.event.addListener(c_map, 'zoom_changed', function() {
10653			                    zoom_slider.slider('setValue', c_map.getLevel());
10654			                });
10655		                }
10656
10657		                if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
10658		                    var iwContent = '';
10659		                    if(useTitle == true && mapTitle) {
10660		                        iwContent = '<div class="title">' + mapTitle + '</div>';
10661		                    }
10662		                    if(useContent == true && mapContent) {
10663		                        iwContent += '<div class="content">' + mapContent + '</div>';
10664		                    }
10665	                        if(iwContent) {
10666	                            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>
10666' + iwContent + '</div>';
10667	                            var infoWindow = $(iwContent);
10668	                            $(container).append(infoWindow);
10669	                        }
10670		                }
10671						$(window).on("resize", function() {
10672							c_map.relayout();
10673							c_map.setCenter(marker.getPosition());
10674						});
10675					});
10676				}
10677
10678	            if($('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').length && (typeof naver == 'undefined' || typeof naver.maps == 'undefined' || naver.maps == null || property.VALIDPLAN == '')) {
10679	                $('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').html('지도연결해제됨. Client ID 확인');
10680	                $('.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>');
10681	            } else {
10682					$('.element:not([data-type2="franchise map"]) [data-map_kind="naver"]').each(function() {
10683						var container = this;
10684						var lat = $(this).data("lat");
10685						var lng = $(this).data("lng");
10686						var options = { center: new naver.maps.LatLng(lat, lng), zoom: 17};
10687		                var zoomInOut = $(this).data("zoominout");
10688		                var zoom = $(this).data("zoom");
10689		                var mapTitle = $(this).data("maptitle");
10690		                var mapContent = $(this).data("mapcontent");
10691		                var useTitle = $(this).data("usetitle");
10692		                var useContent = $(this).data("usecontent");
10693		                if(typeof zoomInOut == 'undefined' || !zoomInOut) zoomInOut = false;
10694		                if(typeof mapTitle == 'undefined' || !mapTitle) mapTitle = '';
10695		                if(typeof mapContent == 'undefined' || !mapContent) mapContent = '';
10696		                if(typeof useTitle == 'undefined' || !useTitle) useTitle = false;
10697		                if(typeof useContent == 'undefined' || !useContent) useContent = false;
10698						var c_map = new naver.maps.Map(container, options);
10699						var marker = new naver.maps.Marker({ position: new naver.maps.LatLng(lat, lng), map: c_map});
10700
10701		                if(zoomInOut == true) {
10702	                        var zoomControlHtml = '';
10703	                        zoomControlHtml += '\
10704	                            <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);">\
10705	                                <div class="btn-zoom-control" data-inout="I" style="cursor: pointer; width: 30px; height: 30px;">\
10706	                                    <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>\
10707	                                </div>\
10708	                                <div class="slider-wrap-container" style="height: 130px;">\
10709	                                    <div class="slider-wrap small" style="text-align: center; height: 100%;">\
10710	                                        <div style="max-height: 100%;" class="zoom-control-slider"></div>\
10711	                                    </div>\
10712	                                </div>\
10713	                                <div class="btn-zoom-control" data-inout="O" style="cursor: pointer; width: 30px; height: 30px;">\
10714	                                    <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>\
10715	                                </div>\
10716	                            </div>\
10717	                        ';
10718	                        var $zoomController = $(zoomControlHtml);
10719	                        $(container).append($zoomController);
10720	                        var zoom_slider = $zoomController.find('.zoom-control-slider').slider({
10721	                            'orientation': 'vertical',
10722	                            'min' : 6,
10723	                            'max' : 21,
10724	                            'step' : 1,
10725	                            'value' : 17,
10726	                            'handle' : '<div>dfafasdfas</div>',
10727	                            'reversed' : true,
10728	                            'tooltip' : 'hide',
10729	                        }).on('slide', function(data) {
10730	                            c_map.setZoom(data.value);
10731	                            c_map.setCenter(marker.getPosition());
10732	                        }).on('slideStop', function(data) {
10733	                            c_map.setZoom(data.value);
10734	                            c_map.setCenter(marker.getPosition());
10735	                        });
10736
10737	                        $zoomController.find('.btn-zoom-control').on('click', function() {
10738	                            if($(this).data('inout') == 'I') {
10739	                                c_map.setZoom(c_map.getZoom() + 1);
10740	                                zoom_slider.slider('setValue', c_map.getZoom());
10741	                            } else if($(this).data('inout' == 'O')) {
10742	                                c_map.setZoom(c_map.getZoom() - 1);
10743	                                zoom_slider.slider('setValue', c_map.getZoom());
10744	                            }
10745	                        });
10746
10747	                        naver.maps.Event.addListener(c_map, 'zoom_changed', function(zoom) {
10748	                            zoom_slider.slider('setValue', c_map.getZoom());
10749	                        });
10750		                }
10751		                
10752		                if((useTitle == true || useContent == true) && (mapTitle || mapContent)) {
10753		                    var iwContent = '';
10754		                    if(useTitle == true && mapTitle) {
10755		                        iwContent = '<div class="title">' + mapTitle + '</div>';
10756		                    }
10757		                    if(useContent == true && mapContent) {
10758		                        iwContent += '<div class="content">' + mapContent + '</div>';
10759		                    }
10760	                        if(iwContent) {
10761	                            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>
10761' + iwContent + '</div>';
10762	                            var infoWindow = $(iwContent);
10763	                            $(container).append(infoWindow);
10764	                        }
10765		                }
10766						$(window).on("resize", function() {
10767							// c_map.relayout();
10768							c_map.setCenter(marker.getPosition());
10769						});
10770					});
10771				}
10772
10773				$('.element [data-map="true"]:not(iframe)').each(function() {
10774					var map_url = $(this).attr('data-url');
10775					if(typeof map_url != 'undefined' && map_url) {
10776						var map_iframe = getMapURL(map_url,'html');
10777						$(this).replaceWith(map_iframe);
10778						if(map_iframe.indexOf('google-map disabled') === -1) $(this).next('.map-undefined').remove();
10779					}
10780				});
10781                
10782				if($('.element a[data-popup][data-popup-name]').length > 0 && (!b.VALIDPLAN || b.VALIDTYPE == 'PK')) {
10783					$('.element a[data-popup][data-popup-name]').addClass('disabled');
10784				}			
10785				if($('.element[data-layout]').length > 0) {
10786	                setLayoutHeight();
10787	            }
10788		        setBlockParallax($('.element'));
10789
10790		    	$('.dsgn-body').fitVids();
10791
10792				if($('.element[data-aos]').length > 0) scheduleBlockAOSRefresh();
10793				$('html').toggleClass('gtoolbar-sticky-ON', $('.cl-gtoolbar[data-sticky="ON"]').length > 0 ? true : false);
10794				deferred.resolve();
10795		    });			
10796		});
10797		//parallax();
10798	    return deferred.promise();
10799    },
10800    setLoginout : function (show, sid, site, profileimg) {
10801		if(show=='1') {
10802			$.getJSON('/template/checkLogin', function(data) {
10803				if(data.user && site) {
10804					if($('#tpl-menu').find('.loginout')) $('#tpl-menu').find('.loginout').remove();
10805					setLoginoutNav(sid, function() {
10806						getProfileMember();
10807						getProfileAuthor(sid,profileimg);
10808						$('.el_0').css('margin-top','55px');
10809					});
10810				} else {
10811					$('#tpl-menu').append('<li class="loginout"><a href="javascript:;" title="CREATORLINK login"><i class="fa fa-user"></i></a></li>'); 
10812				}
10813			});
10814	    }
10815    },
10816    liveUpdate : function(obj) {
10817    	// console.log('liveUpdate');
10818
10819    	var b = this.b;
10820
10821		var checkSidebar = $('.el-menu > header').hasClass('sidebar');
10822		var checkClnav =  $.clnav.check();
10823		var menu_class = {
10824				'navlist': (checkClnav) ? 'cl-nav-list ' : '',
10825				'navitem': (checkClnav) ? 'cl-nav-item ' : '',
10826				'subnavlist': (checkClnav) ? 'cl-subnav-list ' : '',
10827				'subnavitem': (checkClnav) ? 'cl-subnav-item ' : '',
10828			};
10829		var menu = (checkClnav) ? $('.el-menu > header.cl-nav .cl-nav-list') : $('#tpl-menu');
10830	    var idx = 0;
10831	    var regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
10832	    var regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
10833	    menu.empty();
10834    	
10835		if($('.fmcss').length > 0) $('.fmcss').remove(); //forum background css
10836
10837	    $.each(obj, function (idx, obj) {
10838	    	if(obj.name == '전체상품') {
10839	    		if(b.LUX || b.VALIDTYPE != 'SM' || !b.SLANG || (typeof b.SLANG.select_code !== 'undefined' && b.SLANG.select_code != 'ko')){
10840	    			return true;
10841	    		}
10842	    	}
10843	    	
10844	        b.MENULIST.push(obj.name.replace(/ /g,'-'));
10845	        if(obj.children) {
10846	            $.each(obj.children, function (idx, obj){
10847	                b.MENULIST.push(obj.name.replace(/ /g,'-'));
10848	            });
10849	        }
10850	    });
10851
10852		if(b.ONE) {
10853			linkUrl = (b.VIEW) ? '/#' : '#';
10854			linkUrl = (b.VIEW && !b.PUBLISH) ? '/render/index#' : linkUrl;
10855		} else {
10856			linkUrl = (b.URL=='/') ? '/' : b.URL + '/';  
10857		}
10858
10859		for (i = 0; i < obj.length; i++) {
10860            var link = obj[i].name;
10861			if(b.MENULIST.includes(link.replace(/ /g, '-'))) link = link.replace(/ /g, '-');
10862			
10863            if(link == '전체상품') {
10864	            if(b.LUX || b.VALIDTYPE != 'SM' || !b.SLANG || (typeof b.SLANG.select_code !== 'undefined' && b.SLANG.select_code != 'ko')) {
10865	                continue;
10866	            }
10867	        }
10868
10869			var parent = b.PAGE.split(',');
10870			var link_text = '';
10871			var target = '';
10872			var name = (checkClnav) ? `<span class="cl-nav-name">${obj[i].name}</span>` : obj[i].name;
10873			var isInner = '';
10874			var isBookmark = '';
10875			var isFlink = '';
10876			var isFolder = '';
10877
10878			if(i==0) {
10879				if(obj[i].display=='on') {
10880					b.MENUCHECK.intro = true;
10881					b.MENULINK.push(link);
10882				}
10883				continue;
10884			}
10885
10886			if(obj[i].name =='전체상품') {
10887	            obj[i].link = '';
10888	        }
10889
10890			var active = (link == b.PAGE || link == parent[0]) ? 'active' : '';
10891			var sub = obj[i].children.length;
10892
10893			if (obj[i].display == 'on') {
10894				b.MENUCHECK.main = true;
10895
10896				var menuoption_child = [];
10897				var menuLink = (typeof obj[i].link != 'undefined') ? obj[i].link : '';
10898				var checkLink = (menuLink) ? true : false;
10899				var checkLinkInner = (checkLink && $.inArray(menuLink.replace(/ /g,'-'), b.MENULIST) > -1) ? true : false;
10900				var checkLinkBookmark = (menuLink.match(/^\@/g) !== null) ? true : false;
10901				var checkLinkFile = (menuLink.match(/^flink\@[0-9]/gi) !== null) ? true : false;
10902				var checkLinkFolder = (menuLink === 'folder-menu') ? true : false;
10903
10904				link = (checkLink) ? ((checkLinkInner) ? menuLink.replace(/ /g,'-') : menuLink) : link;
10905				isInner = (checkLinkInner) ? menuLink.replace(/ /g,'-') : '';
10906				isBookmark = (checkLinkBookmark) ? ` attr-bookmark="${link.replace(/^\@/g,'')}"` : '';
10907				isFlink = (checkLinkFile) ? ` attr-flink="${link.replace(/^flink\@/gi,'')}"` : '';
10908				isFolder = (checkLinkFolder) ? ` attr-folder="true"` : '';
10909				target = (obj[i].ltarget == '_blank') ? 'target="_blank"' : '';
10910
10911				if(checkLink && !checkLinkInner && !checkLinkBookmark) {												// link-type: link-out      ==> a[attr-link]
10912					if(checkBase64Encode(link)) link = Base64.decode(link);
10913				}
10914
10915				if(link == 'folder-menu') {
10916					link_text = 'javascript:;';
10917					target = '';
10918					if(typeof menu.closest('.navbar-menu-'+b.SID).attr('data-submenu') != 'undefined') target = ' data-toggle="dropdown" aria-expanded="false" data-submenu="true" ';
10919				} else {
10920					if(!checkLink) b.MENULINK.push(link);
10921					link_text = (b.MENULIST.includes(link)) ? linkUrl + link : (!regex2.test(link) && regex.test(link)) ? '//' + link : link;
10922				}
10923
10924	            if (sub) {
10925	                var sub_menu = '';
10926	                var sub_show = 0;
10927
10928	                sub_menu = `<ul class="${menu_class['subnavlist']} dropdown-menu">\r\n`;
10929	                for (j = 0; j < obj[i].children.length; j++) {
10930	                    var child = obj[i].children;
10931						var childMenuLink = (typeof child[j].link != 'undefined') ? child[j].link : '';
10932						var checkChildLink = (childMenuLink) ? true : false;
10933						var checkChildLinkInner = (checkChildLink && b.MENULIST.includes(childMenuLink.replace(/ /g, '-'))) ? true : false;
10934						var checkChildLinkBookmark = (childMenuLink.match(/^\@/g) !== null) ? true : false;
10935						var checkChildLinkFile = (childMenuLink.match(/^flink\@[0-9]/gi) !== null) ? true : false;
10936						var child_link = (checkChildLink) ? ((checkChildLinkInner) ? childMenuLink.replace(/ /g,'-') : childMenuLink) : '';
10937						var child_isInner = (checkChildLinkInner) ? childMenuLink.replace(/ /g,'-') : '';
10938						var child_isBookmark = (checkChildLinkBookmark) ? ` attr-bookmark="${child_link.replace(/^\@/g,'')}"` : '';
10939						var child_isFlink = (checkChildLinkFile) ? ` attr-flink="${child_link.replace(/^flink\@/gi,'')}"` : '';
10940						var sub_link = (child_link) ? child_link : child[j].name.replace(/ /g, "-");
10941						var sub_target = (child[j].ltarget == '_blank') ? 'target="_blank"' : '';
10942						var sub_name = (checkClnav) ? `<span class="cl-subnav-name">${child[j].name}</span>` : child[j].name;
10943						var sub_active = '';
10944						var sub_link_text = '';
10945
10946						if(checkChildLink && !checkChildLinkInner && !checkChildLinkBookmark) {							// link-type: link-out      ==> a[attr-link]
10947							if(checkBase64Encode(child_link)) sub_link = Base64.decode(child_link);
10948						}
10949
10950						var page_arr = (b.VIEW) ? b.PAGE.split(',') : [b.PAGE];
10951						if (!active && (sub_link == page_arr[0] || link == parent[0])) {
10952							sub_active = 'active';
10953							active = 'open';
10954							if(!checkClnav && $('body').width() > 768) active = 'active';
10955						}	                    	
10956
10957	                    if (child[j].display == 'on') {
10958							b.MENUCHECK.sub = true;
10959							if(!checkChildLink) b.MENULINK.push(child[j].name.replace(/ /g, '-'));
10960	                        sub_link_text = ($.inArray(sub_link,b.MENULIST) > -1) ? linkUrl+sub_link : (!regex2.test(sub_link) && regex.test(sub_link)) ? '//'+sub_link : sub_link;
10961							sub_menu += `
10962								<li class="${menu_class['subnavitem'] + sub_active}"><a href="${sub_link_text}" ${sub_target + child_isBookmark + child_isFlink}>${sub_name}</a></li>\r\n
10963							`;
10964	                        sub_show++;
10965
10966							menuoption_child.push({
10967								'idx0': b.MENUOPTION.length,
10968								'idx1': menuoption_child.length,
10969								'name': child[j].name,
10970								'active': sub_active,
10971								'href': sub_link_text,
10972								'target': sub_target,
10973								'isinner': child_isInner,
10974								'isbookmark': child_isBookmark,
10975								'isflink': child_isFlink,
10976								'depth': 1,
10977								'topmobile': child[j].topmobile,
10978							});
10979	                    }
10980	                }
10981	                sub_menu = sub_menu +'</ul>\r\n';
10982	                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>';
10983	                
10984					if (sub_show) {
10985                		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' : '';
10986						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`);
10987	                } else {
10988	                	menu.append(`\r\n<li class="${menu_class['navitem'] + active}"><a href="${link_text}" ${target + isBookmark + isFlink}>${name}</a></li>\r\n`);
10989	                }
10990	                if(sub_show) menu.find('.dropdown:last').append(sub_menu);
10991	            } else {
10992	            	menu.append(`\r\n<li class="${menu_class['navitem'] + active}"><a href="${link_text}" ${target + isBookmark + isFlink}>${name}</a></li>\r\n`);
10993	            } 
10994
10995				b.MENUOPTION.push({
10996					'idx0': b.MENUOPTION.length,
10997					'name': obj[i].name,
10998					'active': active,
10999					'href': link_text,
11000					'target': target,
11001					'isinner': isInner,
11002					'isbookmark': isBookmark,
11003					'isflink': isFlink,
11004					'isfolder': isFolder,
11005					'depth': 0,
11006					'children': menuoption_child,
11007					'topmobile': obj[i].topmobile,
11008				});
11009
11010	            idx++;
11011	        }
11012		}
11013
11014
11015		// menu ver3 : fheader
11016		//              - Add #fixed-menu, #mobile-nav
11017		//              - Set mobile-design
11018		if ($.clnav.check()) $.clnav.init();
11019		else if ($('header.navbar').hasClass('navbar-fheader')) $.fheader.init();
11020
11021		if(	typeof b.VALIDPLAN != 'undefined' && b.VALIDPLAN && 
11022			typeof b.VALIDTYPE != 'undefined' && b.VALIDTYPE != 'PK'
11023		) {
11024			if(b.VALIDTYPE == 'SM') {
11025				$.umember.init(b.SITEUM,b.SITEUMLANG,b.SITEUMDISPLAY, function() { 
11026					$.psearch.init();
11027					$.shopping.init();
11028					$.slang.init(b.SLANG);
11029				});
11030			} else if(b.VALIDTYPE == 'BN') {
11031				$.umember.init(b.SITEUM,b.SITEUMLANG,b.SITEUMDISPLAY, function() { 
11032					$.slang.init(b.SLANG); 
11033				});
11034			} else {
11035				$.slang.init(b.SLANG);
11036			}
11037		} else {
11038			$.slang.init();
11039		}
11040
11041		// menu ver3 : fheader
11042		//             - Set site page top padding
11043		//             - Set menu config btn position
11044		if ($('header.navbar').hasClass('navbar-fheader')) $.fheader.set();
11045
11046	    $('header .navbar-nav').removeClass('hide').removeClass('preloading');
11047	    $('body,html').animate({scrollTop: 0}, 300,'easeInOutQuart');
11048
11049		property.MENU_BREADCRUMB_MAP = $.psearch.buildMenuBreadcrumbMap(b.MENUOPTION);
11050
11051	},
11052	syncUpdate : function($el,data) {
11053		$('#el-empty').empty().append($el.outerHTML());
11054		var $sync = $('#el-empty'),
11055			nodes = $sync.find('.item'),
11056			$sync_row = ($sync.find('.sync-option').length > 0) ? $sync.find('.sync-row') : $sync.find('.slick'),
11057            $sync_loop = $sync.find('[data-sync-loop="true"]'),
11058            checkSyncGalleryFrame = false,
11059            checkSyncHtmlReplace = false,
11060            sync_gallery = {},
11061            p = _this.b.RESOURCE + '/' + _this.b.SID + '/';
11062		
11063		checkSyncHtmlReplace = ($sync.find('input.sync-option').length > 0 && $sync.find('.layout-container').length == 0) ? true : false;
11064		setOldVerBlockView($sync,data);
11065
11066		if(typeof data.sync !='undefined' && typeof data.sync.list != 'undefined' && (data.sync.list).length) {
11067			$sync_row.empty();
11068			var nodes_count = nodes.length;
11069			$.each(data.sync.list, function(i,v) {
11070				var nodes_pos = i % nodes_count,
11071					$item = $(nodes[nodes_pos]);
11072				var imgbg_check = (typeof $item.find('.img-bg').attr('style') == 'undefined') ? false : true,
11073					href = '/' + v.page + '/view/' + v.seq,
11074					alink = (_this.b.PUBLISH) ? href : '/render' + href;
11075
11076                switch(v.type) {
11077                    case "gallery":
11078                        var img = getServeImage(v.image,'0',p);
11079                        (v.mode == 'project') ?
11080                            $item.find('a').attr('href', alink) :
11081                            $item.find('a').attr('href', img).attr('data-gallery','').attr('data-title',v.title); 
11082                        break;
11083                    case "shopping":
11084                    	if(typeof data.sync.member_only[v.pid] != 'undefined' && data.sync.member_only[v.pid] == 'ON') {
11085                        	if(_this.b.UMEMBER.check_login == true) {
11086                        		$item.find('a').attr('href',alink);
11087                        	} else {
11088                        		$item.find('a').attr('href','javascript:member_only_item();');
11089                        	}
11090                        } else $item.find('a').attr('href',alink);
11091                        break;
11092
11093                    case "lux":
11094                        $item.find('a').attr('href',(_this.b.PUBLISH) ? '/_product/' + v.seq : '/render/_product/' + v.seq);
11095                        break;
11096                }
11097                var brand_name = (v.brand_name != 'undefined' && v.brand_name && v.brand_name != '-') ? v.brand_name : '';
11098				$item.find('img').attr('src',v.image);
11099				$item.find('.brand').html(brand_name);
11100				$item.find('.name').html(v.title);
11101				$item.find('.caption').html(v.caption);
11102
11103                if(v.type == 'gallery' && v.mode == 'gallery') {
11104                    checkSyncGalleryFrame = true;
11105                    sync_gallery.elsettings = v.elsettings;
11106                    sync_gallery.type = 'gallery';
11107                }
11108                if(typeof data.sync.member_only[v.pid] != 'undefined' && data.sync.member_only[v.pid] == 'ON' && _this.b.UMEMBER.check_login == false) {
11109                    $item.find('.price').addClass('hidden');
11110                    $item.find('.sale').addClass('hidden');
11111                    $item.find('.price-sale').addClass('hidden');
11112                } else {
11113	                (v.price != '') ? $item.find('.price').text('₩'+number_format(v.price)) : $item.find('.price').text('₩0');
11114					
11115                    if(v.sale_rate > 0) $item.find('.sale').removeClass('hide').text(v.sale_rate + '%');
11116                    else {
11117                        if($item.find('.sale').parent().hasClass('img-content')) $item.find('.sale').addClass('hide');
11118                        $item.find('.sale').text('');
11119                    }
11120
11121					$item.find('.price-unit-pricing').remove();
11122					if(v.product_unit_str) {
11123						var tmp_unit_selector = ($item.find('ul.price-wrap').length > 0) ? `ul.price-wrap` : `.content`;
11124						var tmp_unit_wrap = ($item.find('ul.price-wrap').length > 0) ? `li` : `div`;
11125						$item.find(tmp_unit_selector).append(`<${tmp_unit_wrap} class="price-unit-pricing">${v.product_unit_str}</${tmp_unit_wrap}>`); // 단위당 가격
11126					}
11127
11128					if(v.sale > 0 && v.sale > v.price) $item.find('.price-sale').text('₩'+number_format(v.sale));
11129	                else $item.find('.price-sale').addClass('hidden');
11130                }
11131
11132                if(imgbg_check) $item.find('.img-bg').attr('style','background-image: url("' + v.image + '"');
11133				if($item.find('.sync-label-number').length > 0) $item.find('.sync-label-number').text(i+1);
11134                if(v.soldout) $item.find('.soldout').removeClass('hidden');
11135				$sync_row.append($item.outerHTML());
11136
11137				if(data.type2 == 'imgpitem' && $sync_loop.length > 0) {
11138					if($sync_loop.children('li').eq(i).length == 0) $sync_loop.append($sync_loop.children('li').eq(0).clone().removeClass('active'));
11139					$sync_loop.children('li').eq(i).attr('data-idx',i);
11140				}
11141                checkSyncHtmlReplace = true;				
11142			});
11143
11144            if(checkSyncGalleryFrame && typeof sync_gallery.type != 'undefined') {
11145                appendGalleryFrame($sync, data.seq, sync_gallery.type, sync_gallery.elsettings);
11146            }
11147            if(checkSyncHtmlReplace) tag = $sync.html();			
11148		}
11149		var r = $('#el-empty > .element:eq(0)').html();
11150		$('#el-empty').empty();
11151		// console.log(r);
11152		return r;		
11153	},
11154	galleryUpdate : function(el,data) {
11155		// console.log(`galleryUpdate: el`,el);
11156		var _this = this;
11157		$('#el-empty').append($(data.source));
11158		$('#el-empty').find('[data-loop="true"]').html('');
11159
11160		var checkGalleryListSample = false,
11161			checkGalleryListEmpty = true,
11162			source = data.source,
11163			nodes = $(source).find('[data-loop="true"]').children('.grid'),
11164			p = $('#el-empty').children(),
11165			g = p.clone().removeClass().addClass('galleryPL'+el.seq).addClass('gallery-popup'),
11166            i = [],
11167            view = $(source).find('[data-loop="true"]').data('view'),
11168            g_number = $(tag).find("[data-loop='true']").data('gallery-no'),
11169            total = (typeof data.total != 'undefined' && data.total) ? data.total : 0;
11170
11171        $('#el-empty').after(g);
11172        $(g).after('<div class="gallery-empty"></div>');
11173
11174        if(typeof view == 'undefined') view = 10;
11175
11176        var g_settings = (typeof el.elsettings == 'undefined' || el.elsettings == '') ? {} : $.parseJSON(el.elsettings),
11177        	cookie_page = 1,
11178            cookie_view = view,
11179            cookie_gallery_category = '',
11180            is_gc_cookie = (typeof $.cookie('gallery-category-'+el.seq) != 'undefined' && $.cookie('gallery-category-'+el.seq).length > 0) ? true : false,
11181            block_lang = (typeof g_settings.blocklang != 'undefined') ? g_settings.blocklang : LANG,
11182            field_oldver = (typeof g_settings.field_oldver != 'undefined' && g_settings.field_oldver.length > 0) ? g_settings.field_oldver : [];
11183            field_disable = (typeof g_settings.field_disable != 'undefined' && g_settings.field_disable.length > 0) ? g_settings.field_disable : [];
11184        var cookie_gallery_orderby = 'recent';
11185
11186		var category_onoff = (typeof g_settings.category_display != 'undefined' && g_settings.category_display) ? g_settings.category_display : 'OFF';
11187        var gallery_sort = (typeof g_settings.gallery_sort != 'undefined' && g_settings.gallery_sort) ? g_settings.gallery_sort : 'default';
11188		if(el.mode != 'shopping' && gallery_sort == 'product') gallery_sort = 'default';
11189
11190		// var adultonly_onoff = (typeof g_settings.adult_only != 'undefined' && g_settings.adult_only) ? g_settings.adult_only : 'OFF';
11191        if(	category_onoff == 'ON' &&
11192        	typeof $.cookie('ci_goto-gallery') != 'undefined' && $.cookie('ci_goto-gallery') == el.seq &&
11193        	typeof $.cookie('ci_goto-gallery-cate') != 'undefined' && g_settings.category.indexOf('|' + $.cookie('ci_goto-gallery-cate') + '|') > -1 &&
11194        	typeof g_settings.category != 'undefined' && g_settings.category 
11195    	) {
11196        	cookie_gallery_category = $.cookie('ci_goto-gallery-cate');
11197        	is_gc_cookie = true;
11198        } else if($.cookie('loadmore-' + el.seq)) {
11199			cookie_page = $.cookie('loadmore-'+el.seq);
11200			cookie_gallery_category = (typeof $.cookie('gallery-category-'+el.seq) != 'undefined') ? $.cookie('gallery-category-'+el.seq) : '';
11201            cookie_gallery_orderby = (typeof $.cookie('gallery-orderby-' + el.seq) != 'undefined') ? $.cookie('gallery-orderby-' + el.seq) : '';
11202			cookie_view = cookie_page * view;
11203        } else { 
11204			var checkCateHomeHide = (category_onoff == 'ON' &&
11205									typeof g_settings.category != 'undefined' && g_settings.category && 
11206									typeof g_settings.category_home_hide != 'undefined' && g_settings.category_home_hide) ? true : false;
11207			if(checkCateHomeHide) {
11208				var gc = g_settings.category.replace(/\|/g,'').split(',');
11209				cookie_gallery_category = gc[0];
11210				is_gc_cookie = true;
11211
11212				$.cookie('gallery-catehome-' + el.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
11213			}
11214        }
11215
11216        if(el.seq == 'all_products') {
11217        	// cookie_page = (typeof $.cookie('gallery-page-all_products') !== 'undefined' && $.cookie('gallery-page-all_products') != '')? $.cookie('gallery-page-all_products') : 1;
11218        	cookie_gallery_category = getAllProductsSortVal(g_settings);
11219        	// cookie_view = cookie_page * view;
11220        } else {
11221        	if(!property.VIEW) $.removeCookie('gallery-page-all_products', { path: '/' });
11222        }
11223
11224		$.cookie('gallery-page-' + el.seq, cookie_page, { path : '/', expires: 12 * 60 * 60 * 1000 });
11225		$.cookie('gallery-category-' + el.seq, cookie_gallery_category, { path : '/', expires: 12 * 60 * 60 * 1000 });
11226	    $.cookie('gallery-orderby-' + el.seq, cookie_gallery_orderby, { path: '/', expires: 12 * 60 * 60 * 1000 });
11227        $.removeCookie('loadmore-' + el.seq, { path : '/' });
11228
11229        var checkLoadmoreInLoop = ($(source).find('[data-loop="true"] .loadmore-wrap').length) ? true : false;
11230        var glm = $(source).find('.loadmore-wrap');
11231
11232		var checkGallerySVG = ($(source).find('.gimg-svg-wrap').length > 0) ? true : false,
11233			checkGFrameTitleOFF = (el.mode == 'gallery' && (typeof g_settings.gframe_title_visible != 'undefined' && g_settings.gframe_title_visible == 'OFF')) ? true : false;
11234
11235		var param = (el.page=='index,template' && property.param.indexOf('/org/') == -1) ? property.param + '/org/' + el.page : property.param;
11236		var post_data = { g_mode: el.mode, visible: true, sfl: 'category', stx: cookie_gallery_category };
11237
11238		if(el.seq == 'all_products') {
11239			post_data = { g_mode: el.mode, visible: true, sfl: 'orderby', stx: cookie_gallery_category };
11240		}
11241
11242		var g_data = {
11243			'list' : property.CONTENTS['el' + el.seq]['list'],
11244			'total' : property.CONTENTS['el' + el.seq]['total']
11245		}
11246
11247		var checkUseComment = checkUseCommentFunc(el.mode, el.eltag);
11248		var checkUseLike = checkUseLikeFunc(el.mode, el.eltag);
11249		
11250		$.each(g_data.list, function (idx, v) {
11251			i.push(v);
11252		});
11253		
11254		total = (typeof g_data.total.list_total != 'undefined') ? g_data.total.list_total : g_data.total;
11255		// total = (typeof g_data.total.list_total != 'undefined') ? g_data.total.list_total : 0;
11256		cookie_view = (cookie_view < total) ? cookie_view : total;
11257
11258		if( total > 0 ) checkGalleryListEmpty = false;
11259		if( i.length>0 || (i.length==0 && is_gc_cookie) ) {
11260			var loop_count = nodes.length, item_index = 0, elem = [];
11261			$.each(g_data.list,function(index,v) {
11262				loop_pos = index%loop_count;
11263				c = nodes[loop_pos];
11264				var isTitle = (v.title.length > 0) ? true:false;
11265				$(c).find('.non_text').removeClass('non_text');
11266
11267				if(el.mode != 'shopping') {
11268					if(v.title.length==0) $(c).find('.figure.title').removeClass('non_text').addClass('non_text');
11269					if(v.caption.length==0) $(c).find('.figure.caption').removeClass('non_text').addClass('non_text');
11270				}
11271
11272				v.title = (v.title.length>0) ? v.title : $.lang[block_lang]['editor.block.gallery.sample.title'];
11273				v.caption = (v.caption.length>0) ? v.caption : $.lang[block_lang]['editor.block.gallery.sample.caption'];
11274
11275				$(c).addClass('gallery-item').attr('data-index',index).attr('data-seq',v.seq);
11276				
11277
11278				var vgsettings = (typeof v.gsettings != 'undefined' && v.gsettings) ? $.parseJSON(v.gsettings) : {},
11279					img_path = (typeof vgsettings['storage'] != 'undefined') ? vgsettings['storage'] : _this.b.RESOURCE + '/' + _this.b.SID + '/',
11280					img_original = (typeof vgsettings['storage'] != 'undefined') ? img_path + '1920/' : img_path;
11281				
11282				var folder = (typeof data.element.folder == 'undefined' || data.element.folder == 0) ? '' : data.element.folder + '/',
11283					src = getServeImage(v.image,data.element.folder,img_path),
11284					src_s0 = getServeImage(v.image,'0',img_path);
11285				if($(c).find('img').length > 0) $(c).find('img').attr('src',src);
11286
11287				if(el.mode == 'shopping') {
11288					if($(c).find('img').length > 0) $(c).find('img').attr('alt',v.title);
11289				} else if(typeof v.alt != 'undefined') {
11290				    alt_replace	= v.alt.replace(/\s+|\n+/g, '-');  
11291      				alt_replace.replace(/-+/g, '-')	
11292					if($(c).find('img').length > 0) $(c).find('img').attr('alt',alt_replace);						
11293				}
11294				ensureGalleryResponsiveImageClass($(c));
11295
11296				if($(c).find('.g-img').length > 0) $(c).find('.g-img').css('background-image', 'url('+src+')');
11297				if(checkGallerySVG) {
11298					var gimgSVG = $(c).find('.gimg-svg-wrap svg');
11299					gimgSVG.find('pattern').attr('id','gimgSvg_'+el.elname+'_'+index);
11300					gimgSVG.find('image').attr('xlink:href', src);
11301					gimgSVG.find('polygon, path').attr('fill', 'url(#gimgSvg_'+el.elname+'_'+index+')');					
11302				}
11303
11304				var glink = (typeof vgsettings['glink'] != 'undefined' && vgsettings['glink']) ? vgsettings['glink'] : '',
11305					glink_target = (typeof vgsettings['glink_target'] != 'undefined' && vgsettings['glink_target']) ? vgsettings['glink_target'] : '';
11306
11307				if(glink) {
11308					if(glink.match(/^\@/g) !== null) {															// link-type: link-bookmark ==> a[attr-bookmark]
11309						var bookmark_seq = glink.replace(/^\@/g,'');
11310						if(typeof _this.b.SETTINGS.blockBookmarkList == 'undefined' || typeof _this.b.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
11311							glink = '';
11312							glink_target = '';
11313						}
11314					} else if(glink.match(/^flink\@[0-9]/gi) !== null) {										// link-type: link-file     ==> a[attr-flink]
11315						glink_target = '';
11316					} else if($.inArray(glink.replace(/^\//g,'').replace(/ /g,'-'),_this.b.MENULIST) > -1) {	// link-type: link-menu     ==> a[data-user-link]
11317					} else {																					// link-type: link-out      ==> a[attr-link]
11318						if(checkBase64Encode(glink)) glink = Base64.decode(glink);
11319					}
11320				}
11321
11322				$(c).find('a').removeAttr('data-gallery').removeAttr('data-user-link').removeAttr('attr-bookmark').removeAttr('attr-link').removeAttr('attr-flink');
11323				if (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON' && property['SITEUM'] >= 1) {
11324					$(c).addClass('gallery-item').addClass('nonePrice');
11325					$(c).find('a').attr('href', '#');
11326				} else {
11327					if(glink) {
11328						var glink_val = makeLinkUrl(glink, _this.b.ONE, _this.b.VIEW);
11329						$(c).find('a').attr('href',glink_val);
11330
11331						if(glink.match(/^\@/g) !== null) {
11332							$(c).find('a').attr('attr-bookmark',glink.replace(/^\@/g,''));
11333						} else if(glink.match(/^flink\@[0-9]/g) !== null) {
11334							$(c).find('a').attr('attr-flink',glink.replace(/^flink\@/g,''));
11335						// IE ERROR_includes__H.20210603
11336						// } else if(_this.b.MENULIST.includes(glink.replace(/ /g,'-'))) {
11337						} else if($.inArray(glink.replace(/ /g,'-'),_this.b.MENULIST) > -1) {
11338							$(c).find('a').attr('data-user-link',glink_val);
11339						} else {
11340							$(c).find('a').attr('attr-link',glink);
11341						}
11342					} else {
11343						if (el.mode == 'gallery') {
11344							src_s0 = src_s0 + '?gpos='+v.pos;
11345
11346							$(c).find('a').attr('href', src_s0);
11347							$(c).find('a').attr('data-gallery', '#gframe-' + el.seq);
11348						} else {
11349							if(el.seq == "all_products") {
11350								$(c).find('a').attr('href', v.product_url);
11351							} else {
11352								if(typeof URI == 'function') URI = '/';
11353								if(_this.b.LUX && el.mode == 'shopping') $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/_product/' + v.seq);
11354								else $(c).find('a').attr('href', ((_this.b.URL=='/') ? '' : _this.b.URL) + '/' + _this.b.PAGE + '/view/' + v.seq);
11355							}
11356						}
11357					}
11358				}
11359
11360				if(glink_target == '_blank') $(c).find('a').attr('target','_blank');
11361				else $(c).find('a').removeAttr('target');
11362
11363				if(checkGFrameTitleOFF || !isTitle) $(c).find('a').attr('data-title', '');
11364				else $(c).find('a').attr('data-title', v.title);
11365
11366				// if(adultonly_onoff == 'ON') $(c).addClass('adultonly');
11367
11368				// caption
11369				var ftitle = $(c).find('h5.figure'),
11370					fcaption = $(c).find('p.figure').not('.comment'),
11371					fdatetime = $(c).find('.figure.datetime'),
11372					fhashtag = $(c).find('.figure.hashtag'),
11373					fbrand = $(c).find('.figure.brand'),
11374					fprice = $(c).find('.figure.price'),
11375					freview = $(c).find('.figure.review'),
11376					fcomment = $(c).find('.figure.comment'),
11377					flike = $(c).find('.figure.like'),
11378					fbasket = $(c).find('.figure.basket');
11379
11380				$(c).find('figcaption').removeClass('hide');
11381				
11382				if (v.title || v.caption) {
11383					var gallery_caption = v.caption;
11384					gallery_caption = gallery_caption.trim().replace(/\n/g,'<br />');
11385					
11386					ftitle.html(v.title);
11387					fcaption.html(gallery_caption);
11388					if(fdatetime.length > 0) fdatetime.text(v.datetime);
11389					if(fhashtag.length > 0) fhashtag.text(v.hashtag);
11390				}
11391
11392				if(g_number) {
11393					var g_index = String(index + 1),
11394						g_num = g_index.padStart(g_number, '0');
11395					$(c).find('.figure.number').text(g_num);
11396				}
11397
11398				if(fbrand.length > 0) {
11399					var fbrand_name = (typeof v.brand_name != 'undefined' && v.brand_name) ? v.brand_name : '';
11400					fbrand.html(v.brand_name);
11401				}
11402
11403				if(el.mode == 'shopping' || el.seq == 'all_products') {
11404					fcomment.addClass('hide');
11405					flike.addClass('hide');
11406
11407					v.price = typeof v.price != 'undefined' ? parseFloat(v.price) : 0;
11408					v.sale = typeof v.sale != 'undefined' ? parseFloat(v.sale) : 0;
11409
11410					var checkPriceHidden = (typeof v.price_hidden != 'undefined' && v.price_hidden == 'ON') ? true : false,
11411						gallery_price = (v.price && !checkPriceHidden) ? v.price : 0,
11412						gallery_sale_price = (typeof v.sale != 'undefined' && v.sale > 0 && v.sale > v.price && !checkPriceHidden) ? v.sale : 0,
11413						gallery_sale_per = (typeof v.sale_per != 'undefined' && v.sale_per && !checkPriceHidden) ? v.sale_per+'%' : '',
11414						product_soldout = '품절',
11415						product_no_sale = (typeof g_settings.sh_soldout == 'string') ? g_settings.sh_soldout : '구매불가',
11416						product_status = '';
11417					if(v.status == 'off' && !checkPriceHidden) {
11418						product_status = '<span class="cl-sh-soldout">' + product_no_sale + '</span>';
11419					} else if(v.quantity_on == 'on' && v.quantity < 1 && !checkPriceHidden) {
11420						product_status = '<span class="cl-sh-soldout">' + product_soldout + '</span>';
11421					}
11422
11423					$(c).find('.cl-sh-soldout').remove();
11424					if(product_status != '') $(c).attr('data-soldout',true);
11425					else $(c).removeAttr('data-soldout');
11426
11427					$(c).find('.product-badge').remove();
11428					product_status += drawBadgeList(v.use_badge, data.badge_settings);
11429
11430					$(c).find('.cl-sh-limit').remove();
11431					if(v.status == 'lim') {
11432                        if(v.sale_now == false) {
11433                            var product_limit = '<p class="cl-sh-limit">상품 구매 가능 기간이 아닙니다.</p>';
11434                            if(freview.length > 0) {
11435                                freview.after(product_limit);
11436                            } else {
11437                                $(c).find('figcaption:not(.top) .figure:last-child').after(product_limit);
11438                            }
11439                        }
11440                    }
11441
11442					if($(c).find('ul.figure.price').length > 0) {
11443						// var price_off = (v.sale_price > 0 && v.sale_price > v.price) ? 100 - Math.floor((v.price / v.sale_price) * 100) : 0,
11444						//         off_str = (price_off > 0) ? price_off + '% ' : ''
11445						var off_str = (v.sale_rate > 0) ? v.sale_rate + '% ' : '';
11446						if(!_this.b.LUX) off_str = gallery_sale_per;
11447						//Ver2
11448						if(!checkPriceHidden) {
11449							$(c).find('ul.figure.price .price-val').html('₩' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
11450							$(c).find('ul.figure.price .price-val').removeClass('hide');
11451
11452							if(gallery_sale_price > 0 && gallery_price < gallery_sale_price) {
11453								$(c).find('ul.figure.price .price-sale').html('₩' + gallery_sale_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,','));
11454								$(c).find('ul.figure.price .price-sale-per').html(off_str);
11455								$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').removeClass('hide');
11456								if(_this.b.LUX && (v.hashtag).indexOf('특가세일') > -1 && $(c).find('ul.figure.price .sp-price').length == 0) {
11457									$(c).find('ul.figure.price .price-sale').after('<li class="sp-price">특가세일</li>');
11458								}
11459							} else {
11460								$(c).find('ul.figure.price .price-sale, ul.figure.price .price-sale-per').addClass('hide').html('');
11461							}
11462
11463							$(c).find('ul.figure.price .price-unit-pricing').remove();
11464							if(v.product_unit_str) {
11465								$(c).find('ul.figure.price').append(`<li class="price-unit-pricing">${v.product_unit_str}</li>`); // 단위당 가격
11466							}
11467						} else {
11468							$(c).find('ul.figure.price .price-val').html('₩0');
11469							$(c).find('ul.figure.price .price-val').addClass('hide');
11470						}
11471						if(el.seq == 'all_products' && checkPriceHidden) $(c).find('ul.figure.price').html('');
11472						if(product_status) $(c).find('ul.figure.price').append('<li>'+product_status+'</li>');
11473
11474						var badge_size = getBadgeSize(data.badge_settings);
11475						$(c).find('.cl-sh-soldout').removeClass('badge-small badge-medium badge-large');
11476						$(c).find('.cl-sh-limit').removeClass('badge-small badge-medium badge-large');
11477						if(badge_size) {
11478							$(c).find('.cl-sh-soldout').addClass(badge_size);
11479							$(c).find('.cl-sh-limit').addClass(badge_size);
11480						}
11481					} else {
11482						//Ver1
11483						if(fprice.length == 0) fprice = fcaption;
11484						if(checkPriceHidden) fprice.html('');
11485						else fprice.html('<span class="figure-krw">₩</span>' + gallery_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + product_status);
11486					}
11487
11488					if($(c).find('ul.figure.review').length > 0) {
11489						var gallery_review = (v.review_onoff && v.review_cnt) ? v.review_cnt : 0;
11490						if(gallery_review > 0) {
11491							$(c).find('ul.figure.review, ul.figure.review li').removeClass('hide');
11492							$(c).find('ul.figure.review .figure-review-cnt').html(gallery_review);
11493							$(c).find('ul.figure.review .figure-review-score').html(v.review_score);
11494						} else {
11495							$(c).find('ul.figure.review, ul.figure.review li').addClass('hide');
11496							$(c).find('ul.figure.review .figure-review-cnt, ul.figure.review .figure-review-score').html('');
11497						}
11498					}
11499
11500					if(fbasket.length > 0) {
11501						var checkOldBlock = ($(c).find('.figure.basket[data-oldver="true"]').length > 0) ? true : false,
11502							checkOldverBasket = (typeof field_oldver != 'undefined' && field_oldver && field_oldver.indexOf('basket') > -1) ? true : false,
11503							checkDisabledBasket = (typeof field_disable != 'undefined' && field_disable && field_disable.indexOf('basket') > -1) ? true : false;
11504						if(v.basket_off) fbasket.addClass('cannotby hide');
11505						else if(el.seq == 'all_products') fbasket.removeClass('hide');
11506						else if(checkDisabledBasket || (!checkDisabledBasket && checkOldBlock && !checkOldverBasket)) fbasket.addClass('hide');
11507						else if(property.VALIDTYPE != 'SM') fbasket.addClass('hide');
11508						else fbasket.removeClass('hide');
11509					}
11510
11511				} else {
11512					fbrand.addClass('hide');
11513					fprice.addClass('hide');
11514					freview.addClass('hide');
11515					fbasket.addClass('hide');
11516
11517					if ( checkUseComment 
11518						&& g_settings.comment_display == 'ON'
11519						&& !(field_disable !== undefined && field_disable.indexOf('comment') > -1)
11520						&& fcomment.length > 0
11521						&& (typeof v.comment_cnt != 'undefined' && v.comment_cnt > 0)
11522					) {
11523						fcomment.removeClass('hide');
11524						fcomment.find('.figure-comment-cnt').html(v.comment_cnt);
11525					} else {
11526						fcomment.addClass('hide');
11527						fcomment.find('.figure-comment-cnt').empty();
11528					}
11529
11530					if ( checkUseLike 
11531						&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
11532						&& !(field_disable !== undefined && field_disable.indexOf('like') > -1)
11533						&& flike.length > 0
11534					) {
11535						flike.removeClass('hide').find('.figure-like-cnt').html(0);
11536						if(v.like !== undefined) {
11537							flike.find('.figure-like-cnt').html(v.like.cnt);
11538							if (v.like.own && v.like.cnt > 0) flike.attr('data-like', v.seq).addClass('active');
11539						}
11540					} else {
11541						flike.addClass('hide');
11542					}
11543				}
11544				
11545				if(checkUseLike == false) flike.html('');
11546
11547				if(el.mode == 'gallery') {
11548					if(index < data.view) {
11549						$(p).find('[data-loop="true"]').append($(c)[0].outerHTML); 
11550					} else {
11551						$(c).find('figure').remove();
11552						$(g).find('[data-loop="true"]').append($(c)[0].outerHTML);
11553					}
11554					if (total == 2) {
11555						$(c).find('figure').remove();
11556						$('.gallery-empty').append($(c)[0].outerHTML);
11557					}
11558				} else {
11559					$(p).find('[data-loop="true"]').append($(c)[0].outerHTML);
11560				}
11561			});
11562		} else {
11563			checkGalleryListSample = true;
11564			if(el.mode=='project' && _this.b.TEMPLATE == false) {
11565				nodes.addClass('gallery-item');
11566				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);
11567			}
11568			if(_this.b.TEMPLATE !== false) {
11569				if ( checkUseComment 
11570					&& g_settings.comment_display == 'ON'
11571					&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('comment') > -1)
11572				) {
11573					nodes.find('.figure.comment').removeClass('hide');
11574				} else {
11575					nodes.find('.figure.comment').addClass('hide');
11576				}
11577
11578				if ( checkUseLike 
11579					&& (g_settings.like_display !== undefined && g_settings.like_display != 'N')
11580					&& !(g_settings.field_disable !== undefined && g_settings.field_disable.indexOf('like') > -1)
11581				) {
11582					nodes.find('.figure.like').removeClass('hide');
11583				} else {
11584					nodes.find('.figure.like').addClass('hide');
11585				}
11586			}
11587			$(p).find('[data-loop="true"]').append(nodes);
11588
11589			if(_this.b.LUX) {
11590				category_onoff = 'ON';
11591				checkGalleryListSample = false;
11592			}
11593		}
11594		if(checkLoadmoreInLoop) $(p).find('[data-loop="true"]').append(glm);
11595
11596        var tag = $(p)[0].outerHTML;
11597        var $galleryEL = $('.element[data-id="' + el.seq + '"]');
11598
11599		if (el.mode == 'gallery' && total == 2) {
11600			$.each($('.gallery-empty').find('.gallery-item'), function(i,v) {
11601				$(g).find('[data-loop="true"]').append(v);
11602			});
11603		}
11604
11605		if (el.mode == 'gallery' && total) tag = appendGalleryFrame($(tag), el.seq, el.type, g_settings);
11606		$galleryEL.html($(tag).html()).removeClass('preloading');
11607		setOldVerBlockView($galleryEL,el);
11608
11609		$('#el-empty').empty();
11610		$('.gallery-empty').remove();
11611
11612		var $tag = $galleryEL.find('.shop-filter-header');
11613		if($tag.length) shopHeaderDisplay($tag,data);
11614
11615		$galleryEL.attr('data-category',category_onoff);
11616		$galleryEL.attr('data-gallery-sort',gallery_sort);
11617		
11618		if(category_onoff == 'ON' || gallery_sort == 'product') {
11619			initGToolbar($galleryEL, {id:el.seq, settings:g_settings});
11620		}
11621
11622		showHideGalleryField($galleryEL,g_settings);
11623		reloadBlockMasonry('init',$galleryEL);
11624
11625		var $glmBtnWrap = $galleryEL.find('.loadmore-wrap');
11626		var $glmBtn = $galleryEL.find('.loadmore-wrap .gallery-loadmore');
11627		var checkLoadmore = (total > view && total > cookie_view && !checkGalleryListEmpty) ? true : false;
11628		var glm_lang = LANG;
11629
11630		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();
11631		else if(typeof block_lang != 'undefined' && $.inArray(block_lang, ['ko','en']) > -1) glm_lang = block_lang;
11632		var glm_txt = $.lang[glm_lang]['config.loadmore'];
11633
11634		if($glmBtnWrap.length == 0) {
11635			// gallery loadmore btn - default (ver1)
11636			if(checkLoadmore) {
11637				var glm_class = (el.feature=='masonry') ? 'gallery-loadmore masonry-layout' : 'gallery-loadmore',
11638				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>';
11639
11640				if($galleryEL.find('.gallery-loadmore').length > 0) $galleryEL.find('.gallery-loadmore').replaceWith(glm_btn);
11641				else $galleryEL.append(glm_btn);
11642			} else $galleryEL.find('.gallery-loadmore').remove();
11643
11644		} else {
11645			// gallery loadmore btn - custom (ver2)
11646			if(checkLoadmore) {
11647				if(el.feature=='masonry') $glmBtn.addClass('masonry-layout');
11648				else $glmBtn.removeClass('masonry-layout');
11649				$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);
11650				$glmBtn.find('.label').text(glm_txt);
11651				$glmBtn.find('.display .view').text(cookie_view);
11652				$glmBtn.find('.display .total').text(total);
11653				$glmBtnWrap.removeClass('hide').fadeIn();
11654			} else {
11655				$glmBtnWrap.fadeOut().addClass('hide');
11656				$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');
11657				$glmBtn.find('.label').text(glm_txt);
11658				$glmBtn.find('.display .view').text('0');
11659				$glmBtn.find('.display .total').text('0');
11660			}
11661		}
11662
11663		if(el.seq == 'all_products') {
11664			if(property.ONE) $galleryEL.addClass('link-to-전체상품');
11665			setGToolbarAllProducts($galleryEL, g_settings, el.total.list_total);
11666		}
11667
11668		if($galleryEL.has('input.gjs').length) setGalleryJS('load-loop',$galleryEL);
11669	},
11670	forumUpdate : function(pid,page_num,view,page,data) {
11671		if(page_num > 1) {
11672			$.forum.init(pid, page, view, page_num,'', '', '');
11673		} else {
11674			$.forum.set(pid, page_num, view, page, '', '', '',data);
11675		}
11676	},
11677	displayComment : function(viewData) {
11678		if (typeof viewData == 'undefined' || !viewData) viewData = {};
11679		var checkUrl = this.b.PAGE.split(',');
11680		var type = (checkUrl[0] == 'forum') ? 'F' : 'P';
11681		var check_view_empty = (this.b.VIEW && this.b.COUNT == 1 && $('.error_404.element[data-name="error_404"]').length == 1) ? true : false;
11682		if(type == "P" 
11683			&& (this.b.COUNT == 0 || check_view_empty)
11684		) {
11685			$('.error_404.element[data-name="error_404"] *[data-lang]').each(function() {
11686				$(this).html($.lang[LANG][$(this).attr('data-lang')]);
11687			});
11688			return false;
11689		}
11690
11691	    var option = (this.b.PARENT.settings) ? jQuery.parseJSON(this.b.PARENT.settings) : {};  
11692
11693	    if(type == 'F') {
11694			if($.isEmptyObject(viewData) && this.b.PARENT.settings) viewData = {elsettings: jQuery.parseJSON(this.b.PARENT.settings)};
11695			let tmp_elsettings = getOrDefault(viewData,'elsettings',{});
11696	    	let tmp_fmsettings = getOrDefault(viewData,'fm_settings',{});
11697
11698			let comment_display = 'ON';
11699			if(getOrDefault(tmp_fmsettings,'comment_display','') != '') comment_display = tmp_fmsettings.comment_display;
11700			else if(getOrDefault(tmp_elsettings,'comment_display','') != '') comment_display = tmp_elsettings.comment_display;
11701
11702		    if(comment_display == 'OFF') return false;
11703	    } else {
11704			if(typeof option.comment_display == 'undefined' || option.comment_display == 'OFF') return false;
11705	    }
11706	     
11707	    $.comment.init();
11708	},
11709	loaded : function() {
11710		var b = _this.b;
11711		if($('body').width() <= 768 && $('.dsgn-body').hasClass('sidebar')) {
11712			if($('header.navbar').hasClass('sidebar')) {
11713				cssSidebar('off');
11714			}
11715			//$('.dsgn-body').removeClass('sidebar').addClass('removed-sidebar');
11716		} else if ($('body').width() > 768 /*&& $('.dsgn-body').hasClass('removed-sidebar')*/) {
11717			if($('header.navbar').hasClass('sidebar')) {
11718				cssSidebar('on');
11719			}
11720			//$('.dsgn-body').removeClass('removed-sidebar').addClass('sidebar');
11721		}
11722
11723		$('.carousel').live('click',function(){
11724		    $('.carousel').carousel('cycle');
11725		});
11726
11727		$('.carousel').live({
11728			click: function() {
11729				$('.carousel').carousel('cycle');
11730			},
11731			hover:  function(){
11732				$('.carousel').carousel('cycle');
11733			}
11734		});
11735
11736        $('.carousel').carousel({
11737        	pause: 'none'
11738        });
11739
11740        $('[data-fixed-width]').each(function() {
11741            $(this).css('width',$(this).attr('data-fixed-width')+'px');
11742        });
11743        
11744        SCREEN = getScreen();
11745        var targetUrl = document.URL,
11746        	isMoveLink = targetUrl.match(/#/g);
11747
11748        $('.menu-logo-top').show();
11749
11750    	if(typeof $.cookie('gallery-item') != 'undefined' && b.VIEW == '') {
11751    		moveGallery($.cookie('gallery-item'));
11752    	} else if(typeof $.cookie('forum-item') != 'undefined' && b.VIEW == '') {
11753    		// console.log('loaded', 'fm_view', $.cookie('forum_content_view'));	
11754    		if(typeof $.cookie('forum_content_view') != 'undefined'){
11755                var fm_view = $.cookie('forum_content_view');
11756                var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
11757                var pid = (fv)? fv[0]:'';
11758                var row_id = (fv)? fv[1]:'';
11759
11760                setTimeout(function(){
11761                	scrollToBlock('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
11762                }, 500);
11763    			$.removeCookie('forum-item', { path : '/' });
11764
11765                // $('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
11766            } else {
11767            	scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
11768    			$.removeCookie('forum-item', { path : '/' });
11769            }
11770    	}   
11771
11772    	if($('body').width() > 768) {
11773    		$('.form-date').attr('type','text');
11774    		$('.form-date').attr('maxlength','2');
11775    		$('.date-yyyy').attr('maxlength','4');
11776    	}
11777
11778        $.modalOFF();
11779	},
11780	loadPage : function(page) {
11781
11782	}
11783}
11784
11785
11786var mobileWebfnavCheck = function(vpmode) {
11787	var checkFnav = ($('.fnav').length > 0 && vpmode=="mobile_web") ? true : false,
11788		WebType = isMobile();
11789                
11790	if(checkFnav && WebType) {
11791		$('.fnav.fnav-mobile-fnav').css('margin-bottom','53px');
11792		$('.element.el-footer').css('margin-bottom','100px');
11793	} else {
11794		$('.mobilepc_ch').css('margin-bottom','0px');
11795		$('.element.el-footer').css('margin-bottom','0px');
11796	}	
11797	
11798	if(WebType) {
11799		$('.element.el-footer').addClass('mpcwebheight');	
11800		$.mpcWeb.mpcMusicandGoTop(checkFnav,vpmode); 
11801	}
11802}
11803var mobileProductBtnPosition = function(property,device_type) {
11804	var quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight();
11805
11806	if(device_type=='mobile') {
11807		var quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight(),
11808			productBtn_height = $('.m-product-btn').innerHeight(),
11809			productBtn_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? quick_height : '';
11810
11811		if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') $('.m-product-btn, .product-detail-btn').css('bottom',productBtn_position);
11812		else $(`.quick-menu-${property.SID}.quickmenu`).css('bottom',productBtn_height+30);
11813
11814	}
11815}
11816
11817var mobileWebQuickmenuPosition = function(property,device_type) {
11818	var check_music = (typeof property.SETTINGS.musicUse != 'undefined' && (property.SETTINGS.musicUse === true || property.SETTINGS.musicUse == 'true')) ? true : false,
11819		el_fixedheight = (typeof $.cookie(`fixedcontact-${property.SID}`) != 'undefined' && $.cookie(`fixedcontact-${property.SID}`) == 'off') ? 0 : $('.element.el-fixedcontact').innerHeight(),
11820		el_fixedonoffHeight = 22,
11821		quick_height = $(`.quick-menu-${property.SID}.quickmenu`).innerHeight(),
11822		mpc_height = (typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) ? $('.mobilepc_ch').innerHeight() : 0,
11823		check_mpc = (typeof property.SETTINGS.viewportMode != 'undefined' && property.SETTINGS.vpMode_onoff===true) ? true : false,
11824		quick_position = 12,
11825		gotop_position = 0,
11826		gotoTop_position = '';
11827
11828	el_fixedblockheight = el_fixedheight + el_fixedonoffHeight;
11829
11830	if($('.element.el-fixedcontact').length>0) {
11831		if(device_type=='pc') {
11832			gotop_position = el_fixedblockheight + 33;
11833		} else {
11834			var fixed_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? quick_height : '';
11835			quick_position = (check_music) ? el_fixedblockheight + 45 : el_fixedblockheight + 30;
11836			quick_position = ($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') ? 0 : quick_position;
11837			
11838			if(check_mpc) {
11839				var webtype = $.mpcWeb.mpcCheckWebType();
11840				if(webtype=='MOBILE') {											
11841					quick_position = (check_music) ? mpc_height + el_fixedblockheight + 45 : mpc_height + el_fixedblockheight + 10;
11842					if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') {
11843						quick_position = mpc_height;
11844						fixed_position = fixed_position + mpc_height;
11845					}
11846				}
11847			} 
11848			$('.element.el-fixedcontact').css('bottom',fixed_position);	
11849		}
11850	} else {
11851		gotop_position = (device_type=='pc') ? 42 : gotop_position;
11852		quick_position = '';
11853		if(check_mpc) {
11854			var webtype = $.mpcWeb.mpcCheckWebType();
11855			if(webtype=='MOBILE') {	
11856				if($.quickmenu['quickmenu']['img_type'][device_type]=='bottom_default') {
11857					quick_position = mpc_height;
11858				}
11859				else quick_position = (check_music) ? mpc_height + 45 : mpc_height + 30;
11860			}
11861		} 
11862	}
11863
11864	if(device_type=='pc') {
11865		$('#goto-top').css('bottom',gotop_position);
11866		quick_position = gotop_position + $('#goto-top').outerHeight() + 30;
11867
11868		if(check_mpc) {
11869			var webtype = $.mpcWeb.mpcCheckWebType();
11870			if(device_type=='pc' && webtype=='MOBILE') {
11871				quick_position = quick_position + mpc_height;
11872				$('.element.el-fixedcontact').css('bottom','');	
11873				$('#goto-top').css('bottom',gotop_position + mpc_height);
11874			}
11875		}
11876		
11877	} 
11878	
11879	$(`.quick-menu-${property.SID}.quickmenu`).css('bottom',quick_position);	
11880}
11881
11882var quickMenuMusicPosition = function(property) {
11883	var sid = (typeof property != 'undefined') ? property.SID : SID,
11884		vpModeOnoff = (property.SETTINGS.vpMode_onoff === true) ? true : false,
11885		webType = $.mpcWeb.mpcCheckWebType(),
11886		quick_type = ($('body').width() > 768) ? 'pc' : 'mobile';
11887
11888	var el_fixedheight = (typeof $.cookie(`fixedcontact-${sid}`) != 'undefined' && $.cookie(`fixedcontact-${sid}`) == 'off') ? 0 : $('.element.el-fixedcontact').innerHeight(),
11889		mpc_height = (vpModeOnoff && webType == 'MOBILE') ? $('.mobilepc_ch').innerHeight() : 0,
11890		el_fixedonoffHeight = 22,                
11891		el_fixedblockheight = 0,
11892		quick_position = 0,
11893		music_position = 5;
11894
11895	el_fixedblockheight = el_fixedheight + el_fixedonoffHeight;
11896	
11897
11898	if($('.element.el-fixedcontact').length > 0) {
11899		if(quick_type=='pc') {
11900			music_position = el_fixedheight + 5;
11901		} else {
11902			var quick_height = (typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][quick_type]=='bottom_default') ? $(`.quick-menu-${sid}.quickmenu`).innerHeight() : 0;
11903			music_position = quick_height + el_fixedblockheight + 5;                    
11904			quick_position = music_position + $('#cl-music-player-icon').outerHeight() + 5;
11905	
11906			if(vpModeOnoff && webType == 'MOBILE') {	
11907				quick_position = mpc_height + quick_position;
11908			} 
11909			
11910			if(typeof $.quickmenu['quickmenu'] != 'undefined' && $.quickmenu['quickmenu']['img_type'][quick_type]!='bottom_default') $(`.quick-menu-${sid}.quickmenu`).css('bottom',quick_position);	
11911		}  
11912
11913		if(vpModeOnoff && webType == 'MOBILE') {	
11914			music_position = music_position + mpc_height;		
11915			quick_position = mpc_height + quick_position;
11916		} 
11917	} 
11918	$('#cl-music-player-icon, #cl-music-container').css('bottom',music_position);
11919}
11920
11921var setlimitdiskPopup = function() {
11922	var icon = '<i class="site-space-icon fa fa-exclamation-circle"></i>',
11923		str = '<div class="site-space-disk">\
11924					<p>'+$.lang[LANG]['plan.disk-space.popup.limit.contents']+'</p>\
11925				</div>\
11926				';
11927
11928	$(this).showModalFlat(icon + $.lang[LANG]['plan.disk-space.popup.limit.title'], str,false,false).addClass('flat-site-spacelimit-modal');
11929	$('.modal-backdrop.in').css('opacity','0');
11930}
11931
11932var setSitePopup = function() {
11933    if(typeof property.SETTINGS != 'undefined' && property.SETTINGS.showPopup === true && typeof property.SETTINGS.sitePopup != 'undefined' && property.SITELOCK != 'true') {
11934        sitePopupOpen();
11935    }
11936}
11937
11938var sitePopupOpen = function(idx,data) {
11939	var site_popup = (typeof data != 'undefined' & data) ? data : new Array();
11940	if(site_popup.length == 0)  site_popup = (typeof property.SETTINGS.sitePopup != 'undefined' && property.SETTINGS.sitePopup) ? property.SETTINGS.sitePopup : site_popup;
11941	if(site_popup.length > 0) {
11942        $('.refresh-popup').show().removeAttr('style');
11943        var isShow = true;
11944
11945		if(typeof idx != 'undefined') {
11946			if($('#'+property.SID+'Popup'+idx).length == 0) isShow = false;
11947			else $('#'+property.SID+'Popup'+idx).fadeIn();
11948		} else {
11949
11950			if($('.site-popup .modal-popup').length > 0) { 
11951				$('.site-popup .modal-popup').fadeIn();
11952			} else { 
11953				isShow = false; 
11954			}
11955		}
11956
11957		if(!isShow) {
11958	        var modal = $(this).showPopupModal(site_popup,property.SID);
11959	        return modal;
11960	    }
11961	}
11962}
11963
11964var sitePopupResize = function() {
11965
11966	if($('.popup').find('.modal-popup').length == 0) return false;
11967	
11968	var img_w = new Array(),
11969		total_w = 0,
11970		add_w = 0,
11971		d_m = ($('.popup-modal').hasClass('popupimg-overflow-y')) ? 30 : 15;
11972		d_top = $('.header.el-menu').outerHeight() + 15,
11973		d_left = 0,
11974		x = 0, y = 0, y_r = 0;
11975
11976	$('.modal-popup').each(function(i) {
11977		if($(this).css('display') != 'none') {
11978			img_w[i] = $(this).width();
11979			total_w += img_w[i] + d_m;
11980		}
11981	});
11982
11983
11984	var isOverflow = ($('.dsgn-body').width() < (Number($('.popup-modal').children().eq(0).css('left').replace('px',''))+total_w)) ? true : false,
11985		display_i = -1;
11986
11987	if(isOverflow) { $('.popup-modal').addClass('popupimg-overflow-y');
11988	} else { $('.popup-modal').removeClass('popupimg-overflow-y'); }
11989
11990	$('.modal-popup').each(function(i) {
11991		if($(this).css('display') != 'none') {
11992			display_i++;
11993
11994			if(isOverflow) {
11995				x = (display_i==0) ? d_top : d_top + (display_i*30);
11996				y = d_left + ((display_i+1)*30);
11997				y_r = 120 - y;
11998
11999				img_w[i] = 'auto';
12000			} else {
12001				d_left = ($('.dsgn-body').width() - total_w)/2;
12002
12003				x = d_top;
12004				y = d_left + add_w + (i*15);
12005			}
12006			add_w = add_w + $(this).width();
12007
12008			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]};
12009			$(this).css(css_val);
12010		}
12011	});
12012
12013}
12014
12015
12016var activeEL = function(el) {
12017    if(typeof el == 'undefined' || el=='') return;
12018    // header_fixed = $('header.navbar').height();
12019    // var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
12020    // $('body').scrollTo('.'+el,0,{offset:offset});
12021   	scrollToBlock('.'+el);
12022}
12023
12024var setLoginoutNav = function (sid, callback) {
12025	$('.creatorlink-header').remove();
12026	$('#tpl-menu li.loginout').remove();
12027	var str = '<div class="creatorlink-header">\n';
12028	str = str + '<div class="logo-text col-md-4 col-sm-6">\n';
12029	str = str + '	<a href="http://creatorlink.net"><img src="https://storage.googleapis.com/i.addblock.net/main/site_creatorlink_logo.png" alt="" /></a>\n';
12030	str = str + '</div>\n';
12031	str = str + '<div class="data-site col-md-4 col-sm-6 col-xs-6">\n';
12032	str = str + '	<ul>\n';
12033	str = str + '		<li class="profile-img"></li>\n';
12034	str = str + '		<li><span class="text">' + sid + '</span></li>\n';
12035	str = str + '	</ul>\n';
12036	str = str + '</div>\n';
12037	str = str + '<div class="data-user col-md-4 col-sm-6 col-xs-6">\n';
12038	str = str + '	<ul class="pull-right">\n';
12039	str = str + '		<li class="profile-img"></li>\n';
12040	str = str + '		<li><span class="caret"></span></li>\n';
12041	str = str + '	</ul>\n';
12042	str = str + '	<div class="message"></div>\n';
12043	str = str + '</div>\n';
12044	str = str + '</div>\n';
12045	str = str + '\n';
12046	str = str + '\n';
12047	$('.header.el-menu').before(str);
12048	var top = ($('header').hasClass('transparent')) ? '0' : '55px';
12049	$('.header.el-menu').css('top',top);
12050	if(top == '0') $('.creatorlink-header + .popover + .fixed-position').css('top','0');
12051
12052	if(typeof callback == 'function') callback();
12053}
12054
12055var getProfileAuthor = function(sid,img) {
12056	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;
12057	var str = 		'<span class="hexagon">\n';
12058		str = str + '	<svg viewBox="0 0 32 32">\n';
12059		str = str + '		<pattern id="pfimg-" + sid +"" patternUnits="userSpaceOnUse" width="32" height="32">\n';
12060		str = str + '			<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href=""+imgstr+"" x="-2px" y="-2px" width="36" height="36"></image>\n';
12061		str = str + '		</pattern>\n';
12062		str = str + '		<polygon points="16 0 30 8 30 24 16 32 2 24 2 8" fill="url(#pfimg-" + sid +")"></polygon>\n';
12063		str = str + '	</svg>\n';
12064		str = str + '</span>\n';
12065	$('.data-site .profile-img').append(str);
12066}
12067
12068var getProfileMember = function() {
12069	$.getJSON('/template/checkLogin', function(data) {
12070		// if(!data.user) { }
12071		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;
12072		var str = 		'<span class="hexagon">\n';
12073			str = str + '	<svg viewBox="0 0 32 32">\n';
12074			str = str + '		<pattern id="pfimg-" + data.user +"" patternUnits="userSpaceOnUse" width="32" height="32">\n';
12075			str = str + '			<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href=""+imgstr+"" x="-2px" y="-2px" width="36" height="36"></image>\n';
12076			str = str + '		</pattern>\n';
12077			str = str + '		<polygon points="16 0 30 8 30 24 16 32 2 24 2 8" fill="url(#pfimg-" + data.user +")"></polygon>\n';
12078			str = str + '	</svg>\n';
12079			str = str + '</span>\n';
12080		$('.data-user .profile-img').append(str);
12081		$('.data-user .profile-img').addClass('user-'+data.name);
12082		$('.data-user .user-name').append('<span>'+data.name+'</span>');
12083		// $('.data-user .logoutlink').before('<span>You&apos;re logged in as '+data.name+' </span>');
12084
12085		var str3_mysite = '';
12086		if($('.data-site ul li span.text').text() == data.sid) {
12087			$('.data-site').text('');
12088			var isNewmessage = (data.newCount == 0 ) ? false : true;
12089			var str2 = 		'<ul class="sub-menu pull-right">\n';
12090				str2 = str2 + '	<li class="newCount">\n';
12091				str2 = str2 + '		<a href="/message/lists"><i class="fa fa-envelope"></i>\n';
12092				if(isNewmessage) str2 = str2 + '<span class="badge">"+data.newCount+"</span>\n';
12093				str2 = str2 + '</a>\n';
12094				str2 = str2 + '	</li>\n';
12095				str2 = str2 + '</ul>\n';
12096			$(".data-user .message").append(str2);
12097		} else {
12098			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';
12099		}
12100
12101		var str3 = 		'<div class="popover bottom" id="pop"+data.name+"">\n';
12102			str3 = str3 + '	<div class="arrow"></div>\n';
12103			str3 = str3 + '	<div class="popover-content">\n';
12104			str3 = str3 + '		<div class="user-name">"+data.name+"</div>\n';
12105			str3 = str3 + str3_mysite;
12106			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';
12107			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';
12108			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';
12109			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';
12110			str3 = str3 + '	</div>\n';
12111			str3 = str3 + '	</div>\n';
12112		$('.creatorlink-header').after(str3);
12113
12114	});
12115}
12116
12117var pageHeight = function() {
12118    $('.page-comments').css('margin-top','0px');
12119    $('.el-footer').css('margin-top','0px');
12120    var docHeight = $('.dsgn-body').height();
12121    $('.dsgn-body').wrapInner('<div class="dsgn-body-wrap"></div>');
12122    var dsgnHeight = $('.dsgn-body-wrap').height();
12123    var diff = docHeight - dsgnHeight;
12124    $('.dsgn-body > .dsgn-body-wrap').contents().unwrap();
12125    return (diff>0) ? diff : 0;
12126}
12127
12128var setHeight = function(height) {
12129	if(typeof property.VIEW == 'undefined' || property.VIEW == "") return false;
12130    if(height>0) {
12131        height = (typeof MODE == 'undefined') ? height : height-35;
12132        if($('.page-comments').length) {
12133            $('.page-comments').css('margin-top',height+'px');
12134		} else if($('.page-bottomlist').length) {
12135			$('.page-bottomlist').css('margin-top',height+'px');
12136        } else if($('.el-footer').length) {
12137            $('.el-footer').css('margin-top',height+'px');
12138        }
12139    }
12140}
12141
12142var makeLinkUrl = function(link, one, view) {
12143	var link_url = '',
12144		link_val = '',
12145		is_menu = ($.inArray(link.replace(/^\//g, '').replace(/ /g, '-'), property.MENULIST) > -1) ? true : false,
12146		regex = /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/,
12147		regex2 = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,7}(\:[0-9]+)?(\/\S[^\{\}]*)?$/;
12148
12149	if (one) {
12150    	link_url = (view) ? '/#' : '#';
12151    	link_url = (view && !property.PUBLISH) ? '/render/index#' : link_url;
12152    	if(is_menu) link_url = '/';
12153	} else {
12154        link_url = (property.URI=='/' || is_menu) ? '/' : property.URI + '/'; 
12155	}
12156
12157	if (link) {
12158		if (link.match(/^\@/g) !== null) { // link-type: link-bookmark ==> a[attr-bookmark]
12159			var bookmark_seq = link.replace(/^\@/g, '');
12160			if (typeof property.SETTINGS.blockBookmarkList == 'undefined' || typeof property.SETTINGS.blockBookmarkList['bookmark' + bookmark_seq] == 'undefined') {
12161				return '';
12162			}
12163		} else if (link.match(/^flink\@[0-9]/gi) !== null) { // link-type: link-file     ==> a[attr-flink]
12164			return link;
12165		} else if ($.inArray(link.replace(/^\//g, '').replace(/ /g, '-'), property.MENULIST) > -1) { // link-type: link-menu     ==> a[data-user-link]
12166			link_val = link_url + link.replace(/ /g, '-');
12167		} else { // link-type: link-out      ==> a[attr-link]
12168			if(checkBase64Encode(decodeURIComponent(link))) link = Base64.decode(decodeURIComponent(link));
12169			else if (checkBase64Encode(link)) link = Base64.decode(link);
12170
12171			if(!regex2.test(link) && regex.test(link)) link_val = '//' + link;
12172		}
12173
12174		if(link_val == '') link_val = link;
12175	}
12176	return link_val;
12177}
12178
12179var checkError = function(data) {
12180    if(typeof data.error != 'undefined' && data.error) {
12181        alert(data.error);
12182        if(data.error=='No user data') {
12183            location.href='/member/login';
12184        }
12185        return true;
12186    }
12187    return false;
12188}
12189
12190var funcCallback = function(func,callback) {
12191    func();
12192    if(typeof callback=='function') {
12193        callback();
12194    }
12195}
12196
12197var closeClnavMega = function() {
12198	if(typeof $.clnav == 'undefined') return;
12199	if($('.cl-nav[data-layout="meganav"]').length == 0) return;
12200	if(!$('body').is('[data-clnav-mega="open"]')) return;
12201
12202	$.clnav.setMode('mega-open', false);
12203}
12204
12205var cssSidebar = function(onoff) {
12206	var width = (onoff == 'on') ? '260px' : '',
12207		dsgn_css = CSSJSON.toJSON($('#dsgn-body').text());
12208
12209	if(width) {
12210		if(typeof dsgn_css['children']['.dsgn-body.sidebar'] == 'undefined') {
12211			dsgn_css['children']['.dsgn-body.sidebar'] = {'children' : {}, 'attributes' : { 'padding-left' : width, 'padding-top': '0px' }};
12212		}
12213	} else {
12214		if(typeof dsgn_css['children']['.dsgn-body.sidebar'] != 'undefined') {
12215			delete dsgn_css['children']['.dsgn-body.sidebar'];
12216		}
12217	}
12218
12219	$('#dsgn-body').text(CSSJSON.toCSS(dsgn_css));
12220}
12221
12222var getScreen = function() {
12223    var wid = window.innerWidth;
12224
12225    var screen_size = 0;
12226    if (0 < wid && wid < 480) {
12227        screen_size = 320;
12228    } else if(wid <= 480 && wid <768) {
12229        screen_size = 480;
12230    } else if (768 <= wid && wid < 992) {
12231        screen_size = 768;
12232    } else if (992 <= wid && wid < 1200 ) {
12233        screen_size = 992;
12234    } else if (wid >= 1200) {
12235        screen_size = 1200;
12236    }
12237
12238    return screen_size;
12239}
12240
12241var getScreenIndex = function() {
12242    var idx = 0;
12243    switch(SCREEN) {
12244        case 320:
12245        case 480:
12246            idx = 2;
12247            break;
12248        case 769:
12249            idx = 1;
12250            break;
12251
12252        case 992:
12253        case 1200:
12254            idx = 0;
12255            break;
12256
12257        default : idx = 0; break;
12258    }
12259    return idx;
12260}
12261var setGalleryReturnItemCookie = function(parent) {
12262	if(typeof parent == 'undefined' || !parent) return;
12263	var mode = (typeof parent.mode != 'undefined') ? parent.mode : '',
12264		seq = (typeof parent.seq != 'undefined') ? parent.seq : '';
12265
12266	if($.inArray(mode, ['project', 'shopping']) == -1 || !seq) return;
12267	$.cookie('gallery-item', seq, { path: '/', expires: 12 * 60 * 60 * 1000 });
12268}
12269var moveGallery = function(element) {
12270    var $item = $(`.gallery-item[data-seq="${element}"]`);
12271    if ($item.length == 0) {
12272		if($(`.element[data-id="${element}"]`).length > 0) $item = $(`.element[data-id="${element}"]`);
12273    	else return;
12274    }
12275
12276	if($.clnav.check()) {
12277		goToElement($item);
12278	} else {
12279		var header_fixed = $('header.navbar').height();
12280		var offset = ($('.dsgn-body').hasClass('sidebar')) ? 0 : -header_fixed;
12281		if($('header.navbar').hasClass('disableOffset') && !$item.hasClass('el_0')) offset = 0;
12282
12283		if (property.SID != 'undefined' && property.SID == 'kdomeshelter'){
12284			offset -= 300;
12285		}
12286
12287		var sTop = $item.offset().top + offset;
12288		$('html, body').animate({scrollTop: sTop}, 500, 'easeInOutQuart');
12289
12290		$.removeCookie('gallery', { path: '/' });
12291		$.removeCookie('gallery-item', { path : '/' });
12292	}
12293}
12294
12295var scrollToBlock = function(el, duration) {
12296	if(typeof duration == 'undefined') duration = 1200;
12297	if(typeof el == 'undefined' || !el || $(el).length == 0) return;
12298
12299	if($.clnav.check()) {
12300		goToElement(el);
12301	} else {
12302		var header_fixed = $('header.navbar').outerHeight();
12303		var offset = $('.dsgn-body').scrollTop();
12304		if(!$('.dsgn-body').hasClass('sidebar') && !$('header.navbar').hasClass('disableOffset')) offset -= header_fixed;
12305		var sTop = $(el).offset().top + offset;
12306		$('html, body').animate({ scrollTop: sTop }, duration, 'easeInOutQuart');
12307	}
12308}
12309
12310var clearDsgnbody = function() {
12311	closeClnavMega();
12312
12313	const removeSelectors = [
12314		'style[id^="el_"]:not([id*=el__])',
12315		'script[id^="js_"]:not([id*=el__])',
12316		'.element[data-id="all_products"]',
12317		'.psearch-view',
12318		'.menu-lock-block',
12319		'.site-lock-block',
12320		'.config-image-view',
12321		'.forum-view',
12322		'.page-toolbars',
12323		'.page-comments',
12324		'.page-bottomlist',
12325	].join(',');
12326	$(removeSelectors).remove();
12327	$('.el-footer').hide();
12328
12329	var element = $('div.element[class*="el_"]:not([class*=el__]):not(.el-footer)');
12330	element.each(function() {
12331		const $el = $(this);
12332		const $parentElem = $el.closest('.elem');
12333
12334		if($parentElem.length) {
12335			$parentElem.remove();
12336		} else {
12337			$el.remove();
12338		}
12339	});
12340}
12341
12342var ensureGalleryResponsiveImageClass = function($scope) {
12343	$scope.find('img').each(function() {
12344		var removeAttrs = [];
12345		if(this.attributes) {
12346			$.each(this.attributes, function(i, attr) {
12347				if(attr && attr.name !== 'class' && attr.name.indexOf('img-responsive') > -1) removeAttrs.push(attr.name);
12348			});
12349		}
12350		for(var i = 0; i < removeAttrs.length; i++) this.removeAttribute(removeAttrs[i]);
12351		$(this).addClass('img-responsive');
12352	});
12353}
12354
12355var golink = function(_this,link) {
12356	var wloc = window.location,
12357		local_link = (wloc.hostname == link.hostname) ? true : false,
12358		local_arr = ['/_register', '/_login'];
12359
12360	if(local_link && $.inArray(link.pathname,local_arr) == -1) {
12361    	var loc = link.pathname,
12362    		uri = (_this.b.PUBLISH) ? loc : loc.replace('/render/','');
12363
12364    	if((uri == '/render' || uri == '/') && !_this.b.ONE) {
12365    		uri = '';
12366    		$.each(_this.b.SMENU,function(i,v) {
12367    			var menu_name = (v.name).replace(' ','-');
12368    			var checkMenuName = (uri == menu_name) ? true : false,
12369    				checkMenuLink = (typeof v.link != 'undefined' && v.link) ? true : false;
12370
12371    			if(checkMenuName && checkMenuLink) {
12372    				uri = (v.link).replace(' ','-');
12373    			}
12374    		});
12375    		
12376    	}
12377
12378    	var go = (_this.b.PUBLISH) ? '/' + uri + link.hash: '/render/' + uri + link.hash;
12379		// 명품 쇼핑 검색 파라미터 처리
12380		if((link.search).length) go = go + link.search;
12381		_this.history.pushState(null,_this.b.TITLE,go);
12382
12383		if(typeof $.cookie('forum-item') != 'undefined') {
12384			// console.log('fm_view', $.cookie('forum_content_view'));
12385			setTimeout(function() {
12386	    		if(typeof $.cookie('forum_content_view') != 'undefined'){
12387                    var fm_view = $.cookie('forum_content_view');
12388                    var fv = (fm_view !== undefined && fm_view)? fm_view.split('&'):array();
12389                    var pid = (fv)? fv[0]:'';
12390                    var row_id = (fv)? fv[1]:'';
12391
12392                    scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"] .tpl-forum-list-title[data-id="'+row_id+'"]', 1000);
12393	    			$.removeCookie('forum-item', { path : '/' });
12394
12395                    $('.element[data-id="' + pid + '"] .tpl-forum-list-title[data-id="'+row_id+'"]').click();
12396                    // $.removeCookie('forum_content_view', { path: '/', expires: 12 * 60 * 60 * 1000 });
12397                } else {
12398                	scrollToBlock('.element[data-id="' + $.cookie('forum-item') + '"]', 1000);
12399	    			$.removeCookie('forum-item', { path : '/' });
12400                }
12401			}, 300);
12402		}
12403	} else {
12404		location.href = link.href;
12405	}
12406}
12407
12408
12409function draw_floating() {
12410    var fl_section_html = '',
12411		fl_bottom_html = '',
12412		fl_circle_html = '',
12413		el_html = '',
12414		data = {};
12415 
12416    $.each($('.floating_item li'), function(fi, fv){
12417        var fl_class = $(this).find('.icon').attr('class'),
12418            cid = ($(this).find('a').attr('data-cid')) ? $(this).find('a').attr('data-cid') : '',
12419            fl_link = ($(this).find('a').attr('data-link')) ? $(this).find('a').attr('data-link') : '',
12420            type = ($(this).find('a').attr('data-type')) ? $(this).find('a').attr('data-type') : '',
12421            data = ($(this).find('a').attr('data-data')) ? $(this).find('a').attr('data-data') : '',
12422            name = ($(this).find('a').attr('data-name')) ? $(this).find('a').attr('data-name') : '',
12423            regexp = /[0-9]+/,
12424            fl_url = (type=='defaultPhone') ? 'tel:'+property.TEL_LINK : data;
12425
12426            if(type=='top') return true;
12427            fl_icon_num = (type=='defaultPhone') ? '' : `${regexp.exec(fl_class)}`;
12428			// fl_link = (type=='address' || type=='page_move' || type=='storefarm') ? fl_link : '';
12429			fl_url = (type=='defaultPhone') ? fl_url : fl_link;
12430			fl_url = (type=='link') ? data : fl_url;
12431			fl_url = (type=='email') ? 'mailto:'+data : fl_url;
12432			fl_url = (type=='reservation') ? data : fl_url;
12433			fl_url = (type=='page_move' && data=='홈') ? '/' : fl_url;
12434			fl_url = (type=='sms') ? 'tel:'+ data : fl_url;
12435			fl_url = (type=='defaultPhone2') ? 'tel:'+ data : fl_url;
12436			if(fl_url.includes('pf.kakao')) {
12437				fl_url = (fl_url.includes('http://pf.kakao') || fl_url.includes('https://pf.kakao')) ? fl_url : fl_url = 'https://' + fl_url;
12438			}
12439         
12440        fl_section_html += `
12441        <li class="" data-type="${type}" data-name="${name}" data-cid="${cid}" data-link="${fl_url}">
12442            <a class="btn btn_ic${fl_icon_num}" href="${fl_url}">
12443                <div class="in">${name}
12444                    <span class="ic theme_background"></span>
12445                </div>
12446            </a>
12447        </li>
12448        `;
12449        
12450		var floating_open_sid = ['hyundae09']; // modoo 모바일 플로팅메뉴 open요청
12451		if($.inArray(property.SID, floating_open_sid) > -1) {
12452			fl_icon_num = (type=='defaultPhone') ? '1' : fl_icon_num;
12453			fl_bottom_html += `
12454			<a class="link_item _button_navi" href="${fl_url}" data-type="${type}">
12455				<span class=" icon icon${fl_icon_num}"></span>
12456			</a>
12457			`;
12458			fl_circle_html += `
12459			<a class="link_item _button_navi _bizPhone float-navi-button" href="${fl_url}" data-type="${type}">
12460				<span class=" icon icon${fl_icon_num} theme_background"></span>
12461			</a>
12462			`;
12463
12464		} else {
12465			fl_icon_num = (type=='defaultPhone') ? '1' : fl_icon_num;
12466			fl_bottom_html += `
12467			<a class="link_item _button_navi" href="${fl_url}" data-type="${type}">
12468				<span class=" text _text">${name}</span><span class=" icon icon${fl_icon_num}"></span>
12469			</a>
12470			`;
12471			fl_circle_html += `
12472			<a class="link_item _button_navi _bizPhone float-navi-button mfl_hide" href="${fl_url}" data-type="${type}">
12473				<span class="text _text">${name}</span><span class=" icon icon${fl_icon_num} theme_background"></span>
12474			</a>
12475			`;
12476		}
12477
12478		// console.log(fl_url);
12479    });
12480
12481    el_html += `
12482        <div class="btn_wrap m_floating">
12483			<ul class="btn_list">
12484				${fl_section_html}
12485			</ul>
12486		</div>
12487    `;
12488
12489	data = {
12490		'fl_bottom_html' : fl_bottom_html,
12491		'fl_circle_html' : fl_circle_html,
12492		'el_html' : el_html
12493	}
12494
12495	// 메뉴 디자인 변경시 모두 퀵메뉴랑 기존 탑버튼 위치 겹치는 문제 발생하여 기존 크링 탑버튼 숨김처리
12496	if(!$('._floating').hasClass('hide') && $('.floating_item li').length > 0) {
12497		$('.goto-top').hide().addClass('hide').css('pointer-events','none');
12498		    
12499	}
12500	return data;
12501}
12502    
12503
12504function m_floating(fl_data) {
12505	if($.isEmptyObject(fl_data)) return false;
12506	var	settings = (typeof property.SETTINGS !='undefined' && property.SETTINGS) ? property.SETTINGS : {},
12507		settings_modoo = (typeof settings.modoo !='undefined' && settings.modoo) ? settings.modoo : {},
12508		settings_mfloating = (typeof settings_modoo.mfloating !='undefined' && settings_modoo.mfloating) ? settings_modoo.mfloating : '';
12509
12510	if(settings_mfloating!='' && settings_mfloating && $('ul.floating_item._floating.modoo').length>0 && !$('._floating').hasClass('hide')) {
12511		var modoo_fnav_html = (settings_mfloating=='bottom') ? `
12512			<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
12513				<div class="floating_item floating_bottom _float_buttons">
12514					${fl_data.fl_bottom_html}
12515					<button type="button" class="btn_top _top_btn" data-type="top">
12516						<span class="blind">TOP</span><span class="icon_top"></span>
12517					</button>
12518				</div>
12519			</div>		
12520		` : `
12521		<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
12522			<div class="dimmed _bg_dimmed"></div>
12523			<div class="floating_item _float_buttons">
12524				${fl_data.fl_circle_html}
12525				<button type="button" class="btn_menu _toggle_btn" style="-webkit-tap-highlight-color: transparent;">
12526					<span class="icon nicon_more4 _icon_area theme_background"></span>
12527				</button>
12528			</div>
12529		</div>`
12530		;
12531
12532
12533		var floating_open_sid = ['hyundae09']; // modoo 모바일 플로팅메뉴 open요청
12534		if($.inArray(property.SID, floating_open_sid) > -1) {
12535			modoo_fnav_html = `
12536				<div class="floating_area _floating_area modoo" data-mfltype="${settings_mfloating}">
12537					<div class="floating_item _float_buttons">
12538						${fl_data.fl_circle_html}
12539						<button type="button" class="btn_menu _toggle_btn" style="-webkit-tap-highlight-color: transparent;">
12540							<span class="icon nicon_more4 _icon_area theme_background"></span>
12541						</button>
12542					</div>
12543				</div>`;
12544		}
12545		//$('.dsgn-body.modoo').append(modoo_fnav_html); 기존 코드
12546		
12547		if ($('.dsgn-body.modoo').length > 0) {
12548			$('.dsgn-body.modoo').append(modoo_fnav_html);
12549		} else if (property?.SETTINGS?.modoo?.floating) { // 모두 사이트 메뉴 디자인 변경 시 dsgn-body에 modoo가 포함되지 않아 모바일에서 퀵메뉴 안 보이는 문제 해결
12550			$('.dsgn-body').append(modoo_fnav_html);
12551		} 
12552		
12553	}
12554	
12555}
12556
12557function isMenuLock(callback) {
12558	var deferred = $.Deferred();
12559    var is_lock_block = 'active', r;
12560    var display_target = (property.VIEW) ? '.cl-s-product-detail, .lux-product-block, .cl-s-product-review, .cl-s-product-qna, .page-comments, .page-bottomlist' : '';
12561
12562    // if(property.VALIDPLAN && property.ISLOCK == 'true') { 
12563    if(property.ISLOCK == 'true') {
12564    	r = $.post('/template/menuLockController/type/lock_check', {s: property.SMENU, sid: property.SID, page: property.PAGE, publish : property.PUBLISH}, function(data) {
12565			var lock_type = data.lock_type,
12566				lock_error_type = (typeof data.error_data != 'undefined' && data.error_data.type) ? '.' + data.error_data.type : '';
12567			
12568			if(!data.error && data.result) { 
12569				property.ISLOCK = 'false';
12570			} else {
12571				// var checkGotoURL = '';
12572				// if((property.SITEUM == '1' || property.SITEUM == '2') && lock_error_type == '') checkGotoURL = '/_login';
12573				// else if(property.SITEUM == '2'&&  $.inArray(lock_error_type,['.unlikesite','.creatorlink']) > -1) checkGotoURL = '/_register';
12574				// if(checkGotoURL) {
12575				// 	location.href = checkGotoURL;
12576				// 	return false;
12577				// }
12578
12579				var text = $.lang[LANG]['render.menu-lock.' + lock_type + '.text'];
12580				if (typeof data.menuLockMsg !== 'undefined' && data.menuLockMsg) {
12581					text = data.menuLockMsg;
12582				}
12583
12584				if (lock_type=='umlevel') {
12585					if(lock_error_type == '' && property.SITEUM == '1') lock_error_type = '.onlylogin';
12586
12587					text = $.lang[LANG]['render.menu-lock.' + lock_type + '.text' + lock_error_type ];
12588					if(lock_error_type == '.lowerlevel') text = text.replace(/\#/gi, data.error_data.umlevel);
12589				}
12590
12591				var str = '\
12592							<div class="menu-lock-block">\
12593								<div class="inner-box text-center">\
12594									<div class="form-inline" role="form">\
12595										<div class="text">\
12596											<p> ' + text + ' </p>\
12597										</div>';
12598					if(lock_type=='password') {
12599						str = str + '\
12600										<div class="form-group">\
12601											<input class="form-control" type="password" placeholder="password" data-lock-password=""/>\
12602											<label class="error-text"></label>\
12603										</div>\
12604										<div class="form-group">\
12605											<span class="btn" data-edit="true" data-selector=".btn" data-lock-submit="">'+$.lang[LANG]['render.lock.password.submit']+'</span>\
12606										</div>\
12607						';
12608					}
12609					str = str + '\
12610									</div>\
12611								</div>\
12612							</div>\
12613				';
12614				if($.clnav.check()) {
12615					$('.dsgn-body').prepend(htmlspecialchars_decode(str));
12616				} else {
12617					$('.header.el-menu').after(htmlspecialchars_decode(str));
12618				}
12619		        $('#page-loading-css').remove();
12620			}
12621		    if(typeof callback == 'function') {
12622		    	callback();
12623
12624		    	if(display_target) {
12625					setTimeout(function() {
12626				    	if(property.ISLOCK == 'true') $(display_target).addClass('hide');
12627				    	else $(display_target).removeClass('hide');
12628					},20);
12629		    	}
12630		    }
12631
12632    	},'json');
12633    } else {
12634	    if(typeof callback == 'function') {
12635	    	callback();
12636			setTimeout(function() {
12637				$('.header.el-menu.hide').removeClass('hide');
12638				if(display_target) $(display_target).removeClass('hide');
12639			},20);
12640	    }
12641	}
12642
12643	deferred.resolve();
12644	return deferred.promise();
12645}
12646
12647function isSitePasswordLock() {
12648	var deferred = $.Deferred();
12649	let last_activity = localStorage.getItem("last_activity");
12650	let ss_site_lock = localStorage.getItem('ss_' + property.SID + '_site_lock');
12651    
12652    if (last_activity && ss_site_lock) {
12653    	let timeDiff = Math.floor(Date.now() / 1000) - Number(last_activity);
12654    	// console.log(Math.floor(Date.now() / 1000), Number(last_activity), timeDiff);
12655    	if (timeDiff > 3600) {
12656	    	// console.log('localStorage clear');
12657	        localStorage.removeItem('last_activity');
12658	        localStorage.removeItem('ss_' + property.SID + '_site_lock');
12659	        setTimeout(function(){
12660	        	location.href = '/';
12661	        });
12662	    }
12663    }
12664
12665	if(property.SETTINGS.sitePermit == undefined) {
12666		property.SETTINGS.sitePermit = 1;
12667	}
12668
12669	if(property.SETTINGS.sitePermit == 3) {
12670		let pw = (ss_site_lock)? ss_site_lock : '';
12671		r = $.post('/template/siteLockController/type/lock_check', {sid: property.SID, publish : property.PUBLISH, pw: pw}, function(data) {
12672			var lock_error_type = (typeof data.error_data != 'undefined' && data.error_data.type) ? '.' + data.error_data.type : '';
12673			if(!data.error && data.result) { 
12674				property.SETTINGS.sitePermit = 1;
12675			} else {
12676				var str = '\
12677					<div class="site-lock-block passwordonly">\
12678						<div class="inner-box text-center">\
12679							<div class="form-inline" role="form">\
12680								<div class="text">\
12681									<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"/>
12681<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>';
12682						if(typeof data.sitelock_text != 'undefined' && data.sitelock_text) {
12683							str += '<p class="title">'+data.sitelock_text+'</p>';
12684						} else {
12685							str += '<p class="title">'+$.lang[LANG]['render.site-lock.password.text']+'</p>';
12686						}
12687						str += '</div>\
12688								<div class="form-group">\
12689									<div>\
12690										<input type="password" placeholder="'+$.lang[LANG]['render.site-lock.password.placeholder']+'" data-lock-password=""/>\
12691										<label class="error-text"></label>\
12692									</div>\
12693									<span class="btn" data-edit="true" data-selector=".btn" data-lock="site" data-lock-submit="">\
12694									<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>\
12695									</span>\
12696								</div>\
12697							</div>\
12698						</div>\
12699					</div>\
12700				';
12701				if($.clnav.check()) {
12702					$('.dsgn-body').prepend(htmlspecialchars_decode(str));
12703				} else {
12704					$('.header.el-menu').after(htmlspecialchars_decode(str));
12705				}
12706			}
12707			if(data.reload === true && data.result) {
12708				setTimeout(function(){
12709					location.reload();
12710				});
12711			}
12712		}, 'json');
12713	}
12714	
12715    deferred.resolve();
12716	return deferred.promise();
12717}
12718
12719function isUserCertified(history) {
12720	var referrer = (document.referrer !== undefined)? document.referrer.replace(/^https?:\/\//, ''):'';
12721	var seg = referrer.split('/');
12722
12723	if(property.CERT_USE == 'A' && property.VALIDTYPE != 'BN' && property.VALIDTYPE != 'SM') { //요금제 만료
12724		var str = '\
12725			<div class="site-lock-block">\
12726				<div class="inner-box text-center">\
12727					<div class="form-inline">\
12728						<div class="text">\
12729							<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>\
12730							<p class="title">'+$.lang[LANG]['siteum.site.access.limit']+'</p>\
12731						</div>\
12732					</div>\
12733				</div>\
12734			</div>\
12735		';
12736
12737		if($.clnav.check()) {
12738			$('.dsgn-body').prepend(htmlspecialchars_decode(str));
12739		} else {
12740			$('.header.el-menu').after(htmlspecialchars_decode(str));
12741		}
12742		return false;
12743	}
12744
12745	r = $.post('/template/isUserCertified', {sid: property.SID, publish : property.PUBLISH}, function(data) {
12746		var cert_form = '';
12747
12748		// JH 주석2 : 문제 시 아래 주석
12749		if(property.CERT_USE == 'A' && typeof data.cert_adult != 'undefined' && data.cert_adult == 'N') {
12750			_this.b.certOpenChk = true;
12751		}
12752		
12753
12754		if((property.CERT_USE == 'Y' && data.cert != 'Y') || (property.CERT_USE == 'A' && data.cert_adult != 'Y')) {
12755			// V2: ordr_idxx는 서버(cert_req)에서 생성 — 프런트 init_orderid() 불필요
12756			cert_form = '\
12757				<form name="form_auth" method="post" action="/cert_req">\
12758			        <input type="hidden" name="param_opt_1" value="myinfo"/>\
12759			        <input type="hidden" name="param_opt_2" value="'+data.userid+'"/>\
12760				</form>\
12761				<form name="myinfo_form" method="post" action="/_myinfo_proc">\
12762				<input type="hidden" id="cert_data" name="cert_data" value="">\
12763					<input type="hidden" id="input-name" name="name" value="'+data.name+'">\
12764					<input type="hidden" id="input-birth" name="birth" value="'+data.birth+'">\
12765					<input type="hidden" id="input-tel" name="tel" value="'+data.tel+'">\
12766					<input type="hidden" id="input-gender" name="gender" value="'+data.gender+'">\
12767					<input type="hidden" id="input-email" name="email" value="'+data.email+'">\
12768					<input type="hidden" id="input-id" name="id" value="'+data.userid+'">\
12769				</form>\
12770			';
12771
12772			if(property.CERT_USE == 'Y'){
12773				if(property.SETTINGS.sitePermit == '2Y') {
12774					if(!data.userid){
12775						if(property.ONE && !property.VIEW) { //onepage site
12776							var onpage_seq = property.pageContent.index[0]['seq'];
12777							if(onpage_seq!='login' && onpage_seq!='register' && onpage_seq!='forgot'){
12778								location.href='/_login';
12779							}
12780						} else {
12781							if(property.PAGE!='_login' && property.PAGE!='_register' && property.PAGE!='_forgot') {
12782								location.href='/_login';
12783							}
12784						}
12785						
12786					} else {
12787						var str = '\
12788						<div class="site-lock-block useronly">\
12789							<div class="inner-box text-center">\
12790								<div class="form-inline">\
12791									<div class="text">\
12792									'+cert_form+'\
12793										<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>\
12794										<p class="title">'+$.lang[LANG]['siteum.cert.user']+'</p>\
12795										'+$.lang[LANG]['siteum.cert.user.txt']+'\
12796										<button class="btn cl-s-btn cl-s-btn-full btn-cert" onclick="return auth_type_check(true);">\
12797										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
12797<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>\
12798										'+$.lang[LANG]['siteum.cert.user.btn']+'</button>\
12799										<a class="btn cl-s-btn cl-s-btn-primary cl-s-btn-full logout" href="javascript:;">'+ $.lang[LANG]['siteum.cert.user.exit'] +'</a>\
12800									</div>\
12801								</div>\
12802							</div>\
12803						</div>\
12804						';
12805						if($.clnav.check()) {
12806							$('.dsgn-body').prepend(htmlspecialchars_decode(str));
12807						} else {
12808							$('.header.el-menu').after(htmlspecialchars_decode(str));
12809						}
12810
12811						$(document).on('click', '.btn.logout', function(e){
12812							e.preventDefault();
12813							$.getJSON('/umember/login/out', function(r) {
12814								if($.cookie('cert_popup') !== undefined) {
12815									$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
12816								}							
12817								location.reload();
12818							},'json');
12819						});
12820					}
12821				} else {
12822					if($.inArray(property.PAGE, ['_register', '_login', '_forgot', '_mypost', '_myinfo']) == -1) {
12823						var modal_content = '<p class="text-center">' + $.lang[LANG]['siteum.cert.identify.verification.txt.1'] + '</p>\
12824							<div class="info">\
12825							' + $.lang[LANG]['siteum.cert.identify.verification.txt.2'] + '\
12826							</div>';
12827
12828						if(data.cert == 'N') {
12829				        	modal_content += cert_form;
12830							$(this).showModalFlat($.lang[LANG]['siteum.cert.identify.verification'], modal_content, true, true, function() {
12831								auth_type_check(true);
12832							}, $.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
12833								$.getJSON('/umember/login/out', function(r) {
12834									location.href = r.url;
12835									// location.href = '/';
12836								},'json');
12837							}, '', function() { //hide
12838								$.getJSON('/umember/login/out', function(r) {
12839									location.href = r.url;
12840									// location.href = '/';
12841								},'json');
12842							});
12843						}
12844					}
12845				}
12846			} else if(property.CERT_USE == 'A') {
12847				if(!data.userid){
12848					if(property.ONE && !property.VIEW) { //onepage site
12849						var onpage_seq = property.pageContent.index[0]['seq'];
12850						if(onpage_seq!='login' && onpage_seq!='register' && onpage_seq!='forgot'){
12851							location.href='/_login';
12852						}
12853					} else {
12854						if(property.PAGE!='_login' && property.PAGE!='_register' && property.PAGE!='_forgot') {
12855							location.href='/_login';
12856						}
12857					}
12858					
12859				} else {
12860					var str = '\
12861					<div class="site-lock-block adultonly">\
12862						<div class="inner-box text-center">\
12863							<div class="form-inline">\
12864								<div class="text">\
12865								'+cert_form+'\
12866									<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>\
12867									<p class="title">'+$.lang[LANG]['siteum.cert.adult']+'</p>\
12868									'+$.lang[LANG]['siteum.cert.adult.txt']+'\
12869									<button class="btn cl-s-btn cl-s-btn-full btn-cert" onclick="return auth_type_check(true);">\
12870									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
12870<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>\
12871									'+$.lang[LANG]['siteum.cert.adult.btn']+'</button>\
12872									<a class="btn cl-s-btn cl-s-btn-primary cl-s-btn-full logout" href="javascript:;">'+ $.lang[LANG]['manager.site-um.logout'] +'</a>\
12873								</div>\
12874							</div>\
12875						</div>\
12876					</div>\
12877					';
12878					if($.clnav.check()) {
12879						$('.dsgn-body').prepend(htmlspecialchars_decode(str));
12880					} else {
12881						$('.header.el-menu').after(htmlspecialchars_decode(str));
12882					}
12883
12884					$(document).on('click', '.btn.logout', function(e){
12885						e.preventDefault();
12886						$.getJSON('/umember/login/out', function(r) {
12887							if($.cookie('cert_popup') !== undefined) {
12888								$.removeCookie('cert_popup', true, { path: '/', expires: 12 * 60 * 60 * 1000 });
12889							}							
12890							location.reload();
12891						},'json');
12892					});
12893				}
12894	    	}
12895		}
12896	}, 'json');
12897}
12898
12899function call_auth_data(frm) {
12900	auth_data(frm);
12901}
12902
12903var 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"],
12904    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"],
12905    fonts_ja = ["@Japanese", "Hannari", "Hokkori", "IoEI", "JKG", "MS Gothic", "MS Mincho", "Noto Sans JP", "Noto Serif JP"],
12906    fonts_th = ["@Thai", "Cyclin", "Hai Heritage Pro", "HFF Thai Dye", "Owah Tagu Siam NF"],
12907    fonts_ar = ["@Arabic", "Aceh Darusalam", "Amiri", "ArabDances", "Boecklins Universe", "Catharsis Bedouin", "Himchuli", "Kanisah", "Satyajit"],
12908    fonts_cr = ["@Cyrillic", "20db", "Alpha Echo", "Anonymous Pro", "Arsenal", "Bebas Neue", "Bitter", "Charis SIL", "Fira Mono", "Lato CR"],
12909    fonts_he = ["@Hebrew", "Alef", "Ezra SIL", "MendelSiddurMW"],
12910    fonts_ch = ["@Chinese", "cwTeXHei", "cwTeXKai", "cwTeXMing", "cwTeXYen", "Noto Sans SC", "Noto Sans TC", "Noto Serif SC", "Noto Serif TC"],
12911    fonts_vi = ["@Vietnamese", "Han Nom Gothic"];
12912    FONTS = [];
12913
12914for(i=0; i<UFONTS.length; i++){
12915    var fonts = eval('fonts_'+UFONTS[i]);
12916    FONTS = arrayUnique(fonts.concat(FONTS));
12917}
12918
12919function galleryStartHover() {
12920    $(this).find('figure').addClass('hover');
12921};
12922function galleryCloseHover() {
12923    $(this).find('figure').removeClass('hover');
12924};
12925function galleryMovelink() {
12926	$(this).find('a').click();
12927};
12928
12929$(function () {
12930	$(document).on('click', '.modoo._floating_area[data-mfltype^="ci"] ._toggle_btn', function(){
12931		var navi_btn = $('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button');
12932
12933		if(navi_btn.hasClass('mfl_hide')) {
12934			$('.modoo._floating_area[data-mfltype^="ci"]').removeClass('fl_open').addClass('fl_open');
12935			$('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button').removeClass('mfl_hide');
12936			$(this).removeClass('float-navi-open').addClass('float-navi-open');
12937			$(this).find('._icon_area').removeClass('nicon_more4').addClass('nicon_close');
12938		} else {
12939			$('.modoo._floating_area[data-mfltype^="ci"]').removeClass('fl_open');
12940			$('.modoo._floating_area[data-mfltype^="ci"]').find('.float-navi-button').addClass('mfl_hide');
12941			$(this).removeClass('float-navi-open');
12942			$(this).find('._icon_area').removeClass('nicon_close').addClass('nicon_more4');
12943		}
12944		
12945	});
12946
12947	$(document).on('click', '.nonePrice', function () {
12948		alert('로그인 후 이용이 가능합니다.');
12949		if (property['VALIDTYPE'] != 'SM') {
12950			$('.login .cl_icon_profile').click();
12951		} else {
12952			location.href='/_login';
12953		}
12954		return false;
12955	});
12956
12957});
12958
12959var naverLogCallback = function(callback) {
12960	if($('#naverLogload').length == 0) {
12961		var head= document.getElementsByTagName('head')[0];
12962		var script= document.createElement('script');
12963		script.type= 'text/javascript';
12964		script.id= 'naverLogload';
12965		script.src= '//wcs.naver.net/wcslog.js';
12966		script.addEventListener('load', callback);
12967		head.appendChild(script)
12968	} else {
12969		if(typeof callback == 'function') {
12970			callback();
12971		}
12972	}
12973}
12974
12975var member_only_item = function() {
12976	alert('로그인 후 이용이 가능합니다');
12977	location.href = "/_login";
12978}

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.