PageSourceSearch

https://kpanet.or.kr/boardList.cm?menuCd=1002130000

html kpanet.or.kr collected 2026-10-02 10:52:06 UTC 134,595 bytes, 2,986 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=604AAE4277B68E851317805D0AFF5B7B">
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            
1313                
1314
1315<link rel="stylesheet" type="text/css" href="/css/home/board.css">
1316<link rel="stylesheet" type="text/css" href="/css/home/sub.css">
1317<link rel="stylesheet" type="text/css" href="/css/home/medicine.css">
1318<div class="container sub">
1319    <div class="sub-top">
1320        <div class="cont-visualbg">
1321            <div class="sub-copy">
1322                <div class="l-title">
1323                </div>
1324                <span>
1325                            전국의 8만 약사는 지역주민의 건강 지킴이로서 국민건강을<br>위해 최선을 다하고 있습니다.
1326                        </span>
1327            </div>
1328        </div>
1329    </div>
1330    <div class="breadcumb-dropdown bread-cumb-sticky">
1331        <div class="breadcumb_wrap">
1332            <div class="breadcumb-container">
1333                <a href="/main.cm" class="breadcumb_home">홈</a>
1334                <div class="breadcumb_item-inner">
1335                    <div class="swiper breadcumbr_Swiper">
1336                        <div class="swiper-wrapper">
1337                        </div>
1338                    </div>
1339                </div>
1340            </div>
1341        </div>
1342    </div>
1343    <div class="sub-content">
1344        <div class="sub-inner">
1345            <h3 class="sub-dep-title"></h3>
1346<script>
1347    $(document).ready(function(){
1348        const menuCd = "1002130000";
1349        if(menuCd !== ""){
1350            $.ajax({
1351                url: "/menuNavBodyListApi.cm",
1352                data: {hpageId : 0},
1353                type: "POST",
1354                success: function (resultData) {
1355                    const h3SubTitle = document.querySelector(".sub-inner>.sub-dep-title");
1356                    const menuData = resultData.list.filter(item => item.menuCd === Number(menuCd))[0];
1357                    h3SubTitle.innerText = menuData.menuNm;
1358                    fncCreateMenuBreadcrumb(resultData, menuCd);
1359                },
1360                error: function () {
1361                    console.error();
1362                }
1363            });
1364        }
1365
1366    });
1367
1368    function fncCreateMenuBreadcrumb(resultData, menuCd){
1369        const arrPathNm =
1370            resultData.list.filter(item => item.menuCd === Number(menuCd))[0];
1371        const arrHMenuData = resultData.list.filter(item => item.menuCd === Number(arrPathNm.hmenuCd))[0];
1372        const breadCrumbSwiper = document.querySelector(".breadcumbr_Swiper>div");
1373        const divContVisualBg = document.querySelector(".cont-visualbg");
1374        const spanContTitle = document.querySelector(".l-title");
1375
1376        if(arrHMenuData.menuSort === 1) {
1377            divContVisualBg.setAttribute("class", "cont-visualbg sub");
1378
1379        }else{
1380            divContVisualBg.setAttribute("class", "cont-visualbg sub0"
1381                + String(arrHMenuData.menuSort-1));
1382        }
1383
1384        spanContTitle.innerText = arrHMenuData.menuNm;
1385
1386        const divSwiperSlide = document.createElement("div");
1387        const divBreadCrumbItem = document.createElement("div");
1388        const aBreadCrumbButton = document.createElement("a");
1389        const divBreadCrumbDrawer = document.createElement("div");
1390        const ulBreadCrumbDepth = document.createElement("ul");
1391
1392        divSwiperSlide.setAttribute("class", "swiper-slide");
1393        divBreadCrumbItem.setAttribute("class", "breadcumb_item last-depth");
1394        aBreadCrumbButton.setAttribute("class", "breadcumb_button active");
1395        aBreadCrumbButton.innerText = arrPathNm.menuNm;
1396        divBreadCrumbDrawer.setAttribute("class", "breadcumb_drawer");
1397        ulBreadCrumbDepth.setAttribute("class", "breadcumb-depth");
1398
1399        resultData.list.filter(item => item.hmenuCd === Number(arrPathNm.hmenuCd)).forEach(
1400            function(downMenu) {
1401                const liItem = document.createElement("li");
1402                const aItem = document.createElement("a");
1403
1404                liItem.setAttribute("class", "item");
1405
1406                if(downMenu.attribCd === 1){
1407                    aItem.setAttribute("href", downMenu.menuUrl);
1408                }else {
1409                    aItem.setAttribute("href", downMenu.menuUrl);
1410                }
1411
1412                aItem.innerText = downMenu.menuNm
1413                liItem.appendChild(aItem);
1414                ulBreadCrumbDepth.appendChild(liItem);
1415            }
1416        );
1417
1418        divBreadCrumbDrawer.appendChild(ulBreadCrumbDepth);
1419        divBreadCrumbItem.appendChild(aBreadCrumbButton);
1420        divBreadCrumbItem.appendChild(divBreadCrumbDrawer);
1421        divSwiperSlide.appendChild(divBreadCrumbItem);
1422        breadCrumbSwiper.appendChild(divSwiperSlide);
1423
1424        breadCumnav();
1425    }
1426
1427    const breadCumbrSwiper = new Swiper(".breadcumbr_Swiper", {
1428        slidesPerView: 3,
1429        centeredSlides: false,
1430        breakpoints: { //반응형 조건 속성
1431            280: {
1432                spaceBetween: 0,
1433                slidesPerView: 1.5,
1434            },
1435            320: {
1436                spaceBetween: 0,
1437                slidesPerView: 2,
1438            },
1439            640: {
1440                spaceBetween: 0,
1441                slidesPerView:2,
1442            },
1443            700: {
1444                spaceBetween: 0,
1445                slidesPerView:3,
1446            },
1447        },
1448        loop: false,
1449    });
1450
1451    /*sub nav*/
1452    const  breadCumnav = function(){
1453        const $breadCumdown = $('.breadcumb-dropdown .breadcumb_item'),
1454            $breadCumbtn = $('.breadcumb_button'),
1455            $breadCumnlist = $('.breadcumb_drawer');
1456
1457        $breadCumdown.each(function(){
1458            $(this).find($breadCumbtn).click(function(){
1459                if ($(this).hasClass('on') == true) {
1460                    $(this).removeClass('on');
1461                    $(this).next().stop(false, true).slideUp(200);
1462                } else {
1463                    $breadCumnlist.stop(false, true).hide();
1464                    $breadCumbtn.removeClass('on');
1465                    $(this).next().stop(false, true).slideDown(100);
1466                    $(this).addClass('on');
1467                    $('.family-list').hide();
1468                    $('.family').removeClass('active');
1469                }
1470                return false;
1471            });
1472        });
1473    };
1474
1475</script>
1475
1476
1477                
1478
1479
1480
1481
1482
1483<!-- 작업 시작 점 -->
1484<div class="board-frame">
1485    <div class="tab-content">
1486        <div id="tab1">
1487            <form name="form" id="form" method="post">
1488                <input type="hidden" id="nPageNow" name="nPageNow" value="0">
1489                <input type="hidden" id="searchCondition" name="searchCondition" value="">
1490                <input type="hidden" id="searchKeyword" name ="searchKeyword" value="">
1491                <input type="hidden" id="menuUrl" name="menuUrl" value="">
1492                <input type="hidden" id="nNumPerPage" name="nNumPerPage" value="10">
1493                <input type="hidden" id="secretAccept" name="secretAccept">
1494                <input type="hidden" id="sortNm" name="sortNm">
1495                <input type="hidden" id="sortType" name="sortType">
1496            </form>
1497
1498                <div class="tab-top-frame">
1499                    <div class="total-left">Total<span class="borad-total" id="totalCount"></span></div>
1500                    <div class="total-right">
1501                        <div class="selectbox-frame-01">
1502                            <div class="form-group">
1503                                <select class="sort-form-select" id="viewCnt">
1504                                    
1505                                        
1506                                    
1507                                        
1508                                            <option data-value="10" selected>10개씩 보기
1509                                            </option>
1510                                            <option data-value="30" >30개씩 보기
1511                                            </option>
1512                                            <option data-value="50" >50개씩 보기
1513                                            </option>
1514                                        
1515                                    
1516                                        
1517                                    
1518                                        
1519                                    
1520                                        
1521                                    
1522                                        
1523                                    
1524                                        
1525                                    
1526                                        
1527                                    
1528                                        
1529                                    
1530                                        
1531                                    
1532                                        
1533                                    
1534                                        
1535                                    
1536                                        
1537                                    
1538                                        
1539                                    
1540                                        
1541                                    
1542                                </select>
1543                            </div>
1544                        </div>
1545                        <div class="selectbox-frame-02">
1546                            <div class="form-group">
1547                                <select class="sort-form-select" id="searchConditions">
1548                                    <option data-value="1">제목</option>
1549                                    <option data-value="2">내용</option>
1550                                    <option data-value="3">작성자</option>
1551                                </select>
1552                            </div>
1553                        </div>
1554                        <div class="serarch-framebox">
1555                            <div class="form-group btnbox-board">
1556                                <input type="text" id="searchKeywordText" name="searchKeywordText" class="input-control"
1557                                       placeholder="검색어를 입력하세요">
1558                                <span class="board-btn-r">
1559                                <button id="searchBtn" type="button" class="btn-frame">검색</button>
1560                            </span>
1561                            </div>
1562                        </div>
1563                    </div>
1564                </div>
1565            <div class="listable-cont">
1566                <div class="list_wrap">
1567
1568                    <div class="table_wrap" id="boardList">
1569
1570                    </div>
1571                </div>
1572            </div>
1573        </div>
1574    </div>
1575</div>
1576
1577<script>
1578    let viewCntSelect = document.getElementById("viewCnt");
1579    let selectedIndex = viewCntSelect.selectedIndex;
1580    let selectedOption = viewCntSelect.options[selectedIndex];
1581    let propList = [{"propCd":35227,"propVal":"Y","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":2,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35228,"propVal":"10","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":4,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35229,"propVal":"no","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":5,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35230,"propVal":"N","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":6,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35231,"propVal":"N","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":7,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35232,"propVal":"Y","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":8,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35233,"propVal":"3","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":9,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35235,"propVal":",MBT04,MBT02,MBT01,MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":12,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35236,"propVal":",MBT04,MBT02,MBT01,MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":13,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35237,"propVal":"MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":14,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35238,"propVal":"MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":15,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35239,"propVal":"MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":17,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35240,"propVal":"N","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":18,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35241,"propVal":"N","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":19,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0},{"propCd":35242,"propVal":",MBT04,MBT02,MBT01,MBT03","propFromWritingTerm":null,"propToWritingTerm":null,"regId":"kpaadmin","regDt":"2024-01-16 14:42:12","uptId":"kpaadmin","uptDt":"2024-01-16 14:42:12","setCd":20,"menuCd":1002130000,"setLbl":null,"setTxts":null,"setVals":null,"setType":null,"sectionCd":0}];
1582    let menuCd = propList[0].menuCd;
1583    let formattedTotalCount;
1584    let url;
1585    let sortNm = "regDt";
1586    let sortType = false;   //true -> ASC   /  false -> DESC
1587    let tyCode = "MBT04";
1588    let adminExtnMberYn = ""
1589    let lcnsNo = ""
1590
1591    /** 게시물 열람 (상세) 권한 */
1592    let detailAuth = propList.filter((item)=>item.setCd === 27 || item.setCd === 13)[0].propVal;
1593    let detailAuths = detailAuth.split(",").filter((elem) => elem !== "");
1594    if (detailAuths.includes('X')) detailAuths.push('MBT01');
1595    detailAuth = detailAuths.toString();
1596
1597    // 글 작성 권한
1598    let writingAuth = propList.filter((item)=>item.setCd === 28 || item.setCd === 14)[0].propVal;
1599    let writingAuths = writingAuth.split(",").filter((elem) => elem !== "");
1600    if (writingAuths.includes('X')) writingAuths.push('MBT01');
1601    writingAuth = writingAuths.toString();
1602
1603    console.log('tyCode : ', tyCode, ' / adminExtnMberYn : ', adminExtnMberYn)
1604    console.log('writingAuths : ', writingAuths)
1605    console.log('detailAuths : ', detailAuths)
1606
1607    let nNumPerPage = '10';
1608
1609    /** viewCnt 셀렉트/폼 값을 지정 페이지크기로 동기화 */
1610    function fnApplyViewCnt(val) {
1611        if (!val) return false;
1612        var sel = document.getElementById("viewCnt");
1613        for (var i = 0; i < sel.options.length; i++) {
1614            if (sel.options[i].dataset.value === String(val)) {
1615                sel.selectedIndex = i;
1616                document.form.nNumPerPage.value = val;
1617                return true;
1618            }
1619        }
1620        return false;
1621    }
1622
1623    /** 리스트 조회 함수 호출 */
1624    $(document).ready(() => {
1625        // 상세→목록 복귀 / 브라우저 뒤로가기 시 URL에 명시된 페이지 크기를 우선 복원
1626        var urlNumPerPage = null;
1627        try { urlNumPerPage = new URLSearchParams(window.location.search).get('nNumPerPage'); } catch (e) {}
1628        if (urlNumPerPage) {
1629            fnApplyViewCnt(urlNumPerPage);
1630        }
1631
1632        if('' === "") {
1633            fnBoardList(document.getElementById("nPageNow").value);
1634            fnTotalCount(document.getElementById("nPageNow").value);
1635        } else {
1636            if("" === "1"){
1637                document.getElementById("searchConditions").options[0].selected = true
1638                document.form.searchCondition.value = ""
1639            }else if("" === "2"){
1640                document.getElementById("searchConditions").options[1].selected = true
1641                document.form.searchCondition.value = ""
1642            }else if("" === "3"){
1643                document.getElementById("searchConditions").options[2].selected = true
1644                document.form.searchCondition.value = ""
1645            }
1646            // URL에 페이지크기가 없을 때만 기존 기본값 사용
1647            if (!urlNumPerPage) {
1648                document.form.nNumPerPage.value = selectedOption.dataset.value;
1649            }
1650            document.form.searchKeyword.value = ''
1651            document.getElementById("searchKeywordText").value = ''
1652            fnBoardList(document.getElementById("nPageNow").value);
1653            fnTotalCount(document.getElementById("nPageNow").value);
1654        }
1655
1656    });
1657
1658    function fnBoardList(nPageNow) {
1659        const form = $('#form')
1660        document.form.nPageNow.value = nPageNow;
1661        let searchConditions = document.getElementById("searchConditions");
1662        const selectedIndex = searchConditions.selectedIndex;
1663        const selectedOption = searchConditions.options[selectedIndex];
1664
1665
1666        document.form.sortNm.value = sortNm
1667        document.form.sortType.value = sortType === false ? "DESC" : "ASC"
1668        document.form.secretAccept.value = propList[2].propVal
1669
1670        // 브라우저 뒤로가기 시 현재 페이지/검색조건이 유지되도록 주소창 동기화 (AJAX 페이징 보완)
1671        try {
1672            var _page = (parseInt(nPageNow, 10) > 0) ? nPageNow : 1;
1673            var params = new URLSearchParams(window.location.search);
1674            params.set('menuCd', menuCd);
1675            params.set('nPageNow', _page);
1676            if (document.form.nNumPerPage.value) params.set('nNumPerPage', document.form.nNumPerPage.value);
1677            if (document.form.searchCondition.value) { params.set('searchCondition', document.form.searchCondition.value); }
1678            else { params.delete('searchCondition'); }
1679            if (document.form.searchKeyword.value) { params.set('searchKeyword', document.form.searchKeyword.value); }
1680            else { params.delete('searchKeyword'); }
1681            window.history.replaceState(null, '', window.location.pathname + '?' + params.toString());
1682        } catch (e) { /* URLSearchParams 미지원 등 - 무시 */ }
1683
1684        // AJAX 호출 전 전달 파라미터 출력
1685        const ajaxParams = form.serialize();
1686        // console.log("전달 파라미터:", ajaxParams);
1687
1688        $.ajax({
1689            url: "/boardListList.cm?menuCd=" + menuCd,
1690            type: "POST",
1691            dataType: "html",
1692            data: ajaxParams,
1693            success: function (html) {
1694                $("#boardList").html(html);
1695                fnIconConvert(sortNm, sortType);
1696            },
1697            error: function (xhr, status, error) {
1698                console.error("BoardList AJAX Error: ", status, error);
1699            }
1700        });
1701    }
1702
1703    let totalCount;
1704
1705    /*totCnt function */
1706    function fnTotalCount(nPageNow) {
1707        const form2 = $('#form')
1708        let searchConditions = document.getElementById("searchConditions");
1709        const selectedIndex = searchConditions.selectedIndex;
1710        const selectedOption = searchConditions.options[selectedIndex];
1711        document.form.searchCondition.value = selectedOption.dataset.value;
1712
1713        $.ajax({
1714            url: "/countTotCntApi.cm?menuCd=" + menuCd,
1715            type: "POST",
1716            data: form2.serialize(),
1717            success: function (result, status, xr) {
1718                totalCount = result.data;
1719                if(totalCount === undefined){
1720                    formattedTotalCount = 0
1721                } else {
1722                    formattedTotalCount = totalCount.toLocaleStr
1722ing();
1723                }
1724                $('#totalCount').html(formattedTotalCount);
1725            },
1726            error: function (xhr, status, error) {
1727                console.error("TotalCount AJAX Error: ", status, error);
1728            }
1729        });
1730    }
1731
1732    /* 검색창 엔터키 이벤트 */
1733    document.getElementById("searchKeywordText").addEventListener("keydown", (e) => {
1734        if (e.key === "Enter") document.getElementById("searchBtn").click();
1735    });
1736
1737    /* 검색버튼 조회 */
1738    document.getElementById("searchBtn").addEventListener("click", () => {
1739        document.form.searchKeyword.value = document.getElementById("searchKeywordText").value
1740        let searchConditions = document.getElementById("searchConditions");
1741        const selectedIndex = searchConditions.selectedIndex;
1742        const selectedOption = searchConditions.options[selectedIndex];
1743        document.form.searchCondition.value = selectedOption.dataset.value;
1744
1745        fnBoardList(1);
1746        fnTotalCount(1);
1747    });
1748
1749    /* 보기 갯수 조회 */
1750    document.getElementById("viewCnt").addEventListener("change", (e) => {
1751
1752        const viewCntSelect = document.getElementById("viewCnt");
1753        const selectedIndex = viewCntSelect.selectedIndex;
1754        const selectedOption = viewCntSelect.options[selectedIndex];
1755
1756        document.form.nNumPerPage.value = selectedOption.dataset.value
1757        document.form.nPageNow.value = 1
1758
1759        fnBoardList(1);
1760        fnTotalCount(1);
1761
1762    });
1763
1764    /* 조회수 증가 function */
1765
1766    function fnCountUpHistCnt(boardSeq, regId, secretYn, rowNum) {
1767        if (secretYn === 'Y') {
1768            if ((regId === "") || (adminExtnMberYn === 'Y')) {
1769                $.ajax({
1770                    url: '/countUpHistCntApi.cm',
1771                    type: 'POST',
1772                    data: {boardSeq: boardSeq},
1773                    success: function () {
1774                        fnGoToBoardDetailPage(boardSeq, rowNum);
1775                    },
1776                    error: function (jqXHR, textStatus, errorThrown) {
1777                        console.log('AJAX Error:', textStatus, errorThrown);
1778                    }
1779                });
1780            } else {
1781                fnRejectDetailPopup()
1782            }
1783        } else {
1784            $.ajax({
1785                url: '/countUpHistCntApi.cm',
1786                type: 'POST',
1787                data: {boardSeq: boardSeq},
1788                success: function () {
1789                    fnSelectLastYearMemberCnt(boardSeq, rowNum);
1790                },
1791                error: function (jqXHR, textStatus, errorThrown) {
1792                    console.log('AJAX Error:', textStatus, errorThrown);
1793                }
1794            });
1795        }
1796    }
1797
1798    // 직전년도 신상신고 된 회원 추가 조회를 위한 펑션 분리
1799    function fnSelectLastYearMemberCnt(boardSeq, rowNum) {
1800        var date = new Date();
1801        var month = date.getMonth() + 1;
1802        // 6월 이전에는 직전년도 신상신고 된 회원도 게시판 접근이 가능해야함
1803        if (month < 6) {
1804            $.ajax({
1805                url: '/lastYearMemberCnt.cm',
1806                type: 'POST',
1807                data: {lcnsNo: lcnsNo},
1808                success: function (result) {
1809                    // 직전년도 신상신고 카운트가 1이거나 현재 권한이 MBT01 또는 MBT03 일 경우 상세 페이지 접근
1810                    if (result.data === 1 || detailAuth.includes(tyCode)) {
1811                        fnGoToBoardDetailPage(boardSeq, rowNum);
1812                    } else {
1813                        fnRejectDetailPopup();
1814                    }
1815                },
1816                error: function (jqXHR, textStatus, errorThrown) {
1817                    console.log('AJAX Error:', textStatus, errorThrown);
1818                }
1819            });
1820        } else {
1821            if (detailAuth.includes(tyCode)) {
1822                fnGoToBoardDetailPage(boardSeq, rowNum)
1823            } else {
1824                fnRejectDetailPopup()
1825            }
1826        }
1827    }
1828
1829    /* 비밀글 조회 불가 팝업 노출 - 기획자 요청으로 주석 처리- */
1830    function fnRejectDetailPopup() {
1831        openPopup("HomeMenuAuthPopup", {
1832                flag: "success",
1833                message: "게시글 보기 권한이 없습니다.",
1834            }
1835        )
1836    }
1837
1838    function fnRejectWritePopup() {
1839        openPopup("HomeMenuAuthPopup", {
1840                flag: "success",
1841                message: "게시글 작성 권한이 없습니다.",
1842            }
1843        )
1844    }
1845
1846    /* 상세페이지 이동 function */
1847    function fnGoToBoardDetailPage(boardSeq, rowNum) {
1848        if (partCd === '') {
1849            document.form.action = "/board.cm?menuCd="+Number(menuCd)+"&boardSeq="+boardSeq + "&rowNum="+rowNum;
1850        } else {
1851            document.form.action = "/kpa" + partCd + "/board.cm?menuCd=" + Number(menuCd) + "&boardSeq=" + boardSeq + "&rowNum="+rowNum;
1852        }
1853        document.form.submit();
1854    }
1855
1856    /* 등록페이지 이동 function */
1857    function fnGoToBoardRegistPage() {
1858        if (writingAuth.includes(tyCode)) {
1859            if (partCd === '') {
1860                document.form.action = "/boardRegist.cm?menuCd="+Number(menuCd);
1861            } else {
1862                document.form.action = "/kpa" + partCd + "/boardRegist.cm?menuCd=" + menuCd;
1863            }
1864            document.form.submit();
1865        } else {
1866            fnRejectWritePopup();
1867        }
1868    }
1869
1870    /* sort 조회 */
1871    function fnLineUp(sortDiv) {
1872        sortNm = sortDiv
1873        sortType = !sortType;
1874        fnBoardList(1)
1875    }
1876
1877    /* 등록일, 조회 sort icon 변경 */
1878    function fnIconConvert(sortNm, sortType) {
1879        let element = document.getElementById(sortNm);
1880        if (sortType === false) {
1881            element.classList.remove('active');
1882        } else {
1883            element.classList.add('active');
1884        }
1885    }
1886
1887</script>
1887
1888
1889                
1890
1891
1892    </div>
1893  </div>
1894</div>
1895
1896
1897            
1898        
1899        
1900
1901
1902
1903<!--고정 배너광고 St-->
1904<div class="advertisement-banner">
1905    <div class="banner-frame">
1906        <div class="banner-inner">
1907            <div class="swiper banner_Swiper">
1908                <div class="swiper-wrapper" id="bottomBanner">
1909
1910                    <div class="swiper banner_Swiper">
1911                    </div>
1912                    <div class="swiper-button-next sm_btn3"></div>
1913                    <div class="swiper-button-prev sm_btn3"></div>
1914                </div>
1915            </div>
1916        </div>
1917    </div>
1918</div>
1919<!--//고정 배너광고 Ed-->
1920<footer>
1921    <div class="footer-top">
1922        <div class="footer-inner">
1923            <div class="footer-menu">
1924                <span id="termsList">
1925
1926                </span>
1927                <span id="leftFooter">
1928
1929                </span>
1930            </div>
1931            <div class="family-site">
1932                
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942            </div>
1943        </div>
1944    </div>
1945    <div class="footer-bottom">
1946        <div class="foote-bottom-inner">
1947            <a href="#a" class="footer-logo">대한 약사회</a>
1948            <address>
1949                <span><em>주소</em>06708 서울특별시 서초구 효령로 194 (서초3동 1489-3)</span><span>전화<em>02-581-1201</em></span><span>팩스<em>02-585-7630</em></span>
1950                <div class="copyright">ⓒ 2017 by The Korean Pharmaceutical Association All rights reserved.</div>
1951            </address>
1952        </div>
1953    </div>
1954</footer>
1955<script>
1956
1957    /** 하단 배너 데이터 조회 */
1958    $(document).ready(() => {
1959        fnSelectBottomBanner();
1960        fnSelectFooter();
1961        fnSelectTerms();
1962    });
1963
1964    /***************************************************
1965     * 하단 배너 조회
1966     * *************************************************/
1967    function fnSelectBottomBanner() {
1968        $.ajax({
1969            url: "/mainBannerList.cm",
1970            type: 'POST',
1971            data: {
1972                hpageId: 0,
1973                bannerType: 'B'
1974            },
1975            success: function (resultData) {
1976
1977                // console.log("resultData", resultData);
1978
1979                let content = "";
1980                content +=
1981                    `
1982                    <div class="swiper-slide">
1983                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260601141253802" target="_blank">
1984                            <div class="brand_wrap">
1985                                <div class="brand_bx">
1986                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260601141253802" alt="맞춤 OTC 개정"></span>
1987                                </div>
1988                            </div>
1989                        </a>
1990                    </div>
1991
1992                    <div class="swiper-slide">
1993                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260330170622742" target="_blank">
1994                            <div class="brand_wrap">
1995                                <div class="brand_bx">
1996                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260330170622742" alt=""></span>
1997                                </div>
1998                            </div>
1999                        </a>
2000                    </div>
2001
2002                    <div class="swiper-slide">
2003                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20250528165142222" target="_blank">
2004                            <div class="brand_wrap">
2005                                <div class="brand_bx">
2006                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20250528165142222" alt=""></span>
2007                                </div>
2008                            </div>
2009                        </a>
2010                    </div>
2011
2012                    <div class="swiper-slide">
2013                        <a href="http://zone.marketingtools.kr/api/v1/banner/click?accountBannerCode=ACBN20260529164328497" target="_blank">
2014                            <div class="brand_wrap">
2015                                <div class="brand_bx">
2016                                    <span class="product-frame"><img src="http://zone.marketingtools.kr/api/v1/banner/image?accountBannerCode=ACBN20260529164328497" alt=""></span>
2017                                </div>
2018                            </div>
2019                        </a>
2020                    </div>
2021
2022                    <!-- 광고문의 배너 -->
2023                    <!--<div class="swiper-slide">
2024                        <a href="https://www.health.kr/notice/inquireAd.asp" target="_blank">
2025                            <div class="brand_wrap">
2026                                <div class="brand_bx">
2027                                    <span class="product-frame"><img src="https://manage.marketingtools.kr/api/image/v1/showImage?filename=banner/upload/20250804/20250804151729846.png" alt=""></span>
2028                                </div>
2029                            </div>
2030                        </a>
2031                    </div>-->`;
2032
2033                // 동적 배너 노출 중단 - 하드코딩된 배너만 노출 (아래 forEach 는 if(false) 로 숨김 처리)
2034                if (false) {
2035                    resultData.list.forEach((elem, index) => {
2036
2037                        let pcImgUrl;
2038
2039                        if (elem.bannerFile !== "") {
2040
2041                            pcImgUrl = '' + elem.bannerFiles[0].filePath;
2042
2043                            let pattern = /https?:\/\/(?:www\.)?[^\s]+/g;
2044                            let matchUrl = elem.linkAddr.match(pattern);
2045
2046                            /** linkUrl의 값이 url 형태일 때만 새탭 띄우기 */
2047                            if(matchUrl !== null){
2048                                content +=
2049                                    `<div class="swiper-slide">
2050                                        <a href="${elem.linkAddr}" target="_blank">
2051                                            <div class="brand_wrap">
2052                                                <div class="brand_bx">
2053                                                    <span class="product-frame"><img src="https://www.kpanet.or.kr${pcImgUrl}" alt=""></span>
2054                                                </div>
2055                                            </div>
2056                                        </a>
2057                                    </div>`
2058                            }
2059                            else{
2060                                content +=
2061                                    `<div class="swiper-slide">
2062                                        <div class="brand_wrap">
2063                                            <div class="brand_bx">
2064                                                <span class="product-frame"><img src="https://www.kpanet.or.kr${pcImgUrl}" alt=""></span>
2065                                            </div>
2066                                        </div>
2067
2068                                    </div>`
2069                            }
2070
2071                        }
2072
2073                    });
2074                }
2075
2076                document.getElementById("bottomBanner").innerHTML = content;
2077            },
2078            error: function (xhr) {
2079                console.error(xhr);
2080            }
2081        });
2082
2083    }
2084
2085    /***************************************************
2086     * 푸터 조회
2087     * *************************************************/
2088    function fnSelectFooter() {
2089        $.ajax({
2090            url:"/mainFooterList.cm",
2091            type:'POST',
2092            data:{
2093                hpageId:0
2094            },
2095            success: function (resultData) {
2096
2097                if(resultData.list.length > 0){
2098                    const leftFooter = resultData.list.filter(item => item.footerType === 'L');
2099                    const rightFooter = resultData.list.filter(item => item.footerType === 'R');
2100                    let aLeftFooter;
2101
2102                    leftFooter.forEach(elem => {
2103                        aLeftFooter += `<a target="_blank" href="${elem.linkUrl}">${elem.footerTitle}</a>`
2104
2105                    });
2106
2107                    /** 좌측 푸터 placeAt */
2108                    document.getElementById("leftFooter").innerHTML = aLeftFooter;
2109
2110                    if(rightFooter.length > 0){
2111                        const parentData = rightFooter.filter(item => item.pid === 0);
2112                        const childData = rightFooter.filter(item => item.pid !== 0);
2113
2114                        parentData.forEach(item => {
2115                            const divParent = document.createElement('div');
2116                            divParent.setAttribute('class', 'family');
2117                            const btnParent = document.createElement('button');
2118                            btnParent.setAttribute('type', 'button');
2119                            btnParent.setAttribute('class', 'select-btn');
2120                            const iParent = document.createElement('i');
2121                            iParent.setAttribute('class', 'icon');
2122                            iParent.innerText = item.footerTitle;
2123                            btnParent.appendChild(iParent);
2124
2125                            const divFamily = document.createElement('div');
2126                            divFamily.setAttribute('class', 'family-list');
2127                            const div2 = document.createElement('div');
2128                            childData.forEach(item2 => {
2129
2130                                if(item.footerSeq === item2.pid) {
2131                                    const aChild = document.createElement('a');
2132                                    aChild.setAttribute('href', item2.linkUrl);
2133                                    aChild.setAttribute('target', '_blank');
2134                                    aChild.innerText = item2.footerTitle;
2135                                    div2.appendChild(aChild);
2136                                }
2137                            });
2138
2139                            divFamily.appendChild(div2);
2140                            divParent.appendChild(btnParent);
2141                            divParent.appendChild(divFamily);
2142                            document.querySelector('.family-site').appendChild(divParent);
2143                        });
2144                        fnFamilySite();
2145                    }
2146                }
2147            },
2148            error: function (xhr) {
2149                console.error(xhr);
2150            }
2151        });
2152
2153    }
2154
2155    /***************************************************
2156     * 약관 탭 이름 조회(code_id = KPA999)
2157     * *************************************************/
2158    function fnSelectTerms() {
2159        $.ajax({
2160            url: "/mainTermsList.cm",
2161            type: 'POST',
2162            success: function (resultData) {
2163
2164                let content = ""
2165
2166                resultData.list.forEach((elem, index) => {
2167
2168                    if(index < 3){
2169                        if(index === 1){
2170                            content += `<a style="font-weight: bold" href="/terms.cm?termsPart=TE00${index+1}">${elem.codeNm}</a>`
2171                        } else {
2172                            content += `<a href="/terms.cm?termsPart=TE00${index+1}">${elem.codeNm}</a>`
2173                        }
2174                    }
2175                });
2176
2177                document.getElementById("termsList").innerHTML = content;
2178
2179            },
2180            error: function (xhr) {
2181                console.error(xhr);
2182            }
2183        });
2184    }
2185    function fnFamilySite(){
2186        /*familysite*/
2187        $('.family').on("click", function(){
2188            if (!$(this).hasClass('active')) {
2189                $('.family-list').parent('.family').removeClass('active');
2190                $('.family-list').hide();
2191                $(this).addClass('active');
2192                $(this).find('.family-list').slideDown(0);
2193                $('.breadcumb_button').removeClass('on');
2194                $('.breadcumb_drawer').css('display','none');
2195            } else if ($(this).hasClass('active')) {
2196                $(this).removeClass('active');
2197                $(this).find('.family-list').slideUp(0);
2198            }
2199        });
2200    }
2201
2202    //고정배너 swiper
2203    const footerBannerSwiper = new Swiper(".banner_Swiper", {
2204        // slidesPerView: 4,
2205        slidesPerView: 'auto',
2206        freeMode: true,
2207        centeredSlides: false,
2208        breakpoints: { //반응형 조건 속성
2209            280: {
2210                spaceBetween: 15,
2211                slidesPerView: 1,
2212            },
2213            320: {
2214                spaceBetween: 15,
2215                slidesPerView: 1.2,
2216            },
2217            400: {
2218                spaceBetween: 15,
2219                slidesPerView: 2,
2220            },
2221            700: {
2222                spaceBetween: 15,
2223                slidesPerView: 3,
2224            },
2225            768: {
2226                spaceBetween: 15,
2227                slidesPerView: 3,
2228            },
2229            980: {
2230                // slidesPerView: 4,
2231                slidesPerView: 'auto',
2232                spaceBetween: 27,
2233            },
2234
2235        },
2236        loop: false,
2237        navigation: {
2238            nextEl: ".swiper-button-next.sm_btn3",
2239            prevEl: ".swiper-button-prev.sm_btn3",
2240        },
2241        on: {
2242            init: function () {
2243                adjustSlideWidths();
2244            },
2245            resize: function () {
2246                adjustSlideWidths(); // 화면 크기 변경 시에도 적용
2247            }
2248        }
2249    });
2250    function adjustSlideWidths() {
2251        const slides = document.querySelectorAll('.banner_Swiper .swiper-slide');
2252        const containerWidth = document.querySelector('.banner_Swiper').offsetWidth;
2253
2254        slides.forEach((slide, index) => {
2255            // if (index === 0) {
2256            //     slide.style.width = Math.min(containerWidth, 580) + "px"; // 580px을 넘지 않도록 설정
2257            // } else {
2258            //     slide.style.width = "283.5px";
2259            // }
2260            slide.style.width = "283.5px";
2261        });
2262    }
2263</script>
2263
2264
2265
2266    
2266<script>
2267
2268    function __setCookie(name, value) {
2269        var todayDate = new Date();
2270        todayDate.setDate(todayDate.getDate() + 1);
2271        document.cookie = name + '=' + escape(value) + '; path=/; expires=' + todayDate.toGMTString() + ';'
2272    }
2273
2274    //쿠키 불러오기
2275    function __getCookie(name) {
2276        var obj = name + "=";
2277        var x = 0;
2278        while (x <= document.cookie.length) {
2279            var y = (x + obj.length);
2280            if (document.cookie.substring(x, y) == obj) {
2281                if ((endOfCookie = document.cookie.indexOf(";", y)) == -1)
2282                    endOfCookie = document.cookie.length;
2283                    return unescape(document.cookie.substring(y, endOfCookie));
2284            }
2285            x = document.cookie.indexOf(" ", x) + 1;
2286
2287            if (x == 0) break;
2288        }
2289        return "";
2290    }
2291    // JWT 토큰 검증 후 조건에 맞으면 쿠키 삭제
2292    function checkAndDeleteAccessToken() {
2293    // 쿠키에서 accessToken 가져오기
2294
2295        const accessToken = __getCookie('accessToken');
2296
2297
2298        if (!accessToken) {
2299            console.log('accessToken이 쿠키에 없습니다.');
2300            return;
2301        }
2302
2303        console.log('accessToken 검증 시작...');
2304
2305        // API 요청
2306        fetch('/checkJwtTime.cm?jwtToken=' + encodeURIComponent(accessToken), {
2307            method: 'GET',
2308            headers: {
2309            'Content-Type': 'application/json'
2310            }
2311        })
2312        .then(response => response.json())
2313        .then(data => {
2314            console.log('JWT 검증 결과:', data);
2315
2316            // 2025년 10월 30일 18시~22시 범위에 있는 토큰인 경우
2317            if (data.list.isValid) {
2318                console.log('✅ 해당 시간 범위의 토큰입니다. 쿠키에서 삭제합니다.');
2319
2320                // accessToken 쿠키 삭제
2321                __setCookie('accessToken', '');
2322
2323                // 필요한 경우 추가 처리
2324                alert('세션이 만료되었습니다. 다시 로그인해주세요.');
2325                fnLogout();
2326                // window.location.href = '/login.cm'; // 로그인 페이지로 리다이렉트
2327            } else {
2328                console.log('❌ 해당 시간 범위가 아닙니다. 쿠키를 유지합니다.');
2329            }
2330        })
2331        .catch(error => {
2332            console.error('JWT 검증 중 오류 발생:', error);
2333        });
2334    }
2335
2336    checkAndDeleteAccessToken();
2337    </script>
2337
2338
2339
2340</div>
2341
2342        <!--전체메뉴 St-->
2343        <div class="nav-all_bg"></div>
2344        <aside class="nav-all">
2345            <div class="nav_head ">
2346                <!--mobile top content St-->
2347                <div class="mobile-top-content">
2348                    <div class="mo-utill">
2349                        <div class="mobile-sns">
2350                            <a href="#a" class="mo-facebook">Facebook</a>
2351                            <a href="#a" class="mo-instagram">Facebook</a>
2352                            <a href="#a" class="mo-youtube">Facebook</a>
2353                        </div>
2354                        <div class="mo-user">
2355                            <ul>
2356                                
2357                                    <li id="btnUnityLoginMo"><a href="#a" onclick="openModal('unityMberLoginPopup')" class="login" id="">로그인</a></li>
2358                                
2359                                
2360
2361
2362                                
2363                                    <li id="btnUnityRegistMo"><a href="#a" class="login"  onclick="openModal('unityMberRegistPopup')">회원등록</a></li>
2364                                
2365                                <li><a href="/home/eng/main.cm" class="register">EN</a></li>
2366                            </ul>
2367                        </div>
2368
2369                    </div>
2370                    
2371
2372
2373
2374
2375
2376  
2377    
2378    <div class="select-contnet" id="loginMberLinkMo" style="display:none">
2379      <div class="dropdown_item">
2380        <button class="dropdown_button" type="button">선택하세요</button>
2381        <div class="dropdown_drawer">
2382          <ul class="dropdown-depth">
2383            <li class="item"><a href="https://member.kpanet.or.kr/">회원 신고</a></li>
2384            <li class="item"><a href="https://license.kpanet.or.kr/">면허 신고</a></li>
2385            <li class="item"><a href="https://edu.kpanet.or.kr/cyber.cm">대한약사회 사이버연수원</a></li>
2386            <li id="loginMoHomeUrl" class="item"><a href="/">대한약사회 홈페이지</a></li>
2387            
2388              
2389              
2390                <li class="item">
2391                  
2392                  
2393                  
2394                  
2395                  
2396                  
2397                  
2398                  
2399                  
2400                  
2401                </li>
2402              
2403            
2404            
2405          </ul>
2406        </div>
2407      </div>
2408    </div>
2409  
2410
2411
2412  <div class="user-mobile-info" id="loginMberInfosMo" style="display:none">
2413    <strong> 님</strong>
2414    
2415    
2416      <a href="/mypage.cm" class="mypage-btn" id="loginMypageMoUrl">
2417        My Page
2418      </a>
2419    
2420  </div>
2421
2422
2423<script>
2424
2425  $(document).ready(function (){
2426    // 현재 페이지가 지부인지 분회인지 확인.
2427    // 현재링크 kpa있으면 지부분회 / 없으면 대한약사회
2428
2429    // 마지막 00으로 끝나면 지부 / 아니면 분회
2430    let domainPath = window.location.pathname; //ex) /kpa0100/~~~~~~~
2431    let regionCode = domainPath.substring(1); //첫 "/"글자 제거
2432    regionCode = regionCode.substring(0,regionCode.indexOf("/"));
2433
2434    if(regionCode.indexOf("kpa0") > -1){
2435      // mypage 지부분회 mypage 로 수정
2436      document.getElementById("loginMypageMoUrl").href="/"+regionCode+"/mypage.cm";
2437
2438      // 지부분회
2439      regionCode = regionCode.substring(regionCode.length -2,regionCode.length)//맨뒤 두자리 제거
2440
2441      if(regionCode === "00"){
2442        //지부
2443        if(document.getElementById("loginMOBrachUrl")  && document.getElementById("loginMOBrachUrl") != null){
2444          document.getElementById("loginMOBrachUrl").style.display="none";
2445        }
2446      }else{
2447        //분회
2448        if(document.getElementById("loginMOPartUrl")  && document.getElementById("loginMOPartUrl") != null){
2449          document.getElementById("loginMOPartUrl").style.display="none";
2450        }
2451      }
2452
2453    }else{
2454      // 대한약사회
2455      if(document.getElementById("loginMoHomeUrl")  && document.getElementById("loginMoHomeUrl") != null){
2456        // 대약회 숨기기
2457        document.getElementById("loginMoHomeUrl").style.display="none";
2458      }
2459    }
2460
2461  });
2462
2463  /!* 로그인 후 회원정보 보이기 모바일*!/
2464  function fnLoginMberInfoShowMo(){
2465
2466    document.getElementById("loginMberInfosMo").style.display="block";
2467    if(document.getElementById("loginMberLinkMo") != null && document.getElementById("loginMberLinkMo")){
2468      document.getElementById("loginMberLinkMo").style.display="block";
2469    }
2470
2471  }
2472  /!* 로그아웃 후 회원정보 숨기기 모바일*!/
2473  function fnLoginMberInfoNoShowMo(){
2474
2475    document.getElementById("loginMberInfosMo").style.display="none";
2476    if(document.getElementById("loginMberLinkMo") != null && document.getElementById("loginMberLinkMo")){
2477      document.getElementById("loginMberLinkMo").style.display="none";
2478    }
2479  }
2480</script>
2480
2481
2482                </div>
2483                <!--//mobile top content Ed-->
2484                <!-- drawer- close St-->
2485                <div class="gnb-all closebtn"  id="moNavClose">
2486                    <button type="button" class="gnb-all-btn" title="닫기">
2487                        <span></span>
2488                        <span></span>
2489                        <span></span>
2490                    </button>
2491                </div>
2492                <!--// drawer- close Ed-->
2493            </div>
2494            <div class="nav_body">
2495
2496            </div>
2497        </aside>
2498        <!--//전체메뉴 Ed-->
2499        <!--modal-popup St-->
2500        <div class="modal-popup fade" id="Certification-system"></div>
2501        <div class="modal-popup-main" id="mainPup" style="display:none;"></div>
2502        <!--//modal-popup Ed-->
2503        <!--float menu  St-->
2504        <div id="floatMenu">
2505            <dl class="quick-menu">
2506
2507            </dl>
2508            <button type="button" class="btTop">
2509                <span><img src="/images/home/common/top_arrow.png" alt="top">TOP</span>
2510            </button>
2511        </div>
2512        <!--//float menu  St-->
2513        <!--mobile floatmenu St-->
2514        <div class="zoom">
2515            <a class="zoom-fab zoom-btn-large" id="zoomBtn"></a>
2516            <ul class="zoom-menu" id="quickMenuMo">
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526            </ul>
2527            <div class="quick-dim"></div>
2528        </div>
2529        <!--//mobile floatmenu Ed-->
2530        <button type="button" class="btTop-mobile">
2531            <span><img src="/images/home/common/arrow_top.svg" alt="top">TOP</span>
2532        </button>
2533        
2533<script>
2534
2535            $(document).ready(function () {
2536                let domainPath = window.location.pathname; //ex) /kpa0100/~~~~~~~
2537                let regionCode = domainPath.substring(1); //첫 "/"글자 제거
2538                regionCode = regionCode.substring(0,regionCode.indexOf("/"));
2539
2540                if(regionCode.indexOf("kpa0") > -1){
2541                    // mypage 지부분회 mypage 로 수정
2542                    document.getElementById("loginMyPageMobileUrl").href="/"+regionCode+"/mypage.cm";
2543
2544                    // // 지부분회
2545                    // regionCode = regionCode.substring(regionCode.length -2,regionCode.length)//맨뒤 두자리 제거
2546                    //
2547                    // if(regionCode === "00"){
2548                    //     //지부
2549                    //     if(document.getElementById("loginPCBrachUrl")  && document.getElementById("loginPCBrachUrl") != null){
2550                    //         document.getElementById("loginPCBrachUrl").style.display="none";
2551                    //     }
2552                    // }else{
2553                    //     //분회
2554                    //     if(document.getElementById("loginPCPartUrl")  && document.getElementById("loginPCPartUrl") != null){
2555                    //         document.getElementById("loginPCPartUrl").style.display="none";
2556                    //     }
2557                    // }
2558
2559                }else{
2560                    // 대한약사회
2561                    // if(document.getElementById("loginPCHomeUrl")  && document.getElementById("loginPCHomeUrl") != null){
2562                    //     // 대약회 숨기기
2563                    //     document.getElementById("loginPCHomeUrl").style.display="none";
2564                    // }
2565                }
2566
2567                // sso 로그인 처리
2568                const requestUri = "";
2569                if (requestUri && requestUri === "/ssoLogin.cm") {
2570                    const loginInfo = "";
2571                    const redirectUri = "";
2572                    if (loginInfo && redirectUri) {
2573                        return location.href=redirectUri;
2574                    } else {
2575                        return location.href="/main.cm";
2576                    }
2577                }
2578
2579                fncCreateMenuNavBody();
2580                $("#moNavClose").click(function(){
2581                    $('body').removeClass("scrolloff");
2582                });
2583
2584            });
2585
2586            /** 퀵링크 생성 함수 -> 메뉴 gnb요청이 성공한 수 실행 */
2587            function fnQuickLink(mapObj){
2588
2589                $.ajax({
2590                    url:'/mainQuickLinkList.cm',
2591                    type:'POST',
2592                    async:false,
2593                    data:{hpageId:0},
2594                    success:function(resultData){
2595                        const list = resultData.list
2596
2597                        let content = `<dt>QUICK<br>LINK</dt>`;
2598                        let contentMo = '';
2599
2600                        list.forEach((elem,index)=>{
2601
2602                            if(elem.quickLinkFile.filePath !== null && elem.quickLinkFile.filePath !== ''){
2603                            }
2604                                document.documentElement.style.setProperty(`--image-path${index+1}`, 'url(' + ''+elem.quickLinkFile.filePath + ')');
2605
2606                            // 내부 메뉴
2607                            if(elem.linkType === '1'){
2608
2609                                elem.linkUrl = mapObj[parseInt(elem.linkUrl)].menuUrl
2610                                content += `<dd><a href="${elem.linkUrl}" class="quick0${index+1}">${elem.quickLinkTitle}</a></dd>`
2611                                contentMo += `<li><a href="${elem.linkUrl}" class="zoom-fab zoom-btn-sm scale-transition scale-outscale-transition scale-out">${elem.quickLinkTitle}</a></li>`
2612                            // 외부 메뉴
2613                            }else{
2614                                content += `<dd><a target='_blank' href="${elem.linkUrl}" class="quick0${index+1}">${elem.quickLinkTitle}</a></dd>`
2615                                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>`
2616                            }
2617
2618                        });
2619
2620                        document.querySelector('.quick-menu').innerHTML = content;
2621                        $("#quickMenuMo").html(contentMo)
2622
2623                    },
2624                    error:function(xhr){
2625                        console.error(xhr);
2626                    }
2627                })
2628            }
2629
2630            //nav_body create Start
2631            function fncCreateMenuNavBody() {
2632                const menuNavBody = document.querySelector(".nav_body");
2633                const menuNavUl = document.createElement('ul');
2634
2635                $.ajax({
2636                    url: "/menuNavBodyListApi.cm",
2637                    data: {hpageId : 0},
2638                    type: "POST",
2639                    success: function (resultData) {
2640
2641                        const mapObj = {};
2642                        resultData.list.forEach(item => {
2643                            mapObj[item.menuCd] = item;
2644                        });
2645
2646                        // 퀵링크 생성
2647                        fnQuickLink(mapObj);
2648                        fnLinkActive();
2649
2650                        // 모든 메뉴 코드 수집
2651                        const allMenuCds = resultData.list.map(item => item.menuCd);
2652
2653                        // 회원전용 여부 일괄 체크
2654                        $.ajax({
2655                            url: "/checkMenuMemberOnlyBatchApi.cm",
2656                            data: {menuCds: allMenuCds},
2657                            type: "POST",
2658                            dataType: "json",
2659                            traditional: true,
2660                            success: function (memberOnlyResult) {
2661                                const memberOnlyMap = memberOnlyResult.data || {};
2662
2663                                // 회원전용 여부 확인 헬퍼 함수
2664                                function isMemberOnlyMenu(menuCd) {
2665                                    if (!menuCd) return false;
2666                                    const menuCdNum = parseInt(menuCd, 10);
2667                                    // menuCd가 1002200000인 경우 하드코딩으로 회원전용 처리
2668                                    if (menuCd == '1002200000') {
2669                                        return true;
2670                                    }
2671                                    return memberOnlyMap[menuCd] === true || 
2672                                           memberOnlyMap[String(menuCd)] === true ||
2673                                           memberOnlyMap[menuCdNum] === true || 
2674                                           memberOnlyMap[String(menuCdNum)] === true;
2675                                }
2676
2677                                const oneDepth = resultData.list.filter(item => item.menuDepth === 1)
2678                                    .sort((prev,cur) =>{
2679                                        if(prev.menuSort > cur.menuSort) return 1;
2680                                        if(prev.menuSort < cur.menuSort) return -1;
2681                                    });
2682
2683                                oneDepth.forEach(item1 => {
2684                                    const oneDepthLi = fncCreateMenuNavElements("depth-1", "depth-menu"
2685                                        , item1.menuNm, "javascript:void(0);", item1.menuCd);
2686                                    
2687                                    // 1뎁스 회원전용 여부 확인
2688                                    const isMemberOnly1 = isMemberOnlyMenu(item1.menuCd);
2689                                    
2690                                    // 해당 1뎁스의 모든 2뎁스 메뉴 수집
2691                                    const twoDepth = resultData.list.filter(item => item.hmenuCd === item1.menuCd);
2692                                    
2693                                    // 2뎁스 메뉴가 있고, 모두 회원전용인지 확인
2694                                    let allSubMenusAreMemberOnly = false;
2695                                    if (twoDepth.length > 0) {
2696                                        allSubMenusAreMemberOnly = twoDepth.every(item2 => {
2697                                            if (item2.menuCd == '1002200000') {
2698                                                return true;
2699                                            }
2700                                            return isMemberOnlyMenu(item2.menuCd);
2701                                        });
2702                                    }
2703                                    
2704                                    // 1뎁스가 회원전용이거나, 모든 2뎁스가 회원전용이면 class 추가
2705                                    if (isMemberOnly1 || allSubMenusAreMemberOnly) {
2706                                        const currentClass = oneDepthLi.getAttribute("class") || "";
2707                                        oneDepthLi.setAttribute("class", (currentClass + " membersOnlyOneDepth").trim());
2708                                    }
2709
2710                                    if (twoDepth.length !== 0) {
2711                                        const twoDepthUl = document.createElement("ul");
2712                                        let twoDepthLi;
2713                                        twoDepthUl.setAttribute("class", "nav-list-depth2");
2714
2715                                        twoDepth.forEach(item2 => {
2716                                            const threeDepth =
2717                                                resultData.list.filter(item => item.hmenuCd === item2.menuCd);
2718
2719                                            if (threeDepth.length !== 0) {
2720                                                twoDepthLi = fncCreateMenuNavElements("depth-2", "depth-menu"
2721                                                    , item2.menuNm, "j
2721avascript:void(0);", item2.menuCd);
2722                                                
2723                                                // 2뎁스 회원전용 여부 확인 및 class 추가
2724                                                const isMemberOnly2 = isMemberOnlyMenu(item2.menuCd);
2725                                                if (isMemberOnly2) {
2726                                                    const currentClass = twoDepthLi.getAttribute("class") || "";
2727                                                    twoDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
2728                                                }
2729                                                
2730                                                const threeDepthUl = document.createElement("ul");
2731                                                let threeDepthLi;
2732                                                threeDepthUl.setAttribute("class", "nav-list-depth3");
2733
2734                                                threeDepth.forEach(item3 => {
2735                                                    const fourDepth =
2736                                                        resultData.list.filter(item => item.hmenuCd === item3.menuCd);
2737
2738                                                    if (fourDepth.length !== 0) {
2739                                                        threeDepthLi = fncCreateMenuNavElements("depth-3", "depth-menu"
2740                                                            , item3.menuNm, "javascript:void(0);", item3.menuCd);
2741                                                        
2742                                                        // 3뎁스 회원전용 여부 확인 및 class 추가
2743                                                        const isMemberOnly3 = isMemberOnlyMenu(item3.menuCd);
2744                                                        if (isMemberOnly3) {
2745                                                            const currentClass = threeDepthLi.getAttribute("class") || "";
2746                                                            threeDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
2747                                                        }
2748                                                        
2749                                                        const fourDepthUl = document.createElement("ul");
2750                                                        let fourDepthLi;
2751                                                        fourDepthUl.setAttribute("class", "nav-list-depth4");
2752
2753                                                        fourDepth.forEach(item4 => {
2754                                                            fourDepthLi = fncCreateMenuNavElements("no-depth", "no-depth"
2755                                                                , item4.menuNm, item4.menuUrl, item4.menuCd);
2756                                                            
2757                                                            // 4뎁스 회원전용 여부 확인 및 class 추가
2758                                                            const isMemberOnly4 = isMemberOnlyMenu(item4.menuCd);
2759                                                            if (isMemberOnly4) {
2760                                                                const currentClass = fourDepthLi.getAttribute("class") || "";
2761                                                                fourDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
2762                                                            }
2763                                                            
2764                                                            fourDepthUl.appendChild(fourDepthLi);
2765                                                            threeDepthLi.appendChild(fourDepthUl);
2766                                                        });
2767                                                    } else {
2768                                                        threeDepthLi = fncCreateMenuNavElements("depth-3", "no-depth"
2769                                                            , item3.menuNm, item3.menuUrl, item3.menuCd);
2770                                                        
2771                                                        // 3뎁스 회원전용 여부 확인 및 class 추가
2772                                                        const isMemberOnly3 = isMemberOnlyMenu(item3.menuCd);
2773                                                        if (isMemberOnly3) {
2774                                                            const currentClass = threeDepthLi.getAttribute("class") || "";
2775                                                            threeDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
2776                                                        }
2777                                                    }
2778                                                    threeDepthUl.appendChild(threeDepthLi);
2779                                                    twoDepthLi.appendChild(threeDepthUl);
2780                                                });
2781                                            } else {
2782                                                twoDepthLi = fncCreateMenuNavElements("depth-2", "no-depth"
2783                                                    , item2.menuNm, item2.menuUrl, item2.menuCd);
2784                                                
2785                                                // 2뎁스 회원전용 여부 확인 및 class 추가
2786                                                const isMemberOnly2 = isMemberOnlyMenu(item2.menuCd);
2787                                                if (isMemberOnly2) {
2788                                                    const currentClass = twoDepthLi.getAttribute("class") || "";
2789                                                    twoDepthLi.setAttribute("class", (currentClass + " membersOnlyTwoDepth").trim());
2790                                                }
2791                                            }
2792                                            twoDepthUl.appendChild(twoDepthLi);
2793                                        });
2794                                        oneDepthLi.appendChild(twoDepthUl);
2795                                    }
2796                                    menuNavUl.appendChild(oneDepthLi);
2797                                });
2798                                menuNavBody.appendChild(menuNavUl);
2799                                fncMenuNavAccodian();
2800                            },
2801                            error: function(xhr, status, error) {
2802                                console.error("회원전용 메뉴 체크 실패:", xhr, status, error);
2803                                console.error("응답 텍스트:", xhr.responseText);
2804                                // 에러 발생 시에도 메뉴는 생성
2805                                menuNavBody.appendChild(menuNavUl);
2806                                fncMenuNavAccodian();
2807                            }
2808                        });
2809                    },
2810                    error: function () {
2811                        console.error();
2812                    }
2813                });
2814            }
2815
2816            function fncCreateMenuNavElements(liClass, aClass, menuNm, menuUrl, menuCd) {
2817                const oneDepthLi = document.createElement("li");
2818                const oneDepthA = document.createElement('a');
2819
2820                // classList를 사용하여 class 추가 (기존 class 유지)
2821                if (liClass) {
2822                    oneDepthLi.className = liClass;
2823                }
2824                oneDepthA.setAttribute("href", menuUrl);
2825                oneDepthA.setAttribute("class", aClass);
2826                oneDepthA.innerText = menuNm;
2827                
2828                // menuCd가 있으면 data 속성 추가
2829                if (menuCd) {
2830                    oneDepthA.setAttribute("data-menu-cd", menuCd);
2831                    oneDepthA.setAttribute("data-menu-nm", menuNm);
2832                    oneDepthA.setAttribute("data-menu-url", menuUrl || "");
2833                }
2834                
2835                oneDepthLi.appendChild(oneDepthA);
2836                return oneDepthLi;
2837            }
2838
2839            /* Accodian menu*/
2840            function fncMenuNavAccodian() {
2841                const $depth1 = $('.nav-all .depth-1'),
2842                    $depth2 = $('.nav-all .depth-2'),
2843                    $depth3 = $('.nav-all .depth-3'), //depth-3 있을경우
2844                    $depth2_list = $('.nav-all .nav-list-depth2'),
2845                    $depth3_list = $('.nav-all .nav-list-depth3'),
2846                    $depth4_list = $('.nav-all .nav-list-depth4');
2847
2848                $depth1.children('.depth-menu').click(function () {
2849                    if ($(this).next().length > 0) {
2850                        if ($(this).next().css('display') === 'none') {
2851                            $depth2.find('.depth-menu').removeClass('active');
2852                            $depth1.children('.depth-menu').removeClass('active');
2853                            $(this).addClass('active');
2854                            $depth3_list.hide();
2855                            $depth2.find('.depth-menu').removeClass('active');
2856                            $depth2_list.slideUp(300);
2857                            $(this).next().stop(false, true).slideDown(300);
2858                        } else {
2859                            $depth2.find('.depth-menu').removeClass('active');
2860                            $(this).next().slideUp(200);
2861                            $depth1.children('.depth-menu').removeClass('active');
2862                        }
2863                        return false;
2864                    } else {
2865                    }
2866                });
2867
2868                $depth2.children('.depth-menu').click(function () {
2869                    if ($(this).next().length > 0) {
2870                        if ($(this).next().css('display') === 'none') {
2871                            $depth3_list.find('.depth-menu').removeClass('active');
2872                            $depth3_list.stop(false, true).slideUp(300);
2873                            $depth2.children('.depth-menu').removeClass('active');
2874                            $(this).addClass('active');
2875                            $(this).next().stop(false, true).slideDown(300);
2876                        } else {
2877                            $depth3_list.find('.depth-menu').removeClass('active');
2878                            $(this).removeClass('active');
2879                            $(this).next().stop(false, true).slideUp(300);
2880                            $depth2.children('.depth-menu').removeClass('active');
2881                        }
2882                        return false;
2883                    } else {
2884                    }
2885                });
2886                $depth3.children('.depth-menu').click(function () {
2887                    if ($(this).next().length > 0) {
2888                        if ($(this).next().css('display') === 'none') {
2889                            $depth4_list.find('.depth-menu').removeClass('active');
2890                            $depth4_list.stop(false, true).slideUp(300);
2891                            $depth2.children('.depth-menu').removeClass('active');
2892                            $(this).addClass('active');
2893                            $(this).next().stop(false, true).slideDown(300);
2894                        } else {
2895                            $depth4_list.find('.depth-menu').removeClass('active');
2896                            $(this).removeClass('active');
2897                            $(this).next().stop(false, true).slideUp(300);
2898                            $depth2.children('.depth-menu').removeClass('active');
2899                        }
2900                        return false;
2901                    } else {
2902                    }
2903                });
2904            };
2905
2906            //nav_body create End
2907            function openPopup(popupName, popupData) {
2908
2909                $.ajax({
2910                    url: "/openPopup.cm",
2911                    type: "POST",
2912                    dataType: "html",
2913                    data: {"popupName": popupName, "popupData": popupData},
2914                    success: function (html) {
2915                        if(popupName === 'HomeMainPopup'){
2916                            $("#mainPup").html(html);
2917                            showpop('mainPup');
2918                        }else{
2919                            $("#Certification-system").html(html);
2920                            showpop('Certification-system');
2921                        }
2922                    },
2923                    error: function () {
2924                        console.error();
2925                    }
2926                });
2927            }
2928
2929
2930            function fnLinkActive(){
2931                /*quick pc*/
2932                $('.quick-menu dd>a').on('mouseenter',function(){
2933                    $(this).addClass('active')
2934                });
2935                $('.quick-menu dd>a').on('mouseleave',function(){
2936                    $(this).removeClass('active')
2937                })
2938            }
2939        </script>
2939
2940        
2941        
2942
2943<script>
2944    (function () {
2945        var w = window;
2946        if (w.ChannelIO) {
2947            return w.console.error("ChannelIO script included twice.");
2948        }
2949        var ch = function () {
2950            ch.c(arguments);
2951        };
2952        ch.q = [];
2953        ch.c = function (args) {
2954            ch.q.push(args);
2955        };
2956        w.ChannelIO = ch;
2957
2958        function l() {
2959            if (w.ChannelIOInitialized) {
2960                return;
2961            }
2962            w.ChannelIOInitialized = true;
2963            var s = document.createElement("script");
2964            s.type = "text/javascript";
2965            s.async = true;
2966            s.src = "https://cdn.channel.io/plugin/ch-plugin-web.js";
2967            var x = document.getElementsByTagName("script")[0];
2968            if (x.parentNode) {
2969                x.parentNode.insertBefore(s, x);
2970            }
2971        }
2972
2973        if (document.readyState === "complete") {
2974            l();
2975        } else {
2976            w.addEventListener("DOMContentLoaded", l);
2977            w.addEventListener("load", l);
2978        }
2979    })();
2980
2981    ChannelIO('boot', {
2982        "pluginKey": "2e13e087-3d31-40f6-821f-020cd0113b4a"
2983    });
2984</script>
2984
2985    </body>
2986</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.