diff --git a/index.html b/index.html
index 7258a6b..4132f60 100644
--- a/index.html
+++ b/index.html
@@ -19,181 +19,7 @@
         <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;
-            });
-
-            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;
-                    });
-                });
-          });
-        </script>
+        <script></script>
 
         <span id="dev-mode" class="hidden">Dev mode</span>
         
@@ -310,84 +136,8 @@
                 </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>
+        <script src="./js/page_functionality.js"></script>
     </body>
 </html>
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;
+        });
+    });
+});
+
diff --git a/js/page_functionality.js b/js/page_functionality.js
new file mode 100644
index 0000000..d19d639
--- /dev/null
+++ b/js/page_functionality.js
@@ -0,0 +1,79 @@
+
+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();
+ });
+
