diff --git a/index.html b/index.html
index 652cdec..90587f9 100644
--- a/index.html
+++ b/index.html
@@ -138,6 +138,5 @@
         </section>
 
         <script src="./js/build_page.js"></script>
-        <script src="./js/page_functionality.js"></script>
     </body>
 </html>
diff --git a/js/build_page.js b/js/build_page.js
index 32e0286..d170acd 100644
--- a/js/build_page.js
+++ b/js/build_page.js
@@ -1,14 +1,28 @@
 
-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;
-});
+
+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";
 
 var final_JSON = {
     "class": null,
@@ -16,6 +30,9 @@
     "letter": ""
 };
 
+var current_section = "section-1";
+
+
 function fillInSummary() {
     var begins = new Date(parseInt(final_JSON.class.begins)*1000);
     var ends = new Date(parseInt(final_JSON.class.ends)*1000);
@@ -62,6 +79,68 @@
     }
 }
 
+function switchSection(s) {
+    setTimeout(function(){ 
+        document.getElementById(current_section).classList.add('hidden');
+        document.getElementById(s).classList.remove('hidden');
+        current_section = s;
+    }, 75);
+}
+
+function buildSubjectContainer(classes) {
+    for (var [i, classe] of 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 && classes[i-1].calendar_name == classe.calendar_name) {
+            div1.classList.add('has-text-danger', 'has-text-weight-bold');
+        } else if (i < classes.length - 1 && 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;
+    });
+}
+
 function formatDate(d) {
     var str = "";
     str += d.getHours();
@@ -71,9 +150,8 @@
     return str;
 }
 
-var api_url;
+function onPageLoad() {
 
-window.addEventListener('load', _ => {
     // Check if user is signed in
     if (localStorage.getItem('devMode') == 'true') {
         var banner = document.getElementById('dev-mode');
@@ -116,60 +194,63 @@
             if (data.payload.classes.length == 0) {
                 document.getElementById('no-subjects').classList.remove('hidden');
             } else {
+                buildSubjectContainer(data.payload.classes);
                 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;
-            });
         });
-});
+}
 
+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;
+        });
+}
+
+
+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();
+    });
+}
+
+addEventListeners();
diff --git a/js/page_functionality.js b/js/page_functionality.js
deleted file mode 100644
index 0e7b2ee..0000000
--- a/js/page_functionality.js
+++ /dev/null
@@ -1,70 +0,0 @@
-
-var current_section = "section-1";
-
-function switchSection(s) {
-    setTimeout(function(){ 
-        document.getElementById(current_section).classList.add('hidden');
-        document.getElementById(s).classList.remove('hidden');
-        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();
- });
-
