1const ITEM_ID = 'item_id'; 2const schemaParam = '&schema=' + $('#schema').val(); 3const apiUrlBase = $('#api_url_base').val(); 4const breadcrumbsUniqueNum = Math.floor(Date.now()/10800000).toString(); 5 6// ã¯ãªãã¯ã¤ãã³ãæã«å®è¡ãã颿° 7const clickEvent = ({ 8 setEventListener: function ( {sourceDataLayerEventName, eventType, targetElement} ) { 9 const pathName = commonEvent.getUrlPathName(); 10 switch(pathName) { 11 case 'cart': { 12 13 // ã«ã¼ãç»é¢ã§çºçããã¤ãã³ã 14 15 // add_payment_info æ¯æãæ å ±ãéä¿¡ããã¨ã => /order/completeã¸çµ±å 16 17 // add_shipping_info é éå æ å ±ãéä¿¡ããã¨ã => /order/completeã¸çµ±å 18 19 // remove_from_cart ã«ã¼ãããåé¤ => $().removeCommodity()å¦çå ã¸çµå 20 break; 21 } 22 case 'category': 23 case 'brand': 24 case 'favorite-brand': 25 case 'in-shop': 26 case 'search': { 27 // ååä¸è¦§ããååãã¯ãªãã¯ããã¤ãã³ã 28 const targetCommodityElements = this.getTargetElements(targetElement.selectItem); 29 if (targetCommodityElements !== null) { 30 this.addClickEvent(targetCommodityElements, sourceDataLayerEventName, null, eventType); 31 }; 32 break; 33 } 34 case 'commodity': { 35 36 // // ã«ã¼ãã«å ¥ããã¤ãã³ã => jquery.commodity-pc.js ã¸çµ±å 37 38 // ãæ°ã«å ¥ãç»é²ããã¤ãã³ã $(this).addFavorite('{${detail.skuCode}}')ã¸çµå 39 40 break; 41 } 42 case 'other': { 43 // ãã®ä» 44 break; 45 } 46 default: { 47 return false; 48 } 49 }; 50 }, 51 getTargetElements: function (targetElement) { 52 if (document.querySelectorAll(targetElement).length > 0) { 53 return document.querySelectorAll(targetElement); 54 } else { 55 return null 56 }; 57 }, 58 addClickEvent: function (targetArray, sourceDataLayerEventName, commodityCode, eventType) { 59 switch(eventType) { 60 case 'add_to_cart': { 61 targetArray.forEach((target) => { 62 target.addEventListener('click', (target)=> { 63 const skuCode = $(target)[0].currentTarget.dataset.skuCode; 64 const sizeLabel = $(target)[0].currentTarget.dataset.sizeLabel; 65 this.addToCart(commodityCode, sourceDataLayerEventName, skuCode, sizeLabel); 66 }); 67 }); 68 return true; 69 } 70 case 'select_item': { 71 targetArray.forEach((target) => { 72 target.addEventListener('click', (target)=> { 73 if(commodityCode !== null) { 74 this.selectItem(commodityCode, sourceDataLayerEventName); 75 } else { 76 const commodityCode = $($(target)[0].currentTarget).find('[data-skucode]').data('skucode'); 77 if (commodityCode.length === 0) return; 78 this.selectItem(commodityCode, sourceDataLayerEventName); 79 } 80 }); 81 }); 82 return true; 83 } 84 default: 85 return false; 86 } 87 }, 88 removeFromCart: function (sku, sourceDataLayerEventName, supplierBarCode) { 89 // dataLayerããã½ã¼ã¹å ã¤ãã³ãã®objãæ¢ã 90 const data = window.dataLayer || null; 91 const viewItemData = data.filter((data, index, array) => { 92 if(array[index].event == sourceDataLayerEventName) return data; 93 }); 94 95 // æå®ã¤ãã³ãããªãå ´å(ã¯ãªãã¯ã¤ãã³ãã¨dataLayerãç°ãªãå ´å) 96 if (viewItemData.length === 0) return false; 97 98 // 該å½objã®itemsãã¼ã¿ãé åã§åå¾ãã 99 // itemsã®ä¸ããã¯ãªãã¯ããååã³ã¼ãã§è©³ç´°æ å ±ãåå¾ãã 100 // UAéå®: item_variantãè²åã§è¨æ¸¬ãã(view_cart.jsp)ããçªåãã¼ã«ä½¿ããªããSKUå ¨ä½(item_sizesku)ã§çªåãã 101 const isUnderarmour = $('#schema').val() === 'underarmour'; 102 const clickItem = viewItemData[0].ecommerce.items.filter((item) => { 103 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããå¥ããããã£commodityCodeãåªå (ç¡ããã°item_id) 104 if((item.commodityCode || item.item_id) !== sku.slice(0, -3)) return false;
105 return isUnderarmour ? item.item_sizesku === sku : item.item_variant === sku.slice(-3); 106 }); 107 108 // dataLayerå ã«æå®ã®ååIDãåå¾ã§ããªãã£ãå ´å 109 if (clickItem.length === 0) return false 110 111 // UAéå®: item_id ã鏿SKUã® supplier_bar_code(commodity_detail.supplier_bar_code) ã«ä¸æ¸ã 112 if (supplierBarCode && $('#schema').val() === 'underarmour') clickItem[0].item_id = supplierBarCode; 113 114 // availability ãæç¤ºçã«ä»ä¸ï¼ã«ã¼ãããåé¤ããååã¯å¨åº«ããã®ãã true åºå®ï¼ 115 clickItem[0].availability = "true"; 116 117 // ã¯ãªãã¯eventãã¼ã¿ã®objçæããitemsãã¼ã¿ãçµå 118 const initClickData = { 119 event: 'remove_from_cart', 120 ecommerce: { 121 value: clickItem[0].price, 122 currency: 'JPY', 123 items: clickItem 124 } 125 }; 126 127 // ãã¼ã¿ã¬ã¤ã¤ã¼ã¸ã»ãã 128 this.pushDataLayer(initClickData); 129 130 }, 131 addBuylater: function (sku) { 132 // dataLayerããã½ã¼ã¹å ã¤ãã³ãã®objãæ¢ã 133 const data = window.dataLayer || null; 134 135 // ã¯ãªãã¯eventãã¼ã¿ã®objçæããitemsãã¼ã¿ãçµå 136 const initClickData = { 137 event: 'add_buylater', 138 commodity_code: sku.slice(0, -3) 139 }; 140 141 // ãã¼ã¿ã¬ã¤ã¤ã¼ã¸ã»ãã 142 this.pushDataLayer(initClickData); 143 144 }, 145 /** 146 * @param otherColorData è²éãåå(SPã«ã¼ãæå ¥ã¢ã¼ãã«)ã®å·®ãæ¿ãç¨ãã¼ã¿ã 147 * {priceWithoutTax, saleFlg, itemName, skuSupplier, availability} 148 * 主ååã®itemãè¤è£½ããçµè·¯(setDefcolorCommodityData)ã§ã®ã¿ä½¿ãã 149 */ 150 addToCart: function (commodityCode, sourceDataLayerEventName, skuCode, sizeLabel, colorName, supplierCode, janCode, supplierBarCode, otherColorData ) { 151 if (typeof commodityCode === 'undefined' || commodityCode === null) return; 152 153 // dataLayerããæå®ã¤ãã³ãã®objãæ¢ã 154 const data = window.dataLayer || null; 155 const viewItemData = data.filter((data, index, array) => { 156 if(array[index].event == sourceDataLayerEventName) return data; 157 }); 158 159 // æå®ã¤ãã³ãããªãå ´å(ã¯ãªãã¯ã¤ãã³ãã¨dataLayerãç°ãªãå ´å) 160 if (viewItemData.length === 0) return false; 161 162 // 該å½objã®itemsãã¼ã¿ãåå¾ãã 163 let clickItem = viewItemData[0].ecommerce.items.filter((data, index, array) => { 164 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããå¥ããããã£commodityCodeãåªå (ç¡ããã°item_id) 165 if((array[index].commodityCode || array[index].item_id) == commodityCode) return data; 166 }); 167 168 // dataLayerå ã«æå®ã®ååIDãåå¾ã§ããªãã£ãå ´å 169 if (clickItem.length === 0) clickItem = setDefcolorCommodityData(skuCode, viewItemData[0].ecommerce.items); 170 171 // 屿§"data-xxx"ããå¤ãã»ãã 172 // å½è©²ãã¼ã¸ãªããã®ã¾ã¾ãéãè²ãªãã¹ããããããâ 173 if (typeof skuCode !== 'undefined' && clickItem.length !== 0) clickItem[0].item_variant = skuCode.slice(-3); 174 if (typeof skuCode !== 'undefined' && clickItem.length !== 0) clickItem[0].item_sizesku = skuCode; 175 176 if (typeof sizeLabel !== 'undefined' && clickItem.length !== 0) clickItem[0].item_sizeLabel = sizeLabel; 177 if (typeof colorName !== 'undefined' && clickItem.length !== 0) clickItem[0].item_colorName = colorName; 178 // if (typeof supplierCode !== 'undefined' && clickItem.length !== 0) clickItem[0].makerID = supplierCode; 179 if (typeof janCode !== 'undefined' && clickItem.length !== 0) clickItem[0].janCode = janCode; 180 // UAéå®: size=item_sizeLabel, color=item_colorName ã追å ãitem_variantãè²å(item_colorName)ã«æãã 181 if (clickItem.length !== 0 && $('#schema').val() === 'underarmour') { 182 clickItem[0].size = clickItem[0].item_sizeLabel; 183 clickItem[0].color = clickItem[0].item_colorName; 184 clickItem[0].item_variant = clickItem[0].item_colorName; 185 } 186 // UAéå®: item_id 㯠commodity_header.sku_supplier ã§å ¨ã
186¤ãã³ãçµ±ä¸ããæ¹éã®ããã 187 // supplier_bar_code(commodity_detail.supplier_bar_code)ã¸ã®ä¸æ¸ãã¯è¡ããªãã 188 // view_item(view_item.jsp)ãã»ããããsku_supplierããã®ã¾ã¾ç¶æ¿ããã 189 // 弿°supplierBarCodeã¯å¼ã³åºãå (jquery.commodity-pc.jsç)ã®äºæã®ããæ®ãã¦ããã 190 191 192 // ã¯ãªãã¯eventãã¼ã¿ã®objçæããitemsãã¼ã¿ãçµå 193 const initClickData = { 194 event: 'add_to_cart', 195 ecommerce: { 196 value: clickItem[0].price, 197 currency: 'JPY', 198 items: clickItem 199 } 200 }; 201 202 // ãã¼ã¿ã¬ã¤ã¤ã¼ã¸ã»ãã 203 this.pushDataLayer(initClickData); 204 205 clickItem = []; 206 207 // å é¨é¢æ° 208 function getDefcolorIndex(skuCode, domElement) { 209 let result = null; 210 domElement.get().forEach((data, index) => { 211 if (data.children.length === 0) return; 212 let num = index; 213 Array.from(data.children).forEach(data => { 214 if(data.classList.contains('sku_' + skuCode) == true) { 215 result = num; 216 } 217 }); 218 }); 219 return result; 220 }; 221 function getPrice(skuCode) { 222 if ($('[data-gtm-dom-label="defcolorCommodity"] [data-gtm-dom-label="cart-button-wrap"]').length === 0 ) return; 223 const index = getDefcolorIndex(skuCode, $('[data-gtm-dom-label="defcolorCommodity"] [data-gtm-dom-label="cart-button-wrap"]')); 224 if (typeof index === 'undefined' || index === null) return; 225 if ($('.sku_' + skuCode).parents('[data-gtm-dom-label="defcolorCommodity"]').find('[data-gtm-dom-label="price"]').length === 0) return; 226 let price = $('.sku_' + skuCode).parents('[data-gtm-dom-label="defcolorCommodity"]').find('[data-gtm-dom-label="price"]')[index].innerText; 227 price = parseInt(price.replace(/[^0-9]/g, '')); 228 return price; 229 }; 230 function getColorName(skuCode) { 231 if ($('[data-gtm-dom-label="defcolorCommodity"] [data-gtm-dom-label="cart-button-wrap"]').length === 0 ) return null; 232 const index = getDefcolorIndex(skuCode, $('[data-gtm-dom-label="defcolorCommodity"] [data-gtm-dom-label="cart-button-wrap"]')); 233 if (typeof index === 'undefined' || index === null) return; 234 if ($('.sku_' + skuCode).parents('[data-gtm-dom-label="defcolorCommodity"]').find('[data-gtm-dom-label="color"]').length === 0) return; 235 let colorName = $('.sku_' + skuCode).parents('[data-gtm-dom-label="defcolorCommodity"]').find('[data-gtm-dom-label="color"]')[index].innerText; 236 return colorName; 237 }; 238 function setDefcolorCommodityData(skuCode, items) { 239 const price = getPrice(skuCode); 240 const jsonItems = JSON.stringify(items); 241 const defcolorItems = JSON.parse(jsonItems); 242 defcolorItems[0].item_id = commodityCode; 243 if (typeof colorName === 'undefined') defcolorItems[0].item_colorName = getColorName(skuCode); 244 if (typeof price !== 'undefined') defcolorItems[0].price = price; 245 // UAéå®: è¤è£½å (主åå)ã®å¤ãæ®ãé ç®ãè²éãã®ãã®ã¸å·®ãæ¿ããã 246 if ($('#schema').val() === 'underarmour') { 247 // commodityCode: çªåãã¼ã主ååã®ã³ã¼ããæ®ãã¨å¥ååã¨ãã¦æ±ãããããå·®ãæ¿ããã 248 defcolorItems[0].commodityCode = commodityCode; 249 clickEvent.overwriteOtherColorItem(defcolorItems[0], otherColorData); 250 } 251 return defcolorItems; 252 }; 253 }, 254 /** 255 * SPã«ã¼ãæå ¥ã¢ã¼ãã«ã®è²éãååç¨ã主ååã®itemãè¤è£½ãããã¨ãè²éããã¨ã«ç°ãªãé ç®ãå·®ãæ¿ããã 256 * è¤è£½å ã®å¤ãæ®ãã¨ãä»éãã¦ããååãã®æ å ±ãéããã¦ãã¾ããããå¼ã³åºãå ããã¿ã³ã®data屿§ããæ¸¡ãã 257 * otherColorData = {priceWithoutTax, saleFlg, itemName, skuSupplier, availability} 258 */ 259 overwriteOtherColorItem: function (item, otherColorData) { 260 if (!item || !otherColorData) return; 261 // price: è¡¨ç¤ºä¾¡æ ¼ã¯ã·ã§ããã®ç¨è¡¨è¨ã¿ã¤ãã§ç¨è¾¼ã«ãªãå¾ããããç¨æå°ç¨å¤ã使ã 262 const price = parseInt(otherColorData.priceWithoutTax, 10); 263 if (!isNaN(price)) item.price = price; 264 if (otherColorData.saleFlg) item.sale_flg = otherColorData.saleFlg; 265 if (otherColorData.itemName) item.item_name = otherColorData.itemName; 266 if (otherColorData.availability) item.availability = otherColorData.availability; 267 // item_id: UAã¯sku_supplierã§çµ±ä¸ãããåå¾ã§ããªãå ´åã¯è¤è£½å ã®å¤ãæ®ããcommodityCodeã®ã¾ã¾ 268 if (otherColorData.skuSupplier) item.item_id = otherColorData.skuSupplier; 269 }, 270 /** 271 * UAéå®: genderCode(W/M/U/C/B)ã item_category(第1é層)ã®ã©ãã«ã¸å¤æããã 272 * 対å¿è¡¨ã¯ view_item.jsp / purchase.jsp ã® c:choose ã¨åãå 容ã夿´æã¯3ç®æãæãããã¨ã 273 * (view_item/purchaseã¯JSPã¬ã³ããªã³ã°æã«å¤ã確å®ããããJSPå´ã
273§åå²ãã¦ãã) 274 */ 275 toUaGenderCategoryName: function (genderCode) { 276 switch (genderCode) { 277 case 'W': return 'ã¦ã£ã¡ã³ãº'; 278 case 'M': return 'ã¡ã³ãº'; 279 case 'U': return 'ã¦ãã»ãã¯ã¹'; 280 case 'C': 281 case 'B': return 'ãããºã»ããã¼'; 282 default: return ''; 283 } 284 }, 285 /** ç¨ç(%)ãä¸è¨ toPriceWithoutTax ã®å²ãæ»ãã«ä½¿ããç¨çæ¹å®æã¯ããã ã夿´ããã */ 286 TAX_RATE_PERCENT: 10, 287 /** 288 * è¡¨ç¤ºä¾¡æ ¼(ç¨è¾¼)ããç¨æä¾¡æ ¼ãå²ãæ»ããUAéå®ã®æ«å®å¯¾å¿ã 289 * æ¤ç´¢ä¸è¦§ã»ãæ°ã«å ¥ãä¸è¦§ã¯ç¨æå°ç¨å¤ãæããªããããè¡¨ç¤ºä¾¡æ ¼ããéç®ããã 290 * 注æ: ç¨è¾¼ãç´æ¥ç»é²ãã¦ããåå(commodity_detail.unit_price_with_tax)ãã 291 * ç¨è¾¼è¨ç®æã®ç«¯æ°åãæ¨ã¦ã«ãããå ã®ç¨æã¨1åç¨åº¦ãããå ´åãããã 292 * æ£ç¢ºãªå¤ãå¿ è¦ã«ãªã£ãããåç»é¢ã®ãã¼ã¿ã½ã¼ã¹ã«ç¨æå¤ã追å ãã¦ç½®ãæãããã¨ã 293 */ 294 toPriceWithoutTax: function (priceIncludingTax) { 295 const price = parseInt(priceIncludingTax, 10); 296 if (isNaN(price)) return undefined; 297 return Math.round(price / (1 + this.TAX_RATE_PERCENT / 100)); 298 }, 299 /** 300 * å ã¤ãã³ã(view_item/view_item_listç)ãdataLayerã«åå¨ããªãç»é¢ãã add_to_cart ãéãã 301 * ä¾: ãã¤ãã¼ã¸ã®ãæ°ã«å ¥ãä¸è¦§ãaddToCartã¯å ã¤ãã³ãã®itemsããååãå¼ãããããã®ç»é¢ã§ã¯ä½¿ããªãã 302 * itemã®ä¸èº«ã¯å¼ã³åºãå ãDOMããçµã¿ç«ã¦ã¦æ¸¡ãã 303 * priceãæ°å¤ã§æ¸¡ãããå ´åã®ã¿ value ãåºåãã(ç¨åºåã確å®ãã¦ããªãéé¡ã¯éããªããã)ã 304 */ 305 addToCartWithoutSourceEvent: function (item) { 306 return this.pushEcommerceWithoutSourceEvent('add_to_cart', item); 307 }, 308 /** 309 * å ã¤ãã³ã(view_item/view_item_listç)ãdataLayerã«åå¨ããªãç»é¢åãã®å ±ééä¿¡å¦çã 310 * itemã®ä¸èº«ã¯å¼ã³åºãå ãDOM/APIã¬ã¹ãã³ã¹ããçµã¿ç«ã¦ã¦æ¸¡ãã 311 * priceãæ°å¤ã§æ¸¡ãããå ´åã®ã¿ value ãåºåãã(ç¨åºåã確å®ãã¦ããªãéé¡ã¯éããªããã)ã 312 */ 313 pushEcommerceWithoutSourceEvent: function (eventName, item) { 314 if (!item || !item.item_id) return false; 315 316 // priceã¯DOM屿§ç±æ¥ã§æååã«ãªããã¨ãããããæ°å¤ã¸æ£è¦åãããåããªãå ´åã¯ãã¼ãã¨è½ã¨ã 317 const price = parseInt(item.price, 10); 318 if (isNaN(price)) { 319 delete item.price; 320 } else { 321 item.price = price; 322 } 323 324 const ecommerce = { 325 currency: 'JPY', 326 items: [item] 327 }; 328 if (!isNaN(price)) ecommerce.value = price; 329 330 this.pushDataLayer({ event: eventName, ecommerce: ecommerce }); 331 }, 332 /** @param otherColorData è²éãååã®å·®ãæ¿ãç¨ãã¼ã¿ã詳細㯠addToCart / overwriteOtherColorItem ãåç §ã */ 333 addToWishlist: function (skuCode, sourceDataLayerEventName, sizeLabel, janCode, supplierBarCode, colorName, otherColorData) { 334 // dataLayerããæå®ã¤ãã³ãã®objãæ¢ã 335 const data = window.dataLayer || null; 336 const viewItemData = data.filter((data, index, array) => { 337 if(array[index].event == sourceDataLayerEventName) return data; 338 }); 339 340 // æå®ã¤ãã³ãããªãå ´å(ã¯ãªãã¯ã¤ãã³ãã¨dataLayerãç°ãªãå ´å) 341 if (viewItemData.length === 0) return false; 342 343 // 該å½objã®itemsãã¼ã¿ãåå¾ãã 344 let clickItem = viewItemData[0].ecommerce.items.filter((data, index, array) => { 345 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããå¥ããããã£commodityCodeãåªå (ç¡ããã°item_id) 346 if((array[index].commodityCode || array[index].item_id) == skuCode.slice(0, -3)) return data; 347 }); 348 349 // UAéå®: è²éãåå(SPåå詳細ã®ã«ã¼ãæå ¥ã¢ã¼ãã«)ã¯view_itemã®itemsã«åå¨ããçªåã§ããªãããã 350 // 主ååã®itemãè¤è£½ãã¦çºç«ããããaddToCartã®setDefcolorCommodityDataã¨åçã®å¦ç½®ã 351 if (clickItem.length === 0 && $('#schema').val() === 'underarmour') { 352 clickItem = setOtherColorCommodityData(skuCode, viewItemData[0].ecommerce.items, otherColorData); 353 } 354 355 // dataLayerå ã«æå®ã®ååIDãåå¾ã§ããªãã£ãå ´å 356 if (clickItem.length ===0) return false;
357 358 // 屿§"data-xxx"ããå¤ãã»ãã 359 // UAéå®: item_variantã¯è²åã§è¨æ¸¬ãããview_item(view_item.jsp)/view_item_list(view_item_list.jsp)ã§ 360 // è²åãã»ããæ¸ã¿ã®ãããè²ã³ã¼ãä¸3æ¡ã§ã®ä¸æ¸ããã¹ããããã 361 if (typeof skuCode !== 'undefined' && $('#schema').val() !== 'underarmour') clickItem[0].item_variant = skuCode.slice(-3); 362 if (typeof skuCode !== 'undefined') clickItem[0].item_sizesku = skuCode; 363 if (typeof sizeLabel !== 'undefined') clickItem[0].item_sizeLabel = sizeLabel; 364 // è²éãååã§ã¯è¤è£½å (主åå)ã®è²åãæ®ããããå¼ã³åºãå ããæ¸¡ãããè²åã§ä¸æ¸ããã 365 if (colorName) clickItem[0].item_colorName = colorName; 366 // if (typeof supplierCode !== 'undefined') clickItem[0].makerID = supplierCode; 367 if (typeof janCode !== 'undefined') clickItem[0].janCode = janCode; 368 // UAéå®: size=item_sizeLabel ã追å (add_to_cartã¨å仿§)ãview_itemã¯ãµã¤ãºæªé¸æã®ããsizeãæããªãã 369 if ($('#schema').val() === 'underarmour') clickItem[0].size = clickItem[0].item_sizeLabel; 370 // UAéå®: color/item_variantãè²å(item_colorName)ã«æãã(add_to_cartã¨å仿§) 371 if (colorName && $('#schema').val() === 'underarmour') { 372 clickItem[0].color = clickItem[0].item_colorName; 373 clickItem[0].item_variant = clickItem[0].item_colorName; 374 } 375 // UAéå®: item_id ã鏿SKUã® supplier_bar_code(commodity_detail.supplier_bar_code) ã«ä¸æ¸ã 376 if (supplierBarCode && $('#schema').val() === 'underarmour') clickItem[0].item_id = supplierBarCode; 377 378 // ã¯ãªãã¯eventãã¼ã¿ã®objçæããitemsãã¼ã¿ãçµå 379 const initClickData = { 380 event: 'add_to_wishlist', 381 ecommerce: { 382 value: clickItem[0].price, 383 currency: 'JPY', 384 items: clickItem 385 } 386 }; 387 388 // ãã¼ã¿ã¬ã¤ã¤ã¼ã¸ã»ãã 389 this.pushDataLayer(initClickData); 390 // å¼ã³åºãå ããéä¿¡ã§ãããããå¤å®ã§ããããã«ãã(å ã¤ãã³ããç¡ãç»é¢ã§ã®ãã©ã¼ã«ããã¯ç¨) 391 return true; 392 393 // å é¨é¢æ° 394 // è²éãååç¨ã«ä¸»ååã®itemãè¤è£½ããè奿 å ±ã¨ä¾¡æ ¼ãè²éãã®ãã®ã¸å·®ãæ¿ãã 395 function setOtherColorCommodityData(skuCode, items, otherColorData) { 396 if (items.length === 0) return []; 397 const otherColorItems = JSON.parse(JSON.stringify(items)).slice(0, 1); 398 const otherColorCommodityCode = skuCode.slice(0, -3); 399 // item_id / commodityCode: è¤è£½å (主åå)ã®ã³ã¼ããæ®ãã¨å¥ååã¨ãã¦æ±ãããããå·®ãæ¿ããã 400 // item_idã¯sku_supplierãæ¸¡ãããã°over
400writeOtherColorItemã§ä¸æ¸ããããã 401 otherColorItems[0].item_id = otherColorCommodityCode; 402 otherColorItems[0].commodityCode = otherColorCommodityCode; 403 clickEvent.overwriteOtherColorItem(otherColorItems[0], otherColorData); 404 return otherColorItems; 405 }; 406 }, 407 selectItem: function (commodityCode, sourceDataLayerEventName) { 408 // dataLayerããæå®ã¤ãã³ãã®objãæ¢ã 409 const data = window.dataLayer || null; 410 const viewItemData = data.filter((data, index, array) => { 411 if(array[index].event == sourceDataLayerEventName) return data; 412 }); 413 414 // æå®ã¤ãã³ãããªãå ´å(ã¯ãªãã¯ã¤ãã³ãã¨dataLayerãç°ãªãå ´å) 415 if (viewItemData.length === 0) return false; 416 417 // 該å½objã®itemsãã¼ã¿ãåå¾ãã 418 const clickItem = viewItemData[0].ecommerce.items.filter((data, index, array) => { 419 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããå¥ããããã£commodityCodeãåªå (ç¡ããã°item_id) 420 if((array[index].commodityCode || array[index].item_id) == commodityCode) return data; 421 }); 422 423 // dataLayerå ã«æå®ã®ååIDãåå¾ã§ããªãã£ãå ´å 424 if (clickItem.length === 0) return false; 425 426 var ga4contentCategory = $('#ga4breadcrumbCategories').val(); 427 var ga4searchString = $('#ga4searchString').val(); 428 // ã¯ãªãã¯eventãã¼ã¿ã®objçæããitemsãã¼ã¿ãçµå 429 const initClickData = { 430 event: 'select_item', 431 ecommerce: { 432 value: clickItem[0].price, 433 currency: 'JPY', 434 items: clickItem 435 }, 436 content_category:ga4contentCategory, 437 search_string:ga4searchString 438 }; 439 440 // ãã¼ã¿ã¬ã¤ã¤ã¼ã¸ã»ãã 441 this.pushDataLayer(initClickData); 442 }, 443 pushDataLayer: function (dataLayer) { 444 const jsonDataLayer = JSON.stringify(dataLayer); 445 const objDataLayer = JSON.parse(jsonDataLayer); 446 window.dataLayer = window.dataLayer || []; 447 window.dataLayer.push(objDataLayer); 448 }, 449}); 450 451 452// CartJsonããååæ å ±ãåå¾ããéã«å®è¡ãã颿° 453const viewEventUseCartJson = ({ 454 commodityData: {}, 455 dataLayerFn: async function (initData, needsItemCategory) { 456 this.commodityData = await setCommodityData(); 457 if (!this.commodityData) return; 458 if(needsItemCategory) { 459 await viewEvent.dataLayerGenAsyncBreadcrumbsApi(viewEvent.filter(this.commodityData, ITEM_ID), this.commodityData, initData); 460 } else { 461 viewEvent.pushDataLayer(initData, this.commodityData); 462 } 463 }, 464}); 465 466// ç»é¢è¡¨ç¤ºæã«å®è¡ãã颿° 467const viewEvent = ({ 468 commodityData: setCommodityData(), 469 dataLayerFn: function (initData, needsItemCategory) { 470 if(needsItemCategory) { 471 this.dataLayerGenAsyncBreadcrumbsApi(this.filter(this.commodityData, ITEM_ID), this.commodityData, initData); 472 } else { 473 this.pushDataLayer(initData, this.commodityData); 474 } 475 }, 476 dataLayerGenAsyncBreadcrumbsApi: async function (commodityIdList, commodityData, initData) { 477 const breadcrumbsSet = new Set(); 478 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããcommodityCode(view_itemã§ä¿æ)ãããã°åªå 479 const breadcrumbsIdList = commodityData.map((commodity) => commodity.get('commodityCode') || commodity.get(ITEM_ID)); 480 for (const id of breadcrumbsIdList) { 481 breadcrumbsSet.add(await this.fetchBreadcrumbsApi(id, commodityData, initData)); 482 }; 483 484 // UAã¯ãã³ããã®3é層ç®ä»¥éã item_category3ã5 ã«å²ãå½ã¦ã(cat1=gender, cat2=ã¢ã³ãã¼ã¢ã¼ãã¼ã¯JSPå´ã§ä¿æ) 485 // 対象ã¤ãã³ã: view_item / purchase / view_cart(view_itemã¨ä»æ§ãæãã) 486 // view_cartã®items㯠remove_from_cart ã¨ããã¨ã§è²·ããã®add_to_wishlistã«ãç¶æ¿ããã 487 const isUaCategoryShift = ($('#schema').val() === 'underarmour' && initData 488 && (initData.event === 'view_item' || initData.event === 'purchase' 489 || initData.event === 'view_cart')); 490 const 491 breadcrumbsDataMap = this.setBreadcrumbsDataMap(breadcrumbsSet), 492 dataLayerItemCategory = this.setDataLayerItemCategory(breadcrumbsDataMap, isUaCategoryShift), 493 mergedCommodityData = this.setMergeData(dataLayerItemCategory, commodityData); 494 this.pushDataLayer(initData, mergedCommodityData); 495 if (typeof addShippingInitData !== 'undefined') this.copyDataLayerFn(addShippingInitData, 'purchase', {needsOrderId: false, needsShipping: false}); 496 if (typeof addPaymentInitData !== 'undefined') this.copyDataLayerFn(addPaymentInitData, 'purchase', {needsOrderId: false, needsShipping: false}); 497 }, 498 filter: function (arrayMap, fillterKey) { 499 return arrayMap.map((data) => data.get(fillterKey)) 500 }, 501 setBreadcrumbsDataMap: function (BreadcrumbsSet) { 502 const resultMap = new Map(); 503 Array.from(BreadcrumbsSet).forEach((fetchData, index) => { 504 505 // ã¨ã©ã¼ã¬ã¹ãã³ã¹ãªã©ãé¤å¤ 506 if (!fetchData || !fetchData.breadcrumbs || !fetchData.breadcrumbs.length) return; 507 508 const fetchDataList = new Array(); 509 const hasBreadcrumbs = Boolean(fetchData.breadcrumbs.length > 0) 510 const ancestors = hasBreadcrumbs ? fetchData.breadcrumbs[0].ancestors : ""; 511 const active = hasBreadcrumbs ? fetchData.breadcrumbs[0].category_name_pc : ""; 512 if (ancestors.length > 0) {
513 ancestors.forEach(element => { 514 fetchDataList.push(element.category_name_pc); 515 }); 516 }; 517 if (active.length > 0) { 518 fetchDataList.push(active); 519 }; 520 resultMap.set(fetchData.commodity_code, fetchDataList); 521 }); 522 return resultMap 523 }, 524 setDataLayerItemCategory: function (fetchDataMap, isUaCategoryShift) { 525 const resultMap = new Map(); 526 fetchDataMap.forEach((categories, key) => { 527 const fetchDataFnMap = new Map(); 528 if (isUaCategoryShift) { 529 // UA(view_item / purchase): ãã³ããã®3é層ç®ä»¥éã item_category3ã5 ã«å²ãå½ã¦ã 530 // å é 2é層(ãã©ã³ã/ã¸ã§ã³ãã¼)㯠cat1=gender, cat2=ã¢ã³ãã¼ã¢ã¼ãã¼ ã¨éè¤ããããã¹ãããã 531 // item_category{N} â categories[N-1] (cat3âcategories[2] â¦)ãç¡ããã°ç©ºæåã§ cat5 ã¾ã§å¿ ãåºåã 532 for (let level = 3; level <= 5; level++) { 533 fetchDataFnMap.set("item_category" + level, categories[level - 1] || ""); 534 } 535 } else { 536 categories.forEach((categoryName, index) => { 537 const num = (index === 0) ? "" : index + 1; 538 fetchDataFnMap.set("item_category" + num, categoryName); 539 }); 540 } 541 resultMap.set(key, fetchDataFnMap); 542 }); 543 return resultMap; 544 }, 545 setMergeData: function (fetchDataLayer, commodityData) { 546 const resultArray = []; 547 commodityData.forEach((commodity) => { 548 // çªåãã¼: UAã¯item_idã«sku_supplierãåºããããcommodityCode(view_itemã§ä¿æ)ãããã°åªå 549 const itemId = commodity.get('commodityCode') || commodity.get(ITEM_ID); 550 const fetchData = fetchDataLayer.get(itemId); // ç¡ããã° undefined 551 const mergedMap = fetchData 552 ? new Map([...commodity, ...fetchData]) 553 : new Map(commodity); // ãã¼ã¸ãªãã§ãcommodityããã®ã¾ã¾å ¥ãã 554 resultArray.push(mergedMap); 555 }); 556 return resultArray; 557 }, 558 fetchBreadcrumbsApi: async function (commodityCode, commodityData, initData) { 559 const result = $.ajax({ 560 type: 'GET', 561 dataType: 'jsonp', 562 cache : true, 563 timeout : 30000, 564 url: apiUrlBase + '/commodity-breadcrumbs.jsonp?commodity_code=' + commodityCode + schemaParam, 565 jsonpCallback: 'ga4datalayer' + breadcrumbsUniqueNum 566 }) 567 .then((res)=> { 568 if (!res.commodity_code.length === 0) { 569 const error = new Error('An error occurred while fetching the data.') 570 error.status = res.status; 571 throw error 572 } 573 return res; 574 }) 575 .fail((jqXHR, textStatus, errorThrown) => { 576 const errorText = textStatus + ', ' + errorThrown; 577 let errorPreText = ''; 578 579 switch(jqXHR.status) { 580 case 400: errorPreText = '400 INVALID_TOKEN. '; break; 581 case 401: errorPreText = '401 UNAUTHORIZED. '; break; 582 case 500: errorPreText = '500 INTERNAL_SERVER_ERROR. '; break; 583 case 502: errorPreText = '502 BAD_GATEWAY. '; break; 584 case 404: errorPreText = '404 NOT_FOUND. '; break; 585 default: errorPreText = 'UNHANDLED_ERROR. '; break; 586 } 587 588 // pushãã¦çµäºï¼throwã¯ããªãï¼ 589 this.pushDataLayer(initData, commodityData); 590 591 // å¿ è¦ã«å¿ãã¦ãã°åºåï¼æ¬çªã§ãconsole.warnã¯åºããããªãå ´åã¯ãããåé¤ã¾ãã¯æ¡ä»¶ä»ãã§ï¼ 592 if (jqXHR.status === 500 || jqXHR.status === 502) { 593 console.warn('Breadcrumbs API error:', jqXHR.status, jqXHR.statusText); 594 } 595 596 return { 597 error: true, 598 status: jqXHR.status || 0, 599 message: errorPreText + errorText 600 }; 601 }) 602 .catch((e) => { 603 // JSONPã¹ã¯ãªããã®èªã¿è¾¼ã¿èªä½ã失æããå ´å 604 console.warn('Breadcrumbs API catch (network level error):', e); 605 this.pushDataLayer(initData, commodityData); 606 return { 607 error: true, 608 status: 998, 609 message: 'JSONP request failed (network level)' 610 }; 611 }); 612 return result 613 }, 614 copyDataLayerFn: function (initData, sourceDataLayerEventName, { needsOrderId = null, needsShipping = null } = {}) { 615 // dataLayerããæå®ã¤ãã³ãã®objãæ¢ã 616 const data = window.dataLayer || null; 617 const viewItemData = data.filter((data, index, array) => { 618 if(array[index].event == sourceDataLayerEventName) return data; 619 }) || null; 620 621 // dataLayerããæå®ã¤ãã³ããæ¢ããªããã°ä¸æ 622 if (viewItemData === null) return; 623 624 // ecommerceæ å ±ããã¼ã¸ãã¦ããã¼ã¿ã¬ã¤ã¤ã¼çæã¸ 625 initData.ecommerce = {...viewItemData[0].ecommerce, ...initData.ecommerce}; 626 627 // ãªã¼ãã¼IDãä¸è¦ãªãåé¤ 628 if (needsOrderId === false) delete initData.ecommerce.transaction_id; 629 630 // é éæãä¸è¦ãªãåé¤ 631 if (needsShipping === false) delete initData.ecommerce.shipping; 632 633 this.pushDataLayer(initData); 634 }, 635 pushDataLayer: function (dataLayer, commodityMapData = null) { 636 // ååãã¼ã¿ãããå ´åãé å[{map},{map}...]ããitemsãªãã¸ã§ã¯ããçæãã 637 const items = (commodityMapData == null) ? null : commodityMapData.map((data) => Object.fromEntries(data)); 638 639 // itemsãããå ´åããã¼ã¿ã¬ã¤ã¤ã¼ã«ã»ãããã 640 if( items !== null) { 641 dataLayer.ecommerce.items = items; 642 } 643 644 // ã°ãã¼ãã«å¤æ°ã«ã»ãããã 645 window.dataLayer = window.dataLayer || []; 646 window.dataLayer.push(dataLayer); 647 } 648}); 649 650const commonEvent = ({ 651 getUrlPathName: function () {
652 const lang = $('#siteLanguage').val() ?? 'ja'; 653 const pathName = (lang == 'ja') ? window.location.pathname : window.location.pathname.replace('/' + $('#siteLanguage').val() + '/', '/'); 654 switch(true) { 655 case /^\/brand\/.*$/.test(pathName): 656 return 'brand'; 657 case /^\/cart\/.*$/.test(pathName): 658 return 'cart'; 659 case /^\/category\/.*$/.test(pathName): 660 return 'category'; 661 case /^\/commodity\/.*$/.test(pathName): 662 return 'commodity'; 663 case /(^\/favorite-brand\/.*$|^\/favorite-brand.*$)/.test(pathName): 664 return 'favorite-brand'; 665 case /(^\/search.*$|^\/search\?.*$)/.test(pathName): 666 return 'search'; 667 case /^\/in-shop\/.*$/.test(pathName): 668 return 'in-shop'; 669 default: 670 return 'other'; 671 } 672 }, 673 getUrlPageName: function (id) { 674 switch(id) { 675 case 'brand': 676 return 'ãã©ã³ãååä¸è¦§ãã¼ã¸'; 677 case 'cart': 678 return 'ã«ã¼ã'; 679 case 'category':
680 return 'ã«ã¿ãã°ãã¼ã¸'; 681 case 'commodity': 682 return 'åå詳細ãã¼ã¸'; 683 case 'favorite-brand': 684 return 'ãã¤ãã©ã³ãååä¸è¦§ãã¼ã¸'; 685 case 'search': 686 return 'æ¤ç´¢çµæãã¼ã¸'; 687 case 'in-shop': 688 return 'ã·ã§ããååä¸è¦§ãã¼ã¸'; 689 default: 690 return 'ãã®ä»ãã¼ã¸'; 691 } 692 } 693});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.