PageSourceSearch

https://syacht.or.kr/join

html syacht.or.kr collected 2026-10-08 13:02:12 UTC 267,603 bytes, 5,851 lines download raw bytes

1
2
3
4<!DOCTYPE html>
5<html lang="ko">
6<head>
7    <meta charset="utf-8">
8    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
9    <meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
10        <meta name="viewport" content="width=device-width, initial-scale=1.0">
11        <meta name="generator" content="QUV Homepage Builder"/>
12    <meta name="language" content="kr"/>
13    <meta name="referrer" content="always">
14    <title>서울특별시요트협회 </title>
15    <meta name="keywords" content="서울특별시요트협회, 서울시요트협회, 한강, 요트, 한강 요트"/>
16    <meta name="description" content="서울 대표 요트 커뮤니티, 서울특별시요트협회! 건강한 세일링 지원, 안전한 요트 체험 제공, 선수와 생활체육요트를 아우르는 요트의 모든 것!"/>
17    <meta property="og:title" content="서울특별시요트협회"/>
18    <meta property="og:description" content="서울 대표 요트 커뮤니티, 서울특별시요트협회! 건강한 세일링 지원, 안전한 요트 체험 제공, 선수와 생활체육요트를 아우르는 요트의 모든 것!"/>
19    <meta property="og:url" content="https://syacht.or.kr/join"/>
20            <meta property="og:image" content="/s/og_image.png?v=1791464532"/>
21    
22    <meta name="naver-site-verification" content="f2e3238a426c22314d67837138c080764e36184c" />
23<meta name="google-site-verification" content="mvScrZUxN-3P1DaC0kM1erSjnXRt1HQlvcv-vX7Fu-U" />
24    <!--favicon-->
25            <link rel="icon" type="image/png" href="/s/favicon_96.png?v=1791464532" sizes="96x96"/>
26        <link rel="apple-touch-icon-precomposed" sizes="96x96" href="/s/favicon_96.png?v=1791464532">
27        <link rel="canonical" href="https://syacht.or.kr/join" />
28            <meta name="robots" content="index,follow">
29    
30    <link href="/css/bootstrap.css?v=260904" rel="stylesheet">
31    <link href="/css/font-awesome.min.css?v=260904" rel="stylesheet">
32    <link href="/css/material-icons.min.css?v=260904" rel="stylesheet">
33    <link href="/css/simple-line-icons.css?v=260904" rel="stylesheet">
34    <link href="/css/style.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
35    <link href="/css/mobile.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
36    <link href="/css/header.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
37    <link href="/css/uploadfile.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
38    <link href="/css/font.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
39    <link href="/css/form.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
40    <link href="/css/table.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
41    <link href="/css/jquery-ui.1.12.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
42    <!--pagespeed <link href="/css/bootstrap-colorpicker.css?v=260904" rel="stylesheet" type="text/css" media="all"/>-->
43    <link href="/css/slider.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
44    <link href="/css/animate.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
45    <link href="/css/jquery.scrollbar.css?v=260904" rel="stylesheet" type="text/css" media="all"/> <!--page-->
46    <!--pagespeed <link href="/css/jquery.mCustomScrollbar.css?v=260904" rel="stylesheet" type="text/css" media="all">-->
47    <link href="/css/default.less?t=1791464532" rel="stylesheet/less" type="text/css"/>
48    <!--<link href="/live/s/site.less?t=1791464532" rel="stylesheet/less" type="text/css"/>-->
49    <!--    <link rel="stylesheet" href="https://unpkg.com/ag-grid-community/dist/styles/ag-grid.css">-->
50    <!--    <link rel="stylesheet" href="/css/ag-theme-material.css">-->
51    <link rel="stylesheet" href="/css/ag-grid.css">
52    <link rel="stylesheet" href="/css/ag-theme-material.css">
53
54    <link href="/css/bootstrap-datepicker3.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
55    <link href="/css/bootstrap-timepicker.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
56    <!--pagespeed <link href="/css/tablecellsselection.css?v=260904" rel="stylesheet" type="text/css" media="all"/>-->
57    <!--<link href="/css/ScrollTrigger.css?v=--><!--" rel="stylesheet" type="text/css" media="all"/>-->
58    <link href="/css/fullcalendar.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
59    <link href="/css/fullcalendar.min.css?v=260904" rel="stylesheet" type="text/css" media="all"/>
60    <link href="/css/fullcalendar.print.min.css?v=260904" rel="stylesheet" type="text/css" media="print"/>
61
62    <!-- ionicons -->
63    <link href="/css/ionicons/ionicons.css?v=260904" rel="stylesheet">
64    <link href="https://unpkg.com/[email protected]/dist/css/ionicons.min.css" rel="stylesheet">
65
66    
67    
67<script>
68        var qvDebug={}; qvDebug.drag=1;//1:debug on
69        var STID="m03d56npb"; var SVID="1"; var SPID="join"; var MSID="m03d56"; var SITE_NAME="[공식] 서울특별시요트협회"; var USE_APP="0"; var LANG="ko"; var SITE_URL="join";
70        var QV_BASE_OBJ={'sskey':"", 'token':"5d20051530db1a63de2ccac49fe29e0d", 'stid':STID, 'svid':SVID, 'spid':SPID, 'msid':MSID, 'site_name':SITE_NAME, 'use_app':USE_APP, 'eng_domain':'syacht.or.kr', 'member_account_type':"0",'is_free_version':'0', 'dev':""};
71        var CKEDITOR_BASEPATH = "/js/ck3/";
72        var IS_LOGINED="0";
73        less = {
74            //env: "production", //development,production-으로 하면 캐싱 오류남
75            env: "production",
76            logLevel: 2,
77            async: false,
78            fileAsync: false,
79            poll: 1000,
80            functions: {},
81            dumpLineNumbers: "comments",
82            relativeUrls: false
83        };
84        var account = "";
85        var auth = "";
86        var group = "";
87        var isAdmin = "0";
88
89        if (QV_BASE_OBJ.is_free_version==1 && self !== top) {
90            //12.6
91            alert('도메인으로 이용하시려면\n큐브 프리미엄 버전으로 업그레이드 해주세요.\n큐브 사이트로 이동합니다');
92            location.href='https://www.quv.kr';
93        }
94    </script>
94
95    
95<script src="/js/less.min.js?v=260904" type="text/javascript"></script>
95
96    
96<script>//less.watch();</script>
96
97
98    <!--[if lt IE 9]>
99    
99<script type="text/javascript" src="/js/html5shiv.js?v=260904"></script>
99 <![endif]-->
100    
100<script type="text/javascript" src="/js/jquery.2.2.4.min.js?v=260904"></script>
100
101    
101<script type="text/javascript" src="/js/bootstrap.js?v=260904"></script>
101
102    
102<script>$.fn.bootstrapBtn = $.fn.button.noConflict();</script>
102 <!--반드시 bootsrap - jquery-ui 사이에 위치-->
103    
103<script type="text/javascript" src="/js/jquery-ui.1.12.min.js?v=260904"></script>
103
104    
104<script type="text/javascript" src="/js/jquery.lazyload.js?v=260904"></script>
104
105    
105<script type="text/javascript" src="/js/jquery-migrate-1.2.1.min.js?v=260904"></script>
105
106    
106<script type="text/javascript" src="/js/jquery.ui.touch-punch.min.js?v=260904"></script>
106
107    <!--
107<script type="text/javascript" src="/js/jquery.htmlClean.js?v=260904"></script>
107-->
108    
108<script type="text/javascript" src="/js/global.js?v=260904" charset="utf-8"></script>
108
109    
109<script type="text/javascript" src="/js/script.js?v=260904" charset="utf-8"></script>
109
110    
110<script type="text/javascript" src="/js/jquery.uploadfile.js?v=260904"></script>
110
111    <!--
111<script type="text/javascript" src="/js/ck3/ckeditor.js?v=--><!--" charset="utf-8"></script>
111-->
112    <!--pagespeed 
112<script type="text/javascript" src="/js/bootstrap-colorpicker.new.js?v=260904" charset="utf-8"></script>
112-->
113    
113<script type="text/javascript" src="/js/jquery.scrollbar.js?v=260904" charset="utf-8"></script>
113
114    <!--pagespeed 
114<script type="text/javascript" src="/js/jquery.mCustomScrollbar.concat.min.js?v=260904"></script>
114-->
115    
115<script type="text/javascript" src="/js/bootstrap-datepicker.min.js?v=260904"></script>
115
116    
116<script type="text/javascript" src="/js/bootstrap-timepicker.min.js?v=260904"></script>
116
117    <!--pagespeed 
117<script type="text/javascript" src="/js/tablecellsselection.js?v=260904"></script>
117-->
118    
118<script type="text/javascript" src="/js/carousel-swipe.js?v=260904"></script>
118
119    
119<script type="text/javascript" src="/js/jquerymobile-swipeupdown.js?v=260904"></script>
119
120    <!--
120<script type="text/javascript" src="/js/ScrollTrigger.min.js?v=--><!--"></script>
120-->
121    <!--
121<script type="text/javascript" src="/js/webfont.js?v=--><!--"></script>
121-->
122
123    
123<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js"></script>
123
124    
124<script type="text/javascript">
125        var webfontJson_Header = '{"google":[],"custom":["Noto Sans KR","Nanum Gothic"]}';
126        var webfontJson_Body = '';
127        var webfontJson_Footer = '{"google":[],"custom":["Noto Sans KR","Nanum Gothic"]}';
128        var webfontJson_Fixed = '{"google":[],"custom":["Noto Sans KR","Nanum Gothic","Nanum Square"]}';
129        var webfontJson_Popup = '[]';
130
131        var webfontArray = [];
132        webfontArray.push($.parseJSON(webfontJson_Header));
133        webfontArray.push($.parseJSON(webfontJson_Body));
134        webfontArray.push($.parseJSON(webfontJson_Footer));
135        webfontArray.push($.parseJSON(webfontJson_Fixed));
136        webfontArray = $.merge(webfontArray, $.parseJSON(webfontJson_Popup.replace(/"{/g, "{").replace(/}"/g, "}")));
137
138        var webfont_google = [];
139        var webfont_custom = [];
140        var webfont_custom_url = 'css/font.css.php?family=';
141        var webfont_exclude = ['agGridMaterial'];
142        $.each(webfontArray, function(index, value) {
143            if (this.google != undefined && value != null) {
144                $.each(value.google, function() {
145                    var font = String(this) + ':300,400,700';
146                    if (String(this) == '' || webfont_exclude.indexOf(String(this)) > -1) return;
147                    if ($.inArray(font, webfont_google) == -1) {
148                        webfont_google.push(font);
149                    }
150                });
151            }
152            if (this.custom != undefined  && value != null) {
153                $.each(value.custom, function() {
154                    if ($.inArray(String(this), webfont_custom) == -1) {
155                        webfont_custom.push(String(this));
156                        webfont_custom_url += String(this).replace(/ /g,'+');
157                        webfont_custom_url += '|';
158                    }
159                });
160            }
161        });
162
163        var webfont = new Object();
164        webfont.google = webfont_google;
165        webfont.custom = webfont_custom;
166        webfont.custom_url = ['/' + webfont_custom_url.slice(0, -1)];
167
168        var webfontconfig = new Object();
169        // if (webfont.google.length > 0) { webfontconfig.google = { 'families' : webfont.google } }
170        if (webfont.custom.length > 0) { webfontconfig.custom = { 'families' : webfont.custom, 'urls' : webfont.custom_url } }
171
172        /* 2020.01.31 재헌
173             * 묶어서 호출했을 때 하나라도 지원하지 않는 폰트가 있으면 그 하위로 모두 호출하지 않는 문제가 있음.
174             * 위 이유로 구글 폰트는 개별 호출한다.
175             */
176        $.each(webfont.google, function() {
177            var webfontconfig_re = new Object();
178            webfontconfig_re.google = { 'families' : [ this ] };
179            WebFont.load(webfontconfig_re);
180        });
181
182        if (!$.isEmptyObject(webfontconfig)) {
183            WebFontConfig = webfontconfig;
184//            WebFontConfig = {
185//                google: {
186//                    families: ['Abel','Abril Fatface','Alegreya','Barlow','Cardo','Cookie','Dancing Script','Dosis','Droid Sans','Droid Serif','EB Garamond','Great Vibes','Lato','Libre Baskerville','Lora','Mada','Montserrat','Muli','Nixie One','Noto Sans','Noto Serif','Open Sans','Oswald','Playball','Playfair Display','PT Sans','PT Serif','Questrial','Quicksand','Raleway','Roboto','Stalemate','Ubuntu','Indie Flower']
187//                }
188//            };
189
190            // https://github.com/typekit/webfontloader
191            // v1.0 -> v1.6.26
192            (function() {
193                var wf = document.createElement('script');
194                wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
195                wf.type = 'text/javascript';
196                wf.async = 'true';
197                var s = document.getElementsByTagName('script')[0];
198                s.parentNode.insertBefore(wf, s);
199            })();
200        }
201    </script>
201
202    
202<script type="text/javascript" src="//log1.quv.kr/log/qa.js"></script>
202
203
204    <!-- 다음 우편번호 검색 -->
205    
205<script src="https://t1.kakaocdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
205
206
207    <!-- 다국어 -->
208        
208<script type="text/javascript" src="/module/language/lang.ko.js?v=260904"></script>
vendor: 71 bytes, lines 208-210
208
209    
210<script async src="https://www.googletagmanager.com/gtag/js?id=
210G-B7X1NWR5V1
vendor: 12 bytes, line 210
210"></script>
211<script>
212  
vendor: 134 bytes, lines 212-216
212window.dataLayer = window.dataLayer || [];
213  function gtag(){dataLayer.push(arguments);}
214  gtag('js', new Date());
215
216  gtag('config', '
216G-B7X1NWR5V1
vendor: 4 bytes, line 216
216');
217</script>
217<script>$(document).ready(function(){ $(document).bind('keydown', function(e){ if(e.ctrlKey) { return false; }}); $(document).on('contextmenu',function(e){ return false; }); });</script>
217<script type="text/javascript" src="https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js" charset="utf-8"></script>
217<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>
217
218
219    </head>
220
221<body class="live transform" style="display: none;">
222<div id="main_container" class="join">
223        <div class="body no-header pl-n">
224        
225<link rel="stylesheet" href="/css/member.css?v=260904">
vendor: 81 bytes, lines 225-227
225
226
227<script src="https://www.google.com/recaptcha/api.js" async defer></script>
228<script type="text/javascript">
229    // https://www.google.com/recaptcha/
230    // site key     : 6Lf62UcUAAAAAEEWIFWPJc_oE-PlkmlZ2h665q9K
231    // secret key   : 6Lf62UcUAAAAAGEuSkbnYr_Oc0enxTr_qIZymnMv
232    var recaptchaCallback = function(response) {
233        var response = grecaptcha.getResponse();
234        $('#hidden-grecaptcha').val(response);
235        $('.recaptcha-error-message').remove();
236    };
237    var recaptchaExpired = function(response) {
238        $('#hidden-grecaptcha').val('');
239    };
240</script>
240
241
242<body class="live transform" data-spy="scroll" data-target="#pp-main-navigation">
243<div id="main_container" class="join">
244    <div class="join-header">
245        <div class="join-close"></div>
246    </div>
247    <div class="join-container">
248        <div class="join-content" style="display: none;">
249            <div class="join-terms">
250                <div class="join-title"><i class="ion-information"></i><p>가입 약관 동의</p></div>
251                <div class="join-terms-group">
252                    <label class="join-terms-check checkbox-inline">
253                        아래 내용에 모두 동의합니다.                        <input type="checkbox" class="join-terms-check" id="terms-check-all" value="all" name="check-terms">
254                    </label>
255                </div>
256                <div class="join-terms-group">
257                    <label class="join-terms-check checkbox-inline">
258                        이용약관                        <span class="terms-necessary">(필수)</span>
259                        <input type="checkbox" class="join-terms-check" id="terms-check-service" value="service" name="check-terms">
260                    </label>
261                    <div class="join-terms-content">
262                        <textarea disabled id="terms-textarea-service"></textarea>
263                    </div>
264                </div>
265                <div class="join-terms-group">
266                    <label class="join-terms-check checkbox-inline">
267                        개인 정보 수집/이용 안내                        <span class="terms-necessary">(필수)</span>
268                        <input type="checkbox" class="join-terms-check" id="terms-check-privacy" value="privacy" name="check-terms">
269                    </label>
270                    <div class="join-terms-content">
271                        <textarea disabled id="terms-textarea-privacy"></textarea>
272                    </div>
273                </div>
274
275                <div class="join-terms-group">
276                    <label class="join-terms-check checkbox-inline">
277                        이벤트 등 프로모션 알림 수신                        <span class="terms-choice">(선택)</span>
278                        <input type="checkbox" class="join-terms-check" id="terms-check-alarm" value="alarm" name="check-terms">
279                    </label>
280                </div>
281                <div class="join-terms-group-confirm">
282                    <div class="join-terms-disagree" onclick="join_term_disagree();">비동의</div><div class="join-terms-agree" onclick="join_term_agree();">동의</div>
283                </div>
284            </div>
285
286            <div class="join-form">
287                <div class="join-title"><i class="ion-podium"></i><p>가입 정보 입력</p></div>
288                <div class="join-form-group1">
289                    <div class="join-form-id">
290                        <input type="text" id="id" placeholder="아이디">
291                    </div>
292                    <div class="join-form-pw1">
293                        <input type="password" id="pw1" placeholder="비밀번호" autocomplete="off">
294                    </div>
295                    <div class="join-form-pw2">
296                        <input type="password" id="pw2" placeholder="비밀번호 확인" autocomplete="off">
297                    </div>
298                </div>
299
300                <div class="password-notice">
301                    <div class="password-advisor">
302                        <i class="fa fa-lock" style="font-size: 20px;" aria-hidden="true"></i>
303                    </div>
304                    <p>비밀번호는 영문, 숫자, 특수문자를 포함하여 8~16자로 입력해주세요.</p>
305                </div>
306
307                <div class="join-form-group2">
308                    <div class="join-form-name">
309                        <input type="text" id="name" placeholder="이름">
310                    </div>
311                    <div class="join-form-birth">
312                        <div class="join-form-birth-y">
313                            <input type="text" id="birth-y" placeholder="생
313일연도(4자)">
314                        </div><div class="join-form-birth-m">
315                        <input type="text" id="birth-m" placeholder="월">
316                    </div><div class="join-form-birth-d">
317                        <input type="text" id="birth-d" placeholder="일">
318                    </div>
319                    </div>
320                    <div class="join-form-phone">
321                        <input type="text" id="phone" placeholder="휴대전화번호">
322                    </div>
323                    <div class="join-form-email">
324                        <input type="text" id="email" placeholder="이메일">
325                    </div>
326                </div>
327                <div class="join-form-group3">
328                    <div class="join-form-zipcode">
329                        <input type="text" id="zipcode" placeholder="우편번호">
330                        <div class="join-form-zipcode-search" onclick="join_execDaumPostcode();">
331                            <div>우편번호 검색</div>
332                        </div>
333                    </div>
334                    <div class="join-form-address1">
335                        <input type="text" id="address1" placeholder="주소1">
336                    </div>
337                    <div class="join-form-address2">
338                        <input type="text" id="address2" placeholder="주소2">
339                    </div>
340                </div>
341                <div class="join-form-group4">
342                </div>
343                <div class="join-form-group-captcha">
344                </div>
345                <div class="join-form-group-confirm">
346                    <div class="join-form-confirm" onclick="join_form_submit();">
347                        가입하기                    </div>
348                </div>
349            </div>
350        </div>
351    </div>
352    <div class="join-footer">
353    </div>
354</div><!--/container-->
355
356</body>
357</html>
358
359<!--
359<script type="text/javascript" src="member.js"></script>
359-->
360<script>
361    var post_account = "";
362    var post_email = "";
363    var post_name = "";
364    var post_sid = "";
365    var post_sc_type = "";
366    var post_m = "";
367    var post_terms_service = "";
368    var post_terms_privacy = "";
369    var post_terms_alarm = "0";
370    
371    $(function() {
372        if (post_m == 'join') {
373            $('.join-form').show();
374            $('.join-terms').remove();
375            join_form_init();
376        }
377        else {
378            $('.join-terms').show();
379            $('.join-form').remove();
380            join_terms_init();
381        }
382
383//        join_recaptcha_init('6Lf62UcUAAAAAEEWIFWPJc_oE-PlkmlZ2h665q9K');
384    });
385
386    $('.join-close').on('click', function() {
387        location.href = '/';
388    });
389
390
391</script>
391
392
393
394<webfont>{"google":[],"custom":["Noto Sans KR","Nanum Gothic","Nanum Square"]}</webfont><!-- naver, google, kakao login script -> header.inc.html 에서 호출 함 -->
395
396<!--GOOGLE-->
397<!-- 커스텀 버튼 : https://developers.google.com/identity/sign-in/web/build-button -->
398<!--
398<script src="https://apis.google.com/js/platform.js" async defer></script>
398-->
399
400<!--KAKAO-->
401<!--
401<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>
401-->
402
403<!--NAVER-->
404<!--
404<script type="text/javascript" src="https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js" charset="utf-8"></script>
404-->
405
406<!--2019.03.11 재헌 - 리캡챠 미사용으로 주석처리 -->
407<!--RECAPTCHA-->
408<!--
vendor: 75 bytes, line 408
408<script src="https://www.google.com/recaptcha/api.js" async defer></script>
408-->
409
410<link rel="stylesheet" href="/css/member.css?v=260904">
411
412<div class="modal fade login-modal" id="LoginModal" tabindex="-1" role="dialog" style="top: 0px !important;">
413    <div class="modal-dialog">
414        <div class="modal-content">
415            <div class="modal-header">
416                <div class="modal-header-title">로그인</div>
417            </div>
418
419            <div class="modal-body" style="display:grid; max-height: 700px;">
420                <div class="login-form">
421                    <input type="text" class="login-form-id" placeholder="아이디" autocomplete="off">
422                    <input type="password" class="login-form-pw" placeholder="비밀번호" autocomplete="off">
423                </div>
424                <div class="login-confirm">
425                    로그인                </div>
426                <input type="submit" style="display:none"/>
427                <div class="login-options">
428                    <div id="login-options-join" class="login-options-join">
429                        회원가입                    </div>
430                    <div id="login-options-find" class="login-options-find">
431                        비밀번호 찾기                    </div>
432                </div>
433
434                <div class="login-divider"></div>
435
436                <div class="sns-login-form">
437                    <div class="sns-login-form-naver">
438                        <!--<div id="naverIdLogin" style="display: none;"></div>-->
439                        <div id="naver-login-button">
440                            <img src="/img/ico/login/naver_logo.png">
441                            네이버 아이디로 로그인                        </div>
442                        <!--<div class="g-signin2" data-onsuccess="onSuccess_google" data-theme="dark"></div>-->
443                    </div>
444                    <div class="sns-login-form-kakao">
445                        <div id="kakao-login-button">
446                            <img src="/img/ico/login/kakao_logo.png">
447                            카카오 아이디로 로그인                        </div>
448                        <!--                        <a id="kakao-login-button"></a>-->
449                        <!--                        <a href="http://developers.kakao.com/logout"></a>-->
450                    </div>
451                    <div class="sns-login-form-google">
452                        <div id="google-login-button">
453                            <img src="/img/ico/login/google_new_icon.svg">
454                            구글 아이디로 로그인                        </div>
455                        <!--<div class="g-signin2" data-onsuccess="onSuccess_google" data-theme="dark"></div>-->
456                    </div>
457                </div>
458            </div>
459            <!--<div class="modal-footer">-->
460            <!--</div>-->
461        </div>
462    </div>
463</div>
464
465<div class="modal fade find-password-modal z-index-1060" id="FindPasswordModal" tabindex="-1" role="dialog" style="top: 0px !important;">
466    <div class="modal-dialog">
467        <div class="modal-content">
468            <div class="modal-header">
469                <div class="modal-header-title">비밀번호 재설정</div>
470            </div>
471
472            <div class="modal-body" style="display:grid; max-height: 700px;">
473                <div class="find-password-description">
474                    비밀번호를 찾고자 하는 아이디 또는 이메일을 입력해 주세요.                    <br>
475                    해당 계정의 이메일로 비밀번호 변경 안내 메일이 발송됩니다.                </div>
476
477                <div class="find-password-form">
478                    <input type="text" id="find-password-form-account" class="find-password-form-account" placeholder="가입한 계정 또는 이메일">
479                </div>
480                <div class="find-password-confirm" onclick="find_password_confirm();">
481                    <div>비밀번호 재설정</div>
482                </div>
483
484                <!--2018.10.16 재헌-->
485                <!--recapcha 걷어냄-->
486                <!--<div class="find-password-captcha">-->
487                    <!--<form id="find-password-recaptcha-form" method="POST">-->
488                        <!--<div id="find-password-recaptcha"></div>-->
489                        <!--<input id="hidden-grecaptcha" name="hidden-grecaptcha" type="hidden"/>-->
490                    <!--</form>-->
491                <!--</div>-->
492            </div>
493            <!--<div class="modal-footer">-->
494            <!--</div>-->
495        </div>
496        <div class="qv-loader qv-loader-black"></div>
497    </div>
498</div>
499
500<div class="modal fade change-password-modal" id="ChangePasswordModal" tabindex="-1" role="dialog" style="top: 0px !important;">
501    <div class="modal-dialog">
502        <div class="modal-content">
503            <div class="modal-header">
504                <div class="modal-header-title">비밀번호 변경</div>
505            </div>
506
507            <div class="modal-body">
508                <div class="change-password-description">
509                    새로운 비밀번호를 입력하세요.                </div>
510
511                <div class="change-password-form">
512                    <input type="password" id="change-pw1" class="change-pw1" placeholder="변경할 비밀번호" autocomplete="off">
513                    <input type="password" id="change-pw2" class="change-pw2" placeholder="변경할 비밀번호 확인" autocomplete="off">
514                </div>
515                <div class="change-password-notice">
516                    <div class="change-password-advisor">
517                        <i class="fa fa-lock" style="font-size: 20px;" aria-hidden="true"></i>
518                    </div>
519                    <p>영문, 숫자, 특수문자를 포함하여 8~20자로 입력해주세요.</p>
520                </div>
521                <div class="change-password-confirm">
522                    <div onclick="change_password_confirm();">비밀번호 변경</div>
523                </div>
524            </div>
525            <!--<div class="modal-footer">-->
526            <!--</div>-->
527        </div>
528        <div class="qv-loader qv-loader-black"></div>
529    </div>
530</div>
531
532
533<!--member.js inc/script.inc.html 에 위치 -->
534<script type='text/javascript'>
535    var NAVER_CLIENT_ID = '';
536    var NAVER_CLIENT_SECRET = '';
537    var NAVER_AUTH_URL = '';
538    var KAKAO_CLIENT_ID = '';
539    var KAKAO_PLUS_FRIEND_ID = '';
540    var GOOGLE_CLIENT_ID = '';
541    var GOOGLE_CAPTCHA_KEY = '6Lf62UcUAAAAAEEWIFWPJc_oE-PlkmlZ2h665q9K';
542
543    $('#LoginModal').on('show.bs.modal', function () {
544        $(this).find('.modal-header-title-sub').remove();
545    });
546    $('#LoginModal').on('hidden.bs.modal', function () {
547        if ($('.modal.fade.in').length > 0) {
548            $('body').addClass('modal-open');
549        }
550    });
551    
552    $(function() {
553        var query = qv_func.getUrlParams();
554        if (query.m == 'change_password') {
555            $('#ChangePasswordModal').modal('show');
556        }
557        else {
558            initSocialLoginClientId();
559        }
560
561
562//        // KAKAO
563//        // https://developers.kakao.com/docs/restapi/tool#user-api
564//        //<![CDATA[
565//        // 사용할 앱의 JavaScript 키를 설정해 주세요.
566//        Kakao.init('eeebfc46f7f77f5855c5be2ca40594e3');
567//        // 카카오 로그인 버튼을 생성합니다.
568//        Kakao.Auth.createLoginButton({
569//            container: '#kakao-login-button',
570//            success: function(authObj) {
571//                Kakao.API.request({
572//                    url: '/v1/user/me',
573//                    success: function(res) { onSuccess_kakao(authObj, res); }
574//                });
575//            },
576//            fail: function(err) {
577//                alert(JSON.stringify(err));
578//            }
579//        });
580//        //]]>
581//
582//        // GOOGLE
583//        // https://developers.google.com/+/web/signin/
584//        // 새로고침 시 onsuccess가 발동하는 문제가있음 --> 해결 http://usefulangle.com/post/55/google-login-javascript-api
585//        gapi.signin2.render('google-login-button', {
586//            'scope': 'profile email',
587//            'width': 240,
588//            'height': 50,
589//            'longtitle': false,
590//            'theme': 'dark',
591//            'onsuccess': function () {},
592//            'onfailure': function () {}
593//        });
594    });
595
596    function initSocialLoginClientId() {
597        var data = [{"ssiid":"11637","stid":"m03d56npb","ssi_type":"1","ssi_state":"1","ssi_key1":"6s0PoFy3Ur5KwSqu0KsD","ssi_key2":"","version":"1"},{"ssiid":"11638","stid":"m03d56npb","ssi_type":"2","ssi_state":"1","ssi_key1":"7a0bbed5b880cdddea99db2e02d640c7","ssi_key2":"","version":"1"}];
598        if (data == null || data.length == 0) {
599            $('.sns-login-form-naver').remove();
600            $('.sns-login-form-kakao').remove();
601            $('.sns-login-form-google').remove();
602            $('.login-divider').remove();
603        }
604        else {
605            $.each(data, function () {
606                switch (this.ssi_type) {
607                    case "1": // NAVER LOGINcol-sm-2
608                        if (this.ssi_state == "0" || this.ssi_key1 == '') {
609                            $('.sns-login-form-naver').remove();
610                        }
611                        else {
612                            $('.sns-login-form-naver > div').show();
613                            NAVER_CLIENT_ID = this.ssi_key1;
614                            NAVER_CLIENT_SECRET = this.ssi_key2;
615                            // 네이버 버튼 규정, 재 디자인 필요
616                            // https://developers.naver.com/docs/login/bi/
617
618                            if (typeof naver === 'object') {
619                                naverLogin = new naver.LoginWithNaverId(
620                                    {
621                                        clientId: NAVER_CLIENT_ID,
622                                        callbackUrl: location.protocol + '//' + QV_BASE_OBJ.eng_domain + "/oauth/callback.php?cliendId=" + NAVER_CLIENT_ID,
623                                        isPopup: true
624                                        //callbackHandle: true,
625                                        //loginButton: {color: "green", type: 3, height: 43, width: 370} /* 로그인 버튼의 타입을 지정 */
626                                    }
627                                );
628                                naverLogin.init();
629                                NAVER_AUTH_URL = naverLogin.generateAuthorizeUrl();
630                                $('#naver-login-button').data('authUrl', NAVER_AUTH_URL);
631                            }
632                        }
633                        break;
634                    case "2": // KAKAO LOGIN
635                        if (this.ssi_state == "0" || this.ssi_key1 
635== '') {
636                            $('.sns-login-form-kakao').remove();
637                        }
638                        else {
639                            $('.sns-login-form-kakao > div').show();
640                            KAKAO_CLIENT_ID = this.ssi_key1;
641                            KAKAO_PLUS_FRIEND_ID = this.ssi_key2;
642
643                            if (typeof Kakao === 'object') {
644                                Kakao.init(KAKAO_CLIENT_ID);
645                            }
646                        }
647                        break;
648                    case "3": // GOOGLE LOGIN
649                        if (this.ssi_state == "0" || this.ssi_key1 == '') {
650                            $('.sns-login-form-google').remove();
651                        }
652                        else {
653                            $('.sns-login-form-google > div').show();
654                            GOOGLE_CLIENT_ID = this.ssi_key1;
655                        }
656                        break;
657                }
658            });
659
660            if ($('.sns-login-form').children().length == 0) {
661                $('.login-divider').remove();
662            }
663        }
664    }
665
666    function initSocialLoginClientId_dummy() {
667        qvjax_direct(
668            "select_sns_info",
669            "/module/member/member.php",
670            '',
671            function (data) {
672                if (data.length == 0) {
673                    $('.sns-login-form-naver').remove();
674                    $('.sns-login-form-kakao').remove();
675                    $('.sns-login-form-google').remove();
676                    $('.login-divider').remove();
677                }
678                else {
679                    $.each(data, function () {
680                        switch (this.ssi_type) {
681                            case "1": // NAVER LOGINcol-sm-2
682//                                $.getScript( "https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js", function( data, textStatus, jqxhr ) {
683//
684//                                });
685                                if (this.ssi_state == "0" || this.ssi_key1 == '') {
686                                    $('.sns-login-form-naver').remove();
687                                }
688                                else {
689                                    NAVER_CLIENT_ID = this.ssi_key1;
690                                    NAVER_CLIENT_SECRET = this.ssi_key2;
691                                    // 네이버 버튼 규정, 재 디자인 필요
692                                    // https://developers.naver.com/docs/login/bi/
693
694                                    naverLogin = new naver.LoginWithNaverId(
695                                        {
696                                            clientId: NAVER_CLIENT_ID,
697                                            //callbackUrl: document.location.origin + "/oauth/callback.php?cliendId=" + NAVER_CLIENT_ID,
698                                            callbackUrl: location.protocol + '//' + QV_BASE_OBJ.eng_domain + "/oauth/callback.php?cliendId=" + NAVER_CLIENT_ID,
699                                            isPopup: true
700                                            //callbackHandle: true,
701                                            //loginButton: {color: "green", type: 3, height: 43, width: 370} /* 로그인 버튼의 타입을 지정 */
702                                        }
703                                    );
704                                    naverLogin.init();
705                                    NAVER_AUTH_URL = naverLogin.generateAuthorizeUrl();
706                                    $('#naver-login-button').data('authUrl', NAVER_AUTH_URL);
707                                }
708                                break;
709                            case "2": // KAKAO LOGIN
710                                if (this.ssi_state == "0" || this.ssi_key1 == '') {
711                                    $('.sns-login-form-kakao').remove();
712                                }
713                                else {
714                                    KAKAO_CLIENT_ID = this.ssi_key1;
715                                    KAKAO_PLUS_FRIEND_ID = this.ssi_key2;
716
717                                    if (typeof Kakao === 'object') {
718                                        Kakao.init(KAKAO_CLIENT_ID);
719                                    }
720                                }
721                                break;
722                            case "3": // GOOGLE LOGIN
723                                if (this.ssi_state == "0" || this.ssi_key1 
723== '') {
724                                    $('.sns-login-form-google').remove();
725                                }
726                                else {
727                                    GOOGLE_CLIENT_ID = this.ssi_key1;
728                                }
729                                break;
730                        }
731                    });
732
733                    if ($('.sns-login-form').children().length == 0) {
734                        $('.login-divider').remove();
735                    }
736                }
737            },
738            function (xhr) {}
739        );
740    }
741
742</script>
742
743<div class="modal fade join-modal" id="JoinModal" tabindex="-1" role="dialog" style="top: 0px !important;">
744    <div class="modal-dialog">
745        <div class="modal-content">
746<!--            <div class="modal-header" style="padding-bottom: 20px;">-->
747<!--                <div class="modal-header-title">회원가입</div>-->
748<!--            </div>-->
749
750            <div class="modal-body" style="display:grid; max-height: 700px; padding: 2px 15px;">
751                <div class="join-type">
752                    <!-- 회원가입 유형 선택 -->
753                    <div class="join-type-group2">
754<!--                        <span class="join-type-description"></span>-->
755                        <div class="join-type-normal"><div>ID/PW로 가입하기</div></div>
756                    </div>
757                    <div class="join-type-group1">
758<!--                        <span class="join-type-description"></span>-->
759                        <div class="join-type-naver"><img src="/img/ico/login/naver_logo.png"><div>네이버 아이디로 가입하기</div></div>
760                        <div class="join-type-kakao"><img src="/img/ico/login/kakao_logo.png"><div>카카오 아이디로 가입하기</div></div>
761                        <div class="join-type-google"><img src="/img/ico/login/google_new_icon.svg"><div>구글 아이디로 가입하기</div></div>
762                    </div>
763                </div>
764            </div>
765        </div>
766    </div>
767</div>
768<script>
769    $(function() {
770        $('.join-type-normal').on('click', function() {
771            location.href = '/join';
772        });
773
774        $('.modal').on('hidden.bs.modal', function () {
775            $('body').css('padding-right', 0); // 모달 부분에서 버그. padding-right +17px 계속 적용시킴
776        });
777
778        $('#JoinModal').on('show.bs.modal', function () {
779            if (NAVER_CLIENT_ID == '' && KAKAO_CLIENT_ID == '' && GOOGLE_CLIENT_ID == '') {
780                location.href = "/join";
781                return;
782            }
783
784            // NAVER
785            if (NAVER_CLIENT_ID == '') {
786                $('.join-type-naver').remove();
787            }
788            else {
789                $('.join-type-naver').off('click.join');
790                $('.join-type-naver').on('click.join', function() {
791                    location.href = NAVER_AUTH_URL;
792                });
793            }
794
795            // KAKAO
796            if (KAKAO_CLIENT_ID == '') {
797                $('.join-type-kakao').remove();
798            }
799            else {
800                $('.join-type-kakao').off('click.join');
801                $('.join-type-kakao').on('click.join', function() {
802                    Kakao.Auth.login({
803                        success: function(authObj) {
804                            Kakao.API.request({
805                                url: '/v2/user/me',
806                                success: function(res) { onSuccess_kakao(authObj, res); }
807                            });
808                        },
809                        fail: function(err) {
810                            alert(JSON.stringify(err));
811                        }
812                    });
813                });
814            }
815
816            // GOOGLE
817            if (GOOGLE_CLIENT_ID == '') {
818                $('.join-type-google').remove();
819            }
820            else {
821                $('.join-type-google').off('click.join');
822                $('.join-type-google').on('click.join', function() {
823                    gapi.load('auth2', function(){
824                        // Retrieve the singleton for the GoogleAuth library and set up the client.
825                        auth2 = gapi.auth2.init({
826                            client_id: GOOGLE_CLIENT_ID,
827                            cookiepolicy: 'single_host_origin',
828                            plugin_name: 'chat'
829                        });
830
831                        grantPermissions();
832
833                        // API call for Google login
834                        gapi.auth2.getAuthInstance().signIn().then(
835                            function(success) {
836                                // Login API call is successful
837                                onSuccess_google(success);
838                            },
839                            function(error) {
840                                // Error occurred
841                                onFailure_google(error);
842                            }
843                        );
844                    });
845                });
846            }
847        });
848    });
849</script>
849</div>    <!--</div>-->
850</div><!--/container-->
851
852<style>
853User-agent: Yeti
854Allow:/
855</style><!--[NV:S]-->
856
857<!--[NV:E]-->
858<!--[GA:S]-->
vendor: 64 bytes, lines 858-859
858
859<script async src='https://www.googletagmanager.com/gtag/js?id=
859G-B7X1NWR5V1
vendor: 13 bytes, line 859
859'></script>
860<script>
vendor: 128 bytes, lines 861-862
861window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);}
862gtag('js', new Date()); gtag('config', '
862G-B7X1NWR5V1
vendor: 5 bytes, line 862
862');
863</script>
863
864<!--[GA:E]--></body>
865</html>
866
867<!-- 네이버 지도 모듈 호출 -->
868
869
870<script>
871$(document).ready(function(){
872    //live only
873    if($("body .header").hasClass("useFixed")) {
874        $("body").addClass("headerFixed");
875    }
876
877    initHeader9();
878
879    $(".header .header9 .header9-close-btn").click(function(){
880        $(".header .header9").hide();
881        $("body.live").addClass("header9_closed");
882        setCookie("header9_closed", 1, 1);
883        realignHeader9();
884    });
885    if($(".header").hasClass("useFixed")) {
886        qv_on_scroll("init"); //scrolled page load시 init();
887
888        var agent = navigator.userAgent.toLowerCase();
889        if ((navigator.appName == 'Netscape' && agent.indexOf('trident') != -1) || (agent.indexOf("msie") != -1)) {
890            $('body').scroll(function() { qv_on_scroll_ie(); });
891        }
892        else {
893            window.onscroll = function(){ qv_on_scroll(); };
894        }
895
896        //window.onscroll = function(){qv_on_scroll()};
897    }
898
899    // column 내 whitespace가 들어가있는 항목 정리
900    $.each($('.column'), function() {
901        if($(this).html().trim() == '') { $(this).html(''); }
902    });
903
904//    $('.slider-frm').not('.fullpage').find('.carousel').carousel({ swipe: 200 });
905//    $('.slider-frm').not('.fullpage').find('.carousel').carousel(0);
906    $(".carousel").carousel({ swipe: 200 });
907//    $('.carousel').carousel(0);
908
909    var login_require = "";
910    if (login_require == 1) {
911        $('#LoginModal').modal('show');
912        $('#LoginModal .modal-header').append($('<div class="modal-header-title-sub">' + lang.requires_login + '</div>'));
913    }
914
915    /* 2020.01.15 재헌
916       페이지 최초 로드 시 QV_BASE_OBJ.sskey 에 값이 비어있음.
917       쿠키에서 정보를 가져와 채워주도록 함.
918     */
919    if (!QV_BASE_OBJ.sskey || QV_BASE_OBJ.sskey == '') {
920        QV_BASE_OBJ.sskey = getCookie('QVSSID');
921    }
922
923    removeSiteCopiedElement();
924
925    initMobileHeader();
926    // initSnsFeed(); Instagram api denied
927    initPopup();
928    initFixedContents();
929    initMenu();
930    initTabFrame();
931    initSMS();
932    initSliderCallback();
933    initSlider();
934    initFullPageSlider();
935    initSnSIconImage();
936    initPolicyPrivacyModal();
937    initJoinModal();
938    initPageFadeEvent();
939    initCalendar();
940    initLnb();
941
942    initNonScaledImageBox();
943
944    initHeaderSideNav();
945    initMobileHeaderMenu();
946
947    initRss();
948
949    initMouseoverObjects();
950    initLanguageSelector();
951
952    initDownloadButton();
953
954    initInstagramFeed();
955    initDatabaseContents();
956
957    initGrid();
958    initVideo();
959    initFrameLink();
960    initDday();
961    initCountDown();
962    initNotionContents();
963
964    });
965
966$(window).bind("load", function (){
967    initIframe();
968});
969
970function initNotionContents() {
971    //quv-notion-frame iframe을 안내 마크업으로 교체
972    $('iframe.quv-notion-frame').each(function(){
973        var noticeHtml =
974            '<div class="quv-notion-frame quv-notion-notice" style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:260px;box-sizing:border-box;padding:16px;font-family:\'noto sans kr\',\'Apple SD Gothic Neo\',sans-serif;">'
975          +   '<div style="display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;width:100%;max-width:480px;box-sizing:border-box;padding:36px 24px;background:#fff;border:1px solid #ececec;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,0.04);">'
976          +     '<img src="https://quv.kr/img/mail/mail_logo.png" alt="QUV" style="height:32px;margin-bottom:20px;" />'
977          +     '<p style="margin:0 0 10px;font-size:19px;font-weight:700;color:#1f1f1f;line-height:1.35;">노션 임베드(Beta) 기능이 종료됩니다.</p>'
978          +     '<p style="margin:0;font-size:13px;color:#8c8c8c;line-height:1.6;">기존에 노션 임베드를 사용 중인 페이지는<br>더 이상 지원되지 않습니다.<br>노션 공식 iframe 방식<a href="https://quv.kr/customer_help.html?m=read&aid=w5ve8D" target="_blank" style="color:#2f6fed;text-decoration:underline;">(가이드)</a>으로 변경해 주세요.</p>'
979          +     '<div style="margin-top:20px;width:100%;padding:11px 18px;box-sizing:border-box;background:#f5f5f5;border-radius:6px;font-size:13px;color:#555;">서비스 종료 일정: 2026년 4월 17일</div>'
980          +   '</div>'
981          + '</div>';
982        $(this).replaceWith(noticeHtml);
983    });
984    $('.iframe-notion-guide').remove()
985}
986
987function initDday(target) {
988    // 2021.12.17(금) (정빈) D-day 기능
989    const today = new Date()
990    const todayTimeStamp = today.getTime()
991    const ddayTarget = target ? target : $('#main_container .ddayBox')
992
993    ddayTarget.each(function () {
994        const ddayBox = $(this);
995        const ddayArea = ddayBox.find('.dday-area')
996        const userDdayTimeStamp = ddayArea.attr('data-dday')
997        const ddayDistance = userDdayTimeStamp - todayTimeStamp
998        const getDday = Math.floor(ddayDistance / (1000 * 60 * 60 * 24)) + 1
999
1000        if (isNaN(getDday)) {
1001            ddayArea.find('.dday-area-variable').text('-Day')
1002        } else {
1003            const ddayView = getDday >= 0 ? '-'+ getDday : '+' + Math.abs(getDday)
1004            ddayArea.find('.dday-area-variable').text(ddayView)
1005        }
1006    })
1007
1008
1009}
1010
1011function ddayGetDate(date) {
1012    const distance = new Date(date).getTime() - new Date().getTime()
1013    let dateObj = {}
1014    if (distance <= 0 || isNaN(distance)) {
1015        dateObj.setDays = '00'
1016        dateObj.setHours = '00'
1017        dateObj.setMinutes = '00'
1018        dateObj.setSeconds = '00'
1019    } else {
1020        const days = Math.floor(distance / (1000 * 60 * 60 * 24))
1021        const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) - 9
1022        const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60))
1023        const seconds = Math.floor((distance % (1000 * 60)) / 1000)
1024
1025        dateObj.setDays = days > 9 ? days : '0' + days
1026        dateObj.setHours = hours > 9 ? hours : '0' + hours
1027        dateObj.setMinutes = minutes > 9 ? minutes : '0' + minutes
1028        dateObj.setSeconds = seconds > 9 ? seconds : '0' + seconds
1029    }
1030    return dateObj
1031}
1032
1033// 글로벌 setInterval 관리
1034let countdownInterval = null
1035function initCountDown() {
1036    let isCountDownExist = false
1037
1038    function ddayCountDown () {
1039        $('#main_container .ddayBox .view').each(function () {
1040            if ($(this).find('.dday-area-countdown').css('display') === 'block') {
1041                const vBox = $(this)
1042                const getDate = Number(vBox.find('.dday-area').attr('data-dday'))
1043                const setDays = ddayGetDate(getDate).setDays
1044                const setHours = ddayGetDate(getDate).setHours
1045                const setMinutes = ddayGetDate(getDate).setMinutes
1046                const setSeconds = ddayGetDate(getDate).setSeconds
1047
1048                vBox.find('.dday-area').find('.days-value').text(setDays)
1049                vBox.find('.dday-area').find('.hours-value').text(setHours)
1050                vBox.find('.dday-area').find('.minutes-value').text(setMinutes)
1051                vBox.find('.dday-area').find('.seconds-value').text(setSeconds)
1052            }
1053        })
1054    }
1055
1056    $('#main_container .ddayBox .view').each(function () {
1057        if($(this).find('.dday-area-countdown').css('display') === 'block') {
1058            ddayCountDown()
1059            isCountDownExist = true
1060            return false
1061        }
1062    })
1063
1064    if (isCountDownExist) {
1065        clearInterval(countdownInterval)
1066        countdownInterval = setInterval(ddayCountDown,1000)
1067    }
1068}
1069
1070
1071function initFrameLink(target) {
1072    if (!target) {
1073        target = $('.frm, .box');
1074    }
1075
1076    target.each(function() {
1077        const area = $(this);
1078        const href = area.attr('href');
1079        if (href) {
1080            let targetAttr = '';
1081            const target = area.attr('target');
1082            if (target && target !== '') {
1083                targetAttr = 'target="' + target + '"';
1084            }
1085
1086            area.append('<a class="link-wrapper" href="' + href + '" ' + targetAttr + '></a>')
1087        }
1088    });
1089}
1090
1091function initHeaderSearch() {
1092    /* 2021.11.01
1093     * 게시판 통합검색(헤더)
1094     */
1095    /* Search button */
1096    $('#main_container').delegate('.header-search-bar-button', 'click', function() {
1097        headerSearchAllBoard();
1098    });
1099    /* Search bar keyup */
1100    $('#main_container').delegate('#header-search-bar', 'keyup', function(event) {
1101        if (event.keyCode == 13) {
1102            headerSearchAllBoard();
1103        }
1104    });
1105
1106    /* Search Icon */
1107    $('#main_container').delegate('.header-search-icon-button', 'click', function() {
1108        $('#main_container').append(
1109            '<div class="header-search-dialog">' +
1110                '<div class="header-search-dialog-close"></div>' +
1111                '<div class="header-search-dialog-body">' +
1112                    '<div>' +
1113                        '<input type="text" id="header-search-bar" placeholder="검색어를 입력해주세요."/>' +
1114                        '<i class="icon-magnifier header-search-bar-button"></i>' +
1115                    '</div>' +
1116                '</div>' +
1117            '</div>'
1118        );
1119    });
1120    $('#main_container').delegate('.header-search-dialog-close', 'click', function() {
1121        $('.header-search-dialog').remove();
1122    })
1123}
1124
1125function headerSearchAllBoard(page) {
1126    const targetPage = page ? page : 1;
1127    const keyword = $('#header-search-bar').val();
1128    if (keyword) {
1129        window.location = '/module/board/search.html?keyword=' + keyword + '&page=' + targetPage
1130    } else {
1131        alert('검색어를 입력해주세요.');
1132    }
1133}
1134
1135function initVideo() {
1136    $('#main_container').delegate('.videoBox[data-popup="1"]', 'click', function() {
1137        // 지연 로드로 아직 src 가 없을 수 있어 data-src 로 폴백한다
1138        let src = $(this).find('iframe').attr('src') || $(this).find('.video-iframe').attr('data-src');
1139        // src = src.indexOf('&autoplay=1') > 0 ? src : src + '&autoplay=1&mute=1&muted=1';
1140
1141        $('#main_container').append(
1142            '<div class="video-popup"><div><iframe src="' + src + '"></iframe></div></div>'
1143        );
1144    });
1145
1146    $('#main_container').delegate('.video-popup', 'click', function() {
1147        if ($(this).parent().attr('id') === 'main_container') {
1148            $(this).remove();
1149        }
1150    })
1151}
1152
1153function initGrid(target) {
1154    const gridBoxes = target ? target : $('.gridBox');
1155    if (gridBoxes.length > 0) {
1156        function setGridHeaderHeight(target, height) {
1157            const gridOption = target.data('gridOption');
1158            if (gridOption) {
1159                gridOption.api.setHeaderHeight(parseInt(height));
1160            }
1161        }
1162
1163        function setGridRowHeight(target, height) {
1164            const gridOption = target.data('gridOption');
1165            if (gridOption) {
1166                gridOption.api.forEachNode(function (rowNode) {
1167                    rowNode.setRowHeight(parseInt(height));
1168                });
1169                gridOption.api.onRowHeightChanged();
1170            }
1171        }
1172
1173        $.getScript('/js/xlsx/ag-grid.js', function() {
1174            gridBoxes.each(function() {
1175                const gridBox = $(this);
1176                const columnDefs = gridBox.attr('columnDefs');
1177                const rowData = gridBox.attr('rowData');
1178                if (columnDefs && rowData) {
1179                    gridBox.find('.grid-area').children().remove();
1180
1181                    const _columnDefs = JSON.parse(columnDefs).map(function(r, i) {
1182                        r.lockPosition = true;
1183                        delete r.rowDrag;
1184                        return r;
1185                    });
1186                    const _gridOption = {
1187                        columnDefs: _columnDefs,
1188                        defaultColDef: {
1189                            minWidth: 110,
1190                            editable: false,
1191                            resizable: false,
1192                        },
1193                        domLayout: 'autoHeight',
1194                        cellStyle: {'white-space': 'normal'},
1195                        rowData: JSON.parse(rowData),
1196                        animateRows: true,
1197                        scrollbarWidth: 4,
1198                    };
1199
1200                    const gridElement = gridBox.find('.grid-area')[0];
1201                    new agGrid.Grid(gridElement, _gridOption);
1202
1203                    gridBox.data('gridOption', _gridOption);
1204
1205                    const gridHeightHeader = gridBox.attr('headerHeight');
1206                    if (gridHeightHeader) {
1207                        setGridHeaderHeight(gridBox, gridHeightHeader);
1208                    }
1209
1210                    const gridRowHeight = gridBox.attr('rowHeight');
1211                    if (gridRowHeight) {
1212                        setGridRowHeight(gridBox, gridRowHeight);
1213                    }
1214
1215                    gridBox.find('.grid-area').show();
1216                }
1217            })
1218        })
1219    }
1220}
1221
1222function initIframe(elements) {
1223        const iframes = elements ? elements : $('.iframeBox')
1224    iframes.each(function() {
1225        // 탭에 속해있지만 활성화 되지 않은 상태이면 초기화 하지 않음
1226        if ($(this).parents('.tab-frm').length > 0
1227            && $(this).parents('.tab-pane.active').length === 0) {
1228            return;
1229        }
1230
1231        const target = $(this).find('.iframe-area');
1232        const value = target.attr('data-iframe-html');
1233        const height = $(this).attr('data-hei');
1234
1235        if (value) {
1236            const decodeValue = decodeURIComponent(value);
1237            var regex = /(?:<iframe[^>]*)(?:(?:\/>)|(?:>.*?<\/iframe>))/g;
1238            var divs = $(decodeValue).filter(function(i, v) { return v.tagName === 'div' || v.tagName === 'DIV' });
1239
1240            /* TAG: Iframe */
1241            if (regex.test(decodeValue) && divs.length === 0) {
1242                // do nothing
1243                var iframe = decodeValue.match(regex)[0];
1244                target.html($(iframe));
1245            }
1246            /* TAG: No Iframe */
1247            else {
1248                setIframeBox(target, decodeValue, height)
1249            }
1250            // if (QV_BASE_OBJ.stid === "cxzvffdy1") {
1251            //     alert(navigator.userAgent)
1252            // }
1253        }
1254    });
1255
1256    function setIframeBox(target, value, height) {
1257        // 기존 iframe 제거
1258        target.find('iframe').remove();
1259        target.removeAttr('data-iframe-html');
1260
1261        const iframe = document.createElement('iframe');
1262        iframe.className = 'wrap-in-iframe';
1263        iframe.style = 'height: ' + height + 'px';
1264
1265        target.append($(iframe));
1266        target.removeAttr('data-iframe-html');
1267
1268        const context = iframe.contentWindow.document;
1269        context.open();
1270        context.write(value);
1271        context.close();
1272
1273        // iframe 추가
1274        // if (typeof(qv_func.isInAppBrowser) !== 'undefined' && qv_func.isInAppBrowser()) {
1275        //     script 태그 내 document scope가 parent로 잡히는 문제
1276        //     const iframe = document.createElement('iframe');
1277        //     iframe.className = 'wrap-in-iframe';
1278        //     target.append($(iframe));
1279        //     target.removeAttr('data-iframe-html');
1280        //
1281        //     // iframe html 세팅
1282        //     const context = iframe.contentWindow.document;
1283        //     const body = $('body', context);
1284        //     body.html(value);
1285        // } else {
1286        //     in-app 브라우저에서 작동하지 않음
1287        //     var iframe = document.createElement('iframe');
1288        //     var html = '<body>' + value + '</body>';
1289        //     iframe.src = 'data:text/html;charset=utf-8,' + encodeURIComponent(html);
1290        //     target.append($(iframe));
1291        // }
1292
1293        // iframe 높이 할당
1294        // const interval = setInterval(function() {
1295        //     const h = $(iframe).css('height');
1296        //     if (h != '100%') {
1297        //         clearInterval(interval);
1298        //         $(iframe).parents('.iframeBox').height(h);
1299        //     }
1300        // },100);
1301        // var iframeBoxInterval = window.setInterval(function() {
1302        //     if (iframe.contentWindow.document.readyState === "complete") {
1303        //         window.clearInterval(iframeBoxInterval);
1304        //         // grab the content of the iframe here
1305        //         console.log('iframebox loaded')
1306        //     }
1307        // }, 100);
1308
1309    }
1310    }
1311//
1312// function initFilter() {
1313//     if ($('.filter-area').length == 0) return;
1314//
1315//     $('body').delegate('.filter-item', 'click', function() {
1316//         $(this).toggleClass('active');
1317//
1318//         if ($('.filter-item.active').length == 0) {
1319//             $('.gallery-board-box').removeClass('disapear');
1320//
1321//         }
1322//         else {
1323//             $.each($('.filter-item'), function() {
1324//                 var filter_code = $(this).find('.filter-item-name').text();
1325//                 if ($(this).hasClass('active')) {
1326//                     $('.gallery-board-box[data-filter-code="' + filter_code + '"]').removeClass('disapear');
1327//                 }
1328//                 else {
1329//                     $('.gallery-board-box[data-filter-code="' + filter_code + '"]').addClass('disapear');
1330//                 }
1331//             });
1332//         }
1333//     });
1334//
1335//     $('body').delegate('.filter-header', 'click', function() {
1336//         $('.filter-body').toggleClass('active');
1337//         if ($('.filter-body').hasClass('active')) {
1338//             $(this).parents('.box').css('border-bottom', '1px solid #eee');
1339//         }
1340//         else {
1341//             $(this).parents('.box').css('border-bottom', 'none');
1342//         }
1343//     });
1344//
1345//     $.each($('.gallery-board-box'), function() {
1346//        var filter_code = $(this).find('.gallery-board-caption-title > span').text();
1347//        $(this).attr('data-filter-code', filter_code);
1348//     });
1349// }
1350//
1351// function initColorChip() {
1352//     if ($('.color-chip-area').length == 0) return;
1353//
1354//     $('#main_container').delegate('.color-chip-item', 'click', function() {
1355//         var url = $(this).attr('data-url');
1356//         var target = $(this).parents('.color-chip-container').siblings('.color-chip-image');
1357//
1358//         var temp_image = new Image();
1359//         temp_image.src = url;
1360//         $(temp_image).one('load',function() {
1361//             $(target).attr('src', url);
1362//         });
1363//
1364//         $(this).siblings('.color-chip-item').removeClass('active');
1365//         $(this).addClass('active');
1366//     });
1367//
1368//     $.each($('.color-chip-area'), function() {
1369//        $(this).find('.color-chip-item').first().trigger('click');
1370//     });
1371// }
1372
1373function initDatabaseContents() {
1374    if ($('.databaseContentsBox').length > 0) {
1375        let DATABASE_CONTENTS = {};
1376        $.each($('.databaseContentsBox'), function () {
1377            const area = $(this).find('.dbc-area');
1378            const id = area.attr('data-id');
1379            const count = area.attr('data-count');
1380            const paging = area.attr('data-paging');
1381            const matrix = area.children('.dbc-item:first-of-type').clone();
1382
1383            qvjax_direct(
1384                "select_database_contents",
1385                "/module/dbc/databaseContents.php",
1386                '&cid=' + id,
1387                function (data) {
1388                    if (data.length > 0) {
1389                        // const column_defs = JSON.parse(data[0].column_defs);
1390                        const row_data = JSON.parse(data[0].row_data.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t"));
1391                        const size = Math.ceil(row_data.length / count);
1392                        DATABASE_CONTENTS[id] = {
1393                            data: row_data,
1394                            size: size,
1395                        };
1396
1397                        // let pagingHtml = '<div class="dbc-paging">';
1398                        for (let i = 1; i <= size; i++) {
1399                            // pagingHtml += '<span data-id="' + id + '" data-page="' + i + '" class="' + (i == 1 ? 'active' : '') + '">' + i + '</span>';
1400                            DATABASE_CONTENTS[id][i] = DATABASE_CONTENTS[id]['data'].slice(count * (i-1), count * i);
1401                        }
1402                        // pagingHtml += '</div>';
1403                        if (paging == 1) {
1404                            // area.after(pagingHtml);
1405                            area.after('<div class="pager"><ol class="paging-btn-group"></ol></div>');
1406                            buildDatabaseContentsPagingHtml(DATABASE_CONTENTS[id], area, 1);
1407                        }
1408
1409
1410                        pagingDatabaseContents(DATABASE_CONTENTS[id][1], matrix, area);
1411                    }
1412
1413                    area.show();
1414                },
1415                function (xhr) {}
1416            );
1417        });
1418
1419        $('.databaseContentsBox').delegate('.pager li', 'click', function() {
1420            const area = $(this).parents('.databaseContentsBox').find('.dbc-area');
1421            const matrix = area.children('.dbc-item:first-of-type').clone();
1422            const id = area.attr('data-id');
1423            const page = $(this).attr('value');
1424            const databaseContents = DATABASE_CONTENTS[id];
1425
1426            if (databaseContents) {
1427                buildDatabaseContentsPagingHtml(databaseContents, area, page);
1428                pagingDatabaseContents(databaseContents[page], matrix, area);
1429
1430                if (isMobile()) {
1431                    const scrollY = area.offsetTop();
1432                    $("html, body").animate({scrollTop: scrollY - 50}, 500);
1433                }
1434            }
1435        });
1436
1437        function buildDatabaseContentsPagingHtml(databaseContents, area, page) {
1438            var page = parseInt(page);
1439            var size = databaseContents.size;
1440            var pagingStart;
1441            var pagingEnd;
1442            var html = '';
1443
1444            if (page - 2 <= 0) {
1445                pagingStart = 1;
1446                pagingEnd = Math.ceil(size) >= pagingStart + 4 ? 5 : Math.ceil(size);
1447            }
1448            else if (page + 2 >= Math.ceil(size)) {
1449                pagingStart = Math.ceil(size) - 4 <= 0 ? 1 : Math.ceil(size) - 4;
1450                pagingEnd = Math.ceil(size);
1451            }
1452            else {
1453                pagingStart = page - 2;
1454                pagingEnd = page + 2;
1455            }
1456            html += '<li class="paging-btn-group__item left" value="1">';
1457            html += '<i class="i-chevron-left"></i>';
1458            html += '</li>';
1459            for(var i = pagingStart; i <= pagingEnd; i ++) {
1460                var buttonClassName = i == page ? 'btn btn--basic active' : 'btn btn--basic';
1461                html += '<li class="paging-btn-group__item" value="' + i + '">';
1462                html += '<button class="' + buttonClassName + '"><span>' + i;
1463                html += '</span></button></li>';
1464            }
1465            html += '<li class="paging-btn-group__item right" value="' + size + '">';
1466            html += '<i class="i-chevron-right"></i>';
1467            html += '</li>';
1468
1469            area.next('.pager').find('.paging-btn-group').children('.paging-btn-group__item').remove();
1470            area.next('.pager').find('.paging-btn-group').append(html);
1471        }
1472
1473        function pagingDatabaseContents(data, matrix, area) {
1474            const $frag = $(document.createDocumentFragment());
1475            area.children('.dbc-item').remove();
1476            $.each(data, function() {
1477                const clone = matrix.clone();
1478                const rowData = this;
1479                $.each(clone.find('.dbc-contents-item'), function() {
1480                    const connect = $(this).attr('data-connect');
1481                    const type = $(this).attr('data-type');
1482
1483                    switch (type) {
1484                        case '1':
1485                        case '3':
1486                            $(this).find('p:last-of-type').text(rowData[connect]);
1487                            break;
1488                        case '2':
1489                            $(this).find('img').attr('src', typeof rowData[connect] === 'string' ? rowData[connect].trim() : rowData[connect]);
1490                            break;
1491                    }
1492                });
1493                clone.find('style').remove();
1494                clone.attr('data-id', this.id);
1495                $frag.append(clone);
1496            });
1497            area.append($frag);
1498        }
1499
1500
1501        $('body').delegate('.databaseContentsBox .dbc-area[data-detail="1"] .dbc-item', 'click', function() {
1502            const page = $(this).parents('.dbc-area').first().attr('data-id');
1503            const id = $(this).attr('data-id');
1504
1505            if (page && id) {
1506                location = '/' + page + '?id=' + id;
1507            } else {
1508                alert('데이터 컨텐츠 설정 오류', page, id);
1509            }
1510        });
1511    }
1512}
1513
1514function initDownloadButton() {
1515    $('#main_container').delegate('.qv-file-download', 'click', function() {
1516        var url = $(this).attr('data-download-url');
1517        if (!url || url == '') return;
1518
1519        var name = $(this).attr('data-download-url').split('/').pop();
1520        url = url.split('/').reduce(function(p, c, idx) {
1521            var slash = (c == '') ? '//' : '/';
1522            var add = (idx == url.split('/').length -1) ? encodeURIComponent(c) : c + slash;
1523            return p + add;
1524        });
1525
1526        if ((navigator.userAgent.toLowerCase().indexOf('safari') > -1 &&
1527            navigator.userAgent.toLowerCase().indexOf('chrome') == -1) ||
1528            is_InternetExplorer()) {
1529            var a = $("<a>").attr("href", url).attr("download", name).appendTo("body");
1530            a[0].click();
1531            a.remove();
1532        }
1533        else {
1534            post_redirect('/module/board/download.php', {'url': url, 'name': name}, '_top');
1535        }
1536    });
1537}
1538
1539function initLanguageSelector() {
1540    if ($('.header .languageSelectorBox').length > 0) {
1541        var LANGUAGE_CODE = {
1542            'ko': '한국어',
1543            'en': 'English',
1544            'ja': '日本語',
1545            'zh-chs': '中文(简体)',
1546            'zh-cht': '中文(繁體)',
1547            'es-ar': 'Español (Argentina)',
1548            'en-au': 'English (Australia)',
1549            'pt-br': 'português (Brasil)',
1550            'en-ca': 'English (Canada)',
1551            'de': 'Deutsch',
1552            'fr': 'français',
1553            'en-uk': 'English (UK)',
1554            'id': 'Bahasa Indonesia',
1555            'en-in': 'English (India)',
1556            'it': 'italiano',
1557            'es-mx': 'Español (Mexico)',
1558            'ru': 'Русский',
1559            'ar-sa': 'العربية',
1560            'th': 'ไทย',
1561            'tr': 'Türkçe',
1562            'vn': 'Tiếng Việt',
1563            'en-za': 'English (South Africa)',
1564        };
1565        
1566        $('body').delegate('.language-selector.language-type-3', 'click', function() {
1567            if ($(this).find('.language-dropdown').length > 0) {
1568                $(this).find('.language-dropdown').remove();
1569            }
1570            else {
1571                var html = '<div class="language-dropdown">';
1572                $.each($(this).find('.language-selector-flag'), function() {
1573                    var lang = $(this).attr('data-lang');
1574                    var href = $(this).children('a').attr('href');
1575                    var target = $(this).children('a').attr('target') ? $(this).children('a').attr('target') : '_self';
1576                    html += '<div class="language-dropdown-item"><a href="' + href + '" target="' + target + '">' + LANGUAGE_CODE[lang] + '</a></div>';
1577                });
1578                html += '</div>';
1579            }
1580            $(this).append(html);
1581
1582            // 2020.12.04 높이 지정 불필요함
1583            // var top = $(this).position().top + 40;
1584            // $('.language-dropdown').css('top', top);
1585        });
1586    }
1587}
1588
1589function initMouseoverObjects() {
1590    // mouseover 객체 내에 애니메이션 컨텐츠가 있으면 hover 에서도 동작하도록 하는 코드.
1591    // 오동작이 있기 때문에 다시 구축해야 함
1592    // $('#main_container').delegate('.mouseover-frm', 'mouseenter', function() {
1593    //     console.log('enter');
1594    //     $.each($(this).find('.mouseover-after'), function() {
1595    //         var elm = this;
1596    //         var newone = elm.cloneNode(true);
1597    //         elm.parentNode.replaceChild(newone, elm);
1598    //     });
1599    // });
1600    // $('#main_container').delegate('.mouseover-frm', 'mouseleave', function() {
1601    //     console.log('enter');
1602    //     $.each($(this).find('.mouseover-before'), function() {
1603    //         var elm = this;
1604    //         var newone = elm.cloneNode(true);
1605    //         elm.parentNode.replaceChild(newone, elm);
1606    //     });
1607    // });
1608
1609    function resizeMouseoverFrame(mouseoverFrame) {
1610        var before = mouseoverFrame.find('.mouseover-before').first();
1611        var after = mouseoverFrame.find('.mouseover-after').first();
1612        var mouseover_height = before.height() > after.height() ? before.height() : after.height();
1613        if (mouseover_height == 0) {
1614            var data_height = mouseoverFrame.attr('data-hei') ? parseInt(mouseoverFrame.attr('data-hei')) : 0;
1615            data_height = data_height == 0 ? mouseoverFrame.find('.imgBox:first').height() : data_height;
1616            mouseover_height = data_height;
1617        }
1618
1619        if (mouseoverFrame.height() < mouseover_height) {
1620            var tb = mouseoverFrame.children('.view').children('.tb');
1621            // tb.height(mouseover_height);
1622            if (tb.length > 0) {
1623                tb.get(0).style.setProperty('height', mouseover_height + 'px', 'important');
1624            }
1625        }
1626    }
1627
1628    $(window).bind("load",function() {
1629        // tb의 높이보다 하위 컨텐츠의 높이가 더 클 경우 tb의 높이를 맞춰준다.
1630        // mouseover 객체들이 absolute로 전환되기 때문에 높이를 수동으로 지정해주지 않으면 컨텐츠들이 겹치게 됨
1631        $.each($('#main_container .mouseover-frm'), function() {
1632            const mouseoverFrame = $(this);
1633            mouseoverFrame.find('.box').each(function(i, val) {
1634                $(val).addClass('displayed');
1635            });
1636
1637            // mouseover frame 내 이미지를 모두 호출한 뒤 위치를 다시 잡아준다
1638            let loadCompleteCount = 0;
1639            const imageCore = $(this).find('.img-core');
1640            const imageCount = imageCore.length;
1641            if (imageCount === 0) {
1642                resizeMouseoverFrame(mouseoverFrame);
1643            } else {
1644                imageCore.each(function() {
1645                    const img = new Image();
1646                    const bg = $(this).css('background-image');
1647                    if (bg.indexOf('url(') === 0) {
1648                        img.src = bg.replace('url(','').replace(')','').replace(/\"/gi, "");
1649                        $(img).one('load',function(){
1650                            loadCompleteCount++;
1651                            if (loadCompleteCount === imageCount) {
1652                                resizeMouseoverFrame(mouseoverFrame);
1653                            }
1654                        })
1655                    } else {
1656                        loadCompleteCount++;
1657                        if (loadCompleteCount === imageCount) {
1658                            resizeMouseoverFrame(mouseoverFrame);
1659                        }
1660                    }
1661                })
1662            }
1663        });
1664
1665        // 이미지 박스 전용 mouseover
1666        // 향후 실제 사용여부는 확인필요
1667        $.each($('#main_container .imgBox'), function() {
1668            var mouseover_image = $(this).find('.img-core').attr('data-mouseover-image');
1669            if (mouseover_image) {
1670                var image = $(this).find('.img-core');
1671                var dummy = $(this).find('.img-core-dummy');
1672                image.attr('data-default-image', image.css('background-image'));
1673
1674                $(this).on('mouseenter', function () {
1675                    console.log('imgBox mouse enter');
1676                    image.css('background-image', image.attr('data-mouseover-image'));
1677                    dummy.attr('src', image.attr('data-mouseover-image').replace('url(', '').replace(')', '').replace(/\"/gi, ""))
1678                });
1679
1680                $(this).on('mouseleave', function () {
1681                    console.log('imgBox mouse leave');
1682                    image.css('background-image', image.attr('data-default-image'));
1683                    dummy.attr('src', image.attr('data-default-image').replace('url(', '').replace(')', '').replace(/\"/gi, ""))
1684                });
1685            }
1686        });
1687    });
1688}
1689
1690function initMobileFooterFixedContents() {
1691    if (isMobile() && $('.footer-fixed-contents').length > 0) {
1692        $(window).bind("load",function() {
1693            // fixed 크기만큼 페이지 최하단에 공백넣음
1694            var footer_fixed = $('.footer-fixed-contents');
1695            var empty_div = '<div style="height:' + footer_fixed.height() + 'px;"></div>';
1696            $('.footer-frame-mobile').after($(empty_div));
1697        });
1698    }
1699}
1700
1701function initHeaderOverflowMenuResizeEvent() {
1702    var column;
1703    $.each($('#main_container .header .al-box'), function() {
1704        if ($(this).children('ul.mn-ul').length > 0 &&
1705            $(this).find('.mn-item').length > 0) {
1706            column = $(this);
1707        }
1708    });
1709    if (column) {
1710        headerOverflowMenuInit(column);
1711    }
1712
1713    $(window).resize(function() {
1714        if(this.resizeTO) clearTimeout(this.resizeTO);
1715        this.resizeTO = setTimeout(function() {
1716            $(this).trigger('resizeEnd');
1717        }, 100);
1718    });
1719    $(window).bind('resizeEnd', function() {
1720        if (column) {
1721            headerOverflowMenuInit(column);
1722        }
1723    });
1724}
1725
1726function headerOverflowMenuInit(column) {
1727    if (column.children('ul.mn-ul').length == 0) { return; }
1728
1729    var column_width = 0;
1730    var box_width = 0;
1731    var overflow_menu = [];
1732
1733    var container = column.parents('#main_container');
1734    var menu = column.children('ul.mn-ul');
1735    var header_contents = column.parents('.header-contents').first();
1736    var header = header_contents.parent();
1737    var header_width = column.parent().css('width');
1738    if (header_width.indexOf('%') > -1) {
1739        // %로 리턴됨 -> px 값 계산해서 처리 (IE에서 가끔 %로 넘어옴)
1740        header_width = $(window).width() * parseInt(header_width) / 100;
1741    }
1742    else {
1743        // px로 리턴 -> 그대로 처리
1744        header_width = parseInt(header_width);
1745    }
1746
1747    $.each(column.children('div.box'), function() {
1748        box_width += $(this).width();
1749        box_width += parseInt($(this).css('padding-left'))
1750        box_width += parseInt($(this).css('padding-right'))
1751    });
1752    column_width += box_width;
1753
1754    container.find('.mn-item').removeClass('mn-item-overflow');
1755    $.each(menu.children('.mn-item').not('.mn-item-overflow-list'), function() {
1756        column_width += $(this).width();
1757
1758        if (header_width < column_width + 110) {
1759            $(this).addClass('mn-item-overflow');
1760            overflow_menu.push($(this));
1761        }
1762    });
1763
1764    if (overflow_menu.length > 0) {
1765        if (menu.find('headerstart').length == 0) { menu.prepend('<headerstart></headerstart>'); }
1766        if (menu.find('headerend').length == 0) { menu.append('<headerend></headerend>'); }
1767
1768        if (menu.find('.mn-item-overflow-list').length == 0) {
1769            var html = '<li class="mn-item mn-item-overflow-list"> <a class="mn-link"><i class="icon-options" aria-hidden="true"></i></a> <div class="header-overflow-pop"><ul></ul></div></li>';
1770            menu.find('headerend').before($(html));
1771        }
1772
1773        container.find('.header-overflow-pop ul li').remove();
1774        $.each(overflow_menu, function() {
1775            var clone = $(this).clone();
1776            clone.find('ul.sub-mn').remove(); // clone 내부에서 제거
1777            menu.find('.header-overflow-pop ul').append(clone);
1778        });
1779    }
1780    else {
1781        container.find('.mn-item-overflow-list').remove();
1782    }
1783}
1784
1785
1786function initMobileHeaderMenu() {
1787    if ((isMobile() && window.innerWidth <= 767) && $('.header').length > 0) {
1788        // menu touch
1789        if ($('.header-mobile .column > ul.mn-ul').length > 0) {
1790            // 현재 활성화된 페이지의 메뉴 위치 잡기
1791            $(window).bind("load",function() {
1792
1793                // 서브메뉴 추가
1794                if ($('.header-mobile .column > ul.mn-ul').data('sub')) {
1795                    if ($('.header-mobile .column > ul.mn-ul .mn-item.cur-mn-item > ul.sub-mn > li.mn-item').length > 0) { // 메인 메뉴 중에 cur-mn-item이 존재할 경우
1796                        var sub_mn = $('.header-mobile .column > ul.mn-ul .mn-item.cur-mn-item > ul.sub-mn');
1797                    }
1798                    else if ($('.header-mobile .column > ul.mn-ul .mn-item > ul.sub-mn > li.mn-item.cur-mn-item').length > 0) { // 서브 메뉴 중에 cur-mn-item이 존재할 경우
1799                        var sub_mn = $('.header-mobile .column > ul.mn-ul .mn-item > ul.sub-mn > li.mn-item.cur-mn-item').parent();
1800                    }
1801                    if (sub_mn) {
1802                        var header_contents = sub_mn.parents('.header-contents');
1803                        var sub_html = '<div class="col-xs-12 header-mobile-sub-menu" style="' +
1804                                'padding: 0 10px;' +
1805                                'margin-top: ' + header_contents.css('border-bottom-width') + ';' +
1806                                'border-bottom: ' +  header_contents.css('border-bottom') + ';' +
1807                                '">' +
1808                            '<div class="al-box column al-l">' +
1809                            '<ul class="mn-ul tc box hsync" style="display: table-cell; transform: translate3d(0px, 0px, 0px); height: ' + $(header_contents).height() + 'px;">' +
1810                            '<div class="preview"></div>' +
1811                            '<headerstart></headerstart>' +
1812                            sub_mn.html() +
1813                            '<headerend></headerend>' +
1814                            '</ul>' +
1815                            '</div>' +
1816                            '</div>';
1817                        sub_html = $(sub_html).css('background', header_contents.css('background'));
1818                        sub_html = $(sub_html).css('border-bottom', header_contents.css('border-bottom'));
1819                        header_contents.append($(sub_html));
1820
1821                        var header_cur = header_contents.parent();
1822                        var header_next = header_cur.next('div');
1823                        $.each(header_next, function () {
1824                            var top = 0;
1825                            $.each($(this).prev('div'), function () {
1826                                top += $(this).find('.header-contents').height();
1827                                top += $(this).find('.header-contents > div:last-child').height();
1828                            });
1829                            $(this).attr('data-top', top);
1830                            $(this).css('top', top);
1831                        });
1832                    }
1833                }
1834
1835                if ($('.header-mobile .column > ul.mn-ul .mn-item.cur-mn-item').length > 0) {
1836                    var cur = $('.header-mobile .column > ul.mn-ul .mn-item.cur-mn-item').last();
1837                    var ul = cur.parents('ul.mn-ul').first();
1838                    var pos = cur[0].offsetLeft * -1;
1839                    var width = ul.parents('.column').parent().width();
1840                    var max = (ul.width() - width) * -1;
1841                    pos = pos < 0 ? pos : 0;
1842                    max = max < 0 ? max : 0;
1843                    pos = pos <= max ? max : pos;
1844                    ul.css('transform', 'translate3d(' + pos + 'px, 0, 0)');
1845                    ul.data('pos', pos);
1846                }
1847
1848                var startPoint;
1849                $('#main_container').delegate('.header-mobile .column > ul.mn-ul', "touchstart", function (e) {
1850                    startPoint = e.originalEvent.touches[0].screenX;
1851
1852                    var pos = parseInt($(this).data('pos'));
1853                    if (!pos) {
1854                        $(this).data('pos', 0);
1855                    }
1856                });
1857                $('#main_container').delegate('.header-mobile .column > ul.mn-ul', "touchmove", function (e) {
1858                    var event = e.originalEvent;
1859                    var x = event.touches[0].screenX;
1860                    var diff = x - startPoint;
1861                    var width = $(e.currentTarget).parents('.column').parent().width();
1862                    var max = ($(this).width() - width) * -1;
1863
1864                    var pos = parseInt($(this).data('pos'));
1865                    pos += diff;
1866                    pos = pos < 0 ? pos : 0;
1867                    max = max < 0 ? max : 0;
1868                    pos = pos <= max ? max : pos;
1869                    $(this).css('transform', 'translate3d(' + pos + 'px, 0, 0)');
1870                });
1871                $('#main_container').delegate('.header-mobile .column > ul.mn-ul', "touchend", function () {
1872                    if ($(this).css('transform').indexOf('matrix') > -1) {
1873                        $(this).data('pos', $(this).css('transform').split(',')[4].trim());
1874                    }
1875                });
1876            });
1877
1878            // 카테고리 항목 클릭 시 하위 페이지가 있으면
1879            // 해당 페이지 목록(header-mobile-sub-menu)을 동적으로 만들어준다
1880            $('#main_container').delegate('.header-mobile .al-box > .mn-ul > .mn-item > .mn-link:not([href])', 'click', function() {
1881                if ($('.header-mobile .column > ul.mn-ul').data('sub')) {
1882                    var sub_mn = $(this).siblings('ul.sub-mn');
1883                    if (sub_mn) {
1884                        $('.header-mobile-sub-menu').remove();
1885
1886                        var header_contents = sub_mn.parents('.header-contents');
1887                        var sub_html = '<div class="col-xs-12 header-mobile-sub-menu" style="' +
1888                            'padding: 0 10px;' +
1889                            'margin-top: ' + header_contents.css('border-bottom-width') + ';' +
1890                            'border-bottom: ' +  header_contents.css('border-bottom') + ';' +
1891                            '">' +
1892                            '<div class="al-box column al-l">' +
1893                            '<ul class="mn-ul tc box hsync" style="display: table-cell; transform: translate3d(0px, 0px, 0px); height: ' + $(header_contents).height() + 'px;">' +
1894                            '<div class="preview"></div>' +
1895                            '<headerstart></headerstart>' +
1896                            sub_mn.html() +
1897                            '<headerend></headerend>' +
1898                            '</ul>' +
1899                            '</div>' +
1900                            '</div>';
1901                        sub_html = $(sub_html).css('background', header_contents.css('background'));
1902                        sub_html = $(sub_html).css('border-bottom', header_contents.css('border-bottom'));
1903                        header_contents.append($(sub_html));
1904
1905                        var header_cur = header_contents.parent();
1906                        var header_next = header_cur.next('div');
1907                        $.each(header_next, function () {
1908                            var top = 0;
1909                            $.each($(this).prev('div'), function () {
1910                                top += $(this).find('.header-contents').height();
1911                                top += $(this).find('.header-contents > div:last-child').height();
1912                            });
1913                            $(this).attr('data-top', top);
1914                            $(this).css('top', top);
1915                        });
1916                    }
1917                }
1918            });
1919        }
1920
1921        // section merge
1922        // var section_merge = $('.header-mobile > .header1').data('section-merge');
1923        // if (section_merge == false || location.pathname.indexOf('/module/board') > -1) { // merge = false 거나 게시글 쓰기/읽기 에서는 헤더영역 확보
1924        //     var height = 0;
1925        //     $.each($('.header-mobile > div'), function() {
1926        //         height += parseInt($(this).attr('data-hei'));
1927        //     });
1928        //     $('#main_container > .body')[0].style.setProperty('margin-top', height + 'px', 'important');
1929        // }
1930        // else if (section_merge == true) {
1931        //     $('#main_container > .body')[0].style.setProperty('margin-top', 0, 'important');
1932        //     $('#main_container > .body > .frm')[0].style.setProperty('margin-top', 0, 'important');
1933        // }
1934
1935        // $(window).bind("load",function() {});
1936        // section merge ver.2
1937        if ($('#main_container .body > mobile-header-section-merge').length > 0) {
1938            $('#main_container > .header-mobile').addClass('mobileHeaderSectionMerge');
1939            $('#main_container > .body')[0].style.setProperty('margin-top', 0, 'important');
1940            $('#main_container > .body > .frm')[0].style.setProperty('margin-top', 0, 'important');
1941        } else {
1942            $('#main_container > .header-mobile').removeClass('mobileHeaderSectionMerge');
1943            var height = 0;
1944            $.each($('.header-mobile > div'), function () {
1945                height += parseInt($(this).attr('data-hei'));
1946            });
1947
1948            /* 2020.05.21 재헌
1949             * 서브메뉴가 존재할 때 해당 높이도 더해서 body에 margin-top을 부여
1950             */
1951            if ($('.header-mobile-sub-menu').length > 0) {
1952                height += $('.header-mobile-sub-menu').height();
1953            }
1954
1955            $('#main_container > .body')[0].style.setProperty('margin-top', height + 'px', 'important');
1956        }
1957    }
1958}
1959
1960function initHeaderSideNav() {
1961    $('#main_container').delegate('.header-side-nav-button', 'click', function() {
1962        $('.header-side-nav').toggleClass('active');
1963
1964        if ($(this).parents('.header-mobile').length > 0) {
1965            $(this).parents('.header1, .header2, .header3, .header9').addClass('z-index-9999');
1966        }
1967
1968        // header-side-nav 영역만큼 밀어내기
1969        // $('.body').css('width', "calc(100% - 500px)");
1970    });
1971    $('#main_container').delegate('.header-side-nav-close', 'click', function() {
1972        $('.header-side-nav').removeClass('active');
1973
1974        if ($(this).parents('.header-mobile').length > 0) {
1975            setTimeout(function() {
1976                // 사이드 네비 닫히는 시간 0.3ms, z-index 빠지는 시간 0.5ms
1977                $(this).parents('.header1, .header2, .header3, .header9').removeClass('z-index-9999');
1978            }, 500)
1979        }
1980
1981        // header-side-nav 영역만큼 밀어내기
1982        // $('.body').removeAttr('style');
1983    });
1984
1985    /* 2020.03.16 재헌
1986     * language selector, header side nav 같은 별도의 창을 띄우는 헤더 요소가
1987     * header1, header2의 z-index 영향을 받아 위로 겹치거나 의도대로 동작하지 않는 문제를 수정
1988     */
1989    $('#main_container').delegate('.header > div', 'mouseenter', function() {
1990        if ($('.language-dropdown').length > 0 || $('.header-side-nav.active').length > 0) return;
1991        $(this).css('z-index', 2);
1992    });
1993    $('#main_container').delegate('.header > div', 'mouseleave', function() {
1994        if ($('.language-dropdown').length > 0 || $('.header-side-nav.active').length > 0) return;
1995        $(this).css('z-index', 1);
1996    });
1997}
1998
1999// 이미지 중 모바일 높이가 지정되지 않은 항목들 및 부모 프레임 크기 지정
2000function initNonScaledImageBox() {
2001    if (!isMobile()) return;
2002
2003    var image_count = 0;
2004    var target_count = 0;
2005    $.each($('.body .imgBox'), function() {
2006        if ($(this).parents('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
2007        if ($(this).parents('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11').length > 0) return;
2008        if ($(this).find('.mobile-box').length > 0) return;
2009        if ($(this).parents('.popup-container').length > 0) return;
2010        if ($(this).parents('.fixed-contents-layer').length > 0) return;
2011        if ($(this).parents('.tab-frm, .slider-frm').length > 0) return;
2012
2013        var bg_size = $(this).find('.img-core').css('background-size');
2014        if (bg_size == 'contain') {
2015            image_count++;
2016        }
2017    });
2018
2019    $.each($('.body .imgBox'), function() {
2020        if ($(this).parents('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
2021        if ($(this).parents('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11').length > 0) return;
2022        if ($(this).find('.mobile-box').length > 0) return;
2023        if ($(this).parents('.popup-container').length > 0) return;
2024        if ($(this).parents('.fixed-contents-layer').length > 0) return;
2025        if ($(this).parents('.tab-frm, .slider-frm').length > 0) return;
2026
2027        var img_box = $(this);
2028        var bg_size = $(this).find('.img-core').css('background-size');
2029        var bg_image = $(this).find('.img-core').css('background-image');
2030
2031        if (bg_image) {
2032            bg_image = bg_image.replace('url(', '').replace(')', '').replace(/\"/gi, "");
2033        }
2034
2035        if (bg_size == 'contain') {
2036            var tmpImg = new Image();
2037            tmpImg.src = bg_image;
2038            $(tmpImg).one('load',function(){
2039                var ratio = tmpImg.width / tmpImg.height;
2040                var height_origin = img_box.height();
2041                var width_resize = window.innerWidth; // img_box.width()는 퍼센트로 출력되기때문에 window width로 대체
2042                var height_resize = width_resize/ratio;
2043                var diff = height_origin - height_resize;
2044
2045                // 모바일 스크린보다 작은 이미지, 가로가 더 긴 이미지 등은 패스한다
2046                if (ratio > 1 || height_resize < window.innerHeight || height_origin * ratio < window.innerHeight) {
2047                    return;
2048                }
2049
2050                img_box.height(height_resize);
2051                img_box.find('.img-core').height(height_resize);
2052                img_box.attr('data-m-hei', height_resize + 'px');
2053                img_box.data('diff', diff);
2054                target_count++;
2055
2056                if (target_count == image_count) {
2057                    resizeNonScaledImageBoxUpperFrame();
2058                }
2059            });
2060        }
2061    });
2062}
2063
2064function resizeNonScaledImageBoxUpperFrame() {
2065    $.each($('.body > .frm'), function() {
2066        var re = 0;
2067        var image_count = 0;
2068        $.each($(this).find('.box.imgBox'), function() {
2069            re += parseInt($(this).data('diff'));
2070            image_count++;
2071        });
2072
2073        if (image_count > 0 && !isNaN(re)) {
2074            $.each($(this).find('.frm').andSelf(), function () {
2075                if ($(this).height() - re < 0) return;
2076                resetMobileFrameStyle($(this));
2077            });
2078        }
2079    });
2080}
2081
2082function resetMobileFrameStyle($frm) {
2083    $frm.children('.view').children('.tb').css('height', 'auto');
2084}
2085
2086function initRss() {
2087    if ($('.rssBox').length > 0) {
2088        $('.rssBox .rss-area > ul').remove();
2089        $('.rssBox .view').append($('<div class="qv-loader qv-loader-black" style="display: block;"></div>'));
2090
2091        $(window).bind("load",function() {
2092            // jquery.rss.js 동적 호출
2093            $.getScript( "/js/jquery.rss.js", function( data, textStatus, jqxhr ) {
2094                $.each($('.rssBox'), function() {
2095                    var box             = $(this);
2096                    var target          = box.find('.rss-area');
2097                    var rss_url         = target.attr('data-rss-url');
2098                    var limit           = target.attr('data-contents-limit');
2099
2100                    jQuery(function($) {
2101                        target.rss(rss_url, {
2102                            limit: limit,
2103                            dateFormat: 'YYYY-MM-DD kk:mm',
2104                            entryTemplate: '<li><a href="{url}" target="_blank"><span class="rss-title">{title}</span><span class="rss-date">{nicetime}</span><span class="rss-body">{bodyPlain}..</span></a></li>',
2105                            tokens: {
2106                                nicetime: function(entry, tokens) {
2107                                    var createDateTime = new Date(tokens.date).getTime();
2108                                    var currentDateTime = new Date();
2109                                    var compareDateTime = currentDateTime.setDate(currentDateTime.getDate() - 1);
2110                                    if (createDateTime > compareDateTime) {
2111                                        return getNiceTime(createDateTime, new Date(), 1, true);
2112                                    }
2113                                    else {
2114                                        return tokens.date;
2115                                    }
2116                                },
2117                            },
2118                            success: function(data){ box.find('.qv-loader').remove(); },
2119                            error: function(xhr){ box.find('.qv-loader').remove(); },
2120                        })
2121                    })
2122                });
2123            });
2124        });
2125    }
2126}
2127
2128function initLnb() {
2129    if ($('.lnbBox').length > 0) {
2130        var path = QV_BASE_OBJ.spid;
2131        $('.lnb-area .lnb-item[data-spid="' + path + '"]').addClass('active');
2132    }
2133}
2134
2135// 모바일 터치 참고 https://fullcalendar.io/docs/longPressDelay
2136function initCalendar(elements) {
2137    if ($('.calendarBox').length > 0) {
2138        // calendar script 동적 호출
2139        $.getScript( "/js/fullcalendar/moment.min.js", function( data, textStatus, jqxhr ) {
2140            $.getScript( "/js/fullcalendar/fullcalendar.min.js", function( data, textStatus, jqxhr ) {
2141                $.getScript( "/module/calendar/calendar.js", function( data, textStatus, jqxhr ) {
2142                    if (elements) {
2143                        buildCalendar(elements);
2144                    } else {
2145                        $.each($('.calendarBox'), function() {
2146                            buildCalendar(this);
2147                        });
2148                    }
2149                });
2150            });
2151        });
2152    }
2153}
2154
2155function initPageFadeEvent() {
2156    var page_effect = 0;
2157    if (page_effect == 1) {
2158        $('body').addClass('body-fade');
2159        $('.body-fade').delegate('a', 'click', function(e) {
2160            var target = $(this);
2161            var targetUrl = document.activeElement.href;
2162            if (target.attr('class').indexOf('cke') > -1) return;
2163            else if (target.attr('target') == '_blank') return;
2164            else if (target.attr('href') == undefined) return;
2165            else if (target.attr('href').indexOf('#sld') > -1) return;
2166            else if (target.attr('href').indexOf('#tab') > -1) return;
2167            else if (targetUrl === 'javascript:void(0)') return;
2168            else if (targetUrl == undefined) return;
2169            else if (targetUrl.substr(targetUrl.length - 1) == '#') return;
2170            else if (targetUrl != undefined && targetUrl != '') {
2171                e.preventDefault();
2172                $('body').fadeOut( "fast", function() {
2173                    location.href = targetUrl;
2174                });
2175            }
2176        });
2177    }
2178}
2179
2180function initJoinModal() {
2181    $('#main_container').delegate('a[href="/join"]', 'click', function() {
2182        if (NAVER_CLIENT_ID == '' && KAKAO_CLIENT_ID == '' && GOOGLE_CLIENT_ID == '') {
2183            location.href = "/join";
2184            return;
2185        }
2186        else {
2187            $('#JoinModal').modal('show');
2188            return false;
2189        }
2190    });
2191}
2192
2193function initPolicyPrivacyModal() {
2194    $('#main_container').delegate('a[href="/policy_privacy"]', 'click', function() {
2195        if ($('#PolicyPrivacyModal').data('policy')) {
2196            $('#PolicyPrivacyModal').modal('show');
2197        }
2198        else {
2199            qvjax_direct(
2200                "select_terms",
2201                "/module/member/member.php",
2202                '',
2203                function (data) {
2204                    if (data.length > 0) {
2205                        var m = "privacy";
2206                        var text = $.grep(data, function (e) { return e.stms_type == m; })[0].stms_txt;
2207                        $('#policy-privacy-textarea').val(text);
2208                        $('#PolicyPrivacyModal').modal('show');
2209                        $('#PolicyPrivacyModal').data('policy', data);
2210                    }
2211                },
2212                function (xhr) { }
2213            );
2214        }
2215
2216        return false;
2217    });
2218}
2219
2220function removeSiteCopiedElement() { // 복제된 게시판, 폼 삭제처리
2221    $('#main_container .SiteCopiedElement').remove();
2222}
2223
2224function initSnSIconImage() {
2225    $.each($('.sns-icon-image'), function() {
2226        if ($(this).width() < 40) {
2227            var bg = $(this).css('background-image');
2228            if (bg.toLowerCase().indexOf('color-30') > 0 || bg.toLowerCase().indexOf('color-30') > 0) { return; }
2229
2230            if (bg.indexOf('-30') > -1) return;
2231            var convertSmall = bg.replace('Color', 'Color-30').replace('Black', 'Black-30');
2232            $(this).css('background-image', convertSmall);
2233        }
2234    });
2235}
2236
2237function initSliderCallback() {
2238    $.each($('.slider-frm .carousel.slide'), function() {
2239        $(this).bind('slide.bs.carousel', function (e) {
2240            //$(this).find('.qv-ani-ele').toggleClass('qv-ani-ele qv-ani');
2241            $(e.relatedTarget).find('.qv-ani').toggleClass('qv-ani qv-ani-ele');
2242
2243            $.each($(e.relatedTarget).find('.video-iframe'), function() {
2244                var src;
2245                if ($(this).attr('src')) {
2246                    src = $(this).attr('src').split('&timestamp=')[0];
2247                } else if ($(this).attr('data-src')) {
2248                    src = $(this).attr('data-src').split('&timestamp=')[0];
2249                }
2250
2251                if (src) {
2252                    $(this).attr('src', src + '&timestamp=' + new Date().getTime());
2253                }
2254            });
2255        });
2256    });
2257}
2258function initSlider(element) {
2259    /* 2020.03.12 재헌
2260     * 슬라이드 배경 이미지는 초기화 시 미리 불러온다
2261     * 미리 불러오지 않으면 슬라이드 넘길 때 마다 흰 화면이 나타남
2262     */
2263    const target = element ? element : $('.slider-frm')
2264
2265    $.each(target.find('.carousel-inner > .item > .frm'), function() {
2266        var url = $(this).css('background-image');
2267        if (url == 'none' || url.indexOf('url') == -1) return;
2268        else {
2269            var img = new Image();
2270            img.src = url.match(/url\(["']?([^"']*)["']?\)/)[1];
2271        }
2272    });
2273
2274    // carousel 스윕
2275    $.each(target.not('.fullpage').find('.carousel'), function() {
2276        $.each($(this).find('.item'), function(i) {
2277            var active = i == 0 ? ' active' : '';
2278            $(this).attr('class', 'item' + active);
2279        });
2280        $(this).find('.carousel-indicators > li').removeClass('active');
2281        $(this).find('.carousel-indicators > li').first().addClass('active');
2282
2283        $(this).carousel({ swipe: 200 });
2284        $(this).carousel(0);
2285
2286        /* 2020.02.25 재헌
2287         * 자동 넘기기 시간 간격 조정
2288         */
2289        if($(this).attr('data-slider-interval')) {
2290            var slider = $(this);
2291            var interval = parseInt($(this).attr('data-slider-interval'));
2292            interval = interval >= 1000 ? interval : 5000;
2293            var sliderInterval = setInterval(function() {
2294                slider.carousel("next");
2295            }, interval);
2296        }
2297    });
2298}
2299function initFullPageSlider() {
2300    if ($('#main_container > .body > .fullpage').length == 0) return;
2301
2302    $.each($('.slider-frm.fullpage'), function() {
2303        $(this).find('.carousel.slide').carousel(0);
2304        $(this).find('.item').each(function(i, val) {
2305            if (i === 0) {
2306                $(val).addClass('active').removeAttr('style');
2307            } else {
2308                $(val).removeClass('active').attr('style', 'transform: translate3d(0px, 100%, 0px);');
2309            }
2310        })
2311    });
2312
2313    var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
2314    if(!isMobile) {
2315        $('#main_container').delegate('.slider-frm.fullpage', 'mousewheel', function (e, delta) {
2316        //$('.slider-frm.fullpage').on('mousewheel', function (e, delta) {
2317            if (delta == undefined) { // 2019.01.02 delta 값이 undefined로 넘어와서 아래와 같이 처리
2318                if (e.originalEvent.wheelDelta > 0) delta = 1;
2319                else delta = -1;
2320            }
2321
2322            var is_fullpage_scrolling = $(this).attr('data-scrolling') == "true" ? true : false;
2323            if (is_fullpage_scrolling) {
2324                e.preventDefault();
2325                return false;
2326            }
2327            $(this).attr('data-scrolling', true);
2328
2329            var index = $(this).find('.carousel.slide .carousel-inner > .item.active').index() + 1;
2330            var total = $(this).find('.carousel.slide .carousel-inner > .item').length;
2331            var active_item = $(this).find('.carousel.slide .carousel-inner > .item.active');
2332            if (delta == 1) {
2333                if (index == 1) {
2334                    $(this).attr('data-scrolling', false);
2335                    return;
2336                }
2337                $(this).find('.carousel.slide').carousel("prev");
2338
2339                var scrollY = parseInt(this.offsetTop);
2340                $("html, body").animate({scrollTop: scrollY}, 300);
2341
2342                // 2019-05-13 재헌
2343                // fullpage 위/아래 슬라이드 시 가끔씩 오동작 하는 부분이 있어서 스크립트로 제어함
2344                active_item.prev().removeAttr('style');
2345                active_item.css('transform', 'translate3d(0, 100%, 0)');
2346            }
2347            else {
2348                if (index == total) {
2349                    $(this).attr('data-scrolling', false);
2350                    return;
2351                }
2352                $(this).find('.carousel.slide').carousel("next");
2353
2354                var scrollY = parseInt(this.offsetTop);
2355                $("html, body").animate({scrollTop: scrollY}, 300);
2356
2357                // 2019-05-13 재헌
2358                // fullpage 위/아래 슬라이드 시 가끔씩 오동작 하는 부분이 있어서 스크립트로 제어함
2359                active_item.next().removeAttr('style');
2360                active_item.css('transform', 'translate3d(0, -100%, 0)');
2361            }
2362
2363            return false;
2364        });
2365    }
2366    else {
2367        // touchmove 이벤트 제거. 일부 브라우저에서 스크롤 오동작함 (safari)
2368        $('.slider-frm.fullpage').bind('touchmove', function(e){e.preventDefault()});
2369        $('.slider-frm.fullpage').on('swipedown swipeup', function (e) {
2370            var is_fullpage_scrolling = $(this).attr('data-scrolling') == "true" ? true : false;
2371            if (is_fullpage_scrolling) {
2372                // e.preventDefault();
2373                return false;
2374            }
2375            $(this).attr('data-scrolling', true);
2376
2377            var index = $(this).find('.carousel.slide .carousel-inner > .item.active').index() + 1;
2378            var total = $(this).find('.carousel.slide .carousel-inner > .item').length;
2379            var active_item = $(this).find('.carousel.slide .carousel-inner > .item.active');
2380            if (e.type == "swipedown") {
2381                if (index == 1) {
2382                    if ($(this).prev('.frm').length > 0) { //
2383                        var scrollY = parseInt($(this).prev('.frm').offset().top);
2384                        $("html, body").animate({scrollTop: scrollY}, 200);
2385                    } else {
2386                        $("html, body").animate({scrollTop: 0}, 200);
2387                    }
2388                    $(this).attr('data-scrolling', false);
2389                    return;
2390                }
2391                $(this).find('.carousel.slide').carousel("prev");
2392
2393                var scrollY = parseInt(this.offsetTop);
2394                $("html, body").animate({scrollTop: scrollY}, 300);
2395
2396                // 2019-05-13 재헌
2397                // fullpage 위/아래 슬라이드 시 가끔씩 오동작 하는 부분이 있어서 스크립트로 제어함
2398                active_item.prev().removeAttr('style');
2399                active_item.css('transform', 'translate3d(0, 100%, 0)');
2400            }
2401            else {
2402                if (index == total) {
2403                    var scrollY = parseInt(this.offsetTop + $(this).height());
2404                    $("html, body").animate({scrollTop: scrollY}, 200);
2405                    $(this).attr('data-scrolling', false);
2406                    return;
2407                }
2408                $(this).find('.carousel.slide').carousel("next");
2409
2410                var scrollY = parseInt(this.offsetTop);
2411                $("html, body").animate({scrollTop: scrollY}, 300);
2412
2413                // 2019-05-13 재헌
2414                // fullpage 위/아래 슬라이드 시 가끔씩 오동작 하는 부분이 있어서 스크립트로 제어함
2415                active_item.next().removeAttr('style');
2416                active_item.css('transform', 'translate3d(0, -100%, 0)');
2417            }
2418
2419            return false;
2420        });
2421    }
2422
2423    // 2019-05-13 재헌
2424    // fullpage 위/아래 슬라이드 시 가끔씩 오동작 하는 부분이 있어서 스크립트로 제어함
2425    $('#main_container').on('click', '.fullpage .carousel-indicators > li', function () {
2426        var fullpage = $(this).parents('.fullpage').first();
2427        fullpage.find('.carousel-inner > .item').removeAttr('style');
2428
2429        var selected_item_num = $(this).attr('data-slide-to');
2430        var selected_item = $(fullpage.find('.carousel-inner > .item').get(selected_item_num));
2431
2432        selected_item.prev('.item').css('transform', 'translate3d(0, -100%, 0)');
2433        selected_item.next('.item').css('transform', 'translate3d(0, 100%, 0)');
2434    });
2435
2436    // transition init (ie : left, others : transition)
2437    $.each($('.fullpage .carousel-inner .item'), function() {
2438        $.each($(this).children('.frm'), function(i) {
2439            if (is_InternetExplorer()) {
2440                $(this).css('transform', 'none');
2441                $(this).css('left', parseInt(i * 100) + 'vw');
2442            }
2443            else {
2444                $(this).css('transform', 'translate3d(' + parseInt(i * 100) + 'vw,0,0)');
2445            }
2446            $(this).removeClass('active');
2447        });
2448    });
2449
2450    $('#main_container').on('click', '.fullpage-slide-control', function () {
2451        var item = $(this).parent();
2452        var frames = $(item).children('.frm');
2453        var total_length = frames.length;
2454        var active_frm = frames.filter(function () { return $(this).hasClass('active'); });
2455        if (active_frm.length == 0) { active_frm = frames.first(); }
2456        var index = active_frm.index();
2457
2458        if ($(this).hasClass('left')) {
2459            if (index == 0) {
2460                frames.removeClass('active');
2461                frames.last().addClass('active');
2462                $.each(frames, function (i) {
2463                    var idx = total_length - i - 1;
2464                    if (is_InternetExplorer()) {
2465                        $(this).css('left', '-' + parseInt(idx * 100) + 'vw');
2466                    }
2467                    else {
2468                        $(this).css('transform', 'translate3d(-' + parseInt(idx * 100) + 'vw,0,0)');
2469                    }
2470                });
2471            }
2472            else {
2473                $.each(frames, function (i) {
2474                    var left = (i - index + 1) * 100;
2475                    if (is_InternetExplorer()) {
2476                        $(this).css('left', left + 'vw'); }
2477                    else {
2478                        $(this).css('transform', 'translate3d(' + left + 'vw,0,0)');
2479                    }
2480
2481                    $(this).removeClass('active');
2482                    if (i == index-1) { $(this).addClass('active'); }
2483                });
2484            }
2485        }
2486        else if ($(this).hasClass('right')) {
2487            if (index == total_length - 1) {
2488                frames.removeClass('active');
2489                frames.first().addClass('active');
2490                $.each(frames, function (i) {
2491                    if (is_InternetExplorer()) {
2492                        $(this).css('left', parseInt(i * 100) + 'vw');
2493                    }
2494                    else {
2495                        $(this).css('transform', 'translate3d(' + parseInt(i * 100) + 'vw,0,0)');
2496                    }
2497                });
2498            }
2499            else {
2500                $.each(frames, function (i) {
2501                    var left = (i - index - 1) * 100;
2502                    if (is_InternetExplorer()) {
2503                        $(this).css('left', left + 'vw');
2504                    }
2505                    else {
2506                        $(this).css('transform', 'translate3d(' + left + 'vw,0,0)');
2507                    }
2508                    $(this).removeClass('active');
2509                    if (i == index + 1) { $(this).addClass('active'); }
2510                });
2511            }
2512        }
2513    });
2514
2515    $('.fullpage').find('.carousel.slide').on('slid.bs.carousel', function () {
2516        var slider = $(this).parents('.fullpage');
2517        setTimeout(function () {
2518            $(slider).attr('data-scrolling', false);
2519        }, 550);
2520    });
2521
2522    jQuery.fn.carousel.Constructor.TRANSITION_DURATION = 1000  // 2 seconds
2523}
2524
2525function is_InternetExplorer() {
2526    var agent = navigator.userAgent.toLowerCase();
2527    return (navigator.appName == 'Netscape' && agent.indexOf('trident') != -1) || (agent.indexOf("msie") != -1);
2528}
2529
2530function initSMS() {
2531    qvjax_direct(
2532        "select_sms_info",
2533        "//" + QV_BASE_OBJ.dev + "g" + QV_BASE_OBJ.svid + "m.quv.kr" + "/qws/aligo.php",
2534        '',
2535        function (data) {
2536            $.each(data, function() {
2537                if (this.smi_state == '1') {
2538                    var hide_icon = '';
2539                    var hide_window = '';
2540
2541                    var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
2542                    if(isMobile) {
2543                        hide_window = 'sms-hide';
2544                    }
2545                    else {
2546                        if (this.smi_init_show == '1') { hide_icon = 'sms-hide'; }
2547                        else { hide_window = 'sms-hide'; }
2548                    }
2549
2550                    var html = '<div id="fixed-contents-sms" class="fixed-contents-layer fixed-contents-show-all" style="bottom: 40px; right: 40px; top: auto; left: auto;" data-axis="se"> <div class="box smsBox"> <div class="preview"></div><div class="view"> <div> <div class="sms-icon ' + hide_icon + '"> <div> <i class="icon-bubbles" aria-hidden="true"></i> </div></div><div class="sms sms-1 ' + hide_window + '"> <div class="sms-header"><span>SMS 문자보내기</span> <div class="sms-close">×</div></div><div class="sms-body"> <div class="sms-message"> <div class="sms-title">메세지</div><textarea></textarea> </div><div class="sms-contact"> <div class="sms-title">연락처</div><input type="text"> <div class="sms-agree"><input type="checkbox"><a href="/policy_privacy">개인정보 수집 및 이용</a>에 동의합니다</div></div></div><div class="sms-footer"> 보내기 </div></div></div><span class="configuration fixed-contents-config-btn" style="top: -18px; bottom: auto;"><a class="label"> <i class="icon-arrow-down"></i></a></span> <div class="fixed-contents-close"><i class="icon-close"></i></div></div></div></div>';
2551                    $('.body').append($(html));
2552
2553                    $('.sms-header > span').text(this.smi_title);
2554                    $('.sms-message > textarea').attr('placeholder', this.smi_placeholder);
2555
2556                    var start = parseInt(this.smi_start_time);
2557                    var end = parseInt(this.smi_end_time);
2558                    end = end == 0 ? 2400 : end;
2559
2560                    var current_hours = new Date().getHours();
2561                    var current_minutes = new Date().getMinutes();
2562                    var current_time = parseInt(current_hours.toString() + current_minutes.toString());
2563
2564                    if (start <= current_time && current_time < end) {
2565                        $('.smsBox').show();
2566                    }
2567                    else {
2568                        $('.smsBox').hide();
2569                        return;
2570                    }
2571
2572                    // sms
2573                    $('.sms-icon').on('click', function() {
2574                        var sms = $(this).parents('.smsBox').first();
2575                        sms.find('.sms-icon').addClass('sms-hide');
2576                        sms.find('.sms').removeClass('sms-hide');
2577                    });
2578
2579                    $('.sms-close').on('click', function() {
2580                        var sms = $(this).parents('.smsBox').first();
2581                        sms.find('.sms').addClass('sms-hide');
2582                        sms.find('.sms-icon').removeClass('sms-hide');
2583                    });
2584
2585                    $('.sms-contact input').on('change keydown paste input', function() {
2586                        var number = $(this).val();
2587                        if (number.length > 20) { $(this).val($(this).val().slice(0,20)); return false; }
2588
2589                        this.value = this.value.replace(/[^0-9\.]/g,'');
2590                    });
2591
2592                    $('.sms-footer').on('click', function() {
2593                        var sms = $(this).parents('.smsBox').first();
2594                        var phone = sms.find('.sms-contact input').val();
2595                        var message = sms.find('.sms-message textarea').val();
2596                        var agree = sms.find('.sms-agree input').prop('checked');
2597
2598                        if (!isValidMobileNumber(phone)) {
2599                            alert(lang.failure_send_sms_invalid_number);
2600                            return;
2601                        }
2602                        if (!agree) {
2603                            alert(lang.agree_privacy_info);
2604                            return;
2605                        }
2606
2607                        qvjax_direct(
2608                            "send",
2609                            "//" + QV_BASE_OBJ.dev + "g" + QV_BASE_OBJ.svid + "m.quv.kr" + "/qws/aligo.php",
2610                            'msg=' + message + '&sender=' + phone,
2611                            function (data) {
2612                                if (data.result_code == "1" && data.message == "success") {
2613                                    smsSendComplete(data.sshid, data.msg_id, data.msg_type, function() {
2614                                        sms.find('.sms-contact input').val('');
2615                                        sms.find('.sms-message textarea').val('');
2616                                        sms.find('.sms-agree input').prop('checked', false);
2617                                        alert(lang.success_send_sms);
2618
2619                                        qv_func.conversion('sms', function() {})
2620                                    });
2621                                }
2622                                else if (data.result_code == "0") {
2623                                    switch(data.message) {
2624                                        case "frequently_called":
2625                                            alert(lang.failure_send_sms_frequently_called);
2626                                            break;
2627                                        case "too_long_message":
2628                                            alert(lang.failure_send_sms_too_long_message);
2629                                            break;
2630                                        case "low_balance":
2631                                            alert(lang.failure_send_sms_low_balance);
2632                                            break;
2633                                        case "invalid_number":
2634                                            alert(lang.failure_send_sms_invalid_number);
2635                                            break;
2636                                        default:
2637                                            alert(lang.failure_send_sms_default);
2638                                            break;
2639                                    }
2640                                }
2641                                else if (data.result_code == '-101') {
2642                                    smsSendFailure(data.sshid, data.result_code, data.message, function() {
2643                                        alert(lang.failure_send_sms_default);
2644                                    });
2645                                }
2646                            },
2647                            function (xhr) { }
2648                        );
2649                    });
2650                }
2651            });
2652        },
2653        function (xhr) { }
2654    );
2655
2656    function smsSendComplete(sshid, msg_id, msg_type, callback) {
2657        var type = msg_type.toLowerCase() == 'sms' ? 'sms' : 'lms';
2658        qvjax_direct(
2659            "complete",
2660            "//" + QV_BASE_OBJ.dev + "g" + QV_BASE_OBJ.svid + "m.quv.kr" + "/qws/aligo.php",
2661            'sshid=' + sshid + '&msg_id=' + msg_id + '&msg_type=' + type,
2662            function (data) {
2663                callback();
2664            },
2665            function (xhr) { }
2666        )
2667    }
2668
2669    function smsSendFailure(sshid, res_code, res_error_msg, callback) {
2670        qvjax_direct(
2671            "failure",
2672            "//" + QV_BASE_OBJ.dev + "g" + QV_BASE_OBJ.svid + "m.quv.kr" + "/qws/aligo.php",
2673            'sshid=' + sshid + '&res_code=' + res_code + '&res_error_msg=' + res_error_msg,
2674            function (data) {
2675                callback();
2676            },
2677            function (xhr) { }
2678        )
2679    }
2680
2681    function isValidMobileNumber(num) {
2682        //if(!num.match(/^\d+$/)) { valid = false; }
2683        var arr_head = ['010','011','016','017','018','019','031','032','041','042','043','051','052','053','054','055','061','062','063','064','070','080',
2684                        '020', '021', '022', '023', '024', '025', '026', '027', '028', '029'];
2685        var head = num.slice(0, 3);
2686        return $.inArray(head, arr_head) > -1 ? true : false;
2687    }
2688}
2689
2690function byteCheck(string){
2691    var utf8length = 0;
2692    for (var n = 0; n < string.length; n++) {
2693        var c = string.charCodeAt(n);
2694        if (c < 128) {
2695            utf8length++;
2696        }
2697        else if((c > 127) && (c < 2048)) {
2698            utf8length = utf8length+2;
2699        }
2700        else {
2701            utf8length = utf8length+3;
2702        }
2703    }
2704    return utf8length;
2705}
2706
2707
2708function initTabFrame() {
2709    // 2019.01.31
2710    $.each($('.tab-frm'), function() {
2711        $(this).find('.tab-frame-nav > ul > li').removeClass('active');
2712        //$(this).find('.tab-frame-nav > ul > li:first-child').addClass('active');
2713        $(this).find('.tab-frame-nav > ul > li:first-child > a').trigger('click');
2714    });
2715
2716    // 2018.09.04 재헌
2717    // URL에 #tab- 형식의 값이 있으면 해당 탭을 활성화한다.
2718    var hash = location.hash;
2719    if (hash != undefined && hash != '') {
2720        if (hash.indexOf('tab-') < 0) { return; }
2721        if ($(hash).length == 0) { return; }
2722
2723        var tab = $('a[href="' + hash + '"]');
2724        var nav = tab.closest('.tab-frame-nav');
2725        $.each(nav.find('li'), function() {
2726            $(this).children('a').attr('aria-expanded', false);
2727            $(this).removeClass('active');
2728        });
2729
2730        tab.attr('aria-expanded', true);
2731        tab.parent().addClass('active');
2732
2733        /* 2021.08.02
2734         * PC, 모바일 따로 구성하여 같은 id가 두 개 이상 있을 때
2735         * 둘 다 active 클래스 영향을 받도록 함
2736         */
2737        $('div[id="' + hash.replace(/#/g, '') + '"]').each(function() {
2738            $(this).siblings().removeClass('active');
2739            $(this).addClass('active');
2740        });
2741        // $(hash).siblings().removeClass('active');
2742        // $(hash).addClass('active');
2743
2744        setTimeout(function(){
2745            $(window).scrollTop(nav.offset().top - $('.header').height());
2746//            $('html, body').animate({
2747//                scrollTop: nav.offset().top - 200
2748//            }, 500);
2749        },500);
2750
2751        /* 2020.03.19 재헌
2752         * 탭을 mobile_ele로 복사하여 넣은 경우 헤더의 탭 앵커가 동작하지 않기 때문에(id가 달라서)
2753         * 이름으로 찾아 활성화한다
2754         */
2755        if (isMobile()) {
2756            var tab_name = tab.first().text();
2757            $.each($('.mobile_ele .tab-frame-nav a'), function() {
2758                if ($(this).text() == tab_name) {
2759                    var id = $(this).attr('href');
2760                    $(this).parent().siblings().removeClass('active');
2761                    $(this).parent().addClass('active');
2762                    $('.mobile_ele ' + id).siblings().removeClass('active');
2763                    $('.mobile_ele ' + id).addClass('active');
2764                }
2765            });
2766        }
2767    }
2768
2769    // 탭 내에 지도가 있으면 렌더링이 정상적으로 안되는 증상이 있음
2770    // 탭 클릭시 지도를 새로 렌더링 하도록 함
2771    $('#main_container').delegate('.tab-frm .tab-frame-nav li > a', 'click', function(e) {
2772        var frm = $(this).parents('.tab-frm').first();
2773        $.each(frm.find('.mapBox'), function() {
2774            var map = $(this);
2775            map.removeClass('map-rendering-complete');
2776            map.find('.qv-map').children().remove();
2777            setTimeout(function() {
2778                renderMapBox(map);
2779            }, 100);
2780        });
2781        $.each(frm.find('.mapListBox'), function() {
2782            var map = $(this);
2783            map.removeClass('map-list-rendering-complete');
2784            map.find('.qv-map-list').children().remove();
2785            setTimeout(function() {
2786                renderMapListBox(map);
2787            }, 100);
2788        });
2789
2790        // 동일 페이지에 같은 아이디의 텝이 두개 이상 존재할 때
2791        var tab_id = $(this).attr('href').replace(/#/g, '');
2792        if ($('.tab-pane[id="' + tab_id + '"]').length > 0) {
2793            e.preventDefault();
2794            //frm.find('.tab-pane.active').removeClass('active');
2795            frm.find('.tab-content').first().children('.tab-pane.active').removeClass('active');
2796            frm.find('.tab-pane[id="' + tab_id + '"]').addClass('active');
2797        }
2798
2799
2800        // 탭 클릭 시 마우스오버 컨텐츠 Initialize
2801        $.each(frm.find('.mouseover-frm'), function() {
2802            var before = $(this).find('.mouseover-before').first();
2803            var after = $(this).find('.mouseover-after').first();
2804            var mouseover_height = before.height() > after.height() ? before.height() : after.height();
2805
2806            if ($(this).height() < mouseover_height) {
2807                var tb = $(this).children('.view').children('.tb');
2808                tb.height(mouseover_height);
2809            }
2810        });
2811
2812        initIframe(frm.find('.iframeBox'));
2813    });
2814}
2815
2816$(window).on('hashchange', function(e) {
2817    var hash = window.location.hash;
2818    var oldUrl = e.originalEvent.oldURL;
2819    var newUrl = e.originalEvent.newURL;
2820
2821    var oldUrl_noHash = oldUrl.indexOf('#') < 0 ? oldUrl : oldUrl.split('#')[0];
2822    var newUrl_noHash = newUrl.indexOf('#') < 0 ? newUrl : newUrl.split('#')[0];
2823
2824    if (hash.indexOf('#tab') > -1 && (oldUrl_noHash == newUrl_noHash)) {
2825        window.location.href = newUrl;
2826        window.location.reload();
2827    }
2828});
2829
2830// 픽스드 컨텐츠 초기화
2831function initFixedContents() {
2832    var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
2833    if(isMobile) {
2834        var fixed = $('body').find('.fixed-contents-layer.fixed-contents-show-mobile');
2835        $.each(fixed, function() {
2836            var top = this.style.top;
2837            var left = this.style.left;
2838            var bottom = this.style.bottom;
2839            var right = this.style.right;
2840            var ratio = 3;
2841
2842            if (top != 'auto') { $(this).css('top', parseFloat(top) / ratio + 'px'); }
2843            if (left != 'auto') { $(this).css('left', parseFloat(left) / ratio + 'px'); }
2844            if (bottom != 'auto') { $(this).css('bottom', parseFloat(bottom) / ratio + 'px'); }
2845            if (right != 'auto') { $(this).css('right', parseFloat(right) / ratio + 'px'); }
2846        });
2847    }
2848
2849    //Click event to scroll to top & bottom
2850    var didScroll = false;
2851    $('body').delegate('.scrollToTop', 'click', function(e) {
2852        if (!didScroll) {
2853            didScroll = true;
2854            $('html, body').stop().animate({scrollTop: 0}, 500, 'swing', function() {didScroll = false;});
2855            return false;
2856        }
2857    });
2858    $('body').delegate('.scrollToBottom', 'click', function(e) {
2859        if (!didScroll) {
2860            didScroll = true;
2861            $('html, body').stop().animate({scrollTop: $('.body').height()}, 500, 'swing', function() {didScroll = false;});
2862            return false;
2863        }
2864    });
2865}
2866// 픽스트 컨텐츠 초기화 끝
2867
2868// Youtube 자동 재생 시작
2869/*
2870 * mute 속성 안주면 자동재생 안됨. 현재 iframe src에 mute=1 속성 부여
2871 * https://stackoverflow.com/questions/40685142/youtube-autoplay-not-working
2872 */
2873
2874/* =========================================================================
2875 * 2026.08 동영상 지연 로드 (썸네일 화질 저하 수정)
2876 *
2877 * iframe이 0x0인 상태에서 src를 주입하면 유튜브가 그 크기 기준으로
2878 * 포스터(썸네일)를 고르고, 이후 커져도 다시 고르지 않아 뭉개진다.
2879 * 따라서 "실제로 보이고 크기가 잡힌 뒤"에만 로드한다.
2880 *
2881 * 이 파일에서 호출하는 이유:
2882 *   script.inc.html 을 include 하는 진입점 12개 중 10개는
2883 *   src 주입 블럭도 onload.inc.html 도 갖고 있지 않다.
2884 *   진입점별로 호출하면 그 10개에서 동영상이 로드되지 않는다.
2885 * ========================================================================= */
2886var qvVideoObserver   = null;
2887var qvVideoPending    = [];
2888var qvVideoLazyInited = false;
2889var qvVideoWatchdogTimer = null;
2890var qvVideoWatchdogTicks = 0;
2891var qvVideoScrollTimer   = null;
2892var QV_VIDEO_WATCHDOG_INTERVAL = 500;   // ms
2893var QV_VIDEO_WATCHDOG_MAX      = 20;    // 500ms * 20 = 최대 10초
2894var QV_VIDEO_ZERO_TICKS_LIMIT  = 2;     // 면적 0 상태가 약 1초 지속되면 포기하고 로드
2895
2896function qvVideoIsRenderable(el) {
2897    var r = el.getBoundingClientRect();
2898    return r.width > 1 && r.height > 1;
2899}
2900
2901// display:none 이면 false (레이아웃 박스 자체가 만들어지지 않는다)
2902function qvVideoIsRendered(el) {
2903    return el.getClientRects().length > 0;
2904}
2905
2906function qvVideoUnobserve(el) {
2907    if (qvVideoObserver) qvVideoObserver.unobserve(el);
2908}
2909
2910// 게이트 없이 실제 로드만 수행 (IntersectionObserver 미지원 폴백에서도 사용)
2911function qvVideoLoad(el) {
2912    if (el.getAttribute('data-qv-activated')) return;
2913    el.setAttribute('data-qv-activated', '1');
2914
2915    if (el.tagName === 'IFRAME') {
2916        var src = el.getAttribute('data-src');
2917        if (!src) return;
2918
2919        // 로딩 마스크를 "활성화 시점"에 삽입한다.
2920        // (기존에는 index.html / onload.inc.html 에서 전량 미리 삽입했다)
2921        $(el).before('<div class="proceeding">' +
2922                     '<div style="z-index: -1;" class="qv-loader qv-loader-black"></div></div>');
2923        $(el).on('load', function() { $(this).siblings('.proceeding').remove(); });
2924        el.setAttribute('src', src);
2925    }
2926    else {
2927        qvCreateYoutubePlayer(el);   // div 플레이스홀더 -> YT.Player
2928    }
2929}
2930
2931// 게이트 통과 시에만 로드. 성공(= 관찰 해제 가능) 시 true
2932function qvVideoActivate(el) {
2933    if (el.getAttribute('data-qv-activated')) return true;
2934    if (!qvVideoIsRenderable(el)) return false;
2935    qvVideoLoad(el);
2936    return true;
2937}
2938
2939function qvVideoObserve(el) {
2940    if (!el || el.getAttribute('data-qv-observed')) return;
2941    el.setAttribute('data-qv-observed', '1');
2942
2943    // IntersectionObserver 미지원(IE11 등) -> 게이트 우회, 기존 동작 그대로
2944    if (!window.IntersectionObserver) { qvVideoLoad(el); return; }
2945
2946    if (!qvVideoObserver) {
2947        qvVideoObserver = new IntersectionObserver(function(entries) {
2948            $.each(entries, function(i, entry) {
2949                if (!entry.isIntersecting) return;   // 등록 직후 false 콜백 포함
2950                if (qvVideoActivate(entry.target)) qvVideoUnobserve(entry.target);
2951            });
2952        }, { rootMargin: '100px' });
2953    }
2954
2955    qvVideoPending.push(el);
2956    qvVideoObserver.observe(el);
2957}
2958
2959/* 감시자
2960 * IntersectionObserver 는 "임계값 교차" 시에만 콜백한다.
2961 * 렌더는 되는데 면적이 0인 요소(예: 부모 폭이 0)는 교차가 성립하지 않아
2962 * isIntersecting 이 영원히 true 가 되지 않는다 -> 영구 대기.
2963 * 그런 요소만 골라 강제 로드한다.
2964 *
2965 * 주의: display:none 인 요소(= 아직 화면에 없는 정상 대기)와,
2966 *       크기가 정상인 요소(= IntersectionObserver 가 처리할 것)는 건드리지 않는다.
2967 *       그렇지 않으면 지연 로드 자체가 무력화된다. */
2968function qvVideoWatchdog() {
2969    qvVideoWatchdogTicks++;
2970
2971    qvVideoPending = $.grep(qvVideoPending, function(el) {
2972        if (el.getAttribute('data-qv-activated')) { qvVideoUnobserve(el); return false; }
2973        if (!qvVideoIsRendered(el))  return true;   // 아직 display:none -> 정상 대기
2974        if (qvVideoIsRenderable(el)) return true;
2974   // 크기 정상 -> IntersectionObserver 담당
2975
2976        var n = (parseInt(el.getAttribute('data-qv-zero-ticks'), 10) || 0) + 1;
2977        el.setAttribute('data-qv-zero-ticks', n);
2978        if (n < QV_VIDEO_ZERO_TICKS_LIMIT) return true;
2979
2980        // 면적 0 인 채로 굳었다 -> 화질을 포기하고 로드한다.
2981        // ("표시됨"이 화질보다 우선이며, 최악의 경우에도 기존 동작보다 나빠지지 않는다)
2982        qvVideoLoad(el);
2983        qvVideoUnobserve(el);
2984        return false;
2985    });
2986
2987    if (!qvVideoPending.length || qvVideoWatchdogTicks >= QV_VIDEO_WATCHDOG_MAX) {
2988        clearInterval(qvVideoWatchdogTimer);
2989        qvVideoWatchdogTimer = null;
2990    }
2991}
2992
2993function qvVideoWatchdogStart() {
2994    qvVideoWatchdogTicks = 0;                       // 이미 돌고 있으면 카운트만 리셋
2995    if (qvVideoWatchdogTimer || !qvVideoPending.length) return;
2996    qvVideoWatchdogTimer = setInterval(qvVideoWatchdog, QV_VIDEO_WATCHDOG_INTERVAL);
2997}
2998
2999function qvVideoWatchdogStartDebounced() {
3000    clearTimeout(qvVideoScrollTimer);
3001    qvVideoScrollTimer = setTimeout(qvVideoWatchdogStart, 300);
3002}
3003
3004// root 인자로 동적 삽입 지점에서 재호출 가능. 중복 호출 안전(멱등)
3005function initVideoLazyLoad(root) {
3006    $(root || document)
3007        .find('iframe.video-iframe[data-src], div.video-iframe[data-src]')
3008        .each(function() { qvVideoObserve(this); });
3009
3010    qvVideoWatchdogStart();
3011
3012    if (qvVideoLazyInited) return;
3013    qvVideoLazyInited = true;
3014    $(window).on('resize orientationchange', qvVideoWatchdogStart);
3015    $(window).on('scroll', qvVideoWatchdogStartDebounced);
3016    $(document).on('shown.bs.tab shown.bs.modal slid.bs.carousel', qvVideoWatchdogStart);
3017}
3018
3019
3020$(window).load(function() {
3021    // 모든 .video-iframe 을 지연 로드 대상으로 등록
3022    initVideoLazyLoad();
3023
3024    /*
3025     * Youtube API 로드
3026     * 2019.03.18 재헌 주석처리
3027     * Youtube API 미사용중. 아래 스크립트 때문에 반복재생이 안되는 문제 발생
3028     */
3029    var tag = document.createElement('script');
3030    tag.src = "https://www.youtube.com/iframe_api";
3031    var firstScriptTag = document.getElementsByTagName('script')[0];
3032    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
3033});
3034
3035// iframe 제거하고 새로운 div 플레이스홀더 생성
3036// iframe이 속한 videoBox를 찾아서, 그 안에 집어넣어주기
3037// 실제 iframe 은 YT.Player 가 이 플레이스홀더를 교체하며 만든다
3038function mobileAutoPlayIframe () {
3039    try {
3040        $('.videoBox').each(function(){
3041            var iframe = $(this).find('.video-iframe')[0];
3042            var vBox   = $(this).find('.view')[0];
3043            // .video-iframe 이나 .view 가 없는 videoBox 에서 루프가 중단되지 않도록 방어
3044            if (!iframe || !vBox) return;
3045
3046            var dataSrc = iframe.getAttribute('data-src') || '';
3047            // vimeo는 해당 로직 필요 없음
3048            if (dataSrc.indexOf('vimeo') > -1) return;
3049            // 기존 아이디 없는 동영상들 놔두기
3050            if (!iframe.id) return;
3051
3052            var placeholder = document.createElement('div');
3053            placeholder.id        = iframe.id;
3054            placeholder.className = 'video-iframe';
3055            placeholder.setAttribute('data-src', dataSrc);
3056
3057            // IE11 은 ChildNode.remove() 미지원. 이 함수는 파싱 시점 최상위에서
3058            // 호출되므로 예외가 나면 이후 최상위 문장이 전부 실행되지 않는다.
3059            if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
3060            vBox.appendChild(placeholder);
3061        });
3062    } catch (e) {
3063        if (window.console && console.error) console.error('mobileAutoPlayIframe', e);
3064    }
3065}
3066mobileAutoPlayIframe()
3067
3068var player_list = [];
3069var qvYoutubeApiReady  = false;
3070var qvPlayerWaitingApi = [];
3071
3072/* playerVars 화이트리스트
3073 * controls / disablekb / fs / showinfo / autohide / wmode / frameborder 는 의도적으로 제외한다.
3074 * 지금까지 YT.Player 가 videoId 만 받아 이 값들이 전부 무시되고 있었으므로,
3075 * 지금 와서 controls=0 을 적용하면 일반 동영상 블럭에서 재생 버튼도 키보드도 못 써
3076 * 방문자가 영상을 재생할 방법이 사라진다. */
3077var QV_PLAYER_VARS_ALLOW = ['autoplay', 'mute', 'loop', 'playlist', 'start', 'end',
3078                            'rel', 'playsinline', 'iv_load_policy', 'modestbranding',
3079                            'cc_load_policy', 'color', 'hl'];
3080
3081// API 준비 완료 - 대기 중이던 것만 생성한다.
3082// (.videoBox 전량 순회는 제거되었다. 등록은 initVideoLazyLoad 가 담당한다)
3083function onYouTubeIframeAPIReady() {
3084    qvYoutubeApiReady = true;
3085    var waiting = qvPlayerWaitingApi;
3086    qvPlayerWaitingApi = [];
3087    $.each(waiting, function(i, el) { qvCreateYoutubePlayer(el); });
3088}
3089
3090function qvCreateYoutubePlayer(el) {
3091    // API 미도착 -> 큐에 넣고 대기
3092    if (!qvYoutubeApiReady || !window.YT || !YT.Player) {
3093        qvPlayerWaitingApi.push(el);
3094        return;
3095    }
3096
3097    var src = el.getAttribute('data-src') || '';
3098    // vimeo는 해당 로직 필요 없음
3099    if (src.indexOf('vimeo') > -1) return;
3100
3101    var videoId = (src.split('embed/')[1] || '').split('?')[0];
3102    if (!videoId) return;
3103
3104    // data-src 의 쿼리 파라미터를 보존한다 (기존에는 videoId 만 넘겨 전부 유실됐다)
3105    var raw = {};
3106    $.each((src.split('?')[1] || '').split('&'), function(i, kv) {
3107        var p = kv.indexOf('=');
3108        if (p < 1) return;                    // 빈 토큰(&&) 및 값 없는 키 제외
3109        raw[kv.slice(0, p)] = kv.slice(p + 1);
3110    });
3111
3112    var playerVars = {};
3113    $.each(QV_PLAYER_VARS_ALLOW, function(i, k) {
3114        if (raw[k] !== undefined) playerVars[k] = raw[k];
3115    });
3116
3117    var isAutoPlay = String(raw.autoplay) === '1';
3118    var isLoop     = String(raw.loop)     === '1';
3119
3120    // 자동재생을 "생성 시점"에 부여 -> 생성 후 src 를 다시 쓰던 2회 로드 제거
3121    if (isAutoPlay) { playerVars.autoplay = 1; playerVars.mute = 1; }
3122    // loop 는 playlist 가 있어야 동작한다. 없으면 자기 자신으로 채운다
3123    if (isLoop && !playerVars.playlist) { playerVars.playlist = videoId; }
3124
3125    var player = new YT.Player(el.id, {
3126        height: "100%",
3127        width: "100%",
3128        videoId: videoId,
3129        playerVars: playerVars,
3130        events: {
3131            // 동영상 로드되면 autoplay 실행
3132            onReady: function() { if (isAutoPlay) player.playVideo(); },
3133            // 재생 끝난 동영상 loop 값 확인하고 다시 재생
3134            onStateChange: function(e) {
3135                if (e.data === YT.PlayerState.ENDED && isLoop) player.playVideo();
3136            }
3137        }
3138    });
3139    player_list.push(player);
3140}
3141// Youtube 자동 재생 끝
3142
3143// SNS 초기화 시작
3144function initSnsFeed() {
3145    //var sns_feed = $("#main_container div[name*='feed']");
3146    var sns_feed = $("#main_container div.sns-feed");
3147    $.each(sns_feed, function(i, val) {
3148        var target = $(val).parents('.box').first();
3149        var feed_token = target.data('feed_token');
3150        var feed_count = target.data('feed_count');
3151        var feed_style = target.data('feed_style');
3152        var feed_column = target.data('feed_column');
3153        var feed_column_m = target.data('feed_column_m');
3154        var feed_height_m = target.data('feed_height_m') == undefined ? $(val).find('.sns-feed-image-layer').height() : target.data('feed_height_m');
3155        var feed_type = target.data('feed_type');
3156        var vBox = $(val).parents('.view').first();
3157
3158        if (feed_type != undefined && feed_token != undefined) {
3159            switch(feed_type) {
3160                case 'twitter':
3161                    renderTwitterFeed(feed_token, feed_count, feed_column, feed_column_m, feed_height_m, feed_style, vBox);
3162                    break;
3163                case 'instagram':
3164                    renderInstagramFeed(feed_token, feed_count, feed_column, feed_column_m, feed_height_m, feed_style, vBox);
3165                    break;
3166            }
3167
3168            target.removeAttr('data-feed_token');
3169        }
3170    });
3171}
3172function initInstagramFeed() {
3173    var instagram_feed = $('#main_container div.instagramFeedBox');
3174    $.each(instagram_feed, function(i, val) {
3175        var target = $(this);
3176        var feed_token = target.data('access-token');
3177        var feed_count = target.data('feed-count');
3178        var feed_count_m = target.data('feed-count-m');
3179        var feed_column = target.data('feed-column');
3180        var feed_column_m = target.data('feed-column-m');
3181        var feed_height = target.data('feed-height');
3182        var feed_height_m = target.data('feed-height-m') == undefined ? $(val).find('.sns-feed-image-layer').height() : target.data('feed-height-m');
3183        var feed_margin = target.data('feed-margin');
3184        var vBox = $(val).children('.view').first();
3185
3186        renderInstagramGraphFeed(feed_token, feed_count, feed_column, feed_count_m, feed_column_m, feed_height, feed_height_m, feed_margin, vBox)
3187        target.removeAttr('data-access-token');
3188    });
3189}
3190//(function(d, s, id) {
3191//    var js, fjs = d.getElementsByTagName(s)[0];
3192//    if (d.getElementById(id)) return;
3193//    js = d.createElement(s); js.id = id;
3194//    js.src = 'https://connect.facebook.net/ko_KR/sdk.js#xfbml=1&version=v3.1&appId=786526475012875&autoLogAppEvents=1';
3195//    fjs.parentNode.insertBefore(js, fjs);
3196//}(document, 'script', 'facebook-jssdk'));
3197
3198function initFacebookSDK(d, s, id, c) {
3199    var js, fjs = d.getElementsByTagName(s)[0];
3200    if (d.getElementById(id)) return;
3201    js = d.createElement(s); js.id = id;
3202    js.src = 'https://connect.facebook.net/ko_KR/sdk.js#xfbml=1&version=v3.1&appId=786526475012875&autoLogAppEvents=1';
3203    if (c) { fjs.addEventListener('load', function(e) { c(null, e); }, false); }
3204    fjs.parentNode.insertBefore(js, fjs);
3205}
3206
3207function refreshInstagramAccessToken(access_token, callback) {
3208    qvjax_direct(
3209        "refresh_instagram_access_token",
3210        "/module/sns/instagram.php",
3211        "&access_token=" + access_token,
3212        function(data) {
3213            /* result 0 : 토큰 갱신 필요
3214             * result 1 : 정상
3215             */
3216            if (data.result == 0) {
3217                $.ajax({
3218                    type: "GET",
3219                    url: "https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token=" + access_token,
3220                    success: function (response) {
3221                        console.log('response', response);
3222                        callback();
3223                    },
3224                    error: function (xhr) {
3225                        console.log('[Instagram]\n토큰 갱신에 실패했습니다.\n관리자에게 문의해주세요.', xhr);
3226                        // if (xhr.responseJSON.error.code === 190) {}
3227                    }
3228                });
3229            } else if (data.result == 1) {
3230                callback();
3231            }
3232        },
3233        function (xhr) {
3234            console.log('xhr', xhr.responseText);
3235            callback();
3236        }
3237    )
3238}
3239
3240function renderInstagramGraphFeed(feed_token, feed_count, feed_column, feed_count_m, feed_column_m, feed_height, feed_height_m, feed_margin, vBox) {
3241    if (!feed_token) return;
3242    refreshInstagramAccessToken(feed_token, function() {
3243        $.ajax({
3244            type: "GET",
3245            url: "https://graph.instagram.com/me/media?fields=id,caption,media_type,media_url,thumbnail_url,timestamp,permalink&access_token=" + feed_token,
3246            success: function (response) {
3247                if (!response.data) return
3248                else if (response.data.length > 0) {
3249                    $(vBox.children('div')[0]).empty();
3250                    var count = isMobile() ? feed_count_m : feed_count;
3251                    for (var i = 0; i < count; i++) {
3252                        var media = response.data[i];
3253                        if (!media) return;
3254
3255                        var thumbnail = media.media_type == "VIDEO" ? media.thumbnail_url : media.media_url;
3256                        var feed = '<div class="sns-feed-box grid-' + feed_column + ' grid-m-' + feed_column_m + '">';
3257                        feed += "<a target='_blank' href='" + media.permalink + "'>";
3258                        feed += "<div class='sns-feed-image-layer m-h-" + feed_height_m + "' style='height:" + feed_height + "px; margin:" + feed_margin + "px;'>";
3259                        feed += '<div class="sns-feed-image" style="background-image: url(' + thumbnail + ');"></div>';
3260                        feed += "<div class='sns-feed-caption-layer qv-font'>";
3261                        if (media.caption !== undefined) {
3262                            if (media.caption.length > 0) {
3263                                var text = media.caption;
3264                                var length = 100;
3265                                var trimmedString = text.length > length ? text.substring(0, length - 3) + "..." : text;
3266                                feed += "<p class='sns-feed-caption-contents'>" + trimmedString + "</p>"
3267                            }
3268                        }
3269                        feed += "<span class='sns-feed-caption-info'>";
3270                        feed += "	<div class='sns-feed-caption-time'>";
3271                        feed += "		<i class='fa fa-calendar-o'></i>";
3272                        feed += getNiceTime(new Date(media.timestamp).getTime(), new Date(), 1, true);
3273                        feed += "	</div>";
3274                        feed += "</span>";
3275                        feed += "</div>";
3276                        feed += "</div>";
3277                        feed += "</a>";
3278                        feed += "</div>";
3279                        $(vBox.children('div')[0]).append(feed);
3280                        $(vBox).find('.sns-feed').show()
3281                    }
3282                }
3283            },
3284            error: function(xhr) {
3285                console.log('[Instagram]\n잘못된 계정이거나 존재하지 않는 계정입니다.\n\n계정정보나 비밀번호가 변경되었다면 다시 한 번 연동해주시기 바랍니다.');
3286                console.log('[Instagram ERROR]', JSON.parse(xhr.responseText).error);
3287                $(vBox).find('.sns-feed').show();
3288            }
3289        });
3290    });
3291}
3292
3293function renderInstagramFeed(feed_token, feed_count, feed_column, feed_column_m, feed_height_m, feed_style, vBox) {
3294    $.ajax({
3295        type: "GET",
3296        dataType: "jsonp",
3297        cache: false,
3298        url: "https://api.instagram.com/v1/users/self/media/recent/?access_token=" + feed_token + "&count=" + feed_count,
3299        success: function (response) {
3300            if (!response.data) return;
3301            else if (response.data.length > 0) {
3302                $(vBox.children('div')[0]).empty();
3303
3304                for (var i = 0; i < response.data.length; i++) {
3305                    var feed = '<div class="sns-feed-box grid-' + feed_column + ' grid-m-' + feed_column_m + '">';
3306                    feed += "<a target='_blank' href='" + response.data[i].link + "'>";
3307                    feed += "<div class='sns-feed-image-layer m-h-" + feed_height_m + "' style='" + feed_style + "'>";
3308                    feed += '<div class="sns-feed-image" style="background-image: url(' + response.data[i].images.standard_resolution.url + ');"></div>'
3309                    feed += "</div>";
3310                    feed += "<div class='sns-feed-caption-layer qv-font'>";
3311                    if (response.data[i].caption !== null) {
3312
3313                        if (response.data[i].caption.text.length > 0) {
3314                            var text = response.data[i].caption.text;
3315                            var length = 100;
3316                            var trimmedString = text.length > length ? text.substring(0, length - 3) + "..." : text;
3317                            feed += "<p class='sns-feed-caption-contents'>" + trimmedString + "</p>"
3318                        }
3319                    }
3320                    feed += "<span class='sns-feed-caption-info'>";
3321                    feed += "<div class='sns-feed-caption-time'>";
3322                    feed += "<i class='fa fa-calendar-o'></i>";
3323                    feed += getNiceTime(parseInt(response.data[i].created_time) * 1000, new Date(), 1, true);
3324                    feed += "</div>";
3325                    feed += "<div class='sns-feed-caption-likes'>";
3326                    feed += "<i class='fa fa-heart'></i>";
3327                    feed += response.data[i].likes.count;
3328                    feed += "<i class='fa fa-comment'></i>";
3329                    feed += response.data[i].comments.count;
3330                    feed += "</div>";
3331                    feed += "</span>";
3332                    feed += "</div>";
3333                    feed += "</a>";
3334                    feed += "</div>";
3335                    $(vBox.children('div')[0]).append(feed);
3336                }
3337            }
3338
3339            if (response.data.length < feed_count && response.pagination) {
3340                if (!response.pagination.next_url) return;
3341                else {
3342                    renderInstagramFeedMore(
3343                        response.pagination.next_url,
3344                        feed_count - response.data.length,
3345                        feed_column, feed_column_m, feed_height_m, feed_style, vBox);
3346                }
3347            }
3348        }
3349    });
3350}
3351
3352// 특정 이유로 인스타그램 피드를 원하는 개수만큼 불러오지 못했을 때 추가로 API를 호출한다
3353// 저작권이 있는 BGM이 들어간 영상, 재생시간이 1분 이상인 영상 등
3354// https://smashballoon.com/video-posts-are-missing-or-only-show-thumbnail/
3355function renderInstagramFeedMore(feed_url, feed_count, feed_column, feed_column_m, feed_height_m, feed_style, vBox) {
3356    $.ajax({
3357        type: "GET",
3358        dataType: "jsonp",
3359        cache: false,
3360        url: feed_url,
3361        success: function (response) {
3362            if (!response.data) return
3363            else if (response.data.length > 0) {
3364                for (var i = 0; i < feed_count; i++) {
3365                    var feed = '<div class="sns-feed-box grid-' + feed_column + ' grid-m-' + feed_column_m + '">';
3366                    feed += "<a target='_blank' href='" + response.data[i].link + "'>";
3367                    feed += "<div class='sns-feed-image-layer m-h-" + feed_height_m + "' style='" + feed_style + "'>";
3368                    feed += '<div class="sns-feed-image" style="background-image: url(' + response.data[i].images.standard_resolution.url + ');"></div>'
3369                    feed += "</div>";
3370                    feed += "<div class='sns-feed-caption-layer qv-font'>";
3371                    if (response.data[i].caption !== null) {
3372
3373                        if (response.data[i].caption.text.length > 0) {
3374                            var text = response.data[i].caption.text;
3375                            var length = 100;
3376                            var trimmedString = text.length > length ? text.substring(0, length - 3) + "..." : text;
3377                            feed += "<p class='sns-feed-caption-contents'>" + trimmedString + "</p>"
3378                        }
3379                    }
3380                    feed += "<span class='sns-feed-caption-info'>";
3381                    feed += "<div class='sns-feed-caption-time'>";
3382                    feed += "<i class='fa fa-calendar-o'></i>";
3383                    feed += getNiceTime(parseInt(response.data[i].created_time) * 1000, new Date(), 1, true);
3384                    feed += "</div>";
3385                    feed += "<div class='sns-feed-caption-likes'>";
3386                    feed += "<i class='fa fa-heart'></i>";
3387                    feed += response.data[i].likes.count;
3388                    feed += "<i class='fa fa-comment'></i>";
3389                    feed += response.data[i].comments.count;
3390                    feed += "</div>";
3391                    feed += "</span>";
3392                    feed += "</div>";
3393                    feed += "</a>";
3394                    feed += "</div>";
3395                    $(vBox.children('div')[0]).append(feed);
3396                }
3397            }
3398        }
3399    });
3400}
3401
3402function renderTwitterFeed(feed_token, feed_count, feed_column, feed_column_m, feed_height_m, feed_style,  vBox) {
3403    $.ajax({
3404        type: "GET",
3405        dataType: "jsonp",
3406        cache: false,
3407        url: location.protocol + '//quv.kr' + "/auth/twitter/tweets_json.php?count=" + feed_count + "&callback=listTweets&screen_name=" + feed_token,
3408        success: function(response) {
3409            if (response.length > 0) {
3410                $(vBox.children('div')[0]).empty();
3411
3412                for (var i = 0; i < response.length; i++) {
3413                    if (typeof response[i].entities.media != 'undefined' && response[i].entities.media.length > 0) {
3414                        var imageUrl = response[i].entities.media[0].media_url_https;
3415                        var link = response[i].entities.media[0].url;
3416                        var feedImageHtml = '<div class="sns-feed-image" style="background-image: url(' + imageUrl + ');"></div>';
3417                    } else {
3418                        var link = 'http://twitter.com/' + response[i].user.screen_name + '/status/' + response[i].id_str;
3419                        var feedImageHtml = '<div class="sns-feed-image"><div><i class="fa fa-twitter"></i></div></div>';
3420                    }
3421
3422                    var feed = '<div class="sns-feed-box grid-' + feed_column + ' grid-m-' + feed_column_m + '">';
3423                    feed += "<a target='_blank' href='" + link + "'>";
3424                    feed += "<div class='sns-feed-image-layer m-h-" + feed_height_m + "' style='" + feed_style + "'>";
3425                    feed += feedImageHtml
3426                    feed += "</div>";
3427                    if (typeof response[i].entities.media != 'undefined' && response[i].entities.media.length > 0) {
3428                        feed += "<div class='sns-feed-caption-layer'>";
3429                    } else {
3430                        feed += "<div class='sns-feed-caption-layer-display'>";
3431                    }
3432
3433                    if (response[i].text.length > 0) {
3434                        var text = response[i].text;
3435                        var length = 100;
3436                        var trimmedString = text.length > length ? text.substring(0, length - 3) + "..." : text;
3437                        feed += "<p class='sns-feed-caption-contents'>" + trimmedString + "</p>"
3438                    }
3439                    feed += "<span class='sns-feed-caption-info'>";
3440                    feed += "	<div class='sns-feed-caption-time'>";
3441                    feed += "		<i class='fa fa-calendar-o'></i>";
3442                    feed += getNiceTime(new Date(Date.parse(response[i].created_at.replace(/( \+)/, ' UTC$1'))), new Date(), 1, true);
3443                    feed += "	</div>";
3444                    feed += "	<div class='sns-feed-caption-likes'>";
3445                    feed += "		<i class='fa fa-heart'></i>";
3446                    feed += response[i].favorite_count;
3447                    feed += "		<i class='fa fa-retweet'></i>";
3448                    feed += response[i].retweet_count;
3449                    feed += "	</div>";
3450                    feed += "</span>";
3451                    feed += "</div>";
3452                    feed += "</a>";
3453                    feed += "</div>";
3454                    $(vBox.children('div')[0]).append(feed);
3455                }
3456            }
3457        }
3458    });
3459}
3460// SNS 초기화 끝
3461
3462
3463
3464// 모바일용 헤더 초기화
3465function initMobileHeader() {
3466    $('.header-mobile-nav-btn').on('click', function() {
3467        $('.header-mobile').addClass('active-side-nav');
3468    });
3469
3470    $('.header-mobile-side-nav-close').on('click', function() {
3471        $('.header-mobile').removeClass('active-side-nav');
3472    });
3473
3474    $('#main_container').delegate('.active-side-nav', 'click', function(e) {
3475        if ($(e.target).hasClass('header-mobile')) {
3476            $('.header-mobile').removeClass('active-side-nav');
3477        }
3478    });
3479
3480    
3481    $('.header-mobile-side-nav, .header-side-nav').delegate('.mn-dropdown', 'click', function(e) {
3482        var parent = $(this).parent();
3483        if (parent.find('ul.sub-mn').length > 0 && !parent.hasClass('active')) {
3484            parent.addClass('active');
3485        }
3486        else {
3487            parent.removeClass('active');
3488        }
3489    });
3490
3491
3492    // 모바일에서 스크롤 할 때 헤더에 scroll클래스 추가
3493    $(window).on('scroll', function(e) {
3494        if ($(this).scrollTop() > 50) {
3495            $('.header-mobile').addClass('scroll');
3496        }
3497        else {
3498            $('.header-mobile').removeClass('scroll');
3499        }
3500
3501        var scrollTop = $(this).scrollTop();
3502        var mobile_header =$('#main_container > .header-mobile > div');
3503        var mobile_header_fixed = $('#main_container > .header-mobile > div[data-scroll-fix="true"]');
3504        if (mobile_header.length != mobile_header_fixed.length) {
3505            $.each($('#main_container > .header-mobile > div[data-scroll-fix="true"]'), function () {
3506                var min = 0;
3507                var max = parseInt($(this).data('top'));
3508                var top = max - scrollTop;
3509                top = top <= min ? min : top;
3510                $(this).css('top', top + 'px');
3511            });
3512        }
3513
3514        // 서브메뉴가 존재할 때 header merge 상태이면
3515        // 스크롤 시 header-mobile-sub-menu 배경 색상을 투명에서 기존 색상으로 변경해주는 작업
3516        $.each($('#main_container > .header-mobile .header-mobile-sub-menu'), function() {
3517            $(this).css('background', $(this).parent().css('background'));
3518        });
3519    });
3520}
3521// 모바일용 헤드 초기화 끝
3522
3523// 스크롤
3524var isScrolling = false;
3525function onScrollBefore() {
3526    if (isScrolling) {
3527        isScrolling = false;
3528        scrollChangeHeaderLogoImage('before');
3529    }
3530}
3531
3532function onScrollAfter() {
3533    if (!isScrolling) {
3534        isScrolling = true;
3535        scrollChangeHeaderLogoImage('after');
3536    }
3537}
3538
3539function scrollChangeHeaderLogoImage(e) {
3540    const logo = $('.header .logoBox .logo-img-core.scroll-change');
3541    if (logo && logo.length > 0) {
3542        const before = logo.attr('data-before');
3543        const after = logo.attr('data-after');
3544        const src = (e === 'before') ? before : after;
3545
3546        if (before && after && src && (logo.attr('src') !== src)) {
3547            logo.attr('src', src);
3548        }
3549    }
3550}
3551
3552function qv_on_scroll(t) {
3553    }
3554
3555function qv_on_scroll_ie(t) {
3556    }
3557
3558function height_sync(e,hei){ //fixed_scroll_js에서 사용
3559    // 2018.10.12 재헌
3560    // IE 에서 속도 이슈가 발생해 아래와 같이 조건 추가
3561    // hei 값이 변해야 style 수정하도록 함
3562    // if($(e).length>0) {
3563    if($(e).length>0 && $(e).height() != hei) {
3564        $(e).height(hei);  //hide의 경우에도 애니메이팅 효과를 위해, height를 0으로 설정
3565        $.each($(e).find(".hsync"), function() {
3566            if ($(this).parents('.header-side-nav').length > 0) { return; } // header-side-nav 하위 ul은 높이 수정하지 않아야 함
3567            $(this).height(hei);
3568            $(this).css("line-height", hei + "px");
3569        });
3570        $(e).find(".hsync-nlh").height(hei);
3571        $(e).find(".header-contents").height(hei);
3572        $(e).find(".img-view").height(hei);
3573        $(e).find(".img-core").css('max-height',hei+"px");
3574        $(e).find(".img-op").css('max-height',hei+"px");
3575        $(e).find(".logoBox .logo-img-core").css('max-height',hei+"px");
3576
3577        if(hei<1){
3578            $(e).find(".header-contents").hide();
3579        }else{
3580            $(e).find(".header-contents").show();
3581        }
3582    }
3583}
3584
3585function get_hd_obj(){
3586    var obj_hd= {};
3587    $(".header [class^=header]").each(function(){
3588        var header_class=$(this).attr('class');
3589        var cm;
3590        if(_cm=header_class.match(/(header)(\d+)(\s+)?$/)) {
3591            var hdn=parseInt(_cm[2]);
3592            obj_hd[hdn]=$(this).data('hei')+","+$(this).data('scr-hei');
3593        }
3594    });
3595    return obj_hd;
3596}
3597
3598function showPopup(popup_id) {
3599    qvjax_direct(
3600        "get_popup_only_json",
3601        "/module/site/site.php",
3602        'stid=' + QV_BASE_OBJ.stid,
3603        function (data) {
3604            if (data.length > 0) {
3605                var popup_obj = $.grep(data, function(e) { return e.key == popup_id  });
3606                if (popup_obj.length > 0) {
3607                    $('.dynamic-popup-container').remove();
3608                    $('#main_container').append('<div class="dynamic-popup-container"></div>');
3609
3610                    var popup = $(popup_obj[0].contents).clone();
3611                    popup.attr('id', popup_id);
3612
3613                    $(popup).removeClass('body');
3614                    $(popup).removeClass('popup-editor');
3615                    $(popup).addClass('popup');
3616                    $('#main_container .dynamic-popup-container').append($(popup));
3617                }
3618
3619                $('.popup-frame-header-close').click(function() {
3620                    var popup = $(this).parents('.popup');
3621                    popup.remove();
3622
3623                    if ($('.dynamic-popup-container').children().length <= 0) {
3624                        $('.dynamic-popup-container').remove();
3625                    }
3626                });
3627
3628                $('.popup-frame-footer-todayclose').click(function() {
3629                    var popup = $(this).parents('.popup');
3630                    popup.remove();
3631
3632                    if ($('.dynamic-popup-container').children().length <= 0) {
3633                        $('.dynamic-popup-container').remove();
3634                    }
3635
3636                    setCookie(popup.attr('id'), 1, 1);
3637                });
3638
3639                $.each($('#main_container .dynamic-popup-container .video-iframe, #main_container .popup-container .video-iframe'), function() {
3640                    var url = $(this).attr('data-src');
3641                    $(this).attr('src', url);
3642                });
3643
3644
3645
3646                if ($(popup).find('.formBox').length > 0) {
3647                    form_initialize();
3648                }
3649                if ($(popup).find('.mapBox').length > 0) {
3650                    initMapBox($(popup).find('.mapBox'));
3651                }
3652                if ($(popup).find('.gridBox').length > 0) {
3653                    initGrid($(popup).find('.gridBox'));
3654                }
3655                if ($(popup).find('.ddayBox').length > 0) {
3656                    initDday($(popup).find('.ddayBox'))
3657
3658                    let isCountdown = false
3659                    $(popup).find('.dday-area-countdown').each(function () {
3660                        if ($(this).css('display') === 'block') {
3661                            isCountdown = true
3662                            return false
3663                        }
3664                    })
3665                    if (isCountdown) initCountDown()
3666                }
3667                if ($(popup).find('.calendarBox').length > 0) {
3668                    initCalendar($(popup).find('.calendarBox'));
3669                }
3670                if ($(popup).find('.frm[href], .box[href]')) {
3671                    initFrameLink($(popup).find('.frm[href], .box[href]'));
3672                }
3673                if ($(popup).find('.slider-frm').length > 0) {
3674                    initSlider($(popup).find('.slider-frm'));
3675                }
3676            }
3677        },
3678        function (xhr) {}
3679    );
3680}
3681
3682function initPopup() {
3683    // 페이지에서만 띄움.header1
3684    // if (location.pathname.length > 1) { return; }
3685    // 게시판 읽기/쓰기 때는 안띄움
3686    if (location.pathname.indexOf('/module/board/') > -1) return;
3687    qvjax_direct(
3688        "get_menu_json",
3689        "/module/site/site.php",
3690        'stid=' + QV_BASE_OBJ.stid,
3691        function (data) {
3692            if (data.length > 0) {
3693                var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
3694
3695                var popup_grep = $.grep(data, function(e) { return e.key == QV_BASE_OBJ.spid  });
3696                if (popup_grep.length == 0) return;
3697
3698                var popup_list = popup_grep[0].popup;
3699                var popup_array = popup_list.split(',');
3700                $('#main_container').append('<div class="popup-container"></div>');
3701                $.each(popup_array, function() {
3702                    var popup_spid = this;
3703                    var popup_obj = $.grep(data, function(e) { return e.key == popup_spid && e.type == "popup"; });
3704                    if (popup_obj.length > 0) {
3705                        var popup = $(popup_obj[0].contents).clone();
3706                        popup.attr('id', popup_spid);
3707
3708                        if (getCookie(popup.attr('id')) == 1) {
3709                            return true;
3710                        }
3711
3712                        var start = popup.data('start');
3713                        var end = popup.data('end');
3714                        if (start > 0 && end > 0) {
3715                            if (start > $.now()) return;
3716                            if (end < $.now()) return;
3717                        }
3718
3719                        $(popup).removeClass('body');
3720                        $(popup).removeClass('popup-editor');
3721                        $(popup).addClass('popup');
3722
3723                        if (isMobile &&  $(popup).hasClass('popup-display-pc')
3724                        || !isMobile &&  $(popup).hasClass('popup-display-mobile')) return;
3725
3726                        // popup 다국어처리
3727                        if (LANG && LANG != 'ko') {
3728                            var close = $(popup).find('.popup-frame-header-close');
3729                            if (close.text().indexOf('닫기') > -1) {
3730                                close.html(lang.close + ' <i class="material-icons" style="font-size: 13px;">clear</i>');
3731                            }
3732
3733                            var todayclose = $(popup).find('.popup-frame-footer-todayclose');
3734                            todayclose.text(lang.today_close);
3735                        }
3736
3737                        $('#main_container .popup-container').append($(popup));
3738
3739                        if ($(popup).find('.mapBox').length > 0) {
3740                            initMapBox($(popup).find('.mapBox'));
3741                        }
3742
3743                        if ($(popup).find('.ddayBox').length > 0) {
3744                            initDday($(popup).find('.ddayBox'))
3745
3746                            let isCountdown = false
3747                            $(popup).find('.dday-area-countdown').each(function () {
3748                                if ($(this).css('display') === 'block') {
3749                                    isCountdown = true
3750                                    return false
3751                                }
3752                            })
3753                            if (isCountdown) initCountDown()
3754                        }
3755
3756                        if ($(popup).find('.calendarBox').length > 0) {
3757                            initCalendar($(popup).find('.calendarBox'));
3758                        }
3759
3760                        if ($(popup).find('.frm[href], .box[href]')) {
3761                            initFrameLink($(popup).find('.frm[href], .box[href]'));
3762                        }
3763                        if ($(popup).find('.slider-frm').length > 0) {
3764                            initSlider($(popup).find('.slider-frm'));
3765                        }
3766                    }
3767                });
3768
3769                $.each($('#main_container .dynamic-popup-container .video-iframe, #main_container .popup-container .video-iframe'), function() {
3770                    var url = $(this).attr('data-src');
3771                    $(this).attr('src', url);
3772                });
3773
3774                if(isMobile) { }
3775                else {
3776                    // 드래그는 pc에서만 되도록 함
3777                    $('.popup').draggable({
3778                        handle: ".popup-frame-header, .popup-frame-footer",
3779                        start: function( event, ui ) {
3780                            // 새로 리뉴얼된(margin x) 팝업에만 적용
3781                            if (parseInt(ui.helper.css('margin-left')) == 0) {
3782                                // 드래그할 때 bottom이 0이면 비정상적으로 동작하여 auto로 지정
3783                                ui.helper.css({right: 'auto', bottom: 'auto'});
3784                            }
3785                        }
3786                    });
3787                }
3788
3789                $('.popup-frame-header-close').click(function() {
3790                    var popup = $(this).parents('.popup');
3791                    popup.remove();
3792
3793                    if ($('.popup-container').children().length <= 0) {
3794                        $('.popup-container').remove();
3795                    }
3796                });
3797
3798                $('.popup-frame-footer-todayclose').click(function() {
3799                    var popup = $(this).parents('.popup');
3800                    popup.remove();
3801
3802                    if ($('.popup-container').children().length <= 0) {
3803                        $('.popup-container').remove();
3804                    }
3805
3806                    setCookie(popup.attr('id'), 1, 1);
3807                });
3808            }
3809
3810            if ($('.popup-container').children().length <= 0) {
3811                $('.popup-container').remove();
3812            }
3813
3814        },
3815        function (xhr) { }
3816    );
3817}
3818
3819function initHeader9(){
3820    if (getCookie("header9_closed") == 1) {
3821        $(".header .header9").hide(); //hide banner
3822        $("body.live").addClass("header9_closed");
3823    }
3824
3825    var $top_frm=$("#main_container .body > .frm:not(.mobile_ele)").first();
3826    if($top_frm.hasClass("headerSectionMerge")){
3827        $("body").addClass("headerSectionMerge");
3828        $("body").addClass("scrollBefore");
3829    }
3830
3831    if($("body .header").hasClass("useFixed") && !$top_frm.hasClass("headerSectionMerge")){
3832        var body_mg_t=$(".body").css("margin-top")?$(".body").css("margin-top").replace("px",""):0;
3833        if(body_mg_t>0){
3834            var top_frm_mg_t=$top_frm.css("margin-top")?$top_frm.css("margin-top").replace("px",""):0;
3835            if(top_frm_mg_t>0){
3836                var cal_top_frm_mg_t=parseInt(body_mg_t)+parseInt(top_frm_mg_t);
3837                $top_frm.css("margin-top",cal_top_frm_mg_t+"px");
3838                // console.log("top_frm mg-t:"+cal_top_frm_mg_t);
3839            }
3840        }
3841    }
3842}
3843
3844function realignHeader9(){
3845
3846    var $top_frm=$("#main_container .body > .frm:not(.mobile_ele)").first();
3847
3848    if($("body .header").hasClass("useFixed") && !$top_frm.hasClass("headerSectionMerge")){
3849        var body_mg_t=$(".body").css("margin-top")?$(".body").css("margin-top").replace("px",""):0;
3850        if(body_mg_t>0){
3851            $top_frm.css("margin-top",$("body .header").height()+"px");
3852        }
3853    }
3854}
3855
3856function initMenu(){
3857    var query = qv_func.getUrlParams();
3858    if (location.pathname.indexOf('/module/board/read_form') > -1 && query.pn) {
3859        $(".header ul.mn-ul .mn-link, .header-mobile ul.mn-ul .mn-link").each(function(i,t){
3860            if($(t).attr('href')=="/" + query.pn){
3861                $(t).parent().addClass("cur-mn-item");
3862            }
3863        });
3864    } else {
3865        $(".header ul.mn-ul .mn-link, .header-mobile ul.mn-ul .mn-link").each(function(i,t){
3866            if($(t).attr('href')=="/join"){
3867                $(t).parent().addClass("cur-mn-item");
3868            }
3869        });
3870    }
3871
3872    //$(".header ul.mn-ul .mn-link, .header-mobile ul.mn-ul .mn-link").each(function(i,t){
3873    //    if($(t).attr('href')=="///"){
3874    //        $(t).parent().addClass("cur-mn-item");
3875    //    }
3876    //});
3877}
3878
3879// 쿠키 생성
3880function setCookie(cName, cValue, cDay){
3881    var expire = new Date();
3882    expire.setDate(expire.getDate() + cDay);
3883    cookies = cName + '=' + escape(cValue) + '; path=/ '; // 한글 깨짐을 막기위해 escape(cValue)를 합니다.
3884    if(typeof cDay != 'undefined') cookies += ';expires=' + expire.toGMTString() + ';';
3885    document.cookie = cookies;
3886}
3887
3888// 쿠키 가져오기
3889function getCookie(cName) {
3890    cName = cName + '=';
3891    var cookieData = document.cookie;
3892    var start = cookieData.indexOf(cName);
3893    var cValue = '';
3894    if(start != -1){
3895        start += cName.length;
3896        var end = cookieData.indexOf(';', start);
3897        if(end == -1)end = cookieData.length;
3898        cValue = cookieData.substring(start, end);
3899    }
3900    return unescape(cValue);
3901}
3902
3903$('.body').delegate('.fixed-contents-close', 'click', function(e) {
3904    $(this).parents('.fixed-contents-layer').first().remove();
3905});
3906
3907//10.8 MAP 임시 패치
3908
3909</script>
vendor: 2 bytes, line 3909
3909
3910<script type='text/javascript' src="/js/animate.js?v=260904"></script>
vendor: 2 bytes, line 3910
3910
3911<script type="text/javascript" src="/module/member/member.js?v=260904"></script>
3911
3912
3913<script type="text/javascript" src="/module/board/board_read_form.js?v=260904"></script>
vendor: 2 bytes, line 3913
3913
3914<script type="text/javascript" src="/module/map/map.js?v=260904"></script>
3914
3915
3916    
3916<script type='text/javascript' src="/module/form/form.js?v=260904"></script>
3916
3917    
3917<script type="text/javascript" src="/module/board/board_write_form.js?v=260904"></script>
3917
3918    
3918<script type="text/javascript" src="/module/board/board.js?v=260904"></script>
3918
3919
3920<div id="youtube-autoplay" style="display:none;" onclick="playVideo()"></div>
3921
3922<!-- 게시판 패스워드 확인 모달 -->
3923<div class="modal in-editor-modal fade" id="ReadPasswordCheckModal" tabindex="-1" role="dialog">
3924    <div class="modal-dialog modal-bx">
3925        <div class="modal-content">
3926            <div class="modal-body">
3927                <div class="modal-body-title">
3928                    비밀번호 확인                </div>
3929                <div class="modal-body-contents">
3930                    <input type="password" id="ReadPasswordCheck" placeholder="" autocomplete="off"><button type="button" class="btn btn-default" id="ReadPasswordCheckModalBtnSave" auto>확인</button>
3931                </div>
3932            </div>
3933        </div>
3934    </div>
3935</div>
3936
3937<!-- 개인정보처리방침 모달 -->
3938<div class="modal in-editor-modal fade" id="PolicyPrivacyModal" tabindex="-1" role="dialog">
3939    <div class="modal-dialog modal-bx">
3940        <div class="modal-content">
3941            <div class="modal-body">
3942                <div type="button" class="close" data-dismiss="modal"></div>
3943                <div class="modal-body-title">
3944                    개인정보처리방침(Privacy Policy)                </div>
3945                <div class="modal-body-contents">
3946                    <textarea id="policy-privacy-textarea" readonly></textarea>
3947                </div>
3948            </div>
3949        </div>
3950    </div>
3951</div>
3952
3953<!-- 갤러리 이미지 모달 -->
3954<div id="gallery_board_image_modal" class="gallery-board-image-modal">
3955    <img class="gallery-board-modal-content" id="gallery-board-img01">
3956    <div class="gallery-board-modal-overlay"></div>
3957    <span id="gallery_board_cancel" class="close">&times;</span>
3958    <div class="gallery-board-magnifier">
3959        <div class="gallery-board-magnifier-add">
3960            <i class="icon-magnifier-add"></i>
3961        </div>
3962        <div class="gallery-board-magnifier-remove">
3963            <i class="icon-magnifier-remove"></i>
3964        </div>
3965        <div class="gallery-board-magnifier-original-size">
3966            <i class="fa fa-clone"></i>
3967            <div>원본크기</div>
3968        </div>
3969    </div>
3970    <div class="gallery-board-modal-right">
3971        <i class="fa fa-chevron-right"></i>
3972    </div>
3973    <div class="gallery-board-modal-left">
3974        <i class="fa fa-chevron-left"></i>
3975    </div>
3976    <div class="gallery-board-modal-download"><i class="icon-paper-clip" aria-hidden="true"></i></div>
3977</div>
3978
3979<div class="modal in-editor-modal fade" id="CalendarScheduleViewModal" tabindex="-1" role="dialog">
3980    <div class="modal-dialog modal-bx">
3981        <div class="modal-content">
3982            <div class="modal-body">
3983                <div type="button" class="close" data-dismiss="modal"><span>×</span></div>
3984                <div class="modal-body-title">
3985                    <i class="icon-calendar" aria-hidden="true"></i>
3986                    <span>TEST TITLE</span>
3987                </div>
3988                <div class="modal-body-contents">
3989                    <div>
3990                        <div class="calendar-schedule-view-category">
3991                            <div class="calendar-schedule-view-category-color"></div>
3992                            <div class="calendar-schedule-view-category-name"></div>
3993                        </div>
3994                        <div class="calendar-schedule-view-start-datetime">2019.01.10 14:00</div>
3995                        <div class="calendar-schedule-view-end-datetime">2019.01.30 15:00</div>
3996                    </div>
3997                    <div>
3998                        <div class="calendar-schedule-view-content">
3999                            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
4000                        </div>
4001                    </div>
4002                </div>
4003                <div class="modal-body-option">
4004                    <div class="modal-body-option-update">수정하기</div>
4005                    <div class="modal-body-option-delete">삭제하기</div>
4006                </div>
4007            </div>
4008        </div>
4009    </div>
4010</div>
4011
4012<!-- 캘린더 모달 -->
4013<div class="modal in-editor-modal fade" id="CalendarScheduleModal" tabindex="-1" role="dialog">
4014    <div class="modal-dialog modal-bx">
4015        <div class="modal-content">
4016            <div class="modal-body">
4017                <div id="hdCalendarBxData"></div>
4018                <div type="button" class="close" data-dismiss="modal"><span>×</span></div>
4019                <div class="modal-body-title">
4020                    <i class="icon-calendar" aria-hidden="true"></i>
4021                    일정 추가하기                </div>
4022                <div class="modal-body-contents">
4023                    <table class="calendar-schedule-datetime">
4024                        <thead>
4025                            <tr>
4026                                <th>시작일</th>
4027                                <th>종료일</th>
4028                            </tr>
4029                        </thead>
4030                        <tbody>
4031                            <tr>
4032                                <td>
4033                                    <input type="text" class="calendar-schedule-start-date calendar-datepicker" name="calendar-schedule-start-date">
4034                                    <input type="text" class="calendar-schedule-start-time calendar-timepicker" name="calendar-schedule-start-time">
4035                                </td>
4036                                <td>
4037                                    <input type="text" class="calendar-schedule-end-date calendar-datepicker" name="calendar-schedule-end-date">
4038                                    <input type="text" class="calendar-schedule-end-time calendar-timepicker" name="calendar-schedule-end-time">
4039                                </td>
4040                            </tr>
4041                        </tbody>
4042                    </table>
4043                    <div class="calendar-schedule-datetime-everytime-check">
4044                        <label class="checkbox-inline">
4045                            <input type="checkbox" class="calendar-schedule-datetime-everytime" name="" id="calendar-schedule-datetime-everytime" value="1" checked>종일                        </label>
4046                    </div>
4047
4048                    <div>
4049                        <input type="text" class="calendar-schedule-subject" placeholder="제목">
4050                    </div>
4051                    <div>
4052                        <textarea class="calendar-schedule-content" placeholder="내용"></textarea>
4053                    </div>
4054                </div>
4055                <div class="calendar-schedule-confirm">일정 추가하기</div>
4056            </div>
4057        </div>
4058        <div class="calendar-schedule-category"></div>
4059        <div class="calendar-schedule-category-list">
4060            <ul>
4061            </ul>
4062        </div>
4063    </div>
4064</div>
4065
4066
4067<script type="text/javascript">
4068    $("#gallery_board_cancel").click(function () {
4069        $('#gallery_board_image_modal').hide();
4070        $('body').removeClass('modal-open');
4071    });
4072
4073    var viewGalleryBoardImage;
4074    function viewGalleryBoardImageFullSize(obj) {
4075        var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
4076
4077        if ($(obj).find('div.gallery-board-image').length > 0) {
4078            var link = $(obj).parent().data('link');
4079            var target = $(obj).parent().data('target');
4080        }
4081        else {
4082            var link = $(obj).data('link');
4083            var target = $(obj).data('target');
4084        }
4085
4086        if (link == undefined || link == '') { // gallery-board-box data에 link값이 없으면 full size modal을 띄움
4087            $('body').addClass('modal-open');
4088            $('#gallery-board-img01').fadeOut(0, 'linear');
4089
4090            var modal = document.getElementById('gallery_board_image_modal');
4091            var modalImg = document.getElementById("gallery-board-img01");
4092
4093            $('.gallery-board-modal-right').show();
4094            $('.gallery-board-modal-left').show();
4095
4096            if ($(obj).find('.gallery-board-image')[0].tagName == 'IMG') {
4097                var bg = $(obj).find('.gallery-board-image')[0].src;
4098            }
4099            else {
4100                var bg = $(obj).find('.gallery-board-image').css('background-image');
4101                bg = bg.replace('url(', '').replace(')', '').replace(/\"/gi, "");
4102            }
4103            bg = bg.replace(/_800/g, '_1920');
4104            modalImg.src = bg;
4105            modalImg.onload = function() {
4106                $('#gallery-board-img01').fadeIn(120, 'linear');
4107                initGalleryBoardImageModal(modalImg);
4108            };
4109
4110            viewGalleryBoardImage = [];
4111            $(obj).parents('.gallery-board').first().find('.gallery-board-image').each(function (i, val) {
4112                if ($(val)[0].tagName == 'IMG') {
4113                    var bg = $(val)[0].src
4114                }
4115                else {
4116                    var bg = $(val).css('background-image');
4117                    bg = bg.replace('url(', '').replace(')', '').replace(/\"/gi, "");
4118                }
4119                bg = bg.replace(/_800/g, '_1920');
4120                viewGalleryBoardImage.push({'index':i, 'bg':bg});
4121
4122                if ($(val).is($(obj).find('.gallery-board-image'))) {
4123                    $('#gallery_board_image_modal').data('index', i);
4124                }
4125            });
4126
4127            var allowDownload = $(obj).parents('.galleryBox').first().attr('data-allow-download');
4128            var downloadClip = $('#gallery_board_image_modal .gallery-board-modal-download');
4129            if (allowDownload == 'false') {
4130                downloadClip.hide();
4131            }
4132            else {
4133                downloadClip[0].style.removeProperty('display');
4134            }
4135
4136            modal.style.display = "flex";
4137            $(modalImg).removeClass(function (index, className) {
4138                return (className.match (/(^|\s)size-x-\S+/g) || []).join(' ');
4139            });
4140        }
4141        else if (link == 'none') { // none이면 아무 행동도 하지않음
4142            return;
4143        }
4144        else { // gallery-board-box data에 link값이 존재하면 해당 link로 이동
4145            if (!isMobile && (link.indexOf('tel:') > -1 || link.indexOf('sms:') > -1)) {
4146                return; // tel, sms 링크는 모바일에서만
4147            }
4148            //if (link.indexOf('link:') > -1 || link.indexOf('sms:') > -1) { return; }
4149
4150            if (target == 'blank') {
4151                window.open(link);
4152            }
4153            else {
4154                if ($(obj).hasClass('scrollToTop') || $(obj).hasClass('scrollToBottom')) { }
4155                else {
4156                    location.href = link;
4157                }
4158            }
4159
4160            return false;
4161        }
4162    }
4163
4164
4165    function viewImageFullSize(obj) {
4166        $('body').addClass('modal-open');
4167        $('#gallery-board-img01').fadeOut(0, 'linear');
4168
4169        var modal = document.getElementById('gallery_board_image_modal');
4170        var modalImg = document.getElementById("gallery-board-img01");
4171
4172        $('.gallery-board-modal-right').hide();
4173        $('.gallery-board-modal-left').hide();
4174
4175        var bg = $(obj).find('.img-core').css('background-image');
4176        bg = bg.replace('url(', '').replace(')', '').replace(/\"/gi, "");
4177
4178        bg = bg.replace(/_800/g, '_1920');
4179        modalImg.src = bg;
4180        modalImg.onload = function() {
4181            $('#gallery-board-img01').fadeIn(120, 'linear');
4182        };
4183
4184        modal.style.display = "flex";
4185    }
4186
4187    function initGalleryBoardImageModal(img) {
4188        if ($('.gallery-board-modal-content').hasClass('size-original')) {
4189            $(img).css('top', 0);
4190            $(img).css('bottom', 'auto');
4191            $(img).css('left', 'auto');
4192
4193        }
4194
4195        if ((isMobile() && window.innerWidth / img.naturalWidth * img.naturalHeight > window.innerHeight) || // 모바일에서는 비율로 확인한다
4196            (!isMobile() && img.naturalHeight > window.innerHeight)) {
4197            $('.gallery-board-magnifier-original-size').show();
4198        }
4199        else {
4200            $('.gallery-board-magnifier-original-size').hide();
4201            $('.gallery-board-modal-content').removeClass('size-original');
4202            $(img).css('left', 'auto');
4203        }
4204    }
4205
4206    $('#gallery_board_image_modal').delegate(".gallery-board-modal-right", "click", function (e) {
4207        if (viewGalleryBoardImage != undefined) {
4208            $('#gallery-board-img01').fadeOut(150, 'linear', function() {
4209                var index = parseInt($('#gallery_board_image_modal').data('index')) + 1;
4210
4211                var modalImg = document.getElementById("gallery-board-img01");
4212                if (index == viewGalleryBoardImage.length) {
4213                    var val = $.grep(viewGalleryBoardImage, function(e) { return e.index == 0 })[0];
4214                    modalImg.src = val.bg;
4215                    modalImg.onload = function() {
4216                        $('#gallery-board-img01').fadeIn(120, 'linear');
4217                        initGalleryBoardImageModal(modalImg);
4218                    };
4219
4220                    $('#gallery_board_image_modal').data('index', 0);
4221                }
4222                else {
4223                    var val = $.grep(viewGalleryBoardImage, function(e) { return e.index == index })[0];
4224                    modalImg.src = val.bg;
4225                    modalImg.onload = function() {
4226                        $('#gallery-board-img01').fadeIn(120, 'linear');
4227                        initGalleryBoardImageModal(modalImg);
4228                    };
4229
4230                    $('#gallery_board_image_modal').data('index', index);
4231                }
4232            });
4233        }
4234    });
4235    $('#gallery_board_image_modal').delegate(".gallery-board-modal-left", "click", function (e) {
4236        if (viewGalleryBoardImage != undefined) {
4237            $('#gallery-board-img01').fadeOut(150, 'linear', function() {
4238                var index = parseInt($('#gallery_board_image_modal').data('index')) - 1;
4239
4240                var modalImg = document.getElementById("gallery-board-img01");
4241                if (index == -1) {
4242                    var val = $.grep(viewGalleryBoardImage, function (e) { return e.index == viewGalleryBoardImage.length - 1 })[0];
4243                    modalImg.src = val.bg;
4244                    modalImg.onload = function() {
4245                        $('#gallery-board-img01').fadeIn(120, 'linear');
4246                        initGalleryBoardImageModal(modalImg);
4247                    };
4248
4249                    $('#gallery_board_image_modal').data('index', viewGalleryBoardImage.length - 1);
4250                }
4251                else {
4252                    var val = $.grep(viewGalleryBoardImage, function (e) { return e.index == index})[0];
4253                    modalImg.src = val.bg;
4254                    modalImg.onload = function() {
4255                        $('#gallery-board-img01').fadeIn(120, 'linear');
4256                        initGalleryBoardImageModal(modalImg);
4257                    };
4258
4259                    $('#gallery_board_image_modal').data('index', index);
4260                }
4261            });
4262        }
4263    });
4264    $('#gallery_board_image_modal').delegate('.gallery-board-modal-overlay', 'dblclick', function() {
4265        var image = $(this).siblings('.gallery-board-modal-content');
4266        if (image.attr('class').indexOf('size-x-') > 0) {
4267            image.removeClass(function (index, className) {
4268                return (className.match (/(^|\s)size-x-\S+/g) || []).join(' ');
4269            });
4270        }
4271        else {
4272            image.addClass('size-x-2');
4273            image.css('right', 'auto');
4274            image.css('bottom', 'auto');
4275            image.data('size', 2);
4276        }
4277    });
4278    $('#gallery_board_image_modal').delegate('.gallery-board-modal-right, .gallery-board-modal-left', 'click', function () {
4279        var image = $(this).siblings('.gallery-board-modal-content');
4280        if (image.attr('class').indexOf('size-x-') > 0) {
4281            image.removeClass(function (index, className) {
4282                return (className.match (/(^|\s)size-x-\S+/g) || []).join(' ');
4283            });
4284        }
4285    });
4286
4287    $('#gallery_board_image_modal').delegate('.gallery-board-magnifier-add, .gallery-board-magnifier-remove', 'click touch', function() {
4288        var image = $('#gallery_board_image_modal').find('.gallery-board-modal-content');
4289        var prefix = 'size-x-';
4290        if (image.attr('class').indexOf('size-x-') > 0) {
4291            if ($(this).hasClass('gallery-board-magnifier-add')) {
4292                var size = parseInt(image.data('size')) + 1;
4293                if (size > 5) return;
4294                if (size == 2) {
4295                    image.css('top', 0);
4296                    image.css('right', 'auto');
4297                    image.css('bottom', 'auto');
4298                }
4299            }
4300            else if ($(this).hasClass('gallery-board-magnifier-remove')) {
4301                var size = parseInt(image.data('size')) - 1;
4302                if (size < 1) return;
4303                if (size == 1) {
4304                    image.css('top', 0);
4305                    image.css('right', 'auto');
4306                    image.css('bottom', 'auto');
4307                }
4308            }
4309            else { return; }
4310
4311            image.data('size', size);
4312            image.removeClass(function (index, className) {
4313                return (className.match (/(^|\s)size-x-\S+/g) || []).join(' ');
4314            });
4315            image.addClass(prefix + size);
4316        }
4317        else {
4318            if ($(this).hasClass('gallery-board-magnifier-remove')) { return; }
4319            image.addClass('size-x-2');
4320            image.css('top', 0);
4321            image.css('right', 'auto');
4322            image.css('bottom', 'auto');
4323            image.data('size', 2);
4324        }
4325    });
4326
4327    $('#gallery_board_image_modal').delegate('.gallery-board-magnifier-original-size', 'click touch', function() {
4328        var image = $('#gallery_board_image_modal').find('.gallery-board-modal-content');
4329        image.removeClass(function (index, className) {
4330            return (className.match (/(^|\s)size-x-\S+/g) || []).join(' ');
4331        });
4332
4333        if (image.hasClass('size-original')) {
4334            image.css('left', 'auto');
4335            image.removeClass('size-original');
4336        }
4337        else {
4338            image.css('top', 0);
4339            image.css('bottom', 'auto');
4340            image.css('left', 'calc(50% - ' + (document.getElementById('gallery-board-img01').naturalWidth / 2) +  'px)');
4341            image.addClass('size-original');
4342        }
4343    });
4344
4345    /* 2020.03.03 재헌
4346     * 갤러리 이미지 모달에서 이미지 다운로드가 가능하도록 버튼 추가
4347     */
4348    $('#gallery_board_image_modal').delegate('.gallery-board-modal-download', 'click touch', function() {
4349        var url = $('#gallery-board-img01').attr('src');
4350        var name = url.split('/').pop();
4351
4352        if (!url || !name) return;
4353        if (navigator.userAgent.toLowerCase().indexOf('safari') > -1 &&
4354            navigator.userAgent.toLowerCase().indexOf('chrome') == -1) {
4355            var a = $("<a>").attr("href", url).attr("download", name).appendTo("body");
4356            a[0].click();
4357            a.remove();
4358        }
4359        else {
4360            post_redirect('/module/board/download.php', {'url': url, 'name': name}, '_top');
4361        }
4362    });
4363
4364    $(function() {
4365        var curDown = false,
4366            curYPos = 0,
4367            curXPos = 0,
4368            curTop = 0,
4369            curBottom = 0,
4370            curRight = 0;
4371        $('.gallery-board-modal-overlay').on('mousemove touchmove', function(e){
4372            e.preventDefault();
4373            if(curDown === true){
4374                var moveYPos = e.originalEvent.touches ?  e.originalEvent.touches[0].pageY : e.pageY;
4375                var moveXPos= e.originalEvent.touches ?  e.originalEvent.touches[0].pageX : e.pageX;
4376                // bottom 기준
4377                // $('#gallery-board-img01').css('top', 'auto');
4378                // $('#gallery-board-img01').css('bottom',(curBottom + ((curYPos - moveYPos))));
4379
4380                // top 기준
4381                $('#gallery-board-img01').css('top', (curTop + (moveYPos - curYPos)));
4382                $('#gallery-board-img01').css('bottom', 'auto');
4383
4384                // $('#gallery-board-img01').css('right',(curRight + ((curXPos - moveXPos))));
4385            }
4386        });
4387
4388        $('.gallery-board-modal-overlay').on('mousedown touchstart', function(e){
4389            e.preventDefault();
4390            curDown = true;
4391            curYPos = e.originalEvent.touches ?  e.originalEvent.touches[0].pageY : e.pageY;
4392            curXPos = e.originalEvent.touches ?  e.originalEvent.touches[0].pageX : e.pageX;
4393            curTop = parseInt($('#gallery-board-img01').css('top'));
4394            curBottom = parseInt($('#gallery-board-img01').css('bottom'));
4395            curRight = parseInt($('#gallery-board-img01').css('right'));
4396        });
4397
4398        $('.gallery-board-modal-overlay').on('mouseup touchend', function(){
4399            curDown = false;
4400        });
4401
4402        $('.gallery-board-modal-overlay').on('mousewheel', function(e) {
4403            e.preventDefault();
4404            if ($('#gallery_board_image_modal').css('display') != 'none') {
4405                // bottom 기준
4406                // if ($('#gallery-board-img01').css('bottom') == 'auto') {
4407                //     curBottom = (document.getElementById('gallery-board-img01').naturalHeight - window.innerHeight) * -1;
4408                // }
4409                // else {
4410                //     curBottom = parseInt($('#gallery-board-img01').css('bottom'));
4411                // }
4412                //
4413                // var moveYPos = (curBottom + (e.originalEvent.wheelDelta * -1));
4414                // var realHeight =  $("#gallery-board-img01")[0].getBoundingClientRect().height; // scale 조정 후의 높이값을 가져옴
4415                // var topLimit = parseInt(realHeight * -1) + parseInt(window.innerHeight);
4416                // if (moveYPos > 0) { moveYPos = 0; }
4417                // if (moveYPos < topLimit) { moveYPos = topLimit }
4418                //
4419                // $('#gallery-board-img01').css('top', 'auto');
4420                // $('#gallery-board-img01').css('bottom', moveYPos + 'px');
4421
4422                // top 기준
4423                var currentTop = $('#gallery-board-img01').css('top');
4424                currentTop = currentTop == 'auto' ? 0 : parseInt(currentTop);
4425
4426                var moveYPos = currentTop + e.originalEvent.wheelDelta;
4427                var realHeight =  $("#gallery-board-img01")[0].getBoundingClientRect().height; // scale 조정 후의 높이값을 가져옴
4428                var topLimit = parseInt(realHeight * -1) + parseInt(window.innerHeight);
4429                if (moveYPos > 0) { moveYPos = 0; }
4430                if (moveYPos < topLimit) { moveYPos = topLimit; }
4431
4432                $('#gallery-board-img01').css('top', moveYPos + 'px');
4433                $('#gallery-board-img01').css('bottom', 'auto');
4434            }
4435        });
4436    });
4437
4438
4439    function headerSubMenuPop() {
4440        $('#main_container').delegate('.header .mn-item, .header .mn-item-overflow-list', 'mouseenter', function () {
4441            if ($(this).parents('.header-side-nav').length > 0) return;
4442
4443            var main_header = $(this).parents('.header-contents').first().parent();
4444            var main_menu = $(this).parents('ul.mn-ul').first();
4445            /* 2020.02.12 재헌
4446             * 헤더 서브메뉴 가로로 정렬 ( sub-mn-horizontal )
4447             * sub-mn-type-2 일 때 sub-mn 각각의 top을 지정해준다.
4448             */
4449            // if (main_header.hasClass('sub-mn-type-2') && main_header.hasClass('sub-mn-align-horizontal')) {
4450            //     var all_height = 0;
4451            //     $.each(main_header.find('.sub-mn, .header-overflow-pop > ul'), function(i, val) {
4452            //         var target = $(this);
4453            //         var parentMenu = $(this).parent();
4454            //         if (parentMenu.hasClass('mn-item-overflow')) return;
4455            //
4456            //         var is_overflow_list = $(this).parents('.mn-item-overflow-list').length > 0 ? true : false;
4457            //         if (is_overflow_list) {
4458            //             target = $(this).parents('.header-overflow-pop').first();
4459            //             parentMenu = $(this).parents('li.mn-item');
4460            //         }
4461            //
4462            //         parentMenu.addClass('mn-item-hover');
4463            //
4464            //         var top = parentMenu.height() + all_height - $(window).scrollTop();
4465            //         if (!is_InternetExplorer()) {
4466            //             top += parentMenu.offset().top;
4467            //         }
4468            //
4469            //         target.css('top', top);
4470            //         all_height += target.height();
4471            //     });
4472            //
4473            //     var max_height = 0;
4474            //     $.each(main_header.find('ul'), function() {
4475            //         max_height = max_height > $(this).height() ? max_height : $(this).height();
4476            //     });
4477            // }
4478            // else
4479            if (main_header.hasClass('sub-mn-type-2')) {
4480                $.each(main_menu.find('.mn-item'), function() {
4481                    $(this).addClass('mn-item-hover');
4482
4483                    //var top = this.offsetTop + $(this).height() - $(window).scrollTop();
4484
4485                    // 2019.04.29 원본
4486                    //var top = $(this).offset().top + $(this).height() - $(window).scrollTop();
4487                    // 수정본. ie에서 header가 2단이상이면 위치가 정상적으로 잡히지 않는 문제때문에 추가
4488                    var top = $(this).height() - $(window).scrollTop();
4489                    if (!is_InternetExplorer()) { top += $(this).offset().top; }
4490                    else if (is_InternetExplorer() && main_header.hasClass('sub-mn-align-horizontal')) { top += $(this).offset().top; }
4491
4492                    $(this).find('.sub-mn').css('top', top);
4493                    $(this).find('.sub-mn > .mn-item').css('width', $(this).width());
4494                    $(this).find('.header-overflow-pop').css('top', top);
4495                    $(this).find('.header-overflow-pop').width($(this).width());
4496                });
4497
4498                var max_height = 0;
4499                $.each(main_header.find('ul.sub-mn'), function() {
4500                    max_height = max_height > $(this).height() ? max_height : $(this).height();
4501                });
4502
4503                // header overflow pop이 존재하면 해당 항목의 높이와 비교
4504                if ($('.header-overflow-pop').length > 0) {
4505                    var overflow_pop_height = $('.header-overflow-pop').height();
4506                    max_height = max_height > overflow_pop_height ? max_height : overflow_pop_height;
4507                }
4508
4509                if (max_height > 0) {
4510                    var overlay = '<div class="sub-mn-overlay" style="height:' + parseInt(max_height) + 'px;"></div>';
4511                    main_header.find('.sub-mn-overlay').remove();
4512                    main_menu.find('ul.sub-mn, .header-overflow-pop > ul').first().prepend(overlay);
4513                }
4514            }
4515            // else if (main_header.hasClass('sub-mn-type-1')) {
4516            else {
4517                $(this).find('.sub-mn-overlay').remove();
4518                $(this).addClass('mn-item-hover');
4519
4520                // 2019.04.29 원본
4521                //var top = $(this).offset().top + $(this).height() - $(window).scrollTop();
4522                var top = $(this).height() - $(window).scrollTop();
4523                if (!is_InternetExplorer()) { top += $(this).offset().top; }
4524                else if (is_InternetExplorer() && main_header.hasClass('sub-mn-align-horizontal')) { top += $(this).offset().top; }
4525
4526                if ($(this).hasClass('mn-item-overflow-list')) {
4527                    $(this).find('.header-overflow-pop').css('top', top);
4528                    $(this).find('.header-overflow-pop').width('auto');
4529                }
4530                else if ($(this).hasClass('mn-item')) {
4531                    $(this).find('.sub-mn').css('top', top);
4532                }
4533            }
4534        });
4535
4536        //$('#main_container').delegate('.header .mn-item, .header .mn-item-overflow-list', 'mouseleave', function () {
4537        $('#main_container').delegate('.header .mn-item', 'mouseleave', function (e) {
4538            var main_header = $(this).parents('.header-contents').first().parent();
4539            if (main_header.hasClass('sub-mn-type-2')) {
4540                main_header.find('.mn-item').removeClass('mn-item-hover');
4541                main_header.children('.header-op').css('height', 'auto');
4542                main_header.find('.sub-mn-overlay').remove();
4543            }
4544            // else if (main_header.hasClass('sub-mn-type-1')) {
4545            else {
4546                $(this).removeClass('mn-item-hover');
4547                $(this).removeClass('mn-item-overflow-list-hover');
4548            }
4549        });
4550
4551        $(window).on('scroll.headerSubMenuPop', function() {
4552            /* 2020.02.12 재헌
4553             * 헤더 서브메뉴 가로로 정렬 ( sub-mn-horizontal )
4554             * sub-mn-type-2 일 때 sub-mn 각각의 top을 지정해준다.
4555             */
4556            // var main_header = $('.header .mn-item-hover').parents('.header-contents').parent();
4557            // if (main_header.hasClass('sub-mn-type-2') && main_header.hasClass('sub-mn-align-horizontal')) {
4558            //     var all_height = 0;
4559            //     $.each(main_header.find('.sub-mn'), function(i, val) {
4560            //         var parentMenu = $(this).parents('.mn-item').first();
4561            //         parentMenu.addClass('mn-item-hover');
4562            //
4563            //         var top = parentMenu.height() + all_height - $(window).scrollTop();
4564            //         if (!is_InternetExplorer()) { top += parentMenu.offset().top; }
4565            //
4566            //         $(this).css('top', top);
4567            //         all_height += $(this).height();
4568            //     });
4569            // }
4570            // else
4571            if ($('.header .mn-item-hover').length > 0) {
4572                // 원본
4573                //var top = $('.header .mn-item-hover').offset().top + $('.header .mn-item-hover').height() - $(window).scrollTop();
4574                // 수정본. ie에서 header가 2단이상이면 위치가 정상적으로 잡히지 않는 문제때문에 추가
4575                var top = $('.header .mn-item-hover').height() - $(window).scrollTop();
4576                if (!is_InternetExplorer()) { top += $('.header .mn-item-hover').offset().top; }
4577                //
4578                $('.header .mn-item-hover').find('.sub-mn').css('top', top);
4579            }
4580
4581            if ($('.header .mn-item-overflow-list').length > 0) {
4582                // 원본
4583                //var top = $('.header .mn-item-overflow-list').offset().top + $('.header .mn-item-overflow-list').height() - $(window).scrollTop();
4584                var top = $('.header .mn-item-overflow-list').height() - $(window).scrollTop();
4585                if (!is_InternetExplorer()) { top += $('.header .mn-item-overflow-list').offset().top; }
4586                //
4587                $('.header .mn-item-overflow-list').find('.header-overflow-pop').css('top', top);
4588            }
4589        });
4590
4591    }
4592    headerSubMenuPop();
4593
4594    function isMobile() {
4595        return /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
4596    }
4597
4598    // string format
4599    if (!String.prototype.format) {
4600        String.prototype.format = function() {
4601            var args = arguments;
4602            return this.replace(/{(\d+)}/g, function(match, number) {
4603                return typeof args[number] != 'undefined'
4604                    ? args[number]
4605                    : match
4606                    ;
4607            });
4608        };
4609    }
4610
4611    /* 데이터 컨텐츠 페이지 */
4612    </script>
4612
4613
4614<!-- Log -->
4615<script language="javascript" type="text/javascript">
4616    if(typeof qva != "undefined") {
4617        qva.DataSet('account', 'm03d56npb');
4618        qva.start();
4619    }
4620
4621    function custom_trigger_call(type,id){
4622            }
4623</script>
4623
4624
4625
4626
4627
4628<script>
4629    $(document).ready(function() {
4630        if (!$('body').hasClass('body-fade')) {
4631            $('body').show();
4632        }
4633    });
4634
4635    $(window).bind("load",function(){
4636                    initMapListBox();
4637            initMapBox();
4638            
4639        if ($('body').hasClass('body-fade')) {
4640            $('body').fadeIn(300, 'linear');
4641        }
4642
4643        initAnchor(document.location.pathname + document.location.search);
4644
4645
4646        if (!is_InternetExplorer()) {
4647            initAnimation();
4648        }
4649
4650        setTimeout(function() { initHeaderOverflowMenuResizeEvent(); }, 500);
4651
4652        // 템플릿에서 버튼 클릭되지 않도록 -> iframe 내부에서 호출되면 form, board 작성 불가, 주소 tpl 포함인 페이지에만 적용
4653        if (self !== top) {
4654            // in iframe (template)
4655            if (location.host.indexOf('tpl') == 0) {
4656                $('.form-contents-button, .board-write').css('pointer-events', 'none');
4657            }
4658            // in iframe (others)
4659            else { }
4660        }
4661
4662        
4663        // initMaintainRatioImage();
4664        initMaintainRatioSlider();
4665        initBackgroundFullSizeVideo();
4666
4667        if ($(window).width() < 767) {
4668            initImageBoxAutoResize();
4669        }
4670    });
4671
4672    // 2022.01.21 주석처리
4673    // 항상 원본비율 유지 옵션 추가로 인해 필요성 x
4674    function initMaintainRatioImage() {
4675        if (isMobile() && $(window).width() < 767) return;
4676        var notAllowed = [
4677            '.mobile_ele',
4678            '.boxing',
4679            '.col-sm-1',
4680            '.col-sm-2',
4681            '.col-sm-3',
4682            '.col-sm-4',
4683            '.col-sm-5',
4684            '.col-sm-6',
4685            '.col-sm-7',
4686            '.col-sm-8',
4687            '.col-sm-9',
4688            '.col-sm-10',
4689            '.col-sm-11',
4690        ];
4691
4692        $.each($('#main_container .body .imgBox'), function() {
4693            if ($(this).parents(notAllowed.join(',')).length > 0) return;
4694            var imgcore = $(this).find('.img-core');
4695            var backgroundSize = imgcore.css('background-size');
4696            var backgroundPosition = imgcore.css('background-position');
4697
4698            if (backgroundSize == 'contain' && backgroundPosition == '50% 50%') {
4699                var url = $(this).find('.img-core').css('background-image').replace('url(', '').replace(')', '').replace(/\"/gi, "");
4700                // var height = $(this).attr('data-hei').replace(/px/g, '');
4701                var height = $(this).find('.img-core').height();
4702                $(this).height('auto');
4703                imgcore.hide();
4704                // max-height 지정에서 height 지정으로 변경됨
4705                // 이미지를 확대해서 저장했을 때 에디터화면과 다른 문제 (라이브에서는 원본크기 이상으로 늘어나지 않음)
4706                imgcore.after('<img class="img-core-dummy" src="' + url + '" style="max-width: 100%; max-height: ' + height + 'px;">')
4707            }
4708        });
4709    }
4710
4711    function resizeMaintainRatioImage() {
4712        if (isMobile()) return;
4713        // var interval = setInterval(function() {
4714        //     if ($('#main_container').width() == 0) { return; }
4715        //     else {
4716        //         clearInterval(interval);
4717        //     }
4718        // }, 100);
4719
4720        $.each($('#main_container .imgBox'), function() {
4721            var imgbox = $(this);
4722            var imgcore = $(this).find('.img-core');
4723            var ratio = imgcore.attr('data-ratio');
4724            var w = $(this).width();
4725            var w_data = $(this).attr('data-width');
4726            var background_size = imgcore.css('background-size');
4727
4728            if (!$(this).hasClass('displayed')
4729                || (background_size != 'contain')
4730                || (w == w_data)
4731                || (!ratio)) {
4732                console.log(this.id, 'returned');
4733                return;
4734            }
4735
4736            ratio = parseFloat(ratio);
4737            var ratio_box = imgcore.height() / imgcore.width();
4738            if (ratio_box > ratio) {
4739                imgcore.height(imgcore.width() * parseFloat(ratio));
4740                imgbox.height('auto');
4741                console.log('1', ratio_box, ratio);
4742            }
4743            else {
4744                imgcore.height(imgbox.attr('data-hei'));
4745                console.log('2', ratio_box, ratio);
4746            }
4747
4748            // $(this).attr('data-width', w);
4749            // $(this).height('auto');
4750            // imgcore.height(imgcore.width() * parseFloat(ratio));
4751        });
4752    }
4753
4754    function resizeMaintainRatioSlider() {
4755        /* 2020.03.18 재헌
4756         * IE, FF 에서 해당함수 호출 시 렌더링이 완료되지 않은 상태면 ratio 값을 잘못 측정하는 문제
4757         * 렌더링 완료 기준은 main_container의 width 값이 0인지 아닌지로 확인
4758         * 렌더링이 완료되지 않은 상태에서 호출되었다면 100ms 간격을 두고 함수 재호출
4759         */
4760        var w = $('#main_container').width();
4761        if (w == 0) {
4762            setTimeout(function() {
4763                resizeMaintainRatioSlider();
4764            }, 100);
4765            return;
4766        }
4767
4768        $.each($('#main_container .slider-frm.maintain-ratio .frm, #main_container .slider-frm.maintain-ratio .box'), function() {
4769            var screenWidth = window.screen.width;
4770            // col-sm 비율까지 고려하려면 아래 코드 사용, 일단 main_container 하위 슬라이드만 적용할 것이라 사용하지 않음
4771            //var sliderFrame = $(this).parents('.slider-frm').first();
4772            // var column = sliderFrame.parent()[0].className.split(' ').filter(v => v.indexOf('col-sm') > -1);
4773            // if (column.length > 0) { // [col-sm-4..]
4774            //     var column_num = column[0].replace(/col-sm-/g, '');
4775            //     var column_ratio = 12 / column_num;
4776            //     screenWidth = screenWidth / column_ratio;
4777            // }
4778
4779            var ratio = $(this).parents('.slider-frm').first().width() / screenWidth;
4780            // 상위에 프레임이 하나 더 있는 경우 width가 0으로 잡힌다
4781            ratio = ratio != 0 ? ratio : $(this).parents('.slider-frm').parent().width() / screenWidth;
4782
4783            if(ratio > 0.1) { //IE11,FF load()전 width()값 못가져오는 case 예외처리
4784                var origin_height = parseInt($(this).data('origin-height'));
4785                var height = Math.floor(origin_height * ratio);
4786
4787                if ($(this).hasClass('frm')) {
4788                    if ($(this).parent().hasClass('item')) {
4789                        if (window.innerWidth <= 767) {
4790                            ratio = 1;
4791                            height = $(this).data('origin-height');
4792                            $(this).children('.view').css('transform-origin', '50% 50%');
4793                            $(this).css('background-position-y', '50%'); // frame 백그라운드 이미지 원복
4794                        }
4795                        $(this).parents('.carousel-inner').height(height);
4796                        $(this).children('.view').children('.tb').height(height);
4797                        $(this).children('.view').css('transform', 'scale(' + ratio + ')');
4798
4799                        // column이 여러개인 경우 item의 높이가 column의 수 만큼 크게나와서 아래와 같이 보정
4800                        var itemHeight = $(this).parent('.item').height();
4801                        if (!$(this).parent('.item').hasClass('active')) {
4802                            itemHeight = itemHeight / $(this).children('.view').children('.tb').children('.row').children('.column').length;
4803                        }
4804                        //
4805                        if (itemHeight >= height) {
4806                            var diff = parseFloat(itemHeight - height);
4807                            var rate = itemHeight / 2;
4808                            var column_height = 0;
4809                            $.each($(this).children('.view').children('.tb').children('.row').children('.column'), function () {
4810                                var total = 0;
4811                                $.each($(this).children('.frm, .box'), function () {
4812                                    total += parseInt($(this).data('origin-height'));
4813                                });
4814                                column_height = column_height < total ? total : column_height;
4815                            });
4816                            column_height = column_height * ratio;
4817                            column_height = height - column_height;
4818                            rate = rate - column_height;
4819
4820                            // most 3
4821                            // var diff = parseFloat(itemHeight - height);
4822                            // var column_height = 0;
4823                            // $.each($(this).children('.view').children('.tb').children('.row').children('.column'), function() {
4824                            //     var total = 0;
4825                            //     $.each($(this).children('.frm, .box'), function() {
4826                            //         total += parseInt($(this).data('origin-height'));
4827                            //     });
4828                            //     column_height = column_height < total ? total : column_height;
4829                            // });
4830                            // var rate = (itemHeight + height - (column_height * ratio * 2)) / 2;
4831
4832                            // most 2
4833                            // var diff = parseFloat(itemHeight - height);
4834                            // var rate = diff + diff * Math.sqrt((ratio - 0.5));
4835
4836                            // most 1
4837                            // var diff = itemHeight - height;
4838                            // var rate = diff * (1 + Math.pow(ratio, 2) + (ratizo - 0.5));
4839
4840                            if (window.innerWidth > 767) {
4841                                $(this).children('.view').css('transform-origin', '50% calc(50% - ' + Math.ceil(rate) + 'px)');
4842                                $(this).css('background-position-y', 'calc(50% - ' + parseFloat(diff / 2) + 'px)'); // frame 백그라운드 이미지 보정
4843                            }
4844                        }
4845                    }
4846                }
4847                else {
4848                    // $(this).height(height);
4849
4850                    // if ($(this).hasClass('imgBox')) {
4851                    //     $(this).find('.img-core').height(height);
4852                    // }
4853                }
4854            }
4855        });
4856    }
4857
4858
4859
4860    function initMaintainRatioSlider() {
4861        if ($('#main_container .slider-frm.maintain-ratio').length > 0) {
4862            // ratio slider는 displayed 클래스를 붙여준다.
4863            $.each($('#main_container .slider-frm.maintain-ratio'), function() {
4864                var target = $(this).parents('.frm');
4865                $.merge(target, [$(this)]);
4866                $.merge(target, $(this).find('.frm, .box'));
4867                $.each(target, function() {
4868                    $(this).addClass('displayed');
4869                });
4870            });
4871
4872            // $.each($('#main_container .slider-frm.maintain-ratio .carousel-inner'), function() {
4873            //     $(this).css('height', 'auto');
4874            // });
4875            $.each($('#main_container .slider-frm.maintain-ratio .item > .frm > .view > .tb > .row > .column'), function() {
4876                $(this).css('height', 'auto');
4877                // $(this).css('min-height', 'auto');
4878            });
4879            $.each($('#main_container .slider-frm.maintain-ratio .column'), function() {
4880                $(this).css('min-height', 'auto');
4881            });
4882            $.each($('#main_container .slider-frm.maintain-ratio .frm, #main_container .slider-frm.maintain-ratio .box'), function() {
4883                var h = $(this).hasClass('frm') ? $(this).children('.view').children('.tb').height() : $(this).height();
4884                h = $(this).parent().hasClass('item') ? $(this).parents('.carousel-inner').height() : h;
4885                $(this).data('origin-height', h);
4886            });
4887
4888            // 브라우저가 resize 될 때 마다 slider 크기를 조절한다
4889            $(window).resize(function(){
4890                resizeMaintainRatioSlider();
4891            });
4892
4893            resizeMaintainRatioSlider();
4894        }
4895    }
4896
4897    /* 2020.02.27 재헌
4898     * fixed - relative 기반
4899     */
4900    function initAffixedFrame() {
4901        var affixedFrame = $('.body .frm[data-fixed="true"]');
4902        if (affixedFrame.length == 0) return;
4903
4904        //data-fixed가 존재하는 frame에 z-index 할당
4905        //var zIndex = $('.body > .frm .frm[data-fixed="true"]').length + 10;
4906        var zIndex = $('.body .frm').length + 10;
4907        $.each($('.body .frm'), function() {
4908            $(this).css('z-index', zIndex--);
4909        });
4910
4911        // 고정 컨텐츠의 초기값 지정 및 affixed 클래스 부여, 더미 생성
4912        $.each(affixedFrame, function() {
4913            // displayed 되지 않은 항목은 width, offsetTop 값을 가져오지 못하기 때문에
4914            // 자신과 부모 프레임에 displayed 클래스를 추가한다
4915            $.each($(this).parents('.frm').andSelf(), function() {
4916                $(this).addClass('displayed');
4917            });
4918
4919            var offsetTop = $(this).offsetTop();
4920            var maxHeight = $('.header.useFixed').length > 0 ? 'calc(100vh - ' + offsetTop + 'px)' : '100vh';
4921
4922            // $(this).css('width', $(this).width() + 'px');
4923            $(this).css('max-height', maxHeight);
4924            if (!$(this).is('.qv-ani, .qv-ani-ele')) {
4925                $(this).attr('data-origin-offset-top', offsetTop);
4926            }
4927            $(this).addClass('affixed');
4928
4929            var height = $(this).height() +
4930                parseInt($(this).css('margin-top')) +
4931                parseInt($(this).css('margin-bottom')) +
4932                parseInt($(this).css('padding-top')) +
4933                parseInt($(this).css('padding-bottom'));
4934            $(this).after('<div class="affixed-dummy" id="dummy-' + this.id + '" style="height:' + height + 'px;"></div>');
4935
4936            // $(this).parents('.frm').last().css('z-index', zIndex--);
4937            // $.each($('#fGYLWT').parents('.frm').andSelf(), function() {
4938            //    $(this).css('z-index', 15);
4939            // });
4940        });
4941
4942        var scrollTarget = is_InternetExplorer() ? $('body') : $(document);
4943        scrollTarget.on('scroll', function() {
4944            var currentScrollTop = $(this).scrollTop();
4945            var topWithWindowHeight = $(this).scrollTop() + $(window).height();
4946            console.log(currentScrollTop);
4947            // 모바일 호환
4948            var header = (isMobile() && $('.header-mobile').length > 0) ? $('.header-mobile') : $('.header:not(.useFixed)');
4949            var footer = (isMobile() && $('.footer-frame-mobile').length > 0) ? $('.footer-frame-mobile') : $('.footer-frame');
4950
4951            $.each(affixedFrame, function() {
4952                /* 2020.02.28 재헌
4953                 * data-origin-offset-top 값이 없거나(qv-ani, qv-ani-ele), currentScrollTop이 0이면 재할당하여 수시로 값을 보정한다
4954                 */
4955                if (!$(this).attr('data-origin-offset-top') || currentScrollTop == 0) {
4956                    var offsetTop = $(this).offsetTop() - currentScrollTop;
4957                    $(this).attr('data-origin-offset-top', offsetTop);
4958                }
4959
4960                // 최상위 프레임
4961                if ($(this).parent().is('.body')) {
4962                    if (header.length > 0 && header.height() > currentScrollTop) {
4963                        if (!$(this).is('.affixed-top')) {
4964                            $(this).removeClass (function (index, className) {
4965                                return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
4966                            });
4967                            $(this).addClass('affixed-top');
4968                            $('.affixed-dummy#dummy-' + this.id).hide();
4969
4970                            console.log('scroll - header');
4971                        }
4972                    }
4973                    // 스크롤 중 footer에 도달했을 때 (relative)
4974                    else if (footer.length > 0 && footer.offsetTop() < topWithWindowHeight) {
4975                        if (!$(this).is('.affixed-bottom')) {
4976                            var relativePosition = $(window).height();
4977                            var offsetTop = footer.offsetTop() - relativePosition;
4978                            offsetTop = header.length > 0 ? offsetTop - header.height() : offsetTop;
4979                            $(this).css('top', offsetTop + 'px');
4980                            $(this).removeClass (function (index, className) {
4981                                return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
4982                            });
4983                            $(this).addClass('affixed-bottom');
4984                            $('.affixed-dummy#dummy-' + this.id).hide();
4985
4986                            console.log('scroll - footer');
4987                        }
4988                    }
4989                    // header, footer와 접하지 않을 때 (fixed)
4990                    else {
4991                        var offsetTop = $(this).attr('data-origin-offset-top');
4992                        offsetTop = header.length > 0 ? offsetTop - header.height() : offsetTop;
4993                        // offsetTop = offsetTop < 0 ? 0 : offsetTop;
4994                        $(this).css('top', offsetTop + 'px');
4995                        $(this).css('width', $(this).width() + 'px');
4996                        $(this).removeClass(function (index, className) {
4997                            return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
4998                        });
4999                        $(this).addClass('affixed');
5000                        $('.affixed-dummy#dummy-' + this.id).show();
5001
5002                        console.log('scroll - main');
5003                    }
5004                }
5005                // 하위 프레임
5006                else {
5007                    var parentFrame = $(this).parents('.frm').last();
5008
5009                    // 스크롤 중 부모프레임 최상부에 도달했을 때
5010                    var _offsetTop = parseInt($(this).attr('data-origin-offset-top'));
5011                    if (_offsetTop > currentScrollTop) {
5012                        if (!$(this).is('.affixed-top')) {
5013                            $(this).removeClass (function (index, className) {
5014                                return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
5015                            });
5016                            $(this).addClass('affixed-top');
5017                            $('.affixed-dummy#dummy-' + this.id).hide();
5018                        }
5019
5020                        // offset top 갱신 (chrome, ie 에서 offsetTop 값이 다르게나오는 문제)
5021                        var offsetTop = $(this).offsetTop();
5022                        if (_offsetTop != offsetTop) {
5023                            $(this).attr('data-origin-offset-top', offsetTop);
5024                        }
5025                    }
5026                    // 스크롤 중 부모프레임 최하부에 도달했을 때
5027                    else if (parentFrame.offsetTop() + parentFrame.height() < topWithWindowHeight) {
5028                        if (!$(this).is('.affixed-bottom') && !$(this).is('.affixed-top')) { // affixed-top 에서 바로 affixed-bottom 되는 케이스 없도록 함
5029                            var offsetTop = parentFrame.offsetTop() + parentFrame.height() - $(window).height() - parseInt($(this).attr('data-origin-offset-top'));
5030                            $(this).css('top', offsetTop + 'px');
5031                            $(this).removeClass (function (index, className) {
5032                                return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
5033                            });
5034                            $(this).addClass('affixed-bottom');
5035                            $('.affixed-dummy#dummy-' + this.id).hide();
5036                        }
5037                    }
5038                    // 부모프레임 최상부,최하부에 접하지 않을 때
5039                    else {
5040                        if (!$(this).is('.affixed')) {
5041                            $(this).css('top', '0px');
5042                            $(this).css('width', $(this).width() + 'px');
5043                            $(this).removeClass(function (index, className) {
5044                                return (className.match(/(^|\s)affix\S+/g) || []).join(' ');
5045                            });
5046                            $(this).addClass('affixed');
5047                            $('.affixed-dummy#dummy-' + this.id).show();
5048                        }
5049                    }
5050                }
5051            });
5052        });
5053        window.scrollTo(window.scrollX, window.scrollY - 1);
5054    }
5055
5056    function initContentsLazyLoad() {
5057        if (is_InternetExplorer() || $.browser.mozilla) {
5058            $('.body').removeClass('pl-h').addClass('pl-n');
5059            initMapListBox();
5060            initMapBox();
5061            return;
5062        }
5063
5064        var correctionValue = isMobile() ? 500 : 300;
5065        var contents = $('#main_container .body > .frm');
5066        var scrollTarget = is_InternetExplorer() ? $('body') : $(document);
5067
5068        if (contents.length == 0) return;
5069        else {
5070            $.each(contents, function () {
5071                var offsetTop = $(this).offsetTop();
5072                var currentScrollTop = scrollTarget.scrollTop();
5073                if (offsetTop < $(window).height() + correctionValue + currentScrollTop) {
5074                    $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5075
5076                    if ($(this).find('.mapListBox').length > 0) {
5077                        $.each($(this).find('.mapListBox'), function() { initMapListBox($(this)); });
5078                    }
5079                    if ($(this).find('.mapBox').length > 0) {
5080                        $.each($(this).find('.mapBox'), function() { initMapBox($(this)); });
5081                    }
5082                }
5083            });
5084        }
5085
5086        var lastScrollTop = 0;
5087        scrollTarget.on('scroll', function() {
5088            var currentScrollTop = window.scrollY;
5089            // var currentScrollTop = $(this).scrollTop();
5090//            var screenHeight = $(window).height();
5091            var screenHeight = window.innerHeight;
5092            var t = currentScrollTop;
5093            var b = currentScrollTop + screenHeight + correctionValue;
5094
5095            if (currentScrollTop > lastScrollTop){ // scroll down
5096                $.each($('#main_container .body > .frm'), function() {
5097                    var height = $(this).height() + parseInt($(this).css('padding-top'))  + parseInt($(this).css('padding-bottom'));
5098                    var offsetTop = $(this).offsetTop();
5099
5100                    if (offsetTop + height < t) { }
5101                    else if (offsetTop < b) {
5102                        $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5103
5104                        if ($(this).find('.mapListBox').length > 0) {
5105                            $.each($(this).find('.mapListBox'), function() { initMapListBox($(this)); });
5106                        }
5107                        if ($(this).find('.mapBox').length > 0) {
5108                            $.each($(this).find('.mapBox'), function() { initMapBox($(this)); });
5109                        }
5110                    }
5111                });
5112            } else { // scroll up
5113                $.each($('#main_container .body > .frm'), function() {
5114                    var height = $(this).height() + parseInt($(this).css('padding-top'))  + parseInt($(this).css('padding-bottom'));
5115                    var offsetTop = $(this).offsetTop();
5116
5117                    if (offsetTop > b) { }
5118                    else if (offsetTop + height > t) {
5119                        $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5120
5121                        if ($(this).find('.mapListBox').length > 0) {
5122                            $.each($(this).find('.mapListBox'), function() { initMapListBox($(this)); });
5123                        }
5124                        if ($(this).find('.mapBox').length > 0) {
5125                            $.each($(this).find('.mapBox'), function() { initMapBox($(this)); });
5126                        }
5127                    }
5128                });
5129            }
5130
5131            lastScrollTop = currentScrollTop;
5132        });
5133    }
5134
5135    /* 2020.02.21 재헌
5136     * an-once 추가
5137     * 해당 클래스가 있으면 애니메이션이 단 한번만 실행된다.
5138     * (기존엔 스크롤했다가 다시 올라오면 애니메이션이 다시 실행 됨)
5139     */
5140    function initAnimation() {
5141        var scrollTarget = is_InternetExplorer() ? $('body') : $(document);
5142        var ani = $('#main_container .qv-ani-ele, #main_container .qv-ani');
5143        if (ani.length == 0) return;
5144        else {
5145            $.each(ani, function () {
5146                var offsetTop = $(this).offsetTop();
5147                var offsetBottom = offsetTop + $(this).height();
5148                var currentScrollTop = getScrollY();
5149                var currentScrollBottom = currentScrollTop + $(window).height() ;
5150
5151                // 부등호 < 에서 <= 로 모두 변경
5152                if ((offsetTop <= currentScrollTop && currentScrollTop <= offsetBottom) ||
5153                    (offsetTop <= currentScrollBottom && currentScrollBottom <= offsetBottom) ||
5154                    (currentScrollTop <= offsetTop && offsetBottom <= currentScrollBottom) ||
5155                    (offsetTop <= currentScrollTop && currentScrollBottom <= offsetBottom)) {
5156                    return;
5157                }
5158                else if ($(this).hasClass('qv-ani-ele')) {
5159                    $(this).toggleClass('qv-ani-ele qv-ani');
5160                }
5161
5162//                if (offsetTop > $(window).height() &&
5163//                    $(this).hasClass('qv-ani-ele')) {
5164//                    $(this).toggleClass('qv-ani-ele qv-ani');
5165//                }
5166            });
5167        }
5168
5169        var lastScrollTop = 0;
5170        scrollTarget.on('scroll', function() {
5171            var currentScrollTop = getScrollY();
5172            // var currentScrollTop = $(this).scrollTop();
5173//            var screenHeight = $(window).height();
5174            var screenHeight = window.innerHeight;
5175            var t = currentScrollTop;
5176            var b = currentScrollTop + screenHeight;
5177
5178            if (currentScrollTop > lastScrollTop) { // scroll down
5179                $.each($('#main_container .qv-ani-ele, #main_container .qv-ani'), function() {
5180                    var height = $(this).height() + parseInt($(this).css('padding-top'))  + parseInt($(this).css('padding-bottom'));
5181                    var offsetTop = $(this).offsetTop();
5182
5183                    if (offsetTop + height < t) {
5184                        if ($(this).is('.qv-ani-ele.an-once')) {
5185                            $(this).removeClass('qv-ani').addClass('qv-ani-ele');
5186                        }
5187                        else if ($(this).hasClass('qv-ani-ele')) {
5188                            $(this).toggleClass('qv-ani-ele qv-ani');
5189                            //console.log(1);
5190                        }
5191                    }
5192                    else if (offsetTop < b) {
5193                        if ($(this).is('.qv-ani-ele.an-once')) {
5194                            $(this).removeClass('qv-ani').addClass('qv-ani-ele');
5195                        }
5196                        else if ($(this).hasClass('qv-ani')) {
5197                            $(this).toggleClass('qv-ani qv-ani-ele');
5198                            //console.log(2);
5199                        }
5200                    }
5201                });
5202            } else { // scroll up
5203                $.each($('#main_container .qv-ani-ele, #main_container .qv-ani'), function() {
5204                    var height = $(this).height() + parseInt($(this).css('padding-top'))  + parseInt($(this).css('padding-bottom'));
5205                    var offsetTop = $(this).offsetTop();
5206
5207                    if (offsetTop > b) {
5208                        if ($(this).is('.qv-ani-ele.an-once')) {
5209                            $(this).removeClass('qv-ani').addClass('qv-ani-ele');
5210                        }
5211                        else if ($(this).hasClass('qv-ani-ele')) {
5212                            $(this).toggleClass('qv-ani-ele qv-ani');
5213                            //console.log(3);
5214                        }
5215                    }
5216                    else if (offsetTop + height > t) {
5217                        if ($(this).is('.qv-ani-ele.an-once')) {
5218                            $(this).removeClass('qv-ani').addClass('qv-ani-ele');
5219                        }
5220                        else if ($(this).hasClass('qv-ani')) {
5221                            $(this).toggleClass('qv-ani qv-ani-ele');
5222                            //console.log(4);
5223                        }
5224                    }
5225                });
5226            }
5227
5228            lastScrollTop = currentScrollTop;
5229        });
5230    }
5231            $('.quv-made .logo, .quv-made .txt').on('click', function() {
5232            window.open('https://qshop.ai?utm_source=owned&utm_medium=display&utm_campaign=quv','_blank');
5233        });
5234        $('.quv-made .logo, .quv-made .btn-quv-start').on('click', function() {
5235            window.open('https://qshop.ai?utm_source=owned&utm_medium=display&utm_campaign=quv','_blank');
5236        });
5237        
5238    function moveArticle(href) {
5239        var page = href.slice(1, href.indexOf('?'));
5240        var query = qv_func.getUrlParams();
5241        var bid = query.bid;
5242        var aid = query.aid;
5243        var table = $('table[data-bid="' + bid + '"]');
5244
5245        if (table.length == 0) return;
5246        if (bid && aid && (QV_BASE_OBJ.spid == page || SITE_URL == page)) {
5247            // 앵커 동작 시 lazyload를 무시하고 displayed 클래스 부여
5248            $.each($('.body > .frm'), function() {
5249                $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5250            });
5251
5252            var type = 'default';
5253            var _pn = page;
5254            var pn = "&pn=" + _pn;
5255
5256            __BID = bid;
5257            __AID = aid;
5258            __PN = QV_BASE_OBJ.spid;
5259
5260            $('#' + bid).attr('data-type', 'default');
5261            checkAuth(bid, aid,
5262                function(obj) { initialize_currentLocation(bid, aid, obj, table); },
5263                function(obj) {
5264                    qvjax_direct(
5265                        "check_board_auth",
5266                        "/module/board/board.php",
5267                        'bid=' + bid + '&aid=' + aid + '&auth_action=read',
5268                        function (data) {
5269                            if (data) {
5270                                if ((obj.is_secret == 1 && obj.writer_account == null)
5271                                    || (obj.is_secret == 1 && $('tr#' + obj.parent).attr('data-type') == 'nm')) {
5272                                    $('.read-body').data('article', obj);
5273                                    $('#ReadPasswordCheckModal').modal('show');
5274                                    $('#ReadPasswordCheckModal').data('article', obj);
5275                                    $('#ReadPasswordCheckModal').data('type', 'check_password');
5276                                    $('#ReadPasswordCheckModal').data('aid', __AID);
5277                                    $('#ReadPasswordCheckModal').data('init-type', type);
5278                                    $('#ReadPasswordCheckModal').data('table', table);
5279                                }
5280                                else if (obj.is_secret == 1) {
5281                                    alert(lang.no_permission);
5282                                    // window.top.close();
5283                                }
5284                                else {
5285                                    initialize_currentLocation(bid, aid, obj, table);
5286                                }
5287                            }
5288                            else { alert(lang.no_permission); }
5289                        },
5290                        function (xhr) { alert(lang.no_permission); }
5291                    );
5292                },
5293                function(obj) {
5294                    //if (obj.is_secret == 1 || obj.writer_account == null) {
5295                    //if (obj.writer_account == null) {
5296                    if (obj.is_secret == 1 && obj.writer_account == null) {
5297                        $('#ReadPasswordCheckModal').modal('show');
5298                        $('#ReadPasswordCheckModal').data('article', obj);
5299                        $('#ReadPasswordCheckModal').data('type', 'check_password');
5300                        $('#ReadPasswordCheckModal').data('aid', __AID);
5301                        $('#ReadPasswordCheckModal').data('init-type', type);
5302                        $('#ReadPasswordCheckModal').data('table', table);
5303                    }
5304                    else if (obj.is_secret == 1) {
5305                        alert(lang.no_permission);
5306                        return;
5307                        // window.top.close();
5308                    }
5309                    else {
5310                        initialize_currentLocation(bid, aid, obj, table);
5311                    }
5312                }
5313            );
5314        }
5315    }
5316
5317    function initAnchor(href) {
5318        var page = href.slice(1, href.indexOf('?'));
5319        var query = qv_func.getUrlParams();
5320        var anchor = "";
5321        var anchor_mobile = "";
5322
5323        if (isMobile() && anchor_mobile) { anchor = anchor_mobile; }
5324        if ($('#' + anchor).length == 0) return;
5325        if (anchor && (QV_BASE_OBJ.spid == page || SITE_URL == page)) {
5326            // 앵커 동작 시 lazyload를 무시하고 displayed 클래스 부여
5327            $.each($('.body > .frm'), function() {
5328                $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5329            });
5330
5331            if (is_InternetExplorer() && $("#" + anchor).offsetTop() == 0) { // ie에서 page load 시 offset 값을 가져ì˜
5331¤ì§€ 못하기 때문에 가져올때까지 setInterval 돌림
5332                var interval = null;
5333                interval = setInterval(function() {
5334                    moveAnchor(anchor);
5335                    clearInterval(interval);
5336                }, 100);
5337            }
5338            else {
5339                setTimeout(function() {
5340                    moveAnchor(anchor);
5341                }, 100)
5342            }
5343        }
5344    }
5345
5346    function moveAnchor(anchor) {
5347        var scrolltop = 0;
5348        var header_height_pc = 0;
5349        $.each($('.header > div[class*=header]'), function() {
5350            if ($(this).attr('data-scr-hei')) {
5351                header_height_pc += parseInt($(this).attr('data-scr-hei'));
5352            }
5353        });
5354        header_height_pc = header_height_pc == 0 ? $('.header').height() : header_height_pc;
5355
5356        var header_height = isMobile() ? $('.header-mobile').height() : header_height_pc;
5357
5358        /* 2021.09.28
5359         * 동일 아이디를 가진 anchor 객체가 존재하는 경우가 있음 (PC/Mobile)
5360         * 구분하여 각 환경에 맞게 앵커객체 할당
5361         */
5362        let anchorTarget = $('div[id="' + anchor + '"]').filter(function(i, a) {
5363            const mobileParents = $(a).parents('.mobile_ele');
5364            return isMobile() ? mobileParents.length > 0 : mobileParents.length === 0;
5365        });
5366        anchorTarget = anchorTarget.length > 0 ? anchorTarget : $('#' + anchor);
5367
5368        if (anchorTarget.parents('.slider-frm').length > 0) {
5369            scrolltop = anchorTarget.parents('.slider-frm').offsetTop() - header_height;
5370            scrolltop = is_InternetExplorer() ? scrolltop + $('body').scrollTop() : scrolltop;
5371
5372            var slider_index = anchorTarget.parents('.item').index();
5373            anchorTarget.parents('.carousel.slide').carousel(slider_index);
5374            anchorTarget.parents('.item').first().css('transform', 'translate3d(0, 0, 0)');
5375
5376            if (anchorTarget.parents('.fullpage ').length > 0) {
5377                if (anchorTarget.parents('.item').prev('.item').length > 0 ) {
5378                    anchorTarget.parents('.item').prev('.item').css('transform', 'translate3d(0, -100%, 0)');
5379                }
5380                if (anchorTarget.parents('.item').next('.item').length > 0 ) {
5381                    anchorTarget.parents('.item').next('.item').css('transform', 'translate3d(0, 100%, 0)');
5382                }
5383            }
5384        }
5385        else if (anchorTarget.parents('.tab-frm').length > 0) {
5386            scrolltop = anchorTarget.parents('.tab-frm').offsetTop() - header_height;
5387            scrolltop = is_InternetExplorer() ? scrolltop + $('body').scrollTop() : scrolltop;
5388
5389            if (anchor.indexOf('tab-') > -1) {
5390                var tab_id = anchor;
5391            }
5392            else {
5393                var tab_id = anchorTarget.parent()[0].id;
5394            }
5395            anchorTarget.parents('.tab-frm').find('a[href*="#' + tab_id + '"]').trigger('click');
5396
5397            /* 2020.03.19 재헌
5398             * 탭을 mobile_ele로 복사하여 넣은 경우 헤더의 탭 앵커가 동작하지 않기 때문에(id가 달라서)
5399             * 이름으로 찾아 활성화한다
5400             */
5401            if (isMobile()) {
5402                var tab = anchorTarget.parents('.tab-frm');
5403                var target_tab = tab.find('a[href*="#' + tab_id + '"]');
5404                var tab_name = target_tab.text();
5405                $.each($('.mobile_ele .tab-frame-nav a'), function() {
5406                    if ($(this).text() == tab_name) {
5407                        $(this).trigger('click');
5408                    }
5409                });
5410            }
5411        }
5412        else {
5413            scrolltop = $("#" + anchor).offsetTop() - header_height;
5414            scrolltop = is_InternetExplorer() ? scrolltop + $('body').scrollTop() : scrolltop;
5415        }
5416
5417        $('html, body').animate({
5418            scrollTop: scrolltop
5419        }, 700);
5420
5421
5422        // mn-link 클릭하면 header-side-nav 닫음
5423        if (isMobile() && $('.header-side-nav').hasClass('active')) {
5424            $('.header-side-nav').removeClass('active');
5425
5426            if ($(this).parents('.header-mobile').length > 0) {
5427                $(this).parents('.header1, .header2, .header3, .header9').removeClass('z-index-9999');
5428            }
5429        }
5430    }
5431
5432    //$('.mn-link').on('click', function() {
5433    $('a[href*="qvac"]').on('click', function() {
5434        var href = $(this).attr('href');
5435        if (href != undefined && href != '') {
5436            var page = href.slice(1, href.indexOf('?'));
5437            var params = qv_func.getUrlParams('?' + href.split('?')[1]);
5438            var anchor = params.qvac;
5439            var anchor_mobile = params.qvmac;
5440
5441            if (isMobile() && anchor_mobile) { anchor = anchor_mobile; }
5442            if ($('#' + anchor).length == 0) return;
5443            //side menu close
5444            if($(this).parents(".header-mobile-side-nav").length > 0){
5445                $('.header-mobile').removeClass('active-side-nav');
5446            }
5447            if (anchor && (QV_BASE_OBJ.spid == page || SITE_URL == page)) {
5448                // 앵커 동작 시 lazyload를 무시하고 displayed 클래스 부여
5449                $.each($('.body > .frm'), function() {
5450                    $(this).find('.frm:not(".dp-none-important"), .box:not(".dp-none-important")').addClass('displayed');
5451                });
5452
5453                if (is_InternetExplorer() && $("#" + anchor).offsetTop() == 0) { // ie에서 page load 시 offset 값을 가져ì˜
5453¤ì§€ 못하기 때문에 가져올때까지 setInterval 돌림
5454                    var interval = null;
5455                    interval = setInterval(function() {
5456                        moveAnchor(anchor);
5457                        clearInterval(interval);
5458                    }, 100);
5459                }
5460                else {
5461                    setTimeout(function() {
5462                        moveAnchor(anchor);
5463                    }, 100)
5464                }
5465                return false;
5466            }
5467        }
5468    });
5469
5470    $('a.mn-link[href*="tab"]').on('click', function(e) {
5471        var href = $(this).attr('href');
5472        if (href != undefined && href != '') {
5473            var page = href.slice(1, href.indexOf('#'));
5474            var anchor = href.split('#')[1];
5475            if ($('#' + anchor).length == 0) return;
5476            else {
5477                if (anchor && (QV_BASE_OBJ.spid == page || SITE_URL == page)) {
5478                    e.preventDefault();
5479                    moveAnchor(anchor);
5480                }
5481            }
5482        }
5483    });
5484
5485    function isMobile() {
5486        return /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? true : false;
5487    }
5488
5489    //원래 initHeaderOverflowMenuResizeEvent 위치
5490
5491
5492    //var resize_frames = [];
5493    function imageBoxAutoResize() {
5494        $.each($('#main_container .imgBox'), function() {
5495            var img_box = $(this);
5496            var bg_size = $(this).find('.img-core').css('background-size');
5497            var bg_image = $(this).find('.img-core').css('background-image');
5498
5499            if (bg_image) {
5500                bg_image = bg_image.replace('url(', '').replace(')', '').replace(/\"/gi, "");
5501            }
5502
5503            // displayed 클래스가 없으면 리사이징 하지않는다.
5504            if (!img_box.hasClass('displayed')) return;
5505
5506            // 컬럼 2개 이상 존재하는 프레임에 속해있으면 리사이징 하지않는다.
5507            if (isMobile() || window.innerWidth <= 767) {
5508                if (img_box.parents('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
5509            }
5510            else {
5511                if (img_box.parents('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
5512            }
5513
5514            // 탭, 슬라이드 내의 이미지는 리사이징 하지않는다.
5515            if (img_box.parents('.tab-frm, .slider-frm').length > 0) return;
5516
5517            if (bg_size == 'contain') {
5518                var tmpImg = new Image();
5519                tmpImg.src = bg_image;
5520                $(tmpImg).one('load',function(){
5521                    var ratio = tmpImg.width / tmpImg.height;
5522                    var height_origin = parseInt(getDataHeight(img_box));
5523                    var width_resize = img_box.width();
5524                    var height_resize = width_resize / ratio;
5525                    height_resize = height_resize > height_origin ? height_origin : height_resize;
5526
5527                    var diff = height_origin - height_resize;
5528                    //console.log(diff);
5529
5530                    if (height_origin === 0) return;
5531                    else if (!isMobile() && window.innerWidth > 767) {
5532                        img_box.height(height_origin - diff);
5533                        img_box.find('.img-core').height(height_origin - diff);
5534                    }
5535                    else {
5536                        /*
5537                         * 모바일에서는 에디터 width 375px 기준으로 비율을 맞춰서 크기를 조정한다
5538                         * 모바일객체는 height important가 적용되어있는 경우가 많아 height 조정 시 important를 붙여줘야 함
5539                         */
5540                        var mobile_width = 375 - (parseInt(img_box.parents('.frm').last().css('padding-left')) * 2); // 에디터(375px) 기준
5541                        var mobile_ratio = mobile_width / height_origin;
5542                        img_box[0].style.setProperty('height', (width_resize / mobile_ratio) + 'px', 'important');
5543                        img_box.find('.img-core')[0].style.setProperty('height', (width_resize / mobile_ratio) + 'px', 'important');
5544                    }
5545                });
5546            }
5547        });
5548
5549        $.each($('.body > .frm'), function() {
5550            // 컬럼 2개 이상 존재하는 프레임에 속해있으면 리사이징 하지않는다.
5551            if (isMobile() || window.innerWidth <= 767) {
5552                if ($(this).parents('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11').length > 0) return;
5553                if ($(this).find('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11').length > 0) return;
5554            }
5555            else {
5556                if ($(this).parents('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
5557                if ($(this).find('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
5558            }
5559
5560
5561            // 탭, 슬라이드 내의 이미지는 리사이징 하지않는다.
5562            if ($(this).parents('.tab-frm, .slider-frm').length > 0) return;
5563            if ($(this).hasClass('tab-frm') || $(this).hasClass('slider-frm')) return;
5564
5565            var re = 0;
5566            var image_count = 0;
5567            $.each($(this).find('.box.imgBox'), function() {
5568                // displayed 클래스가 없으면 리사이징 하지않는다.
5569                if (!$(this).hasClass('displayed')) return;
5570
5571                // 컬럼 2개 이상 존재하는 프레임에 속해있으면 리사이징 하지않는다.
5572                if (isMobile() || window.innerWidth <= 767) {
5573                    if ($(this).parents('.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11').length > 0) return;
5574                }
5575                else {
5576                    if ($(this).parents('.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11').length > 0) return;
5577                }
5578
5579                // 탭, 슬라이드 내의 이미지는 리사이징 하지않는다.
5580                if ($(this).parents('.tab-frm, .slider-frm').length > 0) return;
5581
5582                re += getDataHeight($(this)) - $(this).height();
5583                image_count++;
5584            });
5585
5586            if (image_count > 0) {
5587                $.each($(this).find('.frm').andSelf(), function () {
5588                    var h = getDataHeight($(this));
5589                    if (h == 'auto' || h == 0 || re > h) return;
5590                    if ($(this).is($('.body > .frm').first()) && $('.header').length > 0) {
5591                        $.each($('.header > div'), function() { // 헤더 크기가 가변적이기 때문에 data-hei 값을 가져다쓴다
5592                            var header_height = $(this).attr('data-hei');
5593                            if (header_height == '' || header_height == undefined) { return; }
5594                            h += parseInt(header_height);
5595                        });
5596                        //h += $('.header').height();
5597                    } // 최상단 프레임은 헤더 높이 추가
5598                    h -= re;
5599                    //$(this).children('.view').children('.tb').height(h);
5600                    if (isMobile() || window.innerWidth <= 767) {
5601                        $(this).css('height', 'auto');
5602                    }
5603                    else {
5604                        $(this).height(h);
5605                    }
5606                });
5607            }
5608            image_count = 0;
5609        });
5610
5611//    $.each(resize_frames, function() {
5612//        var frame = $('#' + this.id);
5613//        var height_data = frame.attr('data-hei');
5614//        if ((height_data == '' || height_data == undefined || height_data == null)) return;
5615//        if (this.diff <= 0) return;
5616//        var height_origin_frm = parseInt(height_data);
5617//        frame.height(height_origin_frm - this.diff);
5618//        console.log('id : ' + this.id + ' / diff : ' + (height_origin_frm - this.diff).toString());
5619//
5620//        this.diff = 0; // 프레임 높이 조정 후 diff:0 으로 할당
5621//    });
5622    }
5623
5624    function getDataHeight($obj) {
5625        var retval;
5626        if (window.innerWidth <= 767 || isMobile()) {
5627            retval = $obj.attr('data-m-hei');
5628        }
5629        else {
5630            retval = $obj.attr('data-hei');
5631        }
5632
5633        if (retval == '' || retval == 'auto' || retval == undefined || retval == null || retval == 'NaNpx') {
5634            retval = $obj.height();
5635        }
5636        else {
5637            retval = parseInt(retval);
5638            retval -= parseInt($obj.css('margin-top'));
5639            retval -= parseInt($obj.css('margin-bottom'));
5640            retval -= parseInt($obj.css('padding-top'));
5641            retval -= parseInt($obj.css('padding-bottom'));
5642        }
5643
5644        return retval;
5645    }
5646
5647    function initImageBoxAutoResize() {
5648        $.each($('#main_container .frm'), function() {
5649            $(this).css('transition', '0.1s ease height');
5650
5651            if ($(this).hasClass('tab-frm')) return;
5652            if ($(this).parents('.tab-frm').length > 0) return;
5653            if ($(this).hasClass('slider-frm')) return;
5654            if ($(this).parents('.slider-frm').length > 0) return;
5655
5656            var hei = $(this).attr('data-hei');
5657            if (hei == '' || hei == 'auto' || hei == undefined || hei == null || hei == 'NaNpx') {
5658                hei = $(this).height();
5659                hei += parseInt($(this).css('margin-top'));
5660                hei += parseInt($(this).css('margin-bottom'));
5661                hei += parseInt($(this).css('padding-top'));
5662                hei += parseInt($(this).css('padding-bottom'));
5663                $(this).attr('data-hei', hei);
5664            }
5665//            $(this).attr('data-hei', $(this).height());
5666        });
5667
5668        $.each($('#main_container .imgBox'), function() {
5669            var m_hei = $(this).attr('data-m-hei');
5670            if (m_hei == '' || m_hei == 'auto' || m_hei == undefined || m_hei == null || m_hei == 'NaNpx') {
5671                m_hei = $(this).height();
5672                m_hei += parseInt($(this).css('margin-top'));
5673                m_hei += parseInt($(this).css('margin-bottom'));
5674                m_hei += parseInt($(this).css('padding-top'));
5675                m_hei += parseInt($(this).css('padding-bottom'));
5676                $(this).attr('data-m-hei', m_hei + 'px');
5677            }
5678        });
5679
5680        $.each($('#main_container .imgBox .img-core'), function() {
5681            $(this).css('transition', 'none');
5682        });
5683
5684        // 0.2초 마다 갱신
5685        setInterval(imageBoxAutoResize, 200);
5686
5687
5688//        window.onresize = function(event) {
5689//            imageBoxAutoResize();
5690//        };
5691//        $(window).bind('resizeEnd', function() {
5692//            setTimeout(imageBoxAutoResize(), 50)
5693//        });
5694    }
5695
5696    /* 2020.03.10 재헌
5697     * 백그라운드 비디오 크기 설정 (16:9)
5698     * frame/box의 크기를 확인 후 맞는 사이즈의 클래스를 부여함
5699     */
5700    function initBackgroundFullSizeVideo() {
5701        var backgroundVideo = $('.box-background-video-fullwidth .video-iframe');
5702        if (backgroundVideo.length == 0) { return; }
5703        else {
5704            var w = $('#main_container').width();
5705            if (w == 0) {
5706                setTimeout(function() {
5707                    initBackgroundFullSizeVideo();
5708                }, 100);
5709                return;
5710            }
5711            else {
5712                resizeBackgroundFullSizeVideo();
5713                $(window).resize(function () {
5714                    resizeBackgroundFullSizeVideo();
5715                });
5716            }
5717        }
5718    }
5719    function resizeBackgroundFullSizeVideo() {
5720        $.each($('.box-background-video-fullwidth .video-iframe'), function() {
5721            var $t = $(this).parents('.frm, .box').first();
5722            var w = $t.width();
5723            var h = $t.height();
5724
5725            // 모바일에서 vimeo 배경설정 시 '소리 켜기' 버튼이 생기는 문제 때문에 전체 크기 상향 조정
5726            // if (isMobile()) {
5727            //     w += 100;
5728            //     h += 100;
5729            // }
5730
5731            if ($t.parents('.slider-frm').length > 0) {
5732                w = $t.parents('.slider-frm').width();
5733                h = $t.parents('.slider-frm').height();
5734            }
5735            else if ($t.parents('.tab-frm').length > 0) {
5736                w = $t.parents('.tab-frm').width();
5737                h = $t.parents('.tab-frm').height();
5738            }
5739            else if (w == 0 || h == 0) {
5740                $t.addClass('displayed');
5741                $t.parents('.frm').addClass('displayed');
5742                w = $t.width();
5743                h = $t.height();
5744            }
5745
5746            h += parseInt($t.css('padding-top'));
5747            h += parseInt($t.css('padding-bottom'));
5748            h += parseInt($t.css('margin-top'));
5749            h += parseInt($t.css('margin-bottom'));
5750
5751            var resolution = 'resolution-1920x1080'; // default;
5752            var resolution_array = [
5753                { w:320, h:180 },
5754                { w:480, h:270 },
5755                { w:640, h:360 },
5756                { w:800, h:450 },
5757                { w:864, h:486 },
5758                { w:960, h:540 },
5759                { w:1024, h:576 },
5760                { w:1152, h:648 },
5761                { w:1280, h:720 },
5762                { w:1366, h:768 },
5763                { w:1440, h:810 },
5764                { w:1600, h:900 },
5765                { w:1760, h:990 },
5766                { w:1920, h:1080 },
5767                { w:2048, h:1152 },
5768                { w:2560, h:1440 },
5769                { w:2880, h:1620 },
5770                { w:3200, h:1800 },
5771                { w:3840, h:2160 },
5772                { w:4096, h:2304 },
5773                { w:5120, h:2880 },
5774            ];
5775            $.each(resolution_array.reverse(), function() {
5776                if (w > this.w || h > this.h) { return false; }
5777                else {
5778                    resolution = 'resolution-' + this.w + 'x' + this.h;
5779                }
5780            });
5781
5782            if ($(this).hasClass(resolution)) return;
5783            else {
5784                $(this).removeClass(function (index, className) {
5785                    return (className.match(/(^|\s)resolution-\S+/g) || []).join(' ');
5786                });
5787                $(this).addClass(resolution);
5788            }
5789        });
5790    }
5791
5792    function is_InternetExplorer() {
5793        var agent = navigator.userAgent.toLowerCase();
5794        return (navigator.appName == 'Netscape' && agent.indexOf('trident') != -1) || (agent.indexOf("msie") != -1);
5795    }
5796
5797    /* 2020.03.11 재헌
5798     * IE, Chrome이 $t.offset().top 값을 다르게 출력하기 때문에 아래와 같이 처리
5799     */
5800    const _ZOOM = Number(window.getComputedStyle(document.body).zoom) || 1;
5801    $.fn.offsetTop = function() {
5802        if (_ZOOM === 1) {
5803            var offsetTop = $(this).offset().top - parseInt($(this).css('margin-top'));
5804            return is_InternetExplorer() ? offsetTop + $('body').scrollTop() : offsetTop;
5805        } else {
5806            return window.scrollY + (this[0].getBoundingClientRect().y * _ZOOM);
5807        }
5808    };
5809
5810    function isIpadOS() {
5811        return navigator.maxTouchPoints &&
5812            navigator.maxTouchPoints > 2 &&
5813            /MacIntel/.test(navigator.platform);
5814    }
5815
5816    function getScrollY() {
5817        if (isIpadOS()) {
5818            return window.scrollY / _ZOOM;
5819        } else {
5820            return window.scrollY;
5821        }
5822    };
5823
5824
5825    /* 2020.05.18 재헌
5826     * 동영상 컨텐츠 로딩 시 다른 컨텐츠의 로딩까지 느려지는 부분 개선
5827     * 로딩 순서 (동영상 외) -> (동영상)
5828     *
5829     * 2026.08 - 여기서 전량 주입하던 로직을 제거했다.
5830     * iframe 이 display:none(0x0) 인 상태에서 src 가 주입되면 유튜브가
5831     * 저해상도 썸네일을 확정해버리는 문제가 있었다.
5832     * script.inc.html 의 initVideoLazyLoad() 가 대신 처리한다.
5833     */
5834
5835    $(document).ready(function() {
5836        if ($('.read-content-next')) {
5837            $('.read-content-next').text('이전글');
5838            $('.read-content-prev').text('다음글');
5839        }
5840
5841        $("#main_container").delegate('.board-table-1 tr.board-tbody-tr, .board-table-2 tr.board-tbody-tr, .read-content-next, .read-content-prev', 'click', function (e) {
5842            const customInterval = setInterval(function() {
5843                if ($('.read-content-next')) {
5844                    $('.read-content-next').text('이전글');
5845                    $('.read-content-prev').text('다음글');
5846                    clearInterval(customInterval);
5847                }
5848            }, 1000)
5849        });
5850    });
5851</script>
vendor: 1 bytes, line 5851
5851

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.