PageSourceSearch

https://www.the-luxe.jp/common/js/fair2022.js?update=20221114021642

js the-luxe.jp collected 2026-10-05 11:15:45 UTC 15,654 bytes, 525 lines download raw bytes

1"use strict";
2
3//おすすめスライド
4(function(){
5	var slideModules = document.querySelectorAll('[data-slidearea01]:not([data-slidearea01-ok])');
6	for(var i = 0; i < slideModules.length; i++) {
7		(function(element){
8			element.setAttribute('data-slidearea01-ok', '');
9			var setSlide = function(){
10				//最低限の設定
11				var slidearea = element.querySelector('.slidearea01_content'),
12					slides = element.querySelectorAll('.slidearea01_link'),
13					length = slides.length-1,
14					now = -1,
15					slideDistByDammy = 4,
16					slidesWithDammy;
17
18				if(slides.length <= 4) {
19					element.addClass('noslide');
20					return false;
21				}
22
23				//スライドの速さ
24				var speed = 0.4,
25					transitionValue = speed + 's cubic-bezier(0.445, 0.050, 0.550, 0.950)',
26					transitionValueByFlick = speed + 's cubic-bezier(0.165, 0.840, 0.440, 1.000)';
27				setTimeout(function(){
28					slidearea.style.WebkitTransition = transitionValue;
29					slidearea.style.transition = transitionValue;
30				}, 1);
31
32				//前へ・次へボタン
33				var prev = element.querySelector('.prev'),
34					next = element.querySelector('.next');
35
36				//自動切換え
37				var loop,
38					loopDur = 6000;
39
40				//ページング
41				var pager = element.querySelector('.slidearea01_pager'),
42					pagers;
43
44				var imgpager = element.querySelector('.slidearea01_imgpager'),
45					imgpagers = element.querySelectorAll('.slidearea01_imgpager_btn');
46
47				//カウンター
48				var counter = element.querySelector('.slidearea01_count'),
49					counterTotal,
50					counterNow,
51					counterZeroPadding;
52
53				//フリックで切り替え
54				var flickFlg = false,
55					flickArea = element.querySelector('.slidearea01_wrapin'),
56					flickPosXBefore = 0,
57					flickPosXNow = 0,
58					flickPosXFirst = 0,
59					flickPosYBefore = 0,
60					flickPosYNow = 0,
61					flickPosYFirst = 0,
62					flickArrow,
63					flickLoop,
64					flickAnimTimeFlg = false;
65
66				//ループ処理
67				var loopFunc = function(){
68					if(!element.hasAttribute('data-slidearea01-no-autoslide')) nextFunc();
69				}
70
71				//ループをセット
72				var setLoop = function() {
73					clearInterval(loop);
74					loop = setInterval(loopFunc, loopDur);
75				};
76
77				//ループを解除
78				var removeLoop = function() {
79					clearInterval(loop);
80				};
81
82				//flick 常時処理
83				var flickLoopFunc = function(){
84					if(flickFlg) {
85						if(Math.abs(flickPosXNow-flickPosXBefore) > 10){//タッチ開始位置から一定の距離の場合
86							if(flickPosXNow-flickPosXBefore < 0){//マイナスのとき
87								flickArrow = 'next';
88							}else{
89								flickArrow = 'prev';
90							}
91						}else{
92							flickArrow = 'none';
93						}
94						flickPosXBefore = flickPosXNow;
95					}
96				};
97				var flickPosSetFunc = function(){
98					slidearea.style.left = (-100*(now+slideDistByDammy))-((flickPosXFirst-flickPosXNow)/flickArea.offsetWidth)*100+'%';
99				};
100				var flickPosResetFunc = function(){
101					slidearea.style.left = -100*(now+slideDistByDammy)+'%';
102				};
103
104				//フリックのループをセット
105				var setFlickLoop;
106				//フリックのループを解除
107				var removeFlickLoop;
108				var flickLoopFuncByRequestAnimationFrame = function(){
109					flickLoopFunc();
110					flickLoop = window.requestAnimationFrame(flickLoopFuncByRequestAnimationFrame);
111				};
112				if(document.documentElement.hasClass('touchevents')) {
113					if(window.requestAnimationFrame) {
114						setFlickLoop = function() {
115							window.cancelAnimationFrame(flickLoop);
116							flickLoopFuncByRequestAnimationFrame();
117						}
118						removeFlickLoop = function() {
119							window.cancelAnimationFrame(flickLoop);
120						}
121					}else{
122						setFlickLoop = function() {
123							clearInterval(flickLoop);
124							flickLoop = setInterval(function(){
125								flickLoopFunc();
126							}, 33);
127						}
128						removeFlickLoop = function() {
129							clearInterval(flickLoop);
130						}
131					}
132				}else{
133					setFlickLoop = function() {
134					}
135					removeFlickLoop = function() {
136					}
137				}
138
139				(function(i){
140					//スライドに番号を付与
141					for(i = 0; i < slides.length; i = 0|i+1) {
142						slides[i].setAttribute('data-slide-num', i);
143					}
144
145					//端の要素を生成
146					var closeElesPrev = [],
147						closeElesNext = [],
148						closeEle,
149						closeEleNow;
150
151					//ダミー要素 前 作成
152					closeEleNow = length+1;
153					for(i = 0; i < slideDistByDammy; i = 0|i+1){
154						closeEleNow--;
155						if(closeEleNow < 0) closeEleNow = length;
156						var c = slides[closeEleNow].cloneNode(true);
157						closeElesPrev.push(c);
158					}
159					//ダミー要素 後 作成
160					closeEleNow = -1;
161					for(i = 0; i < slideDistByDammy; i = 0|i+1){
162						closeEleNow++;
163						if(length < closeEleNow) closeEleNow = 0;
164						var c = slides[closeEleNow].cloneNode(true);
165						closeElesNext.push(c);
166					}
167					//ダミー要素をいれる
168					for(i = 0; i < closeElesPrev.length; i = 0|i+1){
169						closeElesPrev[i].addClass('dammy');
170						slidearea.prependChild(closeElesPrev[i]);
171					}
172					for(i = 0; i < closeElesNext.length; i = 0|i+1){
173						closeElesNext[i].addClass('dammy');
174						slidearea.appendChild(closeElesNext[i]);
175					}
176
177					slidesWithDammy = slidearea.children;
178
179					slidearea.style.width = slidesWithDammy.length*100+'%';
180					for(i = 0; i < slidesWithDammy.length; i = 0|i+1) {
181						slidesWithDammy[i].style.width = +(100/slidesWithDammy.length)+"%";
182					}
183
184					//ページングを生成
185					if(pager) {
186						for(i = 0; i <= length; i = 0|i+1) {
187							var li = document.createElement('button');
188							li.setAttribute('data-slide-num', i);
189							li.addEventListener('click', function(e){
190								//loop
191								setLoop();
192								var arrow = 'next';
193								if(~~e.currentTarget.getAttribute('data-slide-num') < now) arrow = 'prev';
194								changeFunc(~~e.currentTarget.getAttribute('data-slide-num'), arrow);
195							});
196							pager.appendChild(li);
197						}
198						pagers = pager.children;
199					}
200
201					//画像のページング
202					if(imgpager) {
203						for(i = 0; i <= length; i = 0|i+1) {
204							var li = imgpagers[i];
205							li.setAttribute('data-slide-num', i);
206							li.addEventListener('click', function(e){
207								//loop
208								setLoop();
209								var arrow = 'next';
210								if(~~e.currentTarget.getAttribute('data-slide-num') < now) arrow = 'prev';
211								changeFunc(~~e.currentTarget.getAttribute('data-slide-num'), arrow);
212							});
213						}
214					}
215
216					//要素の画像読み込み
217					window.trigger('resize');
218				})();
219
220				if(counter) {
221					counterNow = element.querySelector('.slidearea01_count_now');
222					counterTotal = element.querySelector('.slidearea01_count_total');
223					if(counterTotal && counterNow) {
224						if(slides.length < 100) {
225							counterZeroPadding = function(val) {
226								return ('00' + val).slice(-2);
227							}
228						}else{
229							counterZeroPadding = function(val) {
230								return ('000' + val).slice(-3);
231							}
232						}
233						counterNow.innerText = counterZeroPadding(1);
234						counterTotal.innerText = counterZeroPadding(length+1);
235					}else{
236						if(!counterTotal) {
237							console.error('.slidearea01_count_now という要素が無い');
238						}
239						if(!counterNow) {
240							console.error('.slidearea01_count_total という要素が無い');
241						}
242					}
243				}
244
245				//prev
246				var prevFunc = function(){
247					var val = -1+now;
248					if(val < 0) val = length;
249					changeFunc(val, 'prev');
250
251					//loop
252					setLoop();
253				};
254				if(prev) prev.addEventListener('click', prevFunc);
255
256				//next
257				var nextFunc = function(){
258					var val = +1+now;
259					if(length < val) val = 0;
260					changeFunc(val, 'next');
261
262					//loop
263					setLoop();
264				};
265				if(next) next.addEventListener('click', nextFunc);
266
267				//スライドエリアが見えたときに自動切換え・フリックの処理を有効にする
268				Common.inview(element, function(){
269					setLoop();
270					setFlickLoop();
271				}, function(){
272					removeLoop();
273					removeFlickLoop();
274				});
275
276				//flick touchstart
277				flickArea.addEventListener('touchstart', function(e){
278					flickPosXNow = flickPosXBefore = flickPosXFirst = e.changedTouches[0].pageX;
279					flickPosYNow = flickPosYBefore = flickPosYFirst = e.changedTouches[0].pageY;
280					removeLoop();
281					flickFlg = false;
282					slidearea.addClass('disableTrs');
283				}, {passive:true});
284
285				//flick touchmove
286				flickArea.addEventListener('touchmove', function(e){
287					flickPosXNow = e.changedTouches[0].pageX;
288					flickPosYNow = e.changedTouches[0].pageY;
289					if(Math.abs(flickPosYNow-flickPosYFirst) < Math.abs(flickPosXNow-flickPosXFirst)){//Y軸よりX軸のほうが値が大きい場合
290						//スクロール禁止
291						e.preventDefault();
292						e.stopPropagation();
293						flickPosSetFunc();
294						flickFlg = true;
295					}
296				}, {passive:true});
297
298				//flick touchend
299				flickArea.addEventListener('touchend', function(e){
300					slidearea.removeClass('disableTrs');
301					if(flickFlg){
302						switch(flickArrow){
303							case 'next':
304								flickFlg = false;
305								flickAnimTimeFlg = true;
306								nextFunc();
307								break;
308							case 'prev':
309								flickFlg = false;
310								flickAnimTimeFlg = true;
311								prevFunc();
312								break;
313							default:
314								setLoop();
315
316								flickPosResetFunc();
317								break;
318						}
319						flickArrow = 'none';
320					}else{
321						setLoop();
322					}
323					flickFlg = false;
324				}, {passive:true});
325
326				//スライドの処理
327				var timeoutID01,
328					timeoutID02,
329					timeoutID03;
330				var changeFunc = function(num, arrow, target, targetP){
331					//ループしているようにみせる処理
332					var moveNum = num;
333
334					if(element.hasAttribute('data-slidearea01-slidelimit')) {
335						if(num == 0 && arrow == 'next') {
336							moveNum = length;
337							num = length;
338						}
339						if(num == length && arrow == 'prev') {
340							moveNum = 0;
341							num = 0;
342						}
343					} else {
344						if(2 <= length){
345							if(length == now && num == 0) moveNum = length+1;
346							if(0 ==  now && num == length) moveNum = -1;
347						}else{
348							if(num == 0 && arrow == 'next') moveNum = length+1;
349							if(num == length && arrow == 'prev') moveNum = -1;
350						}
351					}
352
353					//フリック時のスピード調整
354					var time = speed*1000;
355					if(flickAnimTimeFlg){
356						time = (time*0.8);
357						slidearea.style.WebkitTransition = transitionValueByFlick;
358						slidearea.style.transition = transitionValueByFlick;
359					}
360
361					//スライド一時無効化
362					element.style.pointerEvents = 'none';
363
364					//スライド実行
365					slidearea.style.left = -100*(moveNum+slideDistByDammy)+'%';
366					clearTimeout(timeoutID01);
367					clearTimeout(timeoutID02);
368					clearTimeout(timeoutID03);
369					timeoutID01 = setTimeout(function(){
370						slidearea.addClass('disableTrs');
371						timeoutID02 = setTimeout(function(){
372							slidearea.style.left = -100*(num+slideDistByDammy)+'%';
373							timeoutID03 = setTimeout(function(){
374								slidearea.removeClass('disableTrs');
375								slidearea.style.WebkitTransition = transitionValue;
376								slidearea.style.transition = transitionValue;
377								//スライド一時無効化
378								element.style.pointerEvents = 'auto';
379								if(flickAnimTimeFlg){
380									flickAnimTimeFlg = false;
381								}
382							}, 33);
383						}, 33);
384					}, time);
385
386					//pager 切り替え
387					if(pager) {
388						target = pagers[num];
389						pagers.removeClass('active');
390						target.addClass('active');
391					}
392					//pager 切り替え
393					if(imgpager) {
394						target = imgpagers[num];
395						imgpagers.removeClass('active');
396						target.addClass('active');
397					}
398
399					//カウンター
400					if(counter) {
401						counterNow.innerText = counterZeroPadding(num + 1);
402					}
403
404					//値保存
405					now = ~~num;
406
407					if(element.hasAttribute('data-slidearea01-slidelimit')) {
408						if(now == 0) {
409							if(prev) prev.addClass('disabled');
410						} else {
411							if(prev) prev.removeClass('disabled');
412						}
413						if(now == length) {
414							if(next) next.addClass('disabled');
415						} else {
416							if(next) next.removeClass('disabled');
417						}
418					}
419				};
420				changeFunc(0);
421			};
422			var loadfile = element.querySelector('[data-lf]');
423			if(loadfile) {
424				var loadfilearea = loadfile.closest('[data-lf-area]');
425				if(~~(loadfilearea.getAttribute('data-lf-area')) == 1) {
426					setSlide();
427				}else{
428					loadfilearea.addEventListener('loadfileComplete', setSlide, {once:true});
429				}
430			}else{
431				setSlide();
432			}
433		}(slideModules[i]));
434	}
435}());
436
437//SPのおすすめのリンクを増やす
438(function(){
439	var links = document.querySelectorAll('.recommendarea .slidearea01_link');
440	if(links.length) {
441		var morebtn = document.querySelector('.recommendarea .morebtn');
442		morebtn.addEventListener('click', function(){
443			if(morebtn.hasClass('active')) {
444				links.removeClass('active');
445				morebtn.removeClass('active');
446				Common.jump(window.pageYOffset+(document.querySelector('.slidearea01_wrap').getBoundingClientRect()).top-100);
447			} else {
448				links.addClass('active');
449				morebtn.addClass('active');
450			}
451		});
452	}
453}());
454
455//PCカレンダーの表示の週を増やす
456(function(){
457	var btn = document.querySelector('.calenderarea .morecal');
458	if(btn) {
459		var trs = document.querySelectorAll('.calenderarea tbody tr');
460		if(document.documentElement.clientWidth < 640) {
461			trs[2].addClass('active');
462			trs[3].addClass('active');
463			trs[4].addClass('active');
464			trs[5].addClass('active');
465		}
466		btn.addEventListener('click', function(){
467			var tr_active = document.querySelectorAll('.calenderarea tbody tr.active');
468			if(trs.length == tr_active.length) {
469				btn.removeClass('active');
470				trs.removeClass('active');
471				trs[0].addClass('active');
472				trs[1].addClass('active');
473				if(document.documentElement.clientWidth < 640) {
474					trs[2].addClass('active');
475					trs[3].addClass('active');
476					trs[4].addClass('active');
477					trs[5].addClass('active');
478				}
479				Common.jump(window.pageYOffset+(btn.getBoundingClientRect()).top-200);
480			} else {
481				var num = tr_active.length;
482				if(trs[num]) {
483					trs[num].addClass('active');
484				} else {
485					btn.addClass('active');
486				}
487				if(trs[num+1]) {
488					trs[num+1].addClass('active');
489				} else {
490					btn.addClass('active');
491				}
492				if(trs[num+2]) {
493				} else {
494					btn.addClass('active');
495				}
496			}
497		});
498	}
499}());
500
501//SPカレンダーからフェアを表示させる
502(function(){
503	var btns = document.querySelectorAll('.calenderarea td.fair');
504	var calenderresultarea = document.querySelector('.calenderresultarea');
505	var calenderresulttit = document.querySelector('.calenderresulttit');
506	var calenderresultoutput = document.querySelector('.calenderresultoutput');
507	var flg = false;
508	if(btns.length) {
509		for(var i = 0; i < btns.length; i++) {
510			(function(btn){
511				btn.addEventListener('click', function(){
512					calenderresultarea.addClass('active');
513					calenderresulttit.innerText = btn.getAttribute('data-calenderdate')+'開催日のフェア';
514					btns.removeClass('active');
515					btn.addClass('active');
516					calenderresultoutput.innerHTML = btn.innerHTML;
517					if(flg) Common.jump('.calenderresultarea');
518				});
519			}(btns[i]));
520		}
521	}
522	
523	btns[0].trigger('click');
524	flg = true;
525}());

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.