const appServerURL = "//apps.hyapps.com/"; var MorenvyBanner_AreaData = {"6419":{"id":"6419","name":"\uba54\uc778\uc601\uc5ed04 : \ubc30\ub10801","desc":"","displayType":"0","isActive":true,"createDate":"2023-03-13","bannerList":{"1678697910646":{"id":"1678697910646","name":"\ubc30\ub10801","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
\ub0b4 \ubab8\uacfc \uc9c0\uad6c\uc5d0
\ubb34\ud574\ud55c \uc218\ubd84\ucf00\uc5b4<\/div>\n
\uc790\uc5f0\uc720\ub798\uc131\ubd84 99%
5\uac00\uc9c0 \uc2dd\ubb3c\uc720\ub798 \uc131\ubd84<\/div>\n
\ub354 \uc54c\uc544\ubcf4\uae30<\/span>\"\ub354\ubcf4\uae30\ud654\uc0b4\ud45c\"<\/span><\/a><\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240102\/73a27181f121c231f10fdc96f176da02.png","type":2}],"link":[{"url":"\/product\/%EC%95%88%ED%8B%B0%ED%8D%BC%ED%8B%B0%EA%B7%B8-%EC%95%84%EC%9D%B4-%EC%BB%A8%ED%88%AC%EC%96%B4-%EC%8A%A4%ED%8B%B1-15ml\/78\/category\/49\/display\/1\/","openType":"_self"}],"AddOn":[""],"index":0},"1678697932495":{"id":"1678697932495","name":"\ubc30\ub10802","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
\uc2a4\ud2f1 \ub9db\uc9d1,
\ub77c\ub85c\uc81c <\/div>\n
\ubb3c \uc0ac\uc6a9 \ucd5c\uc18c\ud654
\uc990\uac70\uc6b4 \uc0ac\uc6a9\uac10<\/div>\n
\ub354 \uc54c\uc544\ubcf4\uae30<\/span>\"\ub354\ubcf4\uae30\ud654\uc0b4\ud45c\"<\/span><\/a><\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240102\/9b33942ecae89fe2703cca699956108f.png","type":2}],"link":[{"url":"\/product\/list_thumb.html?cate_no=53","openType":"_self"}],"AddOn":[""],"index":1}},"index":1},"2bdd":{"id":"2bdd","name":"\uba54\uc778\uc601\uc5ed01 : \ud0a4\ube44\uc8fc\uc5bc","desc":"","displayType":"0","isActive":true,"createDate":"2023-03-13","bannerList":{"1678695667302":{"id":"1678695667302","name":"\ubc30\ub10801","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
\uc790\uc5f0\uc720\ub798 \uc131\ubd84 99%<\/div>\n
1\uc2dc\uac04 \ub9cc\uc5d0 \uc218\ubd84 132% \uc99d\uac00
3\ucd08 \uc4f1\uc4f1 \uc218\ubd84 \uc2a4\ud2f1<\/div>\n
\uc218\ubd84\uacf5\uae09, \ubd93\uae30\uc644\ud654, \ub2e4\ud06c\uc11c\ud074 \uc644\ud654\ub97c \ud55c \ubc88\uc5d0!<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240501\/d7fd1c40468225048a9bd640a50374be.jpg","type":2}],"link":[{"url":"\/product\/%EC%95%88%ED%8B%B0%ED%8D%BC%ED%8B%B0%EA%B7%B8-%EC%95%84%EC%9D%B4-%EC%BB%A8%ED%88%AC%EC%96%B4-%EC%8A%A4%ED%8B%B1-15ml\/78\/category\/49\/display\/1\/","openType":"_self"}],"AddOn":[""],"index":6},"1678695722301":{"id":"1678695722301","name":"\ubc30\ub10802","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
Ambassador<\/div>\n
\uc5ec\ubc30\uc6b0\uc758 \uc5d0\ucf54\ubc31 \ud544\uc218\ud15c
\uc784\uc138\ubbf8 PICK<\/div>\n
#\ub9ac\uc5bc\ud074\ub9b0_\uc784\uc138\ubbf8<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240501\/20b8e124ea8fbe8d406890c21def5ce2.jpg","type":2}],"link":[{"url":"https:\/\/larosee-cosmetics.kr\/product\/list.html?cate_no=56","openType":"_self"}],"AddOn":[""],"index":3},"1678695722641":{"id":"1678695722641","name":"\ubc30\ub10803","isActive":false,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
100%\uc5d0 \uac00\uae4c\uc6b4 \uc790\uc5f0\uc720\ub798\uc131\ubd84<\/div>\n
\ud504\ub791\uc2a4 \uc57d\uc0ac\uac00 \uac1c\ubc1c\ud55c
\ubaa8\ub4e0 \ud53c\ubd80\uc5d0 \uc548\uc804\ud55c \uc2a4\ud0a8\ucf00\uc5b4<\/div>\n
#\ube0c\ub79c\ub4dc\uc2a4\ud1a0\ub9ac<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240102\/6be4cb41c487c5d028e8cc20bcf4a268.png","type":2}],"link":[{"url":"\/brand.html","openType":"_self"}],"AddOn":[""],"index":4},"1710854148307":{"id":"1710854148307","name":"\ubc30\ub10802","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2024-05-31 23:59:00","html":"
\uc790\uc5f0\uc720\ub798 \uc131\ubd84 100%<\/div>\n
\uafb8\uc548\uafb8 \uc0dd\uae30 \ubd80\uc5ec \ud544\uc218\ud15c
\ub9bd\uc564\uce58\ud06c \ud2f4\ud2b8\ub9bd\ubc24<\/div>\n
#100%\ucc9c\uc5f0\uc0c9\uc18c #\uc190\uc0c1\ucf00\uc5b4<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240501\/7ecfc6a20cf1c750c8bb9170d74fa3a4.jpg","type":2},{"url":"","type":0}],"link":[{"url":"https:\/\/larosee-cosmetics.kr\/product\/%ED%8B%B4%ED%8B%B0%EB%93%9C-%EB%84%88%EB%A6%AC%EC%8B%B1-%EC%8A%A4%ED%8B%B1%EB%A6%BD%EB%B0%A4-45g\/71\/category\/53\/display\/1\/","openType":"_self"}],"AddOn":[""],"index":5},"1713461870912":{"id":"1713461870912","name":"\ubc30\ub10801","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
\uc790\uc5f0\uc720\ub798 \uc131\ubd84 99%<\/div>\n
\ub370\uc624\ub4dc\ub780\ud2b8 \ud558\ub098\ub85c \uc644\uc131\ub418\ub294
\uc548\uc804\ud55c \uc0c1\ucf8c\ud568<\/div>\n
#\uc554\ub0b4\uc81c\uac70 #\uaca8\ub540\ud761\uc218 #\ud53c\ubd80\ubcf4\ud638<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240419\/4203a26aa8b16145f865145503b200d5.jpg","type":2},{"url":"","type":0}],"link":[{"url":"\/product\/%EB%8D%B0%EC%98%A4%EB%93%9C%EB%9E%80%ED%8A%B8-%EC%9C%84%EB%93%9C-%ED%94%84%EB%A1%9C%EB%B0%94%EC%9D%B4%EC%98%A4%ED%8B%B1%EC%8A%A4-50ml\/66\/category\/51\/display\/1\/","openType":"_self"}],"AddOn":[""],"index":2},"1714488615518":{"id":"1714488615518","name":"\ubc30\ub10801","isActive":true,"displayType":0,"displayBeginTime":"2023-03-13 17:00:00","displayEndTime":"2023-03-13 17:00:00","html":"
\uc9c0\uad6c\uc5d0\ub3c4 \ub0b4 \ud53c\ubd80\uc5d0\ub3c4 \ubb34\ud574\ud55c \uc0c8\ub85c\uc6b4 \uc120\ucf00\uc5b4<\/div>\n
\ud504\ub791\uc2a4 \uc120\uc2a4\ud2f1 \ubd80\ubb38 1\uc704*
\ud074\ub9b0 \uc120\uc2a4\ud2f1 SPF 50<\/div>\n
*2023\ub144 \ud504\ub791\uc2a4 \ub0b4 \uc57d\uad6d \uc120\uc2a4\ud2f1 \ubd80\ubb38 \ud310\ub9e4 \ud1b5\uacc4 \uae30\uc900,
Gersgie. France<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240501\/d49c512a98bfd3716e6edd1342b6ce99.jpg","type":2},{"url":"","type":0}],"link":[{"url":"\/product\/\ub77c\ub85c\uc81c-\ud074\ub9b0-\uc120\uc2a4\ud2f1-spf-50-185g\/120\/category\/53\/display\/1\/","openType":"_self"}],"AddOn":[""],"index":1},"1715594597805":{"id":"1715594597805","name":"","isActive":false,"displayType":0,"displayBeginTime":"2024-05-13 19:00:00","displayEndTime":"2024-05-13 19:00:00","html":"
\ud504\ub9ac \uc378\uba38 \ud398\uc2a4\ud0c0<\/div>\n
\ub77c\ub85c\uc81c \uce74\ubc14 \uc2a4\ud2b8\ub77c\uc774\ud504
\ud1a0\ud2b8\ubc31 \uc99d\uc815<\/div>\n
-05.31\uae4c\uc9c0 \uad6c\ub9e4\uc2dc<\/div>","img":[{"url":"https:\/\/ecimg.cafe24img.com\/pg707b19401741068\/beemee\/web\/upload\/NNEditor\/20240513\/36bcaa38b9d96398ecf19d353ab46694.jpg","type":2}],"link":[{"url":"https:\/\/larosee-cosmetics.kr\/product\/list.html?cate_no=57","openType":"_self"}],"AddOn":[""],"index":0}},"index":0}}; var LastSaveData = { "lastSaveSkin": "코스모라인_MO", "lastSaveDate": "2024-06-03 09:44:32" }; // 아이콘 var IconsPC = {"soldout":"https:\/\/img.echosting.cafe24.com\/design\/skin\/admin\/ko_KR\/ico_product_soldout.gif"}; var IconsMobile = {"soldout":"https:\/\/img.echosting.cafe24.com\/design\/skin\/admin\/ko_KR\/ico_product_soldout.gif"}; // 활성된 배너 엘리먼트, 배너 데이터 var activeBannerElem = []; //--------------------------------------------------------------------------------------------------------------------------------- // 배너 관리자 Init_MorenvyBannerManager(); //(function( CAFE24API ) function Init_MorenvyBannerManager() { console.log( "%c----- Banner Manager -----", "color:rgb(20, 85, 249); font-size: 25px;" ); console.log( "최종 수정 스킨 : " + LastSaveData[ "lastSaveSkin" ] ); console.log( "최종 수정 일자 : " + LastSaveData[ "lastSaveDate" ] ); console.log( "https://morenvy.com" ); console.log( "%c--------------------------", "color:rgb(20, 85, 249); font-size: 25px;" ); // 배너영역 클래스 검색 var bannerAreaList = document.getElementsByClassName( "morenvy-banner-area" ); if( null == bannerAreaList ) return; for( var i = 0; i < bannerAreaList.length; ) { // HTML에서 배너영역 ID 가져온다 var bannerArea = bannerAreaList[ i ]; var areaID = bannerArea.getAttribute( "area_id" ); // 배너영역 ID로 데이터 검색 var areaData = MorenvyBanner_AreaData[ areaID ]; if( null == areaData ) { bannerArea.style.display = "none"; ++i; continue; } // 순서대로 출력 var bannerArray = []; if( "0" == areaData.displayType ) { for( var key in areaData.bannerList ) { bannerArray.push( areaData.bannerList[ key ] ); } bannerArray.sort( function( a, b ) { return a.index > b.index ? 1 : -1; } ); } // 랜덤 출력 else if( "1" == areaData.displayType ) { for( var key in areaData.bannerList ) { areaData.bannerList[ key ].random = Math.random(); bannerArray.push( areaData.bannerList[ key ] ); } bannerArray.sort( function( a, b ) { return a.random > b.random ? 1 : -1; } ); } var bannerList = bannerAreaList[ i ].getElementsByClassName( "morenvy-banner" ); if( 0 == bannerList.length ) { bannerArea.style.display = "none"; ++i; continue; } // 설정 수 보다 엘리먼트가 부족할 경우 마지막 엘리먼트 복사 if( bannerList.length < bannerArray.length ) { var copyTarget = bannerList[ bannerList.length - 1 ]; var loopCount = bannerArray.length - bannerList.length; for( var j = 0; j < loopCount; ++j ) { var copyElem = copyTarget.cloneNode( true ); //bannerAreaList[ i ].append( copyElem ); copyTarget.parentElement.append( copyElem ); } } var showIndex = 0; for( var j = 0; j < bannerList.length; ) { var bannerData = j >= bannerArray.length ? null : bannerArray[ j ]; // 배너 데이터 없음 if( null == bannerData ) { bannerList[ j ].remove(); bannerArray.splice( j, 1 ); continue; } // 활성 중? if( false == bannerData.isActive ) { bannerList[ j ].remove(); bannerArray.splice( j, 1 ); continue; } // 기간 노출 if( 1 == bannerData.displayType ) { var beginDate = new Date( bannerData.displayBeginTime.replace( /-/g, "/" ) ); var endDate = new Date( bannerData.displayEndTime.replace( /-/g, "/" ) ); var curTime = new Date(); if( beginDate > curTime || endDate < curTime ) { bannerList[ j ].remove(); bannerArray.splice( j, 1 ); continue; } } var html = bannerList[ j ].innerHTML; html = html.replace( /%7B/gi, "{" ); html = html.replace( /%7D/gi, "}" ); html = html.replace( /{#areaName}/gi, areaData.name ); html = html.replace( /{#areaDesc}/gi, areaData.desc ); html = html.replace( /{#areaDisplayType}/gi, areaData.displayType ); html = html.replace( /{#num}/gi, ++showIndex ); html = html.replace( /{#title}/gi, bannerData.name ); html = html.replace( /{#displayType}/gi, bannerData.displayType ); html = html.replace( /{#displayBeginTime}/gi, bannerData.displayBeginTime ); html = html.replace( /{#displayEndTime}/gi, bannerData.displayEndTime ); html = html.replace( /{#text_1}/gi, 0 < bannerData.AddOn.length ? bannerData.AddOn[ 0 ] : "" ); html = html.replace( /{#text_2}/gi, 1 < bannerData.AddOn.length ? bannerData.AddOn[ 1 ] : bannerData.AddOn[ bannerData.AddOn.length - 1 ] ); html = html.replace( /{#text_3}/gi, 2 < bannerData.AddOn.length ? bannerData.AddOn[ 2 ] : bannerData.AddOn[ bannerData.AddOn.length - 1 ] ); html = html.replace( /{#link_1}/gi, 0 < bannerData.link.length ? bannerData.link[ 0 ].url : "" ); html = html.replace( /{#link_2}/gi, 1 < bannerData.link.length ? bannerData.link[ 1 ].url : bannerData.link[ bannerData.link.length - 1 ].url ); html = html.replace( /{#link_3}/gi, 2 < bannerData.link.length ? bannerData.link[ 2 ].url : bannerData.link[ bannerData.link.length - 1 ].url ); html = html.replace( /{#target_1}/gi, 0 < bannerData.link.length ? bannerData.link[ 0 ].openType : "" ); html = html.replace( /{#target_2}/gi, 1 < bannerData.link.length ? bannerData.link[ 1 ].openType : bannerData.link[ bannerData.link.length - 1 ].openType ); html = html.replace( /{#target_3}/gi, 2 < bannerData.link.length ? bannerData.link[ 2 ].openType : bannerData.link[ bannerData.link.length - 1 ].openType ); html = html.replace( /{#html}/gi, bannerData.html ); html = html.replace( /{#imgTag_1}/gi, 0 < bannerData.img.length ? "" : "" ); html = html.replace( /{#imgTag_2}/gi, 1 < bannerData.img.length ? "" : "" ); html = html.replace( /{#imgTag_3}/gi, 2 < bannerData.img.length ? "" : "" ); html = html.replace( /{#imgSrc_1}/gi, 0 < bannerData.img.length ? bannerData.img[ 0 ].url : "" ); html = html.replace( /{#imgSrc_2}/gi, 1 < bannerData.img.length ? bannerData.img[ 1 ].url : bannerData.img[ bannerData.img.length - 1 ].url ); html = html.replace( /{#imgSrc_3}/gi, 2 < bannerData.img.length ? bannerData.img[ 2 ].url : bannerData.img[ bannerData.img.length - 1 ].url ); bannerList[ j ].innerHTML = html; activeBannerElem.push( { elem : bannerList[ j ], bannerData : bannerData } ); ++j; } if( 0 == bannerList.length ) bannerArea.style.display = "none"; ++i; bannerArea.classList.add( "init" ); } }/* )( CAFE24API.init( { version: "2022-09-01", client_id: "gSOPn7dNJxAp8cu31kDDtD" } ) );*/ //---------------------------------------------------------------------------------------------------------------------------- // 상품 진열 플러그인 function Init_MorenvyProductDisplay() { // 상품 정보 요청 최대 개수, cafe24에서 최대 100개까지 지원됨. const maxSearchCount = 100; // 상품 정보 요청할 상품 번호 var needToSearchProduct = {}; // 상품 정보 콜백 받은 후 html replace 필요한 엘리먼트들, 해당 엘리먼트 내 상품 번호 var needToReplaceElems = []; // 초기화 필요한 product area var needToInitPrudctArea = []; // replace 필요한 상품 배열 데이터 var needToReplaceArray = {}; // 모바일인지 체크 var isMobile = /Mobi/i.test( window.navigator.userAgent ); // 상품 관련 태그를 상품 번호 태그로 매핑 // ex) {#productName} ----> {#19_Name} function replaceToProductNo( html, tagName, productNo, replace ) { const regExp = new RegExp( `{${"#" + tagName}}`, "gi" ); if( null != productNo ) html = html.replace( regExp, "{#" + productNo + "_" + replace + "}" ); else html = html.replace( regExp, "" ); return html; } // 배열 데이터 태그 replace function replaceToArrayProductNo( html, tagName, productNo, replace ) { var nextIndex = 0; while( true ) { var startIndex = html.indexOf( "{#" + tagName, nextIndex ); if( -1 == startIndex ) break; var endIndex = html.indexOf( "}", startIndex ); if( -1 == endIndex ) break; var arrayIndex = html.slice( startIndex + String( "{#" + tagName ).length + 1, endIndex ); if( null == needToReplaceArray[ productNo ] ) needToReplaceArray[ productNo ] = new Object(); if( null == needToReplaceArray[ productNo ][ replace ] ) needToReplaceArray[ productNo ][ replace ] = new Object(); needToReplaceArray[ productNo ][ replace ][ arrayIndex ] = 0; nextIndex = endIndex + 1; } const regExp = new RegExp( `{${"#" + tagName + "_"}`, "gi" ); if( null != productNo ) html = html.replace( regExp, "{#" + productNo + "_" + replace + "_" ); else html = html.replace( regExp, "" ); return html; } // 상품 번호로 매핑된 태그를 실제 상품 정보로 replace function replaceTag( html, productNo, tag, replace ) { const regExp = new RegExp( `{${"#" + productNo + "_" + tag}}`, "gi" ); html = html.replace( regExp, replace ); return html; } // 상품 번호로 매핑된 태그를 실제 상품 정보로 replace (한개만) function replaceOneTag( html, productNo, tag, replace ) { html = html.replace( "{#" + productNo + "_" + tag + "}", replace ); return html; } // 상품 번호로 매핑된 태그를 실제 상품 정보로 replace function replaceArrayTag( index, html, productNo, tag, replace ) { const regExp = new RegExp( `{${"#" + productNo + "_" + tag + "_" + index}}`, "gi" ); html = html.replace( regExp, replace ); return html; } // 배너관리자에서 활성된 배너 for( var key in activeBannerElem ) { // 활성된 배너 데이터 var bannerData = activeBannerElem[ key ].bannerData; // 상품 진열 데이터 없음 if( null == bannerData.productDisplay || 0 == bannerData.productDisplay.length ) continue; // 상품 진열 영역 var productAreaList = activeBannerElem[ key ].elem.getElementsByClassName( "morenvy-product-area" ); if( null == productAreaList || 0 == productAreaList.length ) continue; for( var i = 0; i < productAreaList.length; ) { var productArea = productAreaList[ i ]; var productList = productArea.getElementsByClassName( "morenvy-product" ); if( null == productList || 0 == productList.length ) { productAreaList[ i ].remove(); continue; } // 설정 수 보다 엘리먼트가 부족할 경우 마지막 엘리먼트 복사 if( productList.length < bannerData.productDisplay.length ) { var copyTarget = productList[ productList.length - 1 ]; var loopCount = bannerData.productDisplay.length - productList.length; for( var j = 0; j < loopCount; ++j ) { var copyElem = copyTarget.cloneNode( true ); productArea.append( copyElem ); } } for( var j = 0; j < productList.length; ) { // 상품 검색 최대 수 도달 if( maxSearchCount <= Object.keys( needToSearchProduct ).length ) break; var productNo = j >= bannerData.productDisplay.length ? null : bannerData.productDisplay[ j ]; // 상품 데이터 없음 if( null == productNo ) { productList[ j ].remove(); bannerData.productDisplay.splice( j, 1 ); continue; } var html = productList[ j ].innerHTML; html = html.replace( /%7B/gi, "{" ); html = html.replace( /%7D/gi, "}" ); // 모바일/PC에 따라 아이콘 다름 if( false == isMobile ) { html = html.replace( /{#soldout_icon}/gi, IconsPC[ "soldout" ] ); html = html.replace( /{#soldout_iconTag}/gi, "" ); } else { html = html.replace( /{#soldout_icon}/gi, IconsMobile[ "soldout" ] ); html = html.replace( /{#soldout_iconTag}/gi, "" ); } // 상품 번호 매핑 html = html.replace( /{#productNo}/gi, productNo ); // 상품 태그를 상품 번호 태그로 매핑 html = replaceToProductNo( html, "link", productNo, "Link" ); html = replaceToProductNo( html, "name", productNo, "Name" ); html = replaceToProductNo( html, "nameEn", productNo, "NameEn" ); html = replaceToProductNo( html, "price", productNo, "Price" ); html = replaceToProductNo( html, "retailPrice", productNo, "RetailPrice" ); html = replaceToProductNo( html, "discountPrice", productNo, "DiscountPrice" ); html = replaceToProductNo( html, "imgBig", productNo, "ImgBig" ); html = replaceToProductNo( html, "imgBigTag", productNo, "ImgBigTag" ); html = replaceToProductNo( html, "imgMedium", productNo, "ImgMedium" ); html = replaceToProductNo( html, "imgMediumTag", productNo, "ImgMediumTag" ); html = replaceToProductNo( html, "imgSmall", productNo, "ImgSmall" ); html = replaceToProductNo( html, "imgSmallTag", productNo, "ImgSmallTag" ); html = replaceToProductNo( html, "imgTiny", productNo, "ImgTiny" ); html = replaceToProductNo( html, "imgTinyTag", productNo, "ImgTinyTag" ); html = replaceToProductNo( html, "summaryDesc", productNo, "SummaryDesc" ); html = replaceToProductNo( html, "simpleDesc", productNo, "SimpleDesc" ); html = replaceToProductNo( html, "customCode", productNo, "CustomCode" ); html = replaceToProductNo( html, "modelName", productNo, "ModelName" ); html = replaceToProductNo( html, "brand", productNo, "Brand" ); html = replaceToProductNo( html, "trend", productNo, "Trend" ); html = replaceToProductNo( html, "manu", productNo, "Manu" ); html = replaceToProductNo( html, "opt_discountPrice", productNo, "Opt_DiscountPrice" ); html = replaceToProductNo( html, "coupon_discountPrice", productNo, "Coupon_DiscountPrice" ); html = replaceToProductNo( html, "promotion_period", productNo, "Promotion_Period" ); // addImg / addImgTag 처럼 태그 이름이 확장되는 경우 확장된 놈부터 replace, 에러남 html = replaceToArrayProductNo( html, "addInfo_name", productNo, "AddInfo_Name" ); html = replaceToArrayProductNo( html, "addInfo_value", productNo, "AddInfo_Value" ); html = replaceToArrayProductNo( html, "addImgTag", productNo, "AddImgTag" ); html = replaceToArrayProductNo( html, "addImg", productNo, "AddImg" ); productList[ j ].innerHTML = html; needToSearchProduct[ productNo ] = 0; needToReplaceElems.push( { areaElem : productArea, productNo : productNo, productElem : productList[ j ] } ); ++j; } needToInitPrudctArea.push( productArea ); ++i; } } // 상품 검색 Search(); function applyProductData( products ) { // replace가 먼저 되면 엘리먼트 삭제가 안된다. // 삭제할 엘리먼트만 먼저 찾아서 삭제 for( var key in needToReplaceElems ) { // 상품 엘리먼트 var productElem = needToReplaceElems[ key ].productElem; // 상품 번호 var productNo = needToReplaceElems[ key ].productNo; // 해당 번호의 상품 데이터 없음. 엘리먼트 삭제 var data = products[ productNo ]; if( null == data ) { productElem.remove(); continue; } // 진열중 아니거나 판매중 아니면 엘리먼트 삭제 if( "F" == data.selling || "F" == data.display ) { productElem.remove(); continue; } } // 검색된 상품 정보를 각각의 엘리먼트에 상품 번호로 매핑된 태그를 찾아 replace for( var key in needToReplaceElems ) { // 상품 영역 엘리먼트 var productAreaElem = needToReplaceElems[ key ].areaElem; // 상품 엘리먼트 var productElem = needToReplaceElems[ key ].productElem; // 상품 번호 var productNo = needToReplaceElems[ key ].productNo; var data = products[ productNo ]; if( null == data || "F" == data.selling || "F" == data.display ) continue; // PC/모바일 할인가가 다름 var discount = true == isMobile ? data.discountprice.mobile_discount_price : data.discountprice.pc_discount_price; var html = productAreaElem.innerHTML; html = html.replace( /%7B/gi, "{" ); html = html.replace( /%7D/gi, "}" ); html = replaceTag( html, data.product_no, "Link", "/product/detail.html?product_no=" + data.product_no ); html = replaceTag( html, data.product_no, "Name", data.product_name ); html = replaceTag( html, data.product_no, "NameEn", data.eng_product_name ); html = replaceTag( html, data.product_no, "Price", parseInt( data.price ).toLocaleString() ); html = replaceTag( html, data.product_no, "RetailPrice", parseInt( data.retail_price ).toLocaleString() ); html = replaceTag( html, data.product_no, "DiscountPrice", parseInt( discount ).toLocaleString() ); html = replaceTag( html, data.product_no, "ImgBig", data.detail_image ); html = replaceTag( html, data.product_no, "ImgBigTag", "" ); html = replaceTag( html, data.product_no, "ImgMedium", data.list_image ); html = replaceTag( html, data.product_no, "ImgMediumTag", "" ); html = replaceTag( html, data.product_no, "ImgSmall", data.small_image ); html = replaceTag( html, data.product_no, "ImgSmallTag", "" ); html = replaceTag( html, data.product_no, "ImgTiny", data.tiny_image ); html = replaceTag( html, data.product_no, "ImgTinyTag", "" ); html = replaceTag( html, data.product_no, "SummaryDesc", data.summary_description ); html = replaceTag( html, data.product_no, "CustomCode", data.custom_product_code ); html = replaceTag( html, data.product_no, "ModelName", data.model_name ); productAreaElem.innerHTML = html; ++i; } // 상품 영역 초기화 완료 for( var key in needToInitPrudctArea ) { needToInitPrudctArea[ key ].classList.add( "init" ); } } function Search() { // 검색 필요한 상품 없음 if( 0 == Object.keys( needToSearchProduct ).length ) return; var count = 0; // 상품 검색 파라미터 var searchParam = "?embed=discountprice&product_no="; for( var key in needToSearchProduct ) { ++count; if( 1 < count ) searchParam += ","; searchParam += key; } // 상품 검색 개수, cafe24에서 최대 100개까지 지원됨. searchParam += "&limit=" + maxSearchCount; // 상품 검색 요청 CAFE24API.get( "/api/v2/products" + searchParam, function( err, res ) { // 상품 번호를 키로 object 변환 var products = {}; for( var i in res.products ) { products[ res.products[ i ].product_no ] = res.products[ i ]; } applyProductData( products ); var reqDetailCount = 0; var totalReqCount = 0; var totalApplyCount = 0; function reqDetail() { var arrProductNo = Object.keys( needToSearchProduct ); if( 0 == arrProductNo ) return; ++reqDetailCount; ++totalReqCount; var productNo = arrProductNo[ 0 ]; CAFE24API.get( "/api/v2/productsdetail/" + productNo, function( err, res ) { if( null != err ) { setTimeout( function() { reqDetailCount -= 1; reqDetail(); }, 100 ); return; } applyProductDetail( res.productsdetail ); ++totalApplyCount; if( totalApplyCount == totalReqCount ) replaceNaN(); delete needToSearchProduct[ productNo ]; if( 40 <= reqDetailCount ) { setTimeout( function() { reqDetailCount -= 1; reqDetail(); }, 100 ); } else { reqDetail(); } } ); } reqDetail(); function applyProductDetail( data ) { // 상품 진열 영역 var productAreaList = document.getElementsByClassName( "morenvy-product-area" ); if( null == productAreaList || 0 == productAreaList.length ) return; for( var i = 0; i < productAreaList.length; ++i ) { var elem = productAreaList[ i ]; var html = elem.innerHTML; html = html.replace( /%7B/gi, "{" ); html = html.replace( /%7D/gi, "}" ); html = replaceTag( html, data.product_no, "SimpleDesc", null == data.simple_description ? "" : data.simple_description ); html = replaceTag( html, data.product_no, "Brand", null == data.brand_name ? "" : data.brand_name ); html = replaceTag( html, data.product_no, "Trend", null == data.trend_name ? "" : data.trend_name ); html = replaceTag( html, data.product_no, "Manu", null == data.manufacturer_name ? "" : data.manufacturer_name ); html = replaceTag( html, data.product_no, "Opt_DiscountPrice", null == data.optimum_discount_price ? "" : arseInt( data.optimum_discount_price ).toLocaleString() ); html = replaceTag( html, data.product_no, "Coupon_DiscountPrice", null == data.coupon_discounted_price ? "" : parseInt( data.coupon_discounted_price ).toLocaleString() ); if( null != data.promotion_period ) { var startDate = new Date( data.promotion_period.start_date ); var endDate = new Date( data.promotion_period.end_date ); var timeText = startDate.getFullYear() + "-" + (startDate.getMonth() + 1).toString().padStart( 2, "0" ) + "-" + startDate.getDate().toString().padStart( 2, "0" ) + " " + startDate.getHours().toString().padStart( 2, "0" ) + ":" + startDate.getMinutes().toString().padStart( 2, "0" ) + " ~ " + endDate.getFullYear() + "-" + (endDate.getMonth() + 1).toString().padStart( 2, "0" ) + "-" + endDate.getDate().toString().padStart( 2, "0" ) + " " + endDate.getHours().toString().padStart( 2, "0" ) + ":" + endDate.getMinutes().toString().padStart( 2, "0" ); html = replaceTag( html, data.product_no, "Promotion_Period", timeText ); } else { html = replaceTag( html, data.product_no, "Promotion_Period", data.coupon_discounted_price ); } if( null != data.additional_information ) { for( var j = 0; j < data.additional_information.length; ++j ) { const info = data.additional_information[ j ]; html = replaceArrayTag( j + 1, html, data.product_no, "AddInfo_Name", info.name ); html = replaceArrayTag( j + 1, html, data.product_no, "AddInfo_Value", info.value ); if( null != needToReplaceArray[ data.product_no ] ) { if( null != needToReplaceArray[ data.product_no ][ "AddInfo_Name" ] ) delete needToReplaceArray[ data.product_no ][ "AddInfo_Name" ][ (j + 1).toString() ]; if( null != needToReplaceArray[ data.product_no ][ "AddInfo_Value" ] ) delete needToReplaceArray[ data.product_no ][ "AddInfo_Value" ][ (j + 1).toString() ]; } } } if( null != data.additional_images ) { for( var j = 0; j < data.additional_images.length; ++j ) { const img = data.additional_images[ j ]; html = replaceArrayTag( j + 1, html, data.product_no, "AddImg", img.big ); html = replaceArrayTag( j + 1, html, data.product_no, "AddImgTag", "" ); if( null != needToReplaceArray[ data.product_no ] ) { if( null != needToReplaceArray[ data.product_no ][ "AddImg" ] ) delete needToReplaceArray[ data.product_no ][ "AddImg" ][ (j + 1).toString() ]; if( null != needToReplaceArray[ data.product_no ][ "AddImgTag" ] ) delete needToReplaceArray[ data.product_no ][ "AddImgTag" ][ (j + 1).toString() ]; } } } elem.innerHTML = html; } } } ); } // 태그 변수 입력은 됐는데 실제 조회 후 데이터가 없는 경우 NaN으로 replace function replaceNaN() { for( var keyProductNo in needToReplaceArray ) { for( var keyTag in needToReplaceArray[ keyProductNo ] ) { for( var keyNum in needToReplaceArray[ keyProductNo ][ keyTag ] ) { for( var i = 0; i < productAreaList.length; ++i ) { var elem = productAreaList[ i ]; var html = elem.innerHTML; html = replaceTag( html, keyProductNo, keyTag + "_" + keyNum, "" ); elem.innerHTML = html; } } } } } } let Morenvy_Wait_CAEF24 = setInterval( () => { if( typeof CAFE24API != "undefined" ) { clearInterval( Morenvy_Wait_CAEF24 ); (function( CAFE24API ) { Init_MorenvyProductDisplay(); } )( CAFE24API.init( { version: "2022-09-01", client_id: "gSOPn7dNJxAp8cu31kDDtD" } ) ); } }, 50 );