blob: abe30b00271d4d1f543ef5aafc8062a6a0f7e334 [file] [log] [blame]
avm999631ca663e2020-12-17 19:34:22 +01001var bookletNames = [
2 'nadal2020joves',
3 'nadal2020nens',
4];
5
avm9996304c97542020-12-20 19:11:16 +01006var interval = null;
avm999631ca663e2020-12-17 19:34:22 +01007var isBookletShown = false;
avm99963d6027c32021-02-28 00:54:49 +01008var showAllConcerts = false;
avm999631ca663e2020-12-17 19:34:22 +01009
10function showSection(section) {
11 document.querySelectorAll('section').forEach(el => {
12 if (el.id === section)
13 el.removeAttribute('hidden');
14 else
15 el.setAttribute('hidden', '');
16 });
17}
18
avm99963b2a3fa92020-12-21 16:07:29 +010019function convertTime(time) {
20 var hour = Math.floor(time);
21 var totalMinutes = time*60;
22 var minutes = totalMinutes - hour*60;
23
24 return hour + ':' + minutes;
25}
26
27function songElement(song, hasTimes) {
avm999631ca663e2020-12-17 19:34:22 +010028 var div = document.createElement('div');
29 div.classList.add('song');
30
avm99963b2a3fa92020-12-21 16:07:29 +010031 if (hasTimes) {
32 var time = document.createElement('div');
33 time.classList.add('song-time');
34 console.log(song.begins);
35 time.textContent = convertTime(song.begins);
36
37 div.append(time);
38 }
39
avm999631ca663e2020-12-17 19:34:22 +010040 var title = document.createElement('h3');
41 title.classList.add('song-title');
42 title.textContent = song.title;
43
44 var author = document.createElement('div');
45 author.classList.add('song-author');
46 author.textContent = song.author;
47
48 var performers = document.createElement('div');
49 performers.classList.add('performers');
50
51 song.performers.forEach(performer => {
52 var item = document.createElement('div');
53 item.classList.add('performers-item');
54
55 var span = document.createElement('span');
56 span.classList.add('instrument');
57 span.textContent = performer.instrument;
58
59 var people = document.createTextNode(': ' + performer.names.join(', '));
60
61 item.append(span, people);
62 performers.append(item);
63 });
64
65 div.append(title, author, performers);
66 return div;
67}
68
avm9996304c97542020-12-20 19:11:16 +010069function loadBooklet(booklet, showBackButton = false) {
avm999631ca663e2020-12-17 19:34:22 +010070 console.info('Booklet: ', booklet);
71
avm99963b2a3fa92020-12-21 16:07:29 +010072 var hasTimes = booklet.hasTimes;
73 if (hasTimes) {
74 booklet.songs.sort((a, b) => {
75 return a.begins - b.begins;
76 });
77 }
78
avm999631ca663e2020-12-17 19:34:22 +010079 document.getElementById('concert-title').textContent = booklet.title;
80 document.getElementById('concert-subtitle').textContent = booklet.subtitle;
81
avm99963a8c89e82021-03-01 22:41:39 +010082 if ('customHeader' in booklet)
83 document.getElementById('booklet-custom-header').innerHTML =
84 booklet.customHeader;
85 if ('customFooter' in booklet)
86 document.getElementById('booklet-custom-footer').innerHTML =
87 booklet.customFooter;
88
avm999631ca663e2020-12-17 19:34:22 +010089 var bookletContent = document.getElementById('booklet-content');
avm9996304c97542020-12-20 19:11:16 +010090 bookletContent.textContent = '';
avm999631ca663e2020-12-17 19:34:22 +010091 booklet.songs.forEach(song => {
avm99963b2a3fa92020-12-21 16:07:29 +010092 var songEl = songElement(song, hasTimes);
avm999631ca663e2020-12-17 19:34:22 +010093 bookletContent.append(songEl);
94 });
95
96 showSection('booklet');
avm9996304c97542020-12-20 19:11:16 +010097 if (showBackButton)
98 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
99}
100
101function loadPreviousBookletsList(booklets) {
102 var now = Date.now();
103 var list = document.getElementById('previous-concerts-list');
104
105 var existsPreviousConcert = false;
106 booklets.forEach(booklet => {
avm99963d6027c32021-02-28 00:54:49 +0100107 if (showAllConcerts || booklet.ends * 1000 <= now) {
avm9996304c97542020-12-20 19:11:16 +0100108 existsPreviousConcert = true;
109
110 var el = document.createElement('div');
111 el.classList.add('concert');
112
113 var title = document.createElement('div');
114 title.classList.add('concert-title');
115 title.textContent = booklet.title;
116
117 var subtitle = document.createElement('div');
118 subtitle.classList.add('concert-subtitle');
119 subtitle.textContent = booklet.subtitle;
120
121 var view = document.createElement('button');
122 view.classList.add('concert-btn', 'linkify');
123 view.textContent = 'Obre el programa';
124
125 el.append(title, subtitle, view);
126
127 el.addEventListener('click', _ => {
128 loadBooklet(booklet, true);
129 });
130
131 list.append(el);
132 }
133 });
134
135 if (existsPreviousConcert)
136 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
avm999631ca663e2020-12-17 19:34:22 +0100137}
138
139function checkBooklets(booklets) {
140 if (isBookletShown)
141 return;
142
143 var now = Date.now();
144 var latest = null;
145 booklets.forEach(booklet => {
avm9996304c97542020-12-20 19:11:16 +0100146 if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
147 (latest === null || latest['begins'] < booklet['begins']))
avm999631ca663e2020-12-17 19:34:22 +0100148 latest = booklet;
149 });
150
avm9996304c97542020-12-20 19:11:16 +0100151 if (latest !== null) {
152 document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
avm999631ca663e2020-12-17 19:34:22 +0100153 loadBooklet(latest);
avm9996304c97542020-12-20 19:11:16 +0100154 window.clearInterval(interval);
avm999631ca663e2020-12-17 19:34:22 +0100155 isBookletShown = true;
156 }
157}
158
avm9996320fdf2a2020-12-20 13:08:16 +0100159function showUpdateFooter() {
160 document.getElementById('update-available').removeAttribute('hidden');
161}
162
avm999631ca663e2020-12-17 19:34:22 +0100163window.addEventListener('load', _ => {
avm9996304c97542020-12-20 19:11:16 +0100164 document.getElementById('previous-concerts-btn')
165 .addEventListener('click', e => {
166 showSection('previous-concerts');
167 document.getElementById('previous-concerts-btn')
168 .setAttribute('hidden', '');
169 });
170
avm99963d6027c32021-02-28 00:54:49 +0100171 var searchParams = new URLSearchParams(location.search);
172 if (searchParams.has('showAllConcerts'))
173 showAllConcerts = true;
174
avm999631ca663e2020-12-17 19:34:22 +0100175 if ('serviceWorker' in navigator) {
176 navigator.serviceWorker.register('/sw.js')
avm9996320fdf2a2020-12-20 13:08:16 +0100177 .then(reg => {
178 reg.addEventListener('updatefound', _ => {
179 showUpdateFooter();
180 });
181
avm999631ca663e2020-12-17 19:34:22 +0100182 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 => {
avm9996304c97542020-12-20 19:11:16 +0100189 showSection('wait-screen');
190 loadPreviousBookletsList(booklets);
avm999631ca663e2020-12-17 19:34:22 +0100191 checkBooklets(booklets);
avm9996304c97542020-12-20 19:11:16 +0100192 interval = window.setInterval(_ => {
193 checkBooklets(booklets);
194 }, 15 * 1000);
avm999631ca663e2020-12-17 19:34:22 +0100195 });
196 })
197 .catch(err => {
198 showSection('cant-install');
199 console.error('The service worker failed to be registered.');
200 });
201 } else {
202 showSection('no-service-worker');
203 }
204});