Merge remote-tracking branch 'origin/v1.1'

Els commits fets incorporen una reestructuració del codi del frontend.
diff --git a/css/bulma-adjustments.css b/css/bulma-adjustments.css
index a722717..739591c 100644
--- a/css/bulma-adjustments.css
+++ b/css/bulma-adjustments.css
@@ -48,10 +48,6 @@
     cursor: pointer;
 }
 
-.hidden {
-    display: none;
-}
-
 #fme-maps-container h4 {
   font-weight: bold;
 }
diff --git a/index.html b/index.html
index 1127b55..0e65137 100644
--- a/index.html
+++ b/index.html
@@ -19,185 +19,9 @@
         <link rel="stylesheet" href="./css/bulma-adjustments.css">
     </head>
     <body>
-        <script>
-            var elements = document.getElementsByClassName("button");
-            Array.from(elements).forEach(function(element) {
-                element.addEventListener('click', clickButton);
-                element.parent = element.parentNode.id;
-            });
-            var elements = document.getElementsByClassName("complex-button");
-            Array.from(elements).forEach(function(element) {
-                element.addEventListener('click', clickButton);
-                element.parent = element.parentNode.id;
-            });
+        <script></script>
 
-            var final_JSON = {
-                "class": null,
-                "number": "",
-                "letter": ""
-            };
-
-            function fillInSummary() {
-              var begins = new Date(parseInt(final_JSON.class.begins)*1000);
-              var ends = new Date(parseInt(final_JSON.class.ends)*1000);
-
-              document.getElementById('subject-final').textContent = final_JSON.class.friendly_name || final_JSON.class.calendar_name;
-              document.getElementById('classroom-final').textContent = final_JSON.class.room;
-              document.getElementById('date-final').textContent = begins.toLocaleDateString();
-              document.getElementById('time-final').textContent = formatDate(begins) + ' - ' + formatDate(ends);
-              document.getElementById('letter-final').textContent = final_JSON.letter;
-              document.getElementById('number-final').textContent = final_JSON.number;
-            }
-
-            function clickButton(element) {
-                var btn = element.currentTarget;
-                var parent = btn.parent;
-
-                if (parent == "subject-container") {
-                    // Canvi de background del button
-                    var selectedClass = JSON.parse(btn.getAttribute('data-class'));
-                    $("#subject-container .complex-button").removeClass("is-link")
-                    btn.classList.add("is-link");
-                    // Canvi JSON
-                    final_JSON["class"] = selectedClass;
-                    // Anchor següent pregunta
-                    switchSection("section-2");
-                } else if (parent == "number-container") {
-                    // Canvi de background del button
-                    $("#number-container .button").removeClass("is-link is-light is-active")
-                    btn.classList.add("is-link", "is-light", "is-active");
-                    // Canvi JSON
-                    final_JSON["number"] = btn.getAttribute('data-number');
-                    // Introducció de totes les dades al resum final
-                    fillInSummary();
-                    // Anchor següent pregunta
-                    switchSection("section-send");
-                } else if (parent == "letter-container") {
-                    // Canvi de background del button
-                    $("#letter-container .button").removeClass("is-link is-light is-active")
-                    btn.classList.add("is-link", "is-light", "is-active");
-                    // Canvi JSON
-                    final_JSON["letter"] = btn.getAttribute('data-letter');
-                    // Anchor següent pregunta
-                    switchSection("section-3");
-                }
-            }
-            
-            function formatDate(d) {
-                var str = "";
-                str += d.getHours();
-                str += ":";
-                if (d.getMinutes() < 10) str += "0";
-                str += d.getMinutes();
-                return str;
-            }
-
-          var api_url;
-
-          window.addEventListener('load', _ => {
-            // Check if user is signed in
-            if (localStorage.getItem('devMode') == 'true') {
-              var banner = document.getElementById('dev-mode');
-              banner.addEventListener('click', _ => {
-                localStorage.devMode = 'false';
-                location.reload();
-              });
-              banner.classList.remove('hidden');
-              api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'
-            } else {
-              api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";
-            }
-            fetch(api_url + "isSignedIn", {
-              "mode": "cors",
-              "credentials": "include"
-            })
-                .then(response => response.json())
-                .then(data => {
-                    if (!data.payload.signedIn) {
-                        console.log("Not signed in!");
-                        fetch(api_url + "getAuthUrl", {
-                          "mode": "cors",
-                          "credentials": "include"
-                        })
-                            .then(response => response.json())
-                            .then(data => {
-                                // TODO: redirect here
-                                // location.href = data.payload.url;
-                                console.warn('Log in here: ', data.payload.url);
-                            });
-                    }
-                });
-
-            fetch(api_url + "getCurrentClasses", {
-              "mode": "cors",
-              "credentials": "include"
-            })
-                .then(response => response.json())
-                .then(data => {
-                    if (data.payload.classes.length == 0) {
-                        document.getElementById('no-subjects').classList.remove('hidden');
-                    } else {
-                        document.getElementById('fme-maps-container').classList.remove('hidden');
-                    }
-
-                    for (var [i, classe] of data.payload.classes.entries()) {
-                        console.log(classe);
-
-                        var hora_inici = formatDate(new Date(parseInt(classe.begins)*1000));
-                        var hora_final = formatDate(new Date(parseInt(classe.ends)*1000));
-                        
-                        var classeDiv = document.createElement('div');
-                        classeDiv.classList.add('message', 'complex-button');
-                        classeDiv.id = 'subject-' + classe.subject_id + '-' + classe.room;
-                        classeDiv.setAttribute('data-class', JSON.stringify(classe));
-
-                        var header = document.createElement('div');
-                        header.classList.add('message-header');
-                        header.textContent = classe.friendly_name || classe.calendar_name;
-
-                        var body = document.createElement('div');
-                        body.classList.add('message-body');
-
-                        var div1 = document.createElement('div');
-                        var span = document.createElement('span');
-                        span.textContent = classe.room;
-
-                        if (i > 0 && data.payload.classes[i-1].friendly_name == classe.friendly_name) {
-                            div1.classList.add('has-text-danger', 'has-text-weight-bold');
-                        } else if (i < data.payload.classes.length - 1 && data.payload.classes[i+1].friendly_name == classe.friendly_name) {
-                            div1.classList.add('has-text-danger', 'has-text-weight-bold');
-                        }
-
-                        div1.textContent = 'Aula ';
-                        div1.appendChild(span);
-
-                        var div2 = document.createElement('div');
-                        div2.textContent = hora_inici + ' - ' + hora_final;
-
-                        body.appendChild(div1);
-                        body.appendChild(div2);
-
-                        classeDiv.appendChild(header);
-                        classeDiv.appendChild(body);
-
-                        document.getElementById("subject-container").appendChild(classeDiv);
-                    }
-
-                    var elements = document.getElementsByClassName("button");
-                    Array.from(elements).forEach(function(element) {
-                        element.addEventListener('click', clickButton);
-                        element.parent = element.parentNode.id;
-                    });
-                    var elements = document.getElementsByClassName("complex-button");
-                    Array.from(elements).forEach(function(element) {
-                        element.addEventListener('click', clickButton);
-                        element.parent = element.parentNode.id;
-                    });
-                });
-          });
-        </script>
-
-        <span id="dev-mode" class="hidden">Dev mode</span>
+        <span id="dev-mode" class="is-hidden">Dev mode</span>
         
         <nav class="navbar is-link">
             <div class="navbar-brand">
@@ -206,55 +30,68 @@
         </nav>
         
         <section id="section-1" class="section">
-            <!--
-            <div class="field has-addons">
-                <p class="control">
-                    <button class="button">&lt;</button>
-                </p>
-                <p class="control">
-                    <input type="date" class="button">
-                </p>
-                <p class="control">
-                    <button class="button">&gt;</button>
-                </p>
-            </div>
-            <div class="field has-addons">
-                <p class="control">
-                    <button class="button">&lt;</button>
-                </p>
-                <p class="control">
-                    <input type="button" class="button" value="08:00 - 08:30">
-                </p>
-                <p class="control">
-                    <button class="button">&gt;</button>
-                </p>
-            </div><br>
-            -->
+            <nav class="level">
+                <div class="level-item">
+                    <div class="field has-addons has-addons-centered">
+                        <p class="control">
+                        <button id="date-prev" class="button">&lt;</button>
+                        </p>
+                        <p class="control">
+                        <input id="date-selector" type="button" class="button">
+                        </p>
+                        <p class="control">
+                        <button id="date-next" class="button">&gt;</button>
+                        </p>
+                    </div>
+                </div>
+                <div class="level-item">
+                    <div class="field has-addons has-addons-centered">
+                        <p class="control">
+                        <button id="time-prev" class="button">&lt;</button>
+                        </p>
+                        <p class="control">
+                        <input id="time-selector" type="button" class="button" value="08:00 - 08:30">
+                        </p>
+                        <p class="control">
+                        <button id="time-next" class="button">&gt;</button>
+                        </p>
+                    </div>
+                </div>
+            </nav>
+
             <div id="subject-container" class="grid buttons"></div>
-            <div id="no-subjects" class="hidden">No s'està impartint cap classe en aquests moments.</div>
-            <div id="fme-maps-container" class="hidden">
-              <h4>Mapes de les aules de l'FME</h4>
-              <div class="maps">
-                <div class="map">
-                  <img src="img/ps.png">
-                  <div class="map--label">Planta <b>-1</b></div>
+            <div id="no-subjects" class="is-hidden">No s'està impartint cap classe en aquests moments.</div>
+            <div id="fme-maps-container" class="is-hidden">
+                <h4>Plànols de les aules de l'FME</h4>
+                <div class="maps">
+                    <div class="map">
+                        <img src="img/ps.png">
+                        <div class="map--label">Planta <b>-1</b></div>
+                    </div>
+                    <div class="map">
+                        <img src="img/p0.png">
+                        <div class="map--label">Planta <b>0</b></div>
+                    </div>
+                    <div class="map">
+                        <img src="img/p1.png">
+                        <div class="map--label">Planta <b>1</b></div>
+                    </div>
                 </div>
-                <div class="map">
-                  <img src="img/p0.png">
-                  <div class="map--label">Planta <b>0</b></div>
-                </div>
-                <div class="map">
-                  <img src="img/p1.png">
-                  <div class="map--label">Planta <b>1</b></div>
-                </div>
-              </div>
             </div>
-            
+
         </section>
 
-        <section id="section-2" class="section" style="display: none;">
+        <section id="section-2" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-1')">Torna enrere (Classe)</button>
 
+            <div id="repeated-subject-warning" class="is-hidden">
+                <br><article class="message is-warning">
+                    <div class="message-body">
+                        Heu triat una assignatura que es fa en dues aules alhora. Comproveu que sou a l'aula <strong id="repeated-subject-warning-class">aula</strong>.
+                    </div>
+                </article>
+            </div> -->
+
             <div id="letter-container" class="buttons grid">
                 <button class="button" id="letter-A" data-letter="A">A</button>
                 <button class="button" id="letter-B" data-letter="B">B</button>
@@ -271,9 +108,9 @@
             </div>
         </section>
 
-        <section id="section-3" class="section" style="display: none;">
+        <section id="section-3" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-2')">Torna enrere (Lletra)</button>
-            
+
             <div id="number-container" class="buttons grid">
                 <button class="button" id="number-1" data-number="1">1</button>
                 <button class="button" id="number-2" data-number="2">2</button>
@@ -287,7 +124,7 @@
                 <button class="button" id="number-10" data-number="10">10</button>
             </div>
         </section>
-        <section id="section-send" class="section" style="display: none;">
+        <section id="section-send" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-3')">Torna enrere (Número)</button>
             <br/><br/>
             <span class="has-text-weight-bold">Assignatura:</span>
@@ -302,7 +139,7 @@
             <span id="letter-final">A</span><span id="number-final">1</span><br><br>
 
             <button id="send-button" class="button is-link is-large">Omple el formulari</button><br><br>
-            
+
             Hi ha errors? <br /><a class="button is-link is-light" href="https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform">Completa el formulari manualment</a>
 
 
@@ -312,84 +149,7 @@
                 </div>
             </article>
         </section>
-        <script>
-            var current_section = "section-1";
 
-            function toggleVisibility(id) {
-                var x = document.getElementById(id);
-                if (x.style.display == "none") {
-                    x.style.display = "block";
-                } else {
-                    x.style.display = "none";
-                }
-            }
-
-            function switchSection(s) {
-                setTimeout(function(){ 
-                    toggleVisibility(current_section);
-                    toggleVisibility(s);
-                    current_section = s;
-                }, 75);
-            }
-
-            const idsFormulari = {
-              room: "1063142948",
-              day: "2115504093",
-              begins: "1749141911",
-              ends: "1827359679",
-              rows: {
-                A: "208184485",
-                B: "1077148310",
-                C: "642851281",
-                D: "1686039024",
-                E: "697835787",
-                F: "1511799646",
-                G: "809853432",
-                H: "182597499",
-                I: "1890539481",
-                J: "529159478",
-                K: "1615241874",
-                L: "1334263875"
-              },
-              notes: "1600275159"
-            };
-            const formBaseUrl = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform";
-
-            function sendForm() {
-                // Add subject to user
-                fetch(api_url + "addUserSubject", {
-                  "method": "POST",
-                  "body": JSON.stringify({
-                            subject: final_JSON.class.subject_id
-                          }),
-                  "mode": "cors",
-                  "credentials": "include"
-                })
-                .then(res => res.json())
-                .then(json => {
-                  console.log("Subject added to user: ", json);
-
-                  var begins = new Date(parseInt(final_JSON.class.begins)*1000);
-                  var ends = new Date(parseInt(final_JSON.class.ends)*1000);
-
-                  var params = new URLSearchParams();
-                  params.append("entry." + idsFormulari.room, final_JSON.class.room); // class, number, letter
-                  params.append("entry." + idsFormulari.day, begins.getFullYear().toString() + '-' + (begins.getMonth() + 1).toString().padStart(2, "0") + '-' + begins.getDate().toString().padStart(2, "0"));
-                  params.append("entry." + idsFormulari.begins, formatDate(begins));
-                  params.append("entry." + idsFormulari.ends, formatDate(ends));
-                  params.append("entry." + idsFormulari.rows[final_JSON.letter], 'Columna ' + final_JSON.number);
-                  // params.append("entry." + idsFormulari.notes, '[Autogenerat per delefme/covid-tracability -- Assignatura seleccionada: ' + (final_JSON.class.friendly_name || final_JSON.class.calendar_name) + ']');
-
-                  var formulari_link = formBaseUrl + '?' + params.toString() + '#i1';
-                  window.location.href = formulari_link;
-                });
-             }
-             
-             document.getElementById("send-button").addEventListener('click', function (el) {              
-                document.getElementById('send-button').classList.add('is-loading');
-
-                sendForm();
-             });
-        </script>
+        <script src="./js/build_page.js"></script>
     </body>
 </html>
diff --git a/js/build_page.js b/js/build_page.js
new file mode 100644
index 0000000..81b76ed
--- /dev/null
+++ b/js/build_page.js
@@ -0,0 +1,377 @@
+const idsFormulari = {

+    room: "1063142948",

+    day: "2115504093",

+    begins: "1749141911",

+    ends: "1827359679",

+    rows: {

+        A: "208184485",

+        B: "1077148310",

+        C: "642851281",

+        D: "1686039024",

+        E: "697835787",

+        F: "1511799646",

+        G: "809853432",

+        H: "182597499",

+        I: "1890539481",

+        J: "529159478",

+        K: "1615241874",

+        L: "1334263875"

+    },

+    notes: "1600275159"

+};

+

+const formBaseUrl = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform";

+

+const MIN_HOUR = 8;

+const MAX_HOUR = 23; // Pels altres graus de la Facultat

+

+var final_JSON = {

+    "class": null,

+    "number": "",

+    "letter": ""

+};

+

+var current_section = "section-1";

+

+var repeated_subjects;

+var current_time;

+

+

+function fillInSummary() {

+    var begins = new Date(parseInt(final_JSON.class.begins)*1000);

+    var ends = new Date(parseInt(final_JSON.class.ends)*1000);

+

+    document.getElementById('subject-final').textContent = final_JSON.class.friendly_name || final_JSON.class.calendar_name;

+    document.getElementById('classroom-final').textContent = final_JSON.class.room;

+    document.getElementById('date-final').textContent = begins.toLocaleDateString();

+    document.getElementById('time-final').textContent = formatTime(begins) + ' - ' + formatTime(ends);

+    document.getElementById('letter-final').textContent = final_JSON.letter;

+    document.getElementById('number-final').textContent = final_JSON.number;

+}

+

+function clickButton(element) {

+    var btn = element.currentTarget;

+    var parent = btn.parent;

+

+    if (parent == "subject-container") {

+        // Canvi de background del button

+        var selectedClass = JSON.parse(btn.getAttribute('data-class'));

+        $("#subject-container .complex-button").removeClass("is-link")

+        btn.classList.add("is-link");

+        // Canvi JSON

+        final_JSON["class"] = selectedClass;

+        // Missatge advertència classe repetida

+        if (repeated_subjects.has(selectedClass.id)) {

+            document.getElementById('repeated-subject-warning').classList.remove('is-hidden');

+            document.getElementById('repeated-subject-warning-class').textContent = selectedClass.room;

+        } else {

+            document.getElementById('repeated-subject-warning').classList.add('is-hidden');

+        }

+        // Anchor següent pregunta

+        switchSection("section-2");

+    } else if (parent == "number-container") {

+        // Canvi de background del button

+        $("#number-container .button").removeClass("is-link is-light is-active")

+        btn.classList.add("is-link", "is-light", "is-active");

+        // Canvi JSON

+        final_JSON["number"] = btn.getAttribute('data-number');

+        // Introducció de totes les dades al resum final

+        fillInSummary();

+        // Anchor següent pregunta

+        switchSection("section-send");

+    } else if (parent == "letter-container") {

+        // Canvi de background del button

+        $("#letter-container .button").removeClass("is-link is-light is-active")

+        btn.classList.add("is-link", "is-light", "is-active");

+        // Canvi JSON

+        final_JSON["letter"] = btn.getAttribute('data-letter');

+        // Anchor següent pregunta

+        switchSection("section-3");

+    }

+}

+

+function switchSection(s) {

+    setTimeout(function(){ 

+        document.getElementById(current_section).classList.add('is-hidden');

+        document.getElementById(s).classList.remove('is-hidden');

+        current_section = s;

+    }, 75);

+}

+

+function findRepeatedSubjects(classes) {

+    var rep = new Set();

+    for (var [i, classe] of classes.entries()) {

+        if (i > 0 && classes[i-1].calendar_name == classe.calendar_name) {

+            rep.add(classe.id);

+            rep.add(classes[i-1].id);

+        }

+    }

+    return rep;

+}

+

+function buildSubjectContainer(classes, repeated) {

+    var duplicateSubjectBoolNext, duplicateSubjectBoolPrev;

+    var duplicateSubjectCounter = 0;

+    

+    for (var [i, classe] of classes) {        

+        var hora_inici = formatDate(new Date(parseInt(classe.begins)*1000));

+        var hora_final = formatDate(new Date(parseInt(classe.ends)*1000));

+        var classeDiv = document.createElement('div');

+        

+        // Check if the subject is repeated

+        duplicateSubjectBoolNext = data.payload.classes[i+1].friendly_name == classe.friendly_name;

+        duplicateSubjectBoolPrev = data.payload.classes[i-1].friendly_name == classe.friendly_name;

+        

+        if(duplicateSubjectBoolNext && i < classes.length - 1 && duplicateSubjectCounter%2 == 1) {

+            classeDiv.classList.add('message', 'complex-button-full');

+        }

+        

+        if (duplicateSubjectBoolPrev && i > 0) {

+            classeDiv.classList.add('message', 'complex-button2Right');

+        } else if(duplicateSubjectBoolNext && i < data.payload.classes.length - 1) {

+            classeDiv.classList.add('message', 'complex-button2Left');

+        } else {

+            classeDiv.classList.add('message', 'complex-button');

+        }

+        

+        classeDiv.classList.add('message', 'complex-button');

+        classeDiv.id = 'subject-' + classe.subject_id + '-' + classe.room;

+        classeDiv.setAttribute('data-class', JSON.stringify(classe));

+

+        var header = document.createElement('div');

+        header.classList.add('message-header');

+

+        if (!(duplicateSubjectBoolPrev && i > 0)) {

+            header.textContent = classe.friendly_name || classe.calendar_name;

+        } else {

+            header.textContent = classe.friendly_name || classe.calendar_name;;

+            header.style.color = "#4A4A4A";

+        }

+        

+        var body = document.createElement('div');

+        body.classList.add('message-body');

+

+        var div1 = document.createElement('div');

+        var span = document.createElement('span');

+        span.textContent = classe.room;

+

+        div1.classList.add('has-text-weight-bold');

+

+        div1.textContent = 'Aula ';

+        div1.appendChild(span);

+

+        var div2 = document.createElement('div');

+        div2.textContent = hora_inici + ' - ' + hora_final;

+

+        body.appendChild(div1);

+        body.appendChild(div2);

+

+        classeDiv.appendChild(header);

+        classeDiv.appendChild(body);

+

+        document.getElementById("subject-container").appendChild(classeDiv);

+        ++duplicateSubjectCounter;

+    }

+  

+    var elements = document.getElementsByClassName("button");

+    Array.from(elements).forEach(function(element) {

+        element.addEventListener('click', clickButton);

+        element.parent = element.parentNode.id;

+    });

+    var elements = document.getElementsByClassName("complex-button");

+    Array.from(elements).forEach(function(element) {

+        element.addEventListener('click', clickButton);

+        element.parent = element.parentNode.id;

+    });

+}

+

+function getDefaultTime() {

+    var time = new Date();

+    time.setSeconds(0);

+    time.setMilliseconds(0);

+    if (time.getMinutes() < 30) time.setMinutes(0);

+    else time.setMinutes(30);

+    if (time.getHours() < MIN_HOUR) {

+        time.setHours(MIN_HOUR);

+        time.setMinutes(0);

+    }

+    if (time.getHours() >= MAX_HOUR) {

+        time.setHours(MAX_HOUR - 1);

+        time.setMinutes(30);

+    }

+    return time

+}

+

+function buildTimeSelector(date) {

+    document.getElementById("date-selector").value = formatDate(date);

+    var end_time = new Date(date.getTime() + 30*60000);  // 1 min = 60000 ms

+    document.getElementById("time-selector").value = formatTime(date) + " - " + formatTime(end_time);

+}

+

+function addDateEventListeners(date) {

+    document.getElementById("date-prev").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() - 24*60*60000);

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("date-next").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() + 24*60*60000);

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("time-prev").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() - 30*60000);

+        if (current_time.getHours() < MIN_HOUR) {

+            current_time = new Date(current_time.getTime() - 24*60*60000);

+            current_time.setHours(MAX_HOUR - 1);

+            current_time.setMinutes(30);

+        }

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("time-next").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() + 30*60000);

+        if (current_time.getHours() >= MAX_HOUR) {

+            current_time = new Date(current_time.getTime() + 24*60*60000);

+            current_time.setHours(MIN_HOUR);

+            current_time.setMinutes(0);

+        }

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+}

+

+function formatTime(d) {

+    return d.toLocaleTimeString("ca", {timeStyle: 'short'});

+    /* var str = "";

+    str += d.getHours();

+    str += ":";

+    if (d.getMinutes() < 10) str += "0";

+     str += d.getMinutes();

+    return str; */

+}

+

+function formatDate(d) {

+    return d.toLocaleDateString("ca");

+}

+

+function fetchClasses() {

+    console.log(api_url + "getClassesInTime/" + current_time.getTime()/1000);

+    fetch(api_url + "getClassesInTime/" + current_time.getTime()/1000, {

+        "mode": "cors",

+        "credentials": "include"

+    })

+        .then(response => response.json())

+        .then(data => {

+            if (data.payload.classes.length == 0) {

+                document.getElementById('no-subjects').classList.remove('is-hidden');

+                document.getElementById('subject-container').classList.add('is-hidden');

+                document.getElementById('fme-maps-container').classList.add('is-hidden');

+            } else {

+                repeated_subjects = findRepeatedSubjects(data.payload.classes);

+                buildSubjectContainer(data.payload.classes, repeated_subjects);

+                document.getElementById('no-subjects').classList.add('is-hidden');

+                document.getElementById('subject-container').classList.remove('is-hidden');

+                document.getElementById('fme-maps-container').classList.remove('is-hidden');

+            }

+

+        });

+}

+

+function onPageLoad() {

+

+    // Check if user is signed in

+    if (localStorage.getItem('devMode') == 'true') {

+        var banner = document.getElementById('dev-mode');

+        banner.addEventListener('click', _ => {

+            localStorage.devMode = 'false';

+            location.reload();

+        });

+        banner.classList.remove('is-hidden');

+        api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'

+    } else {

+        api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";

+    }

+

+    current_time = getDefaultTime();

+    buildTimeSelector(current_time);

+

+    fetch(api_url + "isSignedIn", {

+        "mode": "cors",

+        "credentials": "include"

+    })

+        .then(response => response.json())

+        .then(data => {

+            if (!data.payload.signedIn) {

+                console.log("Not signed in!");

+                fetch(api_url + "getAuthUrl", {

+                    "mode": "cors",

+                    "credentials": "include"

+                })

+                    .then(response => response.json())

+                    .then(data => {

+                        // TODO: redirect here

+                        // location.href = data.payload.url;

+                        console.warn('Log in here: ', data.payload.url);

+                    });

+            }

+        });

+

+    fetchClasses();

+}

+

+function sendForm() {

+    // Add subject to user

+    fetch(api_url + "addUserSubject", {

+        "method": "POST",

+        "body": JSON.stringify({

+            subject: final_JSON.class.subject_id

+        }),

+        "mode": "cors",

+        "credentials": "include"

+    })

+        .then(res => res.json())

+        .then(json => {

+            console.log("Subject added to user: ", json);

+

+            var begins = new Date(parseInt(final_JSON.class.begins)*1000);

+            var ends = new Date(parseInt(final_JSON.class.ends)*1000);

+

+            var params = new URLSearchParams();

+            params.append("entry." + idsFormulari.room, final_JSON.class.room); // class, number, letter

+            params.append("entry." + idsFormulari.day, begins.getFullYear().toString() + '-' + (begins.getMonth() + 1).toString().padStart(2, "0") + '-' + begins.getDate().toString().padStart(2, "0"));

+            params.append("entry." + idsFormulari.begins, formatTime(begins));

+            params.append("entry." + idsFormulari.ends, formatTime(ends));

+            params.append("entry." + idsFormulari.rows[final_JSON.letter], 'Columna ' + final_JSON.number);

+            // params.append("entry." + idsFormulari.notes, '[Autogenerat per delefme/covid-tracability -- Assignatura seleccionada: ' + (final_JSON.class.friendly_name || final_JSON.class.calendar_name) + ']');

+

+            var formulari_link = formBaseUrl + '?' + params.toString() + '#i1';

+            window.location.href = formulari_link;

+        });

+}

+

+

+function addEventListeners() {

+    window.addEventListener('load', onPageLoad);

+

+    var elements = document.getElementsByClassName("button");

+    Array.from(elements).forEach(function(element) {

+        element.addEventListener('click', clickButton);

+        element.parent = element.parentNode.id;

+    });

+

+    var elements = document.getElementsByClassName("complex-button");

+    Array.from(elements).forEach(function(element) {

+        element.addEventListener('click', clickButton);

+        element.parent = element.parentNode.id;

+    });

+

+    document.getElementById("send-button").addEventListener('click', function (el) {

+        document.getElementById("send-button").classList.add('is-loading');

+        sendForm();

+    });

+

+    addDateEventListeners();

+}

+

+addEventListeners();