function Terminal(rune)
{
Module.call(this);
this.element = document.createElement("div");
this.input = document.createElement("input");
this.hint_element = document.createElement("div");
this.logs_element = document.createElement("div");
this.hint_element.id = "hint";
this.logs_element.id = "logs";
this.logs_element.innerHTML = "Hello there";
this.history = [];
this.locks = [];
this.add_method(new Method("load",["file_name.rin"]));
// Module
this.install = function(cmd)
{
this.element.appendChild(this.input);
this.element.appendChild(this.hint_element);
this.element.appendChild(this.logs_element);
this.input.value = ""
this.hint_element.innerHTML = "";
}
this.run = function(target_cmd)
{
var command = target_cmd ? target_cmd : this.cmd();
var module = command.module();
var method = command.method();
var setting = command.setting();
console.info(command.content); // Don't remove
if(method){
method.run(command);
}
if(setting){
module.settings[setting].update(command.values());
this.log(new Log(module,module.settings[setting]));
}
this.hint_element.innerHTML = "";
this.input.value = "";
this.update();
}
this.update = function(value = null, preview = true)
{
if(value){ this.input.value = value; this.input.focus(); }
var command = this.cmd();
var module = command.module();
var method = command.method();
var autocomplete = this.find_autocomplete(command,module,method);
if(method && preview){
method.preview(command);
}
this.hint_element.innerHTML = ""+this.input.value+""+(autocomplete ? ''+autocomplete+'' : '')+(this.input.value ? " > " : "")+(module ? module.hint(method) : ronin.hint(method));
ronin.cursor.update();
}
this.run_multi = function(lines)
{
lines = lines.split(";");
if(!ronin.terminal.is_locked){
target_line = lines.shift();
this.run(new Command(target_line));
}
if(lines.length > 0){ setTimeout(function(){ ronin.terminal.run_multi(lines.join(";")) }, 50); }
}
this.log = function(log)
{
this.logs_element.innerHTML = "";
this.logs_element.appendChild(log.element);
}
this.cmd = function()
{
return new Command(this.input.value);
}
this.load = function(cmd,preview = false)
{
if(preview){ return; }
ronin.load(cmd.values());
return "Loading "+cmd.values();
}
this.find_autocomplete = function()
{
html = ""
var entry = this.input.value;
var module = this.cmd().module();
var method = entry.indexOf(".") > -1 ? entry.split(".")[1] : null;
if(entry.length == 0){ return null; }
if(module && method){
for(id in module.methods){
if(method == module.methods[id].name){ break; }
if(method == module.methods[id].name.substr(0,method.length)){ return module.methods[id].name.replace(method,""); }
}
}
else{
for(id in ronin.modules){
if(entry == ronin.modules[id].name){ break; }
if(entry == ronin.modules[id].name.substr(0,entry.length)){ return ronin.modules[id].name.replace(entry,""); }
}
}
return null;
}
}
// Log
function Log(host = null,message,error = false)
{
this.host = host;
this.message = message;
this.error = error;
this.element = document.createElement("log");
this.element.setAttribute("class",error ? "error" : "okay");
this.element.innerHTML = ""+(this.host ? this.host.name : "Ronin")+" "+message;
console.log(this.host ? this.host.name : "Ronin",this.message);
}