PageSourceSearch

https://www.arttowermito.or.jp/common/js/list.js

js arttowermito.or.jp collected 2026-09-24 09:15:22 UTC 15,374 bytes, 505 lines download raw bytes

1/*================================================================
2lineupList
3
4jsonから取得した公演データを配列で返すプラグイン
5
6オプション
7
8lastn  [数値] 表示件数
9date   [連想配列] mode:now|next|past|now&next,date:日付,closeDay:休館日も期間中なら表示するかどうか
10sorts  [文字列] DESC | ASC
11path   [文字列] jsonのパス
12onComplete [function] 完了後のコールバック
13endmarker [bool] 終了マーカーを追加する
14conditions [配列] 絞り込みの条件
15(label:項目名,value:内容,mode:true|false,matching:partiallyなら部分一致)
16
17================================================================*/
18
19(function($) {
20
21	/*今日の日付けを取得
22	----------------------------------------*/
23	var nowDay = new Date();
24	var y = nowDay.getFullYear();
25	var m = ("00" + (nowDay.getMonth()+1)).slice(-2);
26	var d = ("00" + nowDay.getDate()).slice(-2);
27	var yyyymmdd = y + "/" + m + "/" + d;
28	
29	/*stage判定
30	----------------------------------------*/
31	var url = location.host;
32	if ( url.indexOf('stage') !== -1) {
33		var stage = 1;
34	}
35
36	/*================================================================================
37	lineupListプラグイン
38	================================================================================*/
39	$.fn.lineupList = function(options){
40		var settings = $.extend({
41			lastn : '',
42			date : '',
43			archive : false,
44			kodomo : false,
45			sorts : 'ASC',
46			path : '',
47			conditions : '',
48			onComplete: function() {}
49		}, options);
50		
51		var $data = [];
52		var markerSetting = {};
53		var $yomikomi_count = 0;//JSONファイル読み込みカウント
54		var maeno = [];
55
56		//日付パラメータがあれば上書き
57		var arg = new Object;
58		var pair=location.search.substring(1).split('&');
59		for(var i=0;pair[i];i++) {
60			var kv = pair[i].split('=');
61			arg[kv[0]]=kv[1];
62		}
63		if(arg.preview){
64			yyyymmdd = arg.preview;
65			nowDay = new Date(yyyymmdd);
66			if(settings.date.date){
67				settings.date.date = arg.preview;
68			}
69		}
70
71		var calendar_day="";
72		if(settings.date.date && settings.calendar=="day"){
73			calendar_day=settings.date.date.replace("-","/");
74		}			
75		
76		return this.each(function(){
77			setTimeout(function(){
78				makeTopics();
79			},0);
80		});
81		
82		
83		/*----------------------------------------
84		ファイル名の数だけJSON読み込み関数を実行する
85		----------------------------------------*/
86		function makeTopics(){
87			$.ajax({
88				url:"/data/marker/marker.json",
89				type:'GET',
90				dataType:'json',
91				cache: false,
92				async:false
93			}).always(function(marker_json){
94				//マーカーの設定を読み込む
95				markerSetting.data = marker_json.data;
96				markerSetting.sorts = marker_json.sort;
97				//その後リストデータを作成
98				if($.type(settings.path)=="string"){
99					settings.onComplete
100					//jsonファイル読み込みの場合
101					var $filenameList = settings.path.split(',');
102					$.each($filenameList, function(i,val) {
103						yomikomi($filenameList.length,val);
104					});
105				}else{
106					//配列データの場合
107					$.when(
108						make(settings.path)
109					).done(function(){
110						ArrayAdjustment($data)
111					});
112				}
113			});
114		}
115
116		/*----------------------------------------
117		JSON読み込み関数
118		----------------------------------------*/
119		function yomikomi($filenameMax,filename){
120
121			if($yomikomi_count<=$filenameMax){
122
123				$.ajax({
124					url:filename,
125					type:'GET',
126					dataType:'json',
127					cache: false,
128					async: false
129				
130				/*読み込み成功
131				--------------------------------*/
132				}).done(function(jsonArray){
133					
134				make(jsonArray);
135				
136				/*成功失敗共通
137				--------------------------------*/
138				}).always(function(){
139					$yomikomi_count++;
140					if($yomikomi_count>=$filenameMax){
141						//最後に1度だけ配列整形関数を実行
142						ArrayAdjustment($data);
143					}
144				});
145			}
146		}
147
148		/*----------------------------------------
149		データ整形関数
150		----------------------------------------*/
151		function make(jsonArray){
152			$.each(jsonArray, function(i,json) {
153            
154        //中身がNULLの時はスキップ
155            if(i==""){
156               return true;
157            }
158						
159						var $OK = new Array(true);
160						var $num = 0;
161						var $date_first = new Date(json[$num]['date']+" 00:00:00");
162						var $date_last = new Date(json[$num]['date_last']+" 23:59:59");
163						
164						//公開日を過ぎた上書きの情報があるかの判定(あれば[1]を使用)
165						if(json.hasOwnProperty(1) &&  new Date(json[1]['start']) <= nowDay){
166							$num = 1;
167						//ステージングで上書きの情報があるかの判定(公開日は問わない)
168						}else if(stage===1 && json.hasOwnProperty(1)){
169							$num = 1;
170						}else{
171							//ない場合は[0]を使用
172							$num = 0;
173						}
174						
175						//公開日の判定
176						if(json[$num]['start'] && new Date(json[$num]['start']) > nowDay){
177							$OK.push(false);
178						}
179
180						//非公開日の判定
181						if(json[$num]['end'] && new Date(json[$num]['end']) <= nowDay){
182							$OK.push(false);
183						}
184
185
186						//期間指定
187						if(settings.date.date && settings.date.closeDay===true && $date_first <= nowDay){
188							if(json[$num]['date_last'] && $date_last < nowDay){
189								$OK.push(false);
190							}
191						}else if(settings.date){
192							if(settings.date.mode==="past"){
193								if(json[$num]['date_last'] && $date_last >= nowDay){
194									$OK.push(false);
195								}
196							}else if(settings.date.mode==="next"){
197								if(json[$num]['date'] && $date_first <= nowDay){
198									$OK.push(false);
199								}
200							}else if(settings.date.mode==="now&next"){
201								if($date_last < nowDay){
202									$OK.push(false);
203								}
204							}else if(settings.date.mode==="all"){
205							}else{
206                				//mode==="now"
207								var kikan = settings.date.date.split(',');
208								var kikanFlg = false;
209								$.each(kikan, function(iii,day) {
210									if(json[$num]['date_all'] && json[$num]['date_all'].indexOf(day)!==-1){
211										kikanFlg = true;
212									}
213								});
214								if(kikanFlg!==true){
215									$OK.push(false);
216								}
217							}
218						}else if(json[$num]['date_last'] && $date_last < nowDay){
219							$OK.push(false);
220						}
221						
222						/*条件フィルタ
223						--------------------------------*/
224						var $OK_conditions2 = [];
225						var $falsenokazu = 0;
226
227						if(settings.conditions){
228							
229							settings.conditions.forEach(function(val,index){
230
231								var $OK_conditions = [];
232
233								var c_label = val['label'];//絞り込みたい項目名
234								if(Array.isArray(val['value'])){//値
235									var c_value = val['value'];
236								}else{
237									var c_value = val['value'].split(",");
238								}
239								if(val['andor']){var c_andor = val['andor']}else{var c_andor = "and"}//and|or
240								var c_mode = val['mode'];//除外|含む
241								var c_matching = val['matching'];//完全一致|部分一致
242								
243
244								if(json[$num][c_label]){
245									if(c_label=="marker"){
246										var itm = [];
247										$.each(json[$num].marker, function(marker_id,marker_array) {
248											itm.push(marker_id);
249										});	
250									}else{
251										if(Array.isArray(json[$num][c_label])){
252											var itm = json[$num][c_label];
253										}else{
254											var itm = json[$num][c_label].split(",");
255										}
256									}
257								}else{
258									var itm = [];
259								}
260									
261								
262								for (var iii = 0; iii < c_value.length; iii++) {
263									var matchingF = false;
264									if(c_matching==="partially"){
265										//検索条件:含む
266										kekka = itm.filter(function(obj) {return obj.indexOf(c_value[iii]) >= 0;});
267										if(kekka.length > 0){matchingF = true;}
268									}else{
269										//検索条件:完全一致
270										if ($.inArray(c_value[iii], itm) > -1){
271											matchingF = true;
272										}
273									}
274									if (matchingF===true){
275										$OK_conditions.push(true);
276									}else{
277										$OK_conditions.push(false);
278										$falsenokazu++;
279									}
280								}
281
282
283								if(c_andor=="and" && c_mode==false){
284									//全て除外
285									//if(c_value.length!=$falsenokazu){
286									if ($.inArray(true,$OK_conditions) > -1) {
287										$OK_conditions2.push(false);
288									}else{
289										$OK_conditions2.push(true);
290									}
291								}else if(c_andor=="and" && c_mode==true){
292									//全て含む
293									if ($.inArray(false,$OK_conditions) > -1) {
294										$OK_conditions2.push(false);
295									}else{
296										$OK_conditions2.push(true);
297									}
298								}else if(c_andor=="or" && c_mode==false){
299									//どれか除外
300									if ($.inArray(true,$OK_conditions) > -1) {
301										$OK_conditions2.push(false);
302									}else{
303										$OK_conditions2.push(true);
304									}
305								}else if(c_andor=="or" && c_mode==true){
306									//どれか含む
307									if ($.inArray(true,$OK_conditions) < 0) {
308										$OK_conditions2.push(false);
309									}else{
310										$OK_conditions2.push(true);
311									}
312								}
313								
314							});//条件数だけループ
315
316							if($.inArray(false,$OK_conditions2) > -1){
317								$OK.push(false);
318							}
319							
320						}
321
322						/*マーカー処理(条件がOKのもののみ)
323						--------------------------------*/
324						if ($.inArray(false,$OK) === -1) {
325
326							if(calendar_day!=""){
327								yyyymmdd2=calendar_day;
328							}else{
329								yyyymmdd2=yyyymmdd;
330							}
331
332							//開催中・募集中を追加(中止以外)						
333							if (json[$num].date_all.indexOf(yyyymmdd) !== -1 && yyyymmdd==yyyymmdd2 && json[$num].marker && !json[$num].marker[9] && !json[$num].marker[95]) {
334								var kaisai = 1;
335								if (json[$num].marker[70]&&!json[$num].marker[5]) {
336									json[$num].marker[4]=markerSetting.data[4];
337								}else if (json[$num].marker[37]||json[$num].marker[38]||json[$num].hall==="event") {
338									json[$num].marker[60]=markerSetting.data[60];
339								}else if(json[$num].hall==="gallery"||json[$num].hall==="gallery-en"){
340									json[$num].marker[39]=markerSetting.data[39];
341								}else{
342									json[$num].marker[59]=markerSetting.data[59];
343								}
344							}
345							
346							$.each(json[$num].marker, function(marker_id,marker_data) {
347								 if($date_last < nowDay && marker_data.category==="3"){
348									//終了対応
349									if(marker_id!=9){
350										delete json[$num].marker[marker_id];
351									}
352								 //}else if(marker_data.category==="4"){
353									//delete json[$num].marker[marker_id];
354								 }else if(markerSetting.data[marker_id]){
355									 //マーカーを設定で上書き
356									json[$num].marker[marker_id] = markerSetting.data[marker_id];
357								 }
358							});
359
360							//終了を追加
361							if(/*settings.endmarker!==false &&*/$date_last < nowDay && !json[$num].marker[95]){
362								//json[$num].marker[62]={"id": "62","color": "black","category": "3","name": "終了","hidden": "0"};
363								json[$num].marker[62]=markerSetting.data[62];
364							}else{
365								//発売中を追加
366								if(json[$num].ticket_sale && !json[$num].marker[9] && !json[$num].marker[10]&&!json[$num].marker[94]&&!json[$num].marker[72]){
367									var ticket_sale = new Date(json[$num].ticket_sale);
368									if(ticket_sale < nowDay){
369										json[$num].marker[1]=markerSetting.data[1];
370										delete json[$num].marker[2];//「予告」を削除
371										delete json[$num].marker[3];//「近日発売」を削除
372									}
373								}
374							}
375							
376						}
377						
378
379						/*条件が揃ったデータを配列に入れる
380						--------------------------------*/
381						if ($.inArray(false,$OK) === -1) {
382							//kodomoがtrueならkodomoデータを優先表示
383							if(settings.kodomo===true && json[$num].kodomo){
384								$.each(json[$num].kodomo, function(key,val) {
385									if (val.date_all.indexOf(settings.date.date) !== -1) {
386										json[$num].title = '<span class="promenade">'+json[$num].title+'</span>'+val.title;
387										json[$num].schedule = val.schedule;
388										json[$num].schedule_time = "";
389										json[$num].link = json[$num].link+"#"+val.id;
390									}
391									
392								});	
393							}
394							//重複チェック
395							var Duplication = false;
396							$.each($data, function(index,checkArray) {
397								if(checkArray.key == json[$num].key){
398									Duplication = true;
399								}
400							});		
401							if(Duplication==false){
402								$data.push(json[$num]);
403							}
404							
405						}
406
407						
408					});
409		}
410		
411		/*----------------------------------------
412		配列順番整形関数
413		----------------------------------------*/
414		function ArrayAdjustment($data){
415			
416			if($data.length > 0){
417				
418				//配列を日付で並び替える
419				if(settings.sorts.toLowerCase()==='ASC'.toLowerCase()){
420					var rules=[['date','asc'],['category','asc']];
421					msort($data,rules);
422				}else if(settings.sorts.toLowerCase()==='DESC'.toLowerCase()){
423					var rules=[['date','desc'],['category','desc']];
424					msort($data,rules);
425				}
426
427				//lastnが設定されている場合は配列の数をそこまでに減らす
428				if(settings.lastn){
429					$data.splice(settings.lastn, 10000);
430				}
431			
432			}else{
433				//記事が1つもなければNULLを返す
434				$data = null;
435			}
436		
437			//配列を返して終了
438			if(settings.onComplete){
439				settings.onComplete($data);
440			}
441		}
442
443	}
444
445})(jQuery);
446
447/**
448 * 多重ソート関数
449 */
450function msort(datas,rules){
451    if(!(datas instanceof Array))throw new Error('datas is not array.');
452    if(!(rules instanceof Array))throw new Error('rules is not array.');
453
454    //順序番号のパラメータを生成
455    var p='_index_'+Math.floor(Math.random()*1000)+((new Date()).getTime()).toString();
456
457    //並び替えする対象の二次元配列をループ
458    for(var i1=0,n1=datas.length;i1<n1;i1++){
459        var n2=rules.length;
460
461        //並び替えの順番が指定されていないときに、datasから値を取り出して、通常のsortをした順序指定をrules変数内に上書きする
462        for(var i2=0;i2<n2;i2++){
463            var key=rules[i2][0];
464            var rule=rules[i2][1];
465            if(!(rule instanceof Array)){
466                var tmp=new Array(n1);
467                for(var i3=0;i3<n1;i3++){
468                    tmp[i3]=datas[i3][key];
469                }
470                tmp.sort();
471                if(rule=='desc')tmp.reverse();
472                rules[i2][1]=new Array(n1);
473                for(var i3=0;i3<n1;i3++){
474                    rules[i2][1][i3]=tmp[i3];
475                }
476            }
477        }
478        
479        //順序を計算する公式によって、順序番号の値を代入する
480        var indexs=new Array(n2);
481        for(var i2=0;i2<n2;i2++){
482            var key=rules[i2][0];
483            var rule=rules[i2][1];
484            var index=rule.indexOf(datas[i1][key]);
485            indexs[i2]=(index>-1)?index:rule.length;
486            for(var i3=i2+1;i3<n2;i3++){
487                var rule=rules[i3][1];
488                if(rule instanceof Array){
489                    indexs[i2]*=rule.length+1;
490                }
491            }
492        }
493        datas[i1][p]=0;
494        for(var i2=0;i2<n2;i2++){
495            datas[i1][p]+=indexs[i2];
496        }
497    }
498    
499    //順序番号の値でソートする
500    datas.sort(function(a,b){
501        if(a[p]<b[p])return -1;
502        if(a[p]>b[p])return 1;
503        return 0;
504    });
505}

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.