blob: 522f0f0c73e9061834030b2a8072fbde90dbe4dd [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;
8
9function showSection(section) {
10 document.querySelectorAll('section').forEach(el => {
11 if (el.id === section)
12 el.removeAttribute('hidden');
13 else
14 el.setAttribute('hidden', '');
15 });
16}
17
avm99963b2a3fa92020-12-21 16:07:29 +010018function convertTime(time) {
19 var hour = Math.floor(time);
20 var totalMinutes = time*60;
21 var minutes = totalMinutes - hour*60;
22
23 return hour + ':' + minutes;
24}
25
26function songElement(song, hasTimes) {
avm999631ca663e2020-12-17 19:34:22 +010027 var div = document.createElement('div');
28 div.classList.add('song');
29
avm99963b2a3fa92020-12-21 16:07:29 +010030 if (hasTimes) {
31 var time = document.createElement('div');
32 time.classList.add('song-time');
33 console.log(song.begins);
34 time.textContent = convertTime(song.begins);
35
36 div.append(time);
37 }
38
avm999631ca663e2020-12-17 19:34:22 +010039 var title = document.createElement('h3');
40 title.classList.add('song-title');
41 title.textContent = song.title;
42
43 var author = document.createElement('div');
44 author.classList.add('song-author');
45 author.textContent = song.author;
46
47 var performers = document.createElement('div');
48 performers.classList.add('performers');
49
50 song.performers.forEach(performer => {
51 var item = document.createElement('div');
52 item.classList.add('performers-item');
53
54 var span = document.createElement('span');
55 span.classList.add('instrument');
56 span.textContent = performer.instrument;
57
58 var people = document.createTextNode(': ' + performer.names.join(', '));
59
60 item.append(span, people);
61 performers.append(item);
62 });
63
64 div.append(title, author, performers);
65 return div;
66}
67
avm9996304c97542020-12-20 19:11:16 +010068function loadBooklet(booklet, showBackButton = false) {
avm999631ca663e2020-12-17 19:34:22 +010069 console.info('Booklet: ', booklet);
70
avm99963b2a3fa92020-12-21 16:07:29 +010071 var hasTimes = booklet.hasTimes;
72 if (hasTimes) {
73 booklet.songs.sort((a, b) => {
74 return a.begins - b.begins;
75 });
76 }
77
avm999631ca663e2020-12-17 19:34:22 +010078 document.getElementById('concert-title').textContent = booklet.title;
79 document.getElementById('concert-subtitle').textContent = booklet.subtitle;
80
81 var bookletContent = document.getElementById('booklet-content');
avm9996304c97542020-12-20 19:11:16 +010082 bookletContent.textContent = '';
avm999631ca663e2020-12-17 19:34:22 +010083 booklet.songs.forEach(song => {
avm99963b2a3fa92020-12-21 16:07:29 +010084 var songEl = songElement(song, hasTimes);
avm999631ca663e2020-12-17 19:34:22 +010085 bookletContent.append(songEl);
86 });
87
88 showSection('booklet');
avm9996304c97542020-12-20 19:11:16 +010089 if (showBackButton)
90 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
91}
92
93function loadPreviousBookletsList(booklets) {
94 var now = Date.now();
95 var list = document.getElementById('previous-concerts-list');
96
97 var existsPreviousConcert = false;
98 booklets.forEach(booklet => {
99 if (booklet.ends * 1000 <= now) {
100 existsPreviousConcert = true;
101
102 var el = document.createElement('div');
103 el.classList.add('concert');
104
105 var title = document.createElement('div');
106 title.classList.add('concert-title');
107 title.textContent = booklet.title;
108
109 var subtitle = document.createElement('div');
110 subtitle.classList.add('concert-subtitle');
111 subtitle.textContent = booklet.subtitle;
112
113 var view = document.createElement('button');
114 view.classList.add('concert-btn', 'linkify');
115 view.textContent = 'Obre el programa';
116
117 el.append(title, subtitle, view);
118
119 el.addEventListener('click', _ => {
120 loadBooklet(booklet, true);
121 });
122
123 list.append(el);
124 }
125 });
126
127 if (existsPreviousConcert)
128 document.getElementById('previous-concerts-btn').removeAttribute('hidden');
avm999631ca663e2020-12-17 19:34:22 +0100129}
130
131function checkBooklets(booklets) {
132 if (isBookletShown)
133 return;
134
135 var now = Date.now();
136 var latest = null;
137 booklets.forEach(booklet => {
avm9996304c97542020-12-20 19:11:16 +0100138 if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
139 (latest === null || latest['begins'] < booklet['begins']))
avm999631ca663e2020-12-17 19:34:22 +0100140 latest = booklet;
141 });
142
avm9996304c97542020-12-20 19:11:16 +0100143 if (latest !== null) {
144 document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
avm999631ca663e2020-12-17 19:34:22 +0100145 loadBooklet(latest);
avm9996304c97542020-12-20 19:11:16 +0100146 window.clearInterval(interval);
avm999631ca663e2020-12-17 19:34:22 +0100147 isBookletShown = true;
148 }
149}
150
avm9996320fdf2a2020-12-20 13:08:16 +0100151function showUpdateFooter() {
152 document.getElementById('update-available').removeAttribute('hidden');
153}
154
avm999631ca663e2020-12-17 19:34:22 +0100155window.addEventListener('load', _ => {
avm9996304c97542020-12-20 19:11:16 +0100156 document.getElementById('previous-concerts-btn')
157 .addEventListener('click', e => {
158 showSection('previous-concerts');
159 document.getElementById('previous-concerts-btn')
160 .setAttribute('hidden', '');
161 });
162
avm999631ca663e2020-12-17 19:34:22 +0100163 if ('serviceWorker' in navigator) {
164 navigator.serviceWorker.register('/sw.js')
avm9996320fdf2a2020-12-20 13:08:16 +0100165 .then(reg => {
166 reg.addEventListener('updatefound', _ => {
167 showUpdateFooter();
168 });
169
avm999631ca663e2020-12-17 19:34:22 +0100170 var promises = [];
171 bookletNames.forEach(name => {
172 var p = fetch('concerts/' + name + '.json').then(res => res.json());
173 promises.push(p);
174 });
175
176 Promise.all(promises).then(booklets => {
avm9996304c97542020-12-20 19:11:16 +0100177 showSection('wait-screen');
178 loadPreviousBookletsList(booklets);
avm999631ca663e2020-12-17 19:34:22 +0100179 checkBooklets(booklets);
avm9996304c97542020-12-20 19:11:16 +0100180 interval = window.setInterval(_ => {
181 checkBooklets(booklets);
182 }, 15 * 1000);
avm999631ca663e2020-12-17 19:34:22 +0100183 });
184 })
185 .catch(err => {
186 showSection('cant-install');
187 console.error('The service worker failed to be registered.');
188 });
189 } else {
190 showSection('no-service-worker');
191 }
192});