Organització del codi
diff --git a/js/build_page.js b/js/build_page.js
new file mode 100644
index 0000000..9a533f0
--- /dev/null
+++ b/js/build_page.js
@@ -0,0 +1,175 @@
+
+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;
+});
+
+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()) {
+            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].calendar_name == classe.calendar_name) {
+                div1.classList.add('has-text-danger', 'has-text-weight-bold');
+            } else if (i < data.payload.classes.length - 1 && data.payload.classes[i+1].calendar_name == classe.calendar_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;
+        });
+    });
+});
+