diff --git a/script.js b/script.js
new file mode 100644
index 0000000..3118c86
--- /dev/null
+++ b/script.js
@@ -0,0 +1,347 @@
+// JavaScript Document
+$(document).ready(function(e) {
+   /* Todo:
+ • Merge this with Node.js, almost done
+ • Webpages in a database/more editable version
+ • Add cookies to track previous commands? (You can press up and down to browse previous commands this session)
+*/
+   var faviconnumber = 1;
+	function favicon() {
+		favicon = favicon == 1 ? 2 : 1;
+		$('.favicon').attr('href','favicon' + favicon + ".png");
+	}
+   console.clear();
+   var commandlist = [ /*Can be populated with various methods*/
+      ["/help", "Show commands"],
+      ["/list", "List all pages on the website"],
+      ["/nav &lt;location&gt;", "Navigate to location"],
+	   ["/gl", "Generate a url for the current page - [^http://koya.io/](This doesn't work in an iframe, try it at *Koya.io*) outputs something like [^http://koya.io/connect](*koya.io/connect*)"],
+      ["/clear", "Clear the console"],
+      ["/login &lt;username&gt; &lt;password&gt;", "Login to your account - This is not set up and when implemeneted it'll be '/login username' then request password without printing into the cmd prompt"],
+      ["/upload", "Upload file, must be logged in."]
+   ];
+   var previouscommands = [];
+   var currentcommand = 0;
+   var pages = [ /*Can be populated with various methods*/
+      ["index", "Welcome to Koya.io", "Simply, this is just a sandbox in which to add to; no real point - a couple of features that I plan to add though:", "URL shortner and open tracker, just enter a URL into the command line and press enter and you will get 2 links - 1 which looks like [http://koya.io/XXXXXX](http://koya.io/XXXXXX) and another [http://koya.io/u/XXXXXX](http://koya.io/u/XXXXXX) : they will both forward but the second will show a preview of the full url so they know where you are going.", "You can also save small messages with `/msg <string <160 chars>` and you will get a url like [http://koya.io/XXXXXX](http://koya.io/XXXXXX)","Pressing Ctrl+v will paste the short text or image and you will get a link.", "There will be accounts but likely given out rather than being able to register them whenever, this is a personal site so idk."],
+      ["about", "About Koya.io", "Personal power website for Finn 'Koya' Shackleton.", "Will include some features which too are mainly for personal use: Link shortner, image host, pastebin and any sandbox testing", "The colours have been taken from [https://github.com/Poorchop/darktooth-theme-ports/tree/8c852e8edde8df57d831dc8631493b0565fadbbc/hexchat-darktooth](Poorchop's Darktooth HexChat theme)", "In the process of turning the website into a server sided thing, currently what you can read is in the [http://koya.io/scripts.js](JavaScript file)!"],
+	  ["connect", "Connect with Koya",
+	  "[mailto:_@koya.io](Email _@koya.io)",
+	  "[skype:finn.shackleton](Skype)",
+	  "[^http://steamcommunity.com/id/bananabutterscotchmaplepancakes](Steam) < Always available",
+	  "[^http://codepen.io/OfficialAntarctica](Codepen)",
+	  "[^http://everybodyedits.com/profiles/bbmp](Everybody Edits)"]
+   ];
+   var pageindex = ["index", "about", "connect"];
+   var currentpage = "landing";
+   var url = "http://koya.io/"
+      /*
+         Custom Text Syntax
+         Links:      
+            [URLPATH](NAME) - regular
+            [^URLPATH](NAME) - open in new tab
+            
+         Styles:
+            *TEXT* - bold text
+            E! - Text is an error/notification
+            A! - spaces are converted to non-breaking spaces (it's for ascii art - after all, this is a text based website)
+      */
+
+   function init() {
+      setInterval(time);
+      console.clear();
+      console.log(new Date().getTime());
+      log("Website", "A!********************************");
+      log("Website", "A!*  ____  _     ___ ____ ____   *");
+      log("Website", "A!* | __ )| |   |_ _/ ___/ ___|  *");
+      log("Website", "A!* |  _ \ | |    | |\___ \___ \  *");
+      log("Website", "A!* | |_) | |___ | | ___) |__) | *");
+      log("Website", "A!* |____/|_____|___|____/____/  *");
+      log("Website", "A!*                              *");
+      log("Website", "A!********************************");
+      log("Website", "A!Have A Truly Blissful Experience");
+      log("Website", "A!********************************");
+      log("Website", "");
+      log("Website", "E!Bliss ROMs temporary site [^http://blissroms.io/](*blissroms.io*)");
+      log("Website", "");
+      log("Website", "A!********************************");
+      log("Website", "");
+      log("Website", "E![^http://downloads.blissroms.com/](*Bliss Downloads*) , [^http://paypal.me/TeamBliss](*Donate to Team Bliss*)");
+	  urlvars();
+      log("Client", "For help say '/help'");
+	  setInterval(favicon,500);
+   }
+
+   function urlvars() {
+	   var pagelocs = window.location.pathname.replace("/","").split("/");
+	   var pageloc = pagelocs[0];
+	   console.log(pageloc);
+	   //alert();
+		if(pageloc != "") {
+            if ($.inArray(pageloc, pageindex) >= 0) {
+               currentpage = pageloc;
+            }
+		}
+      	log("Website", "You are currently on page: *" + currentpage + "*");
+		if(pageloc != "") {
+            if ($.inArray(pageloc, pageindex) >= 0) {
+               currentpage = pageloc;
+               loadpage($.inArray(pageloc, pageindex));
+            } else {
+               //Un-note next line to show 404 errors with wrong urls
+               //log("Client", "404 - The page '" + pageloc + "' does not exist. To "); 
+            }
+		}
+		if(pageloc == "") {
+      		log("Client", "What would you like to access?");	
+		}
+   }
+   function getParam(name){
+		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
+		var regexS = "[\\?&]"+name+"=([^&#]*)";
+		var regex = new RegExp( regexS );
+		var results = regex.exec (window.location.href);
+		if (results == null) {
+			return "";
+		}
+		else  {
+			return results[1];
+		}
+	}
+
+   function log(name, information) {
+      var d = new Date();
+      var hours = ((d.getHours() < 10) ? "0" : "") + d.getHours();
+      var minutes = ((d.getMinutes() < 10) ? "0" : "") + d.getMinutes();
+      var seconds = ((d.getSeconds() < 10) ? "0" : "") + d.getSeconds();
+      var colour = "whitet";
+      var textcolour = "";
+      var postcolour = "";
+
+      switch (name[0]) {
+         case "!":
+            postcolour = " important";
+            name = name.substr(1);
+            break;
+      }
+      switch (name) {
+         case "Website":
+            colour = "redt";
+            break;
+         case "Server":
+            colour = "bluet";
+            break;
+         case "Client":
+            colour = "bluet";
+            break;
+         case "User":
+            colour = "greent";
+            postcolour = " selft";
+            break;
+      }
+      if (information[0] == "A" && information[1] == "!") {
+         information = information.substr(2);
+         information = information.replace(/ /g, '\u00A0');
+      }
+      if (information[0] == "E" && information[1] == "!") {
+         information = information.substr(2);
+         postcolour = " important";
+      }
+
+      while (information.indexOf("](") >= 0) { //URL parser
+
+         var NAMEregExp = /\(([^)]+)\)/;
+         var uname = NAMEregExp.exec(information)[1];
+
+         var URLregExp = /\[([^)]+)\]/;
+         var url = URLregExp.exec(information)[1];
+         var newpage = false;
+         if (url[0] == "^") {
+            newpage = true;
+            url = url.substr(1);
+         }
+         var start = information.indexOf("[");
+         var end = information.indexOf(")");
+         if (newpage) {
+            information = information.replace(information.substring(start, end + 1), "").splice(start, 0, '<a href="' + url + '" target="_blank">' + uname + '</a>');
+         } else {
+            information = information.replace(information.substring(start, end + 1), "").splice(start, 0, '<a href="' + url + '">' + uname + '</a>');
+         }
+         //information = '<a href="' + url + '">' + uname + '</a>'; //working
+
+      }
+      var tobold = true;
+      var boldnumber = 0;
+      for (var i = 0; i < information.length; i++) {
+         if (information[i] == "*" && information[i - 1] != "*" && information[i + 1] != "*") {
+            boldnumber++;
+         }
+      }
+      while (information.indexOf("*") >= 0) { //Bold parser
+         var pos = information.indexOf("*");
+         information = information.replace("*", "");
+         if (tobold) {
+            information = information.splice(pos, 0, '<b>');
+         } else {
+            information = information.splice(pos, 0, '</b>');
+         }
+         tobold = !tobold;
+         if (tobold && boldnumber <= 1) {
+            break;
+         }
+         //information = '<a href="' + url + '">' + uname + '</a>'; //working
+      }
+      var tounderline = true;
+      var underlinenumber = 0;
+      for (var i = 0; i < information.length; i++) {
+         if (information[i] == "*" && information[i - 1] != "*" && information[i + 1] != "*") {
+            underlinenumber++;
+         }
+      }
+      while (information.indexOf("**") >= 0) { //Bold parser
+         var pos = information.indexOf("**");
+         information = information.replace("**", "");
+         if (tounderline) {
+            information = information.splice(pos, 0, '<u>');
+         } else {
+            information = information.splice(pos, 0, '</u>');
+         }
+         tounderline = !tounderline;
+         if (tounderline && underlinenumber <= 1) {
+            break;
+         }
+         //information = '<a href="' + url + '">' + uname + '</a>'; //working
+      } /**/
+      $(".stream").append('<div class="line">' +
+         '<p class="time">[' + hours + ":" + minutes + ":" + seconds + ']</p>' +
+         '<p class="name ' + colour + '">' + name + '</p>' +
+         '<p class="information' + postcolour + '">' + information + '</p>' +
+         '</div>');
+      $(document).scrollTop($(document).height() - $(window).height());
+   }
+	var timestring = "";
+   function time() {
+      var d = new Date();
+      var hours = d.getHours();
+      var minutes = d.getMinutes();
+      var seconds = d.getSeconds();
+      if (hours < 10) {
+         hours = "0" + hours;
+      }
+      if (minutes < 10) {
+         minutes = "0" + minutes;
+      }
+      if (seconds < 10) {
+         seconds = "0" + seconds;
+      }
+	  var temptimestring = "[" + hours + ":" + minutes + ":" + seconds + "]";
+	  if (temptimestring != timestring) {
+		  timestring = temptimestring;
+      	$(".editline .time").text(timestring);
+	  }
+   }
+
+   var ctrldown = false;
+   $(".editline .edit").keydown(function(e) {
+      var text = $(".editline .edit").text();
+      console.log(e.which);
+      if (e.which == 13 && text !== "" && !ctrldown) {
+         var commands = text.split(' ');
+         var output = "";
+         if (commands[0] == "help") {
+            text = "/" + text;
+         }
+         $(".editline .edit").text("");
+         log("User", text);
+
+         previouscommands[currentcommand] = text;
+         currentcommand = previouscommands.length;
+         $(".editline .edit").keydown(35);
+         cmd(commands[0], text, commands);
+         /*Add mod commands*/
+         //modcmd(commands[0], text, commands);
+         /*Add mod commands*/
+
+      }
+      if (e.which == 38) { //up
+         if (currentcommand > 0) {
+            currentcommand--;
+            $(".editline .edit").text(previouscommands[currentcommand]);
+         }
+      }
+      if (e.which == 40) { //down
+
+         if (currentcommand < previouscommands.length) {
+            currentcommand++;
+            $(".editline .edit").text(previouscommands[currentcommand]);
+         }
+      }
+   });
+
+   function cmd(command, words, word) {
+      switch (word[0]) {
+         case "/help":
+         case "help":
+            for (var i = 0; i < commandlist.length; i++) {
+               output = commandlist[i][0] + " : " + commandlist[i][1];
+               //console.log(command[i][0]);
+               log("Client", output);
+            }
+            break;
+		 case "/gl":
+			//window.location.href = "http://koya.io" + (currentpage == "landing" ? "" : "/" + currentpage);
+			window.history.pushState(currentpage, 'InpagePage', (currentpage == "landing" ? "/" : "/" + currentpage));
+			break;
+         case "/clear":
+            $(".stream").text("");
+            break;
+         case "/nav":
+            if ($.inArray(word[1], pageindex) >= 0) {
+               currentpage = word[1];
+               log("Website", "You are now in " + currentpage);
+               loadpage($.inArray(word[1], pageindex));
+            } else {
+               log("Client", "'" + word[1] + "' does not exist.");
+            }
+            break;
+         case "/list":
+            $.each(pageindex, function(id, content) {
+               log("Client", "> " + content);
+            });
+            break;
+         case "/login":
+            if (word.length >= 3) {
+               log("Client", "Attempting to login to " + word[1] + " with " + Array(word[2].length + 1).join("â€¢"));
+               loginreturn = false;
+               //log("Client", "ER1");
+               setTimeout(loginemptyreturn, 20000);
+            } else {
+               log("Client", "Not enough arguments to log in, you need a USERNAME and a PASSWORD.");
+            }
+            break;
+         default:
+            output = "Unrecognised command '" + word[0] + "'.";
+            log("Client", output);
+      }
+   }
+
+   function loadpage(i) {
+      $.each(pages[i], function(id, content) {
+         if (content != pageindex[i]) {
+            log("Website", content);
+         }
+      });
+   }
+   var loginreturn = false;
+
+   function loginemptyreturn() {
+      //log("Client", "ER2");
+      if (!loginreturn) {
+         log("Client", "E![LOGIN] No Return Recieved");
+      }
+   }
+   String.prototype.splice = function(idx, rem, str) {
+      return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
+   };
+   init();
+});
