////////////////////////////////////////////////////////////////////////////////////////
//Document Ready
////////////////////////////////////////////////////////////////////////////////////////
function execDocReady() {
var pluginGroups = [
["../reference/light-blue/lib/vendor/jquery.ui.widget.js", "../reference/lightblue4/docs/lib/widgster/widgster.js"],
["../reference/lightblue4/docs/lib/bootstrap-select/dist/js/bootstrap-select.min.js"],
["../../cover/js/util/authorize.js"],
[
"../cover/css/blog/base.css",
"../cover/css/blog/header.css",
"../cover/css/blog/carousel.css",
"../cover/css/blog/category-styles.css",
"../cover/css/blog/content-sections.css",
"../cover/css/blog/responsive-main.css",
"../cover/css/blog/tech-sections.css",
"../cover/css/blog/special-sections.css",
"../cover/css/blog/widgets-enhancement.css"
]
// 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
];
loadPluginGroupsParallelAndSequential(pluginGroups)
.then(function () {
console.log("모든 플러그인 로드 완료");
$(".widget").widgster();
$("#sidebar").hide();
$(".wrap").css("margin-left", 0);
$("#footer").load("/cover/html/template/landing-footer.html");
// 최신 아티클 섹션 초기화
initializeRecentArticles();
// 인기 컨텐츠(블로그) 섹션 초기화
initializePopularBlogSection();
// 블로그 페이지의 마지막 섹션 초기화
updateBlogList();
initializeHotKeywordList();
initializeRecommendWidget();
initializeCrudButtonDisplay();
// -------------------------------------------------
defineEvents();
defineSearchFormEvent();
defineBlogPageEvents();
})
.catch(function (error) {
console.error(error);
});
}
const globalOnErrorImageURL = "/cover/img/img-onerror.png";
// 여러 곳에서 사용하는 공통 이벤트 정의
function defineEvents() {
function onHoverZoomInImage() {
$(".blog-card").hover(
function () {
$(this).css("box-shadow", "0 4px 20px rgba(0,0,0,0.15)");
$(this).css("transform", "translateY(-2px)");
},
function () {
$(this).css("box-shadow", "none");
$(this).css("transform", "translateY(0)");
}
);
}
onHoverZoomInImage();
}
// 블로그 검색용 전역 파라미터
var isLoading = false;
// var searchQuery = "";
var afterCount = 0;
var hasMoreData = true;
var currentSearchAfter = [];
var blogSearchComponents = (function () {
return {
render: function (articleList) {
$(".blog-search-section").html(
articleList.map((article, index) => {
return createPurchaseArticleHTML(article, index);
})
);
// 최신, 인기, 우측 위젯, 페이지 리스트를 숨김처리해야 합니다.
$(".row").find(".recent-article-container, .popular-content-container, .posts-container.well, .widget-card, #recommend-widget").hide();
},
onSearch: function (_searchAfter, _blogContents, _append) {
var SIZE = 5;
var params = {
size: SIZE,
searchAfter: _searchAfter
};
if (_blogContents) {
params.c_blog_contents = _blogContents;
} else {
// 기존 숨겼던 섹션들을 전부 보여주고 검색 결과 영역을 비웁니다.
$(".row").find(".recent-article-container, .popular-content-container, .posts-container.well, .widget-card, #recommend-widget").show();
$(".blog-search-section").empty();
return;
}
$.ajax({
url: "/auth-anon/api/arms/blog/searchBlogList.do",
type: "GET",
data: params,
beforeSend: function () {
// 로직
},
success: function (data) {
const { searchAfter, totalHits, blogEntities } = data;
currentSearchAfter = searchAfter || [];
if (!blogEntities || blogEntities.length === 0) {
appendNoContentMessage(".blog-search-section", params.c_blog_contents);
$(".row").find(".recent-article-container, .popular-content-container, .posts-container.well, .widget-card, #recommend-widget").hide();
return;
}
blogSearchComponents.render(blogEntities);
},
error: function () {
appendNoContentMessage(".blog-search-section", params.c_blog_contents);
}
});
}
};
})();
function defineSearchFormEvent() {
$("#blogSearchForm").on("keydown", function (e) {
if (e.key === "Enter" || e.keyCode === 13) {
blogSearchComponents.onSearch(currentSearchAfter, $("#blogSearchInput").val(), false);
}
});
}
function defineBlogPageEvents() {
// 동적 아티클 클릭 이벤트 (이전자 작업으로 확인 필요)
// 동적으로 생성되는 게시글에 대한 이벤트 위임
$(document).on("click", "[data-article-id]", function (e) {
// 공유 버튼 등 내부 버튼 클릭 시 이벤트 전파 방지
if ($(e.target).closest(".post-share, .share-btn").length > 0) {
return;
}
e.preventDefault();
const articleId = $(this).attr("data-article-id");
if (articleId) {
// 블로그 상세 페이지로 이동
window.location.href = `template.html?page=blogDetail&id=${articleId}`;
}
});
// 게시글에 커서 스타일 추가
$(document).on("mouseenter", "[data-article-id]", function () {
$(this).css("cursor", "pointer");
});
// 공유 버튼 클릭 이벤트
$(document).on("click", ".share-btn", function (e) {
e.preventDefault();
e.stopPropagation();
var articleElement = $(this).closest("[data-article-id]");
var articleId = articleElement.data("article-id");
var title = articleElement.find(".post-title h3").text();
var url = window.location.origin + "/cover/template.html?page=blogDetail&id=" + articleId;
// 공유 기능 구현
if (navigator.share) {
navigator
.share({
title: title,
url: url
})
.then(() => {
console.log("공유 완료");
})
.catch((error) => {
console.log("공유 실패:", error);
fallbackShare(title, url);
});
} else {
fallbackShare(title, url);
}
});
// 더보기 버튼 클릭 이벤트
$(document).on("click", ".load-more-btn", function (e) {
e.preventDefault();
var $btn = $(this);
var originalText = $btn.find("span").text();
// 로딩 상태로 변경
$btn.prop("disabled", true);
$btn.find("span").text("로딩 중...");
$btn.find("i").removeClass("fa-chevron-down").addClass("fa-spinner fa-spin");
// 실제 구현 시 AJAX로 추가 게시물 로드
setTimeout(function () {
// 로딩 완료 후 원래 상태로 복원
$btn.prop("disabled", false);
$btn.find("span").text(originalText);
$btn.find("i").removeClass("fa-spinner fa-spin").addClass("fa-chevron-down");
}, 1000);
return false;
});
// 공유 기능 폴백 todo:: 추후 확인
function fallbackShare(title, url) {
// 클립보드에 URL 복사
if (navigator.clipboard) {
navigator.clipboard
.writeText(url)
.then(() => {
jSuccess("링크가 클립보드에 복사되었습니다.");
})
.catch(() => {
prompt("다음 링크를 복사하세요:", url);
});
} else {
prompt("다음 링크를 복사하세요:", url);
}
}
}
const pageManager = {
pageIndex: 1,
pageUnit: 5,
totalRecordCount: 50,
lastPageNo: 5 // 마지막 페이지 번호
};
const searchManager = {
c_blog_title: ""
};
function hideLoadMoreButton() {
$("#show-more-button").remove();
}
function appendArticlesToContainer(articles) {
let articleHtml = "";
if (!articles || articles.length === 0) {
appendNoContentMessage("#purchase-articles-container", "블로그");
return;
}
articles.forEach((article, index) => {
articleHtml += createPurchaseArticleHTML(article, index);
});
$("#purchase-articles-container").append(articleHtml);
}
// 블로그 페이징 리스트
function updateBlogList() {
$.ajax({
url: "/auth-anon/api/arms/blog/getPaginatedBlogList.do",
type: "GET",
data: {
pageIndex: pageManager.pageIndex,
pageUnit: pageManager.pageUnit
// c_blog_title은 있을 때만 {} 안에 추가하는 걸로
},
success: function (response) {
const {
data,
paginationInfo: { totalRecordCount, lastPageNo }
} = response;
pageManager.totalRecordCount = totalRecordCount || 0;
pageManager.lastPageNo = lastPageNo;
if (totalRecordCount === 0) {
hideLoadMoreButton();
appendNoContentMessage(".posts-container.well", "");
return;
}
appendArticlesToContainer(data);
const currentlyLoaded = pageManager.pageIndex * pageManager.pageUnit;
if (currentlyLoaded >= pageManager.totalRecordCount) {
hideLoadMoreButton();
}
pageManager.pageIndex++;
}
});
}
function createPurchaseArticleHTML(article, index) {
return `
${article.c_blog_title}
${article.c_blog_desc}
${formatDateOrAgo(
article.c_blog_created
)}
${index < 9 ? '
' : ""}
`;
}
// 게시글 상세 페이지로 이동하는 함수
function navigateToArticle(articleId) {
window.location.href = `template.html?page=blogDetail&id=${articleId}`;
}
// 인기 컨텐츠 캐러셀 변수
var currentSlide = 0;
var totalSlides = 0; // JSON 로드 후 설정됨
var visibleSlides = 4;
var slideWidth = 280 + 24; // 카드 너비 + gap
// 모든 캐러셀 함수들을 window 객체에 등록하여 HTML onclick에서 접근 가능하게 함
window.navigateToArticle = navigateToArticle;
window.slideCarousel = slideCarousel;
// 추가적인 이벤트 리스너로 백업 (클릭 이벤트 위임)
$(document).ready(function () {
// 인기 콘텐츠 캐러셀 버튼 이벤트 (백업)
$(document).on("click", ".carousel-prev", function (e) {
e.preventDefault();
if (typeof slideCarousel === "function") {
slideCarousel("prev");
}
});
$(document).on("click", ".carousel-next", function (e) {
e.preventDefault();
if (typeof slideCarousel === "function") {
slideCarousel("next");
}
});
});
// 최신 게시글 초기화 함수
function initializeRecentArticles() {
$.ajax({
url: "/auth-anon/api/arms/blog/latest/getBlogList.do",
type: "GET",
success: function (response) {
renderRecentArticles(response);
}
});
}
// 최신 게시글 HTML 렌더링 (layout-container)
function renderRecentArticles(latestArticleList) {
if (!latestArticleList || latestArticleList.length < 1) {
appendNoContentMessage(".recent-article-container .pc-layout", "최신");
return;
}
// 메인 카드 (featured true인 첫 번째 아이템)
const mainArticle = latestArticleList[0];
// 사이드 카드들 (type이 side인 아이템들)
const sideCards = latestArticleList.slice(1);
// 메인 카드 HTML 생성
let mainCardHtml = `