diff --git a/main.html b/main.html
index 77da1e4..ff0ecb5 100644
--- a/main.html
+++ b/main.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <script type="text/javascript" src="./horaris.json"></script>
 <script type="text/javascript" src="./autocomplete.js"></script>
 <meta charset="utf-8">
@@ -19,33 +20,42 @@
         <h3 id="data"></h3>
         <a href="#">No és així? Canvia-ho.</a>
 
-        <form>
-			<label for="seient">Seient:</label><br>
-			<input type="text" id="seient" name="seient"><br>
-		</form>
-
-        <form autocomplete="off" action="/action_page.php">
-            <div class="autocomplete" style="width:300px;">
+        <form id="subjectListInput" autocomplete="off">
+            <div class="autocomplete" id="input2" style="width:300px;">
                 <input id="myInput" type="text" name="mySubject" placeholder="Subject">
             </div>
-            <input type="submit">
+            
+        </form>
+        <button onclick="completeSubjectList()">Afegeix</button>
+
+        <div id="subjectList"></div>
+
+        <form>
+            <label for="seient" id="seient2"></label><br>
+            <input type="text" id="seientInput" placeholder="Seient"><br>
         </form>
 
-		<form id = "link" action = https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform?entry.1063142948=S02>
-		    <input type="submit" value="Continua"/>
+		<form id = "link">
+        <!--<form id = "link" action = https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform?entry.1063142948=S03&entry.2115504093=2020-09-14&entry.1749141911=9:00&entry.1827359679=10:00&entry.1077148310=Columna+3&entry.1600275159=[Autogenerat+per+delefme/covid-tracability]>-->
+		<input type="submit" value="Continua"/>
 		</form>
 
-
-
         <script>
+            var classesAlumne = [{}];
+            if(localStorage.pos == null) localStorage.pos = 0;
+
+            document.getElementById("seientInput").value = "hola";
 
             var subjects = ["Calcul 1", "Calcul 2", "Algebra Lineal", "Geometria", "Numerica", "EDOS"];
 
             autocomplete(document.getElementById("myInput"), subjects);
 
-        	var linkOutput = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform"
+            
+
+        	var linkOutput = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform";
         	
         	var mydata = JSON.parse(classes);
+            let datahoraris = JSON.stringify(classesAlumne);
 
             var hora_actual = new Date();
             var minuts;
@@ -66,28 +76,50 @@
             var any = hora_actual.getFullYear();
             var data = dia.toString() + '/' + mes.toString() + '/' + any.toString();
 
-            for (i = 0; i < mydata.length; i++) { 
-            	var h = mydata[i].hora.split(":");
-				if(h[0] == (hora_actual.getHours() - 5).toString()) {
-					console.log("trobat");
-					document.getElementById("assignatura").innerHTML = mydata[i].nom;
-					document.getElementById("aula").innerHTML = "Aula " + mydata[i].aula;
+            document.getElementById("link").onclick = completaLink();
 
-                    var datamap=[
-                        "entry.1063142948=" + mydata[i].aula,
-                        "entry.1749141911=" + (hora_actual.getHours().toString() - 11) +":00",
-                        "entry.1827359679=" + (hora_actual.getHours().toString() - 10) +":00",
-                        "entry.2115504093=" + data
-                        ];
-                    var linkOutput = linkOutput+"?"+ datamap[1] + "&" + datamap[2] + "&" + datamap[3] + "&" + datamap[0];
-				}
-			}
+            if(localStorage.classesAlumne != null) classesAlumne = JSON.parse(localStorage.classesAlumne);
+
+            for(i = 0; i < classesAlumne.length; i++) {
+                document.getElementById("subjectList").innerHTML += "<br>" +  classesAlumne[i];
+            } 
+
+
+            function completaLink() {
+                console.log(document.getElementById("seientInput").value);
+                for (i = 0; i < mydata.length; i++) { 
+                	var h = mydata[i].hora.split(":");
+    				if(h[0] == (hora_actual.getHours() - 7).toString()) {
+    					console.log("trobat");
+    					document.getElementById("assignatura").innerHTML = mydata[i].nom;
+    					document.getElementById("aula").innerHTML = "Aula " + mydata[i].aula;
+
+                        var datamap=[
+                            "entry.1063142948=" + mydata[i].aula,
+                            "entry.1749141911=" + (hora_actual.getHours().toString() - 11) +":00",
+                            "entry.1827359679=" + (hora_actual.getHours().toString() - 10) +":00",
+                            "entry.2115504093=" + any.toString() + '-' + mes.toString() + '-' + dia.toString(),
+                            "entry.1077148310=Columna+" + document.getElementById("seientInput").value
+                            ];
+                        linkOutput += "?"+ datamap[1] + "&" + datamap[2] + "&" + datamap[3] + "&" + datamap[0] + "&" + datamap[4];
+    				}
+    			}
+                //window.location.href = linkOutput;
+            }
             document.getElementById("data").innerHTML = data;
-            document.getElementById("link").action = linkOutput;
-            console.log(document.getElementById("link").action);
+            //document.getElementById("link").action = linkOutput;
         </script>
 
-        
+        <script>
+            function completeSubjectList() {
+                classesAlumne[localStorage.pos] = document.getElementById("myInput").value;
+                localStorage.pos++;
+                console.log(document.getElementById("myInput").value);
+                document.getElementById("subjectList").innerHTML += "<br>" +  document.getElementById("myInput").value;
+                localStorage.classesAlumne = JSON.stringify(classesAlumne);
+            }
+
+        </script>
 
     </body>
 </html>
