blob: c04daa657df268b482e231721fcc9dca8b0636b6 [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');
37 console.log(song.begins);
38 time.textContent = convertTime(song.begins);
39
40 div.append(time);
41 }
42
avm999631ca663e2020-12-17 19:34:22 +010043 var title = document.createElement('h3');
44 title.classList.add('song-title');
45 title.textContent = song.title;
46
47 var author = document.createElement('div');
48 author.classList.add('song-author');
49 author.textContent = song.author;
50
51 var performers = document.createElement('div');
52 performers.classList.add('performers');
53
54 song.performers.forEach(performer => {
55 var item = document.createElement('div');
56 item.classList.add('performers-item');
57
58 var span = document.createElement('span');
59 span.classList.add('instrument');
60 span.textContent = performer.instrument;
61
62 var people = document.createTextNode(': ' + performer.names.join(', '));
63
64 item.append(span, people);
65 performers.append(item);
66 });
67
68 div.append(title, author, performers);
69 return div;
70}
71
avm9996304c97542020-12-20 19:11:16 +010072function loadBooklet(booklet, showBackButton = false) {
avm999631ca663e2020-12-17 19:34:22 +010073 console.info('Booklet: ', booklet);
74
avm99963b2a3fa92020-12-21 16:07:29 +010075 var hasTimes = booklet.hasTimes;
76 if (hasTimes) {
77 booklet.songs.sort((a, b) => {
78 return a.begins - b.begins;
79 });
80 }
81
avm999631ca663e2020-12-17 19:34:22 +010082 document.getElementById('concert-title').textContent = booklet.title;
83 document.getElementById('concert-subtitle').textContent = booklet.subtitle;
84
avm99963a8c89e82021-03-01 22:41:39 +010085 if ('customHeader' in booklet)
86 document.getElementById('booklet-custom-header').innerHTML =
87 booklet.customHeader;
88 if ('customFooter' in booklet)
89 document.getElementById('booklet-custom-footer').innerHTML =
90 booklet.customFooter;
91
avm999631ca663e2020-12-17 19:34:22 +010092 var bookletContent = document.getElementById('booklet-content');
avm9996304c97542020-12-20 19:11:16 +010093 bookletContent.textContent = '';
avm999631ca663e2020-12-17 19:34:22 +010094 booklet.songs.forEach(song => {
avm99963b2a3fa92020-12-21 16:07:29 +010095 var songEl = songElement(song, hasTimes);
avm999631ca663e2020-12-17 19:34:22 +010096 bookletContent.append(songEl);
97 });
98
99 showSection('booklet');
avm9996304c97542020-12-20 19:11:16 +0100100 if (showBackButton)
101 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
102}
103
104function loadPreviousBookletsList(booklets) {
105 var now = Date.now();
106 var list = document.getElementById('previous-concerts-list');
107
108 var existsPreviousConcert = false;
109 booklets.forEach(booklet => {
avm99963d6027c32021-02-28 00:54:49 +0100110 if (showAllConcerts || booklet.ends * 1000 <= now) {
avm9996304c97542020-12-20 19:11:16 +0100111 existsPreviousConcert = true;
112
113 var el = document.createElement('div');
114 el.classList.add('concert');
115
116 var title = document.createElement('div');
117 title.classList.add('concert-title');
118 title.textContent = booklet.title;
119
120 var subtitle = document.createElement('div');
121 subtitle.classList.add('concert-subtitle');
122 subtitle.textContent = booklet.subtitle;
123
124 var view = document.createElement('button');
125 view.classList.add('concert-btn', 'linkify');
126 view.textContent = 'Obre el programa';
127
128 el.append(title, subtitle, view);
129
130 el.addEventListener('click', _ => {
131 loadBooklet(booklet, true);
132 });
133
134 list.append(el);
135 }
136 });
137
138 if (existsPreviousConcert)
139 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
avm999631ca663e2020-12-17 19:34:22 +0100140}
141
142function checkBooklets(booklets) {
143 if (isBookletShown)
144 return;
145
146 var now = Date.now();
147 var latest = null;
avm9996374028bc2021-03-06 22:30:04 +0100148 for (var booklet of booklets) {
149 if (forceConcert !== null && ('codename' in booklet) &&
150 booklet['codename'] == forceConcert) {
avm999631ca663e2020-12-17 19:34:22 +0100151 latest = booklet;
avm9996374028bc2021-03-06 22:30:04 +0100152 break;
153 }
154
155 if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
156 (latest === null || latest['begins'] < booklet['begins']))
157 latest = booklet;
158 }
avm999631ca663e2020-12-17 19:34:22 +0100159
avm9996304c97542020-12-20 19:11:16 +0100160 if (latest !== null) {
161 document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
avm999631ca663e2020-12-17 19:34:22 +0100162 loadBooklet(latest);
avm9996304c97542020-12-20 19:11:16 +0100163 window.clearInterval(interval);
avm999631ca663e2020-12-17 19:34:22 +0100164 isBookletShown = true;
165 }
166}
167
avm9996320fdf2a2020-12-20 13:08:16 +0100168function showUpdateFooter() {
169 document.getElementById('update-available').removeAttribute('hidden');
170}
171
avm999632d213272021-03-06 23:46:12 +0100172function initBooklets() {
173 var promises = [];
174 bookletNames.forEach(name => {
175 var p = fetch('concerts/' + name + '.json').then(res => res.json());
176 promises.push(p);
177 });
178
179 Promise.all(promises).then(booklets => {
180 showSection('wait-screen');
181 loadPreviousBookletsList(booklets);
182 checkBooklets(booklets);
183 interval = window.setInterval(_ => {
184 checkBooklets(booklets);
185 }, 15 * 1000);
186 });
187}
188
avm999631ca663e2020-12-17 19:34:22 +0100189window.addEventListener('load', _ => {
avm9996304c97542020-12-20 19:11:16 +0100190 document.getElementById('previous-concerts-btn')
191 .addEventListener('click', e => {
192 showSection('previous-concerts');
193 document.getElementById('previous-concerts-btn')
194 .setAttribute('hidden', '');
195 });
196
avm99963d6027c32021-02-28 00:54:49 +0100197 var searchParams = new URLSearchParams(location.search);
198 if (searchParams.has('showAllConcerts'))
199 showAllConcerts = true;
avm9996374028bc2021-03-06 22:30:04 +0100200 if (searchParams.has('concert'))
201 forceConcert = searchParams.get('concert');
avm99963d6027c32021-02-28 00:54:49 +0100202
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000203 if ('serviceWorker' in navigator) {
204 navigator.serviceWorker.register('/sw.js')
205 .then(reg => {
206 reg.addEventListener('updatefound', _ => {
207 showUpdateFooter();
avm999631ca663e2020-12-17 19:34:22 +0100208 });
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000209
avm999632d213272021-03-06 23:46:12 +0100210 initBooklets();
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000211 })
212 .catch(err => {
avm999632d213272021-03-06 23:46:12 +0100213 if (searchParams.has('optionalSW')) {
214 initBooklets();
215 } else {
216 showSection('cant-install');
217 console.error('The service worker failed to be registered.');
218 }
Adrià Vilanova Martínezb06de522021-03-06 22:15:19 +0000219 });
220 } else {
221 showSection('no-service-worker');
avm999631ca663e2020-12-17 19:34:22 +0100222 }
223});