blob: 927db5406641ae6a66437e79f2948cac7c0f3ba6 [file] [log] [blame]
avm999631ca663e2020-12-17 19:34:22 +01001var bookletNames = [
Adrià Vilanova Martínez5d5742a2022-03-26 18:13:20 +01002 'cant2022',
avm99963c26d16b2021-02-28 00:58:56 +01003 'ciba2021',
avm999631ca663e2020-12-17 19:34:22 +01004 'nadal2020nens',
avm99963c26d16b2021-02-28 00:58:56 +01005 'nadal2020joves',
avm999631ca663e2020-12-17 19:34:22 +01006];
7
avm9996304c97542020-12-20 19:11:16 +01008var interval = null;
avm999631ca663e2020-12-17 19:34:22 +01009var isBookletShown = false;
avm99963d6027c32021-02-28 00:54:49 +010010var showAllConcerts = false;
avm9996374028bc2021-03-06 22:30:04 +010011var forceConcert = null;
avm999631ca663e2020-12-17 19:34:22 +010012
13function showSection(section) {
14 document.querySelectorAll('section').forEach(el => {
15 if (el.id === section)
16 el.removeAttribute('hidden');
17 else
18 el.setAttribute('hidden', '');
19 });
20}
21
avm99963b2a3fa92020-12-21 16:07:29 +010022function convertTime(time) {
23 var hour = Math.floor(time);
24 var totalMinutes = time*60;
25 var minutes = totalMinutes - hour*60;
26
27 return hour + ':' + minutes;
28}
29
30function songElement(song, hasTimes) {
avm999631ca663e2020-12-17 19:34:22 +010031 var div = document.createElement('div');
32 div.classList.add('song');
33
avm99963b2a3fa92020-12-21 16:07:29 +010034 if (hasTimes) {
35 var time = document.createElement('div');
36 time.classList.add('song-time');
avm99963b2a3fa92020-12-21 16:07:29 +010037 time.textContent = convertTime(song.begins);
38
39 div.append(time);
40 }
41
avm999631ca663e2020-12-17 19:34:22 +010042 var title = document.createElement('h3');
43 title.classList.add('song-title');
44 title.textContent = song.title;
45
46 var author = document.createElement('div');
47 author.classList.add('song-author');
48 author.textContent = song.author;
49
50 var performers = document.createElement('div');
51 performers.classList.add('performers');
52
53 song.performers.forEach(performer => {
54 var item = document.createElement('div');
55 item.classList.add('performers-item');
56
57 var span = document.createElement('span');
58 span.classList.add('instrument');
59 span.textContent = performer.instrument;
60
61 var people = document.createTextNode(': ' + performer.names.join(', '));
62
63 item.append(span, people);
64 performers.append(item);
65 });
66
67 div.append(title, author, performers);
68 return div;
69}
70
avm9996304c97542020-12-20 19:11:16 +010071function loadBooklet(booklet, showBackButton = false) {
avm999631ca663e2020-12-17 19:34:22 +010072 console.info('Booklet: ', booklet);
73
avm99963b2a3fa92020-12-21 16:07:29 +010074 var hasTimes = booklet.hasTimes;
75 if (hasTimes) {
76 booklet.songs.sort((a, b) => {
77 return a.begins - b.begins;
78 });
79 }
80
avm999631ca663e2020-12-17 19:34:22 +010081 document.getElementById('concert-title').textContent = booklet.title;
82 document.getElementById('concert-subtitle').textContent = booklet.subtitle;
83
Adrià Vilanova Martínezc5f06262022-03-26 18:56:47 +010084 if (!booklet?.showTitle)
85 document.getElementById('booklet-header').classList
86 .add('booklet-header--invisible');
87 else
88 document.getElementById('booklet-header').classList
89 .remove('booklet-header--invisible');
avm99963a8c89e82021-03-01 22:41:39 +010090 if ('customHeader' in booklet)
91 document.getElementById('booklet-custom-header').innerHTML =
92 booklet.customHeader;
Adrià Vilanova Martínez466fd112022-03-26 18:32:03 +010093 else
94 document.getElementById('booklet-custom-header').textContent = '';
avm99963a8c89e82021-03-01 22:41:39 +010095 if ('customFooter' in booklet)
96 document.getElementById('booklet-custom-footer').innerHTML =
97 booklet.customFooter;
Adrià Vilanova Martínez466fd112022-03-26 18:32:03 +010098 else
99 document.getElementById('booklet-custom-footer').textContent = '';
avm99963a8c89e82021-03-01 22:41:39 +0100100
avm999631ca663e2020-12-17 19:34:22 +0100101 var bookletContent = document.getElementById('booklet-content');
avm9996304c97542020-12-20 19:11:16 +0100102 bookletContent.textContent = '';
avm999631ca663e2020-12-17 19:34:22 +0100103 booklet.songs.forEach(song => {
avm99963b2a3fa92020-12-21 16:07:29 +0100104 var songEl = songElement(song, hasTimes);
avm999631ca663e2020-12-17 19:34:22 +0100105 bookletContent.append(songEl);
106 });
107
108 showSection('booklet');
avm9996304c97542020-12-20 19:11:16 +0100109 if (showBackButton)
110 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
111}
112
113function loadPreviousBookletsList(booklets) {
114 var now = Date.now();
115 var list = document.getElementById('previous-concerts-list');
116
117 var existsPreviousConcert = false;
118 booklets.forEach(booklet => {
avm99963d6027c32021-02-28 00:54:49 +0100119 if (showAllConcerts || booklet.ends * 1000 <= now) {
avm9996304c97542020-12-20 19:11:16 +0100120 existsPreviousConcert = true;
121
122 var el = document.createElement('div');
123 el.classList.add('concert');
124
125 var title = document.createElement('div');
126 title.classList.add('concert-title');
127 title.textContent = booklet.title;
128
129 var subtitle = document.createElement('div');
130 subtitle.classList.add('concert-subtitle');
131 subtitle.textContent = booklet.subtitle;
132
133 var view = document.createElement('button');
134 view.classList.add('concert-btn', 'linkify');
135 view.textContent = 'Obre el programa';
136
137 el.append(title, subtitle, view);
138
139 el.addEventListener('click', _ => {
140 loadBooklet(booklet, true);
141 });
142
143 list.append(el);
144 }
145 });
146
147 if (existsPreviousConcert)
148 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
avm999631ca663e2020-12-17 19:34:22 +0100149}
150
151function checkBooklets(booklets) {
152 if (isBookletShown)
153 return;
154
155 var now = Date.now();
156 var latest = null;
avm9996374028bc2021-03-06 22:30:04 +0100157 for (var booklet of booklets) {
158 if (forceConcert !== null && ('codename' in booklet) &&
159 booklet['codename'] == forceConcert) {
avm999631ca663e2020-12-17 19:34:22 +0100160 latest = booklet;
avm9996374028bc2021-03-06 22:30:04 +0100161 break;
162 }
163
164 if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
165 (latest === null || latest['begins'] < booklet['begins']))
166 latest = booklet;
167 }
avm999631ca663e2020-12-17 19:34:22 +0100168
avm9996304c97542020-12-20 19:11:16 +0100169 if (latest !== null) {
170 document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
avm999631ca663e2020-12-17 19:34:22 +0100171 loadBooklet(latest);
avm9996304c97542020-12-20 19:11:16 +0100172 window.clearInterval(interval);
avm999631ca663e2020-12-17 19:34:22 +0100173 isBookletShown = true;
174 }
175}
176
avm9996320fdf2a2020-12-20 13:08:16 +0100177function showUpdateFooter() {
178 document.getElementById('update-available').removeAttribute('hidden');
179}
180
avm999632d213272021-03-06 23:46:12 +0100181function initBooklets() {
182 var promises = [];
183 bookletNames.forEach(name => {
184 var p = fetch('concerts/' + name + '.json').then(res => res.json());
185 promises.push(p);
186 });
187
188 Promise.all(promises).then(booklets => {
189 showSection('wait-screen');
190 loadPreviousBookletsList(booklets);
191 checkBooklets(booklets);
192 interval = window.setInterval(_ => {
193 checkBooklets(booklets);
194 }, 15 * 1000);
195 });
196}
197
avm999631ca663e2020-12-17 19:34:22 +0100198window.addEventListener('load', _ => {
avm9996304c97542020-12-20 19:11:16 +0100199 document.getElementById('previous-concerts-btn')
200 .addEventListener('click', e => {
201 showSection('previous-concerts');
202 document.getElementById('previous-concerts-btn')
203 .setAttribute('hidden', '');
204 });
205
avm99963d6027c32021-02-28 00:54:49 +0100206 var searchParams = new URLSearchParams(location.search);
207 if (searchParams.has('showAllConcerts'))
208 showAllConcerts = true;
avm9996374028bc2021-03-06 22:30:04 +0100209 if (searchParams.has('concert'))
210 forceConcert = searchParams.get('concert');
avm99963d6027c32021-02-28 00:54:49 +0100211
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000212 if ('serviceWorker' in navigator) {
213 navigator.serviceWorker.register('/sw.js')
214 .then(reg => {
215 reg.addEventListener('updatefound', _ => {
216 showUpdateFooter();
avm999631ca663e2020-12-17 19:34:22 +0100217 });
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000218
avm999632d213272021-03-06 23:46:12 +0100219 initBooklets();
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000220 })
221 .catch(err => {
avm999632d213272021-03-06 23:46:12 +0100222 if (searchParams.has('optionalSW')) {
223 initBooklets();
224 } else {
225 showSection('cant-install');
226 console.error('The service worker failed to be registered.');
227 }
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000228 });
229 } else {
230 showSection('no-service-worker');
avm999631ca663e2020-12-17 19:34:22 +0100231 }
232});