public function RCall($values = null, $code = null, $resume_from_last_template = false)
 {
     if (Ini::$log_server_events) {
         TestServer::log_debug("TestSession->RCall --- R call initiated #" . session_id());
     }
     //resume from last template
     if ($resume_from_last_template) {
         $response = array("data" => array("HEAD" => $this->head, "HASH" => $this->hash, "TIME_LIMIT" => $this->time_limit, "HTML" => $this->HTML, "TEST_ID" => $this->Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => TestSession::TEST_SESSION_STATUS_TEMPLATE, "TEMPLATE_ID" => $this->Template_id, "LOADER_TEMPLATE_ID" => $this->loader_Template_id, "FINISHED" => 0, "EFFECT_SHOW" => $this->effect_show, "EFFECT_HIDE" => $this->effect_hide, "EFFECT_SHOW_OPTIONS" => $this->effect_show_options, "EFFECT_HIDE_OPTIONS" => $this->effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options));
         return $response;
     }
     //R server connection
     $command_obj = json_encode(array("workspace_id" => $this->UserWorkspace_id, "session_id" => $this->id, "hash" => $this->hash, "values" => $values, "code" => $code, "type" => 0, "IP" => $_SERVER["REMOTE_ADDR"]));
     if (Ini::$log_server_events) {
         TestServer::log_debug("TestSession->RCall --- checking for server");
     }
     if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STOPPED) {
         TestServer::start_process();
         TestServer::wait_until_started();
     } else {
         if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STARTING) {
             TestServer::wait_until_started();
         }
     }
     if (Ini::$log_server_events) {
         TestServer::log_debug("TestSession->RCall --- server found, trying to send");
     }
     $response = TestServer::send($command_obj);
     $result = json_decode(trim($response));
     if (Ini::$log_server_events) {
         TestServer::log_debug("TestSession->RCall --- sent and recieved response");
     }
     $status = TestSession::TEST_SESSION_STATUS_ERROR;
     $removed = false;
     $release = 0;
     $html = "";
     $head = "";
     $Template_id = 0;
     $debug = 0;
     $hash = "";
     $time_limit = 0;
     $Test_id = 0;
     $finished = 0;
     $loader_Template_id = 0;
     $loader_HTML = "";
     $loader_head = "";
     $loader_effect_show = "none";
     $loader_effect_hide = "none";
     $loader_effect_show_options = "";
     $loader_effect_hide_options = "";
     $effect_show = "none";
     $effect_hide = "none";
     $effect_show_options = "";
     $effect_hide_options = "";
     $state = "[]";
     $output = "";
     $thisSession = TestSession::from_mysql_id($this->id);
     $return = $result->return;
     if ($thisSession != null) {
         $output = $thisSession->output;
         $error_output = $thisSession->error_output;
         $state = $thisSession->state;
         $status = $thisSession->status;
         $release = $thisSession->release;
         $html = $thisSession->HTML;
         $head = $thisSession->head;
         $Template_id = $thisSession->Template_id;
         $debug = $thisSession->debug;
         $hash = $thisSession->hash;
         $time_limit = $thisSession->time_limit;
         $Test_id = $thisSession->Test_id;
         $loader_Template_id = $thisSession->loader_Template_id;
         $loader_HTML = $thisSession->loader_HTML;
         $loader_head = $thisSession->loader_head;
         $loader_effect_hide = $thisSession->loader_effect_hide;
         $loader_effect_hide_options = $thisSession->loader_effect_hide_options;
         $loader_effect_show = $thisSession->loader_effect_show;
         $loader_effect_show_options = $thisSession->loader_effect_show_options;
         $effect_hide = $thisSession->effect_hide;
         $effect_hide_options = $thisSession->effect_hide_options;
         $effect_show = $thisSession->effect_show;
         $effect_show_options = $thisSession->effect_show_options;
         if ($return != 0) {
             $status = TestSession::TEST_SESSION_STATUS_ERROR;
         }
         if ($status == TestSession::TEST_SESSION_STATUS_WORKING && $release == 1) {
             $status = TestSession::TEST_SESSION_STATUS_COMPLETED;
         }
         $thisSession->status = $status;
         $thisSession->mysql_save();
         switch ($status) {
             case TestSession::TEST_SESSION_STATUS_COMPLETED:
                 if ($debug) {
                     TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id);
                     $removed = true;
                 } else {
                     $thisSession->close();
                 }
                 break;
             case TestSession::TEST_SESSION_STATUS_ERROR:
                 if ($debug) {
                     TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id);
                     $removed = true;
                 } else {
                     $thisSession->close();
                     if (Ini::$log_r_errors) {
                         $thisSession->log_error(nl2br(htmlspecialchars($error_output, ENT_QUOTES)));
                     }
                 }
                 break;
             case TestSession::TEST_SESSION_STATUS_TAMPERED:
                 if ($debug) {
                     TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id);
                     $removed = true;
                 } else {
                     $thisSession->close();
                 }
                 break;
             case TestSession::TEST_SESSION_STATUS_TEMPLATE:
                 if ($release) {
                     if ($debug) {
                         TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id);
                         $removed = true;
                     } else {
                         $thisSession->close();
                     }
                 }
                 break;
         }
     } else {
         $removed = true;
     }
     $debug_data = false;
     $logged_user = User::get_logged_user();
     if ($logged_user != null) {
         $debug_data = true;
     }
     if ($release == 1 || $status == TestSession::TEST_SESSION_STATUS_COMPLETED || $status == TestSession::TEST_SESSION_STATUS_ERROR || $status == TestSession::TEST_SESSION_STATUS_TAMPERED) {
         $finished = 1;
     }
     $response = array("data" => array("HEAD" => $head, "HASH" => $hash, "TIME_LIMIT" => $time_limit, "HTML" => $html, "TEST_ID" => $Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => $status, "TEMPLATE_ID" => $Template_id, "FINISHED" => $finished, "LOADER_TEMPLATE_ID" => $loader_Template_id, "LOADER_HTML" => $loader_HTML, "LOADER_HEAD" => $loader_head, "LOADER_EFFECT_SHOW" => $loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $loader_effect_show_options, "LOADER_EFFECT_HIDE" => $loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $loader_effect_hide_options, "EFFECT_SHOW" => $effect_show, "EFFECT_HIDE" => $effect_hide, "EFFECT_SHOW_OPTIONS" => $effect_show_options, "EFFECT_HIDE_OPTIONS" => $effect_hide_options));
     if ($debug_data) {
         if (!is_array($response)) {
             $response = array();
         }
         if ($output != null) {
             if (strpos(trim($output), ">") !== 0 && strpos(trim($output), "[") !== 0) {
                 $output = "> " . trim($output);
             }
         }
         if ($debug) {
             $state = json_decode($state, true);
             if ($state != null) {
                 foreach ($state as $k => $v) {
                     $state[$k] = htmlspecialchars($v, ENT_QUOTES);
                 }
                 $state = json_encode($state);
             } else {
                 $state = "[]";
             }
             $response["debug"] = array("return" => $return, "output" => nl2br(htmlspecialchars($output, ENT_QUOTES)), "error_output" => nl2br(htmlspecialchars($error_output, ENT_QUOTES)), "state" => nl2br($state));
         }
     }
     if (Ini::$timer_tamper_prevention && !$removed) {
         $sql = sprintf("UPDATE `%s` SET `time_tamper_prevention`=%d WHERE `id`=%d", TestSession::get_mysql_table(), time(), $this->id);
         mysql_query($sql);
     }
     return $response;
 }