PageSourceSearch

https://order.kyobobook.co.kr/assets/js/common/pop-delivery.js?t=202609221026

js kyobobook.co.kr collected 2026-09-24 08:31:59 UTC 97,220 bytes, 1,709 lines download raw bytes

1"use strict";
2/* eslint-disable no-var */
3/* globals KbbJS */
4/*
5 * 회원 주소록 표준 인터페이스
6 * - 1. 회원 기본배송지 조회
7 *   order.popup.delivery.interfaces.getDefaultDeliveryAddressAsync()
8 *   # async 함수이므로 결과를 .then 으로 받거나 await 으로 받을것
9 *   @return {
10 *             dlpnSrmb: 배송지순번
11 *             dlpnName: 배송지명
12 *             recvName: 받는분
13 *             cphnTlnm: 휴대전화전화번호
14 *             dlvrAdrsDvsnCode: 배송주소구분코드
15 *             dlvrAdrsDvsnCodeName: 배송주소구분코드명
16 *             rdnmAdrsYsno: 도로명주소여부
17 *             frngDlvrNtnCode: 해외배송국가코드
18 *             ntnName: 국가명
19 *             frngPssrNum: 우편번호
20 *             bscAdrs: 기본주소
21 *             dtlAdrs: 상세주소
22 *             frngAddtAdrs1: 해외부가주소1
23 *             frngAddtAdrs2: 해외부가주소2
24 *             bscDlpnYsno: 기본배송지여부
25 *   }
26 *   # 로그인하지 않은 경우 또는 기본배송지가 없는 경우 null
27 *
28 * - 2. 회원 배송지목록 팝업
29 *   order.popup.delivery.interfaces.openDeliveryListPopup({
30 *       callback: (data) => {}, // 콜백함수 (회원 기본배송지 조회와 같은 결과 제공)
31 *       // 아래는 선택 항목 (없어도 됨)
32 *       dmstDlvrPsblYn: "",       // 국내배송 가능여부 - N으로 명시할 경우 국내배송 입력불가
33 *       frngDlvrPsblYn: "",       // 해외배송 가능여부 - N으로 명시할 경우 해외배송 입력불가
34 *   });
35 *   # 선택한 배송지가 callback 함수의 인수로 전달됨 (레이아웃은 기본배송지 조회와 같음)
36 *   # 로그아웃 상태에서는 비회원 배송지 입력 팝업이 열리고 입력을 완료하면 콜백 호출
37 *
38 * - 2-1. 신규배송지(국내) 등록 팝업 (회원/비회원 가능)
39 *   order.popup.delivery.interfaces.openDeliveryAddressDetailPopup({
40 *       dlvrAdrsDvsnCode: "100",  // 100:국내주소
41 *       isNewYn: "Y",             // Y: 신규, N: 기존주소 수정
42 *       dlpnSrmb: "",             // isNewYn=N일 경우 배송지순번
43 *       callback: (data) => {},   // 콜백함수 (resources.dataRegister 제공)
44 *       // 아래는 선택 항목 (없어도 됨)
45 *       dmstDlvrPsblYn: "",       // 국내배송 가능여부 - N으로 명시할 경우 국내배송 입력불가
46 *       frngDlvrPsblYn: "",       // 해외배송 가능여부 - N으로 명시할 경우 해외배송 입력불가
47 *       showDefaultYn: "",        // 기본배송지로설정 표시여부 - N으로 명시할 경우 기본배송지로 설정 옵션 숨겨짐 (기본배송지 없는 경우 셋팅하라는 메시지 비표시)
48 *       frngDlvrImpbMsg: "",      // 해외배송불가 메시지 - 해외배송 가능여부 N 일때 해외배송주소 선택하면 alert 표시할 메시지
49 *   });
50 *
51 * - 2-2. 신규배송지(해외) 등록 팝업 (회원/비회원 가능)
52 *   order.popup.delivery.interfaces.openDeliveryAddressDetailPopup({
53 *       dlvrAdrsDvsnCode: "200",  // 200:해외주소
54 *       isNewYn: "Y",             // Y: 신규, N: 기존주소 수정
55 *       dlpnSrmb: "",             // isNewYn=N일 경우 배송지순번
56 *       callback: (data) => {},   // 콜백함수 (resources.dataRegister 제공)
57 *       // 아래는 선택 항목 (없어도 됨)
58 *       dmstDlvrPsblYn: "",       // 국내배송 가능여부 - N으로 명시할 경우 국내배송 입력불가
59 *       frngDlvrPsblYn: "",       // 해외배송 가능여부 - N으로 명시할 경우 해외배송 입력불가
60 *   });
61 *
62 *  - 3. (220802 SB추가) 배송지 조회/등록 마이룸 커스터마이징
63 *       [팝업 노출 화면 번호]
64 *       SCR-BIZ08-02-P910 Sam_배송지등록
65 *       SCR-BIZ08-02-P905 선물등록_선물확인
66 *       SCR-BIZ08-05-P008 교환번호_상품등록
67 *
68 *   order.popup.delivery.interfaces.openDeliveryListPopup({
69 *       callback: (data) => {}
69, // 콜백함수 (회원 기본배송지 조회와 같은 결과 제공)
70 *       frngDlvrPsblYn: "N",      // 해외배송 가능여부 - N으로 명시할 경우 해외배송 입력불가 (마이룸은 N으로 호출)
71 *       showDefaultYn: "N",       // 기본배송지로설정 표시여부 - N으로 명시할 경우 기본배송지로 설정 옵션 숨겨짐 (기본배송지 없는 경우 셋팅하라는 메시지 비표시)
72 *       // 해외배송불가 메시지 - 해외배송 가능여부 N 일때 해외배송주소 선택하면 alert 표시할 메시지
73 *       frngDlvrImpbMsg: "선물, Sam 그래고 책, 교환번호 등록의 경우 해외배송지  등록 되지 않습니다. 국내주소지로 재등록 바랍니다",
74 *   });
75 */
76(function() {
77
78    /* --------------------------------------------------------------------------------
79     * 내부 변수
80     * -------------------------------------------------------------------------------- */
81    let resources = {
82        controls: {
83            // 배송지 목록 다이얼로그
84            popupListDialogId: "#popDeliveryList", // 배송지 목록 팝업ID
85            listPopupTitle: "#popDeliveryList [data-pop-delivery-list=title]", // 배송지 목록 다이얼로그 타이틀
86            addressAddBtn: ".address_wrap button[data-pop-delivery-list=pop-register]", // 배송지 추가 버튼
87            deliveryListContainer: ".address_wrap ul[data-pop-delivery-list=list]", // 배송지 리스트 컨테이너
88            deliveryListNoData: ".address_wrap [data-pop-delivery-list=no-data]", // 등록된 배송지 없음
89            itemSelectCheck: ".address_item input[data-pop-delivery-list-item=check]",  // 배송지 항목 체크박스
90            itemActionBtn: ".address_item button[data-pop-delivery-list-item]",         // 배송지 수정/삭제
91            listPopupFooterArea: "#popDeliveryList [data-pop-delivery-list=data-footer]", // footer 영역
92            defaultAddressCheckArea: "#popDeliveryList [data-pop-delivery-list=default-checkbox-area]", // 기본배송지로 설정 영역
93            defaultAddressCheck: "#popDeliveryList [data-pop-delivery-list=default-checkbox]", // 기본배송지로 설정 체크박스
94            addressSelectBtn: "#popDeliveryList button[data-pop-delivery-list=item-select]", // 주소 선택 버튼
95            // 국내배송지 등록/수정
96            popupDomesticDialogId: "#popDeliveryAddressDetail", // 국내배송지 등록/수정 팝업ID
97            domDetailPopupTitle: "#popDeliveryAddressDetail [data-pop-delivery-detail=title]", // 다이얼로그 타이틀
98            domDeliveryNameArea: "#popDeliveryAddressDetail [data-pop-delivery-detail=address-name-area]", // 배송지명 입력영역
99            domDeliveryName: "#popDeliveryAddressDetail [data-pop-delivery-detail=address-name]", // 배송지명
100            domRecvName: "#popDeliveryAddressDetail [data-pop-delivery-detail=recipient-name]", // 받는분
101            domTelno: "#popDeliveryAddressDetail [data-pop-delivery-detail=recipient-phone]", // 휴대폰번호
102            domOverSeasChgBtn: "#popDeliveryAddressDetail [data-pop-delivery-detail=btn-overseas]", // 해외배송으로 전환버튼
103            domAddrBtnArea: "#popDeliveryAddressDetail [data-pop-delivery-detail=search-btn-area]", // 주소찾기 버튼 영역(주소입력전)
104            domAddrShowArea: "#popDeliveryAddressDetail [data-pop-delivery-detail=address-data-area]", // 주소입력/수정 영역
105            domAddrBtn: "#popDeliveryAddressDetail [data-pop-delivery-detail=search-popup-call]", // 주소찾기 버튼
106            domAddr1: "#popDeliveryAddressDetail [data-pop-delivery-detail=basic-address]", // 기본주소 표시
107            domAddr2: "#popDeliveryAddressDetail [data-pop-delivery-detail=detail-address]", // 상세주소 입력
108            domDefaultCommonEnterCheckArea: "#popDeliveryAddressDetail [data-pop-common-enter-detail=common-enter-data-area]",    // 공동현관 출입방법 설정 영역
109            domCommonEnterPasswordInput: "#popDeliveryAddressDetail [data-pop-common-enter-detail=common-enter-data-area] input[type='text']", // 공동현관 비밀번호 입력
110            domCommonEnterPasswordRadio: "#popDeliveryAddressDetail [name='doorPassword']", // 공동현관 출입 방법
111            domDefaultAddressCheckArea: "#popDeliveryAddressDetail [data-pop-delivery-detail
111=address-data-area2]", // 기본배송지로 설정 영역
112            domDefaultAddressCheck: "#popDeliveryAddressDetail [data-pop-delivery-detail=default-delivery]", // 기본배송지로 설정 체크박스
113            domSaveBtn: "#popDeliveryAddressDetail [data-pop-delivery-detail=save]", // 저장 버튼
114            // 해외배송지 등록/수정
115            popupForeignDialogId: "#popOverseasDeliveryDetail", // 해외배송 등록/수정 팝업ID
116            fgnDetailPopupTitle: "#popOverseasDeliveryDetail [data-pop-overseas-detail=title]", // 다이얼로그 타이틀
117            fgnDeliveryNameArea: "#popOverseasDeliveryDetail [data-pop-overseas-detail=address-name-area]", // 배송지명 입력영역
118            fgnDeliveryName: "#popOverseasDeliveryDetail [data-pop-overseas-detail=address-name]", // 배송지명
119            fgnDomesticChgBtn: "#popOverseasDeliveryDetail [data-pop-overseas-detail=btn-internal]", // 국내배송으로 전환버튼
120            fgnCountryChgBtn: "#popOverseasDeliveryDetail [data-pop-overseas-detail=btn-popup-country]", // 해외배송 국가선택 버튼
121            fgnCountryName: "#popOverseasDeliveryDetail [data-pop-overseas-detail=country-name]", // 해외배송 국가명
122            fgnDeliveryFee: "#popOverseasDeliveryDetail [data-pop-overseas-detail=delivery-fee]", // 예상배송비
123            fgnDeliveryFeeCalcBtn: "#popOverseasDeliveryDetail [data-pop-overseas-detail=btn-popup-delivery-fee]", // 예상배송비 계산 팝업 버튼
124            fgnRecvName: "#popOverseasDeliveryDetail [data-pop-overseas-detail=recipient-name]", // 받는분
125            fgnTelno: "#popOverseasDeliveryDetail [data-pop-overseas-detail=recipient-phone]", // 휴대폰번호
126            fgnEmailArea: "#popOverseasDeliveryDetail [data-pop-overseas-detail-email-area]",   // email 영역
127            fgnEmail: "#popOverseasDeliveryDetail [data-pop-overseas-detail=recipient-email]", // email
128            fgnAddress: "#popOverseasDeliveryDetail [data-pop-overseas-detail=address]", // Address
129            fgnCity: "#popOverseasDeliveryDetail [data-pop-overseas-detail=city]", // City
130            fgnState: "#popOverseasDeliveryDetail [data-pop-overseas-detail=state]", // State/Province
131            fgnZipCode: "#popOverseasDeliveryDetail [data-pop-overseas-detail=zip]", // Zip Code
132            fgnDefaultAddressCheckArea: "#popOverseasDeliveryDetail [data-pop-overseas-detail=default-delivery-box]", // 기본배송지로 설정 영역
133            fgnDefaultAddressCheck: "#popOverseasDeliveryDetail [data-pop-overseas-detail=default-delivery]", // 기본배송지로 설정 체크박스
134            fgnSaveBtn: "#popOverseasDeliveryDetail [data-pop-overseas-detail=save]", // 저장 버튼
135            fgnOverseasInfo: "#popOverseasDeliveryDetail [data-pop-overseas-detail=btn-overseas-info]", // 해외배송 안내 팝업
136            popupOverseasInfoDialogId: "#popOverseasDeliveryInfo", // 해외배송 안내 팝업 ID
137            // 해외배송국가 목록
138            popupCountriesDialogId: "#popSelDeliveryCountry",
139            countryList: "#popSelDeliveryCountry_list",
140            countryQuickLinkList: "#popSelDeliveryCountry_quick",
141            countryQuickLink: "#pop_delivery_country_quick",
142            countryListItem: "#pop_delivery_country_item",
143            countryItemSelect: ".country_item button[data-pop-delivery-country=country]",
144            // 해외 Fedex 예상배송비 안내
145            popupFedexFeeDialogId: "#popDeliveryFedExInfo", // FedEx 계산/안내 팝업ID
146            dlvFeeSelects: "#popDeliveryFedExInfo select[data-pop-delivery-fedex-info]",
147            dlvFeeBoxCnt: "#popDeliveryFedExInfo select[data-pop-delivery-fedex-info=amount]",
148            dlvFeeRegion: "#popDeliveryFedExInfo select[data-pop-delivery-fedex-info=region]",
149            dlvFeeAmt: "#popDeliveryFedExInfo input[data-pop-delivery-fedex-info-fee=fee]",
150        },
151        apiUrl: {
152            deliveryList: "/api/comm/ord/v1/delivery/address",        // 배송지조회
153            deliveryListV2: "/api/comm/ord/v2/delivery/address",        // 배송지 조회 v2
154            deliveryDetail: "/api/comm/ord/v1/delivery/address",      // 배송지 조회
155            deliveryDelete: "/api/comm/ord/v1/delivery/address",      // 배송지 삭제
156            deliveryUpdate: "/api/comm/ord/v1/delivery/address",      // 배송지 수정
157            countryList: "/api/comm/ord/v1/delivery/frng-dlvr-ntn",   // 해외배송 국가 목록조회
158            zoneList: "/api/comm/ord/v1/delivery/frng-dlvr-zone",     // 해외배송 배송구역 목록조회
159            fgnDeliveryFee: "/api/comm/ord/v1/delivery/frng-dlvr-expn",   // 해외배송 배송비 조회
160        },
161        constraints: {
162            pageUnit: "100",        // 페이지당 목록건수 (팝업 기본값 100)
163            frngDscmCode: "104",    // 해외택배사코드 (104:FedEx)
164        },
165        // 팝업 호출시 넘어온 데이터
166        request: {
167            // 배송지 선택완료시 선택한 배송지 넘겨줄 콜백
168            callback: (data) => { },
169        },
170        requestRegister: {
171            // 배송지 등록/수정시 해당 배송지정보 넘겨줄 콜백
172            callback: (data) => { },
173            isNewYn: "Y",
174            dlpnSrmb: "",
175            dmstDlvrPsblYn: "",
176            frngDlvrPsblYn: "",
177        },
178        // 배송지 목록 (api 처리결과)
179        dataList: [],
180        // 베송지 등록/수정 정보
181        dataRegister: {
182            dlpnSrmb: "",           // 배송지순번 (신규배송지 등록 또는 비회원인 경우 제공하지 않음)
183            dlpnName: "",           // 배송지명
184            recvName: "",           // 받는분명
185            cphnTlnm: "",           // 휴대전화전화번호
186            email: "",              // 이메일
187            dlvrAdrsDvsnCode: "",   // 배송주소구분코드 (100:국내, 200:해외)
188            rdnmAdrsYsno: "",       // 도로명주소여부
189            frngDlvrNtnCode: "",    // 해외배송국가코드
190            ntnName: "",            // 국가명 (07/19 추가)
191            frngPssrNum: "",        // 우편번호
192            bscAdrs: "",            // 기본주소 (해외인 경우 Address)
193            dtlAdrs: "",            // 상세주소 (해외인 경우 없음)
194            frngAddtAdrs1: "",      // 해외부가주소1 (국내의 경우 건물명, 해외의 경우 City)
195            frngAddtAdrs2: "",      // 해외부가주소2 (국내의 경우 동, 해외의 경우 State)
196            bscDlpnYsno: "",        // 기본배송지여부 (비회원인 경우 제공하지 않음)
197            bildgMngmNum: "",       // 건물관리번호
198            cmnEntMthdCode: "",     // 공동현관 출입방법코드
199            cmnEntMthdMemo: ""      // 공동현관 출입비밀번호
200        },
201        countries: [],
202        regions: [],
203    };
204
205    /* --------------------------------------------------------------------------------
206     * 외부 인터페이스
207     * -------------------------------------------------------------------------------- */
208    let interfaces = {
209        /* --------------------------------------------------------------------------------
210         * 기능명: 기본 배송지 조회
211         * return: eos.t_so_dlvr_addr_m SO_회원배송주소록기본 참고, 오류가 발생했거나 로그인하지 않았으면 null
212         * 로그인 필수
213         * -------------------------------------------------------------------------------- */
214        getDefaultDeliveryAddressAsync: async () => {
215            if (!order.user.exists) {
216                return null;
217            }
218
219            // console.log(">>> 기본 배송지 조회 <<<");
220            try {
221                let param = `bscDlpnYsno=Y&page=1&pageUnit=100`;
222                let delivery = await order.utils.asyncManual(
223                    `${resources.apiUrl.deliveryList}?${param}`,
224                    { method: 'GET', });
225
226                // console.log(">>> 기본 배송지 조회 결과 <<<", delivery);
227                if (Array.isArray(delivery.data) && delivery.data.length > 0) {
228                    return delivery.data[0];
229                }
230
231                //console.log(">>> 기본 배송지 조회 결과가 없음 <<<");
232                return null;
233            } catch (e) {
234                console.error(">>> 기본 배송지 조회 오류 <<<", e);
235                return null;
236            }
237        }, // getDefaultDeliveryAddressAsync
238        /* --------------------------------------------------------------------------------
239         * 기능명: 배송지 목록 팝업
240         * 로그인되어있지 않으면 배송지 입력 팝업으로 전환
241         * data = {
242         *   callback: 선택 완료시 콜백함수 (선택하지 않고 창을 닫을 경우 아무것도 하지 않음)
243         *   dmstDlvrPsblYn: 국내배송 가능여부(N-불가, 기본 Y)
244         *   frngDlvrPsblYn: 해외배송 가능여부(N-불가, 기본 Y)
245         *   showDefaultYn: 기본배송지로설정 표시여부(N-비표시, 기본 Y)
246         *   frngDlvrImpbMsg: 해외배송불가 메시지(frngDlvrPsblYn=N 일 때 해외주소 선택하면 alert 메시지)
247         * }
248         * -------------------------------------------------------------------------------- */
249        openDeliveryListPopup : (data) => {
250            Object.assign(resources.request, data);
251
252            resources.requestRegister["dmstDlvrPsblYn"] = methods.nullToEmpty(data["dmstDlvrPsblYn"]).toUpperCase();
253            resources.requestRegister["frngDlvrPsblYn"] = methods.nullToEmpty(data["frngDlvrPsblYn"]).toUpperCase();
254
255            // 로그인 되어 있지 않으면 배송지 등록 팝업으로 변경
256            if (order.user.notExists) {
257                interfaces.openDeliveryAddressDetailPopup({
258                    dlvrAdrsDvsnCode: "100",
259                    isNewYn: "Y",
260                    dlpnSrmb: "",
261                    callback: data["callback"],
262                    dmstDlvrPsblYn: data["dmstDlvrPsblYn"],
263                    frngDlvrPsblYn: data["frngDlvrPsblYn"],
264                });
265                return;
266            }
267
268            methods.list.displayListItem([]);
269            interfaces.api.getDeliveryList(methods.list.displayListItem, undefined, undefined, "bsc_dlpn_ysno desc, dlpn_srmb desc", undefined);
270            order.utils.openDialog(resources.controls.popupListDialogId);
271        }, // openDeliveryListPopup
272
273        /* --------------------------------------------------------------------------------
274         * 기능명: 배송지 추가(수정) 입력 팝업
275         * data = {
276         *   dlvrAdrsDvsnCode: 배송주소구분코드 (100:국내, 200:해외)
277         *   isNewYn: 신규입력(Y/N)
278         *   dlpnSrmb: 배송지순번(신규입력이 Y가 아닌 경우 필수)
279         *   callback: 완료시 콜백함수
280         *   dmstDlvrPsblYn: 국내배송 가능여부(N-불가, 이외 가능)
281         *   frngDlvrPsblYn: 해외배송 가능여부(N-불가, 이외 가능)
282         * }
283         * -------------------------------------------------------------------------------- */
284        openDeliveryAddressDetailPopup : (data) => {
285            let dlvrAdrsDvsnCode = `${data["dlvrAdrsDvsnCode"]}`;
286            let dmstDlvrPsblYn = `${data["dmstDlvrPsblYn"]}`.toUpperCase();
287            let frngDlvrPsblYn = `${data["frngDlvrPsblYn"]}`.toUpperCase();
288            switch (dlvrAdrsDvsnCode) {
289                case "100": // 국내배송주소
290                    if (dmstDlvrPsblYn !== "N")
291                        methods.domestic.openDialog(data);
292                    else
293                        KbbJS.ui.alert("국내배송이 불가합니다.");
294                    break;
295                case "200": // 해외배송주소
296                    if (frngDlvrPsblYn !== "N")
297                        methods.foreign.openDialog(data);
298                    else
299                        KbbJS.ui.alert(resources.request["frngDlvrImpbMsg"] || "해외배송이 불가합니다.");
300                    break;
301                default:    // 그외의 경우 (편의점, 바로드림)
302                    return;
303            }
304        }, // openDeliveryAddressDetailPopup
305
306        api: {
307            // API 기본:
308            // - API 요청시 파라마터를 입력하지 않으면 기본 값을 사용한다.
309            //   * 입력하지 않는다는 의미는 호출할 때 파라마터를 생략하거나, 중간 파라마터라 생략이 불가능할 경우 undefined 를 넣는다..
310            //   * 예) getDeliveryList(callback); // page, pageUnit, sortColumn, sortOrder, callbackError 기본값 사용
311            //   *    getDeliveryList(callback, 1); // pageUnit, sortColumn, sortOrder, callbackError 기본값 사용
312            //   *    getDeliveryList(callback, 1, undefined, undefined, undefined, callback2); // pageUnit, sortColumn, sortOrder 기본값 사용
313            // - callbackSuccess 및 callbackError는 성공/실패시 호출되며, 미입력시 해당 콜백은 호출하지 않는다.
314            // - async 형태로 변환하려면 Promise를 사용한다.
315            //   * 예) let apiFunc = new Promise((resolve, reject) => { getAddressDetail(dlpnSrmb, resolve, reject); });
316            //         try {
317            //             let result = await apiFunc;
318            //         } catch (err) {
319            //         }
320            //   * Promise의 resolve 는 하나의 결과만 받으므로 콜백함수가 여러 인자를 받는 경우(getDeliveryList)에는 별도의 함수 wrapper로 구현한다.
321            //     예)  let apiFunc = new Promise((resolve, reject) => {
322            //             order.popup.delivery.interfaces.api.getDeliveryList((d, p) => {
323            //                 resolve({ data: d, page: p});
324            //             });
325            //          });
326            //          let result = await apiFunc;  // result.data, result.page
327            /* --------------------------------------------------------------------------------
328             * 기능명: 회원 배송지 목록 조회
329             * @param callback api 성공시 호출할 콜백 (필수)
330             * @param page 페이지번호
331             * @param pageUnit 페이지당 건수
332             * @param sortColumn 정렬 컬럼
333             * @param sortOrder 정렬 순서
334             * @param callbackError 있는 경우 오류 발생시 호출, 없으면 callback([])을 대신 호출
335             * -------------------------------------------------------------------------------- */
336            getDeliveryList: (callback, page, pageUnit, sortColumn, sortOrder, callbackError) => {
337                //console.log(">>> 회원 배송지목록 조회 <<<");
338
339                page = (page === undefined) ? "1" : page;
340                pageUnit = (pageUnit === undefined) ? resources.constraints.pageUnit : pageUnit;
341                sortColumn = (sortColumn === undefined) ? "" : sortColumn;
342                sortOrder = (sortOrder === undefined) ? "" : sortOrder;
343
344                let param1 = `page=${page}`,
345                    param2 = `&pageUnit=${pageUnit}`,
346                    param3 = (sortColumn === "") ? "" : `&sortColumn=${sortColumn}`,
347                    param4 = (sortOrder === "") ? "" : `&sortOrder=${sortOrder}`;
348                order.utils.async(
349                    `${resources.apiUrl.deliveryList}?${param1}${param2}${param3}${param4}`,
350                    { method: 'GET', },
351                    (data) => {
352                        //console.log(">> 회원 배송지목록 조회 성공 <<", data);
353                        if(data.data.length > 0){
354                            if(data.data[0].bscDlvrMsg != null){ //기본배송지 변경한경우 메세지 추가.
355                                KbbJS.ui.alert(data.data[0].bscDlvrMsg);
356                            }
357                        }else{
358                            order.utils.callbackExec(callback, data.data);
359                        }
360
361                        if (Array.isArray(data.data) && data.data.length > 0) {
362                            // 정렬 및 페이징
363                            let pageMsg = methods.nullToEmpty(data.detailMessage)
364                            if (pageMsg.startsWith("{") && pageMsg.indexOf("pageParam") > 0) {
365                                pageMsg = JSON.parse(pageMsg);
366                            } else {
367                                pageMsg = {};
368                            }
369
370                            order.utils.callbackExec(callback, data.data, pageMsg);
371                        }
372                    },
373                    (err) => {
374                        //console.log(">> 회원 배송지목록 조회 오류 <<", err);
375                        if (callbackError !== undefined && typeof callbackError === "function") {
376                            order.utils.callbackExec(callbackError, err);
377                        } else {
378                            order.utils.callbackExec(callback, []);
379                        }
380                    });
381            }, // listProcess
382            getDeliveryListV2: async (page, size) => {
383                page = (page === undefined) ? "1" : page;
384                size = (size === undefined) ? resources.constraints.pageUnit : size;
385
386                const data = await order.utils.asyncManual(
387                    `${resources.apiUrl.deliveryListV2}?page=${page - 1}&size=${size}`,
388                    { method: 'GET' }
389                );
390                return {
391                    list: data.data.content,
392                    pageInfo: {
393                        pageParam: "page",
394                        totalRecords: data.data.totalElements,
395                        page: data.data.number + 1,
396                        pageUnit: data.data.size
397                    }
398                };
399            },
400
401            /* --------------------------------------------------------------------------------
402             * 기능명: 배송지 조회
403             * -------------------------------------------------------------------------------- */
404            getAddressDetail: (dlpnSrmb, callbackSuccess, callbackError) => {
405                //console.log(`>>> 배송지 조회 ${dlpnSrmb} <<<`);
406
407                order.utils.async(
408                    `${resources.apiUrl.deliveryDetail}/${dlpnSrmb}`,
409                    { method: 'GET', },
410                    (data) => {
411                        //console.log(">> 배송지 조회 성공 <<", data);
412                        order.utils.callbackExec(callbackSuccess, data.data);
413                    },
414                    (err) => {
415                        //console.log(">> 배송지 조회 오류 <<", err);
416                        if (callbackError !== undefined && typeof callbackError === "function") {
417                            order.utils.callbackExec(callbackError, err);
418                        } else {
419                            KbbJS.ui.alert(err.resultMessage);
420                        }
421                    });
422            }, // getAddressDetail
423
424            /* --------------------------------------------------------------------------------
425             * 기능명: 배송지 등록/수정
426             * -------------------------------------------------------------------------------- */
427            saveAddressDetail: (data, callbackSuccess, callbackError) => {
428                let method = "";
429                let apiPath = resources.apiUrl.deliveryUpdate;
430                if (data.dlpnSrmb === "" || data.dlpnSrmb === "0" || data.dlpnSrmb === 0) {
431                    method = "POST";
432                } else {
433                    method = "PUT";
434                    apiPath = `${apiPath}/${data.dlpnSrmb}`;
435                }
436
437                //console.log(`>>> 배송지 등록/수정 ${method} <<<`, data);
438
439                order.utils.async(
440                    apiPath,
441                    { method: method, body: data},
442                    (result) => {
443                        //console.log(">> 배송지 등록/수정 성공 <<", result);
444                        order.utils.callbackExec(callbackSuccess);
445                    },
446                    (err) => {
447                        KbbJS.ui.alert(order.utils.getErrorMessage(err));
448                    });
449            }, // saveAddressDetail
450
451            /* --------------------------------------------------------------------------------
452             * 기능명: 기본 배송지로 설정
453             * -------------------------------------------------------------------------------- */
454            setDefaultAddress: (dlpnSrmb, callbackSuccess, callbackError) => {
455                //console.log(`>>> 기본 배송지로 설정 ${dlpnSrmb} <<<`);
456
457                order.utils.async(
458                    `${resources.apiUrl.deliveryUpdate}/${dlpnSrmb}/base`,
459                    { method: 'PUT', body: {}, },
460                    (data) => {
461                        //console.log(">> 기본 배송지로 설정 성공 <<", data);
462                        order.utils.callbackExec(callbackSuccess);
463                    },
464                    (err) => {
465                        //console.log(">> 기본 배송지로 설정 오류 <<", err);
466                        if (callbackError !== undefined && typeof callbackError === "function") {
467                            order.utils.callbackExec(callbackError, err);
468                        } else {
469                            let resultMsg = { resultMessage: order.utils.getErrorMessage(err) };
470                            KbbJS.ui.alert(resultMsg.resultMessage);
471                        }
472                    });
473            }, // setDefaultAddress
474
475            /* --------------------------------------------------------------------------------
476             * 기능명: 회원 배송지 삭제
477             * -------------------------------------------------------------------------------- */
478            deleteAddress: (dlpnSrmb, callbackSuccess, callbackError) => {
479                //console.log(`>>> 배송지 주소 삭제 ${dlpnSrmb} <<<`);
480
481                order.utils.async(
482                    `${resources.apiUrl.deliveryDelete}/${dlpnSrmb}`,
483                    { method: 'DELETE', },
484                    (data) => {
485                        //console.log(">> 배송지 주소 삭제 성공 <<", data);
486                        order.utils.callbackExec(callbackSuccess);
487                    },
488                    (err) => {
489                        //console.log(">> 회원 배송지목록 삭제 오류 <<", err);
490                        if (callbackError !== undefined && typeof callbackError === "function") {
491                            order.utils.callbackExec(callbackError, err);
492                        } else {
493
494                            KbbJS.ui.alert(err.resultMessage);
495                        }
496                    });
497            }, // deleteAddress
498
499            /* --------------------------------------------------------------------------------
500             * 기능명: 해외배송국가 목록조회
501             * frngDscmCode 택배사코드
502             * -------------------------------------------------------------------------------- */
503            listCountries: (frngDscmCode, callbackSuccess, callbackError) => {
504                let params = `frngDscmCode=${frngDscmCode}`;
505
506                //console.log(`>>> 해외배송국가 목록조회 <<<`);
507                if (resources.countries.length > 0) {
508                    order.utils.callbackExec(callbackSuccess, resources.countries);
509                    return;
510                }
511
512                order.utils.async(
513                    `${resources.apiUrl.countryList}?${params}`,
514                    { method: 'GET', },
515                    (data) => {
516                        //console.log(">> 해외배송국가 목록조회 성공 <<", data);
517                        // 전역변수에 저장 (의도되었음)
518                        resources.countries = data.data;
519                        order.utils.callbackExec(callbackSuccess, resources.countries);
520                    },
521                    (err) => {
522                        //console.log(">> 해외배송국가 목록조회 오류 <<", err);
523                        if (callbackError !== undefined && typeof callbackError === "function") {
524                            order.utils.callbackExec(callbackError, err);
525                        } else {
526                            KbbJS.ui.alert(err.resultMessage);
527                        }
528                    });
529            }, // listCountries
530
531            /* --------------------------------------------------------------------------------
532             * 기능명: 해외배송비 조회
533             * frngDlvrCmdtStnrQntt 해외배송상품기준수량
534             * frngDlvrZoneCode 해외배송구역코드
535             * frngDscmCode 택배사코드
536             * -------------------------------------------------------------------------------- */
537            getForeginDeliveryFee: (frngDlvrCmdtStnrQntt, frngDlvrZoneCode, frngDscmCode, callbackSuccess, callbackError) => {
538                let param = `frngDlvrCmdtStnrQntt=${frngDlvrCmdtStnrQntt}&frngDlvrZoneCode=${frngDlvrZoneCode}&frngDscmCode=${frngDscmCode}`;
539                order.utils.async(`${resources.apiUrl.fgnDeliveryFee}?${param}`,
540                    { method: "GET" },
541                    (data) => {
542                        //console.log(">> 해외배송 배송비조회 성공 <<", data);
543                        order.utils.callbackExec(callbackSuccess, data.data);
544                    }, (err) => {
545                        //console.log(">> 해외배송 배송비조회 오류 <<", err);
546                        if (callbackError !== undefined && typeof callbackError === "function") {
547                            order.utils.callbackExec(callbackError, err);
548                        } else {
549                            KbbJS.ui.alert(err.resultMessage);
550                        }
551                    });
552            }, // getForeginDeliveryFee
553
554            /* --------------------------------------------------------------------------------
555             * 기능명: 해외배송 배송구역 목록조회
556             * frngDscmCode 택배사코드
557             * -------------------------------------------------------------------------------- */
558            getForeginZoneList: (frngDscmCode, callbackSuccess, callbackError) => {
559                let params = `frngDscmCode=${frngDscmCode}`;
560
561                //console.log(`>>> 해외배송구역 목록조회 <<<`);
562                if (resources.regions.length > 0) {
563                    order.utils.callbackExec(callbackSuccess, resources.regions);
564                    return;
565                }
566
567                order.utils.async(
568                    `${resources.apiUrl.zoneList}?${params}`,
569                    { method: 'GET', },
570                    (data) => {
571                        //console.log(">> 해외배송구역 목록조회 성공 <<", data);
572                        // 전역변수에 저장 (의도되었음)
573                        resources.regions = data.data;
574                        order.utils.callbackExec(callbackSuccess, resources.regions);
575                    },
576                    (err) => {
577                        //console.log(">> 해외배송구역 목록조회 오류 <<", err);
578                        if (callbackError !== undefined && typeof callbackError === "function") {
579                            order.utils.callbackExec(callbackError, err);
580                        } else {
581                            KbbJS.ui.alert(err.resultMessage);
582                        }
583                    });
584            }, // getFeeByZone
585
586        }, // api
587    };
588
589    /* --------------------------------------------------------------------------------
590     * 이벤트
591     * -------------------------------------------------------------------------------- */
592    let addEvents = () => {
593        // 리스트 팝업 이벤트
594        (function listEvents () {
595            /* --------------------------------------------------------------------------------
596             * 기능명: 배송지 추가 버튼
597             * -------------------------------------------------------------------------------- */
598            $(document).on("click", resources.controls.addressAddBtn, function () {
599                //console.log("배송지 추가버튼");
600                interfaces.openDeliveryAddressDetailPopup({
601                    dlvrAdrsDvsnCode: "100",
602                    isNewYn: "Y",
603                    dlpnSrmb: "",
604                    frngDlvrPsblYn: resources.requestRegister.frngDlvrPsblYn,
605                    callback: (data) => { interfaces.api.getDeliveryList(methods.list.displayListItem, undefined, undefined, "bsc_dlpn_ysno desc, dlpn_srmb desc", undefined); },
606                });
607            });
608
609            /* --------------------------------------------------------------------------------
610             * 기능명: 배송지 목록에서 배송지 항목 선택
611             * 기본 배송지로 설정 체크박스를 표시하고 목록 중에 기본배송지가 설정되지 않았으면 체크박스 체크
612             * -------------------------------------------------------------------------------- */
613            $(document).on("click", resources.controls.itemSelectCheck, function () {
614                let showDefaultYn = `${resources.request["showDefaultYn"]}`.toUpperCase();
615                if (showDefaultYn === "N") {
616                    // 기본배송지 선택 area 숨기기
617                    $(resources.controls.defaultAddressCheckArea).hide();
618                    // 체크박스 해제
619                    $(resources.controls.defaultAddressCheck).prop("checked", false);
620                } else {
621                    // 기본배송지 선택 area 보여주기
622                    $(resources.controls.defaultAddr
622essCheckArea).show();
623
624                    // 기본배송지가 등록되어 있는 경우에는 unchecked가 default
625                    // 기본배송지가 등록되어 있지 않으면 check 활성화
626                    $(resources.controls.defaultAddressCheck).prop("checked", !methods.list.isDefaultDeliverySet());
627                }
628                $(resources.controls.addressSelectBtn).prop("disabled", false);
629            });
630
631            /* --------------------------------------------------------------------------------
632             * 기능명: 기본배송지 설정 체크박스 컨트롤 (기본배송지가 없는 경우 체크박스 해제 불가능)
633             * -------------------------------------------------------------------------------- */
634            $(document).on("change", resources.controls.defaultAddressCheck, async function (event) {
635                // 기본배송지가 등록되어 있지 않으면 uncheck 불가능
636                if (!methods.list.isDefaultDeliverySet() && !this.checked) {
637                    this.checked = true;
638                    await KbbJS.ui.alert("기본배송지 설정후 이용가능합니다.");
639                }
640            });
641
642            /* --------------------------------------------------------------------------------
643             * 기능명: 배송지 수정/삭제 버튼 클릭
644             * -------------------------------------------------------------------------------- */
645            $(document).on("click", resources.controls.itemActionBtn, function () {
646                let actionType = $(this).data("pop-delivery-list-item");
647                let dataKey = $(this).data("key");
648                //console.log(`배송지 수정/삭제버튼 클릭 : ${actionType} ${dataKey}`);
649
650                if (actionType === "modify") {
651                    // 주소 수정 팝업
652                    interfaces.openDeliveryAddressDetailPopup({
653                        dlvrAdrsDvsnCode: $(this).data("dvsn-code"),
654                        isNewYn: "N",
655                        dlpnSrmb: dataKey,
656                        dmstDlvrPsblYn: resources.request.dmstDlvrPsblYn,
657                        frngDlvrPsblYn: resources.request.frngDlvrPsblYn,
658                        callback: (data) => { interfaces.api.getDeliveryList(methods.list.displayListItem, undefined, undefined, "bsc_dlpn_ysno desc, dlpn_srmb desc", undefined); },
659                    });
660                } else if (actionType === "delete") {
661                    // 주소 삭제
662                    KbbJS.ui.alert({
663                        text: "배송지 삭제시 더 이상<br/>배송지 목록에 노출되지 않습니다.<br/><br/>삭제하시겠습니까?",
664                        cancel: true,
665                        confirm: {
666                            label: "확인",
667                            callback: (b) => {
668                                b && interfaces.api.deleteAddress(dataKey, (r) => {
669                                    interfaces.api.getDeliveryList(methods.list.displayListItem, undefined, undefined, "bsc_dlpn_ysno desc, dlpn_srmb desc", undefined);
670                                });
671                            }
672                        }
673                    });
674                } // if
675            });
676
677            /* --------------------------------------------------------------------------------
678             * 기능명: 선택(닫기)버튼 클릭
679             * -------------------------------------------------------------------------------- */
680            $(document).on("click", resources.controls.addressSelectBtn, async function () {
681                if (!await methods.list.validateAsync()) {
682                    //console.log('validateAsync fail~~');
683                    return;
684                }
685
686                // 창 닫기
687                $(resources.controls.popupListDialogId).dialog("close");
688
689                // 콜백 함수 실행
690                if (resources.request["callback"] !== undefined && typeof resources.request["callback"] === "function") {
691                    let selItem = methods.list.getSelectAddressData();
692                    order.utils.callbackExec(resources.request.callback, selItem);
693                }
694
695                //장바구니 목록 화면에서 배송지 등록 시
696                // 콜백함수 내부로 이동
697                // if($("[data-popup-delivery-regist-wrapper='wrapper']").is(":visible") == false && $("[id^='cartListDeliveryBtn']").is(":visible") == true) {
698                //     window.location.reload(); //장바구니 재조회
699                // };
700            });
701        })();
702
703        // 국내배송지 신규/수정 이벤트
704        (function domesticEvents () {
705            /* --------------------------------------------------------------------------------
706             * 기능명: 주소검색 팝업
707             * -------------------------------------------------------------------------------- */
708            $(document).on("click", resources.controls.domAddrBtn, function () {
709                order.popup.addressSearch.interfaces.openDialog((data) => {
710                    resources.dataRegister["rdnmAdrsYsno"] = "Y";
711                    resources.dataRegister["frngPssrNum"] = data.zipCode5;
712                    resources.dataRegister["bscAdrs"] = `${data.viewRoadBscAdrs} ${data.viewRmrk}`;
713                    resources.dataRegister["dtlAdrs"] = "";
714                    resources.dataRegister["frngAddtAdrs1"] = data.address3BdngName;
715                    resources.dataRegister["frngAddtAdrs2"] = data.address4DongName;
716                    resources.dataRegister["bildgMngmNum"] = data.bildgMngmNum; // 건물관리번호
717
718                $(resources.controls.domAddr1).val(resources.dataRegister["bscAdrs"]);
719                $(resources.controls.domAddr2).val("");
720
721                    $(resources.controls.domAddrBtnArea).hide();
722                    $(resources.controls.domAddrShowArea).show();
723                    $(resources.controls.domDefaultCommonEnterCheckArea).show();
724                    methods.domestic.toggleCommonEnterPasswordArea();
725                });
726            });
727
728            /* --------------------------------------------------------------------------------
729             * 기능명: 해외 배송지로 변경
730             * -------------------------------------------------------------------------------- */
731            $(document).on("click", resources.controls.domOverSeasChgBtn, function () {
732                methods.foreign.openDialog(resources.dataRegister);
733                $(resources.controls.popupDomesticDialogId).dialog("close");
734            });
735
736            /* --------------------------------------------------------------------------------
737             * 기능명: 저장 버튼 (국내배송지)
738             * -------------------------------------------------------------------------------- */
739            $(document).on("click", resources.controls.domSaveBtn, async function () {
740                if (!await methods.domestic.validateAsync()) {
741                    //console.log('validateAsync fail~~');
742                    return;
743                }
744
745                // 창 닫기
746                $(resources.controls.popupDomesticDialogId).dialog("close");
747
748                // 콜백 함수 실행
749                if (resources.requestRegister["callback"] !== undefined &&
750                    typeof resources.requestRegister["callback"] === "function") {
751                    order.utils.callbackExec(resources.requestRegister.callback, resources.dataRegister);
752                }
753            });
754
755            /* --------------------------------------------------------------------------------
756             * 기능명: 필수 항목이 모두 입력되면 저장 버튼을 활성화
757             * -------------------------------------------------------------------------------- */
758            const updateDomesticSaveState = () => {
759                let recvName = $(resources.controls.domRecvName).val().trim();
760                let telNo = $(resources.controls.domTelno).val().trim();
761                let addr1 = $(resources.controls.domAddr1).val().trim();
762                let addr2 = $(resources.controls.domAddr2).val().trim();
763
764                const commonEnterInput = $(resources.controls.domCommonEnterPasswordInput);
765                const hasCommonEnterInput = commonEnterInput.length > 0;
766                const isCommonEnterVisible = $(resources.controls.domDefaultCommonEnterCheckArea).is(":visible");
767                const isPasswordRequired = hasCommonEnterInput && isCommonEnterVisible &&
768                    $(`${resources.controls.popupDomesticDialogId} #doorPassword_01`).prop("checked");
769                const gatePassword = hasCommonEnterInput ? commonEnterInput.val().trim() : "";
770                const isGatePasswordValid = !isPasswordRequired || gatePassword.length > 0;
771
772                const isRequiredFilled = recvName.length > 0 && telNo.length > 0 && addr1.length > 0 && addr2.length > 0;
773                $(resources.controls.domSaveBtn).attr("disabled", !(isRequiredFilled && isGatePasswordValid));
774            };
775
776            $(document).on("keyup change", `${resources.controls.popupDomesticDialogId} input`, updateDomesticSaveState);
777            $(document).on("change", resources.controls.domCommonEnterPasswordRadio, function () {
778                methods.domestic.toggleCommonEnterPasswordArea();
779                updateDomesticSaveState();
780            });
781
782            // 배송지명 입력글자수 제한
783            order.utils.limitInputText(resources.controls.domDeliveryName, 7, "");
784            // 받는분 입력글자수 제한(한글10, 영문숫자20)
785            methods.limitInputText(resources.controls.domRecvName, 20);
786
787            // 받는분 휴대폰번호 입력글자수 제한 (해외 연락처 허용을 위해 선행 "+" 를 남기고 최대 15자리)
788            order.utils.number.limitContactNumbers(resources.controls.domTelno, 15);
789            // 저장하기 전에 형식 오류를 미리 알려준다.
790            order.utils.bindContactNumberValidMessage(resources.controls.domTelno);
791            // 상세주소 입력글자수 제한
792            order.utils.limitInputText(resources.controls.domAddr2, 50, "");
793        })();
794
795        // 해외배송지 신규/수정 이벤트
796        (function foreignEvents () {
797            // 국내 배송지로 변경
798            $(document).on("click", resources.controls.fgnDomesticChgBtn, function () {
799                methods.domestic.openDialog(resources.dataRegister);
800                $(resources.controls.popupForeignDialogId).dialog("close");
801            });
802
803            // 해외배송 배송국가 선택(변경) 팝업 버튼
804            $(document).on("click", resources.controls.fgnCountryChgBtn, function () {
805                methods.foreign.openCountryListDialog();
806            });
807
808            // 해외배송 Fedex 배송비 계산/안내 팝업 버튼
809            $(document).on("click", resources.controls.fgnDeliveryFeeCalcBtn, function () {
810                // 배송구역이 없으면 api 호출
811                if (resources.regions.length === 0) {
812                    $(`${resources.controls.dlvFeeBoxCnt} option`).remove();
813                    for (let i = 1; i <= 99; i++) {
814                        $(resources.controls.dlvFeeBoxCnt).append(`<option value='${i}'>${i}</option>`);
815                    }
816                    if (!order.utils.isMobile()) {
817                        $(resources.controls.dlvFeeBoxCnt).selectmenu().selectmenu("refresh");
818                    }
819
820                    interfaces.api.getForeginZoneList(resources.constraints.frngDscmCode, (data) => {
821                        $(`${resources.controls.dlvFeeRegion} option`).remove();
822                        $(resources.controls.dlvFeeRegion).append("<option value=''>지역을 선택해 주세요.</option>");
823                        for (const item of data) {
824                            $(resources.controls.dlvFeeRegion).append(`<option value='${item.frngDlvrZoneCode}'>${item.frngDlvrZoneName}</option>`);
825                        }
826
827                        if (!order.utils.isMobile()) {
828                            $(resources.controls.dlvFeeRegion).selectmenu().selectmenu("refresh");
829                        }
830                    });
831                }
832
833                order.utils.openDialog(resources.controls.popupFedexFeeDialogId);
834            });
835
836            // 해외배송 안내 팝업 버튼
837            $(document).on("click", resources.controls.fgnOverseasInfo, function () {
838                order.utils.openDialog(resources.controls.popupOverseasInfoDialogId);
839            });
840
841            // 저장 버튼 (해외배송지)
842            $(document).on("click", resources.controls.fgnSaveBtn, async function () {
843                if (!await methods.foreign.validateAsync()) {
844                    //console.log('validateAsync fail~~');
845                    return;
846                }
847
848                // 창 닫기
849                $(resources.controls.popupForeignDialogId).dialog("close");
850
851                // 콜백 함수 실행
852                if (resources.requestRegister["callback"] !== undefined &&
853                    typeof resources.requestRegister["callback"] === "function") {
854                    order.utils.callbackExec(resources.requestRegister.callback, resources.dataRegister);
855                }
856            });
857
858
859            // 해외배송 배송국가 팝업 - 모바일 퀵링크 스크롤 처리 (동적 생성한 항목으로 스크롤되지 않아서 이벤트 추가)
860            $(document).on("click", "#popSelDeliveryCountry_quick button[data-filter]", function (evt) {
861                const filterName = $(this).data("filter");
862                document.getElementById(filterName).scrollIntoView(true);
863            })
864
865            // 해외배송 배송국가 팝업 - 배송국가 선택
866            $(document).on("click", resources.controls.countryItemSelect, function () {
867                const current = $(this);
868                let result = {
869                    frngDlvrNtnClstCode: current.data("pop-delivery-national-code"), // 국가 분류코드
870                    frngDlvrZoneCode: current.data("pop-delivery-zone-code"), // 해외배송구역코드
871                    frngDlvrNtnCode: current.data("pop-delivery-country-code"), // 해외배송국가코드
872                    ntnName: current.data("pop-delivery-country-name"), // 국가명
873                    frngDscmCode: current.data("pop-delivery-delivery-code"), // 해외택배사코드
874                };
875
876                $(resources.controls.popupCountriesDialogId).dialog("close");
877
878                // 배송국가명 표시
879                //console.log("베송국가 선택", result);
880                $(resources.controls.fgnCountryName).text(result.ntnName);
881                $(resources.controls.fgnDeliveryFee).text(0);
882                // 변수 update
883                resources.dataRegister.frngDlvrNtnCode = result.frngDlvrNtnCode;
884                resources.dataRegister.ntnName = result.ntnName;
885
886                // 해외배송비 조회
887                methods.foreign.setForeignDeliveryFeeVal(result.frngDlvrNtnCode);
888
889                // 미국인 경우 email 영역 초기화
890                // $(resources.controls.fgnEmailArea).hide();
891                // $(resources.controls.fgnEmail).val("");
892                // if (result.frngDlvrNtnCode === 'US') {
893                //     $(resources.controls.fgnEmailArea).show();
894                // }
895
896                $(resources.controls.fgnRecvName).trigger("keyup");
897            });
898
899            /* --------------------------------------------------------------------------------
900             * 기능명: 해외배송 배송구역별 배송료 조회
901             * -------------------------------------------------------------------------------- */
902            $(document).on((order.utils.isMobile() ? "change" : "selectmenuchange"), resources.controls.dlvFeeSelects, function () {
903                let amount = $(resources.controls.dlvFeeBoxCnt).val();
904                let region = $(resources.controls.dlvFeeRegion).val();
905                let fee = $(resources.controls.dlvFeeAmt);
906
907                fee.val("0");
908                if (amount !== "" && region !== "") {
909                    interfaces.api.getForeginDeliveryFee(amount, region, resources.constraints.frngDscmCode, (data) => {
910                        fee.val(order.utils.number.comma(data.frngDlvrAmnt));
911                    });
912                }
913            });
914
915            /* --------------------------------------------------------------------------------
916             * 기능명: 필수 항목이 모두 입력되면 저장 버튼을 활성화
917             * -------------------------------------------------------------------------------- */
918            $(document).on("keyup change", `${resources.controls.popupForeignDialogId} input`, function () {
919                let ntnCode = methods.nullToEmpty(resources.dataRegister.frngDlvrNtnCode);
920                let recvName = $(resources.controls.fgnRecvName).val().trim();
921                let telNo = $(resources.controls.fgnTelno).val().trim();
922                let addr1 = $(resources.controls.fgnAddress).val().trim();
923                let addr2 = $(resources.controls.fgnCity).val().trim();
924                let addr3 = $(resources.controls.fgnState).val().trim();
925                let addr4 = $(resources.controls.fgnZipCode).val().trim();
926
927                $(resources.controls.fgnSaveBtn).attr("disabled", !(ntnCode.length > 0 && recvName.length > 0 &&
928                    telNo.length > 0 && addr1.length > 0 && addr2.length > 0 && addr3.length > 0 && addr4.length > 0));
929            });
930
931            // 배송지명 입력글자수 제한
932            methods.limitChars(resources.controls.fgnDeliveryName, 50);
933            // 받는분 입력글자수 제한
934            methods.limitChars(resources.controls.fgnRecvName, 50);
935            // 받는분 휴대폰번호 입력글자수 제한
936            methods.limitFgnPhoneNumber(resources.controls.fgnTelno, 15);
937            // email 일력글자수 제한
938            methods.limitInputText(resources.controls.fgnEmail, 
938100);
939            // 상세주소 입력글자수 제한
940            methods.limitChars(resources.controls.fgnAddress, 100);
941            methods.limitChars(resources.controls.fgnCity, 100);
942            methods.limitChars(resources.controls.fgnState, 100);
943
944            // 2022-10-09 해외우편번호 영문/숫자 입력가능
945            //order.utils.number.limitInputNumbers(resources.controls.fgnZipCode, 10);
946            //methods.limitChars(resources.controls.fgnZipCode, 10);
947            methods.limitFgnZip(resources.controls.fgnZipCode, 10);
948
949        })();
950    };
951
952
953    let methods = {
954        list: {
955            // 배송지 목록을 리스트로 표현
956            displayListItem: (list) => {
957                resources.dataList = list;
958                let showDefaultYn = `${resources.request["showDefaultYn"]}`.toUpperCase();
959
960                let ul = $(resources.controls.deliveryListContainer);
961                ul.empty();
962
963                if (list.length === 0) {
964                    $(resources.controls.listPopupTitle).text("배송지 추가");
965                    $(resources.controls.deliveryListNoData).show();
966                    $(resources.controls.listPopupFooterArea).hide();
967                    ul.hide();
968                    return;
969                }
970
971                $(resources.controls.listPopupTitle).text("배송지 변경");
972                $(resources.controls.deliveryListNoData).hide();
973                $(resources.controls.listPopupFooterArea).show();
974                $(resources.controls.addressSelectBtn).prop("disabled", true);
975
976                if (showDefaultYn === "N") {
977                    $(resources.controls.defaultAddressCheckArea).hide();
978                } else {
979                    $(resources.controls.defaultAddressCheckArea).show();
980                }
981
982                let tmplItem = $("#tmpl_pop_delivery_list_item").render(list, {
983                    commaFormat: (val) => order.utils.number.comma(Number(val)),
984                    telNo: (dlvrAdrsDvsnCode, val) => dlvrAdrsDvsnCode === "100" ? order.utils.number.toKrPhone(val) : `+${val}`,
985                    joinAddress: (dlvrAdrsDvsnCode, frngPssrNum, bscAdrs, dtlAdrs, frngAddtAdrs1, frngAddtAdrs2) => {
986                        let displayAddress = "";
987                        switch (dlvrAdrsDvsnCode) {
988                            case "100": // 국내
989                                displayAddress = `[${frngPssrNum}] ${bscAdrs} ${dtlAdrs}`;
990                                break;
991                            case "200": // 해외
992                                displayAddress = `[${frngPssrNum}] ${bscAdrs} ${frngAddtAdrs1} ${frngAddtAdrs2}`;
993                                break;
994                        }
995                        return displayAddress;
996                    },
997                });
998                ul.append(tmplItem);
999                ul.show();
1000            }, // displayListItem
1001
1002            /* --------------------------------------------------------------------------------
1003             * 기능명: 리스트에 기본 배송지가 활성화 되어 있는지 여부 (기본배송지가 설정되어 있으면 true)
1004             * -------------------------------------------------------------------------------- */
1005            isDefaultDeliverySet: () => {
1006                let data = resources.dataList;
1007                for (let dataItem of data) {
1008                    if (dataItem["bscDlpnYsno"] === "Y") {
1009                        return true;
1010                    }
1011                }
1012                return false;
1013            }, // isDefaultDeliverySet
1014
1015            /* --------------------------------------------------------------------------------
1016             * 기능명: 배송지 목록에서 현재 선택한 배송지의 데이터 정보 (미선택시 null)
1017             * -------------------------------------------------------------------------------- */
1018            getSelectAddressData: () => {
1019                let checkbox = $(`${resources.controls.itemSelectCheck}:checked`);
1020                if (checkbox.length === 0)
1021                    return null;
1022
1023                let dlpnSrmb = `${checkbox.data("key")}`;
1024                for (let item of resources.dataList) {
1025                    if (`${item.dlpnSrmb}` === dlpnSrmb) {
1026                        return item;
1027                    }
1028                }
1029
1030                return null;
1031            }, // getSelectAddressData
1032
1033            /* --------------------------------------------------------------------------------
1034             * 기능명: 팝업 닫기 전 체크
1035             * -------------------------------------------------------------------------------- */
1036            validateAsync: async () => {
1037                let dataItem = methods.list.getSelectAddressData();
1038                let dmstDlvrPsblYn = `${resources.request["dmstDlvrPsblYn"]}`.toUpperCase();
1039                let frngDlvrPsblYn = `${resources.request["frngDlvrPsblYn"]}`.toUpperCase();
1040                let showDefaultYn = `${resources.request["showDefaultYn"]}`.toUpperCase();
1041
1042                // 선택항목 있는지 확인
1043                if (dataItem === null) {
1044                    await KbbJS.ui.alert("배송지를 선택해 주세요.");
1045                    return false;
1046                }
1047
1048                // 수신자명이 있는지 확인
1049                if (dataItem.recvName === '') {
1050                    await KbbJS.ui.alert("수신자명을 입력해 주세요.");
1051                    return false;
1052                }
1053                // 수신자 휴대전화번호가 있는지 확인
1054                if (dataItem.cphnTlnm === '') {
1055                    await KbbJS.ui.alert("수신자 휴대전화를 입력해 주세요.");
1056                    return false;
1057                }
1058                // 배송지 주소가 있는지 확인
1059                if (dataItem.bscAdrs === '') {
1060                    await KbbJS.ui.alert("배송지 주소를 입력해 주세요.");
1061                    return false;
1062                }
1063
1064                // 설정된 기본배송지가 없는데 기본배송지 체크박스를 선택하지 않은 경우
1065                if (!methods.list.isDefaultDeliverySet() &&
1066                    $(`${resources.controls.defaultAddressCheck}:checked`).length === 0 &&
1067                    showDefaultYn !== "N") {
1068                    await KbbJS.ui.alert("기본배송지 설정후 이용가능합니다.");
1069                    return false;
1070                }
1071
1072                // 국내배송 불가인 경우
1073                if (dmstDlvrPsblYn === "N" && dataItem.dlvrAdrsDvsnCode === "100") {
1074                    await KbbJS.ui.alert("국내배송이 불가합니다.<br>\n 해외 주소를 선택해 주세요.");
1075                    return false;
1076                }
1077
1078                // 해외배송 불가인 경우
1079                if (frngDlvrPsblYn === "N" && dataItem.dlvrAdrsDvsnCode === "200") {
1080                    await KbbJS.ui.alert(resources.request["frngDlvrImpbMsg"] || "해외배송이 불가합니다.<br>\n 국내 주소를 선택해 주세요.");
1081                    return false;
1082                }
1083
1084                // 국내배송 구주소인지 확인
1085                if (dataItem.dlvrAdrsDvsnCode === "100" &&
1086                    (dataItem.rdnmAdrsYsno !== "Y" || dataItem.frngPssrNum.length > 5)) {
1087                    await KbbJS.ui.alert("6자리 우편번호 주소는 <br/>사용할 수 없습니다. <br/><br/>" +
1088                        "도로명주소(5자리 우편번호)로 <br/>변경해주세요.");
1089                    return false;
1090                }
1091
1092                // 기본배송지 체크되어 있고 기본배송지가 목록에 설정된 기본배송지와 다르면 기본배송지 업데이트
1093                if ($(`${resources.controls.defaultAddressCheck}:checked`).length > 0 &&
1094                    dataItem.bscDlpnYsno !== "Y" && showDefaultYn !== "N") {
1095                    try {
1096                        let promise = new Promise((resolve, reject) => {
1097                            interfaces.api.setDefaultAddress(dataItem.dlpnSrmb, () => {
1098                                dataItem.bscDlpnYsno = "Y";
1099                                resolve();
1100                            }, reject);
1101                        });
1102                        await promise;
1103                    } catch (err) {
1104                        KbbJS.ui.alert(err.resultMessage);
1105                        return false;
1106                    }
1107
1108                    // 배송지 변경 시 공동현관 입력 UI 노출
1109                    $("#doorPassword_01").prop("checked","true");
1110                    $("[data-form-gateMessage='form']").show();
1111                }
1112
1113                return true;
1114            }, // validateAsync
1115        }, // list
1116        domestic: {
1117            /* --------------------------------------------------------------------------------
1118             * 기능명: 국내배송주소 입력/수정 팝업 오픈
1119             * -------------------------------------------------------------------------------- */
1120            openDialog: (data) => {
1121                Object.assign(resources.requestRegister, data);
1122                let isNewYn = methods.nullToEmpty(data["isNewYn"]).toUpperCase();
1123                let dlpnSrmb = methods.nullToEmpty(data["dlpnSrmb"]);
1124                let frngDlvrPsblYn = methods.nullToEmpty(data["frngDlvrPsblYn"]);
1125
1126                methods.domestic.setDialogData({});
1127                methods.resetDataRegister();
1128                order.utils.setValidMessage(resources.controls.domTelno, "", ""); // 이전 입력의 형식 안내 초기화
1129
1130                // 해외배송가능여부가 N인경우 버튼 숨김
1131                if (frngDlvrPsblYn === "N")
1132                    $(resources.controls.domOverSeasChgBtn).hide();
1133                else
1134                    $(resources.controls.domOverSeasChgBtn).show();
1135
1136                if (isNewYn !== "Y" && dlpnSrmb !== "") {
1137                    interfaces.api.getAddressDetail(dlpnSrmb, methods.domestic.setDialogData);
1138                }
1139
1140                $(resources.controls.domSaveBtn).attr("disabled", true); // 저장버튼 비활성화
1141                order.utils.openDialog(resources.controls.popupDomesticDialogId);
1142                methods.resetDialogScroll(resources.controls.popupDomesticDialogId);
1143            }, // openDialog
1144
1145            /* --------------------------------------------------------------------------------
1146             * 기능명: 국내배송주소 변경 value set
1147             * -------------------------------------------------------------------------------- */
1148            setDialogData: (data) => {
1149                resources.dataRegister = data;
1150
1151                if (methods.nullToEmpty(data["dlpnSrmb"]) === "") {
1152                    $(resources.controls.domDetailPopupTitle).text("배송지 추가");
1153                    $(resources.controls.domAddrBtnArea).show();
1154                    $(resources.controls.domAddrShowArea).hide();
1155                    $(resources.controls.domDefaultCommonEnterCheckArea).hide();
1156                } else {
1157                    $(resources.controls.domDetailPopupTitle).text("배송지 수정");
1158                    $(resources.controls.domAddrBtnArea).hide();
1159                    $(resources.controls.domAddrShowArea).show();
1160                    $(resources.controls.domDefaultCommonEnterCheckArea).show();
1161
1162                }
1163
1164                if (order.user.exists) {
1165                    // 회원
1166                    $(resources.controls.domDeliveryNameArea).show();
1167                    $(resources.controls.domDefaultAddressCheckArea).show();
1168                }
1169                else {
1170                    // 비회원
1171                    $(resources.controls.domDeliveryNameArea).hide();
1172                    $(resources.controls.domDefaultAddressCheckArea).hide();
1173                }
1174
1175                // 주소정보가 해외배송 정보가 아닐경우
1176                if(data["dlvrAdrsDvsnCode"] !== "200") {
1177                    $(resources.controls.domDeliveryName).val(methods.nullToEmpty(data["dlpnName"]));
1178                    $(resources.controls.domRecvName).val(methods.nullToEmpty(data["recvName"]));
1179                    $(resources.controls.domTelno).val(methods.nullToEmpty(data["cphnTlnm"]).replace(/[^0-9]/g, ''));
1180                    $(resources.controls.domAddr1).val(methods.nullToEmpty(data["bscAdrs"]));
1181                    $(resources.controls.domAddr2).val(methods.nullToEmpty(data["dtlAdrs"]));
1182
1183                    const cmnEntMthdCode = methods.nullToEmpty(data["cmnEntMthdCode"]);
1184                    const cmnEntMthdMemo = methods.nullToEmpty(data["cmnEntMthdMemo"]);
1185                    if (cmnEntMthdCode === "200") {
1186                        $("#doorPassword_02").prop("checked", true);
1187                    } else {
1188                        $("#doorPassword_01").prop("checked", true);
1189                        $(resources.controls.domCommonEnterPasswordInput).val(cmnEntMthdMemo);
1190                    }
1191                    methods.domestic.toggleCommonEnterPasswordArea();
1192                    $(resources.controls.domDefaultAddressCheck).prop("checked", (methods.nullToEmpty(data["bscDlpnYsno"]) === "Y"));
1193                }
1194                methods.resetDialogScroll(resources.controls.popupDomesticDialogId);
1195            },
1196            toggleCommonEnterPasswordArea: () => {
1197                const input = $(resources.controls.domCommonEnterPasswordInput);
1198                if (input.length === 0) {
1199                    return;
1200                }
1201                // 자유출입시 입력불가
1202                const isCommonEnterPassword = $(`${resources.controls.popupDomesticDialogId} #doorPassword_01`).prop("checked");
1203                const gateMessageForm = $("[data-form-gateMessage='form']");
1204                if (isCommonEnterPassword) {
1205                    gateMessageForm.show();
1206                } else {
1207                    gateMessageForm.hide();
1208                }
1209                methods.resetDialogScroll(resources.controls.popupDomesticDialogId);
1210            },
1211
1212            /* --------------------------------------------------------------------------------
1213             * 기능명: 국내배송주소 팝업 닫기 전 체크
1214             * -------------------------------------------------------------------------------- */
1215            validateAsync: async () => {
1216                const current = resources.dataRegister || {};
1217                const dlpnSrmb       = current.dlpnSrmb;
1218                const rdnmAdrsYsno   = (current.rdnmAdrsYsno ?? "").toString();
1219                const frngPssrNum    = (current.frngPssrNum ?? "").toString();
1220                const bscAdrs        = (current.bscAdrs ?? "").toString();
1221                const frngAddtAdrs1  = (current.frngAddtAdrs1 ?? "").toString();
1222                const frngAddtAdrs2  = (current.frngAddtAdrs2 ?? "").toString();
1223                const bildgMngmNum   = (current.bildgMngmNum ?? "").toString();
1224                const isCommonEnterPassword = $(`${resources.controls.popupDomesticDialogId} #doorPassword_01`).prop("checked");
1225                const cmnEntMthdCode = isCommonEnterPassword ? "100" : "200";
1226                const cmnEntMthdMemo = isCommonEnterPassword
1227                    ? $(resources.controls.domCommonEnterPasswordInput).val().trim()
1228                    : "";
1229
1230                // 데이터 정렬
1231                resources.dataRegister = {
1232                    dlpnSrmb, // 배송지순번
1233                    dlpnName: $(resources.controls.domDeliveryName).val().trim(), // 배송지명
1234                    recvName: $(resources.controls.domRecvName).val().trim(), // 받는분명
1235                    cphnTlnm: $(resources.controls.domTelno).val().replace(/[^0-9]/g, ''), // 휴대전화전화번호
1236                    email: $(resources.controls.fgnEmail).val(), // 이메일
1237                    dlvrAdrsDvsnCode: "100", // 배송주소구분코드 (100:국내, 200:해외)
1238                    rdnmAdrsYsno: rdnmAdrsYsno.trim(), // 도로명주소여부
1239                    frngDlvrNtnCode: "", // 해외배송국가코드
1240                    ntnName: "", // 국가명
1241                    frngPssrNum: frngPssrNum.trim(), // 우편번호
1242                    bscAdrs: bscAdrs.trim(), // 기본주소
1243                    dtlAdrs: $(resources.controls.domAddr2).val().trim(), // 상세주소
1244                    frngAddtAdrs1, // 해외부가주소1
1245                    frngAddtAdrs2, // 해외부가주소2
1246                    bscDlpnYsno: ($(resources.controls.domDefaultAddressCheck).prop("checked") ? "Y" : "N"), // 기본배송지여부
1247                    bildgMngmNum,  // 건물관리번호
1248                    cmnEntMthdCode, // 공동현관 출입방법코드
1249                    cmnEntMthdMemo, // 공동현관 출입비밀번호
1250                };
1251
1252                // 받는분 입력
1253                if (resources.dataRegister.recvName.length === 0) {
1254                    await KbbJS.ui.alert("이름을 입력해주세요.");
1255                    return false;
1256                }
1257
1258                // 휴대폰번호 입력 - 국내 휴대폰번호(010) 또는 국가번호로 시작하는 해외 연락처만 허용
1259                if (!order.utils.number.isAllowedContactNumber(resources.dataRegister.cphnTlnm)) {
1260                    await KbbJS.ui.alert({
1261                    title: "연락처 형식을 확인해 주세요.",
1262                    text: "휴대폰 번호(010으로 시작하는 11자리) 또는 국가번호를 포함한 해외 번호만 입력할 수 있어요."
1263                });
1264                    return false;
1265                }
1266
1267                // 주소 입력
1268                if (resources.dataRegister.frngPssrNum.length === 0 ||
1269                    resources.dataRegister.bscAdrs.length === 0) {
1270                    await KbbJS.ui.alert("주소를 입력해주세요.");
1271                    return false;
1272                }
1273
1274                // 휴대폰번호 입력
1275                if (resources.dataRegister.dtlAdrs.length === 0) {
1276                    await KbbJS.ui.alert("상세주소를 입력해주세요.");
1277                    return false;
1278                }
1279
1280                // 배송지명 미입력시 받는사람 이름
1281                if (resources.dataRegister.dlpnName.length === 0) {
1282                    resources.dataRegister.dlpnName = resources.dataRegister.recvName;
1283                }
1284
1285                // 회원일 경우 배송주소 저장
1286                if (order.user.exists) {
1287                    // 배송주소 저장
1288                    try {
1289                        let promise = new Promise((resolve, reject) => {
1290                            interfaces.api.saveAddressDetail(resources.dataRegister, resolve, reject);
1291                        });
1292                        await promise;
1293                    } catch (err) {
1294                        KbbJS.ui.alert(err.resultMessage);
1295                        return false;
1296                    }
1297                }
1298
1299                return true;
1300            }, // validateAsync
1301        }, // domestic
1302        foreign: {
1303            /* --------------------------------------------------------------------------------
1304             * 기능명: 해외배송주소 입력/수정 팝업 오픈
1305             * -------------------------------------------------------------------------------- */
1306            openDialog: (data) => {
1307                Object.assign(resources.requestRegister, data);
1308                let isNewYn = methods.nullToEmpty(data["isNewYn"]).toUpperCase();
1309                let dlpnSrmb = methods.nullToEmpty(data["dlpnSrmb"]);
1310                let dmstDlvrPsblYn = methods.nullToEmpty(data["dmstDlvrPsblYn"]);
1311
1312                methods.foreign.setDialogData({});
1313                methods.resetDataRegister();
1314
1315                // 국내배송가능여부가 N인경우 버튼 숨김
1316                if (dmstDlvrPsblYn === "N")
1317                    $(resources.controls.fgnDomesticChgBtn).hide();
1318                else
1319                    $(resources.controls.fgnDomesticChgBtn).show();
1320
1321                // 해외배송 국가코드 목록조회
1322                interfaces.api.listCountries(resources.constraints.frngDscmCode, (data) => {
1323                    if (isNewYn !== "Y" && dlpnSrmb !== "") {
1324                        interfaces.api.getAddressDetail(dlpnSrmb, methods.foreign.setDialogData);
1325                    }
1326                });
1327
1328                $(resources.controls.fgnSaveBtn).attr("disabled", true);
1329                order.utils.openDialog(resources.controls.popupForeignDialogId);
1330                methods.resetDialogScroll(resources.controls.popupForeignDialogId);
1331            }, // openDialog
1332
1333            /* --------------------------------------------------------------------------------
1334             * 기능명: 해외배송주소 변경 value set
1335             * -------------------------------------------------------------------------------- */
1336            setDialogData: (data) => {
1337                // 2022-10-13 해외배송 필드 ntnName > frngDlvrNtnName로 변경되어있음. 스크립트내에서 ntnName 사용중.
1338                data["ntnName"] = data["frngDlvrNtnName"];
1339
1340                resources.dataRegister = data;
1341
1342                if (methods.nullToEmpty(data["dlpnSrmb"]) === "") {
1343                    $(resources.controls.fgnDetailPopupTitle).text("배송지 추가");
1344                } else {
1345                    $(resources.controls.fgnDetailPopupTitle).text("배송지 수정");
1346                }
1347
1348                if (order.user.exists) {
1349                    // 회원
1350                    $(resources.controls.fgnDeliveryNameArea).show();
1351                    $(resources.controls.fgnDefaultAddressCheckArea).show();
1352                }
1353                else {
1354                    // 비회원
1355                    $(resources.controls.fgnDeliveryNameArea).hide();
1356                    $(resources.controls.fgnDefaultAddressCheckArea).hide();
1357                }
1358
1359                // 주소정보가 국내배송 정보가 아닐경우
1360                if(data["dlvrAdrsDvsnCode"] !== "100") {
1361                    $(resources.controls.fgnDeliveryName).val(methods.nullToEmpty(data["dlpnName"]));
1362                    $(resources.controls.fgnRecvName).val(methods.nullToEmpty(data["recvName"]));
1363                    $(resources.controls.fgnTelno).val(methods.nullToEmpty(data["cphnTlnm"]).replace(/[^0-9]/g, ''));
1364                    $(resources.controls.fgnEmail).val(methods.nullToEmpty(data["email"]));
1365                    $(resources.controls.fgnAddress).val(methods.nullToEmpty(data["bscAdrs"]));
1366                    $(resources.controls.fgnCity).val(methods.nullToEmpty(data["frngAddtAdrs1"]));
1367                    $(resources.controls.fgnState).val(methods.nullToEmpty(data["frngAddtAdrs2"]));
1368                    $(resources.controls.fgnZipCode).val(methods.nullToEmpty(data["frngPssrNum"]));
1369
1370                    if (methods.nullToEmpty(data["ntnName"]) !== "") {
1371                        $(resources.controls.fgnCountryName).text(methods.nullToEmpty(data["ntnName"])); // 국가명
1372
1373                        // 국가별 해외 배송비 조회
1374                        if (resources.countries.length > 0 &&
1375                            methods.nullToEmpty(data["frngDlvrNtnCode"]) !== "") {
1376                            methods.foreign.setForeignDeliveryFeeVal(data.frngDlvrNtnCode);
1377
1378                            $(resources.controls.fgnEmail).val(data["email"]);
1379
1380                            //$(resources.controls.fgnEmail).val();
1381                            //$(resources.controls.fgnEmailArea).hide();
1382                            // 미국인 경우 email
1383                            // if (data["frngDlvrNtnCode"] === 'US') {
1384                            //     $(resources.controls.fgnEmail).val(data["email"]);
1385                            //     $(resources.controls.fgnEmailArea).show();
1386                            // }
1387                        }
1388                    } else {
1389                        $(resources.controls.fgnCountryName).text("Select a Shipping Country");
1390                    }
1391
1392                    $(resources.controls.fgnDefaultAddressCheck).prop("checked", (methods.nullToEmpty(data["bscDlpnYsno"]) === "Y"));
1393                }
1394                methods.resetDialogScroll(resources.controls.popupForeignDialogId);
1395            }, // resetParameter
1396
1397            /* --------------------------------------------------------------------------------
1398             * 기능명: 해외배송국가 목록 팝업
1399             * -------------------------------------------------------------------------------- */
1400            openCountryListDialog: () => {
1401                interfaces.api.listCountries(resources.constraints.frngDscmCode, methods.foreign.displayCountries);
1402                order.utils.openDialog(resources.controls.popupCountriesDialogId);
1403            }, // openCountryListDialog
1404
1405            /* --------------------------------------------------------------------------------
1406             * 기능명: 해외배송국가 목록 작성
1407             * -------------------------------------------------------------------------------- */
1408            displayCountries: (data) => {
1409                data.sort((a, b) => {
1410                    return a.ntnName.localeCompare(b.ntnName)
1411                });
1412
1413                let countryInfo = [];
1414                let currentCountryName = "";
1415                let countryDetail = {
1416                    title: "",
1417                    countries: []
1418                };
1419                for (const listKey of data) {
1420                    const countryName = listKey.ntnName.substring(0, 1);
1421                    if (countryName !== currentCountryName) {
1422                        currentCountryName = countryName;
1423                        countryDetail = {
1424                            title: countryName,
1425                            countries: [],
1426                        };
1427                        countryInfo.push(countryDetail);
1428                    }
1429                    countryDetail.countries.push(listKey);
1430                }
1431
1432                let quickLink = $.templates(resources.controls.countryQuickLink).render({ list: countryInfo });
1433                let countryList = $.templates(resources.controls.countryListItem).render({ list: countryInfo });
1434
1435                $(resources.controls.countryQuickLinkList).empty().append(quickLink);    // 모바일 퀵링크 제공
1436                $(resources.controls.countryList).empty().append(countryList);
1437            }, // displayCountries
1438
1439            /* --------------------------------------------------------------------------------
1440             * 기능명: 해외배송 배송국가별 기본배송비 조회
1441             * -------------------------------------------------------------------------------- */
1442            setForeignDeliveryFeeVal: (frngDlvrNtnCode) => {
1443                $(resources.controls.fgnDeliveryFee).text("0");
1444
1445                for (let item of resources.countries) {
1446                    if (item.frngDlvrNtnCode === frngDlvrNtnCode) {
1447                        //console.log(`국가: ${frngDlvrNtnCode}, 배송구역: ${item.frngDlvrZoneCode}, 택배사: ${item.frngDscmCode}`);
1448                        interfaces.api.getForeginDeliveryFee(1, item.frngDlvrZoneCode, item.frngDscmCode,
1449                            (data) => {
1450                                $(resources.controls.fgnDeliveryFee).text(order.utils.number.comma(data["frngDlvrAmnt"]));
1451                            });
1452                        break;
1453                    }
1454                }
1455            }, // setForeignDeliveryFeeVal
1456
1457            /* --------------------------------------------------------------------------------
1458             * 기능명: 해외배송주소 팝업 닫기 전 체크
1459             * -------------------------------------------------------------------------------- */
1460            validateAsync: async () => {
1461                // 데이터 정렬
1462                const frngDlvrNtnCode = methods.nullToEmpty(resources.dataRegister.frngDlvrNtnCode);
1463
1464                const ntnName = methods.nullToEmpty(resources.dataRegister.ntnName);
1465
1466                resources.dataRegister = {
1467                    dlpnSrmb: resources.dataRegister.dlpnSrmb, // 배송지순번
1468                    dlpnName: $(resources.controls.fgnDeliveryName).val(), // 배송지명
1469                    recvName: $(resources.controls.fgnRecvName).val().trim(), // 받는분명
1470                    cphnTlnm: $(resources.controls.fgnTelno).val().replace(/[^0-9]/g, ''), // 휴대전화전화번호
1471                    email: $(resources.controls.fgnEmail).val().trim(), // 이메일
1472                    dlvrAdrsDvsnCode: "200", // 배송주소구분코드 (100:국내, 200:해외)
1473                    rdnmAdrsYsno: "N", // 도로명주소여부
1474                    frngDlvrNtnCode: frngDlvrNtnCode, // 해외배송국가코드
1475                    ntnName: ntnName, // 국가명
1476                    frngPssrNum: $(resources.controls.fgnZipCode).val().trim(), // Zip Code
1477                    bscAdrs: $(resources.controls.fgnAddress).val().trim(), // Address
1478                    dtlAdrs: "", // 상세주소
1479                    frngAddtAdrs1: $(resources.controls.fgnCity).val().trim(), // city
1480                    frngAddtAdrs2: $(resources.controls.fgnState).val().trim(), // state
1481                    bscDlpnYsno: ($(resources.controls.fgnDefaultAddressCheck).prop("checked") ? "Y" : "N"), // 기본배송지여부
1482                };
1483
1484                if (frngDlvrNtnCode.length === 0) {
1485                    await KbbJS.ui.alert("Shipping Country를 입력해주세요.");
1486                    return false;
1487                }
1488
1489                // 받는분 입력
1490                if (resources.dataRegister.recvName.length === 0 || resources.dataRegister.recvName === 'undefined') {
1491                    await KbbJS.ui.alert("Full Name을 입력해주세요.");
1492                    return false;
1493                }
1494
1495                // 휴대폰번호 입력
1496                if (resources.dataRegister.cphnTlnm.length === 0 || resources.dataRegister.cphnTlnm === 'undefined') {
1497                    await KbbJS.ui.alert("Mobile Number를 입력해주세요.");
1498                    return false;
1499                }
1500
1501                // 휴대폰번호 형식 - 해외 배송지는 현지 형식을 허용하므로 자릿수만 확인한다.
1502                if (!order.utils.number.isAllowedForeignAddressNumber(resources.dataRegister.cphnTlnm)) {
1503                    await KbbJS.ui.alert("Mobile Number는 숫자 7~15자리로 입력해 주세요.");
1504                    return false;
1505                }
1506
1507                // email 입력
1508                const isUSAddress = frngDlvrNtnCode === 'US';
1509                const regEmail = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,}$/; // TLD 길이 완화
1510                const email = resources.dataRegister.email;
1511
1512                // email 입력항목이 있을 경우
1513                if (email && !regEmail.test(email)) {
1514                    await KbbJS.ui.alert("Email Address 형식으로 입력해주세요.");
1515                    return false;
1516                }
1517
1518                // USA인 경우 필수
1519                if (isUSAddress) {
1520                    if (!email) {
1521                        await KbbJS.ui.alert("미국 세관 규정에 따라</br> 수령인 Email 입력이 필요합니다.");
1522                        return false;
1523                    }
1524                }
1525
1526
1527                // 주소 입력
1528                if (resources.dataRegister.bscAdrs.length === 0 || resources.dataRegister.bscAdrs === 'undefined') {
1529                    await KbbJS.ui.alert("Address를 입력해주세요.");
1530                    return false;
1531                }
1532                if (resources.dataRegister.frngAddtAdrs1.length === 0 || resources.dataRegister.frngAddtAdrs1 === 'undefined') {
1533                    await KbbJS.ui.alert("City를 입력해주세요.");
1534                    return false;
1535                }
1536                if (resources.dataRegister.frngAddtAdrs2.length === 0 || resources.dataRegister.frngAddtAdrs2 === 'undefined') {
1537                    await KbbJS.ui.alert("State/Province를 입력해주세요.");
1538                    return false;
1539                }
1540                if (resources.dataRegister.frngPssrNum.length === 0) {
1541                    await KbbJS.ui.alert("Zip Code를 입력해주세요.");
1542                    return false;
1543                }
1544
1545                // 배송지명 미입력시 받는사람 이름
1546                if (resources.dataRegister.dlpnName.length === 0) {
1547                    resources.dataRegister.dlpnName = resources.dataRegister.recvName;
1548                }
1549
1550                // 회원일 경우 배송주소 저장
1551                if (order.user.exists) {
1552                    // 배송주소 저장
1553                    try {
1554                        let promise = new Promise((resolve, reject) => {
1555                            // 해외베송 국가명 추가
1556                            resources.dataRegister["frngDlvrNtnName"] = resources.dataRegister.ntnName;
1557
1558                            interfaces.api.saveAddressDetail(resources.dataRegister, resolve, reject);
1559                        });
1560                        await promise;
1561                    } catch (err) {
1562                        KbbJS.ui.alert(err.resultMessage);
1563                        return false;
1564                    }
1565                }
1566
1567                return true;
1568            }, // validateAsync
1569
1570        }, // foreign
1571        /* --------------------------------------------------------------------------------
1572         * 기능명: 문자열 입력 제한(byte)
1573         *       영문,숫자 1byte, 한글 2byte로 계산
1574         *
1575         * methods.limitInputText(selector, limitTextCount)
1576         * @param {string} selector 입력요소선택자
1577         * @param {number} limitTextCount 제한글자수
1578         * -------------------------------------------------------------------------------- */
1579        limitInputText : (selector, limitTextCount) => {
1580            if($(selector).length > 0) {
1581                $(selector).attr("maxlength", limitTextCount);
1582
1583                $(document).off("keyup", selector).on("keyup", selector, function() {
1584
1585                    let text = String($(selector).val());
1586                    let byte = order.utils.getStringByteLength(text);
1587                    if(byte > limitTextCount) {
1588                        let sliceText = (val) => {
1589                            let vByte = order.utils.getStringByteLength(val);
1590                            if(vByte > limitTextCount) return sliceText(val.slice(0, val.length-1));
1591                            else return val;
1592                        }
1593
1594                        let value = sliceText(text.slice(0, text.length-1));
1595                        $(selector).val(value);
1596                    }
1597
1598                });
1599            } else {
1600                console.warn("선택자에 해당하는 요소가 없습니다. " + selector);
1601            }
1602        }, // limitInputText
1603        /* --------------------------------------------------------------------------------
1604         * 기능명: 영문주소 입력 글자 및 글자수 제한
1605         * - 영문자(a-z,A-Z), 숫자(0-9), 마침표(.), 공백( ), 대쉬(-) 외 다른 글자 입력 불가
1606         * -------------------------------------------------------------------------------- */
1607        limitChars: (selector, limitCnt) => {
1608            $(document).on("keyup change", selector, function () {
1609                let target = $(this);
1610                let text = `${target.val()}`.replace(/[^a-zA-Z0-9,\\. \-]/g,"");
1611                if (text.length > Number(limitCnt)) {
1612                    text = text.substring(0, Number(limitCnt));
1613                }
1614                target.val(text);
1615            });
1616        },
1617
1618        /* --------------------------------------------------------------------------------
1619         * 기능명: 해외주소 phone number 숫자만 허용
1620         * - 영문자(a-z,A-Z), 숫자(0-9), 대쉬(-) 외 다른 글자 입력 불가
1621         * -------------------------------------------------------------------------------- */
1622        limitFgnPhoneNumber: (selector, limitCnt) => {
1623            $(document).on("keyup change", selector, function () {
1624                let target = $(this);
1625                let text = `${target.val()}`.replace(/[^0-9]/g, "");
1626                text = text.replace(/[‐‒–—―-]/g, "-");
1627
1628                if (text.length > Number(limitCnt)) {
1629                    text = text.substring(0, Number(limitCnt));
1630                }
1631                target.val(text);
1632            });
1633        },
1634
1635        /* --------------------------------------------------------------------------------
1636         * 기능명: 해외주소 입력 글자 및 글자수 제한
1637         * - 영문자(a-z,A-Z), 숫자(0-9), 대쉬(-) 외 다른 글자 입력 불가
1638         * -------------------------------------------------------------------------------- */
1639        limitFgnZip: (selector, limitCnt) => {
1640            $(document).on("keyup change", selector, function () {
1641                let target = $(this);
1642                let text = `${target.val()}`.replace(/[^A-Za-z0-9 \-‐‒–—―-]/g,"");
1643                text = text.replace(/[‐‒–—―-]/g, "-");
1644
1645                if (text.length > Number(limitCnt)) {
1646                    text = text.substring(0, Number(limitCnt));
1647                }
1648                target.val(text);
1649            });
1650        },
1651        /* --------------------------------------------------------------------------------
1652         * 기능명: undefined 또는 null 을 ""
1653         * -------------------------------------------------------------------------------- */
1654        nullToEmpty: (o) => (o === undefined || o === null) ? "" : o,
1655
1656        /* --------------------------------------------------------------------------------
1657         * 기능명: 등록/수정 데이터 초기화
1658         * -------------------------------------------------------------------------------- */
1659        resetDataRegister: () => {
1660            resources.dataRegister = {
1661                dlpnSrmb: "", // 배송지순번
1662                dlpnName: "", // 배송지명
1663                recvName: "", // 받는분명
1664                cphnTlnm: "", // 휴대전화전화번호
1665                email: "", //이메일
1666                dlvrAdrsDvsnCode: "", // 배송주소구분코드 (100:국내, 200:해외)
1667                rdnmAdrsYsno: "", // 도로명주소여부
1668                frngDlvrNtnCode: "", // 해외배송국가코드
1669                ntnName: "", // 국가명
1670                frngPssrNum: "", // 우편번호
1671                bscAdrs: "", // 기본주소
1672                dtlAdrs: "", // 상세주소
1673                frngAddtAdrs1: "", // 해외부가주소1
1674                frngAddtAdrs2: "", // 해외부가주소2
1675                bscDlpnYsno: "", // 기본배송지여부
1676                bildgMngmNum: "", // 건물관리번호
1677                cmnEntMthdCode: "", // 공동현관 출입방법코드
1678                cmnEntMthdMemo: "", // 공동현관 출입비밀번호
1679            };
1680        }, // resetDataRegister
1681        resetDialogScroll: (selector) => {
1682            const dialog = $(selector);
1683            if (dialog.length === 0) {
1684                return;
1685            }
1686            dialog.find(".custom_scroll_wrap").each(function () {
1687                const wrap = $(this);
1688                wrap.addClass("active");
1689                wrap.find(".custom_scroll_inner").css("height", "");
1690                const simplebar = this.SimpleBar;
1691                if (simplebar && typeof simplebar.recalculate === "function") {
1692                    simplebar.recalculate();
1693                }
1694            });
1695        },
1696
1697
1698    }; // methods
1699
1700    // 중복 include 방지
1701    if (order !== undefined && order["popup"] !== undefined && order.popup["delivery"] !== undefined) {
1702        return;
1703    }
1704
1705    addEvents();
1706
1707    let _interfaces = order.utils.createNestedObject(order, "popup.delivery.interfaces", {});
1708    Object.assign(_interfaces, interfaces);
1709})();

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.