Add ability to show specific concert via a URL parameter

The |concert| parameter can now be used to show a specific concert.

Change-Id: I85ce519296c8a3d5061021f57391290cd4e16520
diff --git a/concerts/ciba2021.json b/concerts/ciba2021.json
index b4af5d8..5d89788 100644
--- a/concerts/ciba2021.json
+++ b/concerts/ciba2021.json
@@ -1,4 +1,5 @@
 {
+  "codename": "ciba2021",
   "title": "Dones de Musicaula en concert",
   "subtitle": "La Ciba - 7 de març del 2021",
   "begins": 1615137300,
diff --git a/concerts/nadal2020joves.json b/concerts/nadal2020joves.json
index 5481a8c..669cd9a 100644
--- a/concerts/nadal2020joves.json
+++ b/concerts/nadal2020joves.json
@@ -1,4 +1,5 @@
 {
+  "codename": "nadal2020joves",
   "title": "Concert de Nadal 2020",
   "subtitle": "Joves i adults",
   "begins": 1608312600,
diff --git a/concerts/nadal2020nens.json b/concerts/nadal2020nens.json
index 9b21169..8bb57db 100644
--- a/concerts/nadal2020nens.json
+++ b/concerts/nadal2020nens.json
@@ -1,4 +1,5 @@
 {
+  "codename": "nadal2020nens",
   "title": "Concert de Nadal 2020",
   "subtitle": "Nens i nenes",
   "begins": 0,
diff --git a/js/script.js b/js/script.js
index 43124e8..0daa399 100644
--- a/js/script.js
+++ b/js/script.js
@@ -7,6 +7,7 @@
 var interval = null;
 var isBookletShown = false;
 var showAllConcerts = false;
+var forceConcert = null;
 
 function showSection(section) {
   document.querySelectorAll('section').forEach(el => {
@@ -143,11 +144,17 @@
 
   var now = Date.now();
   var latest = null;
-  booklets.forEach(booklet => {
-    if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
-        (latest === null || latest['begins'] < booklet['begins']))
+  for (var booklet of booklets) {
+    if (forceConcert !== null && ('codename' in booklet) &&
+        booklet['codename'] == forceConcert) {
       latest = booklet;
-  });
+      break;
+    }
+
+    if (booklet['begins'] * 1000 <= now && booklet['ends'] * 1000 >= now &&
+        (latest === null || latest['begins'] < booklet['begins']))
+      latest = booklet;
+  }
 
   if (latest !== null) {
     document.getElementById('previous-concerts-btn').setAttribute('hidden', '');
@@ -172,6 +179,8 @@
   var searchParams = new URLSearchParams(location.search);
   if (searchParams.has('showAllConcerts'))
     showAllConcerts = true;
+  if (searchParams.has('concert'))
+    forceConcert = searchParams.get('concert');
 
   if ('serviceWorker' in navigator) {
     navigator.serviceWorker.register('/sw.js')
diff --git a/sw.js b/sw.js
index 90ce2de..5ac8d72 100644
--- a/sw.js
+++ b/sw.js
@@ -1,4 +1,4 @@
-var CACHE_NAME = 'all-v1.1.2';
+var CACHE_NAME = 'all-v1.1.3';
 var urlsToCache = [
   '/',
   '/css/styles.css',