(function (root, factory) {
//amd
if (typeof define === "function" && define.amd) {
define(['sprintf-js'], function (sprintf) {
return factory(sprintf.vsprintf);
});
//commonjs
} else if (typeof module === "object" && module.exports) {
module.exports = factory(require('sprintf-js').vsprintf);
//global
} else {
root.Translator = factory(window.vsprintf);
}
var i18n = new Translator(TRANSLATIONS);
window['__'] = function(sMsg, sGroupID) {
return i18n.p__(sGroupID, sMsg);
};
}(this, function (vsprintf) {
"use strict";
function Translator (translations) {
this.dictionary = {};
this.plurals = {};
this.domain = null;
if (translations) {
this.loadTranslations(translations);
}
}
Translator.prototype = {
loadTranslations: function (translations) {
var domain = translations.domain || '';
if (this.domain === null) {
this.domain = domain;
}
if (this.dictionary[domain]) {
mergeTranslations(this.dictionary[domain], translations.messages);
return this;
}
if (translations.fn) {
this.plurals[domain] = { fn: translations.fn };
} else if (translations['plural-forms']) {
var plural = translations['plural-forms'].split(';', 2);
this.plurals[domain] = {
count: parseInt(plural[0].replace('nplurals=', '')),
code: plural[1].replace('plural=', 'return ') + ';'
};
}
this.dictionary[domain] = translations.messages;
return this;
},
defaultDomain: function (domain) {
this.domain = domain;
return this;
},
gettext: function (original) {
return this.dpgettext(this.domain, null, original);
},
ngettext: function (original, plural, value) {
return this.dnpgettext(this.domain, null, original, plural, value);
},
dngettext: function (domain, original, plural, value) {
return this.dnpgettext(domain, null, original, plural, value);
},
npgettext: function (context, original, plural, value) {
return this.dnpgettext(this.domain, context, original, plural, value);
},
pgettext: function (context, original) {
return this.dpgettext(this.domain, context, original);
},
dgettext: function (domain, original) {
return this.dpgettext(domain, null, original);
},
dpgettext: function (domain, context, original) {
var translation = getTranslation(this.dictionary, domain, context, original);
if (translation !== false && translation[0] !== '') {
return translation[0];
}
return original;
},
dnpgettext: function (domain, context, original, plural, value) {
var index = getPluralIndex(this.plurals, domain, value);
var translation = getTranslation(this.dictionary, domain, context, original);
if (translation[index] && translation[index] !== '') {
return translation[index];
}
return (index === 0) ? original : plural;
},
__: function (original) {
return format(
this.gettext(original),
Array.prototype.slice.call(arguments, 1)
);
},
n__: function (original, plural, value) {
return format(
this.ngettext(original, plural, value),
Array.prototype.slice.call(arguments, 3)
);
},
p__: function (context, original) {
return format(
this.pgettext(context, original),
Array.prototype.slice.call(arguments, 2)
);
},
d__: function (domain, original) {
return format(
this.dgettext(domain, original),
Array.prototype.slice.call(arguments, 2)
);
},
dp__: function (domain, context, original) {
return format(
this.dgettext(domain, context, original),
Array.prototype.slice.call(arguments, 3)
);
},
np__: function (context, original, plural, value) {
return format(
this.npgettext(context, original, plural, value),
Array.prototype.slice.call(arguments, 4)
);
},
dnp__: function (domain, context, original, plural, value) {
return format(
this.dnpgettext(domain, context, original, plural, value),
Array.prototype.slice.call(arguments, 5)
);
}
};
function getTranslation(dictionary, domain, context, original) {
context = context || '';
if (!dictionary[domain] || !dictionary[domain][context] || !dictionary[domain][context][original]) {
return false;
}
return dictionary[domain][context][original];
}
function getPluralIndex(plurals, domain, value) {
if (!plurals[domain]) {
return value == 1 ? 0 : 1;
}
if (!plurals[domain].fn) {
plurals[domain].fn = new Function('n', plurals[domain].code);
}
return plurals[domain].fn.call(this, value) + 0;
}
function mergeTranslations(translations, newTranslations) {
for (var context in newTranslations) {
if (!translations[context]) {
translations[context] = newTranslations[context];
continue;
}
for (var original in newTranslations[context]) {
translations[context][original] = newTranslations[context][original];
}
}
}
function format (text, args) {
if (!args.length) {
return text;
}
if (args[0] instanceof Array) {
return vsprintf(text, args[0]);
}
return vsprintf(text, args);
}
return Translator;
}));
/**
* 품절품목일 경우 품절 문구에대한 처리
*/
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT = {
/**
* 품절문구 설정 정보
*/
aSoldoutText : null,
/**
* 필수 메서드
* @param iProductNum 상품번호
* @param sItemCode 품목코드
* @returns 설정에따라 품절문구 리턴
* @final
*/
get : function(iProductNum, sItemCode) {
return this.getStockText(iProductNum, sItemCode);
},
/**
* 품절문구 설정(기존로직 그대로
* @param iProductNum 상품번호
* @returns 해당 상품의 품절 설정 문구
*/
getSoldoutDiplayText: function (iProductNum) {
if (typeof(aSoldoutDisplay) === 'undefined') {
return EC_SHOP_FRONT_NEW_OPTION_CONS.OPTION_SOLDOUT_DEFAULT_TEXT;
}
if (this.aSoldoutText === null) {
if (typeof(aSoldoutDisplay) === 'string') {
this.aSoldoutText = $.parseJSON(aSoldoutDisplay);
} else {
this.aSoldoutText = aSoldoutDisplay;
}
}
if (typeof(this.aSoldoutText[iProductNum]) === 'undefined') {
this.aSoldoutText[iProductNum] = EC_SHOP_FRONT_NEW_OPTION_CONS.OPTION_SOLDOUT_DEFAULT_TEXT;
}
return this.aSoldoutText[iProductNum];
},
/**
* 해당 품목이 품목일 경우 표시될 품절표시 Text
* @param iProductNum 상품번호
* @param sItemCode 아이템코드
* @returns 표시될 품절문구
*/
getStockText : function(iProductNum, sItemCode) {
var sSoldoutText = '';
var bIsSoldout = EC_SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(iProductNum, sItemCode);
if (bIsSoldout === true) {
sSoldoutText = ' [' + this.getSoldoutDiplayText(iProductNum) + ']';
}
if (typeof(aReserveStockMessage) === 'undefined') {
return sSoldoutText;
}
var aStockData = EC_SHOP_FRONT_NEW_OPTION_COMMON.getProductStockData(iProductNum);
if (typeof(aStockData[sItemCode]) === 'undefined') {
return sSoldoutText;
}
if (aStockData[sItemCode].is_reserve_stat !== 'N') {
sSoldoutText = aReserveStockMessage[aStockData[sItemCode].is_reserve_stat];
sSoldoutText = sSoldoutText.replace(aReserveStockMessage['stock_message_replace_name'], aStockData[sItemCode].stock_number);
sSoldoutText = sSoldoutText.replace('[:PRODUCT_STOCK:]', aStockData[sItemCode].stock_number);
}
return sSoldoutText;
}
};
/**
* 해당 품목에 대한 추가금액 표시여부
*/
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_PRICE = {
/**
* 추가금액 표시여부 설정
*/
aOptionPriceDisplayConf : [],
oChooseObject : null,
/**
* 필수 메서드
* @param iProductNum 상품번호
* @param sItemCode 품목코드
* @param eChooseObject 현재 선택한 옵션 Object
* @returns 설정에따라 표시할 경우 품목의 추가금액 리턴
* @final
*/
get : function(iProductNum, sItemCode, eChooseObject) {
this.oChooseObject = eChooseObject;
return this.getAddPriceText(iProductNum, sItemCode);
},
/**
* 각 옵션선택시마다 실행되는 가격관련 메서드
* @param oOptionChoose 구분할 옵션박스 object
* @returns bool
*/
eachCallback : function(oOptionChoose) {
//구스킨에서 옵션선택시마다 표시항목 판매가부분의 가격에 옵션추가듬액 계산
this.setDisplayProductPriceForOldSkin(oOptionChoose);
},
/**
* 구스킨에서 옵션선택시마다 표시항목 판매가부분의 가격에 옵션추가듬액 계산
* @param oOptionChoose 구분할 옵션박스 object
*/
setDisplayProductPriceForOldSkin : function(oOptionChoose) {
//뉴스킨이라면 패스 (ECHOSTING-241102 모바일 관심상품리스트 오류)
if ($('#totalProducts').length > 0) {
return;
}
//해당 function이 존재할때만 실행
if (typeof(setOldTotalPrice) !== 'function') {
return;
}
var sID = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionChooseID(oOptionChoose);
//상품상세 메인상품에 대해서만 실행
if (/^product_option_id+/.test(sID) !== true) {
return;
}
//구스킨일 경우 각 옵션선택시마다 실행
try {
setOldTotalPrice();
} catch(e) {
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(oOptionChoose, '*');
}
},
/**
* 옵션 추가금액에대한 Display텍스트
* @param iProductNum 상품번호
* @param sItemCode 품목코드
* @returns string 옵션 추가금액 Text
*/
getAddPriceText : function(iProductNum, sItemCode) {
//추가금액 표시여부
var bIsDisplayOptionPrice = this.getOptionPriceDisplay(iProductNum);
if (bIsDisplayOptionPrice === false) {
return '';
}
var iAddPrice = this.getAddPrice(iProductNum, sItemCode);
if (iAddPrice !== false) {
var sPrefix = '';
if (iAddPrice > 0.00) {
sPrefix = '+';
} else {
sPrefix = '-';
}
//화폐단위가 +- 기호 뒤에와야해서 여기서 양수로 바꿈
iAddPrice = Math.abs(iAddPrice);
var sStr = ' (' + sPrefix + SHOP_PRICE_FORMAT.toShopPrice(iAddPrice) + ')';
//그냥 값을 더할경우 원표시(\)가 ₩로 변환되어서 clone으로 다시가져오게 처리
return $('
').append(sStr).html();
}
return '';
},
/**
* 해당 품목의 추가금액을 가져온다(없을 경우에는 false를 리턴
* @param iProductNum 상품번호
* @param sItemCode 품목코드
* @returns int|boolean 추가금액
*/
getAddPrice : function(iProductNum, sItemCode) {
var aStockData = EC_SHOP_FRONT_NEW_OPTION_COMMON.getProductStockData(iProductNum);
if (typeof(aStockData[sItemCode].stock_price) !== 'undefined' && parseFloat(aStockData[sItemCode].stock_price) !== 0.00) {
return parseFloat(aStockData[sItemCode].stock_price);
}
return false;
},
/**
* 옵션 추가금액 표시여부 설정
* @param iProductNum 상품번호
* @returns 표시여부
*/
getOptionPriceDisplay : function(iProductNum) {
if (typeof(EC_SHOP_FRONT_NEW_OPTION_DATA.aOptionPriceDisplayConf[iProductNum]) === 'undefined') {
return 'T';
}
return (EC_SHOP_FRONT_NEW_OPTION_DATA.aOptionPriceDisplayConf[iProductNum] === 'T');
}
};
/**
* 옵션 선택 또는 품목선택완료시 상세이미지 변경
*/
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE = {
/**
* 모바일과 상세이미지 클래스가 틀려서
*/
sDetailImageClass : '',
/**
* 세트상품의 이미지 영역
*/
sSetProductImageID : '',
/**
* 스와이프기능을 사용하는 상품상세인지 확인(모바일전용)
*/
isSwipe : false,
/**
* 세트상품인지 여부
*/
bIsSetProduct : false,
/**
* 각 옵션선택시마다 이미지가 있다면 상세이미지에 반영되도록 함
* @param oOptionChoose 구분할 옵션박스 object
*/
eachCallback : function(oOptionChoose) {
this.bIsSetProduct = false;
//세트상품일 경우에 대한 처리
if (/^setproduct_option_+/.test(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectGroup(oOptionChoose)) === true) {
this.bIsSetProduct = true;
this.sSetProductImageID = '#ec-set-product-composed-product-';
}
if (/^addproduct_option_+/.test(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectGroup(oOptionChoose)) === true) {
this.bIsSetProduct = true;
this.sSetProductImageID = '#ec-add-product-composed-product-';
}
if (this.isDisplayImage(oOptionChoose) === false) {
return;
}
var oSelectedOption = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedElement(oOptionChoose);
if (typeof(oSelectedOption.attr('link_image')) === 'undefined' || oSelectedOption.attr('link_image').length < 1) {
return;
}
this.setImage(oSelectedOption.attr('link_image'), true, oOptionChoose);
},
/**
* 옵션 전체 선택완료후 해당 옵션품목에 연결된 이미지를 상세이미지에 반영되도록 함
* @param oOptionChoose 구분할 옵션박스 object
*/
completeCallback : function(oOptionChoose) {
//연동형은 제외
if (Olnk.isLinkageType(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose)) === true) {
return ;
}
if (this.isDisplayImage(oOptionChoose) === false) {
return;
}
var sItemCode = EC_SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(oOptionChoose);
if (sItemCode === false) {
return;
}
var iProductNo = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose);
var aStockData = EC_SHOP_FRONT_NEW_OPTION_DATA.getProductStockData(iProductNo);
if (typeof(aStockData[sItemCode].item_image_file) !== 'undefined' && $.trim(aStockData[sItemCode].item_image_file) !== '') {
this.setImage(aStockData[sItemCode].item_image_file, false, oOptionChoose);
}
},
/**
* 이미지 출력이 가능한지 확인
* @param oOptionChoose 구분할 옵션박스 object
* @returns bool
*/
isDisplayImage : function(oOptionChoose) {
//세트상품일 경우에 대한 처리
if (this.bIsSetProduct === true) {
return this.isDisplayImageDesignForSetProduct(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose));
} else {
//추가구성상품등은 모두 제외하고 상품상세의 대표상품만 변경
return this.isDisplayImageDesign();
}
},
/**
* 세트상품에서 구성상품의 옵션선택시 이미비 변경 가능여부
* @param iProductNum 상품번호
* @returns {boolean}
*/
isDisplayImageDesignForSetProduct : function(iProductNum)
{
var oSetProductImageElement = $(this.sSetProductImageID + iProductNum);
//해당 구성상품의 이미지영역이 없거나 id가 지정되지 않았으면 false
if (oSetProductImageElement.length < 1) {
return false;
}
return true;
},
/**
* 디자인에서 이미지가 노출될수있는 디자인인지 확인
* 상품상세에서 동일하게 사용하기위해서 따로 메서드로 분리
* @returns {boolean}
*/
isDisplayImageDesign : function()
{
var isMobile = false;
if (typeof(mobileWeb) !== 'undefined' && mobileWeb === true) {
isMobile = true;
this.sDetailImageClass = '.bigImage';
} else {
this.sDetailImageClass = '.BigImage';
}
if (isMobile === true) {
if ($('.xans-product-mobileimage').length > 0) {
this.isSwipe = true;
}
}
//상세이미지가 없다면 패스
if (this.isSwipe === false && $(this.sDetailImageClass).length < 1) {
return false;
}
return true;
},
/**
* 각 디자인에 따라 옵션 도는 품목이미지를 상세이미지에 노출
* @param sUrl 이미지주소
* @param isOptionFlag 각 옵션의 이미지가 아닌 모든옵션 선택후 품목의 이미지이면 false
* @param oOptionChoose 구분할 옵션박스 object
*/
setImage : function(sUrl, isOptionFlag, oOptionChoose)
{
if (this.bIsSetProduct === true) {
$(this.sSetProductImageID + EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose)).attr('src', sUrl);
} else {
//스와이프기능을 사용할때
if (this.isSwipe === true) {
if (isOptionFlag === false) {
//모든 옵션 선택후 품목에 연결이미지
this.setSwipeImage(sUrl, false);
} else {
//각 업션에 대한 옵션이미지
this.setSwipeImage('', true);
var iIndex = $('div.xans-product-mobileimage').find('li img[src="' + sUrl + '"]').parent().index();
$('div.typeSwipe').find('span > button:eq(' + iIndex + ')').trigger('click');
}
} else {
//스와이프기능을 사용안할때
$(this.sDetailImageClass).attr('src', sUrl);
}
}
},
/**
* 모바일 상품상세에서 스와이프 사용중일때
* 각 옵션의 연결이미지는 기존스와이프 영역으로
* 각 품목의 연결이미지는 원래 대표이미지 영역이 나오도록 함
* @param sSrc 해당 이미지 주소(품목 연결이미지일떄만)
* @param bIsShowSlide true => 각 옵션별 연결이미지, false => 각 품목별 연결이미지
* @param iButtonIndex 이미지 선택 버튼 순서값
* @param oTarget 처리할 스와이프 모듈 Object
*/
setSwipeImage : function(sSrc, bIsShowSlide, iButtonIndex, oTarget)
{
var oElement = $('div.xans-product-mobileimage');
var oSwipe = $('div.typeSwipe');
if (bIsShowSlide === true) {
oElement.find('ul.eOptionImageCloneTemplate').remove();
oElement.find('ul').show();
//품목이미지가 노출된후 다시 슬라이드버튼을 누르때 시간차로인대 css가 먹지 않아서 추가
if (typeof(iButtonIndex) !== 'undefined') {
// 만약 파라미터로 받은 특정 스와이프 모듈 Object가 존재하면 해당 모듈에서만 처리하도록 추가
if (typeof(oTarget) !== 'undefined') {
oSwipe = oTarget;
}
oSwipe.find('span > button:eq(' + iButtonIndex + ')').addClass('selected');
}
} else {
//첫번째 이미지를 기준으로 height가 정해지기때문에
//두번째 이미지에 할당함
oSwipe.find('span > button:eq(1)').trigger('click');
var oClone = oElement.find('ul').clone();
oClone.addClass('eOptionImageCloneTemplate');
//추가이미지가 1개만 있을경우에는 따로 삭제하지 않음
//추가이미지가 하개이면 버튼이 원래 두개이므로 따로 삭제하지 않아도 됨
if (oSwipe.find('span > button').length > 2) {
oClone.find('li').not('li:eq(0)').not('li:eq(1)').remove();
}
oClone.find('li:eq(1)').find('img').attr('src', sSrc);
oSwipe.find('span > button').removeClass('selected');
oElement.find('ul').hide();
oElement.find('ul:eq(0)').before(oClone);
}
}
};
/**
* 버튼 또는 미리보기 옵션일 경우 지정된 엘리먼트에 선택한 옵션값 보여주기
*/
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM = {
TARGET_ELEMENT_CLASS : '.ec-shop-front-product-option-desc-trigger',
/**
* 각 옵션선택시마다 이미지가 있다면 상세이미지에 반영되도록 함
* @param oOptionChoose 구분할 옵션박스 objectboolean
*/
eachCallback : function(oOptionChoose) {
//버튼 또는 미리보기 옵션이 아니면 리턴
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) {
return;
}
//셀렉터에 ""를 안붙이면 가끔 특정상횡에서 스크립트오류
var oTarget = $(oOptionChoose).closest('.xans-element- .xans-product').find("" + this.TARGET_ELEMENT_CLASS + "");
//디자인이 없다면 패스
if ($(oTarget).length < 1) {
return;
}
var sText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedText(oOptionChoose);
//선택항목에 text가 있다면
//추후에 셀렉트박스가 추가된다면... *나 **가 선택되었다면 예외처리해야함
if (typeof(sText) !== 'undefined' && $.trim(sText) !== '') {
$(oTarget).removeClass('ec-product-value').addClass('ec-product-value');
$(oTarget).html(sText);
} else {
$(oTarget).removeClass('ec-product-value');
$(oTarget).html($(oTarget).attr('data-option_msg'));
}
}
};
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION =
{
oCommon : null,
initObject : function()
{
if (this.oCommon !== null) {
return;
}
this.oCommon = EC_SHOP_FRONT_NEW_OPTION_COMMON;
},
sOptionKey : null,
prefetech : function(oOptionChoose)
{
this.initObject();
if (oSingleSelection.isItemSelectionTypeM() === true) {
return;
}
// 동일한 키로 선택된 상품이 없다면 prefetch는 할일이 없음
var oTarget = this.getDeleteTriggerElement(oOptionChoose);
if (oTarget.size() === 0) {
return;
}
if (this.oCommon.getOptionType(oOptionChoose) === 'F') {
return this.prefetchOptionTypeF(oOptionChoose);
}
if (this.oCommon.getOptionType(oOptionChoose) === 'E') {
return this.prefetchOptionTypeE(oOptionChoose);
}
oTarget.click();
},
prefetchOptionTypeE : function(oOptionChoose)
{
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
if (sOptionGroup.indexOf('setproduct') < 0) {
this.getDeleteTriggerElement(oOptionChoose).click();
return;
}
var oTarget = this.getDeleteTriggerElement(oOptionChoose);
var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_'));
var sOptionKey = $('#'+sOptionId+'_id').val();
this.sOptionKey = sOptionKey;
var sContext = this.getDeleteTriggerContext(oOptionChoose);
$(sContext).remove();
this.hookIndividualSetProductParameter(sOptionKey);
},
prefetchOptionTypeF : function(oOptionChoose)
{
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
var oTarget = this.getDeleteTriggerElement(oOptionChoose);
var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_'));
var sOptionKey = $('#'+sOptionId+'_id').val();
this.sOptionKey = sOptionKey;
// 추가구성상품
if (sOptionGroup.indexOf('addproduct') > -1) {
var aOptionInfo = $('#'+sOptionId+'_id').val().split('||');
sOptionKey = aOptionInfo[0];
this.sOptionKey = sOptionKey;
ProductAdd.delOptionBoxData(sOptionKey);
}
// 일반상품, 추가구성상품 동일
TotalAddSale.removeProductData(sOptionKey);
// 세트상품
if (sOptionGroup.indexOf('setproduct') > -1) {
this.hookIndividualSetProductParameter(sOptionKey);
}
},
eachCallback : function(oOptionChoose)
{
if (oSingleSelection.isItemSelectionTypeM() === true) {
return;
}
var sOptionType = this.oCommon.getOptionType(oOptionChoose);
if (sOptionType === 'F') {
return this.eachCallbackOptionTypeF(oOptionChoose);
}
if (sOptionType === 'E') {
return this.eachCallbackOptionTypeE(oOptionChoose);
}
},
eachCallbackOptionTypeE : function(oOptionChoose)
{
// 뭔가 값이 선택됐을때는 원래 돌던대로 돌린다
if (this.oCommon.getOptionSelectedValue(oOptionChoose) !== '*') {
return;
}
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
// 선택한 값이 취소된 경우에만 이 로직을 실행한다
// 모두 선택인 경우에는 하나라도 선택되었는지
if (this.oCommon.validation.checkRequiredOption(sOptionGroup) === false) {
bIsSelectedRequiredOption = this.oCommon.validation.isOptionSelected(oOptionChoose);
} else {
bIsSelectedRequiredOption = this.oCommon.validation.isSelectedRequiredOption(sOptionGroup);
}
// 뭔가 하나 선택되어있는 경우
if (this.oCommon.getItemCode(oOptionChoose) === false && bIsSelectedRequiredOption === true) {
var oOptionGroup = this.oCommon.getOptionLastSelectedElement(sOptionGroup);
if (sOptionGroup.indexOf('addproduct') > -1) {
var iProductNum = this.oCommon.getOptionProductNum(oOptionChoose);
if (this.oCommon.isOptionStyleButton(oOptionChoose) === true) {
ProductAdd.setAddProductOptionPushButton(iProductNum);
}
} else {
if (typeof(ProductSet) === 'object') {
if (this.oCommon.isOptionStyleButton(oOptionGroup) === true) {
var oOptionGroup = $('select[product_option_area_select="' + $(oOptionGroup).attr('product_option_area') + '"][id="' + $(oOptionGroup).attr('ec-dev-id') + '"]');
}
oSingleSelection.setProductTargetKey(oOptionGroup, 'setproduct');
ProductSet.procOptionBox(oOptionGroup);
} else {
if (typeof(setPrice) === 'function') {
var sID = this.oCommon.getOptionChooseID(oOptionGroup);
setPrice(false, true, sID);
}
}
}
} else {
if (sOptionGroup.indexOf('setproduct') === -1) {
return;
}
this.hookIndividualSetProductParameter(this.sOptionKey);
if (Object.keys(ProductSet.getSetIndividualList()).length > 0) {
TotalAddSale.getCalculatorSalePrice(ProductSet.setTotalPrice);
}
}
},
hookIndividualSetProductParameter : function(sOptionKey)
{
ProductSet.delOptionBoxData(sOptionKey);
// 분리세트 상품 코드 삭제
var oSetIndividualList = ProductSet.getSetIndividualList();
delete oSetIndividualList[sOptionKey];
TotalAddSale.setParam('unit_set_product_no', oSetIndividualList);
// 할인 금액 품목 코드 삭제
TotalAddSale.removeProductData(sOptionKey);
// 아무 옵션이 없는 경우
if (Object.keys(oSetIndividualList).length === 0) {
TotalAddSale.setParam('product', oProductList);
TotalAddSale.setTotalAddSalePrice(0);
ProductSet.setTotalPrice();
} else {
var aProductNo = [];
for (var i = 0 ; i < Object.keys(oSetIndividualList).length ; i++) {
var iProductNum = oSetIndividualList[Object.keys(oSetIndividualList)[i]];
if (aProductNo.indexOf(iProductNum) === -1) {
aProductNo.push(iProductNum);
}
}
if (aProductNo.length === 1) {
TotalAddSale.setParam('product_no', aProductNo[0]);
TotalAddSale.setParam('is_set', false);
} else {
TotalAddSale.setParam('product_no', iProductNo);
TotalAddSale.setParam('is_set', true);
}
}
},
eachCallbackOptionTypeF : function(oOptionChoose)
{
if (this.oCommon.getOptionSelectedValue(oOptionChoose) === '*') {
var oTarget = this.getDeleteTriggerElement(oOptionChoose);
// 옵션이 실제로 취소되었음
oTarget.click();
} else {
// 다른 옵션으로 변경되었음 - 삭제 액션이 아니라 삭제된거처럼 만들어야함
var sContext = this.getDeleteTriggerContext(oOptionChoose);
$(sContext).remove();
}
return true;
},
getDeleteTriggerElement : function(oOptionChoose)
{
var sSelector = this.getDeleteTriggerSelector(oOptionChoose);
var sContext = this.getDeleteTriggerContext(oOptionChoose);
return $(sSelector, sContext);
},
getTargetKey : function(oOptionChoose)
{
// 기본상품(옵션없는 상품, 조합형옵션 상품, 연동형 옵션 상품, 일체형 세트상품) : 상품번호
// 독립형 옵션 상품 : 상품번호|옵션순서
// 분리세트 상품 : 구성상품번호|세트상품번호
// 분리세트상품의 독립형 옵션 상품 : 구성상품번호|세트상품번호|옵션순서
var sTargetKey = this.oCommon.getOptionProductNum(oOptionChoose);
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
if (sOptionGroup.indexOf('setproduct') > -1) {
if (sSetProductType === 'S') {
sTargetKey = sTargetKey + '|' + iProductNo
} else {
sTargetKey = iProductNo;
}
}
if (this.oCommon.getOptionType(oOptionChoose) === 'F') {
sTargetKey = sTargetKey + '|' + this.oCommon.getOptionSortNum(oOptionChoose);
}
return sTargetKey;
},
getDeleteTriggerContext : function(oOptionChoose)
{
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
var sContext = 'tr.add_product';
if (sOptionGroup.indexOf('addproduct') < 0) {
sContext = 'tr.option_product';
}
var sTargetKey = this.getTargetKey(oOptionChoose);
return sContext+'[target-key='+sTargetKey+']';
},
getDeleteTriggerSelector : function(oOptionChoose)
{
var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose);
var sSelector = '.option_add_box_del';
if (sOptionGroup.indexOf('addproduct') < 0) {
sSelector = '.option_box_del';
}
return sSelector;
}
};
var oSingleSelection = function()
{
var sProductTargetKey = null;
var sSingleQuantityInputSelector = 'input.single-quantity-input';
var sIndexKey = '#PRODUCTNUM#';
var sSingleObjectName = 'oSingleItemData['+sIndexKey+']';
var getTotalPriceSelector = function()
{
return $('#totalProducts .total:visible').size() > 0 ? '#totalProducts .total' : '.xans-product-detail #totalPrice .total, .xans-product-zoom #totalPrice .total';
};
var isItemSelectionTypeS = function()
{
return $(sSingleQuantityInputSelector).filter(':visible').size() > 0;
};
var isItemSelectionTypeM = function()
{
return $(sSingleQuantityInputSelector).filter(':visible').size() === 0;
};
var getProductNum = function(oQuantityObject)
{
if ($(oQuantityObject).hasClass('single-quantity-input') === true) {
return parseInt($(oQuantityObject).attr('product-no'), 10);
}
if ($(oQuantityObject).attr('product-no')) {
return $(oQuantityObject).attr('product-no');
}
var sProductNumClass = $.grep($(oQuantityObject).attr('class').split(' '), function(sClassName,i) {
return $.trim(sClassName).indexOf('product-no-') === 0;
})[0];
return parseInt(sProductNumClass.replace('product-no-', ''), 10);
};
var getOptionSequenceNum = function(oQuantityObject)
{
if ($(oQuantityObject).hasClass('single-quantity-input') === true) {
return parseInt($(oQuantityObject).attr('option-sequence'), 10);
}
if ($(oQuantityObject).attr('has-option') === 'F') {
return 1;
}
if ($(oQuantityObject).attr('option_type') === 'F' && $(oQuantityObject).attr('option_sort_no')) {
return parseInt($(oQuantityObject).attr('option_sort_no'), 10);
}
var sSequenceClass = $.grep($(oQuantityObject).attr('class').split(' '), function(sClassName,i) {
return $.trim(sClassName).indexOf('option-sequence-') === 0;
})[0];
return parseInt(sSequenceClass.replace('option-sequence-', ''), 10);
};
var setProductTargetKey = function(oElement, sType)
{
var iTargetProductNum = iProductNo;
var sTargetKey = iProductNo;
var iOptionSequence = 1;
if (typeof(oElement) !== 'undefined') {
if (oElement.hasClass('single-quantity-input') === true || oElement.hasClass('quantity-handle') === true) {
iTargetProductNum = getProductNum(oElement);
iOptionSequence = getOptionSequenceNum(oElement);
} else {
var oOptionChoose = EC_SHOP_FRONT_NEW_OPTION_COMMON.setOptionBoxElement(oElement);
iTargetProductNum = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose);
if (isNaN(iTargetProductNum) === true) {
iTargetProductNum = $(oElement).attr('product-no');
}
iOptionSequence = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(oOptionChoose);
}
sTargetKey = iTargetProductNum;
}
if (sType === 'setproduct') {
if (sSetProductType === 'S') {
sTargetKey = iTargetProductNum+'|'+iProductNo;
}
}
var bAddProductOptionF = false;
var bSetProductOptionF = false;
if (sType === 'addproduct') {
var oOptionChoose = $('select#addproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence);
bAddProductOptionF = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F';
}
if (sType === 'setproduct') {
var oOptionChoose = $('select#setproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence);
bSetProductOptionF = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F';
}
if ((typeof(sType) === 'undefined' && option_type === 'F') || bSetProductOptionF === true || bAddProductOptionF === true) {
sTargetKey = sTargetKey+'|'+iOptionSequence;
}
sProductTargetKey = sTargetKey;
};
return {
getProductTargetKey : function()
{
return sProductTargetKey;
},
setProductTargetKey : function(oElement, sType)
{
return setProductTargetKey(oElement, sType);
},
getTotalPriceSelector : function()
{
return getTotalPriceSelector();
},
getProductNum : function(oQuantityButtnObject)
{
return getProductNum(oQuantityButtnObject);
},
getOptionSequence : function(oQuantityButtnObject)
{
return getOptionSequenceNum(oQuantityButtnObject);
},
getQuantityInput : function(oQuantityButtonObject, sContext)
{
var iSequenceNum = getOptionSequenceNum(oQuantityButtonObject);
var iProductNum = getProductNum(oQuantityButtonObject);
if (typeof(sContext) === 'undefined') {
sContext = null;
}
return $(sSingleQuantityInputSelector+'[option-sequence='+iSequenceNum+'][product-no='+iProductNum+']', sContext);
},
isItemSelectionTypeS : function()
{
return isItemSelectionTypeS();
},
isItemSelectionTypeM : function()
{
return isItemSelectionTypeM();
}
};
}();
var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET = {
/**
* 장바구니 담기 Ajax완료여부
*/
bIsLoadedPriceAjax : false,
/**
* 옵션 선택시 장바구니 바로 담기 기능 사용 여부
*/
bIsUseDirectBasket : false,
/**
* 옵션선택후 주석옵션이 선언되어있다면 바로 장바구니담기
* @param oOptionChoose 구분할 옵션박스 object
*/
completeCallback : function(oOptionChoose) {
if (this.isAvailableDirectBasket(oOptionChoose) === false) {
return;
}
var oInterval = setInterval(function () {
if (EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.bIsLoadedPriceAjax === true) {
//장바구니 담기
product_submit(2, '/exec/front/order/basket/', this);
EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.bIsLoadedPriceAjax = false;
//옵션박스 제거
$('.option_box_del').each(function() {
$(this).trigger('click');
});
//옵션선택값 초기화
$('[product_option_area="' + $(oOptionChoose).attr('product_option_area') + '"]').each(function() {
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', true, true);
});
clearInterval(oInterval);
}
}, 300);
},
/**
* 사용가능한 상태인지 확인
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @return boolean true : 사용가능, false : 사용불가
*/
isAvailableDirectBasket : function (oOptionChoose) {
if (this.bIsUseDirectBasket === false) {
return false;
}
oOptionChoose = EC_SHOP_FRONT_NEW_OPTION_COMMON.setOptionBoxElement(oOptionChoose);
if ($(oOptionChoose).attr('product_type') !== 'product_option') {
return false;
}
return true;
},
/**
* 옵션선택시 장바구니 바로담기 기능
*/
setUseDirectBasket : function ()
{
this.bIsUseDirectBasket = true;
}
};
/**
* 뉴상품 옵션 셀렉트 공통파일
*/
var EC_SHOP_FRONT_NEW_OPTION_COMMON = {
cons : null,
data : null,
bind : null,
validation : null,
/**
* 페이지 로드가 완료되었는지
*/
isLoad : false,
initObject : function() {
this.cons = EC_SHOP_FRONT_NEW_OPTION_CONS;
this.data = EC_SHOP_FRONT_NEW_OPTION_DATA;
this.bind = EC_SHOP_FRONT_NEW_OPTION_BIND;
this.validation = EC_SHOP_FRONT_NEW_OPTION_VALIDATION;
},
/**
* 페이지 로딩시 초기화
*/
init : function() {
var oThis = this;
//조합분리형이지만 옵션이 1개인경우
var bIsSolidOption = false;
//첫 로드시에는 첫번째 옵션만 검색
$('select[option_select_element="ec-option-select-finder"][option_sort_no="1"], ul[option_select_element="ec-option-select-finder"][option_sort_no="1"]').each(function() {
//연동형이 아닌고 분리형일때만 실행
bIsSolidOption = false;
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(this) === true) {
if (Olnk.isLinkageType($(this).attr('option_type')) === false) {
if (parseInt($('[product_option_area="'+oThis.getOptionSelectGroup(this)+'"]').length) < 2) {
bIsSolidOption = true;
}
oThis.data.initializeSoldoutFlag($(this));
oThis.setOptionText($(this), bIsSolidOption);
}
}
});
},
/**
* 옵션상품인데 모든옵션이 판매안함+진열안함일때 예외처리
* @param sProductOptionID 옵션 Selectbox ID
*/
isValidOptionDisplay : function(sProductOptionID)
{
var iOptionCount = 0;
$('select[option_select_element="ec-option-select-finder"][id^="' + sProductOptionID + '"], ul[option_select_element="ec-option-select-finder"][ec-dev-id^="' + sProductOptionID + '"]').each(function() {
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) {
iOptionCount += $(this).find('li').length;
} else {
iOptionCount += $(this).find('option').length - 2;
}
});
return iOptionCount > 0;
},
/**
* 각 옵션에대해 전체품절인지 확인후
*/
setOptionText : function(oOptionChoose, bIsSolidOption) {
var bIsStyleButton = this.isOptionStyleButton(oOptionChoose);
var oTargetOption = null;
if (bIsStyleButton === true) {
oTargetOption = $(oOptionChoose).find('li');
} else {
oTargetOption = $(oOptionChoose).find('option').filter('[value!="*"][value!="**"]');
}
var bIsDisplaySolout = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSoldoutOptionDisplay();
var iProductNum = this.getOptionProductNum(oOptionChoose);
var oThis = this;
$(oTargetOption).each(function() {
var sValue = oThis.getOptionValue(oOptionChoose, $(this));
var isSoldout = EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue);
var bIsDisplay = EC_SHOP_FRONT_NEW_OPTION_DATA.getDisplayFlag(iProductNum, sValue);
var sOptionText = oThis.getOptionText(oOptionChoose, this);
if (bIsDisplay === false) {
$(this).remove();
return;
}
//조합분리형인데 옵션이 1개인경우 옵션추가금액을 세팅)
if (bIsSolidOption === true) {
var sItemCode = oThis.data.getItemCode(iProductNum, sValue);
var sAddText = EC_SHOP_FRONT_NEW_OPTION_BIND.setAddText(iProductNum, sItemCode, oOptionChoose);
if (sAddText !== '') {
sOptionText = sOptionText + sAddText;
}
}
if (isSoldout === true) {
//품절표시안함일때 안보여주도록함(첫번째옵션이라서.. 어쩔수없이 여기서 ㅋ)
//두번째옵션부터는 동적생성이니깐 bind에서처리
if (bIsDisplaySolout === false) {
$(this).remove();
return;
}
//해당 옵션값 객첵가 넘어오면 바로 적용
if (bIsStyleButton === true) {
$(this).addClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SOLDOUT_CLASS);
}
//분리형이면서 전체상품이 품절이면
if (bIsSolidOption !== true) {
var sSoldoutText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getSoldoutText(oOptionChoose, sValue);
sOptionText = sOptionText + ' ' + sSoldoutText;
}
}
oThis.setText(this, sOptionText);
});
},
/**
* 품목이 아닌 각 옵션별로 전체품절인지 황니후 품절이면 품절문구 반환
* @param oOptionChoose
* @param sValue
* @returns {String}
*/
getSoldoutText : function(oOptionChoose, sValue) {
var sText = '';
var iProductNum = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose);
if (EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue) === true) {
return '[' + EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT.getSoldoutDiplayText(iProductNum) + ']';
}
return sText;
},
/**
* 셀렉트박스형 옵션인지 버튼형 옵션이지 확인
* @param oOptionChoose 구분할 옵션박스 object
* @returns true => 버튼형옵션, false => 기존 select형 옵션
*/
isOptionStyleButton : function(oOptionChoose) {
var sOptionStyle = $(oOptionChoose).attr(this.cons.OPTION_STYLE);
if (sOptionStyle === 'preview' || sOptionStyle === 'button' || sOptionStyle === 'radio') {
return true;
}
return false;
},
/**
* 해당 옵션의 옵션출력타입(분리형 : S, 일체형 : C)
* @param oOptionChoose 구분할 옵션박스 object
* @returns 옵션타입
*/
getOptionListingType : function(oOptionChoose)
{
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
return $(oOptionChoose).attr(this.cons.OPTION_LISTING_TYPE);
},
/**
* 해당 옵션의 옵션타입(조합형 : T, 연동형 : E, 독립형 : F)
* @param oOptionChoose 구분할 옵션박스 object
* @returns 옵션타입
*/
getOptionType : function(oOptionChoose) {
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
return $(oOptionChoose).attr(this.cons.OPTION_TYPE);
},
/**
* 해당 옵션의 옵션그룹명을 가져온다
* @param oOptionChoose 구분할 옵션박스 object
* @returns 옵션그룹이름
*/
getOptionSelectGroup : function(oOptionChoose) {
return $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME);
},
/**
* sOptionStyleConfirm 에 해당하는 옵션인지 확인
* @param oOptionChoose 구분할 옵션박스 object
* @param sOptionStyleConfirm 옵션스타일(EC_SHOP_FRONT_NEW_OPTION_CONS : OPTION_STYLE_PREVIEW 또는 OPTION_STYLE_BUTTON)
* @return boolean 확인결과
*/
isOptionStyle : function(oOptionChoose, sOptionStyleConfirm) {
var sOptionStype = $(oOptionChoose).attr(this.cons.OPTION_STYLE);
if (sOptionStype === sOptionStyleConfirm) {
return true;
}
return false;
},
/**
* 해당 옵션의 선택된 Text내용을 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns 옵션 내용Text
*/
getOptionSelectedText : function(oOptionChoose) {
if (this.isOptionStyleButton(oOptionChoose) === true) {
return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).attr('title');
} else {
return $(oOptionChoose).find('option:selected').text();
}
},
/**
* 해당 옵션의 선택된 값을 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns string 옵션값
*/
getOptionSelectedValue : function(oOptionChoose) {
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
if (this.isOptionStyleButton(oOptionChoose) === true) {
var oTarget = $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS);
//버튼형옵션은 *, **값이 없기떄문에 선택된게 없다면 강제리턴
if (oTarget.length < 1) {
return '*';
} else {
return oTarget.attr('option_value');
}
} else {
var sValue = $(oOptionChoose).val();
return ($.trim(sValue) === '') ? '*' : sValue;
}
},
/**
* 해당 Element의 값을 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @param oOptionChooseElement 값을 가져오려는 옵션 항목
* @returns string 옵션값
*/
getOptionValue : function(oOptionChoose, oOptionChooseElement) {
if (this.isOptionStyleButton(oOptionChoose) === true) {
return $(oOptionChooseElement).attr('option_value');
} else {
return $(oOptionChooseElement).val();
}
},
/**
* 해당 Element의 Text값을 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @param oOptionChooseElement 값을 가져오려는 옵션 항목
* @returns string 옵션값
*/
getOptionText : function(oOptionChoose, oOptionChooseElement) {
if (this.isOptionStyleButton(oOptionChoose) === true) {
return $(oOptionChooseElement).attr('title');
} else {
return $(oOptionChooseElement).text();
}
},
/**
* 선택된 옵션의 Element를 가져온다
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns 선택옵션의 DOM Element
*/
getOptionSelectedElement : function(oOptionChoose) {
if (this.isOptionStyleButton(oOptionChoose) === true) {
return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS);
} else {
return $(oOptionChoose).find('option:selected');
}
},
getOptionLastSelectedElement : function(sOptionGroup)
{
var oOptionGroup = this.getGroupOptionObject(sOptionGroup);
var aTempResult = [];
oOptionGroup.each(function(i) {
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(oOptionGroup[i]) !== '*') {
aTempResult.push(oOptionGroup[i]);
}
});
return $(aTempResult[aTempResult.length - 1]);
},
/**
* 해당 옵션의 상품번호를 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns int 상품번호
*/
getOptionProductNum : function(oOptionChoose) {
return parseInt($(oOptionChoose).attr(this.cons.OPTION_PRODUCT_NUM));
},
/**
* 해당 옵션의 순번을 가져옴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns int 해당 옵션의 순서 번호
*/
getOptionSortNum : function(oOptionChoose) {
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
return parseInt($(oOptionChoose).attr(this.cons.OPTION_SORT_NUM));
},
/**
* 이벤트 옵션까지에대해 현재까지 선택된 옵션값 배열
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @param bIsString 값이 true이면 선택된 옵션들을 구분자로 join해서 받아온다
* @returns 현재까지 선택된 옵션값 배열
*/
getAllSelectedValue : function(oOptionChoose, bIsString) {
var iOptionSortNum = this.getOptionSortNum(oOptionChoose);
//지금까지 선택된 옵션의 값
var aSelectedValue = [];
$('[product_option_area="'+$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME)+'"]').each(function() {
if (parseInt($(this).attr('option_sort_no')) <= iOptionSortNum) {
aSelectedValue.push(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue($(this)));
}
});
return (bIsString === true) ? aSelectedValue.join(this.cons.OPTION_GLUE) : aSelectedValue;
},
/**
* iSelectedOptionSortNum 의 하위옵션을 초기화(0일때는 모두초기화)ㅅ
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @param iSelectedOptionSortNum 하위옵션을 초기화할 대상 옵션 순번
*/
setInitializeDefault : function(oOptionChoose, iSelectedOptionSortNum) {
var sOptionGroup = $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME);
var iProductNum = this.getOptionProductNum(oOptionChoose);
this.bind.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum);
},
/**
* 외부에서 기존스크립트가 호출할때는 버튼형옵션객체가 아니라 숨겨진 셀렉트박스에서 호출하므로 버튼형옵션객체를 찾아서 리턴
*/
setOptionBoxElement : function(oOptionChoose) {
if (typeof($(oOptionChoose).attr('product_option_area_select')) !== 'undefined') {
oOptionChoose = $('ul[product_option_area="'+$(oOptionChoose).attr('product_option_area_select')+'"][ec-dev-id="'+$(oOptionChoose).attr('id')+'"]');
}
return oOptionChoose;
},
/**
* 선택한 옵션 하위옵션 모두 초기화(추가구성상품에서 연동형옵션때문에...)
* @param oOptionChoose
*/
setAllClear : function(oOptionChoose) {
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
var iSortNo = parseInt(this.getOptionSortNum(oOptionChoose));
$(this.getGroupOptionObject(this.getOptionSelectGroup(oOptionChoose))).each(function() {
if (iSortNo < parseInt(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum($(this)))) {
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue($(this), '*');
}
});
},
/**
* 멀티옵션(구스킨)에서 사용할때 해당 옵션의 id값을 바꾸는기능이 있어서 추가
* @param oOptionChooseOrg
* @param sId
*/
setID : function(oOptionChooseOrg, sId) {
if ($(oOptionChooseOrg).attr('option_style') === 'select') {
oOptionChoose = oOptionChooseOrg;
} else {
oOptionChoose = $(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]');
}
if (this.isOptionStyleButton(oOptionChoose) === true) {
$(oOptionChoose).attr('ec-dev-id', sId);
$(oOptionChooseOrg).attr('id', sId);
} else {
$(oOptionChoose).attr('id', sId);
}
},
/**
* 멀티옵션(구스킨)에서 사용할때 해당 옵션의 id값을 바꾸는기능이 있어서 추가
* @param oOptionChooseOrg
* @param sGroupID
*/
setGroupArea : function(oOptionChooseOrg, sGroupID) {
var oOptionChoose = null;
if ($(oOptionChooseOrg).attr('option_style') === 'select') {
oOptionChoose = oOptionChooseOrg;
} else {
oOptionChoose = $(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]');
}
if (this.isOptionStyleButton(oOptionChoose) === true) {
$(oOptionChoose).attr('product_option_area', sGroupID);
$(oOptionChooseOrg).attr('product_option_area_select', sGroupID);
} else {
$(oOptionChoose).attr('product_option_area', sGroupID);
}
},
/**
* 해당 선택한 옵션의 text값을 세팅
*/
setText : function(oSelectecOptionChoose, sText) {
oOptionChoose = this.setOptionBoxElement($(oSelectecOptionChoose).parent());
if (this.isOptionStyleButton(oOptionChoose) === true) {
var sValue = $(oSelectecOptionChoose).attr('option_value');
var oTarget = $(oOptionChoose).find('li[option_value="'+sValue+'"]');
$(oTarget).attr('title', sText);
}
if (this.isOptionStyleButton($(oSelectecOptionChoose).parent()) !== true) {
$(oSelectecOptionChoose).text(sText);
}
},
/**
* 추가 이미지에서 추출한 품목 코드를 바탕으로 옵션 선택
* @param sItemCode 품목 코드
*/
setValueByAddImage : function(sItemCode) {
if (typeof(sItemCode) === 'undefined') {
return;
}
this.selectItemCode('product_option_' + iProductNo + '_0', sItemCode);
},
/**
* 외부에서 옵션을 선택하는걸 호출할 경우 해당 옵션의 product_option_area값과 품목코드를 전달
* @param sOptionArea 옵션 element의 product_option_area값 attribute값
* @param sItemCode 품목코드
*/
selectItemCode : function(sOptionArea, sItemCode)
{
var oSelect = $('[product_option_area="' + sOptionArea + '"]');
oSelect = this.setOptionBoxElement(oSelect);
var sOptionListType = this.getOptionListingType(oSelect);
var sOptionType = this.getOptionType(oSelect);
//조합일체형이나 독립형인경우
if (sOptionListType === 'C' || sOptionType === 'F') {
this.setValue(oSelect, sItemCode, true, true);
} else {
var iProductNo = this.getOptionProductNum(oSelect);
var oItemData = this.getProductStockData(iProductNo);
if (oItemData === null) {
return;
}
if (oItemData.hasOwnProperty(sItemCode) === false) {
return;
}
var aOptionValue = oItemData[sItemCode].option_value_orginal;
oSelect.each(function (i) {
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, aOptionValue[i], true, true);
});
}
},
/**
* 해당 Element의 값을 강제로 지정
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @param sValue set 하려는 value
* @param bIsInitialize false인 경우에는 클릭이벤트를 발생하지 않도록 한다
* @param bChange change 이벤트 발생 여부
*/
setValue : function(oOptionChoose, sValue, bIsInitialize, bChange) {
// 값 세팅시 각 페이지에서 $(this).val()로 값을 지정할경우
// 본래 버튼형 옵션이면 타겟을 버튼형 옵션으로 이어준다
oOptionChoose = this.setOptionBoxElement(oOptionChoose);
if (this.isOptionStyleButton(oOptionChoose) === true) {
//옵션이 선택되어있는상태면 초기화후 선택
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isOptionSelected(oOptionChoose) === true) {
$(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).trigger('click');
}
var oTarget = $(oOptionChoose).find('li[option_value="' + sValue + '"]');
if ($(oTarget).length > 0) {
$(oTarget).trigger('click');
} else {
if (bIsInitialize !== false) {
// 선택값이 없다면 셀렉트박스 초기화
var iProductNum = this.getOptionProductNum(oOptionChoose);
var iSelectedOptionSortNum = this.getOptionSortNum(oOptionChoose);
var sOptionGroup = this.getOptionSelectGroup(oOptionChoose);
var bIsRequired = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(oOptionChoose);
if (EC_SHOP_FRONT_NEW_OPTION_BIND.isEnabledOptionInit(oOptionChoose) === true) {
EC_SHOP_FRONT_NEW_OPTION_BIND.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum, bIsRequired);
}
EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM.eachCallback(oOptionChoose);
EC_SHOP_FRONT_NEW_OPTION_BIND.setRadioButtonSelect(oTarget, oOptionChoose, false);
}
this.setTriggerSelectbox(oOptionChoose, sValue);
}
} else {
$(oOptionChoose).val(sValue);
if (typeof(bChange) !== 'undefined') {
$(oOptionChoose).trigger('change');
}
}
},
/**
* 버튼 또는 이미지형 옵션일 경우 동적 selectbox와 동기화 시킴
* @param oOptionChoose 선택한 옵션 Object
* @param sValue set 하려는 value
* @param bIsTrigger 셀렉트박스의 change 이벤트를 발생시키지 않을때(ex:모바일의 옵션선택 레이어..)
*/
setTriggerSelectbox : function(oOptionChoose, sValue, bIsTrigger)
{
if (this.isOptionStyleButton(oOptionChoose) === true) {
var oTargetSelect = $('select[product_option_area_select="' + $(oOptionChoose).attr('product_option_area') + '"][id="' + $(oOptionChoose).attr('ec-dev-id') + '"]');
var bChange = true;
var sText = '';
if (this.validation.isItemCode(sValue) === false) {
sValue = '*';
sText = 'empty';
bChange = false;
} else {
sValue = this.getOptionSelectedValue(oOptionChoose);
sText = this.getOptionSelectedText(oOptionChoose);
}
if (sValue !== '*') {
$(oTargetSelect).find('option[value="' + sValue + '"]').remove('option');
var sOptionsHtml = this.cons.OPTION_STYLE_SELECT_HTML.replace('[value]', sValue).replace('[text]', sText);
$(oTargetSelect).append($(sOptionsHtml));
}
$(oTargetSelect).val(sValue);
if (bChange === true && bIsTrigger !== false) {
$(oTargetSelect).trigger('change');
}
}
},
/**
* 해당 상품의 옵션 재고 관련 데이터를 리턴
* @param iProductNum 상품번호
* @returns option_stock_data 데이터
*/
getProductStockData : function(iProductNum) {
return this.data.getProductStockData(iProductNum);
},
/**
* 선택상품의 아이템코드를 반환(선택이 안되어있다면 false)
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns 아이템 코드 OR false
*/
getItemCode : function(oOptionChoose) {
//분리조합형일경우
if (this.validation.isSeparateOption(oOptionChoose) === true) {
var sSelectedValue = this.getAllSelectedValue(oOptionChoose, true);
var iProductNum = this.getOptionProductNum(oOptionChoose);
return this.data.getItemCode(iProductNum, sSelectedValue);
}
//그외의 경우에는 현재 선택된 옵션의 value가 아이템코드
var sItemCode = this.getOptionSelectedValue(oOptionChoose);
return (this.validation.isItemCode(sItemCode) === true) ? sItemCode : false;
},
/**
* 해당 그룹내의 모든옵션에대해 선택된 품목코드를 반환
* @param sOptionGroup 옵션 그룹 (@see : EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS)
* @param bIsAbleSoldout 품절품목에 대한 아이템코드도 포함
* @returns array 선택된 아이템코드 배열
*/
getGroupItemCodes : function(sOptionGroup, bIsAbleSoldout) {
var aItemCode = [];
var sItemCode = '';
var oTarget = $('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]');
//뉴스킨인 경우에는 옵션박스 레이어에 생성된 input에서 가져온다
if (isNewProductSkin() === true) {
$('.' + EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS.DETAIL_OPTION_BOX_PREFIX).each(function() {
//옵션박스에 생성된 input태그이므로 val()로 가져온다
sItemCode = $(this).val();
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sItemCode) === true) {
aItemCode.push(sItemCode);
}
});
//품절품목에 대한 아이템코드도 포함시킨다 - 현재는 관심상품담을경우에 쓰이는것으로 보임
if (bIsAbleSoldout === true) {
$('.' + EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS.DETAIL_OPTION_BOX_SOLDOUT_PREFIX).each(function() {
aItemCode.push($(this).val());
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sItemCode) === true) {
aItemCode.push(sItemCode);
}
});
}
} else {
//구스킨인 경우에는 해당하는 옵션에 선택된 값만 가져옴
$(oTarget).each(function() {
sItemCode = EC_SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(this);
//이미 저장된 아이템코드이면 제와(분리형인경우 같은 값이 여러개 들어올수있음)
//조합형을 따로 처리하기보다는 그냥 두는게 더 간단하다는 핑계임
if ($.inArray(sItemCode, aItemCode) > -1) {
return true;//continue
}
if (sItemCode !== false) {
aItemCode.push(sItemCode);
}
});
}
return aItemCode;
},
/**
* 해당 품목의 품절 여부
* @param iProductNum 상품번호
* @param sItemCode 품목코드
* @returns boolean 품절여부
*/
isSoldout : function(iProductNum, sItemCode) {
var aStockData = this.getProductStockData(iProductNum);
if (typeof(aStockData[sItemCode]) === 'undefined') {
return false;
}
//재고를 사용하고 재고수량이 1개미만이면 품절
if (aStockData[sItemCode].use_stock === true && parseInt(aStockData[sItemCode].stock_number) < 1) {
return true;
}
//판매안함 상태이면 품절
if (aStockData[sItemCode].is_selling === 'F') {
return true;
}
return false;
},
/**
* 진열여부 확인
*/
isDisplay : function(iProductNum, sItemCode) {
var aStockData = this.getProductStockData(iProductNum);
if (typeof(aStockData[sItemCode]) === 'undefined') {
return false;
}
if (aStockData[sItemCode].is_display !== 'T') {
return false;
}
return true;
},
/**
* sOptionGroup에 해당하는 옵션셀렉트박스의 Element를 가져온다
* @param sOptionGroup sOptionGroup 옵션 그룹 (@see : EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS)
* @returns 해당 옵션셀렉트박스 Element전체
*/
getGroupOptionObject : function(sOptionGroup) {
return $('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]');
},
/**
* 해당 옵션그룹에서 필수옵션의 갯수를 가져온다
* @param sOptionGroup sOptionGroup 옵션 그룹 (@see : EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS)
* @returns 필수옵션 갯수
*/
getRequiredOption : function(sOptionGroup) {
return this.getGroupOptionObject(sOptionGroup).filter('[required="true"],[required="required"]');
},
/**
* 해당 옵션의 전체 Value값을 가져옴(옵션그룹이 아니라 단일 옵션 셀렉츠박스)
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns {Array}
*/
getAllOptionValues : function(oOptionChoose) {
//일반 셀렉트박스일때
var aOptionValue = [];
if (this.isOptionStyleButton(oOptionChoose) === false) {
$(oOptionChoose).find('option[value!="*"][value!="**"]').each(function() {
aOptionValue.push($(this).val());
});
} else {
//버튼형 옵션일경우
$(oOptionChoose).find('li[option_value!="*"][option_value!="**"]').each(function() {
aOptionValue.push($(this).attr('option_value'));
});
}
return aOptionValue;
},
/**
* 해당 옵션의 실제 id값을 리턴
* @param oOptionChoose 값을 가져오려는 옵션박스 object
* @returns {String}
*/
getOptionChooseID : function(oOptionChoose) {
var sID = '';
if (this.isOptionStyleButton(oOptionChoose) === true) {
sID = $(oOptionChoose).attr('ec-dev-id');
} else {
sID = $(oOptionChoose).attr('id');
}
return sID;
}
};
/**
* 옵션에대한 Attribute 및 구분자 모음
*/
var EC_SHOP_FRONT_NEW_OPTION_CONS = {
/**
* 옵션 그룹 Attribute Key(각 상품 및 영역별 구분을 위한 값)
*/
GROUP_ATTR_NAME : 'product_option_area',
/**
* 옵션 스타일 Attribute Key
*/
OPTION_STYLE : 'option_style',
/**
* 상품번호 Attribute Key
*/
OPTION_PRODUCT_NUM : 'option_product_no',
/**
* 각 옵션의 옵션순서 Attribute Key
*/
OPTION_SORT_NUM : 'option_sort_no',
/**
* 옵션 타입 Attribute Key
*/
OPTION_TYPE : 'option_type',
/**
* 옵션 출력 타입 Attribute Key
*/
OPTION_LISTING_TYPE : 'item_listing_type',
/**
* 옵션 값 구분자
*/
OPTION_GLUE : '#$%',
/**
* 미리보기형 옵션
*/
OPTION_STYLE_PREVIEW : 'preview',
/**
* 버튼형 옵션
*/
OPTION_STYLE_BUTTON : 'button',
/**
* 기존 셀렉트박스형 옵션
*/
OPTION_STYLE_SELECT : 'select',
/**
* 라디오박스형 옵션
*/
OPTION_STYLE_RADIO : 'radio',
/**
* 각 옵션마다 연결된 이미지 Attribute
*/
OPTION_LINK_IMAGE : 'link_image',
/**
* 셀렉트박스형 옵션의 Template
*/
OPTION_STYLE_SELECT_HTML : '
',
/**
* 기본 품절 문구
*/
OPTION_SOLDOUT_DEFAULT_TEXT : __("품절"),
/**
* 버튼형 옵션의 품절표시 class
*/
BUTTON_OPTION_SOLDOUT_CLASS : 'ec-product-soldout',
/**
* 버튼형 옵션의 선택불가 class
*/
BUTTON_OPTION_DISABLE_CLASS : 'ec-product-disabled',
/**
* 버튼형 옵션의 선택된 옵션값을 구분하기위한 상수
*/
BUTTON_OPTION_SELECTED_CLASS : 'ec-product-selected'
};
/**
* 각 옵션그룹에 대한 Key 정의
*/
var EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS = {
/**
* 상품디테일의 메인 옵션 그룹
*/
DETAIL_OPTION_GROUP_ID : 'product_option_',
/**
* 뉴스킨 상품상세의 옵션선택시 쩔어지는 옵션박스레이어 class명
*/
DETAIL_OPTION_BOX_PREFIX : 'option_box_id',
/**
* 뉴스킨 상품상세의 옵션선택시 쩔어지는 옵션박스레이어 class명(품절일경우의 prefix)
* Prefix존누 많음
*/
DETAIL_OPTION_BOX_SOLDOUT_PREFIX : 'soldout_option_box_id'
};
var EC_SHOP_FRONT_NEW_OPTION_BIND = {
/**
* 선택한 옵션 그룹(product_option_상품번호 : 상품상세일반상품)
*/
sOptionGroup : null,
/**
* 옵션이 모두 선택되었을때 해당하는 item_code를 Set
*/
sItemCode : false,
/**
* 선택한 옵션의 상품번호
*/
iProductNum : 0,
/**
* 선택한 옵션의 순번
*/
iOptionIndex : null,
/**
* 선택한 옵션의 옵션 스타일(select : 셀렉트박스, preview : 미리보기, button : 버튼형)
*/
sOptionStyle : null,
/**
* 해당 상품 옵션 갯수
*/
iOptionCount : 0,
/**
* 품절옵션 표시여부
*/
bIsDisplaySolout : true,
/**
* 선택한 옵션의 객체(셀렉트박스 또는 버튼형 옵션 박스(ul태그))
*/
oOptionObject : null,
/**
* 선택한 옵션의 다음옵션 Element
*/
oNextOptionTarget : null,
/**
* 선택된 옵션 값
*/
aOptionValue : [],
/**
* 옵션텍스트에 추가될 항목에대한 정의
*/
aExtraOptionText : [
EC_SHOP_FRONT_NEW_OPTION_EXTRA_PRICE,
EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT,
EC_SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE,
EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM,
EC_SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION,
EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET
],
/**
* EC_SHOP_FRONT_NEW_OPTION_CONS 객체 Alias
*/
cons : null,
/**
* EC_SHOP_FRONT_NEW_OPTION_COMMON 객체 Alias
*/
common : null,
/**
* EC_SHOP_FRONT_NEW_OPTION_DATA 객체 Alias
*/
data : null,
/**
* EC_SHOP_FRONT_NEW_OPTION_VALIDATION 객체 Alias
*/
validation : null,
isEnabledOptionInit : function(oOptionChoose)
{
var iProductNum = $(oOptionChoose).attr('option_product_no');
//연동형이면서 옵션추가버튼설정이면 순차로딩제외
if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) {
return false;
}
if (this.common.getOptionType(oOptionChoose) === 'F') {
return false;
}
return true;
},
/**
* 각 옵션값에 대한 이벤트 처리
* @param oThis 옵션 셀렉트박스 또는 버튼박스
* @param oSelectedElement 선택한 옵션값
* @param bIsUnset true 이명 deselected된상태로 초기화(setValue를 통해서 틀어왔을떄만 값이 있음)
*/
initialize : function(oThis, oSelectedElement, bIsUnset)
{
this.sItemCode = false;
this.oOptionObject = oThis;
// 실제 옵션 처리전에 처리해야할 내용을 모아 놓는다
this.prefetch(oThis);
if (oSelectedElement !== null) {
if ($(oSelectedElement).hasClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS) === true) {
this.setRadioButtonSelect(oSelectedElement, oThis, false);
return;
}
//선택 옵션에대한 disable처리나 활성화 처리
this.setSelectButton(oSelectedElement, bIsUnset);
//필수정보 Set
this.setSelectedOptionConf();
//연동형이면서 옵션추가버튼설정이면 순차로딩제외..
if (this.isEnabledOptionInit(this.oOptionObject) === true) {
var bIsDelete = true;
var bIsRequired = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this.oOptionObject);
//해당 옵션이 연동형이면서 선택형 옵션이면 하위 옵션은 값만 초기화
if (Olnk.isLinkageType(this.common.getOptionType(this.oOptionObject)) === true && bIsRequired=== false) {
bIsDelete = false;
}
//선택한 옵션이 옵션이 아닐경우 하위옵션 초기화
//선택한 옵션이 옵션이 아니면 아래 로직은 타지 않고 eachCallback은 실행함
this.setInitializeDefault(this.sOptionGroup, this.iOptionIndex, this.iProductNum, bIsRequired);
if (bIsDelete === true && $(oSelectedElement).hasClass(this.cons.BUTTON_OPTION_DISABLE_CLASS) === false && this.validation.isOptionSelected(this.oOptionObject) === true) {
//선택한 옵션의 다음옵션값을 Parse
//연동형일경우에는 제외 / 조합분리형만 처리되도록 함
if (Olnk.isLinkageType(this.sOptionType) === false && this.validation.isSeparateOption(this.oOptionObject) === true) {
this.data.initializeOptionValue(this.oOptionObject);
}
//각 옵션을 초기화및 옵션 리스트 HTML생성
//조합분리형일때만 처리
if (this.validation.isSeparateOption(this.oOptionObject) === true) {
this.setOptionHTML();
}
}
}
//해당 값이 true나 false이면 setValue를 통해서 들어온것이기때문에 다시 실행할 필요 없음
//if (typeof(bIsUnset) === 'undefined') {
//셀렉트박스 동기화
this.common.setTriggerSelectbox(this.oOptionObject, this.common.getOptionSelectedValue(this.oOptionObject));
//}
//옵션이 모두 선택되었다면 아이템코드를 세팅
this.setItemCode();
}
//옵션선택이 끝나면 각 옵션마다 처리할 프로세스(각 추가기능에서)
this.eachCallback(oThis);
//모든 옵션이 선택되었다면
if (this.sItemCode !== false) {
var sID = this.common.getOptionChooseID(this.oOptionObject);
//상세 메인 상품에서만 실행되도록 예외처리
if (typeof(setPrice) === 'function' && /^product_option_id+/.test(sID) === true) {
setPrice(false, true, sID);
}
//모든 옵션선택이 끝나면 처리할 프로세스(각 추가기능에서)
this.completeCallback(oThis);
}
},
/**
* 실제 옵션의 선택여부를 해제하기전 실행하는 액션
*/
prefetch : function(oThis)
{
$(this.aExtraOptionText).each(function() {
if (typeof(this.prefetech) === 'function') {
this.prefetech(oThis);
}
});
},
/**
* 각 옵션 선택시마다 처리할 Callback(Extra에 있는 추가기능)
*/
eachCallback : function(oThis)
{
$(this.aExtraOptionText).each(function() {
if (typeof(this.eachCallback) === 'function') {
this.eachCallback(oThis);
}
});
},
/**
* 옵션선택을 하고 품목이 정해졌을때 Callback(Extra에 있는 추가기능)
*/
completeCallback : function(oThis)
{
$(this.aExtraOptionText).each(function() {
if (typeof(this.completeCallback) === 'function') {
this.completeCallback(oThis);
}
});
},
/**
* iSelectedOptionSortNum보다 하위 옵션들을 초기상태로 변경함
* @param sOptionGroup 옵션선택박스 그룹
* @param iSelectedOptionSortNum 하위옵션을 초기화할 대상 옵션 순번
* @param iProductNum 상품번호
* @param bIsSetValue COMMON.setValue에서 호출시에는 다시 setValue를 하지 않는다
*/
setInitializeDefault : function(sOptionGroup, iSelectedOptionSortNum, iProductNum, bSelectedOptionRequired) {
var iSortNum = 0;
var sHtml = '';
var bIsDelete = null;
$('['+this.cons.GROUP_ATTR_NAME+'="'+sOptionGroup+'"]').each(function() {
iSortNum = parseInt(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(this));
//선택한 옵션의 하위옵션들을 초기화
if (iSelectedOptionSortNum < iSortNum) {
var bIsRequired = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this);
//선택했던 옵션이 연동형이면서 선택형 옵션이면 값만 초기화
//bIsDelete = (bIsDelete = null && isOlnk === true && bSelectedOptionRequired === true && bIsRequired === false) ? false : true;
if (bIsDelete === null) {
//선택했던 옵션이 선택형 옵션이면 처리하지 않음
if (bSelectedOptionRequired === false) {
bIsDelete = false;
} else if (bSelectedOptionRequired === true) {//선택했던 옵션이 필수옵션이면 진행
//선택했던 옵션이 필수이면서 현재 옵션이 필수이면 초기화
if (bIsRequired === true) {
bIsDelete = true;
} else {
//선택했던 옵션이 필수이면서 현재옵션이 선택형옵션이면 다음옵션에서 체크
bIsDelete = null;
}
}
}
if (bIsDelete === true) {
sHtml = EC_SHOP_FRONT_NEW_OPTION_DATA.getDefaultOptionHTML(iProductNum, iSortNum);
$(this).html('');
$(this).append(sHtml);
}
//셀렉트박스이면서 필수옵션이라면 기본값을 제외하고 option삭제
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyle(this, EC_SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_SELECT) === true) {
if (bIsDelete === true && bIsRequired === true) {
$(this).find('option').attr('disabled', 'disable');
$(this).find('option[value!="*"][value!="**"]').remove('option');
} else {
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', false);
}
}
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) {
if (bIsDelete === true && bIsRequired === true) {
$(this).find('li').removeClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS).addClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS);
}
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', false);
//옵션 텍스트 초기화
EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM.eachCallback(this);
}
//첫번째 필수 옵션은 그대로 두고 두번째 필수옵션부터 remove
if (bIsDelete !== null && bIsRequired === true) {
bIsDelete = true;
}
}
});
},
/**
* 옵션이 모두 선택되었다면 아이템코드 Set
*/
setItemCode : function() {
//연동형 상품 : 예외적인경우가 많아서 어쩔수가 없음...
if (Olnk.isLinkageType(this.common.getOptionType(this.oOptionObject)) === true) {
//선택한 값이 옵션이 아니라면 false
if (this.validation.isItemCode(this.common.getOptionSelectedValue(this.oOptionObject)) === false) {
return false;
}
//연동형 옵션
var aSelectedValues = this.common.getAllSelectedValue(this.oOptionObject);
//필수옵션 갯수
var iRequiredOption = this.common.getRequiredOption(this.sOptionGroup).length;
//선택한 옵션갯수보다 필수옵션이 많다면 false
if (iRequiredOption > $(aSelectedValues).length) {
return false;
}
//실제 필수옵션이 체크되어있는지
var aOptionValues = [];
var bIsExists = false;
var iRequireSelectedOption = 0;
//필수항목만 검사
this.common.getRequiredOption(this.sOptionGroup).each(function() {
bIsExists = false;
aOptionValues = EC_SHOP_FRONT_NEW_OPTION_COMMON.getAllOptionValues(this);
//필수 항목 옵션의 값을 실제 선택한옵션가눙데 존재하는지 일일히 확인해야한다
$(aSelectedValues).each(function(i, iNo) {
//선택된 옵션중에 존재한다면 필수값이 선택된것으로 확인
if ($.inArray(iNo, aOptionValues) > -1) {
bIsExists = true;
return;
}
});
if (bIsExists === true) {
iRequireSelectedOption++;
}
});
//전체 필수값 갯수가 선택된 필수옵션보다 많다면 false
if (iRequiredOption > iRequireSelectedOption) {
return false;
}
this.sItemCode = aSelectedValues;
} else if (this.validation.isSeparateOption(this.oOptionObject) === true) {
//조합분리형은 옵션값으로 파싱해서 가져와야함
if (parseInt(this.iOptionCount) > parseInt(this.aOptionValue.length)) {
return false;
}
this.sItemCode = this.data.getItemCode(this.iProductNum, this.aOptionValue.join(this.cons.OPTION_GLUE));
} else {
//조합분리형 이외에는 선택한 옵션의 value가 아이템코드
this.sItemCode = this.common.getOptionSelectedValue(this.oOptionObject);
}
},
/**
* 각 옵션을 초기화및 옵션 리스트 HTML생성
*/
setOptionHTML : function() {
//하위옵션이 없다면(마지막 옵션을 선택한경우) 하위옵션이 없음으로 따로 만들지 않아도 된다
if (parseInt(this.iOptionCount) === parseInt(this.aOptionValue.length)) {
return;
}
if (this.oNextOptionTarget === null) {
return;
}
var sSelectedOption = this.aOptionValue.join(this.cons.OPTION_GLUE);
var aOptions = this.data.getOptionValueArray(this.iProductNum, sSelectedOption);
//셀렉트박스일때 다음옵션 박스 초기화
if (this.common.isOptionStyleButton(this.oNextOptionTarget) === false) {
this.setOptionHtmlForSelect(aOptions, sSelectedOption);
} else {
this.setOptionHtmlForButton(aOptions, sSelectedOption);
}
},
/**
* 버튼형 옵션일 경우 해당 버튼 HTML초기화 및 해당 옵션값 Set
* @param aOptions 옵션값 리스트
* @param sSelectedOption 현재까지 선택된 옵션조합
*/
setOptionHtmlForButton : function(aOptions, sSelectedOption) {
//선택한값이 *sk ** 이면 다음옵션을 disable처리
if (this.validation.isItemCode(this.common.getOptionSelectedValue(this.oOptionObject)) === false) {
this.oNextOptionTarget.find('li').removeClass(this.cons.BUTTON_OPTION_DISABLE_CLASS).addClass(this.cons.BUTTON_OPTION_DISABLE_CLASS);
} else {
this.oNextOptionTarget.find('li').removeClass(this.cons.BUTTON_OPTION_DISABLE_CLASS);
}
//연동형일경우에는 disable / select만 제거
if (Olnk.isLinkageType(this.sOptionType) === true) {
//하위옵션들만 selected클래스 삭제
if (parseInt($(this.oOptionObject).attr('option_sort_no')) < parseInt($(this.oNextOptionTarget).attr('option_sort_no'))) {
$(this.oNextOptionTarget).find('li').removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS);
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this.oNextOptionTarget, '*', false);
}
return;
}
this.oNextOptionTarget.find('li').remove('li');
var iNextOptionSortNum = this.common.getOptionSortNum(this.oNextOptionTarget);
var bIsLastOption = false;
//생성될 옵션이 마지막 옵션이면 옵션 Text에 추가 항목(옵션가 품절표시등)을 처리
if (parseInt(iNextOptionSortNum) === this.iOptionCount) {
bIsLastOption = true;
}
var oObject = this;
var sOptionsHtml = '';
//옵션 셀렉트박스 Text에 추가될 문구 처리
var sAddText = '';
var sItemCode = false;
//품절옵션인데 품절옵션표시안함설정이면 삭제
var bIsSoldout = false;
var bIsDisplay = true;
$(aOptions).each(function(i, oOption) {
sAddText = '';
bIsSoldout = false;
bIsDisplay = true;
//페이지 로딩시 저장된 해당 옵션의 HTML을 가져온다
sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value);
sOptionsHtml = $(sOptionsHtml).clone().removeClass(oObject.BUTTON_OPTION_DISABLE_CLASS);
//마지막 옵션일 경우에는
if (bIsLastOption === true) {
sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value);
//진열안함이면 패스
if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) {
bIsDisplay = false;
}
sAddText = oObject.setAddText(oObject.iProductNum, sItemCode);
//품절상품인경우 품절class추가
if (oObject.common.isSoldout(oObject.iProductNum, sItemCode) === true) {
$(sOptionsHtml).removeClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS);
bIsSoldout = true;
}
} else {
var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value;
sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText);
if (sAddText !== '') {
$(sOptionsHtml).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS);
bIsSoldout = true;
}
if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) {
bIsDisplay = false;
}
}
if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) {
$(this).remove();
return;
}
oObject.oNextOptionTarget.append($(sOptionsHtml).attr('title', oOption.value + sAddText));
});
EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this.oNextOptionTarget, '*', false);
},
/**
* 셀렉트박스형 옵션일 경우 selectbox초기화 및 해당 옵션값 Set
* @param aOptions 옵션값 리스트
* @param sSelectedOption 현재까지 선택된 옵션조합 배열
*/
setOptionHtmlForSelect : function(aOptions, sSelectedOption) {
this.oNextOptionTarget.find('option').removeAttr('disabled');
//연동형일경우에는 초기화 시키고 disable제거
//if (Olnk.isLinkageType(this.sOptionType) === true && EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this.oNextOptionTarget)) {
if (Olnk.isLinkageType(this.sOptionType) === true) {
var sHtml = this.data.getDefaultOptionHTML(this.common.getOptionProductNum(this.oNextOptionTarget), this.common.getOptionSortNum(this.oNextOptionTarget));
$(this.oNextOptionTarget).find('option').remove();
$(this.oNextOptionTarget).append(sHtml);
$(this.oNextOptionTarget).find('option').removeAttr('disabled');
$(this.oNextOptionTarget).val('*');
return;
}
//옵션이 아닌 Default선택값을 제외하고 모두 삭제
this.oNextOptionTarget.find('option[value!="*"][value!="**"]').remove();
//선택한 옵션의 다음순서옵션항목
var iNextOptionSortNum = this.common.getOptionSortNum(this.oNextOptionTarget);
var bIsLastOption = false;
//생성될 옵션이 마지막 옵션이면 옵션 Text에 추가 항목(옵션가 품절표시등)을 처리
if (parseInt(iNextOptionSortNum) === this.iOptionCount) {
bIsLastOption = true;
}
var oObject = this;
var sOptionsHtml = '';
var sItemCode = false;
//옵션 셀렉트박스 Text에 추가될 문구 처리
var sAddText = '';
//품절옵션인데 품절옵션표시안함설정이면 삭제
var bIsSoldout = false;
$(aOptions).each(function(i, oOption) {
sAddText = '';
bIsSoldout = false;
bIsDisplay = true;
sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value);
sOptionsHtml = $(sOptionsHtml).clone();
//마지막 옵션일 경우에는 설정에따라 옵션title에 추가금액등의 text를 붙인다
if (bIsLastOption === true) {
sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value);
//진열안함이면 패스
if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) {
bIsDisplay = false;
}
sAddText = oObject.setAddText(oObject.iProductNum, sItemCode);
bIsSoldout = EC_SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(oObject.iProductNum, sItemCode);
} else {
//품절문구(각 옵션마다도 보여줘야함...)
var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value;
sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText);
bIsSoldout = (sAddText === '') ? false : true;
if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) {
bIsDisplay = false;
}
}
if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) {
$(this).remove();
return;
}
$(sOptionsHtml).val(oOption.value);
$(sOptionsHtml).removeAttr('disabled');
$(sOptionsHtml).text(oOption.value + sAddText);
oObject.oNextOptionTarget.append($(sOptionsHtml));
});
},
/**
* 마지막 옵션에 추가될 추가항목들(추가금액, 품절 등)
* @param iProductNum 상품번호
* @param sItemCode 아이템 코드
* @param oOptionElement 옵션셀렉트박스를 임의로 지정할경우
*/
setAddText : function(iProductNum, sItemCode, oOptionElement) {
var aText = [];
if (typeof(oOptionElement) !== 'object') {
oOptionElement = this.oOptionObject;
}
$(this.aExtraOptionText).each(function() {
if (typeof(this.get) === 'function') {
aText.push(this.get(iProductNum, sItemCode, oOptionElement));
}
});
return aText.join('');
},
/**
* 옵션 선택박스(셀렉트박스나 버튼)에 click 또는 change에 대한 이벤트 할당
*/
initChooseBox : function() {
this.cons = EC_SHOP_FRONT_NEW_OPTION_CONS;
this.common = EC_SHOP_FRONT_NEW_OPTION_COMMON;
this.data = EC_SHOP_FRONT_NEW_OPTION_DATA;
this.validation = EC_SHOP_FRONT_NEW_OPTION_VALIDATION;
var oThis = this;
//live로 할경우에 기존 이벤트가 없어짐.
$('select[option_select_element="ec-option-select-finder"]').unbind().change(function() {
if (oThis.common.isOptionStyleButton(this) === true) {
return false;
}
//페이지 로드가 되었는지 확인.
if (typeof(oThis.common.isLoad) === false) {
$(this).val('*');
return false;
}
oThis.initialize(this, this);
});
$('ul[option_select_element="ec-option-select-finder"] > li').unbind().live('click', function(e) {
var oOptionChoose = $(this).parent('ul');
/*
ECHOSTING-194895 처리를 위해 삭제 (추가 이미지 클릭 시 해당 품목 선택 기능)
if (e.target.tagName === 'LI') {
return false;
}
*/
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) {
return false;
}
//페이지 로드가 되었는지 확인.
if (typeof(EC_SHOP_FRONT_NEW_OPTION_COMMON.isLoad) === false) {
return false;
}
//라디오버튼일경우 label태그에 상속되기때문에 click이벤트가 label input에 대해 두번 발생함
//라디오버튼 속성이면서 발생위치가 label이면 이벤트 발생하지않고 그냥 return
//return false이면 label클릭시 checked가 안되니깐 그냥 return
//input 태그 자체에 이벤트를 주면 상관없지만 li태그에 이벤트를 할당하기때문에 생기는 현상같음
if (oThis.common.isOptionStyle(oOptionChoose, oThis.cons.OPTION_STYLE_RADIO) === true && e.target.tagName.toUpperCase() === 'LABEL') {
return;
}
oThis.initialize($(this).parent('ul'), this);
});
},
/**
* 멀팁옵션에서 옵션추가시 이벤트 재정의(버튼형은 live로 되어있으니 상관없고 select형만)
* @param oOptionElement
*/
initChooseBoxMulti : function()
{
var oThis = this;
//live로 할경우에 기존 이벤트가 없어짐.
$('.xans-product-multioption select[option_select_element="ec-option-select-finder"]').unbind().change(function() {
if (oThis.common.isOptionStyleButton(this) === true) {
return false;
}
//페이지 로드가 되었는지 확인.
if (typeof(oThis.common.isLoad) === false) {
$(this).val('*');
return false;
}
oThis.initialize(this, this);
});
},
/**
* 옵션 선택시 필요한 attribute값등을 SET
*/
setSelectedOptionConf : function() {
//선택한 옵션 그룹
this.sOptionGroup = this.common.getOptionSelectGroup(this.oOptionObject);
//선택한 옵션값 순번
this.iOptionIndex = parseInt(this.common.getOptionSortNum(this.oOptionObject));
//선택한 옵션 스타일
this.sOptionStyle = $(this.oOptionObject).attr(this.cons.OPTION_STYLE);
//현재까지 선택한 옵션의 value값을 가져온다
this.aOptionValue = this.common.getAllSelectedValue(this.oOptionObject);
//상풉번호
this.iProductNum = this.common.getOptionProductNum(this.oOptionObject);
//옵션타입
this.sOptionType = this.common.getOptionType(this.oOptionObject);
//품절 옵션 표시여부
this.bIsDisplaySolout = this.validation.isSoldoutOptionDisplay();
//선택한 옵션의 다음 옵션 Element
//선택옵션을 제거한 다음옵션
//1 : 필수, 2 : 선택, 3 : 필수일때 1번옵션 선택후 다음옵션을 3번(연동형)
//[option_sort_no"'+this.iOptionIndex+'"]
oThis = this;
this.oNextOptionTarget = null;
$('[product_option_area="'+this.sOptionGroup+'"][option_product_no="'+this.iProductNum+'"]').each(function() {
//현재선택한 옵션의 하위옵션이 아니라 상위옵션이면 패스
if (oThis.iOptionIndex >= parseInt(oThis.common.getOptionSortNum(this))) {
return true;//continue
}
//선택옵션이면 패스
if (oThis.validation.isRequireOption(this) === false) {
return true;
}
oThis.oNextOptionTarget = $(this);
return false;//break
});
//옵션 갯수
this.iOptionCount = $('[product_option_area="'+this.sOptionGroup+'"]').length;
},
/**
* 버튼식 옵션일 경우 선택한 옵션을 선택처리
*/
setSelectButton : function(oSelectedOption, bIsUnset) {
if (this.common.isOptionStyleButton(this.oOptionObject) === true) {
//모두 선택이 안된상태로 이벤트 실행할수있도록 selected css를 지우고 리턴
if (bIsUnset === true) {
$(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS);
return;
}
//이미 선택한 옵션값을 다시 클릭시에는 선택해제
if ($(oSelectedOption).hasClass(this.cons.BUTTON_OPTION_SELECTED_CLASS) === true) {
$(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS);
this.common.setValue(this.oOptionObject, '*', false);
this.setRadioButtonSelect(oSelectedOption, this.oOptionObject, false);
} else {
//버튼형식의 옵션일 경우 선택한 옵션을 선택처리(class 명을 추가)
//선택불가일때는 선택된상태로 보이지 않도록 하고 클리만 가능하도록 한다
//disable상태이면 선택CSS는 적용되지 않게 처리
var oTargetOptionElement = $(oSelectedOption).parent('ul');
var sDevID = $(oTargetOptionElement).attr('ec-dev-id');
var self = this;
//조합일체형에서 구분선이 있을경우 ul태그가 따로있지만 동일옵션이므로
//동일 ul을 구해서 모두 unselect시킨다
$(oTargetOptionElement).parent().find('ul[ec-dev-id="'+sDevID+'"]').each(function() {
$(this).find('li').removeClass(self.cons.BUTTON_OPTION_SELECTED_CLASS);
});
$(oSelectedOption).addClass(this.cons.BUTTON_OPTION_SELECTED_CLASS);
this.setRadioButtonSelect(oSelectedOption, this.oOptionObject, true);
}
} else {
//셀렉트박스형 옵션일 경우 **를 선택했다면 옵션초기화
if (this.validation.isItemCode($(this.oOptionObject).val()) === false) {
$(this.oOptionObject).val('*');
}
}
},
/**
* Disable인 옵션일 경우 체크박스를 다시 해제함
* @param oSelectedOption
* @param oOptionObject
* @param bIsCheck
*/
setRadioButtonSelect : function(oSelectedOption, oOptionObject, bIsCheck)
{
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyle(oOptionObject, EC_SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_RADIO) === false) {
return;
}
$(oOptionObject).find('input:radio').attr('checked', '');
//재선택시 체크해제하려면 e107c06faf31 참고
if (bIsCheck === true) {
$(oSelectedOption).find('input:radio').attr('checked', 'checked');
}
}
};
var EC_SHOP_FRONT_NEW_OPTION_DATA = {
/**
* EC_SHOP_FRONT_NEW_OPTION_CONS 객체 Alias
*/
cons : EC_SHOP_FRONT_NEW_OPTION_CONS,
/**
* EC_SHOP_FRONT_NEW_OPTION_COMMON 객체 Alias
*/
common : EC_SHOP_FRONT_NEW_OPTION_COMMON,
/**
* 옵션값관 아이템코드 매칭 데이터(option_value_mapper)
*/
aOptioValueMapper : [],
/**
* 각 선택된 옵션값에대한 다음옵션값 리스트를 저장
* aOptionValueData[상품번호][빨강#$%대형] = array(key : 1, value : 옵션값, text : 옵션 Text)
*/
aOptionValueData : {},
/**
* 각 상품의 품목데이터(재고 및 추가금액 정보)
*/
aItemStockData : {},
/**
* 옵션의 디폴트 HTML을 저장해둠
*/
aOptionDefaultData : {},
/**
* 디폴트 옵션을 저장할떄 중복을 제거하기위해서 추가
*/
aCacheDefaultProduct : [],
/**
* 버튼형 옵션 Element저장시 중복제거
*/
aCacheButtonOption : [],
/**
* 버튼형 옵션의 경우 각 옵션값별 컬러칩/버튼이미지/버튼이름등을 저장해둔다
*/
aButtonOptionDefaultData : [],
/**
* 추가금액 노출 설정
*/
aOptionPriceDisplayConf : [],
/**
* 연동형 옵션의 옵션내용을 저장
*/
aOlnkOptionData : [],
/**
* 각 옵션(품목이 아닌)마다 모두 품절이면 품절표시를 위해서 추가...
*/
aOptionSoldoutFlag : [],
/**
* 각 옵션(품목이 아닌)마다 모두 진열안함이면 false로 나오지 않게 하기 위해서 추가
*/
aOptionDisplayFlag : [],
/**
* 페이지 로딩시 각 옵션선택박스의 옵션정보를 Parse
*/
initData : function() {
var oThis = this;
$('select[option_select_element="ec-option-select-finder"], ul[option_select_element="ec-option-select-finder"]').each(function() {
//해당 옵션의 상품번호
var iProductNum = oThis.common.getOptionProductNum(this);
//해당 옵션의 옵션순서번호
var iOptionSortNum = oThis.common.getOptionSortNum(this);
var sCacheKey = iProductNum + oThis.cons.OPTION_GLUE + iOptionSortNum;
EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOption(this, sCacheKey);
//버튼형 옵션일 경우 각 Element를 캐싱
if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) {
EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForButtonOption(this, sCacheKey);
} else {
EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForSelectOption(this, sCacheKey);
//일반 셀렉트의 경우 기본값 (*, **)을 제외하고 삭제
//첫번째 필수값은 option들이 disable이 아니므로 disable된 옵션들만 삭제
var bIsProcLoading = true;
//필수옵션만 삭제
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this) === false) {
bIsProcLoading = false;
}
//disable만 풀어준다
//연동형이지만 옵션추가버튼 사용시에는 지우지 않음...
//기본으로 선택된값이 있다면 지우지 않음(구스킨 관심상품, 뉴스킨 장바구니등에서는 일단 선택한 옵션을 보여주고 선택후부터 순차로딩)
var sValue = $(this).find('option[selected="selected"]').attr('value');
if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sValue) === true || (Olnk.isLinkageType(oThis.common.getOptionType(this)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true))) {
bIsProcLoading = false;
$(this).find('option').removeAttr('disabled');
}
if (bIsProcLoading === true) {
$(this).find('option[value!="*"][value!="**"]:disabled').remove('option');
}
}
});
},
/**
* 각 상품의 옵션 디폴트 옵션 HTML을 저장해둔다
* @param oOptionChoose 값을 가져오려는 옵션박스 object
*/
initializeOption : function(oOptionChoose, sCacheKey) {
//이미 데이터가 있다면 패스
if ($.inArray(sCacheKey, this.aCacheDefaultProduct) > -1) {
return;
}
this.aCacheDefaultProduct.push(sCacheKey);
this.aOptionDefaultData[sCacheKey] = $(oOptionChoose).html();
},
initializeOptionForSelectOption : function(oOptionChoose, sCacheKey) {
var iProductNum = $(oOptionChoose).attr('option_product_no');
var oThis = this;
//같은 상품이 여러개있을수있으므로 이미 캐싱이 안된 상품만
if ($.inArray(sCacheKey, this.aCacheButtonOption) < 0) {
var bDisabled = false;
if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) {
bDisabled = true;
}
this.aCacheButtonOption.push(sCacheKey);
this.aButtonOptionDefaultData[sCacheKey] = [];
$(oOptionChoose).find('option').each(function() {
if (bDisabled === true) {
$(this).removeAttr('disabled');
}
oThis.aButtonOptionDefaultData[sCacheKey][$(this).val()] = $('
').append($(this).clone()).html();
});
}
},
/**
* 셀렉트박스 형식이 아닌 버튼이나 이미지형 옵션일 경우 HTML자체를 옵션값 별로 저장해둔다.
* writejs쓰기싫음여
*/
initializeOptionForButtonOption : function(oOptionChoose, sCacheKey) {
var oThis = this;
var iProductNum = $(oOptionChoose).attr('option_product_no');
//같은 상품이 여러개있을수있으므로 이미 캐싱이 안된 상품만
if ($.inArray(sCacheKey, this.aCacheButtonOption) < 0) {
var bDisabled = false;
if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) {
bDisabled = true;
}
this.aCacheButtonOption.push(sCacheKey);
this.aButtonOptionDefaultData[sCacheKey] = [];
$(oOptionChoose).find('li').each(function() {
if (bDisabled === true) {
$(this).removeClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS);
}
oThis.aButtonOptionDefaultData[sCacheKey][$(this).attr('option_value')] = $('
').append($(this).clone()).html();
});
}
var sSelect = '