if (is_osx) view.windowBlurbehind = #light;
stdout.println("current platform:", OS);
// html min-width, min-height not working on mac, below works for all
view.windowMinSize = (500, 300);
var app;
var tmp = handler.get_connect_status();
var connect_status = tmp[0];
var service_stopped = handler.get_option("stop-service") == "Y";
var software_update_url = "";
var key_confirmed = tmp[1];
var system_error = "";
var svg_menu = ;
var my_id = "";
function get_id() {
my_id = handler.get_id();
return my_id;
}
class ConnectStatus: Reactor.Component {
function render() {
return
;
}
function getConnectStatusStr() {
if (service_stopped) {
return translate("Service is not running");
} else if (connect_status == -1) {
return translate('not_ready_status');
} else if (connect_status == 0) {
return translate('connecting_status');
}
return translate("Ready");
}
event click $(#start-service) () {
handler.set_option("stop-service", "");
}
}
function createNewConnect(id, type) {
id = id.replace(/\s/g, "");
app.remote_id.value = formatId(id);
if (!id) return;
if (id == my_id) {
msgbox("custom-error", "Error", "You cannot connect to your own computer");
return;
}
handler.set_remote_id(id);
handler.new_remote(id, type);
}
var direct_server;
class DirectServer: Reactor.Component {
function this() {
direct_server = this;
}
function render() {
var text = translate("Enable Direct IP Access");
var enabled = handler.get_option("direct-server") == "Y";
var cls = enabled ? "selected" : "line-through";
return
{svg_checkmark}{text}{enabled && }
;
}
function onClick() {
if (is_edit_rdp_port) {
is_edit_rdp_port = false;
return;
}
handler.set_option("direct-server", handler.get_option("direct-server") == "Y" ? "" : "Y");
this.update();
}
}
var myIdMenu;
var audioInputMenu;
class AudioInputs: Reactor.Component {
function this() {
audioInputMenu = this;
}
function render() {
if (!this.show) return ;
var inputs = handler.get_sound_inputs();
if (is_win) inputs = ["System Sound"].concat(inputs);
if (!inputs.length) return ;
var me = this;
self.timer(1ms, function() { me.toggleMenuState() });
return
{translate('Audio Input')}
;
}
function get_default() {
if (is_win) return "System Sound";
return "";
}
function get_value() {
return handler.get_option("audio-input") || this.get_default();
}
function toggleMenuState() {
var el = this.$(li#enable-audio);
var enabled = handler.get_option(el.id) != "N";
el.attributes.toggleClass("selected", !enabled);
var v = this.get_value();
for (var el in this.$$(menu#audio-input>li)) {
if (el.id == 'enable-audio') continue;
var selected = el.id == v;
el.attributes.toggleClass("selected", selected);
}
}
event click $(menu#audio-input>li) (_, me) {
var v = me.id;
if (v == 'enable-audio') {
handler.set_option(v, handler.get_option(v) != 'N' ? 'N' : '');
} else {
if (v == this.get_value()) return;
if (v == this.get_default()) v = "";
handler.set_option("audio-input", v);
}
this.toggleMenuState();
}
}
class MyIdMenu: Reactor.Component {
function this() {
myIdMenu = this;
}
function render() {
return
", function(el) {
if (el && el.attributes) {
handler.open_url(el.attributes['url']);
};
}, 400);
}
event click $(menu#config-options>li) (_, me) {
if (me.id && me.id.indexOf("enable-") == 0) {
handler.set_option(me.id, handler.get_option(me.id) == "N" ? "" : "N");
}
if (me.id == "whitelist") {
var old_value = handler.get_option("whitelist").split(",").join("\n");
msgbox("custom-whitelist", translate("IP Whitelisting"), "
\
" + translate("whitelist_sep") + "
\
\
\
", function(res=null) {
if (!res) return;
var value = (res.text || "").trim();
if (value) {
var values = value.split(/[\s,;\n]+/g);
for (var ip in values) {
if (!ip.match(/^\d+\.\d+\.\d+\.\d+$/)) {
return translate("Invalid IP") + ": " + ip;
}
}
value = values.join("\n");
}
if (value == old_value) return;
stdout.println("whitelist updated");
handler.set_option("whitelist", value.replace("\n", ","));
}, 300);
} else if (me.id == "custom-server") {
var configOptions = handler.get_options();
var old_relay = configOptions["relay-server"] || "";
var old_id = configOptions["custom-rendezvous-server"] || "";
msgbox("custom-server", "ID/Relay Server", "
\
" + translate("ID Server") + ":
\
" + translate("Relay Server") + ":
\
\
", function(res=null) {
if (!res) return;
var id = (res.id || "").trim();
var relay = (res.relay || "").trim();
if (id == old_id && relay == old_relay) return;
if (id) {
var err = handler.test_if_valid_server(id);
if (err) return translate("ID Server") + ": " + err;
}
if (relay) {
var err = handler.test_if_valid_server(relay);
if (err) return translate("Relay Server") + ": " + err;
}
configOptions["custom-rendezvous-server"] = id;
configOptions["relay-server"] = relay;
handler.set_options(configOptions);
}, 240);
} else if (me.id == "socks5-server") {
var socks5 = handler.get_socks() || {};
var old_proxy = socks5[0] || "";
var old_username = socks5[1] || "";
var old_password = socks5[2] || "";
msgbox("custom-server", "Socks5 Proxy",
{translate("Hostname")}:
{translate("Username")}:
{translate("Password")}:
, function(res=null) {
if (!res) return;
var proxy = (res.proxy || "").trim();
var username = (res.username || "").trim();
var password = (res.password || "").trim();
if (proxy == old_proxy && username == old_username && password == old_password) return;
if (proxy) {
var err = handler.test_if_valid_server(proxy);
if (err) return translate("Server") + ": " + err;
}
handler.set_socks(proxy, username, password);
}, 240);
} else if (me.id == "install-virtual-display") {
handler.install_virtual_display();
} else if (me.id == "stop-service") {
handler.set_option("stop-service", service_stopped ? "" : "Y");
} else if (me.id == "about") {
this.showAbout()
}
}
}
var is_edit_direct_access_port;
class EditDirectAccessPort: Reactor.Component {
function render() {
return {svg_edit};
}
function onMouse(evt) {
if (evt.type == Event.MOUSE_DOWN) {
is_edit_direct_access_port = true;
editDirectAccessPort();
}
}
}
function editDirectAccessPort() {
var p0 = handler.get_option('direct-access-port');
var port = p0 ? :
;
msgbox("custom-direct-access-port", translate('Direct IP Access Settings'),
{translate('Port')}:{port}
, function(res=null) {
if (!res) return;
var p = (res.port || '').trim();
if (p) {
p = p.toInteger();
if (!(p > 0)) {
return translate("Invalid port");
}
p = p + '';
}
if (p != p0) handler.set_option('direct-access-port', p);
});
}
class App: Reactor.Component
{
function this() {
app = this;
}
function render() {
var is_can_screen_recording = handler.is_can_screen_recording(false);
return