diff --git a/api.php b/api.php
index 26b655a..176fdfe 100644
--- a/api.php
+++ b/api.php
@@ -2,13 +2,13 @@
 require_once("config.php");
 
 class write {
-  public static function funct($json) {
+  public static function output($json) {
     print_r(json_encode($json));
     exit();
   }
 
   public static function error($n, $msg) {
-    self::funct(["error" => $n, "msg" => $msg]);
+    self::output(["error" => $n, "msg" => $msg]);
   }
 }
 
diff --git a/css/autocomplete.css b/css/autocomplete.css
index 71caab6..cb824d0 100644
--- a/css/autocomplete.css
+++ b/css/autocomplete.css
@@ -29,7 +29,7 @@
   border-top: none;
   z-index: 99;
   /*position the autocomplete items to be the same width as the container:*/
-  top: 100%;
+  top: auto;
   left: 0;
   right: 0;
   color: black;
@@ -51,4 +51,4 @@
 }
 .autocomplete-year {
 	color: #ccc;
-}
\ No newline at end of file
+}
diff --git a/css/styles.css b/css/styles.css
index 9e6fa07..d1ee715 100644
--- a/css/styles.css
+++ b/css/styles.css
@@ -91,11 +91,12 @@
   margin: 0;
 }
 
-#searchButton {
+#search {
   position: absolute;
   right: 10px;
   bottom: 110px;
   z-index: 100;
+  display: none;
 }
 
 #zoomin {
@@ -112,6 +113,128 @@
   z-index: 100;
 }
 
+/**
+  * MD search box
+  */
+.md-google-search__metacontainer {
+  position: absolute;
+  top: 10px;
+  height: 48px;
+  width: 100%;
+  z-index: 100;
+}
+
+.md-google-search__container {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  height: 48px;
+  width: Calc(100% - 66px);
+  max-width: 720px;
+  white-space: nowrap;
+}
+
+.md-google-search {
+  height: 48px;
+  background-color: rgba(245,245,245,1);
+  border: 1px solid rgba(0,0,0,0);
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+  max-width: 720px;
+  position: relative;
+  -webkit-transition: background-color 100ms ease-in,width 100ms ease-out;
+  transition: background-color 100ms ease-in,width 100ms ease-out;
+}
+
+.md-google-search:focus-within {
+  border: 1px solid rgba(0,0,0,0.45);
+  background-color: rgba(255,255,255,1);
+  -webkit-box-shadow: 0 1px 1px rgba(255,255,255,.5);
+  box-shadow: 0 1px 1px rgba(255,255,255,.5);
+}
+
+.md-google-search__search-btn {
+  float: left;
+  background: none;
+  border: none;
+  opacity: .54;
+  outline: none;
+  padding: 0 4px;
+  line-height: 0;
+  color: #212121;
+}
+
+.md-google-search__search-btn svg, .md-google-search__empty-btn svg {
+  padding: 7px;
+  margin: 4px;
+}
+
+.md-google-search__field-container {
+  height: 46px;
+  padding: 0 11px;
+  margin-right: 48px;
+}
+
+.md-google-search__field {
+  border: none;
+  font: normal 16px Roboto,sans-serif;
+  height: 24px;
+  outline: none;
+  padding: 11px 0 11px 16px;
+  width: 100%;
+  background: transparent;
+}
+
+.md-google-search__empty-btn {
+  position: absolute;
+  right: 0;
+  top: 0;
+  background: none;
+  border: none;
+  opacity: .54;
+  outline: none;
+  padding: 0 4px;
+  line-height: 0;
+  color: #212121;
+  cursor: pointer;
+}
+
+/**
+  * Search Box Autocomplete
+  */
+
+.autocomplete-container{
+  z-index: 110;
+  position: absolute;
+  top: 60px;
+  width: 100%;
+}
+
+.autocomplete-items {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  width: Calc(100% - 66px);
+  max-width: 720px;
+  background-color: white;
+  color: black;
+  box-shadow: 0 2px 5px 0 rgba(255,255,255,0.258824),0 2px 10px 0 rgba(255,255,255,0.156863) !important;
+}
+
+.autocomplete-item {
+  font-size: 16px;
+  padding: 12px 14px;
+  cursor: pointer;
+}
+
+.autocomplete-item:hover, .autocomplete-active {
+  background: #eee;
+}
+
+.autocomplete-year {
+  color: #222;
+}
+
 @media (max-width: 700px) {
   #dialog {
     width: Calc(100% - 32px)!important;
@@ -126,4 +249,8 @@
   #min-dialog {
     display: block!important;
   }
+
+  #search {
+    display: block!important;
+  }
 }
diff --git a/graf.php b/graf.php
index 803ed66..7d5ea27 100644
--- a/graf.php
+++ b/graf.php
@@ -23,10 +23,6 @@
     <link rel="manifest" href="manifest.json">
 
     <link rel="stylesheet" href="css/styles.css">
-      
-    <!-- Seach Bar CSS files -->  
-    <link rel="stylesheet" href="./css/modal.css"></link>
-    <link rel="stylesheet" href="./css/autocomplete.css"></link>
 
     <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
     <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.blue_grey-blue.min.css" />
@@ -38,10 +34,10 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
   </head>
   <body>
-	<button id="searchButton"class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect mdl-button--colored"><i class="material-icons">search</i></button>
-	<button id="zoomin" class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect mdl-button--colored"><i class="material-icons">zoom_in</i></button>
+    <button id="search" class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect mdl-button--colored"><i class="material-icons">search</i></button>
+    <button id="zoomin" class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect mdl-button--colored"><i class="material-icons">zoom_in</i></button>
     <button id="zoomout" class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect mdl-button--colored"><i class="material-icons">zoom_out</i></button>
-	
+
     <div id="backdrop-container" style="display: none;">
       <div id="backdrop"></div>
     </div>
@@ -70,38 +66,36 @@
         <p><span data-fill="year"></span>, <span data-fill="sex"></span>, <span data-fill="id"></span></p>
       </div>
     </div>
-    <!-- Search Box -->
-    <div id="searchBox" class="modal">
-      <!-- Search Box Content -->
-      <div class="modal-content">
-        <span class="closeBox">&times;</span>
-
-        <div class="in-box-content">
-            <center>
-                <form autocomplete="off">
-                  <div class="autocomplete">
-                    <input id="searchInput" type="text" placeholder="Busca una persona al graf">
-                  </div>
-                </form>
-            </center>
+    <!-- MD Search Box -->
+    <div class="md-google-search__metacontainer" style="display: none;">
+      <div class="md-google-search__container">
+        <div class="md-google-search">
+          <button class="md-google-search__search-btn">
+            <svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg>
+          </button>
+          <div class="md-google-search__field-container">
+            <input id="search-input" class="md-google-search__field" autocomplete="off" placeholder="Search" value="" name="search" type="text" spellcheck="false" style="outline: none;">
+          </div>
+          <button class="md-google-search__empty-btn" style="display: none;">
+            <svg focusable="false" height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg>
+          </button>
         </div>
       </div>
     </div>
-       
+
+    <div class="autocomplete-container" style="display: none;">
+      <div id="autocomplete-list" class="autocomplete-items"></div>
+    </div>
+
     <div id="graf"></div>
-    
+
     <script src="https://cdnjs.cloudflare.com/ajax/libs/sigma.js/1.2.0/sigma.min.js"></script>
-    <script>
-		// Initialize the graph and the sigma
-		var s, graf;
-	</script>
-	   
+
     <!-- Search Bar JS files -->
-    <script src="./js/modal.js"></script>
     <script src="./js/autocomplete.js" ></script>
-	
-	<script src="js/script.js"></script>
-	
+
+	   <script src="js/script.js"></script>
+
     <script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
     <!--<script src="js/service-worker.js"></script>-->
   </body>
diff --git a/js/autocomplete.js b/js/autocomplete.js
index 351c786..d7648da 100644
--- a/js/autocomplete.js
+++ b/js/autocomplete.js
@@ -4,95 +4,93 @@
   var currentFocus;
   /*execute a function when someone writes in the text field:*/
   inp.addEventListener("input", function(e) {
-      var a, b, i, val = this.value;
-      /*close any already open lists of autocompleted values*/
-      closeAllLists();
-      if (!val || val.length < 3) return false;
-      currentFocus = -1;
-	  
-      /*create a DIV element that will contain the items (values):*/
-      a = document.createElement("DIV");
-      a.setAttribute("id", this.id + "autocomplete-list");
-      a.setAttribute("class", "autocomplete-items");
-      /*append the DIV element as a child of the autocomplete container:*/
-      this.parentNode.appendChild(a);
-	  
-      /*for each item in the object...*/
-      for (node in obj) {
-		var nomNode = obj[node].name;
-				
-		if (nomNode.toUpperCase().includes(val.toUpperCase())) {
-			var parts = nomNode.toUpperCase().split(val.toUpperCase());
-			
+    var a, b, i, val = this.value;
+    /*close any already open lists of autocompleted values*/
+    clearLists();
+    document.querySelector(".md-google-search__empty-btn").style.display = (val ? "block" : "none");
+    if (!val || val.length < 3) return false;
+    currentFocus = -1;
+    var is_empty = true;
+
+    /*for each item in the object...*/
+    for (node in obj) {
+  		var nomNode = obj[node].name;
+
+  		if (nomNode.toUpperCase().includes(val.toUpperCase())) {
+        is_empty = false;
+  			var parts = nomNode.toUpperCase().split(val.toUpperCase());
+
 			  /*create a DIV element for each matching element:*/
-			  b = document.createElement("DIV");
-			  
+			  b = document.createElement("div");
+        b.setAttribute("class", "autocomplete-item");
+
 			  /*make the matching letters bold:*/
 			  if (parts[0].length == 0) b.innerHTML = "";
-			  else b.innerHTML = nomNode.substr(0, parts[0].length);
-			  b.innerHTML += "<strong>" + nomNode.substr(parts[0].length, val.length) + "</strong>";
-			  b.innerHTML += nomNode.substr(parts[0].length + val.length);
-			  b.innerHTML += " - <span class='autocomplete-year'>" + obj[node].year + "</span>";
-			  /*insert a input field that will hold the current object item's value:*/
-			  b.innerHTML += "<input type='hidden' value='" + node + "'>";
-			 
-			 /*execute a function when someone clicks on the item value (DIV element):*/
+			  else b.innerHTML = "<span style='font-weight: bold;'>" + nomNode.substr(0, parts[0].length) + "</span>";
+			  b.innerHTML += nomNode.substr(parts[0].length, val.length);
+			  b.innerHTML += "<span style='font-weight: bold;'>" + nomNode.substr(parts[0].length + val.length) + "</span>";
+			  b.innerHTML += " <span class='autocomplete-year'>(" + obj[node].year + ")</span>";
+
+        /*include node id to keep track of which is it*/
+        b.dataset.id = node;
+
+			  /*execute a function when someone clicks on the item value (DIV element):*/
 			  b.addEventListener("click", function(e) {
 				  /*insert the value for the autocomplete text field:*/
-				  var n = this.getElementsByTagName("input")[0].value;
+				  var n = this.dataset.id;
 				  inp.value = obj[n].name;
-				  
+
 				  switch (act) {
-					case "search":
-					  // Move camera to desired node
-						cameraGoto(obj[n].x, obj[n].y);
-						break;
-					case "addEdge":
-					  // Add an edge between A and B
-					  alert(obj[n].name);
-					  break;
+  					case "search":
+  					  // Move camera to desired node
+  						cameraGoto(obj[n].x, obj[n].y);
+  						break;
+  					case "addEdge":
+  					  // @TODO: Add an edge between A and B
+  					  alert(obj[n].name);
+  					  break;
 				  }
-			  
-				  // Close the search box
-				  var searchBox = document.getElementById('searchBox');
-				  searchBox.style.display = "none";
-				  
-				  // Empty the input bar
-				  var searchInput = document.getElementById('searchInput');
-				  searchInput.value = "";
-				  
+
 				  /*close the list of autocompleted values,
 				  (or any other open lists of autocompleted values:*/
-				  closeAllLists();
+				  clearLists();
 			  });
-			  
+
 			  // Set "data-edges" attribute and compare with others
 			  var nEdges = Object.keys(s.graph.neighbors(node)).length;
 			  b.dataset.edges = nEdges;
 			  var inserted = false;
-			  
+
 			  // Sort nodes by degree
-			  for (i in a.childNodes) {
-				  var child = a.childNodes[i];
+			  for (i in document.querySelector("#autocomplete-list").childNodes) {
+				  var child = document.querySelector("#autocomplete-list").childNodes[i];
 				  if (!child.dataset) break;
 				  if (nEdges > child.dataset.edges) {
-					  a.insertBefore(b, child);
+					  document.querySelector("#autocomplete-list").insertBefore(b, child);
 					  inserted = true;
 					  break;
 				  }
 			  }
-			  
+
 			  if (!inserted) {
-				  a.appendChild(b);
-				  console.log("inserted");
+				  document.querySelector("#autocomplete-list").appendChild(b);
 			  }
 		  }
-        }
+    }
+
+    document.querySelector(".autocomplete-container").style.display = (is_empty ? "none" : "block");
   });
+
+  document.querySelector(".md-google-search__empty-btn").addEventListener("click", function() {
+    document.querySelector("#search-input").value = "";
+    this.style.display = "none";
+  });
+
   /*execute a function presses a key on the keyboard:*/
   inp.addEventListener("keydown", function(e) {
-      var x = document.getElementById(this.id + "autocomplete-list");
+      var x = document.getElementById("autocomplete-list");
       if (x) x = x.getElementsByTagName("div");
+      if (x.length == 0) return;
       if (e.keyCode == 40) {
         /*If the objow DOWN key is pressed,
         increase the currentFocus variable:*/
@@ -130,18 +128,15 @@
       x[i].classList.remove("autocomplete-active");
     }
   }
-  function closeAllLists(elmnt) {
+  function clearLists() {
     /*close all autocomplete lists in the document,
     except the one passed as an argument:*/
-    var x = document.getElementsByClassName("autocomplete-items");
-    for (var i = 0; i < x.length; i++) {
-      if (elmnt != x[i] && elmnt != inp) {
-        x[i].parentNode.removeChild(x[i]);
-      }
-    }
+    var x = document.querySelector("#autocomplete-list");
+    x.innerHTML = "";
+    document.querySelector(".autocomplete-container").style.display = "none";
   }
   /*execute a function when someone clicks in the document:*/
-  document.addEventListener("click", function (e) {	  
-      closeAllLists(e.target);
+  document.addEventListener("click", function (e) {
+      clearLists();
   });
 }
diff --git a/js/script.js b/js/script.js
index 5d7a5e4..2239a50 100644
--- a/js/script.js
+++ b/js/script.js
@@ -1,3 +1,5 @@
+var s, graf;
+
 function xhr(method, url, params, callback) {
   var http = new XMLHttpRequest();
   if (method == "POST") {
@@ -23,6 +25,39 @@
   }
 }
 
+function altSearchBar() {
+  if (document.querySelector(".md-google-search__metacontainer").style.display == "none") {
+    document.querySelector(".md-google-search__metacontainer").style.display = "block";
+  } else {
+    document.querySelector(".md-google-search__metacontainer").style.display = "none";
+    document.querySelector(".autocomplete-container").style.display = "none";
+  }
+}
+
+var seq = [38, 38, 40, 40, 37, 39, 37, 39, 65, 66, 13];
+var cur = 0;
+
+function justdoit() {
+  s.graph.nodes().forEach(function(n) {
+    switch(n.color) {
+      case "#d61c08":
+      n.color = "#0159aa";
+      break;
+
+      case "#0159aa":
+      n.color = "#0ca80a";
+      break;
+
+      case "#0ca80a":
+      n.color = "#d61c08";
+      break;
+    }
+  });
+
+  s.refresh();
+  setTimeout(justdoit, 333);
+}
+
 var dialog = {
   fill: function(data, text, html=false) {
     var el = document.querySelectorAll("*[data-fill=\""+data+"\"]");
@@ -82,109 +117,124 @@
 };
 
 function init() {
-    sigma.classes.graph.addMethod("neighbors", function(nodeId) {
-      var k,
-          neighbors = {},
-          index = this.allNeighborsIndex[nodeId] || [];
+  sigma.classes.graph.addMethod("neighbors", function(nodeId) {
+    var k,
+        neighbors = {},
+        index = this.allNeighborsIndex[nodeId] || [];
 
-      for (k in index) {
-        neighbors[k] = this.nodesIndex[k];
-      }
+    for (k in index) {
+      neighbors[k] = this.nodesIndex[k];
+    }
 
-      return neighbors;
-    });
+    return neighbors;
+  });
 
-    s = new sigma({
-      renderers: [{
-        container: "graf",
-        type: "webgl"
-      }],
-      settings: {
-        defaultEdgeColor: "#fff",
-        edgeColor: "default",
-        defaultLabelColor: "#fff",
-        autoRescale: false,
-        zoomMax: 10,
-        //enableEdgeHovering: true,
-        font: "Roboto",
-        labelThreshold: 5
-      }
-    });
+  s = new sigma({
+    renderers: [{
+      container: "graf",
+      type: "webgl"
+    }],
+    settings: {
+      defaultEdgeColor: "#fff",
+      edgeColor: "default",
+      defaultLabelColor: "#fff",
+      autoRescale: false,
+      zoomMax: 10,
+      //enableEdgeHovering: true,
+      font: "Roboto",
+      labelThreshold: 5
+    }
+  });
 
-    xhr("GET", "api.php", "action=getgraf", function(responseText, status) {
-      graf = JSON.parse(responseText);
+  xhr("GET", "api.php", "action=getgraf", function(responseText, status) {
+    graf = JSON.parse(responseText);
 
-      console.log(graf);
+    console.log(graf);
 
-      for (var i in graf.nodes) {
-        var ncolor = (graf.nodes[i].sex == "F" ? "#d61c08" : (graf.nodes[i].sex == "M" ? "#0159aa" : "#0ca80a"));
+    for (var i in graf.nodes) {
+      var ncolor = (graf.nodes[i].sex == "F" ? "#d61c08" : (graf.nodes[i].sex == "M" ? "#0159aa" : "#0ca80a"));
 
-        s.graph.addNode({
-          id: graf.nodes[i].id,
-          label: graf.nodes[i].name,
-          x: graf.nodes[i].x,
-          y: graf.nodes[i].y,
-          size: 10,
-          color: ncolor,
-          originalColor: ncolor
-        });
-      }
+      s.graph.addNode({
+        id: graf.nodes[i].id,
+        label: graf.nodes[i].name,
+        x: graf.nodes[i].x,
+        y: graf.nodes[i].y,
+        size: 10,
+        color: ncolor,
+        originalColor: ncolor
+      });
+    }
 
-      for (var i in graf.edges) {
-        s.graph.addEdge({
-          id: i,
-          source: graf.edges[i].a,
-          target: graf.edges[i].b,
-          size: Math.min(4, Math.max((7/(2*Math.pow(20, 2)))*Math.pow(graf.edges[i].votes, 2) + 1/2, 0.5))
-        });
-      }
+    for (var i in graf.edges) {
+      s.graph.addEdge({
+        id: i,
+        source: graf.edges[i].a,
+        target: graf.edges[i].b,
+        size: Math.min(4, Math.max((7/(2*Math.pow(20, 2)))*Math.pow(graf.edges[i].votes, 2) + 1/2, 0.5))
+      });
+    }
 
-      s.bind('clickNode', function(e) {
-        var nodeId = e.data.node.id,
-            toKeep = s.graph.neighbors(nodeId);
-        //toKeep[nodeId] = e.data.node;
+    s.bind('clickNode', function(e) {
+      var nodeId = e.data.node.id,
+          toKeep = s.graph.neighbors(nodeId);
+      //toKeep[nodeId] = e.data.node;
 
-        s.graph.nodes().forEach(function(n) {
-          if (toKeep[n.id] || n.id == nodeId) {
-            n.color = n.originalColor;
-          } else {
-            n.color = '#333';
-          }
-        });
-
-        s.graph.edges().forEach(function(e) {
-          if ((e.source == nodeId || e.target == nodeId) && (toKeep[e.source] || toKeep[e.target])) {
-            e.color = '#fff';
-          } else {
-            e.color = '#333';
-          }
-        });
-
-        s.refresh();
-
-        dialog.show(nodeId, toKeep);
+      s.graph.nodes().forEach(function(n) {
+        if (toKeep[n.id] || n.id == nodeId) {
+          n.color = n.originalColor;
+        } else {
+          n.color = '#333';
+        }
       });
 
-      document.querySelector("#quit-dialog").addEventListener("click", dialog.close);
-      document.querySelector("#quit2-dialog").addEventListener("click", dialog.close);
-      document.querySelector("#max-dialog").addEventListener("click", dialog.max);
-      document.querySelector("#min-dialog").addEventListener("click", dialog.min);
-
-      document.querySelector("#zoomin").addEventListener("click", function() {
-        s.camera.goTo({
-          ratio: Math.max(s.camera.settings("zoomMin"), s.camera.ratio / Math.sqrt(2))
-        });
-      });
-
-      document.querySelector("#zoomout").addEventListener("click", function() {
-        s.camera.goTo({
-          ratio: Math.min(s.camera.settings("zoomMax"), s.camera.ratio * Math.sqrt(2))
-        });
+      s.graph.edges().forEach(function(e) {
+        if ((e.source == nodeId || e.target == nodeId) && (toKeep[e.source] || toKeep[e.target])) {
+          e.color = '#fff';
+        } else {
+          e.color = '#333';
+        }
       });
 
       s.refresh();
-	  autocomplete(document.getElementById("searchInput"), graf.nodes, "search");
+
+      dialog.show(nodeId, toKeep);
     });
+
+    document.querySelector("#quit-dialog").addEventListener("click", dialog.close);
+    document.querySelector("#quit2-dialog").addEventListener("click", dialog.close);
+    document.querySelector("#max-dialog").addEventListener("click", dialog.max);
+    document.querySelector("#min-dialog").addEventListener("click", dialog.min);
+
+    document.querySelector("#zoomin").addEventListener("click", function() {
+      s.camera.goTo({
+        ratio: Math.max(s.camera.settings("zoomMin"), s.camera.ratio / Math.sqrt(2))
+      });
+    });
+
+    document.querySelector("#zoomout").addEventListener("click", function() {
+      s.camera.goTo({
+        ratio: Math.min(s.camera.settings("zoomMax"), s.camera.ratio * Math.sqrt(2))
+      });
+    });
+
+    document.addEventListener("keydown", function() {
+      if (event.key == "f" && event.target.getAttribute("id") != "search-input") altSearchBar();
+      if (event.which == seq[cur]) {
+        if (cur < seq.length) {
+          ++cur;
+          if (cur == seq.length) {
+            justdoit();
+          }
+        }
+      } else cur = 0;
+    })
+    document.querySelector("#search").addEventListener("click", altSearchBar);
+
+    if (window.innerWidth > 700) altSearchBar();
+
+    s.refresh();
+    autocomplete(document.querySelector("#search-input"), graf.nodes, "search");
+  });
 }
 
 function cameraGoto(nodeX, nodeY) {
