PageSourceSearch

https://kpanet.or.kr/

html kpanet.or.kr collected 2026-10-02 10:51:54 UTC 185,706 bytes, 4,193 lines download raw bytes

1
2
3
4
5
6
7<!DOCTYPE html>
8<html lang="ko">
9    <head>
10        <meta name="image" content="https://www.kpanet.or.kr/data/coreframework/com/kdrug/homemng/mainmng/20250225/202502250415437548.svg">
11        <meta name="twitter:card" content="summary">
12        <meta name="twitter:site" content="@대한약사회">
13        <meta name="twitter:creator" content="@대한약사회">
14        <meta name="twitter:image" content="https://www.kpanet.or.kr/data/coreframework/com/kdrug/homemng/mainmng/20250225/202502250415437548.svg">
15        <meta name="twitter:title" content="대한약사회">
16        <meta name="twitter:description" content="전국의 8만 약사는 지역주민의 건강지킴이로서 국민건강을 위해 최선을 다하고 있습니다. 특히 의약품 최고전문가인 약사로서 건강을 위한 올바른 의약품 정보 제공을 위한 커뮤니티케어 다제약물관리사업 의약품안전사용교육 환자안전사고보고 의약품부작용보고 폐의약품수거사업 등 지역주민 건강은 물론 지역사회 건강을 위해 다양한 사업을 전개해 오고 있습니다.">
17        <meta name="twitter:card" content="summary_large_image">
18        <link rel="canonical" href="https://www.kpanet.or.kr/">
19        <meta name="description" content="전국의 8만 약사는 지역주민의 건강지킴이로서 국민건강을 위해 최선을 다하고 있습니다. 특히 의약품 최고전문가인 약사로서 건강을 위한 올바른 의약품 정보 제공을 위한 커뮤니티케어 다제약물관리사업 의약품안전사용교육 환자안전사고보고 의약품부작용보고 폐의약품수거사업 등 지역주민 건강은 물론 지역사회 건강을 위해 다양한 사업을 전개해 오고 있습니다.">
20        <meta name="keywords" content="대한약사회, 사이버연수원, 휴일지킴이약국, 의약품정보제공, 다제약물관리사업, 의약품안전사용교육, 환자안전사고보고, 의약품부작용보고, 폐의약품수거사업, 지역사회건강관리, 국민건강지킴이">
21        <meta property="og:image" content="https://www.kpanet.or.kr/data/coreframework/com/kdrug/homemng/mainmng/20250225/202502250415437548.svg">
22        <meta property="og:title" content="대한약사회">
23        <meta property="og:description" content="전국의 8만 약사는 지역주민의 건강지킴이로서 국민건강을 위해 최선을 다하고 있습니다. 특히 의약품 최고전문가인 약사로서 건강을 위한 올바른 의약품 정보 제공을 위한 커뮤니티케어 다제약물관리사업 의약품안전사용교육 환자안전사고보고 의약품부작용보고 폐의약품수거사업 등 지역주민 건강은 물론 지역사회 건강을 위해 다양한 사업을 전개해 오고 있습니다.">
24        <meta property="og:url" content="https://www.kpanet.or.kr/">
25        <meta charset="UTF-8">
26        <meta http-equiv="X-UA-Compatible" content="IE=edge">
27        <meta name="viewport" content="width=device-width, initial-scale=1.0">
28        <meta name="format-detection" content="telephone=no"/>
29        <title>대한약사회</title>
30        <link rel="shortcut icon" href="/images/favicon.ico;jsessionid=F118A797D3961BCD1A0DD21159AA7600">
31        <link rel="stylesheet" type="text/css" href="/css/home/common.css">
32        
33        <link rel="stylesheet" type="text/css" href="/css/home/style.css?day=20260929">
34        <link rel="stylesheet" type="text/css" href="/css/home/animate.css">
35        <link rel="stylesheet" type="text/css" href="/css/home/swiper-bundle.min.css">
36        
36<script src="/js/home/jquery.min.js"></script>
36
37        
37<script src="/js/home/basic.js"></script>
37
38        
38<script src="/js/home/swiper-bundle.min.js"></script>
38
39        
39<script src="/js/home/jquery-scrolltofixed.js"></script>
39
40        
40<script src="/js/util/popupUtil.js"></script>
40
41        
41<script src="/js/common/cmm.js"></script>
41
42        
42<script src="https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=kna69qkvyp"></script>
42
43        
43<script src="https://openapi.map.naver.com/openapi/v3/maps-geocoder.js?ncpClientId=kna69qkvyp"></script>
43
44          
45 
46 
47 
48 
49    
50    <meta charset="UTF-8">
51    <meta http-equiv="X-UA-Compatible" content="IE=edge">
52    <meta name="viewport" content="width=device-width, initial-scale=1.0">
53    <meta name="format-detection" content="telephone=no" />
54
55    </head>
56    <style>
57        :root{
58            --image-path1:url(/images/home/common/icon_quick_01.svg);
59            --image-path2:url(/images/home/common/icon_quick_01.svg);
60            --image-path3:url(/images/home/common/icon_quick_01.svg);
61            --image-path4:url(/images/home/common/icon_quick_01.svg);
62            --image-path5:url(/images/home/common/icon_quick_01.svg);
63            --image-path6:url(/images/home/common/icon_quick_01.svg);
64            --image-path7:url(/images/home/common/icon_quick_01.svg);
65            --image-path8:url(/images/home/common/icon_quick_01.svg);
66        }
67        .quick-menu dd>a.quick01:before{background-image:var(--image-path1);}
68        .quick-menu dd>a.quick02:before{background-image:var(--image-path2);}
69        .quick-menu dd>a.quick03:before{background-image:var(--image-path3);}
70        .quick-menu dd>a.quick04:before{background-image:var(--image-path4);}
71        .quick-menu dd>a.quick05:before{background-image:var(--image-path5);}
72        .quick-menu dd>a.quick06:before{background-image:var(--image-path6);}
73        .quick-menu dd>a.quick07:before{background-image:var(--image-path7);}
74        .quick-menu dd>a.quick08:before{background-image:var(--image-path8);}
75
76    </style>
77    <body class="sub">
78        
79
80
81<script>
82
83    var _paq = window._paq = window._paq || [];
84    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
85    _paq.push(['trackPageView']);
86    _paq.push(['enableLinkTracking']);
87    (function() {
88        var u="//analysis.marketingtools.kr/";
89        _paq.push(['setTrackerUrl', u+'matomo.php']);
90        _paq.push(['setSiteId', '3']);
91        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
92        g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
93    })();
94
95    let partCd = ""
96    $(document).ready(function () {
97        fncGnbMenuList();
98        fnMainSnsList();
99        fnHeaderLogo();
100        fnWeatherAndToday();
101        fnLoginAt();
102
103        if('' === "false"){
104            openPopup("HomeMenuAuthPopup", {
105                flag: "success",
106                message: "해당 메뉴의 접근 권한이 없습니다."
107            });
108        }
109
110        if('' === "false"){
111            openPopup("HomeLoginMenuPopup");
112            // openModal('unityMberLoginPopup');
113        }
114    });
115
116
117
118    function fncGnbMenuList() {
119        $.ajax({
120            url: "/menuNavBodyListApi.cm",
121            type: "POST",
122            data:{ hpageId: 0 },
123            success: function (resultData) {
124                const ulGnbbox = document.querySelector(".gnbbox");
125                const oneDepthMenuData = resultData.list.filter(item => item.menuDepth === 1)
126                    .sort((previous, current) => previous.menuSort-current.menuSort);
127                const twoDepthMenuData = resultData.list.filter(item => item.menuDepth === 2)
128                    .sort((previous, current) => previous.menuSort-current.menuSort);
129
130                // 모든 메뉴 코드 수집 (회원전용 체크용)
131                const allMenuCds = [];
132                resultData.list.forEach(function(item) {
133                    if (item.menuCd) {
134                        allMenuCds.push(item.menuCd);
135                    }
136                });
137
138                // 회원전용 여부 일괄 체크
139                $.ajax({
140                    url: "/checkMenuMemberOnlyBatchApi.cm",
141                    type: "POST",
142                    data: {menuCds: allMenuCds},
143                    dataType: "json",
144                    traditional: true,
145                    success: function(authResult) {
146                        const memberOnlyMap = authResult.data || {};
147                        
148                        // 회원전용 여부 확인 헬퍼 함수 (숫자/문자열 키 모두 확인)
149                        function isMemberOnlyMenu(menuCd) {
150                            if (!menuCd) return false;
151                            const menuCdNum = parseInt(menuCd, 10);
152                            // 숫자 키, 문자열 키 모두 확인
153                            return memberOnlyMap[menuCd] === true || 
154                                   memberOnlyMap[String(menuCd)] === true ||
155                                   memberOnlyMap[menuCdNum] === true || 
156                                   memberOnlyMap[String(menuCdNum)] === true;
157                        }
158                        
159                        oneDepthMenuData.forEach(function (item){
160                            const liGnbBox = document.createElement('li');
161                            const aGnbBox = document.createElement('a');
162                            aGnbBox.setAttribute("href", "#a");
163                            aGnbBox.setAttribute("data-menu-cd", item.menuCd);
164                            aGnbBox.setAttribute("data-menu-nm", item.menuNm);
165                            aGnbBox.setAttribute("data-menu-url", item.menuUrl || "");
166                            
167                            const spanGnbBox = document.createElement('span');
168                            spanGnbBox.innerText = item.menuNm;
169                            
170                            // 회원전용 여부 확인 및 class 추가
171                            const isMemberOnly = isMemberOnlyMenu(item.menuCd);
172                            
173                            // 해당 1뎁스의 모든 2뎁스 메뉴 수집
174                            const subMenus = twoDepthMenuData.filter(item2 => item.menuCd === item2.hmenuCd);
175                            
176                            // 2뎁스 메뉴가 있고, 모두 회원전용인지 확인
177                            let allSubMenusAreMemberOnly = false;
178                            if (subMenus.length > 0) {
179                                allSubMenusAreMemberOnly = subMenus.every(item2 => {
180                                    // menuCd가 1002200000인 경우 하드코딩으로 회원전용 처리
181                                    if (item2.menuCd == '1002200000') {
182                                        return true;
183                                    }
184                                    return isMemberOnlyMenu(item2.menuCd);
185                                });
186                            }
187                            
188                            // 1뎁스가 회원전용이거나, 모든 2뎁스가 회원전용이면 class 추가
189                            if (isMemberOnly || allSubMenusAreMemberOnly) {
190                                liGnbBox.classList.add('membersOnlyOneDepth');
191                                aGnbBox.setAttribute("data-member-only", "true");
192                            } else {
193                                aGnbBox.setAttribute("data-member-only", "false");
194                            }
195                            
196                            aGnbBox.appendChild(spanGnbBox);
197                            const ulSubGnb = document.createElement("ul");
198                            ulSubGnb.setAttribute("class", "nav-depth");
199
200                            if(twoDepthMenuData.length > 0){
201                                twoDepthMenuData.forEach(function (item2){
202                                    if(item.menuCd === item2.hmenuCd){
203                                        const liGnbBox2 = document.createElement('li');
204                                        const aGnbBox2 = document.createElement('a');
205                                        aGnbBox2.setAttribute("data-menu-cd", item2.menuCd);
206                                        aGnbBox2.setAttribute("data-menu-nm", item2.menuNm);
207                                        aGnbBox2.setAttribute("data-menu-url", item2.menuUrl || "");
208                                        
209                                        if (item2.menuCd == '1002200000') {
210                                            aGnbBox2.setAttribute("href", "https://www.kpanews.co.kr/pharmple_re/job_offer.asp");
211                                            aGnbBox2.setAttribute("target", "_blank");
212                                        } else {
213                                            aGnbBox2.setAttribute("href", item2.menuUrl);
214                                        }
215                                        
216                                        const spanGnbBox2 = document.createElement('span');
217                                        spanGnbBox2.innerText = item2.menuNm;
218                                        
219                                        // 서브메뉴도 회원전용 여부 확인 및 class 추가
220                                        // menuCd가 1002200000인 경우 하드코딩으로 회원전용 처리
221                                        const isMemberOnly2 = (item2.menuCd == '1002200000') || isMemberOnlyMenu(item2.menuCd);
222                                        if (isMemberOnly2) {
223                                            liGnbBox2.classList.add('membersOnlyTwoDepth');
224                                            aGnbBox2.setAttribute("data-member-only", "true");
225                                        } else {
226                                            aGnbBox2.setAttribute("data-member-only", "false");
227                                        }
228                                        
229                                        aGnbBox2.appendChild(spanGnbBox2);
230                                        liGnbBox2.appendChild(aGnbBox2);
231                                        ulSubGnb.appendChild(liGnbBox2);
232                                    }
233                                });
234                            }
235                            liGnbBox.appendChild(aGnbBox);
236                            liGnbBox.appendChild(ulSubGnb);
237                            ulGnbbox.appendChild(liGnbBox);
238                        });
239                        fncGnbBoxMouse();
240                        setupMemberOnlyMenuClickHandler();
241                    },
242                    error: function() {
243                        console.error("회원전용 메뉴 체크 실패");
244                        // API 실패 시에도 메뉴는 렌더링
245                        oneDepthMenuData.forEach(function (item){
246                            const liGnbBox = document.createElement('li');
247                            const aGnbBox = document.createElement('a');
248                            aGnbBox.setAttribute("href", "#a");
249                            const spanGnbBox = document.createElement('span');
250                            spanGnbBox.innerText = item.menuNm;
251                            aGnbBox.appendChild(spanGnbBox);
252                            const ulSubGnb = document.createElement("ul");
253                            ulSubGnb.setAttribute("class", "nav-depth");
254
255                            if(twoDepthMenuData.length > 0){
256                                twoDepthMenuData.forEach(function (item2){
257                                    if(item.menuCd === item2.hmenuCd){
258                                        const liGnbBox2 = document.createElement('li');
259                                        const aGnbBox2 = document.createElement('a');
260                                        if (item2.menuCd == '1002200000') {
261                                            aGnbBox2.setAttribute("href", "https://www.kpanews.co.kr/pharmple_re/job_offer.asp");
262                                            aGnbBox2.setAttribute("target", "_blank");
263                                        } else {
264                                            aGnbBox2.setAttribute("href", item2.menuUrl);
265                                        }
266                                        const spanGnbBox2 = document.createElement('span');
267                                        spanGnbBox2.innerText = item2.menuNm;
268                                        aGnbBox2.appendChild(spanGnbBox2);
269                                        liGnbBox2.appendChild(aGnbBox2);
270                                        ulSubGnb.appendChild(liGnbBox2);
271                                    }
272                                });
273                            }
274                            liGnbBox.appendChild(aGnbBox);
275                            liGnbBox.appendChild(ulSubGnb);
276                            ulGnbbox.appendChild(liGnbBox);
277                        });
278                        fncGnbBoxMouse();
279                        setupMemberOnlyMenuClickHandler();
280                    }
281                });
282            },
283            error: function () {
284                console.error();
285            }
286        });
287    }
288
289    // 회원전용 메뉴 클릭 시 로그인 팝업 표시
290    function setupMemberOnlyMenuClickHandler() {
291        // 중복 등록 방지
292        if (window._memberOnlyClickHandlerSetup) return;
293        window._memberOnlyClickHandlerSetup = true;
294
295        document.addEventListener('click', function(e) {
296            const link = e.target.closest('a[data-member-only="true"]');
297            if (!link) return;
298
299            const href = link.getAttribute('href') || '';
300            const isExternal = href.startsWith('http');
301            const isLoggedIn = document.body.id === 'login';
302
303            // 외부 링크는 그냥 이동
304            if (isExternal) return;
305
306            // 로그인하지 않은 경우
307            if (!isLoggedIn) {
308                e.preventDefault();
309                openModal('unityMberLoginPopup');
310            }
311        });
312    }
313
314    function fnMainSnsList() {
315        $.ajax({
316            url: "/mainSnsList.cm",
317            type: "POST",
318            data: {hpageId: 0},
319            success: function (resultData) {
320                let pcSnsElements = document.querySelectorAll(".utill-left a");
321                let mbSnsElements = document.querySelectorAll(".mobile-sns a");
322                resultData.list.forEach(function (el, index) {
323
324                    pcSnsElements[index].innerText = el.mainSnsTitle;
325                    mbSnsElements[index].innerText = el.mainSnsTitle;
326
327                    let filePath = el.snsFile.filePath;
328                    pcSnsElements[index].style.backgroundImage = `url('${filePath}')`
329                    pcSnsElements[index].href = el.linkUrl;
330                    mbSnsElements[index].style.backgroundImage = `url('${filePath}')`
331                    mbSnsElements[index].href = el.linkUrl;
332                })
333            },
334            error: function () {
335                console.error();
336            }
337        });
338    }
339
340    function fnHeaderLogo() {
341        $.ajax({
342            url: "/mainHeaderLogo.cm",
343            type: "POST",
344            data: {hpageId: 0},
345            success: function (resultData) {
346                if (resultData.list !== null && resultData.list !== '') {
347                    document.getElementById("mainHeader").innerText = resultData.list.headerTitle
348                    let filePath = resultData.list.headerFile[0].filePath
349                    document.querySelectorAll(".logo a")[0].style.background = `url('${filePath}')  0 0 no-repeat`
350                    document.querySelectorAll(".logo a")[0].style.backgroundSize = '100%';
351                }
352            },
353            error: function () {
354                console.error();
355            }
356        });
357    }
358
359    function fnWeatherAndToday(){
360        const now = new Date();
361        const year = now.getFullYear();
362        const month = now.getMonth()+1;
363        const day = now.getDate() < 10 ? "0"+now.getDate() : now.getDate();
364        const today = ""+year+((now.getMonth()+1) > 10 ? now.getMonth()+1 : "0"+(now.getMonth()+1))+day
365        const dayOfWeekNames = ['일', '월', '화', '수', '목', '금', '토'];
366        const dayOfWeek = dayOfWeekNames[now.getDay()]
367        const formattedToDay = year+'.'+String(month).padStart(2, '0')+'.'+String(day).padStart(2, '0')+'('+dayOfWeek+')'
368        let time = ""+(now.getHours()-1)+"00"
369        let resultTime = ""+(now.getHours())+"00"
370
371        if(parseInt(time) < 1000 && parseInt(time) > 500){
372            time = "0"+time
373            if(parseInt(resultTime) > 500 && parseInt(resultTime) < 1000){
374                resultTime = "0"+resultTime
375            }
376        }
377        if(parseInt(time) < 600){
378            time = "0600"
379            resultTime = "0700"
380        }
381        if(parseInt(time) > 1800){
382            time = "1800"
383            resultTime = "1900"
384        }
385
386        /** 날씨 (기상청 초단기 예보 API 필요) */
387
388        var url = 'https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst'; /*URL*/
389        var queryParams = '?' + encodeURIComponent('serviceKey') + '='+'pH%2BMd8hJF2APAMLdpw6Mg%2Bz9raW%2FL3KCSj0xq3At8wBZVkMx3odTJT%2FYzMXkEUTVvnbLyuRNYY0qI9S9g%2FOwxQ%3D%3D'; /*Service Key*/
390        queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /* 응답 받을 페이지 no*/
391        queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('1000'); /*결과 row 수*/
392        queryParams += '&' + encodeURIComponent('dataType') + '=' + encodeURIComponent('JSON'); /* 응답받을 data type */
393        queryParams += '&' + encodeURIComponent('base_date') + '=' + encodeURIComponent(today); /* 기준 날짜*/
394        queryParams += '&' + encodeURIComponent('base_time') + '=' + encodeURIComponent(time); /*기준 시간 (1시간 단위로 6시간 까지)*/
395        queryParams += '&' + encodeURIComponent('nx') + '=' + encodeURIComponent('61'); /* 서울 좌표 X */
396        queryParams += '&' + encodeURIComponent('ny') + '=' + encodeURIComponent('126'); /* 서울 좌표 Y */
397
398        document.querySelectorAll(".weather div")[0].innerHTML = ` ${formattedToDay}<span id="temp"></span>`
399
400        $.ajax({
401            url: url+queryParams,
402            type: "GET",
403            success: function (resultData) {
404                if(resultData.response.header.resultCode === "00") {
405                    const data = resultData.response.body.items.item
406                    let pty;
407                    let sky;
408                    let temp;
409                    let icon;
410
411                    const groupedData = data.reduce((result, item) => {
412                        const fcstTime = item.fcstTime;
413                        if (!result[fcstTime]) {
414                            result[fcstTime] = [];
415                        }
416                        result[fcstTime].push(item);
417                        return result;
418                    }, {});
419
420                    /**
421                     * - 하늘상태(SKY) 코드 : 맑음(1), 구름많음(3), 흐림(4) /  1,2,5,6 -> 비옴  / 3,7 -> 눈
422                     * - 강수형태(PTY) 코드 : 없음(0), 비(1), 비/눈(2), 눈(3), 빗방울(5), 빗방울눈날림(6), 눈날림(7)
423                     * */
424                    groupedData[resultTime].forEach(function (el) {
425                        if (el.category === 'SKY') {
426                            sky = el.fcstValue
427                        }
428                        if (el.category === 'PTY') {
429                            pty = el.fcstValue
430                        }
431                        if (el.category === "T1H") {
432                            temp = el.fcstValue
433                        }
434                    })
435
436                    if (sky === "1") {
437                        if (["1", "2", "5", "6"].includes(pty)) {
438                            icon = "/images/home/common/rain.svg" //"비"
439                        } else if (["3", "7"].includes(pty)) {
440                            icon = "/images/home/common/snow.svg"//"눈"
441                        } else {
442                            icon = "/images/home/common/sunny.svg"//"맑음"
443                        }
444                    }
445                    if (sky === "3") {
446                        if (["1", "2", "5", "6"].includes(pty)) {
447                            icon = "/images/home/common/rain.svg" //"비"
448                        } else if (["3", "7"].includes(pty)) {
449                            icon = "/images/home/common/snow.svg"//"눈"
450                        } else {
451                            icon = "/images/home/common/cloud.svg"//"구름"
452                        }
453                    }
454                    if (sky === "4") {
455                        if (["1", "2", "5", "6"].includes(pty)) {
456                            icon = "/images/home/common/rain.svg" //"비"
457                        } else if (["3", "7"].includes(pty)) {
458                            icon = "/images/home/common/snow.svg"//"눈"
459                        } else {
460                            icon = "/images/home/common/cloudy.svg" //"흐림(구르많음)"
461                        }
462                    }
463                    let img = document.createElement("img");
464                    img.src = icon;
465                    img.alt = "weather";
466                    img.id = "weatherIcon";
467                    document.getElementById("temp").innerText = `서
467울${temp}℃`
468                    document.getElementsByClassName("weather")[0].appendChild(img);
469                }
470            },
471            error: function () {
472                console.error();
473            }
474        });
475
476    }
477
478    /***** 로그인 정보 확인.*/
479    function fnLoginAt(){
480        $.ajax({
481            url:"/home/login/homeLoginInfoInitApi.cm",
482            type: "POST",
483            success:function(result){
484                if(result.data != null && result.data.mberId != null && result.data.mberId != ""){
485                    // 로그인 상태
486                    fnLoginShow();
487
488                }else{
489                    fnLogoutShow();
490
491                }
492            }
493        });
494    }
495
496    /******* 로그아웃*/
497    function fnLogout(mainLocationFlag){
498
499        $.ajax({
500            url:"/home/login/homeLogoutApi.cm",
501            type: "POST",
502            async : false,
503            success:function(result){
504                if(result.message == "SUCCESS"){
505                    fnLogoutShow();
506
507                    if(mainLocationFlag != "N"){
508                        window.location="/"; //로그아웃시 메인으로 이동
509                    }
510                }else{
511                    alert(result.message)
512                }
513            }
514        });
515
516    }
517
518    /***** 로그인연장 */
519    function fnLoginExtn(){
520
521        $.ajax({
522            url:"/home/login/homeLoginExtnApi.cm",
523            type: "POST",
524            data:{"ssoServerId":"KPALCN"},
525            success:function(result){
526
527                if(result.data != null){
528                    fnLogoutLoginTimerReset(result.data.expireSessionSecond);
529
530                }else{
531                    // alert(result.data)
532                    location.href="/main.cm";
533                }
534            }
535            });
536    }
537
538    /**** 로그인한 회원 정보 영역*/
539    function fnLoingMberInfoShowPC(){
540
541        $.ajax({
542            url:"/home/login/loingInfoPc.cm",
543            type: "POST",
544            dataType: "html",
545            data: {},
546            success:function(html){
547                $("#divLoginMberInfo").html(html);
548            },
549            error:function(){
550                console.error();
551            }
552        });
553    }
554
555    /*** 로그인 후의 버튼 및 회원정보 노출 처리*/
556    function fnLoginShow(){
557
558        let windowWidth = window.innerWidth;
559
560        document.getElementById("btnUnityLogout").style.display="block";
561        document.getElementById("btnUnityLogin").style.display="none";
562        document.getElementById("btnUnityRegist").style.display="none";
563        document.getElementById("divLoginMberInfo").style.display="block";
564
565        //Mo
566        if (windowWidth < 1000) {
567            document.getElementById("divLoginMberInfo").style.display="none";
568            document.getElementById("divLoginMberInfoArea").style.display="none";
569        }
570        // document.getElementById("btnUnityLogoutMo").style.display="block";
571        // document.getElementById("btnUnityLoginMo").style.display="none";
572        // document.getElementById("btnUnityRegistMo").style.display="none";
573
574        //body 태그에 login 아이디 추가
575        document.getElementsByTagName("body")[0].id="login";
576
577        fnLoingMberInfoShowPC();
578        fnLoginMberInfoShowMo();
579
580    }
581
582    /*** 로그아웃 후의 버튼 및 회원정보 노출 처리*/
583    function fnLogoutShow(){
584        //로그아웃
585        document.getElementById("btnUnityLogout").style.display="none";
586        document.getElementById("btnUnityLogin").style.display="block";
587        document.getElementById("btnUnityRegist").style.display="block";
588        document.getElementById("divLoginMberInfo").style.display="none";
589
590        $("#divLoginMberInfo").empty();
591
592        //mo
593        // document.getElementById("btnUnityLogoutMo").style.display="none";
594        // document.getElementById("btnUnityLoginMo").style.display="block";
595        // document.getElementById("btnUnityRegistMo").style.display="block";
596
597        fnLoginMberInfoNoShowMo();
598
599
600        // body 태그에 login 아이디 제거
601        document.getElementsByTagName("body")[0].removeAttribute('id');
602    }
603
604 /*   /!* 로그인 후 회원정보 보이기 모바일*!/
605    function fnLoginMberInfoShowMo(){
606        document.getElementById("loginMberLinkMo").style.display="block";
607        document.getElementById("loginMberInfosMo").style.display="block";
608    }
609    /!* 로그아웃 후 회원정보 숨기기 모바일*!/
610    function fnLoginMberInfoNoShowMo(){
611        document.getElementById("loginMberLinkMo").style.display="none";
612        document.getElementById("loginMberInfosMo").style.display="none";
613    }*/
614
615    function fncGnbBoxMouse(){
616        //PC GNB매뉴
617        $('.gnbbox>li').on('mouseenter',function(){
618            $(this).addClass('current');
619            let default_H = 0;
620            $(this).each(function(){
621                let contHeight =  $(this).find(".nav-depth").outerHeight();
622                if(default_H < contHeight){
623                    default_H = contHeight;
624                }
625                // console.log(contHeight)
626            })
627            $('.navBg').stop().animate({height:default_H + "px"},0)
628
629        });
630        $('.gnbbox>li').on('mouseleave',function(){
631            $(this).removeClass('current');
632            $('.navBg').stop().animate({height:0},0)
633        });
634    }
635
636</script>
636
637
638
639
640
641
642<div class="modal-popup fade" id="unityMberRegistPopup">
643    <div class="modal-dialog" id="unityMberRegistPopupBack">
644        <div class="modal-content">
645            <div class="modal-header">
646                <span class="close-btn btn-pop-close" id="closeUnityMberRegistPopup">닫기</span>
647                <h4 class="modal-title">대한약사회 온라인 통합회원 등록</h4>
648            </div>
649            <div class="modal-body">
650                <div class="reg-process serchwrite">
651                    <span class="active">정보입력</span>
652                    <i><img src="/images/home/pop/step_arrow.svg" alt=""></i>
653                    <span>회원조회</span>
654                    <i><img src="/images/home/pop/step_arrow.svg" alt=""></i>
655                    <span>통합회원등록</span>
656                    <i><img src="/images/home/pop/step_arrow.svg" alt=""></i>
657                    <span>약관동의</span>
658                    <i><img src="/images/home/pop/step_arrow.svg" alt=""></i>
659                    <span>등록완료</span>
660                </div>
661                <form id="frmRegistMber">
662                    <input type="hidden" id="registMberLcnsSttemntHistAt" name="lcnsSttemntHistAt">
663                    <input type="hidden" id="registMberMmberSttemntHistAt" name="mberSttemntHistAt">
664                    <input type="hidden" id="registMberSttemntMberAt" name="sttemntMberAt">
665                    <input type="hidden" id="registNoAcnt" name="noAcntAt">
666                    <input type="hidden" id="registMberId" name="mberId">
667                    <div class="reg-box">
668                        <div class="reg-title">회원조회 정보입력</div>
669                        <ul class="reg-input-box">
670                            <li>
671                                <div class="input-title">이름<span>*</span></div>
672                                <div class="form-group">
673                                    <input type="text" class="input-control" id="registMberName" name="mberNm"
674                                           placeholder="이름 입력">
675                                </div>
676                                <div id="validateName" style="display:none" class="in-text red">※ 이름을 입력해주세요</div>
677                                <div id="noRegistMber" style="display:none" class="in-text red">※ 등록된 회원이 아닙니다.</div>
678                            </li>
679                            <li>
680                                <div class="input-title">면허번호<span>*</span></div>
681                                <div class="form-group popinput">
682                                    <input type="text" class="input-control" id="registLcnsNo" name="lcnsNo"
683                                           placeholder="면허번호 입력" maxlength='5'
684                                           onchange="fn_lcnsInputEvt(this);"
685                                           oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">
686                                </div>
687                                <div id="validateLcnsNo" style="display:none" class="in-text red">※ 면허번호를 입력해주세요</div>
688                            </li>
689                            <li>
690                                <div class="input-title">생년월일<span>*</span></div>
691                                <div class="form-group popinput">
692                                    <input type="text" class="input-control" id="registBrthdy" name="brthdy"
693                                           placeholder="8자리의 생년월일(예:19800501)" maxlength='8'
694                                           oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">
695                                </div>
696                                <div id="validateBrthdy" style="display:none" class="in-text red">※ 생년월일을 입력해주세요.</div>
697                            </li>
698                        </ul>
699                    </div>
700            </div>
701            </form>
702            <div class="modal-footer">
703                <button type="button" class="close-btn  btn-frame middle outline black" id="unityRegistCancle">취소
704                </button>
705                <button type="button" class="btn-frame white middle bg-black01 ml10" onclick="unityMberInfoAtCheck()">
706                    확인
707                </button>
708            </div>
709        </div>
710    </div>
711</div>
712
713
714
715<div class="modal-popup fade" id="unityRegistNextPopup"></div>
716
717
718
719
720
721
722<script>
723
724    /* 닫기 버튼 클릭시 form 초기화*/
725    $(".close-btn").click(function () {
726        $('#frmRegistMber')[0].reset();
727        fncloseRegistAlertGuideDisplayNone();
728    });
729
730    function fncloseRegistAlertGuideDisplayNone() {
731        document.getElementById("validateName").style.display = "none";
732        document.getElementById("noRegistMber").style.display = "none";
733        document.getElementById("validateLcnsNo").style.display = "none";
734        document.getElementById("validateBrthdy").style.display = "none";
735    }
736
737
738    // 회원등록시 저장할 면허 이미지 데이터
739    var registLcnsImgData = new FormData();
740
741    var pwdFormat = /^(?!((?:[A-Za-z]+)|(?:[~!@#$%^&*()_+=]+)|(?:[0-9]+))$)[A-Za-z\d~!@#$%^&*()_+=`\[\];':",.<>\\|/?-]{8,20}$/;
742
743    /*************** ID유효성 체크*/
744    function idFormatValidateCheck(mberId, guideId) {
745        let idGuide = document.getElementById(guideId);
746
747        let idValidateCheck = /^.*(?=.{6,20})(?=.*[0-9])(?=.*[a-z]).*$/;
748        let idRegExp = /[ \{\}\[\]\/?.,;:|\)*~`!^\-_+┼<>@#$%&\'\"\\\(\=]/gi; // 특수문자 입력 불가
749        let idNoKoreanExp = /[^0-9a-z]/g;
750
751        if (!idValidateCheck.test(mberId) || idRegExp.test(mberId) || idNoKoreanExp.test(mberId) || mberId.startsWith("kpa")) {
752            idGuide.innerText = "※ 사용할 수 없는 아이디입니다.";
753            idGuide.classList.remove("blue");
754            idGuide.classList.add("red");
755            idGuide.style.display = "block";
756            return false;
757        }
758        return true;
759    }
760
761
762    /**************** ID 중복 확인*/
763    function idDplctCheck(memId, guideAreaId, dplctCheckId) {
764
765        if (idFormatValidateCheck(memId, guideAreaId)) {
766            let idGuide = document.getElementById(guideAreaId);
767
768            $.ajax({
769                type: "GET",
770                url: "/home/unitmem/homeIdDplctCheckApi.cm",
771                data: {"mberId": memId},
772                success: function (response) {
773
774                    // 중복체크한 아이디
775                    if (response.data == "N") {
776                        document.getElementById(dplctCheckId).value = memId;
777                        idGuide.innerText = "※ 사용 가능한 아이디입니다";
778                        idGuide.classList.remove("red");
779                        idGuide.classList.add("blue");
780                        idGuide.style.display = "block";
781
782                    } else {
783                        document.getElementById(dplctCheckId).value = '';
784                        idGuide.innerText = "※ 사용할 수 없는 아이디입니다.";
785                        idGuide.classList.remove("blue");
786                        idGuide.classList.add("red");
787                        idGuide.style.display = "block";
788                    }
789                },
790                error: function (jqXHR, textStatus, errorThrown) {
791                    console.error(textStatus, errorThrown);
792                }
793            });
794        }
795    }
796
797    /*******************유효성 체크 함수*/
798    function unityMberRegistValidateCheck() {
799
800
801        let registName = document.getElementById("registMberName").value;
802        let registLcnsNo = document.getElementById("registLcnsNo").value;
803        let registBrthdy = document.getElementById("registBrthdy").value;
804
805        let nameCheck = false;
806        let lcnsnoCheck = false;
807        let brthdyCheck = false;
808
809        // 이름
810        if (registName == null || registName == "") {
811            document.getElementById("validateName").style.display = "block";
812            nameCheck = false;
813        } else {
814            document.getElementById("validateName").style.display = "none";
815            nameCheck = true;
816        }
817
818        // 면허번호
819        if (registLcnsNo == null || registLcnsNo == "") {
820            document.getElementById("validateLcnsNo").innerText = "※ 면허번호를 입력해주세요";
821            document.getElementById("validateLcnsNo").style.display = "block";
822            lcnsnoCheck = false;
823        } else {
824            document.getElementById("validateLcnsNo").style.display = "none";
825            lcnsnoCheck = true;
826        }
827
828        // 생년월일
829        if (registBrthdy == null || registBrthdy == "" || registBrthdy.length != 8) {
830            document.getElementById("validateBrthdy").style.display = "block";
831            brthdyCheck = false;
832        } else {
833            document.getElementById("validateBrthdy").style.display = "none";
834            brthdyCheck = true;
835        }
836
837        if (nameCheck && lcnsnoCheck && brthdyCheck) {
838            return true;
839        }
840        return false;
841    }
842
843
844    /******* 통합회원 관련 다음 단계 팝업 오픈 함수*/
845    function nextRegistPopupOpen(url, requestData) {
846
847        $.ajax({
848            url: "/home/unitmem/" + url + ".cm",
849            type: "POST",
850            dataType: "html",
851            data: requestData,
852            success: function (html) {
853                $("#unityRegistNextPopup").html(html);
854                showpop("unityRegistNextPopup");
855            },
856            error: function () {
857                console.error();
858            }
859        });
860
861    }
862
863    /*********** 등록을 위한 회원정보 확인 함수*/
864    function unityMberInfoAtCheck() {
865
866        if (unityMberRegistValidateCheck()) { // 유효성검사 통과후
867
868            let sttemntMberAt = "N";
869            $.ajax({
870                type: "POST",
871                url: "/home/unitmem/homeMberInfoCheckApi.cm",
872                data: $("#frmRegistMber").serialize(),
873                success: function (response) {
874                    const data = response.data;
875                    const onlineMberAt = data.onlineMberAt; /*온라인회원여부*/
876
877                    document.getElementById("registMberLcnsSttemntHistAt").value = data.lcnsSttemntHistAt;
878                    document.getElementById("registMberMmberSttemntHistAt").value = data.mberSttemntHistAt;
879                    document.getElementById("registNoAcnt").value = data.noAcntAt;
880
881                    let url = ""; // 다음동작할 url
882
883                    if (onlineMberAt == "N") {
884                        /*회원 정보 없음.*/
885
886                        if (data.mberInfoLcnsAt == "Y") {
887                            // 회원 신청이 반려되어 테이블에 면허번호가 남아있는 경우
888                            document.getElementById("validateLcnsNo").innerText = "※ 이미 가입 이력이 있는 면허번호입니다.";
889                            document.getElementById("validateLcnsNo").style.display = "block";
890                            return null;
891
892                        } else {
893                            if (data.mberSttemntHistAt == 'Y' || data.lcnsSttemntHistAt == 'Y') {
894                                //신고이력이 있을 경우
895                                sttemntMberAt = 'Y';
896                                url = "sttemntMberGuidePopup";
897                            } else {
898                                //신고이력이 없을 경우
899                                sttemntMberAt = 'N';
900                                url = "noSttemntMberGuidePopup";
901                            }
902                        }
903                        document.getElementById("registMberSttemntMberAt").value = sttemntMberAt
904
905                    } else {
906                        /*회원정보 있음.*/
907
908                        if (data.noAcntAt == "Y") {
909                            // 회원정보가 있는데, 계정(ID, PWD)이 없는 회원의 경우
910                            // 신고이력 있는 경우가 동일하게 처리
911                            url = "sttemntMberGuidePopup";
912                            document.getElementById("registMberSttemntMberAt").value = 'Y';
913
914                        } else if (data.unityMberAt == 'N') {
915                            /*통합회원이 아닌경우 (전환필요)*/
916                            url = "noUnityMberGuidePopup";
917
918                            document.getElementById("registMberId").value = data.mberId;
919
920                        } else {
921                            // else if(data.unityMberAt == 'Y'){
922                            /*통합회원인 경우*/
923                            url = "unityMberGuidePopup";
924                        }
925                    }
926
927                    /* 다음 단계의 팝업 오픈*/
928                    nextRegistPopupOpen(url, $("#frmRegistMber").serialize());
929                    document.getElementById("closeUnityMberRegistPopup").click();
930                },
931                error: function (jqXHR, textStatus, errorThrown) {
932                    console.error(textStatus, errorThrown);
933                }
934            });
935        }
936    }
937
938
939    function fnOtherPopupOpenInRegist(popupId) {
940        showpop(popupId)
941        document.getElementById("unityRegistNextPopup").style.display = "none";
942    }
943
944    function fn_lcnsInputEvt(target) {
945        const _this = $(target);
946        let result = "";
947        for (let i = 0; i < (5 - _this.val().length); i++) {
948            result += "0";
949        }
950        _this.val(result + _this.val());
951    }
952
953</script>
953
954
955
956
957
958
959<div class="modal-popup fade" id="unityMberLoginPopup">
960    <div class="modal-dialog">
961        <div class="modal-content">
962            <div class="modal-header">
963                <span class="close-btn btn-pop-close" onclick="fnPopupCloseReset();">닫기</span>
964                <h4 class="modal-title">대한약사회 온라인 통합회원 로그인</h4>
965            </div>
966            <div class="modal-body">
967                <div class="reg-box regbtn">
968                    <div class="reg-title in-text red">
969                        최초 로그인시 기존에 사용한 아이디와 비밀번호(면허번호)를 입력하시고 안내에
970                        따라 통합회원으로 전환해주세요.
971                    </div>
972                    <ul class="reg-input-box">
973                        <form id="frmUnityMberLogin">
974                            <li>
975                                <div class="input-title">아이디</div>
976                                <div class="form-group popinput">
977                                    <input type="text" class="input-control" id="loginMberId" name="mberId"
978                                           placeholder="아이디 입력" onkeyup="if(window.event.keyCode==13){fnUnityLogin()}">
979                                </div>
980                                <div class="in-text red" style="display:none;" id="loginMberIdGuide"></div>
981                            </li>
982                            <li>
983                                <div class="input-title">비밀번호</div>
984                                <div class="form-group popinput">
985                                    <input type="password" class="input-control" id="loginMberPwd" name="password"
986                                           placeholder="비밀번호 입력" onkeyup="if(window.event.keyCode==13){fnUnityLogin()}">
987                                </div>
988                                <div class="in-text red" style="display:none;" id="loginMberPwdGuide">※ 비밀번호를 입력해주세요.
989                                </div>
990                            </li>
991                        </form>
992                    </ul>
993                    <div class="find-iwp modify">
994                        <a href="#a" onclick="fnLoginNextPopup('homeSearchIdMberConfirmPopup')">아이디 찾기</a>
995                        <a href="#a" onclick="fnLoginNextPopup('homeSearchPwdMberConfirmPopup')">비밀번호 찾기</a>
996                        <a href="#a"
997                           onclick="$('#closeUnityLogin').click(); openModal('unityMberRegistPopup');">회원등록</a>
998                    </div>
999                </div>
1000            </div>
1001            <div class="modal-footer">
1002                <button type="button" class="close-btn  btn-frame middle outline black" id="closeUnityLogin"
1003                        onclick="fnPopupCloseReset();">취소
1004                </button>
1005                <button type="button" class="btn-frame gray middle bg-black01 ml10" onclick="fnUnityLogin();">로그인
1006                </button>
1007            </div>
1008        </div>
1009    </div>
1010</div>
1011
1012
1013<div class="modal-popup fade" id="loginNextStepPopup"></div>
1014
1015<div class="modal-popup fade" id="loginSmsCrtfcPopup"></div>
1016
1017
1018
1019<script>
1020
1021    function fnPopupCloseReset() {
1022        $("#loginNextStepPopup").empty();
1023        $("#loginSmsCrtfcPopup").empty();
1024        $('#frmUnityMberLogin')[0].reset();
1025        $("#unityRegistNextPopup").empty();
1026        document.getElementById("loginMberPwdGuide").style.display = "none";
1027        document.getElementById("loginMberIdGuide").style.display = "none";
1028    }
1029
1030    function fnOtherPopupOpen(popupId) {
1031        showpop(popupId)
1032        document.getElementById("loginNextStepPopup").style.display = "none";
1033
1034    }
1035
1036
1037    /****** 다른 팝업 오픈 */
1038    function fnLoginNextPopup(url, request) {
1039        $('#closeUnityLogin').click();
1040        loginOpenPopup(url, request, "loginNextStepPopup")
1041    }
1042
1043    /**** 대한약사회 통합회원로그인*/
1044    function fnUnityLogin() {
1045        fnLogin(document.getElementById("loginMberId").value, document.getElementById("loginMberPwd").value, "loginMberIdGuide", "loginMberPwdGuide", "closeUnityLogin")
1046    }
1047
1048
1049    /***** 로그인시 유효성 검사*/
1050    function fnLoginValidateCheck(loginId, loginPwd, idGuide, pwdGuide) {
1051        let loginCheck = true;
1052
1053        let loginIdGuide = document.getElementById(idGuide)
1054        let loginPwdGuide = document.getElementById(pwdGuide)
1055
1056        //아이디 확인
1057        if (loginId == null || loginId == "") {
1058            loginIdGuide.innerText = "※ 아이디를 입력해주세요.";
1059            loginIdGuide.style.display = "block";
1060
1061            loginCheck = false
1062
1063        } else {
1064            loginIdGuide.style.display = "none";
1065        }
1066
1067        // 비밀번호 확인
1068        if (loginPwd == null || loginPwd == "") {
1069            loginPwdGuide.innerText = "※ 비밀번호를 입력해주세요.";
1070            loginPwdGuide.style.display = "block";
1071
1072            loginCheck = false
1073
1074        } else {
1075            loginPwdGuide.style.display = "none";
1076        }
1077
1078        return loginCheck;
1079
1080    }
1081
1082    /******* 로그인*/
1083    function fnLogin(loginId, loginPwd, idGuideId, pwdGuideId, closePopupBtnId, returnForm) {
1084
1085
1086        if (fnLoginValidateCheck(loginId, loginPwd, idGuideId, pwdGuideId)) {
1087
1088            $.ajax({
1089                url: "/home/login/homeLoginApi.cm",
1090                type: "POST",
1091                async: false,
1092                data: {"mberId": loginId, "password": loginPwd, "ssoServerId": "KPAHPG"}
1093                ,
1094                success: function (result) {
1095                    const data = result.data;
1096
1097                    if (data.loginSuccesAt == "Y") {
1098                        // *****************로그인 성공
1099
1100                        if (returnForm && returnForm != null) {
1101
1102                            // returnFrom이 있으면 return
1103                            returnForm.submit()
1104                        }
1105
1106                        $("#" + closePopupBtnId).click();
1107                        fnLoginAt();
1108
1109                        if (data.mberSttemntPopupOpenAt == "Y") {
1110                            //case : 회원 신고 안내 ( 5월 한달간 오픈 )
1111                            //action : 5월 한달간 회원신고 유예기간 안내 오픈
1112                            let pwdResetAt = "N";
1113
1114                            if (data.pwdResetPopupOpenAt == "Y") { // 회원신고 안내랑 패스워드 재설정 안내 두개의 팝업을 띄우는 경우
1115                                // case : 패스워드 마지막 변경일로 90일 초과하는 경우
1116                                // action: 회원신고 안내 팝업 우선 띄운 후 PWD 재설정 권고 안내 오픈
1117                                pwdResetAt = "Y";
1118                            }
1119                            if (data.rcpmnyAt == "N") {
1120                                loginOpenPopup("homeMberSttemntGuidePopup", {
1121                                    "mberId": data.mberId,
1122                                    "lcnsNo": data.lcnsNo,
1123                                    "resetPwdAt": pwdResetAt
1124                                }, "loginNextStepPopup");
1125                            }
1126
1127                        } else {
1128                            if (data.pwdResetPopupOpenAt == "Y") {
1129                                // case: 패스워드 마지막 변경일로 90일 초과하는 경우
1130                                // action: 패스워드 재설정 권고 팝업 오픈
1131                                loginOpenPopup("homeResetPwdPopup", {
1132                                    "mberId": data.mberId,
1133                                    "lcnsNo": data.lcnsNo
1134                                }, "loginNextStepPopup");
1135
1136                            } else {
1137                                location.reload();
1138                            }
1139
1140                        }
1141
1142                    } else {
1143                        // *******************로그인 실패
1144                        if (data.unityMberCnvrsOpenAt == "Y") {
1145                            // case: 통합회원 전환 필요한 경우
1146                            // action: 통합회원 전환 안내 팝업 오픈
1147                            $("#closeUnityLogin").click();
1148                            nextRegistPopupOpen("noUnityMberGuidePopup", {
1149                                "mberId": data.mberId,
1150                                "lcnsNo": data.lcnsNo,
1151                                "mberNm": data.mberNm
1152                            });
1153
1154                        } else if (data.lockAt == "Y") {
1155                            // case: 비밀번호 5회이상 오류
1156                            // action: 비밀번호 잠금 상태 안내 팝업 오픈
1157                            $("#closeUnityLogin").click();
1158                            loginOpenPopup("acntLockPopup", {}, "loginNextStepPopup")
1159
1160                        } else {
1161
1162                            if (data.mberSttusCode == "R") {
1163                                // CASE : 관리자가 회원 반려처리한 경우
1164                                // action : 관리자 승인 반려되었습니다.
1165                                document.getElementById(idGuideId).innerText = "※ 관리자 승인 반려되었습니다.";
1166                                document.getElementById(idGuideId).style.display = "block";
1167
1168                            } else if (data.mberSttusCode == "N") {
1169                                // CASE : 관리자가 회원 승인이 아직 미승인인 경우
1170                                // action : 관리자 승인 대기 중입니다.
1171                                document.getElementById(idGuideId).innerText = "※ 회원등록 관리자 승인 전입니다. 관리자 승인 후 이용 가능합니다.";
1172                                document.getElementById(idGuideId).style.display = "block";
1173
1174                            } else if (data.onlineMberAt == "N" && data.lockCnt > -1) {
1175
1176                                // if (data.transformUser) {
1177                                //     $("#closeUnityLogin").click();
1178                                //     nextRegistPopupOpen("noUnityMberGuidePopup", {
1179                                //         "mberId": data.mberId,
1180                                //         "lcnsNo": data.lcnsNo
1181                                //     });
1182                                // } else {
1183                                // case: ID 실패
1184                                // action: 등록된 아이디가 아니라는 가이드 제시
1185                                document.getElementById(idGuideId).innerText = "※ 등록된 아이디가 아닙니다.";
1186                                document.getElementById(idGuideId).style.display = "block";
1187                                // }
1188
1189
1190                            } else if (data.passwordEqualsYn == 'N') {
1191                                // case: pwd 실패
1192                                // action: 비밀번호 불일치 안내 가이드 제시
1193                                let strPwdGuide = "※ 비밀번호 ì˜
1193¤ë¥˜ìž…니다.(" + data.lockCnt + "/5)";
1194                                if (data.lockCnt == -1) {
1195                                    strPwdGuide = "아이디 또는 비밀번호 오류입니다.";
1196                                }
1197
1198                                document.getElementById(pwdGuideId).innerText = strPwdGuide;
1199                                document.getElementById(pwdGuideId).style.display = "block";
1200
1201                            } else {
1202                                alert("오류가 발생하였습니다. 잠시 후에 다시 시도 해주세요.")
1203                            }
1204                        }
1205                    }
1206
1207                },
1208                error: function () {
1209                    console.error();
1210                }
1211            });
1212        }
1213    }
1214
1215
1216    /*********** 로그인 관련 팝업 오픈*/
1217    /*
1218    * url: 팝업 url 문자열
1219    * request: 팝업 오픈시에 사용할 request
1220    * popupId: 팝업 오픈할 영역 id 문자열
1221    * */
1222    function loginOpenPopup(url, request, popupId) {
1223
1224        $.ajax({
1225            url: "/home/login/" + url + ".cm",
1226            type: "POST",
1227            dataType: "html",
1228            data: request,
1229            success: function (html) {
1230                //document.getElementById(popupId).innerHTML=html
1231                $("#" + popupId).html(html);
1232                showpop(popupId);
1233            },
1234            error: function () {
1235                console.error();
1236            }
1237        });
1238    }
1239
1240
1241
1242
1243
1244</script>
1244
1245
1246
1247<div class="wrap">
1248    <div id="topWrap">
1249        <div id="gnb">
1250            <header>
1251                <div class="sub_gnb_wrap_inner">
1252                    <h1 class="logo"><a href="/" id="mainHeader">대한 약사회</a></h1>
1253                    <nav class="util_nav">
1254                        <div class="utill-left">
1255                            <a href="" target="_blank"></a>
1256                            <a href="" target="_blank"></a>
1257                            <a href="" target="_blank"></a>
1258                            <div class="weather">
1259                                <div>
1260
1261                                </div>
1262                            </div>
1263                        </div>
1264                        <div class="util-right">
1265                            <ul>
1266                                <li id="btnUnityLogin"><a href="#a" class="login" onclick="openModal('unityMberLoginPopup');">로그인</a></li>
1267                                <li id="btnUnityLogout"><a href="#a" class="logout" onclick="fnLogout();">로그아웃</a></li>
1268                                <li id="btnUnityRegist"><a href="#a" class="register" onclick="openModal('unityMberRegistPopup')">회원등록</a>
1269                                </li>
1270                            </ul>
1271                            <div class="language" onclick="location.href='/home/eng/main.cm'">EN</div>
1272                        </div>
1273                    </nav>
1274                    <!--mobile drawer St-->
1275                    <div class="gnb-all all mobile">
1276                        <button type="button" class="gnb-all-btn" title="메뉴열기,닫기">
1277                            <span></span>
1278                            <span></span>
1279                            <span></span>
1280                        </button>
1281                    </div>
1282                    <!--//mobile drawer Ed-->
1283                </div>
1284                <div class="login-info-frame" id="divLoginMberInfo"></div>
1285                <nav class="sub_gnb_nav">
1286                    <div class="sub_gnb_nav_inner">
1287                        <ul class="gnbbox">
1288                        </ul>
1289                        <div class="gnb-all">
1290                            <button type="button" class="gnb-all-btn" title="메뉴열기">
1291                                <span></span>
1292                                <span></span>
1293                                <span></span>
1294                            </button>
1295                        </div>
1296                    </div>
1297                    <div class="navBg"></div>
1298                </nav>
1299            </header>
1300        </div>
1301    </div>
1302    
1303
1304        
1305            
1306                
1307
1308
1309
1310
1311
1312<link rel="stylesheet" type="text/css" href="/css/home/common-pop.css">
1313<script src="/js/coreframework/com/cmm.js;jsessionid=F118A797D3961BCD1A0DD21159AA7600"></script>
1313
1314
1315<style>
1316    /* === 배경 테마 팔레트 (kpaedu-box 공용) === */
1317    .kpaedu-box.kpaedu-theme-blue   {background:linear-gradient(135deg, #2d6acc, #5496ff);} /* 안전관리책임자 대면교육에 사용 */
1318    .kpaedu-box.kpaedu-theme-teal   {background:linear-gradient(135deg, #0e7c7b, #14b8a6);}
1319    .kpaedu-box.kpaedu-theme-emerald{background:linear-gradient(135deg, #065f46, #10b981);} /* 제조수입 교육에 사용 */
1320    .kpaedu-box.kpaedu-theme-purple {background:linear-gradient(135deg, #5b21b6, #a855f7);}
1321    .kpaedu-box.kpaedu-theme-indigo {background:linear-gradient(135deg, #312e81, #6366f1);}
1322    .kpaedu-box.kpaedu-theme-rose   {background:linear-gradient(135deg, #9f1239, #e11d48);}
1323    .kpaedu-box.kpaedu-theme-orange {background:linear-gradient(135deg, #c2410c, #f97316);}
1324    .kpaedu-box.kpaedu-theme-amber  {background:linear-gradient(135deg, #b45309, #f59e0b);}
1325    .kpaedu-box.kpaedu-theme-slate  {background:linear-gradient(135deg, #334155, #64748b);}
1326    .kpaedu-box.kpaedu-theme-navy   {background:linear-gradient(135deg, #0f172a, #1e3a8a);}
1327
1328    /* === 신규 배너 타이포 보정 (제목 가독성 강화) === */
1329    .kpaedu-box.kpaedu-mfr{padding:0 18px;}
1330    .kpaedu-box.kpaedu-mfr .kpaedu-year{font-size:13px;letter-spacing:-0.4px;}
1331    .kpaedu-box.kpaedu-mfr .kpaedu-limit{font-size:9.5px;padding:2px 8px 2px;margin-left:5px;}
1332    .kpaedu-box.kpaedu-mfr .kpaedu-title{font-size:1.08rem;letter-spacing:-0.8px;line-height:1.2;white-space:nowrap;}
1333    /* 일정 텍스트가 신청마감 배지(우측하단 절대배치)와 겹치지 않도록 우측 패딩 확보 + <br> 외 자동 줄바꿈 차단(nowrap) */
1334    .kpaedu-box.kpaedu-mfr .kpaedu-schedule{font-size:10.5px;letter-spacing:-0.4px;padding-right:72px;white-space:nowrap;}
1335    @media screen and (max-width:1200px){
1336        .kpaedu-box.kpaedu-mfr{padding:0 14px;}
1337        .kpaedu-box.kpaedu-mfr .kpaedu-title{font-size:0.95rem;}
1338        .kpaedu-box.kpaedu-mfr .kpaedu-year{font-size:12px;}
1339        .kpaedu-box.kpaedu-mfr .kpaedu-schedule{padding-right:68px;}
1340    }
1341    @media screen and (max-width:460px){
1342        .kpaedu-box.kpaedu-mfr{padding:0 12px;}
1343        .kpaedu-box.kpaedu-mfr .kpaedu-title{font-size:0.83rem;letter-spacing:-0.6px;}
1344        .kpaedu-box.kpaedu-mfr .kpaedu-year{font-size:11px;}
1345        .kpaedu-box.kpaedu-mfr .kpaedu-limit{font-size:9px;padding:2px 6px 1px;margin-left:4px;}
1346        .kpaedu-box.kpaedu-mfr .kpaedu-schedule{font-size:9.5px;padding-right:60px;}
1347        .kpaedu-box.kpaedu-mfr .kpaedu-badge{padding:4px 10px;font-size:10px;}
1348    }
1349</style>
1350
1351<!--<div class="layer-pop" id="centerLayPopUp">
1352<div class="layer-cont">
1353<div class="layer-box">
1354<div class="img-sec">
1355<img class="inline-block" src="/images/pop_250416.jpg" alt="공지" />
1356</div>
1357<div class="btn-sec">
1358<button type="button" id="btnSeeEachOtherToday">오늘 하루 보지않기</button>
1359<button type="button" id="btnClickAccept">닫기</button>
1360</div>
1361</div>
1362</div>
1363</div>-->
1364<div class="container">
1365    <div class="cont-top">
1366        <!--visual swiper St-->
1367        <div class="cont-visualbg cont-bg">
1368            <!--
1369                <div class="swiper main-visual-swiper">
1370                    <div class="swiper-wrapper visual-list">
1371
1372                    </div>
1373                </div>
1374            -->
1375        </div>
1376        <!--//visual swiper- Ed-->
1377        <div class="top-menu-box">
1378            <div class="menu-framebox">
1379                <div class="framebox-left">
1380                    <!--tab St-->
1381                    <div class="tab-menu">
1382                        <div><a href="#tab01"></a></div>
1383                        <div><a href="#tab02"></a></div>
1384                        <div><a href="#tab03"></a></div>
1385                        <div><a href="#tab04" class="active"></a></div>
1386                    </div>
1387                    <div class="tabcont">
1388
1389                        
1390                        <div id="tab01" class="tabh">
1391
1392                        </div>
1393
1394                        
1395                        <div id="tab02" class="tabh">
1396
1397                        </div>
1398
1399                        
1400                        <div id="tab03" class="tabh">
1401
1402                        </div>
1403
1404                        
1405                        <div id="tab04" class="tabh">
1406                            <div class="schedule">
1407                                <div class="month-box">
1408                                    <div class="month-top">
1409                                        <span class="month-title" id="scheduleTitle"></span>
1410                                    </div>
1411                                    <div class="schedule-swiper-box">
1412                                        <div class="swiper schedule-swiper">
1413                                            <div class="swiper-wrapper" id="scheduleList">
1414
1415                                            </div>
1416                                        </div>
1417                                        <div class="schdule_btn-box">
1418                                            <div class="swiper-button-prev schdule_btn"></div>
1419                                            <div class="swiper-button-next schdule_btn"></div>
1420                                        </div>
1421                                    </div>
1422                                </div>
1423                            </div>
1424                        </div>
1425                    </div>
1426                    <a href="#a" class="tab-more-btn mobile">더보기</a>
1427                    <!--tab Ed-->
1428                </div>
1429                <div class="framebox-right">
1430                    <div class="row-box">
1431                        <div class="col-box1">
1432                            <div class="quick-swiper-box">
1433                                <div class="quick-title">
1434                                    약사회원<br>
1435                                    Quick Menu
1436                                </div>
1437                                <div class="quick-swiper">
1438                                    <div class="swiper quick_Swiper-banner">
1439                                        <div class="swiper-wrapper" id="quickMenu">
1440
1441                                        </div>
1442                                    </div>
1443                                </div>
1444                            </div>
1445                        </div>
1446                        <div class="col-box2">
1447                            <div class="row-inner">
1448                                <div class="job-info swiper">
1449                                    <div class="swiper-wrapper" id="jobList">
1450                                    </div>
1451                                    
1452                                    
1453                                    
1454                                </div>
1455                                <div class="parmarcy-box">
1456
1457                                    <div class="parmarcy">
1458                                        <a href="/pharmFindPage.cm?menuCd=1002070000">
1459                                            <div class="pharmercy-title findmap">
1460                                                <strong>약국찾기</strong>
1461                                                주변약국 검색하기
1462                                            </div>
1463                                        </a>
1464                                    </div>
1465                                    <div class="parmarcy privacy" style="height:96px; overflow: hidden">
1466                                        <a href="javascript:;" onclick="fnLoginCheckAt()">
1467                                            <div class="pharmercy-title holiday">
1468                                                <strong>대한약사회지</strong>
1469                                                <span>E-BOOK</span>
1470                                            </div>
1471                                        </a>
1472                                        <!--<a href="https://privacy.kpanet.or.kr/" target="_blank">
1473                                            <div class="text-info">
1474                                                <span style="background-color: #155EDC; color:#ffffff; border-radius: 10px; padding: 3px 7px; font-size:12px;">2024년도</span> <span style="color:#155EDC; font-size: 13px;">9/4(수)~10/31(목)</span>
1475                                                <p>약국 개인정보보호 자율점검</p>
1476                                            </div>
1477                                        </a>-->
1478                                    </div>
1479                                </div>
1480                            </div>
1481                        </div>
1482                    </div>
1483                </div>
1484            </div>
1485            <!--section2 St-->
1486            <div class="section2 web">
1487                <div class="medicine-banner">
1488                    <div class="swiper medicine-banner-swiper">
1489                        <!-- [메인 배너 PC] 칸 배치와 렌더는 inc/mainBanner.jsp 의 SLOTS 에서 처리.
1490                             아래 고정 배너는 data-banner 키로 참조되며 이 마크업이 그대로 쓰인다 -->
1491                        <div class="swiper-wrapper js-banner-slots" data-device="Web">
1492                            <div class="swiper-slide" data-banner="mber">
1493                                <a href="https://member.kpanet.or.kr/" target='_blank'>
1494                                <!--<a href="https://privacy.kpanet.or.kr/" target='_blank'>-->
1495                                    <div class="medicine-box">
1496                                        <div class="text-info">
1497                                            <!--<span style="background-color: #0148BC; color:#ffffff; border-radius: 10px; padding: 3px 7px; font-size:12px;">2025년</span> <span style="color:#0148BC; font-size: 13px;">9/10(수) ~ 10/31(금)<strong class="main-banner-txt"></strong></span>
1498                                            <div class="bannret-title banner-title-sm">약국 개인정보 보호 자율점검</div>-->
1499                                            <span>회원신고 안내</span>
1500                                            <div class="bannret-title">회원신고</div>
1501                                        </div>
1502                                        <div class="iocn-box">
1503                                            <img src="/images/home/main/user-icon.svg" alt="" style="margin-top:6px;">
1504                                        </div>
1505                                    </div>
1506                                </a>
1507                            </div>
1508                            <div class="swiper-slide" data-banner="lcns">
1509                                <a href="https://license.kpanet.or.kr/">
1510                                    <div class="medicine-box">
1511                                        <div class="text-info">
1512                                            <span>면허신고 안내</span>
1513                                            <div class="bannret-title">약사 면허신고</div>
1514                                        </div>
1515                                        <div class="iocn-box">
1516                                            <img src="/images/home/main/license-icon.svg" alt="">
1517                                        </div>
1518                                    </div>
1519                                </a>
1520                                
1521                            </div>
1522                            <div class="swiper-slide" data-banner="cyber">
1523                                <a href="https://edu.kpanet.or.kr/cyber.cm">
1524                                    <div class="medicine-box">
1525                                        <div class="text-info">
1526                                            <span>온라인 연수교육</span>
1527                                            <div class="bannret-title">사이버연수원</div>
1528                                        </div>
1529                                        <div class="iocn-box">
1530                                            <img src="/images/home/main/cyber-edu-icon.svg" alt="" style="margin-top:3px;">
1531                                        </div>
1532                                    </div>
1533                                </a>
1534                            </div>
1535                        </div>
1536                    </div>
1537                </div>
1538            </div>
1539            <!--section2 Ed-->
1540            <!--top banner swiper St-->
1541            <div class="frame-absolute">
1542                <div class="bannerbox" id="mainswiper">
1543                    <div class="main-head swiper">
1544                        <div class="swiper-wrapper" id="pcBanner">
1545
1546                        </div>
1547                    </div>
1548                    <div class="main-swiper-hdn">
1549                        <div class="swiper-button-next hd_btn"></div>
1550                        <div class="swiper-button-prev hd_btn"></div>
1551                        <div class="m-s-page swiper-pagination-bar hd_bar"></div>
1552                        <div class="m-s-page2 swiper-pagination2 hd_bar2"></div>
1553                        <div class="btn-pause"></div>
1554                    </div>
1555                </div>
1556            </div>
1557            <!--//top banner swiper Ed-->
1558        </div>
1559    </div>
1560    <div class="section1">
1561        <div class="section-inner">
1562            <div class="medicine-info">
1563                <div class="medicine-title">
1564                    <h4>Health info</h4>
1565                    <div>
1566                        알아두면<br>
1567                        쓸모있는<br>
1568                        건강한<br>
1569                        의약품정보
1570                    </div>
1571                </div>
1572                <div class="ingfo-bg">
1573                    <div class="bg-grdient">
1574                        <a href="/medicineEatContentList.cm?menuCd=1002090000">
1575                            <div class="use01">
1576                                <span>더보기</span>
1577                                <div class="use-text">
1578                                    약의 효과를 높이고1<br>
1579                                    부작용을 줄이기 위한
1580                                    <h4>의약품 복용법</h4>
1581                                </div>
1582                            </div>
1583                        </a>
1584                        <a href="/medicineUsingContentList.cm?menuCd=1002100000">
1585                            <div class="use01">
1586                                <span>더보기</span>
1587                                <div class="use-text">
1588                                    올바른 사용으로<br>
1589                                    치료에 도움이 되는
1590                                    <h4>외용약 사용법</h4>
1591                                </div>
1592                            </div>
1593                        </a>
1594                    </div>
1595                </div>
1596            </div>
1597
1598            <!--section2 St-->
1599            <div class="section2 mo">
1600                <div class="medicine-banner">
1601                    <div class="swiper medicine-banner-swiper">
1602                        <!-- [메인 배너 MOBILE] 칸 배치와 렌더는 inc/mainBanner.jsp 의 SLOTS 에서 처리.
1603                             아래 고정 배너는 data-banner 키로 참조되며 이 마크업이 그대로 쓰인다 -->
1604                        <div class="swiper-wrapper js-banner-slots" data-device="Mo">
1605                            <div class="swiper-slide" data-banner="mber">
1606                                <a href="https://member.kpanet.or.kr/" target='_blank'>
1607                                    <!--<a href="https://privacy.kpanet.or.kr/" target='_blank'>-->
1608                                    <div class="medicine-box">
1609                                        <div class="text-info">
1610                                            <!--<span style="background-color: #0148BC; color:#ffffff; border-radius: 10px; padding: 3px 7px; font-size:12px;">2025년</span> <span style="color:#0148BC; font-size: 13px;">9/10(수) ~ 10/31(금)<strong class="main-banner-txt"></strong></span>
1611                                            <div class="bannret-title banner-title-sm">약국 개인정보 보호 자율점검</div>-->
1612                                            <span>회원 신고 안내</span>
1613                                            <div class="bannret-title">대한약사회 회원 신고</div>
1614                                        </div>
1615                                        <div class="iocn-box">
1616                                            <img src="/images/home/main/user-icon.svg" alt="" style="margin-top:6px;">
1617                                        </div>
1618                                    </div>
1619                                </a>
1620                            </div>
1621                            <div class="swiper-slide" data-banner="lcns">
1622                                <a href="https://license.kpanet.or.kr/">
1623                                    <div class="medicine-box">
1624                                        <div class="text-info">
1625                                            <span>면허 신고 안내</span>
1626                                            <div class="bannret-title">약사 면허 신고</div>
1627                                        </div>
1628                                        <div class="iocn-box">
1629                                            <img src="/images/home/main/license-icon.svg" alt="">
1630                                        </div>
1631                                    </div>
1632                                </a>
1633                                
1634                            </div>
1635                            <div class="swiper-slide" data-banner="cyber">
1636                                <a href="https://edu.kpanet.or.kr/cyber.cm">
1637                                    <div class="medicine-box">
1638                                        <div class="text-info">
1639                                            <span>온라인 연수교육</span>
1640                                            <div class="bannret-title">대한약사회 사이버연수원</div>
1641                                        </div>
1642                                        <div class="iocn-box">
1643                                            <img src="/images/home/main/cyber-edu-icon.svg" alt="" style="margin-top:3px;">
1644                                        </div>
1645                                    </div>
1646                                </a>
1647                            </div>
1648                        </div>
1649                    </div>
1650                </div>
1651            </div>
1652            <!--section2 Ed-->
1653            
1654            
1655
1656<script>
1657(function () {
1658
1659    const NOW = new Date();
1660
1661    /* 지정 구간 안이면 true. 배너를 기간에 맞춰 자동으로 갈아 끼울 때 쓴다 */
1662    function between(from, to) {
1663        return NOW >= new Date(from) && NOW < new Date(to);
1664    }
1665
1666    /* ===== 칸 배치 — 배너 교체 시 이 배열만 수정 =====
1667       동적 배너 키 : 아래 BANNERS 에 정의된 항목을 그 칸에 렌더
1668       고정 배너 키 : mber(회원신고), lcns(면허신고), cyber(사이버연수원)
1669       null         : 그 칸을 제거 (PC 는 4칸 고정 배치라 한 칸이 빈 공간으로 남음)
1670    */
1671    const SLOTS = [
1672        'privacy',
1673        /* 관리약사 교육 게시 구간에만 회원신고를 내리고 그 자리에 올린다 */
1674        between('2026-10-12T09:00:00+09:00', '2026-11-21T00:00:00+09:00') ? 'mfr' : 'mber',
1675        'lcns',
1676        'cyber'
1677    ];
1678
1679    /* ===== 배너 정의 (설명 없는 항목은 이름 그대로) =====
1680       rows        : 배너 아래 두 줄. [앞머리 표식, 내용]
1681       openStart / openEnd : 배지 단계를 가르는 기준 시각 (표시 문구가 아니라 판정용)
1682       labels      : 단계별 배지 문구. cert 가 '' 이면 수료증 단계 없음
1683       certReady   : certDate 와 무관하게 즉시 수료증 단계로 전환
1684       earlyClosed : 기간이 남아도 즉시 종료 단계로 전환 (정원 마감 등)
1685    */
1686    const BANNERS = {
1687
1688        /* 약국 개인정보보호 자율점검 — 수료증 단계 없음 */
1689        privacy: {
1690            round:   '',
1691            tag:     '회원약국 대상',
1692            title:   '약국 개인정보보호 자율점검',
1693            theme:   'kpaedu-theme-indigo',
1694            rows: [
1695                ['기간', '9.21(월) ~ 10.31(토)'],
1696                ['점검', '온라인 자율점검 시스템']
1697            ],
1698            openStart: '2026-09-21T00:00:00+09:00',
1699            openEnd:   '2026-11-01T00:00:00+09:00',
1700            url:       'https://privacy.kpanet.or.kr/',
1701            labels:    { before: '참여하기', open: '참여하기', closed: '점검종료', cert: '' },
1702            certUrl:   '',
1703            certDate:  '',
1704            certReady:   false,
1705            earlyClosed: false
1706        },
1707
1708        /* 제조·수입업체 관리약사 연수교육 (연 4회, 회차는 round 값) */
1709        mfr: {
1710            round:   '제4차',
1711            tag:     '선착순 700명',
1712            title:   '제조·수입업체 관리약사 연수교육',
1713            theme:   'kpaedu-theme-emerald',
1714            rows: [
1715                ['접수', '10.12(월) 09:00 ~ 10.16(금) 18:00'],
1716                ['교육', '10.28(수) 09:00 ~ 18:00']
1717            ],
1718            openStart: '2026-10-12T09:00:00+09:00',
1719            openEnd:   '2026-10-16T18:00:00+09:00',
1720            url:       'https://www.kpaedu.online',
1721            labels:    { before: '신청하기', open: '신청하기', closed: '신청마감', cert: '수료증' },
1722            certUrl:   'https://edu.kpanet.or.kr/cyberedu/myclass/extraCert/list.cm?type=MFG',
1723            certDate:  '2026-11-10T00:00:00+09:00',
1724            certReady:   false,
1725            earlyClosed: false
1726        },
1727
1728        /* 안전관리책임자 대면교육 (연 1회) */
1729        smotrp: {
1730            round:   '',
1731            tag:     '선착순 90명',
1732            title:   '안전관리책임자 대면교육',
1733            theme:   'kpaedu-theme-blue',
1734            rows: [
1735                ['접수', '4.13(월) 09:00 ~ 4.17(금) 18:00'],
1736                ['교육', '4.29(수) 09:00 ~ 4.30(목)']
1737            ],
1738            openStart: '2026-04-13T09:00:00+09:00',
1739            openEnd:   '2026-04-17T18:00:00+09:00',
1740            url:       '',
1741            labels:    { before: '신청하기', open: '신청하기', closed: '신청마감', cert: '수료증' },
1742            certUrl:   'https://edu.kpanet.or.kr/cyberedu/myclass/extraCert/list.cm?type=SMOTRP',
1743            certDate:  '',
1744            certReady:   false,
1745            earlyClosed: false
1746        }
1747    };
1748
1749    /* 판정 순서 : 수료증 → 종료 → 시작 전 → 진행 중 */
1750    function resolve(banner) {
1751        const now    = new Date();
1752        const start  = new Date(banner.openStart);
1753        const end    = new Date(banner.openEnd);
1754        const certAt = banner.certDate ? new Date(banner.certDate) : null;
1755        const certOpen = !!banner.labels.cert
1756                      && (banner.certReady || (certAt !== null && now >= certAt));
1757
1758        const view = {
1759            headLine:   start.getFullYear() + '년' + (banner.round ? ' ' + banner.round : ''),
1760            theme:      banner.theme,
1761            url:        banner.url,
1762            badgeClass: '',
1763            phase:      ''
1764        };
1765
1766        if (certOpen) {
1767            view.phase      = 'cert';
1768            view.badgeText  = banner.labels.cert;
1769            view.badgeClass = 'cert';
1770            view.url        = banner.certUrl;
1771        } else if (banner.earlyClosed || now >= end) {
1772            view.phase      = 'closed';
1773            view.badgeText  = banner.labels.closed;
1774            view.badgeClass = 'closed';
1775        } else if (now < start) {
1776            view.phase     = 'before';
1777            view.badgeText = banner.labels.before;
1778        } else {
1779            view.phase     = 'open';
1780            view.badgeText = banner.labels.open;
1781        }
1782        return view;
1783    }
1784
1785    /* 동적 배너가 한 화면에 둘 이상 배치 가능, id 에 배너 키 추가 */
1786    function buildHtml(key, banner, view, device) {
1787        let rowsHtml = '';
1788        for (let i = 0; i < banner.rows.length; i++) {
1789            rowsHtml += '<span>' + banner.rows[i][0] + '</span> ' + banner.rows[i][1];
1790            if (i < banner.rows.length - 1) rowsHtml += '<br>';
1791        }
1792
1793        const idSuffix = device + '-' + key;
1794
1795        return '' +
1796        '<div class="swiper-slide">' +
1797          '<a href="' + view.url + '" target="_blank" id="kpaBanner' + idSuffix + '">' +
1798            '<div class="medicine-box kpaedu-box kpaedu-mfr ' + view.theme + '">' +
1799              '<div class="text-info">' +
1800                '<div class="kpaedu-year">' + view.headLine +
1801                  (banner.tag ? ' <em class="kpaedu-limit">' + banner.tag + '</em>' : '') +
1802                '</div>' +
1803                '<div class="bannret-title kpaedu-title">' + banner.title + '</div>' +
1804                '<div class="kpaedu-schedule">' + rowsHtml + '</div>' +
1805              '</div>' +
1806              '<div class="kpaedu-badge ' + view.badgeClass + '" id="kpaBannerBadge' + idSuffix + '">' +
1807                view.badgeText +
1808              '</div>' +
1809            '</div>' +
1810          '</a>' +
1811        '</div>';
1812    }
1813
1814    /* 고정 배너는 HomeMain.jsp 의 마크업을 그대로 옮겨 담는다.
1815       정의가 JSP 한 곳에만 있어 링크와 PC/모바일 문구 차이가 저절로 유지된다 */
1816    const views    = {};
1817    const wrappers = document.querySelectorAll('.js-banner-slots');
1818
1819    for (let w = 0; w < wrappers.length; w++) {
1820        const wrapper = wrappers[w];
1821        const device  = wrapper.getAttribute('data-device') || '';
1822
1823        const fixed = {};
1824        const fixedNodes = wrapper.querySelectorAll('[data-banner]');
1825        for (let i = 0; i < fixedNodes.length; i++) {
1826            fixed[fixedNodes[i].getAttribute('data-banner')] = fixedNodes[i].outerHTML;
1827        }
1828
1829        let html = '';
1830        for (let s = 0; s < SLOTS.length; s++) {
1831            const key = SLOTS[s];
1832            if (!key) continue;
1833
1834            if (fixed[key]) {
1835                html += fixed[key];
1836                continue;
1837            }
1838
1839            const banner = BANNERS[key];
1840            if (!banner) continue;
1841            if (!views[key]) views[key] = resolve(banner);
1842            html += buildHtml(key, banner, views[key], device);
1843        }
1844
1845        wrapper.innerHTML = html;
1846
1847        // 시작 전에 배너 클릭으로 이동하는 것을 막고 싶으면 아래 블록의 주석을 해제할 것
1848        // for (let s = 0; s < SLOTS.length; s++) {
1849        //     const key = SLOTS[s];
1850        //     if (!key || !views[key] || views[key].phase !== 'before') continue;
1851        //     const openText = BANNERS[key].rows[0][1].split('~')[0].trim();   // 예: "10.12(월) 09:00"
1852        //     wrapper.querySelector('#kpaBanner' + device + '-' + key).addEventListener('click', function (e) {
1853        //         e.preventDefault();
1854        //         alert(BANNERS[key].title + ' 은(는) ' + openText + ' 부터 가능합니다.');
1855        //     });
1856        // }
1857    }
1858})();
1859</script>
1859
1860
1861            <div class="attent-info">
1862                <h3>위해 의약품 회수 정보<a href="/boardList.cm?menuCd=1002130000" class="attent-info-more"><i>MORE</i></a></h3>
1863                <div class="attent-info-swiper">
1864                    <div class="swiper attent-info-list">
1865                        <div class="swiper-wrapper">
1866
1867                        </div>
1868                    </div>
1869                </div>
1870            </div>
1871        </div>
1872    </div>
1873
1874</div>
1875<script>
1876
1877    $(document).ready(() => {
1878        fnSelectMainMenu();
1879        fnSelectVisual();
1880        fnSelectMainBanner();
1881        fnSelectQuickMenu();
1882        fnSchedule();
1883        openMainPopups();
1884        // fncFixedFooterBanner();
1885        fnSelectRecruit();
1886
1887        fnBoardNotice();
1888        fnMainBroadCast();
1889        fnMainNews();
1890        fnRecallMedication();
1891
1892        // let date1 = new Date();
1893        // let date2 = new Date(2024, 2, 1);
1894        // if (date1.getTime() < date2.getTime()) {
1895        //     window.open('/popup/20240122/popup_240122.html', 'popup_20240122', 'width=450px, height=600px, scrollbars=yes');
1896        // }
1897
1898        // if (!getCookie('hideTodayPopup')) {
1899        //     window.open('/popup/20251204/popup_251204.html', 'customPopup251204', 'width=570px, height=660px, scrollbars=no');
1900        // }
1901
1902        // if (!getCookie('hideTodayPopup2')) {
1903        //     window.open('/popup/20240122/popup_250417.html', '_blank', 'width=560px, height=380px, scrollbars=no');
1904        // }
1905
1906        // HomeMainCustomPopup.jsp 팝업 표시
1907        //if (!getCookie('popupCookie1')) {
1908        //window.open('/1/homeOpenCustomPopup.cm?filePath=/images/parthome/pop/2025_privacy/privacy_title.png&popupName=2025년 약국 개인정보보호 자율점검 실시 안내&linkUrl=', 'HomeMainCustomPopup1', 'width=620, height=600, top=100, left=100, scrollbars=yes, alwaysRaised=yes, z-lock=yes');
1909        //}
1910        // // HomeMainCustomPopup2.jsp 팝업 표시
1911        // if (!getCookie('popupCookie2')) {
1912        //     window.open('/2/homeOpenCustomPopup2.cm?filePath=/images/parthome/pop/20250911_popup.jpg&popupName=약사전문인배상책임보험 보험사 선정 입찰공고&linkUrl=', 'HomeMainCustomPopup2', 'width=620, height=600, top=300, left=650, scrollbars=yes, alwaysRaised=yes, z-lock=yes');
1913        // }
1914
1915        //if (!getCookie('hideTodayPopup3')) {
1916        //    window.open('/popup/20250925/popup_250925.html', '_blank', 'width=530px, height=610px, scrollbars=yes');
1917        //}
1918        // if (!getCookie('hideTodayPopup4')) {
1919        //     window.open('/popup/20251030/popup_251029.html', '_blank', 'width=570px, height=565px, scrollbars=yes');
1920        // }
1921
1922        // if (!getCookie('hideTodayPopup3')) {
1923        //     window.open('/popup/20240122/popup_250520.html', '_blank', 'width=560px, height=380px, scrollbars=no');
1924        // }
1925
1926    });
1927
1928    function getCookie(name) {
1929
1930        const cookieString = document.cookie;
1931        const cookies = cookieString.split('; '); // 쿠키를 '; '로 나눔
1932
1933        for (const cookie of cookies) {
1934            const [key, value] = cookie.split('=');
1935            if (key === name) {
1936                return decodeURIComponent(value); // 필요시 decode
1937            }
1938        }
1939        return null; // 못 찾았을 경우
1940    }
1941
1942    /***************************************************
1943     * 유튜브 영상 팝업
1944     *   - 영상 교체 : vid · ck · title 세 값 변경
1945     * *************************************************/
1946    function openYoutubePopup() {
1947        const vid   = '2kI-aqtrG4c';                       // YouTube 영상 ID
1948        const ck    = '260616';                            // 업로드 날짜(쿠키/윈도우명 캠페인 식별자)
1949        const title = '보이지 않는 위기가구, 약국이 먼저 찾는다'; // 팝업 상단 타이틀
1950        if (getCookie('hideTodayPopup_' + ck)) return;     // '오늘 그만보기' 쿠키 있으면 스킵
1951
1952        const popW = 641, popH = 421;
1953        const popLeft = window.screenX + 20;
1954        const popTop = window.screenY + 80;
1955        const popUrl = '/popup/video/popup_youtube.html'
1956                   + '?vid=' + vid
1957                   + '&ck=' + ck
1958                   + '&title=' + encodeURIComponent(title);
1959        const popWin = window.open(popUrl, 'popup_' + ck, 'width=' + popW + ',height=' + popH + ',scrollbars=no,left=' + popLeft + ',top=' + popTop);
1960        if (popWin) popWin.focus();
1961    }
1962
1963    /***************************************************
1964     * 개인정보보호 자율점검 팝업
1965     * *************************************************/
1966    function openPrivacyPopup() {
1967        const ck    = 'privacy2026';                           // 쿠키 및 창 이름 식별자
1968        const start = new Date('2026-09-21T00:00:00+09:00');   // 게시 시작일
1969        const end   = new Date('2026-11-01T00:00:00+09:00');   // 게시 종료일 (10.31 자정까지 노출)
1970        const now   = new Date();
1971
1972        if (now < start || now >= end) return;                 // 게시 기간 밖이면 미노출
1973        if (getCookie('hideTodayPopup_' + ck)) return;         // '오늘 하루 보지않기' 를 누른 경우
1974
1975        const popW = 640, popH = 860;
1976        const popLeft = window.screenX + 20;
1977        const popTop  = window.screenY + 40;
1978        const popUrl  = '/popup/20260921/popup_260921.html';
1979        const popWin  = window.open(popUrl, 'popup_' + ck,
1980            'width=' + popW + ',height=' + popH + ',left=' + popLeft + ',top=' + popTop + ',scrollbars=yes');
1981        if (popWin) popWin.focus();
1982    }
1983
1984    /***************************************************
1985     * 채용 정보 조회
1986     * *************************************************/
1987    function fnSelectRecruit() {
1988
1989        $.ajax({
1990
1991            // url: '/partMainRecruit.cm',
1992            // data: {menuCd: 1002200000},
1993
1994            url: '/partMainGallery.cm',
1995            data: {menuCd: 1003980000},
1996            success: function (resultData) {
1997
1998                let content = "";
1999                if (resultData.list.length > 0) {
2000
2001
2002                    resultData.list.forEach(function (el, index) {
2003                        // if (index === 0) {
2004
2005                        content += `
2006                                    <div class="swiper-slide">
2007                                       <dl>
2008                                            <a href="/gallery.cm?menuCd=1003980000&boardSeq=${el.boardSeq}" style="position: relative;">
2009                                                <div class="photo-news-txt">
2010                                                   <p>${el.bdTitle}</p>
2011<!--                                                    <img src="/images/home/main/icon_arrow.png"/>-->
2012                                                </div>
2013                                                <div class="photo-news" style="height: 202px;">
2014                                                    <img src="https://www.kpanet.or.kr${el.filePath}" alt="">
2015                                                </div>
2016                                            </a>
2017                                        </dl>
2018                                    </div>`;
2019//                                     <dl>
2020//                                         <a href="/gallery.cm?menuCd=1003980000&boardSeq=${el.boardSeq}" >
2021// <!--                                            <dd class="copy-text">${el.bdTitle}</dd>-->
2022//                                             <dd class="photo-news" style="height: 202px;">
2023//                                                 <img src="https://www.kpanet.or.kr${el.filePath}" alt="" style="background: linear-gradient(to bottom, rgba(217,217,217,0) 0%, rgba(0,0,0,0.9) 100%);">
2024//                                             </dd>
2025//                                             <div class="photo-news-title" style="display: flex; align-items: center; gap:30px;">
2026//                                                 <div class="txt">
2027//                                                     <p>${el.bdTitle}${el.bdTitle}</p>
2028//                                                 </div>
2029//                                                 <div style="width: 10px;">
2030//                                                     <img src="/images/home/main/icon_arrow.png"/>
2031//                                                 </div>
2032//                                             </div>
2033//                                         </a>
2034//                                     </dl>`;
2035
2036                        // content += `
2037                        //        <h4>채용정보<a href="/homeRecruitList.cm?menuCd=1002200000">더보기</a></h4>
2038                        //        <dl>
2039                        //             <a href="/homeRecruit.cm?menuCd=1002200000&empmnSeq=${el.empmnSeq}">
2040                        //                 <dt><span>${el.wrkplcType}</span> ${el.wrkplcName}</dt>
2041                        //                 <dd class="copy-text">${el.empmnTitle}</dd>
2042                        //                 <dd class="local">
2043                        //                     ${el.wrkplcAdress2}
2044                        //                     <span>${el.empmnEndDt} 까지</span>
2045                        //                 </dd>
2046                        //             </a>
2047                        //         </dl>`
2048                        // }
2049                    });
2050
2051                    // const jobInfoSwiper = new Swiper('.job-info', {
2052                    //     slidesPerView: 1,
2053                    //     spaceBetween: 10,
2054                    //     loop: true,
2055                    //     navigation: {
2056                    //         nextEl: '.job-info .swiper-button-next',
2057                    //         prevEl: '.job-info .swiper-button-prev',
2058                    //     },
2059                    // });
2060
2061                    // console.log(content);
2062                    document.querySelector(".job-info .swiper-wrapper").innerHTML = content;
2063                    let swiper = new Swiper('.job-info', {
2064                        slidesPerView: 1,
2065                        spaceBetween: 10,
2066                        loop: true,
2067                        autoplay: {
2068                            delay: 1 * 5000,
2069                            disableOnInteraction: false,
2070                        },
2071                        // pagination: {
2072                        //     el: ".swiper-pagination",
2073                        // },
2074                        // navigation: {
2075                        //     nextEl: '.job-info .swiper-button-next',
2076                        //     prevEl: '.job-info .swiper-button-prev',
2077                        // },
2078                    });
2079
2080                } else {
2081                    content += `
2082                            <h4>채용정보<a href="/homeRecruitList.cm?menuCd=1002200000">더보기</a></h4>
2083                            <div class="none_contentt">게시글이 없습니다.</div>
2084                             `
2085                    document.querySelector(".job-info .swiper-wrapper").innerHTML = content;
2086                }
2087            },
2088            error: function (xhr) {
2089                console.error(xhr);
2090            }
2091        })
2092    }
2093
2094    /***************************************************
2095     * 메인메뉴 조회
2096     * *************************************************/
2097    function fnSelectMainMenu() {
2098        $.ajax({
2099            url: "/mainMenuList.cm",
2100            data: {hpageId: 0},
2101            type: "POST",
2102            success: function (resultData) {
2103                const tabMenu = document.querySelectorAll('.tab-menu>div>a');
2104                const moreBtn = document.querySelector('.tab-more-btn');
2105
2106                moreBtn.setAttribute("href", resultData.list[0].menuUrl);
2107                tabMenu.forEach((item, idx) => {
2108                    item.innerText = resultData.list[idx].menuNm;
2109                    item.id = resultData.list[idx].menuCd;
2110
2111                    item.addEventListener("click", function (event) {
2112                        const clickTabMenu = resultData.list.filter(filterItem =>
2113                            filterItem.menuCd === Number(event.target.id));
2114
2115                        if (clickTabMenu.length > 0) {
2116                            moreBtn.setAttribute("href", clickTabMenu[0].menuUrl);
2117                        }
2118                    });
2119                });
2120            },
2121            error: function (xhr) {
2122                console.error(xhr);
2123            }
2124        });
2125
2126    }
2127
2128
2129    /***************************************************
2130     * 메인 팝업 열기 (노출 순서 지정)
2131     *   - 순서대로 오픈됨 (나중에 오픈 될수록 상단에 표시)
2132     * *************************************************/
2133    function openMainPopups() {
2134        fnSelectPopup()                     // 1) 관리자 등록 팝업 (가장 뒤)
2135            //.then(openYoutubePopup)       // 2) 유튜브 영상 팝업
2136            .then(openPrivacyPopup);        // 3) 자율점검 팝업    (가장 앞)
2137    }
2138
2139    /***************************************************
2140     * 팝업 조회
2141     *   - 창 오픈 완료 후 알림 (openMainPopups 순서 제어용)
2142     * *************************************************/
2143    function fnSelectPopup() {
2144        return new Promise(function (resolve) {
2145            $.ajax({
2146                url: "/mainPopupList.cm",
2147                data: {hpageId: 0},
2148                type: "POST",
2149                success: function (resultData) {
2150
2151                    createHomeOpenPopup(resultData.list).then(resolve);
2152
2153                },
2154                error: function (xhr) {
2155                    console.error(xhr);
2156                    resolve();      // 조회 실패해도 뒤따르는 팝업은 오픈
2157                }
2158            });
2159        });
2160    }
2161
2162    /***************************************************
2163     * 팝업 쿠키 생성
2164     * *************************************************/
2165    function fnTodayDisable(popupSeq) {
2166
2167        let value = 'popupCookie';
2168
2169        let expires = "";
2170        let date = new Date();
2171        date.setTime(date.getTime() + 1000 * 60 * 60 * 24);
2172        expires = "; expires=" + date.toUTCString();
2173
2174        document.cookie = "popupCookie" + popupSeq + "=" + (value || "") + expires + "; path=/";
2175
2176    }
2177
2178    /***************************************************
2179     * 비주얼 조회
2180     * *************************************************/
2181    function fnSelectVisual() {
2182        $.ajax({
2183            url: "/mainVisualList.cm",
2184            data: {hpageId: 0},
2185            type: "POST",
2186            success: function (resultData) {
2187
2188                /** 한 홈페이지 내에서 전환 시간은 동일하므로 첫번째 값만 사용 */
2189                visualSwiper(resultData.list[0].transitionTime)
2190
2191                let content = '';
2192                resultData.list.forEach((elem, index) => {
2193                    if (elem.visualFile[0] !== "") {
2194                        const imgUrl = '' + elem.visualFile[0].filePath;
2195
2196                        /** 해당 url 부분의 빨간줄은 무시 */
2197                        content += `<div class="swiper-slide" style="background-image:url('${imgUrl}')"></div>`;
2198                    }
2199                });
2200
2201                try {
2202                    document.querySelector('.visual-list').innerHTML = content;
2203                } catch (e) {
2204                    console.log(e);
2205                }
2206
2207            },
2208            error: function (xhr) {
2209                console.error(xhr);
2210            }
2211        });
2212    }
2213
2214
2215    /***************************************************
2216     * 배너 조회
2217     * *************************************************/
2218    function fnSelectMainBanner() {
2219        $.ajax({
2220            url: "/mainBannerList.cm",
2221            type: 'POST',
2222            data: {
2223                hpageId: 0,
2224                bannerType: 'M'
2225            },
2226            type: "POST",
2227            success: function (resultData) {
2228                let content = "";
2229
2230                if (resultData.list.length <= 1) {
2231                    document.querySelector(".main-swiper-hdn").style.display = 'none';
2232                } else {
2233                    document.querySelector(".main-swiper-hdn").style.display = 'block';
2234                }
2235
2236                if (resultData.list.length > 0) {
2237
2238                    resultData.list.forEach((elem, index) => {
2239
2240                        let pcImgUrl;
2241                        let mbImgUrl;
2242
2243                        elem.bannerFiles.forEach((el) => {
2244
2245                            if (el.deviceCode === 'pc') {
2246                                pcImgUrl = '' + el.filePath;
2247                            } else {
2248                                mbImgUrl = '' + el.filePath;
2249                            }
2250                        });
2251
2252                        if (elem.bannerFile !== "") {
2253
2254                            let pattern = /https?:\/\/(?:www\.)?[^\s]+/g;
2255                            let matchUrl = '';
2256                            if (elem.linkAddr !== null && elem.linkAddr !== '') {
2257                                matchUrl = elem.linkAddr.match(pattern);
2258                            }
2259
2260                            /** linkUrl의 값이 url 형태일 때만 새탭 띄우기 */
2261                            if (matchUrl !== null && matchUrl !== '') {
2262                                content +=
2263                                    `<div class="swiper-slide">
2264                                <div class="main-img-box">
2265                                    <a href="${elem.linkAddr}" target="_blank">
2266                                        <div class="mainimgbox">
2267                                            <img src="${pcImgUrl}" alt="">
2268                                        </div>
2269                                        <div class="mainimgbox mobile">
2270                                            <img src="${mbImgUrl}" alt="">
2271                                        </div>
2272                                    </a>
2273                                </div>
2274                            </div>`
2275                            } else {
2276                                content +=
2277                                    `<div class="swiper-slide">
2278                                    <div class="main-img-box">
2279                                        <div class="mainimgbox">
2280                                            <img src="${pcImgUrl}" alt="">
2281                                        </div>
2282                                        <div class="mainimgbox mobile">
2283                                            <img src="${mbImgUrl}" alt="">
2284                                        </div>
2285                                    </div>
2286                                </div>`
2287                            }
2288
2289                        }
2290
2291                    });
2292
2293                    /** 데이터가 없을 경우 기본 배너 이미지 노출 */
2294                } else {
2295                    content +=
2296                        `<div class="swiper-slide">
2297                                    <div class="main-img-box">
2298                                        <div class="mainimgbox">
2299                                            <img src="/images/home/main/banner.png" alt="">
2300                                        </div>
2301                                        <div class="mainimgbox mobile">
2302                                            <img src="/images/home/main/visual_main_mo.png" alt="">
2303                                        </div>
2304                                    </div>
2305                                </div>`
2306                }
2307                document.getElementById("pcBanner").innerHTML = content;
2308            },
2309            error: function (xhr) {
2310                console.error(xhr);
2311            }
2312        });
2313
2314    }
2315
2316    /***************************************************
2317     * 퀵메뉴 조회
2318     * *************************************************/
2319    function fnSelectQuickMenu() {
2320        $.ajax({
2321            url: "/mainQuickMenuList.cm",
2322            data: {
2323                quickMenuType: 'A',
2324                hpageId: 0
2325            },
2326            type: "POST",
2327            success: function (resultData) {
2328                let content = "";
2329                resultData.list.forEach((elem, index) => {
2330                    /**
2331                     *  이미지 URL에는 menuCd가 들어있으므로 해당 값으로 실제 경로 조회
2332                     *      -> allMenuInfo(전역변수,객체)에 menuCd로 menuUrl을 취득
2333                     */
2334                    if (elem.linkType === '1') { //내부 메뉴
2335                    }
2336
2337                    if (elem.visualFile !== "") {
2338
2339                        let imgUrl = '' + elem.quickMenuFiles[0].filePath;
2340
2341                        if (elem.linkType === '1') {
2342                            content +=
2343                                `<div class="quickmenu-slide swiper-slide">
2344                            <a href="${elem.linkUrl}">
2345                                <div class="quickmenu-item">
2346                                    <div class="mbox">
2347                                        <img src="${imgUrl}" alt="">
2348                                    </div>
2349                                    <div class="mbox-title">${elem.quickMenuTitle}</div>
2350                                </div>
2351                            </a>
2352                        </div>`
2353                        } else {
2354                            content +=
2355                                `<div class="quickmenu-slide swiper-slide">
2356                            <a href="${elem.linkUrl}" target='_blank'>
2357                                <div class="quickmenu-item">
2358                                    <div class="mbox">
2359                                        <img src="${imgUrl}" alt="">
2360                                    </div>
2361                                    <div class="mbox-title">${elem.quickMenuTitle}</div>
2362                                </div>
2363                            </a>
2364                        </div>`
2365                        }
2366
2367                    }
2368                });
2369
2370                document.getElementById("quickMenu").innerHTML = content;
2371
2372            },
2373            error: function (xhr) {
2374                console.error(xhr);
2375            }
2376        });
2377
2378    }
2379
2380    /***************************************************
2381     * 게시물 조회 API
2382     *  - 공지사항 - 1002010000
2383     *  - 보도자료 - 1001300000
2384     *  - 뉴스 스크랩 - 1001310000
2385     *  - 의약품 회수 - 1001600000
2386     * *************************************************/
2387
2388
2389    /***************************************************
2390     * 의약품 회수 조회
2391     * *************************************************/
2392    function fnRecallMedication(menuCd) {
2393        $.ajax({
2394            url: "/mainBoard.cm?",
2395            type: "POST",
2396            data: {menuCd: 1002130000},
2397            success: function (resultData) {
2398
2399                let content = '';
2400
2401                if (resultData.list.length === 0) {
2402                    content = `<ul class="tab-list-box nodata-box">
2403                                    <li class="list-title nodata">
2404                                        <img src="/images/parthome/common/no-file.svg">게시물이 없습니다.
2405                                    </li>
2406                                </ul>`
2407                } else {
2408                    resultData.list.forEach((el, index) => {
2409
2410                        content += `<div class="swiper-slide">
2411                                <a href="/board.cm?menuCd=1002130000&boardSeq=${el.boardSeq}&tabYn=Y">
2412                                    <div class="attentat-medicine">
2413                                        <div class="attentat-medicine-box">
2414                                            <dl>
2415                                                <dt class="date">${el.regDt.substring(0,10)}</dt>
2416                                                <dd class="medicine-name">
2417                                                    <span>
2418                                                        ${el.bdTitle}
2419                                                    </span>
2420                                                </dd>
2421                                            </dl>
2422                                        </div>
2423                                    </div>
2424                                </a>
2425                            </div>`
2426
2427                    });
2428                }
2429
2430                document.querySelector(".attent-info-list .swiper-wrapper").innerHTML = content;
2431                fncFixedFooterBanner();
2432            },
2433            error: function (xhr) {
2434                console.error(xhr)
2435            }
2436        })
2437    }
2438
2439    /***************************************************
2440     * 공지사항 조회
2441     * *************************************************/
2442    function fnBoardNotice(menuCd) {
2443
2444        $.ajax({
2445            url: "/mainBoard.cm?",
2446            type: "POST",
2447            data: {menuCd: 1002010000},
2448            success: function (resultData) {
2449                /** 공지사항 세팅 */
2450                let noticeCont = '';
2451
2452                if (resultData.list.length === 0) {
2453                    noticeCont = `<ul class="tab-list-box nodata-box">
2454                                    <li class="list-title nodata">
2455                                        <img src="/images/parthome/common/no-file.svg">게시글이 없습니다.
2456                                    </li>
2457                                </ul>`
2458                } else {
2459                    resultData.list.forEach((el, index) => {
2460
2461                        const regDt = new Date(el.regDt);
2462                        const diffDays = (Date.now() - regDt) / (1000 * 60 * 60 * 24);
2463
2464                        /** newIcon 있음 */
2465                        if (diffDays <= 3) {
2466                            noticeCont += `<ul class="tab-list-box">
2467                                          <li class="list-date">
2468                                                ${el.regDt.substring(0,10)}<img src="/images/home/main/icon_New.png" alt="new">
2469                                          </li>
2470                                          <li class="list-title">
2471                                            <a href="/board.cm?menuCd=1002010000&boardSeq=${el.boardSeq}&tabYn=Y">${el.bdTitle}</a>
2472                                          </li>
2473                                     </ul>`
2474                            /** newIcon 없음 */
2475                        } else {
2476                            noticeCont += `<ul class="tab-list-box">
2477                                      <li class="list-date">
2478                                            ${el.regDt.substring(0,10)}
2479                                      </li>
2480                                      <li class="list-title">
2481                                        <a href="/board.cm?menuCd=1002010000&boardSeq=${el.boardSeq}&tabYn=Y">${el.bdTitle}</a>
2482                                      </li>
2483                                  </ul>`
2484                        }
2485                    });
2486
2487                }
2488
2489                document.getElementById("tab01").innerHTML = noticeCont;
2490            },
2491            error: function (xhr) {
2492                console.error(xhr)
2493            }
2494        })
2495    }
2496
2497    /***************************************************
2498     * 보도자료 조회
2499     * *************************************************/
2500    function fnMainBroadCast(menuCd) {
2501
2502        $.ajax({
2503            url: "/mainBoard.cm?",
2504            type: "POST",
2505            data: {menuCd: 1002020000},
2506            success: function (resultData) {
2507
2508                let pressReleaseCont = '';
2509
2510                if (resultData.list.length === 0) {
2511                    pressReleaseCont = `<ul class="tab-list-box nodata-box">
2512                                            <li class="list-title nodata">
2513                                                <img src="/images/parthome/common/no-file.svg">게시글이 없습니다.
2514                                            </li>
2515                                        </ul>`
2516                } else {
2517                    /** 보도자료 세팅 */
2518                    resultData.list.forEach((el, index) => {
2519
2520                        const regDt = new Date(el.regDt);
2521                        const diffDays = (Date.now() - regDt) / (1000 * 60 * 60 * 24);
2522
2523                        /** newIcon 있음 */
2524                        if (diffDays <= 3) {
2525                            pressReleaseCont += `<ul class="tab-list-box">
2526                                                  <li class="list-date">
2527                                                        ${el.regDt.substring(0,10)}<img src="/images/home/main/icon_New.png" alt="new">
2528                                                  </li>
2529                                                  <li class="list-title">
2530                                                    <a href="/board.cm?menuCd=1002020000&boardSeq=${el.boardSeq}&tabYn=N">${el.bdTitle}</a>
2531                                                  </li>
2532                                              </ul>`
2533                            /** newIcon 없음 */
2534                        } else {
2535                            pressReleaseCont += `<ul class="tab-list-box">
2536                                                  <li class="list-date">
2537                                                        ${el.regDt.substring(0,10)}
2538                                                  </li>
2539                                                  <li class="list-title">
2540                                                    <a href="/board.cm?menuCd=1002020000&boardSeq=${el.boardSeq}&tabYn=N">${el.bdTitle}</a>
2541                                                  </li>
2542                                              </ul>`
2543                        }
2544
2545                    });
2546                }
2547
2548                document.getElementById("tab02").innerHTML = pressReleaseCont;
2549
2550            },
2551            error: function (xhr) {
2552                console.error(xhr)
2553            }
2554        })
2555    }
2556
2557    /***************************************************
2558     * 뉴스 스크랩 조회
2559     * *************************************************/
2560    function fnMainNews(menuCd) {
2561
2562        $.ajax({
2563            url: "/mainBoard.cm?",
2564            type: "POST",
2565            data: {menuCd: 1002030000},
2566            success: function (resultData) {
2567
2568                /** 뉴스 스트랩 세팅 */
2569                let newsCont = '';
2570
2571                if (resultData.list.length === 0) {
2572                    newsCont = `<ul class="tab-list-box nodata-box">
2573                                    <li class="list-title nodata">
2574                                        <img src="/images/parthome/common/no-file.svg">게시글이 없습니다.
2575                                    </li>
2576                                </ul>`
2577                } else {
2578                    resultData.list.forEach((el, index) => {
2579                        if (index < 3) {
2580                            const regDt = new Date(el.regDt);
2581                            const diffDays = (Date.now() - regDt) / (1000 * 60 * 60 * 24);
2582
2583                            /** newIcon 있음 */
2584                            if (diffDays <= 3) {
2585                                newsCont += `<ul class="tab-list-box">
2586                                          <li class="list-date">
2587                                                ${el.regDt.substring(0,10)}<img src="/images/home/main/icon_New.png" alt="new">
2588                                          </li>
2589                                          <li class="list-title">
2590                                            <a href="/board.cm?menuCd=1002030000&boardSeq=${el.boardSeq}&tabYn=N">${el.bdTitle}</a>
2591                                          </li>
2592                                      </ul>`
2593                                /** newIcon 없음 */
2594                            } else {
2595                                newsCont += `<ul class="tab-list-box">
2596                                          <li class="list-date">
2597                                                ${el.regDt.substring(0,10)}
2598                                          </li>
2599                                          <li class="list-title">
2600                                            <a href="/board.cm?menuCd=1002030000&boardSeq=${el.boardSeq}&tabYn=N">${el.bdTitle}</a>
2601                                          </li>
2602                                      </ul>`
2603                            }
2604                        }
2605                    });
2606                }
2607
2608                document.getElementById("tab03").innerHTML = newsCont;
2609
2610            },
2611            error: function (xhr) {
2612                console.error(xhr)
2613            }
2614        })
2615    }
2616
2617
2618    /***************************************************
2619     * 약사회 일정 조회 API
2620     * *************************************************/
2621    function fnSchedule() {
2622
2623        const now = new Date();
2624        const year = now.getFullYear();
2625        const month = now.getMonth();
2626        const date = year + '년 ' + (month + 1) + '월';
2627
2628        document.getElementById("scheduleTitle").innerText = date;
2629
2630        $.ajax({
2631            url: '/schedule.cm',
2632            type: "POST",
2633            success: function (resultData) {
2634
2635                const list = resultData.list;
2636
2637                let content = "";
2638
2639                let i = 0;
2640
2641                const moreUrl = 'scheduleList.cm?menuCd=1002040000'
2642
2643                /** 결과가 없을 때 */
2644                if (list.length === 0) {
2645                    content += `<div class="swiper-slide">
2646                                        <a href="${moreUrl}">
2647                                            <div class="schedule-content">
2648                                                <div class="schedule-content-body">
2649                                                    이후 일정을 확인하시려면<br>
2650                                                    상단 +버튼을 클릭해 주세요
2651                                                </div>
2652                                            </div>
2653                                        </a>
2654                                </div>`
2655
2656                    /** 짝수일 때 */
2657                } else if (list.length % 2 !== 0) {
2658                    while (i < list.length) {
2659                        content += `<div class="swiper-slide">
2660                                        <div class="schedule-content">
2661                                            <div class="schedule-content-top">
2662                                                ${list[i].startDt.substring(0,5) === list[i].endDt.substring(0,5) ? list[i].startDt : list[i].startDt+'~'+list[i].endDt}
2663                                            </div>
2664                                            <div class="schedule-content-body">
2665                                                ${list[i].title}
2666                                                <span>${list[i].place}</span>
2667                                            </div>
2668                                        </div>`
2669                        i++;
2670
2671                        if (i === list.length) {
2672                            content += `<a href="${moreUrl}">
2673                                        <div class="schedule-content">
2674                                            <div class="schedule-content-body">
2675                                                이후 일정을 확인하시려면<br>
2676                                                상단 +버튼을 클릭해 주세요
2677                                            </div>
2678                                        </div>
2679                                    </a>
2680                                </div>`;
2681                            break;
2682                        }
2683
2684                        content += `<div class="schedule-content">
2685                                        <div class="schedule-content-top">
2686                                            ${list[i].startDt.substring(0,5) === list[i].endDt.substring(0,5) ? list[i].startDt : list[i].startDt+'~'+list[i].endDt}
2687                                        </div>
2688                                        <div class="schedule-content-body">
2689                                            ${list[i].title}
2690                                            <span>${list[i].place}</span>
2691                                        </div>
2692                                    </div>
2693                            </div>`
2694                        i++;
2695                    }
2696
2697                }
2698                /** 조회 갯수가 홀수일 때 */
2699                else if (list.length % 2 === 0) {
2700
2701                    while (i < list.length) {
2702                        content += `<div class="swiper-slide">
2703                                        <div class="schedule-content">
2704                                            <div class="schedule-content-top">
2705                                                ${list[i].startDt.substring(0,5) === list[i].endDt.substring(0,5) ? list[i].startDt : list[i].startDt+'~'+list[i].endDt}
2706                                            </div>
2707                                            <div class="schedule-content-body">
2708                                                ${list[i].title}
2709                                                <span>${list[i].place}</span>
2710                                            </div>
2711                                        </div>`
2712
2713                        i++;
2714
2715                        content += `<div class="schedule-content">
2716                                        <div class="schedule-content-top">
2717                                            ${list[i].startDt.substring(0,5) === list[i].endDt.substring(0,5) ? list[i].startDt : list[i].startDt+'~'+list[i].endDt}
2718                                        </div>
2719                                        <div class="schedule-content-body">
2720                                            ${list[i].title}
2721                                            <span>${list[i].place}</span>
2722                                        </div>
2723                                    </div>
2724                                </div>`
2725                        i++;
2726                    }
2727                    content += `<div class="swiper-slide">
2728                                        <a href="${moreUrl}">
2729                                            <div class="schedule-content">
2730                                                <div class="schedule-content-body">
2731                                                    이후 일정을 확인하시려면<br>
2732                                                    상단 +버튼을 클릭해 주세요
2733                                                </div>
2734                                            </div>
2735                                        </a>
2736                                    </div>`
2737
2738                }
2739
2740
2741                document.getElementById("scheduleList").innerHTML = content;
2742
2743            },
2744            error: function (xhr) {
2745                console.error(xhr);
2746            }
2747        })
2748    }
2749
2750    //visual swiper
2751    function visualSwiper(delayTime) {
2752
2753        const mainVisualSwiper = new Swiper(".main-visual-swiper", {
2754            slidesPerView: 1,
2755            centeredSlides: false,
2756            autoplay: {
2757                delay: delayTime * 1000,
2758                disableOnInteraction: false,
2759            },
2760        });
2761    }
2762
2763
2764    //main-head swiper
2765    const mainHeadSwiper = new Swiper(".main-head", {
2766        effect: "fade",
2767        speed: 1000,
2768        autoplay: {
2769            delay: 10000,
2770            disableOnInteraction: false,
2771        },
2772        pagination: {
2773            el: ".swiper-pagination2",
2774            type: "fraction",
2775            formatFractionCurrent: function (number) {
2776                return ('0' + number).slice(-2);
2777            },
2778            formatFractionTotal: function (number) {
2779                return ('0' + number).slice(-2);
2780            },
2781            renderFraction: function (currentClass, totalClass) {
2782                return '<span class="' + currentClass + '"></span>' +
2783                    '<span class="line"></span>' +
2784                    '<span class="' + totalClass + '"></span>';
2785            },
2786        },
2787        navigation: {
2788            nextEl: ".swiper-button-next.hd_btn",
2789            prevEl: ".swiper-button-prev.hd_btn",
2790        },
2791    });
2792    const mainHead2swiper = new Swiper(".main-head", {
2793        effect: "fade",
2794        speed: 1000,
2795        pagination: {
2796            el: ".swiper-pagination-bar.hd_bar",
2797            type: "progressbar",
2798        },
2799    });
2800    mainHeadSwiper.controller.control = mainHead2swiper;
2801    let sw = 0;
2802
2803    $('.btn-pause').click(function () {
2804        if (sw == 0) {
2805            $('.btn-pause').addClass('on');
2806            headswiper.autoplay.stop();
2807            sw = 1;
2808        } else {
2809            $('.btn-pause').removeClass('on');
2810            headswiper.autoplay.start();
2811            sw = 0;
2812        }
2813    });
2814
2815    // 위해 의약품 회수 정보.
2816    const attentInfoSwiper = new Swiper(".attent-info-list", {
2817        slidesPerView: 3,
2818        centeredSlides: false,
2819        breakpoints: { //반응형 조건 속성
2820            280: {
2821                spaceBetween: 15,
2822                slidesPerView: 1,
2823            },
2824            320: {
2825                spaceBetween: 15,
2826                slidesPerView: 1.2,
2827            },
2828            700: {
2829                spaceBetween: 25,
2830                slidesPerView: 2,
2831            },
2832            900: {
2833                spaceBetween: 25,
2834                slidesPerView: 3,
2835            },
2836            1024: {
2837                spaceBetween: 40,
2838                slidesPerView: 3,
2839            },
2840
2841        },
2842        loop: false,
2843        // navigation: {
2844        //     nextEl: ".swiper-button-next.attent-info_btn",
2845        //     prevEl: ".swiper-button-prev.attent-info_btn",
2846        // },
2847    });
2848
2849    // 회원 신고 안내.
2850    const medicineBannerSwiper = new Swiper(".medicine-banner-swiper", {
2851        slidesPerView: 4,
2852        centeredSlides: false,
2853        breakpoints: { //반응형 조건 속성
2854            280: {
2855                spaceBetween: 15,
2856                slidesPerView: 1,
2857            },
2858            320: {
2859                spaceBetween: 15,
2860                slidesPerView: 1.2,
2861            },
2862            700: {
2863                spaceBetween: 15,
2864                slidesPerView: 2,
2865            },
2866            875: {
2867                spaceBetween: 10,
2868                slidesPerView: 4,
2869            },
2870
2871            1024: {
2872                spaceBetween: 20,
2873                slidesPerView: 4,
2874            },
2875
2876        },
2877        loop: false,
2878        navigation: {
2879            nextEl: ".swiper-button-next.medicine_btn",
2880            prevEl: ".swiper-button-prev.medicine_btn",
2881        },
2882    });
2883
2884    const quickSwiper = new Swiper(".quick_Swiper-banner", {
2885        slidesPerView: 4,
2886        centeredSlides: false,
2887        breakpoints: { //반응형 조건 속성
2888            320: {
2889                spaceBetween: 0,
2890                slidesPerView: 3.5,
2891            },
2892            640: {
2893                spaceBetween: 0,
2894                slidesPerView: 4.2
2895            },
2896        },
2897        loop: false,
2898    });
2899
2900    /*일정 swiper*/
2901    const scheduleSwiper = new Swiper(".schedule-swiper", {
2902        slidesPerView: 1,
2903        centeredSlides: false,
2904        observer: true,
2905        observeParents: true,
2906        breakpoints: { //반응형 조건 속성
2907            320: {
2908                spaceBetween: 10,
2909                slidesPerView: 1,
2910            },
2911            640: {
2912                spaceBetween: 10,
2913                slidesPerView: 1
2914            },
2915        },
2916        loop: false,
2917        navigation: {
2918            nextEl: ".swiper-button-next.schdule_btn",
2919            prevEl: ".swiper-button-prev.schdule_btn",
2920        },
2921    });
2922
2923
2924    function fncFixedFooterBanner() {
2925        //하단 고정 배너
2926        $('.advertisement-banner').scrollToFixed({
2927            bottom: 0,
2928            limit: $('.advertisement-banner').offset().top
2929        });
2930    }
2931
2932    // ToDO 외부 링크 팝업
2933    // 외부 사이트(회원신고, 사이버연수원 등)에서 ?popup=idFind / ?popup=passwordFind 로 진입 시 자동 오픈
2934    if ('' === 'idFind') {
2935        fnLoginNextPopup('homeSearchIdMberConfirmPopup');
2936    }
2937
2938    if ('' === 'passwordFind') {
2939        fnLoginNextPopup('homeSearchPwdMberConfirmPopup');
2940    }
2941
2942    if ('' === 'memberRegist') {
2943        $('#closeUnityLogin').click();
2944        openModal('unityMberRegistPopup');
2945    }
2946
2947    // ToDO 권한 처리 팝업
2948    if ('' === 'regionCode') {
2949        alert("해당 지부 사이버 연수원에 접근 권한이 없습니다.");
2950    }
2951
2952    if ('' === 'memberTypeCode') {
2953        alert("신고하지 않은 회원은 접근할 권한이 없습니다.");
2954    }
2955
2956    if ('' === 'false') {
2957        alert("로그인 후 이용해 주세요.");
2958        window.close();
2959    }
2960
2961    /**
2962     * pharm114 접근 시 로그인 여부 확인 추가
2963     */
2964    function fnLoginCheckAt() {
2965        $.ajax({
2966            url: "/home/login/homeLoginInfoInitApi.cm",
2967            type: "POST",
2968            success: function (result) {
2969                if (result.data != null && result.data.mberId != null && result.data.mberId != "") {
2970                    window.open("https://www.kpanews.co.kr/popup/ebookn.asp", "_blank", "resizable=no, width=381, height=759");
2971
2972                } else {
2973                    openPopup('HomeLoginMenuPopup');
2974                }
2975            }
2976        });
2977    }
2978
2979</script>
2979
2980
2981<script type="application/ld+json" id="jsonLD">
2982    {
2983        "@context": "http://schema.org",
2984        "@type": "WebPage",
2985        "thumbnailUrl": "https://edu.kpanet.or.kr/images/main/logo.png",
2986        "url": "https://www.kpanet.or.kr/",
2987        "inLanguage": "ko",
2988        "publisher": {
2989            "@type": "Organization",
2990            "name": "대한약사회",
2991            "logo": {
2992                "@type": "ImageObject",
2993                "url": "https://www.kpanet.or.kr/data/coreframework/com/kdrug/homemng/mainmng/20250225/202502250415437548.svg"
2994            }
2995        },
2996        "name": "대한약사회",
2997        "address": {
2998            "@type": "PostalAddress",
2999            "postalCode": "06708",
3000            "addressRegion": "서울특별시",
3001            "addressLocality": "서초구",
3002            "streetAddress": "효령로 194"
3003        },
3004        "description": "전국의 8만 약사는 지역주민의 건강지킴이로서 국민건강을 위해 최선을 다하고 있습니다. 특히 의약품 최고전문가인 약사로서 건강을 위한 올바른 의약품 정보 제공을 위한 커뮤니티케어 다제약물관리사업 의약품안전사용교육 환자안전사고보고 의약품부작용보고 폐의약품수거사업 등 지역주민 건강은 물론 지역사회 건강을 위해 다양한 사업을 전개해 오고 있습니다. 또한, 정확한 의약품정보 제공과 휴일지킴이약국 안내와 같이 올바른 의약품 사용환경을 조성하기 위한 노력도 꾸준히 전개하고 있습니다",
3005        "sameAs": [
3006            "https://www.youtube.com/channel/UCNDcVjrx39d-vgIA1CnHeXw",
3007            "https://www.instagram.com/kpanet_official/",
3008            "https://www.facebook.com/kpanet.kr/?locale=ko_KR"
3009        ]
3010    }
3011</script>
vendor: 1 bytes, line 3011
3011
3012<script>
3013    // 팝업 요소와 버튼들 선택
3014    const popup = document.getElementById("centerLayPopUp");
3015    const btnSeeEachOtherToday = document.getElementById("btnSeeEachOtherToday");
3016    const btnClickAccept = document.getElementById("btnClickAccept");
3017    const bodyTag = document.body;
3018
3019    // 팝업에 전달할 데이터 (원하는 값으로 변경)
3020    let confirmData = null;  // 혹은 필요한 데이터를 할당
3021
3022    // 팝업 보이기 / 숨기기 함수
3023    function showPopup() {
3024        popup.style.display = "flex";
3025        bodyTag.style.overflowY = 'hidden'
3026    }
3027
3028    function hidePopup() {
3029        popup.style.display = "none";
3030        bodyTag.style.overflowY = 'auto'
3031    }
3032
3033    function formatDate(date) {
3034        let yearValue = date.getFullYear();
3035        // JavaScript에서 getMonth()는 0부터 시작하므로 +1 해줍니다.
3036        const month = String(date.getMonth() + 1).padStart(2, '0');
3037        const day = String(date.getDate()).padStart(2, '0');
3038        const hours = String(date.getHours()).padStart(2, '0');
3039        const minutes = String(date.getMinutes()).padStart(2, '0');
3040        const seconds = String(date.getSeconds()).padStart(2, '0');
3041
3042        return yearValue + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
3043    }
3044
3045    function isToday(dateStr) {
3046        // dateStr 예: '2025-04-14 12:34:56'
3047        if (!dateStr) return false;
3048
3049        // 공백을 기준으로 날짜 부분과 시간 부분을 분리
3050        const parts = dateStr.split(' ');
3051        if (parts.length !== 2) return false;
3052
3053        // 날짜 부분('YYYY-MM-DD')를 '-'를 기준으로 분리
3054        const dateParts = parts[0].split('-');
3055        if (dateParts.length !== 3) return false;
3056
3057        const [yearStr, monthStr, dayStr] = dateParts;
3058        const year = parseInt(yearStr, 10);
3059        const month = parseInt(monthStr, 10);  // 입력 문자열의 month는 1부터 시작함
3060        const day = parseInt(dayStr, 10);
3061
3062        // 현재 날짜 가져오기
3063        const today = new Date();
3064        const currentYear = today.getFullYear();
3065        const currentMonth = today.getMonth() + 1; // getMonth()는 0부터 시작하므로 +1 해줌
3066        const currentDay = today.getDate();
3067
3068        // 연도, 월, 일이 모두 일치하면 오늘 날짜임
3069        return year === currentYear && month === currentMonth && day === currentDay;
3070    }
3071
3072    // 버튼 클릭 이벤트 리스너 등록
3073    btnClickAccept.addEventListener("click", function (e) {
3074        e.preventDefault();
3075        hidePopup()
3076    });
3077    btnSeeEachOtherToday.addEventListener("click", function (e) {
3078        e.preventDefault();
3079        const date = new Date();
3080        localStorage.setItem('isNotShowToday', formatDate(date));
3081        hidePopup();
3082    });
3083
3084    // 예시: 팝업을 페이지 로드 시 표시
3085    window.addEventListener("DOMContentLoaded", function () {
3086        if (!localStorage.getItem('isNotShowToday')) {
3087            showPopup();
3088            return;
3089        }
3090        if (isToday(localStorage.getItem('isNotShowToday'))) {
3091            hidePopup();
3092            return;
3093        }
3094        showPopup();
3095    });
3096</script>
3096
3097            
3098            
3099            
3100            
3101            
3102            
3103
3104            
3105        
3106        
3107
3108
3109
3110<!--고정 배너광고 St-->
3111<div class="advertisement-banner">
3112    <div class="banner-frame">
3113        <div class="banner-inner">
3114            <div class="swiper banner_Swiper">
3115                <div class="swiper-wrapper" id="bottomBanner">
3116
3117                    <div class="swiper banner_Swiper">
3118                    </div>
3119                    <div class="swiper-button-next sm_btn3"></div>
3120                    <div class="swiper-button-prev sm_btn3"></div>
3121                </div>
3122            </div>
3123        </div>
3124    </div>
3125</div>
3126<!--//고정 배너광고 Ed-->
3127<footer>
3128    <div class="footer-top">
3129        <div class="footer-inner">
3130            <div class="footer-menu">
3131                <span id="termsList">
3132
3133                </span>
3134                <span id="leftFooter">
3135
3136                </span>
3137            </div>
3138            <div class="family-site">
3139                
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149            </div>
3150        </div>
3151    </div>
3152    <div class="footer-bottom">
3153        <div class="foote-bottom-inner">
3154            <a href="#a" class="footer-logo">대한 약사회</a>
3155            <address>
3156                <span><em>주소</em>06708 서울특별시 서초구 효령로 194 (서초3동 1489-3)</span><span>전화<em>02-581-1201</em></span><span>팩스<em>02-585-7630</em></span>
3157                <div class="copyright">ⓒ 2017 by The Korean Pharmaceutical Association All rights reserved.</div>
3158            </address>
3159        </div>
3160    </div>
3161</footer>
3162<script>
3163
3164    /** 하단 배너 데이터 조회 */
3165    $(document).ready(() => {
3166        fnSelectBottomBanner();
3167        fnSelectFooter();
3168        fnSelectTerms();
3169    });
3170
3171    /***************************************************
3172     * 하단 배너 조회
3173     * *************************************************/
3174    function fnSelectBottomBanner() {
3175        $.ajax({
3176            url: "/mainBannerList.cm",
3177            type: 'POST',
3178            data: {
3179                hpageId: 0,
3180                bannerType: 'B'
3181            },
3182            success: function (resultData) {
3183
3184                // console.log("resultData", resultData);
3185
3186                let content = "";
3187                content +=
3188                    `
3189                    <div class="swiper-slide">
3190                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260601141253802" target="_blank">
3191                            <div class="brand_wrap">
3192                                <div class="brand_bx">
3193                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260601141253802" alt="맞춤 OTC 개정"></span>
3194                                </div>
3195                            </div>
3196                        </a>
3197                    </div>
3198
3199                    <div class="swiper-slide">
3200                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260330170622742" target="_blank">
3201                            <div class="brand_wrap">
3202                                <div class="brand_bx">
3203                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260330170622742" alt=""></span>
3204                                </div>
3205                            </div>
3206                        </a>
3207                    </div>
3208
3209                    <div class="swiper-slide">
3210                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20250528165142222" target="_blank">
3211                            <div class="brand_wrap">
3212                                <div class="brand_bx">
3213                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20250528165142222" alt=""></span>
3214                                </div>
3215                            </div>
3216                        </a>
3217                    </div>
3218
3219                    <div class="swiper-slide">
3220                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260529164328497" target="_blank">
3221                            <div class="brand_wrap">
3222                                <div class="brand_bx">
3223                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260529164328497" alt=""></span>
3224                                </div>
3225                            </div>
3226                        </a>
3227                    </div>
3228
3229                    <!-- 광고문의 배너 -->
3230                    <!--<div class="swiper-slide">
3231                        <a href="https://www.health.kr/notice/inquireAd.asp" target="_blank">
3232                            <div class="brand_wrap">
3233                                <div class="brand_bx">
3234                                    <span class="product-frame"><img src="https://manage.marketingtools.kr/api/image/v1/showImage?filename=banner/upload/20250804/20250804151729846.png" alt=""></span>
3235                                </div>
3236                            </div>
3237                        </a>
3238                    </div>-->`;
3239
3240                // 동적 배너 노출 중단 - 하드코딩된 배너만 노출 (아래 forEach 는 if(false) 로 숨김 처리)
3241                if (false) {
3242                    resultData.list.forEach((elem, index) => {
3243
3244                        let pcImgUrl;
3245
3246                        if (elem.bannerFile !== "") {
3247
3248                            pcImgUrl = '' + elem.bannerFiles[0].filePath;
3249
3250                            let pattern = /https?:\/\/(?:www\.)?[^\s]+/g;
3251                            let matchUrl = elem.linkAddr.match(pattern);
3252
3253                            /** linkUrl의 값이 url 형태일 때만 새탭 띄우기 */
3254                            if(matchUrl !== null){
3255                                content +=
3256                                    `<div class="swiper-slide">
3257                                        <a href="${elem.linkAddr}" target="_blank">
3258                                            <div class="brand_wrap">
3259                                                <div class="brand_bx">
3260                                                    <span class="product-frame"><img src="https://www.kpanet.or.kr${pcImgUrl}" alt=""></span>
3261                                                </div>
3262                                            </div>
3263                                        </a>
3264                                    </div>`
3265                            }
3266                            else{
3267                                content +=
3268                                    `<div class="swiper-slide">
3269                                        <div class="brand_wrap">
3270                                            <div class="brand_bx">
3271                                                <span class="product-frame"><img src="https://www.kpanet.or.kr${pcImgUrl}" alt=""></span>
3272                                            </div>
3273                                        </div>
3274
3275                                    </div>`
3276                            }
3277
3278                        }
3279
3280                    });
3281                }
3282
3283                document.getElementById("bottomBanner").innerHTML = content;
3284            },
3285            error: function (xhr) {
3286                console.error(xhr);
3287            }
3288        });
3289
3290    }
3291
3292    /***************************************************
3293     * 푸터 조회
3294     * *************************************************/
3295    function fnSelectFooter() {
3296        $.ajax({
3297            url:"/mainFooterList.cm",
3298            type:'POST',
3299            data:{
3300                hpageId:0
3301            },
3302            success: function (resultData) {
3303
3304                if(resultData.list.length > 0){
3305                    const leftFooter = resultData.list.filter(item => item.footerType === 'L');
3306                    const rightFooter = resultData.list.filter(item => item.footerType === 'R');
3307                    let aLeftFooter;
3308
3309                    leftFooter.forEach(elem => {
3310                        aLeftFooter += `<a target="_blank" href="${elem.linkUrl}">${elem.footerTitle}</a>`
3311
3312                    });
3313
3314                    /** 좌측 푸터 placeAt */
3315                    document.getElementById("leftFooter").innerHTML = aLeftFooter;
3316
3317                    if(rightFooter.length > 0){
3318                        const parentData = rightFooter.filter(item => item.pid === 0);
3319                        const childData = rightFooter.filter(item => item.pid !== 0);
3320
3321                        parentData.forEach(item => {
3322                            const divParent = document.createElement('div');
3323                            divParent.setAttribute('class', 'family');
3324                            const btnParent = document.createElement('button');
3325                            btnParent.setAttribute('type', 'button');
3326                            btnParent.setAttribute('class', 'select-btn');
3327                            const iParent = document.createElement('i');
3328                            iParent.setAttribute('class', 'icon');
3329                            iParent.innerText = item.footerTitle;
3330                            btnParent.appendChild(iParent);
3331
3332                            const divFamily = document.createElement('div');
3333                            divFamily.setAttribute('class', 'family-list');
3334                            const div2 = document.createElement('div');
3335                            childData.forEach(item2 => {
3336
3337                                if(item.footerSeq === item2.pid) {
3338                                    const aChild = document.createElement('a');
3339                                    aChild.setAttribute('href', item2.linkUrl);
3340                                    aChild.setAttribute('target', '_blank');
3341                                    aChild.innerText = item2.footerTitle;
3342                                    div2.appendChild(aChild);
3343                                }
3344                            });
3345
3346                            divFamily.appendChild(div2);
3347                            divParent.appendChild(btnParent);
3348                            divParent.appendChild(divFamily);
3349                            document.querySelector('.family-site').appendChild(divParent);
3350                        });
3351                        fnFamilySite();
3352                    }
3353                }
3354            },
3355            error: function (xhr) {
3356                console.error(xhr);
3357            }
3358        });
3359
3360    }
3361
3362    /***************************************************
3363     * 약관 탭 이름 조회(code_id = KPA999)
3364     * *************************************************/
3365    function fnSelectTerms() {
3366        $.ajax({
3367            url: "/mainTermsList.cm",
3368            type: 'POST',
3369            success: function (resultData) {
3370
3371                let content = ""
3372
3373                resultData.list.forEach((elem, index) => {
3374
3375                    if(index < 3){
3376                        if(index === 1){
3377                            content += `<a style="font-weight: bold" href="/terms.cm?termsPart=TE00${index+1}">${elem.codeNm}</a>`
3378                        } else {
3379                            content += `<a href="/terms.cm?termsPart=TE00${index+1}">${elem.codeNm}</a>`
3380                        }
3381                    }
3382                });
3383
3384                document.getElementById("termsList").innerHTML = content;
3385
3386            },
3387            error: function (xhr) {
3388                console.error(xhr);
3389            }
3390        });
3391    }
3392    function fnFamilySite(){
3393        /*familysite*/
3394        $('.family').on("click", function(){
3395            if (!$(this).hasClass('active')) {
3396                $('.family-list').parent('.family').removeClass('active');
3397                $('.family-list').hide();
3398                $(this).addClass('active');
3399                $(this).find('.family-list').slideDown(0);
3400                $('.breadcumb_button').removeClass('on');
3401                $('.breadcumb_drawer').css('display','none');
3402            } else if ($(this).hasClass('active')) {
3403                $(this).removeClass('active');
3404                $(this).find('.family-list').slideUp(0);
3405            }
3406        });
3407    }
3408
3409    //고정배너 swiper
3410    const footerBannerSwiper = new Swiper(".banner_Swiper", {
3411        // slidesPerView: 4,
3412        slidesPerView: 'auto',
3413        freeMode: true,
3414        centeredSlides: false,
3415        breakpoints: { //반응형 조건 속성
3416            280: {
3417                spaceBetween: 15,
3418                slidesPerView: 1,
3419            },
3420            320: {
3421                spaceBetween: 15,
3422                slidesPerView: 1.2,
3423            },
3424            400: {
3425                spaceBetween: 15,
3426                slidesPerView: 2,
3427            },
3428            700: {
3429                spaceBetween: 15,
3430                slidesPerView: 3,
3431            },
3432            768: {
3433                spaceBetween: 15,
3434                slidesPerView: 3,
3435            },
3436            980: {
3437                // slidesPerView: 4,
3438                slidesPerView: 'auto',
3439                spaceBetween: 27,
3440            },
3441
3442        },
3443        loop: false,
3444        navigation: {
3445            nextEl: ".swiper-button-next.sm_btn3",
3446            prevEl: ".swiper-button-prev.sm_btn3",
3447        },
3448        on: {
3449            init: function () {
3450                adjustSlideWidths();
3451            },
3452            resize: function () {
3453                adjustSlideWidths(); // 화면 크기 변경 시에도 적용
3454            }
3455        }
3456    });
3457    function adjustSlideWidths() {
3458        const slides = document.querySelectorAll('.banner_Swiper .swiper-slide');
3459        const containerWidth = document.querySelector('.banner_Swiper').offsetWidth;
3460
3461        slides.forEach((slide, index) => {
3462            // if (index === 0) {
3463            //     slide.style.width = Math.min(containerWidth, 580) + "px"; // 580px을 넘지 않도록 설정
3464            // } else {
3465            //     slide.style.width = "283.5px";
3466            // }
3467            slide.style.width = "283.5px";
3468        });
3469    }
3470</script>
3470
3471
3472
3473    
3473<script>
3474
3475    function __setCookie(name, value) {
3476        var todayDate = new Date();
3477        todayDate.setDate(todayDate.getDate() + 1);
3478        document.cookie = name + '=' + escape(value) + '; path=/; expires=' + todayDate.toGMTString() + ';'
3479    }
3480
3481    //쿠키 불러오기
3482    function __getCookie(name) {
3483        var obj = name + "=";
3484        var x = 0;
3485        while (x <= document.cookie.length) {
3486            var y = (x + obj.length);
3487            if (document.cookie.substring(x, y) == obj) {
3488                if ((endOfCookie = document.cookie.indexOf(";", y)) == -1)
3489                    endOfCookie = document.cookie.length;
3490                    return unescape(document.cookie.substring(y, endOfCookie));
3491            }
3492            x = document.cookie.indexOf(" ", x) + 1;
3493
3494            if (x == 0) break;
3495        }
3496        return "";
3497    }
3498    // JWT 토큰 검증 후 조건에 맞으면 쿠키 삭제
3499    function checkAndDeleteAccessToken() {
3500    // 쿠키에서 accessToken 가져오기
3501
3502        const accessToken = __getCookie('accessToken');
3503
3504
3505        if (!accessToken) {
3506            console.log('accessToken이 쿠키에 없습니다.');
3507            return;
3508        }
3509
3510        console.log('accessToken 검증 시작...');
3511
3512        // API 요청
3513        fetch('/checkJwtTime.cm?jwtToken=' + encodeURIComponent(accessToken), {
3514            method: 'GET',
3515            headers: {
3516            'Content-Type': 'application/json'
3517            }
3518        })
3519        .then(response => response.json())
3520        .then(data => {
3521            console.log('JWT 검증 결과:', data);
3522
3523            // 2025년 10월 30일 18시~22시 범위에 있는 토큰인 경우
3524            if (data.list.isValid) {
3525                console.log('✅ 해당 시간 범위의 토큰입니다. 쿠키에서 삭제합니다.');
3526
3527                // accessToken 쿠키 삭제
3528                __setCookie('accessToken', '');
3529
3530                // 필요한 경우 추가 처리
3531                alert('세션이 만료되었습니다. 다시 로그인해주세요.');
3532                fnLogout();
3533                // window.location.href = '/login.cm'; // 로그인 페이지로 리다이렉트
3534            } else {
3535                console.log('❌ 해당 시간 범위가 아닙니다. 쿠키를 유지합니다.');
3536            }
3537        })
3538        .catch(error => {
3539            console.error('JWT 검증 중 오류 발생:', error);
3540        });
3541    }
3542
3543    checkAndDeleteAccessToken();
3544    </script>
3544
3545
3546
3547</div>
3548
3549        <!--전체메뉴 St-->
3550        <div class="nav-all_bg"></div>
3551        <aside class="nav-all">
3552            <div class="nav_head ">
3553                <!--mobile top content St-->
3554                <div class="mobile-top-content">
3555                    <div class="mo-utill">
3556                        <div class="mobile-sns">
3557                            <a href="#a" class="mo-facebook">Facebook</a>
3558                            <a href="#a" class="mo-instagram">Facebook</a>
3559                            <a href="#a" class="mo-youtube">Facebook</a>
3560                        </div>
3561                        <div class="mo-user">
3562                            <ul>
3563                                
3564                                    <li id="btnUnityLoginMo"><a href="#a" onclick="openModal('unityMberLoginPopup')" class="login" id="">로그인</a></li>
3565                                
3566                                
3567
3568
3569                                
3570                                    <li id="btnUnityRegistMo"><a href="#a" class="login"  onclick="openModal('unityMberRegistPopup')">회원등록</a></li>
3571                                
3572                                <li><a href="/home/eng/main.cm" class="register">EN</a></li>
3573                            </ul>
3574                        </div>
3575
3576                    </div>
3577                    
3578
3579
3580
3581
3582
3583  
3584    
3585    <div class="select-contnet" id="loginMberLinkMo" style="display:none">
3586      <div class="dropdown_item">
3587        <button class="dropdown_button" type="button">선택하세요</button>
3588        <div class="dropdown_drawer">
3589          <ul class="dropdown-depth">
3590            <li class="item"><a href="https://member.kpanet.or.kr/">회원 신고</a></li>
3591            <li class="item"><a href="https://license.kpanet.or.kr/">면허 신고</a></li>
3592            <li class="item"><a href="https://edu.kpanet.or.kr/cyber.cm">대한약사회 사이버연수원</a></li>
3593            <li id="loginMoHomeUrl" class="item"><a href="/">대한약사회 홈페이지</a></li>
3594            
3595              
3596              
3597                <li class="item">
3598                  
3599                  
3600                  
3601                  
3602                  
3603                  
3604                  
3605                  
3606                  
3607                  
3608                </li>
3609              
3610            
3611            
3612          </ul>
3613        </div>
3614      </div>
3615    </div>
3616  
3617
3618
3619  <div class="user-mobile-info" id="loginMberInfosMo" style="display:none">
3620    <strong> 님</strong>
3621    
3622    
3623      <a href="/mypage.cm" class="mypage-btn" id="loginMypageMoUrl">
3624        My Page
3625      </a>
3626    
3627  </div>
3628
3629
3630<script>
3631
3632  $(document).ready(function (){
3633    // 현재 페이지가 지부인지 분회인지 확인.
3634    // 현재링크 kpa있으면 지부분회 / 없으면 대한약사회
3635
3636    // 마지막 00으로 끝나면 지부 / 아니면 분회
3637    let domainPath = window.location.pathname; //ex) /kpa0100/~~~~~~~
3638    let regionCode = domainPath.substring(1); //첫 "/"글자 제거
3639    regionCode = regionCode.substring(0,regionCode.indexOf("/"));
3640
3641    if(regionCode.indexOf("kpa0") > -1){
3642      // mypage 지부분회 mypage 로 수정
3643      document.getElementById("loginMypageMoUrl").href="/"+regionCode+"/mypage.cm";
3644
3645      // 지부분회
3646      regionCode = regionCode.substring(regionCode.length -2,regionCode.length)//맨뒤 두자리 제거
3647
3648      if(regionCode === "00"){
3649        //지부
3650        if(document.getElementById("loginMOBrachUrl")  && document.getElementById("loginMOBrachUrl") != null){
3651          document.getElementById("loginMOBrachUrl").style.display="none";
3652        }
3653      }else{
3654        //분회
3655        if(document.getElementById("loginMOPartUrl")  && document.getElementById("loginMOPartUrl") != null){
3656          document.getElementById("loginMOPartUrl").style.display="none";
3657        }
3658      }
3659
3660    }else{
3661      // 대한약사회
3662      if(document.getElementById("loginMoHomeUrl")  && document.getElementById("loginMoHomeUrl") != null){
3663        // 대약회 숨기기
3664        document.getElementById("loginMoHomeUrl").style.display="none";
3665      }
3666    }
3667
3668  });
3669
3670  /!* 로그인 후 회원정보 보이기 모바일*!/
3671  function fnLoginMberInfoShowMo(){
3672
3673    document.getElementById("loginMberInfosMo").style.display="block";
3674    if(document.getElementById("loginMberLinkMo") != null && document.getElementById("loginMberLinkMo")){
3675      document.getElementById("loginMberLinkMo").style.display="block";
3676    }
3677
3678  }
3679  /!* 로그아웃 후 회원정보 숨기기 모바일*!/
3680  function fnLoginMberInfoNoShowMo(){
3681
3682    document.getElementById("loginMberInfosMo").style.display="none";
3683    if(document.getElementById("loginMberLinkMo") != null && document.getElementById("loginMberLinkMo")){
3684      document.getElementById("loginMberLinkMo").style.display="none";
3685    }
3686  }
3687</script>
3687
3688
3689                </div>
3690                <!--//mobile top content Ed-->
3691                <!-- drawer- close St-->
3692                <div class="gnb-all closebtn"  id="moNavClose">
3693                    <button type="button" class="gnb-all-btn" title="닫기">
3694                        <span></span>
3695                        <span></span>
3696                        <span></span>
3697                    </button>
3698                </div>
3699                <!--// drawer- close Ed-->
3700            </div>
3701            <div class="nav_body">
3702
3703            </div>
3704        </aside>
3705        <!--//전체메뉴 Ed-->
3706        <!--modal-popup St-->
3707        <div class="modal-popup fade" id="Certification-system"></div>
3708        <div class="modal-popup-main" id="mainPup" style="display:none;"></div>
3709        <!--//modal-popup Ed-->
3710        <!--float menu  St-->
3711        <div id="floatMenu">
3712            <dl class="quick-menu">
3713
3714            </dl>
3715            <button type="button" class="btTop">
3716                <span><img src="/images/home/common/top_arrow.png" alt="top">TOP</span>
3717            </button>
3718        </div>
3719        <!--//float menu  St-->
3720        <!--mobile floatmenu St-->
3721        <div class="zoom">
3722            <a class="zoom-fab zoom-btn-large" id="zoomBtn"></a>
3723            <ul class="zoom-menu" id="quickMenuMo">
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733            </ul>
3734            <div class="quick-dim"></div>
3735        </div>
3736        <!--//mobile floatmenu Ed-->
3737        <button type="button" class="btTop-mobile">
3738            <span><img src="/images/home/common/arrow_top.svg" alt="top">TOP</span>
3739        </button>
3740        
3740<script>
3741
3742            $(document).ready(function () {
3743                let domainPath = window.location.pathname; //ex) /kpa0100/~~~~~~~
3744                let regionCode = domainPath.substring(1); //첫 "/"글자 제거
3745                regionCode = regionCode.substring(0,regionCode.indexOf("/"));
3746
3747                if(regionCode.indexOf("kpa0") > -1){
3748                    // mypage 지부분회 mypage 로 수정
3749                    document.getElementById("loginMyPageMobileUrl").href="/"+regionCode+"/mypage.cm";
3750
3751                    // // 지부분회
3752                    // regionCode = regionCode.substring(regionCode.length -2,regionCode.length)//맨뒤 두자리 제거
3753                    //
3754                    // if(regionCode === "00"){
3755                    //     //지부
3756                    //     if(document.getElementById("loginPCBrachUrl")  && document.getElementById("loginPCBrachUrl") != null){
3757                    //         document.getElementById("loginPCBrachUrl").style.display="none";
3758                    //     }
3759                    // }else{
3760                    //     //분회
3761                    //     if(document.getElementById("loginPCPartUrl")  && document.getElementById("loginPCPartUrl") != null){
3762                    //         document.getElementById("loginPCPartUrl").style.display="none";
3763                    //     }
3764                    // }
3765
3766                }else{
3767                    // 대한약사회
3768                    // if(document.getElementById("loginPCHomeUrl")  && document.getElementById("loginPCHomeUrl") != null){
3769                    //     // 대약회 숨기기
3770                    //     document.getElementById("loginPCHomeUrl").style.display="none";
3771                    // }
3772                }
3773
3774                // sso 로그인 처리
3775                const requestUri = "/main.cm";
3776                if (requestUri && requestUri === "/ssoLogin.cm") {
3777                    const loginInfo = "";
3778                    const redirectUri = "";
3779                    if (loginInfo && redirectUri) {
3780                        return location.href=redirectUri;
3781                    } else {
3782                        return location.href="/main.cm";
3783                    }
3784                }
3785
3786                fncCreateMenuNavBody();
3787                $("#moNavClose").click(function(){
3788                    $('body').removeClass("scrolloff");
3789                });
3790
3791            });
3792
3793            /** 퀵링크 생성 함수 -> 메뉴 gnb요청이 성공한 수 실행 */
3794            function fnQuickLink(mapObj){
3795
3796                $.ajax({
3797                    url:'/mainQuickLinkList.cm',
3798                    type:'POST',
3799                    async:false,
3800                    data:{hpageId:0},
3801                    success:function(resultData){
3802                        const list = resultData.list
3803
3804                        let content = `<dt>QUICK<br>LINK</dt>`;
3805                        let contentMo = '';
3806
3807                        list.forEach((elem,index)=>{
3808
3809                            if(elem.quickLinkFile.filePath !== null && elem.quickLinkFile.filePath !== ''){
3810                            }
3811                                document.documentElement.style.setProperty(`--image-path${index+1}`, 'url(' + ''+elem.quickLinkFile.filePath + ')');
3812
3813                            // 내부 메뉴
3814                            if(elem.linkType === '1'){
3815
3816                                elem.linkUrl = mapObj[parseInt(elem.linkUrl)].menuUrl
3817                                content += `<dd><a href="${elem.linkUrl}" class="quick0${index+1}">${elem.quickLinkTitle}</a></dd>`
3818                                contentMo += `<li><a href="${elem.linkUrl}" class="zoom-fab zoom-btn-sm scale-transition scale-outscale-transition scale-out">${elem.quickLinkTitle}</a></li>`
3819                            // 외부 메뉴
3820                            }else{
3821                                content += `<dd><a target='_blank' href="${elem.linkUrl}" class="quick0${index+1}">${elem.quickLinkTitle}</a></dd>`
3822                                contentMo +=     `<li><a target="_blank" href="${elem.linkUrl}" class="zoom-fab zoom-btn-sm scale-transition scale-outscale-transition scale-out">${elem.quickLinkTitle}</a></li>`
3823                            }
3824
3825                        });
3826
3827                        document.querySelector('.quick-menu').innerHTML = content;
3828                        $("#quickMenuMo").html(contentMo)
3829
3830                    },
3831                    error:function(xhr){
3832                        console.error(xhr);
3833                    }
3834                })
3835            }
3836
3837            //nav_body create Start
3838            function fncCreateMenuNavBody() {
3839                const menuNavBody = document.querySelector(".nav_body");
3840                const menuNavUl = document.createElement('ul');
3841
3842                $.ajax({
3843                    url: "/menuNavBodyListApi.cm",
3844                    data: {hpageId : 0},
3845                    type: "POST",
3846                    success: function (resultData) {
3847
3848                        const mapObj = {};
3849                        resultData.list.forEach(item => {
3850                            mapObj[item.menuCd] = item;
3851                        });
3852
3853                        // 퀵링크 생성
3854                        fnQuickLink(mapObj);
3855                        fnLinkActive();
3856
3857                        // 모든 메뉴 코드 수집
3858                        const allMenuCds = resultData.list.map(item => item.menuCd);
3859
3860                        // 회원전용 여부 일괄 체크
3861                        $.ajax({
3862                            url: "/checkMenuMemberOnlyBatchApi.cm",
3863                            data: {menuCds: allMenuCds},
3864                            type: "POST",
3865                            dataType: "json",
3866                            traditional: true,
3867                            success: function (memberOnlyResult) {
3868                                const memberOnlyMap = memberOnlyResult.data || {};
3869
3870                                // 회원전용 여부 확인 헬퍼 함수
3871                                function isMemberOnlyMenu(menuCd) {
3872                                    if (!menuCd) return false;
3873                                    const menuCdNum = parseInt(menuCd, 10);
3874                                    // menuCd가 1002200000인 경우 하드코딩으로 회원전용 처리
3875                                    if (menuCd == '1002200000') {
3876                                        return true;
3877                                    }
3878                                    return memberOnlyMap[menuCd] === true || 
3879                                           memberOnlyMap[String(menuCd)] === true ||
3880                                           memberOnlyMap[menuCdNum] === true || 
3881                                           memberOnlyMap[String(menuCdNum)] === true;
3882                                }
3883
3884                                const oneDepth = resultData.list.filter(item => item.menuDepth === 1)
3885                                    .sort((prev,cur) =>{
3886                                        if(prev.menuSort > cur.menuSort) return 1;
3887                                        if(prev.menuSort < cur.menuSort) return -1;
3888                                    });
3889
3890                                oneDepth.forEach(item1 => {
3891                                    const oneDepthLi = fncCreateMenuNavElements("depth-1", "depth-menu"
3892                                        , item1.menuNm, "javascript:void(0);", item1.menuCd);
3893                                    
3894                                    // 1뎁스 회원전용 여부 확인
3895                                    const isMemberOnly1 = isMemberOnlyMenu(item1.menuCd);
3896                                    
3897                                    // 해당 1뎁스의 모든 2뎁스 메뉴 수집
3898                                    const twoDepth = resultData.list.filter(item => item.hmenuCd === item1.menuCd);
3899                                    
3900                                    // 2뎁스 메뉴가 있고, 모두 회원전용인지 확인
3901                                    let allSubMenusAreMemberOnly = false;
3902                                    if (twoDepth.length > 0) {
3903                                        allSubMenusAreMemberOnly = twoDepth.every(item2 => {
3904                                            if (item2.menuCd == '1002200000') {
3905                                                return true;
3906                                            }
3907                                            return isMemberOnlyMenu(item2.menuCd);
3908                                        });
3909                                    }
3910                                    
3911                                    // 1뎁스가 회원전용이거나, 모든 2뎁스가 회원전용이면 class 추가
3912                                    if (isMemberOnly1 || allSubMenusAreMemberOnly) {
3913                                        const currentClass = oneDepthLi.getAttribute("class") || "";
3914                                        oneDepthLi.setAttribute("class", (currentClass + " membersOnlyOneDepth").trim());
3915                                    }
3916
3917                                    if (twoDepth.length !== 0) {
3918                                        const twoDepthUl = document.createElement("ul");
3919                                        let twoDepthLi;
3920                                        twoDepthUl.setAttribute("class", "nav-list-depth2");
3921
3922                                        twoDepth.forEach(item2 => {
3923                                            const threeDepth =
3924                                                resultData.list.filter(item => item.hmenuCd === item2.menuCd);
3925
3926                                            if (threeDepth.length !== 0) {
3927                                                twoDepthLi = fncCreateMenuNavElements("depth-2", "depth-menu"
3928                                                    , item2.menuNm, "j
3928avascript:void(0);", item2.menuCd);
3929                                                
3930                                                // 2뎁스 회원전용 여부 확인 및 class 추가
3931                                                const isMemberOnly2 = isMemberOnlyMenu(item2.menuCd);
3932                                                if (isMemberOnly2) {
3933                                                    const currentClass = twoDepthLi.getAttribute("class") || "";
3934                                                    twoDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
3935                                                }
3936                                                
3937                                                const threeDepthUl = document.createElement("ul");
3938                                                let threeDepthLi;
3939                                                threeDepthUl.setAttribute("class", "nav-list-depth3");
3940
3941                                                threeDepth.forEach(item3 => {
3942                                                    const fourDepth =
3943                                                        resultData.list.filter(item => item.hmenuCd === item3.menuCd);
3944
3945                                                    if (fourDepth.length !== 0) {
3946                                                        threeDepthLi = fncCreateMenuNavElements("depth-3", "depth-menu"
3947                                                            , item3.menuNm, "javascript:void(0);", item3.menuCd);
3948                                                        
3949                                                        // 3뎁스 회원전용 여부 확인 및 class 추가
3950                                                        const isMemberOnly3 = isMemberOnlyMenu(item3.menuCd);
3951                                                        if (isMemberOnly3) {
3952                                                            const currentClass = threeDepthLi.getAttribute("class") || "";
3953                                                            threeDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
3954                                                        }
3955                                                        
3956                                                        const fourDepthUl = document.createElement("ul");
3957                                                        let fourDepthLi;
3958                                                        fourDepthUl.setAttribute("class", "nav-list-depth4");
3959
3960                                                        fourDepth.forEach(item4 => {
3961                                                            fourDepthLi = fncCreateMenuNavElements("no-depth", "no-depth"
3962                                                                , item4.menuNm, item4.menuUrl, item4.menuCd);
3963                                                            
3964                                                            // 4뎁스 회원전용 여부 확인 및 class 추가
3965                                                            const isMemberOnly4 = isMemberOnlyMenu(item4.menuCd);
3966                                                            if (isMemberOnly4) {
3967                                                                const currentClass = fourDepthLi.getAttribute("class") || "";
3968                                                                fourDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
3969                                                            }
3970                                                            
3971                                                            fourDepthUl.appendChild(fourDepthLi);
3972                                                            threeDepthLi.appendChild(fourDepthUl);
3973                                                        });
3974                                                    } else {
3975                                                        threeDepthLi = fncCreateMenuNavElements("depth-3", "no-depth"
3976                                                            , item3.menuNm, item3.menuUrl, item3.menuCd);
3977                                                        
3978                                                        // 3뎁스 회원전용 여부 확인 및 class 추가
3979                                                        const isMemberOnly3 = isMemberOnlyMenu(item3.menuCd);
3980                                                        if (isMemberOnly3) {
3981                                                            const currentClass = threeDepthLi.getAttribute("class") || "";
3982                                                            threeDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
3983                                                        }
3984                                                    }
3985                                                    threeDepthUl.appendChild(threeDepthLi);
3986                                                    twoDepthLi.appendChild(threeDepthUl);
3987                                                });
3988                                            } else {
3989                                                twoDepthLi = fncCreateMenuNavElements("depth-2", "no-depth"
3990                                                    , item2.menuNm, item2.menuUrl, item2.menuCd);
3991                                                
3992                                                // 2뎁스 회원전용 여부 확인 및 class 추가
3993                                                const isMemberOnly2 = isMemberOnlyMenu(item2.menuCd);
3994                                                if (isMemberOnly2) {
3995                                                    const currentClass = twoDepthLi.getAttribute("class") || "";
3996                                                    twoDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
3997                                                }
3998                                            }
3999                                            twoDepthUl.appendChild(twoDepthLi);
4000                                        });
4001                                        oneDepthLi.appendChild(twoDepthUl);
4002                                    }
4003                                    menuNavUl.appendChild(oneDepthLi);
4004                                });
4005                                menuNavBody.appendChild(menuNavUl);
4006                                fncMenuNavAccodian();
4007                            },
4008                            error: function(xhr, status, error) {
4009                                console.error("회원전용 메뉴 체크 실패:", xhr, status, error);
4010                                console.error("응답 텍스트:", xhr.responseText);
4011                                // 에러 발생 시에도 메뉴는 생성
4012                                menuNavBody.appendChild(menuNavUl);
4013                                fncMenuNavAccodian();
4014                            }
4015                        });
4016                    },
4017                    error: function () {
4018                        console.error();
4019                    }
4020                });
4021            }
4022
4023            function fncCreateMenuNavElements(liClass, aClass, menuNm, menuUrl, menuCd) {
4024                const oneDepthLi = document.createElement("li");
4025                const oneDepthA = document.createElement('a');
4026
4027                // classList를 사용하여 class 추가 (기존 class 유지)
4028                if (liClass) {
4029                    oneDepthLi.className = liClass;
4030                }
4031                oneDepthA.setAttribute("href", menuUrl);
4032                oneDepthA.setAttribute("class", aClass);
4033                oneDepthA.innerText = menuNm;
4034                
4035                // menuCd가 있으면 data 속성 추가
4036                if (menuCd) {
4037                    oneDepthA.setAttribute("data-menu-cd", menuCd);
4038                    oneDepthA.setAttribute("data-menu-nm", menuNm);
4039                    oneDepthA.setAttribute("data-menu-url", menuUrl || "");
4040                }
4041                
4042                oneDepthLi.appendChild(oneDepthA);
4043                return oneDepthLi;
4044            }
4045
4046            /* Accodian menu*/
4047            function fncMenuNavAccodian() {
4048                const $depth1 = $('.nav-all .depth-1'),
4049                    $depth2 = $('.nav-all .depth-2'),
4050                    $depth3 = $('.nav-all .depth-3'), //depth-3 있을경우
4051                    $depth2_list = $('.nav-all .nav-list-depth2'),
4052                    $depth3_list = $('.nav-all .nav-list-depth3'),
4053                    $depth4_list = $('.nav-all .nav-list-depth4');
4054
4055                $depth1.children('.depth-menu').click(function () {
4056                    if ($(this).next().length > 0) {
4057                        if ($(this).next().css('display') === 'none') {
4058                            $depth2.find('.depth-menu').removeClass('active');
4059                            $depth1.children('.depth-menu').removeClass('active');
4060                            $(this).addClass('active');
4061                            $depth3_list.hide();
4062                            $depth2.find('.depth-menu').removeClass('active');
4063                            $depth2_list.slideUp(300);
4064                            $(this).next().stop(false, true).slideDown(300);
4065                        } else {
4066                            $depth2.find('.depth-menu').removeClass('active');
4067                            $(this).next().slideUp(200);
4068                            $depth1.children('.depth-menu').removeClass('active');
4069                        }
4070                        return false;
4071                    } else {
4072                    }
4073                });
4074
4075                $depth2.children('.depth-menu').click(function () {
4076                    if ($(this).next().length > 0) {
4077                        if ($(this).next().css('display') === 'none') {
4078                            $depth3_list.find('.depth-menu').removeClass('active');
4079                            $depth3_list.stop(false, true).slideUp(300);
4080                            $depth2.children('.depth-menu').removeClass('active');
4081                            $(this).addClass('active');
4082                            $(this).next().stop(false, true).slideDown(300);
4083                        } else {
4084                            $depth3_list.find('.depth-menu').removeClass('active');
4085                            $(this).removeClass('active');
4086                            $(this).next().stop(false, true).slideUp(300);
4087                            $depth2.children('.depth-menu').removeClass('active');
4088                        }
4089                        return false;
4090                    } else {
4091                    }
4092                });
4093                $depth3.children('.depth-menu').click(function () {
4094                    if ($(this).next().length > 0) {
4095                        if ($(this).next().css('display') === 'none') {
4096                            $depth4_list.find('.depth-menu').removeClass('active');
4097                            $depth4_list.stop(false, true).slideUp(300);
4098                            $depth2.children('.depth-menu').removeClass('active');
4099                            $(this).addClass('active');
4100                            $(this).next().stop(false, true).slideDown(300);
4101                        } else {
4102                            $depth4_list.find('.depth-menu').removeClass('active');
4103                            $(this).removeClass('active');
4104                            $(this).next().stop(false, true).slideUp(300);
4105                            $depth2.children('.depth-menu').removeClass('active');
4106                        }
4107                        return false;
4108                    } else {
4109                    }
4110                });
4111            };
4112
4113            //nav_body create End
4114            function openPopup(popupName, popupData) {
4115
4116                $.ajax({
4117                    url: "/openPopup.cm",
4118                    type: "POST",
4119                    dataType: "html",
4120                    data: {"popupName": popupName, "popupData": popupData},
4121                    success: function (html) {
4122                        if(popupName === 'HomeMainPopup'){
4123                            $("#mainPup").html(html);
4124                            showpop('mainPup');
4125                        }else{
4126                            $("#Certification-system").html(html);
4127                            showpop('Certification-system');
4128                        }
4129                    },
4130                    error: function () {
4131                        console.error();
4132                    }
4133                });
4134            }
4135
4136
4137            function fnLinkActive(){
4138                /*quick pc*/
4139                $('.quick-menu dd>a').on('mouseenter',function(){
4140                    $(this).addClass('active')
4141                });
4142                $('.quick-menu dd>a').on('mouseleave',function(){
4143                    $(this).removeClass('active')
4144                })
4145            }
4146        </script>
4146
4147        
4148        
4149
4150<script>
4151    (function () {
4152        var w = window;
4153        if (w.ChannelIO) {
4154            return w.console.error("ChannelIO script included twice.");
4155        }
4156        var ch = function () {
4157            ch.c(arguments);
4158        };
4159        ch.q = [];
4160        ch.c = function (args) {
4161            ch.q.push(args);
4162        };
4163        w.ChannelIO = ch;
4164
4165        function l() {
4166            if (w.ChannelIOInitialized) {
4167                return;
4168            }
4169            w.ChannelIOInitialized = true;
4170            var s = document.createElement("script");
4171            s.type = "text/javascript";
4172            s.async = true;
4173            s.src = "https://cdn.channel.io/plugin/ch-plugin-web.js";
4174            var x = document.getElementsByTagName("script")[0];
4175            if (x.parentNode) {
4176                x.parentNode.insertBefore(s, x);
4177            }
4178        }
4179
4180        if (document.readyState === "complete") {
4181            l();
4182        } else {
4183            w.addEventListener("DOMContentLoaded", l);
4184            w.addEventListener("load", l);
4185        }
4186    })();
4187
4188    ChannelIO('boot', {
4189        "pluginKey": "2e13e087-3d31-40f6-821f-020cd0113b4a"
4190    });
4191</script>
4191
4192    </body>
4193</html>

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.