PageSourceSearch

https://www.regal.co.jp/StaffContent/assets/js/staffstart-analytics.js?20240515_1

js regal.co.jp collected 2026-10-02 02:27:17 UTC 7,376 bytes, 240 lines download raw bytes

1
2var ecblib = ecblib || {};
3ecblib.staffstart = ecblib.staffstart || {};
4ecblib.staffstart.analytics = ecblib.staffstart.analytics || {};
5
6(function () {
7	'use strict';
8	var _analytics = ecblib.staffstart.analytics;
9	_analytics.MERCHANT_ID = '00e75f81f467d802b75f2db40f7ccc8d';
10
11	var ADDCART_SELECTOR = '.js-animation-add-cart, .js-enhanced-ecommerce-add-cart, .js-enhanced-ecommerce-add-cart-detail, .btn_cart_l_, .cartbox_ .large_button_';
12	var AJAXCART_SCOPE = '';
13	var AJAXCART_SELECTOR = '';
14	var VARIATION_CART_BUTTON_ID_PREFIX = 'variation_cart_button_';
15	var CONVERSION_SELECTOR = '#js-staffstart-conversion-detail';
16	var PV_CONTENT_TYPE = {
17		cordinate: '1',
18		article: '2',
19		staffreview: '10'
20	};
21
22	document.addEventListener('DOMContentLoaded', function () {
23		const queryParams = {};
24		let queryString = window.location.search;
25		if (queryString) {
26			queryString = queryString.substring(1);
27			queryString.split('&').forEach(function (i) {
28				const pair = i.split('=');
29				const key = decodeURIComponent(pair[0]);
30				const val = decodeURIComponent(pair[1]);
31				queryParams[key] = val;
32			});
33		}
34		var CONTNET_ID = {
35			cordinate: queryParams.ss_cid,
36			article: queryParams.ss_article_id,
37			staff: queryParams.ss_user_id,
38			staffreview: (typeof review_id === 'undefined' ? '' : review_id)
39		};
40
41		var SESSION = '';
42		var UID = '';
43
44		/* PV  */
45		function CreatePV(content_type, content_id) {
46			var ss_pv_info = {
47				content_type: content_type,
48				content_id: content_id,
49				user_id: UID,
50				session_id: SESSION,
51			};
52			staffStart.pv.sendTrackingRequest(_analytics.MERCHANT_ID, ss_pv_info);
53		}
54
55		/* cart - AjaxCart */
56		function SendAddCartAjax() {
57			if (AJAXCART_SCOPE === '') return;
58			var qtyRegex = new RegExp(/^[0-9]+$/);
59
60			if (AJAXCART_SCOPE === 'document') {
61				document.addEventListener('click', function (e) {
62					if (!e.target || !PolyfillMatches(e.target, AJAXCART_SELECTOR)) {
63						return;
64					}
65
66					SendAddCart(e.target, qtyRegex);
67				});
68			} else {
69				var ajaxCart = document.querySelectorAll(AJAXCART_SCOPE);
70				Array.prototype.forEach.call(ajaxCart, function (ajaxCartScope) {
71					ajaxCartScope.addEventListener('click', function (e) {
72						if (!e.target || !PolyfillMatches(e.target, AJAXCART_SELECTOR)) {
73							return;
74						}
75
76						SendAddCart(e.target, qtyRegex);
77					});
78				});
79			}
80		}
81
82		/* cart - CartButton */
83		function SendAddCartSimple() {
84			var cartElements = document.querySelectorAll(ADDCART_SELECTOR);
85			if (cartElements.length === 0) return;
86			var qtyRegex = new RegExp(/^[0-9]+$/);
87
88			var excludeSelector = (function () {
89				if (AJAXCART_SCOPE === '') return null;
90				if (AJAXCART_SCOPE === 'document') return AJAXCART_SELECTOR;
91				return AJAXCART_SCOPE + ' ' + AJAXCART_SELECTOR;
92			})();
93
94			Array.prototype.forEach.call(cartElements, function (elm) {
95				if (excludeSelector && PolyfillMatches(elm, excludeSelector)) return; /* already bind */
96				if (IsExcludeSendAddCart(elm)) return;
97
98				elm.addEventListener('click', function (e) {
99					SendAddCart(e.target, qtyRegex);
100				});
101			});
102		};
103
104		function IsExcludeSendAddCart(elm) {
105			var target_id = elm.id.toLowerCase();
106			return target_id.indexOf(VARIATION_CART_BUTTON_ID_PREFIX) === 0;
107		};
108
109		function SendAddCart(elm, qtyRegex) {
110			if (elm.tagName.toLowerCase() === 'a') {
111				SendAddCartLink(elm, qtyRegex);
112				return;
113			}
114
115			var link = PolyfillClosest(elm, 'a');
116			if (link) {
117				SendAddCartLink(link, qtyRegex);
118				return;
119			}
120
121			SendAddCartForm(elm, qtyRegex);
122		}
123
124		function SendAddCartLink(elm, qtyRegex) {
125			if (!elm || !elm.href) return;
126
127			var query = elm.href.split('?', 2);
128			if (query.length === 1) return;
129
130			var params = GetQueryParams(query[1], ['goods', 'qty']);
131			staffStart.cart.sendTrackingRequest(_analytics.MERCHANT_ID, { product_code: params.goods, count: qtyRegex.test(params.qty) ? params.qty : '1' });
132		}
133
134		function SendAddCartForm(elm, qtyRegex) {
135			var form = PolyfillClosest(elm, 'form');
136			if (!form) return;
137
138			var goods = form.querySelectorAll('input[name=goods]');
139			if (goods.length === 0) goods = form.querySelectorAll('select[name=goods]');
140			if (goods.length !== 1) return;
141
142			var qty = form.querySelectorAll('input[name=qty]');
143			staffStart.cart.sendTrackingRequest(_analytics.MERCHANT_ID, { product_code: goods[0].value, count: (qty[0] && qtyRegex.test(qty[0].value) ? qty[0].value : '1') });
144		}
145
146		/* cv */
147		function CreateConversion() {
148			var detailJson = document.querySelector(CONVERSION_SELECTOR);
149			if (!detailJson) return;
150
151			detailJson = JSON.parse(detailJson.textContent);
152			if (!detailJson || Array.isArray(detailJson.details) === false) return;
153
154			var product_info = '';
155			detailJson.details.forEach(function (detail) {
156				if (detail.goods === '') return;
157				if (product_info) product_info += ',';
158				product_info += detail.goods + ':' + detail.price + ':' + detail.qty;
159			});
160
161			var ss_cv_info = [{
162				order_id: detailJson.order_id,
163				product_info: product_info,
164				user_id: UID,
165				session_id: SESSION,
166			}];
167			staffStart.cv.sendTrackingRequest(_analytics.MERCHANT_ID, ss_cv_info);
168		}
169
170		/* sns */
171		function SendSnsPV() {
172			var ss_external = {
173				user_id: UID,
174				session_id: SESSION,
175			};
176			staffStart.external.sendTrackingRequest(_analytics.MERCHANT_ID, ss_external);
177		}
178
179		/* polyfill */
180		function PolyfillClosest(elm, selector) {
181			if (Element.prototype.closest) {
182				return elm.closest(selector);
183			}
184
185			var selectorUtil = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
186			do {
187				if (selectorUtil.call(elm, selector)) return elm;
188				elm = elm.parentElement || elm.parentNode;
189			} while (elm !== null && elm.nodeType === 1);
190			return null;
191		}
192
193		function PolyfillMatches(elm, selector) {
194			if (Element.prototype.matches) {
195				return elm.matches(selector);
196			}
197
198			var selectorUtil = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
199			if (selectorUtil.call(elm, selector)) {
200				return true;
201			} else {
202				return false;
203			}
204		}
205
206		function GetQueryParams(query, keys) {
207			var values = {};
208
209			if (typeof URLSearchParams !== 'undefined') {
210				var param = new URLSearchParams(query);
211				keys.forEach(function (key) {
212					values[key] = param.has(key) ? param.get(key) : '';
213				});
214			} else {
215				var regStr = keys.map(function (key) { return key + '=[^&]+'; }).join('|');
216				var regex = new RegExp(regStr, 'gi');
217				var params = query.match(regex);
218				params.forEach(function (item) {
219					var keyvalue = item.split('=');
220					values[keyvalue[0]] = keyvalue.length > 1 ? keyvalue[1] : '';
221				});
222				keys.forEach(function (key) {
223					if (values[key] === undefined) values[key] = '';
224				});
225			}
226
227			return values;
228		}
229
230		/* exec */
231		SendSnsPV();
232		CreateConversion();
233		SendAddCartAjax();
234		SendAddCartSimple();
235
236		if (CONTNET_ID.cordinate) CreatePV(PV_CONTENT_TYPE.cordinate, CONTNET_ID.cordinate);
237		if (CONTNET_ID.article) CreatePV(PV_CONTENT_TYPE.article, CONTNET_ID.article);
238		if (CONTNET_ID.staffreview) CreatePV(PV_CONTENT_TYPE.staffreview, CONTNET_ID.staffreview);
239	});
240}());

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.