');
				    }
				    setMobileVideoRatio();
					// 크리마 리뷰 사용 중일 시 위젯 호출
				    if(document.querySelector(".crema-product-reviews")){
					    if(typeof crema !== 'undefined'){
						    crema.run();
					    }
				    }
				    $prod_detail_content_mobile.toggleClass('product_detail_mobile', true);
				    $prod_detail_content_mobile.toggleClass('product_review_mobile', false);
				    $prod_detail_content_mobile.toggleClass('product_qna_mobile', false);
				    $prod_detail_content_mobile.toggleClass('product_return_mobile', false);
				    break;
				}
			    case type === SHOP_CONST.TAB_TYPE.REVIEW: {
				    $.ajax({
					    type: review_paging ? 'POST' : 'GET',
					    data: { 'prod_idx': current_prod_idx, 'review_page': review_page, 'qna_page': qna_page, 'only_photo': only_photo, 'member_hash': MEMBER_HASH, 'is_mobile' : SHOP_CONST.IS_MOBILE, 'rating' : rating },
					    url: ('/shop/prod_review_mobile_html.cm'),
					    dataType: 'html',
					    async: false,
					    success: function (result) {
						    if ($('._external_widget_review_pc_position')) {
							    $('._external_widget_review_pc_position').remove();
						    }
						    if (!$review_summary_wrap_mobile.html()) {
							    getReviewSummary();
						    }
						    if (tab_type === 'Y') {
							    $('.categorize-mobile ._review_wrap').html(result);
						    }else{
							    $prod_detail_content_mobile.html(result);
						    }
						    $prod_detail_content_mobile.toggleClass('product_detail_mobile', false);
						    $prod_detail_content_mobile.toggleClass('product_review_mobile', true);
						    $prod_detail_content_mobile.toggleClass('product_qna_mobile', false);
						    $prod_detail_content_mobile.toggleClass('product_return_mobile', false);
					    }
				    });
				    break;
				}
			    case type === SHOP_CONST.TAB_TYPE.QNA: {
				    $.ajax({
					    type: 'POST',
					    data: { 'prod_idx': current_prod_idx, 'review_page': review_page, 'qna_page': qna_page },
					    url: ('/shop/prod_qna_mobile_html.cm'),
					    dataType: 'html',
					    cache: false,
					    async: false,
					    success: function (result) {
						    if (options.shop_view_tab_display !== "Y"){
							    if($review_summary_wrap_mobile.html()){
								    $review_summary_wrap_mobile.empty();
								    $review_summary_wrap_mobile.hide();
							    }
						    }
						    if (tab_type === 'Y') {
							    $('.categorize-mobile ._qna_wrap').html(result);
						    } else {
							    $prod_detail_content_mobile.html(result).css({ 'width': '100%' });
						    }
						    $prod_detail_content_mobile.toggleClass('product_detail_mobile', false);
						    $prod_detail_content_mobile.toggleClass('product_review_mobile', false);
						    $prod_detail_content_mobile.toggleClass('product_qna_mobile', true);
						    $prod_detail_content_mobile.toggleClass('product_return_mobile', false);
					    }
				    });
				    break;
				}
			    case type === SHOP_CONST.TAB_TYPE.RETURN: {
				    if (options.shop_view_tab_display !== "Y"){
					    if($review_summary_wrap_mobile.html()){
						    $review_summary_wrap_mobile.empty();
						    $review_summary_wrap_mobile.hide();
					    }
				    }
				    if (last_refund_data) {
					    const prod_detail_return_html = last_refund_data.use_shop_return ? IMWEB_TEMPLATE.loadSimple("prodReturnMobile", last_refund_data) : IMWEB_TEMPLATE.loadSimple("prodReturnDisable", null);
					    if (tab_type === 'Y') {
						    var $_target = $('.categorize-mobile ._return_wrap');
					    }else{
						    var $_target = $prod_detail_content_mobile;
					    }
					    $_target.empty();
					    $_target.html(prod_detail_return_html).css({ 'width': '100%' });
				    }
				    $prod_detail_content_mobile.toggleClass('product_detail_mobile', false);
				    $prod_detail_content_mobile.toggleClass('product_review_mobile', false);
				    $prod_detail_content_mobile.toggleClass('product_qna_mobile', false);
				    $prod_detail_content_mobile.toggleClass('product_return_mobile', true);
				    break;
				}
		    }
	    }
		let margin_top = 0;
		let prod_tab_target;
		if(options.shop_view_tab_display !== "Y"){
			prod_tab_target = document.querySelector('#prod_tab_target_mobile');
			if(options.shop_tab_fixed !== "Y"){
				margin_top = -1 * getFixedHeaderHeight() + 'px';
			}else if(review_paging){
				margin_top = (-1 * document.querySelector('#fixed_tab_mobile ._prod_detail_tab_fixed').getBoundingClientRect().height) + 'px';
			}
		}else{
			prod_tab_target = document.querySelector(`#prod_detail_${type}_target_mobile`);
			margin_top = (-1 * document.querySelector('#fixed_tab_mobile ._prod_detail_tab_fixed').getBoundingClientRect().height) + 'px';
		}
	    if(review_paging){
		    prod_tab_target = document.querySelector('.categorize-mobile ._prod_detail_review_board_target');
	    }
		if(review_paging || qna_paging || is_init_detail){
			if(prod_tab_target){
				prod_tab_target.style.top = margin_top;
				prod_tab_target.scrollIntoView();
			}
			if(is_init_detail){
				setTabHistory(type);
				setTimeout(() => {
					checkSeemore(type);
				}, 200);
			}
		}
    };
	var getFixedHeaderHeight = function(){
		let margin_top = 0;
		let $fixed_header_disable;
		if(document.querySelector('#inline_header_fixed')){
			if (!IS_MOBILE) {
				$fixed_header_disable = $('#inline_header_fixed');
			} else {
				$fixed_header_disable = $('#inline_header_mobile').find('._fixed_header_section');
			}
		}else{
			if (!IS_MOBILE) {
				$fixed_header_disable = $('#inline_header_normal').find('._fixed_header_section');
			} else {
				$fixed_header_disable = $('#inline_header_mobile').find('._fixed_header_section');
			}
		}
		for ( var i = 0; i < $fixed_header_disable.length; i++ ) {
			var target = $fixed_header_disable[i].getBoundingClientRect();
			margin_top += target.height;
		}
		return margin_top;
	};
    /**
     * 상세정보 펼쳐보기 버튼 노출 처리
     */
    let checkSeemore = function (type) {
        const $seemore_wrap = $body.find('._seemore_wrap');
        if($seemore_wrap.length === 0) return;
        // 탭 노출 방식이 한 페이지 노출 방식이거나 탭 노출 방식이 아니면서 상세정보 탭일 때만 펼쳐보기 노출
        if(options.shop_view_tab_display == "Y" || (options.shop_view_tab_display == "N" && type == SHOP_CONST.TAB_TYPE.DETAIL)) {
			// template 이 변환되는 시점이 비동기가 되어 당장 사이즈를 알 수가 없다.
            // if((!is_mobile_width && $prod_detail_content_pc.outerHeight() > SHOP_CONST.SEEMORE_HEIGHT.PC) || (is_mobile_width && $prod_detail_content_mobile.outerHeight() > SHOP_CONST.SEEMORE_HEIGHT.MOBILE)) {
                $prod_detail_content_pc.toggleClass('hide_seemore', false);
                $prod_detail_content_mobile.toggleClass('hide_seemore', false);
                $seemore_wrap.show();
				return;
            // }
        }
		$prod_detail_content_pc.toggleClass('hide_seemore', true);
		$prod_detail_content_mobile.toggleClass('hide_seemore', true);
		$seemore_wrap.hide();
    };
    var setTabHistory = function (type) {
        if (!$('body').hasClass('admin')) {
            if (checkUseHistory()) {
                var current_url = location.href.indexOf('#') === -1 ? location.href : location.href.substr(0, location.href.indexOf('#'));
                switch (type) {
                    case SHOP_CONST.TAB_TYPE.DETAIL:
                        history.replaceState(null, null, current_url + "#prod_detail_detail");
                        break;
                    case SHOP_CONST.TAB_TYPE.REVIEW:
                        history.replaceState(null, null, current_url + "#prod_detail_review");
                        break;
                    case SHOP_CONST.TAB_TYPE.QNA:
                        history.replaceState(null, null, current_url + "#prod_detail_qna");
                        break;
                    case SHOP_CONST.TAB_TYPE.RETURN:
                        history.replaceState(null, null, current_url + "#prod_detail_return");
                        break;
                    default:
                        let target_tab = options.first_tab === "prod_detail" ? SHOP_CONST.TAB_TYPE.DETAIL : options.first_tab === "prod_review" ? SHOP_CONST.TAB_TYPE.REVIEW : options.first_tab === "prod_qna" ? SHOP_CONST.TAB_TYPE.QNA : options.first_tab === "prod_return" ? SHOP_CONST.TAB_TYPE.RETURN : "";
                        history.replaceState(null, null, current_url + `#prod_detail_${target_tab}`);
                        break;
                }
            } else {
                switch (type) {
                    case SHOP_CONST.TAB_TYPE.DETAIL:
                        location.hash = "prod_detail_detail";
                        break;
                    case SHOP_CONST.TAB_TYPE.REVIEW:
                        location.hash = "prod_detail_review";
                        break;
                    case SHOP_CONST.TAB_TYPE.QNA:
                        location.hash = "prod_detail_qna";
                        break;
                    case SHOP_CONST.TAB_TYPE.RETURN:
                        location.hash = "prod_detail_return";
                        break;
                    default:
                        let target_tab = options.first_tab === "prod_detail" ? SHOP_CONST.TAB_TYPE.DETAIL : options.first_tab === "prod_review" ? SHOP_CONST.TAB_TYPE.REVIEW : options.first_tab === "prod_qna" ? SHOP_CONST.TAB_TYPE.QNA : options.first_tab === "prod_return" ? SHOP_CONST.TAB_TYPE.RETURN : "";
                        location.hash = `prod_detail_${target_tab}`;
                        break;
                }
            }
        }
    };
    var setMobileVideoRatio = function () {
        // 동영상 크기 값이 입력되어 있을 시 모바일에서도 입력된 크기 기준으로 비율 계산해서 반영
        var $fr_video = $prod_detail_content_mobile.find('.fr-video.fr-dvb');
		if ($fr_video.length > 0) {
            $fr_video.each(function (k, v) {
                var $fr_video_iframe = $(v).find('iframe');
                if ($fr_video_iframe.length > 0) {
					var origin_width = $fr_video_iframe[0].style.width;
                    var origin_height = $fr_video_iframe[0].style.height;
					if (origin_width != '' && origin_height != '') {
                        // px 단위일 때만 비율 보정
                        var origin_width_split = origin_width.split('px');
                        var origin_height_split = origin_height.split('px');
						if (origin_width_split.length === 2 && origin_height_split.length === 2) {
                            var video_ratio = (origin_height_split[0] / origin_width_split[0]) * 100;
                            $(v).css('padding-bottom', video_ratio + '%');
                        }
                    }
                }
            });
        }
    };
    var hideAddCartAlarm = function () {
        $add_cart_alarm.hide();
    };
    var moveCart = function () {
        cart_type = $('input[name=add_cart_type]:checked').val();
        if (cart_type == 'regularly') {
            window.location.href = '/shop_cart?type=regularly';
        } else {
            window.location.href = '/shop_cart';
        }
    };
    var changeInput = function () {
        $(document).on('keypress', 'input._requireInputOption', function (e) {
            if (e.which == 13) {
                e.preventDefault();
                var $next = $('[tabIndex=' + (+this.tabIndex + 1) + ']');
                if ($next.length != 0) {
                    $next.focus().click();
                } else {
                    e.target.blur();
                }
            }
        });
    };
    var changeTab = function (type) {
        $('._detail_detail_wrap').hide();
        $('._detail_review_wrap').hide();
        $('._detail_qna_wrap').hide();
        $('._detail_' + type + '_wrap').show();
    };
    var countryCodeChange = function (country) {
        $.ajax({
            type: 'POST',
            data: { 'country': country },
            url: ('/shop/country_code_change.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg != "SUCCESS") {
                    alert(result.msg);
                }
            }
        });
    };
    var DetailItemMake = function (idx, change_country, deliv_type, deliv_pay_type) {
        var is_design_mode = (location.pathname.indexOf('/admin/design') != -1);
        $deliv_country = change_country;
        $deliv_pay_type = deliv_pay_type;
        $.ajax({
            type: 'GET',
            data: { 'idx': idx, 'change_country': change_country, 'deliv_type': deliv_type, 'deliv_pay_type': deliv_pay_type, '__': MEMBER_HASH },
            url: ('/shop/prod_detail_make.cm'),
            dataType: 'json',
            cache: !is_design_mode,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    $prod_detail.find('._item_detail_wrap').html(result.html);
                    /* 환불 정보 입력 */
                    last_refund_data = result.refund;
                    setDetailReturnHtml();
                    if (typeof naver != typeof void 0 && !!naver.NaverPayButton) {
                        makeNaverPayBtn('naverPayWrap', change_country == 'KR' || change_country == 'none' || change_country == '');
                    }
                    if (typeof kakaoCheckout != 'undefined' && typeof makeTalkPayButton != 'undefined') {
                        makeTalkPayButton('create-kakao-checkout-button', (change_country == 'KR' || change_country == 'none' || change_country == ''));
                    }
                }
            }
        });
    };
    function setDetailReturnHtml() {
        if (!last_refund_data) return;
        if (options.shop_view_tab_display == 'Y') {
            let prod_detail_return_html = null;
            prod_detail_return_html = last_refund_data.use_shop_return ? IMWEB_TEMPLATE.loadSimple("prodReturnPc", last_refund_data) : IMWEB_TEMPLATE.loadSimple("prodReturnDisable", null);
            $prod_detail_return.html(prod_detail_return_html);
            prod_detail_return_html = last_refund_data.use_shop_return ? IMWEB_TEMPLATE.loadSimple("prodReturnMobile", last_refund_data) : IMWEB_TEMPLATE.loadSimple("prodReturnDisable", null);
            $prod_detail_return_mobile.html(prod_detail_return_html);
        } else {
            if (current_content_tab !== SHOP_CONST.TAB_TYPE.RETURN) return;
            SITE_SHOP_DETAIL.changeContentPCTab(SHOP_CONST.TAB_TYPE.RETURN);
            SITE_SHOP_DETAIL.changeContentTab(SHOP_CONST.TAB_TYPE.RETURN);
        }
    }
    /**
     * 모바일 옵션 input클릭시 입력키보드 때문에 css예외처리가 필요하여 클래스 추가.
     */
    var addEventMobileOptionInput = function () {
        $options.find('input.form-control').focus(function () {
            if (!$('body').hasClass('mobile_focus_on')) {
                $('body').addClass('mobile_focus_on');
            }
        });
        $options.find('input').blur(function () {
            if ($('body').hasClass('mobile_focus_on')) {
                $('body').removeClass('mobile_focus_on');
            }
        });
    };
    /**
     * 쇼핑 카테고리 목록에서 상품 상세페이지 레이어팝업 띄우는 함수
	 * @param idx
	 * @param back_url
	 * @param is_prod_detail_page: 상품상세페이지에서 레이어팝업 - 상품 상세 Dialog - 을 띄울 경우 'Y'
	 * @param is_mobile
	 * @param prod_idx_org
     */
    var openProdDetailFromShoppingList = function (idx, back_url, is_prod_detail_page, is_mobile, prod_idx_org) {
        $.ajax({
            type: 'GET',
            data: { 'idx': idx, 'is_prod_detail_page': is_prod_detail_page },
            url: ('/shop/prod_detail_from_shopping_list.cm'),
            dataType: 'html',
            cache: true,
            async: false,
            success: function (result) {
                $.cocoaDialog.open({ type: 'prod_detail_from_shopping_list', custom_popup: result, 'close_block': false });
                const currentUrl = location.href;
                history.replaceState(null, null, currentUrl + '?idx=' + idx);
                $('.modal_prod_detail_from_shopping_list').addClass('custom_tooltip');
                if (is_prod_detail_page == 'Y' && is_mobile) {
                    var $mobile_action_btn_wrap = $('._mobile_action_btn_wrap');
                    $mobile_action_btn_wrap.hide();
                }
				// 모달이 닫힐 때 실행되는 콜백 붙이는 부분
                $('.modal_prod_detail_from_shopping_list').on('hidden.bs.modal', function (e) {
                    $('.modal_prod_detail_from_shopping_list').find('.modal-content').html(''); // close 해도 html 이 남아있어서 스크립트가 재실행이 안 되므로 html 을 삭제시킴
                    $('html').removeClass('mobile-shop-open');
                    history.replaceState(null, null, currentUrl);
                    if (is_prod_detail_page == 'Y') {
                        initDetail({
                            prod_idx: prod_idx_org,
                            prod_price: prod_price_org,
                            require_option_count: require_option_count_org,
							use_image_optimizer_on_product_detail_markup: use_lazy_load_org,
                            shop_use_full_load: use_lazy_load_org,
                            shop_view_tab_display: tab_type_org,
                            is_site_page: is_site_page_org,
                            prod_type: prod_type_org,
                            is_prod_detail_page: false,
                            is_price_view_permission: is_view_price,
                            cm_style: options.cm_style,
                            section_code: section_code
                        });
                        if (is_mobile) $mobile_action_btn_wrap.show();
                    }
                });
                if (checkUseHistory()) { // 뒤로가기 누를 경우 모달만 꺼지고 현재 페이지에 남아있도록
                    history.pushState(null, null, location.href);
                    window.onpopstate = function () {
                        if ($('.modal_prod_detail_from_shopping_list').hasClass('in')) {
                            $.cocoaDialog.close();
                        }
                    };
                }
            }
        });
    };
    var getReviewCountFromShoppingList = function (prod_code_list) {
        $.ajax({
            type: 'POST',
            data: { 'prod_code_list': prod_code_list },
            url: ('/shop/get_review_count_from_shopping_list.cm'),
            dataType: 'json',
            cache: false,
            async: true,
            success: function (res) {
                // $('"#' +  + '"').find("._review_count_text").text(res.review_count);
                // $(prod_code).find("._wish_count_text").text(res.wish_count);
            }
        });
    };
    /**
     * review, qna 권한이 buyer일때 체크 모달
     * @param prod_code
     * @param type
     */
    var openBuyerReview = function (prod_code) {
        $.ajax({
            type: 'POST',
            data: { 'prod_code': prod_code },
            url: ('/shop/open_buyer_review.cm'),
            dataType: 'json',
            cache: false,
            async: false,
            success: function (result) {
                if (result.msg === 'SUCCESS') {
                    $.cocoaDialog.open({
                        type: 'eduModal', custom_popup: result.html, width: 800, hide_event: function () {
                        }
                    });
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var deleteReviewImage = function (obj) {
        var box_obj = obj.parent().parent();
        obj.parent().remove();
        if (box_obj.find('.file-add').length == 0) box_obj.hide();
    };
    /**
     * 상품상세 페이지에 뿌려지는 review, qna 의 카운트 가져오기.
     * @param prod_code
     */
    var getReviewQnaCount = function (prod_code) {
        $.ajax({
            type: 'POST',
            data: { 'prod_code': prod_code },
            url: ('/shop/get_review_qna_count.cm'),
            dataType: 'json',
            cache: false,
            async: true,
            success: function (res) {
                setReviewQnaCountText($("._review_count_text"), res.review_count);
                setReviewQnaCountText($("._qna_count_text"), res.qna_count);
            }
        });
    };
    var setReviewQnaCountText = function ($target, count) {
        $target.text(count);
    };
    var getCurrentProdNo = function () {
        return current_prod_idx;
    };
    var saveSelectedProd = function () {
        if (typeof window.sessionStorage === "undefined") {
            return false;
        }
        // 초기화
        var session_storage_keys = Object.keys(sessionStorage);
        session_storage_keys.forEach(function (_key) {
            if (_key.indexOf('PROD_SELECTED_OPTION_') !== -1) {
                sessionStorage.removeItem(_key);
            }
        });
        // 마지막으로 본 것만 남도록 추가
        sessionStorage.setItem("LAST_SELECTED_PROD", current_prod_idx);
        sessionStorage.setItem(("PROD_SELECTED_OPTION_" + current_prod_idx), JSON.stringify({
            'prodIdx': current_prod_idx,
            'optDataList': selected_options,
            'orderCount': order_count
        }));
    };
    /**
     * 로그인 이전에 선택한 옵션이 세션에 저장되어 있을 경우 로그인 후 해당 옵션을 다시 설정해줌
     * @param is_set
     * @returns {boolean}
     */
    var setSelectedProd = function (is_set) {
        if (typeof window.sessionStorage === "undefined") {
            return false;
        }
        var selected_data = JSON.parse(sessionStorage.getItem("PROD_SELECTED_OPTION_" + current_prod_idx));
        var last_prod_idx = sessionStorage.getItem("LAST_SELECTED_PROD");
        // 초기화
        var session_storage_keys = Object.keys(sessionStorage);
        session_storage_keys.forEach(function (_key) {
            if (_key.indexOf('PROD_SELECTED_OPTION_') !== -1) {
                sessionStorage.removeItem(_key);
            }
        });
        // 마지막으로 본 상품이랑 일치하지 않는경우 리셋하고 끝
        if (last_prod_idx != current_prod_idx) return false;
        if (typeof selected_data == "undefined") return false;
        if (selected_data == null) return false;
        if (Object.keys(selected_data).length <= 0) return false;
        if (!is_set) return false;
        for (var _key in selected_data) {
            switch (_key) {
                case "optDataList":
                    selected_options = selected_data[_key];
                    break;
                case "orderCount":
                    order_count = selected_data[_key];
                    break;
            }
        }
        updateSelectedOptions('prod');
        if (IS_MOBILE) {
            showMobileOptions(options.only_regularly ? 'regularly' : 'buy');
        } else {
            showPCOptions('order');
        }
    };
    var openCouponDownload = function () {
        $.ajax({
            type: 'POST',
            data: {},
            url: ('/shop/open_coupon_download.cm'),
            dataType: 'json',
            cache: false,
            async: false,
            success: function (result) {
                if (result.msg === 'SUCCESS') {
                    $.cocoaDialog.open({ type: 'site_alert', custom_popup: result.html, width: 800 });
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var setReviewCarousel = function () {
        var checkWidth = $(window).width();
        var owl = $('._review_modal_body .owl-carousel');
        if (checkWidth > 768) {
            owl.owlCarousel({
                'loop': owl.children().length > 1,
                'margin': 0,
                'nav': false,
                'items': 1
            });
        }
    };
    var setReviewClass = function (idx) {
        if (idx <= 0) {
            $body.toggleClass('no-images', true);
            $body.find('.modal_prod_detail.review .modal-content').toggleClass('clearfix', true);
        } else {
            $body.toggleClass('no-images', false);
            $body.find('.modal_prod_detail.review .modal-content').toggleClass('clearfix', false);
        }
    };
    var setReviewBtnAnimation = function () {
        var $btn_nav = $body.find('._btn_nav');
        setTimeout(function () {
            $btn_nav.attr('aria-hidden', true);
        }, 3000);
        $body.find('.modal-left').off('touchstart').on('touchstart', function () {
            $btn_nav.attr('aria-hidden', false);
            setTimeout(function () {
                $btn_nav.attr('aria-hidden', true);
            }, 3000);
        });
    };
    var setReviewSwipe = function (prev_idx, next_idx) {
        $body.find('._review_modal_body').swipe({
            swipe: function (event, direction, distance, duration, fingerCount, fingerData) {
                if (direction == 'left') {
                    if (next_idx > 0) {
                        $('body').find('._btn_nav_wrap').remove();
                        changeReviewDetail(next_idx);
                    }
                } else if (direction == 'right') {
                    if (prev_idx > 0) {
                        $('body').find('._btn_nav_wrap').remove();
                        changeReviewDetail(prev_idx);
                    }
                }
            },
            threshold: 0,
            allowPageScroll: 'vertical',
            excludedElements: 'button, a, textarea, input'
        });
    };
    var showSeeMoreButton = function () {
        $prod_detail_content_pc.toggleClass('active', true);
        $prod_detail_content_mobile.toggleClass('active', true);
    };
    var hideSeeMoreButton = function () {
        $prod_detail_content_pc.toggleClass('active', false);
        $prod_detail_content_mobile.toggleClass('active', false);
    };
    var openRequireSelect = function (option_code) {
        var $form_select = $('._form_select_wrap_' + option_code);
        var $goods_wrap = $body.find('#goods_wrap');
        $form_select.addClass('open');
        if ($('body').hasClass('mobile_focus_on')) {
            $('body').removeClass('mobile_focus_on');
        }
        var top = Math.floor($form_select.offset().top); // 셀렉트 박스의 위치
        var scroll_top = Math.floor($goods_wrap.scrollTop()); // 컨테이너의 스크롤 top 위치
        var position_top = $('#option_' + option_code).position().top;
        var height = Math.floor($('.opt-group').height()); // 스크롤 영역의 높이
        var default_value = 180;
        $form_select.parent('._form_parent').nextAll().toggleClass('disabled', true);
        if (top - height >= default_value) {
            $goods_wrap.animate({ scrollTop: position_top - 50 }, 0);
            if (scroll_top >= default_value) {
                $goods_wrap.animate({ scrollTop: position_top + $('.option_box_wrap').outerHeight() }, 0);
            }
        }
    };
    var addRegularlyCart = function () {
        addCart(function () {
            $add_cart_alarm.show();
        });
    };
	var toggleWishButtons = function($wishButtons, wishCount, showWishCount, isActive) {
		const handleRoot = ($root) => {
			if (isActive) {
				$root.addClass('active');
			} else {
				$root.removeClass('active');
			}
		}
		const handleIcon = ($root) => {
			const $icon = $($root).find('._wish_button_icon');
			if (isActive) {
				$icon.removeClass('im-ico-like');
				$root.addClass('active');
				$icon.addClass('im-ico-liked');
			} else {
				$icon.removeClass('im-ico-liked');
				$root.removeClass('active');
				$icon.addClass('im-ico-like');
			}
		}
		const handleText = ($root) => {
			const $label = $($root).find('._wish_button_count_label');
			if (showWishCount) {
				$label.text(wishCount);
			} else {
				$label.text('');
			}
		}
		$wishButtons.each(($idx, root) => {
			const $root = $(root);
			handleRoot($root);
			handleIcon($root);
			handleText($root);
		});
	}
    var moveOrder = function (type, backurl, params)  {
        USE_OMS ? OMS_addOrder(type, backurl, params) : addOrder(type, backurl, params);
    };
    var addAndMoveCart = function () {        
        addCart(function () {
            moveCart();
        });
    };
    var hideConfirmOrderWithCartItems = function () {
        if($confirm_order_with_cart_alarm) $confirm_order_with_cart_alarm.hide();
    }
    /**
     * 장바구니에 상품이 있는지 체크해서 있으면 장바구니 상품 구매유도 알럿을 띄우고 아니면 바로 주문으로 이동하는 메소드입니다.
     */
    var confirmOrderWithCartItems = function (type, backurl, params) {
        if (!options.is_price_view_permission && 
            window.IS_GUEST && 
            cm_data.use_login_popup === 'Y' && 
            options.is_using_nomember_order_login_after
        ) {
            // 구매 권한이 전체가 아닌 상품을 비회원이 구매 하려는 경우 사이트 공통 디자인이 로그인 모달을 사용중이라면 비회원 바로구매 기능이 켜져있는 경우 로그인 모달을 띄워준다.
            // 비회원 바로 구매기능이 켜져있지 않다면, site_ui.cls 의 getAnchor 함수를 통해 로그인이 모달이 필요한 상황에 로그인 모달을 표시할 수 있지만,
            // 비회원 바로 구매기능이 켜져있는 경우에는 로그인 모달을 보여주는 처리를 해주고 있지 않기 때문.
            // site_ui.cls 의 getAnchor 함수에서 해당 로직을 처리하지 않는 이유는 getAnchor 함수는 $params 인자로 받는 도착지 url의 상품 또는 상품 카테고리에 대한 정보를 얻을 수 없기 때문
            window.SITE_MEMBER.openLogin(
                encodeURIComponent(base64Encode(window.location.href)),
                'payment',
                _confirmOrderWithCartItems,
                'N',
                'payment',
            );
        } else {
            _confirmOrderWithCartItems()
        }
        function _confirmOrderWithCartItems () {
            cart_type = $('input[name=add_cart_type]:checked').val() || 'normal';
            params = params || {}; // 기본값 설정
            var isOrderTypeRegularly = cart_type === 'regularly' ;
            // 단일 상품 주문할 경우
            var onMoveOrder = params.onMoveOrder || function () {
                moveOrder(type, backurl, params);
                hideConfirmOrderWithCartItems();
            };
    
            var onMoveCart = params.onMoveCart || function () {
                addAndMoveCart();
                hideConfirmOrderWithCartItems();
            }
    
            // 장바구니가 비어있는지 체크 api 호출
            $.ajax({
                type: 'POST',
                url: '/shop/check_cart_empty.cm',
                dataType: 'json',
                data: {
                    'prodIdx': current_prod_idx,
                    'options': selected_options,
                    'orderCount': order_count,
                    'deliv_type': $deliv_type,
                    'deliv_pay_type': $deliv_pay_type,
                    'cart_type': cart_type
                },
                cache: false,
                success: function (result) {
                    if (result.msg === 'SUCCESS') {
                        // 카트에 상품이 있으며 정기결제 상품이 아닐 경우 장바구니 추가 구매유도 알럿을 띄움
                        if (result.cart_count > 0 && !isOrderTypeRegularly) {
                            if(result.isGuest) return moveOrder(type, backurl, params);
                            // 장바구니 추가 구매유도 다이얼로그 띄우기
                            $confirm_order_with_cart_alarm.show();
                            $confirm_order_with_cart_alarm.off('click').click(function (e) {
                                // 백그라운드 클릭시 다이얼로그 종료 dom에 직접 걸기에는 스타일링을 수정해야 해서 별도로 이벤트 걸어줌
                                if(this === e.target) hideConfirmOrderWithCartItems();
                            })
    
                            $confirm_order_with_cart_alarm.find('#move_to_cart').off('click').click(function () {
                                onMoveCart();
                            });
                            $confirm_order_with_cart_alarm.find('#buy_now').off('click').click(function () {
                                onMoveOrder();
                            });
                        }  else {
                            if(params.onMoveOrder) onMoveOrder(type, backurl, params);
                            else moveOrder(type, backurl, params);
    
                        }
                    } else {
                        if(params.onMoveOrder) onMoveOrder(type, backurl, params);
                        else moveOrder(type, backurl, params);
                    }
                },
                error: function () {
                    moveOrder(type, backurl, params);
                }
            });
        }
    }
    return {
        addProdWish: function (prod_code, back_url) {
            addProdWish(prod_code, back_url);
        },
        /** type (prod/cart) */
        increaseOptionCount: function (optNo, type) {
            increaseOptionCount(optNo, function () {
                updateSelectedOptions(type);
            });
        },
        /** type (prod/cart) */
        decreaseOptionCount: function (optNo, type) {
            decreaseOptionCount(optNo, function () {
                updateSelectedOptions(type);
            });
        },
	      /** type (prod/cart) */
        increaseProdAdditionalOptionCount: function (optNo) {
            increaseProdAdditionalOptionCount(optNo, function () {
                updateSelectedOptions('prod');
            });
        },
        /** type (prod/cart) */
        decreaseProdAdditionalOptionCount: function (optNo) {
            decreaseProdAdditionalOptionCount(optNo, function () {
                updateSelectedOptions('prod');
            });
        },
        // initDetail : function(prodIdx, price, requireOptionCnt, use_np_mobile, use_lazyload, tab_type,is_site_page, prod_type, is_prod_detail_page, view_price, cm_data, section_code){
        // 	initDetail(prodIdx, price, requireOptionCnt, use_np_mobile, use_lazyload, tab_type,is_site_page, prod_type, is_prod_detail_page, view_price, cm_data, section_code);
        // },
        initDetail: function (option) {
            initDetail(option);
        },
        initProdStock: function (stock_use, stock, stock_un_limit) {
            initProdStock(stock_use, stock, stock_un_limit);
        },
        initLocalize: function (code) {
            initLocalize(code);
        },
        selectOption: function (prod_idx, optList, require, count, success, failed) {
            selectOption(prod_idx, optList, require, count, function () {
                success();
            }, function (msg) {
                failed(msg);
            });
        },
        removeSelectedOption: function (optNo, type) {
            removeSelectedOption(optNo, function () {
                selected_require_options = [];		// 선택된 필수 옵션 초기화
                loadOption(type, current_prod_idx);		// 옵션을 다시 로드함
                updateSelectedOptions(type);
            });
        },
	      removeSelectedProdAdditional: function (prodIdx, type) {
		      removeSelectedProdAdditional(prodIdx, function () {
                loadProdAdditional(current_prod_idx);		// 옵션을 다시 로드함
	              updateSelectedOptions(type);
            });
        },
	      removeSelectedProdAdditionalOption: function (optNo, type) {
		      removeSelectedProdAdditionalOption(optNo, function () {
                loadProdAdditional(current_prod_idx);		// 옵션을 다시 로드함
	              updateSelectedOptions(type);
            });
        },
        selectRequireOption: function (type, prod_idx, option_code, value_code, value_name, success) {
            selectRequireOption(type, prod_idx, option_code, value_code, value_name, function () {
                success();
            });
        },
	      selectProdAdditionalRequireOption: (prod_idx, option_code, value_code, value_name, success) => {
			      var data = { 'value_type': 'SELECT', 'option_code': option_code, 'value_code': value_code, 'value_name': value_name };
			      var no = findSelectedProdAdditionalRequireOption(option_code);
						/* @TODO selected_require_options 세분화해야 함(아니면 option_code만으로 구분 가능하게 처리하거나 -> length 비교하므로 분리되어야 하는 게 맞음 */
			      if (no == -1) {
				      if (value_code == '') return;
				      /** 처음 선택된 옵션인 경우 새로 추가*/
				      selected_prod_additional_require_options.push(data);
			      } else {
				      if (value_code == '') {
					      /** 옵션 삭제 */
					      selected_prod_additional_require_options.splice(no, (selected_prod_additional_require_options.length - no));
				      } else {
					      selected_prod_additional_require_options[no] = data;
					      /** 이미 선택된 옵션인 경우 기존 값 교체 */
					      if (no < selected_prod_additional_require_options.length - 1) {
						      selected_prod_additional_require_options.splice(no + 1, (selected_prod_additional_require_options.length - (no + 1)));
					      }
				      }
			      }
			      if (selected_prod_additional_require_options.length == prod_additional_require_option_count[prod_idx]) {
				      /** 필수 옵션이 모두 선택되었을 경우*/
				      selectProdAdditionalOption(prod_idx, selected_prod_additional_require_options, true, 1, function () {
								if(is_mobile_width){
									imSheet.close('prod_additional_sheet');
								}
					      current_select_additional_prod_idx = 0;
					      selected_prod_additional_require_options = [];
					      $prod_additional_options.html('');
					      $('#prod_additional_drop_menu_content').text(getLocalizeString('타이틀_추가상품', '', '추가 상품'));  // PC
					      $('#btnProdAdditionalSelect').text(getLocalizeString('타이틀_추가상품', '', '추가 상품'));  // 모바일
					      success();
				      }, function (msg) {
					      alert(msg);
				      });
			      } else {
				      /** 필수옵션 선택이 아직 끝나지 않았을 경우 옵션 재로드 */
				      loadProdAdditionalOptions(prod_idx);
			      }
	      },
		    selectAdditionalProduct: (product_idx, price, name, maximum_purchase_quantity, member_maximum_purchase_quantity, maximum_purchase_quantity_type, optional_limit, optional_limit_type, stock_use, stock, stock_unlimit, option_mix_type, prod_type, period_discount_flag, period_discount_data, period_discout_group_list, membership_discount) => {
					// 수량을 조절할 수 없는 상품(디지털/이용권 상품인데 옵션이 없는 경우)이 이미 추가된 상태에서 다시 선택할 시 얼럿 노출
			    const prod_additional_found = selected_prod_additionals.find(v=>v.idx===product_idx);
			    if(prod_type !== SHOP_CONST.PROD_TYPE.NORMAL && prod_additional_found){
						if(selected_prod_additional_options.filter((option) => option.prod_idx == product_idx).length === 0){
							// 옵션이 있다면 기존에 추가 시에 옵션도 함께 등록되게 됨
							alert(getLocalizeString("설명_이미선택된상품입니다", "", "이미 선택된 상품입니다."));
							return false;
						}
			    }
                let unselected = [];
                Object.keys(prod_additional_require_option_count).map((key) => {
                        if (prod_additional_require_option_count[key] > 0) {
                            if(selected_prod_additional_options.filter((option) => option.prod_idx == key)[0]?.options?.length < prod_additional_require_option_count[key]){
                                unselected.push(key);
                            }
                        }
                    }
                );
                if(unselected.length > 0){
                    Object.keys(unselected).map((key) => {
                        if (prod_additional_require_option_count[key] > 0) {
                            selected_prod_additionals = selected_prod_additionals.filter((prod_additional) => prod_additional.idx != key);
                            selected_prod_additional_options = selected_prod_additional_options.filter((option) => option.prod_idx != key);
                            delete prod_additional_require_option_count[key];
                        }
                    });
                }
					// @TODO 기존 추가 상품 옵션 초기화, 추가 상품 완료가 안되었다면 selected_prod_additionals에서도 빠져야 함
			    selected_prod_additional_require_options = [];
			    if(prod_additional_found) {
				    prod_additional_found.count++;
			    }else{
				    selected_prod_additionals.push({idx: product_idx, price, name, maximum_purchase_quantity, member_maximum_purchase_quantity, maximum_purchase_quantity_type, optional_limit, optional_limit_type, stock_use, stock, stock_unlimit, option_mix_type, prod_type, membership_discount, count: 1});
						setProdAdditionalPeriodDiscountData(product_idx, period_discount_flag, period_discount_data, period_discout_group_list);
			    }
			    current_select_additional_prod_idx = product_idx;
			    if(is_mobile_width){
						// 상품을 선택했을 때 1depth에는 옵션 목록을 띄우고 2depth에는 다음 옵션 시트를 띄움
						// @TODO 1depth 모든 옵션 추가(선택 옵션 포함) > 열리지는 않게 처리하면 될 듯
				    loadOption('prod', current_prod_idx);		// 옵션을 다시 로드함
				    loadProdAdditionalOptions(product_idx);
			    }else{
				    loadOption('prod', current_prod_idx);		// 옵션을 다시 로드함
				    loadProdAdditionalOptions(product_idx);
			    }
		    },
        selectOptionalOption: function (prod_idx, option_code, value_code, value_name, success) {
            selectOption(prod_idx, [{
                'value_type': 'SELECT',
                'option_code': option_code,
                'value_code': value_code,
                'value_name': value_name
            }], false, 1, function () {
                success();
            }, function (msg) {
                alert(msg);
            });
        },
	      selectProdAdditionalOptionalOption: function (prod_idx, option_code, value_code, value_name, success) {
            selectProdAdditionalOption(prod_idx, [{
                'value_type': 'SELECT',
                'option_code': option_code,
                'value_code': value_code,
                'value_name': value_name
            }], false, 1, function () {
                success();
		            if(is_mobile_width){
			            imSheet.close('prod_additional_sheet');
		            }
            }, function (msg) {
                alert(msg);
            });
        },
        /** type (prod/cart) */
        changeOptionCount: function (optNo, optCount, type) {
            changeOptionCount(optNo, optCount, function () {
                updateSelectedOptions(type);
            });
        },
        "getCurrentProdNo": function () {
            return getCurrentProdNo();
        },
        "saveSelectedProd": function () {
            saveSelectedProd();
        },
        "setSelectedProd": function (is_set) {
            setSelectedProd(is_set);
        },
        addOrder: function (type, backurl, params) {
            addOrder(type, backurl, params);
        },
        addGiftOrder: function (type, backurl, params) {
            // 선물하기 구매 플래그 활성화
            is_gift_buy = true;
            this.addOrder(type, backurl, params);
            // 선물하기 구매 플래그 비활성화
            is_gift_buy = false;
        },
        addCart: function () {
            addCart(function () {
                $add_cart_alarm.show();
            });
        },
        addAndMoveCart: function ()  {
            addAndMoveCart();
        },
        "digitalFileDownload": function (order_no) {
            digitalFileDownload(order_no);
        },
        updateSelectedOptions: function (type) {
            updateSelectedOptions(type);
        },
        checkOptionLength: function (target, limit) {
            checkOptionLength(target, limit);
        },
        getSelectedOption: function () {
            return selected_options;
        },
        changeOrderCount: function (type, count, success, is_alert) {
            return changeOrderCount(type, count, success, is_alert);
        },
		    changeProdAdditionalOrderCount: function (no, type, count, success, is_alert) {
			    return changeProdAdditionalOrderCount(no, type, count, success, is_alert);
		    },
        selectCartType: function (type) {
            return selectCartType(type);
        },
        checkProdStock: function (cnt) {
            return checkProdStock(cnt);
        },
        increaseOrderCount: function (type, success) {
            return increaseOrderCount(type, success);
        },
        decreaseOrderCount: function (type, success) {
            return decreaseOrderCount(type, success);
        },
		    increaseProdAdditionalOrderCount: function (no, type, success) {
			    return increaseProdAdditionalOrderCount(no, type, success);
		    },
		    decreaseProdAdditionalOrderCount: function (no, type, success) {
			    return decreaseProdAdditionalOrderCount(no, type, success);
		    },
        showMobileOptions: function (type) {
            return showMobileOptions(type);
        },
        changeValueChecked: function (type) {
            return changeValueChecked(type);
        },
        showMobileFirstSelect: function () {
            return showMobileFirstSelect();
        },
        hideMobileOptions: function () {
            return hideMobileOptions();
        },
        showPCOptions: function (type, backurl) {
            return showPCOptions(type, backurl, false);
        },
        hidePCOptions: function () {
            return hidePCOptions();
        },
        socialBtnResize: function () {
            return socialBtnResize();
        },
		externalwidgetWrapResize : function(target, pc_position, mo_position) {
			return externalwidgetWrapResize(target, pc_position, mo_position);
		},
        changeContentTab: function (type, r_p, q_p, paging_on, only_photo, rating = 0) {
            return changeContentTab(type, r_p, q_p, paging_on, only_photo, rating);
        },
        deleteReviewInTabDisplay: function (prod_code, only_photo) {
            deleteReviewInTabDisplay(prod_code, only_photo);
        },
        changeContentPCTab: function (type, r_p, q_p, paging_on, only_photo,  rating = 0 , shop_view_body_width) {
            return changeContentPCTab(type, r_p, q_p, paging_on, only_photo, rating, shop_view_body_width);
        },
        removeReviewHash: function () {
            return removeReviewHash();
        },
        removeQnawHash: function () {
            return removeQnawHash();
        },
        getOnlyPhotoReview: function (only_photo_switch, is_mobile, is_one_page, rating) {
            return getOnlyPhotoReview(only_photo_switch, is_mobile, is_one_page, rating);
        },
        getStarRatingReview: function (only_photo_switch, is_mobile, is_one_page, rating) {
            return getStarRatingReview(only_photo_switch, is_mobile, is_one_page, rating);
        },
        getFirstPhotoReview: function (page) {
            return getFirstPhotoReview(page);
        },
        viewPhotoReviewMore: function (is_mobile, is_one_page) {
            return viewPhotoReviewMore(is_mobile, is_one_page);
        },
        getReviewSummary: function (target) {
            return getReviewSummary(target);
        },
        changeReviewDetail: function (idx) {
            return changeReviewDetail(idx);
        },
        viewReviewDetail: function (idx, r_p, only_photo, is_hash) {
            return viewReviewDetail(idx, r_p, only_photo, is_hash);
        },
        "setMembershipSaleData": function (data, is_main_product_membership_discount) {
            setMembershipSaleData(data, is_main_product_membership_discount);
        },
        "setPeriodDiscountData": function (flag, $data2, group_list) {
            setPeriodDiscountData(flag, $data2, group_list);
        },
		    "setProdAdditionalPeriodDiscountData": function (no, flag, $data2, group_list) {
			    setProdAdditionalPeriodDiscountData(no, flag, $data2, group_list);
		    },
        viewQnaDetail: function (idx, q_p, is_hash) {
            return viewQnaDetail(idx, q_p, is_hash);
        },
        changeProdImageRolling: function (no) {
            return changeProdImageRolling(no);
        },
        startProdImageRolling: function (autoWidth) {
            return startProdImageRolling(autoWidth);
        },
        setOrderCount: function (count) {
            order_count = count;
        },
        getOrderCount: function () {
            return order_count;
        },
        addNPayWish: function () {
            return addNPayWish();
        },
        hideAddCartAlarm: function () {
            hideAddCartAlarm();
        },
        moveCart: function () {
            moveCart();
        },
        loadProductDetail: function (prod_idx) {
            loadProductDetail(prod_idx);
        },
        loadBookingDetail: function (idx, day) {
            loadBookingDetail(idx, day);
        },
        loadOption: function (type, prod_idx) {
            return loadOption(type, prod_idx);
        },
        loadDelivSetting: function (prod_idx, change_country, deliv_type, deliv_pay_type) {
            return loadDelivSetting(prod_idx, change_country, deliv_type, deliv_pay_type);
        },
        changeRequireInputOption: function (type, prod_idx, option_code, msg, success) {
            changeRequireInputOption(type, prod_idx, option_code, msg, function () {
                success();
            });
        },
	      changeProdAdditionalRequireInputOption: function (type, prod_idx, option_code, msg, success) {
		        changeProdAdditionalRequireInputOption(type, prod_idx, option_code, msg, function () {
                success();
            });
        },
        changeInput: function () {
            changeInput();
        },
        changeTab: function (type) {
            changeTab(type);
        },
        countryCodeChange: function (country) {
            countryCodeChange(country);
        },
        DetailItemMake: function (idx, change_country, deliv_type, deliv_pay_type) {
            return DetailItemMake(idx, change_country, deliv_type, deliv_pay_type);
        },
        addDelivType: function (type) {
	        $deliv_type = type;
        },
        addDelivPayType: function (type) {
            $deliv_pay_type = type;
        },
        visitFormMake: function () {
            $deliv_visit_wrap.show();
        },
        openProdDetailFromShoppingList: function (idx, back_url, is_prod_detail_page, is_mobile, prod_idx_org) {
            return openProdDetailFromShoppingList(idx, back_url, is_prod_detail_page, is_mobile, prod_idx_org);
        },
        'getReviewQnaCount': function (prod_code) {
            return getReviewQnaCount(prod_code);
        },
        'setReviewQnaCountText': function ($target, count) {
            return setReviewQnaCountText($target, count);
        },
        getReviewCountFromShoppingList: function (prod_code_list) {
            return getReviewCountFromShoppingList(prod_code_list);
        },
        openBuyerReview: function (prod_code) {
            return openBuyerReview(prod_code);
        },
        deleteReviewImage: function (obj) {
            return deleteReviewImage(obj);
        },
        openCouponDownload: function () {
            return openCouponDownload();
        },
        setReviewCarousel: function () {
            return setReviewCarousel();
        },
        setReviewClass: function (idx) {
            return setReviewClass(idx);
        },
        setReviewBtnAnimation: function () {
            return setReviewBtnAnimation();
        },
        setReviewSwipe: function (prev_idx, next_idx) {
            return setReviewSwipe(prev_idx, next_idx);
        },
        showSeeMoreButton: function () {
            return showSeeMoreButton();
        },
        hideSeeMoreButton: function () {
            return hideSeeMoreButton();
        },
        openRequireSelect: function (option_code) {
            return openRequireSelect(option_code);
        },
        addRegularlyCart: function () {
            return addRegularlyCart();
        },
	    toggleWishButtons: function($wishButtons, wishCount, isActive) {
			return toggleWishButtons($wishButtons, wishCount, isActive);
	    },
        // C3 메서드 추가
		OMS_addOrder : function(type, backurl, params){
			OMS_addOrder(type, backurl, params);
		},
		OMS_showPCOptions : function(type, backurl){
			return showPCOptions(type, backurl, true);
		},
        OMS_addGiftOrder: function (type, backurl, params) {
            // 선물하기 구매 플래그 활성화
            is_gift_buy = true;
            this.OMS_addOrder(type, backurl, params);
            // 선물하기 구매 플래그 비활성화
            is_gift_buy = false;
        },
        confirmOrderWithCartItems: function (type, backurl, params) {
            confirmOrderWithCartItems(type, backurl, params);
        },
        moveOrder: function () {
            moveOrder();
        },
        hideConfirmOrderWithCartItems: function () {
            hideConfirmOrderWithCartItems();
        }
    };
}();
var SITE_SHOP_CART = function () {
    var selectedCartItem = [];
    var $cartItemCheckboxList;
    var $cartAllCheckBox;
    var $shop_cart_list;
    var $shop_cart_wish_list;
    var $shop_cart_wish_list_empty;
    var $changeCartItemLayer;
    var $total_price;
    var $cart_list_wrap;
    var $global_select;
    var $cart_result_container;
    var is_cart_changed = false;
    var currentCartCode = '';
    var current_backurl = '';
    var currentChangeCartItemCode = '';
		var $deliv_country = '';
    var add_order_progress_check = false;
    var cart_type = '';
    var initCart = function (cart_code, backurl, is_regularly, is_c3 = false){
        currentCartCode = cart_code;
        current_backurl = backurl;
        $shop_cart_list = $('#shop_cart_list');
        $changeCartItemLayer = $('#shop_cart_change_layer');
        $shop_cart_wish_list = $('#shop_cart_wish_list');
        $shop_cart_wish_list_empty = $('#shop_cart_wish_list_empty');
        $cart_list_wrap = $shop_cart_list.find('._cart_list_wrap');
        $global_select = $shop_cart_list.find('._global_select');
        var cart_type = SHOP_CONST.CART_TYPE_NORMAL;
        if (is_regularly == 'Y') cart_type = SHOP_CONST.CART_TYPE_REGULARLY;
        cartListMake(backurl, cart_type, is_c3);
    };
    /**
     * 선택한 항목의 가격 계산
     */
    var getSelectedPrice = function (is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'item_list': selectedCartItem, 'is_regularly': is_regularly },
            url: ('/shop/get_cart_price.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    setCartPriceHtml(res['price_data']);
                } else {
                    if (res.res_code != 1) {
                        alert(res.msg);
                    }
                    is_cart_changed = false;
                }
            }
        });
    };
    var setCartPriceHtml = function (data) {
        $total_price = $cart_list_wrap.find('._cart_main_total_price');
        $cart_result_container = $cart_list_wrap.find('._cart_result_container');
        var $mobile_cart_result_container = $cart_list_wrap.find('._shop_table').find('._cart_result_container');
        var $pc_cart_result_container = $cart_list_wrap.find('._cart_result_table').find('._cart_result_container');
        $cart_list_wrap.find('._cart_count').text(data['count']);
        $cart_result_container.find('._cart_price').html(data['price']);
        $cart_result_container.find('._cart_deliv_price').html(data['deliv_price']);
        $cart_result_container.find('._cart_membership_discount').html(data['sale_price']);
        $cart_result_container.find('._cart_add_point').html(data['add_point']);
        $cart_list_wrap.find('._cart_membership_field').toggle(data['membership_price_exist']);
        $cart_list_wrap.find('._cart_period_field').toggle(data['period_price_exist']);
        $cart_list_wrap.find('._cart_deliv_price_field').toggle(data['count'] !== data['no_deliv_count']);
        $cart_list_wrap.find('._cart_period_discount').html(data['period_price']);
        if (data['membership_price_exist'] === false && data['period_price_exist'] === false && (data['count'] === data['no_deliv_count'])) {
            $cart_list_wrap.find('.im-ico-equals-plain').hide();
            $pc_cart_result_container.find('._cart_price_field').hide();
        } else {
            if (data['only_deliv_price_after']) {
                $cart_list_wrap.find('._cart_deliv_price_field').show();
                $cart_list_wrap.find('.im-ico-equals-plain').show();
                $pc_cart_result_container.find('._cart_price_field').show();
                $mobile_cart_result_container.find('._plus_deliv_price').hide();
            } else {
                $cart_list_wrap.find('.im-ico-equals-plain').show();
                $pc_cart_result_container.find('._cart_price_field').show();
            }
        }
        $total_price.html(data['total_price']);
        $cart_list_wrap.find('._cart_result_table').show();
    };
    /**
     * 상품 위시리스트 추가 처리
     * @param cart_item_list
     */
    var addProdWish = function (cart_item_list, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'type': 'add', 'cart_item_list': cart_item_list, 'is_regularly': is_regularly },
            url: ('/shop/add_prod_wish_cart.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    for (var i = 0; i < cart_item_list.length; i++) {
                        if (typeof FB_PIXEL != 'undefined') FB_PIXEL.AddToWishlist();
                        $shop_cart_list.find("._wish_status_" + cart_item_list[i]).addClass('check');
                    }
                    loadProdWishList();
                } else
                    alert(res.msg);
            }
        });
    };
    /**
     * 위시리스트 가져오기
     * @param prod_code
     */
    var loadProdWishList = function () {
        $.ajax({
            type: 'POST',
            data: { 'type': 'cart' },
            url: ('/shop/get_prod_wish_list.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    if (res.count > 0) {
                        $shop_cart_wish_list_empty.hide();
                        $shop_cart_wish_list.show().html(res.html);
                        setTimesale();
                    } else {
                        $shop_cart_wish_list_empty.show();
                        $shop_cart_wish_list.hide();
                    }
		                // 크리마 리뷰 사용 중일 시 위젯 호출
		                if(document.querySelector(".crema-product-reviews")){
			                if(typeof crema !== 'undefined'){
				                crema.run();
			                }
		                }
                } else
                    alert(res.msg);
            }
        });
    };
    /**
     * 위시리스트 제거
     * @param cart_item_list
     */
    var deleteProdWish = function (cart_item_list, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'type': 'delete', 'cart_item_list': cart_item_list, 'is_regularly': is_regularly },
            url: ('/shop/add_prod_wish_cart.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    for (var i = 0; i < cart_item_list.length; i++) {
                        $shop_cart_list.find("._wish_status_" + cart_item_list[i]).removeClass('check');
                    }
                    loadProdWishList();
                } else
                    alert(res.msg);
            }
        });
    };
    /**
     * 위시리스트 제거 (상품코드사용
     * @param prod_code
     */
    var deleteProdWishByProdCode = function (prod_code) {
        $.ajax({
            type: 'POST',
            data: { 'type': 'delete_prodcode', 'prod_code': prod_code },
            url: ('/shop/add_prod_wish_cart.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    if ($('#wish-item-' + prod_code).length > 0) {
                        $('#wish-item-' + prod_code).remove();
                    } else {
                        window.location.reload();
                    }
                } else
                    alert(res.msg);
            }
        });
    };
    /**
     * 특정 카트 아이템 삭제
     */
    var removeCartItem = function (item_codeList, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'item_codeList': item_codeList, 'is_regularly': is_regularly },
            url: ('/shop/remove_cart_item.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (typeof AW_DEL != 'undefined') {
                        for (var i = 0; i < item_codeList.length; i++) {
                            var itme_info = result.delete_cart_info[item_codeList[i]];
                            AW_DEL(itme_info['prod_no'], itme_info['count']);
                        }
                    }
                    if (typeof AM_DEL != 'undefined') {
                        for (var i = 0; i < item_codeList.length; i++) {
                            var itme_info = result.delete_cart_info[item_codeList[i]];
                            AM_DEL(itme_info['prod_no'], itme_info['count']);
                        }
                    }
                    if (typeof CHANNEL_PLUGIN != "undefined") CHANNEL_PLUGIN.updateChannelProfileAttr('cart');
                    if (is_regularly == 'Y') window.location.href = "/shop_cart?type=regularly";
                    else window.location.href = "/shop_cart";
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    /**
     *  품절된 상품만 삭제
     * @param item_codeList
     * @param is_regularly
     */
    var removeSelectedCartSoldOutItem = function (item_codeList, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'item_codeList': item_codeList, 'is_regularly': is_regularly },
            url: ('/shop/remove_cart_soldout_item.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (typeof AW_DEL != 'undefined') {
                        for (var i = 0; i < item_codeList.length; i++) {
                            var item_info = result.delete_cart_info[item_codeList[i]];
                            if (typeof item_info != 'undefined') AW_DEL(item_info['prod_no'], item_info['count']);
                        }
                    }
                    if (typeof AM_DEL != 'undefined') {
                        for (var i = 0; i < item_codeList.length; i++) {
                            var item_info = result.delete_cart_info[item_codeList[i]];
                            if (typeof item_info != 'undefined') AM_DEL(item_info['prod_no'], item_info['count']);
                        }
                    }
                    if (typeof CHANNEL_PLUGIN != "undefined") CHANNEL_PLUGIN.updateChannelProfileAttr('cart');
                    if (is_regularly == 'Y') window.location.href = "/shop_cart?type=regularly";
                    else window.location.href = "/shop_cart";
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    /**
     * 특정 카트 아이템 삭제
     */
    var removeCartItemOption = function (item_code, optionNo, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'item_code': item_code, 'optionNo': optionNo, 'is_regularly': is_regularly },
            url: ('/shop/remove_cart_item_option.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    window.location.reload();
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    /**
     * 체크박스 전체 선택 제어
     * @param bool b
     */
    var toggleAllCheckCartItem = function (b, is_regularly) {
        $cart_list_wrap.find('._cartItemCheckbox').each(function () {
            $(this).prop('checked', (b === true));
        });
        CartItemChanged(is_regularly);
    };
    /**
     * 체크박스 선택 제어
     */
    var toggleCheckCartItem = function (is_regularly) {
        var $cartItemCheckbox = $cart_list_wrap.find('._cartItemCheckbox');
        var $cartItemCheckboxSeleted = $cart_list_wrap.find('._cartItemCheckbox:checked');
        $cart_list_wrap.find('._all_check').prop('checked', ($cartItemCheckbox.length == $cartItemCheckboxSeleted.length));
        CartItemChanged(is_regularly);
    };
    /**
     * 체크박스 변경시 재계산
     */
    var CartItemChanged = function (is_regularly) {
        // 초기화
        selectedCartItem = [];
        $cart_list_wrap.find('._cartItemCheckbox:checked').each(function () {
            selectedCartItem.push($(this).val());
        });
        getSelectedPrice(is_regularly);
    };
    /**
     * 전체 선택인지 아닌지 체크
     */
    var toggleAllSelectCk = function () {
        var $cartItemSelectCount = 0;
        $cartItemCheckboxList = $shop_cart_list.find("input._cartItemCheckbox");
        $cartAllCheckBox = $shop_cart_list.find("input._all_check");
        $cartItemCheckboxList.each(function () {
            if ($(this).is(":checked") === true) {
                $cartItemSelectCount++;
            }
        });
        if ($cartItemCheckboxList.length == $cartItemSelectCount) {
            $cartAllCheckBox.prop('checked', true);
        } else {
            $cartAllCheckBox.prop('checked', false);
        }
    };
    /**
     * 카트 전체 주문하기, C3 분기 추가
     * @param direct true/false (선택유무와 상관없이 바로 주문)
     */
    var addOrderWithCart = function (type, item_code, backurl, direct, is_oms, params){
        if (is_cart_changed) return false;
        if (add_order_progress_check) return false;
        if (currentCartCode == '') {
            alert(LOCALIZE.설명_장바구니가비어있습니다());
            return false;
        }
        //type 이 guest_login 으로 넘어오는경우 비회원주문+로그인페이지로이동후주문 방식임 type 을 normal 로처리해야 다른 로직에 영향이 없어 이렇게 처리함
        var is_guest_login = false;
        if (type == 'guest_login') {
            is_guest_login = true;
            type = 'normal';
        }
        var item_code_list = [];
        if (item_code == '')
            item_code_list = selectedCartItem;
        else
            item_code_list = [item_code];
        if (item_code_list.length <= 0) {
            alert(LOCALIZE.설명_주문하실상품을선택해주세요());
            return false;
        }
        add_order_progress_check = true;
        var _data = {
            'type': type,
            'cart_code': currentCartCode,
            'item_code_list': item_code_list,
            'backurl': backurl,
            'direct': (direct ? 'Y' : 'N')
        };
		if(is_oms){
			if (localStorage.getItem("selectedDeliveryCountry") === "undefined") {
				localStorage.removeItem("selectedDeliveryCountry");
			}
			if (typeof $deliv_country !== 'undefined') {
				localStorage.setItem("selectedDeliveryCountry", $deliv_country);
			}
			_data.infoUrl = location.origin;
		}
        _data.ace_pid = window._AcePID || window._AceMID;
				const [orderBtn, orderRegularlyBtn] = [$('._btn_order'), $('._btn_order_regularly')];
				const [orderBtnText, orderRegularlyBtnText] = [orderBtn.first().text(), orderRegularlyBtn.first().text()];
				const setSpinner = function ($buttons) {
					const spinner = '
';
					if (Array.isArray($buttons)) {
						for (const $button of $buttons) {
							if ($button.length > 0) {
								$button.html(spinner);
							}
						}
					} else {
						if ($buttons.length > 0) {
							$buttons.html(spinner);
						}
					}
				}
				const unsetSpinner = function ($btn, text) {
					if ($btn.length > 0) {
						$btn.text(text);
					}
				}
        $.ajax({
            type: 'POST',
            data: _data,
            url: is_oms ? '/shop/oms/OMS_add_order_cart.cm' : "/shop/add_order_cart.cm",
            dataType: 'json',
            cache: false,
						beforeSend: function () {
							// 간편결제 버튼은 PG사 정책 우려로 인해 스피너 적용하지 않음
							if (type === 'npay' || type === 'talkpay') {
								return;
							}
							// 주문하기, 정기구독 버튼에 로딩 스피너 추가
							setSpinner([orderBtn, orderRegularlyBtn]);
						},
						error: function () {
							// 주문하기 버튼에 로딩 스피너 제거
							unsetSpinner(orderBtn, orderBtnText);
							// 정기구독 버튼에 로딩 스피너 제거
							unsetSpinner(orderRegularlyBtn, orderRegularlyBtnText);
						},
            success: function (result) {
                if (result.msg == 'SUCCESS') {
										// 페이지가 이동하는 동작의 시각적 연결성을 위해 성공 시에는 스피너를 초기화 하지 않는다.
                    switch (type) {
                        case 'npay':
                            if (result.npay_url == '') {
                                if (result.errmsg) {
                                    alert(escape_javascript(result.errmsg));
                                } else {
                                    alert(LOCALIZE.설명_네이버페이상품구매실패(escape_javascript(result.errmsg)));
                                }
                            } else {
                                if (!!result.shopping_additional_price_msg) {
                                    alert(result.shopping_additional_price_msg);
                                }
                                if (result.advanced_kakao_trace_data != null) {
                                    $('body').append(result.advanced_kakao_trace_data);
                                }
                                if (result.auth_type == 2) {
                                    // 성인 인증이 필요할 경우
                                    window.location.href = '/?mode=adult_auth_npay&data=' + result.data;
                                } else {
                                    // 성인 인증이 필요하지 않는 경우
                                    // 네이버 페이 구매시 전환추적 추가
                                    var npay_order_info = result['npay_order_info'];
                                    if (typeof FB_PIXEL != 'undefined') {
                                        FB_PIXEL.InitiateCheckout(result.ic_event_id, result.total_price, result.currency, result.fb_external_id);
                                        if (result.fb_npay_switch === 'Y') FB_PIXEL.addNpayOrder(npay_order_info);
                                    }
                                    if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.AddOrder();
                                    if (result.google_analytics_type == 'G' && result.is_ga_api_secret === false) {
                                        if (typeof GOOGLE_ANAUYTICS != 'undefined') GOOGLE_ANAUYTICS.addNpayOrder(npay_order_info);
                                    }
                                    if (typeof GOOGLE_ADWORDS_TRACE != 'undefined' && result.google_ads_include_npay === 'Y') GOOGLE_ADWORDS_TRACE.addNpayOrder(npay_order_info);
                                    if (typeof CRITEO != 'undefined') CRITEO.npayTrackTransaction(npay_order_info);
	                                if (typeof NP_NDA != 'undefined') NP_NDA.BeginCheckout(result.prod_code_list);
                                    window.location.href = result.npay_url;
                                }
                            }
                            break;
                        case 'talkpay':
                            switch (params.type) {
                                case 'onOrder':
                                    if (result.msg == 'SUCCESS') {
                                        if (result.order_sheet_id) {
                                            params.onSuccess(result.order_sheet_id);
                                        } else {
                                            params.onFailure({ message: result.msg });
                                        }
                                    } else {
                                        params.onFailure({ message: result.msg });
                                    }
                                    break;
                                case 'onPayOrder':
                                    if (result.msg == 'SUCCESS') {
                                        if (typeof FB_PIXEL != 'undefined') FB_PIXEL.InitiateCheckout(result.ic_event_id, result.total_price, result.currency, result.fb_external_id);
                                        if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.AddOrder();
	                                    if (typeof NP_NDA != 'undefined') NP_NDA.BeginCheckout(result.prod_code_list);
	                                    var shop_payment_url = "/shop_payment/?order_code=" + encodeURIComponent(result.order_code) + '&order_no=' + encodeURIComponent(result.order_no);
	                                    if ( result.kakaopay_only === 'Y' ) {
		                                    shop_payment_url += "&kakaopay_only=Y";
	                                    }
	                                    window.location.href = shop_payment_url;
                                    }
                                    break;
                            };
                            add_order_progress_check = false;
                            break;
                        default:
                            if (typeof FB_PIXEL != 'undefined') FB_PIXEL.InitiateCheckout(result.ic_event_id, result.total_price, result.currency, result.fb_external_id);
                            if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.AddOrder();
	                        if (typeof NP_NDA != 'undefined') NP_NDA.BeginCheckout(result.prod_code_list);
                            if (is_guest_login) {	//비회원주문시 로그인 페이지로 이동처리
                                window.location.href = '/login?shopping_order_code=' + result.order_code + '&back_url=' + encodeURIComponent(result.back_url_base64);
                            } else {	//일반주문인경우 결제화면으로 이동
								if (is_oms) {
									if (typeof result.c3_result === "undefined" || typeof result.c3_result.orderCode === 'undefined' || result.c3_result.orderNo === 'undefined') return
									window.location.href = "/shop_payment/?order_code=" + encodeURIComponent(result.c3_result.orderCode) + "&order_no=" + encodeURIComponent(result.c3_result.orderNo);
								} else {
									window.location.href = "/shop_payment/?order_code=" + encodeURIComponent(result.order_code);
								}
                            }
                    }
                } else {
										// 주문하기 버튼에 로딩 스피너 제거
										unsetSpinner(orderBtn, orderBtnText);
										// 정기구독 버튼에 로딩 스피너 제거
										unsetSpinner(orderRegularlyBtn, orderRegularlyBtnText);
                    if (type == 'talkpay') {
                        switch (params.type) {
                            case 'onOrder':
                                params.onFailure({ message: result.msg });
                                break;
                            case 'onPayOrder':
                                alert(result.msg);
                                break;
                        }
                    } else {
	                    if(result.code === 2){
		                    $('._deliv_country_selector').toggleClass('warning_select');
	                    }
                        alert(result.msg);
                        if (is_guest_login && result.code === 11) {
                            var back_url_base64 = window.location.pathname;
                            var url_param = document.location.href.split("?");
                            if (url_param.length > 1) {
                                back_url_base64 += "?" + url_param[1];
                            }
                            window.location.href = '/login?back_url=' + encodeURIComponent(btoa(back_url_base64));
                        }
                    }
                    /*
                    새로고침 할 필요가 없음..! (문제 시 롤백해야함)
                    location.reload();
                     */
                    add_order_progress_check = false;
                }
            }
        });
    };
    var addOrderRegularly = function (backurl, params, is_c3 = false){
        addOrderWithCart('regularly', '', backurl, false, is_c3, params);
    };
    /**
     * 카트 전체 네이버찜등록
     */
    var addNPayWishWithCart = function (item_code) {
        if (currentCartCode == '') {
            alert(LOCALIZE.설명_장바구니가비어있습니다());
            return false;
        }
        $.ajax({
            type: 'POST',
            data: { 'cart_code': currentCartCode, 'item_code': item_code },
            url: ('/shop/add_npay_wish_cart.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (result.npay_url == '')
                        alert(LOCALIZE.설명_네이버페이찜등록실패(escape_javascript(result.errmsg)));
                    else {
                        if (result.mobile == 'Y')
                            window.location.href = result.npay_url;
                        else
                            window.open(result.npay_url);
                    }
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    /**
     * 장바구니 옵션변경 화면 표시
     */
    var showChangeCartItem = function (item_code, is_regularly) {
        $.ajax({
            type: 'POST',
            data: { 'item_code': item_code, 'is_regularly': is_regularly },
            url: ('/shop/change_cart_item_request.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    $changeCartItemLayer.find('div.container-fluid').html(result.html);
                    $changeCartItemLayer.show();
                    SITE_SHOP_DETAIL.initDetail({
                        prod_idx: result.prodIdx,
                        prod_price: result.price,
                        require_option_count: result.require_option_count,
						use_image_optimizer_on_product_detail_markup: false,
                        shop_use_full_load: false,
                    });
                    SITE_SHOP_DETAIL.initProdStock(result.prod_stock.stock_use, result.prod_stock.stock_no_option, result.prod_stock.stock_unlimit);
                    SITE_SHOP_CART.changeCartLoadOption(result.prodIdx);
                    var selected_option_count = result.selected_option_list.length;
                    var cnt = 0;
                    currentChangeCartItemCode = item_code;
                    $.each(result.selected_option_list, function (no, data) {
                        SITE_SHOP_DETAIL.selectOption(result.prodIdx, data.options, data.require, data.count, function () {
                            cnt++;
                            if (cnt >= selected_option_count) SITE_SHOP_DETAIL.updateSelectedOptions('cart');
                        }, function () {
                            cnt++;
                            if (cnt >= selected_option_count) SITE_SHOP_DETAIL.updateSelectedOptions('cart');
                        });
                    });
                    if (result.require_option_count == 0) {
                        SITE_SHOP_CART.changeCartOrderCount("pc", result.count, false);
                        SITE_SHOP_CART.changeCartOrderCount("mobile", result.count, false);
                    }
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var hideChangeCartItem = function () {
        $changeCartItemLayer.find('div.container-fluid').empty();
        $changeCartItemLayer.hide();
        currentChangeCartItemCode = '';
    };
    /**
     * 장바구니 옵션 변경 완료 처리
     */
    var changeCartItemComplete = function (current_ul, is_c3 = false) {
        var is_regularly = 'N';
        if (cart_type == SHOP_CONST.CART_TYPE_REGULARLY) {
            is_regularly = 'Y';
        }
        if (currentChangeCartItemCode != '') {
            changeCartItemData({
                "mode": "detail",
                "item_code": currentChangeCartItemCode,
                "options": SITE_SHOP_DETAIL.getSelectedOption(),
                "order_count": SITE_SHOP_DETAIL.getOrderCount(),
                "is_regularly": is_regularly,
                "current_ul": current_ul
            }, is_c3);
        }
    };
    var changeCartItemDelivType = function (item_code, deliv_type, is_regularly, is_c3 = false) {
        changeCartItemData({
            "mode": "delivery",
            "item_code": item_code,
            "deliv_type": deliv_type,
            "is_regularly": is_regularly
        }, is_c3);
    };
    var changeCartItemDelivPayType = function (item_code, deliv_pay_type, is_regularly, is_c3 = false) {
        changeCartItemData({
            "mode": "delivery",
            "item_code": item_code,
            "deliv_pay_type": deliv_pay_type,
            "is_regularly": is_regularly
        }, is_c3);
    };
    var changeCartItemData = function (dt, is_c3 = false) {
        if (typeof dt['item_code'] == 'undefined') return false;
        $.ajax({
            type: 'POST',
            data: dt,
			url : is_c3 ? '/shop/oms/OMS_change_cart_item.cm' : '/shop/change_cart_item.cm',
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (typeof AW_INOUT != 'undefined') {
                        AW_INOUT(result.prod_no, result.after_count);
                    }
                    if (typeof AM_INOUT !== 'undefined') {
                        AM_INOUT(result.prod_no, result.after_count);
                    }
                    if (typeof CHANNEL_PLUGIN != "undefined") CHANNEL_PLUGIN.updateChannelProfileAttr('cart');
                    var cart_type = 'N';
                    if (dt['is_regularly'] == 'Y') {
                        cart_type = SHOP_CONST.CART_TYPE_REGULARLY;
                    }
                    $changeCartItemLayer.hide();
                    cartListMake(dt['current_url'], cart_type, is_c3);
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var countryCodeChange = function (country) {
			$deliv_country = country;
        $.ajax({
            type: 'POST',
            data: { 'country': country },
            url: ('/shop/country_code_change.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (result.msg != "SUCCESS") {
                    alert(result.msg);
                } else {
                    window.location.reload();
                }
            }
        });
    };
    /**
     * 장바구니 목록 생성 -  C3 바로구매 분기 추가
     * @param current_full_url
     * @param type		normal 일반구매, regularly 정기구독
     */
    var cartListMake = function (current_full_url, type, is_c3 = false) {
        selectedCartItem = [];
        $.ajax({
            type: 'POST',
            data: { 'current_full_url': current_full_url, 'type': type },
			url : is_c3 ? '/shop/oms/OMS_get_cart_list_make.cm' : '/shop/get_cart_list_make.cm',
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    $cart_list_wrap.html(res.table_html);
                    if (res.global_select_html !== '') {
                        $global_select.html(res.global_select_html);
												$deliv_country = $global_select.find('[selected]').val();
                    } else {
                        $global_select.remove();
                    }
                    if (res.cart_item_count > 0) {
                        $('.pay-box').show();
                        $shop_cart_list.removeClass('cart_empty_wrap');
                        fixedShopTableHeader();
                        resizeShopTableHeader();
                    } else {
                        $('.pay-box').hide();
                        $shop_cart_list.addClass('cart_empty_wrap');
                    }
                    cart_type = type;
                    if (type === SHOP_CONST.CART_TYPE_REGULARLY) {
                        currentCartCode = res.cart_code;
                        $shop_cart_list.find('._btn_order').hide();
                        $shop_cart_list.find('._btn_order_regularly').css('display', 'flex');
                        $shop_cart_list.find('._social_pay').hide();
                        $('#cart_normal_tab').removeClass('active');
                        $('#cart_regularly_tab').addClass('active');
                    } else {
                        currentCartCode = res.cart_code;
                        $shop_cart_list.find('._btn_order_regularly').hide();
                        $shop_cart_list.find('._btn_order').css('display', 'flex');
                        $shop_cart_list.find('._social_pay').show();
                        $('#cart_regularly_tab').removeClass('active');
                        $('#cart_normal_tab').addClass('active');
                    }
                    getSelectedPrice(type === SHOP_CONST.CART_TYPE_REGULARLY);
                } else
                    alert(res.msg);
                is_cart_changed = false;
            },
            error: function () {
                alert(getLocalizeString('설명_잠시후다시시도해주세요', '', '잠시 후 다시 시도해주세요.'));
            }
        });
    };
    var fixedShopTableHeader = function () {
        var window_width = window.innerWidth;
        if (window_width < 768) {
            var section_fixed_height = getMobileSectionFixedHeight();
            var $cart_list_thead = $cart_list_wrap.find('._shop_table thead');
            $cart_list_thead.css('top', section_fixed_height + 'px');
        }
    };
    var getMobileSectionFixedHeight = function () {
        /* 기본 top을 0px로 설정 시 1px 가량의 여백이 생겨 뒤가 비쳐보이는 경우가 있어 -1px로 설정 */
        var section_fixed_height = -1;
        var $fixed_header_disable = $('#inline_header_mobile').find('._fixed_header_section');
        for (var i = 0; i < $fixed_header_disable.length; i++) {
            var target = $fixed_header_disable[i].getBoundingClientRect();
            section_fixed_height += target.height;
        }
        var prev_fixed_section = $shop_cart_list.parents('div[doz_type="section"]').prevAll('._fixed_section[doz_mobile_hide="N"]')[0];
        if (typeof prev_fixed_section !== 'undefined') {
            section_fixed_height += prev_fixed_section.getBoundingClientRect().height;
        }
        return section_fixed_height;
    };
    var resizeShopTableHeader = function () {
        var is_resizing = false;
        $(window).resize(function () {
            if (!is_resizing) {
                is_resizing = true;
                setTimeout(function () {
                    fixedShopTableHeader();
                    is_resizing = false;
                }, 100);
            }
        });
    };
    var setTimesale = function () {
        var $doz_timesale_wrap = $shop_cart_wish_list.find('._doz_timesale_wrap');
        if ($doz_timesale_wrap.length > 0) {
            $doz_timesale_wrap.each(function () {
                var $that = $(this);
                var start_time = ($that.find('._doz_timesale').attr('data-start-time') * 1000);
                var $doz_timesale = $that.find('._doz_timesale');
                var timesale_interval = setInterval(function () {
                    var remain_ms = ($doz_timesale.attr('data-end-time') * 1000) - start_time;
                    if (remain_ms > 0) {
                        var remain_d = Math.floor(remain_ms / 86400000);
                        var remain_h = Math.floor((remain_ms % 86400000) / 3600000);
                        var remain_m = Math.floor((remain_ms % 3600000) / 60000);
                        var remain_s = Math.floor((remain_ms % 60000) / 1000);
                        var remain_hh = remain_h < 10 ? '0' + remain_h : '' + remain_h;
                        var remain_mm = remain_m < 10 ? '0' + remain_m : '' + remain_m;
                        var remain_ss = remain_s < 10 ? '0' + remain_s : '' + remain_s;
                        if (remain_d >= 1) {
                            $doz_timesale.text(getLocalizeString('설명_타임세일종료까지n일', [remain_d], '타임세일 종료까지 %1일'));
                        } else {
                            $doz_timesale.text(getLocalizeString('설명_종류까지n1시n2분n3초남음', [remain_hh, remain_mm, remain_ss], '종료까지 %1:%2:%3 남음'));
                        }
                        start_time = start_time + 1000;
                    } else {
                        /* 타임세일 종료 */
                        clearInterval(timesale_interval);
                        $that.remove();
                    }
                }, 1000);
            });
        }
    };
    return {
        initCart: function (cart_code, backurl, is_regularly) {
            initCart(cart_code, backurl, is_regularly);
        },
        loadProdWishList: function () {
            loadProdWishList();
        },
        deleteProdWish: function (cart_item, is_regularly) {
            deleteProdWish([cart_item], is_regularly);
        },
        deleteProdWishByProdCode: function (prod_code) {
            deleteProdWishByProdCode(prod_code);
        },
        addProdWish: function (cart_item, is_regularly) {
            addProdWish([cart_item], is_regularly);
        },
        addProdWishMulti: function (is_regularly) {
            if (selectedCartItem.length == 0) {
                alert(LOCALIZE.설명_선택한항목이없습니다());
                return false;
            }
            addProdWish(selectedCartItem, is_regularly);
        },
        removeCartItemOption: function (item_code, optionNo, is_regularly) {
            removeCartItemOption(item_code, optionNo, is_regularly);
        },
        removeCartItem: function (item_code, is_regularly) {
            removeCartItem([item_code], is_regularly);
        },
        removeSelectedCartItem: function (is_regularly) {
            if (selectedCartItem.length == 0) {
                alert(LOCALIZE.설명_선택한상품이없습니다());
                return false;
            }
            removeCartItem(selectedCartItem, is_regularly);
        },
        removeSelectedCartSoldOutItem: function (is_regularly) {
            if (selectedCartItem.length == 0) {
                alert(LOCALIZE.설명_선택한상품이없습니다());
                return false;
            }
            removeSelectedCartSoldOutItem(selectedCartItem, is_regularly);
        },
        "toggleCheckCartItem": function (is_regularly) {
            toggleCheckCartItem(is_regularly);
        },
        "toggleAllCheckCartItem": function (b, is_regularly) {
            toggleAllCheckCartItem(b, is_regularly);
        },
        addOrderWithCart: function (type, item_code, backurl, params) {
            addOrderWithCart(type, item_code, backurl, false, false, params);
        },
        addOrderWithCartDirect: function (type, item_code, backurl) {
            addOrderWithCart(type, item_code, backurl, true, false);
        },
        addOrderRegularly: function (backurl, params) {
            addOrderRegularly(backurl, params, false);
        },
        showChangeCartItem: function (item_code, is_regularly) {
            showChangeCartItem(item_code, is_regularly);
        },
        hideChangeCartItem: function () {
            hideChangeCartItem();
        },
        changeCartSelectRequireOption: function (prod_idx, option_code, value_code, value_name) {
            SITE_SHOP_DETAIL.selectRequireOption('cart', prod_idx, option_code, value_code, value_name, function () {
                SITE_SHOP_DETAIL.updateSelectedOptions('cart');
            });
        },
        changeCartChangeRequireInputOption: function (prod_idx, option_code, msg) {
            SITE_SHOP_DETAIL.changeRequireInputOption(prod_idx, option_code, msg, function () {
                SITE_SHOP_DETAIL.updateSelectedOptions('cart');
            });
        },
        changeCartSelectOptionalOption: function (prod_idx, option_code, value_code, value_name) {
            SITE_SHOP_DETAIL.selectOptionalOption(prod_idx, option_code, value_code, value_name, function () {
                SITE_SHOP_DETAIL.updateSelectedOptions('cart');
            });
        },
        changeCartItemIncrease: function (optNo, reload) {
            SITE_SHOP_DETAIL.increaseOptionCount(optNo, 'cart');
        },
        changeCartItemDecrease: function (optNo) {
            SITE_SHOP_DETAIL.decreaseOptionCount(optNo, 'cart');
        },
        changeCartIncrease: function (type) {
            var o = $changeCartItemLayer.find('input._order_count_' + type);
            var curCount = o.val();
            if (isNaN(curCount))
                curCount = 1;
            else
                curCount = parseInt(curCount) + 1;
            var res = SITE_SHOP_DETAIL.checkProdStock(curCount);
            if (res === true) {
                o.val(curCount);
                SITE_SHOP_DETAIL.setOrderCount(curCount);
            } else {
                alert(res);
            }
            SITE_SHOP_DETAIL.updateSelectedOptions('cart');
        },
        changeCartDecrease: function (type) {
            var o = $changeCartItemLayer.find('input._order_count_' + type);
            var curCount = o.val();
            if (isNaN(curCount))
                curCount = 1;
            else
                curCount = parseInt(curCount) - 1;
            if (curCount < 1) curCount = 1;
            var res = SITE_SHOP_DETAIL.checkProdStock(curCount);
            if (res === true) {
                o.val(curCount);
                SITE_SHOP_DETAIL.setOrderCount(curCount);
            } else {
                alert(res);
            }
            SITE_SHOP_DETAIL.updateSelectedOptions('cart');
        },
        changeCartOrderCount: function (type, count, is_alert) {
            if (is_alert == void 0) is_alert = true;
            if (isNaN(count))
                count = 1;
            else
                count = parseInt(count);
            if (count < 1) count = 1;
            var res = SITE_SHOP_DETAIL.checkProdStock(count);
            if (res === true) {
                $changeCartItemLayer.find("input._order_count_" + type).val(count);
                SITE_SHOP_DETAIL.setOrderCount(count);
            } else {
                if (is_alert) alert(res);
            }
            SITE_SHOP_DETAIL.updateSelectedOptions('cart');
        },
        changeCartItemRemove: function (optNo) {
            SITE_SHOP_DETAIL.removeSelectedOption(optNo, 'cart');
        },
        changeCartItemCount: function (optNo, optCount) {
            SITE_SHOP_DETAIL.changeOptionCount(optNo, optCount, 'cart');
        },
        "changeCartItemDelivType": function (item_code, deliv_type, is_regularly) {
            changeCartItemDelivType(item_code, deliv_type, is_regularly);
        },
        "changeCartItemDelivPayType": function (item_code, deliv_pay_type, is_regularly) {
            changeCartItemDelivPayType(item_code, deliv_pay_type, is_regularly);
        },
        changeCartItemComplete: function (current_ul) {
            changeCartItemComplete(current_ul);
        },
        addNPayWishWithCart: function (item_code) {
            addNPayWishWithCart(item_code);
        },
        addSelectedCartItem: function (item_code) {
            selectedCartItem.push(item_code);
        },
        changeCartLoadOption: function (prod_idx) {
            SITE_SHOP_DETAIL.loadOption('cart', prod_idx);
        },
        cartListMake: function (current_full_url, type) {
            cartListMake(current_full_url, type);
        },
        countryCodeChange: function (country) {
            countryCodeChange(country);
        },
        toggleAllSelectCk: function () {
            toggleAllSelectCk();
        },
        // C3 에 주문을 생성하는 endpoint를 바라보는 함수
		C3_initCart : function(cart_code, backurl, is_regularly){
			initCart(cart_code, backurl, is_regularly, true);
		},
		OMS_addOrderWithCart : function(type, item_code, backurl, params){
			addOrderWithCart(type, item_code, backurl, false, true, params);
		},
		OMS_addOrderWithCartDirect : function(type, item_code, backurl){
			addOrderWithCart(type, item_code, backurl, true, true);
		},
		C3_cartListMake : function(current_full_url, type){
			cartListMake(current_full_url, type, true);
		},
		C3_changeCartItemComplete : function(current_ul){
			changeCartItemComplete(current_ul, true);
		},
		C3_changeCartItemDelivType: function(item_code, deliv_type,is_regularly){
			changeCartItemDelivType(item_code, deliv_type,is_regularly, true);
		},
		C3_changeCartItemDelivPayType: function(item_code, deliv_pay_type,is_regularly) {
			changeCartItemDelivPayType(item_code, deliv_pay_type,is_regularly, true);
		},
    };
}();
var SITE_SHOP_REVIEW = function () {
    var $review_wrap;
    var $mobile_review_wrap;
    var $mobile_form;
    var $rating;
    var $star;
    var $m_rating;
    var $m_star;
    var $comment_body;
    var $comment_area;
    var review_body;
    var $review_container;
    var $review_form;
    var body_input;
    var placeholderText;
    var isIOS, isSafari, $fr_m_custom, $write_header, m_sticky_container_trigger_top, $toolbarContainer;
    var images = {};
    var add_review_wrap;
    var is_submit = false;
		// 이미지 엑박 여부를 확인하는 함수
		const isImageBroken = (img) => {
			return img.complete && (img.naturalWidth === 0 || img.naturalHeight === 0);
		}
		// 이미지를 다시 로드하는 함수
		const reloadImage = (img, src) => {
			setTimeout(() => {
				img.src = src + "?t=" + new Date().getTime(); // 캐시를 피하기 위해 쿼리 스트링 추가
			}, 1000);
		}
    var init = function (code) {
        $review_wrap = $('._review_wrap');
        $review_form = $('#review_form');
        $rating = $('#rating');
        $star = $('._star');
        $review_form.find('._btn_add_image').toggleClass('no-margin', true);
        review_body = $('#review_modal_body');
        $review_container = $('#review_container');
        body_input = $('#body_input');
        placeholderText = $('#placeholderText').val();
        $review_form.find('#review_image_upload_btn').fileupload({
            url: '/ajax/review_image_upload.cm',
            formData: { temp: 'Y', target: 'site_review', type: 'image' },
            dataType: 'json',
            singleFileUploads: true,
            limitMultiFileUploads: 1,
            start: function (e, data) {
            },
            progress: function (e, data) {
            },
            done: function (e, data) {
                $.each(data.result.files, function (e, tmp) {
                    if (tmp.error == null) {
                        $review_form.find("#review_image_box").show();
                        $review_form.find('._btn_add_image').toggleClass('no-margin', false);
												const url = CDN_OPTIMIZED_URL + tmp.url + '?w=300';
                        images[tmp.code] = tmp.url;
                        const html = '
';
                        $review_form.find("#review_image_box ._btn_add_image").before(html);
		                    const reviewImage = document.getElementById(`review_${tmp.url}`);
												reviewImage.style.display = 'none';
		                    // 이미지 로드 완료 후 확인
		                    reviewImage.onload = reviewImage.onerror = function() {
			                    if (isImageBroken(reviewImage)) {
				                    reloadImage(reviewImage, reviewImage.src);
			                    } else {
				                    reviewImage.style.display = 'block';
			                    }
		                    };
		                    // 만약 이미 이미지가 로드되었으면 즉시 확인
		                    if (reviewImage.complete) {
			                    if (isImageBroken(reviewImage)) {
				                    reloadImage(reviewImage, reviewImage.src);
			                    } else {
				                    reviewImage.style.display = 'block';
			                    }
		                    }
                    } else {
                        alert(tmp.error);
                    }
                });
            },
            fail: function (e, data) {
                alert(getLocalizeString("설명_업로드에실패하였습니다", "", "업로드에 실패 하였습니다."));
            }
        });
    };
    var deleteReviewImage = function (code) {
        if (typeof images[code] != 'undefined') {
            delete images[code];
        }
        $("span._img_" + code).remove();
    };
    var openAddReview = function (idx, prod_code, prod_order_code, is_c3 = false) {
        $.cocoaDialog.close();
        $('#myModalReview').modal("hide");//review_remind 모달 id분리로 인한 처리
        $.ajax({
            type: 'POST',
            data: { 'idx': idx, 'prod_code': prod_code, 'prod_order_code': prod_order_code },
            url: ('/shop/open_add_review.cm'),
            dataType: 'json',
            cache: false,
            async: false,
            success: function (result) {
                if (result.msg === 'SUCCESS') {
                    $.cocoaDialog.open({
                        type: 'add_review', custom_popup: result.html, 'close_block': true, width: 800, hide_event: function () {
                            images = {};
                        }
                    });
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var convertReviewImage = function (image_list) {
        $review_form.find('._btn_add_image').toggleClass('no-margin', false);
        for (var i = 0; i < image_list.length; i++) {
            let html;
			images[i] = image_list[i];
	        if (images[i].indexOf('.mp4') > -1) {
		        html = '

동영상은
표시할 수 없습니다.
';
	        } else {
                html = '
';
	        }
            $review_form.find("#review_image_box ._btn_add_image").before(html);
        }
    };
    function resizeStickyContainer() {
        var s_top = $(this).scrollTop();
        if (isIOS && isSafari) {
            $write_header.css({ '-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px' });
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
            $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
            if (s_top > m_sticky_container_trigger_top) {
                $toolbarContainer.css({ '-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px' });
                review_body.find('.fr-view').css('padding-top', '90px');
            } else {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 'auto' });
                review_body.find('.fr-view').css('padding-top', '');
            }
        } else {
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
        }
        $toolbarContainer.find('.fr-toolbar').css('width', review_body.find('.fr-view').width());
        if ($(window).width() >= 768) {
            if ($review_container.hasClass('bg_on'))
                $review_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 487);
            else
                $review_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 180);
        }
    }
    var initMobileReview = function () {
        $mobile_review_wrap = $('#prod_detail_content_mobile');
        $mobile_form = $mobile_review_wrap.find('#mobile_review_form');
        $m_rating = $mobile_form.find('#mobile_rating');
        $m_star = $mobile_form.find('._star');
        $mobile_form.find("#mobile_review_image_box").hide();
        $mobile_form.find('#mobile_review_image_upload_btn').setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#mobile_review_image_box").show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#mobile_review_image_box").append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        autosize($('.textarea_block textarea'));
    };
    var changeRating = function (t, n) {
        if (t == 'desktop') {
            $rating.val(n + 1);
            $star.each(function (e) {
                if (n <= 0 && e == 0) {
                    if (n == -1) {
                        $(this).removeClass('active');
                    } else {
                        $(this).addClass('active');
                    }
                } else {
                    $(this).removeClass('active');
                    if (e <= n) {
                        $(this).addClass('active');
                    }
                }
            });
        } else {
            $m_rating.val(n + 1);
            $m_star.each(function (e) {
                if (n <= 0 && e == 0) {
                    if (n == -1) {
                        $(this).removeClass('active');
                    } else {
                        $(this).addClass('active');
                    }
                } else {
                    $(this).removeClass('active');
                    if (e <= n) {
                        $(this).addClass('active');
                    }
                }
            });
        }
    };
    var reviewFormShow = function (t) {
        var sub_form = $("._sub_form_" + t);
        sub_form.data('show', 'Y');
        sub_form.show();
        var comment_add_body = sub_form.find('._comment_add_body_' + t);
        $('body').off('mouseup.sub_comment')
            .on('mouseup.sub_comment', function (e) {
                var $c_target = $(e.target);
                var $s_form = $c_target.closest('._sub_form_' + t + ', ._show_sub_form_btn_' + t);
                if ($s_form.length == 0) {
                    var text = comment_add_body.val();
                    sub_form.data('show', 'N');
                    if (text == '') {
                        $('body').off('mouseup.sub_comment');
                        reviewFormHide();
                    }
                }
            });
    };
    var reviewEditShow = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.siblings().hide();
        editor_form.data('show', 'Y');
        editor_form.show();
        autosize.update(editor_form.find('textarea'));
    };
    var reviewEditHide = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.hide();
    };
    var reviewFormHide = function () {
        $("._sub_review_form").hide();
    };
    var reviewDelete = function (t, c, r_p, only_photo, buyer_permission) {
        only_photo = only_photo == 'Y' ? true : false;
        $.ajax({
            type: 'POST',
            data: { code: t, prod_code: c },
            url: ('/shop/check_review_point.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    var msg = buyer_permission == 'Y' ? LOCALIZE.설명_삭제하시겠습니까삭제후재등록불가() : LOCALIZE.설명_삭제하시겠습니까();
                    if (res.alert_msg != '' && res.alert_msg != null) msg = res.alert_msg;
                    if (confirm(msg)) {
                        $.ajax({
                            type: 'POST',
                            data: { code: t, prod_code: c, change_member_point: res.change_member_point },
                            url: ('/shop/delete_review.cm'),
                            dataType: 'json',
                            success: function (result) {
                                if (result.msg == 'SUCCESS') {
                                    if (IS_MOBILE) SITE_SHOP_DETAIL.changeContentTab(SHOP_CONST.TAB_TYPE.REVIEW, r_p);
                                    else SITE_SHOP_DETAIL.changeContentPCTab(SHOP_CONST.TAB_TYPE.REVIEW, r_p, 0, false, only_photo);
                                    SITE_SHOP_DETAIL.deleteReviewInTabDisplay(c, only_photo);
                                    SITE_SHOP_DETAIL.getReviewQnaCount(c);
                                    $.cocoaDialog.close();
                                } else
                                    alert(result.msg);
                            }
                        });
                    }
                } else
                    alert(res.msg);
            }
        });
    };
    var reviewHide = function (t, c, r_p) {
        if (confirm(LOCALIZE.설명_숨기시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: t, prod_code: c, is_visible: false },
                url: ('/shop/delete_review.cm'),
                dataType: 'json',
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        if (IS_MOBILE) SITE_SHOP_DETAIL.changeContentTab(SHOP_CONST.TAB_TYPE.REVIEW, r_p);
                        else SITE_SHOP_DETAIL.changeContentPCTab(SHOP_CONST.TAB_TYPE.REVIEW, r_p);
                        $.cocoaDialog.close();
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    var CheckSecret = function (code, secret_pass, callback) {
        $.ajax({
            type: 'post',
            data: { code: code, secret_pass: secret_pass, type: 'review' },
            url: '/ajax/check_review_pass.cm',
            dataType: 'json',
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (typeof callback == 'function')
                        callback();
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var EditReviewShow = function (t, c, idx) {
        var $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                CheckSecret(t, secret_pass, function () {
                    SITE_SHOP_REVIEW.openAddReview(idx, c);
                });
                $show_secret_password.hide();
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    var reviewDeleteShow = function (t, c, only_photo) {
        var $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                CheckSecret(t, secret_pass, function () {
                    reviewDelete(t, c, '', only_photo);
                });
                $show_secret_password.hide();
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    var imageUploadInit = function (n) {
        const $wrapper = $('.categorize, .categorize-mobile');
        $("#sub_review_image_box_" + n).hide();
        //$("#editor_review_image_box_"+n).hide();
        $('#sub_review_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#sub_review_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#sub_review_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        $('#editor_review_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#editor_review_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#editor_review_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
    };
    var submit = function () {
        if (is_submit) return false;
        is_submit = true;
        var data = $review_form.serializeObject();
        data.body = data.body.replace('/(?!br\\s*\\/?)[^>]+>/gi', '>').replace('/<(?!img\\s*\\/?)[^>]/gi', '<');
        data.images = images;
        $.ajax({
            type: 'POST',
            data: data,
            url: ('/shop/add_review.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg == 'SUCCESS') {
                    IMWEB_SESSIONSTORAGE.clear("PROD_REVIEW.*");
                    reviewCompleted(res.received_point, res.check_received_point);
                    if (typeof CHANNEL_PLUGIN != "undefined") CHANNEL_PLUGIN.CompleteReview();
                } else {
                    is_submit = false;
                    alert(res.msg);
                }
            }
        });
    };
    var reviewCompleted = function (received_point, check_received_point) {
        $.cocoaDialog.close();
        $.ajax({
            type: 'POST',
            data: { 'received_point': received_point, 'check_received_point': check_received_point },
            url: ('/shop/add_review_completed.cm'),
            dataType: 'html',
            async: false,
            cache: false,
            success: function (html) {
                $.cocoaDialog.open({
                    type: 'prod_review_completed',
                    custom_popup: html,
                    'close_block': false,
                    hide_event: function () {
                        location.reload();
                    }
                });
            }
        });
    };
    var reviewCancel = function () {
        if (isIOS && isSafari) {
            var s_top = $(this).scrollTop();
            $write_header.css({ '-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': 0 });
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
            $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
            if (s_top > m_sticky_container_trigger_top) {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': $write_header.height() + 'px' });
            } else {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 'auto' });
            }
        }
        history.go(-1);
    };
    var createHtml = function (prod_idx, review_page, qna_page, paging_on, only_photo, rating) {
        const isMobile_width = (window.innerWidth < SHOP_CONST.WIDTH_MOBILE);
        $review_wrap = $('._review_wrap');
        const qna_url = isMobile_width ? '/shop/prod_review_mobile_html.cm' : '/shop/prod_review_pc_html.cm';
        if ($review_wrap.length && !($review_wrap.hasClass('one_page_mode'))) {
            review_page = review_page || 0;
            qna_page = qna_page || 0;
            var is_method_get = (review_page == 0 && qna_page == 0);
            $.ajax({
                type: (is_method_get ? 'GET' : 'POST'),
                data: { prod_idx: prod_idx, review_page: review_page, qna_page: qna_page, only_photo: only_photo, rating: rating },
                url: qna_url,
                dataType: 'html',
                success: function (result) {
                    $review_wrap.html(result);
                    if(isMobile_width) {
                        SITE_SHOP_DETAIL.getReviewSummary(document.querySelector(".detail_review_wrap_mobile ._review_summary_wrap_mobile"));
                    }
                }
            });
        }
    };
    var checkReviewData = function () {
        var check = Object.keys(images).length > 0 || review_body.val() != '';
        if (check) {
            if (confirm(LOCALIZE.설명_작성한내용이모두사라집니다())) {
                $.cocoaDialog.close();
            } else {
                return false;
            }
        } else {
            $.cocoaDialog.close();
        }
    };
    var addBlockPost = function (login_member_code, review_code) {
        if (confirm(getLocalizeString('설명_게시글차단안내', '', '게시글을 차단하시겠습니까? 작성자의 다른 글과 댓글도 확인할 수 없습니다.'))) {
            addBlock(login_member_code, review_code, 'post');
        }
    };
    var addBlockComment = function (login_member_code, review_code) {
        if (confirm(getLocalizeString('설명_님을차단안내', '', '댓글을 차단하시겠습니까? 작성자의 다른 댓글도 확인할 수 없습니다.'))) {
            addBlock(login_member_code, review_code, 'comment');
        }
    };
    var switchToBlockCancelButton = function (login_member_code, review_code, review_member_code, type) {
        var onclick;
        switch (type) {
            case 'comment':
                onclick = "SITE_SHOP_REVIEW.deleteBlockComment('" + login_member_code + "','" + review_code + "','" + review_member_code + "'); event.stopPropagation();";
                break;
            case 'post':
                onclick = "SITE_SHOP_REVIEW.deleteBlockPost('" + login_member_code + "','" + review_code + "','" + review_member_code + "'); event.stopPropagation();";
                break;
        }
        $('._review_button._block_' + review_member_code)
            .text(getLocalizeString("설명_차단해제", "", "차단해제"))
            .attr("onclick", onclick);
    };
    var switchToBlockCancelBody = function (review_member_code) {
        $('._review_body._block_' + review_member_code)
            .html("
" + getLocalizeString("설명_차단한작성자의구매평입니다", "", "차단한 작성자의 구매평입니다.") + "
")
            .attr('block', 'true');
        //이미지 안보이게 수정
        $('._review_img._block_' + review_member_code).css('display', 'none');
        //모달 리뷰 차단하였을 경우 이미지 변경
        $('._block_no_img._block_' + review_member_code)
            .css('display', 'block');
    };
    var addBlock = function (login_member_code, review_code, type) {
        $.ajax({
            type: 'POST',
            data: {
                'login_member_code': login_member_code,
                'review_code': review_code,
                'type': type,
            },
            url: ('/shop/add_review_block.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg === 'SUCCESS') {
                    switchToBlockCancelButton(login_member_code, review_code, res.review_member_code, type);
                    switchToBlockCancelBody(res.review_member_code);
                    $('._block_review_command_' + res.review_member_code).css("display", "none");
                    SHOP_REVIEW_COMMENT.getReviewCommentHtml(review_code, 'accordion', $(this));
                } else {
                    alert(res.msg);
                }
            }
        });
    };
    var deleteBlockPost = function (login_member_code, review_code, block_member_code) {
        if (confirm(getLocalizeString('설명_게시글차단해제안내', '', '게시글을 차단 해제하시겠습니까? 작성자의 다른 글과 댓글을 다시 확인할 수 있습니다.'))) {
            deleteBlock(login_member_code, review_code, block_member_code, 'post');
        }
    };
    var deleteBlockComment = function (login_member_code, review_code, block_member_code) {
        var block_review_list_code = [];
        if (confirm(getLocalizeString('설명_님을차단해제안내', '', '댓글을 차단 해제하시겠습니까? 작성자의 다른 댓글을 다시 확인할 수 있습니다.'))) {
            deleteBlock(login_member_code, review_code, block_member_code, 'comment');
        }
    };
    var deleteBlock = function (login_member_code, review_code, block_member_code, type) {
        var block_review_list_code = [];
        block_review_list_code = get_block_review_list_code(block_member_code);
        $.ajax({
            type: 'POST',
            data: {
                'login_member_code': login_member_code,
                'review_code': review_code,
                'block_review_list_code': block_review_list_code,
                'type': type
            },
            url: ('/shop/delete_review_block.cm'),
            dataType: 'json',
            success: function (res) {
                if (res.msg === 'SUCCESS') {
                    switchToBlockButton(login_member_code, review_code, res.review_member_code, type);
                    switchToBlockBody(res.review_member_code, block_review_list_code, res.block_review_data);
                    $('._block_review_command_' + res.review_member_code).css("display", "block");
                    SHOP_REVIEW_COMMENT.getReviewCommentHtml(review_code, 'accordion', $(this));
                } else {
                    alert(res.msg);
                }
            }
        });
    };
    var switchToBlockButton = function (login_member_code, review_code, review_member_code, type) {
        var onclick;
        switch (type) {
            case 'comment':
                onclick = "SITE_SHOP_REVIEW.deleteBlockComment('" + login_member_code + "','" + review_code + "'); event.stopPropagation();";
                break;
            case 'post':
                onclick = "SITE_SHOP_REVIEW.deleteBlockPost('" + login_member_code + "','" + review_code + "'); event.stopPropagation();";
                break;
        }
        $('._review_button._block_' + review_member_code)
            .text(getLocalizeString("설명_차단", "", "차단"))
            .attr("onclick", "SITE_SHOP_REVIEW.addBlockPost('" + login_member_code + "','" + review_code + "'); event.stopPropagation();");
    };
    var switchToBlockBody = function (review_member_code, block_review_list_code, block_review_data) {
        //일반 이미지
        $('._review_img._block_' + review_member_code).removeAttr('style');
        block_review_list_code.forEach(block_review_code => {
            $('._review_body._review_code_' + block_review_code)
                .html(block_review_data[block_review_code]['body'].replace(/(\n|\r\n)/g, '
'))
                .attr('block', 'false');
        });
        //모달 리뷰 이미지
        $('._block_no_img._block_' + review_member_code)
            .css('display', 'none');
    };
    var get_block_review_list_code = function (block_member_code) {
        //차단 리스트 review code 가져오기
        var block_review_list_code = [];
        $("._review_body._block_" + block_member_code + "[block='true']").each(function () {
            block_review_list_code.push($(this).attr('block-review-code'));
        });
        return block_review_list_code;
    };
    return {
        init: function (code) {
            init(code);
        },
        deleteReviewImage: function (code) {
            deleteReviewImage(code);
        },
        openAddReview: function (idx, prod_code, prod_order_code) {
            return openAddReview(idx, prod_code, prod_order_code);
        },
        convertReviewImage: function (image_list) {
            return convertReviewImage(image_list);
        },
        initMobileReview: function () {
            initMobileReview();
        },
        submit: function () {
            submit();
        },
        reviewCompleted: function (received_point, check_received_point) {
            reviewCompleted(received_point, check_received_point);
        },
        reviewCancel: function () {
            reviewCancel();
        },
        changeRating: function (t, n) {
            changeRating(t, n);
        },
        FormShow: function (t) {
            reviewFormShow(t);
        },
        Delete: function (t, c, r_p, only_photo, buyer_permission) {
            reviewDelete(t, c, r_p, only_photo, buyer_permission);
        },
        EditShow: function (t) {
            reviewEditShow(t);
        },
        EditReviewShow: function (t, c, idx) {
            EditReviewShow(t, c, idx);
        },
        DeleteShow: function (t, c, only_photo) {
            reviewDeleteShow(t, c, only_photo);
        },
        Hide: function (t, c, r_p) {
            reviewHide(t, c, r_p);
        },
        EditHide: function (t) {
            reviewEditHide(t);
        },
        imageUploadInit: function (n) {
            imageUploadInit(n);
        },
        createHtml: function (prod_idx, review_page, qna_page, paging_on, only_photo) {
            createHtml(prod_idx, review_page, qna_page, paging_on, only_photo);
        },
        checkReviewData: function () {
            checkReviewData();
        },
        addBlockPost: function (login_member_code, review_code) {
            addBlockPost(login_member_code, review_code);
        },
        addBlockComment: function (login_member_code, review_code) {
            addBlockComment(login_member_code, review_code);
        },
        deleteBlockPost: function (login_member_code, review_code, block_member_code) {
            deleteBlockPost(login_member_code, review_code, block_member_code);
        },
        deleteBlockComment: function (login_member_code, review_code, block_member_code) {
            deleteBlockComment(login_member_code, review_code, block_member_code);
        },
		C3_openAddReview : function(idx,prod_code,prod_order_code){
			return openAddReview(idx,prod_code,prod_order_code, true);
		},
    };
}();
var SHOP_REVIEW_COMMENT = function () {
    var $review_comment_wrap;
    var $form;
    var $secret;
    var review_code;
    var device;
    var load_type; // 아코디언인지, 모달인지 체크
    var init = function (code, type, device_type) {
        device = device_type;
        load_type = type;
        review_code = code;
        $form = $('.categorize-mobile #' + device + "_" + load_type + '_review_form_' + code + ', .categorize.review-box #' + device + "_" + load_type + '_review_form_' + code);
        $secret = $('._secret_btn');
        $secret.on('click', function () {
            if ($secret.hasClass('active')) {
                $secret.removeClass('active');
                $('#use_secret_review').val('N');
            } else {
                $secret.addClass('active');
                $('#use_secret_review').val('Y');
            }
        });
        $form.each(function(){
            const $this = $(this);
            $this.find('#review_image_upload_btn_' + code).setUploadImage({
                url : '/shop/upload_image.cm',
                dropZone : 'icon_img_upload_wrap',
                singleFileUploads : true,
                formData : {temp : 'Y'}
            }, function(res, data){
                $this.find("#review_comment_image_box_" + code).show();
                $.each(data, function(e, tmp){
                    if(tmp.error == "" || tmp.error == null){
                        var url = CDN_UPLOAD_URL + tmp.url;
                        var html = '
';
                        $this.find("#review_comment_image_box_" + code).append(html);
                    }else{
                        alert(tmp.error);
                    }
                });
            })
        });
    };
    var imageUploadInit = function (idx) {
        const $wrapper = $('.categorize-mobile, .categorize.review-box');
        $wrapper.each(function(){
           const $this = $(this);
            $this.find("#sub_review_image_box_" + idx).hide();
            $this.find('#sub_review_image_upload_btn_' + idx).setUploadImage({
                url: '/shop/upload_image.cm',
                dropZone: 'icon_img_upload_wrap',
                singleFileUploads: true,
                formData: { temp: 'Y' }
            }, function (res, data) {
                $(".categorize #sub_review_image_box_" + idx).show();
                $(".categorize-mobile #sub_review_image_box_" + idx).show();
                $.each(data, function (e, tmp) {
                    if (tmp.error == "" || tmp.error == null) {
                        var url = CDN_UPLOAD_URL + tmp.url;
                        var html = '

';
                        $this.find("#sub_review_image_box_" + idx).append(html);
                    } else {
                        alert(tmp.error);
                    }
                });
            });
            $this.find('#editor_review_image_upload_btn_' + idx).setUploadImage({
                url: '/shop/upload_image.cm',
                dropZone: 'icon_img_upload_wrap',
                singleFileUploads: true,
                formData: { temp: 'Y' }
            }, function (res, data) {
                $(".categorize #editor_review_image_box_" + idx).show();
                $(".categorize-mobile #editor_review_image_box_" + idx).show();
                $.each(data, function (e, tmp) {
                    if (tmp.error == "" || tmp.error == null) {
                        var url = CDN_UPLOAD_URL + tmp.url;
                        var html = '

';
                        $this.find("#editor_review_image_box_" + idx).append(html);
                    } else {
                        alert(tmp.error);
                    }
                });
            });
        });
    };
    var getReviewCommentHtml = function (code, type, object) {
        if (type == 'accordion') {
            $review_comment_wrap = $('.review_comment_wrap_' + code);
            if (!object.hasClass('active')) {
                $.ajax({
                    type: 'POST',
                    data: { 'code': code, 'type': type },
                    url: ('/shop/get_review_comment_list.cm'),
                    dataType: 'json',
                    async: false,
                    cache: false,
                    success: function (result) {
                        if (result.msg === 'SUCCESS') {
                            $review_comment_wrap.html(result.html);
                            $review_comment_wrap.show();
                        } else {
                            alert(result.msg);
                        }
                    }
                });
            } else {
                $review_comment_wrap.hide();
            }
        } else {
            $review_comment_wrap = $('#review_comment_section_' + code);
            $.ajax({
                type: 'POST',
                data: { 'code': code, 'type': type },
                url: ('/shop/get_review_comment_list.cm'),
                dataType: 'json',
                async: false,
                cache: false,
                success: function (result) {
                    if (result.msg === 'SUCCESS') {
                        $review_comment_wrap.html(result.html);
                    } else {
                        alert(result.msg);
                    }
                }
            });
        }
    };
    var submit = function (t, type, i) {
		// mobile 및 pc 에서 같은 id 값 공유 해당 부분 수정 필요...
		const isMobile_width = (window.innerWidth < SHOP_CONST.WIDTH_MOBILE);
		const isModal = document.querySelector('#cocoaModal').classList.contains('review');
        let data = {};
		switch (type) {
            case 'main': // pc 리뷰 댓글
	            if (isModal) {
					data = $('#_modal_review_form_' + review_code).serializeObject();
					break;
	            }
	            if (isMobile_width) {
		            data = $('.categorize-mobile #' + $form.attr('id')).serializeObject();
	            } else {
		            data = $('.categorize.review-box #' + $form.attr('id')).serializeObject();
	            }
                break;
            case 'sub_form': //pc 리뷰 대댓글
	            if (isModal) {
		            data = $('#sub_review_form_' + i).serializeObject();
		            break;
	            }
	            if (isMobile_width) {
					data = $('.categorize-mobile #sub_review_form_' + i).serializeObject();
	            } else {
					data = $('.categorize.review-box #sub_review_form_' + i).serializeObject();
	            }
                break;
            case 'editor': // pc 리뷰 댓글 수정
	            if (isModal) {
					data = $('#sub_review_editor_form_' + i).serializeObject();
					break;
	            }
                if (isMobile_width) {
		            data = $('.categorize-mobile #sub_review_editor_form_' + i).serializeObject();
	            } else {
		            data = $('.categorize.review-box #sub_review_editor_form_' + i).serializeObject();
	            }
                break;
            case 'mobile': // Mobile 리뷰 댓글
                data = $('#mobile_review_form').serializeObject();
                break;
            case 'mobile_sub_form': // Mobile 리뷰 대댓글
                data = $('#mobile_sub_review_form_' + i).serializeObject();
                break;
            case 'mobile_editor': // Mobile 리뷰 댓글 수정
                data = $('#mobile_sub_review_editor_form_' + i).serializeObject();
                break;
        }
        if (!t.hasClass("btn-writing")) {
            t.addClass("btn-writing");
        }
        $.ajax({
            type: 'POST',
            data: { data: data, review_code: review_code },
            url: ('/shop/add_review_comment.cm'),
            dataType: 'json',
            async: false,
            cache: false,
            success: function (result) {
                if (t.hasClass("btn-writing")) {
                    t.removeClass("btn-writing");
                }
                if (result.msg == 'SUCCESS') {
                    if (load_type == 'modal') {
                        $('#comment_count').text(" " + result.comment_count);
                        getReviewCommentHtml(review_code, 'modal', t);
                    } else {
                        $('.categorize #comment_count_' + review_code).text(" " + result.comment_count);
                        $('.categorize #comment_count_inner_' + review_code).text(" " + result.comment_count);
                        $('.categorize-mobile #comment_count_' + review_code).text(result.comment_count);
                        $('.categorize-mobile #comment_count_inner_' + review_code).text(" " + result.comment_count);
                        getReviewCommentHtml(review_code, 'accordion', t);
                    }
                    $("div[id^='sub_review_image_box_']").hide();
                } else
                    alert(result.msg);
            }
        });
    };
    var EditHide = function (idx) {
        var editor_form = $("._sub_form_editor_" + idx);
        editor_form.hide();
        $('.tools').show();
        editor_form.siblings('._comment_body').show();
        editor_form.closest('.comment_area').siblings().show();
        editor_form.closest('.comment_area').css('padding-top', '');
        editor_form.css('margin-top', '');
    };
    var EditShow = function (idx) {
        var editor_form = $("._sub_form_editor_" + idx);
        editor_form.siblings().hide();
        editor_form.closest('.comment_area').siblings().hide();
        editor_form.closest('.comment_area').css('padding-top', 0);
        editor_form.css('margin-top', 0);
        editor_form.data('show', 'Y');
        editor_form.show();
        autosize.update(editor_form.find('textarea'));
    };
    var reviewFormHide = function () {
        $("._sub_review_form").hide();
    };
    var FormShow = function (idx) {
        var sub_form = $("._sub_form_" + idx);
        sub_form.data('show', 'Y');
        sub_form.show();
        var comment_add_body = sub_form.find('._comment_add_body_' + idx);
        $('body').off('mouseup.sub_comment')
            .on('mouseup.sub_comment', function (e) {
                var $c_target = $(e.target);
                var $s_form = $c_target.closest('._sub_form_' + idx + ', ._show_sub_form_btn_' + idx);
                if ($s_form.length == 0) {
                    var text = comment_add_body.val();
                    sub_form.data('show', 'N');
                    if (text == '') {
                        $('body').off('mouseup.sub_comment');
                        reviewFormHide();
                    }
                }
            });
    };
    var reviewCommentDelete = function (code) {
        if (confirm(LOCALIZE.설명_삭제하시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: code, review_code: review_code },
                url: ('/shop/delete_review_comment.cm'),
                async: false,
                dataType: 'json',
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        if (load_type == 'modal') {
                            $('#comment_count').text(result.comment_count);
                            getReviewCommentHtml(review_code, 'modal', $(this));
                        } else {
                            $('.categorize #comment_count_' + review_code).text(result.comment_count);
                            $('.categorize #comment_count_inner_' + review_code).text(result.comment_count);
                            $('.categorize-mobile #comment_count_' + review_code).text(result.comment_count);
                            $('.categorize-mobile #comment_count_inner_' + review_code).text(result.comment_count);
                            getReviewCommentHtml(review_code, 'accordion', $(this));
                        }
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    return {
        init: function (code, type, device_type) {
            init(code, type, device_type);
        },
        imageUploadInit: function (idx) {
            imageUploadInit(idx);
        },
        getReviewCommentHtml: function (code, type, object) {
            getReviewCommentHtml(code, type, object);
        },
        submit: function (t, type, i) {
            submit(t, type, i);
        },
        Delete: function (code) {
            reviewCommentDelete(code);
        },
        EditShow: function (idx) {
            EditShow(idx);
        },
        EditHide: function (idx) {
            EditHide(idx);
        },
        FormShow: function (idx) {
            FormShow(idx);
        }
    };
}();
var SITE_QNA_COMMENT = function () {
    var $form;
    var $secret;
    var $qna_comment_section;
    var qna_code;
    var init = function (code) {
        qna_code = code;
        var $comment_area = $('.comment_textarea');
        $secret = $('._secret_btn');
        $secret.on('click', function () {
            if ($secret.hasClass('active')) {
                $secret.removeClass('active');
                $('#use_secret_qna').val('N');
            } else {
                $secret.addClass('active');
                $('#use_secret_qna').val('Y');
            }
        });
        $form = $('#qna_form');
        $form.find('#qna_image_upload_btn').setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#qna_image_box").show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#qna_image_box").append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
    };
    var QnaCommentDelete = function (code, is_visible) {
        if (confirm(LOCALIZE.설명_삭제하시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: code, is_visible: is_visible },
                url: ('/shop/delete_qna_comment.cm'),
                async: false,
                dataType: 'json',
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        getQnaCommentHtml(qna_code);
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    var imageUploadInit = function (idx) {
        $form = $('#qna_form');
        $form.find('#qna_image_upload_btn').setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#qna_image_box").show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#qna_image_box").append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        $("#sub_qna_image_box_" + idx).hide();
        $('#sub_qna_image_upload_btn_' + idx).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#sub_qna_image_box_" + idx).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#sub_qna_image_box_" + idx).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        $('#editor_qna_image_upload_btn_' + idx).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#editor_qna_image_box_" + idx).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#editor_qna_image_box_" + idx).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
    };
    var getQnaCommentHtml = function (qna_code) {
        $qna_comment_section = $('#qna_comment_section');
        $.ajax({
            type: 'POST',
            data: { qna_code: qna_code },
            url: ('/ajax/get_qna_comment_list.cm'),
            dataType: 'html',
            cache: false,
            success: function (result) {
                $qna_comment_section.html(result);
            }
        });
    };
    var submit = function (t, type, i) {
        switch (type) {
            case 'main': // 1:1 문의 페이지에서 바로 작성하는 폼
                var data = $form.serializeObject();
                break;
            case 'sub_form': // 등록되어 있는 qna에 답변을 다는 폼
                var data = $('#sub_qna_form_' + i).serializeObject();
                break;
            case 'editor': // 등록되어 있는 qna를 수정하는 폼
                var data = $('#sub_qna_editor_form_' + i).serializeObject();
                break;
        }
        if (!t.hasClass("btn-writing")) {
            t.addClass("btn-writing");
        }
        $.ajax({
            type: 'POST',
            data: { data: data, type: type },
            url: ('/shop/add_qna_comment.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (t.hasClass("btn-writing")) {
                    t.removeClass("btn-writing");
                }
                if (result.msg == 'SUCCESS') {
                    getQnaCommentHtml(qna_code);
                    $("div[id^='sub_qna_image_box_']").hide();
                } else
                    alert(result.msg);
            }
        });
    };
    var EditShow = function (idx) {
        var editor_form = $("._sub_form_editor_" + idx);
        editor_form.siblings().hide();
        editor_form.closest('.comment_area').siblings().hide();
        editor_form.closest('.comment_area').css('padding-top', 0);
        editor_form.css('margin-top', 0);
        editor_form.data('show', 'Y');
        editor_form.show();
        autosize.update(editor_form.find('textarea'));
    };
    var EditHide = function (idx) {
        var editor_form = $("._sub_form_editor_" + idx);
        editor_form.hide();
        $('.tools').show();
        editor_form.siblings('._comment_body').show();
        editor_form.closest('.comment_area').siblings().show();
        editor_form.closest('.comment_area').css('padding-top', '');
        editor_form.css('margin-top', '');
    };
    var qnaFormHide = function () {
        $("._sub_qna_form").hide();
    };
    var FormShow = function (idx) {
        var sub_form = $("._sub_form_" + idx);
        sub_form.data('show', 'Y');
        sub_form.show();
        var comment_add_body = sub_form.find('._comment_add_body_' + idx);
        $('body').off('mouseup.sub_comment')
            .on('mouseup.sub_comment', function (e) {
                var $c_target = $(e.target);
                var $s_form = $c_target.closest('._sub_form_' + idx + ', ._show_sub_form_btn_' + idx);
                if ($s_form.length == 0) {
                    var text = comment_add_body.val();
                    sub_form.data('show', 'N');
                    if (text == '') {
                        $('body').off('mouseup.sub_comment');
                        qnaFormHide();
                    }
                }
            });
    };
    return {
        init: function (code) {
            init(code);
        },
        imageUploadInit: function (idx) {
            imageUploadInit(idx);
        },
        getQnaCommentHtml: function (qna_code) {
            getQnaCommentHtml(qna_code);
        },
        submit: function (t, type, i) {
            submit(t, type, i);
        },
        Delete: function (code, is_visible) {
            QnaCommentDelete(code, is_visible);
        },
        EditShow: function (idx) {
            EditShow(idx);
        },
        EditHide: function (idx) {
            EditHide(idx);
        },
        FormShow: function (idx) {
            FormShow(idx);
        }
    };
}();
var SITE_SHOP_QNA = function () {
    var $qna_wrap;
    var $mobile_qna_wrap;
    var $form;
    var $mobile_form;
    var $comment_body;
    var $qna_image_box;
    var $comment_area;
    var $secret;
    var $m_secret;
    var qna_body;
    var $qna_container;
    var $qna_form;
    var body_input;
    var $show_secret_password;
    var isIOS, isSafari, $fr_m_custom, $write_header, m_sticky_container_trigger_top, $toolbarContainer;
    var init = function (code, qna_secret_type) {
        $qna_wrap = $('._qna_wrap');
        $qna_form = $('#qna_form');
        qna_body = $('#qna_body');
        $qna_container = $('#qna_container');
        $secret = $('._secret_btn');
        $qna_form.find("#qna_image_box").hide();
        body_input = $('#body_input');
        if (qna_secret_type == 'secret') {
            $secret.addClass('active');
            $('._secret').val('Y');
        } else {
            $secret.on('click', function () {
                if ($secret.hasClass('active')) {
                    $secret.removeClass('active');
                    $('._secret').val('N');
                } else {
                    $secret.addClass('active');
                    $('._secret').val('Y');
                }
            });
        }
        if ($('._secret').val() != '') {//수정일 경우 비밀글 체크
            if ($('._secret').val() == 'Y') {
                $secret.addClass('active');
                $('._secret').val('Y');
            } else {
                $secret.removeClass('active');
                $('._secret').val('N');
            }
        }
        if (IE_VERSION < 10) {
            CKEDITOR.replace('qna_body', {
                filebrowserImageUploadUrl: '/ajax/post_image_upload.cm?board_code=' + code
            });
        } else {
            if (android_version() == 4) {
                qna_body.addClass('legacy_webview');
            }
            var image_insert_key2 = 'image_insert_key2';
            setFroala('#qna_body', {
                code: '',
                // 파일 첨부, 비디오, 테이블 제외
                toolbarButtons: {
                    'moreText': {
                        'buttons': ['bold', 'italic', 'underline', 'fontSize', 'textColor', 'strikeThrough', 'backgroundColor', 'clearFormatting', '|', 'align', 'formatOL', 'formatUL', '|', image_insert_key2, 'insertLink', '|', 'undo', 'redo', 'html', 'emoticons'],
                        'buttonsVisible': 50
                    }
                },
                toolbarButtonsMobile: {
                    'moreText': {
                        'buttons': [image_insert_key2, 'insertLink', '|', "fontSize", "bold", "italic", "underline", "strikeThrough", "align", "textColor", "clearFormatting", '|', "formatOL", "formatUL"],
                        'buttonsVisible': 50
                    }
                },
                image_upload_url: "/ajax/post_image_upload.cm",
                image_insert_key: image_insert_key2,
                image_align: 'center',
                image_display: 'block',
                toolbarStickyOffset: 38,
                heightMin: 200,
                heightMax: 600,
                mobile_custom: true,
                linkAlwaysBlank: true
            });
        }
        isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
        isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
        $fr_m_custom = $qna_container.find('._fr-m-custom');
        $write_header = $qna_container.find('._write_header');
        m_sticky_container_trigger_top = $fr_m_custom.offset().top - $fr_m_custom.height();
        $toolbarContainer = $fr_m_custom.find('#toolbarContainer');
        if (isIOS && isSafari) {
            $write_header.css('position', 'absolute');
        }
        var timeoutTime = isIOS && isSafari ? 100 : 10;
        var resize_time;
        resizeStickyContainer();
        $(window).off('scroll.mobile_write resize.mobile_write').on('scroll.mobile_write resize.mobile_write', function () {
            var s_top = $(this).scrollTop();
            if (isIOS && isSafari) {
                $write_header.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 0 });
                if (s_top > m_sticky_container_trigger_top) {
                    $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 0 });
                }
            }
            if (resize_time) {
                clearTimeout(resize_time);
            }
            resize_time = setTimeout(function () {
                resizeStickyContainer();
            }, timeoutTime);
        });
        autosize($('.textarea_block textarea'));
    };
    function resizeStickyContainer() {
        var s_top = $(this).scrollTop();
        if (isIOS && isSafari) {
            $write_header.css({ '-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px' });
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
            $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
            if (s_top > m_sticky_container_trigger_top) {
                $toolbarContainer.css({ '-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px' });
                qna_body.find('.fr-view').css('padding-top', '90px');
            } else {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 'auto' });
                qna_body.find('.fr-view').css('padding-top', '');
            }
        } else {
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
        }
        $toolbarContainer.find('.fr-toolbar').css('width', qna_body.find('.fr-view').width());
        if ($(window).width() >= 768) {
            if ($qna_container.hasClass('bg_on'))
                $qna_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 487);
            else
                $qna_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 180);
        }
    }
    var initMobileQna = function () {
        $mobile_qna_wrap = $('#prod_detail_content_mobile');
        $mobile_form = $mobile_qna_wrap.find('#mobile_qna_form');
        $m_secret = $mobile_form.find('._secret_btn');
        $mobile_form.find("#mobile_qna_image_box").hide();
        $m_secret.on('click', function () {
            if ($m_secret.hasClass('active')) {
                $m_secret.removeClass('active');
                $mobile_form.find('._secret').val('N');
            } else {
                $m_secret.addClass('active');
                $mobile_form.find('._secret').val('Y');
            }
        });
        $mobile_form.find('#mobile_qna_image_upload_btn').setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#mobile_qna_image_box").show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#mobile_qna_image_box").append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        autosize($('.textarea_block textarea'));
    };
    var qnaFormShow = function (t) {
        var sub_form = $("._sub_form_" + t);
        sub_form.data('show', 'Y');
        sub_form.show();
        var comment_add_body = sub_form.find('._comment_add_body_' + t);
        $('body').off('mouseup.sub_comment')
            .on('mouseup.sub_comment', function (e) {
                var $c_target = $(e.target);
                var $s_form = $c_target.closest('._sub_form_' + t + ', ._show_sub_form_btn_' + t);
                if ($s_form.length == 0) {
                    var text = comment_add_body.val();
                    sub_form.data('show', 'N');
                    if (text == '') {
                        $('body').off('mouseup.sub_comment');
                        qnaFormHide();
                    }
                }
            });
    };
    var EditQnaShow = function (t, c, idx) {
        $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            var left = $(window).width() >= 768 ? 200 : ($(window).width() - 325) / 2;
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                CheckSecret(t, secret_pass, function () {
                    window.location.href = "?prod_code=" + c + "&qmode=write&back_url=&idx=" + idx;
                });
                $show_secret_password.hide();
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    var ViewQnaShow = function (t, c, idx, qna_page) {
        $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            var left = $(window).width() >= 768 ? 200 : ($(window).width() - 325) / 2;
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                CheckSecret(t, secret_pass, function () {
                    SITE_SHOP_DETAIL.viewQnaDetail(idx, qna_page);
                    $show_secret_password.hide();
                });
                $show_secret_password.hide();
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    var CheckSecret = function (code, secret_pass, callback) {
        $.ajax({
            type: 'post',
            data: { code: code, secret_pass: secret_pass, type: 'qna' },
            url: '/ajax/check_review_pass.cm',
            dataType: 'json',
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    if (typeof callback == 'function')
                        callback();
                } else {
                    alert(result.msg);
                }
            }
        });
    };
    var qnaEditShow = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.siblings().hide();
        editor_form.data('show', 'Y');
        editor_form.show();
        autosize.update(editor_form.find('textarea'));
    };
    var qnaEditHide = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.hide();
    };
    var qnaFormHide = function () {
        $("._sub_qna_form").hide();
    };
    var qnaDelete = function (code, prod_code, secret_pass, q_p) {
        if (confirm(LOCALIZE.설명_삭제하시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: code, prod_code: prod_code, secret_pass: secret_pass, qna_page: q_p },
                url: ('/shop/delete_qna.cm'),
                dataType: 'json',
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        if (IS_MOBILE) SITE_SHOP_DETAIL.changeContentTab('qna', 0, q_p);
                        else SITE_SHOP_DETAIL.changeContentPCTab('qna', 0, q_p);
                        if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.addCountUserProfileAttr('qnaCount', -1);
                        SITE_SHOP_DETAIL.getReviewQnaCount(prod_code);
                        $.cocoaDialog.close();
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    var qnaModify = function (idx, prod_code, secret_pass, is_book, code) {
        $.ajax({
            type: 'POST',
            data: { idx: idx, prod_code: prod_code, secret_pass: secret_pass, is_book: is_book, code: code },
            url: ('/shop/show_secret_qna.cm'),
            dataType: 'json',
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    qnaEditShow(idx);
                } else
                    alert(result.msg);
            }
        });
    };
    var qnaShow = function (idx, prod_code, secret_pass, is_book, code) {
        $.ajax({
            type: 'POST',
            data: { idx: idx, prod_code: prod_code, secret_pass: secret_pass, is_book: is_book, code: code },
            url: ('/shop/show_secret_qna.cm'),
            dataType: 'json',
            success: function (result) {
                if (result.msg == 'SUCCESS') {
                    $("._comment_body_" + idx).html(result.html);
                    $('._comment_body_' + idx).closest('.comment_area').find('#_show_content_btn').hide();		// 보기 버튼 제거
                    if (result.isSubComment) {
                        for (var i in result.sub_comment) {
                            var sub_data = result.sub_comment[i];
                            $("._comment_child_" + idx + "_" + sub_data.idx).html(sub_data.html);
                        }
                    }
                } else
                    alert(result.msg);
            }
        });
    };
    var qnaConfirmShow = function (e, idx, prod_code, type, code) {
        $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            var left = $(window).width() >= 768 ? 200 : ($(window).width() - 325) / 2;
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                $show_secret_password.hide();
                switch (type) {
                    case 'show':
                        qnaShow(idx, prod_code, secret_pass, 'N', code);
                        break;
                    case 'modify':
                        qnaModify(idx, prod_code, secret_pass, 'N', code);
                        break;
                    case 'delete':
                        qnaDelete(code, prod_code, secret_pass);
                        break;
                }
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    var imageUploadInit = function (n) {
        $("#sub_qna_image_box_" + n).hide();
        $('#sub_qna_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#sub_qna_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#sub_qna_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        $('#editor_qna_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#editor_qna_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#editor_qna_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
    };
    var submit = function () {
        if (IE_VERSION < 10) {
            var body = CKEDITOR.instances.qna_body.getData();
            body_input.val(body);
            $qna_form.submit();
        } else {
            if (qna_body.hasClass('fr-code-view'))
                FroalaEditor('#qna_body').codeView.toggle();
            var body = FroalaEditor('#qna_body').html.get(true);
            body_input.val(body);
            $qna_form.submit();
        }
    };
    var qnaCancel = function () {
        if (isIOS && isSafari) {
            var s_top = $(this).scrollTop();
            $write_header.css({ '-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': 0 });
            $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
            $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
            if (s_top > m_sticky_container_trigger_top) {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': $write_header.height() + 'px' });
            } else {
                $toolbarContainer.css({ '-webkit-transition': 'none', 'transition': 'none', 'top': 'auto' });
            }
        }
        history.go(-1);
    };
    var createHtml = function (prod_idx, review_page, qna_page, paging_on) {
        const isMobile_width = (window.innerWidth < SHOP_CONST.WIDTH_MOBILE);
        const review_url = isMobile_width ? "/shop/prod_qna_mobile_html.cm" : "/shop/prod_qna_pc_html.cm";
        $qna_wrap = $('._qna_wrap');
        if ($qna_wrap.length) {
            var is_cache = false;
            var callback = function (result) {
                $qna_wrap.html(result);
                if (!is_cache) IMWEB_SESSIONSTORAGE.set(`${isMobile_width ? "PROD_QNA_MOBILE_" : "PROD_QNA_PC_"}` + prod_idx + "_" + review_page + '_' + qna_page, result.replace(/\t+/g, '').trim(), 60);
            };
            var html = IMWEB_SESSIONSTORAGE.get(`${isMobile_width ? "PROD_QNA_MOBILE_" : "PROD_QNA_PC_"}` + prod_idx + "_" + review_page + '_' + qna_page);
            if (html) {
                is_cache = true;
                callback(html);
            } else {
                $.ajax({
                    type: 'POST',
                    data: { prod_idx: prod_idx, review_page: review_page, qna_page: qna_page },
                    url: review_url,
                    dataType: 'html',
                    cache: false,
                    success: callback
                });
            }
        }
    };
    var qnaHide = function (t, c, q_p) {
        if (confirm(LOCALIZE.설명_숨기시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: t, prod_code: c, is_visible: false },
                url: ('/shop/delete_qna.cm'),
                dataType: 'json',
                cache: false,
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        if (IS_MOBILE) SITE_SHOP_DETAIL.changeContentTab('qna', q_p);
                        else SITE_SHOP_DETAIL.changeContentPCTab('qna', q_p);
                        if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.addCountUserProfileAttr('qnaCount', -1);
                        $.cocoaDialog.close();
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    var qnaDeleteShow = function (qna_code, prod_code) {
        var $show_secret_password = $('#show_secret_password');
        var $show_link = $(event.target);
        if ($show_secret_password.length == 0) {
            var left = $(window).width() >= 768 ? 200 : ($(window).width() - 325) / 2;
            $show_secret_password = $('
').hide();
            $show_link.after($show_secret_password);
        }
        $show_secret_password.find('input').val('');
        $show_secret_password.show();
        $show_secret_password.off('click', '._confirm')
            .on('click', '._confirm', function () {
                var secret_pass = $show_secret_password.find('input').val();
                CheckSecret(qna_code, secret_pass, function () {
                    qnaDelete(qna_code, prod_code, secret_pass);
                });
                $show_secret_password.hide();
            });
        $('body').off('mousedown.show_secret')
            .on('mousedown.show_secret', function (e) {
                var $tmp = $(e.target).closest('#show_secret_password');
                if ($tmp.length == 0) {
                    $show_secret_password.hide();
                    $('body').off('click.show_secret');
                }
            });
    };
    return {
        init: function (code, qna_secret_type) {
            init(code, qna_secret_type);
        },
        initMobileQna: function () {
            initMobileQna();
        },
        submit: function () {
            submit();
        },
        qnaCancel: function () {
            qnaCancel();
        },
        FormShow: function (t) {
            qnaFormShow(t);
        },
        EditQnaShow: function (t, c, idx) {
            EditQnaShow(t, c, idx);
        },
        ViewQnaShow: function (t, c, idx, qna_page) {
            ViewQnaShow(t, c, idx, qna_page);
        },
        Delete: function (code, prod_code, q_p) {
            qnaDelete(code, prod_code, q_p);
        },
        EditShow: function (t) {
            qnaEditShow(t);
        },
        EditHide: function (t) {
            qnaEditHide(t);
        },
        imageUploadInit: function (n) {
            imageUploadInit(n);
        },
        createHtml: function (prod_idx, review_page, qna_page, paging_on) {
            createHtml(prod_idx, review_page, qna_page, paging_on);
        },
        confirmShow: function (e, idx, prod_code, type, code) {
            qnaConfirmShow(e, idx, prod_code, type, code);
        },
        Hide: function (t, c, q_p) {
            qnaHide(t, c, q_p);
        },
        DeleteShow: function (qna_code, prod_code) {
            qnaDeleteShow(qna_code, prod_code);
        },
    };
}();
var SITE_PERSONAL_QNA = function () {
    var $personal_qna_wrap;
    var $mobile_qna_wrap;
    var $form;
    var $mobile_form;
    var $comment_body;
    var $qna_image_box;
    var $comment_area;
    var $secret;
    var init = function () {
        $form = $('#qna_form');
        $secret = $form.find('._secret');
        $secret.on('click', function () {
            if ($secret.hasClass('active')) {
                $secret.removeClass('active');
                $form.find('#secret').val('N');
            } else {
                $secret.addClass('active');
                $form.find('#secret').val('Y');
            }
        });
        $('#qna_image_upload_btn').setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#qna_image_box").show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#qna_image_box").append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        autosize($('.textarea_block textarea'));
    };
    var submit = function (t, type, i) {
        switch (type) {
            case 'main': // 1:1 문의 페이지에서 바로 작성하는 폼
                var data = $form.serializeObject();
                break;
            case 'sub_form': // 등록되어 있는 qna에 답변을 다는 폼
                var data = $('#sub_qna_form_' + i).serializeObject();
                break;
            case 'editor': // 등록되어 있는 qna를 수정하는 폼
                var data = $('#sub_qna_editor_form_' + i).serializeObject();
                break;
        }
        if (!t.hasClass("btn-writing")) {
            t.addClass("btn-writing");
        }
        $.ajax({
            type: 'POST',
            data: { data: data, type: type, personal_qna: 'Y' },
            url: ('/shop/add_qna.cm'),
            dataType: 'json',
            cache: false,
            success: function (result) {
                if (t.hasClass("btn-writing")) {
                    t.removeClass("btn-writing");
                }
                if (result.msg == 'SUCCESS') {
                    createHtml(result.page);
                } else
                    alert(result.msg);
            }
        });
    };
    var Delete = function (code, prod_code) {
        if (confirm(LOCALIZE.설명_삭제하시겠습니까())) {
            $.ajax({
                type: 'POST',
                data: { code: code, prod_code: prod_code },
                url: ('/shop/delete_qna.cm'),
                dataType: 'json',
                success: function (result) {
                    if (result.msg == 'SUCCESS') {
                        if (typeof CHANNEL_PLUGIN != 'undefined') CHANNEL_PLUGIN.addCountUserProfileAttr('qnaCount', -1);
                        createHtml();
                    } else
                        alert(result.msg);
                }
            });
        }
    };
    var FormShow = function (t) {
        var sub_form = $("._sub_form_" + t);
        sub_form.data('show', 'Y');
        sub_form.show();
        var comment_add_body = sub_form.find('._comment_add_body_' + t);
        $('body').off('mouseup.sub_comment')
            .on('mouseup.sub_comment', function (e) {
                var $c_target = $(e.target);
                var $s_form = $c_target.closest('._sub_form_' + t + ', ._show_sub_form_btn_' + t);
                if ($s_form.length == 0) {
                    var text = comment_add_body.val();
                    sub_form.data('show', 'N');
                    if (text == '') {
                        $('body').off('mouseup.sub_comment');
                        FormHide();
                    }
                }
            });
    };
    var FormHide = function () {
        $("._sub_qna_form").hide();
    };
    var EditShow = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.siblings('.block-postmeta').find('.write').hide();
        editor_form.siblings('.block-postmeta').find('.comment_area').hide();
        editor_form.data('show', 'Y');
        editor_form.show();
    };
    var EditHide = function (t) {
        var editor_form = $("._sub_form_editor_" + t);
        editor_form.hide();
        editor_form.siblings('.block-postmeta').find('.write').show();
        editor_form.siblings('.block-postmeta').find('.comment_area').show();
    };
    var imageUploadInit = function (n) {
        $("#sub_image_box_" + n).hide();
        $('#sub_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#sub_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#sub_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
        $('#editor_image_upload_btn_' + n).setUploadImage({
            url: '/shop/upload_image.cm',
            dropZone: 'icon_img_upload_wrap',
            singleFileUploads: true,
            formData: { temp: 'Y' }
        }, function (res, data) {
            $("#editor_image_box_" + n).show();
            $.each(data, function (e, tmp) {
                if (tmp.error == "" || tmp.error == null) {
                    var url = CDN_UPLOAD_URL + tmp.url;
                    var html = '
';
                    $("#editor_image_box_" + n).append(html);
                } else {
                    alert(tmp.error);
                }
            });
        });
    };
    var createHtml = function (page) {
        $personal_qna_wrap = $('._personal_qna_wrap');
        $.ajax({
            type: 'POST',
            data: { page: page },
            url: ('/shop/personal_qna_list.cm'),
            dataType: 'html',
            cache: false,
            success: function (result) {
                $personal_qna_wrap.html(result);
            }
        });
    };
    return {
        init: function () {
            init();
        },
        submit: function (t, type, i) {
            submit(t, type, i);
        },
        Delete: function (code, prod_code) {
            Delete(code, prod_code);
        },
        FormShow: function (t) {
            FormShow(t);
        },
        EditShow: function (t) {
            EditShow(t);
        },
        EditHide: function (t) {
            EditHide(t);
        },
        imageUploadInit: function (n) {
            imageUploadInit(n);
        },
        createHtml: function (page) {
            createHtml(page);
        }
    };
}();