Files
sake/src/main/webapp/WEB-INF/views/comm/Include.jsp
2026-07-16 02:26:31 +09:00

528 lines
22 KiB
Plaintext

<%@ page import="org.springframework.util.ObjectUtils" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<spring:eval expression="@environment.getProperty('spring.profiles.active')" var="profiles"/>
<%--
Class Name : include.jsp
Description : 통합관리자 CSS 및 JS 공통 include
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2023-12-14 최범식 최초 생성
--%>
<%-- CSS --%>
<!-- 모든 사이트 공통 -->
<link rel="stylesheet" href="<c:url value='/pc/css/default.css'/>">
<!-- 네이버페이 확인용 css(실제 API 적용할땐 삭제하시면 됩니다.) -->
<link rel="stylesheet" href="<c:url value='/pc/css/pay.css'/>">
<!-- jquery -->
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<!-- 슬라이드 -->
<link rel="stylesheet" type="text/css" href="<c:url value='/pc/vendor/slick/slick.css'/>">
<link rel="stylesheet" type="text/css" href="<c:url value='/pc/vendor/slick/slick-theme.css'/>">
<script src="<c:url value='/pc/vendor/slick/slick.min.js'/>"></script>
<!-- 실시간검색 -->
<script src="<c:url value='/pc/vendor/jquery.vticker.js'/>"></script>
<!-- 커스텀 셀렉트 박스 -->
<script src="<c:url value='/pc/vendor/jquery-nice-select/jquery.nice-select.min.js'/>"></script>
<link rel="stylesheet" href="<c:url value='/pc/vendor/jquery-nice-select/nice-select.css'/>">
<!-- 제이쿼리 모달 -->
<script src="<c:url value='/pc/vendor/jquery-modal/jquery.modal.min.js'/>"></script>
<link rel="stylesheet" href="<c:url value='/pc/vendor/jquery-modal/jquery.modal.min.css'/>">
<!-- 제이쿼리 모달 -->
<script src="<c:url value='/pc/vendor/dropzone/dropzone.min.js'/>"></script>
<link rel="stylesheet" href="<c:url value='/pc/vendor/dropzone/dropzone.min.css'/>">
<!-- 스크립트 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="<c:url value='/js/sopmal/common.js'/>"></script>
<script>
(function () {
var badgeMap = {};
function applyBadge(element) {
var badge = badgeMap[element.dataset.badgeCd.toLowerCase()];
if (!badge) { return; }
element.textContent = badge.cdNm || element.textContent;
if (badge.fontColor) { element.style.setProperty('color', badge.fontColor, 'important'); }
if (badge.bgColor) { element.style.setProperty('background-color', badge.bgColor, 'important'); }
if (badge.borderColor) { element.style.setProperty('border-color', badge.borderColor, 'important'); }
}
function applyBadges(root) {
if (root.nodeType === Node.ELEMENT_NODE && root.matches('.product-badge[data-badge-cd]')) {
applyBadge(root);
}
if (root.querySelectorAll) {
root.querySelectorAll('.product-badge[data-badge-cd]').forEach(applyBadge);
}
}
function initialize() {
fetch('/sopmal/goods/selectGoodsBadgeList')
.then(function (response) { return response.ok ? response.json() : []; })
.then(function (badgeList) {
badgeList.forEach(function (badge) { badgeMap[badge.cd.toLowerCase()] = badge; });
applyBadges(document);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) { mutation.addedNodes.forEach(applyBadges); });
}).observe(document.documentElement, { childList: true, subtree: true });
});
}
document.addEventListener('DOMContentLoaded', initialize);
}());
</script>
<script src="<c:url value='/pc/js/script.js'/>" defer></script>
<script src="<c:url value='/js/sopmal/gcone.js'/>"></script>
<%--Web-App연동 스크립트--%>
<script src="/mobile/js/bnft/common/Common_app.js" defer=""></script>
<!-- 파일 업로드 -->
<script src="<c:url value='/js/sopmal/fileupload_comm.js'/>"></script>
<!--ckeditor-->
<script src="<c:url value='/ckeditor/ckeditor.js'/>"></script>
<script src="<c:url value='/ckeditor/uploadAdapter.js'/>"></script>
<!-- CK editor -->
<link rel="stylesheet" href="<c:url value='/ckeditor/content.css'/>">
<%-- CK editor 적용 시 width 설정 --%>
<style type="text/css">
.ck.ck-editor {
width: 100%;
}
</style>
<!-- Date Picker -->
<link rel="stylesheet" type="text/css" href="<c:url value='/pc/vendor/jquery-ui/jquery-ui.min.css'/>">
<link rel="stylesheet" type="text/css" href="<c:url value='/pc/vendor/jquery-ui/jquery-ui.structure.css'/>">
<script src="<c:url value='/pc/vendor/jquery-ui/jquery-ui.min.js'/>"></script>
<!-- popModal -->
<link rel="stylesheet" type="text/css" href="<c:url value='/pc/vendor/popModal/popModal.min.css'/>">
<script src="<c:url value='/pc/vendor/popModal/popModal.min.js'/>"></script>
<c:set var="meta" value="${sopmallInfo.shopInfo}"/>
<!--파비콘,메타-->
<%--파비콘--%>
<c:choose>
<c:when test="${fn:startsWith(meta.fviconCours, '/')}">
<c:set var="fviconCours" value="${meta.fviconCours}"/>
</c:when>
<c:otherwise>
<c:set var="fviconCours" value="/${meta.fviconCours}"/>
</c:otherwise>
</c:choose>
<%--메타--%>
<%--상품 타이틀 사용 여부 Y이면--%>
<c:choose>
<c:when test = "${sopmallInfo.shopInfo.metaGoodsAt eq 'Y' and fn:contains(accessUri,'/sopmal/goods/selectGoodsDtl')}">
<c:set var = "metaGoodsSj" value="${sopmallInfo.shopInfo.metaGoodsSj}"/>
<c:set var = "metaGoodsDc" value="${sopmallInfo.shopInfo.metaGoodsDc}"/>
<c:set var = "metaGoodsKwrd" value="${sopmallInfo.shopInfo.metaGoodsKwrd}"/>
<%--상품 명 있으면 set--%>
<c:choose>
<c:when test = "${not empty resultMap.goodsDtl.goodsNm}">
<c:set var="goodsNm" value="${resultMap.goodsDtl.goodsNm}"/>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{goodsNm}', goodsNm)}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{goodsNm}', goodsNm)}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{goodsNm}', goodsNm)}"/>
</c:when>
<c:otherwise>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{goodsNm}', '')}"/>
<c:set var = "metaGoodsDc" value="${fn:replace(metaGoodsDc, '{goodsNm}', '')}"/>
<c:set var = "metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{goodsNm}', '')}"/>
</c:otherwise>
</c:choose>
<%--짧은 설명 있으면 set--%>
<c:choose>
<c:when test = "${not empty resultMap.goodsDtl.srtDc}">
<c:set var="srtDc" value="${resultMap.goodsDtl.srtDc}"/>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{srtDc}', srtDc)}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{srtDc}', srtDc)}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{srtDc}', srtDc)}"/>
</c:when>
<c:otherwise>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{srtDc}', '')}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{srtDc}', '')}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{srtDc}', '')}"/>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test = "${not empty resultMap.goodsDtl.reprsntDc}">
<c:set var="reprsntDc" value="${resultMap.goodsDtl.reprsntDc}"/>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{reprsntDc}', reprsntDc)}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{reprsntDc}', reprsntDc)}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{reprsntDc}', reprsntDc)}"/>
</c:when>
<c:otherwise>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{reprsntDc}', '')}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{reprsntDc}', '')}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{reprsntDc}', '')}"/>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test = "${not empty resultMap.goodsDtl.kwrd}">
<c:set var="kwrd" value="${resultMap.goodsDtl.kwrd}"/>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{kwrd}', kwrd)}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{kwrd}', kwrd)}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{kwrd}', kwrd)}"/>
</c:when>
<c:otherwise>
<c:set var = "metaGoodsSj" value="${fn:replace(metaGoodsSj, '{kwrd}', '')}"/>
<c:set var="metaGoodsDc" value="${fn:replace(metaGoodsDc, '{kwrd}', '')}"/>
<c:set var="metaGoodsKwrd" value="${fn:replace(metaGoodsKwrd, '{kwrd}', '')}"/>
</c:otherwise>
</c:choose>
<title>
<c:choose>
<c:when test="${profiles eq 'local'}">(로컬) </c:when>
<c:when test="${profiles eq 'dev'}">(개발) </c:when>
<c:otherwise></c:otherwise>
</c:choose>
${metaGoodsSj}
</title>
<meta name="description" content="<c:out value="${metaGoodsDc}"/>">
<meta name="keywords" content="<c:out value="${metaGoodsKwrd}"/>">
<meta property="og:title" content="<c:out value="${metaGoodsSj}"/>">
<meta property="og:description" content="<c:out value="${metaGoodsDc}"/>">
</c:when>
<c:otherwise>
<title>
<c:choose>
<c:when test="${profiles eq 'local'}">(로컬) </c:when>
<c:when test="${profiles eq 'dev'}">(개발) </c:when>
<c:otherwise></c:otherwise>
</c:choose>
<c:out value="${meta.metaSj}"/>
</title>
<meta name="description" content="<c:out value="${meta.metaDc}"/>">
<meta name="keywords" content="<c:out value="${meta.metaKwrd}"/>">
<meta property="og:title" content="<c:out value="${meta.metaSj}"/>">
<meta property="og:description" content="<c:out value="${meta.metaDc}"/>">
</c:otherwise>
</c:choose>
<link rel="icon" href="<c:out value="${fviconCours}"/>">
<meta name="robots" content="index,follow"/>
<%--상품상세 일 경우 파라미터 포함 전체 경로 --%>
<c:set var="ogUrl" value=""/>
<c:choose>
<c:when test="${fn:contains(accessUri,'/sopmal/goods/selectGoodsDtl')}">
<c:set var="ogUrl" value="${meta.pcDomnAdres}${accessUri}?goodsInnb=${pageContext.request.getParameter('goodsInnb')}"/>
</c:when>
<c:otherwise>
<c:set var="ogUrl" value="${meta.pcDomnAdres}${accessUri}"/>
</c:otherwise>
</c:choose>
<meta property="og:url" content="<c:out value="${ogUrl}"/>">
<meta property="og:site_name" content="<c:out value="${meta.sopmalNm}"/>">
<%--상품 상세일 경우 상품 이미지, 그외 로고 --%>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<c:set var="ogImage" value=""/>
<c:choose>
<c:when test="${fn:contains(accessUri,'/sopmal/goods/selectGoodsDtl')}">
<c:set var="ogImage" value="${cdnurl}${fn:split(resultMap.goodsDtl.img, '|')[0]}"/>
</c:when>
<c:otherwise>
<c:set var="ogImage" value="${ cdnurl }${ topBarInfo.topbar.topFilCours }/${ topBarInfo.topbar.topSysFilNm }"/>
</c:otherwise>
</c:choose>
<meta property="og:image" content="<c:out value="${ogImage}"/>">
<meta property="og:type" content="website">
<spring:eval expression="@environment.getProperty('meta-content.google.'+'${sopmallInfo.shopInfo.sopmalCd}')"
var="googleMeta"/>
<spring:eval expression="@environment.getProperty('meta-content.naver.'+'${sopmallInfo.shopInfo.sopmalCd}')"
var="naverMeta"/>
<spring:eval expression="@environment.getProperty('meta-content.facebook.'+'${sopmallInfo.shopInfo.sopmalCd}')"
var="facebookMeta"/>
<meta name="google-site-verification" content="${googleMeta}"/>
<meta name="naver-site-verification" content="${naverMeta}"/>
<meta name="facebook-domain-verification" content="${facebookMeta}"/>
<script type="text/javascript">
/*****************************************************************
* 로딩이미지
****************************************************************/
const loding = function (isShow) {
if (isShow) {
$('.loadingImg').show();
} else {
$('.loadingImg').hide();
}
};
$.ajaxSetup({
beforeSend: function (jqXhr, settins) {
jqXhr.setRequestHeader('AJAX', true);
$("#overlay").fadeIn();
loding(true);
},
complete: function () {
//동시에 여러개의 AJAX가 수행될 경우를 대비하여 delay를 설정
setTimeout(function () {
$("#overlay").fadeOut();
loding(false);
}, 500);
},
error: function (data, status, error) {
fn_ajax_error(data, status, error);
}
});
//ajax error 공통 처리 함수
//* 개별처리 필요 할 시 공통 함수 선언 후 개별 처리 할 수 있음
function fn_ajax_error(data, status, error) {
$("#overlay").fadeOut();
loding(true);
console.log(data);
if (data?.responseJSON?.resBody?.message != null) {
if (fn_check_json(data.responseJSON.resBody.message)) {
const errorObject = JSON.parse(data.responseJSON.resBody.message);
console.log(errorObject);
if (!errorObject) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (!errorObject.errorMsg) {
alert('<spring:message code="error.internal-server"/>');
} else {
alert(errorObject.errorMsg);
let isMtched = false;
$('.main').eq(0).find('input,select,textarea').each(function () {
for (let idx = 0; idx < errorObject.errorFields.length; idx++) {
if (errorObject.errorFields[idx].indexOf($(this).attr('name')) >= 0) {
isMtched = true;
break;
}
}
if (isMtched) {
$(this).focus();
return false;
}
});
}
}
} else {
if (data.responseJSON.resBody.message) {
alert(data.responseJSON.resBody.message);
}else {
alert('<spring:message code="error.internal-server"/>');
}
}
}
if (data?.responseJSON?.resBody?.result != null) {
if (fn_check_json(data.responseJSON.resBody.result)) {
const errorObject = JSON.parse(data.responseJSON.resBody.result);
console.log(errorObject);
if (!errorObject) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (!errorObject.errorMsg) {
alert('<spring:message code="error.internal-server"/>');
} else {
alert(errorObject.errorMsg);
let isMtched = false;
$('.main').eq(0).find('input,select,textarea').each(function () {
for (let idx = 0; idx < errorObject.errorFields.length; idx++) {
if (errorObject.errorFields[idx].indexOf($(this).attr('name')) >= 0) {
isMtched = true;
break;
}
}
if (isMtched) {
$(this).focus();
return false;
}
});
}
}
} else {
if (data.responseJSON.resBody.result) {
alert(data.responseJSON.resBody.result);
} else {
alert('<spring:message code="error.internal-server"/>');
}
}
}
else if (data.status !== 200) {
if (data.status !== 0) {
if(data.responseJSON.resBody.result){
const result = JSON.parse(data.responseJSON.resBody.result);
alert(result.errorMsg);
}else{
alert('<spring:message code="error.internal-server"/>');
}
}
}
}
</script>
<%--광고스크립트--%>
<%--광고스크립트 공통--%>
<script src="<c:url value='/js/adscript/common/adscript_common.js'/>"></script>
<%--광고스크립트 광고 매체별--%>
<script src="<c:url value='/js/adscript/admedia/adscirpt_mobion.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_adn2dot0.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_criteo.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_googleAds.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_googleAnalytics.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_googleTagManager.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_kakaoMoments.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_meta.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_naverSrchAds.js'/>"></script>
<script src="<c:url value='/js/adscript/admedia/adscript_tgscript.js'/>"></script>
<%--광고스크립트 트리거 액션--%>
<script src="<c:url value='/js/adscript/trigger/adscript_trigger.js'/>"></script>
<%--광고 스크립트 실행 스크립트--%>
<script src="<c:url value='/js/adscript/adscript.js'/>"></script>
<%--theme적용--%>
<link rel="stylesheet" type="text/css" href="${sopmallInfo.themaPath}">
<script>
<%--장바구니 갯수 조회--%>
fn_reflesh_cart_cnt()
$(document).ready(function () {
/*비밀번호 변경 알림 여부 확인*/
const url = '<c:url value="/sopmal/mbr/selectPasswordChng"/>';
const originalUrl = window.location.href;
let passwordAt = '<%=(String)session.getAttribute("passwordChngDeAt")%>'
if (passwordAt === 'Y') {
location.href = url + '?originalUrl=' + encodeURIComponent(originalUrl);
}
/*연령확인 여부 확인*/
let ageChked = getCookieValue("ageChk");
if(!ageChked) {
fn_open_modal(
'#ageChkPopupDiv',
'#ageChkPopup',
'/sopmal/main/selectAgeChkPopup'
);
}
})
</script>
<%--광고스크립트 정보--%>
<input type="hidden" id="adScriptDeviceTy" value="${deviceType}"/>
<% String adscriptMbrId = "";
if (!ObjectUtils.isEmpty(session.getAttribute("adscriptMbrId"))) {
adscriptMbrId = session.getAttribute("adscriptMbrId").toString();
request.setAttribute("adscriptMbrId", adscriptMbrId);
}%>
<input type="hidden" id="adscriptMbrId" value="${adscriptMbrId}"/>
<div id="mbrMarktClauseAgreeDiv"></div>
<div id="ageChkPopupDiv"></div>
<script>
/*최초 로그인시 마케팅 수신동의를 받지 않았을 경우 마케팅 수신동의 팝업 띄우기*/
$(document).ready(function () {
const name = 'marktAgreeAt'
const cookieValue = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
const agreeAt = cookieValue ? cookieValue[2] : null;
//현재경로
let locationUrl = window.location.pathname;
//마케팅 수신동의 여부가 없으면 마케팅 수신동의 여부 팝업 띄우기
//회원 주문서 작성페이지에는 미노출함
if (agreeAt === 'N' && !locationUrl.includes("selectMbrPurchsForm")) {
document.cookie = 'marktAgreeAt=P; path=/'
//해당팝업이 오픈된건 마케팅수신동의여부가 없어서 열림
const stplatDvCd = '05'
$.ajax({
type: 'post',
url: "/sopmal/mbr/selectMbrMarktAgreePopup",
data: {stplatDvCd: stplatDvCd},
success: function (data) {
$('#mbrMarktClauseAgreePopup').remove();
$('#mbrMarktClauseAgreeDiv').html(data)
$('#mbrMarktClauseAgreePopup').modal()
}
});
}
//회원 주문서 작성페이지에는 미노출 처리
if (locationUrl.includes("selectMbrPurchsForm")) {
document.cookie = 'marktAgreeAt=P; path=/'
}
})
//광고 수신동의여부 수정
function fn_global_mbr_markt_agree_at(agreeAt) {
//광고수신동의 여부 수정
$.ajax({
type: 'post',
url: "/sopmal/mbr/updateMarkRecptnAgreUpdt",
data: {marktRecptnAgreAt: agreeAt},
success: function (data) {
console.log(data)
const result = JSON.parse(data.resBody.result)
//신규회원가입쿠폰 발행되었을 경우 메시지
if (result.status === '0') {
alert(result.message);
}
}
});
}
//쿠키 값 가져오기
const getCookieValue = function(name) {
let matches = document.cookie.match(
new RegExp('(?:^|; )' + name + '=([^;]*)')
);
return matches ? matches[1] : null;
}
</script>
<!--로딩영역-->
<div class="loadingImg" style="display:none; position: relative; z-index: 1010;">
<div class="loding_popup_wrap"><img src="/mobile/images/loading.svg" alt="loading"></div>
</div>