PageSourceSearch

https://www.carsensor.net/static/pc/js/usedcar/internal_target.js?m=1755160768

js carsensor.net collected 2026-09-24 08:50:47 UTC 12,005 bytes, 441 lines download raw bytes

1/*********************************************/
2// RecommendList object
3/*********************************************/
4var InternalTarget = InternalTarget || {};
5
6InternalTarget = (function(){
7	'use strict';
8
9	var INTERNAL_TARGET_API_HOST,
10		INTERNAL_TARGET_ORIGIN_API_URL = "/usedcar/modules/pr_frame_bukken_list.php",
11		TARGET_STID,
12		DISPLAY_BUKKEN_CD,
13		CSUUID,
14		PARAM;
15	var $bukkenRecom;
16	var INTERNAL_TARGET_JURYO_API_HOST;
17	var INTERNAL_TARGET_JURYO_API_KEY;
18
19	var init = function(page,target){
20		$bukkenRecom = $(target);
21		if(page == "TOP" || page == "DTLMIDDLE" || page == "DTLBOTTOM" || (page == "FAV" && ($(".comparison").length) || $(".carList").length)){
22			// TOP、物件詳細、お気に入り(表示件数あり)の場合inviewActionでAPI読み込み処理を実行
23			cmn.inViewAction($bukkenRecom, true, function(){
24				_getApiData(page);
25			});
26		}else{
27			// お気に入り(表示件数0件)、物件詳細(掲載落ち)、物件一覧の場合はinViewActionを挟まず、直接API読み込み処理を実行
28			_getApiData(page);
29		}
30	};
31
32	//基本処理
33	var _getApiData = async function(page){
34
35		var datas = {
36			'api1' : {},
37			'api2' : {}
38		};
39
40		// koruli_APIと従量課金CLAPIを読み込む
41		await Promise.allSettled([ _getAPI1(page), _getAPI2(page)])
42		.then(results => {
43			results.forEach((result) => {
44				if (result.status === 'fulfilled') {
45					datas[result.value.id] = {json:result.value, 'status' : 'success'};
46				} else {
47					datas[result.reason.id] = {reason:result.reason, 'status' : 'error'};
48				}
49			});
50		});
51
52		// 一旦、対象要素を空
53		$bukkenRecom.html("");
54		
55		// koruli_APIの取得JSONからPR枠作成処理
56		if (datas['api1'].status == 'success') {
57			await _setRecommendData(datas['api1'].json.data, page, $bukkenRecom, 1);
58		}
59
60		// koruli_APIの取得JSONからPR枠作成処理して作成出来なかったら、従量課金CLAPIの取得JSONからPR枠作成処理
61		if ($bukkenRecom.html() == "" && datas['api2'].status == 'success') {
62			await _setRecommendData(datas['api2'].json.data.recommends, page, $bukkenRecom, 2);
63		}
64
65		// PR枠作成出来なかったら要素を削除
66		if ($bukkenRecom.html() == "") {
67			$bukkenRecom.remove();
68		}
69	}
70
71	// koruli_API通信
72	var _getAPI1 = function(page) {
73		return new Promise((resolve, reject) => {
74			_getDtlApiData1(page)
75			.done((data) => {
76				resolve({
77					id:'api1',
78					status:'success',
79					data:data
80				});
81			})
82			.fail((jqXHR, textStatus,  errorThrown) => {
83				reject({
84					id:'api1',
85					status:'error',
86					reason:textStatus
87				});
88			});
89		});
90	};
91
92	//従量課金CL-API通信
93	var _getAPI2 = function(page) {
94		return new Promise((resolve, reject) => {
95			_getDtlApiData2(page)
96			.done((data) => {
97				resolve({
98					id:'api2',
99					status:'success',
100					data:data
101				});
102			})
103			.fail((jqXHR, textStatus,  errorThrown) => {
104				reject({
105					id:'api2',
106					status:'error',
107					reason:textStatus
108				});
109			});
110		});
111	};
112
113	// PR枠HTMLを作成する
114	var _setRecommendData = async function(ApiData, page, $bukkenRecom, mode){
115		// 物件CDを含むJSONを内部APIに渡してPR枠HTMLを取得する
116		await _getOriginApiData(ApiData, page)
117		.done(function(data){
118			if(!data){
119				// 通信は成功したがPR枠HTMLが空
120				return;
121			}
122
123			// 成功したら対象要素のPR枠HTMLを流し込む
124			$bukkenRecom.html(data);
125
126			// 画像関連の調整
127			var images = document.querySelectorAll('img[data-tgr]');
128			var noPhoto = '/CSphoto/cat/nophoto_M.png';
129			for(var i = 0; i < images.length; i++) {
130				var dataurl = images[i].getAttribute('data-tgr');
131				var selectorName = ".js-tgtlazy" + (i + 1);
132
133				function imgChk(selectorName, dataurl, image){
134					var tgtimage = new Image();
135					tgtimage.onload = function(){
136						setTimeout( function() {
137							$(selectorName).hide()
138							setTimeout( function() {
139								$(selectorName).attr('src', dataurl);
140								setTimeout( function(){
141									$(selectorName).fadeIn();
142								},0);
143							},0);
144						} ,500);
145
146					}
147					tgtimage.onerror = function(){
148						setTimeout(function(){
149							$(selectorName).hide()
150							setTimeout( function() {
151								$(selectorName).attr('src', image);
152								setTimeout( function(){
153									$(selectorName).fadeIn();
154								},0);
155							},0);
156						} ,500);
157					}
158					tgtimage.src = dataurl;
159				}
160				imgChk(selectorName, dataurl, noPhoto);
161			}
162			
163			if (mode == 1) {
164				// koruli_API由来の遷移であれば物件のリンクにAPIから取得したredirect_urlを設定
165				var redirect_url_id = _setRedirectUrlId(page);
166				var track_cd = [];
167				$.each(ApiData, function(index,val){
168					var target_id = document.getElementById(redirect_url_id + val.feeds[0].track_cd);
169					if(target_id){
170						target_id.href = "https:" + val.feeds[0].redirect_url;
171						track_cd.push(val.feeds[0].track_cd);
172					}
173				});
174			}
175
176			PrBukken.addImpressionLogEvent($bukkenRecom, page, track_cd, mode);
177			PrBukken.addClickLogEvent($bukkenRecom, page, mode);
178		})
179		.fail(function(data){
180			// 通信失敗であれば対象要素のHTMLを空にする
181			$bukkenRecom.html("");
182		});
183	}
184
185	var setInternalTargetApiHost = function(host){
186		INTERNAL_TARGET_API_HOST = host;
187	};
188
189	var setInternalTargetJuryoApiHost = function(host){
190		INTERNAL_TARGET_JURYO_API_HOST = host;
191	};
192
193	var setInternalTargetJuryoApiKey = function(key){
194		INTERNAL_TARGET_JURYO_API_KEY = key;
195	};
196
197	var setTargetStid = function(stid){
198		TARGET_STID = stid;
199	};
200
201	var setDispBukkenCd = function(bukken_cd){
202		DISPLAY_BUKKEN_CD = bukken_cd;
203	};
204
205	var setApiId = function(csuuid){
206		CSUUID = csuuid;
207	};
208
209	var setApiParam = function(param){
210		PARAM = param;
211	};
212
213	// koruli_API
214	var _getDtlApiData1 = function(page) {
215		var url_string = _setApiUrlString(page);
216		var url = '';
217		let dataType = '';
218		if(page == "SEARCH"){
219			url = INTERNAL_TARGET_API_HOST + "json?f=1.media_client." + url_string + "&ex=" + CSUUID + PARAM;
220			dataType = "json";
221		}else{
222			url = INTERNAL_TARGET_API_HOST + "json?f=1.media_client." + url_string + "&ex=" + CSUUID;
223			dataType = "json";
224		}
225
226		const setting = {
227			timeout: 10000,
228			url:url,
229			type: 'GET',
230			dataType:dataType
231		};
232
233		return $.ajax(setting);
234	};
235
236	// 従量課金CLAPI
237	var _getDtlApiData2 = function(page) {
238		const url = INTERNAL_TARGET_JURYO_API_HOST;		
239		let set_data = {'key' : CSUUID};
240
241		const setting = {
242			url: url,
243			type: 'POST',
244			dataType:'json',
245			timeout: 10000,
246			data: JSON.stringify(set_data),
247			headers: {
248				'Content-Type': 'application/json',
249				'x-api-key':INTERNAL_TARGET_JURYO_API_KEY
250			}
251		};
252
253		return $.ajax(setting);
254	};
255
256	/**
257	 * APIから受け取った物件CDを含むJSONを内部APIに渡してPR枠HTMLを取得する
258	 * 
259	 * @param array data 
260	 * @param string page 
261	 * @returns 
262	 */
263	var _getOriginApiData = function(data, page){
264
265		var bknCdList = [];
266
267		$.each(data, function(index, val){
268			if (val.feeds != undefined) {
269				bknCdList.push(val.feeds[0].track_cd);
270			} else {
271				bknCdList.push(val);
272			}
273		});
274
275		var addParams = {
276			BKKN:bknCdList.join('*'),
277			STID:TARGET_STID,
278			PAGE:page,
279			DISP_BKKN:DISPLAY_BUKKEN_CD
280		};
281
282		var url = INTERNAL_TARGET_ORIGIN_API_URL + "?" + $.param(addParams),
283			headers = {}, dataType = "html";
284
285		return _orgAjax(url, dataType);
286	};
287
288	var _orgAjax = function(url, dataType){
289		return $.ajax({
290			timeout: 10000,
291			url: url,
292			dataType: dataType,
293		});
294	};
295
296	var _setApiUrlString = function(page){
297		var url_string_page = "";
298		var url_string_m = "";
299		var url_string = "";
300
301		if(page == "SEARCH"){
302			url_string_page = "bukken_list_pc";
303		}else if(page == "TOP"){
304			url_string_page = "top_pc";
305		}else if(page == "FAV"){
306			url_string_page = "favorite_pc";
307		}else if(page == "DTLSOLD"){
308			url_string_page = "soldout_pc";
309		}else{
310			url_string_page = "bukken_detail_middle_pc";
311		}
312
313		if(url_string_page == "bukken_list_pc" || url_string_page == "top_pc" || url_string_page == "favorite_pc" || url_string_page == "bukken_detail_middle_pc" || url_string_page == "soldout_pc"){
314			url_string_m = "&m=5";
315		}
316
317		url_string = url_string_page + url_string_m;
318
319		return url_string;
320	};
321
322	var _setRedirectUrlId = function(page){
323		var redirect_url_id = "";
324
325		if(page == "SEARCH"){
326			redirect_url_id = "recommend_search_url_";
327		}else if(page == "TOP"){
328			redirect_url_id = "recommend_top_url_";
329		}else if(page == "FAV"){
330			redirect_url_id = "recommend_fav_url_";
331		}else if(page == "DTLSOLD"){
332			redirect_url_id = "recommend_sold_url_";
333		}else if(page == "DTLMIDDLE"){
334			redirect_url_id = "recommend_middle_url_";
335		}else{
336			redirect_url_id = "recommend_bottom_url_";
337		}
338
339
340		return redirect_url_id;
341	};
342
343	return {init, setInternalTargetApiHost, setInternalTargetJuryoApiHost, setInternalTargetJuryoApiKey, setTargetStid, setDispBukkenCd, setApiId, setApiParam};
344
345}());
346
347var PrBukken= PrBukken || {};
348PrBukken = (function(){
349	'use strict';
350
351	// 物件情報がタップされた場合のログイベント
352	var addClickLogEvent = function($target, page, mode){
353		var logValue = _getClickLogValue(page);  // tgt_[page]_pr_clk
354		logValue = mode == 1 ? logValue : 'juryo_' + logValue;
355		$target.on('click', '.js-bukkenLink', function(){
356			var track_cd = $(this).attr("id").split("_");
357			let eventName = logValue + "_" + track_cd[3];
358			reqCustomLink("None", "", eventName); // click tgt_[page]_pr_clk
359		});
360	};
361
362	// 物件情報が表示された場合のログイベント
363	var addImpressionLogEvent = function($target, page, track_cd, mode){
364		var logFrameValue = _getPrFrameLogValue(page) // tgt_[page]_imp
365		var logValue = _getImpressionLogValue(page);  // tgt_[page]_pr_imp
366		if(!logValue) return;
367
368		logValue = mode == 1 ? logValue : 'juryo_' + logValue;
369		
370		// お気に入り画面(表示件数0)または物件詳細(SOLDOUT)であれば
371		if((_isFavorite(page) && (!$(".comparison").length && !$(".carList").length)) || _isDtlSold(page)){
372			// 即ログイベント発生
373			reqCustomLink("None", "", logFrameValue); // disp tgt_[page]_imp
374			reqCustomLink("None", "", logValue);      // disp tgt_[page]_pr_imp
375			return; // ここでメソッドは終了
376		}
377		// それ以外であればinViewイベントトリガでログイベント発生
378		cmn.inViewAction($target, true, function(){
379			reqCustomLink("None", "", logValue); // inview_disp tgt_[page]_pr_imp
380		});
381	};
382
383	// 物件情報がタップされた場合
384	var _getClickLogValue = function(page){
385		if(_isSearch(page))    return "tgt_list_pr_clk";
386		if(_isTop(page))       return "tgt_top_pr_clk";
387		if(_isFavorite(page))  return "tgt_fav_pr_clk";
388		if(_isDtlMiddle(page)) return "tgt_dem_pr_clk";
389		if(_isDtlBottom(page)) return "tgt_dem_pr_clk";
390		if(_isDtlSold(page))   return "tgt_sdo_pr_clk";
391		return false;
392	};
393
394	// PR枠が表示された場合
395	var _getImpressionLogValue = function(page){
396		if(_isSearch(page))    return "tgt_list_pr_imp";
397		if(_isTop(page))       return "tgt_top_pr_imp";
398		if(_isFavorite(page))  return "tgt_fav_pr_imp";
399		if(_isDtlMiddle(page)) return "tgt_dem_pr_imp";
400		if(_isDtlBottom(page)) return "tgt_dem_pr_imp";
401		if(_isDtlSold(page))   return "tgt_sdo_pr_imp";
402		return false;
403	};
404	// PR枠位置が表示された場合
405	var _getPrFrameLogValue = function(page){
406		if(_isTop(page))       return "tgt_top_imp";
407		if(_isFavorite(page))  return "tgt_fav_imp";
408		if(_isDtlMiddle(page)) return "tgt_dem_imp";
409		if(_isDtlBottom(page)) return "tgt_dem_imp";
410		if(_isDtlSold(page))   return "tgt_sdo_imp";
411		return false;
412	};
413
414	var _isSearch = function(page){
415		return page == "SEARCH";
416	};
417
418	var _isTop = function(page){
419		return page == "TOP";
420	};
421
422	var _isFavorite = function(page){
423		return page == "FAV";
424	};
425
426	var _isDtlMiddle = function(page){
427		return page == "DTLMIDDLE";
428	};
429
430	var _isDtlBottom = function(page){
431		return page == "DTLBOTTOM";
432	};
433
434	var _isDtlSold = function(page){
435		return page == "DTLSOLD";
436	};
437
438	return {addClickLogEvent, addImpressionLogEvent};
439
440}());
441

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.