Index: trunk/FACT++/src/InterpreterV8.cc
===================================================================
--- trunk/FACT++/src/InterpreterV8.cc	(revision 14054)
+++ trunk/FACT++/src/InterpreterV8.cc	(revision 14055)
@@ -13,9 +13,12 @@
 using namespace v8;
 
-void InterpreterV8::ReportException(TryCatch* try_catch)
+bool InterpreterV8::ReportException(TryCatch* try_catch)
 {
     const HandleScope handle_scope;
 
     const String::Utf8Value exception(try_catch->Exception());
+
+    if (*exception && string(*exception)=="exit")
+        return true;
 
     const Handle<Message> message = try_catch->Message();
@@ -29,5 +32,5 @@
         out << *filename;
     if (!message.IsEmpty())
-        out << ": l. " << message->GetLineNumber();
+        out << ": l." << message->GetLineNumber();
     if (*exception)
         out << ": " << *exception;
@@ -36,5 +39,5 @@
 
     if (message.IsEmpty())
-        return;
+        return false;
 
     // Print line of source code.
@@ -48,6 +51,7 @@
 
     out.str("");
-    out << setfill(' ') <<  setw(start)     << ' ';
-    out << setfill('^') <<  setw(end-start) << '^';
+    if (start>0)
+        out << setfill(' ') << setw(start) << ' ';
+    out << setfill('^') << setw(end-start) << '^';
 
     JsException(out.str());
@@ -55,8 +59,10 @@
     String::Utf8Value stack_trace(try_catch->StackTrace());
     if (stack_trace.length()<=0)
-        return;
-
-    if (*stack_trace)
-        JsException(string("\n")+*stack_trace);
+        return false;
+
+    //if (*stack_trace)
+    //    JsException(string("\n")+*stack_trace);
+
+    return false;
 }
 
@@ -95,8 +101,6 @@
 
     if (exception.HasCaught())
-    {
-        ReportException(&exception);
-        return false;
-    }
+        return ReportException(&exception);
+
     return rc;
 }
@@ -191,4 +195,22 @@
     JsSleep(args[0]->Int32Value());
 
+    return Undefined();
+}
+
+Handle<Value> InterpreterV8::FuncExit(const Arguments &)
+{
+    v8::V8::TerminateExecution(fThreadId);
+    return ThrowException(String::New("exit"));
+/*
+    if (args.Length()!=1)
+        return ThrowException(String::New("Number of arguments must be exactly 1."));
+
+    if (!args[0]->IsUint32())
+        return ThrowException(String::New("Argument 1 must be an uint32."));
+
+    const HandleScope handle_scope;
+
+    JsSleep(args[0]->Int32Value());
+*/
     return Undefined();
 }
@@ -234,5 +256,7 @@
 }
 
-bool InterpreterV8::JsRun(const string &filename)
+#include <iostream>
+
+bool InterpreterV8::JsRun(const string &filename, const map<string, string> &map)
 {
     v8::Locker locker;
@@ -253,4 +277,5 @@
     global->Set(String::New("include"), FunctionTemplate::New(WrapInclude),                ReadOnly);
     global->Set(String::New("sleep"),   FunctionTemplate::New(WrapSleep),                  ReadOnly);
+    global->Set(String::New("exit"),    FunctionTemplate::New(WrapExit),                   ReadOnly);
     global->Set(String::New("version"), FunctionTemplate::New(InterpreterV8::FuncVersion), ReadOnly);
 
@@ -263,13 +288,17 @@
     }
 
+    v8::Context::Scope scope(context);
+
+    Local<Array> args = Array::New(map.size());
+    for (auto it=map.begin(); it!=map.end(); it++)
+        args->Set(String::New(it->first.c_str()), String::New(it->second.c_str()));
+    context->Global()->Set(String::New("arg"), args);
+
     JsStart(filename);
 
-    v8::Context::Scope scope(context);
     //context->Enter();
-
     v8::Locker::StartPreemption(10);
     const bool rc = ExecuteFile(filename);
     v8::Locker::StopPreemption();
-
     //context->Exit();
 
Index: trunk/FACT++/src/InterpreterV8.h
===================================================================
--- trunk/FACT++/src/InterpreterV8.h	(revision 14054)
+++ trunk/FACT++/src/InterpreterV8.h	(revision 14055)
@@ -2,4 +2,5 @@
 #define FACT_InterpreterV8
 
+#include <map>
 #include <string>
 
@@ -15,5 +16,5 @@
 
 #ifdef HAVE_V8
-    void ReportException(v8::TryCatch* try_catch);
+    bool ReportException(v8::TryCatch* try_catch);
     bool ExecuteStringNT(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value>  &file);
     bool ExecuteCode(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value>  &file);
@@ -26,4 +27,5 @@
     v8::Handle<v8::Value> FuncPrint(const v8::Arguments& args);
     v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
+    v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
 
     static v8::Handle<v8::Value> FuncVersion(const v8::Arguments&);
@@ -33,4 +35,5 @@
     static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args)    { if (This) return This->FuncSend(args);    else return v8::Undefined(); }
     static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args)   { if (This) return This->FuncSleep(args);   else return v8::Undefined(); }
+    static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args)    { if (This) return This->FuncExit(args);    else return v8::Undefined(); }
 #endif
 
@@ -56,10 +59,10 @@
     virtual int  JsWait(const std::string &, int32_t, uint32_t) { return -1; };
 
-    bool JsRun(const std::string &filename);
+    bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
     static void JsStop();
 };
 
 #ifndef HAVE_V8
-inline bool InterpreterV8::JsRun(const std::string &) { return false; }
+inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>()) { return false; }
 inline void InterpreterV8::JsStop() { }
 #endif
Index: trunk/FACT++/src/RemoteControl.h
===================================================================
--- trunk/FACT++/src/RemoteControl.h	(revision 14054)
+++ trunk/FACT++/src/RemoteControl.h	(revision 14055)
@@ -249,5 +249,18 @@
         if (str.substr(0, 4)==".js ")
         {
-            JsRun(Tools::Trim(str.substr(3)));
+            string opt(str.substr(4));
+
+            map<string,string> data = Tools::Split(opt, true);
+            if (opt.size()==0)
+            {
+                if (data.size()==0)
+                    lout << kRed << "JavaScript filename missing." << endl;
+                else
+                    lout << kRed << "Equal sign missing in argument '" << data.begin()->first << "'" << endl;
+
+                return true;
+            }
+
+            JsRun(opt, data);
             return true;
         }
