blob: 43124e880f6f6d3a38c7bd558d22b205a1ee4ae2 [file] [log] [blame]
avm999631ca663e2020-12-17 19:34:22 +01001var bookletNames = [
avm99963c26d16b2021-02-28 00:58:56 +01002 'ciba2021',
avm999631ca663e2020-12-17 19:34:22 +01003 'nadal2020nens',
avm99963c26d16b2021-02-28 00:58:56 +01004 'nadal2020joves',
avm999631ca663e2020-12-17 19:34:22 +01005];
6
avm9996304c97542020-12-20 19:11:16 +01007var interval = null;
avm999631ca663e2020-12-17 19:34:22 +01008var isBookletShown = false;
avm99963d6027c32021-02-28 00:54:49 +01009var showAllConcerts = false;
avm999631ca663e2020-12-17 19:34:22 +010010
11function showSection(section) {
12 document.querySelectorAll('section').forEach(el => {
13 if (el.id === section)
14 el.removeAttribute('hidden');
15 else
16 el.setAttribute('hidden', '');
17 });
18}
19
avm99963b2a3fa92020-12-21 16:07:29 +010020function convertTime(time) {
21 var hour = Math.floor(time);
22 var totalMinutes = time*60;
23 var minutes = totalMinutes - hour*60;
24
25 return hour + ':' + minutes;
26}
27
28function songElement(song, hasTimes) {
avm999631ca663e2020-12-17 19:34:22 +010029 var div = document.createElement('div');
30 div.classList.add('song');
31
avm99963b2a3fa92020-12-21 16:07:29 +010032 if (hasTimes) {
33 var time = document.createElement('div');
34 time.classList.add('song-time');
35 console.log(song.begins);
36 time.textContent = convertTime(song.begins);
37
38 div.append(time);
39 }
40
avm999631ca663e2020-12-17 19:34:22 +010041 var title = document.createElement('h3');
42 title.classList.add('song-title');
43 title.textContent = song.title;
44
45 var author = document.createElement('div');
46 author.classList.add('song-author');
47 author.textContent = song.author;
48
49 var performers = document.createElement('div');
50 performers.classList.add('performers');
51
52 song.performers.forEach(performer => {
53 var item = document.createElement('div');
54 item.classList.add('performers-item');
55
56 var span = document.createElement('span');
57 span.classList.add('instrument');
58 span.textContent = performer.instrument;
59
60 var people = document.createTextNode(': ' + performer.names.join(', '));
61
62 item.append(span, people);
63 performers.append(item);
64 });
65
66 div.append(title, author, performers);
67 return div;
68}
69
avm9996304c97542020-12-20 19:11:16 +010070function loadBooklet(booklet, showBackButton = false) {
avm999631ca663e2020-12-17 19:34:22 +010071 console.info('Booklet: ', booklet);
72
avm99963b2a3fa92020-12-21 16:07:29 +010073 var hasTimes = booklet.hasTimes;
74 if (hasTimes) {
75 booklet.songs.sort((a, b) => {
76 return a.begins - b.begins;
77 });
78 }
79
avm999631ca663e2020-12-17 19:34:22 +010080 document.getElementById('concert-title').textContent = booklet.title;
81 document.getElementById('concert-subtitle').textContent = booklet.subtitle;
82
avm99963a8c89e82021-03-01 22:41:39 +010083 if ('customHeader' in booklet)
84 document.getElementById('booklet-custom-header').innerHTML =
85 booklet.customHeader;
86 if ('customFooter' in booklet)
87 document.getElementById('booklet-custom-footer').innerHTML =
88 booklet.customFooter;
89
avm999631ca663e2020-12-17 19:34:22 +010090 var bookletContent = document.getElementById('booklet-content');
avm9996304c97542020-12-20 19:11:16 +010091 bookletContent.textContent = '';
avm999631ca663e2020-12-17 19:34:22 +010092 booklet.songs.forEach(song => {
avm99963b2a3fa92020-12-21 16:07:29 +010093 var songEl = songElement(song, hasTimes);
avm999631ca663e2020-12-17 19:34:22 +010094 bookletContent.append(songEl);
95 });
96
97 showSection('booklet');
avm9996304c97542020-12-20 19:11:16 +010098 if (showBackButton)
99 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
100}
101
102function loadPreviousBookletsList(booklets) {
103 var now = Date.now();
104 var list = document.getElementById('previous-concerts-list');
105
106 var existsPreviousConcert = false;
107 booklets.forEach(booklet => {
avm99963d6027c32021-02-28 00:54:49 +0100108 if (showAllConcerts || booklet.ends * 1000 <= now) {
avm9996304c97542020-12-20 19:11:16 +0100109 existsPreviousConcert = true;
110
111 var el = document.createElement('div');
112 el.classList.add('concert');
113
114 var title = document.createElement('div');
115 title.classList.add('concert-title');
116 title.textContent = booklet.title;
117
118 var subtitle = document.createElement('div');
119 subtitle.classList.add('concert-subtitle');
120 subtitle.textContent = booklet.subtitle;
121
122 var view = document.createElement('button');
123 view.classList.add('concert-btn', 'linkify');
124 view.textContent = 'Obre el programa';
125
126 el.append(title, subtitle, view);
127
128 el.addEventListener('click', _ => {
129 loadBooklet(booklet, true);
130 });
131
132 list.append(el);
133 }
134 });
135
136 if (existsPreviousConcert)
137 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
avm999631ca663e2020-12-17 19:34:22 +0100138}
139
140function checkBooklets(booklets) {
141 if (isBookletShown)
142 return;
143
144 var now = Date.now();
145 var latest = null;
146 booklets.forEach(booklet => {
avm9996304c97542020-12-20 19:11:16 +0100147 if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
148 (latest === null || latest['begins'] < booklet['begins']))
avm999631ca663e2020-12-17 19:34:22 +0100149 latest = booklet;
150 });
151
avm9996304c97542020-12-20 19:11:16 +0100152 if (latest !== null) {
153 document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
avm999631ca663e2020-12-17 19:34:22 +0100154 loadBooklet(latest);
avm9996304c97542020-12-20 19:11:16 +0100155 window.clearInterval(interval);
avm999631ca663e2020-12-17 19:34:22 +0100156 isBookletShown = true;
157 }
158}
159
avm9996320fdf2a2020-12-20 13:08:16 +0100160function showUpdateFooter() {
161 document.getElementById('update-available').removeAttribute('hidden');
162}
163
avm999631ca663e2020-12-17 19:34:22 +0100164window.addEventListener('load', _ => {
avm9996304c97542020-12-20 19:11:16 +0100165 document.getElementById('previous-concerts-btn')
166 .addEventListener('click', e => {
167 showSection('previous-concerts');
168 document.getElementById('previous-concerts-btn')
169 .setAttribute('hidden', '');
170 });
171
avm99963d6027c32021-02-28 00:54:49 +0100172 var searchParams = new URLSearchParams(location.search);
173 if (searchParams.has('showAllConcerts'))
174 showAllConcerts = true;
175
avm999631ca663e2020-12-17 19:34:22 +0100176 if ('serviceWorker' in navigator) {
177 navigator.serviceWorker.register('/sw.js')
avm9996320fdf2a2020-12-20 13:08:16 +0100178 .then(reg => {
179 reg.addEventListener('updatefound', _ => {
180 showUpdateFooter();
181 });
182
avm999631ca663e2020-12-17 19:34:22 +0100183 var promises = [];
184 bookletNames.forEach(name => {
185 var p = fetch('concerts/' + name + '.json').then(res => res.json());
186 promises.push(p);
187 });
188
189 Promise.all(promises).then(booklets => {
avm9996304c97542020-12-20 19:11:16 +0100190 showSection('wait-screen');
191 loadPreviousBookletsList(booklets);
avm999631ca663e2020-12-17 19:34:22 +0100192 checkBooklets(booklets);
avm9996304c97542020-12-20 19:11:16 +0100193 interval = window.setInterval(_ => {
194 checkBooklets(booklets);
195 }, 15 * 1000);
avm999631ca663e2020-12-17 19:34:22 +0100196 });
197 })
198 .catch(err => {
199 showSection('cant-install');
200 console.error('The service worker failed to be registered.');
201 });
202 } else {
203 showSection('no-service-worker');
204 }
205});